miércoles, septiembre 28, 2005

Super-Pringado How-To

Todos conocemos el how-to del pringado que estudia informática y tiene que hacer de servicio técnico gratuito por ahí.

Pues bien, yo lo he ido superando poco a poco... de los últimos mega-hits fueron unos "pringao-crossing" en los que tuve que ir a obrar milagros a casa de gente que me pillaba un poco lejos (compañeros de trabajo de mi tía, conocidos de un amigo de mis padres). A unos no les funcionaba el adeeseele, cosa normal cuando en un ordenador hay más de 1.000 virus, spywares y dialers varios. A otros les tenía que conseguir que funcionase una regrabadora de deuvedés en un Pentium II con Windows 98. Lo mejor es la cara con la que te miran cuando les dices que no puedes hacer nada al respecto... en plan "vaya mierda de informático". Eso es lo que molesta, que encima quedas como un inútil cuando el problema es de ellos por haber jodido el ordenador, no tuyo por no poder arreglarlo. Aquí un refrán mítico para la posteridad "Un tonto tira una piedra a un río y 100 listos no son capaces de recuperarla". Podéis soltarlo cuando os toque hacer de pringados.

Pero bueno, esas son las cosillas a las que uno se acostumbra, y que tiene que hacer para no dejar en mal lugar a los amigos o familiares a los que se les ocurrió comentar que tenían un sobrino o conocido que estudiaba informática antes de que la fulminante frase cruce el aire "pues podía venir a echarle un vistazo a mi ordenador".

Ahora vamos a por la gorda:
- Oye tío, podías echarme una mano con mi proyecto de programación.
- Ok, cuando tena un rato quedamos y le echamos un vistazo.

El proyecto en cuestión consistía en hacer un programa en C para procesar un fichero de texto con una serie de registros numéricos, realizar unos cálculos estadísticos (medias, varianzas, medianas, modas, coeficientes de correlación, covarianzas, rectas de regresión...), todo ello en una interfaz de menús en modo texto.

Tiempo disponible: 2 días (toma deadline!).

Plan de acción: yo programando como un campeón mientras mi colega me servía chupitos y cubatas hasta las 5 de la mañana. Acabé con un resacón y un dolor de cabeza impresionantes.

La verdad es que a pesar de ser una putada en cuanto al esfuerzo que supuso, por lo menos ya parece que no voy por ahí instalando güindous equispés, que es algo que me motiva todavía menos que instalar la ubuntu xD. Tampoco es que me guste picar código, pero hay que reconocer que hacerlo borracho tiene su gracia...

Esto de ponerme delante del ordenador borracho me trae buenos recuerdos... lo que sí que era realmente divertido era jugar al Soldier of Fortune borracho en un ordenador sin aceleración 3d, con el pedo que llevaba encima es que ni lo notaba, todos los polígonos iban suaaves, suaaaaaaves... y encima aumentaba mi índice de temeridad, así que ni asomarse por las esquinas ni nada, ¡salía a cuerpo descubierto con la Desert Eagle a hacer headshots como un campeón! y lo mejor es que acertaba 8-) me pasé a toda leche las 2 o 3 primeras pantallas del SoF1 del tirón antes de dejarlo para ir a vomitar...

¿Por qué he empezado hablando de pringar y he terminado con jugar al ordenador borracho? Ah, misterios de la vida.

Por cierto, todavía estoy sobrio.

domingo, septiembre 25, 2005

su doku

Los juegos de lógica son un pasatiempo genial... hasta que los revientas y pierden la gracia.

Ya rompimos el juego de los palotes y ahora le ha llegado su turno al Su Doku, que seguramente conoceréis por su difusión en periódicos, revistas de pasatiempos, libros de crucigramas, reenvíos de correo electrónico y demás. Para los que sean nuevos a este rompecabezas, explicaré brevemente en qué consiste.

Se trata de un juego parecido a los de los cuadrados mágicos, en el que hay que rellenar un tablero de 9x9 casillas con números del 1 al 9, dados algunos valores preestablecidos, siguiendo las siguientes restricciones:
  • No se puede repetir ningún número en la misma fila.
  • No se puede repetir ningún número en la misma columna.
  • No se puede repetir ningún número en el mismo subtablero de 3x3 en los que está dividido el tablero principal (3x3 subtableros a su vez).
A mí me introdujo mi colega El Cana, contándome por el messenger que estaba bastante viciado al juego y que pensaba escribir un programa para resolverlos cuando volviese de hacer footing. Al final le dio pereza (o se rajó... Cana, mariquita!!! :p) y no lo hizo.

