From the monthly archives:

December 2008

Functores a la boost

by Jorge Machin on December 31, 2008 · 2 comments

in C/C++, Snapshots

Para mí, una de las razones para considerar seriamente a boost en cualquier proyecto en C++ es su implementación de functores. Realmente facilita mucho la creación de funciones "callback" y "delegates" sin causar mucha penalización en el rendimiento de un programa.

¿Porqué facilita el trabajo si los callbacks bien se pueden hacer con tan solo un apuntador a función? La respuesta es fácil si estas trabajando con un enfoque orientado a objetos. Para usar un apuntador a una función miembro, esta necesita ser estática o ser llamada con ayuda de su objeto. Las dos cosas bastante engorrosas.

Veamos como se sortea estos inconvenientes usando boost:

#include <iostream>

#include <boost/function.hpp>
#include <boost/bind.hpp>

using namespace std;

class Callback {

  public:

     void set_callback_function( boost::function<void()> function ) {

       this->callback_function = function;

     }

     void execute_callback_function() {

       if(  !callback_function.empty() )

          callback_function();

     }

  private:

     boost::function<void ()> callback_function;

};

class MiClase {

  public:

     void funcion() {

        cout <<"¡iujú! ¡Si se llamó!" <<endl;

     }

};

int main() {

  Callback callback;

  MiClase miclase;

  callback.set_callback_function( boost::bind( &MiClase::funcion, &miclase ) );

  callback.execute_callback_function();

  return EXIT_SUCCESS;

}

Probando el código en línea

En la siguiente URL, puedes probar este programa en línea: http://www.ideone.com/hbMXbtFR

{ 2 comments }

Portal Cake: Detrás de cámaras

by Jorge Machin on December 29, 2008 · 1 comment

in Gastronomía, Personal, Videojuegos

Para festejar el gran éxito que tuvo el Portal Cake este año, hice de rapidín un video de como se hizo:

De verdad, quiero hacer notar aquí que es difícil exagerar mi satisfacción. Gracias Cirri por hacerlo :) El post original lo pueden encontrar aquí.

{ 1 comment }

Cuando estudiaba en la secundaria, me empezaron a enseñar álgebra y trigonometría. Era feliz porque estaba seguro de que con esos conocimientos ya podría representar la realidad en mi recién comprada computadora: podía hacer caer y rebotar una pelota (cuadrada) en la pantalla. También con esos conocimientros seguramente sería capaz de resolver varios problemas de la vida real y fácilmente me podrían dar trabajo.

De un libro, con las formulas del seno y el coseno aprendí a dibujar un reloj analógico y al poco tiempo mis naves espaciales podían hacer no sólo movimientos rectos sino ahora circulares.

Reloj
Reloj de un libro de Geoff Phillips

Pero al saber que las computadoras manejaban sus numeros en representaciones binarias, me surgió la duda de cómo le hacian para calcular esas funciones trigonométricas. Normalmente, cuando yo no usaba la calcualdora, obtenía los valores del seno y el coseno con unas tablas...

Incluso a mis 13 años, era evidente para mí que la computadora no tenía las tablas capturas; porque los resultados los daba razonablemente exactos sin importar los decimales que pusiera como ángulo. Mi maestro de matemáticas resolvió mi duda diciendo que se aproximaban con series infinitas y me dio los ejemplos de mis funciones favoritas con una leve explicación que finalizó comentando que cuando fuera "grande" las iba poder calcular por mi cuenta... ¡claro!, si seguía estudiando matemáticas.

sen x = x - frac {x^3} {3!} + frac {x^5}{5!} - frac {x^7}{7!} +  ...

cos x = 1 - frac {x^2} {2!} + frac {x^4}{5!} - frac {x^6}{6!} +  ...

En esos momentos no me imaginaba que dentro de esas series misteriosas, había mucha teoría atrás de como abstraemos al mundo con nuestras herramientas en papel, en la computadora e incluso en nuestra mente. No sospechaba que el universo era más complejo de lo que pensaba y que las herramientas que conocía en la secundaria no eran nada aún.

Inevitablemente, tenía que cruzar algunas barreras para entender muchos de los conceptos abstractos y locos que envuelven a nuestro universo ( como que pueden caber espacios infinitos en lugares finitos, por citar el más trillado) pero también surgiría la semilla de la duda de que tanto podemos manejar esa complejidad y hasta que nivel la podemos representar.

Pero fue ahí, con esa pregunta inocente, donde se creó esa barrera que esperó pacientemente a que estudiara más, de la misma forma que lo hizo antes la barrera del álgebra y la trigonometría. Mi maestro de matemáticas tenía mucha razón... tuvo que pasar algo de tiempo.

{ 0 comments }

Salsa Ranchera

by Jorge Machin on December 2, 2008 · 1 comment

in Gastronomía, Personal, Recetas

Esta es la clásica salsa de los huevos rancheros, aunque por supuesto la podemos usar para taquear o echarsela al arroz o a carnes asadas.

Ingredientes

1 diente de ajo pelado

1/2 Kg de jitomates

3 chiles serranos

2 cucharada de aceite

1/4 de cebolla finamente picada

1/4 de cucharadita de sal


Simplemente adictiva

Procedimiento

1. Los jitomates se ponen en un comal caliente para que su piel se queme, procurando voltearlos frecuentemente.

2. De igual forma que los jitomates, se asan los chiles en el comal.

3. Se ponen en la licuadora los ajos, los jitomates, los chiles y se licuan.

4. Se calienta aceite en un sarten y se pone a acitronar ligeramente la cebolla.

5. Se vacia el contenido de la licuadora en el sarten y se agrega la sal y se cuece durante unos 8 minutos moviento con una pala de madera.

{ 1 comment }

La biblioteca TinyXML es muy liviana y permite parsear rapidamente XMLs sin tener que hacer mucho formalismo. En este post presento un código de ejemplo:

El xml que queremos parsear como ejemplo es el siguiente:

<?xml version="1.0">

<ELEMENT attribute="attribute">
   <CHILD>child</CHILD>
</ELEMENT>

A continuación el programa de ejemplo en c++ que realiza el parseo:

#include <iostream>

#include "tinyxml.h"

using namespace std;

int main() {

  TiXmlDocument doc;

  if ( !doc.LoadFile( "ejemplo.xml" ) )  {

    cout <<"Error: Can't load file ejemplo.xml" << endl;
    return EXIT_FAILURE;

  }

  string attribute, childi_value;

  TiXmlElement *element;

  element = doc.FirstChildElement( "ELEMENT" );

  if ( element->Attribute( "attribute" ) != NULL )

      attribute = string ( element->Attribute( "attribute" ) );

  cout <<"attribute: " <<attribute <<endl;

  TiXmlElement* child = element->FirstChildElement("CHILD");

  if ( child != NULL )

    child_value = string( ( ( child->FirstChild() )->ToText() )->Value() );

  cout <<"child value: " <<child_value <<endl;

  return EXIT_SUCCESS;

}

El cual compilamos con:

g++ -o main main.cpp -ltinyxml

{ 0 comments }