<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
    <title>Daniel Molina Profile</title>
    <subtitle>Daniel Molina Blog and Profile</subtitle>
    <link rel="self" type="application/atom+xml" href="https://www.danimolina.net/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://www.danimolina.net"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-01-27T00:00:00+00:00</updated>
    <id>https://www.danimolina.net/atom.xml</id>
    <entry xml:lang="es">
        <title>Estancia en la Universidad de Surrey</title>
        <published>2026-01-27T00:00:00+00:00</published>
        <updated>2026-01-27T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.danimolina.net/posts/university-of-surrey/"/>
        <id>https://www.danimolina.net/posts/university-of-surrey/</id>
        
        <content type="html" xml:base="https://www.danimolina.net/posts/university-of-surrey/">&lt;p&gt;Desde este año, estoy realizando una estancia en la &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.surrey.ac.uk&#x2F;&quot;&gt;Universidad de Surrey&lt;&#x2F;a&gt;. Esta universidad tiene un campus agradable y está ubicada en &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.guildford.gov.uk&#x2F;&quot;&gt;Guildford&lt;&#x2F;a&gt;, a unos 40-50 minutos de Londres en tren.&lt;&#x2F;p&gt;
&lt;p&gt;He venido aquí para conocer a más gente y empezar una colaboración con &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.surrey.ac.uk&#x2F;people&#x2F;ferrante-neri&quot;&gt;Ferrante Neri&lt;&#x2F;a&gt;, un investigador muy &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;scholar.google.com&#x2F;citations?user=h0JDq7sAAAAJ&amp;amp;hl=en&quot;&gt;productivo&lt;&#x2F;a&gt; con una larga experiencia en Computación Evolutiva que ha sido capaz de adaptar su investigación a Neuroevolución y otros temas interesantes. Actualmente, compartimos una línea de investigación con uno de mis estudiantes de doctorado, Abel, sobre NAS utilizando Computación Evolutiva.&lt;&#x2F;p&gt;
&lt;p&gt;También he estado en contacto con &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.romanbauer.net&#x2F;&quot;&gt;Roman Bauer&lt;&#x2F;a&gt;, que trabaja en simulaciones biológicas mediante agentes, para estudiar y trabajar en enfermedades y medicamentos. Un enfoque muy interesante, y hemos hablado un poco sobre colaboraciones con él.&lt;&#x2F;p&gt;
&lt;p&gt;Curiosamente, obtuve alojamiento en una habitación con cocina compartida en la propia universidad, y en esa cocina conocí a Isaiah, un médico keniano en ingeniería química que busca un puesto de postdoctorado, y él me puso en contacto con más investigadores de ese Departamento, que curiosamente también trabajan con Roman, y es posible que iniciemos una colaboración muy pronto (construyendo una red interesante).&lt;&#x2F;p&gt;
&lt;p&gt;Además de trabajar mucho con mis estudiantes de doctorado y asistir a reuniones, he estado explorando varios lugares interesantes durante los fines de semana, como Farnham, Portsmouth o el Castillo de Windsor.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>Publicaciones en Revistas Internacionales</title>
        <published>2024-01-14T00:00:00+00:00</published>
        <updated>2024-01-14T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.danimolina.net/papers/"/>
        <id>https://www.danimolina.net/papers/</id>
        
        <content type="html" xml:base="https://www.danimolina.net/papers/"></content>
        
    </entry>
    <entry xml:lang="es">
        <title>Visitando Londrina</title>
        <published>2023-11-29T00:00:00+00:00</published>
        <updated>2023-11-29T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.danimolina.net/posts/visitando-londrina/"/>
        <id>https://www.danimolina.net/posts/visitando-londrina/</id>
        
        <content type="html" xml:base="https://www.danimolina.net/posts/visitando-londrina/">&lt;p&gt;Entre Noviembre y Diciembre he viajado a Londrina en Brasil. En particular, he visitado la &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;portal.uel.br&#x2F;home&#x2F;&quot;&gt;Universidade Estadual de Londrina&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;He realizado el viaje acompañando a mi pareja, que tenía comprometido dar un curso en un programa de máster de ahí, mientras que en mi caso he sido invitado
por personal del Departamento de Computacao. En mi caso, he participado:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Visitando el &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;departamentos.uel.br&#x2F;computacao&#x2F;&quot;&gt;Departamento de Computaçao de Londrina&lt;&#x2F;a&gt;, gracias a la invitación de Daniel dos Santos Kaster, que está siendo muy amable conmigo. También he dado una charla en su Dpto sobre mis trabajos y los de mi grupo, y hemos empezado contacto para posibles colaboraciones.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;www.danimolina.net&#x2F;posts&#x2F;visitando-londrina&#x2F;yo_charla1.jpg&quot; alt=&quot;Charla en el Departamento&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Por otro lado, también he dado una charla de divulgación para estudiantes en general:&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;www.danimolina.net&#x2F;posts&#x2F;visitando-londrina&#x2F;cartel_charla.jpg&quot; alt=&quot;Cartel de la Charla de Divulgación&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Que estuvo muy bien:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;www.danimolina.net&#x2F;posts&#x2F;visitando-londrina&#x2F;yo_charla2.jpg&quot; alt=&quot;Charla en Londrina&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Con una presentación muy chula:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;zenodo.org&#x2F;doi&#x2F;10.5281&#x2F;zenodo.10200793&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;www.danimolina.net&#x2F;posts&#x2F;visitando-londrina&#x2F;portada_transparencias.png&quot; alt=&quot;Portada de la charla&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Que he puesto libremente &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;zenodo.org&#x2F;doi&#x2F;10.5281&#x2F;zenodo.10200793&quot;&gt;disponible en zenodo&lt;&#x2F;a&gt;, que por cierto, es todo un descubrimiento para almacenar contenido de interés como transparencias. También está en mi sección de &lt;a href=&quot;&#x2F;talks&quot;&gt;Charlas&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>Listado como uno de los investigadores más influyentes</title>
        <published>2023-10-18T00:00:00+00:00</published>
        <updated>2023-10-18T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.danimolina.net/posts/influyente/"/>
        <id>https://www.danimolina.net/posts/influyente/</id>
        
        <content type="html" xml:base="https://www.danimolina.net/posts/influyente/">&lt;p&gt;Ha salido mi nombre en la lista de los investigadores más influyentes del mundo, según el ranking de Stanford, que considera aquellos investigadores de todas las áreas que más influencia (citas) reciban:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.granadahoy.com&#x2F;granada&#x2F;Universidad-Granada-investigadores-influyentes-Stanford_0_1838516842.html&quot;&gt;https:&#x2F;&#x2F;www.granadahoy.com&#x2F;granada&#x2F;Universidad-Granada-investigadores-influyentes-Stanford_0_1838516842.html&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.ugr.es&#x2F;universidad&#x2F;noticias&#x2F;ugr-record-154-investigadores-mas-influyentes-mundo&quot;&gt;https:&#x2F;&#x2F;www.ugr.es&#x2F;universidad&#x2F;noticias&#x2F;ugr-record-154-investigadores-mas-influyentes-mundo&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Y estaba en ese elemento 114538, que puede parecer poco, pero teniendo en cuenta que el 2% de los más influyentes llega hasta 209602 nombres, es claro que es un mérito importante.&lt;&#x2F;p&gt;
&lt;p&gt;Es más, solo 154 científicos de la UGR están en ese listado, de todas las áreas, y estoy posicionado cerca de la mitad de la lista según la lista ordenada de Stanford, en mejor posición  que investigadores con más experiencia y catedráticos reconocidos, lo cual es todo un logro 👍.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>Configurando Emacs desde cero</title>
        <published>2023-09-05T00:00:00+00:00</published>
        <updated>2023-09-05T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.danimolina.net/posts/emacs-config/"/>
        <id>https://www.danimolina.net/posts/emacs-config/</id>
        
        <content type="html" xml:base="https://www.danimolina.net/posts/emacs-config/">&lt;p&gt;Estaba este verano con unos pocos días libres, y pensando en un curso sobre Emacs, y tras la versión 29.1. decidí hacer una configuración por defecto. Bueno, de cero de cero... ya he estado usando spacemacs desde hace años, y ya conozco paquetes que suelo usar, así que no partía de cero.&lt;&#x2F;p&gt;
&lt;p&gt;El proceso ha sido mucho más sencillo de lo esperado, a partir de un fichero .org siguiendo los consejos de https:&#x2F;&#x2F;github.com&#x2F;frap&#x2F;emacs-literate.&lt;&#x2F;p&gt;
&lt;p&gt;La configuración está disponible y explicada en &lt;a href=&quot;&#x2F;emacs&quot;&gt;&#x2F;emacs&#x2F;&lt;&#x2F;a&gt;, generado también a partir del fichero .org (usando babel genero tanto el fichero init.el como la documentación). Lo bueno es que es fácil poner como comentarios, ..., y adaptarlo usando un control de versiones.&lt;&#x2F;p&gt;
&lt;p&gt;Lo he dividido en:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Configuración general, sin paquetes.
a) Configurar la carga de paquetes.
b) Quitar la página inicial, scroll inicial.
c) Activar por defecto la papelera.
d) Pequeños cambios: Hora, quitar algunos mensajes de confirmación, numerar las líneas, ...&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Paquetes que considero imprescindibles:&lt;&#x2F;p&gt;
&lt;p&gt;a) Mostrar la letras, usando &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;justbur&#x2F;emacs-which-key&quot;&gt;which-key&lt;&#x2F;a&gt;.
b) Mejorar el undo con &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;elpa.gnu.org&#x2F;packages&#x2F;undo-tree.html&quot;&gt;undo-tree&lt;&#x2F;a&gt;
c) Ficheros recientes &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.emacswiki.org&#x2F;emacs&#x2F;RecentFiles&quot;&gt;recentf&lt;&#x2F;a&gt;.
d) Marcar fin de paréntesis: &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Fuco1&#x2F;smartparens&quot;&gt;Smartparents&lt;&#x2F;a&gt;.
e) Vterm para consola.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Distintos formatos (también imprescindible): Epub, PDF, Markdown, ...&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Manejo de directorios y ficheros:&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;a) Poder filtrar cómodamente con &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Fuco1&#x2F;dired-hacks&quot;&gt;dired-narrow&lt;&#x2F;a&gt;.
b) Uso de directorios en dired.
c) Flexibilidad de ordenación con &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;emacsmirror&#x2F;dired-quick-sort&quot;&gt;dired-quick-sort&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Manejo de texto: Diccionarios, ...&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Presentación. Modo para configurar el powerline, el Tema de &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;protesilaos.com&#x2F;emacs&#x2F;modus-themes&quot;&gt;modus-themes&lt;&#x2F;a&gt; que es lo mejor que se ha inventado, más legible, iconos, ...&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Evil, para manejo de teclas Vim para Emacs.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Correo, mucho más facil de configurar con &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;notmuchmail.org&#x2F;&quot;&gt;notmuch&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Soporte de org: &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;emacsmirror&#x2F;orgtbl-aggregate&quot;&gt;org-aggregate&lt;&#x2F;a&gt; que permite crear tablas resumen, añadir tablas de contenidos con &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;snosov1&#x2F;toc-org&quot;&gt;toc-org&lt;&#x2F;a&gt;, ...&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Soporte multimedia.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Redes sociales, como &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;martianh&#x2F;mastodon.el&quot;&gt;mastodon&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;En total, tampoco ha sido tanto tiempo, y creo que puede ser un buen punto de partida. Lo usaré para mi tutorial, evidentemente.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>Añadiendo referencias con Zola y Bibtex</title>
        <published>2023-08-17T00:00:00+00:00</published>
        <updated>2023-08-17T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.danimolina.net/posts/bibtex-papers/"/>
        <id>https://www.danimolina.net/posts/bibtex-papers/</id>
        
        <content type="html" xml:base="https://www.danimolina.net/posts/bibtex-papers/">&lt;p&gt;Hace mucho que no publico en el Blog por falta de tiempo (y de ganas en vacaciones).&lt;&#x2F;p&gt;
