Diario personal

Hoy quería iniciar un diario personal (no un blog, sino privado), esta vez con la intención de irlo manteniendo hasta el día en que mi cuerpo ya no me deje hacerlo, pero me he encontrado con un problema: no existe ningún proyecto decente que me permita hacerlo de una forma sencilla en Debian (y por lo que he estado viendo en mis búsquedas, tampoco en ninguna otra distro de GNU/Linux). Existía el proyecto KDiary, abandonado, y alguno que otro, también abandonado. Sólo me quedan dos opciones: montarme un wordpress offline en mi pc, privado, o utilizar servicios gratuitos online, como los de Penzu.com … pero eso no me hace mucha gracia. ¿Qué sentido tiene confiar un diario personal PRIVADO a una empresa? Yo al menos no se lo encuentro.

El caso es que añado esto a mi lista de ideas por hacer, dudo que lo haga algun día, por que es de las menos atractivas, pero que carajos, alguien debería rellenar ese hueco en el software de escritorio para GNU/Linux. De hecho, debería crearse algun tipo de estándar para permitir que en caso de que un proyecto se paralize, otros puedan crear software compatible con facilidad para que los usuarios puedan segir manteniendo su diario con software actualizado. Pues nada, otra parida más en mi lista de entradas, sin la menor importancia, pero es que estos días no soy capaz de pensar demasiado ni de decir nada interesante… si es que alguna vez he dicho algo interesante (cosa realmente subjetiva).

Europa Orwelliana

Recientemente se estan dando pasos agigantados para que la Unión Europea se transforme en algo que nos puede recordar bastante a los estados descritos en los relatos de George Orwell. Lo que está motivando estos dantescos cambios en las políticas y leyes de los estados miembros son diversos motivos bién diferenciados, los principales son ‘la lucha contra el terrorismo’, ‘la lucha contra la pederastia’, y, como no, ‘la lucha contra la piratería (informática)’.

Sorprendentemente el GRAN motivo, el que de los tres está consiguiendo mayores ‘logros’ es el que, al menos a mi parecer, es el más ‘innoble’ de todos ellos (por si alguien no imagina a cual me refiero… es ‘la lucha contra la piratería’). Para defender los supuestos derechos de propiedad intelectual de una minoría ,una aplastante mayoría tendrá que perder muchos más derechos de los que los primeros ganarán. Los siguientes derechos están en peligro de extinción:

  • derecho a la privacidad
  • derecho a la presunción de inocencia
  • derecho a instalar (exactamente, ni más ni menos) el software que uno quiera en sus computadoras
  • derecho a copia privada (este existía ya en pocos países de la UE, como por ejemplo España)
  • derecho a compartir contenidos digitales via p2p (sean o no protegidos).
  • derecho a pagar por la tecnología su justo precio y no precios abusivos.
  • derecho a la libertad de expresión

Sobre la libertad de expresión, tenemos casos judiciales que estan creando precedentes para limitar la libertad de expresión:

En cuanto al derecho a la privacidad, desde hace un tiempo se registran todas nuestras conexiones como mínimo durante un año, el objetivo es filtrar datos para poder luchar mejor contra el terrorismo y delitos tales como la pederastia. En principio no lo encuentro mal, pero guardar todos esos datos puede dar pié a que la privacidad de millones de ciudadanos inocentes se vea vulnerada si justificación alguna. Hay métodos lo suficientemente sofisticados como para no necesitar espiar a todo el mundo sin distinción alguna. No eso lo peor, pues casi ni nos damos cuenta e que estamos siendo vigilados constantemente (por lo que nuestra felicidad no disminuye, que es lo que importa al fin y al cabo), lo peor es lo que está por venir.

Recientemente se ha estado elaborando una ley para controlar los servicios de telecomunicaciones, y en ella, justo antes de las votaciones y justo antes de las vacaciones (para que los eurodiputados no se lo miren con demasiado interés) se han hecho tres enmiendas (las enmiendas torpedo según algunos) que para muchos representa el final del Internet libre. (¡Solo hubo dos votos en contra!) Enlaces a páginas que lo mencionan:

Total, que se podrá censurar a diestro i siniestro, se podrán anular servicios de conexión si se usan redes p2p, se podrán enlentecer las conexiones p2p (acabando con la neutralidad de la red), e incluso se podrá instalar software espía en los ordenadores de los ciudadanos (obviamente sin previo consentimiento o aviso) de forma totalmente legal en aras de la “seguridad del pueblo” y la preservación de los derechos de autor de nuestra “élite intelectual”, que crea una cultura de grandísima calidad y necesita cobrar millonadas por ella… por que lo vale.

