<?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>SISTEMAS O.R.P &#187; Informática</title>
	<atom:link href="http://www.sistemasorp.es/category/informatica/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.sistemasorp.es</link>
	<description>Blog sobre desarrollos y otros temas</description>
	<lastBuildDate>Fri, 03 Feb 2012 19:39:17 +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>Recuperar una cámara Zaapa CIP-RW después de un fallo de actualización</title>
		<link>http://www.sistemasorp.es/2012/02/02/recuperar-una-camara-zaapa-cip-rw-despues-de-un-fallo-de-actualizacion/</link>
		<comments>http://www.sistemasorp.es/2012/02/02/recuperar-una-camara-zaapa-cip-rw-despues-de-un-fallo-de-actualizacion/#comments</comments>
		<pubDate>Thu, 02 Feb 2012 15:38:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Electrónica]]></category>
		<category><![CDATA[Informática]]></category>
		<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[Reseñas]]></category>

		<guid isPermaLink="false">http://www.sistemasorp.es/?p=538</guid>
		<description><![CDATA[Hace tiempo que mi amigo Roberto quiso actualizar su cámara IP (la cual compró por recomendación mía). El caso es que al actualizar el firmware el proceso falló y la cámara quedó inutilizada. Así han pasado ya muchos meses hasta que hace unos días me encontré con esta página que hablaba de cómo recuperar una cámara [...]]]></description>
			<content:encoded><![CDATA[<p>Hace tiempo que mi amigo <a href="http://nebula.posterous.com/" target="_blank">Roberto</a> quiso actualizar su cámara IP (la cual compró por recomendación mía). El caso es que al actualizar el firmware el proceso falló y la cámara quedó inutilizada. Así han pasado ya muchos meses hasta que hace unos días me encontré con <a href="http://www.gadgetvictims.com/2009/12/bring-your-fi8908w-paperweight-back-to.html" target="_blank">esta página</a> que hablaba de cómo recuperar una cámara Foscam FI8908W cuando el proceso de actualización de firmware ha fallado.</p>
<p>Lo bueno de esta página es que habla de que las cámaras foscam (y la zaapa ciprw es una de ellas con el modelo FI8901W) no mueren del todo, sino que tienen un puerto serie escondido al que se puede acceder y comunicarse con una consola para cargar un firmware. Yo me he comunicado con la cámara con un conversor serie TTL a USB:</p>
<p><a href="http://www.sistemasorp.es/wp-content/uploads/2012/02/IMAG0112.jpg"><img class="aligncenter size-medium wp-image-539" title="Programando la Zaapa" src="http://www.sistemasorp.es/wp-content/uploads/2012/02/IMAG0112-300x200.jpg" alt="" width="300" height="200" /></a></p>
<p>La solución ya estaba, sólo tenía que conseguir el firmware de la zaapa (ya que otros no valen) y decirle a mi amigo que me dejase su cámara para arreglársela. Pero no ha sido así de fácil y he tenido que pelearme con varios frentes.</p>
<p>El primero es el servicio técnico de Foscam. En el comentario 101 del anterior enlace un tal David comentaba que Doris de Foscam había sido muy amable y que le había dado los ficheros de recuperación. Yo probé la misma suerte con el servicio técnico de Foscam y esta fué la primera respuesta que obtuve:</p>
<blockquote><p>Hi,</p>
<p>We do not have a model No. FI8901W camera, could you please double check the model No.?</p></blockquote>
<p>Es decir, que no saben ni los modelos que han fabricado. Le dije que <a href="http://www.ipcam-store.com/fi8901w.html" target="_blank">si existía</a> ese modelo de cámara en su marca y me contesto esto otro:</p>
<blockquote><p>Hi,</p>
<p>Sorry for my mistake. We have stopped produce this product for a long time. We do not have the firmware now. Sorry for this.</p></blockquote>
<p>Vamos que no querían ayudarme en nada (David, que suerte tuviste&#8230;).</p>
<p>Buscando por Internet unos ficheros de recupercación para la zaapa o para la FOSCAM FI8901W no encontré nada. Pero por suerte encontré <a href="http://www.openipcam.com/forum/index.php/topic,39.0.html" target="_blank">esto otro</a>. Una forma de extraer de una cámara que funcionase su firmware a través de la consola serie oculta. El proceso fue pesado: me tuve que bajar el kermit 95 y buscar cómo demonios abrir una consola serie, después esperé un rato largo a que se ejecutara el script, convertir con el jedit una salida en otro fichero y finalmente pasar el convertidor de hexadecimal a binario, el cual tuve que compilar, modificar y compilar de nuevo para que funcionase. Todo esto para que al final no se hubiera decargado correctamente el firmware <em>linux.bin</em> y <em>romfs.img</em> necesarios para reprogramar la cámara estropeada, dando esta errores nada más arrancar.</p>
<p>Parecía que no iba a dar con la solución, pero <a href="http://blog.morrison.nl/2011/01/foscam-clone-recovery-tool/" target="_blank">encontré</a> un <a href="http://www.openipcam.com/files/FoscamCloneRecovery.zip" target="_blank">programa</a> que te descargaba automáticamente los ficheros necesarios del firmware. Lo ejecuté y parecía que había hecho bien su trabajo, pero pasó lo mismo que en el anterior párrafo aunque esta vez sólo con el fichero <em>linux.bin</em>. Sin embargo gracias a esta <a href="http://www.computersolutions.cn/blog/2010/04/ip-cam-hacking-pt4/" target="_blank">otra página</a> descubro que el fichero linux.bin es en realidad un archivo .zip y que lo que había hecho está aplicación es comerse los últimos 168 bytes, asi que leyendo la memoria de  la cámara que funcionaba recuperé esos 168 bytes.</p>
<p>Finalmente seguí <a href="http://www.gadgetvictims.com/2009/12/bring-your-fi8908w-paperweight-back-to.html" target="_blank">paso por paso el proceso de nuevo</a> pero cambiando los comandos fx por estos:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">fx <span style="color: #000000;">6</span> romfs.img 0x7F0D0000 0x7F0D0000 <span style="color: #660033;">-a</span>
fx <span style="color: #000000;">7</span> linux.bin 0x7F020000 0x00008000 <span style="color: #660033;">-acxz</span></pre></div></div>

<p>Para Windows 7 como no existe el Hyperterminal, he usado el <a href="http://ttssh2.sourceforge.jp/" target="_blank">Tera Term</a>.</p>
<p>Finalmente la cámara de mi amigo ha dejado de ser un pisapapeles y ha vuelto a funcionar, pudiéndola manejar ahora con Firefox, con su IPhone, etc.</p>
<p>Para evitaros las incomodidades por las que yo he pasado os dejo los enlaces de los ficheros de recuperación de la versión que le instalé a mi amigo y que es la última que proporciona Zaapa:</p>
<p><a href="http://www.sistemasorp.es/blog/romfs.img" target="_blank">romfs.img</a></p>
<p><a href="http://www.sistemasorp.es/blog/linux.bin" target="_blank">linux.bin</a></p>
<p><a href="http://www.sistemasorp.es/blog/Embeded Web UI 2.0.0.16.bin" target="_blank">Embeded Web UI 2.0.0.16.bin</a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sistemasorp.es/2012/02/02/recuperar-una-camara-zaapa-cip-rw-despues-de-un-fallo-de-actualizacion/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Por fin se puede programar la cámara IP Zaapa CIPRW (ZA-CIPRW) fácilmente</title>
		<link>http://www.sistemasorp.es/2012/01/17/por-fin-se-puede-programar-la-camara-ip-zaapa-ciprw-za-ciprw-facilmente/</link>
		<comments>http://www.sistemasorp.es/2012/01/17/por-fin-se-puede-programar-la-camara-ip-zaapa-ciprw-za-ciprw-facilmente/#comments</comments>
		<pubDate>Mon, 16 Jan 2012 23:46:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Informática]]></category>
		<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[Reseñas]]></category>

		<guid isPermaLink="false">http://www.sistemasorp.es/?p=478</guid>
		<description><![CDATA[Hacía tiempo que no volvía a escribir sobre la cámara ip Zaapa CIPRW. Escribí dos artículos: Uno sobre la descripción de la cámara en septiembre de 2008 y otro sobre cómo programarla en .NET en Agosto de 2009. Lo cierto es que desde entonces dejé abandonado el tema y por necesidades he tenido que retomarlo [...]]]></description>
			<content:encoded><![CDATA[<p>Hacía tiempo que no volvía a escribir sobre la cámara ip Zaapa CIPRW. Escribí dos artículos: Uno sobre <a href="http://www.sistemasorp.es/2008/09/14/zaapa-ciprw-za-ciprw/" target="_blank">la descripción de la cámara</a> en septiembre de 2008 y otro sobre <a href="http://www.sistemasorp.es/2009/08/12/programar-la-camara-ip-zaapa-ciprw-za-ciprw-en-net/" target="_blank">cómo programarla en .NET</a> en Agosto de 2009.</p>
<p>Lo cierto es que desde entonces dejé abandonado el tema y por necesidades he tenido que retomarlo para poder interactuar con ella. Poco tiempo después de escribir el último artículo se publicó en la página de Gadget Victims <a href="http://www.gadgetvictims.com/2009/09/yet-another-firmware-for-foscam-fi8908w.html" target="_blank">información sobre un nuevo firmware para las cámaras Foscam FI908W</a> (La de Zaapa es la FI8901W) en septiembre de 2009 donde entre otras cosas se habla de la documentación oficial de <a href="http://www.foscam.es/" target="_blank">FOSCAM</a> para sus cámaras IP. Lo mejor de esto es que en esta documentación hay dos textos que pueden servirnos a los programadores para interactuar definitivamente con la cámara Zaapa y a los usuarios para poder ver sus cámaras en navegadores como Firefox, Chrome, Safari, etc.</p>
<p>Se trata del <a href="http://www.sistemasorp.es/blog/IPCAMCGISDKV2.1.pdf" target="_blank">IPCAM CGI SDK 2.1</a> y del <a href="http://www.sistemasorp.es/blog/IPCameraProtocol.doc" target="_blank">IPCAM Protocol</a>. El primero es un documento PDF donde se explica cómo haciendo peticiones HTTP se puede descargar la imagen de la cámara y enviar ordenes a esta. El segundo es un documento de Word donde se explica el protocolo de la cámara para comunicarse con ella mediante socket. En este artículo me centraré en el primero por su facilidad de uso.</p>
<p>En el primer documento se explica qué peticiones hay que hacer para interactuar con la cámara. Se trata de acceder a páginas web <a href="http://es.wikipedia.org/wiki/Interfaz_de_entrada_com%C3%BAn" target="_blank">CGI</a> pasándole normalmente los parámetros mediante el método <a href="http://es.wikipedia.org/wiki/Hypertext_Transfer_Protocol#M.C3.A9todos_de_petici.C3.B3n" target="_blank">GET</a>, que es como en realidad nosotros hacemos las llamadas desde un navegador web normalmente.</p>
<p>Antes de empezar a probar hay que cerciorarse de que la cámara Zaapa tiene el último firmware y el último Embeded Web UI. Si en la sección <em>Device Info</em> del panel del administrador son distintos de <em>11.4.1.40</em> y <em>2.0.0.16</em> respectivamente, hay que actualizar. En la <a href="http://www.zaapa.co.uk/Public/ficha_producto.asp?CPRO=761" target="_blank">página del producto</a> se pueden descargar pero hay que introducir el número de serie que aparece como código de barras en la parte inferior de la cámara. Una vez que empieza la descarga empieza lo gracioso y es que veremos algo raro en el fichero que descargamos pues no tiene extensión y que no sirve para actualizar ya que no es un <em>.bin</em>. Pues bien el fichero es un archivo .rar por lo que hay que renombrarlo, ponerle esa extensión y ya podemos abrirlo. Dentro de este veremos dos ficheros .bin y aquí esta lo segundo más gracioso ¡¡¡ están al revés !!! <em>Embeded Web UI 11.4.1.40.bin</em> tendría que ser <em>Firmware 11.4.1.40.bin </em>y<em> Firmware 2.0.0.16.bin</em> tendría que ser <em>Embeded Web UI</em> <em>2.0.0.16.bin</em>. Una vez arreglado ese desaguisado ya podemos actualizarlo desde la sección <em><span style="font-family: Arial;">Upgrade Device Firmware</span></em> del panel de administrador y actualizar el firmware primero y el Web UI después (en ambos casos se reinicia la cámara).</p>
<p>Hay unos cuantos CGI y lo mejor es leerse la documentación, pero voy a explicar 3 de ellos que me parecen fundamentales:</p>
<ul>
<ul>
<li>El primero de ellos es el <em>snapshot.cgi</em>. Sirve para capturar una imagen estática de la cámara. Si ponemos en un navegador web <strong>http://ip de la cámara/snapshot.cgi</strong> nos pedirá un usuario y una contraseña. Cuando la hayamos introducido veremos la imagen jpg. Podemos evitar que salga el recuadro que nos pide el usuario y la contraseña simplemente añadiendo los parámetros <em>user</em> y <em>pwd</em> a la url de la siguiente forma <strong>http://ip de la cámara/snapshot.cgi?user=usuario&amp;pwd=contraseña</strong> para que ya directamente nos muestre la imagen. Tiene otro parámetro llamado <em>next_url</em> para indicar el nombre del fichero pero no lo veo útil.</li>
<li>El segundo de ellos son en realidad dos: <em>videostream.cgi</em> y <em>videostream.asf</em>. Sirven para mostrar un flujo continuo de imagenes a modo de vídeo. El que tiene extensión .cgi envía imágenes jpg sucesivas (ideal para verlas con una navegador), el que tiene extensión asf envía las imágenes con el formato <a href="http://es.wikipedia.org/wiki/Advanced_Streaming_Format" target="_blank">Advanced Streaming Format</a> (ideal para verlas con el VLC o con el MPlayer). Si ponemos en un navegador web <strong></strong><strong>http://ip de la cámara/videostream.cgi?user=usuario&amp;pwd=contraseña</strong> podemos ver el flujo continuo de lo que la cámara está enfocando en ese momento. Tiene otro parámetro llamado <em>resolution</em> para indicar con un 8 o un 32 si queremos que la imagen tenga de tamaño 320&#215;240 o 640&#215;480 respectivamente.</li>
<li>El tecero de ellos es el <em>decoder_control.cgi</em>. Sirve para interactuar con la cámara. Si ponemos en el navegador web <strong></strong><strong>http://ip de la cámara/videostream.cgi?user=usuario&amp;pwd=contraseña&amp;command=comando</strong> donde comando sea un número que indica qué hacer a la cámara (0 = empezar a mover hacia arriba, 1 = parar de mover hacia arriba, 2 = empezar a mover hacia abajo, etc) veremos como se mueve esta.</li>
</ul>
</ul>
<p>Finalmente he creado una página HTML para probar los dos últimos CGIs que he explicado. La página muestra la sucesión de imágenes de la cámara y tiene unos botones que permiten mover la cámara. Para adecuarlo a la vuestra sólo teneis que cambiar en la sección javascript el usuario, la clave y la ruta a vuestra cámara:</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">html</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">head</span>&gt;</span>
	<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">style</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/css&quot;</span>&gt;</span>
		.comando {background-color:#FFFF00; border-radius: 10px; font-family:Arial; font-size:10pt; font-weight:bold; width:70px; text-align:center}
		#imagen {visibility:hidden; width:640px; height:480px;}
		#marco {visibility:hidden;}
	<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">style</span>&gt;</span>
	<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span>&gt;</span>
		var usuario = &quot;usuario&quot;;
		var clave = &quot;clave&quot;;
		var ruta = &quot;http://192.168.0.12/&quot;;
&nbsp;
		function cargado()
		{
			var imagen = document.getElementById(&quot;imagen&quot;);
			imagen.src = ruta + &quot;videostream.cgi?user=&quot; + usuario + &quot;<span style="color: #ddbb00;">&amp;pwd=&quot; + clave + &quot;&amp;resolution=32&quot;;</span>
			imagen.style.visibility = &quot;visible&quot;;
		}
&nbsp;
		function empieza_arriba()
		{
			var marco = document.getElementById(&quot;marco&quot;);
			marco.src = ruta + &quot;decoder_control.cgi?user=&quot; + usuario + &quot;<span style="color: #ddbb00;">&amp;pwd=&quot; + clave + &quot;&amp;command=0&quot;;</span>
		}
&nbsp;
		function termina_arriba()
		{
			var marco = document.getElementById(&quot;marco&quot;);
			marco.src = ruta + &quot;decoder_control.cgi?user=&quot; + usuario + &quot;<span style="color: #ddbb00;">&amp;pwd=&quot; + clave + &quot;&amp;command=1&quot;;</span>
		}
&nbsp;
		function empieza_abajo()
		{
			var marco = document.getElementById(&quot;marco&quot;);
			marco.src = ruta + &quot;decoder_control.cgi?user=&quot; + usuario + &quot;<span style="color: #ddbb00;">&amp;pwd=&quot; + clave + &quot;&amp;command=2&quot;;</span>
		}
&nbsp;
		function termina_abajo()
		{
			var marco = document.getElementById(&quot;marco&quot;);
			marco.src = ruta + &quot;decoder_control.cgi?user=&quot; + usuario + &quot;<span style="color: #ddbb00;">&amp;pwd=&quot; + clave + &quot;&amp;command=3&quot;;</span>
		}
&nbsp;
		function empieza_izquierda()
		{
			var marco = document.getElementById(&quot;marco&quot;);
			marco.src = ruta + &quot;decoder_control.cgi?user=&quot; + usuario + &quot;<span style="color: #ddbb00;">&amp;pwd=&quot; + clave + &quot;&amp;command=4&quot;;</span>
		}
&nbsp;
		function termina_izquierda()
		{
			var marco = document.getElementById(&quot;marco&quot;);
			marco.src = ruta + &quot;decoder_control.cgi?user=&quot; + usuario + &quot;<span style="color: #ddbb00;">&amp;pwd=&quot; + clave + &quot;&amp;command=5&quot;;</span>
		}
&nbsp;
		function empieza_derecha()
		{
			var marco = document.getElementById(&quot;marco&quot;);
			marco.src = ruta + &quot;decoder_control.cgi?user=&quot; + usuario + &quot;<span style="color: #ddbb00;">&amp;pwd=&quot; + clave + &quot;&amp;command=6&quot;;</span>
		}
&nbsp;
		function termina_derecha()
		{
			var marco = document.getElementById(&quot;marco&quot;);
			marco.src = ruta + &quot;decoder_control.cgi?user=&quot; + usuario + &quot;<span style="color: #ddbb00;">&amp;pwd=&quot; + clave + &quot;&amp;command=7&quot;;</span>
		}
&nbsp;
&nbsp;
	<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">head</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">body</span> <span style="color: #000066;">onload</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;cargado()&quot;</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">img</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;imagen&quot;</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">table</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">tr</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span><span style="color: #ddbb00;">&amp;nbsp;</span><span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;comando&quot;</span> <span style="color: #000066;">onmousedown</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;empieza_arriba()&quot;</span> <span style="color: #000066;">onmouseup</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;termina_arriba()&quot;</span>&gt;</span>Arriba<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span><span style="color: #ddbb00;">&amp;nbsp;</span><span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">tr</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">tr</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;comando&quot;</span> <span style="color: #000066;">onmousedown</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;empieza_izquierda()&quot;</span> <span style="color: #000066;">onmouseup</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;termina_izquierda()&quot;</span>&gt;</span>Izquierda<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span><span style="color: #ddbb00;">&amp;nbsp;</span><span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;comando&quot;</span> <span style="color: #000066;">onmousedown</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;empieza_derecha()&quot;</span> <span style="color: #000066;">onmouseup</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;termina_derecha()&quot;</span>&gt;</span>Derecha<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">tr</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">tr</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span><span style="color: #ddbb00;">&amp;nbsp;</span><span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">td</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;comando&quot;</span> <span style="color: #000066;">onmousedown</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;empieza_abajo()&quot;</span> <span style="color: #000066;">onmouseup</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;termina_abajo()&quot;</span>&gt;</span>Abajo<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">td</span>&gt;</span><span style="color: #ddbb00;">&amp;nbsp;</span><span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">td</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">tr</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">table</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">iframe</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;marco&quot;</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">iframe</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">body</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">html</span>&gt;</span></pre></div></div>

<p>El funcionamiento es muy sencillo. Una etiqueta <em>img</em> muestra el CGI <em>videostream.cgi</em>. Las celdas de la tabla tienen los eventos <em>onmousedown</em> y <em>onmouseup</em> para detectar cuando se pulsan y cargar en el marco oculto el CGI <em>decoder_control.cgi</em> con la orden correspondiente. Así es como se ve funcionando en un MAC y Safari:</p>
<p><iframe width="420" height="315" src="http://www.youtube.com/embed/pqqLyt2Q5Us" frameborder="0" allowfullscreen></iframe></p>
<p>Y de paso pongo otro vídeo de cómo se puede usar esta cámara con un móvil con las múltiples aplicaciones que hay en android market y en app store simplemente eligiendo en estas como marca de cámara la FOSCAM:</p>
<p><iframe width="420" height="315" src="http://www.youtube.com/embed/TOsncyamTKQ" frameborder="0" allowfullscreen></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sistemasorp.es/2012/01/17/por-fin-se-puede-programar-la-camara-ip-zaapa-ciprw-za-ciprw-facilmente/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fuerza bruta en .net para resolver las cifras del concurso cifras y letras</title>
		<link>http://www.sistemasorp.es/2011/11/04/fuerza-bruta-en-net-para-resolver-las-cifras-del-concurso-cifras-y-letras/</link>
		<comments>http://www.sistemasorp.es/2011/11/04/fuerza-bruta-en-net-para-resolver-las-cifras-del-concurso-cifras-y-letras/#comments</comments>
		<pubDate>Fri, 04 Nov 2011 11:59:10 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Informática]]></category>
		<category><![CDATA[Proyectos]]></category>

		<guid isPermaLink="false">http://www.sistemasorp.es/?p=436</guid>
		<description><![CDATA[Hacía tiempo que no me ponía a mi mismo un reto de programación y el otro día viendo en la tele el programa cifras y letras me animé a hacer una aplicación que resolviese la sección de cifras. Primero me leí las normas y luego empecé a pensar cómo resolver este tipo de problema. Buscando [...]]]></description>
			<content:encoded><![CDATA[<p>Hacía tiempo que no me ponía a mi mismo un reto de programación y el otro día viendo en la tele el programa cifras y letras me animé a hacer una aplicación que resolviese la sección de cifras. Primero me <a href="http://es.wikipedia.org/wiki/Cifras_y_letras#Cifras" target="_blank">leí las normas</a> y luego empecé a pensar cómo resolver este tipo de problema. Buscando por Internet encontré estos artículos: (<a href="http://eltamiz.com/elcedazo/2011/06/27/resolviendo-cifras-y-letras-i/" target="_blank">uno</a>, <a href="http://eltamiz.com/elcedazo/2011/07/06/resolviendo-cifras-y-letras-ii/" target="_blank">dos </a>y <a href="http://eltamiz.com/elcedazo/2011/09/05/resolviendo-%E2%80%9Ccifras-y-letras%E2%80%9D-y-iii/" target="_blank">tres</a>) donde de 30.965.760 combinaciones posibles entre los 6 números y sus cuatro operaciones se reduce a 488.642 combinaciones. Además me encontré con dos páginas que resuelven el problema on-line: <a href="http://pedroreina.net/ciflet/anarit.php" target="_blank">esta</a> y <a href="http://antoniovillena.es/2011/07/cifras-y-letras" target="_blank">esta</a> (ambas usando la técnica de <a href="http://es.wikipedia.org/wiki/Vuelta_Atr%C3%A1s" target="_blank">backtracking</a>).</p>
<p>Como mi objetivo era hacerlo mediante fuerza bruta, la técnica de backtracking me pareció lo mejor para abordar el problema. Se crea un <a href="http://es.wikipedia.org/wiki/%C3%81rbol_%28teor%C3%ADa_de_grafos%29" target="_blank">árbol</a> donde cada nodo contendrá los números con los que se operan, la operación que ha generado ese nodo y el resultado de la misma (excepto el primer nodo que sólo contiene el conjunto de números original).</p>
<p>Vamos combinando uno por uno todos los números con todas las operaciones para encontrar el resultado que buscamos. El orden de las operaciones es suma, resta, multiplicación y división. Como esto puede generar una ingente cantidad de cálculos, podemos podar (acotar) el árbol para reducir estos y el tiempo empleado. Esto se consigue eliminando aquellos casos que no deben darse: En la resta que el resultado sea 0, en la división que el divisor sea 1 o que el resto sea distinto de 0 y que en la multiplicación uno de los factores sea 1. Para evitar números negativos en la resta o que el divsor sea mayor que el dividendo ponemos primero el mayor y después el menor en la operación.</p>
<p>A medida que vamos avanzando en la profundidad del árbol, el conjunto de números con los que operar se irá reduciendo ya que cada pareja de números se convertirá en uno por la operación matemática que se les aplique, siendo esto así recursivamente hasta que sólo haya un número, momento en el cual si el resultado no coincide con el esperado, se retrocede un nodo y se continúa con las siguientes combinaciones.</p>
<p>Para entenderlo mejor un gráfico donde dado un conjunto de tres números (1, 2 y 3) debemos operar con ellos hasta que obtengamos 7 como resultado:</p>
<p><a href="http://www.sistemasorp.es/wp-content/uploads/2011/11/backtracking.png"><img class="aligncenter size-full wp-image-446" title="backtracking" src="http://www.sistemasorp.es/wp-content/uploads/2011/11/backtracking.png" alt="" width="490" height="367" /></a><a href="http://www.sistemasorp.es/wp-content/uploads/2011/11/backtracking.png"><br />
</a>En el ejemplo después de buscar varias combinaciones entre sumas y restas (puntos suspensivos en el gráfico) hemos llegado a las combinaciones de multiplicaciones. Existen tres combinaciones de multiplicaciones: <em>Op: 1 * 2</em> (que no he puesto en el gráfico por simplificarlo), <em>Op: 1 * 3</em> y <em>Op: 2 * 3</em>.</p>
<ul>
<li>En el nodo de la multiplicación de <em>1 * 3</em> el resultado (Res:) es 3 y no 7 como andamos buscando por lo que hay que seguir calculando. El conjunto de números de este nodo se ha reducido de <em>Nu: 1, 2, 3</em> a <em>Nu: 2, 3</em>.</li>
<ul>
<li>A continuación hay que crear otro nodo con la suma de los únicos números que quedan: 2 + 3, pero el resultado es 5 con lo que volvemos al nodo anterior.</li>
<li>Vamos a hacer la resta: 3-2, pero sigue sin servirnos el resultado, por tanto volvemos al nodo anterior.</li>
<li>Hacemos la multiplicación: 2 * 3, pero seguimos igual, por lo que nos vamos al nodo anterior.</li>
<li>La división se descarta porque <em>3 / 2</em> no dá como resto 0, con lo que no se crea ese nodo y se vuelve al anterior (que en este ejemplo es el principal).</li>
</ul>
<li>Continuamos con la creación del nodo de la multiplicación de <em>2 * 3</em> donde el resultado (Res:) es 6 y no 7 como andamos buscando por lo que hay que seguir calculando. El conjunto de números de este nodo se ha reducido de <em>Nu: 1, 2, 3</em> a <em>Nu: 1, 6</em>.</li>
<ul>
<li>Hay que crear otro nodo con la suma de los únicos números que quedan: 1 + 6, y como el resultado es 7, que es el que buscábamos, ya no hacemos ninguna operación más y vamos retrocediendo por todo el árbol (que os recuerdo que se ha construido mediante una función recursiva) hasta salir de la función que lo ha generado.</li>
</ul>
</ul>
<p>El nivel de profundidad de los árboles depende de la cantidad de números inicial. Si son un conjunto de 3 números la profundidad será de 3 niveles, si es de 6 pues &#8230; ya sabeis la respuesta <img src='http://www.sistemasorp.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Como se trata de una estructura de árbol, cada nodo debe tener un puntero al siguiente nodo para trazar un camino desde el nodo inicial hasta el nodo que contiene el resultado que buscamos (en el cual el puntero estará vacío).  Dado que hemos aplicado la técnica de backtracking los nodos que previamente hayamos calculado y no pertenezcan a ese camino desaparecerán porque no nos sirven. Finalmente mediante un bucle recorreremos todos los nodos del camino mostrando por pantalla la operación que lo ha creado hasta el nodo final. Así en el ejemplo quedaría:</p>
<pre>3 * 2 = 6
6 + 1 = 7</pre>
<p>Sin embargo en el juego de cifras y letras si no se encuentra el número exacto se puntúa el número que más se acerque a este. La problemática aquí es que con el bactracking, si no se encuentra el número exacto, el camino que se habrá generado cuando retorne la función es el de la última operación, que con toda probabilidad no será el camino hacia el número que más se aproxime al original.</p>
<p>En este caso tenemos dos posibles formas de solucionarlo:</p>
<ul>
<li>A medida que vamos generando los nodos debemos comparar el resultado con el número que buscamos, si se acerca más que el anterior valor que hayamos comparado guardamos este resultado como el número que más se aproxima al buscado. Después cuando haya salido de la función y no se haya encontrado el exacto, se vuelve a llamar a esta misma pero buscando en esta ocasión el resultado aproximado (ya que tenemos la certeza de que se puede calcular) obteniendo así el camino hasta llegar al que más se acerca.</li>
<li>El problema de la solución anterior es que tenemos que llamar dos veces a la función que genera el árbol: una para buscar el exacto y otra para buscar el aproximado. Lo ideal es ir guardando un camino alternativo hacia el número aproximado, para que, en caso de no hallar el exacto, recorrer el camino alternativo mediante un bucle para mostrar las operaciones que obtengan el número aproximado. Todo desde la misma llamada a la función. Esto provoca que también se necesite un puntero al nodo anterior.</li>
</ul>
<p>Aquí dejo el código fuente en C# que pone en práctica todo lo comentado. Se trata de una aplicación de consola donde como parámetros se le pasa todo el conjunto de números separados por espacio y como último número el resultado que se desea averiguar.</p>
<p><strong>Program.cs:</strong></p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.Collections.Generic</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.Collections</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.Text</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;">namespace</span> Cifras
<span style="color: #008000;">&#123;</span>
    <span style="color: #6666cc; font-weight: bold;">class</span> Program
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">int</span> Main<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> args<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #008080; font-style: italic;">// Ncesitamos como mínimo dos números para operar y un resultado</span>
            <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>args<span style="color: #008000;">.</span><span style="color: #0000FF;">Length</span> <span style="color: #008000;">&lt;</span> <span style="color: #FF0000;">3</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                Console<span style="color: #008000;">.</span><span style="color: #0000FF;">Write</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;La sintaxis es &quot;</span> <span style="color: #008000;">+</span> <span style="color: #000000;">System</span><span style="color: #008000;">.</span><span style="color: #0000FF;">AppDomain</span><span style="color: #008000;">.</span><span style="color: #0000FF;">CurrentDomain</span><span style="color: #008000;">.</span><span style="color: #0000FF;">FriendlyName</span> <span style="color: #008000;">+</span> <span style="color: #666666;">&quot; &lt;número 1&gt;...&lt;número n&gt; &lt;número buscado&gt;&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #FF0000;">1</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">&#125;</span>
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">Write</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Set de números: &quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            ArrayList posibilidades <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> ArrayList<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #6666cc; font-weight: bold;">int</span> indice <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span>
            <span style="color: #008080; font-style: italic;">// Creamos el conjunto de números a partir de la línea de comandos.</span>
            <span style="color: #0600FF; font-weight: bold;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">;</span> indice <span style="color: #008000;">&lt;</span> args<span style="color: #008000;">.</span><span style="color: #0000FF;">Length</span> <span style="color: #008000;">-</span> <span style="color: #FF0000;">1</span><span style="color: #008000;">;</span> indice<span style="color: #008000;">++</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                Console<span style="color: #008000;">.</span><span style="color: #0000FF;">Write</span><span style="color: #008000;">&#40;</span>args<span style="color: #008000;">&#91;</span>indice<span style="color: #008000;">&#93;</span> <span style="color: #008000;">+</span> <span style="color: #666666;">&quot; &quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
                posibilidades<span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span>Int32<span style="color: #008000;">.</span><span style="color: #0000FF;">Parse</span><span style="color: #008000;">&#40;</span>args<span style="color: #008000;">&#91;</span>indice<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">&#125;</span>
            <span style="color: #6666cc; font-weight: bold;">int</span> descubre <span style="color: #008000;">=</span> Int16<span style="color: #008000;">.</span><span style="color: #0000FF;">Parse</span><span style="color: #008000;">&#40;</span>args<span style="color: #008000;">&#91;</span>indice<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;<span style="color: #008080; font-weight: bold;">\n</span>Número buscado: &quot;</span> <span style="color: #008000;">+</span> descubre <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;<span style="color: #008080; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #008080; font-style: italic;">// Creamos el primer nodo del árbol.</span>
            Nodo encuentra <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Nodo<span style="color: #008000;">&#40;</span>posibilidades, descubre<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #008080; font-style: italic;">// Creamos un contador</span>
            DateTime hora <span style="color: #008000;">=</span> DateTime<span style="color: #008000;">.</span><span style="color: #0000FF;">Now</span><span style="color: #008000;">;</span>
            TimeSpan tiempo<span style="color: #008000;">;</span>
            <span style="color: #008080; font-style: italic;">// Si se ha encontrado el exacto</span>
            <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>encuentra<span style="color: #008000;">.</span><span style="color: #0000FF;">busca</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">==</span> <span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                tiempo <span style="color: #008000;">=</span> DateTime<span style="color: #008000;">.</span><span style="color: #0000FF;">Now</span> <span style="color: #008000;">-</span> hora<span style="color: #008000;">;</span>
                Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Se encontró el exacto.<span style="color: #008080; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">&#125;</span>
            <span style="color: #008080; font-style: italic;">// En caso de no encontrarse el exacto</span>
            <span style="color: #0600FF; font-weight: bold;">else</span>
            <span style="color: #008000;">&#123;</span>
                tiempo <span style="color: #008000;">=</span> DateTime<span style="color: #008000;">.</span><span style="color: #0000FF;">Now</span> <span style="color: #008000;">-</span> hora<span style="color: #008000;">;</span>
                Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;No se ha encontrado el exacto.<span style="color: #008080; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #008080; font-style: italic;">// Sustituimos el camino original por el camino del aproximado</span>
                encuentra <span style="color: #008000;">=</span> Nodo<span style="color: #008000;">.</span><span style="color: #0000FF;">Cercano</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">&#125;</span>
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Número de nodos calculados: &quot;</span> <span style="color: #008000;">+</span> Nodo<span style="color: #008000;">.</span><span style="color: #0000FF;">NumeroNodos</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Tiempo en calcularlo: &quot;</span> <span style="color: #008000;">+</span> tiempo<span style="color: #008000;">.</span><span style="color: #0000FF;">TotalMilliseconds</span> <span style="color: #008000;">+</span> <span style="color: #666666;">&quot; ms.<span style="color: #008080; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Operaciones:&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #008080; font-style: italic;">// Recorremos todos los nodos del camino para mostrar las operaciones que se han ido ejecutando.</span>
            <span style="color: #0600FF; font-weight: bold;">while</span> <span style="color: #008000;">&#40;</span>encuentra<span style="color: #008000;">.</span><span style="color: #0000FF;">Hijo</span> <span style="color: #008000;">!=</span> <span style="color: #0600FF; font-weight: bold;">null</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                encuentra <span style="color: #008000;">=</span> encuentra<span style="color: #008000;">.</span><span style="color: #0000FF;">Hijo</span><span style="color: #008000;">;</span>
                Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span>encuentra<span style="color: #008000;">.</span><span style="color: #0000FF;">Valor1</span> <span style="color: #008000;">+</span> encuentra<span style="color: #008000;">.</span><span style="color: #0000FF;">Signo</span> <span style="color: #008000;">+</span> encuentra<span style="color: #008000;">.</span><span style="color: #0000FF;">Valor2</span> <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;=&quot;</span> <span style="color: #008000;">+</span> encuentra<span style="color: #008000;">.</span><span style="color: #0000FF;">Resultado</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">&#125;</span>
            <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p><strong>Nodo.cs:</strong></p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.Collections.Generic</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.Collections</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.Text</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;">namespace</span> Cifras
<span style="color: #008000;">&#123;</span>
    <span style="color: #6666cc; font-weight: bold;">class</span> Nodo
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #6666cc; font-weight: bold;">enum</span> OPERACIONES <span style="color: #008000;">&#123;</span> SUMA, RESTA, MULTIPLICACION, DIVISION <span style="color: #008000;">&#125;</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">int</span> buscado<span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">// El número exacto que debemos encontrar.</span>
        <span style="color: #0600FF; font-weight: bold;">private</span> ArrayList numeros<span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">// El conjunto de números con los que pueden operar los hijos del nodo.</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">private</span> Nodo padre<span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">// El nodo padre del nodo actual.</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">private</span> Nodo hijo<span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">// El nodo hijo del nodo actual.</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> Nodo Hijo
        <span style="color: #008000;">&#123;</span>
            get <span style="color: #008000;">&#123;</span> <span style="color: #0600FF; font-weight: bold;">return</span> hijo<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #6666cc; font-weight: bold;">int</span> valor1<span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">// El primer operando.</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">int</span> Valor1
        <span style="color: #008000;">&#123;</span>
            get <span style="color: #008000;">&#123;</span> <span style="color: #0600FF; font-weight: bold;">return</span> valor1<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span>
        <span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #6666cc; font-weight: bold;">int</span> valor2<span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">// El segundo operando.</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">int</span> Valor2
        <span style="color: #008000;">&#123;</span>
            get <span style="color: #008000;">&#123;</span> <span style="color: #0600FF; font-weight: bold;">return</span> valor2<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #6666cc; font-weight: bold;">string</span> signo<span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">// El signo de la operación.</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">string</span> Signo
        <span style="color: #008000;">&#123;</span>
            get <span style="color: #008000;">&#123;</span> <span style="color: #0600FF; font-weight: bold;">return</span> signo<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #6666cc; font-weight: bold;">int</span> resultado<span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">// El resultado de la operación.</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">int</span> Resultado
        <span style="color: #008000;">&#123;</span>
            get <span style="color: #008000;">&#123;</span> <span style="color: #0600FF; font-weight: bold;">return</span> resultado<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #0600FF; font-weight: bold;">static</span> Nodo cercano<span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">// Camino donde se llega al número más aproximado al buscado.</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> Nodo Cercano
        <span style="color: #008000;">&#123;</span>
            get <span style="color: #008000;">&#123;</span> <span style="color: #0600FF; font-weight: bold;">return</span> Nodo<span style="color: #008000;">.</span><span style="color: #0000FF;">cercano</span><span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">int</span> aproximado<span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">// Variable que va guardando qué número es el más aproximado.</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">int</span> numeroNodos<span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">// Número total de nodos creados.</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">int</span> NumeroNodos
        <span style="color: #008000;">&#123;</span>
            get <span style="color: #008000;">&#123;</span> <span style="color: #0600FF; font-weight: bold;">return</span> Nodo<span style="color: #008000;">.</span><span style="color: #0000FF;">numeroNodos</span><span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #008080; font-style: italic;">// Contructor para crear el primer nodo del arbol</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> Nodo<span style="color: #008000;">&#40;</span>ArrayList numeros, <span style="color: #6666cc; font-weight: bold;">int</span> buscado<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">numeros</span> <span style="color: #008000;">=</span> numeros<span style="color: #008000;">;</span>
            Nodo<span style="color: #008000;">.</span><span style="color: #0000FF;">buscado</span> <span style="color: #008000;">=</span> buscado<span style="color: #008000;">;</span>
            padre <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">null</span><span style="color: #008000;">;</span>
            hijo <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">null</span><span style="color: #008000;">;</span>
            Nodo<span style="color: #008000;">.</span><span style="color: #0000FF;">cercano</span> <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">null</span><span style="color: #008000;">;</span>
            Nodo<span style="color: #008000;">.</span><span style="color: #0000FF;">aproximado</span> <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span>
            Nodo<span style="color: #008000;">.</span><span style="color: #0000FF;">numeroNodos</span> <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #008080; font-style: italic;">// Constructor para crear los restantes nodos del arbol.</span>
        <span style="color: #0600FF; font-weight: bold;">private</span> Nodo<span style="color: #008000;">&#40;</span>ArrayList numeros, <span style="color: #6666cc; font-weight: bold;">int</span> valor1, <span style="color: #6666cc; font-weight: bold;">int</span> valor2, <span style="color: #6666cc; font-weight: bold;">int</span> resultado, <span style="color: #6666cc; font-weight: bold;">string</span> signo, Nodo padre<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">numeros</span> <span style="color: #008000;">=</span> numeros<span style="color: #008000;">;</span>
            <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">valor1</span> <span style="color: #008000;">=</span> valor1<span style="color: #008000;">;</span>
            <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">valor2</span> <span style="color: #008000;">=</span> valor2<span style="color: #008000;">;</span>
            <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">resultado</span> <span style="color: #008000;">=</span> resultado<span style="color: #008000;">;</span>
            <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">signo</span> <span style="color: #008000;">=</span> signo<span style="color: #008000;">;</span>
            <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">padre</span> <span style="color: #008000;">=</span> padre<span style="color: #008000;">;</span>
            <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">hijo</span> <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">null</span><span style="color: #008000;">;</span>
            <span style="color: #008080; font-style: italic;">// Para saber cuantos nodos se han creado.</span>
            Nodo<span style="color: #008000;">.</span><span style="color: #0000FF;">numeroNodos</span><span style="color: #008000;">++;</span>
            <span style="color: #008080; font-style: italic;">// Vamos guardando el número cercano más próximo al buscado.</span>
            <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>Math<span style="color: #008000;">.</span><span style="color: #0000FF;">Abs</span><span style="color: #008000;">&#40;</span>buscado <span style="color: #008000;">-</span> resultado<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&lt;</span> Math<span style="color: #008000;">.</span><span style="color: #0000FF;">Abs</span><span style="color: #008000;">&#40;</span>buscado <span style="color: #008000;">-</span> aproximado<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                <span style="color: #008080; font-style: italic;">// Creamos un camino alternativo duplicando los nodos.</span>
                <span style="color: #008080; font-style: italic;">// Esto es necesario porque en backtracking los nodos que no sirven se eliminan y necesitamos</span>
                <span style="color: #008080; font-style: italic;">// tener un camino hacia el resultado aproximado que perdure en toda la ejecución de la función.</span>
                Nodo historico <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">;</span>
                Nodo copia <span style="color: #008000;">=</span> <span style="color: #008000;">&#40;</span>Nodo<span style="color: #008000;">&#41;</span><span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">MemberwiseClone</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #0600FF; font-weight: bold;">while</span> <span style="color: #008000;">&#40;</span>historico<span style="color: #008000;">.</span><span style="color: #0000FF;">padre</span> <span style="color: #008000;">!=</span> <span style="color: #0600FF; font-weight: bold;">null</span><span style="color: #008000;">&#41;</span>
                <span style="color: #008000;">&#123;</span>
                    copia<span style="color: #008000;">.</span><span style="color: #0000FF;">padre</span> <span style="color: #008000;">=</span> <span style="color: #008000;">&#40;</span>Nodo<span style="color: #008000;">&#41;</span>historico<span style="color: #008000;">.</span><span style="color: #0000FF;">padre</span><span style="color: #008000;">.</span><span style="color: #0000FF;">MemberwiseClone</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
                    copia<span style="color: #008000;">.</span><span style="color: #0000FF;">padre</span><span style="color: #008000;">.</span><span style="color: #0000FF;">hijo</span> <span style="color: #008000;">=</span> copia<span style="color: #008000;">;</span>
                    historico <span style="color: #008000;">=</span> historico<span style="color: #008000;">.</span><span style="color: #0000FF;">padre</span><span style="color: #008000;">;</span>
                    copia <span style="color: #008000;">=</span> copia<span style="color: #008000;">.</span><span style="color: #0000FF;">padre</span><span style="color: #008000;">;</span>
                <span style="color: #008000;">&#125;</span>
                cercano <span style="color: #008000;">=</span> copia<span style="color: #008000;">;</span>
                aproximado <span style="color: #008000;">=</span> resultado<span style="color: #008000;">;</span>
            <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #008080; font-style: italic;">// La función principal que busca el resultado combinando el conjunto de números del nodo con las</span>
        <span style="color: #008080; font-style: italic;">// operaciones de suma, resta, multiplicación y división.</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">bool</span> busca<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #008080; font-style: italic;">// Si el nodo actual contiene el número buscado ya no hacemos más búsquedas</span>
            <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>resultado <span style="color: #008000;">==</span> buscado<span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">&#125;</span>
&nbsp;
            <span style="color: #008080; font-style: italic;">// Vamos recorriendo cada elemento del conjunto de números operándolo con los demás.</span>
            <span style="color: #0600FF; font-weight: bold;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span> indice1 <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> indice1 <span style="color: #008000;">&lt;</span> numeros<span style="color: #008000;">.</span><span style="color: #0000FF;">Count</span><span style="color: #008000;">;</span> indice1<span style="color: #008000;">++</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                <span style="color: #0600FF; font-weight: bold;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span> indice2 <span style="color: #008000;">=</span> indice1 <span style="color: #008000;">+</span> <span style="color: #FF0000;">1</span><span style="color: #008000;">;</span> indice2 <span style="color: #008000;">&lt;</span> numeros<span style="color: #008000;">.</span><span style="color: #0000FF;">Count</span><span style="color: #008000;">;</span> indice2<span style="color: #008000;">++</span><span style="color: #008000;">&#41;</span>
                <span style="color: #008000;">&#123;</span>
                    <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>calculos<span style="color: #008000;">&#40;</span>indice1, indice2, OPERACIONES<span style="color: #008000;">.</span><span style="color: #0000FF;">SUMA</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">==</span> <span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">&#41;</span>
                    <span style="color: #008000;">&#123;</span>
                        <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">;</span>
                    <span style="color: #008000;">&#125;</span>
                    <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>calculos<span style="color: #008000;">&#40;</span>indice1, indice2, OPERACIONES<span style="color: #008000;">.</span><span style="color: #0000FF;">RESTA</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">==</span> <span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">&#41;</span>
                    <span style="color: #008000;">&#123;</span>
                        <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">;</span>
                    <span style="color: #008000;">&#125;</span>
                    <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>calculos<span style="color: #008000;">&#40;</span>indice1, indice2, OPERACIONES<span style="color: #008000;">.</span><span style="color: #0000FF;">MULTIPLICACION</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">==</span> <span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">&#41;</span>
                    <span style="color: #008000;">&#123;</span>
                        <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">;</span>
                    <span style="color: #008000;">&#125;</span>
                    <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>calculos<span style="color: #008000;">&#40;</span>indice1, indice2, OPERACIONES<span style="color: #008000;">.</span><span style="color: #0000FF;">DIVISION</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">==</span> <span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">&#41;</span>
                    <span style="color: #008000;">&#123;</span>
                        <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">;</span>
                    <span style="color: #008000;">&#125;</span>
                <span style="color: #008000;">&#125;</span>
            <span style="color: #008000;">&#125;</span>
            <span style="color: #008080; font-style: italic;">// Si llegamos aquí es que todos los cálculos en esta rama del arbol han sido infructuosos.</span>
            <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #0600FF; font-weight: bold;">false</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #008080; font-style: italic;">// Esta función crea un nuevo nodo después de operar los números. Le asigna un nuevo conjunto de números, </span>
        <span style="color: #008080; font-style: italic;">// el resultado de la operación, y los números involucrados.</span>
        <span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #6666cc; font-weight: bold;">bool</span> calculos<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span> indice1, <span style="color: #6666cc; font-weight: bold;">int</span> indice2, OPERACIONES operacion<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #6666cc; font-weight: bold;">int</span> resultado <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span>
            <span style="color: #6666cc; font-weight: bold;">string</span> signo <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;&quot;</span><span style="color: #008000;">;</span>
            <span style="color: #6666cc; font-weight: bold;">int</span> valor1 <span style="color: #008000;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span><span style="color: #008000;">&#41;</span>numeros<span style="color: #008000;">&#91;</span>indice1<span style="color: #008000;">&#93;</span><span style="color: #008000;">;</span>
            <span style="color: #6666cc; font-weight: bold;">int</span> valor2 <span style="color: #008000;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span><span style="color: #008000;">&#41;</span>numeros<span style="color: #008000;">&#91;</span>indice2<span style="color: #008000;">&#93;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #008080; font-style: italic;">// Hacemos que en la resta, división y multiplicación el primer operando sea mayor que el segundo</span>
            <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>operacion <span style="color: #008000;">==</span> OPERACIONES<span style="color: #008000;">.</span><span style="color: #0000FF;">RESTA</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">||</span> <span style="color: #008000;">&#40;</span>operacion <span style="color: #008000;">==</span> OPERACIONES<span style="color: #008000;">.</span><span style="color: #0000FF;">DIVISION</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">||</span> <span style="color: #008000;">&#40;</span>operacion <span style="color: #008000;">==</span> OPERACIONES<span style="color: #008000;">.</span><span style="color: #0000FF;">MULTIPLICACION</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>valor1 <span style="color: #008000;">&lt;</span> valor2<span style="color: #008000;">&#41;</span>
                <span style="color: #008000;">&#123;</span>
                    <span style="color: #6666cc; font-weight: bold;">int</span> valor3 <span style="color: #008000;">=</span> valor1<span style="color: #008000;">;</span>
                    valor1 <span style="color: #008000;">=</span> valor2<span style="color: #008000;">;</span>
                    valor2 <span style="color: #008000;">=</span> valor3<span style="color: #008000;">;</span>
                <span style="color: #008000;">&#125;</span>
            <span style="color: #008000;">&#125;</span>
            <span style="color: #008080; font-style: italic;">// Calculamos la operación con los números, haciendo la poda del arbol si es necesario.</span>
            <span style="color: #0600FF; font-weight: bold;">switch</span> <span style="color: #008000;">&#40;</span>operacion<span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                <span style="color: #0600FF; font-weight: bold;">case</span> OPERACIONES<span style="color: #008000;">.</span><span style="color: #0000FF;">SUMA</span><span style="color: #008000;">:</span>
                    resultado <span style="color: #008000;">=</span> valor1 <span style="color: #008000;">+</span> valor2<span style="color: #008000;">;</span>
                    signo <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;+&quot;</span><span style="color: #008000;">;</span>
                    <span style="color: #0600FF; font-weight: bold;">break</span><span style="color: #008000;">;</span>
                <span style="color: #0600FF; font-weight: bold;">case</span> OPERACIONES<span style="color: #008000;">.</span><span style="color: #0000FF;">RESTA</span><span style="color: #008000;">:</span>
                    <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>valor1 <span style="color: #008000;">-</span> valor2<span style="color: #008000;">&#41;</span> <span style="color: #008000;">==</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">&#41;</span> <span style="color: #008080; font-style: italic;">// Un número que da cero no sirve para seguir</span>
                    <span style="color: #008000;">&#123;</span>
                        <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #0600FF; font-weight: bold;">false</span><span style="color: #008000;">;</span>
                    <span style="color: #008000;">&#125;</span>
                    resultado <span style="color: #008000;">=</span> valor1 <span style="color: #008000;">-</span> valor2<span style="color: #008000;">;</span>
                    signo <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;-&quot;</span><span style="color: #008000;">;</span>
                    <span style="color: #0600FF; font-weight: bold;">break</span><span style="color: #008000;">;</span>
                <span style="color: #0600FF; font-weight: bold;">case</span> OPERACIONES<span style="color: #008000;">.</span><span style="color: #0000FF;">MULTIPLICACION</span><span style="color: #008000;">:</span>
                    <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>valor2 <span style="color: #008000;">==</span> <span style="color: #FF0000;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #008080; font-style: italic;">// Una multiplicación que por 1 da el mismo resultado no sirve</span>
                    <span style="color: #008000;">&#123;</span>
                        <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #0600FF; font-weight: bold;">false</span><span style="color: #008000;">;</span>
                    <span style="color: #008000;">&#125;</span>
                    resultado <span style="color: #008000;">=</span> valor1 <span style="color: #008000;">*</span> valor2<span style="color: #008000;">;</span>
                    signo <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;*&quot;</span><span style="color: #008000;">;</span>
                    <span style="color: #0600FF; font-weight: bold;">break</span><span style="color: #008000;">;</span>
                <span style="color: #0600FF; font-weight: bold;">case</span> OPERACIONES<span style="color: #008000;">.</span><span style="color: #0000FF;">DIVISION</span><span style="color: #008000;">:</span>
                    <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>valor2 <span style="color: #008000;">==</span> <span style="color: #FF0000;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">||</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>valor1 <span style="color: #008000;">%</span> valor2<span style="color: #008000;">&#41;</span> <span style="color: #008000;">!=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #008080; font-style: italic;">// Un división que por 1 da el mismo resultado o que tiene decimales no sirve</span>
                    <span style="color: #008000;">&#123;</span>
                        <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #0600FF; font-weight: bold;">false</span><span style="color: #008000;">;</span>
                    <span style="color: #008000;">&#125;</span>
                    resultado <span style="color: #008000;">=</span> valor1 <span style="color: #008000;">/</span> valor2<span style="color: #008000;">;</span>
                    signo <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;/&quot;</span><span style="color: #008000;">;</span>
                    <span style="color: #0600FF; font-weight: bold;">break</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">&#125;</span>
            <span style="color: #008080; font-style: italic;">// Generamos el nuevo conjunto de números sobre los que operar.</span>
            ArrayList posibilidades <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> ArrayList<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            posibilidades<span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span>resultado<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #0600FF; font-weight: bold;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span> indice <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> indice <span style="color: #008000;">&lt;</span> numeros<span style="color: #008000;">.</span><span style="color: #0000FF;">Count</span><span style="color: #008000;">;</span> indice<span style="color: #008000;">++</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                <span style="color: #008080; font-style: italic;">// No permitimos que se incluyan los números que ya se han operado.</span>
                <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>indice <span style="color: #008000;">!=</span> indice1<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&amp;&amp;</span> <span style="color: #008000;">&#40;</span>indice <span style="color: #008000;">!=</span> indice2<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
                <span style="color: #008000;">&#123;</span>
                    posibilidades<span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span>numeros<span style="color: #008000;">&#91;</span>indice<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #008000;">&#125;</span>
            <span style="color: #008000;">&#125;</span>
            <span style="color: #008080; font-style: italic;">// Creamos el nuevo nodo.</span>
            Nodo opcion <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Nodo<span style="color: #008000;">&#40;</span>posibilidades, valor1, valor2, resultado, signo, <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #008080; font-style: italic;">// Hacemos la búsqueda recursiva. Si lo encontramos vamos generando el camino hacia el nodo con el</span>
            <span style="color: #008080; font-style: italic;">// número exacto.</span>
            <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>opcion<span style="color: #008000;">.</span><span style="color: #0000FF;">busca</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">==</span> <span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                hijo <span style="color: #008000;">=</span> opcion<span style="color: #008000;">;</span>
                <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">&#125;</span>
            <span style="color: #0600FF; font-weight: bold;">else</span>
            <span style="color: #008000;">&#123;</span>
                <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #0600FF; font-weight: bold;">false</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>También podéis descargaros el <a href="http://www.sistemasorp.es/blog/cifras.zip" target="_blank">ejecutable del programa</a> para poder hacer las pruebas.</p>
<p>Así por ejemplo este reto:</p>
<p><iframe width="420" height="315" src="http://www.youtube.com/embed/Kr5NOAbYfyo" frameborder="0" allowfullscreen></iframe></p>
<p>Se resuelve como:</p>
<p><a href="http://www.sistemasorp.es/wp-content/uploads/2011/11/reto.png"><img src="http://www.sistemasorp.es/wp-content/uploads/2011/11/reto.png" alt="" title="reto" width="373" height="335" class="aligncenter size-full wp-image-473" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sistemasorp.es/2011/11/04/fuerza-bruta-en-net-para-resolver-las-cifras-del-concurso-cifras-y-letras/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Descansa en paz Dennis MacAlistair Ritchie</title>
		<link>http://www.sistemasorp.es/2011/10/13/descansa-en-paz-dennis-macalistair-ritchie/</link>
		<comments>http://www.sistemasorp.es/2011/10/13/descansa-en-paz-dennis-macalistair-ritchie/#comments</comments>
		<pubDate>Thu, 13 Oct 2011 07:45:54 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Informática]]></category>

		<guid isPermaLink="false">http://www.sistemasorp.es/?p=429</guid>
		<description><![CDATA[Todo el mundo ha hablado de la reciente muerte de Steve Jobs. Sin embargo también recientemente ha fallecido una persona que ha contribuido enormemente al desarrollo de la informática: Dennis Ritchie. Este hombre fue el creador junto a Ken Thompson del sistema operativo Unix (en el cual está basado GNU/Linux de Richard Stallman y Linus [...]]]></description>
			<content:encoded><![CDATA[<p>Todo el mundo ha hablado de la reciente muerte de Steve Jobs. Sin embargo también recientemente ha fallecido una persona que ha contribuido enormemente al desarrollo de la informática: <a href="http://es.wikipedia.org/wiki/Dennis_Ritchie" target="_blank"><strong>Dennis Ritchie</strong></a>. Este hombre fue el creador junto a Ken Thompson del sistema operativo Unix (en el cual está basado GNU/Linux de Richard Stallman y Linus Torvalds) pero su mayor aportación fue crear el lenguaje de programación C, quizá el más usado de la historia y del que derivan otros tantos como objective-c, java y c#. Hasta siempre Dennis.</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> <span style="color: #339933;">*</span>born1941 <span style="color: #339933;">=</span> malloc<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">70</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> <span style="color: #339933;">*</span>die2011 <span style="color: #339933;">=</span> born1941<span style="color: #339933;">;</span>
free<span style="color: #009900;">&#40;</span>die2011<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;bye world<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p><a href="http://www.sistemasorp.es/wp-content/uploads/2011/10/ritchie1.jpg"><img class="aligncenter size-medium wp-image-432" title="ritchie1" src="http://www.sistemasorp.es/wp-content/uploads/2011/10/ritchie1-300x289.jpg" alt="" width="300" height="289" /></a></p>
<h6 style="text-align: center;">(Fuente: chw.net)</h6>
]]></content:encoded>
			<wfw:commentRss>http://www.sistemasorp.es/2011/10/13/descansa-en-paz-dennis-macalistair-ritchie/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Mi charla de telemetría</title>
		<link>http://www.sistemasorp.es/2011/10/11/mi-charla-de-telemetria/</link>
		<comments>http://www.sistemasorp.es/2011/10/11/mi-charla-de-telemetria/#comments</comments>
		<pubDate>Tue, 11 Oct 2011 07:32:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Electrónica]]></category>
		<category><![CDATA[Informática]]></category>
		<category><![CDATA[Proyectos]]></category>

		<guid isPermaLink="false">http://www.sistemasorp.es/?p=422</guid>
		<description><![CDATA[Ya han publicado el vídeo de la charla de telemetría que di en la OSHWCON 2011. Toda la documentación de mi charla (presentación, código fuente, esquemáticos, etc.) lo podeis descargar aquí. Agradecer a los organizadores su tiempo, esfuerzo y ganas por sacar adelante algo tan novedoso y pionero. También dignos de mención son los ponentes [...]]]></description>
			<content:encoded><![CDATA[<p>Ya han publicado el vídeo de la charla de telemetría que di en la <a href="http://oshwcon.org/" target="_blank">OSHWCON 2011</a>.</p>
<p><iframe width="420" height="236" src="http://www.youtube.com/embed/cb4OX4HuePQ" frameborder="0" allowfullscreen></iframe></p>
<p>Toda la documentación de mi charla (presentación, código fuente, esquemáticos, etc.) <a href="http://www.sistemasorp.es/blog/oshwcon.zip">lo podeis descargar aquí</a>.</p>
<p>Agradecer a los organizadores su tiempo, esfuerzo y ganas por sacar adelante algo tan novedoso y pionero. También dignos de mención son los ponentes que de forma altruista hemos hecho realidad este fantástico evento. Por supuesto no nos olvidemos de los patrocinadores que han permitido que este evento tuviese un nivel alto y de calidad.</p>
<p>A todos, nos vemos en la OSHWCON 2012.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sistemasorp.es/2011/10/11/mi-charla-de-telemetria/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Convertir un fichero wav comprimido con el codec G729A</title>
		<link>http://www.sistemasorp.es/2010/09/27/convertir-un-fichero-wav-comprimido-con-el-codec-g729a/</link>
		<comments>http://www.sistemasorp.es/2010/09/27/convertir-un-fichero-wav-comprimido-con-el-codec-g729a/#comments</comments>
		<pubDate>Mon, 27 Sep 2010 11:57:28 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Informática]]></category>
		<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[codec]]></category>
		<category><![CDATA[g729a]]></category>
		<category><![CDATA[librería]]></category>
		<category><![CDATA[programa]]></category>

		<guid isPermaLink="false">http://www.sistemasorp.es/?p=346</guid>
		<description><![CDATA[Recientemente me ha surgido la necesidad de convertir unos ficheros de audio que estaban en formato .WAV comprimido con el codec G729A a un formato .WAV reproducible en cualquier PC para hacer unas pruebas. Se trataba de poder escuchar ficheros .WAV que estaban comprimidos con ese codec, pero dada la dificultad de encontrar el codec [...]]]></description>
			<content:encoded><![CDATA[<p>Recientemente me ha surgido la necesidad de convertir unos ficheros de audio que estaban en formato .WAV comprimido con el codec <a href="http://es.wikipedia.org/wiki/G.729" target="_blank">G729A</a> a un formato .WAV reproducible en cualquier PC para hacer unas pruebas. Se trataba de poder escuchar ficheros .WAV que estaban comprimidos con ese codec, pero dada la dificultad de encontrar el codec gratuitamente para poder instalarlo en Windows he encontrado una alternativa que sirve igualmente.</p>
<p>En la página de Voice Age he encontrado <a href="http://www.voiceage.com/openinit_g729.php" target="_blank">una librería gratuita para windows con ejemplos y ejecutables</a> de cómo extraer el audio comprimido con un codec G729A. Si se va a usar comercialmente se debe pedir una licencia a <a href="http://www.sipro.com/" target="_blank">sipro</a> que es quien tiene los derechos de licenciamiento.</p>
<p>El problema con los ejecutables de Voice Age es que convierte de formato G729A a formato <a href="http://es.wikipedia.org/wiki/RAW_%28formato%29" target="_blank">RAW</a>, pero ni el origen tiene los datos por sí sólo (están embebidos en un fichero .wav) ni en la conversión se pasa a un fichero .wav reproducible en windows.</p>
<p>Por ello he creado un programa de consola en Visual C++ 6.0 que hace uso de la librería .lib que ofrece VoiceAge para hacer esos dos pasos. La idea es leer unos datos del fichero wav y moverse hasta el byte 44 del fichero wav de origen, accediendo así a los datos de audio directamente; crear un fichero .wav de destino,  introduciendo en este la cabecera de un fichero .wav con el tamaño de los datos de audio descomprimido e indicando que tiene formato <a href="http://es.wikipedia.org/wiki/Modulaci%C3%B3n_por_impulsos_codificados" target="_blank">PCM</a>; finalmente leer los datos de audio comprimido, descomprimirlos con la librería y escribirlos en el fichero de destino.</p>
<p>Este es el código fuente del mismo:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &quot;stdafx.h&quot;</span>
<span style="color: #339933;">#include &quot;va_g729.h&quot;</span>
<span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;memory.h&gt;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span><span style="color: #339933;">*</span> argv<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	FILE <span style="color: #339933;">*</span>entrada<span style="color: #339933;">;</span>
	FILE <span style="color: #339933;">*</span>salida<span style="color: #339933;">;</span>
	<span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span>	serial<span style="color: #009900;">&#91;</span>L_FRAME_COMPRESSED<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #993333;">short</span>			synth<span style="color: #009900;">&#91;</span>L_FRAME<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #993333;">int</span>				bfi<span style="color: #339933;">;</span>
	<span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> cabecera<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #208080;">0x52</span><span style="color: #339933;">,</span><span style="color: #208080;">0x49</span><span style="color: #339933;">,</span><span style="color: #208080;">0x46</span><span style="color: #339933;">,</span><span style="color: #208080;">0x46</span><span style="color: #339933;">,</span><span style="color: #208080;">0x00</span><span style="color: #339933;">,</span><span style="color: #208080;">0x00</span><span style="color: #339933;">,</span><span style="color: #208080;">0x00</span><span style="color: #339933;">,</span><span style="color: #208080;">0x00</span><span style="color: #339933;">,</span><span style="color: #208080;">0x57</span><span style="color: #339933;">,</span><span style="color: #208080;">0x41</span><span style="color: #339933;">,</span><span style="color: #208080;">0x56</span><span style="color: #339933;">,</span><span style="color: #208080;">0x45</span><span style="color: #339933;">,</span><span style="color: #208080;">0x66</span><span style="color: #339933;">,</span><span style="color: #208080;">0x6D</span><span style="color: #339933;">,</span><span style="color: #208080;">0x74</span><span style="color: #339933;">,</span><span style="color: #208080;">0x20</span><span style="color: #339933;">,</span><span style="color: #208080;">0x10</span><span style="color: #339933;">,</span><span style="color: #208080;">0x00</span><span style="color: #339933;">,</span><span style="color: #208080;">0x00</span><span style="color: #339933;">,</span><span style="color: #208080;">0x00</span><span style="color: #339933;">,</span><span style="color: #208080;">0x01</span><span style="color: #339933;">,</span><span style="color: #208080;">0x00</span><span style="color: #339933;">,</span><span style="color: #208080;">0x01</span><span style="color: #339933;">,</span><span style="color: #208080;">0x00</span><span style="color: #339933;">,</span><span style="color: #208080;">0x40</span><span style="color: #339933;">,</span><span style="color: #208080;">0x1F</span><span style="color: #339933;">,</span><span style="color: #208080;">0x00</span><span style="color: #339933;">,</span><span style="color: #208080;">0x00</span><span style="color: #339933;">,</span><span style="color: #208080;">0x80</span><span style="color: #339933;">,</span><span style="color: #208080;">0x3E</span><span style="color: #339933;">,</span><span style="color: #208080;">0x00</span><span style="color: #339933;">,</span><span style="color: #208080;">0x00</span><span style="color: #339933;">,</span><span style="color: #208080;">0x02</span><span style="color: #339933;">,</span><span style="color: #208080;">0x00</span><span style="color: #339933;">,</span><span style="color: #208080;">0x10</span><span style="color: #339933;">,</span><span style="color: #208080;">0x00</span><span style="color: #339933;">,</span><span style="color: #208080;">0x64</span><span style="color: #339933;">,</span><span style="color: #208080;">0x61</span><span style="color: #339933;">,</span><span style="color: #208080;">0x74</span><span style="color: #339933;">,</span><span style="color: #208080;">0x61</span><span style="color: #339933;">,</span><span style="color: #208080;">0x00</span><span style="color: #339933;">,</span><span style="color: #208080;">0x00</span><span style="color: #339933;">,</span><span style="color: #208080;">0x00</span><span style="color: #339933;">,</span><span style="color: #208080;">0x00</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
	<span style="color: #993333;">unsigned</span> <span style="color: #993333;">long</span> longitud<span style="color: #339933;">;</span>
	<span style="color: #993333;">unsigned</span> <span style="color: #993333;">long</span> <span style="color: #339933;">*</span>puntero<span style="color: #339933;">;</span>
&nbsp;
	puts<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;SISTEMAS O.R.P.<span style="color: #000099; font-weight: bold;">\n</span>Convertidor de WAVs G729A a PCM<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// Se comprueban los parámetros</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>argc <span style="color: #339933;">!=</span> <span style="color: #0000dd;">3</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		puts<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Debe introducir el archivo wav de origen y el archivo wav de destino.&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// Se abre el fichero de origen</span>
	entrada <span style="color: #339933;">=</span> fopen<span style="color: #009900;">&#40;</span>argv<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;rb&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>entrada <span style="color: #339933;">==</span> NULL<span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		puts<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;No se pudo abrir el fichero de origen&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// Se abre el fichero de destino</span>
	salida <span style="color: #339933;">=</span> fopen<span style="color: #009900;">&#40;</span>argv<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;wb&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>salida <span style="color: #339933;">==</span> NULL<span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		puts<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;No se pudo abrir el fichero de destino&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		fclose<span style="color: #009900;">&#40;</span>entrada<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// Se comprueba que el fichero origen es un .wav</span>
	fread<span style="color: #009900;">&#40;</span>serial<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">4</span><span style="color: #339933;">,</span> entrada<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>memcmp<span style="color: #009900;">&#40;</span>serial<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;RIFF&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">4</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
&nbsp;
		puts<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;El fichero de entrada no es un wav&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		fclose<span style="color: #009900;">&#40;</span>entrada<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		fclose<span style="color: #009900;">&#40;</span>salida<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">3</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// Se lee el tamaño de los datos de audio del fichero origen</span>
	<span style="color: #666666; font-style: italic;">// y se calcula el tamaño de los datis de audio del fichero destino</span>
	fread<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>longitud<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">long</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> entrada<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	puntero <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">long</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span>cabecera <span style="color: #339933;">+</span> <span style="color: #0000dd;">4</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #339933;">*</span>puntero <span style="color: #339933;">=</span> <span style="color: #0000dd;">36</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span>longitud <span style="color: #339933;">-</span> <span style="color: #0000dd;">36</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> L_FRAME <span style="color: #339933;">/</span> L_FRAME_COMPRESSED <span style="color: #339933;">*</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">;</span>
	puntero <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">long</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span>cabecera <span style="color: #339933;">+</span> <span style="color: #0000dd;">40</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #339933;">*</span>puntero <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>longitud <span style="color: #339933;">-</span> <span style="color: #0000dd;">36</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> L_FRAME <span style="color: #339933;">/</span> L_FRAME_COMPRESSED <span style="color: #339933;">*</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">// Se escribe la cabecera wav al fichero de destino</span>
	fwrite<span style="color: #009900;">&#40;</span>cabecera<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>cabecera<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> salida<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">// Saltamos al byte 44 donde se encuentran los datos de audio comprimido</span>
	fseek<span style="color: #009900;">&#40;</span>entrada<span style="color: #339933;">,</span> <span style="color: #0000dd;">44</span><span style="color: #339933;">,</span> SEEK_SET<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// Se inicializa el descompresor</span>
	va_g729a_init_decoder<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// Se lee un grupo de bytes comprimidos y se escriben descomprimidos</span>
	<span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>fread<span style="color: #009900;">&#40;</span>serial<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> L_FRAME_COMPRESSED<span style="color: #339933;">,</span> entrada<span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> L_FRAME_COMPRESSED<span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		bfi <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
		va_g729a_decoder<span style="color: #009900;">&#40;</span>serial<span style="color: #339933;">,</span> synth<span style="color: #339933;">,</span> bfi<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		fwrite<span style="color: #009900;">&#40;</span>synth<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">short</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> L_FRAME<span style="color: #339933;">,</span> salida<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	fclose<span style="color: #009900;">&#40;</span>entrada<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	fclose<span style="color: #009900;">&#40;</span>salida<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	puts<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Proceso terminado&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Y aquí dejo el fichero ejecutable:</p>
<p><a href="http://www.sistemasorp.es/wp-content/uploads/2010/09/G729AtoPCM.zip">G729AtoPCM</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sistemasorp.es/2010/09/27/convertir-un-fichero-wav-comprimido-con-el-codec-g729a/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Restringir el area de uso del ratón</title>
		<link>http://www.sistemasorp.es/2010/08/12/restringir-el-area-de-uso-del-raton/</link>
		<comments>http://www.sistemasorp.es/2010/08/12/restringir-el-area-de-uso-del-raton/#comments</comments>
		<pubDate>Thu, 12 Aug 2010 12:51:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Informática]]></category>
		<category><![CDATA[area]]></category>
		<category><![CDATA[ClipCursor]]></category>
		<category><![CDATA[ratón]]></category>
		<category><![CDATA[restringir]]></category>
		<category><![CDATA[win32]]></category>

		<guid isPermaLink="false">http://www.sistemasorp.es/?p=322</guid>
		<description><![CDATA[Con un simple comando de la API de windows, ClipCursor, podemos restringir el uso del ratón a una zona del escritorio de windows. Un posible uso es restringir a un usuario el uso del ratón a la ventana de una aplicación sin que pueda salir de ella, y por tanto no ejecutar otras opciones del [...]]]></description>
			<content:encoded><![CDATA[<p>Con un simple comando de la API de windows, ClipCursor, podemos restringir el uso del ratón a una zona del escritorio de windows. Un posible uso es restringir a un usuario el uso del ratón a la ventana de una aplicación  sin que pueda salir de ella, y por tanto no ejecutar otras opciones del escritorio, pulsar sobre otras ventanas, o deplegar el menú de inicio.</p>
<p>El prototipo de la función es:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">bool ClipCursor<span style="color: #009900;">&#40;</span>RECT <span style="color: #339933;">*</span>rectangulo<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Asi por ejemplo si queremos restringirlo a la ventana de la calculadora podemos hacerlo de la siguiente forma:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">RECT retangulo<span style="color: #339933;">;</span>
HWND ventana <span style="color: #339933;">=</span> FindWindow<span style="color: #009900;">&#40;</span>NULL<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Calculadora&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
GetClientRect<span style="color: #009900;">&#40;</span>ventana<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>rectangulo<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
ClipCursor<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>rectangulo<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.sistemasorp.es/2010/08/12/restringir-el-area-de-uso-del-raton/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Base de datos de IPs</title>
		<link>http://www.sistemasorp.es/2009/12/24/base-de-datos-de-ips/</link>
		<comments>http://www.sistemasorp.es/2009/12/24/base-de-datos-de-ips/#comments</comments>
		<pubDate>Thu, 24 Dec 2009 08:43:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Informática]]></category>

		<guid isPermaLink="false">http://www.sistemasorp.es/?p=263</guid>
		<description><![CDATA[Hoy en día se puede saber de cualquier IP a qué ciudad pertenece (incluso a veces hasta el barrio). Para ello existen bases de datos en Internet donde se puede consultar este tipo de información. En concreto voy a comentar sobre un sitio que ofrece este servicio gratis y es mantenido por donaciones. Se llama [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy en día se puede saber de cualquier IP a qué ciudad pertenece (incluso a veces hasta el barrio). Para ello existen bases de datos en Internet donde se puede consultar este tipo de información.</p>
<p>En concreto voy a comentar sobre un sitio que ofrece este servicio gratis y es mantenido por donaciones. Se llama <a href="http://ipinfodb.com/" target="_blank">IPInfoDB</a>. Provee varios servicios:</p>
<ul>
<li><a href="http://ipinfodb.com/ip_locator.php" target="_blank">Búsqueda por formulario</a>.</li>
<li><a href="http://ipinfodb.com/ip_location_api.php" target="_blank">Búsqueda mediante API</a> mediante XML o JSON.</li>
<li><a href="http://ipinfodb.com/ip_database.php" target="_blank">Descarga de base de datos</a> en formato CSV o querys SQL y una precisión a nivel de país o de ciudad.</li>
</ul>
<p>Los usos que se le pueden dar son muchos: Saber desde donde te envían los comentarios, crear un servicio en internet destinado a un país o ciudad en concreto, conocer donde están ubicados los datacenters de un dominio determinado, personalizar el idioma de una página al usuario que la visita, etc.</p>
<p>La información se actualiza a principios de cada mes.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sistemasorp.es/2009/12/24/base-de-datos-de-ips/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ejecutar un script nada más recibir un correo con postfix</title>
		<link>http://www.sistemasorp.es/2009/11/20/ejecutar-un-script-nada-mas-recibir-un-correo-con-postfix/</link>
		<comments>http://www.sistemasorp.es/2009/11/20/ejecutar-un-script-nada-mas-recibir-un-correo-con-postfix/#comments</comments>
		<pubDate>Fri, 20 Nov 2009 10:41:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Informática]]></category>

		<guid isPermaLink="false">http://www.sistemasorp.es/?p=250</guid>
		<description><![CDATA[El servidor de correo Postfix es muy potente y altamente configurable. Ente sus multiples opciones, una de ellas es permitir realizar una acción al recibir un correo y esto se puede aprovechar (como se verá más adelante) para ejecutar un script o programa al recibir un correo. La ventaja con respecto a estar comprobando cada [...]]]></description>
			<content:encoded><![CDATA[<p>El servidor de correo Postfix es muy potente y altamente configurable.</p>
<p>Ente sus multiples opciones, una de ellas es permitir realizar una acción al recibir un correo y esto se puede aprovechar (como se verá más adelante) para ejecutar un script o programa al recibir un correo.</p>
<p>La ventaja con respecto a estar comprobando cada cierto tiempo un buzón de correo es que el script se ejecuta inmediatamente al recibir un correo , no hace falta tener un servidor pop3 y no hace falta borrar el mensaje porque postfix se lo pasa a la aplicación y no lo guarda en ningún sitio.</p>
<p>Para explicar como configurarlo, parto de la base de que ya se tiene configurado el postfix con un dominio y recibe correos en ese dominio. En mi caso tengo el dominio <em>sistemasorp.com</em> dirigido a mi servidor casero.</p>
<p>Como no quiero que interfiera con el correo de mi dominio actual, he de crear un nuevo registro MX en mi servidor DNS para añadir un subdominio, por ejemplo <em>servicios.sistemasorp.com</em> (esto también me dá una ventaja que comentaré más adelante).</p>
<p>El siguiente paso es acceder como root a la consola y entrar en el directorio <strong>/etc/postfix</strong> (o donde se encuentre el directorio de configuración del postfix).</p>
<p>Editar el fichero <strong>main.cf</strong> y añadirlas siguientes lineas (si no existían ya)</p>
<blockquote><p><strong>transport_maps = hash:/etc/postfix/transport</strong></p>
<p><strong>local_recipient_maps=</strong></p></blockquote>
<p>Editar el fichero <strong>master.cf</strong> y añadir la siguiente linea:</p>
<blockquote><p><strong><em>XXX</em> unix    -       n       n       -       1       pipe  flags= user=<em>YYY</em> argv=<em>ZZZ</em> ${sender} ${recipient}</strong></p></blockquote>
<ul>
<li>XXX indica el nombre de una alias, en mi caso <em>servicios</em></li>
<li>YYY es el usuario del sistema con el que se ejecutará el script (escoge uno que tenga persmisos para lo que quieras hacer)</li>
<li>ZZZ es la ruta del script o programa que quieres que se ejecute, en mi caso /usr/local/bin/emailprueba.sh</li>
<li>${sender} y ${recipient} son dos variables que le pasamos por parámetros al script.</li>
</ul>
<p>Editar el fichero transport y añadir la siguiente linea:</p>
<blockquote><p><strong>subdominio      XXX:localhost</strong></p></blockquote>
<ul>
<li>subdominio es la parte entera del dominio, en mi caso servicios.sistemasorp.com</li>
<li>XXX indica el nombre del alias que usamos en el fichero master.cf, en mi caso <em>servicios</em></li>
</ul>
<p>Finalmente ejecutar <strong>postmap /etc/postfix/transport</strong> para crear la base de datos de transportes de postfix.</p>
<p>Con esto, cualquier correo que se dirija al subdominio que hemos creado se pasará directamente a nuestro script. De ahí nuestra ventaja que comentaba antes: da igual el nombre que aparezca a la izquierda de la arroba, no hace falta que esté dado de alta como usuario en linux, por lo que podemos usarlo como un identificador de servicio, el número de un móvil, etc.</p>
<p>Postfix lo que hace es ejecutar el script pasándole por la entrada estandar todo el contenido del mensaje (cabeceras y cuerpo) y como parámetros los que se le indiquen en el <em>master.cf</em> : la variable ${sender} es la cuenta de correo electrónico del remitente y ${recipient} es el nombre que aparece a la izquierda de la arroba, aunque <a href="http://www.postfix.org/pipe.8.html" target="_blank">hay muchos más</a>.</p>
<p>Así por ejemplo si queremos tener un servicio de envío de sms podemos crear un mensaje dirigido a 699999999@servicios.sistemasorp.com desde nuestra cuenta google@gmail.com, por lo que el script además de recibir el mensaje entero recibe como parámetros google@gmail.com y 699999999.</p>
<p>Otro ejemplo es tener un servicio de envío de ficheros y uno de traducción de palabras. En el primer caso si enviamos un correo desde nuestra cuenta google@gmail.com a enviame@servicios.sistemasorp.com y como asunto ponemos una URL nos enviaría de vuelta como fichero adjunto el indicado en la URL. En el segundo caso si enviamos un correo desde nuestra cuenta google@gmail.com a traduce@servicios.sistemasorp.com y como asunto ponemos una palabra en inglés nos enviaría de vuelta la traducción del termino. En ambos casos el script es el mismo y se encarga de saber qué servicio estas solicitando por el nombre de la cuenta de correo al que va dirigido y actuar en consecuencia.</p>
<p>Un script sencillo para ir probando los conceptos es este:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #c20cb9; font-weight: bold;">read</span> linea
<span style="color: #000000; font-weight: bold;">do</span>
 <span style="color: #007800;">cabecera</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$linea</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">cut</span> <span style="color: #660033;">-d</span><span style="color: #ff0000;">':'</span> -f1<span style="color: #000000; font-weight: bold;">`</span>
 <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$cabecera</span>&quot;</span> = Subject <span style="color: #7a0874; font-weight: bold;">&#93;</span>
 <span style="color: #000000; font-weight: bold;">then</span>
  <span style="color: #007800;">mensaje</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$linea</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">cut</span> <span style="color: #660033;">-d</span><span style="color: #ff0000;">':'</span> -f2<span style="color: #000000; font-weight: bold;">`</span>
  <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$mensaje</span> <span style="color: #007800;">$2</span> <span style="color: #000000; font-weight: bold;">|</span> mail <span style="color: #660033;">-s</span> <span style="color: #ff0000;">&quot;Esto es lo que enviaste y a quien&quot;</span> <span style="color: #007800;">$1</span>
  <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$1</span> <span style="color: #007800;">$2</span> <span style="color: #007800;">$mensaje</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>pruebamail
 <span style="color: #000000; font-weight: bold;">fi</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<p>Simplemente recibe un correo y vuelve a enviar al remitente otro correo con los datos que envió. Lo podeis probar enviando un mensaje a pepe@servicios.sistemasorp.com, prueba_de_concepto@servicios.sistemasorp.com, asdfhasdjlfhasdjkfhjkdfh@servicios.sistemasorp.com o el destinatario que querais@servicios.sistemasorp.com y un asunto cualquiera (si no lo recibis mirad que no se haya puesto en vuestra carpeta de spam).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sistemasorp.es/2009/11/20/ejecutar-un-script-nada-mas-recibir-un-correo-con-postfix/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adiós dominios, adiós</title>
		<link>http://www.sistemasorp.es/2009/11/02/adios-dominios-adios/</link>
		<comments>http://www.sistemasorp.es/2009/11/02/adios-dominios-adios/#comments</comments>
		<pubDate>Mon, 02 Nov 2009 14:26:06 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Informática]]></category>
		<category><![CDATA[dominio]]></category>
		<category><![CDATA[internet]]></category>

		<guid isPermaLink="false">http://www.sistemasorp.es/2009/11/02/adios-dominios-adios/</guid>
		<description><![CDATA[Me he deshecho de dos dominios de internet que ya no quería seguir manteniendo. Uno de ellos es quejateportodo.com. Este es muy antiguo y data de 2001. Su función principal fue albergar una especie de foro donde la gente expusiera sus quejas sobre los temas que quisieran. Estába organizado por secciones para poder clasificar mejor [...]]]></description>
			<content:encoded><![CDATA[<p>Me he deshecho de dos dominios de internet que ya no quería seguir manteniendo.</p>
<p>Uno de ellos es quejateportodo.com. Este es muy antiguo y data de 2001. Su función principal fue albergar una especie de foro donde la gente expusiera sus quejas sobre los temas que quisieran. Estába organizado por secciones para poder clasificar mejor las quejas. Como anécdota os puedo contar que una vez me llamó la Policía Local de Granada por una denuncia que había puesto el dueño de unos parkings por unas criticas feroces a su gestión publicadas en la web; como le pedí una orden judicial para darle los logs del servidor web se calló y no volví a saber nada de el (¿Sería el propio dueño de los parkings haciendose pasar por la policía?). Finalmente como hice varios cambios y veía que no tenía mucho éxito lo dediqué a otras cosas.</p>
<p>El segundo es horaylugar.com. Una web donde podías crear citas, eventos, reuniones, etc y localizarlas en un mapa para después enviarselo a quien quisieras. Lo presenté al único concurso de mashups de Google Maps y quedó 4º, pero debido a su poco éxito lo abandoné a su suerte.</p>
<p>Actualmente ya sólo tengo los dominios sistemasorp.com (el dominio que apunta a mi servidor casero basado el linux), sistemasorp.es (el dominio asociado a mi cuenta de hosting) y sistemasorp.es (este blog)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sistemasorp.es/2009/11/02/adios-dominios-adios/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

