24 noviembre 2009

Cuenta online NBA 2k10

Cómo hacerse una cuenta para jugar online al NBA 2k10. Yo buscando en la web de 2k y en mil foros y resulta que estaba dentro del juego.

Guía para hacerse un usuario de Taringa

También en descubierto que no gano ningún partido porque está puesto en el nivel de dificultad pro (y yo no soy pro).

En fin...

22 noviembre 2009

Autoruns for Windows v9.35

He estado reinstalando Windows XP y bajandome parches y actualizaciones del Windows Update. Navegando por ahí en encontrado esta aplicación de Microsoft: Autoruns para Windows v9.35. Es una especie de sustituto mejorado para el viejo msconfig aunque tiene muchísimas más cosas.

En esta captura se puede comparar con el msconfig. Sólo por permitir redimensionar la ventana ya merece la pena.



La pestaña Logon es la que nos muestra los programas que se ejecutan al inicio y que se suelen acoplar la lado del relojito. En options se le puede indicar que no muestra las aplicaciones propias de microsoft y sólo deje las de otros fabricantes (aunque Adobe consigue acoplar un programa como si fuera de Microsoft y lo que tenido que quitar luego).



Cada elemento se puede deshabilitar como en el msconfig o borrar directamente, lo cual mola bastante. Además si no sabemos qué hace alguno de los procesos, en el menú del botón derecho tiene un acceso directo para buscar en Google.



Espero que el msconfig de Windows 7 sea como este y no el viejuno...

15 noviembre 2009

Particiones



Este post es sólo para guardarme como recuerdo una captura de pantalla del pifostio de particiones que tengo. 2 instalaciones de Windows XP y 2 de linux y varias particiones con montones de basura. Ahora voy a arreglarlo un poco.

14 noviembre 2009

Red-Black Trees vs Binary Trees

He acabado de implementar la estructura red-black tree (árbol rojinegro o árbol rojo-negro). Es un árbol binario de búsqueda modificado para conseguir que siempre esté equilibrado y no ocurran los casos peores del árbol binario típico. Sólo hay que modificar la estructura del árbol para añadir un nuevo atributo a cada nodo: su color (rojo o negro). Además al insertar y borrar nodos hay que reorganizar el árbol efectuando rotaciones aprovechando los colores.

Artículo wikipedia
Artículo Mathworld

He hecho 3 tests sencillos:

  1. 30 vectores aleatorios de 10000 elementos insertados aleatoriamente

  2. 30 vectores aleatorios de 10000 elementos insertados ordenadamente

  3. 30 vectores aleatorios de 10000 elementos todos iguales



El tiempo total de los tests utilizando un árbol binario de búsqueda normal ha sido 17m40.500s. En cambio, el red-black tree que he implementado ha tardado 10.485s (sí, 10 segundos) en mi portátil.

Ejecutando sólo el test 1 que es más realista el red-black tree sigue ganando: tarda 4.040s frente a los 5.660s del árbol binario normal.

04 noviembre 2009

Crear estructuras complejas en C con malloc

Supongamos que queremos crear una estructura para almacenar matrices de cualquier tamaño en C. La estructura tiene un array bidimensional de enteros y un par de enteros indicando el tamaño horizontal y vertical de la matriz.

typedef struct {
int w, h;
int **m;
} Matrix;


La forma simple de reservar memoria para esta estructura sería:

Matrix *mat = (Matrix *) malloc(sizeof(Matrix));
mat->w = W;
mat->h = H;
mat->m = (int **) malloc(sizeof(int *)*mat->h);
for (i = 0; i < mat->h; i++)
mat->m[i] = (int *) malloc(sizeof(int)*mat->w);


Y para liberar la memoria:

for (i = 0; i < mat->h; i++)
free(mat->m[i]);
free(mat->m);
free(mat);


Otra forma mejor de reservar la memoria es hacer un malloc del tamaño total que necesitamos y luego colocar los punteros a mano.

// memoria necesaria:
// la estructura + w*h elementos + h punteros a int para almacenar
// las filas de la matriz
size_t mem_needed = sizeof(Matrix) + sizeof(int)*w*h + sizeof(int*)*h;

Matrix *mat = (Matrix *) malloc(mem_needed);

// convertir el puntero a puntero a char
char *mem = (char *) mat;
// donde empieza el array de punteros a entero
mat->m = (int **)(mem + sizeof(Matrix));
// donde empieza el array de datos
int *p = (int *) (mem + sizeof(Matrix) + sizeof(int *)*h);

int i;
for (i = 0; i < h; i++) {
mat->m[i] = p;
p += w;
}



Y para liberar la estructura nos basta con:

free(mat)


La segunda forma es más complicada de programar, necesité pasarle varias veces el valgrind hasta que conseguí que funcionara, pero en cambio tiene la ventaja que luego se libera muy fácilmente y que toda la matriz está contigua en memoria cosa que podría no ocurrir si hacemos mallocs separados para cada fila.

Es muy importante convertir la memoria reservada a (char *) para poder mover el puntero. Si a un (int *) le sumamos 1, realmente estamos moviéndonos 4 posiciones de memoria porque un int son 4 bytes.

Para estructuras más complejas es bastante difícil de conseguir implementar correctamente la segunda forma. He llegado a ver en una librería como construían de esta forma un array de 5 o 6 dimensiones cada dimensión con tamaños distintos y da un poco de miedo.

01 noviembre 2009

Doom 3

Llevo un mes jugando al Doom 3 con el PC que me compré en agosto. No pude jugar en su días porque mi ordenador no daba para másy ahora estoy aprovechando para jugar a juegos de hace 3 o 4 años.