Acabadas las vacaciones, llegado septiembre, se tendrá que ratificar lo que se ha acordado hasta ahora… tendremos que dar la vara para que no llegue a buen puerto tal aberración de la… legislación.  Entre los últimos enlaces figuran páginas que enlazan a contenidos que lo explican todo de forma muy detallada, y además también se puede encontrar la lista de emails de los eurodiputados (para que podamos mandar emails mostrando nuestra disconformidad con lo que está apunto de pasar).

Acabaré en nada, sólo quiero decir que (casi como siempre) estoy indignado. En las noticias ni se ha hecho mención alguna sobre todo lo que está pasando, y en cambio se le hecho propaganda gratuita al puto iphone de los cojones, que vaya tela, no paran de molestar en todas partes con lo megaguai ke es cacharro. Y además, el gobierno ya se lo ha montado para que RTVE1 tenga los derechos de la liga para que todo el mundo pueda ver el futbol gratis… pan y circo, que buena fórmula para gobernar.

(No he dicho nada sobre la presunción de inocencia, la copia privada y todo eso… bueno, me parece que lo del canon ya lo sabe hasta el hermitaño que vive en la cima del Everest, así que no lo comentaré…)

Hasta otra..

Gente afín

Esta mañana en la ducha estaba pensando .. ¿qué es lo que hace que mis amigos sean mis amigos? No es nada que sea de gran interés para nadie, jeje, pero bueno, me ha dado por escribir esto.

La conclusión a la que he llegado es que son mis amigos por, primero: son buenas personas, segundo: piensan de forma distinta a la mayoría de la gente (en ciertos aspectos, claro, la mayoría de la gente compartimos muchísimas ideas acerca del mundo, si no fuera así difícilmente tendríamos una sociedad civilizada).

En un principio pensé que podía ser que pensaran de forma parecida a como lo hago yo.. pero realmente no es así. Sí que es cierto que a veces pensamos acerca de las mismas cosas, pero casi nunca estamos de acuerdo en nuestras opiniones sobre esas mismas cosas :p . Así parece ser que ya no el pensar de forma parecida, sino el hecho de ser diferente (en cuanto a ideas) a la mayoría de la población puede unir a unos pocos (independientemente de qué ideas se tengan… siempre que no sean totalmente opuestas la mayoría de ellas). Algunos dicen que me gusta discutir, así que si realmente es cierto, puede que encaje perfectamente con lo que estoy diciendo (en cuanto a mi, claro), con amigos con los que puedo discutir sobre algo debo ser más feliz ;) .

Bueno, hasta otro rato en que me aburra.

Haciendo extensiones para Python

El otro día me planteé la cuestión de cómo crear un módulo para Python que fuera más eficiente que el propio Python, es decir, sin escribirlo en Python. Me puse a mirar la documentación oficial y lo encontré fácilmente, la verdad es que Python está muy bien documentado (cambiaría algunas cosillas, pero más por gustos personales que por que crea que están mal). La principal forma de crear módulos eficientes para Python es hacerlos en C o C++, y ésta es la forma que seguí yo. Antes de continuar, os preguntaréis… ¿Por qué querías hacer un módulo eficiente para Python? Pues… ni idea, jeje, por experimentar, y por ver si con mis conocimientos recién adquiridos (sí, realmente recién adquiridos) de métodos numéricos soy capaz de hacer una buena librería de cálculo científico (en particular para aplicar técnicas de interpolación) para Python. Sólo he visto la PyGMP, pero es posible que sea demasiado general, y no incluye algoritmos de interpolación (que es, en definitiva, lo que yo quiero hacer).

Por ahora sólo he incluido dos algoritmos muy sencillos, el de Neville para evaluar polinomios en un punto (de momento sólo real), y el método de las diferencias divididas de Newton, que nos da las diferencias divididas con las que podemos construir un polinomio interpolatorio. De momento he hecho sólo éstos dos porque he estado haciendo pruebas, y entre ellas han habido pruebas de rendimiento… la verdad es que me quedé pasmado al ver la diferencia entre C y Python (sí, ya sabía que Python era más lento, pero no tanto). El algoritmo de Neville llega a ser un 862% más rápido escrito en C que en Python (tarda sólo un 11.5% de lo que tardaría si estuviera escrito en Python), además, aunque no lo he comprobado, creo que a medida que aumentamos los puntos de soporte, el margen de tiempo aumenta todavía más (supongo que habrá un límite).

