sun almost set





sun almost set, originally uploaded by dsevilla.



Minolta Autocord 6x6 + Fuji RVP 50 slide film.

Sombras con Gtkmm y Cairo (Cairomm) en C++

No es sencillo utilizar Cairo, y menos desde C++. De hecho, el correspondiente mapping a C++, Cairomm, a pesar de ser magnífico, no incluía hasta hace poco la implementación de gradientes, y la documentación no es muy completa (casi inexistente), y hay que leer la de C e imaginarse cómo se hará en C++ muchas veces.

De hecho, antes, para hacer la sombra que quería hacer usaba una imagen con una máscara alpha bastante fea, pero era la única forma de hacerlo con los contextos Gdk.

Con la adición de los gradientes, esa sombra se puede generar en tiempo de ejecución. Así que hoy, saturado de escribir tesis, me he dedicado un poco al propio código de la tesis. Incluye un editor de ensamblados de componentes, al que le añadí el efecto de la sombra. Así, primero se crea el gradiente:


shadow_ = Cairo::RadialGradient::create (0, 0, 0, 0, 0, .5);

// Gradient color stops
shadow_->add_color_stop_rgba (0, 0, 0, 0, .25);
shadow_->add_color_stop_rgba (1, 0, 0, 0, 0);


Creo un gradiente radial (circular) desde el centro, hasta 0.5 (trabajaré en unidades desde 0 a 1). A ese gradiente le añado dos "stops" de color. En realidad, ambos negros, (0,0,0), pero juego con el canal alfa (alpha), dejándolo desde transparente del todo hasta casi transparente (0.25). No quiero que la sombra despiste. A continuación dibujo el componente y la sombra:


const double shadow_size = 100;

const double circle_x = rect().get_x() + rect().get_width() / 2.0;
const double circle_y = rect().get_y() + rect().get_height();

// Access to cairo context
Cairo::RefPtr<Cairo::Context>& cr = ...;

// Transform & draw
cr->save();
cr->translate (circle_x, circle_y);
cr->scale ((double)rect().get_width(), shadow_size / 2.0);
cr->set_source (shadow_);
cr->arc (0, 0, shadow_size / 2.0, 0, 2* M_PI);
cr->fill();
cr->restore();


El componente se dibuja en el rectángulo "rect()". Primero, el contexto de Cairo se traslada al centro del círculo. Se escala de forma irregular para convertir la sombra en una elipse. Finalmente se dibuja el círculo que se rellenará con el patrón "shadow_", y se utiliza el método "fill()" para dibujar la sombra. El resultado queda bastante aparente, aunque tengo que ver si optimizar un poco, porque las operaciones de escalado del gradiente no son muy rápidas. Quizá puedo generar una imagen que sea el gradiente y escalar esa imagen al tamaño exacto. Esto no será tan complejo, aunque el gradiente no será tan perfecto. El resultado:



La imagen anterior: Ghostscript + perl + ImageMagick

Como ando tan liado, dejé para después la explicación de cómo hice la imagen anterior. No es que sea una maravilla, pero por si a alguien le interesa o le da ideas, pongo aquí cómo lo he hecho.

Partí del documento actual de mi tesis, que generé como un fichero Postscript con LaTeX, aunque vale cualquier fichero Postscript o PDF. Usé entonces Ghostscript para convertir cada página en una imagen. Esto es sencillo, ya que el programa está preparado para eso:

$ gs -dBATCH -dNOPAUSE -sDEVICE=png16 -sOutputFile=fichero\%d.png fichero.ps

Esto genera una serie de ficheros «fichero1.png» a «ficheroN.png» donde «N» es el número de páginas del documento. Como dispositivo de salida usé el sencillo «png16» (imágenes PNG de 16 colores, por ahora no necesito más y la cosa va mucho más rápida).

A continuación escribí un programa en Perl usando la librería ImageMagick, que tiene bindings para Perl.


#! /usr/bin/perl

use Image::Magick;

$| = 1;

my $xstep = 100;

my $xsize = 4000;
my $ysize = 4000;
my $HALF = 2000;
my $thumbnail;

$thumbnail=Image::Magick->new(size=>"${xsize}x${ysize}",
pointsize=>24,
fill=>'black');
$thumbnail->Read("xc:black");

my $numimages = shift @ARGV;
my $radius = 1800;

my $PI = 3.141592654;
my $angle = 2 * $PI / $numimages;
my $actual_angle = $PI;