Un par de meses después, en la típica comida familiar de los domingos, dos de mis tíos estaban enganchados a algún su doku y tenían problemillas (más de 15h seguidas con el mismo su doku delante empieza a ser un problema, sí... los que vayan a decirme que lo mismo con el Counter-Strike o el Diablo... hmmmmmm... pues que se vayan a la mierda xD). Yo, haciendo un alarde de pelotas de acero les dije que era capaz de hacer un programa que los resolviese, aunque dudaba del tiempo que le llevaría resolverlo... así a ojo, todas las posibles combinaciones para llenar un tablero de 9x9 con dígitos del 1 al 9 son 9^81, que es el colosal número: 196627050475552913618075908526912116283103450944214766927315415537966391196809.

Para que os hagáis una idea de semenjante magnitud, lo podemos comparar con la anécdota de llenar el tablero de ajedrez con granos de trigo, doblando en cada casilla el número de granos de la anterior (2^64): 18446744073709551616. Así que si alguien os propone que llenéis un tablero de su doku con granos de trigo, poniendo en cada casilla nueve veces más que en la anterior mandadle inmediatamente a tomar por culo.

Por lo tanto, quedaba descartada la fuerza brutísima (pero bruta, eh?) a no ser que tengamos un Deep Blue, un Blue Gene, un Earth Simulator, un Mare Nostrum y unas cuantas PlayStation 3 en casa. Ahora vamos a usar un poco nuestra materia gris (qué curioso, cuando era pequeño pensaba que la materia gris eran los músculos... es que nunca había visto un cerebro) para reducir el problema hasta un tamaño abordable por nuestras entrañables cafeteras.

Mientras miraba el tablero del su doku se me ocurrió que la forma elegante, chula y pofesioná de resolver esto era con Prolog, ya que sólo es cuestión de poner las restricciones en forma de cláusulas de Horn, en plan "si en la fila esta hay un 5, pues aquí ya no puede haberlo" y esas cosillas... pero como no lo tengo muy fresco eso del Prolog (es lo que pasa cuando tu compañero de prácticas se ventila la de Prolog en la sesión de presentación del I CUPCAM mientras se rasca los huevos con la mano que le sobra...) y parecía que el problema podía ser grandecito, pues me tiré al C (también para que se vea que soy un tío versátil, que no todo el Python y Bash en esta vida).

Aquí explico brevemente cómo tenía pensado solucionarlo:
  1. Rellenar una matriz de 9x9 cuyo contenido son listas de los números posibles, dadas las restricciones iniciales (comprobar que no estén en la fila, la columna y el grupo 3x3).
  2. Hacer un cacho de backtracking, empezando por la casilla 0,0 y terminando por la 8,8, pero en lugar de mirar todos los posibles números del 1 al 9, pues sólo de los que estén en la lista correspondiente a la casilla que se rellenó antes.
Con eso ya tardaba un tiempo inapreciable en resolverlo en mi ordenador (que tampoco es nada del otro mundo, un Athlon XP 1600+), así que no me puse a implementar las posibles mejoras, pero voy a comentarlas aquí:
  1. Crear una lista de las casillas a rellenar, ordenarla de forma creciente según el número de posibles números a rellenar y hacer back-tracking con las casillas por ese orden (para que el árbol de back-tracking fuese lo menos ancho posible en las primeras ramas).
  2. Actualizar en tiempo de ejecución las listas de posibles casillas, aunque esto quizá sería contraproducente (demasiado trabajo que habría que hacer y deshacer en cada invocación y vuelta) y podria crear conflictos a la hora de recorrer la lista de casillas si se reordena (lo típico de saltarte una, procesar la misma dos veces... esas cositas).
  3. Eliminar al recursividad, simulándola con una pila de tuplas (n,i,j).
Así que sin más dilaciones, os pongo las 201 líneas de código en C que os harán los putos amos del su doku y frustrarán a vuestras amistades cuando vean que los resolvéis en... unos cuantos minutos, tampoco os flipéis y deis la solución al momento:

1 typedef int bool;
2 #define TRUE 1
3 #define FALSE 0
4
5
6 int tablero_orig[9][9];
7 int tablero_busq[9][9];
8
9 int posibles[9][9][10];
10
11
12 void leer_tablero();
13 long long calcular_posibles();
14 int calcular_posibles_casilla(int i, int j);
15 bool comprobar_insertar(int n, int i, int j);
16 bool resolver_recursivo(int i, int j);
17 inline bool es_valido(int n, int i, int j);
18 bool esta_en_fila(int n, int i);
19 bool esta_en_columna(int n, int j);
20 bool esta_en_cuadrante(int n, int i, int j);
21 void print_posibilidades();
22 void print_tablero();
23 void leer_tablero();
24
25 /**
26 * Rellena posibles para todas las casillas, y devuelve
27 * el numero total de combinaciones posibles.
28 */
29 long long calcular_posibles() {
30 int i, j;
31 int m;
32 long long n = 1;
33 for (i = 0; i < 9; ++i) {
34 for (j = 0; j < 9; ++j) {
35 if (tablero_orig[i][j] == 0) {
36 m = calcular_posibles_casilla(i, j);
37 n *=m;
38 }
39 }
40 }
41 return n;
42 }
43
44 /**
45 * Rellena los valores de posibles[i][j], dejando un 0 tras
46 * la ultima casilla rellena y devolviendo el número de
47 * posibilidades;
48 */
49 int calcular_posibles_casilla(int i, int j) {
50 int n;
51 int k = 0;
52 for (n = 1; n <= 9; ++n) {
53 if (es_valido(n, i, j)) {
54 posibles[i][j][k++] = n;
55 }
56 }
57 posibles[i][j][k] = 0;
58 if (k == 0) {
59 k = 1;
60 }
61 return k;
62 }
63
64 inline bool es_valido(int n, int i, int j) {
65 return
66 !esta_en_fila(n,i) &&
67 !esta_en_columna(n,j) &amp;&
68 !esta_en_cuadrante(n, i/3, j/3);
69 }
70
71 bool esta_en_fila(int n, int i) {
72 int j;
73 for (j = 0; j < 9; ++j) {
74 if (tablero_busq[i][j] == n) {
75 return TRUE;
76 }
77 }
78 return FALSE;
79 }
80
81 bool esta_en_columna(int n, int j) {
82 int i;
83 for (i = 0; i < 9; ++i) {
84 if (tablero_busq[i][j] == n) {
85 return TRUE;
86 }
87 }
88 return FALSE;
89 }
90
91
92 /**
93 * Indica si n esta en el cuadrante i, j, que son las coordenadas
94 * del cuadrante (de 0 a 2), NO las coordenadas de una casilla
95 * dentro del cuadrante.
96 */
97 bool esta_en_cuadrante(int n, int i, int j) {
98 int k, l;
99 int mk, ml;
100 mk = (i+1)*3;
101 ml = (j+1)*3;
102 for (k = i*3; k < mk; ++k) {
103 for (l = j*3; l < ml; ++l) {
104 if (tablero_busq[k][l] == n) {
105 return TRUE;
106 }
107 }
108 }
109 return FALSE;
110 }
111
112
113 bool resolver_recursivo(int i, int j) {
114 int n;
115 int k;
116 int si, sj;
117
118 si = i;
119 sj = j + 1;
120 if (sj == 9) {
121 sj = 0;
122 ++si;
123 }
124
125 if (tablero_orig[i][j]) {
126 return resolver_recursivo(si, sj);
127 }
128
129 for (k = 0; n = posibles[i][j][k]; ++k) {
130 if (es_valido(n,i,j)) {
131 tablero_busq[i][j] = n;
132 if (i == 8 && j == 8) {
133 return TRUE;
134 }
135 else if (resolver_recursivo(si, sj)) {
136 return TRUE;
137 }
138 tablero_busq[i][j] = 0;
139 }
140 }
141 return FALSE;
142 }
143
144 void print_tablero(int t[9][9]) {
145 int i, j;
146 for (i = 0; i < 9; ++i) {
147 for (j = 0; j < 9; ++j) {
148 printf("%d ", t[i][j]);
149 if (((j+1)%3) == 0) {
150 printf(" ");
151 }
152 }
153 printf("\n");
154 if ((i+1)%3 == 0) {
155 printf("\n");
156 }
157 }
158 }
159
160 void print_posibilidades() {
161 int i, j, k, n;
162 for (i = 0; i < 9; i++) {
163 for (j = 0; j < 9; j++) {
164 printf("(%d, %d) : ", i+1, j+1);
165 for (k = 0; n = posibles[i][j][k]; k++) {
166 printf("%d ", n);
167 }
168 printf("\n");
169 }
170 }
171 }
172
173 void leer_tableros() {
174 int i, j;
175 int n;
176 for (i = 0; i < 9; i++) {
177 for (j = 0; j < 9; j++) {
178 scanf(" %d ", &n);
179 tablero_orig[i][j] = n;
180 tablero_busq[i][j] = n;
181 }
182 }
183 }
184
185 int main() {
186 long long n;
187 leer_tableros();
188 print_tablero(tablero_orig);
189 printf("analizando tablero...\n");
190 n = calcular_posibles();
191 print_posibilidades();
192 printf("%lld posibles combinaciones.\n", n);
193 printf("buscando solucion...\n");
194 if (resolver_recursivo(0,0)) {
195 printf("solución encontrada!:\n");
196 }
197 else {
198 printf("solución no encontrada :(\n");
199 }
200 print_tablero(tablero_busq);
201 }

(qué majo el vim, eh? que nos lo saca con colorines... si lo queréis compilar, acordaos de quitar los números de línea).

Si no os apetece hacer ingeniería inversa para saber cómo funciona, ya os lo cuento yo:
Lee por la entrada estándar 81 enteros. que pueden estar separados por blancos de cualquier forma (como si os da ponerlos todos en la misma línea). No he probado qué pasa si se meten menos números ó texto entre medias, supongo que casca, así que no hagáis mucho el cafre. En las casillas que estén en blanco debéis introducir ceros.