Ahora pasaré a explicar brevemente como lo he hecho, aunque para el que quiera profundizar, tendría que leer la documentación de Python directamente, esto debería ser sólo un ejemplo. Lo primero que debemos hacer es crear el código que queremos transformar en un módulo python (ya desde el principio tenemos que empezar utilizando los tipos de la API de Python):

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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include <python .h>
 
/* Neville interpolation on real value */
static PyObject *interpolation_iaval(PyObject *self, PyObject *args)
{
	double x;
	PyObject *a, *fa;
	PyObject *tmp;
 
	int n;
	unsigned i, j;
 
	double *da, *dfa;
 
	if (!PyArg_ParseTuple(args, "dOO", &x, &a, &fa))
		return PyExc_AttributeError;
	if(!(PyList_Check(a) || PyList_Check(fa)))
		return PyExc_AttributeError;
	n = PyList_Size(a);
	if(n!=PyList_Size(fa))
		return PyExc_IndexError;
 
	da  = (double *)malloc(n*sizeof(double));
	dfa = (double *)malloc(n*sizeof(double));
 
	if(da==NULL || dfa==NULL)
	{
		if(da)  free(da);
		if(dfa) free(dfa);
		return PyErr_NoMemory();
	}
 
	for(i=0; i<n ; i++)
	{
		tmp = PyList_GetItem(a, i);
		if(!PyFloat_Check(tmp))
		{
			free(da);
			free(dfa);
			return PyExc_AttributeError;
		}
		da[i] = PyFloat_AsDouble(tmp);
 
		tmp = PyList_GetItem(fa, i);
		if(!PyFloat_Check(tmp))
		{
			free(da);
			free(dfa);
			return PyExc_AttributeError;
		}
		dfa[i] = PyFloat_AsDouble(tmp);
	}
 
	n--;
	for(i=1; i<=n; i++)
		for(j=n; j>=i; j--)
			dfa[j] = ((x-da[j-i])*dfa[j]-(x-da[j])*dfa[j-1])/(da[j]-da[j-i]);
 
	x = dfa[n];
 
	free(da);
	free(dfa);
 
	return Py_BuildValue("d", x);
}
 
static PyObject *interpolation_divdif(PyObject *self, PyObject *args)
{
	PyObject *a, *fa;
	PyObject *tmp;
 
	int n;
	unsigned i, j;
 
	double *da, *dfa;
 
	if (!PyArg_ParseTuple(args, "OO", &a, &fa))
		return PyExc_AttributeError;
	if(!(PyList_Check(a) || PyList_Check(fa)))
		return PyExc_AttributeError;
	n = PyList_Size(a);
	if(n!=PyList_Size(fa))
		return PyExc_IndexError;
 
	da  = (double *)malloc(n*sizeof(double));
	dfa = (double *)malloc(n*sizeof(double));
 
	if(da==NULL || dfa==NULL)
	{
		if(da)  free(da);
		if(dfa) free(dfa);
		return PyErr_NoMemory();
	}
 
	for(i=0; i</n><n ; i++)
	{
		tmp = PyList_GetItem(a, i);
		if(!PyFloat_Check(tmp))
		{
			free(da);
			free(dfa);
			return PyExc_AttributeError;
		}
		da[i] = PyFloat_AsDouble(tmp);
 
		tmp = PyList_GetItem(fa, i);
		if(!PyFloat_Check(tmp))
		{
			free(da);
			free(dfa);
			return PyExc_AttributeError;
		}
		dfa[i] = PyFloat_AsDouble(tmp);
	}
 
	n--;
	for(i=1; i<=n; i++)
		for(j=n; j>=i; j--)
			dfa[j] = (dfa[j]-dfa[j-1])/(da[j]-da[j-i]);
	n++;
	tmp = PyList_New((Py_ssize_t)(n));
	for(i=0; i</n><n ; i++)
		PyList_SetItem(tmp, (Py_ssize_t)i, PyFloat_FromDouble(dfa[i]));
 
	return tmp;
}
 
