<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog de Jorge Machín &#187; Programación</title>
	<atom:link href="http://www.machin.com.mx/archives/category/programacion/feed" rel="self" type="application/rss+xml" />
	<link>http://www.machin.com.mx</link>
	<description>Sólo para recordar</description>
	<lastBuildDate>Mon, 06 Sep 2010 07:34:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Revistas técnicas de antaño</title>
		<link>http://www.machin.com.mx/archives/4636</link>
		<comments>http://www.machin.com.mx/archives/4636#comments</comments>
		<pubDate>Wed, 23 Jun 2010 06:56:28 +0000</pubDate>
		<dc:creator>Jorge Machin</dc:creator>
				<category><![CDATA[Arqueología Machinesca]]></category>
		<category><![CDATA[Color Computer]]></category>
		<category><![CDATA[Electrónica]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.machin.com.mx/?p=4636</guid>
		<description><![CDATA[<p>No solamente los libros son una fuente de conocimiento invaluable; también los son las revistas. De igual forma que los libros hay de varios niveles y podemos brincar de una a otra según vamos obteniendo experiencia. Tienen la ventaja de estar más actualizadas y ser un snapshot del momento aunque sólo suelen tratar un sólo tema de una materia por las pocas páginas que tienen los colaboradores; pero con el paso de los fasículos esto se va complementando. Además el trato con los autores es más directo y personal por los que los puede uno conocer más.</p>
<p>En este post estaré poniendo las revistas que más me gustaron y ya no están a la venta o ya no las compro.</p>
<table width="100%" border="0" cellspacing="10">
<tr>
<td valign="top">
<img src="http://www.machin.com.mx/wp-content/uploads/2010/06/drdobbs.jpg" alt="" title="drdobbs" width="150" height="163"  />
</td>
<td width="100%" valign="top">
<strong>Dr Dobb's</strong></p>
<p>La primera vez que tome esta revista quede impresionado por el nivel de los temas que trataba. Los artículos eran escritos por verdaderas personalidades del medio informático y con los códigos fuentes disponibles.  Como era estudiante, no era raro que algunos artículos fueran de utilidad pasado algún tiempo. Al ser un amante de C/C++, no me perdía los artículos de <strong>Al Stevens</strong> y <strong>Michael Abrash</strong>. Otras secciones favoritas eran los escritos por <strong>Michael Swaine</strong> y las novedades editoriales presentados por <strong>Andrew Schuman</strong>.</p>
<p>Es una verdadera pena que esta publicación se haya termindo, aunque aún esta el sitio en Internet con artículos mensuales; pero ya no es lo mismo.
</td>
</tr>
<tr>
<td valign="top">
<img src="http://www.machin.com.mx/wp-content/uploads/2010/06/cug.jpg" alt="" title="cug" width="150" height="170"  />
</td>
<td width="100%" valign="top">
<strong>C/C++ User Journal</strong></p>
<p>En esta revista se develaban todas las posibilidades avanzadas que puede ofrecer este maravilloso lenguaje: Smart Pointers, STL, Threads y los problemas más comunes a los que se enfrentan los programadores de este rudo lenguaje. Manejaba una adecuada combinación de artículos para principiantes y avanzados que ayudaba a leerla de principio a fin sin saltarse ningún articulo. </p>
<p>Mis secciones predilectas eran las preguntas y respuestas de <strong>Bobby Schmidt</strong> y los artículos de <strong>P.J. Plauger</strong>.
</td>
</tr>
<tr>
<td valign="top">
<img src="http://www.machin.com.mx/wp-content/uploads/2010/06/rainbow.jpg" alt="" title="rainbow" width="150" height="163" />
</td>
<td width="100%" valign="top">
<strong>Rainbow</strong></p>
<p>La revista <strong>Rainbow</strong> era la máxima autoridad y punto de reunión de la comunidad de la <strong>Color Computer</strong>. Desafortunadamente por mucho tiempo era imposible conseguirla en la Ciudad de México por lo que solamente la podía tener cuando mi papá viajaba a Estados Unidos. Afortunadamente viajaba seguido y tenía un apartado postal donde me compró la subscripción. Mi alegría fue mayúscula cuando la ví la primera vez en los estantes del Sanborns.</p>
<p>El nivel era mayoritariamente para usuarios domésticos y con muchos juegos; lo adecuado para mi edad en ese entonces. Sin embargo hicieron un gran esfuerzo para llevar a los usuarios a conocer y entender el <strong>OS-9</strong> para aplicaciones más avanzadas y profesionales. Yo dejé de comprarla en 1990 porque cambié al mundo de las PCs.
</td>
</tr>
<tr>
<td valign="top">
<img src="http://www.machin.com.mx/wp-content/uploads/2010/06/PopularElectronics.jpg" alt="" title="PopularElectronics" width="150" height="172" />
</td>
<td width="100%" valign="top">
<strong>Popular Electronics</strong></p>
<p>Entre las revistas que mi papá compraba como electrónico estaba <strong>Popular Electronics</strong>. En cada fasículo se trataba lo más variado desde audio, video, sonido y computación. Por supuesto había "reviews", artículos de construcción y enseñanza. A mi en lo particular me gustaban mucho los artículos de <strong>Forrest M. Mims</strong>.</p>
<p>Por cierto, la imagen de la izquierda es el fascículo de julio de 1981 donde se hace un análisis de la <strong>Color Computer</strong> <img src='http://www.machin.com.mx/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  . Tengo entendido que ya no se publica.
</td>
</tr>
<tr>
<td valign="top">
<img src="http://www.machin.com.mx/wp-content/uploads/2010/06/RadioElectronics.jpg" alt="" title="RadioElectronics" width="150" height="176" />
</td>
<td width="100%" valign="top">
<strong>Radio Electronics</strong></p>
<p>Otra de las Revistas de mi papá que leía mes a mes era <strong>Radio Electrónics</strong>. Era la competencia de <strong>Popular Electronics</strong> y por lo tanto siempre se compraban las dos. Era divertido ver como había un piqué entre las dos.</p>
<p> Los Artículos de construcción eran su fuerte  y mi columna preferida era <strong>Drawing Board</strong> de <strong>Robert Grossblatt</strong>. Hasta los anuncios como los de <strong>Jameco</strong> me gustaban.
</td>
</tr>
</table>
<table width="100%" border="0" cellspacing="10">
<tr>
<td valign="top">
<img src="http://www.machin.com.mx/wp-content/uploads/2010/06/pctips.jpg" alt="" title="pctips" width="150" height="174" />
</td>
<td width="100%" valign="top">
<strong>PC Tips</strong></p>
<p>La revista <strong>PC/Tips</strong> era una de mis revistas favoritas porque era escrita por mexicanos. No por un sentimiento patriotero; sino porque tenía ese enfoque hacia la idiosincracia, problematica y realidad nacional de aquellos tiempos. Se evaluaban programas, se tenían artículos de programación hasta de lenguaje ensamblador. Por supuesto que eran muy valiosos los articulos de <strong>Dbase</strong>, tan de moda en esas épocas. </p>
<p>Desafortunadamente después se convirtió en la revista <strong>Byte de México</strong> y poco a poco se convirtió en una traducción recortada de la versión norteamericana.
</td>
</tr>
</table>

]]></description>
			<content:encoded><![CDATA[<p>No solamente los libros son una fuente de conocimiento invaluable; también los son las revistas. De igual forma que los libros hay de varios niveles y podemos brincar de una a otra según vamos obteniendo experiencia. Tienen la ventaja de estar más actualizadas y ser un snapshot del momento aunque sólo suelen tratar un sólo tema de una materia por las pocas páginas que tienen los colaboradores; pero con el paso de los fasículos esto se va complementando. Además el trato con los autores es más directo y personal por los que los puede uno conocer más.</p>
<p>En este post estaré poniendo las revistas que más me gustaron y ya no están a la venta o ya no las compro.</p>
<table width="100%" border="0" cellspacing="10">
<tr>
<td valign="top">
<img src="http://www.machin.com.mx/wp-content/uploads/2010/06/drdobbs.jpg" alt="" title="drdobbs" width="150" height="163"  />
</td>
<td width="100%" valign="top">
<strong>Dr Dobb's</strong></p>
<p>La primera vez que tome esta revista quede impresionado por el nivel de los temas que trataba. Los artículos eran escritos por verdaderas personalidades del medio informático y con los códigos fuentes disponibles.  Como era estudiante, no era raro que algunos artículos fueran de utilidad pasado algún tiempo. Al ser un amante de C/C++, no me perdía los artículos de <strong>Al Stevens</strong> y <strong>Michael Abrash</strong>. Otras secciones favoritas eran los escritos por <strong>Michael Swaine</strong> y las novedades editoriales presentados por <strong>Andrew Schuman</strong>.</p>
<p>Es una verdadera pena que esta publicación se haya termindo, aunque aún esta el sitio en Internet con artículos mensuales; pero ya no es lo mismo.
</td>
</tr>
<tr>
<td valign="top">
<img src="http://www.machin.com.mx/wp-content/uploads/2010/06/cug.jpg" alt="" title="cug" width="150" height="170"  />
</td>
<td width="100%" valign="top">
<strong>C/C++ User Journal</strong></p>
<p>En esta revista se develaban todas las posibilidades avanzadas que puede ofrecer este maravilloso lenguaje: Smart Pointers, STL, Threads y los problemas más comunes a los que se enfrentan los programadores de este rudo lenguaje. Manejaba una adecuada combinación de artículos para principiantes y avanzados que ayudaba a leerla de principio a fin sin saltarse ningún articulo. </p>
<p>Mis secciones predilectas eran las preguntas y respuestas de <strong>Bobby Schmidt</strong> y los artículos de <strong>P.J. Plauger</strong>.
</td>
</tr>
<tr>
<td valign="top">
<img src="http://www.machin.com.mx/wp-content/uploads/2010/06/rainbow.jpg" alt="" title="rainbow" width="150" height="163" />
</td>
<td width="100%" valign="top">
<strong>Rainbow</strong></p>
<p>La revista <strong>Rainbow</strong> era la máxima autoridad y punto de reunión de la comunidad de la <strong>Color Computer</strong>. Desafortunadamente por mucho tiempo era imposible conseguirla en la Ciudad de México por lo que solamente la podía tener cuando mi papá viajaba a Estados Unidos. Afortunadamente viajaba seguido y tenía un apartado postal donde me compró la subscripción. Mi alegría fue mayúscula cuando la ví la primera vez en los estantes del Sanborns.</p>
<p>El nivel era mayoritariamente para usuarios domésticos y con muchos juegos; lo adecuado para mi edad en ese entonces. Sin embargo hicieron un gran esfuerzo para llevar a los usuarios a conocer y entender el <strong>OS-9</strong> para aplicaciones más avanzadas y profesionales. Yo dejé de comprarla en 1990 porque cambié al mundo de las PCs.
</td>
</tr>
<tr>
<td valign="top">
<img src="http://www.machin.com.mx/wp-content/uploads/2010/06/PopularElectronics.jpg" alt="" title="PopularElectronics" width="150" height="172" />
</td>
<td width="100%" valign="top">
<strong>Popular Electronics</strong></p>
<p>Entre las revistas que mi papá compraba como electrónico estaba <strong>Popular Electronics</strong>. En cada fasículo se trataba lo más variado desde audio, video, sonido y computación. Por supuesto había "reviews", artículos de construcción y enseñanza. A mi en lo particular me gustaban mucho los artículos de <strong>Forrest M. Mims</strong>.</p>
<p>Por cierto, la imagen de la izquierda es el fascículo de julio de 1981 donde se hace un análisis de la <strong>Color Computer</strong> <img src='http://www.machin.com.mx/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  . Tengo entendido que ya no se publica.
</td>
</tr>
<tr>
<td valign="top">
<img src="http://www.machin.com.mx/wp-content/uploads/2010/06/RadioElectronics.jpg" alt="" title="RadioElectronics" width="150" height="176" />
</td>
<td width="100%" valign="top">
<strong>Radio Electronics</strong></p>
<p>Otra de las Revistas de mi papá que leía mes a mes era <strong>Radio Electrónics</strong>. Era la competencia de <strong>Popular Electronics</strong> y por lo tanto siempre se compraban las dos. Era divertido ver como había un piqué entre las dos.</p>
<p> Los Artículos de construcción eran su fuerte  y mi columna preferida era <strong>Drawing Board</strong> de <strong>Robert Grossblatt</strong>. Hasta los anuncios como los de <strong>Jameco</strong> me gustaban.
</td>
</tr>
</table>
<table width="100%" border="0" cellspacing="10">
<tr>
<td valign="top">
<img src="http://www.machin.com.mx/wp-content/uploads/2010/06/pctips.jpg" alt="" title="pctips" width="150" height="174" />
</td>
<td width="100%" valign="top">
<strong>PC Tips</strong></p>
<p>La revista <strong>PC/Tips</strong> era una de mis revistas favoritas porque era escrita por mexicanos. No por un sentimiento patriotero; sino porque tenía ese enfoque hacia la idiosincracia, problematica y realidad nacional de aquellos tiempos. Se evaluaban programas, se tenían artículos de programación hasta de lenguaje ensamblador. Por supuesto que eran muy valiosos los articulos de <strong>Dbase</strong>, tan de moda en esas épocas. </p>
<p>Desafortunadamente después se convirtió en la revista <strong>Byte de México</strong> y poco a poco se convirtió en una traducción recortada de la versión norteamericana.
</td>
</tr>
</table>

<p></p>]]></content:encoded>
			<wfw:commentRss>http://www.machin.com.mx/archives/4636/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Para el próximo proyecto</title>
		<link>http://www.machin.com.mx/archives/1991</link>
		<comments>http://www.machin.com.mx/archives/1991#comments</comments>
		<pubDate>Sun, 05 Apr 2009 20:32:13 +0000</pubDate>
		<dc:creator>Jorge Machin</dc:creator>
				<category><![CDATA[Color Computer]]></category>
		<category><![CDATA[Fotografías]]></category>
		<category><![CDATA[Humor]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.machin.com.mx/archives/1991</guid>
		<description><![CDATA[<p align="center"><center><br />
<div class="igallery"><img src="/iGallery/proyecto/tarot.jpg" alt=" Para la planeación" id="206329"  title=" Para la planeación" /><br /><a href="javascript:swapPhoto('/iGallery/proyecto/tarot.jpg','206329')"><img src="/iGallery/proyecto/TN-tarot.jpg" width="56" height="42" alt=" Para la planeación" title=" Para la planeación" /></a><a href="javascript:swapPhoto('/iGallery/proyecto/gatitos2.jpg','206329')"><img src="/iGallery/proyecto/TN-gatitos2.jpg" width="56" height="42" alt=" Para la buena suerte" title=" Para la buena suerte" /></a><a href="javascript:swapPhoto('/iGallery/proyecto/tes.jpg','206329')"><img src="/iGallery/proyecto/TN-tes.jpg" width="56" height="42" alt="  Para llevar todo tranquilo" title="  Para llevar todo tranquilo" /></a><a href="javascript:swapPhoto('/iGallery/proyecto/altatecnologia.jpg','206329')"><img src="/iGallery/proyecto/TN-altatecnologia.jpg" width="56" height="42" alt=" Para programar agusto" title=" Para programar agusto" /></a></div>
</center></p>

]]></description>
			<content:encoded><![CDATA[<p align="center"><center><br />
<div class="igallery"><img src="/iGallery/proyecto/tarot.jpg" alt=" Para la planeación" id="543005"  title=" Para la planeación" /><br /><a href="javascript:swapPhoto('/iGallery/proyecto/tarot.jpg','543005')"><img src="/iGallery/proyecto/TN-tarot.jpg" width="56" height="42" alt=" Para la planeación" title=" Para la planeación" /></a><a href="javascript:swapPhoto('/iGallery/proyecto/gatitos2.jpg','543005')"><img src="/iGallery/proyecto/TN-gatitos2.jpg" width="56" height="42" alt=" Para la buena suerte" title=" Para la buena suerte" /></a><a href="javascript:swapPhoto('/iGallery/proyecto/tes.jpg','543005')"><img src="/iGallery/proyecto/TN-tes.jpg" width="56" height="42" alt="  Para llevar todo tranquilo" title="  Para llevar todo tranquilo" /></a><a href="javascript:swapPhoto('/iGallery/proyecto/altatecnologia.jpg','543005')"><img src="/iGallery/proyecto/TN-altatecnologia.jpg" width="56" height="42" alt=" Para programar agusto" title=" Para programar agusto" /></a></div>
</center></p>

<p></p>]]></content:encoded>
			<wfw:commentRss>http://www.machin.com.mx/archives/1991/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Mis libros obsoletos</title>
		<link>http://www.machin.com.mx/archives/1868</link>
		<comments>http://www.machin.com.mx/archives/1868#comments</comments>
		<pubDate>Wed, 28 Jan 2009 09:14:49 +0000</pubDate>
		<dc:creator>Jorge Machin</dc:creator>
				<category><![CDATA[Arqueología Machinesca]]></category>
		<category><![CDATA[Color Computer]]></category>
		<category><![CDATA[Libros]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.machin.com.mx/?p=1868</guid>
		<description><![CDATA[<p>Debo reconocer que los libros que estoy poniendo en este post están tan obsoletos que seguramente no tengan otro lugar que la basura. Sin embargo, son libros que quiero mucho y conservo con cariño porque en su época me enseñaron muchas cosas interesantes o incluso con su ayuda pude salir bien librado en mis trabajos.</p>
<table width="100%" border="0" cellpadding="10">
<tr>
<td valign="top">
<img src="http://www.machin.com.mx/wp-content/uploads/2009/01/lmdragon.jpg" alt="Lenguaje de Máquina del Dragon" title="Lenguaje de Máquina del Dragon" width="100" height="162"  />
</td>
<td width="100%" valign="top">
<strong>Lenguaje de Máquina del Dragon</strong></p>
<p>Con este libro aprendí mis rudimentos de lenguaje ensamblador por el año de 1985. Estaba orientado a usuarios domésticos por lo que realmente fue muy iluminador a mis 14 años. Otra cosa muy interesante que es digna de mencionar de este libro, es que incluye un útil desensamblador escrito en BASIC en uno de sus apéndices.
</td>
</tr>
<tr>
<td valign="top">
<img src="http://www.machin.com.mx/wp-content/uploads/2009/01/network.jpg" alt="Network Programming in C" title="Network Programming in C" width="100" height="127" />
</td>
<td width="100%" valign="top">
<strong>Network Programming in C</strong></p>
<p>Este libro lo quiero muchísimo porque en 1994 hizo realidad uno de mis sueños: hacer un programa que comunicara dos computadoras. Explicaba a detalle los protocolos IPX, SPX y NetBIOS que eran los básicos en aquellos tiempos. El libro incluía un diskette con aplicaciones, entre ellas un interesante  programa de correo electrónico.
</td>
</tr>
<tr>
<td valign="top">
<img src="http://www.machin.com.mx/wp-content/uploads/2009/01/ttldatabook.jpg" alt="The TTL Data Book" title="The TTL Data Book" width="100" height="147"  />
</td>
<td width="100%" valign="top">
<strong>The TTL Data Book</strong></p>
<p>Este libro realmente no sé si está obsoleto, pero si es muy viejo (1978) y ya no lo uso. Era de mi papá y yo lo empecé a consultar desde 1986 y durante los siguientes 10 años no paré de buscar en él los diagramas de los circuitos integrados para mis proyectos de electrónica. Sin duda, uno de los libros que más he usado.
</td>
</tr>
</table>

]]></description>
			<content:encoded><![CDATA[<p>Debo reconocer que los libros que estoy poniendo en este post están tan obsoletos que seguramente no tengan otro lugar que la basura. Sin embargo, son libros que quiero mucho y conservo con cariño porque en su época me enseñaron muchas cosas interesantes o incluso con su ayuda pude salir bien librado en mis trabajos.</p>
<table width="100%" border="0" cellpadding="10">
<tr>
<td valign="top">
<img src="http://www.machin.com.mx/wp-content/uploads/2009/01/lmdragon.jpg" alt="Lenguaje de Máquina del Dragon" title="Lenguaje de Máquina del Dragon" width="100" height="162"  />
</td>
<td width="100%" valign="top">
<strong>Lenguaje de Máquina del Dragon</strong></p>
<p>Con este libro aprendí mis rudimentos de lenguaje ensamblador por el año de 1985. Estaba orientado a usuarios domésticos por lo que realmente fue muy iluminador a mis 14 años. Otra cosa muy interesante que es digna de mencionar de este libro, es que incluye un útil desensamblador escrito en BASIC en uno de sus apéndices.
</td>
</tr>
<tr>
<td valign="top">
<img src="http://www.machin.com.mx/wp-content/uploads/2009/01/network.jpg" alt="Network Programming in C" title="Network Programming in C" width="100" height="127" />
</td>
<td width="100%" valign="top">
<strong>Network Programming in C</strong></p>
<p>Este libro lo quiero muchísimo porque en 1994 hizo realidad uno de mis sueños: hacer un programa que comunicara dos computadoras. Explicaba a detalle los protocolos IPX, SPX y NetBIOS que eran los básicos en aquellos tiempos. El libro incluía un diskette con aplicaciones, entre ellas un interesante  programa de correo electrónico.
</td>
</tr>
<tr>
<td valign="top">
<img src="http://www.machin.com.mx/wp-content/uploads/2009/01/ttldatabook.jpg" alt="The TTL Data Book" title="The TTL Data Book" width="100" height="147"  />
</td>
<td width="100%" valign="top">
<strong>The TTL Data Book</strong></p>
<p>Este libro realmente no sé si está obsoleto, pero si es muy viejo (1978) y ya no lo uso. Era de mi papá y yo lo empecé a consultar desde 1986 y durante los siguientes 10 años no paré de buscar en él los diagramas de los circuitos integrados para mis proyectos de electrónica. Sin duda, uno de los libros que más he usado.
</td>
</tr>
</table>

<p></p>]]></content:encoded>
			<wfw:commentRss>http://www.machin.com.mx/archives/1868/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mis libros favoritos sobre programación/informática</title>
		<link>http://www.machin.com.mx/archives/1216</link>
		<comments>http://www.machin.com.mx/archives/1216#comments</comments>
		<pubDate>Tue, 25 Nov 2008 18:39:45 +0000</pubDate>
		<dc:creator>Jorge Machin</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Libros]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.machin.com.mx/?p=1216</guid>
		<description><![CDATA[<p>En este post, iré poniendo mis libros favoritos que traten sobre programación y computadoras. Desafortunadamente, muchos de ellos se irán haciendo obsoletos con el paso del tiempo. Los trataré de mantener conforme sigan vigentes.</p>
<table width="100%" border="0" cellpadding="10">
<tr>
<td valign="top">
<img src="http://www.machin.com.mx/wp-content/uploads/2008/11/emergentes100.jpg" alt="emergentes100" title="emergentes100" width="100" height="157" border="1" />
</td>
<td valign="top">
<strong>Sistemas Emergentes</strong></p>
<p>Este libro de <strong>Steven Johnson</strong> nos explica como la naturaleza se organiza para crear comportamientos inteligentes en sus elementos primitivos y los más "evolucionados" como el hombre. Ya sea con sólo individuos de una sola especie o interactuando varias especies de millones de seres cada una.  A esto que se le conocía como "inteligencia colectiva" y  lo podemos apreciar ya sea en un hormiguero o en una metrópolis aparentemente caótica como  la Ciudad de México.</p>
<p>Por supuesto que este entendimiento es aplicable a la informática y nos explica como es posible que dentro del caos del Internet, sitios como la <strong>Wikipedia</strong> que esta dispuesta al libre albedrío de los internautas sea ahora una de nuestras fuentes de conocimiento más valiosa y fracasen esfuerzos como su contra-parte <strong>Encarta</strong>. Hay otros ejemplos como el Internet vs MSN ¿A la larga pasará lo mismo con aplicaciones cerradas con el surgimiento del software libre?</p>
<p>Las aplicaciones son tremendas en video-juegos y han funcionado para recomendar libros en sitios como <strong>Amazon</strong>.  Además el libro tiene mucha historia de personajes claves como <strong>Turing</strong>. Altamente recomendado.
</td>
</tr>
<tr>
<td valign="top">
<img src="http://www.machin.com.mx/wp-content/uploads/2008/11/geb.jpg" alt="" title="Gödel, Escher, Bach" width="100" height="136"  />
</td>
<td width="100%" valign="top">
<strong>Gödel, Escher, Bach - Una eterna trenza dorada</strong></p>
<p>Este libro lo conocí gracias a mi hermano, que lo estaba leyendo él cuando estudiaba en la universidad. Me intrigó y lo leí. Conforme pasaba las hojas, descubría muchas cosas que ya intuía de la naturaleza y otras que modificaron mi forma de ver el mundo desde esos días. Con él comprendí los alcances de la ciencia y los paralelismos de las leyes de la naturaleza en campos tan distantes como matemáticas, budismo zen, música, programación e Inteligencia Artificial. </p>
<p>Desafortunadamente, el tiempo no pasa en vano y ya hay muchos avances tecnológicos que por obvias razones no se tocan y algunos de los conocimientos se sienten un poco atrasados para los nuevos lectores. Aún así lo considero un excelente libro.
</td>
</tr>
<tr>
<td valign="top">
<img src="http://www.machin.com.mx/wp-content/uploads/2008/11/3pilares.jpg" alt="" title="Los tres pilares del zen" width="100" height="151" border="1" />
</td>
<td width="100%" valign="top">
<strong>Los tres pilares del zen</strong></p>
<p>Este libro no es propiamente de programación, pero si de una filosofía que tiene métodos de entrenamiento que pueden ser muy útiles para las personas que necesitan abstraer la esencia de las cosas o que necesitan acallar los pensamientos que distraen y conseguir  así una mente ordenada.</p>
<p>Philip Kapleau logra con éxito explicar e introducirnos al zen a nosotros los profanos, sin desviarnos de lo que realmente es y sin dar falsas imágenes eruditas o seudocientíficas. Debo confesar que además de las técnicas de concentración, su filosofía me gusta mucho porque tiene muchas coincidencias con mi propia cosmovisión.
</td>
</tr>
<tr>
<td valign="top">
<img src="http://www.machin.com.mx/wp-content/uploads/2008/12/sistemasoperativos.jpg" alt="" title="Sistemas Operativos" width="100" height="138"  />
</td>
<td valign="top">
<strong>Sistemas Operativos</strong></p>
<p>La primera edición de este libro la leí aproximadamente en el año de 1992 y me permitió entender como funcionaba la multitarea y los sistemas de manejo de memoria como la paginación. Afortunadamente ya  había visto estos conceptos en acción desde 1988 con mi <strong>Color Computer</strong> porque el <strong>MS-DOS</strong> que use después no llegaba a tanto. Hice algunos pequeños experimentos con el procesador Z80 que usaba en aquella época para probar algunos de los conocimientos adquiridos.</p>
<p>Desafortunadamente, este libro ya no esta a la venta y es una verdadera pena porque el autor explica los conceptos de una manera sencilla. Quizás las nuevas técnicas para construir kernels lo opacarían hoy en día, pero tengo mis dudas porque estoy seguro que su valor sigue siendo vigente para entender los conceptos y para el uso de micro-controladores que no requieren hacer un Linux desde cero.
</td>
</tr>
<tr>
<td valign="top">
<img src="http://www.machin.com.mx/wp-content/uploads/2008/11/cod100.jpg" alt="cod100" title="cod100" width="100" height="122" border="1"  />
</td>
<td valign="top">
<strong>Computer Organization and Design</strong></p>
<p>Otro libro para conocer los adentros de las estas máquinitas que cambiaron al mundo. Es un excelente libro introductorio y contiene toda la información necesaria no sólo para entender los partes de las computadoras sino también para diseñarlas. Gracias a este libro yo construí mi propio microprocesador.</p>
<p>Incluye apéndices y un CD con mucha información extra de igual valor a la de este excelente libro.
</td>
</tr>
<tr>
<td>
<img src="http://www.machin.com.mx/wp-content/uploads/2008/11/cpp.jpg" alt="" title="The C++ Programing Language" width="100" height="133"  border="1"/>
</td>
<td width="100%" valign="top">
<strong>The C++ Programing Language</strong></p>
<p>Sin duda, este es uno de los mejores libros para comprender al lenguaje C++; aunque no sea propiamente para principiantes. El mismo creador del lenguaje C++ nos explica su filosofía y las razones detrás de su diseño con justificaciones y ejemplos. Sólo por esto, vale la pena su lectura.</p>
<p>Además es un excelente manual donde se puede consultar hasta el aspecto más oscuro o extraño que se le pueda ocurrir al programador más inquieto.
</td>
</tr>
<tr>
<td>
<img src="http://www.machin.com.mx/wp-content/uploads/2008/11/datastructures.jpg" alt="" title="Data Structures with C++ using STL" width="100" height="125" border="1" />
</td>
<td valign="top">
<strong>Data Structures with C++ using STL</strong></p>
<p>A estas alturas del partido, este libro ya está algo obsoleto, no es propiamente de STL y quizás el estilo de programación de los autores no sea el mejor. Pero, es un tutorial que nos enseña los principios de las estructuras de datos y al mismo tiempo tiene los ejemplos más comunes de la STL. Yo a la fecha, siempre lo tengo en mi escritorio y no es raro que lo este consultando constantemente.
</td>
</tr>
</table>

]]></description>
			<content:encoded><![CDATA[<p>En este post, iré poniendo mis libros favoritos que traten sobre programación y computadoras. Desafortunadamente, muchos de ellos se irán haciendo obsoletos con el paso del tiempo. Los trataré de mantener conforme sigan vigentes.</p>
<table width="100%" border="0" cellpadding="10">
<tr>
<td valign="top">
<img src="http://www.machin.com.mx/wp-content/uploads/2008/11/emergentes100.jpg" alt="emergentes100" title="emergentes100" width="100" height="157" border="1" />
</td>
<td valign="top">
<strong>Sistemas Emergentes</strong></p>
<p>Este libro de <strong>Steven Johnson</strong> nos explica como la naturaleza se organiza para crear comportamientos inteligentes en sus elementos primitivos y los más "evolucionados" como el hombre. Ya sea con sólo individuos de una sola especie o interactuando varias especies de millones de seres cada una.  A esto que se le conocía como "inteligencia colectiva" y  lo podemos apreciar ya sea en un hormiguero o en una metrópolis aparentemente caótica como  la Ciudad de México.</p>
<p>Por supuesto que este entendimiento es aplicable a la informática y nos explica como es posible que dentro del caos del Internet, sitios como la <strong>Wikipedia</strong> que esta dispuesta al libre albedrío de los internautas sea ahora una de nuestras fuentes de conocimiento más valiosa y fracasen esfuerzos como su contra-parte <strong>Encarta</strong>. Hay otros ejemplos como el Internet vs MSN ¿A la larga pasará lo mismo con aplicaciones cerradas con el surgimiento del software libre?</p>
<p>Las aplicaciones son tremendas en video-juegos y han funcionado para recomendar libros en sitios como <strong>Amazon</strong>.  Además el libro tiene mucha historia de personajes claves como <strong>Turing</strong>. Altamente recomendado.
</td>
</tr>
<tr>
<td valign="top">
<img src="http://www.machin.com.mx/wp-content/uploads/2008/11/geb.jpg" alt="" title="Gödel, Escher, Bach" width="100" height="136"  />
</td>
<td width="100%" valign="top">
<strong>Gödel, Escher, Bach - Una eterna trenza dorada</strong></p>
<p>Este libro lo conocí gracias a mi hermano, que lo estaba leyendo él cuando estudiaba en la universidad. Me intrigó y lo leí. Conforme pasaba las hojas, descubría muchas cosas que ya intuía de la naturaleza y otras que modificaron mi forma de ver el mundo desde esos días. Con él comprendí los alcances de la ciencia y los paralelismos de las leyes de la naturaleza en campos tan distantes como matemáticas, budismo zen, música, programación e Inteligencia Artificial. </p>
<p>Desafortunadamente, el tiempo no pasa en vano y ya hay muchos avances tecnológicos que por obvias razones no se tocan y algunos de los conocimientos se sienten un poco atrasados para los nuevos lectores. Aún así lo considero un excelente libro.
</td>
</tr>
<tr>
<td valign="top">
<img src="http://www.machin.com.mx/wp-content/uploads/2008/11/3pilares.jpg" alt="" title="Los tres pilares del zen" width="100" height="151" border="1" />
</td>
<td width="100%" valign="top">
<strong>Los tres pilares del zen</strong></p>
<p>Este libro no es propiamente de programación, pero si de una filosofía que tiene métodos de entrenamiento que pueden ser muy útiles para las personas que necesitan abstraer la esencia de las cosas o que necesitan acallar los pensamientos que distraen y conseguir  así una mente ordenada.</p>
<p>Philip Kapleau logra con éxito explicar e introducirnos al zen a nosotros los profanos, sin desviarnos de lo que realmente es y sin dar falsas imágenes eruditas o seudocientíficas. Debo confesar que además de las técnicas de concentración, su filosofía me gusta mucho porque tiene muchas coincidencias con mi propia cosmovisión.
</td>
</tr>
<tr>
<td valign="top">
<img src="http://www.machin.com.mx/wp-content/uploads/2008/12/sistemasoperativos.jpg" alt="" title="Sistemas Operativos" width="100" height="138"  />
</td>
<td valign="top">
<strong>Sistemas Operativos</strong></p>
<p>La primera edición de este libro la leí aproximadamente en el año de 1992 y me permitió entender como funcionaba la multitarea y los sistemas de manejo de memoria como la paginación. Afortunadamente ya  había visto estos conceptos en acción desde 1988 con mi <strong>Color Computer</strong> porque el <strong>MS-DOS</strong> que use después no llegaba a tanto. Hice algunos pequeños experimentos con el procesador Z80 que usaba en aquella época para probar algunos de los conocimientos adquiridos.</p>
<p>Desafortunadamente, este libro ya no esta a la venta y es una verdadera pena porque el autor explica los conceptos de una manera sencilla. Quizás las nuevas técnicas para construir kernels lo opacarían hoy en día, pero tengo mis dudas porque estoy seguro que su valor sigue siendo vigente para entender los conceptos y para el uso de micro-controladores que no requieren hacer un Linux desde cero.
</td>
</tr>
<tr>
<td valign="top">
<img src="http://www.machin.com.mx/wp-content/uploads/2008/11/cod100.jpg" alt="cod100" title="cod100" width="100" height="122" border="1"  />
</td>
<td valign="top">
<strong>Computer Organization and Design</strong></p>
<p>Otro libro para conocer los adentros de las estas máquinitas que cambiaron al mundo. Es un excelente libro introductorio y contiene toda la información necesaria no sólo para entender los partes de las computadoras sino también para diseñarlas. Gracias a este libro yo construí mi propio microprocesador.</p>
<p>Incluye apéndices y un CD con mucha información extra de igual valor a la de este excelente libro.
</td>
</tr>
<tr>
<td>
<img src="http://www.machin.com.mx/wp-content/uploads/2008/11/cpp.jpg" alt="" title="The C++ Programing Language" width="100" height="133"  border="1"/>
</td>
<td width="100%" valign="top">
<strong>The C++ Programing Language</strong></p>
<p>Sin duda, este es uno de los mejores libros para comprender al lenguaje C++; aunque no sea propiamente para principiantes. El mismo creador del lenguaje C++ nos explica su filosofía y las razones detrás de su diseño con justificaciones y ejemplos. Sólo por esto, vale la pena su lectura.</p>
<p>Además es un excelente manual donde se puede consultar hasta el aspecto más oscuro o extraño que se le pueda ocurrir al programador más inquieto.
</td>
</tr>
<tr>
<td>
<img src="http://www.machin.com.mx/wp-content/uploads/2008/11/datastructures.jpg" alt="" title="Data Structures with C++ using STL" width="100" height="125" border="1" />
</td>
<td valign="top">
<strong>Data Structures with C++ using STL</strong></p>
<p>A estas alturas del partido, este libro ya está algo obsoleto, no es propiamente de STL y quizás el estilo de programación de los autores no sea el mejor. Pero, es un tutorial que nos enseña los principios de las estructuras de datos y al mismo tiempo tiene los ejemplos más comunes de la STL. Yo a la fecha, siempre lo tengo en mi escritorio y no es raro que lo este consultando constantemente.
</td>
</tr>
</table>

<p></p>]]></content:encoded>
			<wfw:commentRss>http://www.machin.com.mx/archives/1216/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Ciudad Konec-t</title>
		<link>http://www.machin.com.mx/archives/1084</link>
		<comments>http://www.machin.com.mx/archives/1084#comments</comments>
		<pubDate>Tue, 11 Nov 2008 06:28:10 +0000</pubDate>
		<dc:creator>Jorge Machin</dc:creator>
				<category><![CDATA[Adobe Flash]]></category>
		<category><![CDATA[Arqueología Machinesca]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Portafolio]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Videojuegos]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Konec-t]]></category>

		<guid isPermaLink="false">http://www.machin.com.mx/?p=1084</guid>
		<description><![CDATA[<p><strong>Ciudad Konec-t</strong> fué uno de los proyectos en el cual participé por mi paso por Interalia (8 años). Fue muy divertido colaborar en la programación de la parte del servidor y hacer que soportara sin problemas a más de 2600 usuarios simultáneos con tan sólo dos maquinitas.</p>
<p align="center"><center><br />
<div class="igallery"><img src="/iGallery/Konec-t/Konec-t3.jpg" alt="Así era en un principio" id="191224"  title="Así era en un principio" /><br /><a href="javascript:swapPhoto('/iGallery/Konec-t/Konec-t3.jpg','191224')"><img src="/iGallery/Konec-t/TN-Konec-t3.jpg" width="56" height="42" alt="Así era en un principio" title="Así era en un principio" /></a><a href="javascript:swapPhoto('/iGallery/Konec-t/Konec-t1.jpg','191224')"><img src="/iGallery/Konec-t/TN-Konec-t1.jpg" width="56" height="42" alt="Fue creciendo" title="Fue creciendo" /></a><a href="javascript:swapPhoto('/iGallery/Konec-t/Konec-t2.jpg','191224')"><img src="/iGallery/Konec-t/TN-Konec-t2.jpg" width="56" height="42" alt="Uno de los cuartos populares" title="Uno de los cuartos populares" /></a></div>
</center></p>
<p>Las imagenes anteriores son de la primera versión. Después se cambiaron los fondos a un diseño más actual y más 3D. </p>
<p>
<h4>Actualización:</h4>
</p>
<p>Fue una campaña publicitaria muy exitosa, duró desde octubre de 2004 a finales de Diciembre de 2009 y se extendio a varios paises latinoamericanos.</p>

]]></description>
			<content:encoded><![CDATA[<p><strong>Ciudad Konec-t</strong> fué uno de los proyectos en el cual participé por mi paso por Interalia (8 años). Fue muy divertido colaborar en la programación de la parte del servidor y hacer que soportara sin problemas a más de 2600 usuarios simultáneos con tan sólo dos maquinitas.</p>
<p align="center"><center><br />
<div class="igallery"><img src="/iGallery/Konec-t/Konec-t3.jpg" alt="Así era en un principio" id="649103"  title="Así era en un principio" /><br /><a href="javascript:swapPhoto('/iGallery/Konec-t/Konec-t3.jpg','649103')"><img src="/iGallery/Konec-t/TN-Konec-t3.jpg" width="56" height="42" alt="Así era en un principio" title="Así era en un principio" /></a><a href="javascript:swapPhoto('/iGallery/Konec-t/Konec-t1.jpg','649103')"><img src="/iGallery/Konec-t/TN-Konec-t1.jpg" width="56" height="42" alt="Fue creciendo" title="Fue creciendo" /></a><a href="javascript:swapPhoto('/iGallery/Konec-t/Konec-t2.jpg','649103')"><img src="/iGallery/Konec-t/TN-Konec-t2.jpg" width="56" height="42" alt="Uno de los cuartos populares" title="Uno de los cuartos populares" /></a></div>
</center></p>
<p>Las imagenes anteriores son de la primera versión. Después se cambiaron los fondos a un diseño más actual y más 3D. </p>
<p>
<h4>Actualización:</h4>
</p>
<p>Fue una campaña publicitaria muy exitosa, duró desde octubre de 2004 a finales de Diciembre de 2009 y se extendio a varios paises latinoamericanos.</p>

<p></p>]]></content:encoded>
			<wfw:commentRss>http://www.machin.com.mx/archives/1084/feed</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Snapshot: Hilos en C++ (Windows)</title>
		<link>http://www.machin.com.mx/archives/731</link>
		<comments>http://www.machin.com.mx/archives/731#comments</comments>
		<pubDate>Sat, 27 Sep 2008 03:29:29 +0000</pubDate>
		<dc:creator>Jorge Machin</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Snapshots]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://www.machin.com.mx/?p=731</guid>
		<description><![CDATA[<p>Una clase "quick and dirty" para crear hilos en cajas windows.</p>
<h4>Encabezado:</h4>
<p><div class="syntax_hilite">
<div id="cpp-1">
<div class="cpp"><span style="color: #339900;">#pragma once</span></p>
<p><span style="color: #339900;">#include &lt;windows.h&gt;</span></p>
<p><span style="color: #0000ff;">class</span> CThread <span style="color: #000000;">&#123;</span></p>
<p>&nbsp; &nbsp;<span style="color: #0000ff;">public</span>:</p>
<p>&nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">// Constructor por defecto:</span></p>
<p>&nbsp; &nbsp; &nbsp; CThread<span style="color: #000000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">// Destructor virtual</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">virtual</span> ~CThread<span style="color: #000000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">// Esta función inicia el hilo:</span></p>
<p>&nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">bool</span> start<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">// Esta función se debe sobrecargar con lo que tiene que hacer el hilo:</span></p>
<p>&nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">virtual</span> <span style="color: #0000ff;">void</span> run<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> = <span style="color: #0000dd;">0</span>;</p>
<p>&nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">// Esta función espera a que el hilo se detenga. Se debe llamar en el destructor de la clase derivada. </span></p>
<p>&nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">void</span> join<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;</p>
<p>&nbsp; &nbsp;<span style="color: #0000ff;">private</span>:</p>
<p>&nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">long</span> id;</p>
<p>&nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">void</span> *threadHandle;</p>
<p>&nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">static</span> DWORD WINAPI entryPoint<span style="color: #000000;">&#40;</span> <span style="color: #0000ff;">void</span> *pthis <span style="color: #000000;">&#41;</span>;</p>
<p>
<span style="color: #000000;">&#125;</span>;</div>
</div>
</div>
<p>
</p>
<h4>Archivo cpp:</h4>
<p><div class="syntax_hilite">
<div id="cpp-2">
<div class="cpp"><span style="color: #339900;">#include &quot;StdAfx.h&quot;</span><br />
<span style="color: #339900;">#include &quot;thread.h&quot;</span></p>
<p>CThread::<span style="color: #00eeff;">CThread</span><span style="color: #000000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&#41;</span> : threadHandle<span style="color: #000000;">&#40;</span> <span style="color: #0000ff;">NULL</span> <span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span></p>
<p>&nbsp; &nbsp;MessageBox<span style="color: #000000;">&#40;</span> <span style="color: #0000ff;">NULL</span>, <span style="color: #666666;">"CThread::CThread"</span>, <span style="color: #666666;">"Aviso"</span>, MB_OK <span style="color: #000000;">&#41;</span>;</p>
<p><span style="color: #000000;">&#125;</span></p>
<p>DWORD WINAPI CThread::<span style="color: #00eeff;">entryPoint</span><span style="color: #000000;">&#40;</span> <span style="color: #0000ff;">void</span> *pthis <span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span></p>
<p>&nbsp; &nbsp;CThread *pt = <span style="color: #000000;">&#40;</span> CThread * <span style="color: #000000;">&#41;</span> pthis;<br />
&nbsp; &nbsp;pt -&gt; run<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp;<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span>;</p>
<p><span style="color: #000000;">&#125;</span></p>
<p>
<span style="color: #0000ff;">bool</span> CThread::<span style="color: #00eeff;">start</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span></p>
<p>&nbsp; &nbsp;threadHandle = CreateThread<span style="color: #000000;">&#40;</span> <span style="color: #0000ff;">NULL</span>, <span style="color: #0000dd;">0</span>, <span style="color: #000000;">&#40;</span> LPTHREAD_START_ROUTINE <span style="color: #000000;">&#41;</span> entryPoint, <span style="color: #0000dd;">this</span>, <span style="color: #0000dd;">0</span>, &amp;id <span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp;<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span>;</p>
<p><span style="color: #000000;">&#125;</span></p>
<p>
<span style="color: #0000ff;">void</span> CThread::<span style="color: #00eeff;">join</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span></p>
<p>&nbsp; &nbsp;<span style="color: #0000ff;">if</span> <span style="color: #000000;">&#40;</span> threadHandle != <span style="color: #0000ff;">NULL</span> <span style="color: #000000;">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; WaitForSingleObject<span style="color: #000000;">&#40;</span> threadHandle, INFINITE <span style="color: #000000;">&#41;</span>;</p>
<p><span style="color: #000000;">&#125;</span></p>
<p>
CThread::~CThread<span style="color: #000000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span></p>
<p>&nbsp; &nbsp;MessageBox<span style="color: #000000;">&#40;</span> <span style="color: #0000ff;">NULL</span>, <span style="color: #666666;">"CThread::~CThread"</span>, <span style="color: #666666;">"Aviso"</span>, MB_OK <span style="color: #000000;">&#41;</span>;</p>
<p>&nbsp; &nbsp;<span style="color: #0000ff;">if</span> <span style="color: #000000;">&#40;</span> threadHandle != <span style="color: #0000ff;">NULL</span> <span style="color: #000000;">&#41;</span>&nbsp; &nbsp;</p>
<p>&nbsp; &nbsp; &nbsp; CloseHandle<span style="color: #000000;">&#40;</span> threadHandle <span style="color: #000000;">&#41;</span>;</p>
<p><span style="color: #000000;">&#125;</span></div>
</div>
</div>
<p></p>
<p>Como se dislumbra de los comentarios, para utilizarla es necesario crear una clase que herede de Cthrean y sobrecargar la función run con lo que debe hacer nuestro hilo.</p>

]]></description>
			<content:encoded><![CDATA[<p>Una clase "quick and dirty" para crear hilos en cajas windows.</p>
<h4>Encabezado:</h4>
<p><div class="syntax_hilite">
<div id="cpp-3">
<div class="cpp"><span style="color: #339900;">#pragma once</span></p>
<p><span style="color: #339900;">#include &lt;windows.h&gt;</span></p>
<p><span style="color: #0000ff;">class</span> CThread <span style="color: #000000;">&#123;</span></p>
<p>&nbsp; &nbsp;<span style="color: #0000ff;">public</span>:</p>
<p>&nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">// Constructor por defecto:</span></p>
<p>&nbsp; &nbsp; &nbsp; CThread<span style="color: #000000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">// Destructor virtual</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">virtual</span> ~CThread<span style="color: #000000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">// Esta función inicia el hilo:</span></p>
<p>&nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">bool</span> start<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">// Esta función se debe sobrecargar con lo que tiene que hacer el hilo:</span></p>
<p>&nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">virtual</span> <span style="color: #0000ff;">void</span> run<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> = <span style="color: #0000dd;">0</span>;</p>
<p>&nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">// Esta función espera a que el hilo se detenga. Se debe llamar en el destructor de la clase derivada. </span></p>
<p>&nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">void</span> join<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;</p>
<p>&nbsp; &nbsp;<span style="color: #0000ff;">private</span>:</p>
<p>&nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">long</span> id;</p>
<p>&nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">void</span> *threadHandle;</p>
<p>&nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">static</span> DWORD WINAPI entryPoint<span style="color: #000000;">&#40;</span> <span style="color: #0000ff;">void</span> *pthis <span style="color: #000000;">&#41;</span>;</p>
<p>
<span style="color: #000000;">&#125;</span>;</div>
</div>
</div>
<p>
</p>
<h4>Archivo cpp:</h4>
<p><div class="syntax_hilite">
<div id="cpp-4">
<div class="cpp"><span style="color: #339900;">#include &quot;StdAfx.h&quot;</span><br />
<span style="color: #339900;">#include &quot;thread.h&quot;</span></p>
<p>CThread::<span style="color: #00eeff;">CThread</span><span style="color: #000000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&#41;</span> : threadHandle<span style="color: #000000;">&#40;</span> <span style="color: #0000ff;">NULL</span> <span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span></p>
<p>&nbsp; &nbsp;MessageBox<span style="color: #000000;">&#40;</span> <span style="color: #0000ff;">NULL</span>, <span style="color: #666666;">"CThread::CThread"</span>, <span style="color: #666666;">"Aviso"</span>, MB_OK <span style="color: #000000;">&#41;</span>;</p>
<p><span style="color: #000000;">&#125;</span></p>
<p>DWORD WINAPI CThread::<span style="color: #00eeff;">entryPoint</span><span style="color: #000000;">&#40;</span> <span style="color: #0000ff;">void</span> *pthis <span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span></p>
<p>&nbsp; &nbsp;CThread *pt = <span style="color: #000000;">&#40;</span> CThread * <span style="color: #000000;">&#41;</span> pthis;<br />
&nbsp; &nbsp;pt -&gt; run<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp;<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span>;</p>
<p><span style="color: #000000;">&#125;</span></p>
<p>
<span style="color: #0000ff;">bool</span> CThread::<span style="color: #00eeff;">start</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span></p>
<p>&nbsp; &nbsp;threadHandle = CreateThread<span style="color: #000000;">&#40;</span> <span style="color: #0000ff;">NULL</span>, <span style="color: #0000dd;">0</span>, <span style="color: #000000;">&#40;</span> LPTHREAD_START_ROUTINE <span style="color: #000000;">&#41;</span> entryPoint, <span style="color: #0000dd;">this</span>, <span style="color: #0000dd;">0</span>, &amp;id <span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp;<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span>;</p>
<p><span style="color: #000000;">&#125;</span></p>
<p>
<span style="color: #0000ff;">void</span> CThread::<span style="color: #00eeff;">join</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span></p>
<p>&nbsp; &nbsp;<span style="color: #0000ff;">if</span> <span style="color: #000000;">&#40;</span> threadHandle != <span style="color: #0000ff;">NULL</span> <span style="color: #000000;">&#41;</span></p>
<p>&nbsp; &nbsp; &nbsp; WaitForSingleObject<span style="color: #000000;">&#40;</span> threadHandle, INFINITE <span style="color: #000000;">&#41;</span>;</p>
<p><span style="color: #000000;">&#125;</span></p>
<p>
CThread::~CThread<span style="color: #000000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span></p>
<p>&nbsp; &nbsp;MessageBox<span style="color: #000000;">&#40;</span> <span style="color: #0000ff;">NULL</span>, <span style="color: #666666;">"CThread::~CThread"</span>, <span style="color: #666666;">"Aviso"</span>, MB_OK <span style="color: #000000;">&#41;</span>;</p>
<p>&nbsp; &nbsp;<span style="color: #0000ff;">if</span> <span style="color: #000000;">&#40;</span> threadHandle != <span style="color: #0000ff;">NULL</span> <span style="color: #000000;">&#41;</span>&nbsp; &nbsp;</p>
<p>&nbsp; &nbsp; &nbsp; CloseHandle<span style="color: #000000;">&#40;</span> threadHandle <span style="color: #000000;">&#41;</span>;</p>
<p><span style="color: #000000;">&#125;</span></div>
</div>
</div>
<p></p>
<p>Como se dislumbra de los comentarios, para utilizarla es necesario crear una clase que herede de Cthrean y sobrecargar la función run con lo que debe hacer nuestro hilo.</p>

<p></p>]]></content:encoded>
			<wfw:commentRss>http://www.machin.com.mx/archives/731/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Snapshot: Obteniendo archivos HTTP en C++</title>
		<link>http://www.machin.com.mx/archives/723</link>
		<comments>http://www.machin.com.mx/archives/723#comments</comments>
		<pubDate>Fri, 26 Sep 2008 03:18:16 +0000</pubDate>
		<dc:creator>Jorge Machin</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Snapshots]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[curl]]></category>
		<category><![CDATA[libcurl]]></category>

		<guid isPermaLink="false">http://www.machin.com.mx/?p=723</guid>
		<description><![CDATA[<p>Ya es común para un programador, no solamente el tener que leer archivos del disco duro local, sino también leerlos desde un sitio web; Ya sea un web service, una imagen o un XML. Afortunadamente la libreria <a href="http://curl.haxx.se/" onclick="pageTracker._trackPageview('/outgoing/curl.haxx.se/?referer=');">libcurl</a> resuelve el problema con muy pocas líneas de código.</p>
<p>En este post, pongo un pequeño ejemplo de como se usaría en C++ para pequeños programas de apoyo:</p>
<div class="syntax_hilite">
<div id="cpp-5">
<div class="cpp"><span style="color: #339900;">#include &lt;string&gt;</span><br />
<span style="color: #339900;">#include &lt;iostream&gt;</span></p>
<p><span style="color: #339900;">#include &quot;curl/curl.h&quot;&nbsp; </span></p>
<p><span style="color: #0000ff;">class</span> URLFile <span style="color: #000000;">&#123;</span></p>
<p>&nbsp; &nbsp;<span style="color: #0000ff;">public</span>:</p>
<p>&nbsp; &nbsp; &nbsp; std::<span style="color: #00eeff;">string</span> get<span style="color: #000000;">&#40;</span> <span style="color: #0000ff;">const</span> std::<span style="color: #00eeff;">string</span> &amp;URL <span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff0000;">// Inicialización:</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CURL *curl = curl_easy_init<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff0000;">// URL a consultar</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;curl_easy_setopt<span style="color: #000000;">&#40;</span> curl, CURLOPT_URL, URL.<span style="color: #00eeff;">c_str</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#41;</span>;</p>
<p>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff0000;">// Configuaración del callback</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;curl_easy_setopt<span style="color: #000000;">&#40;</span> curl, CURLOPT_WRITEFUNCTION, &amp;URLFile::<span style="color: #00eeff;">write_data</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;curl_easy_setopt<span style="color: #000000;">&#40;</span> curl, CURLOPT_WRITEDATA, &amp;data<span style="color: #000000;">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff0000;">// Obtén el archivo:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CURLcode result = curl_easy_perform<span style="color: #000000;">&#40;</span>curl<span style="color: #000000;">&#41;</span>;&nbsp; </p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff0000;">// Al final hay que limpiar todo:</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;curl_easy_cleanup<span style="color: #000000;">&#40;</span>curl<span style="color: #000000;">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #0000ff;">if</span> <span style="color: #000000;">&#40;</span>result != CURLE_OK<span style="color: #000000;">&#41;</span>&nbsp; <span style="color: #000000;">&#123;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">return</span> <span style="color: #666666;">""</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000000;">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #0000ff;">return</span> data;</p>
<p>&nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span></p>
<p>&nbsp; &nbsp;<span style="color: #0000ff;">private</span>:<br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">// Variable que usamos para guardar el contenido del archivo:</span></p>
<p>&nbsp; &nbsp; &nbsp; std::<span style="color: #00eeff;">string</span> data;</p>
<p>&nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">// Callback que utiliza curl:</span></p>
<p>&nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">size_t</span> write_data<span style="color: #000000;">&#40;</span> <span style="color: #0000ff;">char</span> *buffer, <span style="color: #0000ff;">size_t</span> size, <span style="color: #0000ff;">size_t</span> nmemb, <span style="color: #0000ff;">void</span> *userp <span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #0000ff;">int</span> len = size * nmemb;<br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #0000ff;">if</span> <span style="color: #000000;">&#40;</span> buffer != <span style="color: #0000ff;">NULL</span> <span style="color: #000000;">&#41;</span>&nbsp; </p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#40;</span> <span style="color: #000000;">&#40;</span> std::<span style="color: #00eeff;">string</span> * <span style="color: #000000;">&#41;</span>&nbsp; userp <span style="color: #000000;">&#41;</span>-&gt;append<span style="color: #000000;">&#40;</span> buffer, len <span style="color: #000000;">&#41;</span>;&nbsp; </p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #0000ff;">return</span> len;</p>
<p>&nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp;<br />
<span style="color: #000000;">&#125;</span>;</p>
<p><span style="color: #0000ff;">int</span> main<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span></p>
<p>&nbsp; &nbsp;URLFile <span style="color: #0000ff;">file</span>;</p>
<p>&nbsp; &nbsp;std::<span style="color: #00eeff;">string</span> test = <span style="color: #0000ff;">file</span>.<span style="color: #00eeff;">get</span><span style="color: #000000;">&#40;</span> <span style="color: #666666;">"www.machin.com.mx"</span> <span style="color: #000000;">&#41;</span>;</p>
<p>&nbsp; &nbsp;std::<span style="color: #0000dd;">cout</span> &lt;&lt;<span style="color: #666666;">"Test:"</span> &lt;&lt;std::<span style="color: #00eeff;">endl</span> &lt;&lt;test &lt;&lt;std::<span style="color: #00eeff;">endl</span>;</p>
<p>&nbsp; &nbsp;<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span>;</p>
<p><span style="color: #000000;">&#125;</span></div>
</div>
</div>
<p></p>

]]></description>
			<content:encoded><![CDATA[<p>Ya es común para un programador, no solamente el tener que leer archivos del disco duro local, sino también leerlos desde un sitio web; Ya sea un web service, una imagen o un XML. Afortunadamente la libreria <a href="http://curl.haxx.se/" onclick="pageTracker._trackPageview('/outgoing/curl.haxx.se/?referer=');">libcurl</a> resuelve el problema con muy pocas líneas de código.</p>
<p>En este post, pongo un pequeño ejemplo de como se usaría en C++ para pequeños programas de apoyo:</p>
<div class="syntax_hilite">
<div id="cpp-6">
<div class="cpp"><span style="color: #339900;">#include &lt;string&gt;</span><br />
<span style="color: #339900;">#include &lt;iostream&gt;</span></p>
<p><span style="color: #339900;">#include &quot;curl/curl.h&quot;&nbsp; </span></p>
<p><span style="color: #0000ff;">class</span> URLFile <span style="color: #000000;">&#123;</span></p>
<p>&nbsp; &nbsp;<span style="color: #0000ff;">public</span>:</p>
<p>&nbsp; &nbsp; &nbsp; std::<span style="color: #00eeff;">string</span> get<span style="color: #000000;">&#40;</span> <span style="color: #0000ff;">const</span> std::<span style="color: #00eeff;">string</span> &amp;URL <span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff0000;">// Inicialización:</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CURL *curl = curl_easy_init<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff0000;">// URL a consultar</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;curl_easy_setopt<span style="color: #000000;">&#40;</span> curl, CURLOPT_URL, URL.<span style="color: #00eeff;">c_str</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#41;</span>;</p>
<p>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff0000;">// Configuaración del callback</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;curl_easy_setopt<span style="color: #000000;">&#40;</span> curl, CURLOPT_WRITEFUNCTION, &amp;URLFile::<span style="color: #00eeff;">write_data</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;curl_easy_setopt<span style="color: #000000;">&#40;</span> curl, CURLOPT_WRITEDATA, &amp;data<span style="color: #000000;">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff0000;">// Obtén el archivo:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CURLcode result = curl_easy_perform<span style="color: #000000;">&#40;</span>curl<span style="color: #000000;">&#41;</span>;&nbsp; </p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff0000;">// Al final hay que limpiar todo:</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;curl_easy_cleanup<span style="color: #000000;">&#40;</span>curl<span style="color: #000000;">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #0000ff;">if</span> <span style="color: #000000;">&#40;</span>result != CURLE_OK<span style="color: #000000;">&#41;</span>&nbsp; <span style="color: #000000;">&#123;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">return</span> <span style="color: #666666;">""</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000000;">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #0000ff;">return</span> data;</p>
<p>&nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span></p>
<p>&nbsp; &nbsp;<span style="color: #0000ff;">private</span>:<br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">// Variable que usamos para guardar el contenido del archivo:</span></p>
<p>&nbsp; &nbsp; &nbsp; std::<span style="color: #00eeff;">string</span> data;</p>
<p>&nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">// Callback que utiliza curl:</span></p>
<p>&nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">size_t</span> write_data<span style="color: #000000;">&#40;</span> <span style="color: #0000ff;">char</span> *buffer, <span style="color: #0000ff;">size_t</span> size, <span style="color: #0000ff;">size_t</span> nmemb, <span style="color: #0000ff;">void</span> *userp <span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #0000ff;">int</span> len = size * nmemb;<br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #0000ff;">if</span> <span style="color: #000000;">&#40;</span> buffer != <span style="color: #0000ff;">NULL</span> <span style="color: #000000;">&#41;</span>&nbsp; </p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#40;</span> <span style="color: #000000;">&#40;</span> std::<span style="color: #00eeff;">string</span> * <span style="color: #000000;">&#41;</span>&nbsp; userp <span style="color: #000000;">&#41;</span>-&gt;append<span style="color: #000000;">&#40;</span> buffer, len <span style="color: #000000;">&#41;</span>;&nbsp; </p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #0000ff;">return</span> len;</p>
<p>&nbsp; &nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp;<br />
<span style="color: #000000;">&#125;</span>;</p>
<p><span style="color: #0000ff;">int</span> main<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span></p>
<p>&nbsp; &nbsp;URLFile <span style="color: #0000ff;">file</span>;</p>
<p>&nbsp; &nbsp;std::<span style="color: #00eeff;">string</span> test = <span style="color: #0000ff;">file</span>.<span style="color: #00eeff;">get</span><span style="color: #000000;">&#40;</span> <span style="color: #666666;">"www.machin.com.mx"</span> <span style="color: #000000;">&#41;</span>;</p>
<p>&nbsp; &nbsp;std::<span style="color: #0000dd;">cout</span> &lt;&lt;<span style="color: #666666;">"Test:"</span> &lt;&lt;std::<span style="color: #00eeff;">endl</span> &lt;&lt;test &lt;&lt;std::<span style="color: #00eeff;">endl</span>;</p>
<p>&nbsp; &nbsp;<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span>;</p>
<p><span style="color: #000000;">&#125;</span></div>
</div>
</div>
<p></p>

<p></p>]]></content:encoded>
			<wfw:commentRss>http://www.machin.com.mx/archives/723/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Don Gato, ¿El verdadero inventor del lenguaje Logo?</title>
		<link>http://www.machin.com.mx/archives/214</link>
		<comments>http://www.machin.com.mx/archives/214#comments</comments>
		<pubDate>Mon, 03 Mar 2008 07:22:19 +0000</pubDate>
		<dc:creator>Jorge Machin</dc:creator>
				<category><![CDATA[Humor]]></category>
		<category><![CDATA[Lenguajes]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Don Gato]]></category>
		<category><![CDATA[Languages]]></category>
		<category><![CDATA[Logo]]></category>
		<category><![CDATA[Top Cat]]></category>

		<guid isPermaLink="false">http://www.machin.com.mx/archives/214</guid>
		<description><![CDATA[<p>No lo he investigado a fondo, pero en un capítulo de <a href="http://en.wikipedia.org/wiki/Top_Cat" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Top_Cat?referer=');">Don Gato</a> (Top Cat) de 1962, utiliza algo muy similar al <strong>lenguaje Logo</strong> para hacer una pintura:</p>
<div class="igallery"><img src="/iGallery/logo/logo0.jpg" alt="Preparando todo" id="941866"  title="Preparando todo" /><br /><a href="javascript:swapPhoto('/iGallery/logo/logo0.jpg','941866')"><img src="/iGallery/logo/TN-logo0.jpg" width="56" height="42" alt="Preparando todo" title="Preparando todo" /></a><a href="javascript:swapPhoto('/iGallery/logo/logo1.jpg','941866')"><img src="/iGallery/logo/TN-logo1.jpg" width="56" height="42" alt="Acercamiento" title="Acercamiento" /></a><a href="javascript:swapPhoto('/iGallery/logo/logo2.jpg','941866')"><img src="/iGallery/logo/TN-logo2.jpg" width="56" height="42" alt="Alejamiento" title="Alejamiento" /></a><a href="javascript:swapPhoto('/iGallery/logo/logo3.jpg','941866')"><img src="/iGallery/logo/TN-logo3.jpg" width="56" height="42" alt="Don Gato ejecutando los comandos Stop, Left... Forward!" title="Don Gato ejecutando los comandos Stop, Left... Forward!" /></a></div>
<p>Pero, según la Wikipedia,  ¡el <a href="http://en.wikipedia.org/wiki/Logo_(programming_language)" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Logo_programming_language?referer=');">lenguaje Logo</a> no fue creado hasta 1967! Saque usted sus propias conclusiones <img src='http://www.machin.com.mx/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h4>Para saber más:</h4>
<p>Si quieres conocer más del lenguaje <strong>logo</strong>, puedes bajar un interprete en:</p>
<p><a href="http://www.cs.berkeley.edu/~bh/logo.html" onclick="pageTracker._trackPageview('/outgoing/www.cs.berkeley.edu/_bh/logo.html?referer=');">http://www.cs.berkeley.edu/~bh/logo.html</a><br />
<a href="http://sourceforge.net/project/showfiles.php?group_id=149686" onclick="pageTracker._trackPageview('/outgoing/sourceforge.net/project/showfiles.php?group_id=149686&amp;referer=');">http://sourceforge.net/project/showfiles.php?group_id=149686</a></p>

]]></description>
			<content:encoded><![CDATA[<p>No lo he investigado a fondo, pero en un capítulo de <a href="http://en.wikipedia.org/wiki/Top_Cat" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Top_Cat?referer=');">Don Gato</a> (Top Cat) de 1962, utiliza algo muy similar al <strong>lenguaje Logo</strong> para hacer una pintura:</p>
<div class="igallery"><img src="/iGallery/logo/logo0.jpg" alt="Preparando todo" id="965222"  title="Preparando todo" /><br /><a href="javascript:swapPhoto('/iGallery/logo/logo0.jpg','965222')"><img src="/iGallery/logo/TN-logo0.jpg" width="56" height="42" alt="Preparando todo" title="Preparando todo" /></a><a href="javascript:swapPhoto('/iGallery/logo/logo1.jpg','965222')"><img src="/iGallery/logo/TN-logo1.jpg" width="56" height="42" alt="Acercamiento" title="Acercamiento" /></a><a href="javascript:swapPhoto('/iGallery/logo/logo2.jpg','965222')"><img src="/iGallery/logo/TN-logo2.jpg" width="56" height="42" alt="Alejamiento" title="Alejamiento" /></a><a href="javascript:swapPhoto('/iGallery/logo/logo3.jpg','965222')"><img src="/iGallery/logo/TN-logo3.jpg" width="56" height="42" alt="Don Gato ejecutando los comandos Stop, Left... Forward!" title="Don Gato ejecutando los comandos Stop, Left... Forward!" /></a></div>
<p>Pero, según la Wikipedia,  ¡el <a href="http://en.wikipedia.org/wiki/Logo_(programming_language)" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Logo_programming_language?referer=');">lenguaje Logo</a> no fue creado hasta 1967! Saque usted sus propias conclusiones <img src='http://www.machin.com.mx/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h4>Para saber más:</h4>
<p>Si quieres conocer más del lenguaje <strong>logo</strong>, puedes bajar un interprete en:</p>
<p><a href="http://www.cs.berkeley.edu/~bh/logo.html" onclick="pageTracker._trackPageview('/outgoing/www.cs.berkeley.edu/_bh/logo.html?referer=');">http://www.cs.berkeley.edu/~bh/logo.html</a><br />
<a href="http://sourceforge.net/project/showfiles.php?group_id=149686" onclick="pageTracker._trackPageview('/outgoing/sourceforge.net/project/showfiles.php?group_id=149686&amp;referer=');">http://sourceforge.net/project/showfiles.php?group_id=149686</a></p>

<p></p>]]></content:encoded>
			<wfw:commentRss>http://www.machin.com.mx/archives/214/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Consejos y observaciones para minimizar errores en programas</title>
		<link>http://www.machin.com.mx/archives/161</link>
		<comments>http://www.machin.com.mx/archives/161#comments</comments>
		<pubDate>Fri, 30 Nov 2007 08:26:00 +0000</pubDate>
		<dc:creator>Jorge Machin</dc:creator>
				<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.machin.com.mx/archives/161</guid>
		<description><![CDATA[<p>En este post dejo unas reglas simples que he utilizando con el paso del tiempo y que me han funcionado para escribir programas con menos errores.</p>
<p><strong>1. Reconocer que errar es humano</strong></p>
<p>El primer consejo para controlar el número de errores en nuestro código, es reconocer que somos humanos y podemos cometerlos en cualquier momento. Por lo general, no es constructivo buscar culpables si no hay detrás una conducta crónica o casos evidentes de negligencia. La conducta correcta es crear las herramientas y metodologías que puedan reducir el riesgo de este hecho.</p>
<p><strong>2. Probar, probar y probar</strong></p>
<p>Uno de los elementos básicos del control de calidad son las pruebas al producto. Se debe revisar de forma ordenada el funcionamiento de los programas de principio a fin. </p>
<p>Por lo general, es recomendable que una persona ajena al diseño del proyecto también realice las pruebas, pues los programadores y diseñadores pueden estar ciegos a ramificaciones inesperadas al tener la tendencia natural de revisar los programas siguiendo el flujo de los algoritmos, del análisis o del mismo camino que utilizaron al programarlo. </p>
<p>Es recomendable apuntar o automatizar las pruebas en donde se tienen errores comunes o rutas complicadas para que sea lo primero que se revise para disminuir las iteraciones durante el proceso de control de calidad, o bien, se olviden de hacerlas.</p>
<p>Cuando el programa es suficientemente grande o involucra a varias personas, se recomienda tener un sistema centralizado donde se pueda reportar los errores y darles un seguimiento hasta su corrección.</p>
<p><strong>3. Todo error se debe perseguir de oficio</strong> </p>
<p>Un reporte de error siempre es cosa seria. Generalmente, no es válido  ignorarlo porque sólo le ocurre a un usuario o en una máquina en particular; hay que tener presente que si el error le ocurrió a alguien, le puede pasar a varias personas. </p>
<p>Si no se sigue este punto, quizás el error no haga estallar nada, pero puede aparecer en una demostración ante un posible cliente, creándonos mala reputación e incluso su perdida. </p>
<p><strong>4. Un error emulado es un error corregido</strong> </p>
<p>Cuando un error se puede repetir fielmente es posible seguir trazas, colocar banderas de depuración o analizar la lógica hasta llegar a él. En teoría, si somos capaces de reproducir un error, deberíamos estar tranquilos porque estamos a unos pocos pasos de su solución.</p>
<p><strong>5. Cuando ocurre un error, uno debe preguntarse: ¿Porqué ocurrió?, ¿qué se puede hacer para evitar que ocurra el mismo tipo de error en situaciones semejantes?</strong> </p>
<p>Este consejo es la parte medular para evitar errores. Si estamos cometiendo demasiados errores es porque seguramente llevamos una mala metodología y es el momento adecuado para detenernos a  recapacitar en la forma de como se está trabajando.</p>
<p><strong>6. Si un error aparece dos veces en un mismo lugar, es mejor re-escribir el código de otra forma o bien agregarle algo para evitar que pueda ocurrir de nuevo.</strong>  </p>
<p><strong>7. Para evitar errores al usar funciones, clases, etc; estas deben validar las entradas</strong> </p>
<p>Los errores no sólo pueden estar en nuestras funciones, sino en los programas que las utilizan. En grupos de trabajo es común que se pierda tiempo innecesario revisando funciones que no tienen errores y ya están revisadas porque presentan síntomas que apuntan a ellas cuando son los parámetros de entrada los que están mal.</p>
<p><strong>8. Los programas deben registrar los errores en una bitácora (log)</strong> </p>
<p>Un error que nadie atestigua, no existe en nuestras mentes. Por eso, es muy importante agregar medios de monitoreo y registro de condiciones y situaciones anómalas para su posterior análisis. Si el error no puede reproducirse manualmente, con el tiempo y ayuda de banderas es posible darle seguimiento haciendo trazas hasta encontrarlo.  Es muy importante que el mismo programa trabaje por nosotros y sea nuestro testigo de calidad en la busqueda de errores. </p>
<p>Sin entrar en mucho en detalle en herramientas automáticas para detección de errores, los programas que utilizan técnicas de orientación a objetos pueden usar "profilers" para contar el número de objetos que estamos creando y así ver si tenemos fugas de memoria o estamos desperdiciando recursos.</p>
<p><strong>9. Si se tiene una solución complicada a un problema; seguramente no es la adecuada o va a provocar errores después.</strong> </p>
<p>Algoritmos complicados, trucos de programación o una solución estrafalaria, seguramente con el tiempo provocará errores y pérdida de tiempo a programadores inexpertos o a nosotros mismos después de algún tiempo. Es mucho mejor la programación "aburrida" donde uno ya sabe que va a pasar con solo ver unas pocas líneas de código.</p>
<p><strong>10. Si no está roto, no es necesario arreglarlo</strong> </p>
<p>Esta regla es especialmente válida con código antigüo.  </p>
<p><strong>11. Tener código autodocumentable</strong> </p>
<p>La documentación en papel no se puede sustituir, pero tenerla dentro del mismo código es una buena costumbre para evitar errores al tener a la mano advertencias, rangos y cualquier otro tipo de información.  </p>
<p><strong>12. Leer o hacer pruebas de escritorio a nuestro código una vez que esta listo</strong></p>
<p>Una vez que todo esta en su lugar y en perspectiva, es posible detectar faltas en los estándares, casos validados incorrectamente, código repetido y errores en la lógica. Es mejor si lo puede revisar rápidamente otra persona.</p>
<p><strong>13. Cuando no encuentres un error, es buena idea platicarlo con alguien</strong> </p>
<p>Curiosamente, muchas veces me ha pasado que al explicar el problema un compañero de trabajo, he encontrado la causa del error dentro de mis propias palabras pues se acomoda mentalmente y se repite la lógica encontrando los absurdos. Además una mente externa suele tener mayor perspectiva.   </p>
<p><strong>14. La documentación debe incluir una bitácora de cambios al código que además registre los errores encontrados y sus correcciones</strong>   </p>
<p>Al llevar un registro de los cambios es posible identificar históricamente a partir de que cambio surgió un error. Lo cual nos permite regresar a una versión anterior o darnos una idea de donde podemos empezar a buscar.</p>
<h4>Nota:</h4>
<p>Obviamente estos son consejos que pueden llegar a generar controversia y no son válidos en todos los contextos, metodologías o lenguajes de programación y no está por demás aclarar que al igual que otros de mis posts que estas reglas irán creciendo y puliendo con forme vaya teniendo tiempo libre.  </p>
<p>Aquí los he presentado de forma sencilla, pero muchos de ellos están basados en algunas metodologías como <strong>programación extrema</strong>, <strong>fábricas de software</strong>, <strong>programación por contrato</strong> y otros que le recomiendo al lector que se familiarice con ellos.</p>

]]></description>
			<content:encoded><![CDATA[<p>En este post dejo unas reglas simples que he utilizando con el paso del tiempo y que me han funcionado para escribir programas con menos errores.</p>
<p><strong>1. Reconocer que errar es humano</strong></p>
<p>El primer consejo para controlar el número de errores en nuestro código, es reconocer que somos humanos y podemos cometerlos en cualquier momento. Por lo general, no es constructivo buscar culpables si no hay detrás una conducta crónica o casos evidentes de negligencia. La conducta correcta es crear las herramientas y metodologías que puedan reducir el riesgo de este hecho.</p>
<p><strong>2. Probar, probar y probar</strong></p>
<p>Uno de los elementos básicos del control de calidad son las pruebas al producto. Se debe revisar de forma ordenada el funcionamiento de los programas de principio a fin. </p>
<p>Por lo general, es recomendable que una persona ajena al diseño del proyecto también realice las pruebas, pues los programadores y diseñadores pueden estar ciegos a ramificaciones inesperadas al tener la tendencia natural de revisar los programas siguiendo el flujo de los algoritmos, del análisis o del mismo camino que utilizaron al programarlo. </p>
<p>Es recomendable apuntar o automatizar las pruebas en donde se tienen errores comunes o rutas complicadas para que sea lo primero que se revise para disminuir las iteraciones durante el proceso de control de calidad, o bien, se olviden de hacerlas.</p>
<p>Cuando el programa es suficientemente grande o involucra a varias personas, se recomienda tener un sistema centralizado donde se pueda reportar los errores y darles un seguimiento hasta su corrección.</p>
<p><strong>3. Todo error se debe perseguir de oficio</strong> </p>
<p>Un reporte de error siempre es cosa seria. Generalmente, no es válido  ignorarlo porque sólo le ocurre a un usuario o en una máquina en particular; hay que tener presente que si el error le ocurrió a alguien, le puede pasar a varias personas. </p>
<p>Si no se sigue este punto, quizás el error no haga estallar nada, pero puede aparecer en una demostración ante un posible cliente, creándonos mala reputación e incluso su perdida. </p>
<p><strong>4. Un error emulado es un error corregido</strong> </p>
<p>Cuando un error se puede repetir fielmente es posible seguir trazas, colocar banderas de depuración o analizar la lógica hasta llegar a él. En teoría, si somos capaces de reproducir un error, deberíamos estar tranquilos porque estamos a unos pocos pasos de su solución.</p>
<p><strong>5. Cuando ocurre un error, uno debe preguntarse: ¿Porqué ocurrió?, ¿qué se puede hacer para evitar que ocurra el mismo tipo de error en situaciones semejantes?</strong> </p>
<p>Este consejo es la parte medular para evitar errores. Si estamos cometiendo demasiados errores es porque seguramente llevamos una mala metodología y es el momento adecuado para detenernos a  recapacitar en la forma de como se está trabajando.</p>
<p><strong>6. Si un error aparece dos veces en un mismo lugar, es mejor re-escribir el código de otra forma o bien agregarle algo para evitar que pueda ocurrir de nuevo.</strong>  </p>
<p><strong>7. Para evitar errores al usar funciones, clases, etc; estas deben validar las entradas</strong> </p>
<p>Los errores no sólo pueden estar en nuestras funciones, sino en los programas que las utilizan. En grupos de trabajo es común que se pierda tiempo innecesario revisando funciones que no tienen errores y ya están revisadas porque presentan síntomas que apuntan a ellas cuando son los parámetros de entrada los que están mal.</p>
<p><strong>8. Los programas deben registrar los errores en una bitácora (log)</strong> </p>
<p>Un error que nadie atestigua, no existe en nuestras mentes. Por eso, es muy importante agregar medios de monitoreo y registro de condiciones y situaciones anómalas para su posterior análisis. Si el error no puede reproducirse manualmente, con el tiempo y ayuda de banderas es posible darle seguimiento haciendo trazas hasta encontrarlo.  Es muy importante que el mismo programa trabaje por nosotros y sea nuestro testigo de calidad en la busqueda de errores. </p>
<p>Sin entrar en mucho en detalle en herramientas automáticas para detección de errores, los programas que utilizan técnicas de orientación a objetos pueden usar "profilers" para contar el número de objetos que estamos creando y así ver si tenemos fugas de memoria o estamos desperdiciando recursos.</p>
<p><strong>9. Si se tiene una solución complicada a un problema; seguramente no es la adecuada o va a provocar errores después.</strong> </p>
<p>Algoritmos complicados, trucos de programación o una solución estrafalaria, seguramente con el tiempo provocará errores y pérdida de tiempo a programadores inexpertos o a nosotros mismos después de algún tiempo. Es mucho mejor la programación "aburrida" donde uno ya sabe que va a pasar con solo ver unas pocas líneas de código.</p>
<p><strong>10. Si no está roto, no es necesario arreglarlo</strong> </p>
<p>Esta regla es especialmente válida con código antigüo.  </p>
<p><strong>11. Tener código autodocumentable</strong> </p>
<p>La documentación en papel no se puede sustituir, pero tenerla dentro del mismo código es una buena costumbre para evitar errores al tener a la mano advertencias, rangos y cualquier otro tipo de información.  </p>
<p><strong>12. Leer o hacer pruebas de escritorio a nuestro código una vez que esta listo</strong></p>
<p>Una vez que todo esta en su lugar y en perspectiva, es posible detectar faltas en los estándares, casos validados incorrectamente, código repetido y errores en la lógica. Es mejor si lo puede revisar rápidamente otra persona.</p>
<p><strong>13. Cuando no encuentres un error, es buena idea platicarlo con alguien</strong> </p>
<p>Curiosamente, muchas veces me ha pasado que al explicar el problema un compañero de trabajo, he encontrado la causa del error dentro de mis propias palabras pues se acomoda mentalmente y se repite la lógica encontrando los absurdos. Además una mente externa suele tener mayor perspectiva.   </p>
<p><strong>14. La documentación debe incluir una bitácora de cambios al código que además registre los errores encontrados y sus correcciones</strong>   </p>
<p>Al llevar un registro de los cambios es posible identificar históricamente a partir de que cambio surgió un error. Lo cual nos permite regresar a una versión anterior o darnos una idea de donde podemos empezar a buscar.</p>
<h4>Nota:</h4>
<p>Obviamente estos son consejos que pueden llegar a generar controversia y no son válidos en todos los contextos, metodologías o lenguajes de programación y no está por demás aclarar que al igual que otros de mis posts que estas reglas irán creciendo y puliendo con forme vaya teniendo tiempo libre.  </p>
<p>Aquí los he presentado de forma sencilla, pero muchos de ellos están basados en algunas metodologías como <strong>programación extrema</strong>, <strong>fábricas de software</strong>, <strong>programación por contrato</strong> y otros que le recomiendo al lector que se familiarice con ellos.</p>

<p></p>]]></content:encoded>
			<wfw:commentRss>http://www.machin.com.mx/archives/161/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
