Archivo del Autor: Ondiz

Acerca de Ondiz

Doctora en ingeniería. Loca del software libre. Haciendo GNU/Linux más accesible para mí y de paso para los demás. También hago pan.

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? 

En qué ando: agosto

En agosto he estado vacacionando así que he escrito poca cosa. He conseguido, eso sí, tener un entorno funcional para programar en Julia en Emacs en GNU/Linux. Sí, todos esos «en» son necesarios, son las inevitables condiciones de contorno del conocimiento de una. El artículo al respecto apareció además en la recopilación de noticias emacseras de la grandísima Sacha Chua y casi lloro de la ilusión.

Podría parecer que mi locura va a peor y que me estoy adentrando en terreno ignoto (no lo descarto), pero que esté últimamente jugando a programar tiene un sentido: no tengo muy claro que vaya a haber curro de lo mío en los próximos tiempos (los tiempos en los que se me acabe a mí el contrato, entiéndase). De ahí que busque un proyecto para aprender y afianzar conocimientos, tal vez en un futuro no muy lejano me tenga que reajustar.

Aparte de preocuparme de mi futuro laboral, también escribí sobre el propio blog, produje tomates y me abandoné a mi habitual misantropía con mayor ahínco de lo normal.

Algunas cosas interesantes

He aprovechado el tiempo libre para leer, os dejo una selección de cosas. Como siempre, gracias a los que compartís cosas molonas por la red.

Artículos

Libros

He terminado Armas, gérmenes y acero, una recomendación fediversil que trata sobre los hechos que llevaron a la actual distribución humana en el planeta. Hechos que se remontan a la prehistoria y que desmontan payasadas racistas varias. Es biogeografía, linguística, historia … las drogas que me gustan a mí.

También leí Capitalismo terminal porque me generó curiosidad el episodio de La linterna al respecto y que cito más abajo. Me ha hecho sentir entendida este libro. En los entornos en los que me muevo suelo tener la idea equivocada diferente en todos los temas todo el rato, ver que hay personas ahí fuera con las que coincido me renueva las ganas de seguir discutiendo. Es especialmente recomendable el apartado «La tecnología como conocimiento aplicado» para cualquiera que tenga un trabajo cualificado y no haya adquirido conciencia de clase. Yo la adquirí con diecisiete años el primer día de carrera, un día igual os cuento la historia.

Por cierto, suelo compartir aquí solo ensayo, pero también leo novela. Bueno, y poesía y relatos y teatro y los ingredientes del champú. Digamos que tengo dos modalidades de lectura: leo o bien por placer estético o por curiosidad intelectual. Generalmente escribo aquí solo los libros que pertenecen a la segunda categoría.

Podcasts

  • Capitalismo terminal. Anotaciones a la sociedad implosiva en la Linterna de Diógenes: sobre el capitalismo como relación social, organización de las fábricas y lucha obrera. Mi parte favorita es la visión del JIT tan opuesta a la que me dieron en la carrera, tan objetiva y carente de ideología ella. El libro lo publicó Traficantes de Sueños con licencia libre, por cierto.

  • Despertar Del Sueño Tecnológico también en La linterna: sobre un libro del que ya hablé aquí así que no me repito. Hubo un momento en que tuve que rebobinar, a ver si sabéis dónde.

Vídeos

  • Aesthetics de Contrapoints: una conversación sobre género y estética.

  • Climate grief de Philosophy Tube: sobre el cambio climático.

Meta: ¿de qué va esto?

Llevo ya un tiempo en esto de tener un blog. Empecé a escribirlo para soltar (parte de) lo que sentía y pensaba. Soy mucho de sentir y pensar y eso es malo para mi (precaria) salud mental. Luego empecé a anotar lo que aprendía para no olvidarlo. Más tarde decidí compartir mis experimentos culinarios (¿panarios?). Por último, pensé que compartir mis lecturas haría que se comprendiese mejor de qué va este blog.

Porque, ¿de qué va este blog? O mejor dicho: ¿va de algo este blog?

Para contestar a esa pregunta necesitamos un poco de contexto. Siempre he sido muy curiosa, me gusta hacer las cosas yo misma para entender cómo funcionan, me gusta tocar, crear con mis manitas. Esta costumbre (o vicio) fue a peor durante la carrera y todavía a más durante la tesis, supongo que como respuesta al desarraigo de la realidad que suponen ambos, digamos, procesos (de forja y revenido). Me explico: la carrera me dio respuestas a problemas que no tenía mientras dejó sin contestar las preguntas que me llevaron a estudiarla; la tesis me dio herramientas para resolver problemas tan alejados del mundo real que dejan de ser problemas.