&lt;p&gt;Pero acabo de retocarlo para añadir las publicaciones, y como es algo que por mucho que he buscado en Internet no he encontrado nada, lo publico aquí.&lt;&#x2F;p&gt;
&lt;p&gt;A continuación la guía de cómo listar automáticamente publicaciones usando Bibtex y Zola.&lt;&#x2F;p&gt;
&lt;p&gt;Lo primero ha sido crear un fichero .bib con todas mis publicaciones. Por suerte ha sido lo más fácil, he usado &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.scopus.com&#x2F;&quot;&gt;Scopus&lt;&#x2F;a&gt; para ello.&lt;&#x2F;p&gt;
&lt;p&gt;Una vez copiado en un directorio &#x2F;data&#x2F; he creado una página con una plantilla nueva, &lt;em&gt;paper_lists.html&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;El grueso de dicha página es la instrucción siguiente en la cabecera:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;template = &amp;quot;papers_list.html&amp;quot;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;A continuación vamos a ver el fichero &lt;code&gt;papers_list.html&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;p&gt;Primero cargo el fichero en la variable &lt;em&gt;data&lt;&#x2F;em&gt;:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;html&quot;&gt;{% set data = load_data(path=&amp;quot;&#x2F;data&#x2F;all.bib&amp;quot;, format=&amp;quot;bibtex&amp;quot;) -%}
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;En &lt;code&gt;data.bibliographies&lt;&#x2F;code&gt; tengo un vector de publicaciones. Aparte del atributo &lt;code&gt;entry_type&lt;&#x2F;code&gt; que indica el tipo de publicación (yo filtro por &quot;ARTICLE&quot;) está el atributo &lt;code&gt;tags&lt;&#x2F;code&gt; que contiene los típicos atributos de un paper: title, author, journal, year, volume, pages, ...&lt;&#x2F;p&gt;
&lt;p&gt;Primero hago un filtrado por los artículos ordenados por año:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;html&quot;&gt;{% set sorted_bib = data.bibliographies | filter(attribute=&amp;quot;entry_type&amp;quot;, value=&amp;quot;ARTICLE&amp;quot;) %}
{% for bib in sorted_bib | sort(attribute=&amp;quot;tags.year&amp;quot;) | reverse %}
...
{% endfor %}
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Dado que quiero mostrarlo por año, quiero mostrar sólo el año si cambia respecto al anterior. Para ello uso una variable global &lt;code&gt;last_year&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;html&quot;&gt;{% if last_year != bib.tags.year %}
	    &amp;lt;h1 class=&amp;quot;title&amp;quot;&amp;gt;{{bib.tags.year}}&amp;lt;&#x2F;h1&amp;gt;
	    {% set_global last_year = bib.tags.year %}
{% endif %}
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;El resto es sencillo, es simplemente utilizar &lt;code&gt;bib.tags&lt;&#x2F;code&gt;. He intentado usar macros, pero tiene limitaciones.&lt;&#x2F;p&gt;
&lt;p&gt;A continuación muestro el código en completo.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;html&quot;&gt;{% set data = load_data(path=&amp;quot;&#x2F;data&#x2F;all.bib&amp;quot;, format=&amp;quot;bibtex&amp;quot;) -%}

{% if data %}
&amp;lt;section class=&amp;quot;section&amp;quot;&amp;gt;
    &amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;
	&amp;lt;div class=&amp;quot;columns is-centered&amp;quot;&amp;gt;
	    {% set_global last_year=&amp;quot;2000&amp;quot; %}
	&amp;lt;div class=&amp;quot;column is-9&amp;quot;&amp;gt;
	    &amp;lt;h2 class=&amp;quot;title&amp;quot;&amp;gt;{{trans(key=&amp;quot;papers&amp;quot;,lang=lang)}}&amp;lt;&#x2F;h2&amp;gt;
	    {% set sorted_bib = data.bibliographies | filter(attribute=&amp;quot;entry_type&amp;quot;, value=&amp;quot;ARTICLE&amp;quot;) %}
	    {% for bib in sorted_bib | sort(attribute=&amp;quot;tags.year&amp;quot;) | reverse %}
	    {% if last_year != bib.tags.year %}
	    &amp;lt;h1 class=&amp;quot;title&amp;quot;&amp;gt;{{bib.tags.year}}&amp;lt;&#x2F;h1&amp;gt;
	       {% set_global last_year = bib.tags.year %}
	    {% endif %}
	    {# __tera_context#}
	    &amp;lt;article class=&amp;quot;box&amp;quot;&amp;gt;
            &amp;lt;h2&amp;gt;
		&amp;lt;b&amp;gt;
		{% if bib.tags.doi %}
		&amp;lt;a class=&amp;quot;has-text-dark&amp;quot; href=&amp;#39;http:&#x2F;&#x2F;dx.doi.org&#x2F;{{bib.tags.doi}}&amp;#39; target=&amp;quot;_blank&amp;quot;&amp;gt;
            {{ bib.tags.title }}
		&amp;lt;&#x2F;a&amp;gt;
		{% else %}
		{{ bib.tags.title }}
		{% endif %}
		&amp;lt;&#x2F;b&amp;gt;{{ bib.tags.author}}. {{ bib.tags.journal}}. vol: {{bib.tags.volume}}, {% if bib.tags.pages %}pages: {{bib.tags.pages}}{% else %} In Press {% endif %} ({{bib.tags.year}}).
		{#
		{% if bib.tags.note != &amp;quot;cited By 0&amp;quot; %}
		{{bib.tags.note}}
		{% else %}
		{{bib.tags.note}}
		{% endif %}
		#}
		{% if bib.tags.note and bib.tags.note != &amp;quot;Cited By 0&amp;quot; %}
		{% set citations = bib.tags.note | split(pat=&amp;quot; &amp;quot;) | last | int %}
		{% if citations &amp;gt;= 5  %}
		&amp;lt;b&amp;gt;{{trans(key=&amp;quot;citations&amp;quot;, lang=lang)}}: {{ citations }}&amp;lt;&#x2F;b&amp;gt;
		{% endif %}
		{% endif %}
	    &amp;lt;&#x2F;h2&amp;gt;
	&amp;lt;&#x2F;article&amp;gt;
	  {% endfor %}
      &amp;lt;&#x2F;div&amp;gt;
    &amp;lt;&#x2F;div&amp;gt;
&amp;lt;&#x2F;section&amp;gt;
{% endif %}
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>Charlas y Material Docente</title>
        <published>2023-03-31T00:00:00+00:00</published>
        <updated>2023-03-31T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.danimolina.net/talks/"/>
        <id>https://www.danimolina.net/talks/</id>
        
        <content type="html" xml:base="https://www.danimolina.net/talks/">&lt;p&gt;En esta entrada muestro material docente o de divulgación, es una recopilación de los distintos repositorios que poseo. Antes de utilizar cualquiera de ellos, consulte su licencia correspondiente.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;material-docente-oficial&quot;&gt;Material Docente oficial&lt;&#x2F;h1&gt;
&lt;p&gt;A continuación muestro material más oficial&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;sci2s.ugr.es&#x2F;node&#x2F;124&quot;&gt;Material de la asignatura de Metaheurísticas&lt;&#x2F;a&gt;. Se muestra tanto el material de teoría como de prácticas para la asignatura de Metaheurísticas del Grado de Ingeniería Informática de la Universidad de Granada. Dentro del curso se usa la plataforma Moodle, pero este material se replica en la web de nuestro grupo de investigación.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Material sobre asignatura de &lt;em&gt;Preprocesamiento&lt;&#x2F;em&gt; en el Máster de Ciencias de Datos:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;master.danimolina.net&#x2F;&quot;&gt;Transparencias&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;dmolina&#x2F;master_preprocesamiento&quot;&gt;Código fuente&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h1 id=&quot;charlas&quot;&gt;Charlas&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;charlas-docente&quot;&gt;Charlas Docente&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;gestionando-tu-proyecto-con-mlflow&quot;&gt;Gestionando tu proyecto con MLFlow&lt;&#x2F;h3&gt;
&lt;p&gt;Transparencia de la charla &lt;em&gt;Gestionando tu proyecto con MLFlow&lt;&#x2F;em&gt; dada en PyDataGR en Diciembre.&lt;&#x2F;p&gt;
&lt;center&gt;
    
    &lt;img src=&quot;&amp;#x2F;images&amp;#x2F;mlflow_portada.png&quot; width=&quot;50%&quot; alt=&quot;Portada de la charla sobre MLFlow&quot; &#x2F;&gt;
    
&lt;&#x2F;center&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;mlflow.danimolina.net&quot;&gt;Transparencias en formato web&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dmolina&#x2F;pydata_mlflow&quot;&gt;Recurso en Github&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;la-estadistica-como-aliada-en-la-experimentacion-de-algoritmos-evolutivos&quot;&gt;La estadística como aliada en la experimentación de algoritmos evolutivos&lt;&#x2F;h3&gt;
&lt;p&gt;Transparencias de charla en el curso de &lt;em&gt;Algoritmos Evolutivos&lt;&#x2F;em&gt; del Máster de &lt;em&gt;Ingeniería del Software e Inteligencia Artificial&lt;&#x2F;em&gt; de la Universidad de Málaga, UMA.&lt;&#x2F;p&gt;
&lt;center&gt;
    
    &lt;img src=&quot;&amp;#x2F;images&amp;#x2F;charla_comparativa.png&quot; width=&quot;50%&quot; alt=&quot;Portada de la charla sobre estadística&quot; &#x2F;&gt;
    
&lt;&#x2F;center&gt;
&lt;p&gt;&lt;a href=&quot;&#x2F;talks&#x2F;mh_comparativas.pdf&quot;&gt;Transparencias&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;divulgativas-sobre-inteligencia-artificial&quot;&gt;Divulgativas sobre Inteligencia Artificial&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;inteligencia-artificial-en-el-siglo-xxi-que-nos-puede-ofrecer-y-de-que-tenemos-que-tener-cuidado&quot;&gt;Inteligencia artificial en el siglo XXI: Qué nos puede ofrecer, y de qué tenemos que tener cuidado&lt;&#x2F;h3&gt;
&lt;center&gt;
    
    &lt;img src=&quot;&amp;#x2F;images&amp;#x2F;charla_IAsigloXXI.png&quot; width=&quot;50%&quot; alt=&quot;Cartel de charla sobre la IA en el Siglo XXI&quot; &#x2F;&gt;
    
&lt;&#x2F;center&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;zenodo.org&#x2F;doi&#x2F;10.5281&#x2F;zenodo.10200793&quot;&gt;Transparencias en Zenodo&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;la-naturaleza-inspiradora-de-inteligencia-artificial&quot;&gt;La Naturaleza, inspiradora de Inteligencia Artificial&lt;&#x2F;h3&gt;
&lt;center&gt;
    
    &lt;img src=&quot;&amp;#x2F;images&amp;#x2F;charla_lanoche.png&quot; width=&quot;50%&quot; alt=&quot;Cartel de charla sobre la Noche&quot; &#x2F;&gt;
    
&lt;&#x2F;center&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;zenodo.org&#x2F;records&#x2F;10049648&quot;&gt;Transparencias en Zenodo&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;dmolina&#x2F;innovaMH&quot;&gt;Software Demo sobre Algoritmo Bio-Inspirado&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;dmolina&#x2F;demo_animal&quot;&gt;Software Demo de Identificación de Animal&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;!--
### Inteligencia artificial en el Siglo XXI: Qué nos puede ofrecer, y de qué tenemos que tener cuidado

&lt;center&gt;
    
    &lt;img src=&quot;&amp;#x2F;images&amp;#x2F;charla_brasil.png&quot; width=&quot;50%&quot; alt=&quot;Cartel de charla sobre IA en el Siglo XXI&quot; &#x2F;&gt;
    
&lt;&#x2F;center&gt;


- [Transparencias en Zenodo]()
--&gt;
&lt;h2 id=&quot;&quot;&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;about-me&quot;&gt;About me&lt;&#x2F;h3&gt;
&lt;center&gt;
    
    &lt;img src=&quot;&amp;#x2F;images&amp;#x2F;charla_aboutme.png&quot; width=&quot;50%&quot; alt=&quot;Cartel de la charla sobre mí&quot; &#x2F;&gt;
    
&lt;&#x2F;center&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;&#x2F;talks&#x2F;about_me.pdf&quot;&gt;Transparencias&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;sobre-software-libre&quot;&gt;Sobre Software Libre&lt;&#x2F;h2&gt;
&lt;p&gt;Charla sobre Polars (presentada en PyData 14&#x2F;03&#x2F;2024)&lt;&#x2F;p&gt;
&lt;center&gt;
    
    &lt;img src=&quot;&amp;#x2F;images&amp;#x2F;charla_polars.png&quot; width=&quot;50%&quot; alt=&quot;Cartel de charla sobre la charla de Polars&quot; &#x2F;&gt;
    
&lt;&#x2F;center&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;polars.danimolina.net&#x2F;&quot;&gt;Transparencias&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Charla sobre Mastodon (colaboración con la Oficina de Software Libre, en 2023)&lt;&#x2F;p&gt;
&lt;center&gt;
    
    &lt;img src=&quot;&amp;#x2F;images&amp;#x2F;charla_mastodon.png&quot; width=&quot;50%&quot; alt=&quot;Cartel de charla sobre Mastodón&quot; &#x2F;&gt;
    
&lt;&#x2F;center&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;sobremastodon.danimolina.net&#x2F;&quot;&gt;Transparencias&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Curso corto de Machine Learning de un plan Erasmus+ (Inglés)&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dmolina&#x2F;ml_python_course_short&quot;&gt;Transparencias&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Taller en el PyConES del 2022&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;dmolina&#x2F;pycones_2022_eficiencia&quot;&gt;Transparencias&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Charla en el JuliaCon 2022 (Inglés) sobre mi experiencia docente usando Julia&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=CwDntVE3SHU&quot;&gt;Vídeo&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Charla en el JuliaCon 2021 (Inglés) sobre mi utilidad DaemonMode, que permite ejecutar rápidamente Julia para scripts.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=wCkuXAdE8E0&quot;&gt;Vídeo&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dmolina&#x2F;DaemonMode.jl&quot;&gt;Package&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dmolina&#x2F;juliaclient_nim&quot;&gt;Cliente ligero (en Nim)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Presentación oficial en el PlutoCon 2021 (Inglés)&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dmolina&#x2F;PlutoCon2021-demos&quot;&gt;Transparencias&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=NrIxgnFXslg&quot;&gt;Vídeo&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Charla sobre FastAPI (en Instituto de FP invitado, y luego en la ETSIIT de la UGR en 2023)&lt;&#x2F;p&gt;
&lt;center&gt;
    
    &lt;img src=&quot;&amp;#x2F;images&amp;#x2F;charla_fastapi.png&quot; width=&quot;50%&quot; alt=&quot;Cartel de la clase de FastAPI&quot; &#x2F;&gt;
    
&lt;&#x2F;center&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dmolina&#x2F;charla_fastapi&quot;&gt;Transparencias&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Taller sobre Pandoc (colaboración con la Oficina de Software Libre) en 2022&lt;&#x2F;p&gt;
&lt;center&gt;
    
    &lt;img src=&quot;&amp;#x2F;images&amp;#x2F;charla_pandoc.png&quot; width=&quot;50%&quot; alt=&quot;Cartel del taller de pandoc&quot; &#x2F;&gt;
    
&lt;&#x2F;center&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dmolina&#x2F;taller_pandoc&quot;&gt;Transparencias&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>Poniendo calificaciones con Emacs</title>
        <published>2023-01-27T00:00:00+00:00</published>
        <updated>2023-01-27T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.danimolina.net/posts/emacs-qualifications/"/>
        <id>https://www.danimolina.net/posts/emacs-qualifications/</id>
        
        <content type="html" xml:base="https://www.danimolina.net/posts/emacs-qualifications/">&lt;p&gt;A estas alturas a nadie le extrañará que soy un gran fan de Emacs.&lt;&#x2F;p&gt;
&lt;p&gt;Cada vez lo uso más para corregir a los alumnos. Tiene grandes ventajas:&lt;&#x2F;p&gt;
&lt;p&gt;En presentaciones (como esta mañana) me resulta muy cómodo tener la pantalla compartida en un buffer el pdf (que puedo abrir incluso aunque me lo mandasen en zip) y en otro el fichero con los comentarios.&lt;&#x2F;p&gt;
&lt;p&gt;Pero lo más interesante son las calificaciones, gracias a dos grandes descubrimientos recientes:&lt;&#x2F;p&gt;
&lt;p&gt;Explico un poco cómo corrijo.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;comentarios-para-cada-estudiante&quot;&gt;Comentarios para cada estudiante&lt;&#x2F;h2&gt;
&lt;p&gt;Tengo un apartado en el que pongo comentarios por cada estudiante.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;* Comentarios

** Estudiante1

- Ej1: ...
- Ej2: ...
...

** Estudiante2

- Ej1: ...
- Ej2: ...
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Usando este formato me resulta muy cómodo de mover. Además, la parte Ej1, ... lo guardo como plantilla y lo copio para cada estudiante.&lt;&#x2F;p&gt;
&lt;p&gt;Pero lo más interesante son las tablas, suelo corregir ponderando cada prueba
en función de su puntuación, y me viene muy bien.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;puntuando-a-los-alumnos&quot;&gt;Puntuando a los alumnos&lt;&#x2F;h2&gt;
&lt;p&gt;Creo una fila por cada estudiante, y una columna por prueba, marcando cada casilla con un valor entre 0 y 1. 0 indica totalmente mal,0.5 sería que le doy la mitad de la puntuación de la prueba correspondiente, y 1 toda la puntuación.&lt;&#x2F;p&gt;
&lt;p&gt;Por ejemplo, supongamos tres pruebas en el que la media final sería que el primero vale 3 puntos, el siguiente 4 y el tercero otros 3 puntos, creo la tabla de la siguiente forma:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;#+name: grupoE
| Nombre     | Apellidos |  3 |    4 |  3 | Total |
|            |           | P1 |   P2 | P3 |       |
|------------+-----------+----+------+----+-------|
| Apellidos1 | Nombre1   |  1 |  0.5 |  0 |   5.0 |
| Apellidos2 | Nombre2   |  0 | 0.75 |  1 |   6.0 |
| Apellidos3 | Nombre3   |  0 |    0 |  1 |   3.0 |
|            
#+TBLFM: $6=vsum((@1$3..@1$5)*($3..$5));%.1f
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;La primera fila almacena la puntuación de cada punto, de forma que la puntuación final se puede
actualizar de forma automática al cambiar tanto la ponderación como la calificación de estudiantes (Con &lt;code&gt;C-c C-c&lt;&#x2F;code&gt;).&lt;&#x2F;p&gt;
&lt;p&gt;En &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;orgmode.org&#x2F;worg&#x2F;org-tutorials&#x2F;org-spreadsheet-lisp-formulas.html&quot;&gt;https:&#x2F;&#x2F;orgmode.org&#x2F;worg&#x2F;org-tutorials&#x2F;org-spreadsheet-lisp-formulas.html&lt;&#x2F;a&gt; hay una buena introducción del uso de fórmulas, que un día complementaré 😊.&lt;&#x2F;p&gt;
&lt;p&gt;Las tablas pueden también ordenarse, basta con ponerse en la columna a ordenar (como apellidos), y org-table-sort-lines para ordenar (&lt;em&gt;, t s&lt;&#x2F;em&gt; en spacemacs). Hay dos enfoques muy útiles:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ordenar alfabéticamente, como ponerse en la columna &lt;code&gt;Apellidos&lt;&#x2F;code&gt; y tras &lt;code&gt;org-table-sort-lines&lt;&#x2F;code&gt; seleccionar la &lt;code&gt;a&lt;&#x2F;code&gt; para ordenar alfabéticamente.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Ordenar por puntuación, ponerse en la columna &lt;code&gt;Total&lt;&#x2F;code&gt;, y tras &lt;code&gt;org-table-sort-lines&lt;&#x2F;code&gt; seleccionar la &lt;code&gt;n&lt;&#x2F;code&gt; para ordenar por puntuación.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;tablas-resumen&quot;&gt;Tablas resumen&lt;&#x2F;h2&gt;
&lt;p&gt;Una utilidad muy cómoda es el paquete &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;tbanel&#x2F;orgaggregate&quot;&gt;orgtbl-aggregate&lt;&#x2F;a&gt; que permite hacer tablas resúmenes de forma muy cómoda.&lt;&#x2F;p&gt;
&lt;p&gt;Por ejemplo, si quisiésemos una tabla adicional solo con la final:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;#+name: final
#+BEGIN: aggregate :table &amp;quot;grupoE&amp;quot; :cols &amp;quot;Nombre Apellidos Total;&amp;#39;Calificación&amp;#39;;%1f&amp;quot;
#+END:
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Como se ve, se menciona una tabla externa a través de su nombre (en &lt;code&gt;#+name: ...&lt;&#x2F;code&gt;) y listar las
columnas que nos interesan.&lt;&#x2F;p&gt;
&lt;p&gt;Y al pulsar &lt;code&gt;C-c C-c&lt;&#x2F;code&gt; en el begin, se completa automáticamente:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;#+BEGIN: aggregate :table &amp;quot;grupoE&amp;quot; :cols &amp;quot;Nombre Apellidos Total;&amp;#39;Calificación&amp;#39;;%1f&amp;quot;
| Nombre     | Apellidos | Calificación |
|------------+-----------+--------------|
| Apellidos1 | Nombre1   |          5.0 |
| Apellidos2 | Nombre2   |          6.0 |
| Apellidos3 | Nombre3   |          3.0 |
#+END:
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Como se puede ver también se puede renombrar los atributos como se muestra en el ejemplo usando el &lt;code&gt;;&lt;&#x2F;code&gt;
y las cursivas.&lt;&#x2F;p&gt;
&lt;p&gt;Al cambiar la tabla anterior, se puede ejecutar C-c C-c y se actualiza automáticamente.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;filtrando&quot;&gt;Filtrando&lt;&#x2F;h4&gt;
&lt;p&gt;También se puede seleccionar. Por ejemplo, si queremos mostrar sólo los aprobados podemos limitar la
búsqueda usando &lt;code&gt;:cond&lt;&#x2F;code&gt;. En este caso es necesario un poco de emacs lisp, pero limitar la puntuación
es sencillo (sólo hay que acordarse de que hay que convertir la cadena en número para comparar).&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;#+name: aprobados
#+BEGIN: aggregate :table &amp;quot;grupoE&amp;quot; :cond(&amp;gt;= (string-to-number Total) 5.0):cols &amp;quot;Nombre Apellidos Total;&amp;#39;Calificación&amp;#39;;%1f&amp;quot;
#+END:
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Al pulsar &lt;code&gt;C-c C-c&lt;&#x2F;code&gt; se completa automáticamente únicamente con los aprobados.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;#+name: aprobados
#+BEGIN: aggregate :table &amp;quot;grupoE&amp;quot; :cond(&amp;gt;= (string-to-number Total) 5.0):cols &amp;quot;Nombre Apellidos Total;&amp;#39;Calificación&amp;#39;;%1f&amp;quot;
| Nombre     | Apellidos | Calificación |
|------------+-----------+--------------|
| Apellidos1 | Nombre1   |          5.0 |
| Apellidos2 | Nombre2   |          6.0 |
#+END:
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h4 id=&quot;ordenando-tablas-resumen&quot;&gt;Ordenando tablas resumen&lt;&#x2F;h4&gt;
&lt;p&gt;Se puede ordenar directamente las tablas resumen usando &lt;code&gt;^a&lt;&#x2F;code&gt; para alfabético, o &lt;code&gt;^n&lt;&#x2F;code&gt; para ordenar
numéricamente (y &lt;code&gt;^A&lt;&#x2F;code&gt; y &lt;code&gt;^N&lt;&#x2F;code&gt; para ordenarlo en forma descendente).&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;#+BEGIN: aggregate :table &amp;quot;grupoE&amp;quot; :cols &amp;quot;Nombre Apellidos Total;^N;&amp;#39;Calificación&amp;#39;;%1f&amp;quot;
#+END:
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Que al pulsar &lt;code&gt;C-c C-c&lt;&#x2F;code&gt; automáticamente completa de forma aleatoria:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;#+BEGIN: aggregate :table &amp;quot;grupoE&amp;quot; :cols &amp;quot;Nombre Apellidos Total;^N;&amp;#39;Calificación&amp;#39;;%1f&amp;quot;
| Nombre     | Apellidos | Calificación |
|------------+-----------+--------------|
| Apellidos2 | Nombre2   |          6.0 |
| Apellidos1 | Nombre1   |          5.0 |
| Apellidos3 | Nombre3   |          3.0 |
#+END:
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h4 id=&quot;completando-informacion&quot;&gt;Completando información&lt;&#x2F;h4&gt;
&lt;p&gt;Vamos a completar la tabla original con el número de estudiantes evaluados (números de filas), y la
media de las calificaciones:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Vamos a añadir el número de evaluaciones:&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;code&gt;#+TBLFM: @&amp;gt;$2=vlen(@I..@II)&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Esta línea añadiría en la última fila (&lt;code&gt;@&amp;gt;&lt;&#x2F;code&gt;) y segunda columna (&lt;code&gt;$2&lt;&#x2F;code&gt;) el número de elementos. Para
no contar los apellidos, se puede sumar sólo las regiones separadas entre dos líneas verticales
(entre &lt;code&gt;@I&lt;&#x2F;code&gt; y &lt;code&gt;@II&lt;&#x2F;code&gt;).&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Hacer el promedio:&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Es muy fácil hacer una fila promedio usando &lt;code&gt;vmean&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;#+TBLFM: @&amp;gt;$6=vmean(@I$6..@II$6)&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Combinándolo todo:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;| Nombre     | Apellidos |  3 |    4 |  3 | Total |
|            |           | P1 |   P2 | P3 |       |
|------------+-----------+----+------+----+-------|
| Apellidos1 | Nombre1   |  1 |  0.5 |  0 |   5.0 |
| Apellidos2 | Nombre2   |  0 | 0.75 |  1 |   6.0 |
| Apellidos3 | Nombre3   |  0 |    0 |  1 |   3.0 |
|------------+-----------+----+------+----+-------|
| Total      | 3         |    |      |    |  4.67 |
#+TBLFM: $6=vsum((@1$3..@1$5)*($3..$5));%.1f::@&amp;gt;$2=vlen(@I..@II)::@&amp;gt;$6=vmean(@I$6..@II$6);%.2f
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h4 id=&quot;calculando-datos&quot;&gt;Calculando datos&lt;&#x2F;h4&gt;
&lt;p&gt;En las tablas resumen se pueden añadir fórmulas, y se aplican automáticamente.&lt;&#x2F;p&gt;
&lt;p&gt;Voy a hacer una tabla que indica los aprobados, los suspensos y el ratio de aprobados:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;#+begin: aggregate :table &amp;quot;aprobados&amp;quot; :cols &amp;quot;count();&amp;#39;Aprobados&amp;#39; count();&amp;#39;Suspensos&amp;#39;;%.0f count();&amp;#39;Ratio&amp;#39;&amp;quot;
| Aprobados | Suspensos | Ratio |
|-----------+-----------+-------|
|         2 |         1 |  66.7 |
#+TBLFM: $2=remote(grupoE,@&amp;gt;$2)-$1::$3=$1&#x2F;($1+$2)%; %.1f
#+end:
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Remote permite acceder a una columna de otra tabla, en este caso lo usamos para acceder al total de
filas. El &lt;code&gt;%&lt;&#x2F;code&gt; permite mostrar el porcentaje, si no estuviese habría que multiplicar por 100. El
&lt;code&gt;%.1f&lt;&#x2F;code&gt; indica que se desea un decimal.&lt;&#x2F;p&gt;
&lt;p&gt;Espero que estos consejos os hayan dado ideas de cómo usar Emacs y org-table para hacer cosas chulas.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>Creando notebooks desde Markdown</title>
        <published>2022-11-03T00:00:00+00:00</published>
        <updated>2022-11-03T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.danimolina.net/posts/text2md/"/>
        <id>https://www.danimolina.net/posts/text2md/</id>
        
        <content type="html" xml:base="https://www.danimolina.net/posts/text2md/">&lt;p&gt;El uso de Notebooks en Python es muy útil, especialmente para enseñanza.
Sin embargo, aunque el interfaz web (y el uso de
&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;tkf.github.io&#x2F;emacs-ipython-notebook&#x2F;&quot;&gt;EIN&lt;&#x2F;a&gt; desde Emacs), siempre me
resulta un poco &quot;latazo&quot; tener que moverme entre celdas, intercalando texto en
&lt;code&gt;Markdown&lt;&#x2F;code&gt; y en &lt;code&gt;Python&lt;&#x2F;code&gt; (o &lt;code&gt;Julia&lt;&#x2F;code&gt;).&lt;&#x2F;p&gt;
&lt;p&gt;Afortunadamente, existen alternativas. La más genérica y que me gusta más se
llama &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;jupytext.readthedocs.io&#x2F;en&#x2F;latest&#x2F;&quot;&gt;jupytext&lt;&#x2F;a&gt; y permite convertir
un fichero markdown en un notebook.&lt;&#x2F;p&gt;
&lt;p&gt;La sintaxis es sencilla, el texto en claro pasará a ser celdas markdown, y el
código en Python pasará a ser celdas de código.&lt;&#x2F;p&gt;
&lt;p&gt;Por ejemplo:&lt;&#x2F;p&gt;
&lt;pre&gt;
### Creando DataFrames desde cero

Se puede crear a partir de un simple `diccionario`.

En el ejemplo tenemos un puesto de frutas que vende manzanas y naranjas. Queremos una columna por cada fruta y una fila por cada compra de un cliente.


```python
data = {
    &#x27;apples&#x27;: [3, 2, 0, 1],
    &#x27;oranges&#x27;: [0, 3, 7, 2],
    &#x27;propina&#x27;: [&#x27;si&#x27;, &#x27;no&#x27;, &#x27;si&#x27;, &#x27;si&#x27;]
}
```

```python
purchases = pd.DataFrame(data)

purchases
```

El **Indice** de este DataFrame se creó automaticamente al iniciarlo, usando los números0-3, pero podemos asignar los que queramos.
&lt;&#x2F;pre&gt;
&lt;p&gt;Quedaría con dos celdas markdown al principio y final, y dos celdas de código en
medio:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;www.danimolina.net&#x2F;posts&#x2F;text2md&#x2F;notebook.png&quot; alt=&quot;Ejemplo de Salida&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Para compilar los distintos ficheros markdown a notebook uso los siguientes
ficheros.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Un fichero &lt;strong&gt;makefile&lt;&#x2F;strong&gt; que compila automáticamente todos los ficheros md a notebook.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;files:=$(wildcard *.md) # 1 line
OBJ:=$(files:.md=.ipynb) # 2 line

all: $(OBJ)

%.ipynb: %.md
	jupytext $&amp;lt; --update --to notebook # update es para mantener los IDs en el fichero.

clean:
	rm *.ipynb

&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;Un pequeño script &lt;strong&gt;run.sh&lt;&#x2F;strong&gt; que permite ejecutarlo cuando un fichero cambia
gracias al excelente programa
&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;lib.rs&#x2F;crates&#x2F;watchexec-cli&quot;&gt;watchexec&lt;&#x2F;a&gt;, aunque otros programas como
&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;eradman&#x2F;entr&quot;&gt;entr&lt;&#x2F;a&gt; también valdría:&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;watchexec -e md make
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;De esta manera, cuando cualquier fichero con extensión markdown (ignora el
resto) es modificado, automáticamente llama a make, que cambiará el notebook
correspondiente.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>Charla en el PyConES</title>
        <published>2022-08-18T00:00:00+00:00</published>
        <updated>2022-08-18T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.danimolina.net/posts/pycones/"/>
        <id>https://www.danimolina.net/posts/pycones/</id>
        
        <content type="html" xml:base="https://www.danimolina.net/posts/pycones/">&lt;p&gt;Este año vuelvo a contribuir en el congreso nacional de Python (PythonConES).&lt;&#x2F;p&gt;
&lt;center&gt;
    
    &lt;img src=&quot;pycones.svg&quot; width=&quot;50%&quot; &#x2F;&gt;
    
&lt;&#x2F;center&gt;
&lt;p&gt;Prepararé un taller de dos horas sobre identificación de cuellos de botella en
un programa en Python y mejora de eficiencia. Se me ocurrió dicho taller viendo
la experiencia de alumnos míos en Metaheurísticas, que escogieron el uso de
Python, y por no tener suficiente experiencia el tiempo de ejecución era
demasiado largo. Ya informé que no recomendaba usar Python si no se tenía algo
de experiencia sobre código eficiente en Python, pero algunos no siguieron mi
recomendación y se encontraron con problemas. Y luego pensando, decidí que
estaría bien un taller sobre lo que debería de saber para poder haberlo hecho
bien.&lt;&#x2F;p&gt;
&lt;p&gt;La charla será el próximo día 30 de Septiembre de 15:30-17:30 en la
&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;etsiit.ugr.es&#x2F;&quot;&gt;ETSIIT&lt;&#x2F;a&gt;. Puedes consultarlo en el &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;charlas.2022.es.pycon.org&#x2F;pycones2022&#x2F;schedule&#x2F;&quot;&gt;Horario del
PyConES&lt;&#x2F;a&gt;. También
supongo que será difundido por &lt;em&gt;streaming&lt;&#x2F;em&gt;, y tras la charla se colgará, pondré
el enlace en cuanto esté disponible para quien no pueda asistir pueda verlo luego.&lt;&#x2F;p&gt;
&lt;p&gt;Aprovecho para animaros a asistir, que tiene charlas muy interesantes, y los
organizadores son colegas 😉.&lt;&#x2F;p&gt;
&lt;p&gt;A continuación describo más en detalle la charla:&lt;&#x2F;p&gt;
&lt;p&gt;Determinaremos el código que supone el mayor consumo de recursos (usando un
profile). También veremos cómo podemos optimizar las partes críticas usando
distintas técnicas. Se espera que tras el taller los asistentes sepan a
identificar los cuellos de botella de sus propios programas&#x2F;librerías, y
conozcan distintas opciones para poder optimizarlos.&lt;&#x2F;p&gt;
&lt;p&gt;El taller consta de de un enfoque práctico, en el que se verán el uso de las
librerías y técnicas sobre algunos ejemplos prácticos. En particular se verá:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Hacer un profile de un programa para detectar cuellos de botella.&lt;&#x2F;li&gt;
&lt;li&gt;Hacer un profile desde un notebook.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Una vez identificado el cuello de botella, pasaremos optimizarlo. Para ello,
aparte de ciertos consejos de implementación, se mostrará cómo pueden reducirse
utilizando algunas librerías eficientes y cython para llamar a código en C&#x2F;C++.
Dada la duración no se explicarán en detalle esas librerías, pero sí servirá
para darlas a conocer a quien no las conozcan y mostrar cómo adaptando un
pequeño porcentaje del código se pueden obtener muchos mejores resultados.&lt;&#x2F;p&gt;
&lt;p&gt;Las librerías que veremos son:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Librerías cProfile de la librería estándar.&lt;&#x2F;li&gt;
&lt;li&gt;pprofile, mejor rendimiento.&lt;&#x2F;li&gt;
&lt;li&gt;scalene, una librería de profile moderna y con muchas características.&lt;&#x2F;li&gt;
&lt;li&gt;Aplicación de scipy y&#x2F;o numpy para optimizar código.&lt;&#x2F;li&gt;
&lt;li&gt;Introducir numba y PyPy.&lt;&#x2F;li&gt;
&lt;li&gt;cython para optimizar partes críticas.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;charlas.2022.es.pycon.org&#x2F;pycones2022&#x2F;talk&#x2F;VTQDSZ&#x2F;&quot;&gt;https:&#x2F;&#x2F;charlas.2022.es.pycon.org&#x2F;pycones2022&#x2F;talk&#x2F;VTQDSZ&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>Charla en JuliaCon2022</title>
        <published>2022-07-27T00:00:00+00:00</published>
        <updated>2022-07-27T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.danimolina.net/posts/juliacon2022/"/>
        <id>https://www.danimolina.net/posts/juliacon2022/</id>
        
        <content type="html" xml:base="https://www.danimolina.net/posts/juliacon2022/">&lt;p&gt;Hoy se verá mi charla en el JuliaCon 2022, sobre mis experiencias docentes
usando Julia.&lt;&#x2F;p&gt;
&lt;p&gt;Se puede ver aquí:
&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;live.juliacon.org&#x2F;talk&#x2F;KGLNUH&quot;&gt;https:&#x2F;&#x2F;live.juliacon.org&#x2F;talk&#x2F;KGLNUH&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Después de la hora de la charla, está libremente disponible en Youtube.&lt;&#x2F;p&gt;
&lt;p&gt;El código fuente de las demos está disponible en:
&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;daniel.molina&#x2F;mh_demos&#x2F;&quot;&gt;https:&#x2F;&#x2F;gitlab.com&#x2F;daniel.molina&#x2F;mh_demos&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>Miro el móvil</title>
        <published>2022-07-09T00:00:00+00:00</published>
        <updated>2022-07-09T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.danimolina.net/posts/miro-movil/"/>
        <id>https://www.danimolina.net/posts/miro-movil/</id>
        
        <content type="html" xml:base="https://www.danimolina.net/posts/miro-movil/">&lt;p&gt;Miro el móvil&lt;br &#x2F;&gt;
solo para ver el fondo de pantalla&lt;br &#x2F;&gt;
para ver tu cara&lt;br &#x2F;&gt;
tu sonrisa de un tiempo que se fue.\&lt;&#x2F;p&gt;
&lt;p&gt;Miro el móvil&lt;br &#x2F;&gt;
esperando tus mensajes,&lt;br &#x2F;&gt;
mensajes que no llegan&lt;br &#x2F;&gt;
porque te perdí.\&lt;&#x2F;p&gt;
&lt;p&gt;Miro el móvil
porque no me acompañas,&lt;br &#x2F;&gt;
porque te has ido,&lt;br &#x2F;&gt;
y el pasado que atesora&lt;br &#x2F;&gt;
me acompaña en mi soledad.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>Un nuevo inicio</title>
        <published>2022-06-28T00:00:00+00:00</published>
        <updated>2022-06-28T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.danimolina.net/posts/nuevo-comienzo/"/>
        <id>https://www.danimolina.net/posts/nuevo-comienzo/</id>
        
        <summary type="html">&lt;p&gt;Sé que tengo el blog muy parado, y creo saber por qué. El motivo es el idioma.&lt;&#x2F;p&gt;
&lt;p&gt;No es que no sepa inglés, la verdad es que lo domino cada vez más, pero es algo
que me echa para atrás a la hora de escribir en mis propio tiempo libre. Por
tanto, he decidido empezar a escribir en español&#x2F;andaluz&#x2F;granaíno. De esa forma
espero animarme a escribir más, porque tengo temas para hacerlo y nunca lo acabo
haciendo.&lt;&#x2F;p&gt;
&lt;p&gt;Así pues, aquí empieza mi nuevo inicio.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="es">
        <title>Sobre mi</title>
        <published>2020-07-01T00:00:00+00:00</published>
        <updated>2020-07-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.danimolina.net/about/"/>
        <id>https://www.danimolina.net/about/</id>
        
        <content type="html" xml:base="https://www.danimolina.net/about/">&lt;figure&gt;
    &lt;img src=&quot;&amp;#x2F;images&amp;#x2F;me_small.jpg&quot; alt=&quot;¿Quien es ese loco?&quot;&gt;
    &lt;figcaption&gt;¿Quien es ese loco?&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Soy Titular de la Universidad de Granada, especializado en Inteligencia
Artificial y Metaheurísticas. Como mucha gente, tengo varios roles:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Como investigador, tengo un índice h de 23, con más de 24 trabajos (más del
90% en Q1), y más de 7000 citas. En la portada, puede consultar mis
publicaciones en ORCID y en Google Schoolar, y pondré un enlace con mis
publicaciones (en muchos casos con el PDF disponible, escribame si
necesitase alguno que no apareciese). Además, he sido hasta 2019 el Chair
del &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.tflsgo.org&#x2F;&quot;&gt;IEEE CIS Task Force on Large-Scale Global
Optimization&lt;&#x2F;a&gt;, ya que es un tipo de optimización en el
que tengo especial interés (he ganado dos competiciones internacionales
sobre LSGO, en 2010 y más recientemente en 2018). Formo parte del Instituto
Andaluz Interuniversitario en &lt;em&gt;Data Science and Computational Intelligence&lt;&#x2F;em&gt;
&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;dasci.es&#x2F;&quot;&gt;DaSCI&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Como profesor, enseño en la &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.ugr.es&quot;&gt;Universidad de Granada&lt;&#x2F;a&gt;, en
la &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;etsiit.ugr.es&#x2F;&quot;&gt;Escuela Técnica Superior de Ingeniería&lt;&#x2F;a&gt;, y
durante más de 10 años fui profesor de la Universidad de Cádiz, en donde
dejé parte de mi corazón (esa gente fueron más amigos que colegas).&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Como informático adoro programar, en distintos lenguajes (C++, Java, ...) y
en particular tengo predilección por Python y otros lenguajes prometedores
(como Rust o Julia).&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Me defino a mí mismo como Linuxero, Linux es el único Sistema Operativo de
mi ordenador personal por más de 15 años. También soy un feliz usuario de
Emacs (y anteriormente de Vim, adoro ambos). Además, defensor del &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.gnu.org&#x2F;philosophy&#x2F;free-sw.html&quot;&gt;Software
Libre&lt;&#x2F;a&gt; (llegué a ser durante
años Secretario de la Oficina de Software Libre, OSLUCA, de la Universidad
de Cádiz).&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Como persona del mundo real, adoro leer libros de todo tipo, ver películas y
pasar la mayor parte de mi tiempo libre con mi novia Amalia ❤️.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>Sobre enseñanza online</title>
        <published>2020-03-27T00:00:00+00:00</published>
        <updated>2020-03-27T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.danimolina.net/posts/online-teaching/"/>
        <id>https://www.danimolina.net/posts/online-teaching/</id>
        
        <summary type="html">&lt;p&gt;Estos días nos encontrados encerrados en nuestras casas por el coronavirus
(COVID-19), por lo que en mi universidad (en  Granada), como en el resto de
universidades de España, tuvimos que convertirnos en &lt;em&gt;expertos en enseñanza
online&lt;&#x2F;em&gt; en un fín de semana.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="es">
        <title>Introducción a Julia</title>
        <published>2020-01-20T00:00:00+00:00</published>
        <updated>2020-01-20T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.danimolina.net/posts/julia-intro/"/>
        <id>https://www.danimolina.net/posts/julia-intro/</id>
        
        <content type="html" xml:base="https://www.danimolina.net/posts/julia-intro/">&lt;p&gt;El año pasado empecé a trabajar en un lenguaje de programación prometedor,
&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;julialang.org&#x2F;&quot;&gt;Julia&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Incluso dí una charla orientada a personas con conocimientos de programación
(lo comparo mucho en la charla con Python).&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dmolina&#x2F;julia%5Fpresentacion&#x2F;blob&#x2F;master&#x2F;Julia%5FPresentacion%5Fslides.pdf&quot;&gt;Charla en Castellano&lt;&#x2F;a&gt;
&lt;img src=&quot;https:&#x2F;&#x2F;www.danimolina.net&#x2F;posts&#x2F;julia-intro&#x2F;julia_intro_es.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The resources of that talk are available at &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dmolina&#x2F;julia%5Fpresentacion&#x2F;&quot;&gt;Github
Repository&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>Fill-more o la importancia de leer la documentación</title>
        <published>2017-12-15T00:00:00+00:00</published>
        <updated>2017-12-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.danimolina.net/posts/emacs-justify/"/>
        <id>https://www.danimolina.net/posts/emacs-justify/</id>
        
        <content type="html" xml:base="https://www.danimolina.net/posts/emacs-justify/">&lt;p&gt;Me &lt;strong&gt;encanta&lt;&#x2F;strong&gt;* Emacs y el modo auto-fill. Cuando trabajo lo uso siempre para
hacer más fácil leer el texto (con un pequeño valor, con 80 o 100). Luego, si
tengo que copiarlo a un documento Word (cuando colaboro con otros&#x2F;as) o en un
texto  (como someter una revisión) simplemene ajusto el &lt;code&gt;fill-column&lt;&#x2F;code&gt; a un valor
muy alto (2000 o similar), con C-x f, y luego copio todo el texto.&lt;&#x2F;p&gt;
&lt;p&gt;Hasta ahora había sufrido en silencio un pequeño problema en modo texto
&lt;em&gt;text-mode&lt;&#x2F;em&gt; (no en org-mode). Si pones&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;Texto.

- Item 1.
- Item 2.
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Después del &lt;code&gt;fill-mode&lt;&#x2F;code&gt;, tienes:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;Text.

- Item 1 Item 2.
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Y para arreglarlo tienes que poner una línea entre ambas:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;Texto.

- Item 1.

- Item 2.
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;(La línea entre Teto y el primer item también es necesaria).&lt;&#x2F;p&gt;
&lt;p&gt;Pensé que era algo inevitable, pero leyendo la documentación,&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.emacswiki.org&#x2F;emacs&#x2F;FillParagraph&quot;&gt;https:&#x2F;&#x2F;www.emacswiki.org&#x2F;emacs&#x2F;FillParagraph&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;He aprendido que con una simple línea en elisp ese comportamiento se arregla:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;elisp&quot;&gt;;; The original value is &amp;quot;\f\\|[      ]*$&amp;quot;, so we add the bullets (-), (+), and (*).
;; There is no need for &amp;quot;^&amp;quot; as the regexp is matched at the beginning of line.
(setq paragraph-start &amp;quot;\f\\|[ \t]*$\\|[ \t]*[-+*] &amp;quot;)
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Debo de comprobar la documentación disponible más a menudo :-).&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>Elfeed: Usando emacs para leer RSS</title>
        <published>2017-10-12T00:00:00+00:00</published>
        <updated>2017-10-12T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.danimolina.net/posts/emacs-rss/"/>
        <id>https://www.danimolina.net/posts/emacs-rss/</id>
        
        <content type="html" xml:base="https://www.danimolina.net/posts/emacs-rss/">&lt;p&gt;En los últimos años he usado Emacs para casi todas mis tareas diarias:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Leyendo mis emails (con &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;www.djcbsoftware.nl&#x2F;code&#x2F;mu&#x2F;mu4e.html&quot;&gt;mu4e&lt;&#x2F;a&gt;).&lt;&#x2F;li&gt;
&lt;li&gt;Creando las transparencias de mis cursos usando org-beamer o pandoc.&lt;&#x2F;li&gt;
&lt;li&gt;Usando dired para navegar por el sistema de ficheros.&lt;&#x2F;li&gt;
&lt;li&gt;Publicar este blog. La nueva versión usa &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;getzola.org&#x2F;&quot;&gt;zola&lt;&#x2F;a&gt; y es
libremente accesible &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;codeberg.org&#x2F;dmolina&#x2F;personal_page&quot;&gt;codeberg&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Lo último en integrar en emacs es leer blogs y noticias de fuentes RSS.
Añadir &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;skeeto&#x2F;elfeed&quot;&gt;elfeed&lt;&#x2F;a&gt; y
&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;remyhonig&#x2F;elfeed-org&quot;&gt;elfeed-org&lt;&#x2F;a&gt; fui capaz de crear RSS. elfeed-org
es muy simple, y permite añadir las fuentes como item en org-mode:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;text&quot;&gt;- Blogs                                                              :elfeed:

  - https:&#x2F;&#x2F;www.meneame.net&#x2F;rss                                  :news:portada:
  - https:&#x2F;&#x2F;www.meneame.net&#x2F;rss?status=queued                            :news:
  - http:&#x2F;&#x2F;planet.emacsen.org&#x2F;atom.xml                                :emacs:
  - https:&#x2F;&#x2F;www.reddit.com&#x2F;r&#x2F;programming&#x2F;.rss                     :programming:
  ...
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Las etiquetas para cada fuente serán compartidas por todos los artículos.&lt;&#x2F;p&gt;
&lt;p&gt;Luego, cargando &lt;strong&gt;elfeed&lt;&#x2F;strong&gt;, puede ser obtenido una pantalla mostrando los
distintos artículos.&lt;&#x2F;p&gt;
&lt;figure&gt;
    &lt;img src=&quot;elfeed.png&quot; alt=&quot;Prueba de elfeed&quot;&gt;
    &lt;figcaption&gt;Prueba de elfeed&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Y seleccionando el artículo, puede ser abierto, leído y abierto usando el
navegador por defecto.&lt;&#x2F;p&gt;
&lt;figure&gt;
    &lt;img src=&quot;elfeed2.png&quot; alt=&quot;Lectura de artículo con elfeed&quot;&gt;
    &lt;figcaption&gt;Lectura de artículo con elfeed&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Mis opiniones sobre elfeed:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Muy simple de usar.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;El uso de etiquetas es muy poderoso, no solo reciben las etiquetas de la
categoría, puedes añadir las que quieras.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;El filtro de búsqueda es simple y potente, puedes filtrar tanto por fechas
como por etiquetasa.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;El filtro de búsqueda se puede guardar en el marcapáginas (&lt;em&gt;bookmark&lt;&#x2F;em&gt;), usando
C-x r b puede verse los artículos usando un filtro específico.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;En resumen, &lt;strong&gt;elfeed&lt;&#x2F;strong&gt; ha sido un gran descubrimiento. Si usas emacs, dale un
intento.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>Mejorando el rendimiento en Python</title>
        <published>2012-07-15T00:00:00+00:00</published>
        <updated>2012-07-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.danimolina.net/improving-python/"/>
        <id>https://www.danimolina.net/improving-python/</id>
        
        <content type="html" xml:base="https://www.danimolina.net/improving-python/">&lt;p&gt;Todo el código fuente de este post está disponible en &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dmolina&#x2F;pyreal&quot;&gt;github&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Tengo predilección por Python. Para mí, es un gran lenguaje para crear prototipos en
muchas áreas. Para mi trabajo de investigación, suelo crear&#x2F;diseñar algoritmos de optimización continua utilizando
&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Evolutionary_algorithm&quot;&gt;algoritmos evolutivos&lt;&#x2F;a&gt;. Para estos algoritmos, lenguajes como C&#x2F;C++ o Java son muy utilizados, especialmente por su
buen rendimiento (para publicar, es habitual tener que hacer muchas comparaciones entre algoritmos, por lo que el rendimiento
puede ser crítico. Sin embargo, para probar nuevas ideas, muchos autores utilizan otras herramientas como Mathlab que reduce el
tiempo de desarrollo a costa de un mayor tiempo de computación.&lt;&#x2F;p&gt;
&lt;p&gt;Estoy de acuerdo en que Mathlab es genial para los algoritmos numéricos, pero sigo prefiriendo Python sobre Mathlab, porque me siento más cómodo
con él, y tengo muchas bibliotecas, y es más sencillo llamar a código en otros lenguajes, escrito en C o Java. Eso nos permite
aumentar el rendimiento, y me gusta probar cuánto se puede mejorar.&lt;&#x2F;p&gt;
&lt;p&gt;Hace varios meses, empecé a escribir mi algoritmo más exitoso, &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;sci2s.ugr.es&#x2F;EAMHCO&#x2F;#macmals&quot;&gt;Algoritmos Meméticos basados en el Encadenamiento LS&lt;&#x2F;a&gt;, en Python. Tenía varias
dudas sobre el rendimiento, así que empiezo a escribir un elemento, un Algoritmo Genético de Estado Estable, en Python.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;calling-code-from-python&quot;&gt;Llamando a código C&#x2F;C++ desde python&lt;&#x2F;h2&gt;
&lt;p&gt;El primer reto que tuve que afrontar fue permitir que mi programa en python utilizara las mismas funciones de referencia que otras implementaciones,
&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;sci2s.ugr.es&#x2F;EAMHCO&#x2F;#TestF&quot;&gt;CEC&#x27;2005 benchmark&lt;&#x2F;a&gt;.
Este benchmark define las funciones a optimizar, por lo que su función principal es
evaluar mis soluciones, cuando cada solución es un vector de números reales, con un valor real de fitness.
El código del benchmark fue implementado (por sus autores) en C&#x2F;C++. Por lo tanto, mi código python tiene que llamar al código C++.&lt;&#x2F;p&gt;
&lt;p&gt;Para ello, he utilizado la librería &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;www.boost.org&#x2F;doc&#x2F;libs&#x2F;1_50_0&#x2F;libs&#x2F;python&#x2F;doc&#x2F;index.html&quot;&gt;boost::python&lt;&#x2F;a&gt;, que es, en mi opinión, la forma más sencilla de llamar al código C&#x2F;C++, especialmente
cuando utilizamos el paquete &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;numpy.org&#x2F;&quot;&gt;numpy&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;En mi caso, es muy sencillo, porque necesito pocas funciones:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;python&quot;&gt;#include &amp;lt;boost&#x2F;python.hpp&amp;gt;
#include &amp;lt;boost&#x2F;python&#x2F;numeric.hpp&amp;gt;
#include &amp;lt;boost&#x2F;python&#x2F;list.hpp&amp;gt;
#include &amp;lt;iostream&amp;gt;
#include &amp;quot;cec2005&#x2F;cec2005.h&amp;quot;
#include &amp;quot;cec2005&#x2F;srandom.h&amp;quot;

using namespace boost::python;

Random r(new SRandom(12345679));

void set_function(int fun, int dim) {
    init_cec2005(&amp;amp;r, fun, dim);
}

double evalua(const numeric::array &amp;amp;el) {
   const tuple &amp;amp;shape = extract&amp;lt;tuple&amp;gt;(el.attr(&amp;quot;shape&amp;quot;));
   unsigned n = boost::python::extract&amp;lt;unsigned&amp;gt;(shape[0]);
   double *tmp = new double[n];
  for(unsigned int i = 0; i &amp;lt; n; i++)
    {
      tmp[i] = boost::python::extract&amp;lt;double&amp;gt;(el[i]);
    }
  double result = eval_cec2005(tmp, n);
  delete tmp;
  return result;
}
...

BOOST_PYTHON_MODULE(libpycec2005)
{
    using namespace boost::python;
    numeric::array::set_module_and_type( &amp;quot;numpy&amp;quot;, &amp;quot;ndarray&amp;quot;);
    def(&amp;quot;config&amp;quot;, &amp;amp;set_function);
    def(&amp;quot;evaluate&amp;quot;, &amp;amp;evalua);
    ...
}
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Más información en la buena documentación de &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;www.boost.org&#x2F;doc&#x2F;libs&#x2F;1_50_0&#x2F;libs&#x2F;python&#x2F;doc&#x2F;index.html&quot;&gt;boost::python&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Uno puede llamar al código C&#x2F;C++, hemos implementado el algoritmo en código python.
El código de prueba fue el siguiente:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;python&quot;&gt;from ssga import SSGA
from readargs import ArgsCEC05
import libpycec2005 as cec2005
import numpy

def check_dimension(option, opt, value):
    if value not in [2, 10, 30, 50]:
        raise OptionValueError(
            &amp;quot;option %s: invalid dimensionality value: %r&amp;quot; % (opt, value))

def main():
    &amp;quot;&amp;quot;&amp;quot;
    Main program
    &amp;quot;&amp;quot;&amp;quot;
    args = ArgsCEC05()

    if  args.hasError:
        args.print_help_exit()

    fun = args.function
    dim = args.dimension

    print &amp;quot;Function: %d&amp;quot; %fun
    print &amp;quot;Dimension: %d&amp;quot; %dim
    cec2005.config(fun, dim)
    domain = cec2005.domain(fun)
    print &amp;quot;Domain: &amp;quot;, domain
    ea = SSGA(domain=domain, size=60, dim=dim, fitness=cec2005.evaluate)

    for x in xrange(25):
        ea.run(maxeval=dim*10000)
        [bestsol, bestfit] = ea.getBest()
        print &amp;quot;BestSol: &amp;quot;, bestsol
        print &amp;quot;BestFitness: %e&amp;quot; %bestfit
        ea.reset()

if __name__ == &amp;quot;__main__&amp;quot;:
    main()
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Este código fuente ejecuta el algoritmo 25 veces, y en cada ejecución el algoritmo se detiene cuando se crean 10000*dim soluciones.
Estas condiciones están indicadas en la &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;sci2s.ugr.es&#x2F;EAMHCO&#x2F;Tech-Report-May-30-05.pdf&quot;&gt;especificación del benchmark&lt;&#x2F;a&gt;. El único parámetro fue la función (-f, se utilizó la función 1 por
por defecto) y la dimensión (-d) de 10, 30, 50.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;perfilando&quot;&gt;Perfilando el tiempo de computación&lt;&#x2F;h2&gt;
&lt;p&gt;¿Cuánto tiempo tarda? He cambiado xrange(25) por xrange(1) y hemos ejecutado su versión actual.
El tiempo final fue de 7 minutos para la dimensión 10, y 21 minutos para la dimensión 30 (para una sola función).&lt;&#x2F;p&gt;
&lt;p&gt;Como me gusta hacer cosas más interesantes, que sólo esperar el tiempo de computación, yo uso el perfil, sólo
una ejecución para la función, para detectar las funciones&#x2F;método más costosos en tiempo de computación.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;python -m cProfile runcec.py -f 1 -d 10
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The output was the following:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;        2943600 function calls (2943531 primitive calls) in 31.031 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
....
      1    0.001    0.001    0.126    0.126 ssga.py:1(&amp;lt;module&amp;gt;)
    99940    0.561    0.000   17.463    0.000 ssga.py:109(cross)
        1    0.000    0.000    0.000    0.000 ssga.py:123(reset)
        1    5.559    5.559   51.129   51.129 ssga.py:126(run)
        1    0.000    0.000    0.000    0.000 ssga.py:14(__init__)
        1    0.000    0.000    0.000    0.000 ssga.py:158(getBest)
        1    0.000    0.000    0.000    0.000 ssga.py:31(set_mutation_rate)
    99940    0.730    0.000    1.885    0.000 ssga.py:45(mutation)
    12438    0.286    0.000    0.758    0.000 ssga.py:50(mutationBGA)
        1    0.002    0.002    0.002    0.002 ssga.py:77(initPopulation)
   105883    1.101    0.000    5.604    0.000 ssga.py:89(updateWorst)
        1    0.000    0.000    0.000    0.000 ssga.py:9(SSGA)
    99940    1.049    0.000   20.617    0.000 ssga.py:97(getParents)
...

&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Con el perfil podemos observar los métodos más costosos de nuestro código:
getParents (20 segundos), operador de cruce (17 segundos) y updateWorst (5 segundos).
Estos métodos suponen el 85% del tiempo de computación, y los dos primeros el 74%
del tiempo de cálculo.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;optimización-del-código&quot;&gt;Optimización del código&lt;&#x2F;h2&gt;
&lt;p&gt;Eso demuestra que la mayor parte del tiempo de computación se debe a una minoría del código,
sólo tres métodos. Si podemos optimizar estos métodos, nuestro código podría
mejorado mucho.&lt;&#x2F;p&gt;
&lt;p&gt;Podemos utilizar de nuevo el paquete &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;www.boost.org&#x2F;doc&#x2F;libs&#x2F;1_50_0&#x2F;libs&#x2F;python&#x2F;doc&#x2F;index.html&quot;&gt;boost::python&lt;&#x2F;a&gt;, pero es un poco tedioso utilizarlo. Por lo tanto, hemos
utilizado el paquete &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;www.cython.org&#x2F;&quot;&gt;cython&lt;&#x2F;a&gt;. Con cython podemos optimizar el código fuente añadiendo
información sobre los tipos.&lt;&#x2F;p&gt;
&lt;p&gt;Por ejemplo, en lugar del siguiente código&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;python&quot;&gt;import numpy as np

def distance(ind1,ind2):
    &amp;quot;&amp;quot;&amp;quot;
    Euclidean distance
    ind1 -- first array to compare
    ind2 -- second array to compare

    Return euclidean distance between the individuals

    &amp;gt;&amp;gt;&amp;gt; from numpy.random import rand
    &amp;gt;&amp;gt;&amp;gt; import numpy as np
    &amp;gt;&amp;gt;&amp;gt; dim = 30
    &amp;gt;&amp;gt;&amp;gt; sol = rand(dim)
    &amp;gt;&amp;gt;&amp;gt; distance(sol,sol)
    0.0
    &amp;gt;&amp;gt;&amp;gt; ref=np.zeros(dim)
    &amp;gt;&amp;gt;&amp;gt; dist=distance(sol,ref)
    &amp;gt;&amp;gt;&amp;gt; dist &amp;gt; 0
    True
    &amp;gt;&amp;gt;&amp;gt; dist2 = distance(sol*2,ref)
    &amp;gt;&amp;gt;&amp;gt; 2*dist == dist2
    True
    &amp;quot;&amp;quot;&amp;quot;
    dif = ind1-ind2
    sum = (dif*dif).sum()
    return math.sqrt(sum)
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Podemos escribir:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;python&quot;&gt;cimport numpy as np
cimport cython
DTYPE = np.double
ctypedef np.double_t DTYPE_t
ctypedef np.int_t BTYPE_t

def distance(np.ndarray[DTYPE_t, ndim=1]ind1, np.ndarray[DTYPE_t, ndim=1] ind2):
    &amp;quot;&amp;quot;&amp;quot;
    Euclidean distance
    ind1 -- first array to compare
    ind2 -- second array to compare

    ....
    &amp;quot;&amp;quot;&amp;quot;
    cdef np.ndarray[DTYPE_t, ndim=1] dif = ind1-ind2
    cdef double sum = (dif*dif).sum()
    return math.sqrt(sum)
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Podemos ver que sigue siendo muy legible. sólo hemos puesto información sobre el tipo
y dimensión en los parámetros del vector y sobre las variables, usando la palabra clave
cdef.&lt;&#x2F;p&gt;
&lt;p&gt;Veamos como ejemplo el primer método, el operador de cruce, implementado
en el método crossBLX:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;python&quot;&gt;import numpy as np
import math

def crossBLX(mother,parent,domain,alpha):
    &amp;quot;&amp;quot;&amp;quot;
    crossover operator BLX-alpha

    mother -- mother (first individual)
    parent -- parent (second individual)
    domain -- domain to check
    alpha  -- parameter alpha

    Returns the new children following the expression children = random(x-alpha*dif, y+alpha*dif),
                where dif=abs(x,y) and x=lower(mother,parents), y=upper(mother,parents)

    &amp;gt;&amp;gt;&amp;gt; import numpy as np
    &amp;gt;&amp;gt;&amp;gt; low=-5
    &amp;gt;&amp;gt;&amp;gt; upper = 5
    &amp;gt;&amp;gt;&amp;gt; dim=30
    &amp;gt;&amp;gt;&amp;gt; sol = np.array([1,2,3,2,1])
    &amp;gt;&amp;gt;&amp;gt; crossBLX(sol,sol,[low,upper],0)
    array([ 1.,  2.,  3.,  2.,  1.])
    &amp;quot;&amp;quot;&amp;quot;
    diff = abs(mother-parent)
    dim = mother.size
    I=diff*alpha
    points = np.array([mother,parent])
    A=np.amin(points,axis=0)-I
    B=np.amax(points,axis=0)+I
    children = np.random.uniform(A,B,dim)
    [low,high]=domain
    return np.clip(children, low, high)

&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Podemos ver que es muy sencillo de implementar usando numpy, pero sigue siendo muy lento. Con cython he
definido implementar directamente las numerosas operaciones, el siguiente código:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;python&quot;&gt;def crossBLX(np.ndarray[DTYPE_t, ndim=1] mother,np.ndarray[DTYPE_t, ndim=1] parent,list domain, double alpha):
    &amp;quot;&amp;quot;&amp;quot;
    ...
    &amp;quot;&amp;quot;&amp;quot;
    cdef np.ndarray[DTYPE_t, ndim=1] C, r
    cdef int low, high, dim
    cdef double x, y
    cdef double I, A, B
    cdef unsigned i
    [low,high]=domain
    dim = mother.shape[0]
    C = np.zeros(dim)
    r = random.randreal(0,1,dim)

    for i in range(dim):
        if mother[i] &amp;lt; parent[i]:
           (x,y) = (mother[i],parent[i])
        else:
           (y,x) = (mother[i],parent[i])

        I = alpha*(y-x)
        A=x-I
        B=y+I

        if (A &amp;lt; low):
            A = low
        if (B &amp;gt; high):
            B = high

        C[i] = A+r[i]*(B-A)

    return C

&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Es cierto que el código fuente es más complicado, pero sigue siendo muy legible.
He comparado las dos implementaciones para asegurarme de que ambas devuelven los mismos valores.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;measuring-the-improvement&quot;&gt;Midiendo la mejora&lt;&#x2F;h2&gt;
&lt;p&gt;¿Cuánto cuestan estos pequeños cambios en el código?
He vuelto a perfilar el código fuente y me da:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;bash&quot;&gt;         1020045 function calls (1019976 primitive calls) in 18.003 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
....
        1    0.001    0.001    0.127    0.127 ssga.py:1(&amp;lt;module&amp;gt;)
    99940    0.425    0.000    2.432    0.000 ssga.py:109(cross)
        1    0.000    0.000    0.000    0.000 ssga.py:123(reset)
        1    5.415    5.415   17.864   17.864 ssga.py:126(run)
        1    0.000    0.000    0.000    0.000 ssga.py:14(__init__)
        1    0.000    0.000    0.000    0.000 ssga.py:158(getBest)
        1    0.000    0.000    0.000    0.000 ssga.py:31(set_mutation_rate)
    99940    0.699    0.000    2.006    0.000 ssga.py:45(mutation)
    12544    0.338    0.000    0.929    0.000 ssga.py:50(mutationBGA)
        1    0.002    0.002    0.002    0.002 ssga.py:77(initPopulation)
   105959    0.775    0.000    1.343    0.000 ssga.py:89(updateWorst)
        1    0.000    0.000    0.000    0.000 ssga.py:9(SSGA)
    99940    0.940    0.000    6.665    0.000 ssga.py:97(getParents)
....

&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Podemos ver la mejora obtenida.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Method&lt;&#x2F;th&gt;&lt;th&gt;Python&lt;&#x2F;th&gt;&lt;th&gt;Cython&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;cross          :&lt;&#x2F;td&gt;&lt;td&gt;17.4&lt;&#x2F;td&gt;&lt;td&gt;2.4&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;getParents     :&lt;&#x2F;td&gt;&lt;td&gt;20.6&lt;&#x2F;td&gt;&lt;td&gt;6.6&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;updateWorst    :&lt;&#x2F;td&gt;&lt;td&gt;5.6&lt;&#x2F;td&gt;&lt;td&gt;1.3&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Total&lt;&#x2F;td&gt;&lt;td&gt;43.6&lt;&#x2F;td&gt;&lt;td&gt;10.3&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;El nuevo código tarda sólo un 23% del tiempo de cálculo del código anterior.
Con estos cambios, hemos reducido el tiempo total de 51 segundos a 18 de código.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;in-perspectiva&quot;&gt;En perspectiva&lt;&#x2F;h2&gt;
&lt;p&gt;Ahora, ejecuto el código fuente sin el perfil, y pruebo el código fuente obteniendo el
siguiente tiempo:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Method&lt;&#x2F;th&gt;&lt;th&gt;dim=10&lt;&#x2F;th&gt;&lt;th&gt;dim=30&lt;&#x2F;th&gt;&lt;th&gt;dim=50&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Python&lt;&#x2F;td&gt;&lt;td&gt;44s&lt;&#x2F;td&gt;&lt;td&gt;3240s (54m)&lt;&#x2F;td&gt;&lt;td&gt;--&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Cython&lt;&#x2F;td&gt;&lt;td&gt;10s&lt;&#x2F;td&gt;&lt;td&gt;28s&lt;&#x2F;td&gt;&lt;td&gt;48s&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Improvement&lt;&#x2F;td&gt;&lt;td&gt;77%&lt;&#x2F;td&gt;&lt;td&gt;99%&lt;&#x2F;td&gt;&lt;td&gt;---&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;En la siguiente tabla, comprobamos el tiempo máximo para una y 25 ejecuciones (el tiempo depende de la
función utilizada).&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;#functions&lt;&#x2F;th&gt;&lt;th&gt;dim=10&lt;&#x2F;th&gt;&lt;th&gt;dim=30&lt;&#x2F;th&gt;&lt;th&gt;dim=50&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;10s&#x2F;18s&lt;&#x2F;td&gt;&lt;td&gt;28s&#x2F;40s&lt;&#x2F;td&gt;&lt;td&gt;48s&#x2F;1m&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;25&lt;&#x2F;td&gt;&lt;td&gt;3&#x2F;7m&lt;&#x2F;td&gt;&lt;td&gt;15&#x2F;21m&lt;&#x2F;td&gt;&lt;td&gt;38m&#x2F;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Así, el tiempo total de cálculo es de 7 minutos para la dimensión 10, y de 21 minutos para la dimensión 30.
Estas cifras son muy aceptables, especialmente porque podemos probar en paralelo las diferentes funciones
en un cluster de ordenadores. Desgraciadamente, una implementación en Mathlab no sólo llevaría más tiempo, sino que
sino que además, por razones de licencia, no podría ejecutarse en paralelo sin límite.&lt;&#x2F;p&gt;
&lt;p&gt;En resumen, podemos utilizar código python, no sólo para crear prototipos experimentales, sino también para crear
prototipos funcionales.&lt;&#x2F;p&gt;
&lt;p&gt;Y sobre el posible problema de las pruebas, he estado trabajando en ello, pero creo que es suficiente para un post,
¿no? :-)&lt;&#x2F;p&gt;
&lt;p&gt;Todo el código referido en el post, tanto en python como en cython, está disponible en &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dmolina&#x2F;pyreal&quot;&gt;github&lt;&#x2F;a&gt;, por si quieres verlo.&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
