Lo que he aprendido: cambiar el idioma de la bibliografía en LaTeX

Me he dado cuenta de una cosa: ¡siempre que he escrito en LaTeX he hecho la bibliografía en inglés! Así ocurrió que cuando tuve que escribir un artículo científico en castellano, aparte de que no era capaz de redactar correctamente, no sabía cambiar el idioma de la bibliografía. Qué lamentable.

Hasta que descubrí Flexbib ¡ja! Me diréis pero, Ondiz, loca, usa babelbib y hala. No son las cosas tan fáciles, queridos hermanos, como su nombre indica, babelbib trabaja con babel y yo compilo con XeLaTeX y, por lo tanto, uso polyglossia. Ya veis, siempre llevando la contraria.

En fin, os cuento un poco de qué va Flexbib.

Flexbib o no más hegemonía

Cuando trabajas en el academia acabas acostumbrándote a que los autores en tus referencias sean Fulanito and Menganito, las páginas web hayan sido last accessed in y que tus comillas no sean angulares como deberían ser. Tanto te acostumbras que llegas a creer que, como al cambiar el idioma al documento, ya te pone capítulo en vez de chapter está todo hecho. Pero no es así. Flexbib viene a ayudar en la tarea de automatizar el proceso de referenciar otros trabajos cuando no escribes en la lengua hegemónica de la academia. Hace otras cosas también (elegir un modelo autor-año o numérico, elegir paréntesis o corchetes, controlar qué aparece en la lista de referencias…), pero a mí me importan menos.

Flexbib consta de varios archivos que habría que situar en ciertos lugares concretos de nuestra instalación de LaTeX, pero yo paso olímpicamente de cualquier instrucción que puedan darme y simplemente echo el paquete flexbib.sty, el estilo flexbib.bst y el archivo spanishbst.tex en la carpeta principal de lo que vaya a escribir en castellano.

Luego, en mi preámbulo cargo el paquete con las siguientes opciones

\usepackage[spanish, plain, sort&compress, nocomment, noabstract]{flexbib}
  • spanish porque quiero que las partículas aparezcan en dicho idioma;
  • plain para que me cite con numeritos;
  • sort&compress para que en lugar de [1,3,2] aparezca [1-3];
  • nocomment y noabstract para que no aparezcan los comentarios y el resumen del .bib en la lista de referencias.

También añado el estilo de bibliografía allí donde corresponde con

\bibliographystyle{flexbib}

Con esto mis referencias quedan cuquísimas con sus comillas angulares como mandan los cánones:

referencias

Creo que tengo que plantearme migrar a BibLaTeX. Que, claro, luego no será soportado por ninguna revista académica.

Y nada más, os dejo a vosotros la labor de saber si esto es una entrada técnica o una diatriba en contra del sistema.

Metablogging.

Referencias

Manual de Flexbib (pdf)

LaTeX/Bibliography Management en Wikibooks

Software necesario para la bibliografía con Flexbib


Os dejo con Tomasito zapateando en London. Yo quiero esos botines. Y ese arte.

En qué ando: junio

Tal y como mayo fue el mes del huerto, junio ha sido el mes en el que me he ido de gira. Empecé cerca en Urban Zientzia; me alejé un poco más para las Jornadas libres, en las que desvirtualicé a mucha gente y vi Post Apocalipsis Nau en directo y ahora lo amo aun más; y crucé casi toda la península para ir a la esLibre, donde hablé sobre el Fediverso en una sesión llena de chicas (hay streaming de Periscope de la sesión) y desvirtualicé a mis sureños favoritos.

Por todo esto he escrito poquísimo, solo sobre scrapear en Julia para mi proyecto maligno y sobre gestores bibliográficos. Pero estoy contenta: le ha salido una flor al granado y me ha vuelto la obsesión por el japonés. La vida no para de darme sorpresas.

Algunas cosas interesantes

He escrito poco y he leído poco también. Os dejo algunas cosas cortesía de mis gentes de las redes, gracias a todos por compartir lecturas.

Artículos

Libros

He releído El mito de Sísifo, me encontré con él por casualidad en la Feria del Libro mientras buscaba un libro delgadito para llevarme de viaje. Es mi preparación típica cuando voy por ahí: buscarme un historia que me acompañe en la carretera. Supongo que volví a él porque necesitaba que me dijeran que a pesar de que nada tenga sentido todo está bien. Me hace falta a veces.

También leí ¿Tener o ser?, me creó curiosidad el resumen de Esteban, vi que estaba en la biblioteca (soy una enferma, tengo tres carnets de biblioteca: el de la uni, el de la escuela de idiomas y el de todas las bibliotecas de Euskadi) y lo cogí. Es un libro curioso, a la vez profundo y práctico. Me ha servido para atar ideas que tenía en esferas independientes.


Os dejo con música:

Gestores bibliográficos: hay que usarlos más

Me suelen preguntar cómo caí en el LaTeX y en el Emacs y siempre digo que fue porque necesitaba herramientas que no trabajaran en mi contra. Un tema en el que las herramientas por las que una se decante son determinantes es, en mi opinión, la gestión de la bibliografía. Que es un asunto que no preocupa a mucha gente, pero yo soy una académica: mi vida es leer cosas que no entiendo que me llevan a otras cosas que no entiendo y tengo que organizarlas de alguna manera. De alguna manera en que las pueda volver a encontrar, claro. Para esto hay algo que me resulta indispensable: un gestor bibliográfico.

La idea

