lunes, julio 31, 2017

Renderizar Markdown en Python: Las extensiones

Lo que hace interesante al módulo de Markdown en Python es la incorporación de un API que permite añadir extensiones y adaptarlo a las necesidades específicas. Existe todo un conjunto de extensiones oficiales, aquellas que son soportadas por los autores del módulo markdown y un buen conjunto de extensiones de terceros que pueden servir para añadir el comportamiento que nos interese al sistema.

Por ejemplo, si se quiere usar alguna de los añadidos a markdown de github, se puede hacer con la extensión py-gfm:

$ virtualenv markdown
$ cd markdown
$ source bin/activate
$ # Se instala markdown automáticamente
$ pip install py-gfm

Para renderizar ficheros que use esta extensión, se puede usar el siguiente código:

import markdown
from mdx_gfm import GithubFlavoredMarkdownExtension
import sys

md = markdown.Markdown(extensions=[GithubFlavoredMarkdownExtension()])
for filename in sys.argv[1:]:
    with open(filename, mode="r") as f:
        content = f.read()
        html = md.convert(content.decode('utf-8'))
        print html.encode('utf-8')

Al igual que ocurre con el módulo normal, desde la propia línea de comandos es posible indicar que se cargue una extensión, para el ejemplo anterior:

python  g-m markdown -x mdx_gfm file1 file2 ...

La opción -x especifica el path hasta el módulo donde se encuentra la extensión.

Existe documentación para crear una extensión y añadirla al sistema de markdown. No es demasiado complicado desarrollar una extensión, aunque desde mi punto de vista la documentación no es del todo clara. Un ejemplo de extensión, que añade a todas las etiquetas una clase parrafo sería el siguiente código. Dejo para otra entrada mis notas de como desarrollar nuevas extensiones.

from markdown.util import etree
from markdown.treeprocessors import Treeprocessor
from markdown.extensions import Extension

class ParagraphProcessor(Treeprocessor):
    def __init__(self, md):
        super(ParagraphProcessor, self).__init__(md)
    def set_paragraph_style(self, element):
        for child in element:
            if child.tag == "p":
                child.set("class", "parrafo") #set the class attribute
            self.set_paragraph_style(child)
    def run(self, root):
        self.set_paragraph_style(root)

class ParagraphClassExtension(Extension):
     def extendMarkdown(self, md, md_globals):
         md.treeprocessors.add('paragraphProcessor', ParagraphProcessor(md),">inline")

Si suponemos que el código anterior está en un módulo llamado pproc y que está en nuestro PYTHONPATH se puede usar con:

import markdown
from mdx_gfm import GithubFlavoredMarkdownExtension
from pproc import ParagraphClassExtension
import sys

md = markdown.Markdown(extensions=[GithubFlavoredMarkdownExtension(), ParagraphClassExtension()])
for filename in sys.argv[1:]:
    with open(filename, mode="r") as f:
        content = f.read()
        html = md.convert(content.decode('utf-8'))
        print html.encode('utf-8')

sábado, julio 29, 2017

Alimentado a los gigantes de Internet

Facebook tiene un par patentes curiosas: La primera, Augmenting text messages with emotion information, busca añadir información sobre las emociones del sujeto analizando la manera que está escribiendo los mensajes en un dispositivo. La segunda , Techniques for emotion detection and content delivery, intenta analizar las emociones de una persona capturando imágenes de las caras de los usaurios y pasándoselas a un API para analizar si se está triste, contento o enfadado.

La segunda patente es bastante interesante porque existen métodos de activar las cámaras de los móviles o de los portátiles de tal manera que no se note que te están grabando. Y desde el punto de vista de una empresa como Facebook, cuyo principal fuente de ingresos es la publicidad, tener acceso discretamente al estado de ánimo de un usuario de la red socia es una mina de información para ofrecer a los anunciantes.

