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.

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.