Aquí os pongo un ejemplo de cómo funciona el tema con un su doku de los jodidos:
[fortran@johnny sudoku]$ cat prueba.txt
0 1 0 0 0 8 0 0 6
0 0 0 0 0 0 0 0 3
0 0 0 0 7 5 4 0 0

0 0 2 0 0 4 0 8 0
0 4 6 0 0 0 7 9 0
0 5 0 9 0 0 1 0 0

0 0 5 3 6 0 0 0 0
8 0 0 0 0 0 0 0 0
9 0 0 8 0 0 0 5 0
[fortran@johnny sudoku]$ ./sudoku < prueba.txt
0 1 0 0 0 8 0 0 6
0 0 0 0 0 0 0 0 3
0 0 0 0 7 5 4 0 0

0 0 2 0 0 4 0 8 0
0 4 6 0 0 0 7 9 0
0 5 0 9 0 0 1 0 0

0 0 5 3 6 0 0 0 0
8 0 0 0 0 0 0 0 0
9 0 0 8 0 0 0 5 0

analizando tablero...
(1, 1) : 2 3 4 5 7
(1, 2) :
(1, 3) : 3 4 7 9
(1, 4) : 2 4
(1, 5) : 2 3 4 9
(1, 6) :
(1, 7) : 2 5 9
(1, 8) : 2 7
(1, 9) :
(2, 1) : 2 4 5 6 7
(2, 2) : 2 6 7 8 9
(2, 3) : 4 7 8 9
(2, 4) : 1 2 4 6
(2, 5) : 1 2 4 9
(2, 6) : 1 2 6 9
(2, 7) : 2 5 8 9
(2, 8) : 1 2 7
(2, 9) :
(3, 1) : 2 3 6
(3, 2) : 2 3 6 8 9
(3, 3) : 3 8 9
(3, 4) : 1 2 6
(3, 5) :
(3, 6) :
(3, 7) :
(3, 8) : 1 2
(3, 9) : 1 2 8 9
(4, 1) : 1 3 7
(4, 2) : 3 7 9
(4, 3) :
(4, 4) : 1 5 6 7
(4, 5) : 1 3 5
(4, 6) :
(4, 7) : 3 5 6
(4, 8) :
(4, 9) : 5
(5, 1) : 1 3
(5, 2) :
(5, 3) :
(5, 4) : 1 2 5
(5, 5) : 1 2 3 5 8
(5, 6) : 1 2 3
(5, 7) :
(5, 8) :
(5, 9) : 2 5
(6, 1) : 3 7
(6, 2) :
(6, 3) : 3 7 8
(6, 4) :
(6, 5) : 2 3 8
(6, 6) : 2 3 6 7
(6, 7) :
(6, 8) : 2 3 4 6
(6, 9) : 2 4
(7, 1) : 1 2 4 7
(7, 2) : 2 7
(7, 3) :
(7, 4) :
(7, 5) :
(7, 6) : 1 2 7 9
(7, 7) : 2 8 9
(7, 8) : 1 2 4 7
(7, 9) : 1 2 4 7 8 9
(8, 1) :
(8, 2) : 2 3 6 7
(8, 3) : 1 3 4 7
(8, 4) : 1 2 4 5 7
(8, 5) : 1 2 4 5 9
(8, 6) : 1 2 7 9
(8, 7) : 2 3 6 9
(8, 8) : 1 2 3 4 6 7
(8, 9) : 1 2 4 7 9
(9, 1) :
(9, 2) : 2 3 6 7
(9, 3) : 1 3 4 7
(9, 4) :
(9, 5) : 1 2 4
(9, 6) : 1 2 7
(9, 7) : 2 3 6
(9, 8) :
(9, 9) : 1 2 4 7
-6363586273474510848 posibles combinaciones.
buscando solucion...
solución encontrada!:
4 1 9 2 3 8 5 7 6
5 2 7 4 9 6 8 1 3
6 8 3 1 7 5 4 2 9

7 9 2 6 1 4 3 8 5
1 4 6 5 8 3 7 9 2
3 5 8 9 2 7 1 6 4

2 7 5 3 6 1 9 4 8
8 6 4 7 5 9 2 3 1
9 3 1 8 4 2 6 5 7
[fortran@johnny sudoku]$

Fijaos que el número de posibilidades "a priori" es lo suficientemente grande como para desbordar un "long long int" en una máquina de 32 bit. Si queréis saber cuánto es exactamente, en la función "calcular_posibilidades()" podéis ir imprimiendo los valores de "m" separados por asteriscos y luego lo pegáis en algún intérprete de python, ruby o una hoja de cálculo para que os diga el resultado.

Hale, como siempre, se admiten mejoras, sugerencias, quejas, reclamaciones porque te ha petado el ordenador... por cierto, sería interesante que alguien propusiese una versión en Prolog ;-)

