miércoles, 14 de noviembre de 2007

Intel 4004 - 36º aniversario

Me acabo de enterar que Intel publicó el esquema de circuitos del 4004, que fue (más allá de un cierto debate...) el primer microprocesador. Obviamente, con 2300 transistores y 740 kHz de reloj no podía hacer mucho; de hecho consigue hacerme sentir afortunado de estar programando un clon del 8051 :-) Aunque al menos el 4004 terminaba una instrucción en 8 ciclos...

jueves, 11 de octubre de 2007

Ratas topo!!

Es un animal muy particular, que habita en Etiopía, del que no conocía la existencia. Ciertamente tiene un aspecto poco común.

martes, 18 de septiembre de 2007

Subst++

Una funcionalidad de Windows (y DOS!) poco conocida es el comando subst, que permite asignarle una letra de unidad a un path. De ese modo, por ejemplo, subst X: "C:\Documents and Settings\user\Mis Documentos\Visual Studio 2005\Projects\" permite acceder a lso proyectos de Visual Studio como si estuvieran en el directorio raíz de una unidad con la letra X. Esto lo vi por primera vez en el sitio de Poco, un framework de red para C++.

Hablando ahora de algo completamente diferente, una imagen interesante de la Segunda Guerra: cuando retiran la bandera del portaaviones japonés Zuikaku (uno de los que había participado en el ataque a Pearl Harbor), antes de que se hunda. Para el momento en que se sacó esa foto, ya era bastante notable la inclinación de la cubierta debido al ingreso de agua (escora para los que conocen terminología náutica :-). Quince minutos después, la mitad de los tripulantes (más de ochocientos) murió cuando, finalmente, el portaaviones se dio vuelta y hundió.

Siguiendo con temas náuticos, este el motor diesel más grande del mundo, con 108,920 hp de potencia. Tiene una eficiencia de más del 50% en su régimen óptimo, ampliamente mayor que la eficiencia de los motores de automóvil que suele estar alrededor de 20%. Esta diferencia está dada fundamentalmente por la operación en un régimen menos variable, y las menores pérdidas de calor debido a la escala del motor.

domingo, 16 de septiembre de 2007

"Dar vuelta" una esfera

Acabo de ver un video muy interesante sobre como dar vuelta una esfera, o sea intercambiar su cara interior con la exterior.

Puede verse en:

http://video.google.com/videoplay?docid=-6626464599825291409

domingo, 9 de septiembre de 2007

Wikipedia en inglés: 2000000 de artículos

Hoy la versión en idioma inglés de Wikipedia superó los dos millones de artículos. A pesar de que ciertamente puede discutirse la calidad de algunos de los artículos, el hecho de que una enciclopedia basada en contribuciones de los usuarios funcione tan bien como lo hace es verdaderamente digno de destacarse.

Me enteré hace unos meses que existe una página destinada al mantenimiento de la infraestructura técnica de Wikipedia que, como podría suponerse, es bastante grande. Además es especialmente interesante por la apertura respecto al funcionamiento, que nos permite ver cosas que no podemos conocer respecto a Google, por ejemplo.

En curiosidades: ¿se imaginan un edificio sin ventanas? ¿O qué a principios del siglo XX Bayer vendía heroína para calmar la tos en chicos?

jueves, 6 de septiembre de 2007

Comentarios sobre una noticia

Estaba viendo esta noticia de Yahoo, proveniente de Infobae que supuestamente hablaba sobre "Diez misterios que la ciencia todavía no pudo develar". Debo admitir que, si bien no esperaba ver algo así como las de John Baez, no estaba preparado para ver la lista de estupideces que aparecían... O sea, ¿hay gente que cree en "Pie Grande" y en los fantasmas?

En fin, supongo que viendo la clase de cosas que se publican incluso en revistas de divulgación científica no debería extrañarme mucho. O sea, si los editores de una revista dedicada a divulgar el conocimiento científico no conocen la conservación de la cantidad de movimiento, que se puede esperar...

Es deprimente.

martes, 4 de septiembre de 2007

Promoción de enteros en C++

Un problema particularmente molesto me ocurrió ayer mientras programaba el sistema de evaluación de individuos de la tesis. Había escrito el siguiente fragmento de código:


for (int i = 0; i < reqs.size() - 1; i++)
std::cout << reqs[i].first.toString() << " - ";


cuya idea es, básicamente, imprimir todos los elementos de
reqs a excepción del último, para que no quede un guión colgando al final.

