Archivo para febrero de 2011

Y ahora a 110 km/h en autovías y autopistas

Señal de límite máximo de 110 km/h

Ya se ha escrito bastante (sobre todo en Twitter) sobre la medida sin sentido del este nuestro gobierno que dice que, a partir del 7 de marzo, no se podrá superar la velocidad máxima de 110 km/h en autovías y autopistas. Un buen razonamiento de este, a mi entender, errónea decisión, es la que se ha escrito en el Blog Salmón.

Aún así, yo quiero dejar aquí mis preguntas, a ver si así me quedo a gusto:

  1. Si la nueva medida está orientada al ahorro energético privado, es decir, de cada familia, ¿qué es lo que ahorra el Estado? ¡Ah…!, que se reduce el déficit. Pues entonces dejemos de comprar coches extranjeros, dejemos de fabricar fuera de España, dejemos de comprar licencias de Microsoft… en definitiva, dejemos de decir gilipolleces.
  2. Entonces ¿por qué el Estado no se preocupa de realizar medidas de ahorro global, común, para todos, en lugar de preocuparse individualmente por cada uno de nosotros (prohibiendo, por supuesto) y deja que seamos nosotros los únicos responsables de nuestra propia economía? Si es que somos nosotros los que vamos a pagar ese sobreprecio y hay muchas y mejores formas de reducir el déficit.
  3. ¿Y cuánto se va a ahorrar en las grandes ciudades donde la mayoría de los desplazamientos no no son por autovía ni autopista? Porque yo, en mis viajes al trabajo diarios, no voy a ahorrar absolutamente nada porque en ningún momento voy por autovía. Sólo cuando voy de viaje y es, más bien, poco (unos 300 km mensuales, de media; en verano más, pero ahora…).
  4. ¿Cuál será la recaudación adicional en multas por exceso de velocidad?
  5. ¿Por qué se están tumbando las renovables esgrimiendo como argumento las primas cuando hemos gastado en dos días más dinero en petroleo que todas las primas de las renovables en un año?

En definitiva, entre la estrepitosa mala gestión y el paternalismo y proteccionismo, a lo único que vamos a llegar es estar mucho peor socialmente (vamos camino) y a que nos hagamos más gilipollas cómodos y no movamos un dedo para mejorar nuestra vida esperando que el Estado lo haga todo. Y no, por ahí no paso. Ya somos mayorcitos.

Señor Estado, haga el favor de gestionar los recursos comunes de forma eficiente y deje que seamos nosotros quienes gestionemos nuestros recursos privados. Pero como sé que no vais a hacer ni puto caso —ni a mi ni a nadie— pues #nolesvotes, pero vota.

Netbook Asus 1215P

Asus 1215P

Me he comprado… bueno, en realidad no es para mi, pero digamos que soy el que lo tunea; pues eso, que he comprado un netbook Asus 1215P, un miniportátil con pantalla de 12 pulgadas, un Intel Atom de doble núcleo, 2 GB de RAM y 250 GB de disco duro.

Mi decisión se ha centrado principalmente en la pantalla, de 12 pulgadas. Esta medida de pantalla, para mi, es la justa, ya que 10 pulgadas me parece demasiado pequeño (para las interfaces gráficas de hoy en día; quizás con alguna específica como la de Android o Unity sería un buen tamaño) y a partir de 13 pulgadas ya sería un portátil normal, no un netbook.

El ordenador es un muy cómodo ya que se puede tener sin problemas en el regazo estando cómodamente en el sofá gracias, también, a que el ventilador apenas arranca debido al escaso consumo de los Intel Atom (aunque, bueno, siempre digo que es “Intel” con su omnipresente arquitectura x86 y que se lograría mejor rendimiento con menos consumo con ARM, pero ese es otro tema).

Además tiene bastante buen rendimiento gracias al doble núcleo y a sus 2 GB de RAM. Quizás la única pega sea el disco duro, y no por su tamaño (250 GB), sino porque sigue siendo de los normales, de los que dan vueltas. Se mejoraría mucho el rendimiento con un disco SSD que, supongo, lo pondrán en sucesivas versiones.