static PyMethodDef interpolationmethods[] = {
	{"iaval", interpolation_iaval, METH_VARARGS,
	 "float iaval(x,[x1,x2,...,xn], [f(x1),f(x2),..,f(xn)])\n"
	 "Neville's method for Lagrange's interpolation\n"
	 "This function returns the value of the interpolation polynomial on the given point (x)." },
	{"divdif", interpolation_divdif, METH_VARARGS,
	 "divdif([x1,x2,...,xn], [f(x1),f(x2),...,f(xn)])\n"
	 "Newton's Divided differences method for Lagrange's Interpolation\n"
	 "This function returns the divided differences of the Newton's divided differences interpolation polynomial."},
	{NULL, NULL}             /* sentinel */
};
 
DL_EXPORT(void) initinterpolation()
{
	Py_InitModule("interpolation", interpolationmethods);
}

Una vez escrito el código tendría que explicarlo… pero en serio, da pereza explicarlo, :p, mirad la referencia de Python online http://docs.python.org/ext/ext.html (Extendiendo Python, en inglés), http://docs.python.org/api/api.html (Python/C API Reference Manual). Después de entender lo que hemos escrito, tenemos que hacer que sea accesible desde el intérprete Python. Desde al versión 2.3 tenemos un método muy sencillo. Este se basa en crear una especie de “instalador” en un pequeño archivo Python que cuando es interpretado construye e instala el módulo para que pueda ser utilizado sin ningún problema.

1
2
3
4
5
6
7
8
9
from distutils.core import setup, Extension
 
module1 = Extension('interpolation',
                    sources = ['interpolationmodule.c'])
 
setup (name = 'interpolation',
       version = '0.1',
       description = 'Interpolation Package',
       ext_modules = [module1])

Por cierto, el fichero C lo llamé interpolationmodule.c, y a éste fichero Python lo llamaremos setup.py. Para construir el módulo escribimos python setup.py build . Para instalarlo debemos entrar en modo administrador y escribir lo siguiente: python setup.py install . Y con esto finaliza la instalación del módulo. Si queréis probarlo sólo hace falta escribir import interpolation en el intérprete, las funciones disponibles son iaval (método de Neville) y divdif (método de las diferencias divididas). Para los que queráis probar las diferecias de rendimiento, podéis importar el módulo timeit, que se utiliza como sigue.