Al ejecutar el código, funcionaba bien en general; pero al probarlo con un vector vacío, fallaba con un error indicando acceso a una posición inexistente. Después de un tiempo de meditación (excesivamente largo!), pude darme cuenta de lo que originaba el problema. reqs.size() devuelve un tamaño del tipo size_t, que por lo general es un typedef de unsigned int. Al restarle uno, de acuerdo a las reglas de promoción, se le resta como si fuera una resta de unsigned ints, por lo que la resta actuaba en forma modular y terminaba tratando de acceder a la posición 232 - 1 (la que obviamente no existía en el vector).

En otro contexto completamente diferente, una tesis interesante de un graduado de la CMU en la que calcula, en base a un diseño concreto, el costo que tomaría absorber el dióxido de carbono de la atmósfera. Yo consideraba que era algo que debía ser completamente infactible, pero parece ser que podría hacerse por un costo de U$S 200 por tonelada de CO2. Obviamente es más costoso que secuestrarlo en una central térmica, pero podría ser una solución para la captura de fuentes distribuidas, como es el caso del transporte automotor en general.

martes, 21 de agosto de 2007

Post de retorno: desarrollo de circuitos

Bueno, pasó bastante tiempo desde la última actualización y no quería llegar a un mes sin posts... Estas últimas semanas estuve ocupado terminando trabajos prácticos finales para varias materias, pero esta pude empezar nuevamente con el trabajo de la tesis. Más específicamente, comenzando a programar el módulo de evaluación.

Este módulo es central para el sistema, ya que debe transformar la descripción del individuo en un circuito con objeto de que pueda obtenerse su transferencia con el SPICE y compararla con la deseada. Esta transformación, que puede verse animada en el sitio de John Koza, consiste en interpretar el cromosoma como una serie de instrucciones que gobiernan el "crecimiento" de un circuito.

Como en el sistema que estoy desarrollando un cromosoma es un array de bytes y debo representar con él un árbol, tenía que decidirme por una codificación. Después de pensar varias opciones, elegí utilizar una codificación prefija por la simplicidad de su "evaluación" recursiva. También evalué la posibilidad de no efectuar la recursión y reemplazarla por iteración, pero decidí seguir el precepto de Knuth respecto a la optimización prematura.

La otra decisión de codificación era respecto al circuito: implementar mi propia representación o utilizar Boost. En base a mis experiencias previas con grafos, elegí utilizar boost::adjacency_list; no por razones de performance, sino para evitar los posibles bugs y tiempo desperdiciado.

Para terminar, un interesante post de Stephen Wolfram (el creador del Mathematica) sobre los diseños de puentes, a la luz de la famosa caída de uno en Estados Unidos.

miércoles, 25 de julio de 2007

GLUT y su eventual sustitución

Estas últimas semanas estaba tratando de recordar un poco como usar OpenGL y, a diferencia de lo que había hecho en ocasiones anteriores, probé utilizar algunas bibliotecas para facilitar el trabajo (algo se aprende al pasar los años :-)

Empecé utilizando GLUT, ya que tiene una enorme base de ejemplos desde los que partir. Pronto me encontré con un inconveniente: yo programo normalmente esta clase de aplicaciones en C++, pero GLUT fue diseñada para utilizarse con C y, por desgracia, algunas de sus callbacks tienen el prototipo void callBack(void). Esto me hacía imposible esconder a this y me obligaba a utilizar un punto de acceso central, probablemente un singleton (ahora que lo pienso mejor, podría haber implementado alguna clase de dispatcher pero, como verán, no era realmente necesario).

Al no encontrar dicha "solución" muy satisfactoria (años de propaganda anti-singleton rindiendo frutos), probé con varias adaptaciones o extensiones de GLUT para C++, siendo GLT la que atrajo más mi atención. Sin embargo, carecía notablemente de documentación e involucraba múltiples DLLs.

Me disponía a seguir probando con GLUT pero, al consultar algunos ejemplos de "procedural textures" de Sean O'Neil (lamentablemente su sitio ya no funciona, pero pude encontrar sus ejemplos en The Wayback Machine), me encontré con SDL. Ya había escuchado mencionarla, pero nunca pensé que fuera tan simple de utilizar; en unos minutos tenía corriendo mi primer ejemplo y, a partir de entonces, me convertí totalmente a SDL :-)

Sigue siendo C, pero su sistema de manejo de eventos, paradójicamente basado en un loop explícito al estilo Windows, es fácil de integrar con C++. Además gana en todas las otras áreas, ya que incorpora un control más directo de la resolución de la pantalla y la documentación, si bien breve, es la necesaria para empezar a utilizarla rápidamente.

