viernes, abril 29, 2005

Pequeños cabroncetes

Ah, el buen tiempo... cómo cambia la vida en la Escuela Politécnica Superior cuando llega el calor... Se nota sobre todo por las chavalas; esas exuberantes mozas paseándose lujuriosamente por el campus... arf... volvamos al mundo real ¿dónde cojones se meten en invierno? ¿eh? porque yo sólo las veo en verano y en época de exámenes en la biblioteca, para joder a los pobres estudiantes de ingeniería cuando intentan empollar. Y vaya que si empollan... tanto que a más de uno le están a punto de romperse los huevos (eclosionar, ese es el término técnico).

El tema de las chavalas en la Escuela da para mucho, pero es algo secundario. Cuando viene el buen tiempo nuestra vida cambia sobre todo porque en lugar de intoxicarnos en la cafetería, salimos al patio a comernos unos bocatas mientras tomamos el solecito. A veces también los acompañamos con unas birrillas, pero sobre todo los acompañamos con entretenidas charlas sobre los temas más dispares. Ayer tocó la masturbación, un gran tema comodín donde los haya y que a mí me gusta mucho por el juego que da, y me prometí escribir un post recopilando material sobre el arte de las pajillas, pero mientras tanto, voy a hacer un pequeño resumen sobre lo que se habló hoy.

La cosa empezó mientras volvíamos al campus con los bocatas en la bolsa, cuando alguien comentó algo sobre el sistema educativo (lo típico de ESO vs EGB), y yo pensé que los niños que más estudiaban en el colegio luego eran unos fracasados... normal, coño, si necesitaban estudiar tan pronto, es que no iban a dar mucho más de sí. El caso es que yo era de los que se pasaban todo el día en el pasillo. Mi hermano ya estaba acostumbrado a verme castigado en los cambios de clase. Recuerdo cuando un día, lleno de orgullo me dirigí a mi madre y le dije:
-Mamá, hoy no me han echado de clase.
-¿CÓMOOOOO? ¿¿QUE HASTA HOY TE ECHABAN SIEMPRE??
-Hmmmmm... (visto así ya no suena tan bien).
He de añadir que en el instituto sólo me echaron una vez de clase, con la categórica sentencia de "piensa en lo que has hecho, y cuando estés dispuesto a pedir disculpas vuelve a la clase". Todavía me están esperando. En la universidad me tuve que ir yo una vez porque me estaba descojonando. Era una clase de Análisis Numérico. A Pablo (11811) y a mí se nos ocurrió analizar los números de una forma peculiar, que era encontrar todas las rimas posibles del estilo:
- 1: que te folle un tuno.
- 2: (si a alguien se le ocurre una rima que me la mande).
- 3: te la meto del revés
- 4: pa' tu culo mi aparato.
- 5: por el culo te la hinco.
- 6: os la meto y no lo veis.
- 7: mi polla en tu ojete.
- 8: por el culo te la abrocho.
- 9: me la agarras y se mueve.
- 10: (aquí no me acuerdo, pero casi seguro que había algo).
- 11: mi polla es como el bronce.
- 12: (no estoy tan seguro de que hubiese rima aquí).
- 13: me la agarras y me crece.
- 14: (bueno, como el doce)
- 15: en el culo te hago un esguince.
...
- 30, 40, 50... : mi polla te revienta.
por supuesto, iban saliendo de forma desordenada, y cuando llegó el número cuatro, yo entendí mal lo que Pablo me dijo y no podía evitar descojonarme. Cuando conseguía relajar la musculatura de mi mandíbula y serenarme, me disponía a susurrárselo a mi compañero cuando me volvía a dar un ataque de risa. Intenté escribírselo, pero el efecto era el mismo. Me estaba partiendo por una gilipollez enorme. Resulta que en lugar de "pa' tu culo mi aparato" yo había entendido "por tu culo [se mueve] mi aparato". A veces las diferencias más sutiles hacen los cambios más radicales. En el descanso de la clase me disculpé con el profesor y le pedí que me recomendase bibliografía para la lección, porque no podía aguantar el resto de la clase con seriedad. Se lo tomó bastante bien (hay que decir que ese año suspendí Análisis Numérico).

