Las implementaciones normales de factories en C++ suelen introducir la necesidad de modificar la clase Factory o su inicialización para cada clase que se agrega. Los intentos de evadir esta centralización utilizando la inicialización estática suelen ser algo como lo que aparece en el ejemplo factory_mal (es claro que hay algo mal :-) .
Este ejemplo utiliza la inicialización de variables globales para realizar el registro de los factory methods. En muchos casos esto parece funcionar, de hecho me acaba de funcionar al probarlo, pero contiene un error grave: asume un orden de inicialización de objetos estáticos entre distintos archivos (bueno, "unidades de traducción").
El problema en que no puede suponerse que los distintos Registrators vayan a inicializarse después que Factory::cm_. Si los Registrators se inicializan primero, Factory::registrate() accederá a un map no inicializado, probablemente llevando a un segmentation fault.
La solución a esto es la misma que la aplicada en el Singleton de Meyers: utilizar una variable estática dentro de un método. De este modo podemos garantizar que el objeto estará inicializado cuando sea utilizado.
Obviamente esta solución no maneja los problemas con múltiples threads, ni arregla mágicamente los problemas de diseño que puedan ser provocados por el uso indebido de singletons, pero soluciona el problema de la inicialización.
miércoles, 30 de abril de 2008
sábado, 5 de abril de 2008
Relatividad en 6 minutos
(Vía John Walker)
Sí, un video musical por Max Tegmark! No puedo imaginarme algo así en la FIUBA aunque, en realidad, tampoco lo imaginaba en el MIT :-D
El paper con la letra...
Sí, un video musical por Max Tegmark! No puedo imaginarme algo así en la FIUBA aunque, en realidad, tampoco lo imaginaba en el MIT :-D
El paper con la letra...
jueves, 3 de abril de 2008
Un robot distinto
BigDog: un robot que parece "útil". Acostumbrado a ver la forma vacilante en que suelen caminar los robots me impresionó mucho la estabilidad y adaptabilidad que despliega BigDog. Tal vez hay razones para el optimismo en la robótica :-)
miércoles, 19 de marzo de 2008
Muere Arthur Clarke a los 90 años
Probablemente, su idea más conocida es la que apareció en esta tapa de diario, allá por el año 1946 y en una revista en el año 1945 con más detalle. Un anticipo de DirectTV... aunque con tripulaciones yendo a cambiar las válvulas :-)
Probablemente esta mezcla de aciertos y desaciertos sea inherente a tratar de predecir tecnologías futuras; como dice la frase, "es difícil hacer predicciones, sobre todo acerca del futuro". Probablemente allá por el año 2200 se reirán de algunas de las predicciones que se hacen hoy día acerca de la nanotecnología.
Probablemente esta mezcla de aciertos y desaciertos sea inherente a tratar de predecir tecnologías futuras; como dice la frase, "es difícil hacer predicciones, sobre todo acerca del futuro". Probablemente allá por el año 2200 se reirán de algunas de las predicciones que se hacen hoy día acerca de la nanotecnología.
lunes, 17 de marzo de 2008
Proyecto para Labo de Micros
Acá está todo el software del proyecto que hicimos (junto con Mariano Beiró) para la materia Laboratorio de Microcomputadoras: un juego de Ta-Te-Ti capaz de conectarse a cualquier televisor (con audio incluido!). Una de las cosas más particulares que tenía el software era el uso de un tabla comprimida con Huffman para determinar que jugada realizar en base a la posición del tablero. Algunas fotos:

La imagen proyectada sobre una PC cuando hicimos la presentación (como la salida era video compuesto la tomaba sin problemas).

Una vista de la plaqueta principal.
La imagen proyectada sobre una PC cuando hicimos la presentación (como la salida era video compuesto la tomaba sin problemas).
Una vista de la plaqueta principal.
domingo, 16 de marzo de 2008
Graficando funciones discontinuas con Mathematica
Mientras estaba tratando de ilustrar el comportamiento de las funciones racionales elípticas dentro de la Tesis, me encontré con uno de los problemas del comando Plot[] del Mathematica. Este comando, al ir conectando puntos donde evalúa a la función, termina dibujando una línea en donde debería haber una discontinuidad. Por ejemplo, si uno ejecuta el comando Plot[1/(x-1),{x,-3,3}] obtiene el siguiente resultado:


Los comandos Off[] y On[] desactivan y activan respectivamente la emisión del error Plot::plnr, producido por la función Plot[] al encontrarse con valores no numéricos.
En otros temas, más allá de las funciones elípticas, dos interesantes fotos de objetos de oro sólido (particularmente apropiados con el oro a más de $100000 el kg :-)
Puede verse claramente que hay una línea vertical en x = 1.
Después de encontrar en la Web varias opciones que no me resultaban satisfactorias, tales como actualizar a la versión 6 o dividir el gráfico en segmentos con dominios donde la función es continua (estaba trabajando con una función con 4 polos), decidí acotar el valor de la función y reemplazar los valores superiores con valores indeterminados.
Esta solución aplicada al problema de mostrar correctamente al gráfico anterior quedaría como:
f[x_]:=1/(x-1);
fp[x_]:=Module[{},
ret=f[x];
If[Abs[ret]>30,Indeterminate,ret]];
Off[Plot::plnr];
Plot[fp[x],{x,-3,3}];
On[Plot::plnr];
Después de encontrar en la Web varias opciones que no me resultaban satisfactorias, tales como actualizar a la versión 6 o dividir el gráfico en segmentos con dominios donde la función es continua (estaba trabajando con una función con 4 polos), decidí acotar el valor de la función y reemplazar los valores superiores con valores indeterminados.
Esta solución aplicada al problema de mostrar correctamente al gráfico anterior quedaría como:
f[x_]:=1/(x-1);
fp[x_]:=Module[{},
ret=f[x];
If[Abs[ret]>30,Indeterminate,ret]];
Off[Plot::plnr];
Plot[fp[x],{x,-3,3}];
On[Plot::plnr];
Los comandos Off[] y On[] desactivan y activan respectivamente la emisión del error Plot::plnr, producido por la función Plot[] al encontrarse con valores no numéricos.
En otros temas, más allá de las funciones elípticas, dos interesantes fotos de objetos de oro sólido (particularmente apropiados con el oro a más de $100000 el kg :-)
- Una pepita de oro de más de 4 kg.
- Un ladrillo de 220 kg de oro (más de $22000000 en la actualidad).
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...
Suscribirse a:
Entradas (Atom)