Un gestor bibliográfico permite almacenar y organizar nuestras referencias (libros, artículos, normas, páginas web) para luego poder citarlas con facilidad y coherencia. De esta manera, cuando estamos escribiendo nos podemos despreocupar de seguir un estilo concreto cuando referenciemos una obra ya que nuestro programa lo hace por nosotros; no tenemos que preocuparnos por haber traspapelado aquel pdf donde se explicaba el método que estamos programando porque lo tendremos enlazado en nuestra base de datos y podremos buscarlo; cuando nos rechacen el paper y queramos enviarlo a otra revista que nos piden estilo de cita Harvard no estaremos tres años cambiando las referencias porque hemos usado Chicago en el anterior, porque nuestro programa lo hará solito.

Además de que me resuelva estos problemas, verídicos todos y cada uno, le pido varias características a mi gestor:

  • Integración con mi editor de texto: que pueda referenciar documentos con facilidad desde mi editor y que me cree una bibliografía automáticamente con el estilo que le pida. Como yo generalmente escribo en LaTeX, necesito que me exporte un archivo de bibliografía bib; para trabajar con un editor como Libre Office Writer, se necesita una extensión que conecte el editor y el gestor.

  • Búsqueda en mi base de datos: que pueda buscar por título, autor, palabra clave…

  • Base de datos local y exportable: que me enlace los documentos y la información bibliográfica, se pueda acceder a ellos desde el propio gestor y no estén en la nube.

  • Anotaciones: que pueda añadir notas a las referencias.

  • Software libre: me enseñaron a usar RefWorks durante la tesis y tenía compañeros que usaban Mendeley pero, o bien hay que depender de que tu institución apoquine por el servicio, o hay que confiar en que no cambien el estándar y tu base de datos no sea accesible nunca más. El software libre es la solución.

En mi carrera investigadora (qué bien suena pero que cúmulo de precariedad es), he usado dos gestores que cumplen todas las exigencias: Jabref y Zotero.

Jabref

Jabref es el programa que uso para gestionar mi(s) bibliografía(s) desde hace años. Me gusta porque es sencillo y trabaja directamente con un archivo de texto plano que tengo bajo control de versiones. En las últimas versiones es además capaz de descargar el texto completo si es de acceso abierto y puede extraer la información bibliográfica de un archivo.

Jabref tiene esta pinta:

jabref

Como veis is muy sencillo: a la izquierda hay barra de búsqueda en la web (si no os aparece: Search > Web Search), el resto es la base de datos con su título, autor y demás información. Si entramos en una entrada de la base de datos podemos añadir o cambiar la información, que dependerá del tipo de referencia. Si nos faltan datos, Jabref nos marcará la entrada en rojo, también nos pone advertencias cuando el formato de un campo no es correcto.

Un tema interesante es el pdf pequeñito de la columna de la izquierda, eso significa que tenemos un pdf enlazado, o bien porque Jabref lo ha encontrado en algún repositorio o porque lo hemos metido en la carpeta de los artículos y lo hemos denominado como la clave (lo que aparece en la columna de la derecha del todo). Así, podemos echar todos nuestros archivos sin ningún tipo de control en una carpeta mientras seamos coherentes a la hora de nombrarlos. Por ejemplo, para la bibliografía del artículo que estoy escribiendo ahora mismo, tengo una carpeta junto al archivo bib cuyo contenido es el siguiente:

archivos

Como veis, los nombres de los archivos coinciden con la columna de la derecha del Jabref. Así Jabref los localizará y podemos olvidarnos de dónde están los pdfs porque ahora solo con hacer click en el pdf chiquitico Jabref nos lo abrirá. Para localizar los archivos automáticamente hay que decirle a Jabref en qué carpeta están (File > Library properties > General file directory) y luego se le da al F7 o al iconito del papel con la lupita. Lo encontráis volando. También podemos enlazar los archivos a mano y varios para una misma entrada, incluso.

Tenemos la posibilidad, además, de comprobar si todos los archivos de la carpeta están enlazados en la base de datos por si nos venimos arriba descargando cosas (ay, el Diógenes electrónico) y el propio Jabref extraerá la información que pueda de cada archivo y nos generará una entrada en la base de datos (en Quality > Find unlinked files).

En fin, no cuento más sobre cómo funciona el programa porque como se entiende de verdad es usándolo. Yo aquí estoy solo para picar. Lo que sí que me gustaría es compartir mi proceso de trabajo:

  • Creo un archivo bib para el nuevo tema que estoy investigando.

  • Si quiero un artículo concreto lo busco desde la barra de búsqueda web de Jabref; si estoy haciendo una búsqueda más general, busco directamente en una base de datos. Generalmente todas las bases de datos (y las revistas) permiten descargar un bib para la referencia que nos interesa. En Scholar hay que activar la opción de que muestre los enlaces para importar la referencia a BibTeX en la configuración para ello.

  • Si la base de datos no me da la información bibliográfica como yo quiero, uso la extensión de Firefox JabFox que extrae esta información de una página y la envía a Jabref. Es interesante para cuando estás leyendo el abstract de un paper en la página de un journal1 o cuando hay una lista de referencias que queremos exportar juntas, por ejemplo, del Scholar.

  • Le digo a Jabref que me busque el pdf por ahí usando la lupa que hay en la pestaña General. Si no me lo encuentra tiro de magia negra.

  • Me “leo” el artículo y anoto en la pestaña de review lo que opino al respecto junto con alguna cita literal o palabra clave que luego me vaya a ayudar a encontrar la información cuando escriba y así no tener que leer todo otra vez.

  • Elijo el estilo de cita y de bibliografía que quiero y llamo a mi referencia bibliográfica cuando la necesito. Esto depende del editor, claro, ya conté cómo lo hago en LaTeX con BibTeX. En el Writer se hará distinto

