First post with Nikola

I guess that most people come from dynamic content management systems based on:

  • send data from browser to server
  • process the received data, then it stores the info into a database (or files)
  • the server generate dynamically an answer that is sent to the browser as HTML
    • the answer is usually built reading info from a database or files.

This process is managed by a software installed on server, this is our content management system.

Now I've changed the paradigm to "static web site generator", specifically I'm going to use Nikola, although this time, I'm not going to install on a remote server.

In a next post I'll tell you how I've automated the publication process using Github [1] and Travis [2].

Read more…

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

Mapeo de un struct 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.

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.

Read more…

Git proxy configuration

Sometimes working through a proxy is pretty tedious.

We are going how to configure git to work through a proxy

A generic description, how to make git uses a specific proxy:

#http
git config --global http.proxy <protocol>://<username>:<password>@<ip_host>:<port>

#https
git config --global https.proxy <protocol>://<username>:<password>@<ip_host>:<port>

#to disable using proxy
git config --global --unset http.proxy
protocol
Use to be http or https
username
The proxy user name
ip_host
Proxy host address
port
Proxy listening port
password
Your proxy password

More info in official Git configuration.

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'

Remove orphaned packages (Linux)

When we install a package in most of Linux distributions, the package system installs other packages needed by the package that we actually want to install. If we uninstall the package, its dependencies won't be uninstalled, these unused dependencies are called orphaned packages.

Remove orphaned packages

Read more…

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.