Archivo por meses: octubre 2007

Jugando con Apache Tomcat

Hace poco me dio por instalarme tomcat en el ordenador. ¿Por qué? Pues porque me parece que desarrollar webs con java es más seguro que hacerlo con PHP… lo que no tiene porqué ser cierto, pero me gusta más la arquitectura de java (aunque no su rendimiento).

El caso es que me animé más con las clases de Servidores de Información, donde trasteamos también con tomcat. Ahora me rondan varias cosas por la cabeza para realizar, entre ellas un sistema para jugar a rol, que no me gusta nada, pero nada, hacerlo por foro, no están preparados para estas cosas. Además, hay que saber un poco de todo ¿no?

A ver si me pongo y me miro la charle de Mariscal sobre AJAX, que también estoy muy interesado en aplicarlo ^^

Diseño de sistema operativo

El otro día estaba hablando con un amig y este me comentaba que siendo Linus sólo un estudiante había ganado la batalla contra Taembaum sobre los núcleos. En realidad yo no lo veo así. De hecho veo justo lo contrario: conforme  pasa el tiempo, cada vez Linux está más lejos de ganar esa batalla. Es más grande e inmanejable, efecto que en un núcleo monolítico no hubiese pasado.

Es cierto que en su momento un núclero monolítico era mejor solución: son algo más rápidos. Pero ¿qué sucede con las nuevas arquitecturas de CPU con mútiples cores? ¿Es posible que un núcleo monolítico pueda se menos eficiente que uno de tipo micronúcleo? Personalmente apuesto por esto último, aunque claro, siempre puedes hacer que el núcleo se bifurque en distintos hilos de ejecución, pero haciendo eso ¿no estás conviertiendo tu núcleo poco a poco en un sitemo de tipo micronúcleo?

Ciertamente parece que Linux va en ese camino, ya que los grandes avances que se están consiguiendo son casi todos en el espacio de usuario y cada vez más los subsistemas se alejan del núcleo. De hecho, leía hace poco en una lista de correo a uno de los suscriptores que se quejaba porque le parecía una aberración el que los nuevos escritorios de Linux no utilizasen el sistema de ficheros virutal que este traía y, en su lugar, implementasen los suyos propios. Pero nada más lejos de la realidad, en un sistema en el que cada vez que compilas una parte del núcleo estás obligado a compilar el resto, depender de una parte de este núcleo para un entorno de escritorio es un suicido. De hecho, se ve como está empezando a tener mucha relevancia FUSE, que lo que hace es precisamente menter los controladores de sistema de ficheros en el espacio de usuario. De este modo se consigue que sea menos traumático el cambio de núcleo.

Será grande el día que el tener que cambiar una cosa el núcleo no obligue a tener que compilarlo todo (núcleo y módulos).

Camino a Barcelona

Es miércoles, a las 14:30, parto rumbo a Barcelona con la escusa de asistir al Salón del Manga. La verdad es que a mi me apetece mucho poder visitar la ciudad, así que ya veremos que pasa al final.

De todos modos, ya he quedado con mery para el sábado y supongo que conseguiré hacer que Jacobo y Rubén (con los amigos que voy) no quieran ir todos los días todo el día al Salón.

El resultado de la CUPCAM

Y al final todo llega y nosotros no hicimos buen papel 🙁 Fuimos un total de 19 grupos a participar y nosotros quedamos en el puesto 11 :'(. De todos modos volveremos el año próximo y venceremos.

De momento decir que me quedé pillado con un problema y analizando la solución era igual que la mia, solo que yo no me di cuenta de una cosa y hacía que el tiempo de ejecución de m algoritmo tendiese a infinito 🙁

La solución del problema es la siguiente. Muchos reconocerán en ella el algoritmo de la mochila o de la estantería. El caso es que yo nunca había oído hablar de él.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include stdlib.h
#include stdio.h
 
#define MAX 1001
 
int T[MAX] = { -1 };
 
int max(int a, int b)
{
   return a>=b ? a : b;
}
 