Zotero

Zotero tiene un concepto diferente: guarda nuestras referencias en una base de datos SQL en lugar de un archivo de texto plano. El trabajo con Zotero, por lo tanto, es también diferente: no empezamos con un archivo en blanco sino con una nueva colección a la que le añadiremos elementos.

Al igual que Jabref, Zotero es capaz de buscar el texto completo en repositorios abierto y tiene una extensión para descargar los artículos con DOI directamente de Sci-Hub y que yo jamás recomendaría a nadie que utilizara, ¿qué queremos? ¿desmontar el negocio de las publicaciones científicas?

Zotero tiene una pinta similar a Jabref, con diferentes chirimbolos para designar a los artículos, libros y demás. Es impresionantemente intuitivo en mi opinión: añadir un pdf o nota a una referencia es sencillísimo (¡hurgad!) y tiene una búsqueda avanzada molona.

zotero

Mi forma de trabajar con Zotero es similar aunque varía en un par de cosas, seguramente porque llevo años usando Jabref:

  • Creo una nueva colección para el tema que estoy investigando.
  • Busco lo que quiero en alguna base de datos como Base, o Scholar si no me queda otra.
  • Envío las referencias que me interesan a Zotero con el conector de Firefox.
  • Si tengo acceso, descargo los textos completos desde el repositorio abierto. Curiosamente, la extensión de Sci-Hub descarga el pdf automáticamente cuando añadimos una referencia, pero, de nuevo, no la uséis.
  • Leo y anoto lo que tenga que leer y anotar.
  • Si voy a escribir en LaTeX, exporto un bib y trabajo de la manera habitual, si voy a usar el Writer uso la maravillosa extensión de Zotero que permite elegir el estilo de cita, citar y crear la bibliografía con un par de botoncicos.2.

Me encanta tanto la extensión del Writer que he grabado un screencast en el que se me ve el Windows, imaginad:

Se puede citar con superíndice y con cita al pie en lugar de hacer una bibliografía final, todo es configurar.

Conclusión

¿Merece la pena dedicarle una tarde a organizarse un sistema para gestionar las referencias? Pues, sinceramente, sin un gestor así yo no hubiera acabado la tesis, no tengo capacidad intelectual de gestionar los varios cientos de referencias que manejaba3.

En fin, este es en mi opinión un caso claro de que “perder el tiempo” en elegir un sistema evita perder el tiempo en el futuro. Por eso lo que he hecho ha sido explicar poco cómo se usa un gestor y más qué evita. Porque soy malvada.

Contadme qué tal, anda.

Referencias

Ayuda de Jabref

Guía de inicio rápido de Zotero

Documentación de Zotero

El repositorio de estilos de cita de Zotero


Aunque me corra el punk por las venas:


  1. Sí, hablamos así. 
  2. También hay para Word, desgraciadamente. 
  3. Bueno, igual la ansiedad, el síndrome del impostor y el bruxismo sin diagnosticar que me provocó vértigos durante años tuvieron algo que ver, pero eso lo dejamos para otro día. 

Lo que he aprendido: scraping con Julia

Tengo la intuición de que los artículos de los periódicos son cada vez más sencillos, de que se usan frases más cortas y palabras más comunes. Es posible que se deba a que yo me culturizo con la edad y que, por lo tanto, no tengo la misma percepción de la complejidad que tenía hace unos años. Como cuando veo Saber y ganar y me sé las respuestas, bueno, las es igual exagerar un poco. O puede ser que ocurra como con Willy Fogg, que hizo que una generación entera se criara oyendo a un león en traje decir “detrás de usted, estimado caballero” o frases del estilo, mientras que los dibujos de ahora hablan más en la línea de la chavalada.

Como navego entre la fina línea que separa la cordura de la sinrazón, he pensado que podría analizar diferentes periódicos en diferentes épocas y ver si mi hipótesis (ha evolucionado de intuición a hipótesis ¿habéis visto?) es correcta. Soy una científica, qué leches. Y de ahí el título de esta entrada: cuando una quiere analizar textos, necesita primero conseguirlos y qué mejor manera que usar una técnica que no puede estar más de moda.

Antes de contar qué he hecho va un disclaimer: esto es el resultado de un par de tardes de investigación por parte de alguien que no sabe programar en general y menos en Julia en particular pero que, imbuida por el espíritu hacker, se ha puesto a darle a todos los botones hasta que ha conseguido algo que más o menos funciona. Así funciona la ingeniería, hermanos.

Lo que he entendido sobre el scrapeo

Veamos, si yo me he empanado de algo, scrapear consiste en crear un robot que navegue por una web como si fuera un humano y se descargue algún tipo de dato para luego analizarlo. Para ello, básicamente hay que localizar en el código fuente de la página el elemento en cuestión para decirle a nuestro robot a dónde debe ir y qué debe filtrar.

En mi caso, fui a la hemeroteca de El País para un día determinado, localicé la url de las noticias de ese día y, para cada una de ellas, descargué el texto. Todo ello lo hice con Julia, que se note que estoy aprendiendo.

Scrapear con Julia

Utilicé los siguiente paquetes:

  • HTTP: nos da funcionalidad cliente/servidor HTTP, lo usé para descargar el HTML de la página.
  • Gumbo: un parser HTML, convierte el HTML en un árbol formado por nodos y elementos.
  • Cascadia: un selector CSS, permite filtrar el output de Gumbo por clase o tipo de elemento, por ejemplo.
  • AbstractTrees: sirve para manejar datos de tipo árbol, útil para pasear por los árboles que genera Gumbo.