Asignamos a una variable un objeto Timer:
t = timeit.Timer("interpolation.iaval(3.0, [2.0, 4.0], [5.0, 6.0])”, “import interpolation”)
Luego ejecutamos la función timeit() del objeto que hemos creado. Ésta función lo que hará será llamar a la función que le hemos indicado un millón de veces dentro del entorno que le indicamos en el segundo parámetro. Una vez acabe su trabajo, nos indicará el tiempo transcurrido. Si creamos una función en Python que haga el mismo trabajo y le damos los mismos datos, veremos con timeit la gran diferencia de rendimiento que hay entre ambas.

Bueno, acabo este artículo nada reflexivo, aunque espero, entretenido para frikis como yo.

No admiro a Richard Stallman

Desde hace mucho tiempo sabía que Richard Stallman es una persona poco sociable y tal vez excesivamente peculiar, pero no sentía antipatía hacia él porque creo que mientras no se haga daño a nadie adrede o por dejadez (física o sentimentalmente), no hay nada que objetar. Que cada uno sea como quiera ser y viva como quiera vivir. El caso es que hace poco me enteré de que cuando se dice que es poco sociable… están usando un eufemismo.

Para aquellos despistados que en estos momentos no sepan de quien estoy hablando pueden pulsar el enlace que he puesto sobre su nombre. Básicamente fue el ideólogo del software libre y su principal impulsor. Tengo que admitir que fue una gran idea (aunque también creo que a la larga también habría aparecido aunque él no hubiera existido nunca), pero empiezo a dudar sobre los motivos que le impulsaron a explicársela a todo aquel que fuera capaz de prestarle cinco minutos de su tiempo. Antes de comentar mis dudas os tengo que situar y explicar los hechos que me hacen pensar que esta persona no es tan … altruista como quiere parecer.

En este curso (que por suerte se ha acabado! :D) Richard Stallman vino a la UAB a hacer una conferencia. Lo organizaron todo desde el ETC (un grupo de trabajadores de la UAB dedicados a organizar actos y colaborar con las asociaciones y colectivos de la universidad). En particular había una chica que fue la encargada de contactar con el personaje en cuestión, que por desconocimiento empezó con mal pié desde el primer email. Ella no sabía nada sobre software libre, desconocía la diferencia entre Open Source y Software Libre, desconocía la diferenciación entre formatos libres o abiertos y formatos privativos… básicamente no sabía nada sobre todo este mundillo. ¿Qué os imagináis que pasó? Pues que en su email mandó un .doc (eso estuvo muy, muuuuy mal, xD) y solo utilizó el término Open Source sin hacer mención alguna al software libre. La respuesta fue una “iracunda” reprimenda por parte de Stallman, claro que eso nos lo podíamos esperar todos, no es eso lo que me decepcionó (aunque igualmente podría haber sido más educado). Por casualidades de la vida, nuestro grupito GNUAB, renacido de las cenizas empezó a merodear por el edificio del ETC para organizar actos con el objetivo de dar a conocer el software libre. Esto nos llevó a descubrir que la conferencia se iba a llevar a cabo, y de paso poder aconsejar a la organizadora de la conferencia para poder tener un mejor trato con el talibán Rixar.

Yo me desentendí bastante de la organización de todo aquello (tengo que reconocerlo, por perrería), y hasta el día de la charla no tuve mas conocimiento de lo que iba sucediendo (tampoco es que sucediera gran cosa). El caso es que Richard Stallman empezó dando la nota (como debe hacer siempre, seguramente todo debe estar ensayado), a mi me hizo reír mucho (ya hice un post sobre eso), pero detrás del telón todo era distinto…

No tengo muchos datos al respecto, pero sobre lo que me han dicho, no dudo de su veracidad (pues me lo ha contado más de una persona). Como me lo han descrito:

  • (Momento 1) Parece ser que Richard Stallman llegó a hacer llorar a la organizadora con sus gritos de mala hostia. Me han dicho que el muy capullo no la oía y se puso borde (en realidad MUY BORDE) para que le hablara más fuerte, tanto que la pobre chica acabó llorando, y aún así él seguía gritando.
  • (Momento 2) Richard trajo con sigo mismo (no sé si lleva muchos acompañantes que lo ayuden en sus viajes) un montón de merchandising (o como se escriba) de la Free Software Foundation que, obviamente, quería vender (supuestamente para la causa, aunque empiezo a dudarlo). El caso es que un compañero mío de clase y dos o tres organizadores del ETC colaboraron para vender todo aquello, chapas, libros, llaveros… no sé, muchas cosas. Llegaron a recaudar más de 300 € (en el momento que pasó lo que os explicaré en breves segundos), el caso es que Richard pasó por allí, cogió la caja del dinero SIN DECIR NADA A NADIE (aunque una chica del ETC lo vió) y se fue (a algún lugar, no sé donde). Podéis imaginar a mi compañero de clase y a la gente del ETC buscando desesperadamente la caja del dinero desaparecida, acojonados estaban los pobres. Pasado un rato, cuando la chica que lo había visto advirtió que nadie sabía que Richard había cogido el dinero y que todos estaban asustados por tener que pagar el dinero perdido, se lo explicó y deshizo el entuerto.
  • (Momento 3) No sé en que orden van el punto 2 y 3, lo siento :p . Se estaban vendiendo sus libros fantásticamente, mucha gente quería uno, y se estaban agotando. El precio inicial eran 20 €. Llega Stallman, se da cuenta de la demanda, y no sólo decide subir el precio a 25 €, sino que además espera que eso hubiera sido decisión de los que estaban haciendo el “trabajo sucio” por él (sin cobrar una mierda), así que como ellos no habían decidido subir el precio (cosa que a él debió parecer obvia), les echa una reprimenda (sin haber hecho nada malo, otra vez… :S )
  • (Momento 4) En este punto no es que el sujeto en cuestión hiciera nada “malo” (entiendo que cada uno tiene ideas diferentes sobre lo que es la maldad), es que se demostró que es un imbécil. Después de todo lo anterior (también después de la conferencia), no se le ocurre nada más que decir a uno de los del ETC: “Ei, diles a ellos que si quieren, pueden hablarme”. Por lo visto debía estar aburrido el pobre, envuelto en el silencia de la soledad que él mismo había provocado. Y encima, de forma condescendiente, les dice que si quieren le pueden hablar, como si fuera un favor el poder hablar con alguien como él (supongo que se lo tiene creído por ser famoso).

Como véis, no es un diablo ni mucho menos, pero como persona deja mucho que desear. Todo lo que he oído (y otros presenciaron en primera persona) me da mucho que pensar. Por ejemplo, cuando Richard Stallman pensó en un mundo en el que todo el mundo pudiera utilizar software libre… ¿por qué lo pensó? Empiezo a pensar que fue por egoísmo. Seguramente era un amante del código, debía desear con todas sus fuerzas el tener derecho a hacer lo que quisiera con el software que utilizara, estudiarlo, modificarlo… y para de contar. Pero él era un tipo inteligente, y tal como hace la gente inteligente, pensó sobre como satisfacer sus apetencias cognitivas. ¿Y qué pensó? Pues pensó que eso sería imposible si lo intentaba sólo (seguramente no le importaban una mierda los derechos de los demás), pero si convencía a suficiente gente para que trabajaran por su causa sí que conseguiría llevar a buen puerto sus deseos. La libertad para los demás seguramente era un efecto que no lo molestaba lo más mínimo y necesario para la suya propia.

Su movimiento tuvo una gran repercusión en el mundo del software y más recientemente en la creación de obras culturales, creo que para bien, pero como he dicho, empiezo a creer que ese no era su objetivo, sino un efecto colateral que no lo molesta (y que es necesario).

No tengo nada más que decir (y no os enfadéis los puritanos si conjeturo demasiado, que sólo son eso, conjeturas).

Oggtube ya tiene alojamiento :)