for $i (1..$numimages)
{
my $centerx = $radius * cos($actual_angle);
my $centery = $radius * sin($PI - $actual_angle);
my $imagen = Image::Magick->new();
$imagen->Read("tesis$i.png");
$imagen->Resize(width=>$xstep,height=>$xstep);

$thumbnail->Composite(image=>$imagen,x=>$centerx + $HALF - $xstep/2,
y=>$centery + $HALF - $xstep/2);

print ".";

$actual_angle += $angle;
if ($actual_angle > 2*$PI)
{
$actual_angle -= 2 * $PI;
}
}

$thumbnail->Write("tesis.jpg");



En el ejemplo, el tamaño de la imagen es 4000x4000, por lo que el centro de la imagen está en el punto (2000,2000), y el radio elegido para el círculo es 1800 puntos. Cada imagen se redimensiona a 100x100 puntos, con lo que el dibujo queda más o menos proporcionado. Al menos todas las páginas se ven casi sin solapamiento. El programa se ejecuta como:

$ genera.pl N

donde «N» es al igual que antes, el número de páginas. El resultado lo encontráis aquí.

PhD at 30%





PhD at 30%, originally uploaded by dsevilla.



Large = better



Yes, I'm writing my phd... Here it is at more or less 30%. The first page is on the left, going up and right. 94 pages total by now.



Done with Ghostscript + perl + imagemagick from a 94 page Postscript document generated using LaTeX.

Por qué me gusta Ruby (y por qué siempre me gustó Smalltalk)

Dave Thomas: MetaProgramming: Extending Ruby for fun and profit

La charla de hoy en la Lan Party

La charla esta mañana de la Lan Party no ha ido mal. Después de un rato de espera hasta que los de la organización han montado el tinglado para la presentación, he comenzado con unos 20 minutos de retraso. Me hubiera gustado tener algo más de tiempo porque la parte final no he podido explicarla con el detalle que me hubiera gustado. Además, sorprendentemente, aunque pocos de los asistentes han admitido que programaban, no se han dormido cuando la mitad de la charla ha ido sobre cómo los blogs han influido en la forma de programación del Web, incluyendo REST :)

Me hubiera gustado quedarme después a la charla de Jorge Cortell, pero estaba bastante cansado y además tenía que resolver ciertos temas en Murcia, así que al final no he ido. Seguro que ha estado genial.

Os pongo la presentación en PDF, como me ha pedido chavalina (jeje, qué tiempos en los que dábamos charlas sobre blogs juntos... :) )

Twitter

Sí, al final me he decidido a abrirme uno. No es que me atraiga la idea sobremanera, pero tengo curiosidad por probarlo. Además, cuando se pasan tantas horas solo escribiendo tesis, un poco de desahogo, aunque sea con un sistema automático de registro, nunca viene mal :)

Mi twitter.

Terminada la charla de mañana en la Lan Party

Acabo de terminarla. Para los que os interesen los blogs, planetas, Web 2.0, XML, RSS y la programación en estos entornos con REST, os podéis pasar mañana por la Lan Party a las 11:00. Después el gran Jorge Cortell dará una charla también. Me hubiera gustado tener más tiempo para prepararla, pero ahora estoy en modo tesis...

Sobre «Educación para la ciudadanía»

Muchas son las cosas que se han dicho sobre esta asignatura de introducción en los nuevos planes de estudio. La derecha española y la propia iglesia la ha utilizado como punta de lanza en las críticas hacia la política educativa del Gobierno. Hoy mismo, hablando con un amigo, me ha confesado que esta asignatura no le ha parecido bien «porque según ha oído y dicen por ahí, es un mecanismo de manipulación hacia nuestros hijos». A lo que yo le he respondido: «¿Has leído qué se pretende enseñar en esa asignatura?», a lo que él me ha contestado que no. Yo le he contestado la típica perorata que cae en saco roto, del «... este ha sido el argumento de la oposición en la pasada legislatura, salpicar de manipulaciones todo los elementos que podían, ya que el ciudadano que no está del todo informado, al menos, le sembrará dudas y le hará tener recelo hacia esos elementos criticados». Y así es.

Me he propuesto entonces encontrar cuáles son los objetivos con estas asignaturas de esa llamada «Educación para la ciudadanía», como se ve, desde el principio la asignatura cuenta con un nombre viperino. En mi búsqueda, no muy exhaustiva, he encontrado un borrador de los contenidos y objetivos del conjunto de asignaturas de ese área (supongo que la versión final no difiere mucho de esta; si alguien tiene la versión final, por favor, que lo indique en los comentarios). Como los contenidos y las justificaciones son algo largas, como se podrá entender, quería buscar algo que resumiera cuál era la filosofía y los objetivos básicos de este conjunto de asignaturas. Lo he encontrado en el punto 2 (me he tomado la libertad de resaltar en negrita algunos puntos que me parecían particularmente importantes):