Seguramente se podría hacer con otros, pero los ejemplos que fusilé y remezclé utilizaban estos, así que para qué complicarse. Los instalé con pkg desde la terminal de Julia.

El proceso tuvo dos partes: localizar las noticias y extraer el texto de cada una de ellas.

Localizar las noticias

Para localizar las noticias, fui a la hemeroteca, elegí una fecha y me fijé en que la url a la que me mandaba era https://elpais.com/tag/fecha/AAAAMMDD donde AAAAMMDD es la fecha con los cuatro dígitos del año (AAAA), seguido de los dos dígitos del mes (MM) y los dos del día (DD).

Una vez ahí, vi que cada una de las noticias estaba dentro de un elemento cuya clase era articulo-titulo y que contenía la dirección de la noticia en cuestión. Así, si conseguía extraer la url de cada noticia, podría hacer que mi robot fuera a esa dirección y descargase el texto.

Hice lo siguiente:

date = 19851010 # Elegir una fecha
url = "https://elpais.com/tag/fecha/"*date # Montar la url
res = HTTP.get(url) # Descargar HTML
body = String(res.body) # Convertir a texto
html = parsehtml(body) # Parsear HTML
articles = eachmatch(sel".articulo-titulo", html.root); # Seleccionar los elementos que contienen las noticias

# Para cada noticia
for f in PreOrderDFS(articles) # Pasea por los elementos
   if f isa HTMLElement{:a} # Si es un enlace
       url = getattr(f,"href") # Extrae la url
       # TODO: extraer texto de cada noticia
   end
end

Faltaba extraer el texto de cada noticia.

Extraer el texto

Despues, fui a varias noticias y vi que el texto de la noticia en sí estaba dentro de un elemento de clase articulo-cuerpo. Ese elemento estaba formado por otros elementos que estaban formados por otros hasta llegar a los elementos HTMLText que contenían el texto. Solo tenía que pasearme por las hojas (los elementos del árbol que no tienen a su vez elementos) extraer su texto y empalmar los trozos, saltando una línea en el caso de que el texto viniese de un párrafo, sin saltar si no.

Escribí este código y lo introduje en el TODO anterior:

html = parsed(url) # Parsear HTML
content = eachmatch(sel".articulo-cuerpo", html.root) # Seleccionar cuerpo
texto = "" # Inicialización
for elem in Leaves(content) # Pasear por las hojas
   if elem isa HTMLText # Si el elemento es texto
   # Si el texto viene de un párrafo saltar línea
       if elem.parent isa HTMLElement{:p}
           texto = texto*text(elem)*"\n"
       else
           texto = texto*text(elem) # Unir a lo anterior
       end
    end
end

Juntando todo, extrayendo el código repetido en un par de funciones y metiendo los textos de las noticias en un array, me quedó:

using HTTP, Gumbo, Cascadia, AbstractTrees

"""
    getText(HTMLNode)
Extrae texto de objeto HTMLNode
"""
function getText(content)
texto = ""
for elem in Leaves(content)
    if elem isa HTMLText
        # Si el texto viene de un párrafo saltar línea
        if elem.parent isa HTMLElement{:p}
           texto = texto*text(elem)*"\n"
        else
           texto = texto*text(elem)
        end
    end
end
return texto
end

"""
   parsed(url)
Devuelve HTML parseado a partir de URL
"""
function parsed(url)
res = HTTP.get(url)
body = String(res.body)
html = parsehtml(body)
return html
end

"""
   scrapElPais(date)
Descarga las noticias de El País para una fecha dada como AAAAMMDD
"""
function scrapElPais(date)
url = "https://elpais.com/tag/fecha/"*date
html = parsed(url)
articles = eachmatch(sel".articulo-titulo", html.root);
# Inicializar matriz que contendrá textos
raw = String[]
for f in PreOrderDFS(articles)
    if f isa HTMLElement{:a}
       url = getattr(f,"href")
       html = parsed(url)
       content = eachmatch(sel".articulo-cuerpo", html.root)
       articleText = getText(content)
       append!(raw, [articleText])
   end
end
return raw
end
################# MAIN #######################
date = "19760504" # Fecha de las noticias
news = scrapElPais(date)

Y así es cómo se scrapea un periódico sin saber scrapear ni programar ni entender cómo funciona la web. Evidentemente, esto se puede afinar, lo iré haciendo y os contaré. Ahora voy a tratar los datos: contaré el número de palabras total, por párrafo y por frase y miraré cuántas palabras aparecen en la lista de palabras más comunes. Será divertido.

Por cierto, WordPress me revienta la indentación y no tiene resaltador de sintaxis para Julia (estoy usando la de Python), para algo más decente tenéis el snippet de Gitlab.

Referencias

Julia: Introduction to Web Scraping (PHIVOLCS’ Seismic Events)

Web scraping with Julia

Web scraping en diferentes lenguajes en Rosetta Code


Os dejo con rap en galego:

En qué ando: mayo

Si abril fue el mes de cuidar la tierra, mayo ha sido el de recoger sus frutos. He comido y regalado lechugas, echado rúcula del huerto a la ensalada y fabricado tortilla de espinaca gigante recién recogida. He plantado tomates, les he puesto palos y me he clavado un pincho del naranjo en la cabeza en el proceso. Todo por ser una agricultora miope. He puesto las calabazas en el jardín y pronto me tocará hacer semillero del resto de las verduras de invierno.

Es una maravilla tener un huerto, no sé cómo no he empezado antes. Es junto con hacer mi propio pan (¡seis años ya de masa madre!) y mis propios yogures (¡desde el 2016!) la mejor decisión que he tomado en la vida. Me falta solo cultivar cereal y ya (casi) podré desconectarme de la sociedad.