viernes, septiembre 23, 2005

linux powah, pero no tanto

Después de los exámenes es costumbre hacer unos backups (del porno sobre todo) y luego pegarle un buen formateo a los ordenadores, para empezar el nuevo curso (o lo que sea) haciendo borrón y cuenta nueva.

La situación era la siguiente:
  • Portátil (pepino para los amigos)
    • Windows XP: instalado desde que lo compré, hace ya algo más de dos años, que funcionaba sin ningún problema (ni virus, ni spyware, ni mierdas, ni nada, todo perfecto). El único problema era que después de dos años había mucha fragmentación y bastante mierda suelta ocupando espacio (increible la velocidad con la que crece el directorio del Windows, cosa que no es culpa suya en la mayoría de las ocasiones, sino de los desinstaladores mal hechos).
  • Sobremesa (no tiene amigos)
    • Windows 2000: no le funcionaba el panel de control (se colgaba al abrirlo, cosas de la vida, parece que luego con el SP4 se ha solucionado).
    • Ubuntu Warthy: misteriosamente dijo adios a las X, a partir de ahí todo fue cuesta arriba.
    • Fedora Core 3: todo iba bien hasta que me dio por meter 20 repositorios de paquetes al yum, con lo cual se crearon unos conflictos algo jodidos con los paquetes que tenía instalados a mano y además tardaba demasiado en recorrer la lista de chorropecientosmil cabeceras.
Empiezo por el portátil. Copio las cosas que quiero guardar al sobremesa y me pongo a intentar instalarle un Windows Mierdenium Edition (que ocupa menos que el XP y el 2000 y como sólo lo quiero para echar algún vicio de vez en cuando me sobra). Primer problema: el disco que tengo no es de inicio; busco un disquete de arranque por ahí, encuentro uno y no me carga los drivers del lector de cederrón. Vamos a por el Windows 2000, que parece que se instala bien, hasta que intento meterle los últimos drivers de la tarjeta de vídeo (una nvidia GeForce4 440 Go)... meeeeeec! error, a tomar por culo, vamos a por el XP. Lo mismo, que naranjas de la china... al final instalo los que me venían con el ordenador, que menos da una piedra (pues yo juraría que llegué a actualizar los drivers alguna vez con los de la web de nvidia).

Ahora vamos a meterle una FC4 al portátil, aprovechando que es un Pentium IV y que la Fedora está optimizada para esa arquitectura... la instalo con lo mínimo y las X en pelotas, para ir añadiendo luego con el yum sólo los paquetes que me interesen. Inicio la sesión (el gdm ya me lo había instalado también con las X) y me sale el TWM, que es un gestor de ventanas que parece que está diseñado para joder al usuario... bueno, si total, sólo voy a usar un xterm un rato (incluso podría estar en la consola, pero soy así de pijo). Veamos, "$ yum install xfce" meeeeeec! "$ yum install xfce4" meeeeeeeeeeec!!, Vaya, hoy no es mi día, parece que se han propuesto joderme... buscando por internet me entero de que han quitado el XFCE del repositorio base, pero que sigue en los extras. Compruebo que tengo añadido el repositorio de los extras, busco xfce y me encuentro los componentes despiezados, pero del meta-paquete ni rastro... los instalo a pelo, salgo al gdm y... no puedo escoger la sesión del XFCE. ¿Alguien ha intentado alguna vez añadir a mano una nueva sesión al GDM? Es un puto infierno. Al final me veo instalando Gnome ó KDE sólo por no tocar una puta línea del gdm.conf. Creo que ya le estoy cogiendo gustillo al TWM, por lo menos las aplicaciones van folladas, esto sí que es economía de recursos.

En fin, que ya empiezo a estar hasta los huevos de la FC4, con lo bien que me iba la 3... si es que se lo curran para joder al usuario. A mí me gusta cacharrear, pero también que las cosas funcionen sin necesidad de tener que hacerlo... luego de joderlas ya me encargaré yo.

¿Alguna recomendación de una distro de linux que cumpla los siguientes requisitos?
  • Amplio repositorio de paquetes (no soy sectario, me da igual .rpm ó .deb, pero que sea grande), actualizado frecuentemente (y estable, si no es pedir mucho).
  • Facilidad de instalación (que sea ingeniero en informática no quiere decir que sea masoca, ya no tengo edad para andar tocando el xorg.conf).
  • Facilidad de configuración (eso quiere decir con ventanitas, no me apetece estar 10 minutos con el man cada vez que quiero cambiar la ip o los servidores dns, por ejemplo).
  • ¡Y que funcione, coño!
Yo me vuelvo al FreeBSD, que no me dió ningún disgusto hasta que jodí el arbol de los ports con el cvsup y me puse a actualizar algunos paquetes de una forma un tanto irregular.

Hale, se abre la veda de los insultos hacia mi persona por ser tan jodidamente patán...