Volvamos a la charla, ya situada en el cesped, bocata en mano (y boca). Cuando se evoca la infancia, se da ese efecto contagioso que hace que todos nos pongamos a hablar como descosidos sobre cuando éramos enanos, atropellándonos un poco, para ver quién hacía las mayores trastadas.

Empezamos con una sesión de pirotecnia, hablando de petardos que quebraban ladrillos reduciéndolos a añicos, petardos pinchados en mierdas salpicando a los artificieros, petardos rompiendo botellines, cohetes dirigidos hacia ancianos, dardos explosivos voladores, cabinas telefónicas reventadas por petardos del 15... por suerte ninguno habíamos llegado a dominar el arte de la bomba de amoníaco. En ese apartado también hubo que añadir actividades piromaníacas varias, como usar los insecticidas "de forma eficaz", crear cohetes caseros y bombas de humo con cerillas. Hasta aquí todos bastante empatados.

Luego llegó el momento de las armas de proyectiles. Los chicos de ciudad no somos expertos en el arte de lanzar piedras, entre otras cosas, por su escasez en entornos urbanos, así que hemos tenido que desarrollar otras técnicas algo más refinadas con lo que teníamos a mano. Los tirachinas son el arma por excelencia, debido a su gran potencia y a al gran variedad de proyectiles que pueden disparar, sin duda ahí Hugo se llevó la palma, al emplear canicas para destrozar cristales reforzados. Yo me convertí en un maestro del tirahuitos, llegando a llevar encima de forma cuasi-permanente una riñonera con municiones variadas para al menos 4 tipos distintos de tirahuitos (los de rollo de papel, otros hechos con las fundas de los carretes de película fotográfica, unos con cuellos de botella y por último los "recortados" hechos a base de rollos de celo), una munición muy popular eran los "tomatitos", sobre todo cuando los dejabas secar.

Después de las cosas de críos, llega el momento de sacar a relucir las partes más oscuras y tenebrosas de nuestro pasado, maldad infantil en estado puro. Como dijo el Maestro Yoda:
- Más fácil, más rápido, más seductor...
- ¡Coño, Yoda, si es que el Lado Oscuro lo tiene todo!
El Cana no empezó muy fuerte, algunas de sus cabronadas más gordas eran rellenar balones de playa con arena para que los chuloplayas hiciesen el ridículo delante de las novias al patearlos y quedarse con el pie destrozado. Hugo subió bastante el listón, con la agresión a un tío calvo con un caramelo duro, con chichón incorporado. Yo por mi parte adquirí una sutileza y refinamiento exquisito en el manejo de la mierda. Mis amigos y yo empezamos entrenándonos con trampas sorpresa. Se trataba de introducir un buen mojón en uno de esos monederos que tienen dos varillas de metal flexible como cierre, y que se suelen abrir de golpe cuando se hace presión... aquello era sobrecogedor, ver a la gente agacharse a por el monedero, apretar para abrirlo y saltarles el tordo a las manos. Lo más sorprendente fue cuando una señora limpió las monedas que habíamos metido dentro de cebo, se las metió en el bolsillo y se fue tan campante.

Pero sin duda, la obra cumbre fue aquella vez que se cruzaron en nuestro camino una buena plasta humeante y un motero del telepizza haciendo una entrega. La moto desamparada era la víctima perfecta. Con la ayuda de un palito, procedimos a untar bien de cataplasma los manillares. El excedente fue a parar a la caja donde se transportan las pizzas (a mí eso ya me pareció de un mal gusto excesivo, que hay gente que come las pizzas que llevan ahí, coño). Como en aquella época yo ya había visto muchas pelis de agentes secretos, sabía que la mejor forma de pasar desapercibido no era salir corriendo ni camuflarse, sino simplemente actuar con naturalidad. Así que con toda la naturalidad que pude, me senté en una valla a ver cómo el motero se pringaba de mierda. Pero cometí 3 errores:
  1. Estar mirando al motero no es pasar desapercibido.
  2. Descojonarse del motero no es pasar desapercibido.
  3. Si eres la única persona que hay en toda la calle, desde luego que no pasas desapercibido.