La pega es que todo este trajín hortícola no me ha dejado mucho tiempo para dedicarle al blog, solo he escrito sobre ecuaciones diferenciales y notas en LaTeX, y he compartido la receta del bizcocho de calabaza que suelo hacer. Bueno, y me puse intensita un día con la ingeniería. También ando haciendo un estudio sobre los rastreadores en las páginas de los periódicos, pero sabe dios cuándo lo acabaré.

Otra de mis limitaciones blogueriles ha sido que he estado haciendo cosas IRL: me apunté a un curso de comunicación en el currelo; fui a un par de presentaciones de libros; me invitaron a un congreso; estuve hablando con la gente de Finantzaz haratago y les di la turra para que se pasasen a las redes libres (y se pasaron), descubrí por mi hermano un proyecto de un internet paralelo basado en pollos… Vamos, lo normal.

Algunas cosas interesantes

Artículos

Enlazo aquí algunas cosas que he leído, hilando con lo que comentaba antes del rastreo recomiendo usar uBlock Origin y Privacy Badger para entrar en los artículos, sobre todo los de los periódicos.

Libros

Tras mi incursión en las letras he vuelto a las matemáticas, sigo poco a poco con Gödel, Escher, Bach que leo siguiendo el curso del MIT al respecto y estoy leyendo a desgana Weapons of math destruction, que me recomendaron. Como académica elitista que soy, detesto los títulos sensacionalistas y la superficialidad en los análisis.

Sobre todo y ante todo me he obsesionado con un libro sobre la autosuficiencia: The new complete book of self-suffienciency. The classic guide for realists and dreamers y me dedico a leer sobre verduras, cerveza y fabricar mi propio horno con mis propios ladrillos. He llegado a la conclusión de que es tarde para volverme normal así que voy a abrazar mi locura.

Venga, va, lo confieso: no he abandonado las letras. Siguiendo con mi vieja costumbre de leer cosas que no entiendo, he leído The rhetorics of economics y ando enamorada de Contar es escuchar, una recopilación de textos de no ficción de Ursula K. Le Guin en el que se reflexiona sobre la lectura y la escritura. Son especialmente hermosas las partes que tratan la relación entre el escritor y lector, la escritora y la lectora en este caso. También cometí el grave error de entrar en el Diccionario panhispánico de dudas; ahí sigo.

Podcasts


Ya es casi verano, bailemos.

De mayor quiero ser ingeniera

UPDATE: thanks to JordiGH, there is a translation of the post to English after the original


Cuando era pequeña leía y dibujaba todo el rato. Leía tanto que me tuvieron que pasar a la sección de adultos antes de la cuenta porque me había quedado sin opciones. Y dibujaba. El manga se puso de moda cuando yo tenía unos once o doce años así que aprendí a dibujar por mi cuenta y me entretenía en clase. Prestar atención no merecía la pena y hablar con mis compañeros… es largo de contar.

A pesar de esto (o precisamente por esto), siempre me han fascinado la ciencia y, sobre todo, las matemáticas. Hay algo hermoso en poder plasmar la realidad en unos símbolos en un papel, en predecir el comportamiento de un objeto, en comprender cómo funciona una máquina. Así, como era lista y las letras no valen para nada (¿a quién no le han dicho esto?) acabé estudiando una ingeniería.

De la carrera mejor no hablar: me dieron soluciones a problemas que no tenía, los problemas que tenía se quedaron sin resolver. Pero la saqué. Hice un master. Una tesis. Un postdoc. Los problemas siguieron ahí. La rueda siguió adelante.

Durante años pensé que no era una ingeniera de verdad porque seguía dedicándole mi tiempo libre al arte, a la literatura, no como todas esas personas a mi alrededor que hablaban de coches y estructuras y código en su tiempo libre, que leían sobre nuevos avances tecnológicos para no quedarse atrás mientras yo lo único que quería era salir a la calle con mis acuarelas. Pensé que no podía ser una ingeniera de verdad porque pensaba que el progreso por el progreso no nos llevaba a ningún sitio, porque quería desarrollar tecnología humana y respetuosa con el planeta, porque no quería vivir en un mundo controlado por un puñado de empresas, porque quería resolver problemas reales que afectasen a personas reales. Porque quería, en definitiva, hacer del mundo un lugar mejor. 

Era una loca por no querer un trabajo bien pagado, a quién le importaba que fuera repetitivo e inútil.

En las letras no me trataron mejor: era el enemigo. Destruía empleos. Era cabezacuadrada y carente de creatividad. Quería someter al ser humano a los designios de la tecnología. Nunca quise, pero no importó. Y me quedé en el gris: demasiado artística para encajar en la ingeniería, demasiado ingenieril para encajar en las artes o en las letras.

De esta situación me sacó, como tantas veces en la vida, la lectura. La ingeniería como disciplina donde señores de traje discuten sobre hojas de cálculo es un invento reciente. Hace años había hombres y mujeres que creaban cosas a partir de su imaginación, que escribían textos hermosos y compartían sus conocimientos. Personas valoraban la estética y la elegancia de sus inventos y no eran por ello peores científicas o tecnólogas. Personas que cambiaron de verdad el mundo.

Así, tantos años después de elegir una carrera prácticamente al azar, después de haber pensado que me había equivocado de vida, ahora digo, por fin convencida: de mayor quiero ser ingeniera.


When I was little, I used to read and draw all the time. I read so much that they had to move me to the adult section prematurely because I had ran out of options. And I drew. Manga got popular when I was around eleven or twelve, so I learned to draw on my own and I amused myself in class. It wasn’t worth it to pay attention, and talking with my classmates… it’s a long story.

