Posts

Showing posts from January, 2010

Repair GRUB when installing Windows XP after installing Ubuntu

Spanish version / Versión en Español When we have more than one Operating System in the same machine, it is usual to select which one to boot on startup using GRUB. The problem is that when we install Windows XP, something more frequent than desirable, it wipes out GRUB. It's easy to fix that, see here: Fix GRUB after Windows Install Needless to say, all credit goes to Scott Calonico and the makers of SuperGRUB. But there's a catch! Since version 9.10, Ubuntu uses Grub2, which is quite different from its ancestor. The guys from SuperGRUB claim to have a SuperGRUB version for Grub2, but according to them, it doesn't always work. If that is the case or whe don't even want to bother, we can boot from an Ubuntu Live CD or USB, fire up a terminal and type: sudo update-grub sudo fdisk -l sudo grub-install /dev/sdx In the last line, you should replace the "x" in "sdx" by the letter corresponding to the hard drive where we want to rein

Reparar GRUB al instalar Windows después de Ubuntu

Versión en inglés / English version Cuando tenemos varios sistemas operativos en una misma máquina, típicamente seleccionamos cuál cargar al arrancar usando GRUB. El tema es que instalar Windows, cosa muy frecuente, se lleva puesto el GRUB. Rescatarlo es fácil, pero siempre tengo que buscarlo de nuevo así que voy a poner esta guía acá: Fix GRUB after Windows Install De más está decirlo, pero todo el crédito es para Scott Calonico y los creadores de SuperGRUB ¡Ojo! Desde su versión 9.10, Ubuntu usa Grub2, que es bastante diferente a su antecesor. En todo caso, SuperGRUBDisk tiene una versión para GRUB2, pero según ellos no funciona del todo bien. En ese caso, pelamos el Live CD de Ubuntu, arrancamos desde él, abrimos una terminal y hacemos: sudo update-grub sudo fdisk -l sudo grub-install /dev/sdx Donde reemplazamos la "x" de "sdx" por la letra correspondiente al disco duro en cuyo MBR queremos reinstalar GRUB (para eso usamos el comando fdisk,

Shameless Plug

Spanish version / Versión en Español How's it hanging, software-crazy people? Please check out Juan Alberto Villca's sites. Juan is also a student at UBA, and he's more web oriented than me, so it might interest you. A word of warning to English-olny people : most of these sites are in Spanish. Ubuntu tips and tricks (not just from Juan) Juan Alberto's Web Development Site Lorem Ipsum Juan Alberto's Projects Happy Chanukkah!

Pasando chivo

Versión en inglés / English version ¿Cómo les baila, gente descerebrada por el software? Péguenle una relojeada a los sitios de Juan Alberto Villca, célebre colega de la FIUBA. Él está más orientado al desarrollo Web, así que tal vez les interese. Truquitos para Ubuntu (no sólo de Juan) Desarrollo Web Lorem Ipsum Proyectos varios Feliz día de la GAMBRALBA, sa-sa-sa-migoss

C++: Pointers to member functions

Spanish version / Versión en Español This is quite an advanced C++ topic. In both plain C and C++ there are pointers to functions, which allow us to dynamically select the function to invoke from many which have the same signature. A typical example of this is defining a few comparison functions, all with the same signature, in order to dynamically select how to sort a collection (ascending, descending, alphabetically, etc). C++ brings in a new concept over C: pointers to member functions. Most of the times, plain pointers to function are not very Object Oriented, since they are static and all. The C++ syntax for declaring pointers to member functions is similar to that of pointers to functions, we just have to specify the class: // Generic syntax // functionReturnType (ClassName::*nameOfPointerToMemberFunctionVariable)( functionArguments ); // Concrete example LRESULT (CCoConsola3D::*onMouseWheelHandler) ( UINT, WPARAM, LPARAM, BOOL& ); The concrete example declare

C++: Punteros a funciones miembro

Versión en inglés / English version Éste es uno de los temás más avanzados de C++, casi un arcano. Tanto en C como en C++ tenemos punteros a funciones, que nos permiten seleccionar dinámicamente la función a invocar entre varias que tienen el mismo encabezado. El ejemplo típico de aplicación es hacer una función que ordene una colección de diferentes formas, usando para comparar elementos una función invocado a través de un puntero. Esto puede hacerse en C++, pero a priori sólo con funciones static. Si queremos hacerlo con funciones miembro de una clase, debemos usar este mecanismo exclusivo de C++. La sintaxis para declarar un puntero a función miembro es similar a la de los punteros a función, con el agregado de especificar la clase: // Sintaxis Genérica // retornoFuncion (NombreClase::*nombreVariablePunteroAMiembro)( argumentosFuncion ); // Ejemplo concreto LRESULT (CCoConsola3D::*onMouseWheelHandler) ( UINT, WPARAM, LPARAM, BOOL& ); La línea del ejemplo declara

C++: std::endl versus \n

Spanish version / Versión en Español Recently I started a second, deeper reading of the C++ programmer bible and I noticed something which I had overlooked before. Up next is the Hello World example from the book: int main() { std::cout << "Hello, World!\n"; } Why does Bjarne use \n instead of std::endl? Weren't we taught that the latter is more portable, since it maps to \n in *ix and \r\n in Windows? Stroustrup doesn't say anything about this, but after some googling, it turns out that using std::endl induce a stream flush. What does this mean? As you might know, most commercial programs, operating systems and hardware do I/O buffering, which means that output operations are not directly performed on the physical media. They are done to a buffer, and when it fills up, its contents are "flushed" to the media. This reduces the time spent accessing the media, which is always more time consuming than accessing the buffer. In the He

C++: std::endl versus \n

Versión en inglés / English version Releyendo la biblia del programador C++ , noté algo que en su momento se me pasó por alto. Lo que sigue es el Hola Mundo del libro: int main() { std::cout << "Hello, World!\n"; } ¿Por qué Bjarne usa \n en vez de std::endl? ¿Acaso no nos enseñaron que std::endl es más portable, ya que pone \n en *ix y \r\n en Ventanas? La respuesta es que pese a ser portable, std::endl induce un flush del stream. ¿Qué significa esto? El software de aplicación, el sistema operativo e incluso el hardware hacen buffering, vale decir que no envían los datos al stream inmediatamente: los acumulan en un buffer hasta que el mismo se llene, momento en el que se efectúa el flush. Esto reduce los accesos a disco, lo cual siempre es deseable en términos de eficiencia. En el Hola mundo la diferencia es despreciable, pero si tuviéramos un ciclo que escribiera muchas líneas a un archivo, la diferencia en performance puede manifestarse. Ergo,