2. Objetivos
Las materias Educación para la ciudadanía y los derechos humanos y la Educación Ético-cívica en esta etapa, tendrán como objetivo el desarrollo de las siguientes capacidades:
1.Reconocer la condición humana en su dimensión individual y social, aceptando la propia identidad, las características y experiencias personales respetando las diferencias con los otros y desarrollando la autoestima.
2.Desarrollar y expresar los sentimientos y las emociones, así como las habilidades comunicativas y sociales que permiten participar en actividades de grupo con actitud solidaria y tolerante, utilizando el diálogo y la mediación para abordar los conflictos.
3.Desarrollar la iniciativa personal asumiendo responsabilidades y practicar formas de convivencia y participación basadas en el respeto, la cooperación y el rechazo a la violencia a los estereotipos y prejuicios.
4.Conocer, asumir y valorar positivamente los derechos y obligaciones que se derivan de la Declaración Universal de los Derechos Humanos y de la Constitución Española, identificando los valores que los fundamentan aceptándolos como criterios para valorar éticamente las conductas personales y colectivas y las realidades sociales.
5.Identificar la pluralidad de las sociedades actuales reconociendo la diversidad como enriquecedora de la convivencia y defender la igualdad de derechos y oportunidades de todas las personas, rechazando las situaciones de injusticia y las discriminaciones existentes por razón de sexo, origen, creencias, diferencias sociales, orientación afectivo-sexual o de cualquier otro tipo, como una vulneración de la dignidad humana y causa perturbadora de la convivencia.
6.Reconocer los derechos de las mujeres, valorar la diferencia de sexos y la igualdad de derechos entre ellos y rechazar los estereotipos y prejuicios que supongan discriminación entre hombres y mujeres.
7.Conocer y apreciar los principios que fundamentan los sistemas democráticos y el funcionamiento del Estado español y de la Unión Europea, tomando conciencia del patrimonio común y de la diversidad social y cultural.
8.Conocer los fundamentos del modo de vida democrático y aprender a obrar de acuerdo con ellos en los diferentes ámbitos de convivencia. Asumir los deberes ciudadanos en el mantenimiento de los bienes comunes y el papel del Estado como garante de los servicios públicos.
9.Valorar la importancia de la participación en la vida política u otras formas de participación ciudadana, como la cooperación, el asociacionismo y el voluntariado.
10.Conocer las causas que provocan la violación de los derechos humanos, la pobreza y la desigualdad, así como la relación entre los conflictos armados y el subdesarrollo, valorar las acciones encaminadas a la consecución de la paz y la seguridad y la participación activa como medio para lograr un mundo más justo.
11.Reconocerse miembros de una ciudadanía global. Mostrar respeto crítico por las costumbres y modos de vida de poblaciones distintas a la propia y manifestar comportamientos solidarios con las personas y colectivos desfavorecidos.
12. Identificar y analizar las principales teorías éticas, reconocer los principales conflictos sociales y morales del mundo actual y desarrollar una actitud crítica ante los modelos que se trasmiten a través de los medios de comunicación.
13. Adquirir un pensamiento crítico, desarrollar un criterio propio y habilidades para defender sus posiciones en debates, a través de la argumentación documentada y razonada, así como valorar las razones y argumentos de los otros.


Con este temario, no me extraña que mucha gente haya puesto el grito en el cielo (nunca mejor dicho)... ¿Pensamiento crítico? ¿Desarrollar criterio propio? ¡Hasta ahí podíamos llegar!

Os propongo, si tenéis un rato libre, que me digáis qué motivo encontráis, entre esos objetivos, para plantear una objeción de conciencia para que a vuestros/nuestros hijos no se les imparta esa asignatura.

Actualización: Más en la Wikipedia, donde se muestran incluso sentencias a favor y en contra sobre la objeción a esta asignatura... Supongo que tendrá que llegar el Tribunal Supremo (o el Constitucional, no sé exactamente cuál) a dar la razón a una u otra parte... Supongo que ya sabéis a quién dará la razón...

Photoshop disasters

Mi amigo David Pérez, de cuyas fotos en Flickr podéis disfrutar también me ha indicado esta mañana un blog que me ha hecho disfrutar bastante. Estando en la era digital como estamos, la era del ya nada es como era antes, todo está descafeinado, desnatado, y nada es lo que parece y todo está manipulado, los «photoshoperos», tribu urbana que se especializa en modificar imágenes para hacerles las más variopintas adaptaciones, están de moda.