Actualización



Hmmmmm... no sé qué cojones habré instalado, pero ya tengo la sesión del Xfce4 en el GDM... eso ha sido que han oido cómo me estaba cagando en ellos y me lo han metido de estrangis... ah, qué gustito...

Actualización 2



Por cierto, vaya flipados, que han compilado nativamente el Eclipse 3.1M6 con el GCJ y además algunas cosas no funcionan (el extssh del cvs, por ejemplo) y va más lento que el eclipse normal con jre1.5...

miércoles, septiembre 21, 2005

Los peligros del porno

Hoy he rescatado el script que El Sucio nos brindó en un fantástico alarde de ingenio hace ya algunas semanas, a saber el siguiente:


#!/bin/bash
#Recuperamos la lista de páginas con vídeos
lista=`wget -q -O - http://www.petardas.com/videos | grep "pagina=http://" | sed -e 's/.*pagina=\(.*\)><img.*img.*/\1/'`
i=0

for url in $lista
do
mkdir $i
wget --recursive --accept="*.mpg,*.avi,*.wmv" -nd -q -P $i -l 1 $url
echo -n .
i=`expr $i + 1`
done


Le estaba dando una lección de scripting a unos compañeros en la universidad, demostrando las múltiples virtudes de este producto sin par, pero notábamos que iba demasiado lento, a pesar de tener un canuto más que considerable en la universidad ¿cómo podíamos superar ese escollo? Con la versión paralela:


#!/bin/bash
#Recuperamos la lista de páginas con vídeos
lista=`wget -q -O - http://www.petardas.com/videos | grep "pagina=http://" | sed -e 's/.*pagina=\(.*\)><img.*img.*/\1/'`
i=0

for url in $lista
do
mkdir $i
wget --recursive --accept="*.mpg,*.avi,*.wmv" -nd -q -P $i -l 1 $url &
echo -n .
i=`expr $i + 1`
done


Añadiendo un simple ampersand al final de una línea conseguimos explotar toda la capacidad de bajada que nos ofrecía nuestra red, llegando a bajar 200 MB en unos segundos. Por desgracia, el ordenador no aguantaba tanta tralla y se colapsaba al rato, seguramente porque el /tmp donde estábamos dejando el material sólo tenía unos 500 MB de espacio libre.

Ahora estamos pensando en usar OpenMosix para distribuir la carga computacional y un sistema de ficheros paralelo y distribuido o un RAID1 para almacenar todos los datos... seguiremos informando desde HPPC (High Performance Porn Computing).

martes, septiembre 13, 2005

Sobreviviendo en el s. XXI

Como comentábamos en el post anterior, muchos nos sentimos algo perdidos tras el receso en la calidad de los discos de The Offspring y los Foo Fighters (de hecho algunos pensábamos que los Offspring habían muerto en un accidente y los habían suplantado por unos dobles, tesis que se confirmaría posteriormente al ver el video Huck It!), la ruptura de Terrorvision (no sé si fue peor la ruptura o el Good To Go) y en general un vacío existencial que nos indicaba que nuestra década y nuestro siglo estaban llegando a su fin.

Entonces llegó el año 2000. Y con él llegó Linkin Park y su Hybrid Theory (aunque creo que yo los escuché por primera vez ya en el 2001). Pude sentir el mismo escalofrío recorriendo mi espalda cuando escuché Crawling que cuando escuché Self Esteem por primera vez. El New Metal (ó Nu Metal para los más guays, ya puestos podrían hacer GNU Metal y para que fuese legal bajárselo por la mula) había llegado.

Durante esta época, muchos de los grupos clasicotes de los 90 se estuvieron adaptando a las nuevas tendencias, por ejemplo tenemos el Conspiracy of One (2000) de The Offspring, que siguieron metiendo canciones chorras (Original Prankster, One Fine Day) para que los padres llevasen a los niños a los conciertos (¡os lo juro! ¡es verdad! en el concierto del 11-2-2001 en La Cubierta de Leganés vi a tiernos infantes subidos en los hombros de sus padres... lo que no sé es si es que los padres eran fans de la vieja escuela o eran los niños los que les habían arrastrado a ver chorra-pop) pero también muestra una vuelta a sus raices del Smash (1994) con una fuerza renovada y una producción salvaje propia de una banda de Nu Metal con canciones como Million Miles Away, Dammit I Changed Again ó Special Delivery.

Algunos grupos que también merece una mención por seguir haciendo música más noventera, pero con estilo s. XXI son A Fire Inside (A.F.I.), coleguitas de los Offspring, por sus discos The Art of Drowning (2000) y Sing the Sorrow (2003), Sum 41 por Does This Look Infected (2002) (atención aquí, si se tiene la oportunidad, comparad Still Waiting con la canción de Nek Al Menos Ahora y con Dammit I Changed Again de los Offspring), American Hi-Fi y Aquaplaning.