/**
* Pasamos cuanto espacio tenemos y el ultimo libro de la lista a comprobar.
* Devuelve el maximo espacio que puede ocupar.
*/
int A(int espacio, int libros)
{
   int a, b;
 
   /* Si el espacio libre es 0 o no hay libros que colocar, el espacio
   * que ocupamos es 0 */
   if( !espacio || !libros) return 0;
 
   /* El libro ocupa mas que el espacio que tengo libre,
   * por lo que sigo sin tenerlo en cuenta */
   if( T[libros] > espacio ) return A(espacio, libros-1);
 
   /* Si nuestro libro cabe, devolvemos el maximo entre poner
   * el libro actual e intentarlo con el resto o directamente
   * intentarlo con el resto sin tener en cuenta el libro
   * actual */
   return max( A(espacio, libros-1), T[libros]+A(espacio-T[libros], libros-1) );
}
 
int main(void)
{
   int i;
   int espacio;
   int num_libros;
 
   while(1) {
      scanf("%d %d", &espacio, &num_libros);
      if( espacio == 0 && num_libros == 0 ) break;
 
      for(i = 1; i <= num_libros; i++ ) {
         scanf("%d", &(T[i]));
      }
      printf("%d\n", espacio-A(espacio, num_libros));
   }
   return 0;
}

La solución que yo hice era más como la que sigue:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include stdlib.h
#include stdio.h
 
#define MAX 1001
 
int T[MAX] = { -1 };
 
int max(int a, int b)
{
   return a>=b ? a : b;
}
 
/**
* Pasamos la lista de libros, el espacio que queda libre y el total de libros en la lista.
*/
int A(int *tamanos, int espacio, int libros)
{
   int c;
   int resultado = espacio;
   int temporal;
 
   if( !libros ) return espacio;
 
   /* Calculamos el espacio libre teniendo en cuenta que usamos el libro actual */
   for(c=1; c < libros; c++) {
      temporal = A(tamanos[c], espacio-tamanos[0], libros-1);
      if(temporal<resultado ) resultado = temporal;    
   }
   /* Calculamos el espacio libre sin tener en cuenta que usamos el libro actual */
   for(c=1; c < libros; c++) {
      temporal = A(tamanos[c], espacio, libros-1);
      if(temporal < resultado ) resultado = temporal;
   }
   return resultado;
}
 
int main(void)
{
   int i;
   int espacio;
   int num_libros;
 
   while(1) {
      scanf("%d %d", &espacio, &num_libros);
      if( espacio == 0 && num_libros == 0 ) break;
 
      for(i = 1; i &lt;= num_libros; i++ ) {
         scanf("%d", &a(T[i]));
      }
      printf("%d\n", A(espacio, num_libros));
   }
   return 0;
}

Ahora no recuerdo muy bien si era esactamente así, pero sí se que funcionaba. Como podéis comprobar, nuestro gran fallo (bueno, mi gran fallo) fue que pasaba muchas veces por las mismas convinaciones :@ El bucle ese fue mortal y no nos dismo cuenta ninguno que se podía quitar :'(

La próxima vez lo haremos mejor.

Vivo de vampiro

El otro día fui a un vivo de vampiro a la complutense (campus de somosaguas) y aún no había hecho ningún comentario al respecto (que mala persona que soy). El caso es que estuvo muy bien, muy divertido, pero muy escaso de violencia :P.

Fuimos a jugar casi 25 personas (vampiro arriba, vampiro abajo) . Así que hubo para hablar con todos largo y tendido. Y sí, si alguno lo dice, hablo poco, igual que en la vida real fuera del juego. Aunque mi hermana se queje porque participo poco, es que me cuesta no ser así. Así que advertidos quedáis… Y esto me recuerda que tengo que publicar en un foro :S

Para la próxima, el que esté interesado en jugar que me lo comente, que cuantos más seamos, mejor. Además, es posible que sea de vampiro, hombre lobo y changeling a la vez.

Camino a la CUPCAM

Mañana por la mañana me toca ir a la CUPCAM en la universidad Carlos III de Madrid. La verdad es que ahora, con el sueño, como que me apetece poco, pero bueno, mañana será otro día. No se como nos irá a mis compañeros y a mi, pero de buen seguro que lo haremos lo mejor que sepamos.

No cabe duda de que somos los mejores (baja Modesto, que subo yo), y que ganaremos, pero de todos modos, si nos deseáis suerte, no pasa nada 😛