El blog Photoshop Disasters pretende llamarnos la atención, primero, de que todas las imágenes están manipuladas, y segundo, de que hay algunos elementos de la tribu que no tienen las más mínimas ideas sobre diseño gráfico o manipulación de imágenes. No hay muchas entradas en el blog todavía, pero son brillantes. Me ha hecho mucha gracia esta: «Batman fascinated by a window frame» (Batman fascinado por un marco de ventana) :):

can't resist :)





can't resist :), originally uploaded by dsevilla.



Pentax 67 + SMC 135/4 macro + Fuji Velvia 50 asa.

almost





almost, originally uploaded by dsevilla.



Pentax 67 + SMC 168/2.8 + Don't remember the film.



Dawn in La Mancha.

Inkscape

Mis mayores respetos para este programa, Inkcape (por cierto, software libre). Qué bien me lo paso diseñando las figuras para la tesis. Es una maravilla de programa. Y por supuesto, gracias a los consejos del gran Jesusda (desde aquí, mil gracias, por cierto). Inkscape es un programa de dibujo vectorial que trabaja como formato nativo con SVG (Scalable Vector Graphics). En la captura, Inkscape a pleno funcionamiento con una figurilla que a ver si termino:

Dias Caldum 4

Hoy, como por arte de magia, ha aparecido debajo de la puerta de mi despacho un cartel anunciando los días caldum. Las primeras dos ediciones tuvieron bastante buena acogida, y de repente, la tercera edición no tuvo ni publicidad (no entiendo por qué, la verdad). En esta última ocasión, enviaron un mensaje a la lista común de la Universidad, y han preparado un programa de una mañana. No sé de quién es la idea de darle más o menos publicidad, pero reconozco que este tema se podría haber llevado mucho mejor por parte de los responsables de la Universidad. Tener un evento que conecte software libre y Universidad es necesario, y hubiera sido un punto muy importante ser abanderados... Supongo que en las regiones deprimidas de Europa, como es Murcia, el software libre todavía no vende. Como siempre, el tejido empresarial informático de la Región se tendrá que adaptar a trancas y barrancas, escribiendo chapuzas «made with free software».

Por mi parte, no doy a basto con mi trabajo, pero cómo me gustaría que la Universidad creara, por ejemplo, un observatorio de Software Libre... cuántas empresas utilizando Oracle podrían tener soluciones equivalentes con MySQL o PostgreSql a mitad de precio (incluyendo mantenimiento, por supuesto) y con una atención personalizada y cercana, no llamando a un servicio técnico de Irlanda... En fin, ya caerán del guindo.

.





, originally uploaded by dsevilla.



Bronica S2 + nikkor 50mm/3.5 + Fuji RDPIII slide film.

little flower





little flower, originally uploaded by dsevilla.



Mamiya 645 + Sekor-C 80mmf/1.9 + Agfa RSX II (sadly, forever expired). 200 ASA

Mamiya Press Super-23





Mamiya Press Super-23, originally uploaded by dsevilla.



Mamiya 645 + Sekor-C 80mmf/1.9 + Agfa RSX II (sadly, forever expired). 200 ASA

España: una vez más socialista

Los españoles han hablado y una vez más han dado la confianza al proyecto socialista. Estoy contento. Por supuesto, me hubiera gustado que la diferencia entre ambos partidos hubiera sido mayor, pero no ha sido así. Lo importante es que el resultado muestra un apoyo mayoritario a una forma de llevar España. Otros cuatro años de avance en derechos sociales. Nos espera un gran futuro. Enhorabuena a todos.

Cobarde atentado de ETA

Desde aquí, mi más sincero pésame a la familia de Isaías Carrasco. Sé que es difícil, pero no debemos dejar que los asesinos de ETA se interpongan en nuestra democracia, y mucho menos a dos días de las elecciones. Dicen las noticias que durante el asesinato, su mujer e hija estaban presentes. No se me ocurre atrocidad mayor, como si lo estuviera viendo en un sueño... Pero es real. Qué enfermos asesinos. Cómo les gustan los golpes de efecto. Pero ¿para qué? No van a conseguir NADA. Salvo ir a la cárcel.

at emma's car





at emma's car, originally uploaded by dsevilla.



Norita 66 + Noritar 80/2 + Fuji RXP (400 ASA)

.





, originally uploaded by dsevilla.



Pentax 67 + SMC 135/4 macro + Fuji Velvia 50.