Despite this (or precisely due to this), I’ve always been fascinated by science, and especially by mathematics. There is something beautiful about being able to capture reality with some symbols on paper, about predicting the behaviour of an object, about learning how a machine works. Thus, since I was smart and art is worthless (who hasn’t heard this?), I ended up studying engineering.

Best to not talk about my undergrad: they gave me solutions to problems I didn’t have, and the problems I did have remained unsolved. But I did it. I did a master’s. A thesis. A postdoc. The problems were still there. The wheel moved forward.

For years I thought that I wasn’t a real engineer because I kept spending my free time on art, on literature, not like all the people around me who talked about cars and structures and code in their free time, who read about new technological advances so they wouldn’t be left behind while all I wanted was to go out to the street with my watercolours. I thought I couldn’t be a real engineer because I thought that progress for its own sake would take us nowhere, because I wanted to develop a humane technology that would respect the planet, because I didn’t want to live in a world controlled by a handful of corporations, because I wanted to solve real problems that impacted real people. Because I wanted, unequivocally, to make the world a better place.

I was crazy for not wanting a well-paying job. Who cares if it was repetitive or useless.

In the humanities they were not kinder to me: I was the enemy. I destroyed jobs. I was a square who lacked creativity. I wanted to make human beings submit to the whims of technology. I never wanted to, but it didn’t matter. And I remained in a grey area: too artistic to fit into engineering, too engineery to fit into art or literature.

As so often it happens in life, reading brought me out of this situation. Engineering as a discipline in which men in suits discuss spreadsheets is a recent invention. Some years ago there were men and women who created things out of sheer imagination, who wrote beautiful texts and shared their knowledge. People valued aesthetics and the elegance of their inventions, and this didn’t make them worse scientists or technologists. People who really changed the world.

And so, after picking a major practically at random, after thinking that I had chosen the wrong life, I say, at last with conviction: I want to be an engineer when I grow up.

Lo que he aprendido: lista de tareas en un documento en LaTeX

Generalmente, tanto cuando escribo algún texto como cuando “programo” me escribo comentarios a mí misma para recordarme lo que tengo que hacer en el futuro. Esos comentarios empiezan por TODO para que me resulte sencillo recuperarlos todos con un simple grep.

Este sistema es simple y eficaz, pero hay ocasiones en las que me gustaría exportar esos comentarios para mí misma al documento que estoy escribiendo, bien para leerlo en su formato final, bien para indicar algunas cosas a mejorar cuando comparto el borrador con algún colaborador.

Como yo siempre escribo en LaTeX, para estos casos he comenzado a utilizar el paquete todonotes que permite anotar el texto en diferentes colores, añadir una señal que indica que falta una figura, o crear una lista de tareas pendientes al final del documento.

Es un paquetillo muy sencillo de utilizar:

  • Se añade una nota a un párrafo en el margen con \todo{Texto de la nota}
  • Se añade una nota en línea con el texto con \todo[inline]{Texto de la nota}
  • Se añade una figura de mentira para avisar de una que falta con \missingfigure{Descripción de la figura}
  • Se incluye una lista de tareas con \listoftodos, esta lista tendrá unos cuadraditos de colores si le pasamos la opción colorinlistoftodos al paquete
  • Soporta varios idiomas, que se mandan como opción cuando llamamos al paquete
  • Si le pasamos la opción disable al paquete nos ventilamos todas las notas

Me parece especialmente práctico si asignamos significado a algunos colores, ya que así podemos ver rápidamente qué nos falta por hacer.

Os dejo para terminar un ejemplo en el que he usado hyperref para al pinchar en la tarea correspondiente nos envíe al lugar donde debemos trabajar:

\documentclass[a4paper]{article}

\usepackage[colorinlistoftodos, spanish, textsize=small]{todonotes}
\usepackage[hidelinks]{hyperref} % hidelinks para que no pinte el cuadrado
\usepackage{lipsum} % texto de prueba

\begin{document}

\lipsum[1]\todo{Reescribir sección}
\lipsum[2]\todo[inline]{Añadir referencias}
\lipsum[3]\todo[inline, color=green]{Comentar los resultados}

\missingfigure{Gráfico mostrando la relación entre las variables}

\listoftodos

\end{document}

Obtendríamos algo así:

tareas

Como siempre, esto es LaTeX, así que podemos cambiar todo lo que nos apetezca. Espero que os resulte útil y que me contéis vuestros trucos.

Referencias

El paquete todonotes en CTAN

How to add todo notes? en StackExchange


Suena:

Lo que he aprendido: plano de fase con PyPlot en Julia

Todo comenzó porque estaba resolviendo numéricamente una ecuación diferencial ordinaria (EDO para los amigos) y quería ver su comportamiento para diferentes condiciones iniciales. ¿Y cuál es la mejor herramienta para eso? El plano de fase. Así que pinté uno en Matlab y luego, como yo no soy de quedarme satisfecha al terminar algo, me pregunté: ¿cómo se hará esta historieta en Julia?

Después de hurgar en la documentación, dar a todos los botones y pintar cosas sin sentido alguno, lo conseguí con PyPlot, uno de los paquetes que se pueden usar en Julia para hacer gráficos.

Os cuento cómo calculé y cómo pinté. Todo es para Julia 1.0.

Unas notas sobre PyPlot

Antes de meternos en harina, no está de más recordar que Julia permite utilizar diferentes paquetes para dibujar, están entre otros el mítico Plots; GR, que va como un tiro y el que he usado yo esta vez: PyPlot, que es una interfaz para Julia del Matplotlib de Python.

