Diario Malaspina: día 3

Esta mañana hemos amanecido con tormenta. A primera hora me han sorprendido los destellos de luz repentinos en mi habitación. Amodorrada, pensé que había algún problema de iluminación en el barco, hasta que me di cuenta de que eran los rayos que se veían a través de la ventana. Todo esto implica dos cosas: que las maniobras de hoy han vuelto a ser accidentadas y que yo no me he podido mover de la cama  en todo el día. Me encantaría parar este vaivén, darle al “pause” aunque sólo fuese durante cinco minutos para poder recomponerme y volver a subir al buque en condiciones. Pero eso es, precisamente, lo más agobiante del mareo: que no hay salida aparente.

[Seguir leyendo en Quo Blog]

Diario Malaspina: día 2

Dicen que Murphy trabaja más los primeros días, igual que el resto de la tripulación. Por eso hoy ha sido un día especialmente accidentado. Sin embargo, el ambiente en general parecía positivo: cada cual con su tarea, activo y ocupado pero, con problemas o sin ellos, nadie ha saltado gritando por la borda (habrá que darles tiempo). Casi todos insisten en que esto es lo normal, que al principio algo tiene que salir torcido para poder enderezarlo a tiempo. Cuanto antes, mejor, en cualquier caso.

Pues bien, como precisamente hoy se han estrenado las rutinas de trabajo en el Hespérides, cabe esperar que hayamos superado el pico de imprevistos y, a partir de ahora, todo vaya realmente como la seda. En cualquier caso, voy a empezar por contaros en qué consiste esa rutina y qué hemos venido a hacer aquí.

[Seguir leyendo en Quo Blog]

Diario Malaspina: día 1

Son las 12 de la noche y fuera la gente todavía está trabajando. Yo he decido resguardarme en mi camarote en busca de un momento de tranquilidad: llevamos todo el día moviéndonos de un sitio para otro, sin parar un solo momento, sin un segundo para aburrirse. Tanto es así… que me cuesta elegir por dónde empezar: cada vez que intento rememorar este último día, se pasean por mi memoria, por lo menos, 53 horas. Es una emoción y una responsabilidad estar aquí en nombre de QUO, único medio invitado en esta primer etapa. En cualquier caso, empecemos por el principio, que viene siendo tradición.

[Seguir leyendo en Quo Blog]

Diario Malaspina: preparativos

Los tres últimos días han sido de locos, por lo que se nos ha olvidado comentarlo por aquí: Almudena embarca mañana en el buque Hespérides, en la primera travesía —de un mes de duración— de la Expedición Malaspina 2010, que abarca desde Cádiz hasta Río de Janeiro sin escalas. Durante este mes, Almudena actuará como corresponsal de QUO/Amazings y escribirá un artículo diario en Quo Blog contando las experiencias de a bordo. Yo me encargaré de enlazarlas aquí, en Enchufa2. Aquí va la primera anotación del cuaderno de bitácora.

Ya está, se acabó. No sin esfuerzo, he conseguido cerrar la última cremallera. Miro mi maleta y me acuerdo de los caracoles: con su casita a cuestas. Si algún día no puedo pagar un alquiler, intentaré hacerme un hueco calentito entre el desodorante y las camisetas dentro de esa enorme mole con ruedines. Creo que nunca había hecho un equipaje tan abultado, y mucho menos, tan variopinto. No es raro: me embarco casi un mes en el buque oceanográfico Hespérides para ser los ojos de QUO en la Expedición Malaspina 2010, organizada por el Consejo Superior de Investigaciones Científicas (CSIC). Y yo seré la única periodista a bordo en esta primera etapa. Como suena.

[Seguir leyendo en Quo Blog]

Utilizar funciones y tipos de C en Python

Cuando atacamos un problema con un lenguaje de programación relativamente nuevo, es razonable pensar que ya habrá código escrito en lenguajes más antiguos. De hecho, en muchos casos nos encontramos con que existen librerías en C que resuelven parte de nuestro problema. En Python, existen varias formas de reutilizar código escrito en C/C++. Hasta donde yo sé, cuatro herramientas diferentes: Python/C API, SWIG, Ctypes y Cython. He aquí una tabla comparativa extraída de Python Bindings Overview:

Entre los parámetros que considera, está la curva de aprendizaje (cuán sencillo es de aprender a utilizar), lo pythónico que es (si el código Python resultante es de mayor o menor pureza, por así decirlo), si soporta C, si soporta C++, si existe para otros lenguajes de programación y si maneja excepciones. En este artículo vamos a centrarnos en Ctypes ya que, como podéis observar, es la herramienta más sencilla y más pythónica. El único punto en contra es que no soporta C++ (tampoco maneja excepciones, lógicamente, porque C no tiene excepciones).

Ctypes es una FFI (Foreign Function Interface) que forma parte de Python desde la versión 2.5. Nos proporciona mecanismos muy sencillos para realizar llamadas a funciones de C en nuestro código Python y tratar con tipos de datos nativos de C. A continuación, vamos a poner un ejemplo muy sencillo (es una bobada, aviso), pero suficiente para mostrar el potencial de Ctypes.

Supongamos que tenemos una función escrita en C que calcula la media de dos números:

[code lang=»c»]#Archivo calc_mean.c

double mean(double a, double b) {
return (a+b)/2;
}[/code]

Para reutilizar esta función en nuestro programa en Python, realizaremos los siguientes pasos:

  • Compilar el código C en una librería compartida.
  • Importar la librería compartida mediante Ctypes.
  • Asignar los tipos de datos de entrada y salida que acepta la función.
  • Utilizar la función con total normalidad, como si de una función de Python se tratase.

Crear una librería compartida

Esta tarea se puede realizar de forma directa mediante GCC, por ejemplo. Sin embargo, he encontrado una manera mucho más sencilla y elegante: mediante SCons. Consiste en crear un archivo llamado SConstruct en el mismo directorio donde se encuentran los archivos fuente de C (en este caso, en el mismo directorio que nuestro calc_mean.c) con el siguiente contenido:

[code lang=»python»]env=Environment()
env.Replace(CFLAGS=[‘-O2′,’-Wall’,’-ansi’,’-pedantic’])
env.SharedLibrary(‘libmean.so’, [‘calc_mean.c’])[/code]

Como se puede deducir, la primera línea es obligatoria, la segunda especifica las flags que utilizará GCC (no hace falta tocarlo) y la tercera indica que el archivo calc_mean.c se convertirá en una librería compartida con el nombre libmean.so.

Por último, basta con teclear en una terminal —en el mismo directorio— scons. Y listo: ya tenemos nuestra librería compartida.

Utilizar la librería compartida

Lo más directo es ver un código de ejemplo comentado.

[code lang=»python»]# Archivo ejemplo.py

# Importamos Ctypes
from ctypes import *

# Importamos la librería compartida
libmean = CDLL(‘./libmean.so’)
# Asignamos la función a una variable más corta y manejable
mean = libmean.mean
# Especificamos los tipos C que acepta como entrada
mean.argtypes = [c_double, c_double]
# Especificamos el tipo C que devuelve
mean.restype = c_double

# Lista para su utilización
print mean(3,8)
# Devuelve 5.5[/code]