Cuando siga con mi ejemplo de OpenGL, veré que tan satisfactoria resulta en general...

En otras áreas:
  • Tres blogs interesantes:

viernes, 20 de julio de 2007

Dia del Amigo y otras cosas

Breves comentarios:

Al ser hoy el Día del Amigo y, por lo tanto, aniversario de la llegada de la misión Apollo 11 a la Luna, estaba mirando el artículo de Wikipedia sobre el tema, seguro de que no podía decir nada que no conociera, ya que había leído bastante sobre el tema, me encontré con esto. Ciertamente tomaban en cuenta todas las posibilidades con antelación :-I

Otro tema que vi es la interesante máquina que juega al Ta-Te-Ti hecha con "Tinkertoys" (con pequeñas excepciones). Puede verse en forma libre un excelente y muy detallado artículo sobre ella.

Para despedirme, la épica pelea en Hockey entre canadienses y soviéticos (año 1987) en YouTube.

Juego de las damas resuelto!

El juego de las damas fue resuelto! (Como era de esperar el resultado del juego perfecto es empate.)

Es un resultado interesante porque es, por lejos, el juego más complejo que ha sido resuelto completamente. Aparentemente al ajedrez le queda bastante tiempo todavía, aunque la teoría de los finales de ajedrez ha sido modificada en formas importantes por las búsquedas exhaustivas realizadas por Ken Thompson (el mismo del Unix!), que indicaron, por ejemplo que ciertos finales de rey, dama y peón contra rey y dama (denominados KQPKQ) requerían más de 50 movidas para el mate.

jueves, 19 de julio de 2007

Descripción del tema de la tesis y otras cosas

Bueno, antes de seguir con los temas del día, voy a hablar un poco de cual es el tema de mi tesis. El tema es la "Utilización de estrategias de selección de población para el diseño de filtro analógicos pasivos utilizando programación genética", pero ¿qué significa?

Bueno empecemos con la programación genética (mucha más información sobre el tema, como siempre, puede encontrarse en Wikipedia o en Google). La programación genética es una técnica para resolver problemas de optimización que se basa en realizar una "evolución artificial" de una población de programas, con el objeto de seleccionar al que dé la solución más conveniente al problema planteado. Se diferencia de los algoritmos genéticos en que el genoma no se interpreta en forma estática, sino que se ejecuta con una máquina virtual (limitada, lógicamente, no es ni HotSpot ni CLR! :-) Voy a hablar más de este tema (uno de los más importantes en un sistema de programación genética) posteriormente, cuando esté implementando la mencionada VM.

Los filtros analógicos pasivos son circuitos electrónicos cuyo objetivo, tal cual lo indica el nombre, es "filtrar" una señal, eliminando ciertos componentes de la misma. Se denominan analógicos porque operan con una representación continua de la señal; esto los diferencia de los filtros digitales que lo hacen con una representación en tiempo discreto. Finalmente son pasivos porque solo utilizan tres clases de componentes: resistores, capacitores e inductores, ninguno de los cuales "entrega energía" a la señal (la definición estricta de pasividad es algo compleja). A pesar de que no figura en el nombre, estos filtros son lineales, lo que implica que la respuesta a la suma de dos señales es al suma de las respuestas que daría a cada señal por separado.

El realizar todas esas generaciones de evolución con poblaciones que pueden llegar a tamaños considerables es computacionalmente costoso. Si bien hoy día es en general ventajoso intercambiar tiempo del programador por tiempo de máquina, como lo muestra la gran popularidad de lenguajes tales como Python, una tarea suficientemente compleja puede vencer incluso al crecimiento exponencial del poder de cálculo. Por ello es importante tener métodos relativamente sofisticados para elegir a los circuitos de la población con mejores perspectivas de acercarnos a la solución. Más adelante hablaré sobre al naturaleza de estas estrategias.

Bueno ahora a los links del día:

Brian Beckman: The Physics in Games - Real-Time Simulation Explained

Photo Tourism: Exploring Photo Collections in 3D (funciona con Firefox)

En el próximo post: GLUT - arcaica o práctica :-D

miércoles, 18 de julio de 2007

Post inaugural

En este blog pienso desarrollar ideas relacionadas con el tema de mi tesis, de forma de obtener realimentación al respecto. También, lógicamente, tendrán su lugar las ideas no directamente relacionadas con la tesis.

Espero que no se convierta en un "sumidero de tiempo" :-)