Según la página de compatibilidad de Canonical para Ubuntu, este equipo es totalmente compatible, aunque yo he arrancado con un Live CD y no me reconoció la tarjeta de red inalámbrica que, supongo, se solucionará instalando los controladores correspondientes como un módulo del kernel (el siguiente modelo, el 1215N, tiene este problema).

En definitiva, me parece un buen equipo para el uso particular y para bastantes usos en la empresa ya que combina la potencia de un doble núcleo y bastante RAM con el tamaño y la duración de la batería de un netbook.

PD: El siguiente modelo, el Asus 1215N, está algo mejor ya que la tarjeta gráfica es una nVidia ION y no aumenta demasiado su precio. El único problema es que no es totalmente compatible con Ubuntu tanto su tarjeta de red inalámbrica como la tecnología nVidia Optimus. De todas formas, supongo que estos problemas se subsanarán pronto y ya será otra buena opción.

Efecto «menéame»

Como supongo sabréis, la entrada sobre el tríptico de #nolesvotes fue meneada hace unos días, con lo que era lógico suponer que un blog como este, apenas conocido, tendría un aluvión de visitas. Y así ha sido:

Efecto menéame (Google Analytics)

Como véis, hemos pasado de tener unas 100 o 150 visitas diarias (usuarios únicos) y unas 200 o 250 páginas vistas, a tener más de 9000 usuarios únicos y más de 10 000 páginas vistas. Un incremento del ¡6000 %! Pero vamos, que ha sido puntual. Eso, en este blog es inmantenible, aunque de momento se están manteniendo, diariamente, de 200 a 250 usuarios únicos y de 300 a 350 páginas vistas. ¡Para mí es todo un hito! ¡Jajaja…! :D

Tengo que recalcar que, aunque los chicos de DreamHost han sido acusados de overselling (y muy probablemente con razón), el blog se mantuvo en pie sin problemas (supongo que ayudará tener el wp-super-cache, ¿no?).

Y más que recalcar, tengo que agradecer a Héctor que me ceda amablemente este espacio de hosting. Muchas gracias (y a ver cuándo te vienes por aquí para que te pague. Al menos en carne ;) ).

Lanzar excepciones de forma polimórfica en C++

Otro de mis ladrillos sobre C++. Esta vez sobre lanzamiento de excepciones polimórficas en C++ sobre Linux. Vamos al lío:

Para ponernos en antecedentes, digamos que tenemos una aplicación multihilo escrita en C++ en Linux. Cuando en uno de los hilos se produce una excepción, esta debe ser atrapada (try { ... } catch(...) { ... }) dentro del propio hilo. En caso de que no se haga así, la excepción se propaga al hilo principal (main()) sin posibilidad de atraparla, con lo que la aplicación finaliza.

Para resumir este punto: las excepciones no se propagan entre diferentes hilos de ejecución por lo que hay que atraparlas y procesarlas dentro del propio hilo.

Pero ¿qué pasa cuando queremos que una excepción sí se propague a otros hilos? Es decir, que un error que se produce en un hilo se notifique a otro hilo para que tome medidas. Por ejemplo, tenemos un hilo que gestiona las comunicaciones y otro que gestiona la interfaz. Cuando se produce un error de comunicación es la interfaz la que tiene que notificar al usuario de dicho error.

Soluciones existen varias. Una de ellas es enviar un mensaje con la excepción que se produce al hilo que la procesa aunque hay que tener en cuenta que debe haber una arquitectura de paso de mensajes entre hilos previa.

Por ejemplo, en pseudocódigo, el hilo de comunicaciones:

void
hilo_comunicaciones() {
while(mensaje = cola_mensajes.getMensaje()) {
try {
enviar_mensaje(mensaje);
mensaje = recibir_respuesta();
} catch(Exception& e) {
notificar_interfaz(e);
}
}
}

Y ahora el hilo de proceso de las notificaciones en la interfaz:

void
hilo_proceso_notificaciones_error_comunicaciones(Exception& e) {
try {
throw e;
} catch(ComunicationException& e) {
// procesar excepciones relativas a la conexión
} catch(TimeOutException& e) {
// procesar excepciones relativas al fallo de la conexión por tiempo
} catch(ProtocolException& e) {
// procesar excepciones por errores de protocolo
} catch(…) {
// procesar excepciones generales
}
}

El problema del proceso de procesado de excepciones en la interfaz es que al relanzar la excepción que se recibe como parámetro (throw e;) esta no es la excepción recibida en el hilo de comunicaciones, es decir, no hay polimorfismo por lo que siempre se procesa como una excepción general en lugar de la correspondiente.

La opción de usar typeid(e).name() en la excepción para procesar su tipo no es viable porque es demasiado costosa (el operador typeid es bastante costoso) y porque el nombre de la excepción no es estándar, esto es, en GNU C++ (g++) el nombre está “retorcido”, mangled en inglés.

La opción recomendable es añadir a la excepción base de tu aplicación, teniendo en cuenta que para tu aplicación has desarrollado una jerarquía de excepciones acorde con su funcionalidad, un método virtual que implementen las excepciones derivadas donde, simplemente, se lancen a sí mismas.

Un código de ejemplo sería el siguiente:

// Excepción base de la jerarquía de excepciones de mi aplicación
class Exception : public runtime_error {
public:
Exception(const string msg) : runtime_error(msg) {}
virtual void raise() { throw *this; }
};

// Excepción que se lanza cuando hay un error de acceso denegado
class AccessDeniedException : public Exception {
public:
AccessDeniedException(const string msg) : Exception(msg) {}
virtual void raise() { throw *this; }

};

// Resto de excepciones derivadas conforme a los
// errores que se quieren notificar

Con esta forma de declarar las excepciones, el código de gestión de las notificaciones de error en la interfaz quedaría:

void
hilo_proceso_notificaciones_error_comunicaciones(Exception& e) {
try {
e.raise();
} catch(ComunicationException& e) {
// procesar excepciones relativas a la conexión
} catch(TimeOutException& e) {
// procesar excepciones relativas al fallo de la conexión por tiempo
} catch(ProtocolException& e) {
// procesar excepciones por errores de protocolo
} catch(…) {
// procesar excepciones generales
}
}

Con lo que funcionaría sin ningún problema ya que la excepción se lanza de forma polimórfica al usar un método virtual en la clase base que implementan todas las clases derivadas.

Para hacer una prueba se puede descargar un archivo con un programa de ejemplo (1,4 KB). Para compilarlo basta con ejecutar el comando g++ -o test exception-test.cpp.

Y por ir un poco más allá, se podría pensar que para implementar todas las excepciones que usa una aplicación habría que escribir bastante código, además, la mayoría sería repetido; lo único que cambiaría sería el nombre de la excepción y del constructor, el resto es todo igual.

Bueno, pues para eso están las macros de C: se puede crear una macro a la que se le pase como parámetro el nombre de tu nueva excepción y que ella genere todo el código restante. Pero no olvidéis que las macros son malignas en 4 formas diferentes.

Yo apoyo la iniciativa #nolesvotes

Desde aquí todo mi apoyo (otra vez) a la iniciativa #nolesvotes.

No les votes

Hay gente que califica el tema de cansino. ¿Cansino? ¿En serio?

Cansino es lo que los políticos llevan haciendo años: lo que les da la gana sin tener en cuenta ni lo más mínimo a los ciudadanos a los que representan. Y, encima, delante de nuestras narices, sin cortarse ni un pelo.

Pero, lo peor, es que nosotros no hemos hecho nada por cambiar esto. Hasta ahora. ¿De verdad crees que el tema es cansino?

Buen programador

Un buen programador es alguien que siempre mira en las dos direcciones antes de cruzar una carretera de sentido único.

Doug Linder.

Visto en un comentario con la traducción (libre) de la entrada 25 frases sobre programación que además son divertidas.

Tríptico de “No les votes”

Tríptico No les votes

Las ideas van surgiendo y las acciones van tomando forma.

Mi “corazonada” es que el día de las elecciones generales veremos a los mismos de siempre levantando las manos y felicitándose por que pueden seguir robándonos la “victoria”, aunque siempre hay una pequeña esperanza de que, entre todos, podamos cambiarlo.