Pero lo realmente importante del s. XXI, no fue la música en sí, sino la facilidad con la que llegaba a nosotros. Un activo cd-crossing entre los colegas hizo que Linkin Park, Crazy Town y Limp Bizkit rulasen de mano en mano (gracias a Atef por dejarme esos cedés). Lo gracioso era que no hacía falta que nadie te pidiese los discos, a ti te gustaba y querías compartirlo con tus colegas, así que se echaba mano de la grabadora de cederrones recién estrenada, se quemaban, se imprimían unas carátulas que se habían hecho con todo el amor del mundo con el Corel Draw y le pasabas los cedés a los amigos.

Después llegó el p2p, y eso sí que fue la revolución. Ya no hacía falta que los colegas te pasasen los discos, podías bajártelos directamente por intenné. Primero el napster, aunque tanta popularidad fue algo efímera, en seguida le cortaron las bolas... ya se sabe, la vela que luce con el doble de intensidad dura la mitad de tiempo. Después AudioGalaxy, que también cayó. Luego había más alternativas, como winmx, la mula, el burrito, kazaa... excelentes para bajarse canciones sueltas, pero para un jodido fetichista como yo al que le gusta tener discos completos (y a ser posible discografías) no iban demasiado bien. Y aquí es donde aparece el Soulseek, con su maravillosa opción de bajarse carpetas enteras.

Pero la mayor innovación del Soulseek no eran las facilidades de descarga, sino la posibilidad de explorar todos los archivos compartidos de la gente. Antes solía escuchar lo que me recomendaban los colegas, lo que oía en el límite, por la radio... ahora podía buscar algún grupo que sabía que me gustaba, ver quiénes tenían buen ancho de banda y bajarme lo que me ofrecían. Así descubrí montones de grupos interesantes. Otra gran característica del Soulseek (que creo que añadieron algo tardíamente) es la de buscar usuarios con gustos similares y obtener recomendaciones, a partir de listas de preferencias de la gente. Por último, estaba la opción de recurrir a Amazon.com para ver qué grupos se parecían a otros, qué compra la gente, ver listas, etc.

El motivo por el cuál el año 2003 (en la gráfica parece el 2004, pero no) es el que tiene más discos es bastante sencillo. Si juntamos todo lo anterior (descarga de discos a granel y descubrimiento automático de grupos similares) nos damos cuenta de que en el 2003 hay un boom de la leche de grupos en plan Linkin Park, que era un punto de partida bastante recurrente a mis búsquedas... tanta popularidad se debe en parte a las bandas sonoras cañeras de las nuevas películas de Marvel, como la de Daredevil. Algunos son un poco mierderos y repetitivos, pero hay otros que se salvan bastante de la quema. Os pongo algunos ejemplos de discos que merecen la pena:

2003: The Morning After (40 Below Summer), Unstable (Adema), Fallen (Evanescence), Begginings (Memento), Leave a Whisper (Shinedown), Smile Empty Soul (Smile Empty Soul), Three Days Grace (Three Days Grace), The Long Road (Nickelback) y por supuesto Meteora (Linkin Park). Todos estos son en plan Nu Metal, aunque algunas de las joyas del género caen en los años colindantes, a saber:

2002: Saturate (Breaking Benjamin), Disclaimer (Seether), The Lonely Position of Neutral (Trust Company), Trapt (Trapt).

2004: Two (Earshot), Getting Away With Murder (Papa Roach), We're Not Alone Here (Breaking Benjamin).

Pero no todo es Nu Metal en estos años, tenemos algunas vueltas a los escenarios impresionantes, como la de Weezer con su Green Album (2001) y la de los PUSA con el Freaked Out and Small (2000), a los Offspring intentando redimirse con el Splinter (2003), que aunque siguieron metiendo canciones chorras (Hit That, The Worst Hangonver Ever, Spare Me the Details) nos dejaron algunos auténticos temazos (The Noose, Race Against Myself, Da Hui). También tenemos cosas más blandurrias pero no por ello despreciables, como la adorable Avril Lavigne con su inocente pop-rock para quinceañeros en celo, la sugerente Carla Bruni con Quelqu'un m'a dit, la voz repleta de personalidad Anastacia, a los mariquitas de Keane y Coldplay pegándose por ver quiénes son las mayores nenazas de toda Inglaterra (para mi gusto Muse), a los abueletes de Kansas de gira por Madrid en el 2005 (y yo perdiéndomelos por enterarme un par de horas antes)...

También tenemos algunos grupos que surgen de las rupturas de otros, como Audioslave, Damageplan o algunos que surgen de la nada y empiezan a sonar a todas horas, como The Darkness... ¿Qué tiene The Darkness para molarle tanto a la gente? ¿Será la voz del cantante al que parece que le están retorciendo las pelotas? ¿Será esa estética ochentera? A alguno le podrán parecer ridículas las pintas que llevan en los videoclips, pero claro, es que ellos están de coña, no podemos decir lo mismo de los auténticos jebis de los 80... no encuentro el videoclip donde se juntan The Michael Schenker Group, The Scorpions y otros cuantos más pasadísimos de rosca con las mallas fucsia (¿se escribe así?) las lentejuelas y las cintas en el pelo.

