viernes, mayo 30, 2014

Autotools, tutorial de uso (IV): Las rutas de instalación en make

Una de las ventajas que tiene usar los mecanismos para definir las rutas de autotools es que a la hora de compilar se puede pasar parámetros a make que sobreescriban el valor original de las rutas que se hayan especificado en el configure. Si se parte del segundo tutorial, se puede configurar el proyecto para que tenga como prefix /usr/local

swordcoast:tut2 terron$ ./autogen.sh
swordcoast:tut2 terron$ ./configure --prefix=/usr/local
# Salida del configure omitida
swordcoast:tut2 terron$ make
# Salida del make omitita
swordcoast:tut2 terron$ ./tut2
prefix         = /usr/local
bindir         = /usr/local/bin
sbindir       = /usr/local/sbin
sysconfdir  = /usr/local/etc
libdir          = /usr/local/libexec

Si borramos los binarios construidos y volvemos a compilar usando make, pero pasamos como parámetro prefix, veremos como cambia las rutas donde se instalaran los binarios (la salida del make se ha omitido)

swordcoast:tut2 terron$ make clean
swordcoast:tut2 terron$ make prefix=/opt
swordcoast:tut2 terron$ ./tut2
prefix         = /usr/local
bindir         = /opt/bin
sbindir        = /opt/sbin
sysconfdir    = /opt/etc
libdir        = /opt/libexec

En la salida del programa puede verse como prefix sigue teniendo el valor que se le especificó cuando se configuró el programa a través del script configure, pero que el resto de las rutas ha cambiado como consecuencia de haber pasado el parámetro prefix al make . Existen varias de estas variables que se pueden cambiar:

  • prefix la ruta común para toda la instalación de todos los ficheros
  • exec_prefix la ruta para aquellos ficheros que son dependientes de la arquitectura.
  • docdir la ruta para los ficheros de documentación.
  • dotarootdir la ruta de aquellos ficheros de sólo lectura independiente de la arquitectura.

Referencias

domingo, mayo 25, 2014

Autotools, tutorial de uso (III): Las rutas de instalación

Una de las funciones que tiene el script configure es determinar las rutas donde se instalarán los diferentes componentes del software que se está configurando. Esta configuración se lleva a cabo a través de los parámetros que recibe. El ejemplo más clásico es --prefix, que determina la raíz de instalación bajo la cual se crearán el resto de los directorios.

El estándar GNU especifica una serie de variables que contienen las rutas donde se instalará el software. Estos valores pueden definirse a través de los parámetros en la línea de comandos que se le pase al script de configure, el cual los analizará y definirá una serie de variables con los valores que se les ha pasado.

Algunas de estas variables pueden consultarse en la siguiente tabla:

VariableDescripción
$prefixPrefijo común de todas las rutas que se usa para instalar todos los ficheros
$bindirRuta hacía los programas que los usuarios podrán ejecutar
$sbindirRuta hacía los programas que sólo puede usar el administrador del sistema
$sysconfdirRuta donde se instalará los ficheros de sólo lectura específicos de una máquina. Normalmente, ficheros de configuración
El resto de las posibles variables pueden consultarse en el enlace anterior.

Es importante hacer notar un hecho sobre estas variables. Están pensadas para ser usadas dentro de los ficheros Makefile, y que es preferible no evaluarlas dentro de los ficheros configure. Si se quiere el valor dentro de un programa, lo mejor es usar algún mecanismo para pasar el valor definido. Por ejemplo, si estamos usando C, se puede definir una macro con el valor de la variable que nos interesa y qcompilarla. No suele funcionar usarla como parámetros de macros.

A continuación un pequeño ejemplo que permite ver el comportamiento de estas variables en acción. Se trata del tut2, un pequeño programa que sirve para probar que está en autotools tutorial. A continuación el configure.ac y el tut2.c que se van a usar:

configure.ac

 1 dnl Esto es un comentario
 2 dnl Esta macro fuerza a una versión mínima de autoconf
 3 AC_PREREQ([2.59])
 4 AC_INIT([tut2],[1.0],[cterron@users.sourceforge.net],[tut2.tar.gz],
 5         [https://sourceforge.net/p/autotutorial/])
 6 dnl Necesitamos el compilador de C
 7 AC_CONFIG_HEADERS([config.h])
 8 AC_PROG_CC
 9 dnl Init automake 
10 AM_INIT_AUTOMAKE
11 dnl Definición de variables con los path
12 dnl Ver http://www.gnu.org/software/autoconf/manual/autoconf.html#Makefile-Substitutions
13 CFLAGS="$CFLAGS -DBINDIR=\\\"$bindir\\\""
14 CFLAGS="$CFLAGS -DDATADIR=\\\"$datadir\\\""
15 CFLAGS="$CFLAGS -DLIBDIR=\\\"$libexecdir\\\""
16 CFLAGS="$CFLAGS -DPREFIX=\\\"$prefix\\\""
17 CFLAGS="$CFLAGS -DSBINDIR=\\\"$sbindir\\\""
18 CFLAGS="$CFLAGS -DSHAREDSTATEDIR=\\\"$sharedstatedir\\\""
19 CFLAGS="$CFLAGS -DSYSCONFDIR=\\\"$sysconfdir\\\""
20 
21 
22 AC_CONFIG_FILES([Makefile])
23 AC_OUTPUT

tut2.c

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 int main(int argc, char **argv)
 5 {
 6   printf("prefix \t\t= %s\n", PREFIX);
 7   printf("bindir \t\t= %s\n", BINDIR);
 8   printf("sbindir\t\t= %s\n",SBINDIR);
 9   printf("sysconfdir\t= %s\n", SYSCONFDIR);
10   exit(0);
11 }
12 
13 /* vim: ts=4: */

Estos dos ficheros nos permiten ver el comportamiento de las opciones que se le pasan al script configure a la hora de definir los path. Por ejemplo, si se compila con las siguientes opciones:

./autogen
./configure --prefix=/opt --sysconfdir=/etc
make clean
make
./tut2

La salida del programa es

prefix         = /opt
bindir         = /opt/bin
sbindir        = /opt/sbin
sysconfdir     = /etc
Se verá que la salida del programa el valor con el que se fijan algunas variables

Esto tiene espacial importancia a la hora de utilizar los ficheros makefiles generados para poder instalar el programa en las rutas que se desean. Además, permite una gran flexibilidad ya que incluso se pueden establecer esas variables a la hora de ejecutar una instalación a través de make install

Referencias

sábado, mayo 24, 2014

BPF - the forgotten bytecode (enlaces)

Una herramienta que usa de manera casi universal a la hora de localizar y arreglar problemas en redes que utilizan el protocolo TCP/IP es tcpdump. Este programa traduce las especificaciones de los filtros que se utilizan para seleccionar los paquetes a una máquina virtual que posteriormente es ejecutada en el kernel del sistema operativo. Esta máquina virtual está descrita en The BSD Packet Filter: A New Architecture for User-level Packet Capture.

Si están interesados en la arquitectura interna de los filtros BPF , n poco de su historia y algunos usos, no dejen de leer - en inglés - el magnífico artículo BPF - the forgotten bytecode, publicado por Marek Majkowski. El ejemplo de como usa el autor filtros en bytecode generados por el merece la pena verlo.

jueves, mayo 15, 2014

vim: Linea de modos

El editor vim tiene una funcionalidad muy interesante que permite especificar opciones de configuración en el mismo fichero que se está editando, las llamadas modelines. Si está activada, cuando se carga un fichero para ser editado, vim buscará en las primeras líneas o las últimas líneas del mismo una serie de cadenas especiales que le permite leer las configuraciones que se han escrito en ellas El número de líneas que busca al principio o final está almacenado en la variable modelines cuyo valor por defecto es 5. Su valor puede verse en modo comando con la orden set modelines?

El formato que sigue estas líneas de modos puede consultarse en las opciones de línea de modos. Básicamente es un texto, un espacio en blanco, una de las cadenas vi:,vim: o ex:, otro espacio en blanco y las opciones que queremos configurar. Las opciones están separadas por espacios y dos puntos (':') de tal manera que cada conjunto de las mismas se podría pasar al comando de vim set.

Por ejemplo, una línea de modos que puede ir en un fichero Python al final del todo de tal manera que se establezca el tabstop a 4 y que los tabuladores sean sustituidos por espacio sería:

# vim: ts=4:expandtab
En un fichero en C , se podría introducir las mismas opciones con
/* vim: ts=4:expandtab */

Por defecto y como medida de seguridad, el uso de las líneas de modo está deshabilitado si el vim lo está ejecutando el usuario root


domingo, mayo 04, 2014

La gran apuesta

Es complicado hacer un resumen de la La Gran Apuesta. El autor narra alguno de los mecanismos que llevaron a la crisis subprime en EEUU, como hubo inversores que detectaron el problema - a los que no creyeron - y como éstos aprovecharon su conocimiento para apostar en corto, logrando millones de dólares de beneficios.

Lewis hace un recorrido por el mercado de bonos hipotecarios que nace a partir de las llamadas hipotecas subprime - hipotecas, en muchos casos concedidas sabiendo que sus receptores jamás podrían pagar los créditos - , el empaquetado de las mismas en bonos y la creación de derivados financieros a partir de los mismos, así como de los mercados donde se entra a negociar todos estos activos financieros.

Del libro me han llamado la atención varias cosas:

  • El negocio de préstamos subprime estaba destinado a saltar por los aires, tal como ya lo había hecho antes
    La maquinaria de las hipotecas basura estaba en marcha de nuevo, como si no se hubiera estropeado la primera vez
    La oleada original de financieros subprime se había hundido por culpa de una pequeña fracción de los préstamos concedidos que había registrado en sus libros. El mercado tendría que haber aprendido una lección muy sencilla: no hagas préstamos a quien no puede pagarlos
    Estaban haciendo préstamos a personas de bajos ingresos a un tipo de interés de enganche cuando sabían que no podrían permitirse pagar el tipo de interés de continuación —explicaba Eisman—. Lo hacían para que, cuando los prestatarios llegaran al final del período de enganche, tuvieran que refinanciar, de modo que los prestadores pudieran sacarles más dinero.
    Solo que en esta ocasión, el conjunto de dinero prestado irrecuperable era muchísimo mayor.
  • Los legisladores y reguladores hicieron sistemáticamente la vista gorda sobre el mercado de bonos. Ignoraron la bomba que se estaba cebando en el sector financiero estadounidense y cuando estalló en el año 2007 se llevó por delante a todos.
    Los vendedores de bonos podían decir y hacer cualquier cosa sin temor a que se informara de ello a alguna autoridad. Los operadores podían explotar información privilegiada sin preocuparse de que les pillaran.
    En esta crisis financiera llevo años preguntándome como los reguladores dejaron hacer. Pero no sólo en EEUU, sino en Europa, aunque en el caso europeo, en especial el español, desconozco si los mecanismos que llevaron a la crisis fueron los mismos que los americanos. Lo que si reconozco, es que me cuesta mucho creer que los supervisores no supiesen que se estaban incubando, más en las intervenidas finanzas europeas.
  • El apalancamiento, es decir, la deuda que estaban asumiendo todos los actores económicos americanos, desde la clase media hasta las grandes corporaciones, podía hacer que todo el castillo se viniese abajo, aunque la fracción de impagos fuera relativamente pequeña. Pero era altamente lucrativo para los intermediarios.
    Steve Eisman era raro en su convicción de que el apalancamiento de la clase media estadounidense era un acontecimiento corrupto y corruptor, y que el mercado de las hipotecas basura en particular era un vehículo de explotación y, en última instancia, de destrucción
    Era fácil entender por qué las entidades emisoras como Option One y New Century preferían hacer esa clase de préstamos: al cabo de dos años, los prestatarios o bien empezaban a incumplir sus pagos, o bien, si el precio de su vivienda había subido, la refinanciaban. A ellas el impago les resultaba indiferente, puesto que no retenían nada del riesgo del préstamo; y las refinanciaciones constituían simplemente una posibilidad de cobrar nuevas comisiones al prestatario
  • Una pregunta que siempre me ha rondado en la cabeza. ¿Por qué se rescató a una serie de bancos, tanto en EEUU como en Europa, siendo los gobiernos conscientes de la impopularidad de la medida?. Si hay un párrafo que para mi resume el motivo de manera sencilla, más allá de teorías sobre los poderosos, oligopolios y demás es este:
    Cuando la banca se para, el crédito se para; cuando se para el crédito, se para el comercio, y cuando se para el comercio… bueno, la ciudad de Chicago tenía solo ocho días de reservas de cloro para su abastecimiento de agua. Los hospitales se quedaban sin medicinas. Todo el mundo moderno se basaba en la capacidad de comprar ahora y pagar más tarde.

Para mi las dos conclusiones a las que llego tras la lectura de este libro son:

  • El problema subprime americano es algo endógeno al propio sistema financiero. No estoy especialmente en contra de la innovación en el mundo de las finanzas, porque gracias a ellas, se ha podido financiar multitud de empresas que luego han dado servicio y creado grandes productos. Sin embargo, para mi parece bastante claro que es necesario la supervisión de las mismas y de tener la bastante autoridad para dar un golpe encima de la mesa cuando se desmadra. Si eso ha ocurrido en el mundo de las acciones, ¿por qué no puede ocurrir en los mercados de bonos y de los derivados financieros?.
  • Nunca es distinto. Una cosa que también ya intuía en la lectura de Esta vez es distinto - ocho siglos de necedad financiera, es que los excesos de deuda y los grandes apalancamientos pueden acabar como el rosario de la aurora.
  • Por mucho que unos vendan que esto fue fortuito y que nadie se lo podía esperar, por mucho que pensemos que la Economía es un sistema no lineal con inmensidad de variables, donde lo menos predecible es parte del comportamiento humano, había señales de alarma de sobra para saber la crisis que se estaba incubando.
  • Pero quizás, y dada las noticias de estos últimos meses es que es probable que no se haya aprendido nada. La historia parece que uno ciclo de expansión de deuda y crisis de "reseteo" del sistema a la que estamos condenados.