Actualización 29/02/2011: Esta entrada ha sido meneada (ya hace unas cuantas horas) y, de momento, el blog ha resistido bien el efecto menéame. Bueno, en realidad tampoco ha habido tantos usuarios, por eso ha resistido. De todas formas, gracias a todos.

Lo único que quiero hacer es aclarar que este tríptico no lo he hecho yo; yo sólo lo he difundido en mi blog para que cuanta más gente lo conozca, mejor, y lo he enlazado a la fuente original (y es lo que me extraña, que no se haya meneado la fuente original y nadie haya protestado). Porque difundir es una de las ayudas que podemos darle a la iniciativa de No les votes.

No les votes

No les votes

Como iniciativa pacífica a los despropósitos de nuestros políticos para con la ciudadanía, desde aquí quiero apoyar públicamente la iniciativa No les votes donde se insta a no votar a los partidos predominantes (léase PP y PSOE) para así no favorecer el bipartidismo y que los ciudadanos no seamos esclavos de las decisiones de unos políticos ignorantes y aprovechados.

Yo ejerceré mi derecho al voto no votando a los partidos que, contrariamente a la opinión pública, han coartado nuestras libertades con la llamada Ley Sinde además de otra serie de medidas enfocadas en el recorte de derechos y libertades que ha costado mucho tiempo y esfuerzo conseguir en favor de las grandes empresas y corporaciones, incluyendo la jubilación a los 67 años, el paro desmesurado, la permisividad con los bancos y cajas, la mala gestión de la burbuja inmobiliaria, la escasez de inversiones en I+D, la falta de incentivación en el uso de energías renovables y un largo, muy largo etcétera.

Con esto, tanto en las elecciones generales como en las autonómicas y, muy probablemente, en todas las futuras elecciones, tanto PP como PSOE como cualquier otro partido que apoye este tipo de medidas, no obtendrán mi voto.

Si tú opinas lo mismo, únete al grupo de tu provincia. Yo ya lo he hecho.

Consumo excesivo de memoria de nm-applet en Ubuntu

¿Es normal que el nm-applet, la aplicación que gestiona las conexiones a redes en Ubuntu (el applet del NetworkManager), consuma más de 500 MB de memoria RAM después de tener el sistema arrancado menos de un día?

Consumo de memoria de nm-applet

Después de buscar un rato, una de las razones que se dan es que, debido a las actualizaciones en lugar de a una reinstalación limpia del sistema operativo, puede que queden archivos de configuración incorrectos que dan lugar a este consumo excesivo de memoria.

Y después de seguir buscando… no aparece nada más excepto que este problema se da en bastante usuarios.

Una forma de mitigarlo es matar el proceso nm-applet en el administrador de procesos y, posteriormente, iniciarlo como root presionando Alt+F2 y ejecutando gksu nm-applet --sm-disable.

Así que, de momento, no hay resolución. Habrá que estar atento para que el proceso no se desboque y podamos seguir trabajando sin reiniciar.

Hoy van 5 años con este experimento

Hoy hace 5 años que empecé con este experimento bloggeril. Esto ya parece un niño que va creciendo… pero no llora, jejeje…

Sigo metiendo cosas (copia de seguridad de las cosas que veo) y, en estos días anteriores, bastantes de Informática (sobre todo de C++). Y alguna más que quedará…

Y con que sirva para que yo lo recuerde cuando tengo que revisarlo y que alguien más lo use para su bien me conformo. Ya sabéis, me gusta compartir información.

Gracias a todos ;) .

El mandamiento «Donut»

Y el señor dijo a los hombres:

“Aquel que actualice el repositorio rompiendo la compilación deberá pagar una penitencia en donuts”.

Esa es la ley.

Lo vi en MundoGeek y lo pongo porque me ha gustado… y porque hoy lo he hecho. He roto la compilación :oops: . Por cierto, la he roto en la revisión 1666 ;) .

Además tienen ustedes una imagen con esta “ley” y con una foto. Eso sí, en inglés.

Actualización: También hay una versión personalizada en español ;) .