Primer Post utilizando Nikola

Supongo que, como la mayoría, vengo del concepto de software de gestión de blogs o gestores de contenidos dinámicos, basados en:

  • enviar información desde un navegador a un servidor
  • procesar y almacenar la información en una base de datos o en ficheros
  • el servidor genera una respuesta dinámicamente que se envía al navegador en forma de HTML
    • para generar esta respuesta se suele leer de la base de datos o de los ficheros

De todo este proceso se encarga un software instalado en el servidor, nuestro gestor de contenidos.

Ahora he cambiado al paradigma de "generador de sitios web estáticos", en concreto voy a utilizar Nikola, aunque esta vez no lo voy a instalar en ningún servidor. En otro post os contaré cómo he montado esto con Github [1] y Travis [2].

Mi camino para llegar hasta los generadores de sitios web estáticos ha pasado por las etapas que os cuento abajo (me he saltado alguna menos importante).

Leer más…

Depurar librería generada con libtool

Trabajando con libtool [1], cuando vamos a depurar un ejecutable que utiliza una librería generada con libtool, es posible que nos encontremos con el siguiente error:

$ gdb ./tests-mylib
"tests-mylib": not in executable format: File format not recognized

libmylib.so es una librería dinámica generada con libtool tests-mylib es un ejecutable que utiliza la librería mylib

Para los que estéis pensando que se me ha olvidado poner la opción de compilación -g, lo siento, pero este error ocurre aunque utilicemos -g.

El error es debido a que estamos intentando ejecutar un script generado por libtool, es una envoltura sobre el programa real, para facilitar la ejecución de éste [libtooldoc].

Para poder depurar nuestro programa de prueba tests-mylib

libtool --mode=execute gdb tests-mylib
[1] Herramienta que pertenece a la Autotools usada para crear bibliotecas de software portables.
[libtooldoc] Esta información la he sacado de http://www.gnu.org/software/libtool/manual/libtool.html#Debugging-executables

Alineación de una Estructura C++ en Memoria

Un struct de C++ es un elemento que permite agrupar elementos de tipos distintos con alguna relación entre ellos. Esto permite manipular todos los elementos en bloque mediante una única referencia. Podemos considerarlo como una clase con visibilidad publica por defecto para sus atributos y funciones.

Si alguna vez nos interesa trabajar a un nivel más bajo, nos puede resultar útil entender cómo se mapea una estructura en memoria y cómo controlar este mapeo.

Leer más…

Configuración de proxy para Git

Es muy tedioso trabajar desde una red con proxy, al menos para mí, pierdo un montón de tiempo configurando software para que se actualice y funcione correctamente.

Esta es una descripción más o menos genérica de como hacer que git utilice un proxy determinado:

#para http
git config --global http.proxy <protocolo>://<nombre de usuario>:<password>@<direccion_ip>:<puerto>

#para https
git config --global https.proxy <protocolo>://<nombre de usuario>:<password>@<direccion_ip>:<puerto>

#para deshabilitar el uso del proxy
git config --global --unset http.proxy
protocolo
Suele ser http o htpps
nombre de usuario
nombre de usuario para autenticarse en el servidor de proxy
password
password para identificarse en el servidor proxy
direccion_ip
dirección de servidor de proxy
puerto
en el que está escuchando el servidor proxy

Más información en la configuración oficial de Git.

Eliminar/Reemplazar signos de puntuación en Python

A continuación muestro una forma de eliminar los signos de puntuación de una cadena de caractéres en Python. Los signos de puntuación son reemplazados por caractéres en blanco.

import re, string

def remove_punctuation ( text ):
    return re.sub('[%s]' % re.escape(string.punctuation), ' ', text)

Ejecutando:

>>> remove_punctuation ("El perro, de San Roque, no tiene rabo; ni nunca lo ha tenido.")
'El perro  de San Roque  no tiene rabo  ni nunca lo ha tenido '

Si queremos hacer la función más general, para reemplazar los signos de puntuación por cualquier otra cadena, simplemente hay que hacer la siguiente modificación en la función.

import re, string

def replace_punctuation ( text, replace ):
  return re.sub('[%s]' % re.escape(string.punctuation), replace, text)

Ejecutando el código de arriba:

>>> replace_punctuation ("El perro, de San Roque, no tiene rabo; ni nunca lo ha tenido.", '[stop]')
'El perro[stop] de San Roque[stop] no tiene rabo[stop] ni nunca lo ha tenido[stop]'

Normalizar texto en Python

En muchos idiomas, como es el caso del español, hay caracteres que no tienen representación ASCII, como por ejemplo la á (que sí que tiene representación en Unicode).

Para evitar problemas o por simplificar, se ha dado una equivalencia entre los caracteres Unicode y los ASCII. A continuación os pondré un trozo de código en Python que hace esta conversión.

# -*- coding: utf-8 -*-
from unicodedata import normalize

def normalize_text ( text ):
  return normalize('NFKD', text).encode('ASCII', 'ignore')

Ejecutando el ejemplo:

>>> normalize_text ( 'aáaá eéeé iíií oóoó ñnñn AÀAÀ' )
b'aaaa eeee iiii oooo nnnn AAAA'

Eliminar paquetes huérfanos en Linux

Cuando instalamos un paquete en las distribuciones Linux (en las que yo conozco), se instalan otros paquetes (dependencias). Si en el futuro desinstalas ese paquete, esas dependencias quedarán instaladas en el sistema, aunque no serán usadas por nadie, simplemente ocuparán espacio en disco. Estas dependencias son llamadas paquetes huérfanos.

Desinstalar paquetes huérfanos

Leer más…

Eliminar etiquetas HTML

Python

Función encargada de eliminar las etiquetas HTML:

#main.py

import re

def strip_tags(value):
return re.sub(r'<[^>]*?>', '', value)

Suponiendo que tenemos el siguiente HTML

<!DOCTYPE HTML>
<html>
        <head>
                <title>Title</title>
        </head>
        <body>
                <p>Paragraph</p>
        </body>
</html>

Vamos a hacer una prueba pasandolo como parámetro de la función strip_tags:

#main.py

html_text = """
        <!DOCTYPE HTML>
        <html>
                <head>
                        <title>Title</title>
                </head>
                <body>
                        <p>Paragraph</p>
                </body>
        </html>"""

print strip_tags(html_text)

Si ejecutamos el script tenemos como resultado:

Title

Paragraph

Y si con Python ha sido fácil, vamos a ver con Django

Django

#main.py

from django.utils.html import strip_tags

html_text = """
        <!DOCTYPE HTML>
        <html>
                <head>
                        <title>Title</title>
                </head>
                <body>
                        <p>Paragraph</p>
                </body>
        </html>"""

print strip_tags( html_text )

Mucho más sencillo, porque la función ya está escrita.