En lo que sí que acerté fue en salir corriendo a toda pastilla, con tal suerte que pilló a otro de mis compinches camuflados mientras yo salía por patas. Luego vimos al pobre motero subir por la calle con unos papeles en los manillares y con cara de muy mala hostia. Por lo menos no le habíamos pringado también el asiento (creo).

En fin, se hace tarde y creo que por hoy ya está todo el pescado vendido. Si alguno de los lectores es cliente del telepizza, que tenga cuidado con el pepperoni.

miércoles, abril 27, 2005

Ajustar subtítulos (o cómo pierde el tiempo un informático)

Una buena forma de practicar idiomas (por lo menos en lo que a la comprensión se refiere, hablarlos y escribirlos ya es otra cosa) es ver películas con subtítulos. Hace poco me enteré de que se podían poner los subtítulos a las películas en divx simplemente copiando un fichero ".sub" con el mismo nombre de la película cuando la reproduces.

Me puse a ver una película en inglés, con los subtítulos recién bajados (también en inglés), y cuál fue mi chasco cuando descubrí que el texto aparecía desfasado unos 18 segundos con respecto a la voz. Cualquier persona normal hubiese probado a bajarse otro fichero, o simplemente hubiera prescindido de los subtítulos. Pero yo no soy una persona normal. Así que le eché un vistazo al fichero de los subtítulos y aquí tenéis un ejemplo de lo que vi:

0:0:27.99,0:0:29.71
My children...

0:0:29.83,0:0:31.82
from the very beginning...

0:0:31.94,0:0:36.23
it was the children[br]who gave me my power.
Consiste en líneas con los tiempos de inicio y fin seguidas por los textos que aparecen en esos intervalos.

Me puse manos a la obra e hice un programilla que leía el fichero y sumaba (o restaba) una cantidad de tiempo constante a todos los indicadores temporales. Tras un rato haciendo pruebas y arreglando fallos (es lo que pasa cuando uno se pone a programar en plan albañilería), ya tenía el programa funcionando. Copié el nuevo fichero y me puse a ver la película. Los primeros textos estaban en una sincronía perfecta, pero noté que según iba avanzando la película se iban volviendo a quedar desfasados. Vaya jodienda, tanto trabajo para nada. Pero no me iba a dar por vencido tan fácilmente.

Volvía a reproducir la película, anotando los tiempos en los que empezaban cada frase y comparándolos con los que había en el fichero. Efectivamente, la diferencia no era constante, sino que cada vez se hacía mayor. Tomé unas cuantas muestras, repartidas por todo el metraje de la película y las copié en la hoja de cálculo. Pinté una gráfica en la que en un eje estaban los tiempos observados y en otra los definidos en el fichero de subtítulos. Aquello parecía una recta, por lo menos era algo esperanzador, no todo estaba perdido.

Cogí el libro de Álgebra de primero de la carrera, le quité el polvo que tenía encima y busqué cómo se hacía una aproximación por mínimos cuadrados. Ah, aquellas fórmulas me resultaban tan familiares y entrañables... al fin encontré una sección en la que explicaban cómo aproximar una recta, justo lo que yo necesitaba. Antes me hubiese puesto a mirar los teoremas para asegurarme de que entendía por qué funcionaba, pero ahora me bastaba con aplicarlo. 5 años dan para perder mucho interés por las cosas.

Ahora que ya tenía la fórmula y los datos, tenía que encontrar la solución al problema. Abrí el octave y me puse a echar las cuentas con los vectores y las matrices. Resultado final: los tiempos reales estaban relacionados con los predefinidos por la siguiente función: f(t) = -15 + t*0.96