No tengo especial predilección por este paquete, simplemente encontré un ejemplo que se parecía a lo que yo quería hacer y seguí la norma básica de la ingeniería: no reinventar la rueda. Norma especialmente certera cuando eres ingeniera mecánica.

Debo añadir también que PyPlot me funcionó directamente, probablemente porque tenía Miniconda instalado y tal vez Matplotlib también. Ni idea. Estoy todo el rato probando chismes, no sé ya ni lo que hago.

En fin, los gráficos en PyPlot funcionan casi como los de Matlab excepto por un par de cosas que a mí me dejaron loca y os pongo aquí para que no os pase lo mismo:

  • Para mostrar la figura actual en una ventana necesitamos hacer gcf() (get current figure), al menos desde un script.
  • PyPlot añade por defecto las figuras encima de las que ya había. Antes había opción hold on como en Matlab pero se desaconseja su uso.
  • A veces no querremos añadir las figuras encima, para borrar anterior tenemos clf() (clear figure)

Sabiendo esto ya podemos hacer gráficos sin control.

El plano de fase

Para que todo el rollo de la ecuación diferencial sea un poco menos abstracto os voy a dar un poco de contexto: estoy estudiando un sistema de un grado de libertad, es decir, una masa atada a una pared mediante un muelle y un amortiguador.

De esta manera, el plano de fase consiste en un gráfico en el que se representa la posición de la masa en el eje horizontal y su velocidad en el vertical y se pintan unas flechillas que indican la dirección en la que saldrá el sistema al darle unas condiciones iniciales de posición y velocidad.

Nos sirve para ver si aumenta o se reduce su velocidad, tiende hacia una posición de equilibrio o no, o para hacer bonito en un paper, la finalidad última de toda nuestra investigación.

Bien, la ecuación que describe el movimiento del sistema de un grado de libertad es la siguiente:

m\ddot{x} + c\dot{x}+kx = 0

donde el puntico hace referencia a la derivada respecto al tiempo y dos punticos a la segunda derivada. Los valores m (masa), c (amortiguamiento) y k (rigidez) son características del sistema y son conocidos.

Voy a hacer una magia todo loca y convertir la ecuación de segundo orden en dos ecuaciones de primer orden. La primera va a ser simplemente el cambio de variable:

v = \dot{x}

osease: que la velocidad es la derivada de la posición respecto al tiempo.

La segunda proviene de la ecuación original y viene a decir que la segunda derivada de la posición (la aceleración) es la primera derivada de la velocidad y por lo tanto:

\dot{v} = \ddot{x}= -\frac{k}{m}x - \frac{c}{m}v

Si cogemos las dos ecuaciones, reorganizamos de tal manera que las cosas con puntico estén a la izquierda y escribimos el sistema en forma matricial tenemos lo siguiente:

\begin{bmatrix}\dot{x}\\\dot{v}\end{bmatrix} =  \begin{bmatrix}0 & 1\\-k/m& -c/m\end{bmatrix}  \begin{bmatrix}x\\v\end{bmatrix}

Todo este lío nos lleva a algo, paciencia. La cuestión es que queremos ver cómo cambia la posición y la velocidad en cada punto. ¿Y qué cacharro matemático explica cómo cambian las cosas? Exactamente, la derivada. Derivada que precisamente tenemos explícitamente representada en el sistema de ecuaciones.

¿Por qué digo eso? Si yo quiero saber cuánto valen las derivadas de mis variables en el punto (1,0) no tengo más que sustituirlo en la ecuación:

\begin{bmatrix}\dot{x}\\\dot{v}\end{bmatrix} =  \begin{bmatrix}0 & 1\\-k/m& -c/m\end{bmatrix}  \begin{bmatrix}1\\0\end{bmatrix}

como m, c y k son valores conocidos, puedo obtener los valores de las derivadas. Sabiendo esto, puedo pintar una flechillas en el plano que indiquen hacia dónde tiende el sistema si le doy determinadas condiciones iniciales.

Antes de pintar las flechillas, os dejo aquí la función que he escrito en Julia para calcular las derivadas de la posición y el desplazamiento en diferentes puntos del plano. Como es una función genérica, he utilizado x e y para referirme a las variables y u y v para referirme a los cambios en cada punto y no para lo mismo que en el texto. Es aposta para confundir.

Perdonadme la falta de eficiencia y el probable uso de estructuras ridículas, soy novata.

"""
vectorfield(R, [x1 x2 y1 y2])

Calcula el plano de fase de una ecuación diferencial

Input
- R: matriz de coeficientes
- span: límites del campo [x1 x2 y1 y2]

Output
- x : posición
- y : velocidad
- u : vector de desplazamiento en un punto (x,y)
- v : vector de velocidad en un punto (x,y)
"""
function vectorfield(R, span)
# Span
x = range(span[1],span[2],length=20)
y = range(span[3],span[4],length=20)