Pero como todo lo bueno tiene que acabar, al igual que pasó con el punk-rock de mediados/finales de los noventa, el Nu Metal ya tiene los días contados (o al menos eso dicen). Veremos qué es lo que nos depara la segunda mitad de esta nueva década.

Al igual que antes, me dejo montones de grupos y discos interesantes por mencionar, pero claro, esto se ceñía sobre todo a mi culturilla musical y a cómo me lo he montado para tener algo que echarme a las orejas estos años.

domingo, septiembre 11, 2005

La época dorada de la música

Creo recordar que era el año 1996 cuando me introduje por casualidad al punk-rock californiano, gracias a una canción de relleno que me grabó un amigo mío al final de una cinta recopilatoria casera de Los Porretas. Aquella canción me fascinó, no podía dejar de escucharla... no sabía quiénes la cantaban, tampoco comprendía la letra, pero tenía algo especial que me impulsaba a agitar la cabeza, pegar saltos y ponerme a gritar. Podía sentir la rabia y la frustración de toda mi generación condensada en esos poderosos y riffs de guitarra que eran hasta el momento desconocidos para mí. Esa voz que desgarraba el aire que llenaba el espacio entre mis tímpanos y los auriculares de mi walkman expresaba lo que todos sentíamos. Era Self Esteem.

Los noventa vieron nacer algunos de los más gloriosos álbumes de la historia, que me gustaría recordar aquí brevemente:
1991: Nevermind (Nirvana)
1992: Rage Against the Machine (Rage Against the Machine), Vulgar Display of Power (Pantera)
1993: Vs (Pearl Jam)
1994: Smash (The Offspring), How to Make Friends and Influence People (Terrorvision), The Blue Album (Weezer), Dookie (Green Day) [3 discos indispensables]
1995: The Great Escape (Blur), I (The Presidents of the USA), Use Your Brain (Clawfinger)
1996: Beautiful Freak (Eels), Regular Urban Survivors (Terrorvision)
1997: Ixnay on the Hombre (The Offspring), The Colour and the Shape (Foo Fighters)
1998: This Is My Truth, Tell Me Yours (Manic Street Preachers), Blur (Blur), Gran Turismo (The Cardigans)
1999: Liquido (Liquido), Hooray for Boobies (The Bloodhound Gang), Californication (Red Hot Chili Peppers), The Burning Red (Machine Head), Enema of State (Blink 182) [El ambiente ha cambiado ligeramente desde el 97 y ya no hay punk-rock rompedor]

Corría el año 1999 y una oscura sombra se cernía silenciosa sobre nuestras vidas.
Terminaban los noventa, dejando tras de si un legado cultural de sexo, drogas y rock&roll. Perdón, esos debieron ser los ochenta o los setenta, los noventa no dejaron mucho sexo (en todo caso manual), lo que sí que dejaron fueron litros y más litros de calimocho y mucha buena música. Pero estábamos en un momento de transición, no se veía nada en el horizonte y si mirábamos atrás lo más cercano que veíamos era el nefasto Americana de los Offspring.

En el año 2000 parecía que ya no quedaba nada que mereciese la pena ser escuchado. Las mismas canciones seguían llenando los radiocasetes y ya empezaban a oler. Pero algunas cosas iban a cambiar el panorama tremendamente... Internet empezaba a ser algo común en los hogares y el P2P estaba recién salido del horno. Eso unido a la popularización del mp3 y las grabadoras de cd hicieron que la música volviese a fluir de mano en mano, al igual que sucedió con los casetes en los noventa, pero esa es otra historia y debe ser contada en otra ocasión, así que aquí termina esta historia del tito fortran cebolleta.

Movido por la nostalgia y la curiosidad, decidí comprobar qué años se llevaban el mayor trozo del pastel de mi discografía, así que crují mis dedos y me puse a scriptear como a mí me gusta.

Como alguna vez he comentado antes, me gusta llevar un control riguroso del formato que tienen los nombres de las canciones y los discos que tengo. En concreto, me gusta que sigan este patrón: /NombreGrupo/Año_NombreDisco/Numeropista - NombreCanción.
Así que me coloqué en el directorio donde están todos los grupos e hice:

find -maxdepth 2 > lista
for i in `seq 1960 2005`;
do
echo $i `grep $i lista | wc -l`
done

¿Cuál fue el resultado? Veámoslo pintado con el gnuplot:
Free Image Hosting at www.ImageShack.us

Conclusión: la música de ahora tampoco está tan mal, sólo es cuestión de acostumbrarse.