Cambié mi programilla para que además de sumar un tiempo, multiplicase por una constante y... alucinante, los textos coincidían con la voz. Increible que una chapuza así haya funcionado.

Para los que gusten de estas cosillas, les pongo el código del super-programón, hecho en Java.


import java.io.*;
import java.util.StringTokenizer;

public class SubAjust {

private static String SEPARATORS = "";
private static String NOT_SEPARATORS = "0123456789" + Time.DELIMS;

BufferedReader _br;
Time _dt;
double _factor;

public static void main(String[] args) {
for (char c = 0; c < 256; c++) {
if (Character.isDefined(c) && NOT_SEPARATORS.indexOf(c) == -1) {
SEPARATORS += c;
}
}

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Time t = new Time(args[0]);
double f = Double.parseDouble(args[1]);

try {
new SubAjust(br, t, f).parse();
} catch (IOException e) {
e.printStackTrace();
}
}

public SubAjust(BufferedReader br, Time t, double f) {
_br = br;
_dt = t;
_factor = f;
}

public void parse() throws IOException {
String line;

line = _br.readLine();
while(line != null) {
try {
System.out.println(parseLine(line));
}
catch (Exception e) {
System.out.println(line);
}
line = _br.readLine();
}
}

private String parseLine(String line) {
String tmp;
String time1text;
String time2text;
String padding;
Time time1;
Time time2;

StringTokenizer st1 = new StringTokenizer(line, SEPARATORS);
StringTokenizer st2 = new StringTokenizer(line, NOT_SEPARATORS);

padding = st2.nextToken();
time1text = st1.nextToken();
time2text = st1.nextToken();

time1 = new Time(time1text);
time2 = new Time(time2text);

time1 = time1.mult(_factor).sum(_dt);
time2 = time2.mult(_factor).sum(_dt);

tmp = time1.toString() + padding + time2.toString();
return tmp;
}
}

class Time {

public static final int [] BOUNDS = {60, 60, 100};
public static final String DELIMS = "::.";

long centseconds = 0;

Time() {
}

Time(String s) throws IllegalArgumentException {
String tmp;
long mult;
int from;
int to;
try {
from = 0;
to = 0;
for (int i = 0; i < BOUNDS.length; i++) {
mult = 1;
to = s.indexOf(DELIMS.charAt(i), from);
tmp = s.substring(from, to);
for (int j = i; j < BOUNDS.length; j++) {
mult *= BOUNDS[j];
}
centseconds += Long.parseLong(tmp) * mult;
from = to + 1;
}
tmp = s.substring(from);
centseconds += Long.parseLong(tmp);
} catch (Exception e) {
throw new IllegalArgumentException(e);
}
}

public String toString() {
String tmp = "";
long cs = centseconds;
for (int i = BOUNDS.length - 1; i >= 0; i--) {
tmp = DELIMS.charAt(i) + "" + (cs % BOUNDS[i]) + tmp;
cs /= BOUNDS[i];
}
tmp = cs + tmp;
return tmp;
}

public Time sum(Time o) {
Time tmp = new Time();
tmp.centseconds = this.centseconds + o.centseconds;
return tmp;
}

public Time mult(double d) {
Time tmp = new Time();
tmp.centseconds = (long) (centseconds * d);
return tmp;
}
}

¿Y a cuento de qué viene todo esto? ah, sí... esto era un ejemplo en el que había pensado para hablar sobre la alfabetización informática. La mayoría de la gente que se viese en la necesidad de hacer algo parecido, ¿qué habría hecho? seguramente cambiar a mano, una a una, todas las líneas, mientras iba dándole a la pausa a la película y miraba en qué segundo empezaban cada frase. A ojo de buen cubero, tardaría en hacer eso el doble de la duración de la película y además ya la habría visto para cuando quisiera utilizar los nuevos subtítulos.