Antes de empezar mi sesión de estudio de la asignatura ‘Mètodes Numèrics’ (una de las asignaturas que más miedo me dan, aunque el profesor que la imparte es de los que más aprecio tienen por mi parte, básicamente un tío extraordinario) tengo que anunciar una cosa:

Oggtube ya tiene un alojamiento en https://projectes.lafarga.cat/projects/oggtube . He corregido un bug que permitía bajar diferentes vídeos guardándolos con el mismo nombre de fichero (con lo que unos podían sobreescribir a otros) y ya he creado una interfaz gráfica que se puede ver con la opción -g (aunque todavía no hace nada de nada).

Podéis bajar las últimas versiones del proyecto desde el repositorio con el siguiente comando:
svn checkout --username anonymous https://svn.projectes.lafarga.cat/svn/oggtube

Bueno, ahora ya toca estudiar :) .

Más versiones

Espero que el blog no se transforme simplemente en el lugar donde cuelgo el código que voy haciendo, aunque esta vez lo voy a volver a hacer (no tengo mucho tiempo para escribir largas reflexiones porque estoy de exámenes). El código lo he escrito en el tren después de haber suspendido con casi toda seguridad el exámen de Análisis en varias variables de esta tarde, básicamente lo he hecho para relajarme un poco :p .

Changelog: corregidos “bugs” que no corregí en el otro por no haber testeado el código (nombres mal escritos de algunas variables), he mejorado ligeramente el código utilizando la librería ’shutils’ y exprimiendo más la librería ‘os’, de forma que ahora el código es multiplataforma en toda regla. (Haría falta ver si en Windows existe el programa ffmpeg2theora, jeje. Por otro lado, es ligeramente más tosco el funcionamiento en Windows que en Linux porque no utilizo ningún directorio temporal para guardar los ficheros intermedios). Ahí va el código:

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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
############################################################################
#                      --- oggtube 2006.06.10 ---                          #
#                                                                          #
#   Copyright (C) 2007 by Julià Mestieri Ferrer  (Original Author),        #
#                         Andreu Correa Casablanca (Adaptation).           #
#                                                                          #
#   Email: castarco@gmail.com (Andreu Correa Casablanca)                   #
#                                                                          #
#   This program is free software; you can redistribute it and/or modify   #
#   it under the terms of the GNU General Public License as published by   #
#   the Free Software Foundation; either version 2 of the License, or      #
#   (at your option) any later version.                                    #
#                                                                          #
#   This program is distributed in the hope that it will be useful,        #
#   but WITHOUT ANY WARRANTY; without even the implied warranty of         #
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          #
#   GNU General Public License for more details.                           #
#                                                                          #
#   You should have received a copy of the GNU General Public License      #
#   along with this program; if not, write to the                          #
#   Free Software Foundation, Inc.,                                        #
#   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.              #
############################################################################
 
