<?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/"
	>

<channel>
	<title>Poesía binaria</title>
	<atom:link href="http://totaki.com/poesiabinaria/feed/" rel="self" type="application/rss+xml" />
	<link>http://totaki.com/poesiabinaria</link>
	<description>Programación, Tecnología y Software Libre</description>
	<pubDate>Mon, 30 Apr 2012 08:11:10 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Hallar la IP de un dispositivo en C</title>
		<link>http://totaki.com/poesiabinaria/2012/04/hallar-la-ip-de-un-dispositivo-en-c/</link>
		<comments>http://totaki.com/poesiabinaria/2012/04/hallar-la-ip-de-un-dispositivo-en-c/#comments</comments>
		<pubDate>Mon, 30 Apr 2012 08:11:10 +0000</pubDate>
		<dc:creator>Gaspar Fernández</dc:creator>
		
		<category><![CDATA[C/C++]]></category>

		<category><![CDATA[Linux]]></category>

		<category><![CDATA[averiguar]]></category>

		<category><![CDATA[dirección]]></category>

		<category><![CDATA[dispositivo]]></category>

		<category><![CDATA[ioctl]]></category>

		<category><![CDATA[ip]]></category>

		<category><![CDATA[siocgifaddr]]></category>

		<guid isPermaLink="false">http://totaki.com/poesiabinaria/?p=1614</guid>
		<description><![CDATA[
			
				
			
		
Puede que se nos haya presentado alguna vez la necesidad de saber la dirección de un dispositivo desde nuestro programa, y no es plan de ponernos a ejecutar ifconfig o algún programa parecido para hallar la dirección.
Podemos hablar con ioctl() una función destinada a definir y obtener información de dispositivos. Hay cientos de llamadas, aquí [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F04%2Fhallar-la-ip-de-un-dispositivo-en-c%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F04%2Fhallar-la-ip-de-un-dispositivo-en-c%2F&amp;style=normal&amp;service=is.gd&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Puede que se nos haya presentado alguna vez la necesidad de saber la dirección de un dispositivo desde nuestro programa, y no es plan de ponernos a ejecutar ifconfig o algún programa parecido para hallar la dirección.</p>
<p>Podemos hablar con ioctl() una función destinada a definir y obtener información de dispositivos. Hay cientos de llamadas, aquí comentaremos la llamada SIOCGIFADDR cuya función es la que comentábamos, obtener la dirección de un interfaz de red.</p>
<p>Podemos probar el siguiente programa con el que hallaremos la IP del dispositivo eth0:</p>
<div class="codecolorer-container c " style="overflow:auto;white-space:nowrap;width:580px;height:300px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br /></div></td><td><div class="c codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="co2">#include &lt;sys/socket.h&gt;</span><br />
<span class="co2">#include &lt;netinet/in.h&gt;</span><br />
<span class="co2">#include &lt;arpa/inet.h&gt;</span><br />
<span class="co2">#include &lt;stdio.h&gt;</span><br />
<span class="co2">#include &lt;sys/types.h&gt;</span><br />
<span class="co2">#include &lt;sys/ioctl.h&gt;</span><br />
<span class="co2">#include &lt;net/if.h&gt;</span><br />
<span class="co2">#include &lt;string.h&gt;</span><br />
<br />
<span class="kw4">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw4">int</span> sock<span class="sy0">;</span><br />
&nbsp; <span class="kw4">struct</span> ifreq ifr<span class="sy0">;</span><br />
<br />
&nbsp; sock<span class="sy0">=</span>socket<span class="br0">&#40;</span>AF_INET<span class="sy0">,</span> SOCK_DGRAM<span class="sy0">,</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>sock<span class="sy0">&lt;</span><span class="nu0">0</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="sy0">-</span><span class="nu0">1</span><span class="sy0">;</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/* No puedo crear el socket */</span><br />
<br />
&nbsp; ifr.<span class="me1">ifr_addr</span>.<span class="me1">sa_family</span> <span class="sy0">=</span> AF_INET<span class="sy0">;</span><br />
&nbsp; strcpy<span class="br0">&#40;</span>ifr.<span class="me1">ifr_name</span><span class="sy0">,</span> <span class="st0">&quot;eth0&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>ioctl<span class="br0">&#40;</span>sock<span class="sy0">,</span> SIOCGIFADDR<span class="sy0">,</span> <span class="sy0">&amp;</span>ifr<span class="br0">&#41;</span> <span class="sy0">&lt;</span> <span class="nu0">0</span><span class="br0">&#41;</span> <br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="sy0">-</span><span class="nu0">1</span><span class="sy0">;</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/* No encuentro el dispositivo */</span><br />
&nbsp;<br />
&nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;IP de eth0: %s<span class="es1">\n</span>&quot;</span><span class="sy0">,</span> inet_ntoa<span class="br0">&#40;</span> <span class="br0">&#40;</span><span class="sy0">*</span><span class="br0">&#40;</span><span class="kw4">struct</span> in_addr <span class="sy0">*</span><span class="br0">&#41;</span> <span class="sy0">&amp;</span>ifr.<span class="me1">ifr_addr</span>.<span class="me1">sa_data</span><span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; close<span class="br0">&#40;</span>sock<span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; <span class="kw1">return</span> <span class="nu0">0</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span></div></td></tr></tbody></table></div>
<p>Primero creamos un socket, luego definimos la familia y el dispositivo que queremos consultar con:</p>
<div class="codecolorer-container c " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br /></div></td><td><div class="c codecolorer" style="font-family:Monaco,Lucida Console,monospace">ifr.<span class="me1">ifr_addr</span>.<span class="me1">sa_family</span> <span class="sy0">=</span> AF_INET<span class="sy0">;</span><br />
&nbsp; strcpy<span class="br0">&#40;</span>ifr.<span class="me1">ifr_name</span><span class="sy0">,</span> <span class="st0">&quot;eth0&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></td></tr></tbody></table></div>
<p>Para comprender cómo obtenemos la dirección debemos echar un ojo a las estructuras:<br />
(struct ifreq)</p>
<div class="codecolorer-container c " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br /></div></td><td><div class="c codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw4">struct</span> ifreq<br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw4">char</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ifr_name<span class="br0">&#91;</span>IFNAMSIZ<span class="br0">&#93;</span><span class="sy0">;</span> &nbsp; <span class="coMULTI">/* Nombre de la interfaz */</span><br />
&nbsp; &nbsp; <span class="kw4">union</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">struct</span> sockaddr &nbsp; &nbsp; &nbsp; ifr_addr<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">struct</span> sockaddr &nbsp; &nbsp; &nbsp; ifr_dstaddr<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">struct</span> sockaddr &nbsp; &nbsp; &nbsp; ifr_broadaddr<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">struct</span> sockaddr &nbsp; &nbsp; &nbsp; ifr_netmask<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">struct</span> sockaddr &nbsp; &nbsp; &nbsp; ifr_hwaddr<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">short</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ifr_flags<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ifr_ifindex<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ifr_metric<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ifr_mtu<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">struct</span> ifmap &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ifr_map<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">char</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ifr_slave<span class="br0">&#91;</span>IFNAMSIZ<span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">char</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ifr_newname<span class="br0">&#91;</span>IFNAMSIZ<span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">char</span> <span class="sy0">*</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ifr_data<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span></div></td></tr></tbody></table></div>
<p>(struct sockaddr)</p>
<div class="codecolorer-container c " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="c codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw4">struct</span> sockaddr <br />
<span class="br0">&#123;</span> <br />
&nbsp; &nbsp;<span class="kw4">unsigned</span> <span class="kw4">short</span> sa_family<span class="sy0">;</span> &nbsp;<span class="coMULTI">/* familia de la dirección */</span> <br />
&nbsp; &nbsp;<span class="kw4">char</span> sa_data<span class="br0">&#91;</span><span class="nu0">14</span><span class="br0">&#93;</span><span class="sy0">;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="coMULTI">/* 14 bytes de la dirección del protocolo */</span> &nbsp;<br />
<span class="br0">&#125;</span><span class="sy0">;</span></div></td></tr></tbody></table></div>
<p>(struct sockaddr_in)</p>
<div class="codecolorer-container c " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td><div class="c codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw4">struct</span> sockaddr_in <br />
<span class="br0">&#123;</span> <br />
&nbsp; &nbsp;<span class="kw4">short</span> <span class="kw4">int</span> sin_family<span class="sy0">;</span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="coMULTI">/* Familia de la Dirección &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span> <br />
&nbsp; &nbsp;<span class="kw4">unsigned</span> <span class="kw4">short</span> <span class="kw4">int</span> sin_port<span class="sy0">;</span> <span class="coMULTI">/* Puerto &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; */</span><br />
&nbsp; &nbsp;<span class="kw4">struct</span> in_addr sin_addr<span class="sy0">;</span> &nbsp; &nbsp; <span class="coMULTI">/* Dirección de Internet &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp;<span class="kw4">unsigned</span> <span class="kw4">char</span> sin_zero<span class="br0">&#91;</span><span class="nu0">8</span><span class="br0">&#93;</span><span class="sy0">;</span> &nbsp; <span class="coMULTI">/* Del mismo tamaño que struct sockaddr */</span> <br />
<span class="br0">&#125;</span><span class="sy0">;</span></div></td></tr></tbody></table></div>
<p>(struct in_addr)</p>
<div class="codecolorer-container c " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="c codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw4">struct</span> in_addr <br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp;<span class="kw4">unsigned</span> &nbsp; <span class="kw4">long</span> s_addr<span class="sy0">;</span><br />
<span class="br0">&#125;</span><span class="sy0">;</span></div></td></tr></tbody></table></div>
<p>Bien, en el programa anterior, la línea más <em>conflictiva</em> es:</p>
<div class="codecolorer-container c " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br /></div></td><td><div class="c codecolorer" style="font-family:Monaco,Lucida Console,monospace"><a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;IP de eth0: %s<span class="es1">\n</span>&quot;</span><span class="sy0">,</span> inet_ntoa<span class="br0">&#40;</span> <span class="br0">&#40;</span><span class="sy0">*</span><span class="br0">&#40;</span><span class="kw4">struct</span> in_addr <span class="sy0">*</span><span class="br0">&#41;</span> <span class="sy0">&amp;</span>ifr.<span class="me1">ifr_addr</span>.<span class="me1">sa_data</span><span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></td></tr></tbody></table></div>
<p>En ella, sacaremos la dirección en forma de <em>struct in_addr</em> que es el que le gusta a inet_ntoa() (esta función sólo coge la dirección y la pone en forma de char* para que podamos entenderla.<br />
Para llegar al struct in_addr, partimos de la estructura struct ifreq (variable ifr) que nos devuelve ioctl(), ésta tiene un campo llamado ifr_addr de tipo <em>struct sockaddr</em>. El tipo struct sockaddr y struct sockaddr_in podemos compararlos, es decir, podemos ponerlos uno encima de otro y pueden tener la misma información en el mismo byte, por tanto, podemos ver que el campo sa_data de un struct sockaddr coincide con sin_port, sin_addr y sin_zero de un struct sockaddr in; vemos que sin_port es de tipo unsigned short por tanto ocupará 2 bytes y como queremos la información encerrada en sa_data a partir del byte 2, de ahí viene dicho número. Si queremos ponerlo de otra forma, ésta podría ser:</p>
<div class="codecolorer-container c " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br /></div></td><td><div class="c codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw4">struct</span> sockaddr_in sain<span class="sy0">;</span><br />
&nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;IP de eth0: %s<span class="es1">\n</span>&quot;</span><span class="sy0">,</span> inet_ntoa<span class="br0">&#40;</span> <span class="br0">&#40;</span><span class="sy0">*</span><span class="br0">&#40;</span><span class="kw4">struct</span> in_addr <span class="sy0">*</span><span class="br0">&#41;</span> <span class="sy0">&amp;</span>ifr.<span class="me1">ifr_addr</span>.<span class="me1">sa_data</span><span class="br0">&#91;</span><span class="kw4">sizeof</span><span class="br0">&#40;</span>sain.<span class="me1">sin_port</span><span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></td></tr></tbody></table></div>
<div id="facebook_like"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F04%2Fhallar-la-ip-de-un-dispositivo-en-c%2F&amp;layout=standard&amp;show_faces=true&amp;width=500&amp;action=like&amp;font=segoe+ui&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:500px; height:80px;" allowTransparency="true"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://totaki.com/poesiabinaria/2012/04/hallar-la-ip-de-un-dispositivo-en-c/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Linux on Movies: KDE en Miénteme</title>
		<link>http://totaki.com/poesiabinaria/2012/04/linux-on-movies-kde-en-mienteme/</link>
		<comments>http://totaki.com/poesiabinaria/2012/04/linux-on-movies-kde-en-mienteme/#comments</comments>
		<pubDate>Thu, 12 Apr 2012 08:43:58 +0000</pubDate>
		<dc:creator>Gaspar Fernández</dc:creator>
		
		<category><![CDATA[Linux On Movies/TV]]></category>

		<category><![CDATA[correo]]></category>

		<category><![CDATA[kde]]></category>

		<category><![CDATA[kmail]]></category>

		<category><![CDATA[lie to me]]></category>

		<category><![CDATA[lista]]></category>

		<category><![CDATA[mienteme]]></category>

		<category><![CDATA[plasma]]></category>

		<guid isPermaLink="false">http://totaki.com/poesiabinaria/?p=1604</guid>
		<description><![CDATA[
			
				
			
		
Una serie donde analizan micro-expresiones faciales y corporales para pillar a los malos. Miénteme. Analizan al milímetro los gestos de la gente y por supuesto, leen su correo en Kmail, aunque, como tapadera (ya que son todos unos expertos informáticos) reciben los e-mails a través de la lista de correo KDE-Plasma:

En el minuto 9:15 del [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F04%2Flinux-on-movies-kde-en-mienteme%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F04%2Flinux-on-movies-kde-en-mienteme%2F&amp;style=normal&amp;service=is.gd&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Una serie donde analizan micro-expresiones faciales y corporales para pillar a los malos. <a href="http://www.imdb.com/title/tt1235099/" class="extlink" target="_blank">Miénteme</a>. Analizan al milímetro los gestos de la gente y por supuesto, leen su correo en Kmail, aunque, como tapadera (ya que son todos unos expertos informáticos) reciben los e-mails a través de la lista de correo KDE-Plasma:<br />
<a href="http://totaki.com/poesiabinaria/wp-content/uploads/2012/03/kde_mienteme.jpeg"><img src="http://totaki.com/poesiabinaria/wp-content/uploads/2012/03/kde_mienteme-300x172.jpg" alt="kde_mienteme" title="kde_mienteme" width="300" height="172" class="aligncenter size-medium wp-image-1605" /></a><br />
En el minuto 9:15 del capítulo 9 de la segunda temporada podemos ver este pantallazo durante un momento</p>
<div id="facebook_like"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F04%2Flinux-on-movies-kde-en-mienteme%2F&amp;layout=standard&amp;show_faces=true&amp;width=500&amp;action=like&amp;font=segoe+ui&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:500px; height:80px;" allowTransparency="true"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://totaki.com/poesiabinaria/2012/04/linux-on-movies-kde-en-mienteme/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Algoritmos: generar números aleatorios para la lotería</title>
		<link>http://totaki.com/poesiabinaria/2012/04/algoritmos-generar-numeros-aleatorios-para-la-loteria/</link>
		<comments>http://totaki.com/poesiabinaria/2012/04/algoritmos-generar-numeros-aleatorios-para-la-loteria/#comments</comments>
		<pubDate>Mon, 09 Apr 2012 08:59:07 +0000</pubDate>
		<dc:creator>Gaspar Fernández</dc:creator>
		
		<category><![CDATA[C/C++]]></category>

		<category><![CDATA[Clases particulares]]></category>

		<category><![CDATA[algoritmos]]></category>

		<category><![CDATA[aleatorios]]></category>

		<category><![CDATA[array]]></category>

		<category><![CDATA[comparación]]></category>

		<category><![CDATA[loteria]]></category>

		<category><![CDATA[numeros]]></category>

		<category><![CDATA[rand]]></category>

		<category><![CDATA[semilla]]></category>

		<category><![CDATA[srand]]></category>

		<category><![CDATA[time]]></category>

		<guid isPermaLink="false">http://totaki.com/poesiabinaria/?p=1594</guid>
		<description><![CDATA[
			
				
			
		
Es un ejemplo típico y  nos muestra el uso de rand() con arrays para generar varios números aleatorios y no repetidos.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071/**
*************************************************************
* @file loteria.c
* @brief Saca números aleatorios para la lotería
* Basado en el sorteo de la primitiva, hay que sacar 7 números
* del 1 al 49, sin repetir
*
* @author Gaspar Fernández &#60;blakeyed@totaki.com&#62;
* http://totaki.com/poesiabinaria/algoritmos/
*************************************************************/

#include &#60;stdlib.h&#62;
#include [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F04%2Falgoritmos-generar-numeros-aleatorios-para-la-loteria%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F04%2Falgoritmos-generar-numeros-aleatorios-para-la-loteria%2F&amp;style=normal&amp;service=is.gd&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Es un ejemplo típico y  nos muestra el uso de rand() con arrays para generar varios números aleatorios y no repetidos.</p>
<div class="codecolorer-container c " style="overflow:auto;white-space:nowrap;width:580px;height:300px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br /></div></td><td><div class="c codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="coMULTI">/**<br />
*************************************************************<br />
* @file loteria.c<br />
* @brief Saca números aleatorios para la lotería<br />
* Basado en el sorteo de la primitiva, hay que sacar 7 números<br />
* del 1 al 49, sin repetir<br />
*<br />
* @author Gaspar Fernández &lt;blakeyed@totaki.com&gt;<br />
* http://totaki.com/poesiabinaria/algoritmos/<br />
*************************************************************/</span><br />
<br />
<span class="co2">#include &lt;stdlib.h&gt;</span><br />
<span class="co2">#include &lt;stdio.h&gt;</span><br />
<span class="co2">#include &lt;time.h&gt; &nbsp; &nbsp; &nbsp; /* para time() */</span><br />
<br />
<br />
<span class="kw4">int</span> numero_aleatorio<span class="br0">&#40;</span><span class="kw4">int</span> desde<span class="sy0">,</span> <span class="kw4">int</span> hasta<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">return</span> desde<span class="sy0">+</span>rand<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">%</span><span class="br0">&#40;</span>hasta<span class="sy0">-</span>desde<span class="sy0">+</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="kw4">short</span> numero_repetido<span class="br0">&#40;</span><span class="kw4">int</span> numeros<span class="br0">&#91;</span><span class="nu0">7</span><span class="br0">&#93;</span><span class="sy0">,</span> <span class="kw4">int</span> n<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw4">int</span> i<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span><br />
<br />
&nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>i<span class="sy0">&lt;</span>n<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="coMULTI">/* Si un número sacado anteriormente es igual al número<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;en la posición n, decidido, está repetido. */</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>numeros<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="sy0">==</span>numeros<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">1</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; i<span class="sy0">++;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; <span class="coMULTI">/* Si llegamos hasta aquí, el número no se ha repetido */</span><br />
&nbsp; <span class="kw1">return</span> <span class="nu0">0</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="kw4">void</span> numeros_loteria<span class="br0">&#40;</span><span class="kw4">int</span> numeros<span class="br0">&#91;</span><span class="nu0">7</span><span class="br0">&#93;</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw4">int</span> i<span class="sy0">;</span><br />
<br />
&nbsp; <span class="coMULTI">/* El primer número lo generamos, este no se repetirá con nadie <br />
&nbsp; &nbsp; &nbsp;anterior */</span><br />
&nbsp; numeros<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">=</span>numero_aleatorio<span class="br0">&#40;</span><span class="nu0">1</span><span class="sy0">,</span> <span class="nu0">49</span><span class="br0">&#41;</span><span class="sy0">;</span> <br />
<br />
&nbsp; <span class="coMULTI">/* A partir del segundo número tenemos que verificar que no se<br />
&nbsp; &nbsp; &nbsp;repite. */</span><br />
&nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>i<span class="sy0">=</span><span class="nu0">1</span><span class="sy0">;</span> i<span class="sy0">&lt;</span><span class="nu0">7</span><span class="sy0">;</span> i<span class="sy0">++</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">do</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="coMULTI">/* Generamos un número */</span><br />
&nbsp; &nbsp; &nbsp; numeros<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="sy0">=</span>numero_aleatorio<span class="br0">&#40;</span><span class="nu0">1</span><span class="sy0">,</span><span class="nu0">49</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="coMULTI">/* Si el número está repetido, volvemos a generar */</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">while</span> <span class="br0">&#40;</span>numero_repetido<span class="br0">&#40;</span>numeros<span class="sy0">,</span> i<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="kw4">int</span> main<span class="br0">&#40;</span><span class="kw4">int</span> argc<span class="sy0">,</span> <span class="kw4">char</span> <span class="sy0">*</span>argv<span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw4">int</span> numeros_premiados<span class="br0">&#91;</span><span class="nu0">7</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; <span class="kw4">int</span> i<span class="sy0">;</span><br />
&nbsp; srand<span class="br0">&#40;</span>time<span class="br0">&#40;</span><span class="kw2">NULL</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/* Una nueva semilla de números aleatorios */</span><br />
<br />
&nbsp; numeros_loteria<span class="br0">&#40;</span>numeros_premiados<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>i<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span> i<span class="sy0">&lt;</span><span class="nu0">7</span><span class="sy0">;</span> i<span class="sy0">++</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a> <span class="br0">&#40;</span><span class="st0">&quot;Numero %d -&gt; %d<span class="es1">\n</span>&quot;</span><span class="sy0">,</span> i<span class="sy0">+</span><span class="nu0">1</span><span class="sy0">,</span> numeros_premiados<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <br />
&nbsp; <span class="kw1">return</span> EXIT_SUCCESS<span class="sy0">;</span><br />
<span class="br0">&#125;</span></div></td></tr></tbody></table></div>
<p>Descargar: <a href='http://totaki.com/poesiabinaria/wp-content/uploads/2012/03/loteria.c'>loteria.c</a> (1.6Kb)</p>
<p>En este ejemplo vamos guardando todos los números en un array y vamos comparando los nuevos números que vamos generando con los antiguos.</p>
<div id="facebook_like"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F04%2Falgoritmos-generar-numeros-aleatorios-para-la-loteria%2F&amp;layout=standard&amp;show_faces=true&amp;width=500&amp;action=like&amp;font=segoe+ui&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:500px; height:80px;" allowTransparency="true"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://totaki.com/poesiabinaria/2012/04/algoritmos-generar-numeros-aleatorios-para-la-loteria/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Linux on Movies: Person of Interest usa GNOME</title>
		<link>http://totaki.com/poesiabinaria/2012/04/linux-on-movies-person-of-interest-usa-gnome/</link>
		<comments>http://totaki.com/poesiabinaria/2012/04/linux-on-movies-person-of-interest-usa-gnome/#comments</comments>
		<pubDate>Thu, 05 Apr 2012 08:38:58 +0000</pubDate>
		<dc:creator>Gaspar Fernández</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[Linux On Movies/TV]]></category>

		<category><![CDATA[caviezel]]></category>

		<category><![CDATA[emerson]]></category>

		<category><![CDATA[gnome]]></category>

		<category><![CDATA[interest]]></category>

		<category><![CDATA[person]]></category>

		<guid isPermaLink="false">http://totaki.com/poesiabinaria/?p=1597</guid>
		<description><![CDATA[
			
				
			
		
En esta serie, Person of Interest (Vigilados en español) protagonizada por Jim Caviezel y Michael Emerson, salen escritorios Gnome 2 por todas partes, con diferentes temas.
Aunque no se termina de ver claro, hay algunas veces que se perfila algo, es un escritorio muy personalizado que siempre tiene textos de terminal o en hexadecimal en movimiento [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F04%2Flinux-on-movies-person-of-interest-usa-gnome%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F04%2Flinux-on-movies-person-of-interest-usa-gnome%2F&amp;style=normal&amp;service=is.gd&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>En esta serie, <a href="http://www.imdb.com/title/tt1839578/" class="extlink" target="_blank">Person of Interest</a> (Vigilados en español) protagonizada por Jim Caviezel y Michael Emerson, salen escritorios Gnome 2 por todas partes, con diferentes temas.</p>
<p>Aunque no se termina de ver claro, hay algunas veces que se perfila algo, es un escritorio muy personalizado que siempre tiene textos de terminal o en hexadecimal en movimiento (porque los mejores informáticos lo hacen así)&#8230; pero en la barra inferior, tiene un texto &#8220;Applications&#8221;, &#8220;Places&#8221;, &#8220;System&#8221;, os suena&#8230; porque a mi me recuerda horrores a GNOME 2.</p>
<p>No dejo momentos concretos porque desde el primer capítulo se puede ver un escritorio así en el ordenador de uno de los protagonistas y escritorios parecidos en otros ordenadores que van apareciendo.</p>
<p><a href="http://totaki.com/poesiabinaria/wp-content/uploads/2012/03/point_gnome.jpeg"><img src="http://totaki.com/poesiabinaria/wp-content/uploads/2012/03/point_gnome-300x229.jpg" alt="point_gnome" title="point_gnome" width="300" height="229" class="aligncenter size-medium wp-image-1598" /></a><br />
Por ejemplo esto es del episodio 9 de la primera temporada. Minuto 11:56 y esto del 31:28 (no hagáis mucho caso a las direcciones IP, porque parece que ese tema lo llevan un poco mal)<br />
<a href="http://totaki.com/poesiabinaria/wp-content/uploads/2012/03/point_gnome2.jpeg"><img src="http://totaki.com/poesiabinaria/wp-content/uploads/2012/03/point_gnome2-300x168.jpg" alt="point_gnome2" title="point_gnome2" width="300" height="168" class="aligncenter size-medium wp-image-1599" /></a></p>
<p>Y este pantallazo del capítulo 13 de la primera temporada. Minuto 30:15 (aunque salen pantallas parecidas varias veces) me recuerda a Unity:<br />
<a href="http://totaki.com/poesiabinaria/wp-content/uploads/2012/04/point_unity.jpeg"><img src="http://totaki.com/poesiabinaria/wp-content/uploads/2012/04/point_unity-300x167.jpg" alt="point_unity" title="point_unity" width="300" height="167" class="aligncenter size-medium wp-image-1611" /></a></p>
<div id="facebook_like"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F04%2Flinux-on-movies-person-of-interest-usa-gnome%2F&amp;layout=standard&amp;show_faces=true&amp;width=500&amp;action=like&amp;font=segoe+ui&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:500px; height:80px;" allowTransparency="true"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://totaki.com/poesiabinaria/2012/04/linux-on-movies-person-of-interest-usa-gnome/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Algoritmos: Validar un DNI en C</title>
		<link>http://totaki.com/poesiabinaria/2012/04/algoritmos-validar-un-dni-en-c/</link>
		<comments>http://totaki.com/poesiabinaria/2012/04/algoritmos-validar-un-dni-en-c/#comments</comments>
		<pubDate>Wed, 04 Apr 2012 08:50:07 +0000</pubDate>
		<dc:creator>Gaspar Fernández</dc:creator>
		
		<category><![CDATA[C/C++]]></category>

		<category><![CDATA[Clases particulares]]></category>

		<category><![CDATA[algoritmos]]></category>

		<category><![CDATA[division]]></category>

		<category><![CDATA[dni]]></category>

		<category><![CDATA[documento]]></category>

		<category><![CDATA[España]]></category>

		<category><![CDATA[identidad]]></category>

		<category><![CDATA[nacional]]></category>

		<category><![CDATA[numero]]></category>

		<category><![CDATA[verificar]]></category>

		<guid isPermaLink="false">http://totaki.com/poesiabinaria/?p=1577</guid>
		<description><![CDATA[
			
				
			
		
En España, para identificar de forma única a cada ciudadano se utiliza el número del Documento Nacional de Identidad (DNI). Como es costumbre, en muchos datos numéricos, como este, un número de cuenta corriente, códigos ISBN, etc existe un algoritmo de verificación que comprueba que el número es válido. En este caso, la comprobación se [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F04%2Falgoritmos-validar-un-dni-en-c%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F04%2Falgoritmos-validar-un-dni-en-c%2F&amp;style=normal&amp;service=is.gd&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>En España, para identificar de forma única a cada ciudadano se utiliza el número del Documento Nacional de Identidad (DNI). Como es costumbre, en muchos datos numéricos, como este, un número de cuenta corriente, códigos ISBN, etc existe un algoritmo de verificación que comprueba que el número es válido. En este caso, la comprobación se realiza con la letra que acompaña el número.</p>
<p>El algoritmo es sencillo, puede que a la hora de implementarlo no nos acordemos del orden de las letras (para eso lo pongo, y podemos hacer Copia y Pega rápidamente).</p>
<p>Tal vez si estás empezando con la programación y no domines el uso de Arrays te resulte algo complicado, pero es un buen momento para empezar a programar Arrays, te ayudarán mucho y te ahorrarán en casos como este muchísimo código.</p>
<p>Presento primero una función que genera la letra del DNI a partir del número:</p>
<div class="codecolorer-container c " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td><div class="c codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw4">char</span> letraDNI<span class="br0">&#40;</span><span class="kw4">int</span> dni<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw4">char</span> letra<span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;TRWAGMYFPDXBNJZSQVHLCKE&quot;</span><span class="sy0">;</span><br />
<br />
&nbsp; <span class="kw1">return</span> letra<span class="br0">&#91;</span>dni<span class="sy0">%</span><span class="nu19">23</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span></div></td></tr></tbody></table></div>
<p>En definitiva, necesitamos averiguar el resto de el número del DNI entre 23 (lo cual nos dará una cifra entre 0 y 22), cada cifra corresponderá con una letra: el 0 con la T, el 1 con la R, el 2 con la W&#8230;</p>
<p>Podemos utilizar esta función, no para generar, sino para validar un DNI almacenado en una cadena de caracteres:</p>
<div class="codecolorer-container c " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td><div class="c codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw4">short</span> verificaDNI<span class="br0">&#40;</span><span class="kw4">char</span> <span class="sy0">*</span>dni<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>strlen<span class="br0">&#40;</span>dni<span class="br0">&#41;</span><span class="sy0">!=</span><span class="nu0">9</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; <span class="kw1">else</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="br0">&#40;</span>letraDNI<span class="br0">&#40;</span>atoi<span class="br0">&#40;</span>dni<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">==</span>dni<span class="br0">&#91;</span><span class="nu0">8</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span></div></td></tr></tbody></table></div>
<p>En ella, convertimos el número a entero (después de verificar que hay 9 caracteres), y se lo pasamos a letraDNI() para que genere una letra, luego comparamos la letra generada con la letra introducida por el usuario.</p>
<p>Aquí vemos el código completo:</p>
<div class="codecolorer-container c " style="overflow:auto;white-space:nowrap;width:580px;height:300px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br /></div></td><td><div class="c codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="coMULTI">/**<br />
*************************************************************<br />
* @file dni.c<br />
* @brief Comprueba la letra del DNI (España)<br />
*<br />
* @author Gaspar Fernández &lt;blakeyed@totaki.com&gt;<br />
* http://totaki.com/poesiabinaria/algoritmos/<br />
*************************************************************/</span><br />
<br />
<span class="co2">#include &lt;stdlib.h&gt;</span><br />
<span class="co2">#include &lt;stdio.h&gt;</span><br />
<span class="co2">#include &lt;string.h&gt;</span><br />
<br />
<span class="kw4">char</span> letraDNI<span class="br0">&#40;</span><span class="kw4">int</span> dni<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw4">char</span> letra<span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st0">&quot;TRWAGMYFPDXBNJZSQVHLCKE&quot;</span><span class="sy0">;</span><br />
<br />
&nbsp; <span class="kw1">return</span> letra<span class="br0">&#91;</span>dni<span class="sy0">%</span><span class="nu19">23</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="kw4">short</span> verificaDNI<span class="br0">&#40;</span><span class="kw4">char</span> <span class="sy0">*</span>dni<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>strlen<span class="br0">&#40;</span>dni<span class="br0">&#41;</span><span class="sy0">!=</span><span class="nu0">9</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; <span class="kw1">else</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="br0">&#40;</span>letraDNI<span class="br0">&#40;</span>atoi<span class="br0">&#40;</span>dni<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">==</span>dni<span class="br0">&#91;</span><span class="nu0">8</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="kw4">int</span> main<span class="br0">&#40;</span><span class="kw4">int</span> argc<span class="sy0">,</span> <span class="kw4">char</span> <span class="sy0">*</span>argv<span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw4">char</span> dni<span class="br0">&#91;</span><span class="nu0">20</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; <br />
&nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a> <span class="br0">&#40;</span><span class="st0">&quot;Introduce tu DNI con letra (sin espacios): &quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; scanf<span class="br0">&#40;</span><span class="st0">&quot;%s&quot;</span><span class="sy0">,</span> dni<span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>verificaDNI<span class="br0">&#40;</span>dni<span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a> <span class="br0">&#40;</span><span class="st0">&quot;El DNI es correcto<span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="kw1">else</span><br />
&nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a> <span class="br0">&#40;</span><span class="st0">&quot;El DNI no es correcto<span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; <span class="kw1">return</span> EXIT_SUCCESS<span class="sy0">;</span><br />
<span class="br0">&#125;</span></div></td></tr></tbody></table></div>
<p>Descargar: <a href='http://totaki.com/poesiabinaria/wp-content/uploads/2012/03/dni.c'>dni.c</a> (838bytes)</p>
<div id="facebook_like"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F04%2Falgoritmos-validar-un-dni-en-c%2F&amp;layout=standard&amp;show_faces=true&amp;width=500&amp;action=like&amp;font=segoe+ui&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:500px; height:80px;" allowTransparency="true"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://totaki.com/poesiabinaria/2012/04/algoritmos-validar-un-dni-en-c/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Redimensionar ventanas con Alt+Botón derecho en GNOME 2</title>
		<link>http://totaki.com/poesiabinaria/2012/04/redimensionar-ventanas-con-altboton-derecho-en-gnome-2/</link>
		<comments>http://totaki.com/poesiabinaria/2012/04/redimensionar-ventanas-con-altboton-derecho-en-gnome-2/#comments</comments>
		<pubDate>Mon, 02 Apr 2012 09:25:10 +0000</pubDate>
		<dc:creator>Gaspar Fernández</dc:creator>
		
		<category><![CDATA[Linux]]></category>

		<category><![CDATA[alt]]></category>

		<category><![CDATA[botón]]></category>

		<category><![CDATA[central]]></category>

		<category><![CDATA[derecho]]></category>

		<category><![CDATA[gnome]]></category>

		<category><![CDATA[izquierdo]]></category>

		<category><![CDATA[raton]]></category>

		<category><![CDATA[redimensión]]></category>

		<guid isPermaLink="false">http://totaki.com/poesiabinaria/?p=1609</guid>
		<description><![CDATA[
			
				
			
		
Aunque GNOME2 ya está algo antiguo, aún lo uso en algún equipo viejo, y una cosa que yo utilizo muy a menudo es la redimensión de ventanas con Alt+Botón derecho del ratón (para mover también es muy rápido Alt+Botón izquierdo), aunque GNOME 2 trae por defecto la redimensión con Alt+Botón central lo que no me [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F04%2Fredimensionar-ventanas-con-altboton-derecho-en-gnome-2%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F04%2Fredimensionar-ventanas-con-altboton-derecho-en-gnome-2%2F&amp;style=normal&amp;service=is.gd&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Aunque GNOME2 ya está algo antiguo, aún lo uso en algún equipo viejo, y una cosa que yo utilizo muy a menudo es la redimensión de ventanas con Alt+Botón derecho del ratón (para mover también es muy rápido Alt+Botón izquierdo), aunque GNOME 2 trae por defecto la redimensión con Alt+Botón central lo que no me resulta muy cómodo a veces (sobre todo en portátiles cuando no hay botón central).</p>
<p>Para ello, aunque se puede hacer de forma gráfica, a veces es mejor un copia y pega de consola:</p>
<blockquote><p>$ gconftool-2 &#8211;set /apps/metacity/general/resize_with_right_button &#8211;type=bool True</p></blockquote>
<div id="facebook_like"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F04%2Fredimensionar-ventanas-con-altboton-derecho-en-gnome-2%2F&amp;layout=standard&amp;show_faces=true&amp;width=500&amp;action=like&amp;font=segoe+ui&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:500px; height:80px;" allowTransparency="true"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://totaki.com/poesiabinaria/2012/04/redimensionar-ventanas-con-altboton-derecho-en-gnome-2/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Algoritmos: Probar la existencia de un fichero con open() en C</title>
		<link>http://totaki.com/poesiabinaria/2012/03/algoritmos-probar-la-existencia-de-un-fichero-con-open-en-c/</link>
		<comments>http://totaki.com/poesiabinaria/2012/03/algoritmos-probar-la-existencia-de-un-fichero-con-open-en-c/#comments</comments>
		<pubDate>Sat, 31 Mar 2012 08:22:56 +0000</pubDate>
		<dc:creator>Gaspar Fernández</dc:creator>
		
		<category><![CDATA[C/C++]]></category>

		<category><![CDATA[Clases particulares]]></category>

		<category><![CDATA[algoritmos]]></category>

		<category><![CDATA[close]]></category>

		<category><![CDATA[enoent]]></category>

		<category><![CDATA[enofile]]></category>

		<category><![CDATA[exist]]></category>

		<category><![CDATA[file]]></category>

		<category><![CDATA[Linux]]></category>

		<category><![CDATA[llamada]]></category>

		<category><![CDATA[open]]></category>

		<category><![CDATA[rdonly]]></category>

		<category><![CDATA[sistema]]></category>

		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://totaki.com/poesiabinaria/?p=1591</guid>
		<description><![CDATA[
			
				
			
		
Estos días a varios de mis alumnos les ha surgido la necesidad de probar la existencia de un archivo haciendo la llamada al sistema open(). Es bastante sencillo, sólo hay que probar si éste se ha podido abrir (como lectura, por ejemplo, para no tocar el fichero en la medida de lo posible).
Una vez se [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F03%2Falgoritmos-probar-la-existencia-de-un-fichero-con-open-en-c%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F03%2Falgoritmos-probar-la-existencia-de-un-fichero-con-open-en-c%2F&amp;style=normal&amp;service=is.gd&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Estos días a varios de mis alumnos les ha surgido la necesidad de probar la existencia de un archivo haciendo la llamada al sistema <strong>open()</strong>. Es bastante sencillo, sólo hay que probar si éste se ha podido abrir (como lectura, por ejemplo, para no tocar el fichero en la medida de lo posible).<br />
Una vez se abre el fichero pueden ocurrir varias cosas:</p>
<ul>
<li>que la llamada a open() no devuelva error. Por tanto el fichero existe</li>
<li>que la llamada a open() de error:
<ul>
<li>si el resultado de errno es ENOENT (constante de error), ENOFILE en algunos sistemas o 2 (valor que generalmente vale dicha constante), el fichero no existe</li>
<li>si el resultado de errno es distinto, no podemos asegurar que no exista, pero tal vez el nombre de fichero no sea correcto, la ruta no exista, o no tengamos acceso a él.</li>
</ul>
</li>
</ul>
<p>Para contemplar estos casos creamos la función exists(). Incluyo la función y el código de ejemplo:</p>
<div class="codecolorer-container c " style="overflow:auto;white-space:nowrap;width:580px;height:300px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br /></div></td><td><div class="c codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="coMULTI">/**<br />
*************************************************************<br />
* @file exists.c<br />
* @brief Verifica la existencia o no de un fichero<br />
*<br />
* @author Gaspar Fernández &lt;blakeyed@totaki.com&gt;<br />
* http://totaki.com/poesiabinaria/algoritmos/<br />
*************************************************************/</span><br />
<br />
<span class="co2">#include &lt;stdlib.h&gt;</span><br />
<span class="co2">#include &lt;stdio.h&gt;</span><br />
<span class="co2">#include &lt;string.h&gt;</span><br />
<span class="co2">#include &lt;unistd.h&gt;</span><br />
<span class="co2">#include &lt;sys/types.h&gt;</span><br />
<span class="co2">#include &lt;sys/stat.h&gt;</span><br />
<span class="co2">#include &lt;fcntl.h&gt;</span><br />
<span class="co2">#include &lt;errno.h&gt;</span><br />
<br />
<span class="kw4">short</span> exists<span class="br0">&#40;</span><span class="kw4">char</span> <span class="sy0">*</span>fname<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw4">int</span> fd<span class="sy0">=</span>open<span class="br0">&#40;</span>fname<span class="sy0">,</span> O_RDONLY<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>fd<span class="sy0">&lt;</span><span class="nu0">0</span><span class="br0">&#41;</span> &nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/* error */</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="br0">&#40;</span>errno<span class="sy0">==</span>ENOENT<span class="br0">&#41;</span><span class="sy0">?-</span><span class="nu0">1</span><span class="sy0">:-</span><span class="nu0">2</span><span class="sy0">;</span><br />
&nbsp; <span class="coMULTI">/* Si no hemos salido ya, cerramos */</span><br />
&nbsp; close<span class="br0">&#40;</span>fd<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="kw1">return</span> <span class="nu0">0</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="kw4">int</span> main<span class="br0">&#40;</span><span class="kw4">int</span> argc<span class="sy0">,</span> <span class="kw4">char</span> <span class="sy0">*</span>argv<span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw4">int</span> abre<span class="sy0">=</span>exists<span class="br0">&#40;</span><span class="st0">&quot;archivo&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="kw1">switch</span> <span class="br0">&#40;</span>abre<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">case</span> <span class="nu0">0</span><span class="sy0">:</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a> <span class="br0">&#40;</span><span class="st0">&quot;El archivo existe<span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="kw2">break</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">case</span> <span class="sy0">-</span><span class="nu0">1</span><span class="sy0">:</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a> <span class="br0">&#40;</span><span class="st0">&quot;El archivo no existe<span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="kw2">break</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">case</span> <span class="sy0">-</span><span class="nu0">2</span><span class="sy0">:</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a> <span class="br0">&#40;</span><span class="st0">&quot;Ocurrió un error al abrir. %d (%s)<span class="es1">\n</span>&quot;</span><span class="sy0">,</span> errno<span class="sy0">,</span> strerror<span class="br0">&#40;</span>errno<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="kw2">break</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">default</span><span class="sy0">:</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a> <span class="br0">&#40;</span><span class="st0">&quot;Nunca veremos este mensaje&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; <span class="kw1">return</span> EXIT_SUCCESS<span class="sy0">;</span><br />
<span class="br0">&#125;</span></div></td></tr></tbody></table></div>
<p>Descargar: <a href='http://totaki.com/poesiabinaria/wp-content/uploads/2012/03/exists.c'>exists</a> (1Kb)<br />
Para ejecutarlo podemos probar:</p>
<blockquote><p>
$ ./exists<br />
El archivo no existe<br />
$ touch archivo<br />
$ ./exists<br />
El archivo existe<br />
$ chmod -r archivo        # Eliminamos permiso de lectura al fichero<br />
$ ./exists<br />
Ocurrió un error al abrir. 13 (Permission denied)
</p></blockquote>
<p>Puede que también seas de los que piensan que si hay algún error al abrir el archivo, da igual, lo marcamos como no existente, de todas formas no podemos hacer nada con él. Así, construimos una función exists() más intuitiva que devuelve 1 cuando existe y 0 cuando no existe o hay error:</p>
<div class="codecolorer-container c " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td><div class="c codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw4">short</span> exists<span class="br0">&#40;</span><span class="kw4">char</span> <span class="sy0">*</span>fname<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw4">int</span> fd<span class="sy0">=</span>open<span class="br0">&#40;</span>fname<span class="sy0">,</span> O_RDONLY<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>fd<span class="sy0">&lt;</span><span class="nu0">0</span><span class="br0">&#41;</span> &nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/* error */</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; <span class="coMULTI">/* Si no hemos salido ya, cerramos */</span><br />
&nbsp; close<span class="br0">&#40;</span>fd<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="kw1">return</span> <span class="nu0">1</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span></div></td></tr></tbody></table></div>
<div id="facebook_like"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F03%2Falgoritmos-probar-la-existencia-de-un-fichero-con-open-en-c%2F&amp;layout=standard&amp;show_faces=true&amp;width=500&amp;action=like&amp;font=segoe+ui&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:500px; height:80px;" allowTransparency="true"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://totaki.com/poesiabinaria/2012/03/algoritmos-probar-la-existencia-de-un-fichero-con-open-en-c/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Linux On Movies: Linux en TRON Legacy</title>
		<link>http://totaki.com/poesiabinaria/2012/03/linux-on-movies-linux-en-tron-legacy/</link>
		<comments>http://totaki.com/poesiabinaria/2012/03/linux-on-movies-linux-en-tron-legacy/#comments</comments>
		<pubDate>Thu, 29 Mar 2012 17:15:29 +0000</pubDate>
		<dc:creator>Gaspar Fernández</dc:creator>
		
		<category><![CDATA[Linux On Movies/TV]]></category>

		<category><![CDATA[disney]]></category>

		<category><![CDATA[Emacs]]></category>

		<category><![CDATA[gnu]]></category>

		<category><![CDATA[legacy]]></category>

		<category><![CDATA[Linux]]></category>

		<category><![CDATA[película]]></category>

		<category><![CDATA[tron]]></category>

		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://totaki.com/poesiabinaria/?p=1584</guid>
		<description><![CDATA[
			
				
			
		
Hace más de un año que se estrenó la película, pero ahora es cuando decido incluirla aquí, que tengo capturas y tiempos concretos:
En el minuto 11 segundo 25 podemos ver el primer regalo&#8230; GNU/EMACS !!

y para los que no sepan lo que es capaz de hacer Emacs&#8230; ahora lo vemos ejecutando un juego en Emacs [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F03%2Flinux-on-movies-linux-en-tron-legacy%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F03%2Flinux-on-movies-linux-en-tron-legacy%2F&amp;style=normal&amp;service=is.gd&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Hace más de un año que se estrenó la película, pero ahora es cuando decido incluirla aquí, que tengo capturas y tiempos concretos:<br />
En el minuto 11 segundo 25 podemos ver el primer regalo&#8230; GNU/EMACS !!<br />
<a href="http://totaki.com/poesiabinaria/wp-content/uploads/2012/03/tron_emacs.jpeg"><img src="http://totaki.com/poesiabinaria/wp-content/uploads/2012/03/tron_emacs-300x240.jpg" alt="tron_emacs" title="tron_emacs" width="300" height="240" class="aligncenter size-medium wp-image-1586" /></a><br />
y para los que no sepan lo que es capaz de hacer Emacs&#8230; ahora lo vemos ejecutando un juego en Emacs lisp: hanoi-unix:<br />
<a href="http://totaki.com/poesiabinaria/wp-content/uploads/2012/03/tron_emacs2.jpeg"><img src="http://totaki.com/poesiabinaria/wp-content/uploads/2012/03/tron_emacs2-300x240.jpg" alt="tron_emacs2" title="tron_emacs2" width="300" height="240" class="aligncenter size-medium wp-image-1587" /></a><br />
Aunque sólo sale un instante&#8230; igual que sólo sale durante un solo frame&#8230;<br />
<a href="http://totaki.com/poesiabinaria/wp-content/uploads/2012/03/tron_ubuntu.jpeg"><img src="http://totaki.com/poesiabinaria/wp-content/uploads/2012/03/tron_ubuntu-300x240.jpg" alt="tron_ubuntu" title="tron_ubuntu" width="300" height="240" class="aligncenter size-medium wp-image-1588" /></a><br />
¡ Ubuntu !<br />
<a href="http://totaki.com/poesiabinaria/wp-content/uploads/2012/03/tron_unix.jpeg"><img src="http://totaki.com/poesiabinaria/wp-content/uploads/2012/03/tron_unix-300x240.jpg" alt="tron_unix" title="tron_unix" width="300" height="240" class="aligncenter size-medium wp-image-1585" /></a><br />
Luego, alrededor del minuto 21 y durante casi un minuto podemos disfrutar de un sistema Unix con su terminal, y ejecutando comandos existentes, como top, uname, history, whoami, y dentro de history, se ve kill, ps, cat, vi, en fin&#8230; algo que nos suena y no suele salir en una película estadounidense&#8230;</p>
<p>Encontráis más información sobre los guiños a GNU/Linux o Unix en la película en estos enlaces:<br />
<a href="http://guaca.wordpress.com/2011/01/14/tron-legacy-os/" class="extlink" target="_blank">Tron Legacy, ¿qué sistema operativo usaba Flynn?</a><br />
<a href="http://brainstormoverride.wordpress.com/2011/08/06/la-veracidad-unix-de-tron-legacy/" class="extlink" target="_blank">La veracidad UNIX de Tron Legacy</a></p>
<div id="facebook_like"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F03%2Flinux-on-movies-linux-en-tron-legacy%2F&amp;layout=standard&amp;show_faces=true&amp;width=500&amp;action=like&amp;font=segoe+ui&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:500px; height:80px;" allowTransparency="true"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://totaki.com/poesiabinaria/2012/03/linux-on-movies-linux-en-tron-legacy/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Algoritmos: Factorial y cálculo del seno por la serie de MacLaurin (Taylor alrededor de 0) en C</title>
		<link>http://totaki.com/poesiabinaria/2012/03/algoritmos-factorial-y-calculo-del-seno-por-la-serie-de-maclaurin-taylor-alrededor-de-0-en-c/</link>
		<comments>http://totaki.com/poesiabinaria/2012/03/algoritmos-factorial-y-calculo-del-seno-por-la-serie-de-maclaurin-taylor-alrededor-de-0-en-c/#comments</comments>
		<pubDate>Tue, 27 Mar 2012 08:15:05 +0000</pubDate>
		<dc:creator>Gaspar Fernández</dc:creator>
		
		<category><![CDATA[C/C++]]></category>

		<category><![CDATA[Clases particulares]]></category>

		<category><![CDATA[algoritmos]]></category>

		<category><![CDATA[iterativo]]></category>

		<category><![CDATA[maclaurin]]></category>

		<category><![CDATA[seno]]></category>

		<category><![CDATA[taylor]]></category>

		<category><![CDATA[wikipedia]]></category>

		<guid isPermaLink="false">http://totaki.com/poesiabinaria/?p=1580</guid>
		<description><![CDATA[
			
				
			
		
Algo más matemático vuelvo cuando propongo lo siguiente. Vamos a calcular un seno con la serie de MacLaurin. Ésta es la fórmula, extraída de Wikipedia.
Y este el algoritmo en C:
1234567891011121314151617181920212223242526272829303132#define PI 3.141592653588

unsigned factorial&#40;int n&#41;
&#123;
&#160; if &#40;n&#60;1&#41;
&#160; &#160; return 1;
&#160; 
&#160; return n*factorial&#40;n-1&#41;;
&#125;

double senoTaylor&#40;double n&#41;
&#123;
&#160; double t=0;
&#160; int i;

&#160; short signo=&#40;n&#62;=0&#41;;
&#160; n=fabs&#40;n&#41;;&#160; &#160; &#160; &#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F03%2Falgoritmos-factorial-y-calculo-del-seno-por-la-serie-de-maclaurin-taylor-alrededor-de-0-en-c%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F03%2Falgoritmos-factorial-y-calculo-del-seno-por-la-serie-de-maclaurin-taylor-alrededor-de-0-en-c%2F&amp;style=normal&amp;service=is.gd&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Algo más matemático vuelvo cuando propongo lo siguiente. Vamos a calcular un seno con la serie de MacLaurin. <a href="http://es.wikipedia.org/wiki/Serie_de_Taylor#Series_de_Maclaurin_.28Taylor_alrededor_de_0.29_notables"  target="_blank">Ésta es la fórmula</a>, extraída de Wikipedia.<a href="http://totaki.com/poesiabinaria/wp-content/uploads/2012/03/sin_maclaurin.png"><img src="http://totaki.com/poesiabinaria/wp-content/uploads/2012/03/sin_maclaurin.png" alt="sin_maclaurin" title="sin_maclaurin" width="271" height="49" class="aligncenter size-full wp-image-1581" /></a></p>
<p>Y este el algoritmo en C:</p>
<div class="codecolorer-container c " style="overflow:auto;white-space:nowrap;width:580px;height:300px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br /></div></td><td><div class="c codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="co2">#define PI 3.141592653588</span><br />
<br />
<span class="kw4">unsigned</span> factorial<span class="br0">&#40;</span><span class="kw4">int</span> n<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>n<span class="sy0">&lt;</span><span class="nu0">1</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">1</span><span class="sy0">;</span><br />
&nbsp; <br />
&nbsp; <span class="kw1">return</span> n<span class="sy0">*</span>factorial<span class="br0">&#40;</span>n<span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="kw4">double</span> senoTaylor<span class="br0">&#40;</span><span class="kw4">double</span> n<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw4">double</span> t<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; <span class="kw4">int</span> i<span class="sy0">;</span><br />
<br />
&nbsp; <span class="kw4">short</span> signo<span class="sy0">=</span><span class="br0">&#40;</span>n<span class="sy0">&gt;=</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; n<span class="sy0">=</span>fabs<span class="br0">&#40;</span>n<span class="br0">&#41;</span><span class="sy0">;</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/* Calculamos el valor absoluto */</span><br />
<br />
&nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>n<span class="sy0">&gt;</span>PI<span class="br0">&#41;</span>&nbsp; &nbsp; &nbsp; <span class="coMULTI">/* Reducimos el ángulo, de dos en dos cuadrantes*/</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; n<span class="sy0">-=</span>PI<span class="sy0">;</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/* 1 vuelta = 2PI radianes */</span><br />
&nbsp; &nbsp; &nbsp; signo<span class="sy0">=!</span>signo<span class="sy0">;</span> &nbsp; &nbsp; <span class="coMULTI">/* cada PI, el signo cambia */</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>i<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span> i<span class="sy0">&lt;</span><span class="nu0">9</span><span class="sy0">;</span> i<span class="sy0">++</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; t<span class="sy0">+=</span>pow<span class="br0">&#40;</span><span class="sy0">-</span><span class="nu0">1</span><span class="sy0">,</span> i<span class="br0">&#41;</span><span class="sy0">*</span>pow<span class="br0">&#40;</span>n<span class="sy0">,</span> <span class="nu0">2</span><span class="sy0">*</span><span class="br0">&#40;</span><span class="kw4">double</span><span class="br0">&#41;</span>i<span class="sy0">+</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">/</span><span class="br0">&#40;</span><span class="kw4">double</span><span class="br0">&#41;</span>factorial<span class="br0">&#40;</span><span class="nu0">2</span><span class="sy0">*</span>i<span class="sy0">+</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span>signo<span class="br0">&#41;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/* Cambiamos el signo del ángulo */</span><br />
&nbsp; &nbsp; t<span class="sy0">*=-</span><span class="nu0">1</span><span class="sy0">;</span><br />
<br />
&nbsp; <span class="kw1">return</span> t<span class="sy0">;</span><br />
<span class="br0">&#125;</span></div></td></tr></tbody></table></div>
<p>Con este algoritmo, cuantas más iteraciones demos, más preciso será el cálculo, aunque tenemos que tener cuidado de nos desbordar las variables, ya que el crecimiento de la función factorial es bastante rápido.</p>
<p>Es importante lo que hacemos al principio, el ángulo <strong>en radianes</strong> debe ser reducido, nos quedamos con un valor que esté siempre en la mitad superior del eje X (cuadrantes 1 y 2), este algoritmo es mejor con valores pequeños. Sería incluso mejor quedarnos con el ángulo en el primer cuadrante para que mejore la precisión.</p>
<p>Para probar el algoritmo, podemos utilizar este programa, en él utilizamos la función sin() de math.h y la comparamos con esta nueva función (aunque sin es más rápida y mejor, dejamos esta función de Taylor o MacLaurin con fines educativos):</p>
<div class="codecolorer-container c " style="overflow:auto;white-space:nowrap;width:580px;height:300px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br /></div></td><td><div class="c codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="coMULTI">/**<br />
*************************************************************<br />
* @file senoMaclaurin.c<br />
* @brief Cálculo del seno con el algoritmo de MacLaurin<br />
*<br />
* @author Gaspar Fernández &lt;blakeyed@totaki.com&gt;<br />
* http://totaki.com/poesiabinaria/algoritmos/<br />
*<br />
* Compilar con:<br />
* &nbsp; $ gcc -o senoMaclaurin senoMaclaurin.c -lm<br />
* para incluir la biblioteca matemática <br />
*************************************************************/</span><br />
<br />
<span class="co2">#include &lt;stdlib.h&gt;</span><br />
<span class="co2">#include &lt;stdio.h&gt;</span><br />
<span class="co2">#include &lt;math.h&gt;</span><br />
<br />
<span class="co2">#define PI 3.141592653588</span><br />
<br />
<span class="kw4">unsigned</span> factorial<span class="br0">&#40;</span><span class="kw4">int</span> n<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>n<span class="sy0">&lt;</span><span class="nu0">1</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">1</span><span class="sy0">;</span><br />
&nbsp; <br />
&nbsp; <span class="kw1">return</span> n<span class="sy0">*</span>factorial<span class="br0">&#40;</span>n<span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="kw4">double</span> senoTaylor<span class="br0">&#40;</span><span class="kw4">double</span> n<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw4">double</span> t<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; <span class="kw4">int</span> i<span class="sy0">;</span><br />
<br />
&nbsp; <span class="kw4">short</span> signo<span class="sy0">=</span><span class="br0">&#40;</span>n<span class="sy0">&gt;=</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; n<span class="sy0">=</span>fabs<span class="br0">&#40;</span>n<span class="br0">&#41;</span><span class="sy0">;</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/* Calculamos el valor absoluto */</span><br />
<br />
&nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>n<span class="sy0">&gt;</span>PI<span class="br0">&#41;</span>&nbsp; &nbsp; &nbsp; <span class="coMULTI">/* Reducimos el ángulo, de dos en dos cuadrantes*/</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; n<span class="sy0">-=</span>PI<span class="sy0">;</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/* 1 vuelta = 2PI radianes */</span><br />
&nbsp; &nbsp; &nbsp; signo<span class="sy0">=!</span>signo<span class="sy0">;</span> &nbsp; &nbsp; <span class="coMULTI">/* cada PI, el signo cambia */</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>i<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span> i<span class="sy0">&lt;</span><span class="nu0">9</span><span class="sy0">;</span> i<span class="sy0">++</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; t<span class="sy0">+=</span>pow<span class="br0">&#40;</span><span class="sy0">-</span><span class="nu0">1</span><span class="sy0">,</span> i<span class="br0">&#41;</span><span class="sy0">*</span>pow<span class="br0">&#40;</span>n<span class="sy0">,</span> <span class="nu0">2</span><span class="sy0">*</span><span class="br0">&#40;</span><span class="kw4">double</span><span class="br0">&#41;</span>i<span class="sy0">+</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">/</span><span class="br0">&#40;</span><span class="kw4">double</span><span class="br0">&#41;</span>factorial<span class="br0">&#40;</span><span class="nu0">2</span><span class="sy0">*</span>i<span class="sy0">+</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span>signo<span class="br0">&#41;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/* Cambiamos el signo del ángulo */</span><br />
&nbsp; &nbsp; t<span class="sy0">*=-</span><span class="nu0">1</span><span class="sy0">;</span><br />
<br />
&nbsp; <span class="kw1">return</span> t<span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="kw4">int</span> main<span class="br0">&#40;</span><span class="kw4">int</span> argc<span class="sy0">,</span> <span class="kw4">char</span> <span class="sy0">*</span>argv<span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw4">double</span> n<span class="sy0">;</span><br />
&nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a> <span class="br0">&#40;</span><span class="st0">&quot;Introduzca un numero: &quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; scanf <span class="br0">&#40;</span><span class="st0">&quot;%lf&quot;</span><span class="sy0">,</span> <span class="sy0">&amp;</span>n<span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a> <span class="br0">&#40;</span><span class="st0">&quot;sen: %lf<span class="es1">\n</span>&quot;</span><span class="sy0">,</span> sin<span class="br0">&#40;</span>n<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a> <span class="br0">&#40;</span><span class="st0">&quot;sen: %lf<span class="es1">\n</span>&quot;</span><span class="sy0">,</span> senoTaylor<span class="br0">&#40;</span>n<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; <span class="kw1">return</span> EXIT_SUCCESS<span class="sy0">;</span><br />
<span class="br0">&#125;</span></div></td></tr></tbody></table></div>
<p>Importante, para compilar el proyecto, debemos utilizar gcc con el modificador -lm para poder utilizar math.h correctamente.</p>
<p>Descargar: <a href='http://totaki.com/poesiabinaria/wp-content/uploads/2012/03/senomaclaurin.c'>senomaclaurin.c</a> (1.2Kb)</p>
<div id="facebook_like"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F03%2Falgoritmos-factorial-y-calculo-del-seno-por-la-serie-de-maclaurin-taylor-alrededor-de-0-en-c%2F&amp;layout=standard&amp;show_faces=true&amp;width=500&amp;action=like&amp;font=segoe+ui&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:500px; height:80px;" allowTransparency="true"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://totaki.com/poesiabinaria/2012/03/algoritmos-factorial-y-calculo-del-seno-por-la-serie-de-maclaurin-taylor-alrededor-de-0-en-c/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Algoritmos: Año bisiesto y validación de fechas en C</title>
		<link>http://totaki.com/poesiabinaria/2012/03/algoritmos-ano-bisiesto-y-validacion-de-fechas-en-c/</link>
		<comments>http://totaki.com/poesiabinaria/2012/03/algoritmos-ano-bisiesto-y-validacion-de-fechas-en-c/#comments</comments>
		<pubDate>Mon, 26 Mar 2012 08:26:52 +0000</pubDate>
		<dc:creator>Gaspar Fernández</dc:creator>
		
		<category><![CDATA[C/C++]]></category>

		<category><![CDATA[Clases particulares]]></category>

		<category><![CDATA[algoritmos]]></category>

		<category><![CDATA[bisiesto]]></category>

		<category><![CDATA[fecha]]></category>

		<category><![CDATA[validar]]></category>

		<guid isPermaLink="false">http://totaki.com/poesiabinaria/?p=1573</guid>
		<description><![CDATA[
			
				
			
		
Para inaugurar la nueva sección de Algoritmos de este blog, empezaré presentando una función para calcular años bisiestos (lo podemos encontrar en Wikipedia en bastantes más lenguajes, pero, ¿por qué aquí no?
1234function bisiesto&#40;int year&#41;
&#123;
&#160; return &#40;a%4==0&#41; &#38;&#38; &#40; &#40;a%100!=0&#41; &#124;&#124; &#40;a%400==0&#41; &#41;;
&#125;
Es decir, cada 4 años hay un año bisiesto, no cuando el año es [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F03%2Falgoritmos-ano-bisiesto-y-validacion-de-fechas-en-c%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F03%2Falgoritmos-ano-bisiesto-y-validacion-de-fechas-en-c%2F&amp;style=normal&amp;service=is.gd&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Para inaugurar la nueva sección de <a href="http://totaki.com/poesiabinaria/algoritmos/">Algoritmos</a> de este blog, empezaré presentando una función para calcular años bisiestos (lo podemos encontrar en Wikipedia en bastantes más lenguajes, pero, ¿por qué aquí no?</p>
<div class="codecolorer-container c " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="c codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw2">function</span> bisiesto<span class="br0">&#40;</span><span class="kw4">int</span> year<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">return</span> <span class="br0">&#40;</span>a<span class="sy0">%</span><span class="nu19">4</span><span class="sy0">==</span><span class="nu0">0</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="br0">&#40;</span> <span class="br0">&#40;</span>a<span class="sy0">%</span><span class="nu19">100</span><span class="sy0">!=</span><span class="nu0">0</span><span class="br0">&#41;</span> <span class="sy0">||</span> <span class="br0">&#40;</span>a<span class="sy0">%</span><span class="nu19">400</span><span class="sy0">==</span><span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span></div></td></tr></tbody></table></div>
<p>Es decir, cada 4 años hay un año bisiesto, no cuando el año es múltiplo de 100, aunque sí cuando es múltiplo de 400.</p>
<p>Esta función, podemos utilizarla para validar fechas:</p>
<div class="codecolorer-container c " style="overflow:auto;white-space:nowrap;width:580px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br /></div></td><td><div class="c codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="kw4">short</span> valida_fecha<span class="br0">&#40;</span><span class="kw4">short</span> d<span class="sy0">,</span> <span class="kw4">short</span> m<span class="sy0">,</span> <span class="kw4">int</span> a<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw4">short</span> dias_mes<span class="br0">&#91;</span><span class="nu0">12</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="br0">&#123;</span><span class="nu0">31</span><span class="sy0">,</span> <span class="nu0">28</span><span class="sy0">,</span> <span class="nu0">31</span><span class="sy0">,</span> <span class="nu0">30</span><span class="sy0">,</span> <span class="nu0">31</span><span class="sy0">,</span> <span class="nu0">30</span><span class="sy0">,</span> <span class="nu0">31</span><span class="sy0">,</span> <span class="nu0">31</span><span class="sy0">,</span> <span class="nu0">30</span><span class="sy0">,</span> <span class="nu0">31</span><span class="sy0">,</span> <span class="nu0">30</span><span class="sy0">,</span> <span class="nu0">31</span><span class="br0">&#125;</span><span class="sy0">;</span><br />
<br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> <span class="br0">&#40;</span>d<span class="sy0">&lt;=</span><span class="nu0">0</span><span class="br0">&#41;</span> <span class="sy0">||</span> <span class="br0">&#40;</span>m<span class="sy0">&lt;=</span><span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> &nbsp; <span class="coMULTI">/* Si el día, o mes es negativo o cero */</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span><span class="sy0">;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/* la fecha no es válida */</span><br />
<br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> <span class="br0">&#40;</span>m<span class="sy0">!=</span><span class="nu0">2</span><span class="br0">&#41;</span> <span class="sy0">||</span> <span class="br0">&#40;</span><span class="sy0">!</span>bisiesto<span class="br0">&#40;</span>a<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="br0">&#40;</span>d<span class="sy0">&lt;=</span>dias_mes<span class="br0">&#91;</span>m<span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="kw1">else</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="br0">&#40;</span>d<span class="sy0">&lt;=</span>dias_mes<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">+</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span></div></td></tr></tbody></table></div>
<p>Es decir, primero creamos un array con los días que tiene cada mes, para que sea de fácil acceso, si lo prefieres, puede ser un array estático: <em>short dias_mes[12]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};</em><br />
Luego comprobamos si el mes es distinto de 2, o no el año no es bisiesto, en ese caso comparamos con el valor del array (es importante decir que el mes 1 es Enero, pero en nuestro array, Enero será el elemento 0 y por eso restamos 1. Si la condición no se cumple, verificamos que el día es menor o igual que los días de Febrero + 1 (29 días).</p>
<p>En el ejemplo a continuación vemos todo el código:</p>
<div class="codecolorer-container c " style="overflow:auto;white-space:nowrap;width:580px;height:300px"><table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br /></div></td><td><div class="c codecolorer" style="font-family:Monaco,Lucida Console,monospace"><span class="coMULTI">/**<br />
*************************************************************<br />
* @file valida_fechas.c<br />
* @brief Valida una fecha introducida por teclado<br />
*<br />
* @author Gaspar Fernández &lt;blakeyed@totaki.com&gt;<br />
* http://totaki.com/poesiabinaria/algoritmos/<br />
*************************************************************/</span><br />
<br />
<span class="co2">#include &lt;stdlib.h&gt;</span><br />
<span class="co2">#include &lt;stdio.h&gt;</span><br />
<br />
<span class="kw4">short</span> bisiesto <span class="br0">&#40;</span><span class="kw4">int</span> a<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">return</span> <span class="br0">&#40;</span>a<span class="sy0">%</span><span class="nu19">4</span><span class="sy0">==</span><span class="nu0">0</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="br0">&#40;</span> <span class="br0">&#40;</span>a<span class="sy0">%</span><span class="nu19">100</span><span class="sy0">!=</span><span class="nu0">0</span><span class="br0">&#41;</span> <span class="sy0">||</span> <span class="br0">&#40;</span>a<span class="sy0">%</span><span class="nu19">400</span><span class="sy0">==</span><span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="kw4">short</span> valida_fecha<span class="br0">&#40;</span><span class="kw4">short</span> d<span class="sy0">,</span> <span class="kw4">short</span> m<span class="sy0">,</span> <span class="kw4">int</span> a<span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw4">short</span> dias_mes<span class="br0">&#91;</span><span class="nu0">12</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="br0">&#123;</span><span class="nu0">31</span><span class="sy0">,</span> <span class="nu0">28</span><span class="sy0">,</span> <span class="nu0">31</span><span class="sy0">,</span> <span class="nu0">30</span><span class="sy0">,</span> <span class="nu0">31</span><span class="sy0">,</span> <span class="nu0">30</span><span class="sy0">,</span> <span class="nu0">31</span><span class="sy0">,</span> <span class="nu0">31</span><span class="sy0">,</span> <span class="nu0">30</span><span class="sy0">,</span> <span class="nu0">31</span><span class="sy0">,</span> <span class="nu0">30</span><span class="sy0">,</span> <span class="nu0">31</span><span class="br0">&#125;</span><span class="sy0">;</span><br />
<br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> <span class="br0">&#40;</span>d<span class="sy0">&lt;=</span><span class="nu0">0</span><span class="br0">&#41;</span> <span class="sy0">||</span> <span class="br0">&#40;</span>m<span class="sy0">&lt;=</span><span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> &nbsp; <span class="coMULTI">/* Si el día, o mes es negativo o cero */</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span><span class="sy0">;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/* la fecha no es válida */</span><br />
<br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> <span class="br0">&#40;</span>m<span class="sy0">!=</span><span class="nu0">2</span><span class="br0">&#41;</span> <span class="sy0">||</span> <span class="br0">&#40;</span><span class="sy0">!</span>bisiesto<span class="br0">&#40;</span>a<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="br0">&#40;</span>d<span class="sy0">&lt;=</span>dias_mes<span class="br0">&#91;</span>m<span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="kw1">else</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="br0">&#40;</span>d<span class="sy0">&lt;=</span>dias_mes<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">+</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<br />
<span class="kw4">int</span> main<span class="br0">&#40;</span><span class="kw4">int</span> argc<span class="sy0">,</span> <span class="kw4">char</span> <span class="sy0">*</span>argv<span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw4">int</span> a<span class="sy0">,</span>m<span class="sy0">,</span>d<span class="sy0">;</span><br />
<br />
&nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a> <span class="br0">&#40;</span><span class="st0">&quot;Por favor, introduce una fecha (D/M/A)<span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; scanf<span class="br0">&#40;</span><span class="st0">&quot;%d/%d/%d&quot;</span><span class="sy0">,</span> <span class="sy0">&amp;</span>d<span class="sy0">,</span> <span class="sy0">&amp;</span>m<span class="sy0">,</span> <span class="sy0">&amp;</span>a<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <br />
&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>valida_fecha<span class="br0">&#40;</span>d<span class="sy0">,</span> m<span class="sy0">,</span> a<span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a> <span class="br0">&#40;</span><span class="st0">&quot;Fecha válida<span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="kw1">else</span><br />
&nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a> <span class="br0">&#40;</span><span class="st0">&quot;Fecha NO válida<span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; <span class="kw1">return</span> EXIT_SUCCESS<span class="sy0">;</span><br />
<span class="br0">&#125;</span></div></td></tr></tbody></table></div>
<p>Descargar archivo: <a href='http://totaki.com/poesiabinaria/wp-content/uploads/2012/03/fech.c'>valida_fechas.c</a> (1Kb)</p>
<div id="facebook_like"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Ftotaki.com%2Fpoesiabinaria%2F2012%2F03%2Falgoritmos-ano-bisiesto-y-validacion-de-fechas-en-c%2F&amp;layout=standard&amp;show_faces=true&amp;width=500&amp;action=like&amp;font=segoe+ui&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:500px; height:80px;" allowTransparency="true"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://totaki.com/poesiabinaria/2012/03/algoritmos-ano-bisiesto-y-validacion-de-fechas-en-c/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>