Pues cosas así pasan a diario cuando la gente trabaja con ordenadores (puede que no tan exageradas). En un próximo post daremos cuenta de ello.


Actualización


Hay otro formato de subtítulos con el que me he encontrado, que tiene las marcas de tiempo por fotogramas. Un ejemplo:

{11186}{11271}Sixty-eight...sixty-nine...
{11272}{11325}seventy...seventy-one...
{11326}{11362}Come on, will you?

De nuevo, estaba desincronizado, por lo que hice el nuevo ajuste por mínimos cuadrados (de frames a centésimas de segundos) tomando algunas muestras y un nuevo programa, esta vez en Python, que trataba con ese formato.

#!/usr/bin/python
#cambiar estos valores (pendiente y corte en origen)
m = 3.3368
r = -14.1243

import sys

def csecsToTime(csecs):
t = csecs
result = "." + str(t%100)
t /= 100
result = ":" + str(t % 60) + result
t /= 60
result = ":" + str(t % 60) + result
t /= 60
result = str(t) + result
return result

def transform(orig):
return csecsToTime(int(int(orig) * m + r))

f = file(sys.argv[1])

for line in f:
tokens = line.replace("{","").split("}")
print transform(tokens[0]) + "," + transform(tokens[1])
print tokens[2].replace("\r","")

El programa es mucho más corto que el anterior, más que por la mayor sencillez de Python, por la simplicidad del fichero a procesar (no había subtítulos que ocupasen múltiples líneas, no había que leer marcas en formato H:M:S.CS) y que los parámetros están incluidos en el fuente, que para eso es un script.

martes, abril 19, 2005

Me cago en la tolerancia

Sí, queridos amigos, el título del post no está equivocado (¡oh! ¡Fortran diciendo algo políticamente incorrecto!).

Apenas veo la televisión, para tragarme una mierda genérica prefiero navegar por Internet, donde puedo consumir mierda más a mi medida. Pero últimamente están proliferando algunos programillas interesantes (¿será cosa del talante?) que uno puede ver si no le entra demasiado sueño.

Acabo de llegar de ver 59 segundos, que por cierto, muy maja la moderadora, echando mis cuentas de ingeniero pervertido me sale que suma más de 10 puntos... perdón, volvamos al tema principal, que estaba viendo el debate, sobre lo de las elecciones vascas y sobre la elección del nuevo Papa. Como supongo que todos los que leéis mi weblog ya sabéis la opinión que me merecen estos temas (si hay alguien nuevo se lo resumo: no me gustan los gorrones, los asesinos ni los farsantes), no me voy a centrar en eso.

Quería dejar constancia por escrito de algo que siempre he comentado con mi hermano, y es que la palabra "tolerancia" me da un poco de asco. Es una de esas palabras que emplean los progres como si les fuesen a dar el premio Nobel de la paz por repetirlas y acaban desvirtuándose. No me gusta la connotación que tiene. Las cosas que se toleran suelen ser negativas. A mí no me hace gracia que algún soplapollas me "tolere" porque no pienso como él. La tolerancia es como la limosna del respeto, que se la das a los pobres porque no pueden ganárselo.

Se me viene a la cabeza cuando algún giliflautas me dijo que me compadecía por no creer en Dios. ¿Qué es eso de compadecerme? ¿Acaso estoy yo enfermo para que usted tenga que apenarse por mí? Eso de la compasión... tampoco me gusta, me suena a la hermana bastarda de la comprensión.

Resumiendo: me parece a mí que tras esas palabras tan políticamente correctas como son la tolerancia y la compasión, se esconde la soberbia del que se cree en posesión de la verdad abosluta y que no le queda más remedio que aguantar ó sentir lástima por los que no piensan como él.

jueves, abril 14, 2005

Fotos de Méntrida

Aquí unas cuantas fotos de aquel apasionante fin de semana. Lástima que no se pueda apreciar el frío que pasamos...

Free Image Hosting at www.ImageShack.us
Una perra, en plena sacudida de babas (impresionante).