# Rejilla de puntos
x = repeat(x', length(x)) # solo repite filas
y = repeat(y, 1, length(y))

# Inicialización
u = zeros(size(x));
v = zeros(size(y));

# Derivada en cada punto
for i = 1:size(x,1)*size(x,2)
  der = R*[x[i]; y[i]];
  u[i] = der[1];
  v[i] = der[2];
end

return (x,y,u,v)
end

Trayectoria: Euler progresivo

Antes de que pintemos el gráfico, en plan bonus voy a contar aquí cómo he simulado el comportamiento del sistema en el tiempo con un Euler progresivo, el método más sencillo para resolver una ecuación diferencial numéricamente.

Básicamente consiste en echar una línea desde el primer punto, que conocemos al ser las condiciones iniciales, hasta un poquito más lejos. La línea en cuestión tendrá la pendiente de la derivada en el punto inicial, que conocemos ya que nos la da la ecuación diferencial. Una vez que hemos llegado al segundo punto, tiramos otra línea y así poco a poco vamos avanzando.

Es decir, en el instante de tiempo i+1 x valdrá lo que valía en el instante i más el cambio:

x_{i+1} = x_i + \dot{x_i}h

siendo h el paso que damos en el tiempo.

He escrito una función que me calcula la posición y velocidad del sistema en el tiempo. ¡Cuidado si le quitáis el amortiguamiento que se vuelve inestable! Temas numéricos eh, no se volvería inestable en la realidad.

"""
euler(R, ic, N, h)

Calcula la respuesta a una ecuación diferencial con Euler progresivo

Input
- R  : matrices en Y(t+1) = Y(t) + h*R*Y(t)
- ic : condiciones iniciales
- N  : número de puntos
- h  : paso

Output
- x, v : desplazamiento y velocidad del sistema en el tiempo
"""
function euler(R, ic, N, h)

Y = zeros(2,N);
Y[:,1] = ic;

for t = 1:(N-1)
 Y[:,t+1] = Y[:,t] + h*R*Y[:,t];
end

x = Y[1,:];
v = Y[2,:];

return (x, v)
end

El dibujo final

Ahora que ya sabemos cuánto cambian tanto la posición y la velocidad en los puntos del plano y hemos calculado la trayectoria para un caso concreto, vamos a pintar. Para ello he usado la función quiver que, dándole la posición y los componentes en ambas direcciones, pinta unas simpáticas flechillas.

using PyPlot

# Datos del sistema
m = 1
k = 1
cc = 2*sqrt(k*m)
xi = 0.3
c = xi*cc

# Datos de la simulación
N = 1000
ti = 0
tf = 50
t = range(ti,tf,length=N)
h = t[2]-t[1]

ic = [1 0]'
R  = [0 1; -k/m -c/m]
F  = zeros(2,N)

# Trayectoria
x,v = euler(R, F, ic, N, h)

clf()
plot(x,v)
gcf()

# Plano de fase
span = [-1 1 -1 1]
x,y,u,v = vectorfield(R, span)
q = quiver(x,y,u,v,color="gray")
xlabel("x")
ylabel("v")
gcf()

Así, nos aparece este gráfico:

phase

Aparte de ser muy cuco, este gráfico nos indica que si le damos cualquier tipo de condición inicial a nuestro sistema, tenderá a pararse: todas las flechitas llevan al punto (0,0). O como diría yo si me quiero hacer la interesante: las raíces de este sistema son complejas con parte real negativa.

Y hasta aquí hemos llegado, os dejo una pregunta de deberes: ¿qué pinta creéis que tendría el plano de fase si le quitásemos el amortiguamiento? Contadme vuestras sospechas.

Referencias

Ejemplos de gráficos en Julia


Os dejo con la canción más bonita del mundo.

Camino a la panificación: bizcocho de calabaza

Hoy traigo un bizcocho que suelo hacer a menudo, es poco dulce, húmedo y denso, como me gustan a mí los bizcochos. Suelo aprovechar para asar una calabacilla de campana cuando hago pan, se aprovecha mejor el calor y luego hay deliciosa calabaza asada para bizcochar, risottear o hacer delicioso hummus calabácido (con la tortilla de patata y el miso mi alimento favorito del mundo).

El último que hice tuvo el mérito añadido de proceder de una calabaza producida por mi huerto. Metros y metros cuadrados de plantas de calabaza que produjeron exactamente dos calabazas. En fin, os dejo mi proceso de crear bizcocho naranja.

Bizcocho de calabaza

  • Dificultad: echar productos en un bol
  • Imprimir

Verdura en el dulce




Ingredientes

  • 280g calabaza asada
  • 200g yogur líquido casero
  • 60g aceite
  • 2 huevos
  • 260g harina integral de espelta
  • 100g azúcar
  • 1 cucharadita levadura
  • 1 cucharadita bicarbonato
  • 2 cucharaditas especias (canela, jengibre, nuez moscada)

Direcciones

  1. Bato los huevos con el azúcar con brío con las varillas.
  2. Añado el aceite y el yogur y bato más.
  3. Agrego la harina con la levadura, el bicarbonato y las especias y mezclo, esta vez con una cuchara, lengua o similar.
  4. Uno la pulpa de calabaza asada a la mezcla con la cuchara.
  5. Horneo en horno precalentado a 180C durante 40′.

¡La próxima vez que lo haga a ver si le saco foto!

En qué ando: abril

El mes de abril ha estado marcado por mi trabajo en el huerto: plantar, desherbar, regar y ver crecer la vida. Abril ha sido un mes de introspección, así que he escrito poco y leído mucho. Solté un poco de lastre escribiendo una cosa rara sobre la vida gracias a la cual me ha escrito mucha gente. Es curioso cómo ha llenado la gente los huecos y ha interpretado el texto según su propia experiencia. Es lo que quería y me alegro de haberlo conseguido.

Lechuga de hoja de roble en primer plano, rúcula e hinojo detrás

Luego ya volví al Emacs, con un truquillo sobre el buffer de paquetes y aprendí a hacer tests unitarios en Matlab.

Algunas cosas interesantes

Este mes he leído muchísimo. He recuperado el vicio lector de cuando era adolescente después de unos cuantos años de desconexión. Supongo que tiene relación con leer cosas buenas. Listo aquí unas pocas.

Sigue leyendo