domingo, octubre 28, 2012

Vim: Como controlar el aspecto del list mode

En esta entrada hacía una pequeña intruducción al list mode, el cual nos permite
representar ciertos aspecto del texto en vim (como el fin de línea o el tabulador) con los caracteres que deseemos. Sin embargo, no llegué a comentar todas las opciones que podemos configurar.

La variable de configuración que controla el list mode es listchars. Es una lista de cadenas cada una de las cuales representa una opción , y en función de la misma el o los caracteres que se utulizan

  • eol:c Esta opción va seguida de un carácter,c que cuando se activa el list mode, va a servir para indicar cual es el final de una línea.Por defecto, si se activa el list mode es '$', es decir, eol:$
  • tab:ab Esta opción va seguido de dos caracteres,ab. El primero a se utiliza una vez, para marcar donde se utiliza el tabulador, mientras que el segundo sirve para sustituir los espacios que ocuparía el tabulador. Así tab:>-, si se inserta un tabulador, se verá en pantalla como >--- (si el tabspace, variable ts, es 4).
  • trail:c Esta opción va seguida de un carácter, que nos indica los espacios de más que hay al final de una línea. Por ejemplo, si se quiere que los espacios de más estén representados por ·, pues la opción sería trail:·
  • extends:c Esta opción va seguida de un carácter,c. Sirve para que el vim nos indique aquellas líneas que al tener más caracteres que el ancho de de la ventana de edición de vim, "saltan" a la siguiente línea. Por ejemplo, si se quiere que esto esté indicado por el carácter ↩ , la opción de configuración sería extends:↩1
  • precedes:c Esta opción va seguida de un carácter, c. Cuando está activa marca en la primera columna de una línea si esta es continuación de la anterior. Por ejemplo, si se quiere usar ↪ para indicar que la línea es una continuación de la anterior, se activaría con precedes:↪.
  • conceal:c Esta opción va seguida de un carácter, c. Se muestra cuando se oculta una parte del texto, cuando el valor de la variable conceallevel es 1.
  • nbsp:c Esta opción va seguida de un carácter, c. Se utiliza para mostrar un espacio que no se puede utilizar para crear una línea nueva automáticament. Corresponde con el código HTML  .

Un detalle importante, para que las opciones extends y precedes se muestren, hay que desactivar la opción wrap que hace que las líneas largas sólo se muestren parcialmente, no que pasen de manera virtual a la siguiente línea.

Un ejemplo de configuración de listchar sería la siguiente: set listchars=eol:¶,tab:>-,trail·,extends:↩,precedes:↪

Puede verse en las siguientes dos capturas el modo list activado en el fichero fuente de esta entrada, con el list mode activado con las opciones del párrafo anterior:





Tener en cuenta las advertencias sobre los caracteres que se pueden usar en estas opciones (por ejemplo no se puede usar la coma o los dos puntos), y en caso de que
no se esté usando una codificación UTF-8, sólo pueden usarse caracteres que puedan ser imprimibles. Toda la información puede consultarse en vim con help listchars

Nota

  1. Para insertar A9; tenemos que estar usando una codificación que soporte unicode en el fichero que se esté editando, como utf-8 (set encoding=utf8) y los caracteres se
    introducen con CTRL-VuXXXX donde XXXX es el código hexadecimal que corresponde al carácter que se está insertando.

Technorati Tags:

jueves, octubre 18, 2012

Vim: List mode, tabs, espacios

Cuando estamos editando un fichero con vim, puede que nos interese ver donde están los caracteres de retorno de carro, qué caracteres son tabuladores o que caracteres son espacios, en especial si estamos usando lenguajes - como python - que usa la identación para señalar los bloques. Esta funcionalidad se activa con el llamado list mode, usando la orden set list. Por ejemplo, en este modo el final de la línea se muestra como $ y el tabulador como ^I. Para desactivarlo usamos set nolist. Los caracteres que muestra para indicar estos caracteres especiales puede controlar con la ayuda de la variable listchars. Por ejemplo si se quiere que la marca de fin de línea sea ¶, se puede usar la order set listchars=eol:¶. Para introducir el carácter de fin de párrafo se utiliza CTRL-V + el código ASCII, en este caso 182