En esta misma línea, la entrevista con el CEO de Roomba, conocida por sus aspiradoras inteligentes. Una de las opciones que quieren añadir es la posibilidad - con el consentimiento del cliente - de compartir los planos de las casas con terceros.

Esto son sólo tres ejemplos de lo que se está moviendo en el campo de minado de datos para alimentar las grandes máquinas de análisis de los gigantes de Internet. Si, ya sé que a día de hoy cualquier Android o iPhone está mandando continuamente datos a su base y se hace cada vez más complicado desactivar esos servicios sin dejar la funcionalidad de los sistemas bastante recortadas. A fin de cuentas, el valor añadido de los gigantes de Internet es la información que atesoran.

Tambien hay que tener en ceunta que estas empresas son en su mayoría estadounidenses y hay que tener en cuenta que la inmensa mayoría de los procesos de minado de datos en EEUU no están regulados, es decir, las empresas puede capturar esos datos y usarlos para lo que les de la gana, incluyendo venderlos a terceros - hay ciertas excepciones como datos médicos o el acceso a los datos educativos -

Ni que decir tiene que a la inmensa mayoría de los usuarios de estos servicios les importa más bien poco el valor de sus datos. Ellos reciben un servicio gratuito que les resuelve un problema.

Si no pagas por un producto es porque tú eres el producto

viernes, julio 28, 2017

Quejas absurdas

El vuelo que realiza los aviones apagafuegos pilotados por miembros del 43 Grupo de Fuerzas Aéreas es muy especial: A baja cota y a velocidad, en un entorno de turbulencias por las llamas de los incendios y donde la orografía del terreno puede comprometer la operación. Además, cargan agua en pantanos, el mar o ríos, una maniobra que hay que ejecutar con precisión y que no está exenta de peligros. Para poder llegar a la excelencia y colaborar en la lucha contra incendios de manera efectiva, las tripulaciones de esta unidad entrenan a lo largo de todo el año.

Por eso, me parece increible que los medios de comunicación se dedican a hacer de simples altavoces de las quejas de personas cuando estas unidades están entrenando para poder ayudar a combatir incendios en sus zonas.

La Voz de Galicia titulaba Un avión antiincendios asusta a los bañistas de Barra con una maniobra a baja altura. Simplemente estaban buscando y reconociendo el terreno para poder cargar agua en caso de incendio. ¿A qué altura se creen que operan estos aviones cuando descargan aguas sobre las llamas?. Tiene narices, leer este tipo de noticias en un medio gallego, tierra castiga por los incendios forestales - muchos de ellos provocados - , donde operó por primera vez el 43 Grupo de Fuerzas aéreas y donde su aportación en la lucha contra incendios tiene un valor incalculable.

En la misma línea, el año pasado el Ayuntamiento de Punta Umbría en Huelva, pedía explicaciones porque uno de los hidros del 43 estaba entrenado carga de agua en la playa. Habría que preguntarle a los responsables municipales que opinan de la actuación en el incencio de Moguer o en Gibraléon, por hablar de dos ocurridos en Huelva en estos últimos tiempos y como estas tripulaciones han ayudado en la extinción de los mismos.

Parece mentira que estas personas se estén jugando el bigote para apagar incencios foretasles y aquí la prensa se entretenga en este tipo de supuestas noticias. ¿Tanto cuesta buscar un poco de información para entender el por qué de ese tipo de operación? Se supone que los que escriben esos artículos son periodistas que buscan y contrastan la información... se supone.

Quiero aprovechar esta entrada para agradecer a todos los miembros del 43 Grupo de Fuerzas aéreas su gran labor en la extinción de incendios. Gracias por estar ahí.

¡Apaga y vámonos!

miércoles, julio 26, 2017

Renderizar Markdown en Python

