En qué ando: diciembre

Diciembre ha sido un mes raro. Muy raro. He publicado dos papers (cubriendo mis obligaciones académicas para este año y el próximo), he acabado mis últimas clases programadas y se ha terminado el seminario de Ingeniería Sin Fronteras. He podido volver a pintar después de un terrible bloqueo artístico y he trabajado en la huerta. He inventado otro pan y he una señora china me dio un moho para fermentar arroz. Por fin he sido capaz de escribir sobre la tesis de forma racional (se podrá leer en algún momento del 2020). Siento de alguna manera que he cerrado una fase.

Algunas cosas interesantes

Últimamente estoy leyendo muchísimo, os dejo algunas cosas.

Artículos

Podcasts

Aparte de todo los programas nuevos que han publicado tanto Post Apocalipsis Nau como La linterna de Diógenes he estado escuchando Trincheras de la cultura pop, concretamente (son links de ivoox, no me carrula ningún otro):

Libros

Sigo, como siempre, leyendo sobre feminismo. Esta vez me he puesto con El feminismo es para todo el mundo que tiene una visión del movimiento muy cercana a la mía. bell hooks se expresa muy bien, es muy crítica y habla de temas que, a pesar de ser comunes para nosotras, no llegan a los medios, o llegan retorcidos y descontextualizados. Hay reflexiones sobre clase, raza, estética, amor, masculinidad o educación. Estoy recomendándoselo a todo el mundo.

Además, el seminario de Ingeniería Sin Fronteras me ha hecho recuperar libros de mi lista de lectura: estoy leyendo por fin Pedagogía del oprimido.


Suena:

El 2019

El 2019 ha sido un año introspectivo. He escrito poco y he leído mucho. Me desconecté de la novela y caí en el ensayo porque descubrí que no tenía referentes más allá de la literatura. Me vi carente de palabras, con la expresión limitada, muda. Ocurrió en parte porque no tengo un discurso completo en mi propia lengua, por la realidad social en la que he crecido que rompió la herencia lingüistica en mi familia por los dos lados: no me llegó la lengua de mis abuelos locales ni la de mis abuelos inmigrantes. Les hicieron creer que sus idiomas no valían, que no eran algo que transmitir. He entendido con treinta años que tengo rotas las raíces.

He viajado. He conectado. He compartido.

Tuve uno de los peores bloqueos artísticos de mi vida. Me salvó la huerta: acercarme a la tierra ha sido una de las mejores decisiones que he tomado nunca. Compostar los desechos, enterrarlos, sembrar, plantar, ver crecer la vida … me ata al suelo, me enraíza.

Me reconcilié con mi profesión. En parte porque pude encajarla (precariamente) en mi sistema de valores, en parte porque comprendí que en ella la comunicación es fundamental igual que lo es para mí. Es lo que tiene el alma de artista. Aunque tendré que seguir trabajando en esto para que no se derrumbe el edificio. Si no puedo, tengo un Plan B: hacerme de letras.

Hice 5 años en GNU/Linux. Cada día tengo un sistema más minimalista y veo más necesario entender cómo funcionan nuestras tecnologías y hacernos mejores preguntas. Es mi propósito para el 2020.

Camino a la panificación: pan con polenta y suero de leche

Vuelvo al I+D panadero por un cúmulo de casualidades. Resulta que preparé quesada pasiega verdadera con su queso primigenio y generé bastante suero de leche, parte del cual congelé. Aparte, localicé una tienda rusa en Bilbao y compré polenta a buen precio. Por último, me compré un libro sobre fermentar y me dio por fermentar y remojar todo, incluida la polenta. Todo ello me llevó a adaptar una receta de Lepard de pan de buttermilk y maíz a versión masa madre, sin harina de maíz y cambiando el orden de los factores (que en este caso sí altera el producto). Lo he hecho en versión suero y en versión agua porque acabé el suero pero me seguía quedando polenta. Así soy yo, vivo en la desproporción permanente.

Pan con polenta y suero de leche

¡Viva el maíz!