import os
import optparse
import shutil
import sys
 
youtubedl_call = "youtube-dl http://www.youtube.com/v/"
 
cmdl_usage = 'usage: %prog [options] videocode_1,vc_2,...,vc_n'
cmdl_version = '2008.06.04'
cmdl_parser = optparse.OptionParser(usage=cmdl_usage, version=cmdl_version, conflict_handler='resolve')
cmdl_parser.add_option('-h', '--help', action='help', help='print this help text and exit')
cmdl_parser.add_option('-v', '--version', action='version', help='print program version and exit')
cmdl_parser.add_option('-u', '--username', dest='username', metavar='USERNAME', help='account username')
cmdl_parser.add_option('-p', '--password', dest='password', metavar='PASSWORD', help='account password')
cmdl_parser.add_option('-o', '--output', dest='outfile', metavar='FILE', help='output video file names "name1,name2,..."')
(cmdl_opts, cmdl_args) = cmdl_parser.parse_args()
 
if len(cmdl_args) != 1:
	cmdl_parser.print_help()
	sys.exit('\n')
 
codes = cmdl_args[0].split(',')
 
if cmdl_opts.outfile:
	filenames = cmdl_opts.outfile.split(',')
else:
	filenames = []
 
for x in range(len(filenames)):
	if filenames[x][-4:] != ".ogg":
		filenames[x] += ".ogg"
 
for x in range(len(filenames), len(codes)):
	filenames.append(codes[x]+".ogg")
 
if cmdl_opts.username:
	youtubedl_call += " -u "+cmdl_opts.username
 
if cmdl_opts.password:
	youtubedl_call += " -p "+cmdl_opts.password
 
x = 0
while x < len(codes):
	if os.access(filenames[x], os.F_OK):
		print('The file '+filenames[x]+' already exists, try with another file name.\n')
		filenames.pop(x)
		codes.pop(x)
	else:
		x += 1
 
if os.name == 'posix':
	dir = os.getcwd()
	os.chdir('/tmp')
	for x in range(len(codes)):
		if filenames[x][0] != '/':
			filenames[x] = dir+"/"+filenames[x]
 
if len(codes) > 0:
	if os.system(youtubedl_call+" ".join(codes)) !=0:
		sys.exit("I can't download the videos you specified.\n")
else:
	sys.exit('There is not any file that i can download.\n')
 
for x in range(len(codes)):
	os.system("ffmpeg2theora "+codes[x]+".flv")
	shutil.move(codes[x]+".ogg", filenames[x])
	os.remove(codes[x]+".flv")
 
sys.exit()

A riesgo de ser pesado… :p

A riesgo de ser pesado, colgaré lo que hecho nuevo de aquel script cutrecillo, he añadido descarga múltiple, he solucionado un bug que introduje sin querer y he eliminado la necesidad de escribir “-c” antes del código de película. (Es que mientras descanso de estudiar tengo que hacer algo para relajarme):

#!/usr/bin/env python
# -*- coding: utf-8 -*-

############################################################################
#                      — oggtube 2006.06.08 —                          #
#                                                                          #
#   Copyright (C) 2007 by Julià Mestieri Ferrer  (Original Author),        #
#                         Andreu Correa Casablanca (Adaptation).           #
#                                                                          #
#   Email: castarco@gmail.com (Andreu Correa Casablanca)                   #
#                                                                          #
#   This program is free software; you can redistribute it and/or modify   #
#   it under the terms of the GNU General Public License as published by   #
#   the Free Software Foundation; either version 2 of the License, or      #
#   (at your option) any later version.                                    #
#                                                                          #
#   This program is distributed in the hope that it will be useful,        #
#   but WITHOUT ANY WARRANTY; without even the implied warranty of         #
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          #
#   GNU General Public License for more details.                           #
#                                                                          #
#   You should have received a copy of the GNU General Public License      #
#   along with this program; if not, write to the                          #
#   Free Software Foundation, Inc.,                                        #
#   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.              #
############################################################################

import os
import optparse
import sys

youtubedl_call = “youtube-dl http://www.youtube.com/v/”