Markdown es un lenguaje de marcas creado por John Grubber, que buscaba un formato de texto estructurado que fuera fácil de escribir y de leer. Un fichero escrito en este formato se procesa con la utilidad del mismo nombre para generar contenido en XHTML / HTML válido. Con el paso del tiempo, el uso de este formato se ha hecho muy popular y plataformas como Git Hub han desarrollado su propia versión adaptada a sus sistema de comentarios y documentación.

Un ejemplo de fichero de este tipo:

# Encabezado 1
## Encabezado 2

 * Elemento 1
 * Elemento 2 
 * Elemento 3 

Esto es un [Enlace a Google](www.google.com)

El módulo de Python Python-Markdown implementa la especificación de John Grubber - con algunos detalles diferentes - y proporciona un API para añadir extensiones. De esta manera, es sencillo adaptarse a diferentes versiones de Markdown.

Si se trabaja con un entorno virtual, se puede instalar con:

$ virtualenv markdown
$ cd markdown
$ source bin/activate
$ pip install markdown

Un script sencillo que hará la conversión a html de un fichero UTF-8 que usa markdown que se pase como parámetros

import markdown
import sys

md = markdown.Markdown()
for filename in sys.argv[1:]:
    with open(filename, mode="r") as f:
        content = f.read()
        html = md.convert(content.decode('utf-8'))
        print html.encode('utf-8')

Si se aplica al ejemplo anterior, el código HTML resultante es:

<h1>Encabezado 1</h1>
<h2>Encabezado 2</h2>
<ul>
<li>Elemento 1</li>
<li>Elemento 2</li>
<li>Elemento 3</li>
</ul>
<p>Esto es un <a href="www.google.com">Enlace a Google</a></p>

Comentar que el módulo de Python ya tiene una utilidad para hacer lo mismo, se llama de la siguiente manera:

python -m markdown fichero.md

martes, julio 18, 2017

Los ecos del boom de la radio

El próximo dia 22 de Julio, a las 21:00 en el Puerta Antilla Grand Hotel, en La Antilla, Lepe tendrá lugar la presentación del libro de Santiago Talaya, Los ecos del boom de la radio publicado por la editorial Los Papeles del Sitio. El libro recorrer la historia de la radio española desde la Onda Media a la FM. Originalmente fue un trabajo para el Master de Radio Nacional que realizó Santiago en el año 1997 y que fue ampliando hasta el año 2007. El dinero recaudado será donado en su totalidad a la Asociación Española de Lucha Contra el Cancer.

No dejéis de leer un libro escrito por un gran profesional y apasionado de la radio. Santi, allá donde estés, te recordaremos siempre amigo....

jueves, julio 13, 2017

MacOS X, alto uso de CPU de kernel_task y enlentecimiento del sistema

Llevo un tiempo con un fenómeno curioso en el Mac: De manera más o menos aleatoria, los ventiladores empiezan a funcionar a plena potencia, todo el ordenador se enlentece y el proceso kernel_task - el sistema operativo - está usando gran cantidad de tiempo de CPU. Incluso si se mira el sistema con el comando top se verá que el tiempo que pasa en el kernel del sistema es muy elevado. Una captura de pantalla del Monitor de Actividad se puede ver:

Tras muchas pruebas - incluyendo entre otras cosas: restear el SMC, quitar drivers, quitar procesos del arranque - me di cuenta que si quitaba el cable de carga y esperaba unos minutos, el sistema volvía a un estado normal y el porcentaje de uso de CPU por parte del sistema, caía a niveles normales. Si volvía a poner el cable, se empeza a calentar el sistema y en pasado un poco tiempo, aparecía el problema.

Por supuesto, con la batería totalmente cargada o con la temperatura de la oficina más baja, esto no ocurría. Tras buscar un poco por Internet, encontré la explicación: Cuando aumenta la temperatura del sistema, OS X comienza a generar interrupciones para que la CPU vaya más lenta y por tanto disipe menos calor .... llevándose por delante el rendimiento del sistema. La solución es refrigerar mejor el ordenador con una base.