De ahí que tomar el control de mi tecnología, decidir qué sistema operativo usa, qué programas, ver qué hacen por dentro, no contentarme con lo que me dan se convirtiera en una manera de (re)aterrizar. Lo mismo con el pan: vivimos en un mundo de tomates en invierno. Un mundo en el que montarse en la cinta que nos transporta por la vida y que va parando en las paradas correctas es extremadamente fácil, pero en el que bajarse y elegir parada es increíblemente difícil.

Yo me niego a dejarme llevar sin cuestionamiento: reivindico el camino difícil. Y voy más allá: sostengo que no es
tan difícil. Este blog es por lo tanto la crónica de mi exploración de lo difícil, un intento de demostrar que se puede una acercar a cualquier tema y llegar a comprender, una invitación a pasear conmigo por los mundos ignotos. Eso sí, con muy poca seriedad y compartiendo saberes, que bastante hacemos llevando la contraria al mundo.

Además, como mi plan para que me amancebe un millonario y pueda llevar a cabo mi sueño de infancia de montar un ateneo libertario con su fanzine y su radio ilegal sigue en marcha, tal vez algún día pueda hacer esto mismo en el mundo real.

Hasta entonces, aquí seguimos.

¿Exploráis conmigo?


Os dejo con un señor tocando el piano:

Lo que he aprendido: Julia en Emacs

He conseguido por fin poder programar en Julia usando Emacs. Eh, que no ha sido tan fácil: algo tan sencillo como instalar el julia-mode y el ess se convirtió en un infierno. Me pasó de todo.

Primero en GNU/Linux, como no estaba usando la versión más novedosa de elementary, el Emacs de los repositorios era demasiado antiguo y no compatible con los modos que me hacían falta. Me quedaban varias opciones: (i) actualizar el sistema (lo que finalmente hice); (ii) añadir un ppa con un Emacs más moderno (bien, pero prefiero tener los paquetes de mi distro que ya he organizado alguna petarda); o (iii) compilar Emacs desde fuente (ya lo hice alguna vez y no me apetecía repetir).

Luego en Windows, donde sí tenía un Emacs lo suficientemente moderno, parece ser que Julia tiene no sé que bug y se cuelga y hay que darle a C-g para que se reviva.

En fin, que actualicé el sistema operativo y en quince minutos ya tenía un entorno para programar en Julia. Bueno, eso en mi recién estrenado Juno, en Windows me conformo con Atom, ese editor que no es un editor. Qué dura es la vida a veces.

Después de contaros mis desventuras (para eso tengo un blog), paso a resumir qué hice la vez que funcionó todo.

Julia en GNU/Linux

Julia no está en los repos, nos dejan unos binarios genéricos para que descarguemos y ejecutemos sin más. Hay que elegir unos u otros según la arquitectura de nuestro procesador. Yo, como nunca sé qué tengo lo miro así:

ondiz@slimbook:~$ lscpu
Arquitectura:                        x86_64
modo(s) de operación de las CPUs:    32-bit, 64-bit

Descargados los binarios correspondientes, es útil crear un enlace simbólico a algún lugar donde ya estemos buscando ejecutables o añadir la carpeta donde los hemos descargado al PATH, a gusto del consumidor.

Yo he elegido la primera opción, así que he hecho:

sudo ln -s RUTA_A_EJECUTABLE /usr/local/bin/julia

Cuidadín que hay que poner la ruta absoluta al ejecutable bin/julia que si no no carrula.

Julia en Emacs

Pues lo que decía al principio: para tener un entorno chachi para programar en Julia solo hace falta instalar los modos julia-mode y ess. El primero es el modo oficial para editar Julia y el segundo es un paquete que ayuda a trabajar con lenguajes de programación para estadística (ESS viene de Emacs Speaks Statistics) como R, o en este caso, Julia. Se pueden hacer otras cosas, pero esta es la más simple en mi opinión.

Una vez instalados los modos, para activar una terminal juliana inferior solo hay que hacer M-x julia. Luego ya podemos abrir un archivo en la parte superior y jugar con opciones que nos da el modo ESS.

Llevo poco con el tema y solo he memorizado un par de combinaciones útiles (miento, no las he memorizado, las escribo aquí para mirarlas en el futuro):

  • C-c C-l: carga un archivo completo, lo que sería un include("archivo").

  • C-M-x: ejecuta (me encanta esta palabra) un trozo de código en el REPL.

  • C-c C-z: cambia del script al REPL o viceversa.

Hay también una pila de comandos para gestionar errores y para acceder a la documentación que algún día controlaré. O no. También me falta echarle un ojo a imenu anywhere para que me aparezcan opciones de autocompletado en cualquier lugar. Me lo dejo de deberes.

Curiosamente, lo que más trabajo me dio fue acostumbrarme a no darle a la flecha hacia arriba para repetir el último comando en el REPL. Aquí, como las combinaciones de GNU Readline están ya pilladas, hay que usar M-p y M-n (o C-↑ y C-↓) para moverse por la historia. Comint y cosas, ya sabéis, y si no, con hacer C-h b os enteráis.

