Wordcount in C++

:: C++

This is the standard example for MapReduce applications, counting the words in a file. Note that this snippet is not threaded nor distributed. It is just a curiosity: how to implement the same in C++, using the STL to avoid having any for loop!

Reduce in standard C++

:: C++

Accumulate instead of loop

You can traverse a C++ vector in many ways. Looping over a counter variable that goes from 0 to the vector size or taking an iterator from the vector’s begin to its end pointer positions are well-known ways to access its elements. When you are collapsing the elements into a single accumulator value (an operation usually called reduce in functional programming), you can use the std::accumulate function in the numeric header.

How do you develop with Yesod

:: haskell, web

Yesod tutorials and examples can be found on the Yesod book, which is freely available online.

However, many of the examples given are self-contained (which means that handler functions, data models and templates are defined in a single module, where a Warp web server is started as well). There is a chapter that describes the scaffolded template, i.e. what you get after you start with Yesod, but it is rather a description of its advantages and structure, not so much a detailed how-to.

The purpose of this post is to explain to a new Yesod developer “What do I do after … ?” :

$ yesod init

Instalar Python 2.7 y NumPy sobre RedHat 6

:: python

RedHat y centOS tienen la fastidiosa dependencia de su gestor de paquetes, yum, con la versión 2.6 de Python desde tiempos inmemoriales. Lo que en tecnología son unos seis o siete años.

Instalar Python 2.7 no es posible con los repositorios instalados por defecto, y si tienes la mala idea de instalar un repositorio donde sí esté y meterlo como paquete que supedita al python por defecto, te acabas de cargar yum (y la posibilidad más sencilla de deshacer tus cambios).

La mejor manera, pese a lo que pueda parecer, es instalar desde fuentes, haciendo lo que se conoce como “altinstall” (instalación alternativa). Esto crea ejecutables llamados python2.7 bajo /usr/local/bin, que no sobreescriben el comando python normal del sistema; éste sigue apuntando a un ejecutable bajo /usr/bin.

$ wget http://www.python.org/ftp/python/2.7.6/Python-2.7.6.tgz
$ tar xvfz Python-2.7.6.tgz
$ cd Python-2.7.6
$ ./configure
$ make
$ sudo make altinstall

Además de esto, es recomendable instalar un easy_install alternativo también, ya que, si no, todas las librerías de python se instalarán para la 2.6 y no para la 2.7.

$ wget http://pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11-py2.7.egg
$ sudo -i
# export PATH=$PATH:/usr/local/bin
# sh setuptools-0.6c11-py2.7.egg
# exit
$ sudo rm /usr/local/bin/easy_install ## remove the symlink that shadows the system easy_install
$ # You may now try the easy_install for 2.7 with e.g.:
$ sudo /usr/local/bin/easy_install-2.7 numpy

Este post es una combinación de dos respuestas en Stack Overflow, y mi propia experiencia con este mismo problema.

Unicode encodings

:: python

¡Por fin he entendido cuál es la diferencia entre Unicode y UTF–8! Y lo que es más importante, cómo se declaran correctamente strings en Unicode en Python.

Unicode es la tabla de equivalencias entre caracteres de (casi) todos los lenguajes humanos, y un número asignado a ese caracter en concreto.

UTF–8 es la manera de comprimir esos números en uno o dos bytes, en lugar de usar 4 bytes por caracter, aprovechando el hecho de que la mayoría de caracteres habituales están en los números bajos (menores de 128).

Es decir, si el “encodificador” encuentra un número < 128, deja ese número; si encuentra uno mayor, pero menor de X (donde X es un límite que no recuerdo), usa dos bytes para expresar este número. El “decodificador” entonces sabe que cada caracter menor de 128 está “solo”, mientras que si encuentra uno mayor, entonces debe leer también el siguiente byte para tener el número correcto con el que ir a la tabla Unicode y obtener el caracter adecuado.

Se puede crear una cadena Unicode en Python usando una u delante de la cadena literal, pero esto no siempre es posible, como cuando se lee de un fichero. Para convertir entre distintas codificaciones existe la función unicode.

La función unicode no utiliza UTF–8 por defecto, sino, absurdamente, ASCII. Por eso sólo es equivalente a poner una u delante una cadena si se especifica que el encoding sea 'utf-8'.

unicode_string = u"Años"

unicode_str = unicode(open('some.txt', 'r').read(), encoding='utf-8')