cmdl_usage = ‘usage: %prog [options] videocode_1,vc_2,…,vc_n’
cmdl_version = ‘2008.06.04′
cmdl_parser = optparse.OptionParser(usage=cmdl_usage, version=cmdl_version, conflict_handler=‘resolve’)
cmdl_parser.add_option(‘-h’, ‘–help’, action=‘help’, help=‘print this help text and exit’)
cmdl_parser.add_option(‘-v’, ‘–version’, action=‘version’, help=‘print program version and exit’)
cmdl_parser.add_option(‘-u’, ‘–username’, dest=‘username’, metavar=‘USERNAME’, help=‘account username’)
cmdl_parser.add_option(‘-p’, ‘–password’, dest=‘password’, metavar=‘PASSWORD’, help=‘account password’)
cmdl_parser.add_option(‘-o’, ‘–output’, dest=‘outfile’, metavar=‘FILE’, help=‘output video file names “name1,name2,…”‘)
(cmdl_opts, cmdl_args) = cmdl_parser.parse_args()
	
if len(cmdl_args) != 1:
	cmdl_parser.print_help()
	sys.exit(‘\n’)

codes = cmdl_args[0].split(‘,’)

if cmdl_opts.outfile:
	filenames = cmdl_opts.outfile.split(‘,’)
else:
	filenames = []

for x in range(len(filenames)):
	if filenames[x][-4:] != “.ogg”:
		filenames[x] += “.ogg”

for x in range(len(filenames), len(codes)):
	filenames.append(code + “.ogg”)

if cmdl_opts.username:
	youtubedl_call += ” -u “+cmdl_opts.username

if cmdl_opts.password:
	youtubedl_call += ” -p “+cmdl_opts.password

x = 0
while x < len(codes):
	if os.system(“test -e “+filenames[x]) == 0:
		print(‘The file ‘+filenames[x]+‘ already exists, try with another file name.\n’)
		filenames.pop(x)
		codes.pop(x)
	else:
		x += 1

dir = os.getcwd()
os.chdir(“/tmp”)

if len(codes) > 0:
	os.system(youtubedl_call+” “.join(codes))
else:
	sys.exit(‘There is not any file that i can download\n’)

for x in range(len(codes)):
	os.system(“ffmpeg2theora “+codes[x]+“.flv”)	
	if filenames[x][0] == ‘/’:
		os.system(“mv “+codes[x]+“.ogg “+filenames[x])
	else:
		os.system(“mv “+codes[x]+“.ogg “+dir+“/”+filenames[x])
	os.remove(codes[x]+“.flv”)

sys.exit()

¿Odiamos a Microsoft?

Ésta tarde me han pasado un enlace a un artículo bastante interesante, la verdad es que todo lo que dicen ya lo había leído en alguna u otra parte y las opiniones vertidas en él no son ninguna novedad, casi todos mis amigos las comparten (así como yo también), pero me ha parecido una buena síntesis para aquellos que nunca hayan tenido ocasión de informarse sobre porqué hay tanta gente que le tiene manía a Microsoft. Os recomiendo su lectura, aquí está el enlace:

http://www.smaldone.com.ar/opinion/docs/microsoft.html

Arreglado el fallo de los comentarios

El otro día descubrí que con el tema que tengo instalado no se podían enviar comentarios, resulta que el formulario se quedaba “quieto”, inactivo, como si no tuviera ninguna acción asignada al apretar el botón “Enviar”. Bueno, en realidad no sabía si era por el tema, o por wordpress en sí. Hará unos minutos lo he comprobado, así que me he puesto a mirar el código para ver si podía arreglar el estropicio. He mirado el archivo comments.php del tema y he encontrado algunas diferencias respecto del que viene en el tema por defecto, la mayor diferencia: el trozo de código que he quitado al formulario.

onsubmit=”new Ajax.Updater({success: ‘commentlist’}, ‘<?php bloginfo(’stylesheet_directory’) ?>/comments-ajax.php’, {asynchronous: true, evalScripts: true, insertion: Insertion.Bottom, onComplete: function(request){complete(request)}, onFailure: function(request){failure(request)}, onLoading: function(request){loading()}, parameters: Form.serialize(this)}); return false;”

Con borrarlo he solucionado el problema :) . Por si os interesa, el tema que utilizo es Spotlight 1.3 . Por cierto, el día 20 (o el 21) subiré un .deb con el script oggtube (mejorado, he hecho el código más elegante aprovechando mejor las posibilidades de la biblioteca optparse, pero quiero añadir la opción de descargas múltiples y un entorno gráfico mediante las librerías Qt4 y el bindig PyQt).

Entradas Siguientes »