Y hala, ya tengo un entorno para programar. Contadme qué usáis vosotros para que aprendamos todos, venga.

juliaEmacs

Referencias

Página oficial de Julia

Manual del modo ess

Julia en el modo ess

imenu anywhere en GitHub


Os dejo con un grupo cuyas canciones suelo berrear en los conciertos de las fiestas de los pueblos vecinos y que tiene el mérito de que no me quedase dormida encima del libro de física de primero de carrera. Era abrirlo y bostezar, oigan.

En qué ando: julio

Julio es para mí un mes de tránsito entre el trabajo y el ocio: ya se han acabado las clases, no hay pintura y tengo jornada reducida. Se ven pocas personas por el pueblo; todos se preparan para el largo domingo que es agosto. Suelo aprovechar este mes para reconectarme con mi parte analógica, que llega a su máxima expresión en las vacaciones: cocino, paseo y leo.

Este año el verano ha sido especialmente bienvenido porque ha traído consigo verduras verdaderas. Decidí empezar con el huerto hace solo cuatro meses y ha ido tomando espacio en el jardín y en mi vida. Tengo cuarenta plantas de tomate, dos aguacates, un frambueso, un granado, un tiesto con berros y ya he comido zanahorias, lechugas, rúcula, espinacas e hinojo.

Además, como me siento rara sin aprender un idioma, he retomado mi proyecto de aprender japonés. He pensado darle una oportunidad a la repetición espaciada y, como soy de la vieja escuela, me he fabricado una caja con sus tarjetas y sus separadores. Que sí, que podría usar una aplicación, pero aprendo mejor si puedo interactuar físicamente con el material, si puedo tocar. ¿Soy mayor? ¿Una romántica? ¿Odio la tecnología? ¿Un poco de todo? No lo sé. En fin, pronto cantaré la canción de Doraemon en versión original con acompañamiento de mandolina.

No he escrito gran cosa este mes, poco más que un articulillo sobre la bibliografía en castellano en LaTeX en la que filtré menos de lo normal y se ve que este no es un blog de tecnología sino de otra cosa.

He seguido haciendo cosas tecnológicas, claro, pero sin hablar de ellas. Actualicé a elementaryOS Juno sin mucho dolor, excepto por el rato en el que no podía bootear desde el USB y tuve que recurrir a Windows1. Sé que puedo hacer particiones y cosas pero suelo instalar desde cero porque así aprovecho y me quito mierdas. En realidad solo uso Emacs pero acabo acumulando programas porque me gusta jugar y, bueno, apt-get install es una tentación demasiado grande.

Algunas cosas interesantes

Lo bueno que tiene estar zen es que lee una mucho. Comparto algunas cosas, casi todas compartidas a su vez por mis vecinos de las redes.

Artículos

Libros

Se ha vuelto a cruzar en mi vida El elogio de la sombra, paseaba por la librería después de haber apañado Diario de un carpintero buscando Walden para releer. Era el libro de al lado. La última vez estaba pasando el tiempo en la sección de ensayo de la biblioteca cuando lo vi. Tiene la manía de inmiscuirse en mis asuntos.

Acabé también El capital en el siglo XXI porque lo tenía que devolver a la biblioteca. Tardé seis meses en leer las primeras 300 páginas y tres días en leer las últimas 300. Y buenos brazos que desarrollé de sujetarlo en alto. Ay, la miopía.

Podcasts

  • Amazon de Basetxe Gaztetxea: sobre la llegada de Amazon a Meatzaldea (el post está en euskera pero el audio en castellano).

  • Anarquistas De Ultramar; Mary Shelley y Frankenstein de La linterna de Diógenes: sobre pueblos que hacían la anarquía (y la siguen haciendo) antes de que existiera como concepto (a ver si se nos bajan los humitos a los occidentales) y una de las novelas que dio inicio a la ciencia ficción y que yo, como amante de la novela gótica, adoro.

Vídeos

Estoy siguiendo la serie de ecuaciones diferenciales del canal de YouTube 3Blue1Brown. Veo los vídeos con sentimientos mezclados: me alucina cómo explica y me cabrea que no me explicasen los conceptos así.

También he visto la serie de análisis de datos de Computerphile. No descarto que sea por el acento del señor, soy una amante de lo británico. Igual es el motivo de que siga desde hace años Philosophy Tube. Este mes he visto su último vídeo sobre trauma y abuso. Hay que hablar más de ello.


Os dejo con música. Punk con mujer al frente. No pensaba que pensaba que fuera a ver una banda joven con esa actitud: verlos en directo es volver a los noventa.

El punk vive.


  1. Casualmente tenía el ordenador del curro en casa, si no me vais a decir de dónde saco yo el Windows. 

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&amp;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.