Otra opción interesante a la hora de programar es que el vim nos muestre el número de línea. Esto puede activarse con set number, mostrándonos en el margen izquierdo el número correspondiente. Para desactivarlo se utiliza la orden set nonumber.

Según el estilo de programación que se desee, puede que queramos convertir los tabuladores que insertemos en espacios, controlando el número de espacios por los que se sustituyen. Esto se configura con la variable ts, set ts=n, donde n corresponde al número de espacios que queremos que sustituya al tabulador y con set expantab que hace que el vim sustituya automáticamente el tabulador por el número de espacios que le hayamos indicado en la variable ts cuando insertemos uno.

En un momento dado, podemos querer que se aplique toda la configuración de los tabuladores a un fichero completo. Para ello se puede usar la orden retab.


Technorati Tags:

viernes, septiembre 28, 2012

Señales y gdb

En Unix, las señales son notificaciones asíncronas que recibe un proceso (o hilo dentro del mismo) cuyo origen puede ser otro proceso del sistema, el mismo proceso que las recibe o el núcleo del sistema operativo como consecuencia de una acción que ha realizado el proceso en cuestión durante la ejecución - por ejemplo un acceso a una posición de memoria protegida - . Interrumpe el flujo de ejecución normal, y el proceso que las recibe puede gestionarlas si ha instalado un manejador que se haga cargo de la señal a través del API sigaction o signal. También, usando el mismo API, pueden ser ignoradas, de tal manera que no se pasan al programa.

En un sistema Unix, toda señal está identificada por un número y tiene asociado un nombre que puede verse consultando la página de manual o el fichero de cabecera signal.h. Todas las señales tienen un comportamiento por defecto que es el que sucede cuando un proceso recibe una señal y no se ha ignorado o no se ha instalado un manejador para la misma.

Cuando un proceso está depurándose bajo el control del gdb, es éste el que recibe las señales que van al proceso, y puede decidir parar cuando las recibe, devolviéndonos al prompt del gdb , pasar o no pasar las señales e imprimir información sobre las mismas. El gdb almacena unas tablas, con cada señal que está en el sistema que debe hacer. Estas tablas se manejan con ayuda de la orden handle.

Se puede ver el contenido de toda la tabla de señales con ayuda de la orden info signals o info handle. En este caso, gdb nos volcará una tabla con todas las señales que tenga registrada el sistema, si el programa debe o no detenerse, si debe de imprimir información por la consola del gdb y si esta señal debe de pasarse al programa. Esta orden permite especificar el número de señal (siempre que esté en el rango 1 a 15) o el nombre de la misma , si queremos ver información sólo de las señales que nos interesan. El nombre de todas las señales que reconoce el gdb para la arquitectura que está depurando puede verse en la primera columna de la tabla de señales.

Por ejemplo, si se quiere ver la información sobre la señal SIGTERM:


(gdb) info signal SIGTERM

Signal        Stop    Print    Pass to program    Description

SIGTERM       Yes    Yes    Yes        Terminated

(gdb) 

En este ejemplo puede verse que esta señal
  • Para la ejecución del programa y nos devuelve al prompt del depurador, Stop = Yes.
  • Imprime en pantalla el momento en que se genera, Print = Yes.
  • Se pasa al programa una vez que continuemos la ejecución, Pass = Yes.

Si queremos cambiar el comportamiento del gdb cuando se genera una señal, hay que hacer uso del comando handle. Como argumentos admite una lista de nombres simbólicos de señales, seguido de una serie de tokens que cambia el comportamiento de la misma. Así tenemos stop y nostop que hacen que en caso de que la señal se genere se devuelva el control al gdb, pass (ignore) y nopass (noignore) que hace que la señal no se pase al programa que se esté depurando (las formas entre parénteis son equivalentes) , y por último print y no print para que el depurador imprima la señal que se ha recibido.