Ingredientes

  • 50g polenta
  • 200g agua para la polenta
  • 180g masa madre de centeno al 100% de hidratación
  • 450g harina
  • 200g suero o agua
  • 10g sal
  • 2g levadura seca (para no jugármela)

Direcciones

  1. La noche anterior refresqué la masa madre y puse la polenta a remojar.
  2. Por la mañana mezclé la masa madre con el suero (o agua) y la harina y lo dejé en autólisis un rato.
  3. Mientras se hacía la autólisis, puse la polenta remojada al fuego y la tuve haciendo a fuego suave unos 15′ removiendo para que no se pegara.
  4. Añadí la sal a la mezcla de harina y agua y amasé. Añadí la levadura y amasé más. Añadí la polenta templada y amasé todavía más.
  5. Lo dejé fermentando 2h, con un pliegue a la hora. Si no tuviese levadura, lo habría dejado unas 4h.
  6. Preformé en bola, formé en batard y lo dejé fermentando en la nevera en el banetón unas 4h por temas míos de tiempos.
  7. Horneé en horno precalentado a 250 los primeros 10 minutos solo abajo y luego arriba y abajo bajando la temperatura 20 grados cada 20 minutos hasta llegar a 180 un total de 1h. Cuidado con el de suero que tiende a tostarse.

Está rico. Tengo que probar a hacerlo solo con masa madre y con las dos fermentaciones en la nevera a ver qué sale.

En qué ando: noviembre

En noviembre me hago más vieja. Me gusta otorgarle un caracter discreto a un proceso que es inherentemente continuo. Así soy. También he pasado de lo virtual a lo real y por eso no he escrito, o al menos no en el blog. Ha sido un mes analógico: aprendí a ganchillar jacquard y usé una pala para preparar la tierra para plantar ajos, no sé si de los de con palo o sin palo.

Y en mi obsesión con ser una Leonarda del siglo XXI, aprendí a fabricar pintura a partir de pigmento. Sorpresa: la acuarela se hace con miel.

Algunas cosas interesantes

A cambio, he leído mucho. Un montón. Por encima de mis posibilidades. Comparto aquí alguna cosa.

Artículos

Libros

Vídeos


Os dejo con una mujer que descubrí en clase de italiano:

En qué ando: octubre

Me encanta el otoño. Me encantan sus colores y sus verduras y flores. Me encanta el clima otoñal, lo suficientemente soleado para sentarse a leer en un parque pero lo suficientemente fresco para envolverse en casa en una manta y tomarse un té. El otoño, además, significa para mí volver a la rutina: hay otra vez clase de italiano, corrijo exámenes y voy a actividades diversas que se organizan en mi ciudad. Esta vez me he apuntado al seminario de Desarrollo, Cooperación y Tecnologías para el Desarrollo Humano que organiza Ingeniería Sin Fronteras y estoy aprendiendo sobre economía, educación o cooperación desde un punto de vista crítico.

Escribir he escrito poco, hago demasiadas cosas. Básicamente describí cómo es mi entorno de trabajo y luché contra Matlab. En la vida real estuve escribiendo papers como si no hubiera un mañana y hasta me publicaron uno y me scrapeé a mí misma con la idea de sustituirme por una Ondiz robótica y poder dedicarme a ser una mujer del Renacimiento sin necesidad de preocuparme de conseguir dinero para comprar comida.

En fin, que os dejo con mi crisantemo justo antes de florecer.

Algunas cosas interesantes

Comparto aquí algunas cosas que he visto, oído o leído este mes. Como siempre, gracias por compartir cosas chulas en la red y cuidado con el rastreo.

Artículos

Libros

En octubre he permanecido en mi siglo, es decir, el XIX, leyendo Dialéctica erística o el arte de tener razón, expuesta en treinta y ocho estratagemas, un librillo que vi hace mucho en la biblioteca y que puede parecer coaching pero que escribió Schopenhauer.

Vídeos

Hundred rabbits: sobre la experiencia de una pareja viviendo y trabajando en un barco. Toda una lección de decrecimiento.

Lo que he aprendido: formato y exportación de figuras de Matlab

Matlab me está tocando la moral. Qué sorpresa. Me tiene tan sumamente cansada tener que programar en semejante entorno hostil (pun intended) que he decidido adoptar prácticas defensivas. Una de ellas es guardar las imágenes en el formato fig de Matlab y darles el formato que me parezca más tarde con una función. Aprovecho, además, para exportarlas a svg porque mi Matlab está borracho y no me exporta las fuentes correctamente cuando uso eps. Esto implica, claro, que necesito un paso posterior de pasar de svg a eps porque a las revistas no les gusta el svg. Ya veis, hacemos nosotras el currelo pero ellos se ponen exquisitos con los formatos. pero no importa porque viene el software libre al rescata, en este caso Inkscape.

En fin, que os dejo aquí la función que uso para cambiar el estilo de los gráficos y exportarlos y un script de muestra. No funciona bien si la figura tiene subfiguras, pero iremos mejorando.

Cambiar el estilo de una figura en Matlab

Para ello he escrito esta función, que se puede mejorar pero más o menos funciona:

function layout(h, fontSize, font, markerSize, lineWidth, gridOn, sizes)
% Change layout of graphic
%
% LAYOUT(h, fontSize, font, markerSize, lineWidth, gridOn, sizes)
% 
% where:
% - h: figure handle
% - fontSize: fontsize in points
% - font: name of font
% - markerSize: size of markers
% - lineWidth: line width 
% - gridOn: true set the grid to on
% - sizes: [width, height] of output

box on
set(gca,'FontSize', fontSize)
set(gca,'FontName', font)

% Change sizes of all elements
alldatacursors = findall(gcf,'type','hggroup');
set(alldatacursors,'FontSize', fontSize)
set(findall(gcf,'type','text'),'FontSize', fontSize)

% Change line width of all lines and markers
allLines = findall(gcf,'type','line');
set(allLines,'LineWidth', lineWidth)

% Set size of marker
if isprop(gca,'MarkerSize')
    set(h,'MarkerSize', markerSize)
end

% Grid
if gridOn
    grid on
end

x0 = 10;
y0 = 10;
set(gcf,'position',[x0,y0,sizes(1),sizes(2)])

Cambiar el estilo de todas las figuras de una carpeta

Uso la función layout en el archivo figStyle para dar formato y exportar a svg todas los gráficos de una carpeta. Supongo la siguiente estructura de archivos:

.
├── fig
│   ├── fig1.fig
│   └── fig2.fig
├── figStyle.m
├── layout.m
└── svg
    ├── fig1.svg
    └── fig2.svg

Es decir, cogeré las figuras de la carpeta fig y las guardaré en la carpeta svg después de transformadas. He escrito este script para la figuras del paper en el que estoy trabajando:

clear
clc

folder = 'fig';
addpath(genpath(pwd)) % Add subfolder to path
files = ls(folder);
files = files(3:end, 1:end); % delete first two entries (. and ..)
files = cellstr(files); % convert to cell to ease manipulation

number = size(files,1);

% Output names = names without extension
outName = cellfun(@(x) x(1:(end-4)), files, 'UniformOutput', false); 

for f = 1:number

    h = openfig(files{f},'new','invisible'); % open fig without showing
    layout(h, 24, 'Century Schoolbook', 14, 1.5, true, [800,600])

    % Save modified figure
    name = [folder '\..\svg\' outName{f}]; % saves figures in eps folder
    saveas(h,name,'svg')

    close(h);
end

Pasar de svg a eps

Una vez obtenidas las figuras en svg, uso un bucle en la terminal (de Windows) para pasarlas a eps con Inkscape. Aquí tuve líos petardos porque si pongo la carpeta de Inkscape en el Path, tengo un Python extra. Finalmente decidí que lo más práctico era llamar a Inkscape con la ruta completa. Por lo tanto, tiro esta línea en la carpeta donde están los svgs:

for %i in (*.svg) do "C:\Program Files\Inkscape\inkscape" -E %~ni.eps  %i

Aprendí gracias a esta historia que %~n es el nombre del archivo sin extensión. Ya os podéis imaginar la necesidad que tengo yo de saber mierdas cosas de la terminal de Windows. Ah, lo he guardado como svg2eps.cmd para futuro uso.

Y hala, cada día me vuelvo más robótica.


Suena:

Mi entorno de trabajo

Me han preguntado bastantes veces cómo me organizo y, aunque hace un tiempo hablé un poco sobre mi entorno de trabajo en Emacs, desde entonces he introducido algunas mejoras así que voy a hablar de mi entorno de trabajo en general. Aprovecho para enlazar otras entradas del blog en las que hablé en concreto de las herramientas que cito para que se note que las uso de verdad y no es (solo) postureo.

La base: acta en Org

La base de mi metodología es un archivo de Org que utilizo como acta y lista de tareas. Org tiene la ventaja de que me permite añadir imágenes, código y enlaces a diferentes documentos y, además, puedo exportar la parte del acta en diferentes formatos según las manías del receptor.

Este archivo se abre directamente cuando abro Emacs por las mañanas para que pueda ver qué me queda por hacer y acceder directamente a los documentos o al código en los que estoy trabajando desde él, que se abrirán o no en el propio Emacs según su formato. Para que esto ocurra he añadido la siguiente líneas a mi archivos de configuración:

; Abrir archivos con programa que corresponda
; Lo privativo!
(add-hook 'org-mode-hook
           '(lambda ()
          (add-to-list 'org-file-apps
               '("\\.m\\'" . default)    ;; Matlab
               '("\\.fig\\'" . default)  ;; Matlab
               '("\\.xlsx\\'" . default) ;; Excel
               )))

; Abrir acta al iniciar Emacs
(find-file (expand-file-name "acta/acta.org" default-directory))

Como toda mi labor investigadora se basa en este archivo tengo, evidentemente, una copia de seguridad.

El soporte auxiliar: diario de Emacs

Aparte de tener apuntadas mis tareas por temática, llevo un diario en el que apunto qué he hecho cada día. Esto tiene una doble función: por una parte, cuando me desmoralizo y creo que no avanzo, tengo evidencia empírica de que no es así; por otra, me sirve para seguir mi proceso mental y recordar qué estaba haciendo antes de irme de vacaciones, por ejemplo. Esto me resulta crucial porque me permite tanto desconectar en cuanto levanto el culo de la silla del trabajo como tener mis ideas hiladas en un lugar que no es mi (variable) cabeza.

Para ello uso el diario de Emacs de manera poco ortodoxa, que es como me gusta a mí usar las cosas. Tengo una copia de seguridad también del diario, claro.

El producto: texto plano y control de versiones

El tercer pilar de mi organización es que todo lo que produzco (los documentos, la bibliografía, las imágenes, el código …) es texto plano. Aparte de que de esta manera podré seguir accediendo a mi información dentro de treinta años1, así puedo tener todo bajo control de versiones. Para el control de versiones uso Magit en Emacs y git en la terminal por la vieja costumbre.

Os detallo un poco más cómo funciono:

  • Documentos: escribo en Org o en LaTeX tanto los artículos como los informes y las presentaciones para clase. Para LaTeX uso el modo AUCTeX con RefTeX para las referencias bibliográficas, CDLaTeX para las ecuaciones y Company para el autocompletado.

  • Bibliografía: la manejo con Jabref y, últimamente, con Helm-bibtex desde el propio Emacs. En este último caso, uso las variables locales para seleccionar el archivo de bibliografía correspondiente a cada documento así como la carpeta donde viven los pdfs.

%%% Local Variables:
%%% eval:(setq bibtex-completion-bibliography '("ruta_a_bib"))
%%% eval:(setq bibtex-completion-library-path '("ruta_a_pdf"))
%%% End:
  • Imágenes: trabajo generalmente con svg en Inkscape, o exporto a eps o svg desde el resto de programas. El motivo es que ambos son formatos vectoriales y eps el favorito de las revistas científicas. Para las gráficas científicas, tengo el código para producir la imagen bajo control de versiones y una función que le da un estilo uniforme a todas las imágenes que exporto.

  • Código: programo en Matlab por obligación y en Julia y últimamente algo en Python por vicio. Con Matlab hago más que suficiente con no caer en las malas prácticas que fomenta. Para programar en los otros dos uso los modos específicos de Emacs y también Org para programación literaria.

Un día en mi vida

Dicho esto, uno de mis días laborales suele tener esta estructura:

  1. Abro Emacs.
  2. Leo en la lista de tareas qué me queda por hacer y en el diario qué hice el día anterior.
  3. Decido qué voy a hacer. Si hay un archivo relacionado, estará enlazado en la propia lista de tareas y se me abrirá en Emacs o en el programa externo correspondiente.
  4. Trabajo. Escribo, programo, busco papers … abro ramas y envío actualizaciones al repo según corresponda con Magit o desde la terminal.
  5. Actualizo la lista de tareas y el diario con lo que vaya terminando y las conclusiones sacadas.
  6. Cierro Emacs.

Esta rutina laboral se irá modificando según vaya aprendiendo cosas nuevas, cuando eso ya os contaré. ¡De momento contadme vosotros qué hacéis!


  1. Dudo que vaya a querer, pero podré

En qué ando: septiembre

Septiembre me provoca sentimientos encontrados: se vuelve al cole y empieza mi estación favorita; se retoma la rutina y cambian los colores del entorno; se nubla el futuro laboral y llegan las hortalizas otoñales.

Sigo con mi proyecto de aprender a programar decentemente en un lenguaje de programación libre: sigo jugando con Julia, un poco con Python y con la programación literaria, la única manera de que Ondiz del futuro sepa qué demonios tiene en la cabeza Ondiz del presente. También le di otra vuelta de tuerca a mi gestión de bibliografía gracias a mi querido Emacs.

Me estoy divirtiendo mucho analizando textos en general y con NLTK en particular: he vuelto a la época del comentario de texto. Lengua y Filosofía fueron las únicas asignaturas en las que realmente aprendí algo: en la primera aprendí a racionalizar lo que leo y, en la segunda, lo que pienso. Aunque lo descubrí diez años tarde.

Además, han florecido los rosales por lo que tengo un trocito de primavera en mi jardín. Supongo que por esto este mes he vivido más cerca (de lo normal) de la poesía.

Algunas cosas interesantes

Os dejo aquí material que me ido encontrando por la red y por la biblioteca. Gracias a los que compartís y recomendáis, hacéis del mundo un lugar más colorido.

Artículos

Libros

Después de meses desconectada de la novela y enganchada al ensayo, he vuelto a ella. Por lo visto, durante una temporada no necesité escapar pero sí reforzar cimientos. Tuve una etapa de transición leyendo La gaviota1 y, finalmente, retorné a la novela del siglo XIX, la época de dos de mis movimientos literarios favoritos, con La Regenta. Y viajé en el tren con Borges.

También he leído no ficción, por supuesto. Críptica liberó su manual de Resistencia digital y no podía dejarlo sin leer. Tiene un rollito ciberpunk que me enganchó desde el primer momento y un montón de metáforas bélicas y pugilísticas que le dan un toque épico. Los consejos son muy buenos, pero me ganaron por la estética. Como suele pasar, reconozcámoslo.

Podcasts

Vídeos


Os dejo con una canción que descubrí gracias al Fediverso y que me representa totalmente después de tantos años sufriendo diariamente a la Renfe:


  1. Si Chéjov no me devuelve la fe en la ficción, ¿quién? Estamos hablando del hombre que escribió: «La medicina es mi esposa legal; la literatura, solo mi amante.» Una frase que, aparte de ilustrar perfectamente cómo se puntúa, explica, también perfectamente, mi relación con la ingeniería y el arte. 

Lo que he aprendido: manejar referencias bibliográficas en Emacs

Detesto instalar programas, aprender dónde están los botoncillos en un programa nuevo y que luego no me convenza y vuelta a empezar. Supongo que es uno de los motivos por los que me encanta Emacs: mismo programa, miles de tareas diferentes.

Últimamente he estado hurgando un poco en sus habilidades como gestor bibliográfico. Como ya os conté, yo suelo usar Jabref que es el programa que aprendí a usar en su momento y con el que me apaño bien para añadir referencias directamente desde la web, pero hay veces en las que manejar texto plano a pelo me parece más conveniente. ¡Y para eso no hay nada que iguale a Emacs! Os cuento un poco.

El modo BibTeX

La forma más básica para trabajar con bibliografías en Emacs es el modo BibTeX: se carga directamente al abrir un archivo con extensión .bib y nos permite organizar (M-x bibtex-sort-buffer) y adecentar (C-c C-c ) nuestras referencias.

Para insertar entradas tenemos el comando genérico C-c C-b tras el que podemos usar autocompletado, o el grupo de comandos que empiezan por C-c C-e. Por ejemplo, para crear una entrada de tipo artículo podemos hacer lo siguiente:

  • con C-c C-e C-a (o M-x bibtex-Article) creamos una plantilla para artículo;
  • rellenamos los datos necesarios, algunos comienzan por OPT porque son opcionales;
  • al acabar hacemos C-c C-c (o M-x bibtex-clean-entry) para quitar los campos opcionales que no hemos rellenado y que nos corrija el formato;
  • si no le hemos puesto una palabra clave nos sugerirá una y la entrada estará finiquitada y lista para ser citada.

Otro comando interesante es M-x bibtex-fill-entry (generalmente C-c C-q ) para alinear correctamente cada entrada bibliográfica. Y tampoco está mal establecer la variable bibtex-maintain-sorted-entries para tener las referencias en orden alfabético.

Como siempre, podemos recurrir a M-x describe-mode para que Emacs nos explique qué hace el modo. Es un modo chiquitico, pero muy útil para embellecer la lista de referencias ya que ayuda a cambiar de mayúsculas a minúsculas, quitar espacios innecesarios y míticas mierdas que, a las que somos maniáticas, nos ponen muy nerviosas.

Helm-bibtex

Mi modo favorito para gestionar las referencias bibliográficas en Emacs es Helm-bibtex. Lo descubrí intentando abrir los artículos que cito directamente desde Emacs y lo he introducido directamente en mi rutina de escritura científica (que algún día os contaré) junto con AUCTeX y RefTeX.

Es sencillito de usar: una vez instalado, lo llamamos con M-x helm-bibtex. Nos aparecerá entonces una lista de nuestras referencias bibliográficas en la que podremos elegir la entrada que queramos. Dándole a TAB vemos las acciones posibles, que se ejecutan todas en las teclas F1F12.

Como sugieren en su ayuda, he enlazado M-x helm-bibtex a la combinación Menú + b añadiendo esta línea al archivo de configuración:

(global-set-key (kbd "<apps> b") 'helm-bibtex)    

con la idea de configurar el resto de las historietas de Helm también en la tecla Menú y pulsar menos botoncicos.

Evidentemente, aunque sea muy listo este modo, tenemos que decirle dónde tenemos el archivo de bibliografía, los artículos en cuestión y las notas al respecto, si las estamos usando. Yo, como tengo un archivo y una carpeta con referencias para cada tema, establezco unas variables locales para el artículo que esté escribiendo

%%% Local Variables:
%%% eval:(setq bibtex-completion-bibliography '("refs.bib"))
%%% eval:(setq bibtex-completion-library-path  '("references/"))
%%% End:

pero si tuviera todas las referencias juntas, podría añadir ese par de líneas al archivo de configuración directamente con las rutas correspondientes.

ACTUALIZACIÓN (16/10/2019) Por algún motivo que desconozco (Windows), la ruta relativa dejó de funcionar de un día para otro y tuve que poner la ruta absoluta.

Una cosa que me encanta de este modo es que, por medio de RefTeX, localiza la bibliografía local si se usa helm-bibtex-with-local-bibliography en lugar de helm-bibtex. Algo bastante útil sobre todo cuando estamos manejando bibliografías de otras personas.

De esta manera, cuando estoy escribiendo un artículo y quiero citar algo o a alguien, abro mis referencias, busco entre ellas lo que necesito y abro directamente el archivo en el propio Emacs usando pdf-tools. En Windows (sorpresa) esto no me carrula, así que he añadido esto al archivo de configuración

(setq bibtex-completion-pdf-open-function
  (lambda (fpath)
    (call-process "acrobat" nil 0 nil fpath)))

para que me abra los pdfs con al Acrobat Reader. Si, por lo que sea, lo que busco no está entre mis referencias, el cacharro me busca en repositorios online. Me falta investigar cómo funcionan las notas, que hasta ahora no he tenido necesidad de ellas.

Sigue leyendo

Lo que he aprendido: Julia, Babel y Org

Ya sabéis que me gusta llevar la contraria. También que me gusta el minimalismo y usar el mínimo de herramientas posible. Así que cuando me ha dado por explorar la programación literaria y la investigación reproducible en Julia, en lugar de aprender a utilizar los cuadernos Jupyter como una persona normal, me he puesto a jugar con mi adorado modo Org y su funcionalidad para incluir bloques de código Babel1. Supongo que es lo que tiene ser la única de tu entorno (laboral) que hace estas cosas y no tener por tanto limitaciones en la elección de herramientas. Total, como en la academia no se colabora, no se va a dar el caso de que mi elección me limite. En fin, dejo la academia, que me caliento, y os explicito los motivos:

  • No instalo más software: ya estoy programando en Julia en Emacs así que no necesito mil programas y mi ordenador durará años y años.

  • Utilizo mis atajos de teclado y configuración: como sigo usando el mismo programa, no tengo que aprender dónde están otros botoncillos. Además, tengo definido cómo exportar a pdf desde Org pasando por LaTeX en mi archivo de configuración por lo que el documento final es exactamente como yo quiero.

  • Puedo cambiar de lenguaje de programación: el sistema funciona para una pila de lenguajes de programación. Puedo incluso mezclar código de diferentes lenguajes en un único documento2.

Visto esto, parece que elegir Org es una buena idea, así que paso a contaros en qué consiste la programación literaria, cómo se aplica en Org y qué tiene de especial el caso de Julia.

La idea: escribir para humanos

La idea de la programación literaria, como tantas otras buenas ideas, fue de Donald Knuth. Consiste en cambiar de lector objetivo al escribir un programa: en lugar de una secuencia de instrucciones para una máquina salpicada por algún comentario sobre la implementación, el programa se convierte en una descripción de la lógica detrás de la implementación salpicada por algún fragmento de código. De esta manera, no es necesario descifrar qué hace el programa leyendo el código porque las decisiones de diseño y la lógica se explicitan. Se puede pensar en el programa, entonces, como en una obra literaria.

Como me dedico a los métodos de cálculo, es decir, propongo una manera de calcular algo y luego demuestro mediante un ordenador que mi manera es mejor que la manera anterior, este enfoque me interesa por dos motivos:

  • Investigación reproducible: puedo escribir un artículo científico que incluya mis datos y mi código con lo que quien lo lea puede acompañarme en el proceso, obtener mis mismos resultados y verificar si que mis conclusiones son correctas.

  • Documentación útil: puedo explicar en el propio programa mi proceso mental para implementar numéricamente un cálculo que inicialmente era analítico, incluyendo matemáticas si es preciso.

Solo nos queda responder a una pregunta: ¿cómo demonios se lee esa mezcla de texto y código sin volverse una loca? Pues mediante los procesos de weaving, que deja solo lo humano, y tangling, que deja solo lo que entiende la máquina. ¡A ver si os habíais pensado que el señor Knuth no había pensado en esto! La cuestión aquí es que como tanto la documentación o explicación y el código salen de un mismo documento, ambos crecen juntos y limitamos la típica divergencia de según la documentación esta función tiene dos variables de entrada pero según el código tiene tres.

Programación literaria en Org

Ahora que sabemos qué es lo que queremos hacer, vamos a ver cómo lo hacemos en Org. No puede ser más fácil: cuando queramos meter un cacho de código escribimos

#+BEGIN_SRC lenguaje opciones_cabecera

Código

#+END_SRC

y ya está. Impresionante. Más os voy a decir: los bloques se pueden crear con las plantillas fáciles de Org situándonos en el principio de la línea y haciendo <s TAB.

Para poder ejecutar el trocito de código necesitamos primero decirle a Org que vamos a usar el lenguaje en cuestión y que ese lenguaje sea uno de los soportados. Tan sencillo como ir al archivo de configuración y añadir elementos a la lista de lenguajes:

(org-babel-do-load-languages
(quote org-babel-load-languages)
(quote (
(LENGUAJE1 . t)
(LENGUAJE2 . t)
)))

Ahora si hacemos C-c C-c sobre el trocito, lo ejecutaremos y nos saldrá el resultado debajo. Por seguridad, preguntará si queremos ejecutar y tendremos que contestarle, si somos vagos y nos gusta ver el mundo arder podemos decirle que ejecute todo el código sin preguntar con

(setq org-confirm-babel-evaluate nil)

¡Destrucción! ¡Sí!

Un detallico sobre los resultados: los trocitos de código se ejecutan por defecto como si fueran una función (opción de cabecera :results value) y solo nos devolverán el contenido si se lo pedimos explícitamente, con un return en el caso de Python, por ejemplo. Podemos cambiar la opción a :results output y, entonces, Org nos devolverá el contenido de STDOUT. Para lenguajes interpretados, podemos combinar esta opción con :session, que abre un intérprete y envía allí el código de todos los bloques que contengan dicha opción. Es un poco lío esto, pero jugando un poco con las opciones y leyendo la docu, se entiende.

También usamos las opciones de cabecera para decidir si al crear el documento exportamos el código (:exports code), los resultados (:exports results), el código y los resultados (:exports both) o nada (:exports none); para decirle a Org qué debe hacer con los resultados (:post); o para decir si queremos solo el archivo para la máquina (:tangle ARCHIVO_DESTINO), que por defecto no nos crea.

También podemos configurar cómo exporta el código al documento final. En mi caso, como el documento final es un pdf y eso pasa por LaTeX, quiero que use listingsUTF8 para los bloques de código. Se puede configurar para minted también, claro.

;; Exportar código como listings
(require 'ox-latex)
(setq org-latex-listings t)

;; Paquetes de LaTeX para código
(setq org-latex-default-packages-alist
'((""    "listingsutf8"  t)
("usenames,dvipsnames,svgnames,table"    "xcolor"    t))))

Las cuqueces y los colorinchis no se limitan al documento final, con

(setq org-src-fontify-natively t)

también tendremos colores en nuestro Org.

Ah, por cierto, el trocito de código lo podemos modificar en un buffer especial que se abre con C-c '.

El caso de Julia

Julia es uno de los lenguajes que no tiene soporte directamente en Babel porque su autor no le dio el copyright a la FSF. Por lo tanto, aparte de añadir Julia a la lista de lenguajes que puede usar Org, necesitamos los paquetes ESS y ob-julia.

Luego, hacen falta un par de líneas extra en el archivo de configuración para decirle a ob-julia dónde está el ejecutable de Julia (yo lo tengo en el PATH y por eso no le doy la ruta entera) y decirle a Emacs que use ob-julia:

;; Código Julia en Org
(setq inferior-julia-program-name "julia") ;; nombre o ruta de ejecutable
(require 'ob-julia)

(org-babel-do-load-languages
(quote org-babel-load-languages)
(quote (
(julia . t)
)))

Ale, ya puedo jugar a programar explicándome a mí misma lo que he hecho. Ahora solo me falta aplicar estas ideas al archivo de configuración de Emacs para no romperlo nunca.

Seguiremos informando.

Referencias

Documentación de Babel

Babel: active code in Org-mode

Working with source code en el manual de Org

Introduction to Literate Programming

Emacs para ciencias del dato

Julia with Emacs Org mode

Org-mode and julia: an introduction

Literate Programming Examples

Literate programming with Org-mode

Ten simple rules for writing and sharing computational analyses in Jupyter Notebooks

Drops of Jupyter notebooks: how to keep notes in the information age


Os dejo con música:


  1. También hay un paquete específico para Julia, pero ¿me gusta a mí lo fácil? No. 
  2. Lo digo como su supiese programar en múltiples lenguajes, ¿habéis visto?