<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2spanishfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Dipler</title>
	
	<link>http://www.dipler.org</link>
	<description>En la variedad está el gusto</description>
	<lastBuildDate>Tue, 07 Sep 2010 20:59:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Bitnbyte" /><feedburner:info uri="bitnbyte" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>Bitnbyte</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://add.my.yahoo.com/content?lg=es&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2FBitnbyte" src="http://eur.i1.yimg.com/eur.yimg.com/i/es/my/addto1.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.feedness.com/alta/http://feeds.feedburner.com/Bitnbyte" src="http://www.feedness.com/ayuda/wp-content/square_b_sh_feed.gif">Subscribe with Feedness</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FBitnbyte" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/Bitnbyte" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FBitnbyte" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FBitnbyte" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FBitnbyte" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.plusmo.com/add?url=http%3A%2F%2Ffeeds.feedburner.com%2FBitnbyte" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Ffeeds.feedburner.com%2FBitnbyte" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Ffeeds.feedburner.com%2FBitnbyte" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsalloy.com/?rss=http%3A%2F%2Ffeeds.feedburner.com%2FBitnbyte" src="http://www.newsalloy.com/subrss3.gif">Subscribe with NewsAlloy</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2FBitnbyte" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FBitnbyte" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare href="http://www.yourminis.com/subscribe.aspx?u=http%3A%2F%2Ffeeds.feedburner.com%2FBitnbyte" src="http://www.yourminis.com/images/addtoyourminisbadge.gif">Subscribe with Yourminis.com</feedburner:feedFlare><feedburner:feedFlare href="http://download.attensa.com/app/get_attensa.html?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FBitnbyte" src="http://www.attensa.com/blogs/attensa/WindowsLiveWriter/BadgeredintoBadges_10C02/attensa_feed_button5.gif">Subscribe with Attensa for Outlook</feedburner:feedFlare><feedburner:feedFlare href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FBitnbyte" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare href="http://hub.netomat.net/account/account.autoSubscribe.jspa?urls=http%3A%2F%2Ffeeds.feedburner.com%2FBitnbyte" src="http://www.netomat.net/blogger/images/icon_netomat_feedbutton.gif">Subscribe with netomat Hub</feedburner:feedFlare><feedburner:feedFlare href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FBitnbyte" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare href="http://www.flurry.com/pushRssFeed.do?r=fb&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2FBitnbyte" src="http://www.flurry.com/images/flurry_rss_logo2.gif">Subscribe with Flurry</feedburner:feedFlare><feedburner:feedFlare href="http://www.wikio.com/subscribe?url=http%3A%2F%2Ffeeds.feedburner.com%2FBitnbyte" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><feedburner:feedFlare href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Ffeeds.feedburner.com%2FBitnbyte" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><item>
		<title>London, Oxford y Stonehenge</title>
		<link>http://feedproxy.google.com/~r/Bitnbyte/~3/1PJ4J7qx8BA/</link>
		<comments>http://www.dipler.org/2010/09/london-oxford-y-stonehenge/#comments</comments>
		<pubDate>Tue, 07 Sep 2010 20:59:18 +0000</pubDate>
		<dc:creator>Alejandro Escario</dc:creator>
				<category><![CDATA[Fotografía]]></category>

		<guid isPermaLink="false">http://www.dipler.org/?p=1643</guid>
		<description><![CDATA[Una vez más he pasado un largo periodo sin publicar ningún artículo, pero las siguientes fotos lo justifican: / Para ver más imágenes ve al album England&#8217;10 de flickr. Enviar a Bitacoras &#191;Quieres suscribirte a los comentarios de este Post? Compartir con Facebook Post on Google Buzz Enviar a Meneame Compartir con Technorati &#161;Comp&#225;rtelo en [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;">Una vez más he pasado un largo periodo sin publicar ningún artículo, pero las siguientes fotos lo justifican:</p>
<p style="text-align: center;"><a title="The Tower of London by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4968804844/"><img src="http://farm5.static.flickr.com/4089/4968804844_3a9d886d6c.jpg" alt="The Tower of London" width="500" height="333" /></a></p>
<p style="text-align: center;"><a title="Natural History Museum, London by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4968207743/"><img src="http://farm5.static.flickr.com/4109/4968207743_123f163213.jpg" alt="Natural History Museum, London" width="500" height="333" /></a>/</p>
<p style="text-align: center;">Para ver más imágenes ve al <a href="http://www.flickr.com/photos/26051177@N02/sets/72157624903545286/" target="_blank">album <em>England&#8217;10</em> de flickr</a>.</p>


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center">
<ul class="socials">
		<li class="shr-bitacoras">
			<a href="http://bitacoras.com/anotaciones/http://www.dipler.org/2010/09/london-oxford-y-stonehenge/" rel="nofollow" class="external" title="Enviar a Bitacoras">Enviar a Bitacoras</a>
		</li>
		<li class="shr-comfeed">
			<a href="http://www.dipler.org/2010/09/london-oxford-y-stonehenge/feed" rel="nofollow" class="external" title="&iquest;Quieres suscribirte a los comentarios de este Post?">&iquest;Quieres suscribirte a los comentarios de este Post?</a>
		</li>
		<li class="shr-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://www.dipler.org/2010/09/london-oxford-y-stonehenge/&amp;t=London%2C+Oxford+y+Stonehenge" rel="nofollow" class="external" title="Compartir con Facebook">Compartir con Facebook</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.google.com/buzz/post?url=http://www.dipler.org/2010/09/london-oxford-y-stonehenge/&amp;imageurl=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-meneame">
			<a href="http://meneame.net/submit.php?url=http://www.dipler.org/2010/09/london-oxford-y-stonehenge/" rel="nofollow" class="external" title="Enviar a Meneame">Enviar a Meneame</a>
		</li>
		<li class="shr-technorati">
			<a href="http://technorati.com/faves?add=http://www.dipler.org/2010/09/london-oxford-y-stonehenge/" rel="nofollow" class="external" title="Compartir con Technorati">Compartir con Technorati</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=London%2C+Oxford+y+Stonehenge+-+http://b2l.me/ap47nq&amp;source=shareaholic" rel="nofollow" class="external" title="&iexcl;Comp&aacute;rtelo en Twitter!">&iexcl;Comp&aacute;rtelo en Twitter!</a>
		</li>
		<li class="shr-delicious">
			<a href="http://delicious.com/post?url=http://www.dipler.org/2010/09/london-oxford-y-stonehenge/&amp;title=London%2C+Oxford+y+Stonehenge" rel="nofollow" class="external" title="Compartir con del.icio.us">Compartir con del.icio.us</a>
		</li>
		<li class="shr-googlereader">
			<a href="http://www.google.com/reader/link?url=http://www.dipler.org/2010/09/london-oxford-y-stonehenge/&amp;title=London%2C+Oxford+y+Stonehenge&amp;srcUrl=http://www.dipler.org/2010/09/london-oxford-y-stonehenge/&amp;srcTitle=London%2C+Oxford+y+Stonehenge&amp;snippet=Una%20vez%20m%C3%A1s%20he%20pasado%20un%20largo%20periodo%20sin%20publicar%20ning%C3%BAn%20art%C3%ADculo%2C%20pero%20las%20siguientes%20fotos%20lo%20justifican%3A%0D%0A%0D%0A%2F%0D%0APara%20ver%20m%C3%A1s%20im%C3%A1genes%20ve%20al%20album%20England%2710%20de%20flickr." rel="nofollow" class="external" title="A&ntilde;dirlo a Google Reader">A&ntilde;dirlo a Google Reader</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

<img src="http://www.dipler.org/?ak_action=api_record_view&id=1643&type=feed" alt="" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=1PJ4J7qx8BA:UabCmLh_Cjg:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=1PJ4J7qx8BA:UabCmLh_Cjg:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=1PJ4J7qx8BA:UabCmLh_Cjg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=1PJ4J7qx8BA:UabCmLh_Cjg:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=1PJ4J7qx8BA:UabCmLh_Cjg:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=1PJ4J7qx8BA:UabCmLh_Cjg:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Bitnbyte/~4/1PJ4J7qx8BA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dipler.org/2010/09/london-oxford-y-stonehenge/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.dipler.org/2010/09/london-oxford-y-stonehenge/</feedburner:origLink></item>
		<item>
		<title>LyX</title>
		<link>http://feedproxy.google.com/~r/Bitnbyte/~3/PG4wfqv7T_0/</link>
		<comments>http://www.dipler.org/2010/08/lyx/#comments</comments>
		<pubDate>Fri, 20 Aug 2010 23:00:24 +0000</pubDate>
		<dc:creator>Alejandro Escario</dc:creator>
				<category><![CDATA[Programas]]></category>

		<guid isPermaLink="false">http://www.dipler.org/?p=1634</guid>
		<description><![CDATA[LyX es un procesador de Textos (sí, algo similar al Word) con unas características un tanto peculiares y que lo diferencian de los otros procesadores de texto que podemos encontrar a día de hoy en el mercado. Para empezar, este procesador de textos, no está basado en What You See Is What You Get (WYSIWYG), [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.dipler.org/wp-content/uploads/2010/08/LOGOTIPO-LYX.jpg"><img class="aligncenter size-medium wp-image-1639" title="LOGOTIPO-LYX" src="http://www.dipler.org/wp-content/uploads/2010/08/LOGOTIPO-LYX-300x200.jpg" alt="" width="300" height="200" /></a><a href="http://www.lyx.org/">LyX</a> es un procesador de Textos (sí, algo similar al Word) con unas características un tanto peculiares y que lo diferencian de los otros procesadores de texto que podemos encontrar a día de hoy en el mercado.</p>
<p>Para empezar, este procesador de textos, no está basado en What You See Is What You Get (WYSIWYG), sino que está basado en What You See Is What You Mean (WYSIWYM), o en otras palabras, el editor le permite al usuario escribir el contenido centrándose en él, en lugar de en la apariencia del mismo, siendo lo único que tiene que hacer el escritor, marcar los textos como título, párrafo, enumeración, &#8230; de manera que se le deja la tarea de darle estilo al texto al propio editor a la hora de exportarlo. En el caso de que deseemos personalizar la apariencia final de nuestro escrito, lo único que hay que hacer es crear un nuevo estilo y aplicárselo al texto a la hora de procesarlo.</p>
<p>LyX se apoya en la tecnología TeX/LaTeX, dotando a estos lenguajes de una interfaz gráfica para trabajar con ellos y que no le haga falta al usuario tener conocimientos del lenguaje utilizado. Este tipo de lenguaje se utiliza en entornos profesionales, por ejemplo a la hora de crear una revista, escribir publicaciones, libros, &#8230; También es ampliamente utilizado en entornos científicos, ya que permite generar formulas matemáticas con una gran rapidez.</p>
<div id="attachment_1640" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.dipler.org/wp-content/uploads/2010/08/edit_menu_sm.png"><img class="size-medium wp-image-1640" title="edit_menu_sm" src="http://www.dipler.org/wp-content/uploads/2010/08/edit_menu_sm-300x224.png" alt="" width="300" height="224" /></a><p class="wp-caption-text">http://www.lyx.org/Screenshots</p></div>
<p>LyX, como ya hemos dicho, es un programa al cual se le pueden aplicar muchos estilos para dotar al texto con la apariencia deseada (sólo a la hora de exportarlo), por ejemplo, se pueden utilizar  los estilos estándar dados por los organismos pertinentes para publicaciones científicas entre otras cosas. De esta manera nos aseguramos que nuestro escrito cumple al 100% con los estándares sin tener que preocuparnos por ello lo más mínimo.</p>
<p>El programa nos da infinidad de opciones para crear textos, tablas, diagramas, importar imágenes, fórmulas matemáticas,&#8230; pero la cosa no acaba ahí, ya que posee una de las herramientas más importantes (a mi modo de ver) a la hora de escribir documentos profesionales de cualquier índole, y es que cuenta con un corrector que permitirá a terceras personas modificar nuestro texto sin que perdamos la versión anterior. Si bien no es el único programa en incorporar esta funcionalidad, es interesante saber que la posee, ya que no todos los procesadores de texto la tienen.</p>
<p>Entre los formatos en los que podemos exportar los documentos se encuentra un PDF, lo que pone el broche a una aplicación tremendamente versátil e interesante además de, ser gratuita por tratarse de un programa de código abierto.</p>


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center">
<ul class="socials">
		<li class="shr-bitacoras">
			<a href="http://bitacoras.com/anotaciones/http://www.dipler.org/2010/08/lyx/" rel="nofollow" class="external" title="Enviar a Bitacoras">Enviar a Bitacoras</a>
		</li>
		<li class="shr-comfeed">
			<a href="http://www.dipler.org/2010/08/lyx/feed" rel="nofollow" class="external" title="&iquest;Quieres suscribirte a los comentarios de este Post?">&iquest;Quieres suscribirte a los comentarios de este Post?</a>
		</li>
		<li class="shr-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://www.dipler.org/2010/08/lyx/&amp;t=LyX" rel="nofollow" class="external" title="Compartir con Facebook">Compartir con Facebook</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.google.com/buzz/post?url=http://www.dipler.org/2010/08/lyx/&amp;imageurl=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-meneame">
			<a href="http://meneame.net/submit.php?url=http://www.dipler.org/2010/08/lyx/" rel="nofollow" class="external" title="Enviar a Meneame">Enviar a Meneame</a>
		</li>
		<li class="shr-technorati">
			<a href="http://technorati.com/faves?add=http://www.dipler.org/2010/08/lyx/" rel="nofollow" class="external" title="Compartir con Technorati">Compartir con Technorati</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=LyX+-+http://b2l.me/ajtk5h&amp;source=shareaholic" rel="nofollow" class="external" title="&iexcl;Comp&aacute;rtelo en Twitter!">&iexcl;Comp&aacute;rtelo en Twitter!</a>
		</li>
		<li class="shr-delicious">
			<a href="http://delicious.com/post?url=http://www.dipler.org/2010/08/lyx/&amp;title=LyX" rel="nofollow" class="external" title="Compartir con del.icio.us">Compartir con del.icio.us</a>
		</li>
		<li class="shr-googlereader">
			<a href="http://www.google.com/reader/link?url=http://www.dipler.org/2010/08/lyx/&amp;title=LyX&amp;srcUrl=http://www.dipler.org/2010/08/lyx/&amp;srcTitle=LyX&amp;snippet=LyX%20es%20un%20procesador%20de%20Textos%20%28s%C3%AD%2C%20algo%20similar%20al%20Word%29%20con%20unas%20caracter%C3%ADsticas%20un%20tanto%20peculiares%20y%20que%20lo%20diferencian%20de%20los%20otros%20procesadores%20de%20texto%20que%20podemos%20encontrar%20a%20d%C3%ADa%20de%20hoy%20en%20el%20mercado.%0D%0A%0D%0APara%20empezar%2C%20este%20procesador%20de%20textos%2C%20no%20est%C3%A1%20basado%20en%20What%20You%20See%20Is%20What%20You%20" rel="nofollow" class="external" title="A&ntilde;dirlo a Google Reader">A&ntilde;dirlo a Google Reader</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

<img src="http://www.dipler.org/?ak_action=api_record_view&id=1634&type=feed" alt="" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=PG4wfqv7T_0:G79In4HdQFU:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=PG4wfqv7T_0:G79In4HdQFU:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=PG4wfqv7T_0:G79In4HdQFU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=PG4wfqv7T_0:G79In4HdQFU:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=PG4wfqv7T_0:G79In4HdQFU:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=PG4wfqv7T_0:G79In4HdQFU:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Bitnbyte/~4/PG4wfqv7T_0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dipler.org/2010/08/lyx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.dipler.org/2010/08/lyx/</feedburner:origLink></item>
		<item>
		<title>Wakoopa</title>
		<link>http://feedproxy.google.com/~r/Bitnbyte/~3/h8CcxM-g8nk/</link>
		<comments>http://www.dipler.org/2010/08/wakoopa/#comments</comments>
		<pubDate>Wed, 18 Aug 2010 23:00:06 +0000</pubDate>
		<dc:creator>Alejandro Escario</dc:creator>
				<category><![CDATA[Programas]]></category>

		<guid isPermaLink="false">http://www.dipler.org/?p=1629</guid>
		<description><![CDATA[Wakoopa es una aplicación de poca utilidad en entornos profesionales, pero cuenta con un gran valor para los curiosos. Esta aplicación nos permitir monitorizar y analizar el histórico de las actividades que realizamos en el ordenador. Me explico, una vez nos registramos en la página web del servicio, hemos de bajarnos un pequeño programa que [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.dipler.org/wp-content/uploads/2010/08/logo_homepage.png"><img class="aligncenter size-full wp-image-1630" title="logo_homepage" src="http://www.dipler.org/wp-content/uploads/2010/08/logo_homepage.png" alt="" width="280" height="95" /></a>Wakoopa es una aplicación de poca utilidad en entornos profesionales, pero cuenta con un gran valor para los curiosos. Esta aplicación nos permitir monitorizar y analizar el histórico de las actividades que realizamos en el ordenador.</p>
<p>Me explico, una vez nos registramos en la página web del servicio, hemos de bajarnos un pequeño programa que correrá como un demonio en nuestro ordenador. Este programa se encarga de monitorizar y enviar al servidor central en tiempo real los datos correspondientes al uso que le damos a nuestro equipo.</p>
<p><a href="http://www.dipler.org/wp-content/uploads/2010/08/gráfico.png"><img class="aligncenter size-medium wp-image-1632" title="gráfico" src="http://www.dipler.org/wp-content/uploads/2010/08/gráfico-300x116.png" alt="" width="300" height="116" /></a></p>
<p>La aplicación le envía al servidor el sistema operativo usado, las aplicaciones que están corriendo en ese momento en el equipo y el tiempo de uso de cada aplicación.</p>
<p>Gracias a esto, si nos dirigimos a la página web de Wakoopa y nos logueamos con nuestro usuario y contraseña, seremos capaces de ver y analizar una serie de gráficas sobre el uso que le estamos dando al ordenador, tanto con aplicaciones en primer plano como con aplicaciones que se están ejecutando en segundo plano.</p>
<p>La página web hace a su vez de red social, y es que nos permite mantenernos en contacto con nuestros amigos y ver para qué utilizan ellos el ordenador a lo largo del día.</p>
<p>Una de las razones por las cuales podría vérsele a la aplicación una utilidad (más allá de la propia curiosidad personal) es que, dado que está analizando todas las aplicaciones que están corriendo en nuestro equipo, nos permitirá descubrir algunas aplicaciones que están corriendo y que un usuario inexperto podría no tener el conocimiento de que se están ejecutando. Pero la cosa va aun más allá, y es que contiene una micro-enciclopedia de programas, gracias  a la cual, podemos, de una manera muy sencilla, saber el cometido de dicha aplicación. Dicha enciclopedia está hecha al estilo de una Wikipedia, dado que cualquier usuario puede contribuir a ella, ahora bien, desconozco por completo si está utilizando el mismo motor o no. Por último mencionar que cuando estamos en la página del programa, ésta nos recomendará programas similares.</p>
<p><a href="http://www.dipler.org/wp-content/uploads/2010/08/enciclopedia-wakoopa.png"><img class="aligncenter size-medium wp-image-1631" title="enciclopedia-wakoopa" src="http://www.dipler.org/wp-content/uploads/2010/08/enciclopedia-wakoopa-300x208.png" alt="" width="300" height="208" /></a></p>


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center">
<ul class="socials">
		<li class="shr-bitacoras">
			<a href="http://bitacoras.com/anotaciones/http://www.dipler.org/2010/08/wakoopa/" rel="nofollow" class="external" title="Enviar a Bitacoras">Enviar a Bitacoras</a>
		</li>
		<li class="shr-comfeed">
			<a href="http://www.dipler.org/2010/08/wakoopa/feed" rel="nofollow" class="external" title="&iquest;Quieres suscribirte a los comentarios de este Post?">&iquest;Quieres suscribirte a los comentarios de este Post?</a>
		</li>
		<li class="shr-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://www.dipler.org/2010/08/wakoopa/&amp;t=Wakoopa" rel="nofollow" class="external" title="Compartir con Facebook">Compartir con Facebook</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.google.com/buzz/post?url=http://www.dipler.org/2010/08/wakoopa/&amp;imageurl=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-meneame">
			<a href="http://meneame.net/submit.php?url=http://www.dipler.org/2010/08/wakoopa/" rel="nofollow" class="external" title="Enviar a Meneame">Enviar a Meneame</a>
		</li>
		<li class="shr-technorati">
			<a href="http://technorati.com/faves?add=http://www.dipler.org/2010/08/wakoopa/" rel="nofollow" class="external" title="Compartir con Technorati">Compartir con Technorati</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=Wakoopa+-+http://b2l.me/ajazfd&amp;source=shareaholic" rel="nofollow" class="external" title="&iexcl;Comp&aacute;rtelo en Twitter!">&iexcl;Comp&aacute;rtelo en Twitter!</a>
		</li>
		<li class="shr-delicious">
			<a href="http://delicious.com/post?url=http://www.dipler.org/2010/08/wakoopa/&amp;title=Wakoopa" rel="nofollow" class="external" title="Compartir con del.icio.us">Compartir con del.icio.us</a>
		</li>
		<li class="shr-googlereader">
			<a href="http://www.google.com/reader/link?url=http://www.dipler.org/2010/08/wakoopa/&amp;title=Wakoopa&amp;srcUrl=http://www.dipler.org/2010/08/wakoopa/&amp;srcTitle=Wakoopa&amp;snippet=Wakoopa%20es%20una%20aplicaci%C3%B3n%20de%20poca%20utilidad%20en%20entornos%20profesionales%2C%20pero%20cuenta%20con%20un%20gran%20valor%20para%20los%20curiosos.%20Esta%20aplicaci%C3%B3n%20nos%20permitir%20monitorizar%20y%20analizar%20el%20hist%C3%B3rico%20de%20las%20actividades%20que%20realizamos%20en%20el%20ordenador.%20Me%20explico%2C%20una%20vez%20nos%20registramos%20en%20la%20p%C3%A1gina%20web%20del%20serv" rel="nofollow" class="external" title="A&ntilde;dirlo a Google Reader">A&ntilde;dirlo a Google Reader</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

<img src="http://www.dipler.org/?ak_action=api_record_view&id=1629&type=feed" alt="" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=h8CcxM-g8nk:EsY_2Semg80:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=h8CcxM-g8nk:EsY_2Semg80:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=h8CcxM-g8nk:EsY_2Semg80:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=h8CcxM-g8nk:EsY_2Semg80:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=h8CcxM-g8nk:EsY_2Semg80:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=h8CcxM-g8nk:EsY_2Semg80:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Bitnbyte/~4/h8CcxM-g8nk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dipler.org/2010/08/wakoopa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.dipler.org/2010/08/wakoopa/</feedburner:origLink></item>
		<item>
		<title>Fin ODCSSS</title>
		<link>http://feedproxy.google.com/~r/Bitnbyte/~3/wtPi8-MERok/</link>
		<comments>http://www.dipler.org/2010/08/fin-odcsss/#comments</comments>
		<pubDate>Tue, 17 Aug 2010 14:08:23 +0000</pubDate>
		<dc:creator>Alejandro Escario</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.dipler.org/?p=1624</guid>
		<description><![CDATA[Después de 10 semanas trabajando de prácticas en Irlanda, más concretamente en el proyecto Online Dublin Computer Science Summer School (ODCSSS), puedo decir, que ha sido una gran experiencia. Es cierto que he dejado un poco de lado algunos, por no decir todos, de mis proyectos personales, como puede ser este blog. Como podéis ver [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.dipler.org/wp-content/uploads/2010/08/Odysseus.gif"><img class="alignleft size-medium wp-image-1625" title="Odysseus" src="http://www.dipler.org/wp-content/uploads/2010/08/Odysseus-184x300.gif" alt="" width="184" height="300" /></a>Después de 10 semanas trabajando de prácticas en Irlanda, más concretamente en el proyecto <a href="http://www.odcsss.ie/">Online Dublin Computer Science Summer School (ODCSSS)</a>, puedo decir, que ha sido una gran experiencia. Es cierto que he dejado un poco de lado algunos, por no decir todos, de mis proyectos personales, como puede ser este blog. Como podéis ver he estado muy ocupado y no he tenido tiempo de publicar nada que no fuesen algunas de las fotos de los increíbles lugares que he estado visitando.</p>
<p>Durante este periodo de tiempo, he aprendido muchas cosas, como por ejemplo:</p>
<ul>
<li>Gran cantidad de programas.</li>
<li>Mejoras en la programación MVC.</li>
<li>Nuevas técnicas de programación en Java.</li>
<li>Leves conocimientos de programación en Python y Perl.</li>
<li>Nuevas culturas.</li>
<li>Nuevas áreas tecnológicas de investigación y desarrollo.</li>
<li>Escritura de documentos científicos.</li>
<li>Nuevas culturas.</li>
<li>etc.</li>
</ul>
<p>Obviamente no todos son conocimientos que tengan cabida en este blog, pero, intentaré, a lo largo del tiempo, ir comentando aquellos temas que me parezcan de interés.</p>


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center">
<ul class="socials">
		<li class="shr-bitacoras">
			<a href="http://bitacoras.com/anotaciones/http://www.dipler.org/2010/08/fin-odcsss/" rel="nofollow" class="external" title="Enviar a Bitacoras">Enviar a Bitacoras</a>
		</li>
		<li class="shr-comfeed">
			<a href="http://www.dipler.org/2010/08/fin-odcsss/feed" rel="nofollow" class="external" title="&iquest;Quieres suscribirte a los comentarios de este Post?">&iquest;Quieres suscribirte a los comentarios de este Post?</a>
		</li>
		<li class="shr-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://www.dipler.org/2010/08/fin-odcsss/&amp;t=Fin+ODCSSS" rel="nofollow" class="external" title="Compartir con Facebook">Compartir con Facebook</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.google.com/buzz/post?url=http://www.dipler.org/2010/08/fin-odcsss/&amp;imageurl=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-meneame">
			<a href="http://meneame.net/submit.php?url=http://www.dipler.org/2010/08/fin-odcsss/" rel="nofollow" class="external" title="Enviar a Meneame">Enviar a Meneame</a>
		</li>
		<li class="shr-technorati">
			<a href="http://technorati.com/faves?add=http://www.dipler.org/2010/08/fin-odcsss/" rel="nofollow" class="external" title="Compartir con Technorati">Compartir con Technorati</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=Fin+ODCSSS+-+http://b2l.me/ahycz5&amp;source=shareaholic" rel="nofollow" class="external" title="&iexcl;Comp&aacute;rtelo en Twitter!">&iexcl;Comp&aacute;rtelo en Twitter!</a>
		</li>
		<li class="shr-delicious">
			<a href="http://delicious.com/post?url=http://www.dipler.org/2010/08/fin-odcsss/&amp;title=Fin+ODCSSS" rel="nofollow" class="external" title="Compartir con del.icio.us">Compartir con del.icio.us</a>
		</li>
		<li class="shr-googlereader">
			<a href="http://www.google.com/reader/link?url=http://www.dipler.org/2010/08/fin-odcsss/&amp;title=Fin+ODCSSS&amp;srcUrl=http://www.dipler.org/2010/08/fin-odcsss/&amp;srcTitle=Fin+ODCSSS&amp;snippet=Despu%C3%A9s%20de%2010%20semanas%20trabajando%20de%20pr%C3%A1cticas%20en%20Irlanda%2C%20m%C3%A1s%20concretamente%20en%20el%20proyecto%20Online%20Dublin%20Computer%20Science%20Summer%20School%20%28ODCSSS%29%2C%20puedo%20decir%2C%20que%20ha%20sido%20una%20gran%20experiencia.%20Es%20cierto%20que%20he%20dejado%20un%20poco%20de%20lado%20algunos%2C%20por%20no%20decir%20todos%2C%20de%20mis%20proyectos%20personales%2C%20como%20p" rel="nofollow" class="external" title="A&ntilde;dirlo a Google Reader">A&ntilde;dirlo a Google Reader</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

<img src="http://www.dipler.org/?ak_action=api_record_view&id=1624&type=feed" alt="" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=wtPi8-MERok:C-ZtG87x068:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=wtPi8-MERok:C-ZtG87x068:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=wtPi8-MERok:C-ZtG87x068:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=wtPi8-MERok:C-ZtG87x068:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=wtPi8-MERok:C-ZtG87x068:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=wtPi8-MERok:C-ZtG87x068:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Bitnbyte/~4/wtPi8-MERok" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dipler.org/2010/08/fin-odcsss/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.dipler.org/2010/08/fin-odcsss/</feedburner:origLink></item>
		<item>
		<title>Actualizar a Ubuntu 10.10 Maverick Meerkat</title>
		<link>http://feedproxy.google.com/~r/Bitnbyte/~3/CQWtttFSsyM/</link>
		<comments>http://www.dipler.org/2010/08/actualizar-a-ubuntu-10-10-maverick-meerkat/#comments</comments>
		<pubDate>Wed, 11 Aug 2010 14:29:44 +0000</pubDate>
		<dc:creator>Alejandro Escario</dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.dipler.org/?p=1619</guid>
		<description><![CDATA[A día de hoy aun quedan unas cuantas semanaspara que salga a la luz el nuevo Ubuntu 10.10 Maverick Meerkat de forma oficial, pero no debe olvidársenos que tenemos a nuestra disposición las versiones alpha y beta de la misma para poder así, testear y reportar errores,&#8230; en definitiva poner nuestro granito de arena a [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://www.dipler.org/wp-content/uploads/2010/03/large.jpg"><img title="Ubuntu 10.04 Logo" src="http://www.dipler.org/wp-content/uploads/2010/03/large-300x175.jpg" alt="" width="300" height="175" /></a></p>
<p style="text-align: left;">A día de hoy aun quedan unas cuantas semanaspara que salga a la luz el nuevo <a href="http://www.ubuntu.com/">Ubuntu</a> 10.10 Maverick Meerkat de forma oficial, pero no debe olvidársenos que tenemos a nuestra  disposición las versiones alpha y beta de la misma para poder así,  testear y reportar errores,&#8230; en definitiva poner nuestro granito de  arena a tan gran proyecto.   Pues bien, si tras pensarlo detenidamente (y obviamente, podemos  permitirnos algunos fallos en el sistema) decidimos instalarnos la nueva  versión, tenemos dos opciones:</p>
<ol style="text-align: left;">
<li>Instalación nueva</li>
<li>Actualización</li>
</ol>
<p style="text-align: left;">Dado que la nueva instalación no tiene mucho misterio, de hecho es bastante parecida a la de <a href="http://www.dipler.org/2009/02/instalacion-de-debian-lenny-50/" target="_blank">Debian Lenny que comentamos aquí</a> hace unos meses, vamos a proceder a contar mediante capturas los pasos a seguir para realizar el upgrade (actualización), proceso que ya describimos anteriormente y más detenidamente en <a id="post-1482" title="Actualizar a Ubuntu 10.04 Lucid Lynx" rel="bookmark" href="../2010/03/actualizar-a-ubuntu-10-04-lucid-lynx/">Actualizar a Ubuntu 10.04 Lucid Lynx</a>.  <a href="http://www.dipler.org/wp-content/uploads/2010/03/Ubuntu-10.04-1.png"> </a> El primer paso a dar es escribir en consola:</p>
<blockquote style="console"><p>~$ sudo -s</p>
<p>~$ update-manager -d</p></blockquote>
<p style="text-align: left;">Con estos comandos nos conectaremos como superusuario, y ejecutaremos  el gestor de actualizaciones, el cual nos indicará que está disponible  para su descarga la versión 10.10, la darle al botón que cita  Actualizar, nos saldrán listadas las notas de la nueva versión, las  aceptamos y seguimos.</p>
<p style="text-align: left;"><img title="Más..." src="http://www.dipler.org/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif" alt="" />Acto  seguido, el programa de actualización se preparará para la instalación y  configurará las nuevas fuentes de software, tras lo cual nos informará  de los paquetes que ya no tienen soporte y de los que se van a  descargar, aceptamos en los dos casos.</p>
<p style="text-align: left;">Tras esto  dará comienzo un proceso bastante largo de descarga de nuevos paquetes. El proceso de descarga puede tardar más o menos tiempo dependiendo del momento en el que hagas la actualización.</p>
<p style="text-align: left;">Tras la  descarga e instalación de paquetes que convertirán nuestro Ubuntu en la  versión 10.10. Durante el proceso de instalación es bastante probable  que veamos cambios en la interfaz, es normal, a pesar de que estos no serán tan grandes que los que se pudieron observar en el proceso de actualización a <a id="post-1482" title="Actualizar a Ubuntu 10.04 Lucid Lynx" rel="bookmark" href="../2010/03/actualizar-a-ubuntu-10-04-lucid-lynx/">Ubuntu 10.04 Lucid Lynx</a>.</p>
<p style="text-align: left;">Siguiendo con  la lista de acontecimientos que nos avisan en el cuadro de diálogo de  las imágenes anteriores, ahora toca realizar una limpieza de los  archivos del ordenador, pero como buen chico, Ubuntu nos pedirá que  confirmemos el paso mediante un cuadro de diálogo similar al siguiente:</p>
<p style="text-align: left;">Y ya sólo nos queda reiniciar el equipo</p>
<p style="text-align: left;">¡Listo!, ya tenemos instalado y listo para aguantar nuestras trastadas el nuevo Ubuntu 10.10, a disfrutarlo toca.</p>


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center">
<ul class="socials">
		<li class="shr-bitacoras">
			<a href="http://bitacoras.com/anotaciones/http://www.dipler.org/2010/08/actualizar-a-ubuntu-10-10-maverick-meerkat/" rel="nofollow" class="external" title="Enviar a Bitacoras">Enviar a Bitacoras</a>
		</li>
		<li class="shr-comfeed">
			<a href="http://www.dipler.org/2010/08/actualizar-a-ubuntu-10-10-maverick-meerkat/feed" rel="nofollow" class="external" title="&iquest;Quieres suscribirte a los comentarios de este Post?">&iquest;Quieres suscribirte a los comentarios de este Post?</a>
		</li>
		<li class="shr-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://www.dipler.org/2010/08/actualizar-a-ubuntu-10-10-maverick-meerkat/&amp;t=Actualizar+a+Ubuntu+10.10+Maverick+Meerkat" rel="nofollow" class="external" title="Compartir con Facebook">Compartir con Facebook</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.google.com/buzz/post?url=http://www.dipler.org/2010/08/actualizar-a-ubuntu-10-10-maverick-meerkat/&amp;imageurl=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-meneame">
			<a href="http://meneame.net/submit.php?url=http://www.dipler.org/2010/08/actualizar-a-ubuntu-10-10-maverick-meerkat/" rel="nofollow" class="external" title="Enviar a Meneame">Enviar a Meneame</a>
		</li>
		<li class="shr-technorati">
			<a href="http://technorati.com/faves?add=http://www.dipler.org/2010/08/actualizar-a-ubuntu-10-10-maverick-meerkat/" rel="nofollow" class="external" title="Compartir con Technorati">Compartir con Technorati</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=Actualizar+a+Ubuntu+10.10+Maverick+Meerkat+-+http://b2l.me/agkmfm&amp;source=shareaholic" rel="nofollow" class="external" title="&iexcl;Comp&aacute;rtelo en Twitter!">&iexcl;Comp&aacute;rtelo en Twitter!</a>
		</li>
		<li class="shr-delicious">
			<a href="http://delicious.com/post?url=http://www.dipler.org/2010/08/actualizar-a-ubuntu-10-10-maverick-meerkat/&amp;title=Actualizar+a+Ubuntu+10.10+Maverick+Meerkat" rel="nofollow" class="external" title="Compartir con del.icio.us">Compartir con del.icio.us</a>
		</li>
		<li class="shr-googlereader">
			<a href="http://www.google.com/reader/link?url=http://www.dipler.org/2010/08/actualizar-a-ubuntu-10-10-maverick-meerkat/&amp;title=Actualizar+a+Ubuntu+10.10+Maverick+Meerkat&amp;srcUrl=http://www.dipler.org/2010/08/actualizar-a-ubuntu-10-10-maverick-meerkat/&amp;srcTitle=Actualizar+a+Ubuntu+10.10+Maverick+Meerkat&amp;snippet=%0D%0AA%20d%C3%ADa%20de%20hoy%20aun%20quedan%20unas%20cuantas%20semanaspara%20que%20salga%20a%20la%20luz%20el%20nuevo%20Ubuntu%2010.10%20Maverick%20Meerkat%20de%20forma%20oficial%2C%20pero%20no%20debe%20olvid%C3%A1rsenos%20que%20tenemos%20a%20nuestra%20%20disposici%C3%B3n%20las%20versiones%20alpha%20y%20beta%20de%20la%20misma%20para%20poder%20as%C3%AD%2C%20%20testear%20y%20reportar%20errores%2C...%20en%20definitiva%20poner%20n" rel="nofollow" class="external" title="A&ntilde;dirlo a Google Reader">A&ntilde;dirlo a Google Reader</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

<img src="http://www.dipler.org/?ak_action=api_record_view&id=1619&type=feed" alt="" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=CQWtttFSsyM:N1vJmFzw_XU:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=CQWtttFSsyM:N1vJmFzw_XU:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=CQWtttFSsyM:N1vJmFzw_XU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=CQWtttFSsyM:N1vJmFzw_XU:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=CQWtttFSsyM:N1vJmFzw_XU:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=CQWtttFSsyM:N1vJmFzw_XU:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Bitnbyte/~4/CQWtttFSsyM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dipler.org/2010/08/actualizar-a-ubuntu-10-10-maverick-meerkat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.dipler.org/2010/08/actualizar-a-ubuntu-10-10-maverick-meerkat/</feedburner:origLink></item>
		<item>
		<title>Irlanda del Norte</title>
		<link>http://feedproxy.google.com/~r/Bitnbyte/~3/Dm1Ca9Sb_yM/</link>
		<comments>http://www.dipler.org/2010/08/irlanda-del-norte/#comments</comments>
		<pubDate>Sun, 01 Aug 2010 23:00:15 +0000</pubDate>
		<dc:creator>Alejandro Escario</dc:creator>
				<category><![CDATA[Fotografía]]></category>

		<guid isPermaLink="false">http://www.dipler.org/?p=1611</guid>
		<description><![CDATA[Enviar a Bitacoras &#191;Quieres suscribirte a los comentarios de este Post? Compartir con Facebook Post on Google Buzz Enviar a Meneame Compartir con Technorati &#161;Comp&#225;rtelo en Twitter! Compartir con del.icio.us A&#241;dirlo a Google Reader]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;">
<p style="text-align: center;"><a title="Titanic Model Belfast North Ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850880184/"><img class="aligncenter" src="http://farm5.static.flickr.com/4141/4850880184_f5ae1c230f.jpg" alt="Titanic Model Belfast North Ireland" width="375" height="500" /></a></p>
<p style="text-align: center;"><a title="Titanic Model Belfast North Ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850880184/"></a><a title="Carrick Rede Rope Bridge North Ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850255165/"><img src="http://farm5.static.flickr.com/4116/4850255165_cc5e0c5276.jpg" alt="Carrick Rede Rope Bridge North Ireland" width="500" height="375" /></a><span id="more-1611"></span></p>
<p style="text-align: center;"><a title="Carrick Rede Rope Bridge North Ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850255165/"></a><a title="Dunluce Castle North Ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850868484/"><img src="http://farm5.static.flickr.com/4117/4850868484_f987534124.jpg" alt="Dunluce Castle North Ireland" width="500" height="375" /></a></p>
<p style="text-align: center;"><a title="Dunluce Castle North Ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850868484/"></a><a title="Caves seen from Carrick Island North Ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850867544/"><img src="http://farm5.static.flickr.com/4135/4850867544_3a21f3a12e.jpg" alt="Caves seen from Carrick Island North Ireland" width="500" height="375" /></a></p>
<p style="text-align: center;"><a title="Caves seen from Carrick Island North Ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850867544/"></a><a title="Carrick Island North Ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850236801/"><img src="http://farm5.static.flickr.com/4115/4850236801_971233a66e.jpg" alt="Carrick Island North Ireland" width="500" height="375" /></a></p>
<p style="text-align: center;"><a title="Carrick Island North Ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850236801/"></a><a title="Carrick Island North Ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850235655/"><img src="http://farm5.static.flickr.com/4134/4850235655_60d2e61827.jpg" alt="Carrick Island North Ireland" width="500" height="375" /></a></p>
<p style="text-align: center;"><a title="Carrick Island North Ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850235655/"></a><a title="Belfast City Hall North Ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850854562/"><img src="http://farm5.static.flickr.com/4076/4850854562_473ef81646.jpg" alt="Belfast City Hall North Ireland" width="500" height="375" /></a></p>
<p style="text-align: center;"><a title="Belfast City Hall North Ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850854562/"></a><a title="Belfast North Ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850853030/"><img src="http://farm5.static.flickr.com/4100/4850853030_688e4454ce.jpg" alt="Belfast North Ireland" width="500" height="375" /></a></p>
<p style="text-align: center;"><a title="Belfast North Ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850853030/"></a><a title="Belfast City Hall North Ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850851936/"><img src="http://farm5.static.flickr.com/4073/4850851936_62605fd388.jpg" alt="Belfast City Hall North Ireland" width="500" height="375" /></a></p>
<p style="text-align: center;">


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center">
<ul class="socials">
		<li class="shr-bitacoras">
			<a href="http://bitacoras.com/anotaciones/http://www.dipler.org/2010/08/irlanda-del-norte/" rel="nofollow" class="external" title="Enviar a Bitacoras">Enviar a Bitacoras</a>
		</li>
		<li class="shr-comfeed">
			<a href="http://www.dipler.org/2010/08/irlanda-del-norte/feed" rel="nofollow" class="external" title="&iquest;Quieres suscribirte a los comentarios de este Post?">&iquest;Quieres suscribirte a los comentarios de este Post?</a>
		</li>
		<li class="shr-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://www.dipler.org/2010/08/irlanda-del-norte/&amp;t=Irlanda+del+Norte" rel="nofollow" class="external" title="Compartir con Facebook">Compartir con Facebook</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.google.com/buzz/post?url=http://www.dipler.org/2010/08/irlanda-del-norte/&amp;imageurl=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-meneame">
			<a href="http://meneame.net/submit.php?url=http://www.dipler.org/2010/08/irlanda-del-norte/" rel="nofollow" class="external" title="Enviar a Meneame">Enviar a Meneame</a>
		</li>
		<li class="shr-technorati">
			<a href="http://technorati.com/faves?add=http://www.dipler.org/2010/08/irlanda-del-norte/" rel="nofollow" class="external" title="Compartir con Technorati">Compartir con Technorati</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=Irlanda+del+Norte+-+http://b2l.me/aebfqw&amp;source=shareaholic" rel="nofollow" class="external" title="&iexcl;Comp&aacute;rtelo en Twitter!">&iexcl;Comp&aacute;rtelo en Twitter!</a>
		</li>
		<li class="shr-delicious">
			<a href="http://delicious.com/post?url=http://www.dipler.org/2010/08/irlanda-del-norte/&amp;title=Irlanda+del+Norte" rel="nofollow" class="external" title="Compartir con del.icio.us">Compartir con del.icio.us</a>
		</li>
		<li class="shr-googlereader">
			<a href="http://www.google.com/reader/link?url=http://www.dipler.org/2010/08/irlanda-del-norte/&amp;title=Irlanda+del+Norte&amp;srcUrl=http://www.dipler.org/2010/08/irlanda-del-norte/&amp;srcTitle=Irlanda+del+Norte&amp;snippet=%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A" rel="nofollow" class="external" title="A&ntilde;dirlo a Google Reader">A&ntilde;dirlo a Google Reader</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

<img src="http://www.dipler.org/?ak_action=api_record_view&id=1611&type=feed" alt="" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=Dm1Ca9Sb_yM:xR_795eu4Ns:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=Dm1Ca9Sb_yM:xR_795eu4Ns:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=Dm1Ca9Sb_yM:xR_795eu4Ns:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=Dm1Ca9Sb_yM:xR_795eu4Ns:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=Dm1Ca9Sb_yM:xR_795eu4Ns:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=Dm1Ca9Sb_yM:xR_795eu4Ns:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Bitnbyte/~4/Dm1Ca9Sb_yM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dipler.org/2010/08/irlanda-del-norte/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.dipler.org/2010/08/irlanda-del-norte/</feedburner:origLink></item>
		<item>
		<title>Dublín, Howth, Newgrange, Knowth y Trim</title>
		<link>http://feedproxy.google.com/~r/Bitnbyte/~3/mLQU7uksP5Q/</link>
		<comments>http://www.dipler.org/2010/08/dublin-howth-newgrange-knowth-y-trim/#comments</comments>
		<pubDate>Sun, 01 Aug 2010 21:06:41 +0000</pubDate>
		<dc:creator>Alejandro Escario</dc:creator>
				<category><![CDATA[Fotografía]]></category>

		<guid isPermaLink="false">http://www.dipler.org/?p=1610</guid>
		<description><![CDATA[Enviar a Bitacoras &#191;Quieres suscribirte a los comentarios de este Post? Compartir con Facebook Post on Google Buzz Enviar a Meneame Compartir con Technorati &#161;Comp&#225;rtelo en Twitter! Compartir con del.icio.us A&#241;dirlo a Google Reader]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;">
<p style="text-align: center;"><a title="Donkey Trim Ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850254069/"><img src="http://farm5.static.flickr.com/4114/4850254069_8f6bf0750d.jpg" alt="Donkey Trim Ireland" width="500" height="375" /></a></p>
<p style="text-align: center;"><a title="Donkey Trim Ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850254069/"></a><a title="Trim Castle Ireland (Braveheart) by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850252835/"><img src="http://farm5.static.flickr.com/4102/4850252835_56c775b69c.jpg" alt="Trim Castle Ireland (Braveheart)" width="500" height="375" /></a><span id="more-1610"></span></p>
<p style="text-align: center;"><a title="Trim Castle Ireland (Braveheart) by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850252835/"></a><a title="Dublin Gaol Ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850870778/"><img src="http://farm5.static.flickr.com/4096/4850870778_8669c85938.jpg" alt="Dublin Gaol Ireland" width="500" height="375" /></a></p>
<p style="text-align: center;"><a title="Dublin Gaol Ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850870778/"></a><a title="Dublin Gaol Ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850249619/"><img src="http://farm5.static.flickr.com/4117/4850249619_c4df349c8a.jpg" alt="Dublin Gaol Ireland" width="500" height="375" /></a></p>
<p style="text-align: center;"><a title="Dublin Gaol Ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850249619/"></a><a title="UCD Dublin Ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850773798/"><img src="http://farm5.static.flickr.com/4097/4850773798_ded0e737dd.jpg" alt="UCD Dublin Ireland" width="500" height="375" /></a></p>
<p style="text-align: center;"><a title="UCD Dublin Ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850773798/"></a><a title="Spire Dublin Ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850772846/"><img src="http://farm5.static.flickr.com/4119/4850772846_eb651a7e98.jpg" alt="Spire Dublin Ireland" width="375" height="500" /></a></p>
<p style="text-align: center;"><a title="Spire Dublin Ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850772846/"></a><a title="Dublin Ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850151621/"><img src="http://farm5.static.flickr.com/4102/4850151621_ac52dcc134.jpg" alt="Dublin Ireland" width="500" height="375" /></a></p>
<p style="text-align: center;"><a title="Dublin Ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850151621/"></a><a title="Dublin Ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850770390/"><img src="http://farm5.static.flickr.com/4115/4850770390_050721a28c.jpg" alt="Dublin Ireland" width="500" height="375" /></a></p>
<p style="text-align: center;"><a title="Dublin Ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850770390/"></a><a title="Dublin Ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850769410/"><img src="http://farm5.static.flickr.com/4140/4850769410_4365d2d234.jpg" alt="Dublin Ireland" width="500" height="375" /></a></p>
<p style="text-align: center;"><a title="Dublin Ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850769410/"></a><a title="Houth Ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850768236/"><img src="http://farm5.static.flickr.com/4116/4850768236_a74e500714.jpg" alt="Houth Ireland" width="500" height="375" /></a></p>
<p style="text-align: center;"><a title="Houth Ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850768236/"></a><a title="Houth by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850767068/"><img src="http://farm5.static.flickr.com/4141/4850767068_af0c277c93.jpg" alt="Houth" width="500" height="375" /></a></p>
<p style="text-align: center;"><a title="Houth by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850767068/"></a><a title="Knowth by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850755040/"><img src="http://farm5.static.flickr.com/4100/4850755040_b9369dd758.jpg" alt="Knowth" width="500" height="375" /></a></p>
<p style="text-align: center;"><a title="Knowth by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850755040/"></a><a title="Knowth by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850753574/"><img src="http://farm5.static.flickr.com/4074/4850753574_6963867527.jpg" alt="Knowth" width="500" height="375" /></a></p>
<p style="text-align: center;"><a title="Knowth by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4850753574/"></a><a title="New Grange - Ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4826093827/"><img src="http://farm5.static.flickr.com/4077/4826093827_a5a8a61247.jpg" alt="New Grange - Ireland" width="500" height="375" /></a></p>
<p style="text-align: center;"><a title="New Grange - Ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4826093827/"></a><a title="Dublin skyline by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4826694898/"><img src="http://farm5.static.flickr.com/4074/4826694898_4f1e521e3f.jpg" alt="Dublin skyline" width="500" height="375" /></a></p>
<p style="text-align: center;"><a title="Dublin skyline by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4826694898/"></a><a title="Guiness - Dublin by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4799346059/"><img src="http://farm5.static.flickr.com/4078/4799346059_9fac032818.jpg" alt="Guiness - Dublin" width="375" height="500" /></a></p>
<p style="text-align: center;"><a href="http://www.flickr.com/photos/26051177@N02/4787473729/" title="WorldCup'10 - The church - Dublin by Alejandro Escario Méndez, on Flickr"><img src="http://farm5.static.flickr.com/4119/4787473729_54b2f7acc4.jpg" width="375" height="500" alt="WorldCup'10 - The church - Dublin" /></a></p>


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center">
<ul class="socials">
		<li class="shr-bitacoras">
			<a href="http://bitacoras.com/anotaciones/http://www.dipler.org/2010/08/dublin-howth-newgrange-knowth-y-trim/" rel="nofollow" class="external" title="Enviar a Bitacoras">Enviar a Bitacoras</a>
		</li>
		<li class="shr-comfeed">
			<a href="http://www.dipler.org/2010/08/dublin-howth-newgrange-knowth-y-trim/feed" rel="nofollow" class="external" title="&iquest;Quieres suscribirte a los comentarios de este Post?">&iquest;Quieres suscribirte a los comentarios de este Post?</a>
		</li>
		<li class="shr-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://www.dipler.org/2010/08/dublin-howth-newgrange-knowth-y-trim/&amp;t=Dubl%C3%ADn%2C+Howth%2C+Newgrange%2C+Knowth+y+Trim" rel="nofollow" class="external" title="Compartir con Facebook">Compartir con Facebook</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.google.com/buzz/post?url=http://www.dipler.org/2010/08/dublin-howth-newgrange-knowth-y-trim/&amp;imageurl=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-meneame">
			<a href="http://meneame.net/submit.php?url=http://www.dipler.org/2010/08/dublin-howth-newgrange-knowth-y-trim/" rel="nofollow" class="external" title="Enviar a Meneame">Enviar a Meneame</a>
		</li>
		<li class="shr-technorati">
			<a href="http://technorati.com/faves?add=http://www.dipler.org/2010/08/dublin-howth-newgrange-knowth-y-trim/" rel="nofollow" class="external" title="Compartir con Technorati">Compartir con Technorati</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=Dubl%C3%ADn%2C+Howth%2C+Newgrange%2C+Knowth+y+Trim+-+http://b2l.me/aeavr6&amp;source=shareaholic" rel="nofollow" class="external" title="&iexcl;Comp&aacute;rtelo en Twitter!">&iexcl;Comp&aacute;rtelo en Twitter!</a>
		</li>
		<li class="shr-delicious">
			<a href="http://delicious.com/post?url=http://www.dipler.org/2010/08/dublin-howth-newgrange-knowth-y-trim/&amp;title=Dubl%C3%ADn%2C+Howth%2C+Newgrange%2C+Knowth+y+Trim" rel="nofollow" class="external" title="Compartir con del.icio.us">Compartir con del.icio.us</a>
		</li>
		<li class="shr-googlereader">
			<a href="http://www.google.com/reader/link?url=http://www.dipler.org/2010/08/dublin-howth-newgrange-knowth-y-trim/&amp;title=Dubl%C3%ADn%2C+Howth%2C+Newgrange%2C+Knowth+y+Trim&amp;srcUrl=http://www.dipler.org/2010/08/dublin-howth-newgrange-knowth-y-trim/&amp;srcTitle=Dubl%C3%ADn%2C+Howth%2C+Newgrange%2C+Knowth+y+Trim&amp;snippet=%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A" rel="nofollow" class="external" title="A&ntilde;dirlo a Google Reader">A&ntilde;dirlo a Google Reader</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

<img src="http://www.dipler.org/?ak_action=api_record_view&id=1610&type=feed" alt="" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=mLQU7uksP5Q:7aGM_LeTeOI:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=mLQU7uksP5Q:7aGM_LeTeOI:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=mLQU7uksP5Q:7aGM_LeTeOI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=mLQU7uksP5Q:7aGM_LeTeOI:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=mLQU7uksP5Q:7aGM_LeTeOI:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=mLQU7uksP5Q:7aGM_LeTeOI:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Bitnbyte/~4/mLQU7uksP5Q" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dipler.org/2010/08/dublin-howth-newgrange-knowth-y-trim/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.dipler.org/2010/08/dublin-howth-newgrange-knowth-y-trim/</feedburner:origLink></item>
		<item>
		<title>La perfección</title>
		<link>http://feedproxy.google.com/~r/Bitnbyte/~3/xkIqoHbNliQ/</link>
		<comments>http://www.dipler.org/2010/07/la-perfeccion/#comments</comments>
		<pubDate>Sun, 18 Jul 2010 23:00:07 +0000</pubDate>
		<dc:creator>Alejandro Escario</dc:creator>
				<category><![CDATA[Frases célebres]]></category>

		<guid isPermaLink="false">http://www.dipler.org/?p=1607</guid>
		<description><![CDATA[La perfección se alcanza, no cuando no hay nada más que añadir, sino cuando ya no queda nada más que quitar. Antoine de Saint-Exupéry Enviar a Bitacoras &#191;Quieres suscribirte a los comentarios de este Post? Compartir con Facebook Post on Google Buzz Enviar a Meneame Compartir con Technorati &#161;Comp&#225;rtelo en Twitter! Compartir con del.icio.us A&#241;dirlo [...]]]></description>
			<content:encoded><![CDATA[<blockquote>
<p style="text-align: left;">La perfección se alcanza, no cuando no hay nada más que añadir, sino cuando ya no queda nada más que quitar.</p>
<p style="text-align: right;">Antoine de Saint-Exupéry</p>
</blockquote>


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center">
<ul class="socials">
		<li class="shr-bitacoras">
			<a href="http://bitacoras.com/anotaciones/http://www.dipler.org/2010/07/la-perfeccion/" rel="nofollow" class="external" title="Enviar a Bitacoras">Enviar a Bitacoras</a>
		</li>
		<li class="shr-comfeed">
			<a href="http://www.dipler.org/2010/07/la-perfeccion/feed" rel="nofollow" class="external" title="&iquest;Quieres suscribirte a los comentarios de este Post?">&iquest;Quieres suscribirte a los comentarios de este Post?</a>
		</li>
		<li class="shr-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://www.dipler.org/2010/07/la-perfeccion/&amp;t=La+perfecci%C3%B3n" rel="nofollow" class="external" title="Compartir con Facebook">Compartir con Facebook</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.google.com/buzz/post?url=http://www.dipler.org/2010/07/la-perfeccion/&amp;imageurl=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-meneame">
			<a href="http://meneame.net/submit.php?url=http://www.dipler.org/2010/07/la-perfeccion/" rel="nofollow" class="external" title="Enviar a Meneame">Enviar a Meneame</a>
		</li>
		<li class="shr-technorati">
			<a href="http://technorati.com/faves?add=http://www.dipler.org/2010/07/la-perfeccion/" rel="nofollow" class="external" title="Compartir con Technorati">Compartir con Technorati</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=La+perfecci%C3%B3n+-+http://b2l.me/abjx9x&amp;source=shareaholic" rel="nofollow" class="external" title="&iexcl;Comp&aacute;rtelo en Twitter!">&iexcl;Comp&aacute;rtelo en Twitter!</a>
		</li>
		<li class="shr-delicious">
			<a href="http://delicious.com/post?url=http://www.dipler.org/2010/07/la-perfeccion/&amp;title=La+perfecci%C3%B3n" rel="nofollow" class="external" title="Compartir con del.icio.us">Compartir con del.icio.us</a>
		</li>
		<li class="shr-googlereader">
			<a href="http://www.google.com/reader/link?url=http://www.dipler.org/2010/07/la-perfeccion/&amp;title=La+perfecci%C3%B3n&amp;srcUrl=http://www.dipler.org/2010/07/la-perfeccion/&amp;srcTitle=La+perfecci%C3%B3n&amp;snippet=%0D%0ALa%20perfecci%C3%B3n%20se%20alcanza%2C%20no%20cuando%20no%20hay%20nada%20m%C3%A1s%20que%20a%C3%B1adir%2C%20sino%20cuando%20ya%20no%20queda%20nada%20m%C3%A1s%20que%20quitar.%0D%0AAntoine%20de%20Saint-Exup%C3%A9ry%0D%0A" rel="nofollow" class="external" title="A&ntilde;dirlo a Google Reader">A&ntilde;dirlo a Google Reader</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

<img src="http://www.dipler.org/?ak_action=api_record_view&id=1607&type=feed" alt="" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=xkIqoHbNliQ:lafax_Uk05Y:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=xkIqoHbNliQ:lafax_Uk05Y:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=xkIqoHbNliQ:lafax_Uk05Y:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=xkIqoHbNliQ:lafax_Uk05Y:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=xkIqoHbNliQ:lafax_Uk05Y:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=xkIqoHbNliQ:lafax_Uk05Y:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Bitnbyte/~4/xkIqoHbNliQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dipler.org/2010/07/la-perfeccion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.dipler.org/2010/07/la-perfeccion/</feedburner:origLink></item>
		<item>
		<title>Glendalough (Irlanda) &amp; España campeona del mundo – Dublín</title>
		<link>http://feedproxy.google.com/~r/Bitnbyte/~3/QZ6XLzpK398/</link>
		<comments>http://www.dipler.org/2010/07/glendalough-irlanda-espana-campeona-del-mundo-dublin/#comments</comments>
		<pubDate>Mon, 12 Jul 2010 21:28:32 +0000</pubDate>
		<dc:creator>Alejandro Escario</dc:creator>
				<category><![CDATA[Fotografía]]></category>

		<guid isPermaLink="false">http://www.dipler.org/?p=1602</guid>
		<description><![CDATA[Enviar a Bitacoras &#191;Quieres suscribirte a los comentarios de este Post? Compartir con Facebook Post on Google Buzz Enviar a Meneame Compartir con Technorati &#161;Comp&#225;rtelo en Twitter! Compartir con del.icio.us A&#241;dirlo a Google Reader]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a title="Glendalough by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4788102782/"><img class="aligncenter" src="http://farm5.static.flickr.com/4116/4788102782_eabd402deb.jpg" alt="Glendalough" width="500" height="375" /></a></p>
<p style="text-align: center;"><a title="Glendalough by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4788102782/"></a><a title="Glendalough by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4787470431/"><img src="http://farm5.static.flickr.com/4136/4787470431_7c780ec0da.jpg" alt="Glendalough" width="375" height="500" /></a><span id="more-1602"></span></p>
<p style="text-align: center;"><a title="Glendalough by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4787470431/"></a><a title="Glendalough by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4787471305/"><img src="http://farm5.static.flickr.com/4093/4787471305_0cb7cf4cfe.jpg" alt="Glendalough" width="375" height="500" /></a></p>
<p style="text-align: center;"><a title="Glendalough by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4787471305/"></a><a title="Glendalough by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4787471587/"><img src="http://farm5.static.flickr.com/4093/4787471587_a89e37eb49.jpg" alt="Glendalough" width="500" height="375" /></a></p>
<p style="text-align: center;"><a title="Glendalough by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4787471587/"></a><a title="Glendalough by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4787473191/"><img src="http://farm5.static.flickr.com/4142/4787473191_ca8e1f5899.jpg" alt="Glendalough" width="500" height="375" /></a></p>
<p style="text-align: center;"><a title="Glendalough by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4787473191/"></a><a title="WorldCup'10 - The church - Dublin by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4787473729/"><img src="http://farm5.static.flickr.com/4119/4787473729_54b2f7acc4.jpg" alt="WorldCup'10 - The church - Dublin" width="375" height="500" /></a></p>
<p style="text-align: center;"><a title="WorldCup'10 - The church - Dublin by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4787473729/"></a><a title="WorldCup'10 - Spanish celebration - Dublin by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4788102278/"><img src="http://farm5.static.flickr.com/4136/4788102278_75573fa9b0.jpg" alt="WorldCup'10 - Spanish celebration - Dublin" width="500" height="375" /></a></p>
<p style="text-align: center;">


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center">
<ul class="socials">
		<li class="shr-bitacoras">
			<a href="http://bitacoras.com/anotaciones/http://www.dipler.org/2010/07/glendalough-irlanda-espana-campeona-del-mundo-dublin/" rel="nofollow" class="external" title="Enviar a Bitacoras">Enviar a Bitacoras</a>
		</li>
		<li class="shr-comfeed">
			<a href="http://www.dipler.org/2010/07/glendalough-irlanda-espana-campeona-del-mundo-dublin/feed" rel="nofollow" class="external" title="&iquest;Quieres suscribirte a los comentarios de este Post?">&iquest;Quieres suscribirte a los comentarios de este Post?</a>
		</li>
		<li class="shr-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://www.dipler.org/2010/07/glendalough-irlanda-espana-campeona-del-mundo-dublin/&amp;t=Glendalough+%28Irlanda%29+%26+Espa%C3%B1a+campeona+del+mundo+-+Dubl%C3%ADn" rel="nofollow" class="external" title="Compartir con Facebook">Compartir con Facebook</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.google.com/buzz/post?url=http://www.dipler.org/2010/07/glendalough-irlanda-espana-campeona-del-mundo-dublin/&amp;imageurl=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-meneame">
			<a href="http://meneame.net/submit.php?url=http://www.dipler.org/2010/07/glendalough-irlanda-espana-campeona-del-mundo-dublin/" rel="nofollow" class="external" title="Enviar a Meneame">Enviar a Meneame</a>
		</li>
		<li class="shr-technorati">
			<a href="http://technorati.com/faves?add=http://www.dipler.org/2010/07/glendalough-irlanda-espana-campeona-del-mundo-dublin/" rel="nofollow" class="external" title="Compartir con Technorati">Compartir con Technorati</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=Glendalough+%28Irlanda%29+%26+Espa%C3%B1a+campeona+del+mundo+-+Dubl%C3%ADn+-+http://b2l.me/X7h29&amp;source=shareaholic" rel="nofollow" class="external" title="&iexcl;Comp&aacute;rtelo en Twitter!">&iexcl;Comp&aacute;rtelo en Twitter!</a>
		</li>
		<li class="shr-delicious">
			<a href="http://delicious.com/post?url=http://www.dipler.org/2010/07/glendalough-irlanda-espana-campeona-del-mundo-dublin/&amp;title=Glendalough+%28Irlanda%29+%26+Espa%C3%B1a+campeona+del+mundo+-+Dubl%C3%ADn" rel="nofollow" class="external" title="Compartir con del.icio.us">Compartir con del.icio.us</a>
		</li>
		<li class="shr-googlereader">
			<a href="http://www.google.com/reader/link?url=http://www.dipler.org/2010/07/glendalough-irlanda-espana-campeona-del-mundo-dublin/&amp;title=Glendalough+%28Irlanda%29+%26+Espa%C3%B1a+campeona+del+mundo+-+Dubl%C3%ADn&amp;srcUrl=http://www.dipler.org/2010/07/glendalough-irlanda-espana-campeona-del-mundo-dublin/&amp;srcTitle=Glendalough+%28Irlanda%29+%26+Espa%C3%B1a+campeona+del+mundo+-+Dubl%C3%ADn&amp;snippet=%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A" rel="nofollow" class="external" title="A&ntilde;dirlo a Google Reader">A&ntilde;dirlo a Google Reader</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

<img src="http://www.dipler.org/?ak_action=api_record_view&id=1602&type=feed" alt="" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=QZ6XLzpK398:VOFGSde1wqM:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=QZ6XLzpK398:VOFGSde1wqM:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=QZ6XLzpK398:VOFGSde1wqM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=QZ6XLzpK398:VOFGSde1wqM:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=QZ6XLzpK398:VOFGSde1wqM:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=QZ6XLzpK398:VOFGSde1wqM:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Bitnbyte/~4/QZ6XLzpK398" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dipler.org/2010/07/glendalough-irlanda-espana-campeona-del-mundo-dublin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.dipler.org/2010/07/glendalough-irlanda-espana-campeona-del-mundo-dublin/</feedburner:origLink></item>
		<item>
		<title>Dublín y Malahide</title>
		<link>http://feedproxy.google.com/~r/Bitnbyte/~3/oVNG0co0m8k/</link>
		<comments>http://www.dipler.org/2010/07/dublin-y-malahide/#comments</comments>
		<pubDate>Sun, 04 Jul 2010 17:32:45 +0000</pubDate>
		<dc:creator>Alejandro Escario</dc:creator>
				<category><![CDATA[Fotografía]]></category>

		<guid isPermaLink="false">http://www.dipler.org/?p=1599</guid>
		<description><![CDATA[Merece la pena dedicarle un rato y leérselo&#8230; Enviar a Bitacoras &#191;Quieres suscribirte a los comentarios de este Post? Compartir con Facebook Post on Google Buzz Enviar a Meneame Compartir con Technorati &#161;Comp&#225;rtelo en Twitter! Compartir con del.icio.us A&#241;dirlo a Google Reader]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a title="O'Conell street Dublin by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4760468113/"><img class="aligncenter" src="http://farm5.static.flickr.com/4135/4760468113_b495dc3273.jpg" alt="O'Conell street Dublin" width="375" height="500" /></a></p>
<p style="text-align: center;"><a title="O'Conell street Dublin by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4760468113/"></a><a title="Malahide by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4761102210/"><img class="aligncenter" src="http://farm5.static.flickr.com/4141/4761102210_590a96b01d.jpg" alt="Malahide" width="500" height="375" /></a></p>
<p style="text-align: left;"><a title="Malahide by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4761102210/"></a><span id="more-1599"></span>Merece la pena dedicarle un rato y leérselo&#8230;<br />
<a title="O'Conell street Dublin by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4760466501/"><img class="aligncenter" src="http://farm5.static.flickr.com/4102/4760466501_b4e6c030ac.jpg" alt="O'Conell street Dublin" width="500" height="375" /></a></p>
<p style="text-align: center;"><a title="O'Conell street Dublin by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4760466501/"></a><a title="Dublin river by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4761100272/"><img class="aligncenter" src="http://farm5.static.flickr.com/4141/4761100272_5c938fef07.jpg" alt="Dublin river" width="500" height="375" /></a></p>
<p style="text-align: center;"><a title="Dublin river by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4761100272/"></a><a title="Malahide castle by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4760464519/"><img class="aligncenter" src="http://farm5.static.flickr.com/4122/4760464519_5f62429315.jpg" alt="Malahide castle" width="500" height="375" /></a></p>
<p style="text-align: center;"><a title="Malahide castle by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4760464519/"></a><a title="UCD dublin by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4761098818/"><img class="aligncenter" src="http://farm5.static.flickr.com/4122/4761098818_fe5e0b814d.jpg" alt="UCD dublin" width="500" height="375" /></a></p>
<p style="text-align: center;"><a title="UCD dublin by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4761098818/"></a><a title="Trinity College Dublin by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4761097732/"><img class="aligncenter" src="http://farm5.static.flickr.com/4099/4761097732_4e59059d14.jpg" alt="Trinity College Dublin" width="500" height="375" /></a></p>
<p style="text-align: center;"><a title="Trinity College Dublin by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4761097732/"></a><a title="Trinity College Dublin by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4760462139/"><img class="aligncenter" src="http://farm5.static.flickr.com/4139/4760462139_c03d85e6e0.jpg" alt="Trinity College Dublin" width="500" height="375" /></a></p>
<p style="text-align: center;"><a title="Trinity College Dublin by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4760462139/"></a><a title="O'Conell street Dublin by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4761096428/"><img class="aligncenter" src="http://farm5.static.flickr.com/4135/4761096428_22c83d7bdb.jpg" alt="O'Conell street Dublin" width="500" height="375" /></a></p>
<p style="text-align: center;"><a title="O'Conell street Dublin by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4761096428/"></a><a title="O'Conell street Dublin by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4761095680/"><img class="aligncenter" src="http://farm5.static.flickr.com/4101/4761095680_32c5778ac7.jpg" alt="O'Conell street Dublin" width="500" height="375" /></a></p>


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center">
<ul class="socials">
		<li class="shr-bitacoras">
			<a href="http://bitacoras.com/anotaciones/http://www.dipler.org/2010/07/dublin-y-malahide/" rel="nofollow" class="external" title="Enviar a Bitacoras">Enviar a Bitacoras</a>
		</li>
		<li class="shr-comfeed">
			<a href="http://www.dipler.org/2010/07/dublin-y-malahide/feed" rel="nofollow" class="external" title="&iquest;Quieres suscribirte a los comentarios de este Post?">&iquest;Quieres suscribirte a los comentarios de este Post?</a>
		</li>
		<li class="shr-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://www.dipler.org/2010/07/dublin-y-malahide/&amp;t=Dubl%C3%ADn+y+Malahide" rel="nofollow" class="external" title="Compartir con Facebook">Compartir con Facebook</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.google.com/buzz/post?url=http://www.dipler.org/2010/07/dublin-y-malahide/&amp;imageurl=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-meneame">
			<a href="http://meneame.net/submit.php?url=http://www.dipler.org/2010/07/dublin-y-malahide/" rel="nofollow" class="external" title="Enviar a Meneame">Enviar a Meneame</a>
		</li>
		<li class="shr-technorati">
			<a href="http://technorati.com/faves?add=http://www.dipler.org/2010/07/dublin-y-malahide/" rel="nofollow" class="external" title="Compartir con Technorati">Compartir con Technorati</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=Dubl%C3%ADn+y+Malahide+-+http://b2l.me/8tz4m&amp;source=shareaholic" rel="nofollow" class="external" title="&iexcl;Comp&aacute;rtelo en Twitter!">&iexcl;Comp&aacute;rtelo en Twitter!</a>
		</li>
		<li class="shr-delicious">
			<a href="http://delicious.com/post?url=http://www.dipler.org/2010/07/dublin-y-malahide/&amp;title=Dubl%C3%ADn+y+Malahide" rel="nofollow" class="external" title="Compartir con del.icio.us">Compartir con del.icio.us</a>
		</li>
		<li class="shr-googlereader">
			<a href="http://www.google.com/reader/link?url=http://www.dipler.org/2010/07/dublin-y-malahide/&amp;title=Dubl%C3%ADn+y+Malahide&amp;srcUrl=http://www.dipler.org/2010/07/dublin-y-malahide/&amp;srcTitle=Dubl%C3%ADn+y+Malahide&amp;snippet=%0D%0A%0D%0AMerece%20la%20pena%20dedicarle%20un%20rato%20y%C2%A0le%C3%A9rselo...%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A" rel="nofollow" class="external" title="A&ntilde;dirlo a Google Reader">A&ntilde;dirlo a Google Reader</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

<img src="http://www.dipler.org/?ak_action=api_record_view&id=1599&type=feed" alt="" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=oVNG0co0m8k:V5G1W1eMawY:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=oVNG0co0m8k:V5G1W1eMawY:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=oVNG0co0m8k:V5G1W1eMawY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=oVNG0co0m8k:V5G1W1eMawY:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=oVNG0co0m8k:V5G1W1eMawY:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=oVNG0co0m8k:V5G1W1eMawY:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Bitnbyte/~4/oVNG0co0m8k" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dipler.org/2010/07/dublin-y-malahide/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.dipler.org/2010/07/dublin-y-malahide/</feedburner:origLink></item>
		<item>
		<title>Acantilados irlandeses</title>
		<link>http://feedproxy.google.com/~r/Bitnbyte/~3/coSFAaOsRmE/</link>
		<comments>http://www.dipler.org/2010/06/acantilados-irlandeses/#comments</comments>
		<pubDate>Mon, 28 Jun 2010 18:52:06 +0000</pubDate>
		<dc:creator>Alejandro Escario</dc:creator>
				<category><![CDATA[Fotografía]]></category>

		<guid isPermaLink="false">http://www.dipler.org/?p=1596</guid>
		<description><![CDATA[Enviar a Bitacoras &#191;Quieres suscribirte a los comentarios de este Post? Compartir con Facebook Post on Google Buzz Enviar a Meneame Compartir con Technorati &#161;Comp&#225;rtelo en Twitter! Compartir con del.icio.us A&#241;dirlo a Google Reader]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a title="Sightseeing from an irish castle by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4743286578/"><img src="http://farm5.static.flickr.com/4116/4743286578_862d2d70a4.jpg" alt="Sightseeing from an irish castle" width="500" height="375" /></a></p>
<p style="text-align: center;"><a title="Sightseeing from an irish castle by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4743286578/"></a><a title="moher - ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4742649417/"><img src="http://farm5.static.flickr.com/4134/4742649417_9d4c888b35.jpg" alt="moher - ireland" width="500" height="375" /></a></p>
<p style="text-align: center;"><a title="moher - ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4742649417/"></a><a title="cliffs of moher - ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4742650145/"><img src="http://farm5.static.flickr.com/4143/4742650145_65672c08aa.jpg" alt="cliffs of moher - ireland" width="500" height="375" /></a></p>
<p style="text-align: center;"><a title="cliffs of moher - ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4742650145/"></a><a title="cliffs of moher - ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4743288612/"><img src="http://farm5.static.flickr.com/4135/4743288612_e8f6cfdf60.jpg" alt="cliffs of moher - ireland" width="500" height="375" /></a></p>
<p style="text-align: center;"><a title="cliffs of moher - ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4743288612/"></a><a title="cliffs of moher - ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4742651725/"><img src="http://farm5.static.flickr.com/4119/4742651725_5ca33f8652.jpg" alt="cliffs of moher - ireland" width="500" height="375" /></a></p>
<p style="text-align: center;"><a title="cliffs of moher - ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4742651725/"></a><a title="Guiness Storehouse Dublin by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4742652315/"><img src="http://farm5.static.flickr.com/4096/4742652315_b7966875e0.jpg" alt="Guiness Storehouse Dublin" width="375" height="500" /></a></p>
<p style="text-align: center;">


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center">
<ul class="socials">
		<li class="shr-bitacoras">
			<a href="http://bitacoras.com/anotaciones/http://www.dipler.org/2010/06/acantilados-irlandeses/" rel="nofollow" class="external" title="Enviar a Bitacoras">Enviar a Bitacoras</a>
		</li>
		<li class="shr-comfeed">
			<a href="http://www.dipler.org/2010/06/acantilados-irlandeses/feed" rel="nofollow" class="external" title="&iquest;Quieres suscribirte a los comentarios de este Post?">&iquest;Quieres suscribirte a los comentarios de este Post?</a>
		</li>
		<li class="shr-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://www.dipler.org/2010/06/acantilados-irlandeses/&amp;t=Acantilados+irlandeses" rel="nofollow" class="external" title="Compartir con Facebook">Compartir con Facebook</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.google.com/buzz/post?url=http://www.dipler.org/2010/06/acantilados-irlandeses/&amp;imageurl=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-meneame">
			<a href="http://meneame.net/submit.php?url=http://www.dipler.org/2010/06/acantilados-irlandeses/" rel="nofollow" class="external" title="Enviar a Meneame">Enviar a Meneame</a>
		</li>
		<li class="shr-technorati">
			<a href="http://technorati.com/faves?add=http://www.dipler.org/2010/06/acantilados-irlandeses/" rel="nofollow" class="external" title="Compartir con Technorati">Compartir con Technorati</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=Acantilados+irlandeses+-+http://b2l.me/7dz2y&amp;source=shareaholic" rel="nofollow" class="external" title="&iexcl;Comp&aacute;rtelo en Twitter!">&iexcl;Comp&aacute;rtelo en Twitter!</a>
		</li>
		<li class="shr-delicious">
			<a href="http://delicious.com/post?url=http://www.dipler.org/2010/06/acantilados-irlandeses/&amp;title=Acantilados+irlandeses" rel="nofollow" class="external" title="Compartir con del.icio.us">Compartir con del.icio.us</a>
		</li>
		<li class="shr-googlereader">
			<a href="http://www.google.com/reader/link?url=http://www.dipler.org/2010/06/acantilados-irlandeses/&amp;title=Acantilados+irlandeses&amp;srcUrl=http://www.dipler.org/2010/06/acantilados-irlandeses/&amp;srcTitle=Acantilados+irlandeses&amp;snippet=%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A%0D%0A" rel="nofollow" class="external" title="A&ntilde;dirlo a Google Reader">A&ntilde;dirlo a Google Reader</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

<img src="http://www.dipler.org/?ak_action=api_record_view&id=1596&type=feed" alt="" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=coSFAaOsRmE:scJZ5LHcK4Y:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=coSFAaOsRmE:scJZ5LHcK4Y:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=coSFAaOsRmE:scJZ5LHcK4Y:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=coSFAaOsRmE:scJZ5LHcK4Y:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=coSFAaOsRmE:scJZ5LHcK4Y:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=coSFAaOsRmE:scJZ5LHcK4Y:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Bitnbyte/~4/coSFAaOsRmE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dipler.org/2010/06/acantilados-irlandeses/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.dipler.org/2010/06/acantilados-irlandeses/</feedburner:origLink></item>
		<item>
		<title>Howth – Irlanda</title>
		<link>http://feedproxy.google.com/~r/Bitnbyte/~3/OAKzhfDJckY/</link>
		<comments>http://www.dipler.org/2010/06/howth-irlanda/#comments</comments>
		<pubDate>Mon, 21 Jun 2010 17:14:07 +0000</pubDate>
		<dc:creator>Alejandro Escario</dc:creator>
				<category><![CDATA[Fotografía]]></category>

		<guid isPermaLink="false">http://www.dipler.org/?p=1594</guid>
		<description><![CDATA[Enviar a Bitacoras &#191;Quieres suscribirte a los comentarios de este Post? Compartir con Facebook Post on Google Buzz Enviar a Meneame Compartir con Technorati &#161;Comp&#225;rtelo en Twitter! Compartir con del.icio.us A&#241;dirlo a Google Reader]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a title="DSCF0580 by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4721045053/"><img src="http://farm2.static.flickr.com/1249/4721045053_b5b9397d85.jpg" alt="DSCF0580" width="500" height="375" /></a><a title="Howth ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4721689314/"></a></p>
<p style="text-align: center;"><a title="Howth ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4721689314/"><img src="http://farm2.static.flickr.com/1166/4721689314_ec142e5a64.jpg" alt="Howth ireland" width="500" height="375" /></a></p>
<p style="text-align: center;"><a title="Howth ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4721689314/"></a><a title="Howth ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4721037531/"><img src="http://farm2.static.flickr.com/1033/4721037531_dcbafb56d2.jpg" alt="Howth ireland" width="500" height="375" /></a></p>
<p style="text-align: center;"><a title="Howth ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4721037531/"></a><a title="Howth ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4721036849/"><img src="http://farm2.static.flickr.com/1129/4721036849_5a2847b355.jpg" alt="Howth ireland" width="500" height="375" /></a></p>
<p style="text-align: center;"><a title="Howth ireland by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4721036849/"></a><a title="DSCF0586 by Alejandro Escario Méndez, on Flickr" href="http://www.flickr.com/photos/26051177@N02/4721686324/"><img src="http://farm2.static.flickr.com/1349/4721686324_42bfbfdb6c.jpg" alt="DSCF0586" width="500" height="375" /></a></p>


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center">
<ul class="socials">
		<li class="shr-bitacoras">
			<a href="http://bitacoras.com/anotaciones/http://www.dipler.org/2010/06/howth-irlanda/" rel="nofollow" class="external" title="Enviar a Bitacoras">Enviar a Bitacoras</a>
		</li>
		<li class="shr-comfeed">
			<a href="http://www.dipler.org/2010/06/howth-irlanda/feed" rel="nofollow" class="external" title="&iquest;Quieres suscribirte a los comentarios de este Post?">&iquest;Quieres suscribirte a los comentarios de este Post?</a>
		</li>
		<li class="shr-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://www.dipler.org/2010/06/howth-irlanda/&amp;t=Howth+-+Irlanda" rel="nofollow" class="external" title="Compartir con Facebook">Compartir con Facebook</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.google.com/buzz/post?url=http://www.dipler.org/2010/06/howth-irlanda/&amp;imageurl=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-meneame">
			<a href="http://meneame.net/submit.php?url=http://www.dipler.org/2010/06/howth-irlanda/" rel="nofollow" class="external" title="Enviar a Meneame">Enviar a Meneame</a>
		</li>
		<li class="shr-technorati">
			<a href="http://technorati.com/faves?add=http://www.dipler.org/2010/06/howth-irlanda/" rel="nofollow" class="external" title="Compartir con Technorati">Compartir con Technorati</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=Howth+-+Irlanda+-+http://b2l.me/5gw24&amp;source=shareaholic" rel="nofollow" class="external" title="&iexcl;Comp&aacute;rtelo en Twitter!">&iexcl;Comp&aacute;rtelo en Twitter!</a>
		</li>
		<li class="shr-delicious">
			<a href="http://delicious.com/post?url=http://www.dipler.org/2010/06/howth-irlanda/&amp;title=Howth+-+Irlanda" rel="nofollow" class="external" title="Compartir con del.icio.us">Compartir con del.icio.us</a>
		</li>
		<li class="shr-googlereader">
			<a href="http://www.google.com/reader/link?url=http://www.dipler.org/2010/06/howth-irlanda/&amp;title=Howth+-+Irlanda&amp;srcUrl=http://www.dipler.org/2010/06/howth-irlanda/&amp;srcTitle=Howth+-+Irlanda&amp;snippet=%0D%0A%0D%0A%0D%0A%0D%0A" rel="nofollow" class="external" title="A&ntilde;dirlo a Google Reader">A&ntilde;dirlo a Google Reader</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

<img src="http://www.dipler.org/?ak_action=api_record_view&id=1594&type=feed" alt="" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=OAKzhfDJckY:Nz5nPYCNysY:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=OAKzhfDJckY:Nz5nPYCNysY:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=OAKzhfDJckY:Nz5nPYCNysY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=OAKzhfDJckY:Nz5nPYCNysY:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=OAKzhfDJckY:Nz5nPYCNysY:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=OAKzhfDJckY:Nz5nPYCNysY:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Bitnbyte/~4/OAKzhfDJckY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dipler.org/2010/06/howth-irlanda/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.dipler.org/2010/06/howth-irlanda/</feedburner:origLink></item>
		<item>
		<title>Crea tu propio chat – Cliente</title>
		<link>http://feedproxy.google.com/~r/Bitnbyte/~3/ad-v5nteRfE/</link>
		<comments>http://www.dipler.org/2010/06/crea-tu-propio-chat-cliente/#comments</comments>
		<pubDate>Sat, 19 Jun 2010 23:00:38 +0000</pubDate>
		<dc:creator>Alejandro Escario</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Producción propia]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.dipler.org/?p=1591</guid>
		<description><![CDATA[Con este artículo termina la serie de artículos en las que describimos los principios básicos que hay que tener en cuenta para realizar un chat y en los que también se describe como hacer una pequeña aproximación a uno de estos programas que a muchos de nosotros nos acompañan en nuestro día a día. En [...]]]></description>
			<content:encoded><![CDATA[<p>Con este artículo termina la serie de artículos en las que describimos los<a href="http://www.dipler.org/2010/06/%c2%bfcomo-funciona-un-chat/"> principios básicos</a> que hay que tener en cuenta para realizar un chat y en los que también se describe como hacer una pequeña aproximación a uno de estos programas que a muchos de nosotros nos acompañan en nuestro día a día.</p>
<p>En el artículo de hoy vamos a tratar el único tema que nos falta, el cual es el programa cliente que nos servirá a los usuarios para comunicarnos con el servidor y así, poder comunicarnos con el resto de usuarios que se encuentren conectados en un momento dado.</p>
<p>Si bien el cliente se basta de un sólo ejecutable, hoy vamos a tratar dicho ejecutable y otro que nos permita, mediante la redirección de descriptores de ficheros, añadirle una interfaz gráfica sencilla.</p>
<h1>cli.c</h1>
<p>Nos encontramos ante uno de los ficheros con la lógica esencial del cliente del chat, vamos a analizarlo paso a paso:</p>
<pre class="brush: cpp;">

#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
// librería para manejo de strings
#include &lt;string.h&gt;
// librería para el uso de los sockets y las correspondientes constantes
#include &lt;sys/socket.h&gt;
// librería para el uso de la constante IPPROTO_TCP, in_addr, ...
#include &lt;netinet/in.h&gt;
// librería que nos permite hacer uso de la variable errno
#include &lt;errno.h&gt;
// librería de base de datos de red
#include &lt;netdb.h&gt;
// librería para el uso de primitivas unix
#include &lt;unistd.h&gt;
// librería para obtener acceso a variables como pid
#include &lt;sys/types.h&gt;
// librería para el manejo de señales
#include &lt;signal.h&gt;
// librería para mostrar la traza del programa
#include &quot;trace.h&quot;
// librería para gestionar los paquetes enviados y recibidos
#include &quot;sms.h&quot;
// librería con las flags que utilizaremos
#include &quot;flags.h&quot;
// incuimos la librería de tipos de datos
#include &quot;type.h&quot;
// incuimos la librería de herramientas para los echo
#include &quot;tools.h&quot;
// incluimos las librerías que nos permitirán hacer uso de SSL
#include &quot;ssl.h&quot;

#define DIM 1024 // definimos el tamaño de los array de textos

#define     READ    STDIN_FILENO
#define     WRITE    STDOUT_FILENO
</pre>
<p>Incluimos los archivos de cabecera o librerías necesarias para la ejecución del chat y realizamos las definiciones de tamaños, y ya puestos, definimos los descriptores de ficheros de entrada y salida con el nombre de las constantes genéricas en lugar de utilizar los números 0 para lectura y 1 para escritura.</p>
<p><span id="more-1591"></span></p>
<pre class="brush: cpp;">int main(int argc, char** argv){

 int sock = 0; // declaración del socket e inicializado a 0
 int error = 0; /** declaramos una variable que nos servirá para detectar
 * errores
 */
 int serverTalk = 0;
 //socklen_t length = (socklen_t) sizeof (struct sockaddr_in); // tamaño del paquete
 //struct sockaddr_in addr; // definimos el contenedor de la dirección
 unsigned int port = 5678; /** creamos la variable que identifica el puerto
 * de conexión, siendo el puerto por defecto 5678
 */
 char dir[DIM] = &quot;localhost&quot;; /** definimos la cadena que contendrá a la
 * dirección del servidor, la cual, será por
 * defecto localhost
 */
 //struct hostent*  server; // estructura utilizada para la gestión de direcciones
 sms auxMsj;
 char name[DIM] = {0};
 int nbytes = 0; // contador de bytes leidos y escritos
 char aux[DIM] = {0};
 // inicializamos las variables de SSL
 BIO* bio = NULL;
 SSL_CTX* ctx = NULL;
 SSL* ssl = NULL;
 char cert[DIM] = &quot;/usr/share/doc/libssl-dev/demos/sign/cert.pem&quot;;</pre>
<p>Realizamos la declaración de las variables de las que vamos a hacer uso durante la ejecución del cliente, de manera que, al menos las que son genéricas las tenemos al inicio y si lo necesitamos, podemos encontrar fácilmente su definición.</p>
<pre class="brush: cpp;">//analizamos los parámetros de entrada
 int i = 0;
 for(; i &lt; argc; i++){
 if(strcmp(argv[i], &quot;-p&quot;) == 0){ // leemos el puerto
 if(argc &lt;= i + 1 || isNum(argv[i+1]) == 0){
 perror(&quot;Se esperaba un número después de -p&quot;);
 exit(-1);
 }else{
 PDEBUG(&quot;INFO: Puerto identificado\n&quot;);
 i++;
 port = atoi(argv[i]);
 }
 continue;
 }else if(strcmp(argv[i], &quot;-d&quot;) == 0){ // dirección de destino
 if(argc &lt;= i + 1){
 perror(&quot;Se esperaba una dirección después de -d&quot;);
 exit(-1);
 }else{
 PDEBUG(&quot;INFO: Destino identificado&quot;);
 i++;
 strcpy(dir, argv[i]);
 }
 continue;
 }else if(strcmp(argv[i], &quot;-cert&quot;) == 0){ // dirección de destino
 if(argc &lt;= i + 1){
 perror(&quot;Se esperaba una ruta de certificado después de -cert&quot;);
 exit(-1);
 }else{
 PDEBUG(&quot;INFO: Destino identificado&quot;);
 i++;
 strcpy(cert, argv[i]);
 }
 continue;
 }
 }
</pre>
<p>Analizamos los parámetros de entrada, para un mayor detalle de lo que hace cada uno de los parámetros de entrada, sería conveniente hacer una lectura del archivo <a href="http://www.dipler.org/2010/06/%c2%bfcomo-funciona-un-chat/">README</a>.</p>
<pre class="brush: cpp;">

/***********************************SSL************************************/
 PDEBUG(&quot;INFO: Iniciamos la librería SSL\n&quot;);
 SSL_load_error_strings(); // strings de error
 SSL_library_init(); // iniciams la libreria en sí
 ERR_load_BIO_strings(); // strings de error de BIO
 OpenSSL_add_all_algorithms(); // inicializamos los algoritmos de la librería

 PDEBUG(&quot;INFO: Conectando...\n&quot;);
 PDEBUG(&quot;INFO: Inicializando los punteros\n&quot;);
 ctx = SSL_CTX_new(SSLv23_client_method());
 ssl = NULL;
 PDEBUG(&quot;INFO: Cargamos el certificado\n&quot;);
 if(SSL_CTX_load_verify_locations(ctx, cert, NULL) == 0){
 char aux[] = &quot;ERROR: No se pudo comprobar el certificado\n&quot;;
 write(WRITE, aux, strlen(aux));
 exit(-1);
 }
 PDEBUG(&quot;INFO: Inicializando BIO\n&quot;);
 bio = BIO_new_ssl_connect(ctx);
 BIO_get_ssl(bio, &amp;ssl);
 if(ssl == 0){
 char aux[] = &quot;ERROR: Error al crear el objeto ssl\n&quot;;
 write(WRITE, aux, strlen(aux));
 exit(-1);
 }
 PDEBUG(&quot;INFO: Estableciendo el modo de trabajo, no queremos reintentos\n&quot;);
 SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);
 PDEBUG(&quot;INFO: Intentando realizar la conexión\n&quot;);
 PDEBUG(&quot;INFO: Conectando a -&gt; &quot;);
 sprintf(aux, &quot;%s:%i&quot;, dir, port);
 PDEBUG(aux);PDEBUG(&quot;\n&quot;);
 BIO_set_conn_hostname(bio, aux);
 PDEBUG(&quot;INFO: Verificando la conexión\n&quot;);
 if (BIO_do_connect(bio) &lt; 1){
 char aux[] = &quot;ERROR: al conectar el BIO\n&quot;;
 write(WRITE, aux, strlen(aux));
 exit(-1);
 }

 PDEBUG(&quot;INFO: Conectado\n&quot;);
 PDEBUG(&quot;INFO: Esperando mensaje de bienvenida\n&quot;);</pre>
<p>Comenzamos con la parte divertida de la película, llegados a este punto, y una vez que ya hemos leído los parámetros necesarios para la ejecución del chat, vamos a proceder a conectarnos al servidor mediante SSL, para lo cual iniciamos la librería openssl y más concretamente las funciones de SSL, creamos una nueva conexión apoyándonos en los certificados que tenemos e intentamos establecer la conexión entre el cliente y el servidor del chat proporcionando la dirección del servidor y el puerto en el cual está escuchando.</p>
<pre class="brush: cpp;">

memset(&amp;auxMsj, 0, sizeof(sms));
 if(client_read(bio, &amp;auxMsj, sizeof(sms)) &lt;= 0){
 PDEBUG(&quot;INFO: El socket está cerrado\n&quot;);
 perror(&quot;Error al leer contenido del socket porque está cerrado\n&quot;);
 perror(&quot;El cliente se parará\n&quot;);
 exit(-1);
 }

 // atendemos la autentificación del cliente
 do{
 bzero(aux, DIM);
 sprintf(aux, &quot;%s ~$&gt; %s\n&quot;, auxMsj.name, auxMsj.text);
 write(WRITE, aux, DIM);
 bzero(&amp;auxMsj.text, SMS_LEN);

 if(auxMsj.flag == MSJ){ // si es un mensaje, solo imprimimos por la salida estandar

 memset(&amp;auxMsj, 0, sizeof(sms));
 if(client_read(bio, &amp;auxMsj, sizeof(sms)) &lt;= 0){
 PDEBUG(&quot;INFO: El socket está cerrado\n&quot;);
 perror(&quot;Error al leer contenido del socket porque está cerrado\n&quot;);
 perror(&quot;El cliente se parará\n&quot;);
 exit(-1);
 }
 continue;

 }

 if(auxMsj.flag == REQ_PASS){ // si es password desactivamos el echo
 echo_off();
 }
 nbytes = read(READ, &amp;auxMsj.text, SMS_LEN);
 if(auxMsj.flag == REQ_PASS){// si es password activamos el echo
 echo_on();
 }
 auxMsj.text[nbytes - 1] = '&#92;&#48;'; // eliminamos el retorno de carro

 // nos salimos?
 if(strcmp(auxMsj.text, &quot;-x&quot;) == 0){
 PDEBUG(&quot;EXIT: Cerrando el cliente, avisando al servidor...\n&quot;);
 auxMsj.flag = CLI_EXIT;
 client_write(bio, &amp;auxMsj, sizeof(sms));
 PDEBUG(&quot;EXIT: Cerrando el socket\n&quot;);
 shutdown(sock, 2);
 PDEBUG(&quot;EXIT: Cerrando el cliente\n&quot;);
 exit(0);
 }else{ // es un mensaje
 strcpy(name, auxMsj.text); // hacemos una copia del nombre introducido para no perderlo
 if(auxMsj.flag == REQ_TEXT){
 auxMsj.flag = REQ_AUTH;
 }else if(auxMsj.flag == REQ_PASS){ // entonces REQ_PASS
 auxMsj.flag = CHECK_PASS;
 }else if(auxMsj.flag == REQ_ROOM){ // entonces REQ_ROOM
 auxMsj.flag = CHECK_ROOM;
 }
 client_write(bio, &amp;auxMsj, sizeof(sms));
 memset(&amp;auxMsj, 0, sizeof(sms));
 if(client_read(bio, &amp;auxMsj, sizeof(sms)) &lt;= 0){
 PDEBUG(&quot;INFO: El socket está cerrado\n&quot;);
 perror(&quot;Error al leer contenido del socket porque está cerrado\n&quot;);
 perror(&quot;El cliente se parará\n&quot;);
 exit(-1);
 }
 }
 }while(auxMsj.flag != OK);</pre>
<p>Tras recibir el mensaje de bienvenida del servidor, nos tocará autenticarnos, por lo que le enviamos al servidor nuestro usuario, la contraseña (sólo la pide si nos estamos intentando conectar con un usuario dado de alta en el chat y que por tanto es capaz de ejecutar órdenes en el servidor como apagarlo por ejemplo) y por último le indicamos en qué sala deseamos entrar para iniciar la conversación.</p>
<pre class="brush: cpp;">PDEBUG(&quot;INFO: Usuario conectado\n&quot;);
 printf(&quot;Usuario conectado...\n&quot;);

 fd_set desc, descCopy; // definimos un descriptor que contendrá nuestros descriptores
 //inicializamos la lista de conexiones
 FD_ZERO(&amp;desc);
 // Inicio del bit descriptor sock con el valor de sock
 int fd;
 if(BIO_get_fd(bio, &amp;fd) &lt; 0){
 write(WRITE, &quot;ERROR: crear le descriptor %s\n&quot;, DIM);
 // terminamos la ejecución del programa
 exit(-1);
 }
 FD_SET (fd, &amp;desc);
 // Inicio del bit descriptor connList con el valor del descriptor de entrada estándar
 FD_SET (READ, &amp;desc);</pre>
<p>Con el fin de poder atender en un sólo hilo de ejecución tanto el socket que se encuentra escuchando posibles mensajes con el servidor, como detectar nuevas entradas de texto por la entrada estándar, creamos un multiplexor, al igual que hicimos en el <a href="http://www.dipler.org/2010/06/crea-tu-propio-chat-servidor/">servidor</a> con un par de descriptores de fichero.</p>
<pre class="brush: cpp;">while(1){
 // hacemos una copia de seguridad para asegurarnos de no perder los datos
 descCopy = desc;
 // ¿Hay algún socket listo para leer?
 PDEBUG(&quot;INFO: ¿Hay algún socket listo para leer?\n&quot;);
 error = select(fd + 1, &amp;descCopy, NULL, NULL, NULL);
 //Comprobamos si ha ocurrido un error al ponernos a escuchar
 if(error &lt; 0){
 write(WRITE, &quot;ERROR: al realizar la selección {{select()}}: %s\n&quot;, DIM);
 // terminamos la ejecución del programa
 exit(-1);
 }

 // recorriendo los sockets para ver los que están activos
 PDEBUG(&quot;INFO: recorriendo los sockets para ver los que están activos\n&quot;);
 if(FD_ISSET(fd, &amp;descCopy)){
 PDEBUG(&quot;INFO: Nuevo mensaje recibido\n&quot;);
 if(client_read(bio, &amp;auxMsj, sizeof(sms)) &lt;= 0){
 PDEBUG(&quot;INFO: El socket está cerrado\n&quot;);
 perror(&quot;Error al leer contenido del socket porque está cerrado\n&quot;);
 perror(&quot;El cliente se parará\n&quot;);
 exit(-1);
 }

 switch(auxMsj.flag){
 case OK: // mensaje de aceptacion, mismo comportamiento que msj
 case MSJ:  // mensaje recibido
 if(serverTalk != 1 || strcmp(auxMsj.name, SERVER) == 0){
 PDEBUG(&quot;INFO: Recibido mensaje\n&quot;);
 sprintf(aux, &quot;%s ~$&gt; %s\n&quot;, auxMsj.name, auxMsj.text);
 write(WRITE, aux, strlen(aux));
 sync();
 }
 break;
 case SERV_EXIT: // el servidor se va a cerrar
 PDEBUG(&quot;EXIT: El servidor se está cerrando, se dejará de leer\n&quot;);
 shutdown(sock, SHUT_RDWR);
 sprintf(aux, &quot;%s ~$&gt; Servidor desconectado\n&quot;, SERVER);
 write(WRITE, aux, strlen(aux));
 sprintf(aux, &quot;El proceso cliente se cerrará\n&quot;);
 write(WRITE, aux, strlen(aux));
 exit(0);
 break;
 default:
 sprintf(aux, &quot;Recibido un mensaje mal formado\n&quot;);
 write(WRITE, aux, strlen(aux));
 sync();
 break;
 }
 }else if(FD_ISSET(READ, &amp;descCopy)){
 PDEBUG(&quot;INFO: Nuevo mensaje escrito\n&quot;);

 bzero(&amp;auxMsj.text, SMS_LEN); // inicializamos el array
 nbytes = read(READ, &amp;auxMsj.text, SMS_LEN); // leemos de la entrada estándar
 auxMsj.text[nbytes - 1] = 0; // eliminamos el retorno de carro

 // nos salimos?
 if(strcmp(auxMsj.text, &quot;-x&quot;) == 0 &amp;&amp; serverTalk != 1){

 PDEBUG(&quot;EXIT: Cerrando el cliente, avisando al servidor...\n&quot;);
 auxMsj.flag = CLI_EXIT;

 }else if(strcmp(auxMsj.text, &quot;--serv&quot;) == 0){ // queremos hablar con el servidor

 PDEBUG(&quot;SERV_ADMIN: Iniciando la comunicación directa con el servidor\n&quot;);
 sprintf(aux, &quot;%s ~$&gt; Iniciada conversación con el servidor\n&quot;, SERVER);
 write(WRITE, aux, strlen(aux));
 serverTalk = 1;
 continue;

 }else if(sscanf(auxMsj.text, &quot;--mp %s&quot;, aux) == 1){ // queremos hablar con el servidor

 PDEBUG(&quot;MP: Mensaje privado detectado\n&quot;);
 strcpy(auxMsj.to, aux);
 sprintf(aux, &quot;%s ~$&gt; Inserte el mensaje privado\n&quot;, SERVER);
 write(WRITE, aux, strlen(aux));
 auxMsj.flag = MP;
 nbytes = read(READ, &amp;auxMsj.text, SMS_LEN); // leemos de la entrada estándar
 auxMsj.text[nbytes - 1] = 0; // eliminamos el retorno de carro

 }else{ // es un mensaje

 if(serverTalk == 1){

 PDEBUG(&quot;SERV_ADMIN: Enviando mensaje al servidor\n&quot;);
 auxMsj.flag = SERV_ADMIN;

 if(strcmp(auxMsj.text, &quot;exit&quot;) == 0){

 serverTalk = 0;
 sprintf(aux, &quot;%s ~$&gt; Envio de mensajes de configuración terminada:\n&quot;, SERVER);
 write(WRITE, aux, strlen(aux));
 continue;

 }

 }else{

 auxMsj.flag = MSJ;

 }
 }

 strcpy(auxMsj.name, name); // hacemos una copia del nombre introducido para no perderlo
 PDEBUG(&quot;INFO: Enviando mensaje...\n&quot;);
 client_write(bio, &amp;auxMsj, sizeof(sms));
 PDEBUG(&quot;INFO: Mensaje Enviado\n&quot;);

 // nos salimos?
 if(auxMsj.flag == CLI_EXIT){

 PDEBUG(&quot;EXIT: Cerrando el socket\n&quot;);
 shutdown(sock, SHUT_RDWR);
 PDEBUG(&quot;EXIT: Cerrando el cliente\n&quot;);
 exit(0);

 }
 }
 }

 return 0;
}</pre>
<p>Esta parte, a pesar de ser la más larga de todas con diferencia, no ha de preocuparnos demasiado, y es que lo único que hace es leer mensajes indefinidamente bien del socket o de la entrada estándar y actúa en consecuencia al descriptor de entrada de datos y en caso de ser un mensaje al Flag que tenga el mensaje, por lo que a mi modo de ver, no vale la pena detenerse demasiado en su funcionamiento.</p>
<h1>interfaz.c</h1>
<p>Como último fichero que creo que merece la pena comentar el interfaz.c, y es que este es un archivo gracias al cual podremos ejecutar el proceso cliente sin tocar una sola línea de código, y es que, aunque el binario cliente es autónomo por sí mismo, vale la pena decir que es un poco feo porque se ejecuta en consola, por lo que apoyándonos en un sencillo programa en java cuyo código puedes encontrar en el <a href="../2010/06/%c2%bfcomo-funciona-un-chat/">primer  artículo de la serie</a>, seremos capaces de añadirle una interfaz gráfica al chat gracias a la redirección de los flujos de entrada-salida.</p>
<p>Así que si más rollo vamos a analizar el código de este interesante programa:</p>
<pre class="brush: cpp;">

int pipe_chat[2];       // definimos el pipe que va del chat a la interfaz
 int pipe_interfaz[2];   // definimos el pipe que va de la interfaz al chat

 if(
 pipe(pipe_chat) == -1 ||
 pipe(pipe_interfaz) == -1
 ){
 perror(&quot;ERROR: ocurrión un error al crear los pipes\n&quot;);
 exit(-1);
 }

 if((pid = fork()) &lt; (pid_t)0){
 perror(&quot;ERROR: ocurrió un error al crear el proceso hijo\n&quot;);
 exit(-1);
 }
</pre>
<p>Por ahora lo único que hemos hecho es crear un par de pipes y crear un segundo proceso.</p>
<pre class="brush: cpp;">else if(pid == (pid_t)0){  // proceso hijo, es el que albergará la interfaz
 close(pipe_chat[1]);    // cerramos el descriptor de escritura del chat
 close(pipe_interfaz[0]); // cerramos el descriptor de lectura de la interfaz

 // cerramos los descriptores de entrada salida estandar
 close(STDIN_FILENO);
 close(STDOUT_FILENO);

 // redireccionamos la entrada y la salida
 dup2(pipe_chat[0], STDIN_FILENO);
 dup2(pipe_interfaz[1], STDOUT_FILENO);

 // cerramos los descriptores ya que no vamos a utilizarlos
 close(pipe_chat[0]);
 close(pipe_interfaz[1]);

 execl(&quot;/usr/bin/java&quot;, &quot;java&quot;, &quot;-jar&quot;, &quot;chat.jar&quot;, (char*) 0);
 }</pre>
<p>En el caso de que el proceso en cuestión sea el proceso hijo, le cerramos los descriptores de salida estándar, y se los reasignamos a los descriptores de nuestras pipes, de manera que ahora los descriptores de entrada-salida de la interfaz escribirán, no en consola, sino en las pipes asignadas. Por último hacemos que este hilo de ejecución, se encargue de correr la interfaz gráfica.</p>
<pre class="brush: cpp;">else{ // proceso padre
 close(pipe_interfaz [1]);    // cerramos el descriptor de escritura de la interfaz
 close(pipe_chat[0]); // cerramos el descriptor de lectura del chat

 // cerramos los descriptores de entrada salida estandar
 close(STDIN_FILENO);
 close(STDOUT_FILENO);

 // redireccionamos la entrada y la salida
 dup2(pipe_interfaz[0], STDIN_FILENO);
 dup2(pipe_chat[1], STDOUT_FILENO);

 // cerramos los descriptores ya que no vamos a utilizarlos
 close(pipe_chat[0]);
 close(pipe_interfaz[1]);

 execv(&quot;./cli5&quot;, argv);
 //execl(&quot;./cli5&quot;, &quot;cli5&quot;, (char*) 0);

 }</pre>
<p>En el proceso padre hacemos exactamente lo mismo que en el proceso hijo, la única diferencia es que ahora la entrada-salida estándar es asignada a los otros extremos de las pipes y que ahora ejecutamos el binario cliente.</p>
<blockquote class="info"><p>Recuerda que si quieres echarle un vistazo al código completo del chat (tanto cliente como servidor), puedes dirigirte al <a href="http://www.dipler.org/2010/06/%c2%bfcomo-funciona-un-chat/">primer artículo de la serie</a> de artículos que tratan el tema del chat.</p></blockquote>


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center">
<ul class="socials">
		<li class="shr-bitacoras">
			<a href="http://bitacoras.com/anotaciones/http://www.dipler.org/2010/06/crea-tu-propio-chat-cliente/" rel="nofollow" class="external" title="Enviar a Bitacoras">Enviar a Bitacoras</a>
		</li>
		<li class="shr-comfeed">
			<a href="http://www.dipler.org/2010/06/crea-tu-propio-chat-cliente/feed" rel="nofollow" class="external" title="&iquest;Quieres suscribirte a los comentarios de este Post?">&iquest;Quieres suscribirte a los comentarios de este Post?</a>
		</li>
		<li class="shr-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://www.dipler.org/2010/06/crea-tu-propio-chat-cliente/&amp;t=Crea+tu+propio+chat+-+Cliente" rel="nofollow" class="external" title="Compartir con Facebook">Compartir con Facebook</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.google.com/buzz/post?url=http://www.dipler.org/2010/06/crea-tu-propio-chat-cliente/&amp;imageurl=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-meneame">
			<a href="http://meneame.net/submit.php?url=http://www.dipler.org/2010/06/crea-tu-propio-chat-cliente/" rel="nofollow" class="external" title="Enviar a Meneame">Enviar a Meneame</a>
		</li>
		<li class="shr-technorati">
			<a href="http://technorati.com/faves?add=http://www.dipler.org/2010/06/crea-tu-propio-chat-cliente/" rel="nofollow" class="external" title="Compartir con Technorati">Compartir con Technorati</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=Crea+tu+propio+chat+-+Cliente+-+http://b2l.me/42swc&amp;source=shareaholic" rel="nofollow" class="external" title="&iexcl;Comp&aacute;rtelo en Twitter!">&iexcl;Comp&aacute;rtelo en Twitter!</a>
		</li>
		<li class="shr-delicious">
			<a href="http://delicious.com/post?url=http://www.dipler.org/2010/06/crea-tu-propio-chat-cliente/&amp;title=Crea+tu+propio+chat+-+Cliente" rel="nofollow" class="external" title="Compartir con del.icio.us">Compartir con del.icio.us</a>
		</li>
		<li class="shr-googlereader">
			<a href="http://www.google.com/reader/link?url=http://www.dipler.org/2010/06/crea-tu-propio-chat-cliente/&amp;title=Crea+tu+propio+chat+-+Cliente&amp;srcUrl=http://www.dipler.org/2010/06/crea-tu-propio-chat-cliente/&amp;srcTitle=Crea+tu+propio+chat+-+Cliente&amp;snippet=Con%20este%20art%C3%ADculo%20termina%20la%20serie%20de%20art%C3%ADculos%20en%20las%20que%20describimos%20los%20principios%20b%C3%A1sicos%20que%20hay%20que%20tener%20en%20cuenta%20para%20realizar%20un%20chat%20y%20en%20los%20que%20tambi%C3%A9n%20se%20describe%20como%20hacer%20una%20peque%C3%B1a%20aproximaci%C3%B3n%20a%20uno%20de%20estos%20programas%20que%20a%20muchos%20de%20nosotros%20nos%20acompa%C3%B1an%20en%20nuestro%20d%C3%ADa%20" rel="nofollow" class="external" title="A&ntilde;dirlo a Google Reader">A&ntilde;dirlo a Google Reader</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

<img src="http://www.dipler.org/?ak_action=api_record_view&id=1591&type=feed" alt="" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=ad-v5nteRfE:FidKZHFfUss:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=ad-v5nteRfE:FidKZHFfUss:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=ad-v5nteRfE:FidKZHFfUss:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=ad-v5nteRfE:FidKZHFfUss:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=ad-v5nteRfE:FidKZHFfUss:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=ad-v5nteRfE:FidKZHFfUss:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Bitnbyte/~4/ad-v5nteRfE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dipler.org/2010/06/crea-tu-propio-chat-cliente/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.dipler.org/2010/06/crea-tu-propio-chat-cliente/</feedburner:origLink></item>
		<item>
		<title>Crea tu propio chat – Servidor</title>
		<link>http://feedproxy.google.com/~r/Bitnbyte/~3/NzFwqdw8Y88/</link>
		<comments>http://www.dipler.org/2010/06/crea-tu-propio-chat-servidor/#comments</comments>
		<pubDate>Fri, 18 Jun 2010 23:00:04 +0000</pubDate>
		<dc:creator>Alejandro Escario</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Producción propia]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.dipler.org/?p=1579</guid>
		<description><![CDATA[Hasta ahora hemos estado hablando de funcionalidades genéricas del chat, requisitos, &#8230;pues bien hoy vamos a analizar todos los ficheros de los que se compone el servidor y no han sido comentados con anterioridad; al igual que en el artículo anterior, vamos a comentar el cometido de cada una de las funciones de manera genérica, [...]]]></description>
			<content:encoded><![CDATA[<p>Hasta ahora hemos estado hablando de <a href="http://www.dipler.org/2010/06/construye-tu-propio-chat-funciones-genericas/">funcionalidades genéricas</a> del chat, <a href="http://www.dipler.org/2010/06/%C2%BFcomo-funciona-un-chat/">requisitos</a>, &#8230;pues bien hoy vamos a analizar todos los ficheros de los que se compone el servidor y no han sido comentados con anterioridad; al igual que en el <a href="http://www.dipler.org/2010/06/construye-tu-propio-chat-funciones-genericas/">artículo anterior</a>, vamos a comentar el cometido de cada una de las funciones de manera genérica, y únicamente nos adentraremos en el contenido de estas en la función de manejo de los sockets y en las que tengan alguna curiosidad que comentar.</p>
<h1>Database.c</h1>
<p>Éste es un archivo de código fuente que sólo será incluido en el programa del servidor (en realidad también va a ser incluido en el programa que nos ayudará a crear la base de datos desde cero, pero la importancia de ese ejecutable es mínima y la comentaremos más adelante.</p>
<p>En este caso hemos decidido hacer uso del sistema de bases de dados SQLite dado que es una base de datos ligera portable y con características más que suficientes para utilizarla en nuestra pequeña aplicación.</p>
<pre class="brush: cpp;">sqlite3* db_open(char*);</pre>
<p>El cometido de esta función es simple, simplemente abrirá la base de datos situada en el fichero que se le ha de pasar como argumento.</p>
<pre class="brush: cpp;">int db_prepare(sqlite3**);</pre>
<p>Esta función no se utilizará en el servidor, pero será la que utilizará la aplicación que creará la base de datos en caso de que esta no exista, y su única función es la de crear las tablas necesarias en la base de datos así como el usuario administrador del chat.</p>
<pre class="brush: cpp;">int db_exec(sqlite3**, char*, int);</pre>
<p>Esta función se encargará de ejecutar una sentencia SQL y de actuar en consecuencia dependiendo del flag que se le pase como último argumento.</p>
<pre class="brush: cpp;">int db_userExists(char*, sqlite3**);</pre>
<p>Esta función comprueba si un usuario existe en la base de datos.</p>
<pre class="brush: cpp;">int db_checkUser(char*, char*, sqlite3**);</pre>
<p>Esta función comprueba si un usuario asociado a una contraseña existe en la base de datos.</p>
<pre class="brush: cpp;">int db_addUser(char*, char*, int, sqlite3**);</pre>
<p>Crea un nuevo usuario.</p>
<pre class="brush: cpp;">int db_deleteUser(char*, sqlite3**);</pre>
<p>Elimina un usuario de la base de datos.</p>
<pre class="brush: cpp;">int db_listUser(int, sqlite3**);</pre>
<p>Lista los usuarios en la base de datos</p>
<pre class="brush: cpp;">void db_close(sqlite3**);</pre>
<p>Cierra la base de datos y todos los descriptores asociados a ella.</p>
<pre class="brush: cpp;">int db_addLog(sms, sqlite3**);</pre>
<p>Añade a la tabla de logs un mensaje.</p>
<pre class="brush: cpp;">int db_getLog(int, sqlite3**);</pre>
<p>Lista el contenido del log de la base de datos</p>
<pre class="brush: cpp;">int db_getLogPar(int, sqlite3**, char*);</pre>
<p>Tiene un comportamiento similar al de la función anterior, sólo que esta admite parámetros para personalizar la búsqueda, como por ejemplo buscar entre dos fechas dadas.</p>
<pre class="brush: cpp;">static int callback(void*, int, char**, char**);</pre>
<p>Función que será llamada para cada una de las filas obtenidas de una sentencia SELECT.<span id="more-1579"></span></p>
<h1>servFunctions.c</h1>
<p>Este fichero es el que contiene las principales funciones del servidor de nuestro chat, en este caso el comentario de cada función está situado justo encima de su definición en un comentario.</p>
<pre class="brush: cpp;">// indica la siguiente posición libre del array de conexiones
 void nextPos(user*, int*, int*, int);
 // hace un broadcast de 'sms'
 void broadcast(user*, int*, sms, int, sqlite3*);
 // hace un multicast de 'sms'
 void multicast(user*, int*, sms, int, sqlite3*, int room);
 // autenticación
 void auth(user*, int*, int, sms, sqlite3*, room*, int);
 // autenticación con contraseña
 void authPassword(user*, int*, int, sms, sqlite3*, room*, int);
 // chequea si un nombre e usurio está en uso
 int checkName(user*, int, char*);
 // busca una conexión en el array dado un socket
 int searchConn(user*, int, int);
 // cierra una conexión dado un socket
 int closeConn(user*, int*, int, int, fd_set*, sqlite3*);
 // ejecuta el comando indicado en el servidor
 int execParams(user*, int, char*, int, int, sqlite3*, room*, int);
 //cierra todas las conexiones
 void closeAll(user*, int*);
 // enviando mesaje privado
 void mp(user*, int*, sms, int, sqlite3*);
 // buscar socket por nombre
 int searchName(user*, int, char*);
 // listar salas de chat
 void sendRoomList(SSL*, room*, int);
 // selección de una sala de chat
 void roomCheckIn(user*, int*, int, sms, sqlite3*, room*, int);
 // buscador de salas en el array
 int searchRoom(char*, room*, int);
 // añadimos una sala
 int addRoom(char*, room*, int);
 // borramos una sala
 int deleteRoom(char*, room*, int);
 // movemos todos los usuarios de una sala a otra
 int moveAllTo(user*, int*, char*, room*, int, sqlite3*, char*);</pre>
<p>La función más extensa de este archivo es la función:</p>
<pre class="brush: cpp;">int execParams(user*, int, char*, int, int, sqlite3*, room*, int);</pre>
<p>Esta función se encargad de, una vez comprobado que el usuario en cuestión tiene permisos para darle órdenes al servidor, analiza la petición y la ejecuta comparando el string que recibe en el campo del mensaje de la estructura sms que vimos recientemente.</p>
<h1>serv5.c</h1>
<p>El archivo serv5.c es uno de los pocos que vamos a analizar por completo, y es que en él podremos ver un ejemplo de servidor en c utilizando SSL mientras nos apoyamos en la librería openssl.h; a pesar de que voy a exponer todo el código de este archivo, este lo voy a poner en partes mientras añado comentarios entre medias para mejorar su comprehensión. Si quieres ejecutarlo para ver como se comporta, te recomiendo que te dirijas al <a href="http://www.dipler.org/2010/06/%C2%BFcomo-funciona-un-chat/">primer artículo</a> de la &#8220;saga&#8221; y te descargues el proyecto completo en lugar de copiar y pegar del código que voy a poner a continuación, pero como dicen por ahí, eres libre de hacer lo que quieras siempre y cuando cumplas con los términos de la licencia.</p>
<pre class="brush: cpp;">/**
 * @File: serv5.c
 * @Description: implements the server
 * @Group: 1
 * @Members:    Alejandro Escario Méndez
 */

#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
// librería para manejo de strings
#include &lt;string.h&gt;
// librería para el uso de los sockets y las correspondientes constantes
#include &lt;sys/socket.h&gt;
// librería para el uso de la constante IPPROTO_TCP, in_addr, ...
#include &lt;netinet/in.h&gt;
// librería para el uso de primitivas unix
#include &lt;unistd.h&gt;
// librería que nos permite hacer uso de la variable errno
#include &lt;errno.h&gt;
// librería para mostrar la traza del programa
#include &quot;trace.h&quot;
// librería para gestionar los paquetes enviados y recibidos
#include &quot;sms.h&quot;
// librería para gestionar las conexiones
#include &quot;socket.h&quot;
// librería con las flags que utilizaremos
#include &quot;flags.h&quot;
// librería con las funciones del servidor
#include &quot;servFunctions.h&quot;
// incuimos la librería de tipos de datos
#include &quot;type.h&quot;
// incluimos la librería que va a controlar la base de datos
#include &quot;database.h&quot;
// incluimos la librería que va a convertir el proceso en un demonio
#include &quot;tools.h&quot;
// incluimos las librerias de ssl
#include &lt;openssl/ssl.h&gt;
#include &lt;openssl/err.h&gt;

//tamaño de la cola de peticiones
#define Q_DIM 5 // es el valor recomendado por defecto

#define DIM 1024
</pre>
<p>Incluimos las librerías necesarias para una compilación correcta del programa y definimos un par de constantes, <strong>Q_DIM</strong> contiene el número de usuarios que puede haber en la cola de conexiones a ser aceptadas mientras que <strong>DIM</strong> nos servirá, simplemente para hacer que todos nuestros arrays de texto tengan las mismas dimensiones.</p>
<pre class="brush: cpp;">int main(int argc, char** argv){

 int sock = 0; // declaración del socket e inicializado a 0
 int error = 0; /** declaramos una variable que nos servirá para detectar
 * errores
 */
 socklen_t length = (socklen_t) sizeof (struct sockaddr_in); // tamaño del paquete
 struct sockaddr_in addr; // definimos el contenedor de la dirección
 unsigned int port = 5678; /** creamos la variable que identifica el puerto
 * de conexión, siendo el puerto por defecto 5678
 */
 int connPos = 0; // primera posición libre en el array de conexiones
 int connTam = 10; // tamaño actual del array de conexiones
 int connGrow = 10; // factor de crecimiento del array
 user* conn = NULL; // array de conexiones con los clientes
 room rooms[DIM];
 user auxConn;   // conexion auxiliar
 sms auxMsj;
 fd_set connList, connListCopy; // definimos un descriptor que contendrá nuestros sockets
 int nbytes = 0; // contador de bytes leidos y escritos
 int dbName = 0; // variable que nos permitirá configurar el nombre de la base de datos
 sqlite3* db = NULL; // descriptor de la base de datos

 char cert[DIM] = &quot;cert&quot;; // nombre del certificado del servidor
 char pkey[DIM] = &quot;pkey&quot;; // nombre del archivo con la clave privada
</pre>
<p>Declaramos una serie de variables que utilizaremos para hacer que el servidor funcione como deseemos.</p>
<p>La funcionalidad de cada una de las variables está más o menos explicada en los comentarios, aunque si tienes alguna duda, no dudes en preguntar.</p>
<pre class="brush: cpp;">
 //analizamos los parámetros de entrada
 int i = 0;
 for(; i &lt; argc; i++){
 if(strcmp(argv[i], &quot;-p&quot;) == 0){ // leemos el puerto
 if(argc &lt;= i + 1 || isNum(argv[i+1]) == 0){
 perror(&quot;Se esperaba un número después de -p&quot;);
 exit(-1);
 }else{
 PDEBUG(&quot;ARGS: Se detectó un puerto\n&quot;);
 i++;
 port = atoi(argv[i]);
 }
 continue;
 }else if(strcmp(argv[i], &quot;-ls&quot;) == 0){ // leemos el tamaño inicial de la lista
 if(argc &lt;= i + 1 || isNum(argv[i+1]) == 0){
 perror(&quot;Se esperaba un número después de -ls&quot;);
 exit(-1);
 }else{
 PDEBUG(&quot;ARGS: Se detectó un tamaño inicial\n&quot;);
 i++;
 connTam = atoi(argv[i]);
 }
 continue;
 }else if(strcmp(argv[i], &quot;-lg&quot;) == 0){ // leemos el factor de creciemiento de la lista de conexiones
 if(argc &lt;= i + 1 || isNum(argv[i+1]) == 0){
 perror(&quot;Se esperaba un número después de -lg\n&quot;);
 exit(-1);
 }else{
 PDEBUG(&quot;ARGS: Se detectó un crecimiento\n&quot;);
 i++;
 connGrow = atoi(argv[i]);
 }
 continue;
 }else if(strcmp(argv[i], &quot;-db&quot;) == 0){ // leemos el nombre de la base de datos que queremos utilizar
 if(argc &lt;= i + 1){
 perror(&quot;Se esperaba una cadena depués de -db\n&quot;);
 exit(-1);
 }else{
 PDEBUG(&quot;ARGS: Se detectó un crecimiento\n&quot;);
 i++;
 dbName = i;
 }
 continue;
 }else if(strcmp(argv[i], &quot;-cert&quot;) == 0){ // leemos el nombre del archivo del certificado
 if(argc &lt;= i + 1){
 perror(&quot;Se esperaba una cadena depués de -cert\n&quot;);
 exit(-1);
 }else{
 PDEBUG(&quot;ARGS: Se detectó un certificado\n&quot;);
 i++;
 strcpy(cert, argv[i]);
 }
 continue;
 }else if(strcmp(argv[i], &quot;-pkey&quot;) == 0){ // leemos el nombre del archivo de que contiene la clave privada
 if(argc &lt;= i + 1){
 perror(&quot;Se esperaba una cadena depués de -pkey\n&quot;);
 exit(-1);
 }else{
 PDEBUG(&quot;ARGS: Se detectó una clave privada\n&quot;);
 i++;
 strcpy(pkey, argv[i]);
 }
 continue;
 }
 }
 </pre>
<p>Analizamos los parámetros de entrada, la forma en la cual lo analizamos es un poco burda pero funciona que a fin de cuentas es lo que nos interesa en este manual. Para una mayor especificación del comportamiento de cada uno de los comandos puedes dirigirte al archivo README y que cuyo contenido ya hemos comentado con anterioridad.</p>
<pre class="brush: cpp;">db = db_open(
 (dbName == 0) ? &quot;chat.db&quot; : argv[dbName]
 );
</pre>
<p>Creamos la conexión con la base de datos, la cual se llamará de una manera u otra en función de los parámetros que le hayamos pasado al ejecutable</p>
<pre class="brush: cpp;">PDEBUG(&quot;INFO: Convertimos el proceso en un demonio\n&quot;);
 make_daemon();
</pre>
<p>Creamos un demonio según el concepto Unix, esta función puedes analizarla en el <a href="http://www.dipler.org/2010/06/construye-tu-propio-chat-funciones-genericas/">post anterior</a> en el archivo tools.c.</p>
<pre class="brush: cpp;">
 /*******************************SSL****************************************/
 PDEBUG(&quot;INFO: Inicializando la libreria SSL\n&quot;);
 SSL_library_init();
 PDEBUG(&quot;INFO: Cargamos los algoritmos SSL y los mensajes de error\n&quot;);
 OpenSSL_add_all_algorithms();
 SSL_load_error_strings();
 PDEBUG(&quot;INFO: Seleccionamos SSLv2, SSLv3 y TLSv1\n&quot;);
 SSL_METHOD *method;
 method = SSLv23_server_method();
 PDEBUG(&quot;INFO: Creamos el nuevo contexto\n&quot;);
 SSL_CTX *ctx;
 ctx = SSL_CTX_new(method);
 if(ctx == NULL) { // error
 ERR_print_errors_fp(stderr);
 _exit(-1);
 }

PDEBUG(&quot;INFO: Comprobando el certificado\n&quot;);
 if ( SSL_CTX_use_certificate_chain_file(ctx, cert) &lt;= 0) {
 ERR_print_errors_fp(stderr);
 _exit(-1);
 }

PDEBUG(&quot;INFO: Comprobando la clav eprivada\n&quot;);
 if ( SSL_CTX_use_PrivateKey_file(ctx, pkey, SSL_FILETYPE_PEM) &lt;= 0) {
 ERR_print_errors_fp(stderr);
 _exit(-1);
 }

PDEBUG(&quot;INFO: Comprobando que las claves pueden trabajar juntas\n&quot;);
 if ( !SSL_CTX_check_private_key(ctx) ) {
 fprintf(stderr, &quot;Clave privada incorrecta.\n&quot;);
 _exit(-1);
 }

/*******************************SSL****************************************/
 //Creamos el socket
 PDEBUG(&quot;INFO: Creando el socket\n&quot;);
 sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
 //Comprobamos si ha ocurrido un error al crear el socket
 if(sock &lt; 0){
 write(2, strcat(&quot;ERROR: creación del socket {{socket()}}: %s\n&quot;, strerror(errno)), DIM);
 // terminamos la ejecución del programa
 exit(-1);
 }

PDEBUG(&quot;INFO: Estableciendo el puerto, origenes,...\n&quot;);
 addr.sin_family = AF_INET; // familia AF_INET
 addr.sin_port = htons(port); // definimos el puerto de conexión
 addr.sin_addr.s_addr = htonl(INADDR_ANY); // permitimos conexion de cualquiera

/* hacemos este &quot;apaño&quot; porque según hemos leido, http://www.wlug.org.nz/EADDRINUSE
 * hay un timeout para liberar el socket
 */
 unsigned int opt = 1;
 if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &amp;opt, sizeof(opt))==-1) {
 write(2, &quot;ERROR: al permitir la reutiización del puerto {{setsockopt()}}\n&quot;, DIM);
 exit(-1);
 }

// le asignamos una dirección al socket
 PDEBUG(&quot;INFO: Asignando una dirección al socket\n&quot;);
 error = bind(sock, (struct sockaddr *)&amp;addr, length);
 //Comprobamos si ha ocurrido un error al hacer el bind
 if(error &lt; 0){
 write(2, strcat(&quot;ERROR: {{bind()}}: %s\n&quot;, strerror(errno)), DIM);
 // terminamos la ejecución del programa
 exit(-1);
 }

//Ponemos el servidor a escuchar para buscar nuevas conexiones
 PDEBUG(&quot;INFO: Comenzamos la escucha de l programa\n&quot;);
 error = listen(sock, Q_DIM);
 //Comprobamos si ha ocurrido un error al ponernos a escuchar
 if(error &lt; 0){
 write(2, strcat(&quot;ERROR: al iniciar la escucha{{listen()}}: %s\n&quot;, strerror(errno)), DIM);
 // terminamos la ejecución del programa
 exit(-1);
 }</pre>
<p>En este último bloque de código, lo que hemos hecho es, a grandes rasgos, inicializar las librerías SSL, asignarle un certificado al servidor para que este pueda identificarse y que los clientes puedan comunicarse con él, hemos creado la conexión y le hemos asignado un puerto para la escucha de nuevas conexiones y de los mensajes de los clientes.</p>
<pre class="brush: cpp;">// realizamos la asignación inicial de memoria
 PDEBUG(&quot;INFO: Realizando asignación inicial de memoria, tamaño inicial 10\n&quot;);
 connTam = 10;
 conn = malloc(connTam * sizeof(user));
 // rellenamos el array con -1
 memset(conn, 0, connTam * sizeof(user));
</pre>
<p>Creamos y asignamos la memoria necesaria para mantener un listado de todos los clientes conectados al servidor.</p>
<pre class="brush: cpp;">//inicializamos la lista de conexiones
 FD_ZERO(&amp;connList);
 // Inicio del bit descriptor connList con el valor de sock
 FD_SET (sock, &amp;connList);

 PDEBUG(&quot;INFO: Creamos la sala de chat general\n&quot;);
 bzero(rooms, DIM * sizeof(room));
 strcpy(rooms[0].name, &quot;general&quot;);
</pre>
<p>Creamos el multiplexor gracias al cual, apoyándonos en la función select(), seremos capaces de hacer escuchas de más de un descriptor de fichero ( en este caso sockets ) con un único proceso y sin tener que preocuparnos de hacer pulling.</p>
<pre class="brush: cpp;">//comenzamos a analizar conexiones
 PDEBUG(&quot;INFO: Comenzamos a analizar los sockets\n&quot;);
 while(1){
 // hacemos una copia de seguridad para asegurarnos de no perder los datos
 connListCopy = connList;
 // ¿Hay algún socket listo para leer?
 PDEBUG(&quot;INFO: ¿Hay algún socket listo para leer?\n&quot;);
 error = select(connTam + 1, &amp;connListCopy, NULL, NULL, NULL);
 //Comprobamos si ha ocurrido un error al ponernos a escuchar
 if(error &lt; 0){
 write(2, strcat(&quot;ERROR: al realizar la selección {{select()}}: %s\n&quot;
 , strerror(errno)), DIM);
 // terminamos la ejecución del programa
 exit(-1);
 }</pre>
<p>Llamamos a la función select(); para ver si hay algún descriptor de fichero listo para lectura ( también se puede ejecutar select(); para ver si hay algún descriptor de fichero listo para la escritura de datos en él, así como de otro tipo de descriptores, para más detalles visita la documentación de la función y de tu sistema operativo.</p>
<pre class="brush: cpp;">// recorriendo los sockets para ver los que están activos
 PDEBUG(&quot;INFO: recorriendo los sockets para ver los que están activos\n&quot;);
 int i = 0; // definimos un índice
 for (; i &lt;= connTam; i++){
 // este socket está preparado para leer los datos
 if(FD_ISSET(i, &amp;connListCopy)){
 // vemos si el socket preparado para leer es el de aceptar peticiones
 if(i == sock){
 PDEBUG(&quot;INFO: Nuevo cliente detectado, comprobando...\n&quot;);
 auxConn.sock = accept(sock, (struct sockaddr *) &amp;addr, &amp;length);
 if(auxConn.sock &lt; 0){
 write(2, &quot;ERROR: al realizar la aceptación {{accept()}}: %s\n&quot;
 , *strerror(errno));
 // terminamos la ejecución del programa
 exit(-1);
 }</pre>
<p>Para cada socket, comprobamos si éste es uno de los que están listos para ser leídos</p>
<pre class="brush: cpp;">/************************SSL*******************************/
 PDEBUG(&quot;INFO: Creando conexion ssl\n&quot;);
 PDEBUG(&quot;INFO: Creando conexion SSL\n&quot;);
 auxConn.ssl = SSL_new(ctx);
 PDEBUG(&quot;INFO: Asignando la conexión a SSL\n&quot;);
 SSL_set_fd(auxConn.ssl, auxConn.sock);
 PDEBUG(&quot;INFO: Aceptando la conexión SSL\n&quot;);
 error = SSL_accept(auxConn.ssl);
 if(error &lt; 0){
 ERR_print_errors_fp(stderr);
 exit(-1);
 }
 /************************SSL*******************************/

 PDEBUG(&quot;INFO: Conexión establecida, autenticando...\n&quot;);

 memset(&amp;auxMsj, 0, sizeof(auxMsj)); // incializamos la estructura

 PDEBUG(&quot;INFO: Solicitando autenticación\n&quot;);
 strcpy(auxMsj.text, &quot;Usuario: &quot;); // establecemos el texto que queremos que se muestre
 auxMsj.flag = REQ_TEXT;  // le indicamos que requerimos una respuesta con texto
 strcpy(auxMsj.name, SERVER); // nos identificamos como el servidor
 SSL_write(auxConn.ssl, &amp;auxMsj, sizeof(sms)); // enviamos la información

 // metemos los datos de la conexión en nuestro array de conexiones
 strcpy((*(conn + connPos)).name, auxMsj.text);
 (*(conn + connPos)).sock = auxConn.sock;
 (*(conn + connPos)).ssl = auxConn.ssl;
 (*(conn + connPos)).prov = PROV;

 // Añadimos el socket a nuestra lista
 PDEBUG(&quot;INFO: Insertando socket en la lista de monitoreo\n&quot;);
 FD_SET (auxConn.sock, &amp;connList);

 // como la peticion se ha aceptado incrementamos el contador de conexiones
 PDEBUG(&quot;INFO: Cálculo del nuevo offset\n&quot;);
 nextPos(conn, &amp;connPos, &amp;connTam, connGrow);</pre>
<p>Si el socket que está listo para la lectura es el que hemos creado al levantar el servidor, quiere decir que hay un cliente que quiere conectarse, por lo que aceptamos la petición, añadimos el socket del cliente a la lista de clientes y le enviamos un mensaje de bienvenida a través de SSL.</p>
<pre class="brush: cpp;">}else{ // si no, es un cliente ya registrado

 PDEBUG(&quot;DATA: Nuevo mensaje detectado\n&quot;);
 nbytes = SSL_read((*(conn+searchConn(conn, connTam, i))).ssl, &amp;auxMsj, sizeof(sms));
 if(nbytes &gt; 0){ // si hemos leido más d eun byte...

 switch(auxMsj.flag){

 case CLI_EXIT: // desconexión del cliente
 closeConn(conn, &amp;connPos, connTam, i, &amp;connList, db);
 break;
 case SERV_ADMIN: // parámetros que ha de ejecutr el servidor
 execParams(conn, connTam, auxMsj.text, i, sock, db, rooms, DIM);
 break;
 case MSJ:  // mensaje
 multicast(conn, &amp;connTam, auxMsj, i, db,
 (*(conn+searchConn(conn, connTam, i))).room);
 break;
 case REQ_AUTH: // vamos a leer el nombre de usuario
 auth(conn, &amp;connTam, i, auxMsj, db, rooms, DIM);
 break;
 case CHECK_ROOM: // vamos a leer el nombre de usuario
 roomCheckIn(conn, &amp;connTam, i, auxMsj, db, rooms, DIM);
 break;
 case CHECK_PASS:
 authPassword(conn, &amp;connTam, i, auxMsj, db, rooms, DIM);
 break;
 case MP:
 mp(conn, &amp;connTam, auxMsj, i, db);
 break;
 default:
 write(2, &quot;ERROR: Recibido un mensaje mal formado\n&quot;, 39);
 break;

 }</pre>
<p>Si el valor del descriptor no es el que se corresponde con el del socket del servidor, quiere decir que es un cliente el que nos está hablando, por lo que hemos de analizar que es lo que quiere hacer (en función del flag que nos haya llegado en el mensaje) y actuar en consecuencia.</p>
<pre class="brush: cpp;">}else{ // hemos detectado una desconexión por el cerrado de la conexión

 closeConn(conn, &amp;connPos, connTam, i, &amp;connList, db);

 }
 }
 }
 }
 }

 return 0;
}</pre>
<p>Por último, en caso de que recibamos un número inferior a 0 quiere decir que ha habido un error con la conexión por lo que el socket que estamos analizando se ha caído y podemos darlo de baja en nuestra lista de clientes activos.</p>
<blockquote class="info"><p>Recuerda que si quieres echarle un vistazo al código completo del chat (tanto cliente como servidor), puedes dirigirte al <a href="http://www.dipler.org/2010/06/%c2%bfcomo-funciona-un-chat/">primer artículo de la serie</a> de artículos que tratan el tema del chat.</p></blockquote>


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center">
<ul class="socials">
		<li class="shr-bitacoras">
			<a href="http://bitacoras.com/anotaciones/http://www.dipler.org/2010/06/crea-tu-propio-chat-servidor/" rel="nofollow" class="external" title="Enviar a Bitacoras">Enviar a Bitacoras</a>
		</li>
		<li class="shr-comfeed">
			<a href="http://www.dipler.org/2010/06/crea-tu-propio-chat-servidor/feed" rel="nofollow" class="external" title="&iquest;Quieres suscribirte a los comentarios de este Post?">&iquest;Quieres suscribirte a los comentarios de este Post?</a>
		</li>
		<li class="shr-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://www.dipler.org/2010/06/crea-tu-propio-chat-servidor/&amp;t=Crea+tu+propio+chat+-+Servidor" rel="nofollow" class="external" title="Compartir con Facebook">Compartir con Facebook</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.google.com/buzz/post?url=http://www.dipler.org/2010/06/crea-tu-propio-chat-servidor/&amp;imageurl=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-meneame">
			<a href="http://meneame.net/submit.php?url=http://www.dipler.org/2010/06/crea-tu-propio-chat-servidor/" rel="nofollow" class="external" title="Enviar a Meneame">Enviar a Meneame</a>
		</li>
		<li class="shr-technorati">
			<a href="http://technorati.com/faves?add=http://www.dipler.org/2010/06/crea-tu-propio-chat-servidor/" rel="nofollow" class="external" title="Compartir con Technorati">Compartir con Technorati</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=Crea+tu+propio+chat+-+Servidor+-+http://b2l.me/4smrp&amp;source=shareaholic" rel="nofollow" class="external" title="&iexcl;Comp&aacute;rtelo en Twitter!">&iexcl;Comp&aacute;rtelo en Twitter!</a>
		</li>
		<li class="shr-delicious">
			<a href="http://delicious.com/post?url=http://www.dipler.org/2010/06/crea-tu-propio-chat-servidor/&amp;title=Crea+tu+propio+chat+-+Servidor" rel="nofollow" class="external" title="Compartir con del.icio.us">Compartir con del.icio.us</a>
		</li>
		<li class="shr-googlereader">
			<a href="http://www.google.com/reader/link?url=http://www.dipler.org/2010/06/crea-tu-propio-chat-servidor/&amp;title=Crea+tu+propio+chat+-+Servidor&amp;srcUrl=http://www.dipler.org/2010/06/crea-tu-propio-chat-servidor/&amp;srcTitle=Crea+tu+propio+chat+-+Servidor&amp;snippet=Hasta%20ahora%20hemos%20estado%20hablando%20de%20funcionalidades%20gen%C3%A9ricas%20del%20chat%2C%20requisitos%2C%20...pues%20bien%20hoy%20vamos%20a%20analizar%20todos%20los%20ficheros%20de%20los%20que%20se%20compone%20el%20servidor%20y%20no%20han%20sido%20comentados%20con%20anterioridad%3B%20al%20igual%20que%20en%20el%20art%C3%ADculo%20anterior%2C%20vamos%20a%20comentar%20el%20cometido%20de%20cada%20una%20de%20l" rel="nofollow" class="external" title="A&ntilde;dirlo a Google Reader">A&ntilde;dirlo a Google Reader</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

<img src="http://www.dipler.org/?ak_action=api_record_view&id=1579&type=feed" alt="" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=NzFwqdw8Y88:QpOo73HYLzU:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=NzFwqdw8Y88:QpOo73HYLzU:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=NzFwqdw8Y88:QpOo73HYLzU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=NzFwqdw8Y88:QpOo73HYLzU:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=NzFwqdw8Y88:QpOo73HYLzU:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=NzFwqdw8Y88:QpOo73HYLzU:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Bitnbyte/~4/NzFwqdw8Y88" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dipler.org/2010/06/crea-tu-propio-chat-servidor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.dipler.org/2010/06/crea-tu-propio-chat-servidor/</feedburner:origLink></item>
		<item>
		<title>Crea tu propio chat – Funciones genéricas</title>
		<link>http://feedproxy.google.com/~r/Bitnbyte/~3/gn7lgSR6D-Q/</link>
		<comments>http://www.dipler.org/2010/06/construye-tu-propio-chat-funciones-genericas/#comments</comments>
		<pubDate>Thu, 17 Jun 2010 23:00:18 +0000</pubDate>
		<dc:creator>Alejandro Escario</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Producción propia]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.dipler.org/?p=1576</guid>
		<description><![CDATA[Llevamos unos días comentando las características que ha de tener un chat y de cuales son las estructuras básicas en las que podríamos basarnos para crear nuestro propio chat, pues bien, en este artículo vamos a comentar las funciones auxiliares de las que tendremos que hacer uso en un momento u otro en un chat [...]]]></description>
			<content:encoded><![CDATA[<p>Llevamos unos días comentando las<a href="http://www.dipler.org/2010/06/%C2%BFcomo-funciona-un-chat/"> características que ha de tener un chat</a> y de cuales son <a href="http://www.dipler.org/2010/06/contruye-tu-propio-chat-estructuras-y-definiciones/">las estructuras básicas</a> en las que podríamos basarnos para crear nuestro propio chat, pues bien, en este artículo vamos a comentar las funciones auxiliares de las que tendremos que hacer uso en un momento u otro en un chat que cumpla una serie de mínimos.</p>
<p>A diferencia de lo que hemos hecho en el artículo anterior, en este, no vamos a comentar el código a menos que se vea necesario y que sea difícil de entender sin una mínima explicación, sino que vamos a analizar las funciones de cada uno de los ficheros de código fuente de funciones auxiliares.</p>
<h1>type.c</h1>
<p>En este archivo nos encontramos con una serie de funciones que nos permitirán tratar fácilmente tipos de datos como enteros, strings,&#8230; quizá el nombre del archivo no sea el más adecuado, pero es lo que hay.</p>
<pre class="brush: cpp;">int isNum(char[]);</pre>
<p>Ésta es una de las funciones más sencillas y a la vez más útiles de las que podemos encontrarnos, y si bien es bastante probable que la implementación no sea ninguna maravilla, funciona, que para el caso es lo que nos importa, y su cometido principal es determinar si el String que se le pasa como argumento es un número entero o no lo es.</p>
<pre class="brush: cpp;">char* ltrim(char*);

char* rtrim(char*);

char* trim(char*);</pre>
<p>Estas tres funciones las vamos a comentar juntas, ya que su cometido es muy similar, y es que la primera elimina los espacios en blanco sobrantes a la izquierda del array de caracteres que se le pasa por argumento, la segunda hace lo propio pero por la derecha, y la tercera función llama a las dos anteriormente definidas para, eliminar los espacios en blanco sobrantes a ambos lados de la cadena que se le pasa como argumento.</p>
<pre class="brush: cpp;">int addslahses(char*, int, char*);</pre>
<p>Esta función es una burda imitación del addslashes de PHP y otros lenguajes para escapar una serie de caracteres antes de almacenar los datos en la base de datos. En este caso concreto la función sólo escapa el carácter de &#8220;comilla simple&#8221; (<strong>&#8216;</strong>). Es una función que debería ser mejorada.</p>
<pre class="brush: cpp;">void md5_sum(unsigned char*, int, int, char*);</pre>
<p>Por último en este archivo tenemos una función muy interesante, y es que es una función que dado un array de caracteres, es capaz de calcular su suma MD5, algo muy útil para comprobar que los datos transmitidos no han sido corrompidos o, simplemente para crear un sencillo sistema de cifrado de contraseñas en la base de datos y que no puede ser descifrado.</p>
<h1>tools.c</h1>
<p>En este archivo se definen una serie de funciones que nos servirán para tratar con la consola o bash desde la que ejecutamos nuestro programa.</p>
<pre class="brush: cpp;">void echo_on(void);</pre>
<p>Esta función habilita el echo por pantalla de todo aquello que tecleemos en la pantalla.</p>
<pre class="brush: cpp;">void echo_off(void);</pre>
<p>A la inversa que la función descrita anteriormente, ésta se encarga de hacer que lo que se teclee en la bash justo después de haber sido llamada, no se haga echo por pantalla.</p>
<pre class="brush: cpp;">void make_daemon(void);</pre>
<p>Por último tenemos una función bastante útil y que nos va a permitir desligar el programa en ejecución de la consola y hacer que se ejecute como un demonio según el concepto Unix.</p>
<blockquote class="info"><p>Recuerda que si quieres echarle un vistazo al código completo del chat (tanto cliente como servidor), puedes dirigirte al <a href="http://www.dipler.org/2010/06/%c2%bfcomo-funciona-un-chat/">primer artículo de la serie</a> de artículos que tratan el tema del chat.</p></blockquote>


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center">
<ul class="socials">
		<li class="shr-bitacoras">
			<a href="http://bitacoras.com/anotaciones/http://www.dipler.org/2010/06/construye-tu-propio-chat-funciones-genericas/" rel="nofollow" class="external" title="Enviar a Bitacoras">Enviar a Bitacoras</a>
		</li>
		<li class="shr-comfeed">
			<a href="http://www.dipler.org/2010/06/construye-tu-propio-chat-funciones-genericas/feed" rel="nofollow" class="external" title="&iquest;Quieres suscribirte a los comentarios de este Post?">&iquest;Quieres suscribirte a los comentarios de este Post?</a>
		</li>
		<li class="shr-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://www.dipler.org/2010/06/construye-tu-propio-chat-funciones-genericas/&amp;t=Crea+tu+propio+chat+-+Funciones+gen%C3%A9ricas" rel="nofollow" class="external" title="Compartir con Facebook">Compartir con Facebook</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.google.com/buzz/post?url=http://www.dipler.org/2010/06/construye-tu-propio-chat-funciones-genericas/&amp;imageurl=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-meneame">
			<a href="http://meneame.net/submit.php?url=http://www.dipler.org/2010/06/construye-tu-propio-chat-funciones-genericas/" rel="nofollow" class="external" title="Enviar a Meneame">Enviar a Meneame</a>
		</li>
		<li class="shr-technorati">
			<a href="http://technorati.com/faves?add=http://www.dipler.org/2010/06/construye-tu-propio-chat-funciones-genericas/" rel="nofollow" class="external" title="Compartir con Technorati">Compartir con Technorati</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=Crea+tu+propio+chat+-+Funciones+gen%C3%A9ricas+-+http://b2l.me/4g8q8&amp;source=shareaholic" rel="nofollow" class="external" title="&iexcl;Comp&aacute;rtelo en Twitter!">&iexcl;Comp&aacute;rtelo en Twitter!</a>
		</li>
		<li class="shr-delicious">
			<a href="http://delicious.com/post?url=http://www.dipler.org/2010/06/construye-tu-propio-chat-funciones-genericas/&amp;title=Crea+tu+propio+chat+-+Funciones+gen%C3%A9ricas" rel="nofollow" class="external" title="Compartir con del.icio.us">Compartir con del.icio.us</a>
		</li>
		<li class="shr-googlereader">
			<a href="http://www.google.com/reader/link?url=http://www.dipler.org/2010/06/construye-tu-propio-chat-funciones-genericas/&amp;title=Crea+tu+propio+chat+-+Funciones+gen%C3%A9ricas&amp;srcUrl=http://www.dipler.org/2010/06/construye-tu-propio-chat-funciones-genericas/&amp;srcTitle=Crea+tu+propio+chat+-+Funciones+gen%C3%A9ricas&amp;snippet=Llevamos%20unos%20d%C3%ADas%20comentando%20las%20caracter%C3%ADsticas%20que%20ha%20de%20tener%20un%20chat%20y%20de%20cuales%20son%20las%20estructuras%20b%C3%A1sicas%20en%20las%20que%20podr%C3%ADamos%20basarnos%20para%20crear%20nuestro%20propio%20chat%2C%20pues%20bien%2C%20en%20este%20art%C3%ADculo%20vamos%20a%20comentar%20las%20funciones%20auxiliares%20de%20las%20que%20tendremos%20que%20hacer%20uso%20en%20un%20momento%20" rel="nofollow" class="external" title="A&ntilde;dirlo a Google Reader">A&ntilde;dirlo a Google Reader</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

<img src="http://www.dipler.org/?ak_action=api_record_view&id=1576&type=feed" alt="" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=gn7lgSR6D-Q:p1MCIX0-KKU:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=gn7lgSR6D-Q:p1MCIX0-KKU:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=gn7lgSR6D-Q:p1MCIX0-KKU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=gn7lgSR6D-Q:p1MCIX0-KKU:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=gn7lgSR6D-Q:p1MCIX0-KKU:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=gn7lgSR6D-Q:p1MCIX0-KKU:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Bitnbyte/~4/gn7lgSR6D-Q" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dipler.org/2010/06/construye-tu-propio-chat-funciones-genericas/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.dipler.org/2010/06/construye-tu-propio-chat-funciones-genericas/</feedburner:origLink></item>
		<item>
		<title>Crea tu propio chat – Estructuras y definiciones</title>
		<link>http://feedproxy.google.com/~r/Bitnbyte/~3/X-_tilK4Plo/</link>
		<comments>http://www.dipler.org/2010/06/contruye-tu-propio-chat-estructuras-y-definiciones/#comments</comments>
		<pubDate>Wed, 16 Jun 2010 23:00:31 +0000</pubDate>
		<dc:creator>Alejandro Escario</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Producción propia]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.dipler.org/?p=1573</guid>
		<description><![CDATA[Para continuar con la serie de artículos de como crear un pequeño chat, vamos a analizar ahora los archivos de cabecera que no están, por unas razones u otras, asociados con ningún archivo *.c; para cada uno de ellos analizaremos el porqué de su existencia y demás temas. Dado que en el artículo anterior hemos [...]]]></description>
			<content:encoded><![CDATA[<p>Para continuar con la serie de artículos de como crear un pequeño chat, vamos a analizar ahora los archivos de cabecera que no están, por unas razones u otras, asociados con ningún archivo *.c; para cada uno de ellos analizaremos el porqué de su existencia y demás temas.</p>
<p>Dado que en el artículo anterior hemos explicado como hacer que un archivo de cabecera sólo se añada una vez en nuestro proyecto (evitando posibles errores de redefiniciones, &#8230;), en este artículo vamos a obviar esas partes en la explicación de  los archivos de código fuente.</p>
<h1>Código &#8211; flags.h:</h1>
<p>Éste es un fichero en el que no hay código, no tienen nada especial para explicar, lo único digno de mención de este fichero es que, gracias a él, seremos capaces de identificar fácilmente los tipos de mensajes, clientes,&#8230;</p>
<h1>Código &#8211; socket.h:</h1>
<p>Este archivo sí que tiene un poco más de &#8220;chicha&#8221; como quien dice, en este archivo de cabecera se describen, además de una serie de constantes para identificar el tipo de usuario, el tamaño de algunos campos y variables, se definen una serie de nuevos tipos de datos, el tipo de datos <strong>user</strong> y el tipo de datos <strong>room</strong>.</p>
<pre class="brush: cpp;">

typedef struct usr{
 char name[NAME_LEN];    // nombre del usuario asociado al socket
 int sock;               // información referente al socket de conexión
 SSL *ssl;
 int prov;               // Flag que indica si es provisional o no la conexión
 int rol;                // flag que nos indicará el rol que le hemos asignado
 int room;               // número de la sala a la que está conectado
 }user;
</pre>
<p>En esta estructura almacenaremos el nombre del usuario asociado a un determinado socket, el socket en cuestión, un objeto de dato que nos permitirá hacer uso de métodos para la comunicación mediante SSL, el indicador de si el usuario se ha identificado, el rol que éste tiene y en qué sala de chat se encuentra.</p>
<pre class="brush: cpp;">

typedef struct r{
 char name[DIM];
 }room;
</pre>
<p>Nos encontramos ante un nuevo, pequeño y extensible tipo de datos, y es que gracias a él podemos mantener un registro de las salas de chat activas.</p>
<p>Cabe mencionar que si bien podría ser interesante haber declarado el objeto directamente con un</p>
<pre class="brush: cpp;">typedef char name[DIM] room;</pre>
<p>se ha hecho así para permitir posibles extensiones de la estructura.</p>
<h1>Código &#8211; sms.h:</h1>
<p>Por último vamos a analizar el contenido de sms.h. Este archivo contiene la definición de una de la estructura que es crucial para el desarrollo del chat, y es que es la estructura que se va utilizar para transmitir entre el cliente y el servidor y viceversa los mensajes.</p>
<pre class="brush: cpp;">

typedef struct message{
 char text[SMS_LEN];     //mensaje
 time_t time;            //hora del mensaje
 char name[NAME_LEN];    //nombre del que envía el mensaje
 char to[NAME_LEN];       // nombre del destinatario
 int flag;               // flags para comunicar acciones a reaizar
 }sms;
</pre>
<p>Como puede verse fácilmente, en esta estructura se envía el contenido del mensaje, la fecha y hora en la que se envía el mensaje, el nombre del usuario que envía el mensaje, el nombre del destinatario del mensaje, en caso de que este sea un mensaje privado y un campo <strong>flag</strong> con el que seremos capaces de indicar que tipo de mensaje es el que se está transmitiendo, esto nos servirá por ejemplo para utilizar la misma estructura para hablar con varios usuarios, un único usuario o incluso directamente con el servidor.</p>
<blockquote class="info"><p>Recuerda que si quieres echarle un vistazo al código completo del chat (tanto cliente como servidor), puedes dirigirte al <a href="http://www.dipler.org/2010/06/%c2%bfcomo-funciona-un-chat/">primer artículo de la serie</a> de artículos que tratan el tema del chat.</p></blockquote>


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center">
<ul class="socials">
		<li class="shr-bitacoras">
			<a href="http://bitacoras.com/anotaciones/http://www.dipler.org/2010/06/contruye-tu-propio-chat-estructuras-y-definiciones/" rel="nofollow" class="external" title="Enviar a Bitacoras">Enviar a Bitacoras</a>
		</li>
		<li class="shr-comfeed">
			<a href="http://www.dipler.org/2010/06/contruye-tu-propio-chat-estructuras-y-definiciones/feed" rel="nofollow" class="external" title="&iquest;Quieres suscribirte a los comentarios de este Post?">&iquest;Quieres suscribirte a los comentarios de este Post?</a>
		</li>
		<li class="shr-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://www.dipler.org/2010/06/contruye-tu-propio-chat-estructuras-y-definiciones/&amp;t=Crea+tu+propio+chat+-+Estructuras+y+definiciones" rel="nofollow" class="external" title="Compartir con Facebook">Compartir con Facebook</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.google.com/buzz/post?url=http://www.dipler.org/2010/06/contruye-tu-propio-chat-estructuras-y-definiciones/&amp;imageurl=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-meneame">
			<a href="http://meneame.net/submit.php?url=http://www.dipler.org/2010/06/contruye-tu-propio-chat-estructuras-y-definiciones/" rel="nofollow" class="external" title="Enviar a Meneame">Enviar a Meneame</a>
		</li>
		<li class="shr-technorati">
			<a href="http://technorati.com/faves?add=http://www.dipler.org/2010/06/contruye-tu-propio-chat-estructuras-y-definiciones/" rel="nofollow" class="external" title="Compartir con Technorati">Compartir con Technorati</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=Crea+tu+propio+chat+-+Estructuras+y+definiciones+-+http://b2l.me/382fr&amp;source=shareaholic" rel="nofollow" class="external" title="&iexcl;Comp&aacute;rtelo en Twitter!">&iexcl;Comp&aacute;rtelo en Twitter!</a>
		</li>
		<li class="shr-delicious">
			<a href="http://delicious.com/post?url=http://www.dipler.org/2010/06/contruye-tu-propio-chat-estructuras-y-definiciones/&amp;title=Crea+tu+propio+chat+-+Estructuras+y+definiciones" rel="nofollow" class="external" title="Compartir con del.icio.us">Compartir con del.icio.us</a>
		</li>
		<li class="shr-googlereader">
			<a href="http://www.google.com/reader/link?url=http://www.dipler.org/2010/06/contruye-tu-propio-chat-estructuras-y-definiciones/&amp;title=Crea+tu+propio+chat+-+Estructuras+y+definiciones&amp;srcUrl=http://www.dipler.org/2010/06/contruye-tu-propio-chat-estructuras-y-definiciones/&amp;srcTitle=Crea+tu+propio+chat+-+Estructuras+y+definiciones&amp;snippet=Para%20continuar%20con%20la%20serie%20de%20art%C3%ADculos%20de%20como%20crear%20un%20peque%C3%B1o%20chat%2C%20vamos%20a%20analizar%20ahora%20los%20archivos%20de%20cabecera%20que%20no%20est%C3%A1n%2C%20por%20unas%20razones%20u%20otras%2C%20asociados%20con%20ning%C3%BAn%20archivo%20%2A.c%3B%20para%20cada%20uno%20de%20ellos%20analizaremos%20el%20porqu%C3%A9%20de%20su%20existencia%20y%20dem%C3%A1s%20temas.%0D%0A%0D%0ADado%20que%20en%20el%20art%C3" rel="nofollow" class="external" title="A&ntilde;dirlo a Google Reader">A&ntilde;dirlo a Google Reader</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

<img src="http://www.dipler.org/?ak_action=api_record_view&id=1573&type=feed" alt="" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=X-_tilK4Plo:P_w2byZxDiw:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=X-_tilK4Plo:P_w2byZxDiw:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=X-_tilK4Plo:P_w2byZxDiw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=X-_tilK4Plo:P_w2byZxDiw:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=X-_tilK4Plo:P_w2byZxDiw:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=X-_tilK4Plo:P_w2byZxDiw:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Bitnbyte/~4/X-_tilK4Plo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dipler.org/2010/06/contruye-tu-propio-chat-estructuras-y-definiciones/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.dipler.org/2010/06/contruye-tu-propio-chat-estructuras-y-definiciones/</feedburner:origLink></item>
		<item>
		<title>Crea tu propio chat – Log</title>
		<link>http://feedproxy.google.com/~r/Bitnbyte/~3/Njpt9j6Xgjg/</link>
		<comments>http://www.dipler.org/2010/06/1563/#comments</comments>
		<pubDate>Tue, 15 Jun 2010 23:00:29 +0000</pubDate>
		<dc:creator>Alejandro Escario</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Producción propia]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.dipler.org/?p=1563</guid>
		<description><![CDATA[Como hemos comenzado a hacer en el artículo anterior, vamos a continuar comentando los ficheros que lo componen uno a uno, en este artículo vamos a comentar el fichero trace.h, éste es un archivo de cabecera que define una serie de macros muy simples que nos permitirán, en tiempo de compilación determinar cuál será el [...]]]></description>
			<content:encoded><![CDATA[<p>Como hemos comenzado a hacer<a href="http://www.dipler.org/2010/06/%c2%bfcomo-funciona-un-chat/"> en el artículo anterior</a>, vamos a continuar comentando los ficheros que lo componen uno a uno, en este artículo vamos a comentar el fichero trace.h, éste es un archivo de cabecera que define una serie de macros muy simples que nos permitirán, en tiempo de compilación determinar cuál será el comportamiento de log en cada momento.</p>
<p>En este caso la macro definida tiene tres posibles comportamientos:</p>
<ul>
<li>No hacer nada.</li>
<li>Imprimir por la salida estándar el mensaje especificado.</li>
<li>Imprimir en el mensaje en cuestión en el log del sistema para poder tener constancia de qué está pasando en cada momento en el chat</li>
</ul>
<h1>Código &#8211; trace.h:</h1>
<pre class="brush: cpp;">

#ifndef __TRACE_H
 #define __TRACE_H
</pre>
<p>Éste es un archivo de cabecera, por lo que sólo nos interesa incluirlo una vez en nuestro proyecto, para ello comprobamos si una constante ha sido previamente definida, en este caso esa constante se llama <strong>__TRACE_H</strong>, si esta está definida previamente, no hacemos nada, mientras que si no lo está, procedemos a definirla e incluir los datos de la cabecera.</p>
<pre class="brush: cpp;">

#ifndef DEBUG
 #define DEBUG 0
 #endif // DEBUG defined
</pre>
<p>Dado que para determinar el comportamiento de nuestra macro hemos de tener definida la constante <strong>DEBUG</strong>, comprobamos si está definida, y si no, le damos un valor cualquiera en este caso, un valor para que las macros se sustituyan por un &#8220;<strong>;</strong>&#8220;, es decir que tengan un comportamiento nulo.</p>
<pre class="brush: cpp;">

#if DEBUG == 1
 // librería para el uso de primitivas unix
 #include &lt;unistd.h&gt;

 /**
 * PDEBUG(x)
 * x string
 */

 #define PDEBUG(x) \
 printf(&quot;%s&quot;, x); \
 sync();
</pre>
<p>En el caso de que la variable <strong>DEBUG</strong> valga <strong>1</strong>, lo que haremos es imprimir por la salida estándar los mensajes de log, esto es especialmente útil para tener constancia durante el desarrollo de qué es lo que está ocurriendo en cada instante de la ejecución.</p>
<p>La función <strong>sync();</strong> se encarga de limpiar los bufferes y escribir el contenido de forma definitiva el contenido en el dispositivo en cuestión. <strong>OJO</strong> al utilizar esta función, hace que también se sincronice el contenido de los discos duros, lo que puede hacer que simplemente, nos carguemos las cabeceras del mismo.</p>
<pre class="brush: cpp;">

#elif DEBUG == 2
 #include &lt;syslog.h&gt;

 /**
 * PDEBUG(x)
 * x string
 */
 // cat /var/log/syslog
 #define PDEBUG(x) \
 syslog(LOG_DEBUG, &quot;%s&quot;, x);
</pre>
<p>En el caso de que <strong>DEBUG</strong> tenga un valor igual a <strong>2</strong>,  vamos a imprimir el contenido de la macro en el log del sistema con la función <strong>syslog();</strong></p>
<pre class="brush: cpp;">
 #else
 #define PDEBUG(x) ;
 #endif    // DEBUG == 1
#endif    // __TRACE_H
</pre>
<p>Y por último definimos el comportamiento por defecto de la macro, que es vaciarlo todo.</p>
<blockquote class="info"><p>Recuerda que si quieres echarle un vistazo al código completo del chat (tanto cliente como servidor), puedes dirigirte al <a href="http://www.dipler.org/2010/06/%c2%bfcomo-funciona-un-chat/">primer artículo de la serie</a> de artículos que tratan el tema del chat.</p></blockquote>


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center">
<ul class="socials">
		<li class="shr-bitacoras">
			<a href="http://bitacoras.com/anotaciones/http://www.dipler.org/2010/06/1563/" rel="nofollow" class="external" title="Enviar a Bitacoras">Enviar a Bitacoras</a>
		</li>
		<li class="shr-comfeed">
			<a href="http://www.dipler.org/2010/06/1563/feed" rel="nofollow" class="external" title="&iquest;Quieres suscribirte a los comentarios de este Post?">&iquest;Quieres suscribirte a los comentarios de este Post?</a>
		</li>
		<li class="shr-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://www.dipler.org/2010/06/1563/&amp;t=Crea+tu+propio+chat+-+Log" rel="nofollow" class="external" title="Compartir con Facebook">Compartir con Facebook</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.google.com/buzz/post?url=http://www.dipler.org/2010/06/1563/&amp;imageurl=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-meneame">
			<a href="http://meneame.net/submit.php?url=http://www.dipler.org/2010/06/1563/" rel="nofollow" class="external" title="Enviar a Meneame">Enviar a Meneame</a>
		</li>
		<li class="shr-technorati">
			<a href="http://technorati.com/faves?add=http://www.dipler.org/2010/06/1563/" rel="nofollow" class="external" title="Compartir con Technorati">Compartir con Technorati</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=Crea+tu+propio+chat+-+Log+-+http://b2l.me/3ztbt&amp;source=shareaholic" rel="nofollow" class="external" title="&iexcl;Comp&aacute;rtelo en Twitter!">&iexcl;Comp&aacute;rtelo en Twitter!</a>
		</li>
		<li class="shr-delicious">
			<a href="http://delicious.com/post?url=http://www.dipler.org/2010/06/1563/&amp;title=Crea+tu+propio+chat+-+Log" rel="nofollow" class="external" title="Compartir con del.icio.us">Compartir con del.icio.us</a>
		</li>
		<li class="shr-googlereader">
			<a href="http://www.google.com/reader/link?url=http://www.dipler.org/2010/06/1563/&amp;title=Crea+tu+propio+chat+-+Log&amp;srcUrl=http://www.dipler.org/2010/06/1563/&amp;srcTitle=Crea+tu+propio+chat+-+Log&amp;snippet=Como%20hemos%20comenzado%20a%20hacer%20en%20el%20art%C3%ADculo%20anterior%2C%20vamos%20a%20continuar%20comentando%20los%20ficheros%20que%20lo%20componen%20uno%20a%20uno%2C%20en%20este%20art%C3%ADculo%20vamos%20a%20comentar%20el%20fichero%20trace.h%2C%20%C3%A9ste%20es%20un%20archivo%20de%20cabecera%20que%20define%20una%20serie%20de%20macros%20muy%20simples%20que%20nos%20permitir%C3%A1n%2C%20en%20tiempo%20de%20compilaci%C3%B3n" rel="nofollow" class="external" title="A&ntilde;dirlo a Google Reader">A&ntilde;dirlo a Google Reader</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

<img src="http://www.dipler.org/?ak_action=api_record_view&id=1563&type=feed" alt="" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=Njpt9j6Xgjg:tK09x_kE_XU:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=Njpt9j6Xgjg:tK09x_kE_XU:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=Njpt9j6Xgjg:tK09x_kE_XU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=Njpt9j6Xgjg:tK09x_kE_XU:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=Njpt9j6Xgjg:tK09x_kE_XU:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=Njpt9j6Xgjg:tK09x_kE_XU:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Bitnbyte/~4/Njpt9j6Xgjg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dipler.org/2010/06/1563/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.dipler.org/2010/06/1563/</feedburner:origLink></item>
		<item>
		<title>Crea tu propio chat – Especificación</title>
		<link>http://feedproxy.google.com/~r/Bitnbyte/~3/VFs3bR8k7AU/</link>
		<comments>http://www.dipler.org/2010/06/construye-tu-propio-chat-especificacion/#comments</comments>
		<pubDate>Mon, 14 Jun 2010 23:00:47 +0000</pubDate>
		<dc:creator>Alejandro Escario</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Producción propia]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.dipler.org/?p=1557</guid>
		<description><![CDATA[Continuando con la serie de artículos con los que vamos a explicar como hacer un chat muy simple, vamos a comenzar, con este artículo como el primero a comentar el contenido de cada uno de los archivos que hemos visto en el artículo anterior (Construye tu propio chat – Estructura). En este artículo vamos a [...]]]></description>
			<content:encoded><![CDATA[<p>Continuando con la serie de artículos con los que vamos a explicar como hacer un chat muy simple, vamos a comenzar, con este artículo como el primero a comentar el contenido de cada uno de los archivos que hemos visto en el artículo anterior (<a href="../2010/06/construye-tu-propio-chat-estructura/">Construye  tu propio chat – Estructura</a>).</p>
<p>En este artículo vamos a comentar el contenido de los ficheros de especificación y compilación del programa:</p>
<h1>README:</h1>
<p>Archivo en el que se especifica el funcionamiento del chat a grandes rasgos y comentando todas las funcionalidades del mismo.</p>
<blockquote><p>El objetivo de este programa consite en el desarrollo de un chat mediante el uso de sockets<br />
de internet TCP, por lo que en este caso seremos capaces de comunicarnos mediante<br />
una conexión fiable entre el cliente y el servidor, siendo en este caso el cliente<br />
un cliente múltiple que deberá recibir la información correspondiente a los mensajes<br />
que han enviado el resto de clientes.</p>
<p>MANUAL DE USO<span id="more-1557"></span></p>
<p>CLIENTE</p>
<p>El cliente es un programa que tras ejecutarlo, nos permite escribir<br />
mensajes y al cliente, los cuales, dependiendo de la sintaxis utilizada<br />
se comportarán en el mismo de una u otra manera, por ejemplo, si escibimos<br />
un mensaje cualquiera, se enviará el mensaje como un mensaje de texto<br />
normal, es decir que deseamos que se envíe al resto de usuarios del chat,<br />
por contra si se escribe uno de los comandos en ejecución se ejecutará<br />
la acción correspondiente y descrita en las siguientes lineas.</p>
<p>Al mismo tiempo, mientras el proceso nos permite enviarle mensajes al<br />
servidor, éste está leyendo constantemente los datos que le llegan desde<br />
el servidor.</p>
<p>Para ejecutar el cliente basta con ejecutar en consola:</p>
<p>./cli5</p>
<p>Si por el contrario deseamos ejecutar el cliente con una interfaz<br />
gráfica, basta con ejecutar, para ejecutarlo hace falta la máquina<br />
virtual java.</p>
<p>./interfaz</p>
<p>Cuando un usuario se conecte, se le mostrarán los nombres de las diferentes<br />
salas a las que puede acceder con cadenas de la siguiente manera</p>
<p>&#8211; %s &#8211;</p>
<p>Siendo %s, el nombre de la sala, una vez que sepamos a que sala deseamos<br />
conectarnos, tendremos que escribir el nombre de la sala tal cual aparece,<br />
es decir el equivalente a %s</p>
<p>FLAGS</p>
<p>-p indica el puerto por el que nos conectaremos con el servidor</p>
<p>./cli5 -p 12345</p>
<p>-d indica la dirección por la que nos conectaremos con el servidor</p>
<p>./cli5 -d localhost</p>
<p>-cert indica la ruta del certificado a utilizar para conectarse con<br />
el servidor<br />
./cli5 -cert /usr/share/doc/libssl-dev/demos/sign/cert.pem</p>
<p>COMANDOS EN EJECUCIÓN</p>
<p>-x comando aplicable en cualquier momento, es el único comando aplicable<br />
en el proceso de autenticación.</p>
<p>-x # cierra el cliente</p>
<p>&#8211;serv lo que se esciba en el siguiente comando, se le envia directamente<br />
al servidor</p>
<p>&#8211;serv # nos indica que ahora estamos hablando con el servidor<br />
-x # le enviamos el comando -x al servidor</p>
<p>Para salir del modo de conversación con el servidor (modo durante<br />
el cual no se recibirán los mensajes enviados por el chat) habremos<br />
de escribir &#8216;exit&#8217;, y volveremos al modo de chat tradicional.</p>
<p>SERVIDOR</p>
<p>El servidor es un programa que es capaz de interactuar n clientes, de<br />
manera que estos se conectan a él y este retransmite la información.</p>
<p>Su uso es muy sencillo, ya que una vez ejecutado, podemos olvidarnos de<br />
él, de hecho en el caso de que deseemos ejecutar un comando en ejecución,<br />
hemos de, cargar un cliente y mediante el previo uso del comando<br />
&#8211;serv, enviarle uno de los comandos permitidos durante la ejecución<br />
y cuyo comportamiento se detalla a continuación.</p>
<p>En el caso de que al ejecutar el servidor, no se encuentre el fichero con<br />
la base de datos, se creará uno y se solicitarán las credenciales del<br />
administrador en el servidor, tras esto, todo se hará desde el cliente.</p>
<p>Al conectarse con el servidor, y escoger un nombre, si este no está en la<br />
base de datos, el usuario se conectará como invitado, pudiendo sólo<br />
enviar mensajes, si por el contrario el usuario está registrado, se le<br />
solicitará la contraseña y tendrá el rol asignado en la base de datos</p>
<p>Si al ejecutar el cliente nos dice que la base de datos no existe, el<br />
proceso terminará con un error (-1), por lo que deberemos crear dicha<br />
base de datos ejecutando &#8216;./createdb nombre de la base de datos&#8217;.</p>
<p>ROLES<br />
GUEST &#8211; invitado, sólo puede enviar mensajes y a su nombre se le<br />
concaternará la cadena de texto &#8216;-guest&#8217;</p>
<p>USER &#8211; usuario, sólo puede enviar mensajes</p>
<p>ADMIN &#8211; administrador, además de enviar mensajes, es capaz de enviarle<br />
comandos al servidor</p>
<p>FLAGS</p>
<p>-p indica el puerto por la que habrán de conectarse los clientes</p>
<p>./serv5 -p 12345</p>
<p>-ls indica el tamaño inicial de la lista de clientes</p>
<p>./serv5 -ls 100</p>
<p>-lg indica el factor de crecimiento de la cola</p>
<p>./serv5 -lg 10</p>
<p>-db indica el nombre de la base de datos con la que se va a interactuar</p>
<p>./serv5 -db chat.db</p>
<p>-cert indica la ruta del certificado a utilizar para conectarse con<br />
el servidor<br />
./serv5 -cert cert</p>
<p>-pkey indica la ruta de la clave privada de la que hará uso el servidor</p>
<p>./serv5 -pkey pkey</p>
<p>COMANDOS EN EJECUCIÓN estos comandos vienen desde el cliente, sólo será<br />
capaz de comunicarse con el servidor aquellos usuarios que tengan el<br />
rango de administrador.</p>
<p>-x cierra el servidor</p>
<p>&#8211;add-user name password [rol]<br />
Este comando, creará un usuario con nombre &#8216;name&#8217;, contraseña<br />
&#8216;password&#8217; y el rol indicado, por ahora se admiten los roles de<br />
&#8216;admin&#8217; y &#8216;user&#8217;, en caso de no especificar el campo rol, el<br />
usuario creado le srá asignado el rol &#8216;user&#8217;. No se podrán<br />
crear dos usuarios con el mismo nombre.</p>
<p>&#8211;delete-user name<br />
Este comando borra el usuario cuyo nombre coincida con el valor<br />
&#8216;name&#8217;</p>
<p>&#8211;list-user<br />
Este comando lista todos los usuarios registrados en el chat</p>
<p>&#8211;log<br />
Este comando imprime todas las ocurrencias del log si no se le<br />
pasan parámetros</p>
<p>Se le pueden pasar dos parámetros, fecha de inicio y fecha de fin</p>
<p>&#8211;log dd/mm/YYYY dd/mm/YYYY</p>
<p>en cuyo caso se listarán sólo los log entre dos fechas</p>
<p>&#8211;mp [nombre]<br />
Este comando le envía un mensaje privado al usuario llamado nombre,<br />
el mensaje se escribirá después de haber pulsado intro después<br />
de esta cadena.</p>
<p>&#8211;mp admin<br />
mensaje para el administrador</p>
<p>Le envia un mensaje privado al administrador cuyo contenido es<br />
&#8216;mensaje para el administrador&#8217;</p>
<p>&#8211;add-room [nombre]<br />
Este comando añade una nueva sala de chat llamada [nombre]</p>
<p>&#8211;list-room<br />
Este comando lista todas las salas de chat</p>
<p>&#8211;delete-room [nombre]<br />
Este comando borra una sala de chat llamada [nombre] y mueve los<br />
usuarios que se encontraban en esta a la sala general</p>
<p>CREATEDB</p>
<p>Proceso que crea la base de datos con un usuario administrador.</p>
<p>Sólo admite un parámetro que es obligatorio y que tiene el nombre de<br />
la base de datos a crear, es aconsejable llamar a la base de datos<br />
chat.db ya que es el nombre por defecto de la base de datos a la que<br />
intenta conectarse el servidor</p>
<p>./createDB chat.db</p></blockquote>
<h1>INSTALL:</h1>
<p>En este fichero comentamos los requisitos mínimos para poder compilar y ejecutar el chat, así como la metodología para compilarlo.</p>
<blockquote><p>REQUISITOS<br />
libssl-dev<br />
libsqlite3-dev</p>
<p>máquina virtual java para ejecutar la interfaz, hay que dejar claro que no es obligatoria<br />
para el funcionamiento básico de la práctica</p>
<p>INSTALACION<br />
Para compilar los fuentes en los que se entrega el código fuente,<br />
basta con ejecutar desde consola el comando &#8216;make&#8217;, el cual ejecutará<br />
por nosotros:</p>
<p>gcc -lpthread -ldl -lssl -lcrypto -lsqlite3 -Wall -o serv5 serv5.c servFunctions.c database.c type.c tools.c<br />
gcc -Wall -o cli5 cli5.c type.c tools.c<br />
gcc -lpthread -ldl -lssl -lcrypto -lsqlite3 -Wall -o createDB createDB.c database.c tools.c type.c<br />
gcc -Wall -o interfaz interfaz.c type.c</p>
<p>Compilando por nosotros los programas cliente (cli5) y servidor<br />
(serv5)</p></blockquote>
<h1>ARCHITECTURE:</h1>
<p>Éste es un fichero en el que especificaremos la estructura de nuestro programa, orientado sobre todo a gente que tenga un poco de conocimiento a la estructura de capas y comentando de manera superficial el funcionamiento de las cosas.</p>
<blockquote><p>***********<br />
** CAPAS **<br />
***********<br />
En estas primeras entregas, nuestra aplicación consta de 2 capas, una de<br />
presentación y una lógica, correspodiéndose la capa lógica con el servidor y la<br />
capa de presentación de la aplicación cliente.</p>
<p>CLIENTE</p>
<p>El cliente, se encarga de, dado un mensaje que lee de teclado, encapsular el<br />
mensaje y enviárselo al servidor, así como de realizar el proceso inverso, es<br />
decir, partiendo de un paquete, extraer la información y presentársela al<br />
usuario mostrando una interfaz relativamente amigable y clara.</p>
<p>El intercambio de mensajes entre cliente y servidor se realiza mediante paquetes<br />
que aceptan una serie de parámetros que los programas se encargan de encapsular<br />
y desencapsular.</p>
<p>SERVIDOR</p>
<p>En el servidor, se encuentra la parte lógica de la aplicación, es el lugar desde<br />
el cual se controlan los usuarios conectados, revisando que en ningún momento<br />
haya más de un usuario con el mismo nick, que los mensajes que recibe están bien<br />
formados, así como de hacer un reparto de los mensajes que recibe del cliente<br />
hacia el resto de clientes.</p>
<p>SQLITE</p>
<p>El servidor interactua con SQLite para obtener datos de un sistema de almacenamiento<br />
masivo.</p>
<p>********************<br />
** IMPLEMENTACIÓN **<br />
********************</p>
<p>Tanto cliente como servidor están implementados en el lenguaje de programación<br />
C y, disponibles hasta el momento sólo para equipos Unix</p>
<p>CLIENTE</p>
<p>El cliente está compuesto por los archivos cli5.c, y una serie de librerías<br />
que comparte con el servidor, en este caso, sms.h, trace.h, socket.h y flags.h</p>
<p>SERVIDOR</p>
<p>El servidor, al igual que el cliente, está programado en c y su código está<br />
repartido por varios ficheros, serv5.c y servFunctions.c, y se apoya en las<br />
mismas librerias que el programa cliente y, además en el archivo de cabecera<br />
denominado servFuctions.h, el cual contiene la declaración de las funciones<br />
contenidas en servFunctions.c</p>
<p>BASE DE DATOS</p>
<p>Hacemos uso de SQLite para almacenar los datos que han de persistir entre sesiones</p>
<p>LIBRERÍAS COMUNES</p>
<p>sms.h &#8211; contiene la estructura que se utiliza para la comunicación entre los<br />
diferentes procesos</p>
<p>socket.h &#8211; contiene la estructura con la que identificaremos las diferentes<br />
conexiones</p>
<p>flags.h &#8211; contiene los flags que se utilizarán en nuestros mensajes</p>
<p>trace.h &#8211; contiene una macro para imprimir mensajes en el caso de estar aun en<br />
fase de desarrollo, de manera que si se desean habilitar los mensajes de<br />
depuración, basta con definir la constante DEBUG con un valor de 1</p></blockquote>
<h1>Makefile:</h1>
<p>Este es el primero fichero de gran importancia que vamos a analizar, y es que es el fichero que nos permitirá compilar todos los programas con un único comando:</p>
<blockquote class="console"><p>~$ make</p></blockquote>
<p>El contenido del fichero es el siguiente:</p>
<blockquote><p>do: console</p>
<p>console:<br />
gcc -lpthread -ldl -lssl -lcrypto -lsqlite3 -Wall -o serv5 serv5.c servFunctions.c database.c type.c tools.c<br />
gcc  -lssl -Wall -o cli5 cli5.c type.c tools.c ssl.c<br />
gcc -lpthread -ldl -lssl -lcrypto -lsqlite3 -Wall -o createDB createDB.c database.c tools.c type.c<br />
gcc -Wall -o interfaz interfaz.c type.c</p></blockquote>
<p>Aquí, lo que estamos especificando, es que queremos ejecutar lo que hay en la etiqueta <strong>Console</strong>.</p>
<p>Gracias al uso de este tipo de archivos, somos capaces de compilar, en este caso, cuatro programas con un solo comando.</p>
<blockquote class="info"><p>Recuerda que si quieres echarle un vistazo al código completo del chat (tanto cliente como servidor), puedes dirigirte al <a href="http://www.dipler.org/2010/06/%c2%bfcomo-funciona-un-chat/">primer artículo de la serie</a> de artículos que tratan el tema del chat.</p></blockquote>


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center">
<ul class="socials">
		<li class="shr-bitacoras">
			<a href="http://bitacoras.com/anotaciones/http://www.dipler.org/2010/06/construye-tu-propio-chat-especificacion/" rel="nofollow" class="external" title="Enviar a Bitacoras">Enviar a Bitacoras</a>
		</li>
		<li class="shr-comfeed">
			<a href="http://www.dipler.org/2010/06/construye-tu-propio-chat-especificacion/feed" rel="nofollow" class="external" title="&iquest;Quieres suscribirte a los comentarios de este Post?">&iquest;Quieres suscribirte a los comentarios de este Post?</a>
		</li>
		<li class="shr-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://www.dipler.org/2010/06/construye-tu-propio-chat-especificacion/&amp;t=Crea+tu+propio+chat+-+Especificaci%C3%B3n" rel="nofollow" class="external" title="Compartir con Facebook">Compartir con Facebook</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.google.com/buzz/post?url=http://www.dipler.org/2010/06/construye-tu-propio-chat-especificacion/&amp;imageurl=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-meneame">
			<a href="http://meneame.net/submit.php?url=http://www.dipler.org/2010/06/construye-tu-propio-chat-especificacion/" rel="nofollow" class="external" title="Enviar a Meneame">Enviar a Meneame</a>
		</li>
		<li class="shr-technorati">
			<a href="http://technorati.com/faves?add=http://www.dipler.org/2010/06/construye-tu-propio-chat-especificacion/" rel="nofollow" class="external" title="Compartir con Technorati">Compartir con Technorati</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=Crea+tu+propio+chat+-+Especificaci%C3%B3n+-+http://b2l.me/3shj2&amp;source=shareaholic" rel="nofollow" class="external" title="&iexcl;Comp&aacute;rtelo en Twitter!">&iexcl;Comp&aacute;rtelo en Twitter!</a>
		</li>
		<li class="shr-delicious">
			<a href="http://delicious.com/post?url=http://www.dipler.org/2010/06/construye-tu-propio-chat-especificacion/&amp;title=Crea+tu+propio+chat+-+Especificaci%C3%B3n" rel="nofollow" class="external" title="Compartir con del.icio.us">Compartir con del.icio.us</a>
		</li>
		<li class="shr-googlereader">
			<a href="http://www.google.com/reader/link?url=http://www.dipler.org/2010/06/construye-tu-propio-chat-especificacion/&amp;title=Crea+tu+propio+chat+-+Especificaci%C3%B3n&amp;srcUrl=http://www.dipler.org/2010/06/construye-tu-propio-chat-especificacion/&amp;srcTitle=Crea+tu+propio+chat+-+Especificaci%C3%B3n&amp;snippet=Continuando%20con%20la%20serie%20de%20art%C3%ADculos%20con%20los%20que%20vamos%20a%20explicar%20como%20hacer%20un%20chat%20muy%20simple%2C%20vamos%20a%20comenzar%2C%20con%20este%20art%C3%ADculo%20como%20el%20primero%20a%20comentar%20el%20contenido%20de%20cada%20uno%20de%20los%20archivos%20que%20hemos%20visto%20en%20el%20art%C3%ADculo%20anterior%20%28Construye%20%20tu%20propio%20chat%20%E2%80%93%20Estructura%29.%0D%0A%0D%0AEn%20este%20" rel="nofollow" class="external" title="A&ntilde;dirlo a Google Reader">A&ntilde;dirlo a Google Reader</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

<img src="http://www.dipler.org/?ak_action=api_record_view&id=1557&type=feed" alt="" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=VFs3bR8k7AU:0RuPNExkFEE:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=VFs3bR8k7AU:0RuPNExkFEE:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=VFs3bR8k7AU:0RuPNExkFEE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=VFs3bR8k7AU:0RuPNExkFEE:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=VFs3bR8k7AU:0RuPNExkFEE:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=VFs3bR8k7AU:0RuPNExkFEE:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Bitnbyte/~4/VFs3bR8k7AU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dipler.org/2010/06/construye-tu-propio-chat-especificacion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.dipler.org/2010/06/construye-tu-propio-chat-especificacion/</feedburner:origLink></item>
		<item>
		<title>Crea tu propio chat – Estructura</title>
		<link>http://feedproxy.google.com/~r/Bitnbyte/~3/6G3GuKqJ0JA/</link>
		<comments>http://www.dipler.org/2010/06/construye-tu-propio-chat-estructura/#comments</comments>
		<pubDate>Sun, 13 Jun 2010 23:00:25 +0000</pubDate>
		<dc:creator>Alejandro Escario</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Producción propia]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.dipler.org/?p=1552</guid>
		<description><![CDATA[Continuado con el posta anterior (¿Cómo funciona un chat? – Introducción) en el que comentábamos de una manera generalista cómo debería funcionar un chat que cumpliese una serie de mínimos, vamos a empezar a desarrollar nuestro entorno para programar: Estableciendo un entorno de desarrollo Para que el chat funcione correctamente y que podamos reutilizar tanto [...]]]></description>
			<content:encoded><![CDATA[<p>Continuado con el posta anterior (<a title="¿Cómo funciona un chat? – Introducción" rel="bookmark" href="../2010/06/%c2%bfcomo-funciona-un-chat/">¿Cómo  funciona un chat? – Introducción</a>) en el que comentábamos de una manera generalista cómo debería funcionar un chat que cumpliese una serie de mínimos, vamos a empezar a desarrollar nuestro entorno para programar:</p>
<h2>Estableciendo un entorno de desarrollo</h2>
<p style="margin-bottom: 0cm;">Para que el chat funcione correctamente y que podamos reutilizar tanto código como sea posile, vamos a definir la estructura de nuestro programa.</p>
<p style="margin-bottom: 0cm;">Vale la pena mencionar que si bien es una estructura en la que en un inicio puede parecer que nos sobran muchas cosas, más adelante agradeceremos enormemente haberla utilizado, tanto si hacemos público el código fuente de la aplicación como si no.</p>
<h2>Archivos:</h2>
<p style="margin-bottom: 0cm;">ARCHITECTURE: fichero en el que vamos a definir la arquitectura de nuestro chat, es decir, de qué capas consta, qué comunicación hay entre ellas,&#8230;</p>
<p style="margin-bottom: 0cm;">INSTALL: es un fichero en el que indicaremos qué pasos hay que seguir para instalar nuestra aplicación de la forma más genérica posible en una serie de máquinas, además especificaremos también las dependencias necesarias para realizar la instalación.</p>
<p style="margin-bottom: 0cm;">README: el famoso archivo que no se lee nadie, aunque parezca mentira, resulta ser de más utilidad de la que en un principio podría parecer, esto es así porque es un fichero en el que se detallan todas las funcionalidades de una aplicación o proceso (en caso de no tener un archivo man a mano), además, en este fichero podemos indicar como hemos de proceder ante determinadas situaciones.</p>
<p style="margin-bottom: 0cm;">Archivos fuente: aunque en este ejemplo no vamos a crear una estructura jerarquizada, para proyectos medianamente grandes, en cualquier lenguaje, conviene crear una jerarquía mediante el uso de carpetas, separando los ficheros por funcionalidades.</p>
<p style="margin-bottom: 0cm;">Makefile: éste es un archivo que nos permitirá compilar y ejecutar todo lo que nos sea necesario simplemente ejecutando en consola el comando &#8220;make&#8221;.</p>
<p style="margin-bottom: 0cm;">A continuación, os pongo una captura de la carpeta con los archivos que vamos a tratar a lo largo de este tutorial si es que se le puede llamar así:</p>
<p style="margin-bottom: 0cm;"><a href="http://www.dipler.org/wp-content/uploads/2010/06/Archivos-del-chat.png"><img class="aligncenter size-full wp-image-1553" title="Archivos del chat" src="http://www.dipler.org/wp-content/uploads/2010/06/Archivos-del-chat.png" alt="" width="255" height="446" /></a></p>
<ul>
<li>La Carpeta chat, es la que tiene los ficheros correspondientes con la interfaz gráfica de la que ya hablamos en el artículo anterior.</li>
<li>Los archivos ARCHITECTURE, README, INSTALL y Makefile, ya los hemos comentado anteriormente en este mismo artículo.</li>
<li>El archivo Cert.pem  es un certificado, el certificado que utilizaremos para identificar a los miembros que intervienen en la comunicación.</li>
<li>chat.db es una base de datos con el log de los eventos que suceden en el servidor.</li>
<li>chat.jar es el ejecutable de la interfaz gráfica.</li>
<li>cli5.c es el fichero principal para el manejo del clinete.</li>
<li>createDB.c es el fichero principal y que se encarga de la creación de una base de datos compatible con el programa por primera vez.</li>
<li>database.c es un fichero que contiene los métodos para tratar con la base de datos.</li>
<li>flags.h es un fichero de cabecera que contiene los flags para la comunicación entre cliente y servidor.</li>
<li>serv5.c es el fichero principal para el manejo del servidor.</li>
<li>interfaz.c es el fichero principal para el manejo de la interfaz.</li>
<li>servFunctions.c y *.h son los ficheros con las funciones genéricas del servidor.</li>
<li>sms.h y socket.h son unos ficheros de cabecera que contienen las estructuras necesarias para la comunicación.</li>
<li>tools.c y .h, y type.c y .h contienen una serie de funciones genéricas.</li>
<li>trace.h contiene una serie de macros un tanto precarias para hacer un seguimiento de qué es lo que ocurre en el chat.</li>
</ul>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">http://www.dipler.org/2010/06/%C2%BFcomo-funciona-un-chat/</div>
<blockquote class="info"><p>Recuerda que si quieres echarle un vistazo al código completo del chat (tanto cliente como servidor), puedes dirigirte al <a href="http://www.dipler.org/2010/06/%c2%bfcomo-funciona-un-chat/">primer artículo de la serie</a> de artículos que tratan el tema del chat.</p></blockquote>


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center">
<ul class="socials">
		<li class="shr-bitacoras">
			<a href="http://bitacoras.com/anotaciones/http://www.dipler.org/2010/06/construye-tu-propio-chat-estructura/" rel="nofollow" class="external" title="Enviar a Bitacoras">Enviar a Bitacoras</a>
		</li>
		<li class="shr-comfeed">
			<a href="http://www.dipler.org/2010/06/construye-tu-propio-chat-estructura/feed" rel="nofollow" class="external" title="&iquest;Quieres suscribirte a los comentarios de este Post?">&iquest;Quieres suscribirte a los comentarios de este Post?</a>
		</li>
		<li class="shr-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://www.dipler.org/2010/06/construye-tu-propio-chat-estructura/&amp;t=Crea+tu+propio+chat+-+Estructura" rel="nofollow" class="external" title="Compartir con Facebook">Compartir con Facebook</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.google.com/buzz/post?url=http://www.dipler.org/2010/06/construye-tu-propio-chat-estructura/&amp;imageurl=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-meneame">
			<a href="http://meneame.net/submit.php?url=http://www.dipler.org/2010/06/construye-tu-propio-chat-estructura/" rel="nofollow" class="external" title="Enviar a Meneame">Enviar a Meneame</a>
		</li>
		<li class="shr-technorati">
			<a href="http://technorati.com/faves?add=http://www.dipler.org/2010/06/construye-tu-propio-chat-estructura/" rel="nofollow" class="external" title="Compartir con Technorati">Compartir con Technorati</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=Crea+tu+propio+chat+-+Estructura+-+http://b2l.me/3hxts&amp;source=shareaholic" rel="nofollow" class="external" title="&iexcl;Comp&aacute;rtelo en Twitter!">&iexcl;Comp&aacute;rtelo en Twitter!</a>
		</li>
		<li class="shr-delicious">
			<a href="http://delicious.com/post?url=http://www.dipler.org/2010/06/construye-tu-propio-chat-estructura/&amp;title=Crea+tu+propio+chat+-+Estructura" rel="nofollow" class="external" title="Compartir con del.icio.us">Compartir con del.icio.us</a>
		</li>
		<li class="shr-googlereader">
			<a href="http://www.google.com/reader/link?url=http://www.dipler.org/2010/06/construye-tu-propio-chat-estructura/&amp;title=Crea+tu+propio+chat+-+Estructura&amp;srcUrl=http://www.dipler.org/2010/06/construye-tu-propio-chat-estructura/&amp;srcTitle=Crea+tu+propio+chat+-+Estructura&amp;snippet=Continuado%20con%20el%20posta%20anterior%20%28%C2%BFC%C3%B3mo%20%20funciona%20un%20chat%3F%20%E2%80%93%20Introducci%C3%B3n%29%20en%20el%20que%20coment%C3%A1bamos%20de%20una%20manera%20generalista%20c%C3%B3mo%20deber%C3%ADa%20funcionar%20un%20chat%20que%20cumpliese%20una%20serie%20de%20m%C3%ADnimos%2C%20vamos%20a%20empezar%20a%20desarrollar%20nuestro%20entorno%20para%20programar%3A%0D%0AEstableciendo%20un%20entorno%20de%20desarroll" rel="nofollow" class="external" title="A&ntilde;dirlo a Google Reader">A&ntilde;dirlo a Google Reader</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

<img src="http://www.dipler.org/?ak_action=api_record_view&id=1552&type=feed" alt="" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=6G3GuKqJ0JA:W8uEajtZFj0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=6G3GuKqJ0JA:W8uEajtZFj0:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=6G3GuKqJ0JA:W8uEajtZFj0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=6G3GuKqJ0JA:W8uEajtZFj0:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=6G3GuKqJ0JA:W8uEajtZFj0:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=6G3GuKqJ0JA:W8uEajtZFj0:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Bitnbyte/~4/6G3GuKqJ0JA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dipler.org/2010/06/construye-tu-propio-chat-estructura/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.dipler.org/2010/06/construye-tu-propio-chat-estructura/</feedburner:origLink></item>
		<item>
		<title>¿Cómo funciona un chat? – Introducción</title>
		<link>http://feedproxy.google.com/~r/Bitnbyte/~3/1h0KoVHYAgg/</link>
		<comments>http://www.dipler.org/2010/06/%c2%bfcomo-funciona-un-chat/#comments</comments>
		<pubDate>Sun, 13 Jun 2010 13:24:33 +0000</pubDate>
		<dc:creator>Alejandro Escario</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Producción propia]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.dipler.org/?p=1536</guid>
		<description><![CDATA[Hoy en día, pocos son los que no conocen o hacen uso asiduo de los chats instantáneos, estén o no basados en estándares abiertos, pero ¿Cómo funciona un chat de este estilo?, ¿Es fácil hacer uno?. En este artículo vamos a intentar responder a estas preguntas así como dotarla de ejemplos para que al final [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy en día, pocos son los que no conocen o hacen uso asiduo de los chats instantáneos, estén o no basados en estándares abiertos, pero ¿Cómo funciona un chat de este estilo?, ¿Es fácil hacer uno?. En este artículo vamos a intentar responder a estas preguntas así como dotarla de ejemplos para que al final seamos capaces de crear nuestro propio chat con SSL.</p>
<h2>¿Cómo funciona un chat?</h2>
<p>La respuesta es muy sencilla, al menos si no profundizamos en el tema, y es que, un chat es algo tan sencillo como dos procesos que intercambian datos entre sí. Comúnmente, estos procesos están situados en diferentes lugares, por ejemplo tenemos un proceso en el cliente, que es o debe ser una mera interfaz que se encargue de enviarle datos al otro proceso (servidor) y dejarle que este haga lo que tenga que hacer con ellos.</p>
<h2>¿Porqué hablamos de SSL en un chat?</h2>
<p>Muchos chats de los que utilizamos hoy en día, envían datos  por la red sin cifrar, lo que permite que un usuario malintencionado y que se sitúe entre el cliente y el servidor, sea capaz de, sin mucho problema, recoger los paquetes que pasen por ese puntos y leer su contenido.</p>
<h2>¿Qué hay que tener en cuenta a la hora de implementar un chat?</h2>
<p>Como ya hemos mencionado con anterioridad, vamos a trabajar con un mínimo de dos procesos, un proceso cliente y un proceso servidor, el primero de ellos viene a ser lo que un navegador a una aplicación web, ha de ser capaz de, en la medida de lo posible, dedicarse exclusivamente a mostrar los datos recibidos desde el mismo, mientras que el proceso servidor, es el que, en un principio habría de dedicarse a recibir peticiones, procesarlas y devolver una respuesta con el resultado si es que ha de hacer esto, en nuestro caso, el servidor, al recibir una petición ( un mensaje en este caso ), la analiza, detecta a quién va dirigida y se la envía a los destinatarios, los cuales estarán corriendo otros procesos cliente.<span id="more-1536"></span></p>
<h2>¿Qué tipos de comunicación se pueden dar en un chat?</h2>
<p>Un usuario con los privilegios suficientes, habría de ser capaz de darle órdenes directas al servidor, de manera que así, el proceso servidor se pueda ejecutar como un demonio, en este caso, la comunicación sería unicast y unidireccional o bidireccional, dependiendo de lo que se desee hacer.</p>
<p><a href="http://www.dipler.org/wp-content/uploads/2010/06/Comunicacion-con-el-servidor.png"><img class="aligncenter  size-full wp-image-1544" title="Comunicacion con el servidor" src="http://www.dipler.org/wp-content/uploads/2010/06/Comunicacion-con-el-servidor.png" alt="" width="276" height="135" /></a></p>
<p>Un usuario que desee enviarle un mensaje privado a otro usuario conectado al chat, en este caso el usuario A le enviaría un mensaje al servidor con un identificador del usuario al que quiere enviarle el mensaje, el servidor, una vez haya comprobado que el usuario existe y que puede recibir mensajes privados, debe enviarle el mensaje que ha recibido del cliente A al cliente B.</p>
<p><a href="http://www.dipler.org/wp-content/uploads/2010/06/Mensaje-privado.png"><img class="aligncenter size-full wp-image-1545" title="Mensaje privado" src="http://www.dipler.org/wp-content/uploads/2010/06/Mensaje-privado.png" alt="" width="273" height="135" /></a></p>
<p>Un usuario que desee enviarle un mensaje a una serie de usuarios que estén conectados al mismo, como por ejemplo en el caso de que se encuentre en una sala de chat específica.</p>
<p><a href="http://www.dipler.org/wp-content/uploads/2010/06/Multicast.png"><img class="aligncenter size-medium wp-image-1546" title="Multicast" src="http://www.dipler.org/wp-content/uploads/2010/06/Multicast-229x300.png" alt="" width="229" height="300" /></a></p>
<p>Un usuario desea hacer un broadcast (enviarle un mensaje a todo el mundo) con un determinado mensaje.</p>
<p><a href="http://www.dipler.org/wp-content/uploads/2010/06/Broadcast.png"><img class="aligncenter size-medium wp-image-1547" title="Broadcast" src="http://www.dipler.org/wp-content/uploads/2010/06/Broadcast-229x300.png" alt="" width="229" height="300" /></a></p>
<p>En estos dos últimos casos, el mensaje se le envía al servidor con los flags (indicadores de la actividad que se realiza) necesarios activados para que sepa qué hacer con cada mensaje y se reenvía el mensaje a los destinatarios seleccionados.</p>
<h2>¿Como podemos ver el funcionamiento de un chat de este estilo?</h2>
<p>Tanto Microsoft, Google como otras empresas y usaurios han desarrollado unas estupendas herramientas para mantenernos conectados en tiempo real, pero dado que o bien no tenemos acceso al código funete de determinadas aplicaciones ( cliente/servidor ), o que no utilizan un protocolo abierto, o que son muy complicados para empezar a trabajar sobre ellos, para aprender de una manera superficial como funcionan, vamos a crear nuestro propio chat, a continuación os pongo una copia del archivo README para que veáis las funcionalidades del mismo y si os compensa seguir leyendo esta serie de artículos:</p>
<blockquote><p>El objetivo consite en el desarrollo de un chat mediante el uso de sockets<br />
de internet TCP, por lo que en este caso seremos capaces de comunicarnos mediante<br />
una conexión fiable entre el cliente y el servidor, siendo en este caso el cliente<br />
un cliente múltiple que deberá recibir la información correspondiente a los mensajes<br />
que han enviado el resto de clientes.</p>
<p>MANUAL DE USO</p>
<p>CLIENTE</p>
<p>El cliente es un programa que tras ejecutarlo, nos permite escribir<br />
mensajes y al cliente, los cuales, dependiendo de la sintaxis utilizada<br />
se comportarán en el mismo de una u otra manera, por ejemplo, si escibimos<br />
un mensaje cualquiera, se enviará el mensaje como un mensaje de texto<br />
normal, es decir que deseamos que se envíe al resto de usuarios del chat,<br />
por contra si se escribe uno de los comandos en ejecución se ejecutará<br />
la acción correspondiente y descrita en las siguientes lineas.</p>
<p>Al mismo tiempo, mientras el proceso nos permite enviarle mensajes al<br />
servidor, éste está leyendo constantemente los datos que le llegan desde<br />
el servidor.</p>
<p>Para ejecutar el cliente basta con ejecutar en consola:</p>
<p>./cli5</p>
<p>Si por el contrario deseamos ejecutar el cliente con una interfaz<br />
gráfica, basta con ejecutar, para ejecutarlo hace falta la máquina<br />
virtual java.</p>
<p>./interfaz</p>
<p>Cuando un usuario se conecte, se le mostrarán los nombres de las diferentes<br />
salas a las que puede acceder con cadenas de la siguiente manera</p>
<p>&#8211; %s &#8211;</p>
<p>Siendo %s, el nombre de la sala, una vez que sepamos a que sala deseamos<br />
conectarnos, tendremos que escribir el nombre de la sala tal cual aparece,<br />
es decir el equivalente a %s</p>
<p>FLAGS</p>
<p>-p indica el puerto por el que nos conectaremos con el servidor</p>
<p>./cli5 -p 12345</p>
<p>-d indica la dirección por la que nos conectaremos con el servidor</p>
<p>./cli5 -d localhost</p>
<p>-cert indica la ruta del certificado a utilizar para conectarse con<br />
el servidor<br />
./cli5 -cert /usr/share/doc/libssl-dev/demos/sign/cert.pem</p>
<p>COMANDOS EN EJECUCIÓN</p>
<p>-x comando aplicable en cualquier momento, es el único comando aplicable<br />
en el proceso de autenticación.</p>
<p>-x # cierra el cliente</p>
<p>&#8211;serv lo que se esciba en el siguiente comando, se le envia directamente<br />
al servidor</p>
<p>&#8211;serv # nos indica que ahora estamos hablando con el servidor<br />
-x # le enviamos el comando -x al servidor</p>
<p>Para salir del modo de conversación con el servidor (modo durante<br />
el cual no se recibirán los mensajes enviados por el chat) habremos<br />
de escribir &#8216;exit&#8217;, y volveremos al modo de chat tradicional.</p>
<p>SERVIDOR</p>
<p>El servidor es un programa que es capaz de interactuar n clientes, de<br />
manera que estos se conectan a él y este retransmite la información.</p>
<p>Su uso es muy sencillo, ya que una vez ejecutado, podemos olvidarnos de<br />
él, de hecho en el caso de que deseemos ejecutar un comando en ejecución,<br />
hemos de, cargar un cliente y mediante el previo uso del comando<br />
&#8211;serv, enviarle uno de los comandos permitidos durante la ejecución<br />
y cuyo comportamiento se detalla a continuación.</p>
<p>En el caso de que al ejecutar el servidor, no se encuentre el fichero con<br />
la base de datos, se creará uno y se solicitarán las credenciales del<br />
administrador en el servidor, tras esto, todo se hará desde el cliente.</p>
<p>Al conectarse con el servidor, y escoger un nombre, si este no está en la<br />
base de datos, el usuario se conectará como invitado, pudiendo sólo<br />
enviar mensajes, si por el contrario el usuario está registrado, se le<br />
solicitará la contraseña y tendrá el rol asignado en la base de datos</p>
<p>Si al ejecutar el cliente nos dice que la base de datos no existe, el<br />
proceso terminará con un error (-1), por lo que deberemos crear dicha<br />
base de datos ejecutando &#8216;./createdb nombre de la base de datos&#8217;.</p>
<p>ROLES<br />
GUEST &#8211; invitado, sólo puede enviar mensajes y a su nombre se le<br />
concaternará la cadena de texto &#8216;-guest&#8217;</p>
<p>USER &#8211; usuario, sólo puede enviar mensajes</p>
<p>ADMIN &#8211; administrador, además de enviar mensajes, es capaz de enviarle<br />
comandos al servidor</p>
<p>FLAGS</p>
<p>-p indica el puerto por la que habrán de conectarse los clientes</p>
<p>./serv5 -p 12345</p>
<p>-ls indica el tamaño inicial de la lista de clientes</p>
<p>./serv5 -ls 100</p>
<p>-lg indica el factor de crecimiento de la cola</p>
<p>./serv5 -lg 10</p>
<p>-db indica el nombre de la base de datos con la que se va a interactuar</p>
<p>./serv5 -db chat.db</p>
<p>-cert indica la ruta del certificado a utilizar para conectarse con<br />
el servidor<br />
./serv5 -cert cert</p>
<p>-pkey indica la ruta de la clave privada de la que hará uso el servidor</p>
<p>./serv5 -pkey pkey</p>
<p>COMANDOS EN EJECUCIÓN estos comandos vienen desde el cliente, sólo será<br />
capaz de comunicarse con el servidor aquellos usuarios que tengan el<br />
rango de administrador.</p>
<p>-x cierra el servidor</p>
<p>&#8211;add-user name password [rol]<br />
Este comando, creará un usuario con nombre &#8216;name&#8217;, contraseña<br />
&#8216;password&#8217; y el rol indicado, por ahora se admiten los roles de<br />
&#8216;admin&#8217; y &#8216;user&#8217;, en caso de no especificar el campo rol, el<br />
usuario creado le srá asignado el rol &#8216;user&#8217;. No se podrán<br />
crear dos usuarios con el mismo nombre.</p>
<p>&#8211;delete-user name<br />
Este comando borra el usuario cuyo nombre coincida con el valor<br />
&#8216;name&#8217;</p>
<p>&#8211;list-user<br />
Este comando lista todos los usuarios registrados en el chat</p>
<p>&#8211;log<br />
Este comando imprime todas las ocurrencias del log si no se le<br />
pasan parámetros</p>
<p>Se le pueden pasar dos parámetros, fecha de inicio y fecha de fin</p>
<p>&#8211;log dd/mm/YYYY dd/mm/YYYY</p>
<p>en cuyo caso se listarán sólo los log entre dos fechas</p>
<p>&#8211;mp [nombre]<br />
Este comando le envía un mensaje privado al usuario llamado nombre,<br />
el mensaje se escribirá después de haber pulsado intro después<br />
de esta cadena.</p>
<p>&#8211;mp admin<br />
mensaje para el administrador</p>
<p>Le envia un mensaje privado al administrador cuyo contenido es<br />
&#8216;mensaje para el administrador&#8217;</p>
<p>&#8211;add-room [nombre]<br />
Este comando añade una nueva sala de chat llamada [nombre]</p>
<p>&#8211;list-room<br />
Este comando lista todas las salas de chat</p>
<p>&#8211;delete-room [nombre]<br />
Este comando borra una sala de chat llamada [nombre] y mueve los<br />
usuarios que se encontraban en esta a la sala general</p>
<p>CREATEDB</p>
<p>Proceso que crea la base de datos con un usuario administrador.</p>
<p>Sólo admite un parámetro que es obligatorio y que tiene el nombre de<br />
la base de datos a crear, es aconsejable llamar a la base de datos<br />
chat.db ya que es el nombre por defecto de la base de datos a la que<br />
intenta conectarse el servidor</p>
<p>./createDB chat.db</p></blockquote>
<p>El ejemplo de chat que vamos a crear está desarrollado en C bajo un entorno Unix, más concretamente Linux, y para dotarle de una interfaz gráfica, nos hemos aprovechado de las bondades del sistema de pipes unix para implementarla rápidamente en java.</p>
<h1>Descarga:</h1>
<p><strong>Link:</strong> <a class="downloadlink" href="http://www.dipler.org/wp-content/plugins/download-monitor/download.php?id=2" title="Versión1.0 descargado 3288 veces" >Chat C (3288)</a></p>


<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center">
<ul class="socials">
		<li class="shr-bitacoras">
			<a href="http://bitacoras.com/anotaciones/http://www.dipler.org/2010/06/%c2%bfcomo-funciona-un-chat/" rel="nofollow" class="external" title="Enviar a Bitacoras">Enviar a Bitacoras</a>
		</li>
		<li class="shr-comfeed">
			<a href="http://www.dipler.org/2010/06/¿como-funciona-un-chat/feed" rel="nofollow" class="external" title="&iquest;Quieres suscribirte a los comentarios de este Post?">&iquest;Quieres suscribirte a los comentarios de este Post?</a>
		</li>
		<li class="shr-facebook">
			<a href="http://www.facebook.com/share.php?v=4&amp;src=bm&amp;u=http://www.dipler.org/2010/06/%c2%bfcomo-funciona-un-chat/&amp;t=%C2%BFC%C3%B3mo+funciona+un+chat%3F+-+Introducci%C3%B3n" rel="nofollow" class="external" title="Compartir con Facebook">Compartir con Facebook</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.google.com/buzz/post?url=http://www.dipler.org/2010/06/%c2%bfcomo-funciona-un-chat/&amp;imageurl=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-meneame">
			<a href="http://meneame.net/submit.php?url=http://www.dipler.org/2010/06/%c2%bfcomo-funciona-un-chat/" rel="nofollow" class="external" title="Enviar a Meneame">Enviar a Meneame</a>
		</li>
		<li class="shr-technorati">
			<a href="http://technorati.com/faves?add=http://www.dipler.org/2010/06/%c2%bfcomo-funciona-un-chat/" rel="nofollow" class="external" title="Compartir con Technorati">Compartir con Technorati</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=%C2%BFC%C3%B3mo+funciona+un+chat%3F+-+Introducci%C3%B3n+-+http://b2l.me/3euac&amp;source=shareaholic" rel="nofollow" class="external" title="&iexcl;Comp&aacute;rtelo en Twitter!">&iexcl;Comp&aacute;rtelo en Twitter!</a>
		</li>
		<li class="shr-delicious">
			<a href="http://delicious.com/post?url=http://www.dipler.org/2010/06/%c2%bfcomo-funciona-un-chat/&amp;title=%C2%BFC%C3%B3mo+funciona+un+chat%3F+-+Introducci%C3%B3n" rel="nofollow" class="external" title="Compartir con del.icio.us">Compartir con del.icio.us</a>
		</li>
		<li class="shr-googlereader">
			<a href="http://www.google.com/reader/link?url=http://www.dipler.org/2010/06/%c2%bfcomo-funciona-un-chat/&amp;title=%C2%BFC%C3%B3mo+funciona+un+chat%3F+-+Introducci%C3%B3n&amp;srcUrl=http://www.dipler.org/2010/06/%c2%bfcomo-funciona-un-chat/&amp;srcTitle=%C2%BFC%C3%B3mo+funciona+un+chat%3F+-+Introducci%C3%B3n&amp;snippet=Hoy%20en%20d%C3%ADa%2C%20pocos%20son%20los%20que%20no%20conocen%20o%20hacen%20uso%20asiduo%20de%20los%20chats%20instant%C3%A1neos%2C%20est%C3%A9n%20o%20no%20basados%20en%20est%C3%A1ndares%20abiertos%2C%20pero%20%C2%BFC%C3%B3mo%20funciona%20un%20chat%20de%20este%20estilo%3F%2C%20%C2%BFEs%20f%C3%A1cil%20hacer%20uno%3F.%20En%20este%20art%C3%ADculo%20vamos%20a%20intentar%20responder%20a%20estas%20preguntas%20as%C3%AD%20como%20dotarla%20de%20ejemplos%20pa" rel="nofollow" class="external" title="A&ntilde;dirlo a Google Reader">A&ntilde;dirlo a Google Reader</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

<img src="http://www.dipler.org/?ak_action=api_record_view&id=1536&type=feed" alt="" /><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=1h0KoVHYAgg:dGIJLNwnoPk:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=1h0KoVHYAgg:dGIJLNwnoPk:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=1h0KoVHYAgg:dGIJLNwnoPk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=1h0KoVHYAgg:dGIJLNwnoPk:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Bitnbyte?a=1h0KoVHYAgg:dGIJLNwnoPk:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/Bitnbyte?i=1h0KoVHYAgg:dGIJLNwnoPk:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/Bitnbyte/~4/1h0KoVHYAgg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.dipler.org/2010/06/%c2%bfcomo-funciona-un-chat/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		<feedburner:origLink>http://www.dipler.org/2010/06/%c2%bfcomo-funciona-un-chat/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 4.213 seconds. --><!-- Cached page generated by WP-Super-Cache on 2010-09-08 11:37:50 -->