Por ejemplo, si se quiere que el gdb imprima un mensaje cada vez que se generan las selañes SIGUSR1 y SIGUSR2 con destino al programa, no queremos que éstas pasen al mismo, y queremos que imprima por pantalla el momento que se reciben, se puede hacer con:


(gdb) handle SIGUSR1 SIGUSR2 nopass nostop print

Signal        Stop    Print    Pass to program    Description

SIGUSR1       No    Yes    No        User defined signal 1

SIGUSR2       No    Yes    No        User defined signal 2


Una particularidad es que en algunas arquitecturas el gdb es capaz de mostrar información que el kernel ha pasado al manejador de señales. Esta información se almacena en la seudovariable $_siginfo, cuya estructura puede verse con la orden ptype $_siginfo.


(gdb) ptype $_siginfo
type = struct {
    int si_signo;
    int si_errno;
    int si_code;
    union {
        int _pad[28];
        struct {...} _kill;
        struct {...} _timer;
        struct {...} _rt;
        struct {...} _sigchld;
        struct {...} _sigfault;
        struct {...} _sigpoll;
    } _sifields;
}


Technorati Tags: ,

jueves, septiembre 27, 2012

El 70% de los inversores españoles en fondos no lee los folletos informativos de los mismos

Llegaba hoy a través del twitter de Daniel Lacalle a una noticia sobre algunas de las costumbres de los inversores españoles en fondos. Para enmarca la siguiente afirmación del estudio

Sólo el 30% ha leído el folleto descriptivo del fondo antes de invertir dinero en él.

Luego nos extrañamos y nos tiramos de los pelos con Afinsas, pagarés de Rumasa o Preferentes, eso sí, que luego el Estado - y por tanto el resto de los ciudadanos - paguemos la fiesta.


Technorati Tags:

sábado, septiembre 08, 2012

Lo que no arreglará la compra de bonos del BCE


Ayer el el Banco Central Europeo celebró una importante reunión donde se decidiría cuales iban a ser los nuevos mecanismos de rescate que se iban a utilizar para intentar salvar las finanzas públicas de una serie de países que llevan en la cuerda floja varios años. En la nota de prensa el gobernador del BCE , Mario Dragui, explicaba cual va a ser el programa de compra de bonos y que condiciones deben de cumplir los países para que el BCE compre deuda en el mercado secundario, monetización de deuda a la que ha sido bastante reacio.

Mucho más interesante es lo que parece ser que no dijo. No dejen de leer el artículo de Alberto Artero en el Confidencial sobre el tema.

Sin embargo, hay una serie de cosas que no creo que esta compra de bonos arregle. Es más, creo que será una tabla de salvación a la cual se va a agarrar nuestra manirrota clase política para seguir gastando a crédito:

  • ¿Va a cambiar esa mentalidad empresarial de caza y captura de subvenciones?. De empresas creadas al calor del BOE y que desaparecen cuando se corta el flujo de dinero público, dejando a todo el mundo en la estacada
  • ¿El capitalismo del IBEX-35, alguna de cuyas empresas son antiguos monopolios públicos y cuyos consejos de administración son el lugar de retiro dorado de nuestra clase polítca?.
  • ¿Esto hará que se creen empresas que sean capaces de ser competitivas tanto en el mercado exterior como interior?.
  • ¿Ayudará a que nuestro sistema educativo deje de estar a los pies de los caballos?. ¿Ayudará a tener Universidades más competivas?. ¿Una formación profesional que permita formar a trabajadores en los puestos de trabajo que demanda el mercado?.
  • ¿Servirá para poner orden en nuestras manirrotas administraciones públicas?. ¿O el dinero que se reciba de la compra de bonos se volverá a perder en inútiles infraestructuras infrautilizadas?.
  • ¿Existirá, por fin, un plan a largo plazo para el carajal del sistema energético español?.
  • ¿Habrá algo de seguridad jurídica en diferentes sectores?. Nadie aborda una inversión a largo plazo, sin un marco jurídico estable, en especial en sectores donde las inversiones pueden tener un tiempo de amortización largo.

En definitiva, ¿ayudará esta compra de bonos a resolver los problemas estructurales que arrastra la economía española desde hace décadas?


Technorati Tags: