<?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>Investigación y Programación Ltda</title>
	<atom:link href="http://investigacionyprogramacion.com/wordpress/feed" rel="self" type="application/rss+xml" />
	<link>http://investigacionyprogramacion.com/wordpress</link>
	<description>Un sitio para compartir ideas de investigación, ciencia y programación</description>
	<lastBuildDate>Thu, 29 Mar 2012 16:46:02 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>Compatibilidad hacia atrás al crear tecnología</title>
		<link>http://investigacionyprogramacion.com/wordpress/compatibilidad-hacia-atr%c3%a1s-al-crear-tecnolog%c3%ada</link>
		<comments>http://investigacionyprogramacion.com/wordpress/compatibilidad-hacia-atr%c3%a1s-al-crear-tecnolog%c3%ada#comments</comments>
		<pubDate>Thu, 22 Mar 2012 15:49:00 +0000</pubDate>
		<dc:creator>administrador</dc:creator>
				<category><![CDATA[Artículos críticos]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Pensar la tecnología]]></category>
		<category><![CDATA[backwards compatibility]]></category>
		<category><![CDATA[compatibilidad hacia atrás]]></category>
		<category><![CDATA[Construcción de tecnología]]></category>

		<guid isPermaLink="false">http://investigacionyprogramacion.com/wordpress/?p=166</guid>
		<description><![CDATA[En la lectura del ejemplo acerca de http_post_vars, se observa que los usuarios de un producto se ponen en la tarea de estudiarlo, desarrollar con él, construir con base en él y soportarlo, mientras que los fabricantes realizan actualizaciones, cambian &#8230; <a href="http://investigacionyprogramacion.com/wordpress/compatibilidad-hacia-atr%c3%a1s-al-crear-tecnolog%c3%ada">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>En la lectura del ejemplo acerca de <a href="http://investigacionyprogramacion.com/wordpress/ejemplo-1-de-m%C3%A9todo-para-depuraci%C3%B3n-problema-con-webform-php">http_post_vars</a>, se observa que los usuarios de un producto se ponen en la tarea de estudiarlo, desarrollar con él, construir con base en él y soportarlo, mientras que los fabricantes realizan actualizaciones, cambian las reglas de juego, y los inventos confiados que habían realizado las personas, dejan de funcionar.</p>
<p>Todos estamos acostumbrados a que esto es razonable, es perfecto, es aceptable. Pero, ¿realmente lo es? Discutamos un poco al respecto, he aquí una posición que proponemos, y quisiéramos que el lector participara en ello.</p>
<p>Imagine usted que el físico inventor del motor de cuatro tiempos construyera dicho motor de un carro, basado en termodinámica para incrementar la presión al disminuir el volumen de los cilindros, y unos años después <em><strong>las leyes de la naturaleza sufrieran una actualización, dejando al motor inservible por incompatibilidad con las nuevas leyes</strong></em>. Las viejas cosas suelen ser incompatibles con lo nuevo, por la forma en que se enlazan o conectan, por su tamaño, por sus protocolos, por los materiales con que antes se construían, etc. Pero ¿lo nuevo no debería, forzosamente, hacerse compatible con lo viejo, de tal manera que estas cosas que han funcionado durante tiempo, para tantas personas, <strong>sencillamente continúen funcionando</strong>?</p>
<p>¿Es razonable que los constructores de php apliquen esta misma dinámica que también Microsoft aplica con su paquete evolución de Visual Studio .NET, de no mantener una sólida y sencilla compatibilidad hacia atrás?</p>
]]></content:encoded>
			<wfw:commentRss>http://investigacionyprogramacion.com/wordpress/compatibilidad-hacia-atr%c3%a1s-al-crear-tecnolog%c3%ada/feed</wfw:commentRss>
		<slash:comments>60</slash:comments>
		</item>
		<item>
		<title>Ejemplo 1, de método para depuración: problema con webform.php</title>
		<link>http://investigacionyprogramacion.com/wordpress/ejemplo-1-de-m%c3%a9todo-para-depuraci%c3%b3n-problema-con-webform-php</link>
		<comments>http://investigacionyprogramacion.com/wordpress/ejemplo-1-de-m%c3%a9todo-para-depuraci%c3%b3n-problema-con-webform-php#comments</comments>
		<pubDate>Thu, 22 Mar 2012 15:29:25 +0000</pubDate>
		<dc:creator>administrador</dc:creator>
				<category><![CDATA[Depuración - Debugging]]></category>
		<category><![CDATA[Ingeniería en Reversa - Reverse Engineering]]></category>
		<category><![CDATA[Método]]></category>
		<category><![CDATA[Pensar la tecnología]]></category>

		<guid isPermaLink="false">http://investigacionyprogramacion.com/wordpress/?p=157</guid>
		<description><![CDATA[Ayer recibí la siguiente llamada de un amigo: &#8220;Tengo un sitio web, y desde hace unos 20 días tengo un problema con mi formulario de contactos: me llegan los correos, pero sin los datos que se llenan del formulario. Por &#8230; <a href="http://investigacionyprogramacion.com/wordpress/ejemplo-1-de-m%c3%a9todo-para-depuraci%c3%b3n-problema-con-webform-php">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ayer recibí la siguiente llamada de un amigo:<br />
&#8220;<em>Tengo un sitio web, y desde hace unos 20 días tengo un problema con mi formulario de contactos: me llegan los correos, pero sin los datos que se llenan del formulario. Por otra parte, nosotros no hemos tocado el sitio</em>&#8220;.</p>
<p>Esto es, los correos sí le llegaban, pero parecía existir un problema con la recogida de las variables POST. El método para depurarlo ilustra un método ágil para depurar estos casos. Observe usted los siguientes pasos:</p>
<p>1. Se confirma, por supuesto, cómo están llegando los correos. Resulta que mi amigo recibía un correo algo así como:<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
Subject: Correo enviado por el formulario<br />
Content:<br />
Escribieron desde el formulario. Los datos son:<br />
Nombre:<br />
Asunto:<br />
Comentario:<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
Y al frente de &#8220;nombre&#8221;, &#8220;asunto&#8221;, &#8220;comentario&#8221; debía estar lo que introduce el visitante en el formulario, pero llegaba en blanco.</p>
<p>2. Rápido tanteo: Lluvia de ideas con rapidez. Uno podría empezar a discutir: &lt;Tal vez el problema es de su página en html, que la cambiaron, tal vez ellos mismos hicieron un cambio y no se acuerdan, tal vez cambiaron alguna línea en su php y no lo recuerdan. &gt;. Ese método sirve, pero durante unos pocos segundos. Es decir, si no sirve para resolver un problema, o identificarlo con mucha rapidez al cabo de menos de un minuto de pensamiento, debe abandonarse el método del &#8220;tanteo aleatorio&#8221; con esta lluvia de ideas, al menos en el ejercicio de DEPURAR. Sin embargo, fue mi primer camino, y lo usé para ingresar al html y verificar las propiedades &#8220;action&#8221; y &#8220;method&#8221; del formulario. Supe que el  &#8220;action&#8221; apuntaba al script php correcto, y supe que el método era &#8220;post&#8221;.</p>
<p>Empezar a especular de esta forma, como con &#8220;lluvia de ideas&#8221;, finalmente resuelve el problema. Pero a veces ocupa demasiado tiempo, no lo recomendamos para búsquedas largas de una DEPURACIÓN. En un proceso creativo puede ser mucho más útil, pero no al intentar depurar. Así,otra manera de proceder tal vez sería devolverse, y éste es el siguiente paso.</p>
<p>3. Empezar a devolverse. ¿Qué ocurre cuando la persona ve su correo incorrectamente? ¿Es posible ver algo más, todavía en su bandeja de entrada, en donde estamos?<br />
Pues sí, podemos ver el mensaje de correo en bruto, con sus encabezados y contenido.<br />
Encontré allí que el correo estaba en blanco, pero sí tenía contenido en texto raso. Identifiqué el contenido en texto raso  (encabezados de tipo MIME para envíos de archivos, si se llegaran a enviar attachments con el correo), pero no podía hacer más desde este punto.</p>
<p>Este paso me permitía conocer la fisonomía del contenido del cuerpo del correo (su body), si el contenido por completo se truncaba, o únicamente las variables, si tal vez estaba llegando el texto raso pero tenía también una versión en formato html ese mismo correo y de pronto una de las dos no se veía bien, etc.</p>
<p>Ahora, hay que seguirse devolviendo, y vamos al paso siguiente.</p>
<p>4. ¿Qué ocurre antes de que llegue el correo?</p>
<p>Como la página está en php, seguramente utiliza una función &#8220;mail&#8221; en alguna parte. Pero, ¿en dónde? Este segundo paso consiste, por lo tanto, en ubicar el paso previo a la llegada del correo: ubiqué el script de php que era llamado por el html del formulario. Ese php se llamaba &#8220;webform.php&#8221;.</p>
<p>5. Una vez allí, busqué la función de envío de correos. Probablemente debía estar al final, así que empecé por el final del script. Encontré un método de una clase, que parecía ser el encargado del envío, y me remití a la definición de ese método. No me sorprendí de encontrar allí la función &#8220;mail&#8221; de php.</p>
<p>6. Se INTERCEPTA el envío de e-mail antes de que se ejecute la función para mandarlo. De manera que puse un &lt;? die(&#8220;$contenido&#8221;); ?&gt; antes de la función mail, y resultó que imprimía EL MISMO CONTENIDO que yo había visto en el paso número 3. Por eso dicho paso no era tan trivial.</p>
<p>El paso 3, de ver el correo en bruto, parecía una bobada: pero permitía OBSERVAR, que es fundamental para resolver problemas. El lector debe desarrollar un agudo sentido de observación, que consiste, esencialmente, en NO DESPRECIAR SUS PROPIAS OBSERVACIONES NI LAS DE LOS DEMÁS. Todo lo que la gente observa, es por algo. Encuentre esas razones, cada vez es menos común en nuestra especie, gracias a la educación y a nuestras mejoras en el pensamiento racional, que la gente se autoengañe con sus propias afirmaciones y observaciones.</p>
<p>Así, el paso 3 fue fundamental para identificar con rapidez, en este punto, que SÍ se tenía el mismo contenido, pero sólo faltaban las variables.</p>
<p>7. Por lo tanto, como el método era POST, busqué en dónde se construía el body o cuerpo del correo, con el fin de identificar en dónde se estaban recogiendo las variables POST. Rápidamente se me vino a la cabeza una imagen como ésta:</p>
<p>?</p>
<div id="attachment_159" class="wp-caption aligncenter" style="width: 310px"><a rel="attachment wp-att-159" href="http://investigacionyprogramacion.com/wordpress/ejemplo-1-de-m%c3%a9todo-para-depuraci%c3%b3n-problema-con-webform-php/phpnet_httppostvars"><img class="size-medium wp-image-159" title="Imagen de php.net, sitio oficial de php" src="http://investigacionyprogramacion.com/wordpress/wp-content/uploads/2012/03/phpnet_httppostvars-300x136.png" alt="Imagen de sitio php.net, la matriz http_post_vars está &quot;deprecated&quot;" width="300" height="136" /></a><p class="wp-caption-text">Matriz http_post_vars es obsoleta</p></div>
<p>8. Se explora esta sospecha: efectivamente, para algunas actualizaciones de php, a algunas personas esta variable ha dejado de funcionar. Así que la cambié por $_POST, y el problema quedó resuelto de inmediato.</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>En conclusión, el método para depurar paso a paso sí funciona. Se resolvió en menos de 20 minutos un problema que ellos tenían desde hacía 15 ó 20 días, según sus palabras. Y todo queda explicado con una teoría muy sencilla: efectivamente ellos no habían tocado el sitio, los administradores del servidor habían realizado una actualización del php, que no tenía compatibilidad hacia atrás con esta función.</p>
<p>Este caso, por demás, amerita participar en un post acerca de &#8220;compatibilidad hacia atrás al crear tecnología&#8221; que luego publicaremos.</p>
<p>Saludos,</p>
<p>Investigación y Programación.</p>
]]></content:encoded>
			<wfw:commentRss>http://investigacionyprogramacion.com/wordpress/ejemplo-1-de-m%c3%a9todo-para-depuraci%c3%b3n-problema-con-webform-php/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Hacer SEO: en qué consiste realmente</title>
		<link>http://investigacionyprogramacion.com/wordpress/hacer-seo-en-qu%c3%a9-consiste-realmente</link>
		<comments>http://investigacionyprogramacion.com/wordpress/hacer-seo-en-qu%c3%a9-consiste-realmente#comments</comments>
		<pubDate>Thu, 19 Jan 2012 13:23:34 +0000</pubDate>
		<dc:creator>administrador</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://investigacionyprogramacion.com/wordpress/?p=154</guid>
		<description><![CDATA[Una de los aportes más importantes de la ciencia a la naturaleza, es el método. En ciencias básicas se le hacen preguntas a la naturaleza. Y la naturaleza no responde en forma directa, sino que dice: &#8220;en estas condiciones me &#8230; <a href="http://investigacionyprogramacion.com/wordpress/hacer-seo-en-qu%c3%a9-consiste-realmente">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Una de los aportes más importantes de la ciencia a la naturaleza, es el método. En ciencias básicas se le hacen preguntas a la naturaleza. Y la naturaleza no responde en forma directa, sino que dice: &#8220;en estas condiciones me comporto así, en esas otras me comporto asá&#8221;. Eso es el SEO: tratar a los motores de búsqueda como una caja negra, a la que se le imparten estímulos, y se estudia su respuesta. Cualquier accidente, cualquier cambio de comportamiento, incluso si se cometen errores, es afortunado, igual que como es en ciencia, o al menos, como <em><strong>debería</strong></em> ser en ciencia.</p>
]]></content:encoded>
			<wfw:commentRss>http://investigacionyprogramacion.com/wordpress/hacer-seo-en-qu%c3%a9-consiste-realmente/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Buscando el método para ver lo que no vemos</title>
		<link>http://investigacionyprogramacion.com/wordpress/buscando-el-m%c3%a9todo-para-ver-lo-que-no-vemos</link>
		<comments>http://investigacionyprogramacion.com/wordpress/buscando-el-m%c3%a9todo-para-ver-lo-que-no-vemos#comments</comments>
		<pubDate>Fri, 01 Jul 2011 09:16:08 +0000</pubDate>
		<dc:creator>administrador</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://investigacionyprogramacion.com/wordpress/?p=149</guid>
		<description><![CDATA[Es necesario presentar mejor la información de lo que ya existe, para que las cosas puedan comprenderse mejor. La información que se deduce, tiene que mostrar más las alternativas que hay en cada nueva deducción. La información no se crea &#8230; <a href="http://investigacionyprogramacion.com/wordpress/buscando-el-m%c3%a9todo-para-ver-lo-que-no-vemos">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Es necesario presentar mejor la información de lo que ya existe, para que las cosas puedan comprenderse mejor. La información que se deduce, tiene que mostrar más las alternativas que hay en cada nueva deducción. La información no se crea de una manera tan limpia como la presentan los libros, o como se presenta en las aulas de clase. La forma como agrupamos el conocimiento puede mejorarse. Obtener lecturas más <em>olfativas</em>, sin temor a acercarse a un mosaico barroco, o a abstraerse de esos detalles según se necesite, y olfatear mejor el camino para resolver las cosas. Un método es el uso de la ingeniería en reversa de acuerdo con un hilo de funcionamiento. Ese hilo puede verse ya sea recorriendo mentamente algo ya hecho, o algo que se imagina hecho y luego nos preguntamos cómo tejer sus detalles. La ingeniería en reversa no sirve sólo para saber cómo está hecho algo, sino que sirve también para determinar los pasos de algo que todavía no está hecho. En ambos casos, el recorrer mentalmente un proceso, concebir un cuadro completo en forma completa, permite ganar olfato, olfato para resolver problemas.  </p>
]]></content:encoded>
			<wfw:commentRss>http://investigacionyprogramacion.com/wordpress/buscando-el-m%c3%a9todo-para-ver-lo-que-no-vemos/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Concretando ideas difusas</title>
		<link>http://investigacionyprogramacion.com/wordpress/concretando-ideas-difusas</link>
		<comments>http://investigacionyprogramacion.com/wordpress/concretando-ideas-difusas#comments</comments>
		<pubDate>Sat, 11 Jun 2011 21:50:36 +0000</pubDate>
		<dc:creator>administrador</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://investigacionyprogramacion.com/wordpress/?p=144</guid>
		<description><![CDATA[&#8220;Tengo este u otro proyecto&#8221; , es una frase que escucho a menudo, todavía abstracta, e intentando que las palabras conviertan en realidad una frase. Para ayudar a aterrizar ideas que todavía son difusas o borrosas, y observando que se &#8230; <a href="http://investigacionyprogramacion.com/wordpress/concretando-ideas-difusas">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>&#8220;<em>Tengo este u otro proyecto</em>&#8221; , es una frase que escucho a menudo, todavía abstracta, e intentando que las palabras conviertan en realidad una frase. Para ayudar a aterrizar ideas que todavía son difusas o borrosas, y observando que se nos puede pasar el tiempo sin aterrizar su buena idea, un método que le puede servir para concretar el tema (porque el costo de apostar a varias cosas difusas al tiempo es inicialmente muy alto), es la pregunta de: &#8220;¿qué cosas deberían existir?&#8221;, cosa que no tiene que responderse de una forma tan directa. </p>
<p>Partir de la herramienta (&#8220;en qué uso este martillo que tengo, caray, dónde habrá una puntilla para clavar, ahora que estoy estrenando martillo&#8221;) es más difícil, o más bien, mucho más LARGO e incierto. Otra alternativa puede ser partir de la lista de cosas que puede oler, que faltan. Y, entonces, ANTES de salir a buscar cosas por fuera de su taller, preguntarse: &#8220;con lo que YA tengo, sin comprar nada más, ¿es<br />
posible resolverlo?&#8221;. Pero esa última pregunta podría facilitarse si antes de eso usted ha &#8220;universalizado&#8221; sus herramientas antes de usarlas. &#8220;Un martillo, ¿para qué más podría servir, además de sus dos usos básicos?&#8221;, y entonces cada herramienta que YA tiene le sirve para muchos más fines, para cuando empiece a resolver problemas.</p>
]]></content:encoded>
			<wfw:commentRss>http://investigacionyprogramacion.com/wordpress/concretando-ideas-difusas/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Metodología para realizar ingeniería en reversa.</title>
		<link>http://investigacionyprogramacion.com/wordpress/metodolog%c3%ada-para-realizar-ingenier%c3%ada-en-reversa</link>
		<comments>http://investigacionyprogramacion.com/wordpress/metodolog%c3%ada-para-realizar-ingenier%c3%ada-en-reversa#comments</comments>
		<pubDate>Thu, 07 Apr 2011 17:31:10 +0000</pubDate>
		<dc:creator>administrador</dc:creator>
				<category><![CDATA[Ingeniería en Reversa - Reverse Engineering]]></category>

		<guid isPermaLink="false">http://investigacionyprogramacion.com/wordpress/?p=75</guid>
		<description><![CDATA[TODA invención humana puede asociarse a un flujo, pueden inventarse diferentes formas de asociación para &#8220;agrupar&#8221; o &#8220;moverse dentro de&#8221; las partes de un invento humano. Este texto no se trata de ver estos mismos caminos de asociación con objetos, &#8230; <a href="http://investigacionyprogramacion.com/wordpress/metodolog%c3%ada-para-realizar-ingenier%c3%ada-en-reversa">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>TODA invención humana puede asociarse a un flujo, pueden inventarse diferentes formas de asociación para &#8220;agrupar&#8221; o &#8220;moverse dentro de&#8221; las partes de un invento humano. Este texto no se trata de ver estos mismos caminos de asociación con objetos, fenómenos o situaciones naturales, sino que para la ingeniería en reversa sólo nos interesan las construcciones humanas.</p>
<p>Adicionalmente, para concentrar los esfuerzos tanto del autor como del lector, haremos otra restricción para esta primera parte: la ingeniería en reversa tiene un rango de aplicación dentro y fuera de la tecnología, incluso en el arte podemos hacer una ingeniería en reversa deliciosa para hipotetizar cómo se construyeron ciertas piezas de arte, pero no hablaremos de esto aquí. Nos concentraremos en la ingeniería en reversa aplicada sólo para las invenciones en tecnología, y dentro de ella no será tecnología blanda ni métodos, sino tecnología dura. Empezamos, pues.</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;//&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;//&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>La ingeniería en reversa tiene un concepto central, independientemente de la tecnología que se quiera conocer por dentro. Y es que, en el funcionamiento de cada sistema tecnológico, hay algo que lo recorre por completo, en el caso de los dispositivos electrónicos hay una corriente que los recorre, y en el caso de los programas de software hay una flecha del tiempo para generar los algoritmos. En un motor de gasolina el combustible y el comburente recorren un cierto camino, y la energía que se transforma desde energía química hacia energía mecánica, también tiene un recorrido, así como una hoja de papel en una impresora, desde que es recogida por la impresora en la bandeja de entrada, hasta que sale impresa. Con esto tenemos así nuestras primeras formas de &#8220;agrupación&#8221; o &#8220;caminos de asociación&#8221; que mencioné arriba en el primer párrafo de este texto.</p>
<p>En algunos de estos casos puede haber procesos &#8220;asíncronos&#8221; que no son tan fáciles de ubicar dentro de esta flecha del tiempo, como es el caso de los eventos que sólo ocurren cuando un usuario estimula al sistema de una cierta forma, y en algunas ocasiones hay procesos paralelos, procesos simultáneos, que están ajustados para que se encuentren en un momento dado. En el caso del motor de gasolina, sabemos que  tiene que recogerse aire del ambiente, mientras que en forma simultánea se recoge la gasolina del tanque para que al cabo del recorrido que hace cada uno -con sus respectivos métodos de control, y todas las formas en que se chupó cada fluido-, finalmente se encuentren y se genere una combustión de alguna forma. En una aplicación de software que espere un evento de un objeto, muy internamente debe haber un bucle que revisa una y otra vez si cambió alguna señal de un periférico, para saber cuál debe ser su reacción.</p>
<p>Todo esto arroja un primer recorrido para conocer el funcionamiento de un objeto. Todavía no es una ingeniería en reversa completa, porque no permite re-inventar el objeto, ni contextualizar por qué se tomaron unas decisiones y no otras, cosa que veremos más adelante. Pero este primer enfoque servirá para comenzar. Comencemos, además, con un objeto técnico, concretamente una máquina. </p>
<p>Veamos inicialmente estos casos, para entrar en calor.</p>
<p>Ejemplo 1:  Programación orientada a objetos.</p>
<div style="display:none">
Ejemplo 2:  Codificador de televisión
</div>
<div style="display:none">
Las construcciones humanas tienen la ventaja de que ofrecen una respuesta como punto de partida: <strong>estamos seguros de que los problemas aquí tienen solución, y de que esa solución es comprensible para nosotros, porque ya por lo menos una persona igual a nosotros recorrió el camino de esa misma solución</strong>. La primera vez era más difícil, estar convencido de que era posible lograr algo, sin haberlo construido todavía. En el caso de los fenómenos naturales es más difícil estar seguro de que se están formulando las preguntas correctas, porque las definiciones y los bordes de las cosas en la naturaleza no son necesariamente los mismos del pensamiento humano.
</div>
<div style="display: none">
Controvertible:<br />
En un microcontrolador que espera un evento, hay un bucle que revisa una y otra vez si hubo algún cambio, y cuando detecta un cambio, reacciona.</p>
<p>Pero un circuito no tiene que funcionar así en general. Por ejemplo, si uno cambia la corriente del colector en un transistor, el cambio en el resto del circuito no tuvo que ser &#8220;monitoreado&#8221; por nada, y esto no sólo en elecrónica analógica sino también digital. Al cambiar una entrada de una compuerta, no tuvo que haber ningún &#8220;sistema de monitoreo&#8221;, así que la forma en que deben pensarse los circuitos debe explicarse mejor.
</p></div>
<p>Caramba, iré completando este texto mientras le robo tiempo al tiempo!!! Gracias a los lectores!!!</p>
]]></content:encoded>
			<wfw:commentRss>http://investigacionyprogramacion.com/wordpress/metodolog%c3%ada-para-realizar-ingenier%c3%ada-en-reversa/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Hábitos de programación</title>
		<link>http://investigacionyprogramacion.com/wordpress/h%c3%a1bitos-de-programaci%c3%b3n</link>
		<comments>http://investigacionyprogramacion.com/wordpress/h%c3%a1bitos-de-programaci%c3%b3n#comments</comments>
		<pubDate>Sun, 03 Apr 2011 19:42:27 +0000</pubDate>
		<dc:creator>administrador</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://investigacionyprogramacion.com/wordpress/?p=61</guid>
		<description><![CDATA[Contribuyamos con algunos hábitos de programación que serán útiles para la comunidad. 1. Cuando falle algo que estaba funcionando bien antes, NO VUELVAS A EMPEZAR. Compara la nueva versión con la vieja versión, y ENCUENTRA el error. Aprende de tus &#8230; <a href="http://investigacionyprogramacion.com/wordpress/h%c3%a1bitos-de-programaci%c3%b3n">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Contribuyamos con algunos hábitos de programación que serán útiles para la comunidad.</p>
<p>1. Cuando falle algo que estaba funcionando bien antes, NO VUELVAS A EMPEZAR. Compara la nueva versión con la vieja versión, y ENCUENTRA el error. Aprende de tus errores. A menudo algunas personas dicen que esto toma más tiempo, que es tiempo mal gastado, etc. Pues estoy en completo desacuerdo. Encontrar e identificar un error, te permite evitar cometerlo en el futuro, te permite tener mayor confianza en la tecnología y en tí mismo (te evitas esa incertidumbre de que &#8220;una vez algo me falló y nunca supe qué fue, y la única solución que se me ocurrió fue volverlo a hacer, y mágicamente funcionó&#8221;).</p>
<p>Espero que algunos lectores contribuyan a crecer esta lista.</p>
<p>Saludos.</p>
<p>Investigación y Programación Ltda</p>
]]></content:encoded>
			<wfw:commentRss>http://investigacionyprogramacion.com/wordpress/h%c3%a1bitos-de-programaci%c3%b3n/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>javascript: document.documentElement.scrollHeight puede devolver 0 como altura. Problema Resuelto</title>
		<link>http://investigacionyprogramacion.com/wordpress/javascript-document-documentelement-scrollheight-puede-devolver-0-como-altura-problema-resuelto</link>
		<comments>http://investigacionyprogramacion.com/wordpress/javascript-document-documentelement-scrollheight-puede-devolver-0-como-altura-problema-resuelto#comments</comments>
		<pubDate>Sun, 03 Apr 2011 19:34:24 +0000</pubDate>
		<dc:creator>administrador</dc:creator>
				<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://investigacionyprogramacion.com/wordpress/?p=57</guid>
		<description><![CDATA[La propiedad document.documentElement.scrollHeight puede devolver 0 como altura del objeto body, si hay algún bloque antes de , cualquier bloque. Ver más detalles en la versión en inglés.]]></description>
			<content:encoded><![CDATA[<p>La propiedad document.documentElement.scrollHeight puede devolver 0 como altura del objeto body, si hay algún bloque antes de <html><head>, cualquier bloque. Ver más detalles en la versión en inglés.</p>
]]></content:encoded>
			<wfw:commentRss>http://investigacionyprogramacion.com/wordpress/javascript-document-documentelement-scrollheight-puede-devolver-0-como-altura-problema-resuelto/feed</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Macro en Excel para exportar una tabla a MySQL en formato SQL, mejor que en CSV</title>
		<link>http://investigacionyprogramacion.com/wordpress/macro-en-excel-para-exportar-una-tabla-a-mysql-en-formato-sql-mejor-que-en-csv</link>
		<comments>http://investigacionyprogramacion.com/wordpress/macro-en-excel-para-exportar-una-tabla-a-mysql-en-formato-sql-mejor-que-en-csv#comments</comments>
		<pubDate>Sat, 12 Mar 2011 23:28:23 +0000</pubDate>
		<dc:creator>administrador</dc:creator>
				<category><![CDATA[Excel Macros]]></category>

		<guid isPermaLink="false">http://investigacionyprogramacion.com/wordpress/?p=39</guid>
		<description><![CDATA[La exportación de Excel a MySQL no es tan automática como se desearía. En primer lugar, MySQL acepta en esencia dos formatos para importar, que son CSV y SQL. Así que uno coloca una tabla en una hoja aparte de &#8230; <a href="http://investigacionyprogramacion.com/wordpress/macro-en-excel-para-exportar-una-tabla-a-mysql-en-formato-sql-mejor-que-en-csv">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>La exportación de Excel a MySQL no es tan automática como se desearía. En primer lugar, MySQL acepta en esencia dos formatos para importar, que son CSV y SQL. Así que uno coloca una tabla en una hoja aparte de Excel, graba esa hoja de Excel en formato CSV (en &#8220;guardar como&#8221; selecciona ese formato), pero se encuentra con sorpresas como que Excel colocó una codificación arbitraria y, para datos que contienen cadenas de texto con caracteres fuera del ASCII básico, empieza a haber problemas. Además, al importar a MySQL datos en formato CSV, se deben incluir todas las columnas de la tabla, así una de esas columnas corresponda a un id autonumérico que debería ser generado automáticamente por el motor de base de datos.</p>
<p>Por ello, un mejor método para exportar datos de Excel a MySQL es a través de sentencias SQL, sentencias INSERT INTO que contengan toda la tabla. He aquí una macro en Excel que servirá a los lectores para lograr ese propósito con relativa rapidez, es decir, exportar una tabla de Excel a una sentencia SQL que podrá importarse fácilmente en MySQL, evitando los problemas de codificación y evitando la tontería de tener que definir en la tabla de Excel TODAS las columnas que existen en la tabla de MySQL, cosa que no siempre tiene sentido como es en el caso de la clave ID autonumérica. </p>
<p>El código que deben pegar en el editor de Visual Basic para Aplicaciones de Excel (menú herramientas -> Macros -> Editor de Visual Basic) es el siguiente. Cuando lo ejecuten, les pedirá el nombre de la tabla en MySQL, porque la sentencia SQL necesita conocer ese nombre. El resultado se escribe en la ventana INMEDIATO de Visual Basic, a la que pueden acceder desde el menú &#8220;Ver&#8221;->Ventana Inmediato.</p>
<div style="font-style: italic;">
Sub Construir_sentencias_sql()<br />
Dim sqlQuery As String<br />
Dim i As Long, j As Integer &#8216;i es el cursor para las filas, j es el cursor de columnas<br />
Dim nombre_tabla As String<br />
Dim titulo_celda As String, valor_celda As String</p>
<p>&#8216;nombre_tabla = InputBox(&#8220;Escriba aquí el nombre de la tabla&#8221;)<br />
nombre_tabla = &#8220;bancos&#8221;<br />
If nombre_tabla = &#8220;&#8221; Then Exit Sub</p>
<p>&#8216;Primero recoge los nombres de las columnas:<br />
sqlQuery = &#8220;INSERT INTO &#8221; &#038; nombre_tabla &#038; &#8221; (&#8221;<br />
j = 1  &#8216;Las columnas y las filas en una hoja de Excel se enumeran desde 1<br />
While (Cells(1, j).Value <> &#8220;&#8221;)<br />
    titulo_celda = Cells(1, j).Value<br />
    titulo_celda = Replace(Cells(i, j).Value, &#8220;&#8216;&#8221;, &#8220;&#8221;"&#8221;) &#8216;Escapa las comillas sencillas.<br />
    sqlQuery = sqlQuery &#038; &#8220;`&#8221; &#038; titulo_celda &#038; &#8220;`&#8221; &#8216;Esta comilla &#8220;`&#8221; es diferente de la comilla para los valores dentro del segmento VALUES.<br />
    If Cells(1, j + 1).Value <> &#8220;&#8221; Then sqlQuery = sqlQuery &#038; &#8220;, &#8221;<br />
    j = j + 1<br />
Wend<br />
sqlQuery = sqlQuery &#038; &#8220;) VALUES &#8221;</p>
<p>i = 2 &#8216;Empieza desde la fila 2, porque la 1 es el título de la tabla.<br />
While (Cells(i, 1).Value <> &#8220;&#8221;) &#8216;Es decir, mientras la primera celda de la fila<br />
                                &#8216;tenga un contenido, considera que no ha llegado al final de la tabla.<br />
    j = 1 &#8216;Las columnas y las filas en una hoja de Excel se enumeran desde 1<br />
    sqlQuery = sqlQuery &#038; &#8220;(&#8221;<br />
    While (Cells(i, j).Value <> &#8220;&#8221;)<br />
            valor_celda = Replace(Cells(i, j).Value, &#8220;&#8216;&#8221;, &#8220;&#8221;"&#8221;) &#8216;Escapa las comillas sencillas.<br />
            sqlQuery = sqlQuery &#038; &#8220;&#8216;&#8221; &#038; valor_celda &#038; &#8220;&#8216;&#8221;  &#8216;Esta comilla &#8220;&#8216;&#8221; es diferente de la comilla para las columnas en la sección INSERT INTO.<br />
        If Cells(i, j + 1).Value <> &#8220;&#8221; Then sqlQuery = sqlQuery &#038; &#8220;, &#8221;<br />
        j = j + 1<br />
    Wend<br />
    sqlQuery = sqlQuery &#038; &#8220;)&#8221;<br />
    If Cells(i + 1, 1).Value <> &#8220;&#8221; Then sqlQuery = sqlQuery &#038; &#8220;, &#8221;<br />
    i = i + 1<br />
Wend<br />
&#8216;Final de la sección VALUES de la instrucción INSERT INTO<br />
Debug.Print sqlQuery<br />
End Sub
</div>
<p>Saludos, y esperamos que sea útil.</p>
<p>Investigación y Programación</p>
]]></content:encoded>
			<wfw:commentRss>http://investigacionyprogramacion.com/wordpress/macro-en-excel-para-exportar-una-tabla-a-mysql-en-formato-sql-mejor-que-en-csv/feed</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Yii: Establecer la opción por defecto en un dropdownlist</title>
		<link>http://investigacionyprogramacion.com/wordpress/yii-establecer-la-opci%c3%b3n-por-defecto-en-un-dropdownlist</link>
		<comments>http://investigacionyprogramacion.com/wordpress/yii-establecer-la-opci%c3%b3n-por-defecto-en-un-dropdownlist#comments</comments>
		<pubDate>Sat, 12 Mar 2011 16:37:41 +0000</pubDate>
		<dc:creator>administrador</dc:creator>
				<category><![CDATA[Yii]]></category>

		<guid isPermaLink="false">http://investigacionyprogramacion.com/wordpress/?p=25</guid>
		<description><![CDATA[Mientras que tenemos una versión en español de esta entrada, te invitamos a leer la versión en inglés: http://investigacionyprogramacion.com/wordpress/?p=25&#38;lang=en]]></description>
			<content:encoded><![CDATA[<p>Mientras que tenemos una versión en español de esta entrada, te invitamos a leer la versión en inglés:</p>
<p><a href="http://investigacionyprogramacion.com/wordpress/?p=25&amp;lang=en">http://investigacionyprogramacion.com/wordpress/?p=25&amp;lang=en</a></p>
]]></content:encoded>
			<wfw:commentRss>http://investigacionyprogramacion.com/wordpress/yii-establecer-la-opci%c3%b3n-por-defecto-en-un-dropdownlist/feed</wfw:commentRss>
		<slash:comments>108</slash:comments>
		</item>
	</channel>
</rss>

