[Rainbow | On Stage - 1977 | Blues]
[Led Zeppelin | Led Zeppelin III - 1970 | Sice I've Been Loving You]
[Pink Floyd | Meddle - 1971 | Seamus]
miércoles, 28 de agosto de 2013
martes, 27 de agosto de 2013
Montaña Amarilla [Tenerife Sur]
El Monumento Natural de Montaña Amarilla es un cono volcánico integrado en un conjunto alineado de volcanes del sur de Tenerife. Cuenta con una extensión de unas 27 Ha, y casi alcanza los 75 metros en su parte más alta. Tuvo su origen en una erupción freatomagmática (erupción que entra inmediatamente en contacto con el agua), con posterior explosión estromboliana, allá por el cuaternario (edad de la que se mantiene una duna fósil puesta al descubierto por la erosiónd el mar), y el borde superior del cono presenta una altura desigual en su perímetro, con una apreciable hendidura en el lado este que casi deja el nivel del interior del cono a la misma altura que el terreno exterior.
Su cara sur está siendo continuamente erosionado por el mar. Esta parte, con la marea baja, es asombrosamente hermosa y merece un post aparte. Pero nos ocupa ahora su zona norte, la mayor parte del año absolutamente árida al tratarse de una de las zonas de mayor insolación y más secas de toda la isla. Sólo los cardones (Euphorbia canariensis) y las tabaibas (Euphorbia balasamifera) se atreven a habitar en este lugar, expuesto al ardiente aire sahariano cuando el anticiclón de las Azores pierde su fuerza en los meses de mayores temperaturas.
Pero tras las lluvias del invierno (pocas pero intensas, si las hay) se abre paso una primavera efímera que llena de color el árido suelo y reverdece las tabaibas. Entonces, y a la luz del atardecer preferentemente, el paraje se convierte en un lugar mágico. No dura muchas semanas el espectáculo, pero merece la pena.
El recorrido por el borde superior del cono es un agradable paseo. La moderada altura y los múltiples caminos que recorren el volcán permiten una tranquila caminata para, en una o dos horas, dar la vuelta al cono, haber entrado hasta su interior, y haber disfrutado de las vistas desde sus partes más elevadas.
Su cara sur está siendo continuamente erosionado por el mar. Esta parte, con la marea baja, es asombrosamente hermosa y merece un post aparte. Pero nos ocupa ahora su zona norte, la mayor parte del año absolutamente árida al tratarse de una de las zonas de mayor insolación y más secas de toda la isla. Sólo los cardones (Euphorbia canariensis) y las tabaibas (Euphorbia balasamifera) se atreven a habitar en este lugar, expuesto al ardiente aire sahariano cuando el anticiclón de las Azores pierde su fuerza en los meses de mayores temperaturas.
Pero tras las lluvias del invierno (pocas pero intensas, si las hay) se abre paso una primavera efímera que llena de color el árido suelo y reverdece las tabaibas. Entonces, y a la luz del atardecer preferentemente, el paraje se convierte en un lugar mágico. No dura muchas semanas el espectáculo, pero merece la pena.
Más fotografías sobre la primavera en Montaña Amarilla en mi cuenta en Flickr.
[Enlaces:: Monumento Natural de Montaña Amarilla: disposiciones de protección | Paper de Juan Carlos Carracedo y otros sobre Montaña Los Erales, uno de los volcanes alineados con Montaña Amarilla, con referencias a ésta]
domingo, 25 de agosto de 2013
Compilación cruzada para Raspberry Pi desde Windows [y IV]: ejecución remota desde Windows
Hace unas semanas empezamos a ver cómo compilar para Raspberry Pi y desde Windows programas escritos en C o C++, a lo que añadimos un post sobre cómo incluir en el entorno de Windows la biblioteca BCM2835 (que permite acceder a los recursos IO de la RPi desde fuentes en C o C++). En el último post sobre el tema vimos cómo habilitar Notepad++ mediante su plugin NppExec para poder trabajar de forma más comoda y visual los puntos anteriores. En su último párrafo nos preguntábamos si podríamos ser más ambiciosos y llevar más allá esta filosofía de obtener resultados con tan sólo pulsar una tecla para, por ejemplo, descargar en la RPi el ejecutable y hacerlo correr tras haberlo compilado. Ya avanzábamos que la respuesta era afirmativa, que podíamos hacer lo propuesto aunque con algo de trabajo.
Si sólo quieres empezar a codificar y a ejecutar, ve al final del post y copia el código en un nuevo script de NppExec/Notepad++, e instala putty para Windows (utiliza el instalador putty-0.xx-installer.exe) e introduce sus ejecutables en la variable de entorno PATH. Pero si quieres algo de diversión, sigue el proceso hasta llegar al script final. Te aseguro que te servirá en adelante para personalizar tu entorno según tus necesidades o preferencias.
Vamos a hacer en primer lugar un poco de ingeniería de software definiendo los requisitos que necesitamos resolver tras haber terminado de codificar o modificar nuestras fuentes:
- Salvar el fichero de código C o C++ que estamos trabajando (ya conseguido en el post anterior)
- Compilar el código (también conseguido, como vimos)
- Transferir el ejecutable obtenido en el punto anterior a la Raspberry
- Otorgar permisos de ejecución al ejecutable, ahora residente en la RPi
- Ejecutar el programa bajo el SO de la RPi
Cumplidos los requisitos anteriores mediante los oportunos comandos o utilidades, y si somos capaces de reunir estos últimos en un único script, podremos conseguir todo lo anterior mediante una sóla tecla o entrada de menú. No obstante, por propia experiencia avanzo que es conveniente añadir algunos matices adicionales:
- Antes de transferir a la RPi el fichero ejecutable obtenido tras el paso 2, es conveniente matar un posible proceso en ejecución del mismo programa que hayamos lanzado, por ejemplo, antes de modificar su código. Si no lo hacemos así, la ejecución paralela de dos procesos actuando sobre los mismos recursos nos dará problemas. Eliminar el proceso es posible hacerlo manualmente, claro, pero será más eficiente si integramos esta acción en nuestra tubería. Podríamos enumerar este requisito como 2.1.
- Tras haber matado el proceso según el punto anterior, y aunque no es estrictamente necesario, borramos el ejecutable a sustituir por la nueva compilación. Enumeramos este requisito como 2.2. Sobra decir que si se trata de la primera compilación cualquiera de estos dos puntos sobra, pero su ejecución sólo conllevará los correspondientes mensajes de error por no existir ni el proceso a aniquilar ni el fichero a eliminar.
Una vez tenemos claro qué queremos hacer, podemos ponernos manos a la obra: ya tenemos el código que nos resuelve los requisitos 1 (salvar el código) y 2 (compilación), así que empezamos por el requisito 2.1 (matar un posible proceso de un código anterior ya en ejecución). Seguro que tenemos claro que el comando de Linux pkill nos sirve para eliminar un proceso dado su nombre. Es decir, pkill holamundo, por ejemplo, acabaría con un posible proceso en ejecución correspondiente a un ejecutable denominado holamundo (ojo: en realidad, acabaría con todos los procesos que incluyeran la expresión holamundo en su nombre, por lo que hay que tener cuidado y, desde luego, no ejecutarlo nunca como root). Pero como estamos trabajando bajo un entorno Windows necesitamos ejecutarlo desde este último SO. ¿Cómo? Con putty, una implementación cliente SSH para Windows (entre otros SO) cuyo ejecutable putty.exe nos permitirá establecer una sesión remota con la Raspberry desde Windows.
Habrá que descargar, por tanto, el paquete necesario que se encuentra aquí (utiliza el instalador putty-0.xx-installer.exe). Tras su instalación en Windows, es conveniente modificar la variable de entorno PATH para que recoja la ruta hasta los ejecutables (normalmente C:\Program Files\PuTTY), lo que evitará tener que teclear la ruta completa cada vez que se acceda a esta utilidades.
El problema es que la línea de comandos de putty no está diseñada para transferir un único (¿?) comando Linux, sino que debe leerlos de un fichero. Por lo tanto, nuestro trabajo se complica un tanto, pero nada grave. Así que tendremos que crear al vuelo un fichero, introducirle el comando o comandos a transferir a la RPi, ejecutar putty para que lea y ejecute remotamente los comandos, y finalmente limpiar la basura para que no nos vayan quedando ficheros por ahí. Para crear el fichero mediante un comando Windows, ejecutaremos
cmd /c echo sudo pkill nombre_proceso_a_matar >> fichero_de_comandos
La sentencia es sencilla: utilizamos cmd /c, el comando de comandos de Windows, para emitir un echo que añadirá el comando Linux sudo pkill nombre_proceso_a_matar en el fichero fichero_de_comandos, que por cierto creará si no existe. Más tarde, una vez cumplida su función, el fichero será eliminado mediante
cmd /c del fichero_de_comandos
que tiene una construcción semejante, utilizando ahora el comando del, a la que acabamos de ver.
En términos prácticos, tenemos que incluir en nuestro script
cmd /c echo sudo pkill $(NAME_PART) >> $(CURRENT_DIRECTORY)\RPiKill
putty.exe –ssh –pw raspberry –m $(CURRENT_DIRECTORY)\RPiKill pi@192.168.1.118
…
cmd /c echo del $(CURRENT_DIRECTORY)\RPiKill
donde hemos utilizado las variables NAME_PART para el nombre del ejecutable y CURRENT_DIRECTORY para el directorio actual, mientras que hemos llamado arbitrariamente RPiKill al fichero instrumental que va a registrar este comando. En la línea de comandos de putty se incluye la contraseña de acceso a la Raspberry, que puede omitirse en el raro caso (en este contexto) de que la seguridad sea importante, aunque con el precio de tener que introducirla manualmente, lo que relativiza la eficiencia de este mecanismo. Para saber más sobre la ejecución de putty en línea de comandos, puedes visitar esta página. La dirección de red de la RPi habrá que acomodarla a la realmente usada. Los puntos suspensivos representan otro código adicional que veremos a continuación.
Avanzaremos ahora más deprisa con el requisito 2.2 (eliminación del ejecutable a sustituir), para lo que utilizaremos
cmd /c echo rm $(NAME_PART) >> $(CURRENT_DIRECTORY)\RPiDel
putty.exe –ssh –pw raspberry –m $(CURRENT_DIRECTORY)\RPiDel pi@192.168.1.118
El fichero RPiDel lo eliminaremos posteriormente de igual manera a la ya vista.
El siguiente requisito, el número 3, supone la transferencia del fichero ejecutable compilado en Windows para que se ejecute nativamente en el Linux de la RPi. En los posts anteriores utilizábamos métodos de transferencia cómodos mediante un terminal (SmarTTY, en particular), pero ahora buscamos una utilidad que nos permita realizarlo desde la línea de comandos de Windows. Esta utilidad es pscp, que se instala cuando instalamos el paquete de putty. La sentencia genérica para su utilización es
pscp.exe –pw raspberry fichero_a_transferir destino
que para nuestros efectos podemos expandirla a
pscp.exe –pw raspberry $(CURRENT_DIRECTORY)\$(NAME_PART) pi@192.168.1.118
con parecidos comentarios sobre seguridad y expansión de las variables a los efectuados más arriba.
Ya sólo nos queda tratar los dos últimos requisitos (dar permisos de ejecución y ejecutar el programa), que vamos a tratar simultáneamente. Para ello, recordaremos que los permisos de ejecución los damos en Linux con (por ejemplo) el comando chmod a+x ejecutable, y que la ejecución de un programa situado en el directorio de trabajo se consigue con ./ejecutable puesto que normalmente, y por motivos de seguridad, no se incluye en la variable de entorno PATH de Linux el directorio actual. Además, si hemos utilizado la librería BCM2835 (que accede al hardware de la RPi), tendremos que ejecutar como root. En resumen, en un nuevo fichero instrumental que llamaremos RPiExe incluiremos los dos comandos a transferir a la RPi mediante putty:
cmd /c echo chmod a+x $(NAME_PART) >> $(CURRENT_DIRECTORY)\RPiExe
cmd /c echo sudo ./$(NAME_PART) >> $(CURRENT_DIRECTORY)\RPiExe
putty.exe –ssh –pw raspberry –m $(CURRENT_DIRECTORY)\RPiExe pi@192.168.1.118
De la misma manera que en los casos anteriores, eliminaremos el fichero RPiExe una vez cumplida su función.
Y esto ha sido todo. El código completo de nuestro script quedaría:
Pueden eliminarse o modificarse algunos de los pasos, incluyéndolos en otros scripts o ejecuciones externas ordenadas desde dentro del propio Notepad++. Lo importante es comprender los mecanismos de actuación que nos permite el plugin NppExec, con lo que la flexibilidad de nuestro entorno la tendremos asegurada.
[I - Compilación cruzada para Raspberry Pi desde Windows (fácilmente) | II - La librería BCM2835 | III - Un IDE ligero y funcional con Notepad++ ]
sábado, 24 de agosto de 2013
Portadas de magazines Sci-Fi de los años 40 y 50 del pasado siglo
[Aquellos maravillosos años | Algunas fantásticas portadas de magazines y carteles de películas de ciencia ficción de los años 40 y 50 del siglo XX]
[Cortesía de los usuarios de Flickr x-ray_delta_one y Pat Gavin | En particular, x-ray_delta_one mantiene una magnífica colección genérica de imágenes, fotografías y anuncios de aquellos años (de los USA, fundamentalmente | Impresas (éstas u otras de las muchas que hay colgadas) desde sus resoluciones más altas, y enmarcadas en un marco de Ikea con su passepartout y todo, no deben faltar en la habitación de todo buen friki]
[Cortesía de los usuarios de Flickr x-ray_delta_one y Pat Gavin | En particular, x-ray_delta_one mantiene una magnífica colección genérica de imágenes, fotografías y anuncios de aquellos años (de los USA, fundamentalmente | Impresas (éstas u otras de las muchas que hay colgadas) desde sus resoluciones más altas, y enmarcadas en un marco de Ikea con su passepartout y todo, no deben faltar en la habitación de todo buen friki]
domingo, 11 de agosto de 2013
Señoras y señores: Kimbra [y otros nuevos instrumentos musicales]
jueves, 8 de agosto de 2013
Compilación cruzada para Raspberry Pi desde Windows [III]: un IDE ligero y funcional con Notepad++
En el primer post sobre compilación cruzada para Raspberry Pi desde Windows vimos los fundamentos de la toolchain que SysProgs ofrece. En el segundo, complementamos la instalación de la toolchain con la librería BCM2835, que permite el acceso cómodo a los pins IO de la RPi. Lo que pretendemos ahora no es sólo disfrutar de una edición de código cómoda, sino complementarla con un proceso de compilación y gestión de los ejecutables productivo y eficiente. Elegimos para ello el software Notepad++, que es un conocido editor de ficheros de texto orientado a la programación, distribuido bajo GPL, y con unos cuantos años ya a sus espaldas. Su arquitectura abierta ha permitido diseñar un buen número de plugins que complementan las típicas (y no tan típicas) opciones de edición de código que este editor ya implementa de serie.
Es, precisamente, uno de sus plugins, NppExec, el que nos va a permitir habilitar opciones de ejecución de programas o comandos externos con los que conseguir, como vamos a ver, nuestros objetivos.
Empezaremos por activar NppExec, para lo que iremos al menú Plugins de Notepad++, y allí elegiremos la opción Plugin Manager / Show Plugin Manager, lo que abrirá la ventana del gestor de plugins. En ésta, marcaremos el plugin y lo instalaremos pulsando el botón Install.
Inmediatamente después tendremos acceso a las opciones del plugin por medio del menú Plugins:
Es a partir de este momento cuando podemos empezar a disfrutar de la potencia de la ejecución de programas externos. En primer lugar, recordemos del primer post sobre la compilación cruzada para la Raspberry Pi qué comando utilizábamos para compilar con gcc cualquier programa escrito en C (o C++):
arm-linux-gnueabihf-gcc.exe nombre_programa.c –o nombre_programa_compilado
que guarda alguna semejanza con el siguiente código que introduciremos en el cuadro que se abre cuando pulsamos la opción Execute del plugin (a la que podemos acceder directamente pulsando la tecla de función F6):
que guarda alguna semejanza con el siguiente código que introduciremos en el cuadro que se abre cuando pulsamos la opción Execute del plugin (a la que podemos acceder directamente pulsando la tecla de función F6):
Vamos por partes: en primer lugar, encontramos el comando NPP_SAVE, que es propio del plugin NppExec. Lo que hace este comando es salvar por nosotros el archivo fuente editado cada vez que llamemos a ejecución este código que estamos implementando, con lo que ya nos ahorramos una acción.
La siguiente línea ejecuta el compilador, que es invocado por su nombre incluyendo su ruta completa. Sólo haría falta el nombre del programa si su ubicación estuviera registrada en la variable de entorno PATH. A continuación encontramos el término $(FULL_CURRENT_PATH), que se trata de la expansión de la variable predefinida del plugin FULL_CURRENT_PATH, y que hace referencia al nombre completo (incluyendo ruta) del fichero de código fuente. En el ejemplo que se ve en las pantallas, haría referencia al fichero holamundo.c que pretendemos compilar.
Finalmente, encontramos la expresión –o $(CURRENT_DIRECTORY)\$(NAME_PART), que corresponde a la parte de la salida del comando de ejecución de GCC. La variable predefinida CURRENT_DIRECTORY referencia al directorio actual, que es el mismo en el que se mantiene el fichero fuente. Tras expandirla, le hacemos seguir a continuación el carácter “\” para, inmediatamente después, expandir la variable NAME_PART, que toma el valor del nombre del fichero sin su extensión (en nuestro ejemplo, esta variable toma como valor el nombre del fichero holamundo.c sin su extensión, por lo que la compilación nos dará como resultado un fichero ejecutable denominado holamundo). Podemos, por supuesto, consignar el directorio o el nombre del ejecutable que deseemos. Por ejemplo, $(CURRENT_DIRECTORY)\build\out situará el resultado final de la compilación (que se denominará out) en el directorio build, que será un subdirectorio del actual.
Una vez introducidos estos comandos, pulsaremos Save…, llamaremos a nuestro script con el nombre que deseemos (por ejemplo, “RPi gcc”) en la ventana que se abre, y pulsaremos Save, con lo que ya tendremos salvado este procedimiento de compilación.
En la misma ventana de Execute, activaremos el script pulsando OK, lo que provocará la compilación del programa. Los resultados los podremos revisar en la propia consola de Notepad++, que habremos activado con el icono Show Console Dialog (en nuestra versión de Notepad++, el tercer icono por la derecha). Como vemos en la pantalla, en el ejemplo tenemos un error en el código que es puesto de manifiesto por la salida de GCC, interceptada por la consola de Notepad++:
Para mayor comodidad, podemos incluir una entrada directa a este procedimiento en el menú Macro, para lo que iremos al menú Plugins / NppExec / Advanced Options…, donde elegiremos nuestro script en Associated script y lo denominaremos como creamos conveniente, marcando la opción Place to the Macros submenu:
Una vez que rearranquemos Notepad++, tendremos acceso directo al script de compilación desde el menú Macro:
Finalmente, vamos a asignar una combinación de teclas para, todavía, mayor facilidad de acceso a la orden de compilación. Para ello vamos al menú Configuración, donde entramos en el Gestor de atajos de teclado…
En la ventana que se abre, elegiremos la pestaña u opción Plugin commands, donde encontraremos nuestra entrada (RPi gcc), la seleccionaremos pulsando encima de ella, y pulsaremos después el botón Modify.
En la ventana de Shortcut que se nos abre elegiremos la opción de teclas que queramos (ojo, las opciones de combinaciones libres no son tantas; si no funciona la combinación elegida quizá ya esté tomada por otro comando o script). Pulsaremos OK y en la ventana del Shortcut mapper pulsaremos Close, con lo que ya tendremos acceso a la compilación pulsando la combinación de teclas elegidas (en nuestro ejemplo, Ctrl+F10 desencadenará el compilado del programa fuente activo).
Podremos añadir otros scripts. Por ejemplo, para incluir la librería BCM2835 el comando de compilación debería ser:
C:\SysGCC\Raspberry\bin\arm-linux-gnueabihf-gcc.exe $(FULL_CURRENT_PATH) -l bcm2835 -o $(CURRENT_DIRECTORY)\$(NAME_PART)
O añadiendo la opción –ggdb al comando de compilación, lo que aportará al ejecutable abundante información de compilación que podrá explotarse con GDB, el depurador GNU:
C:\SysGCC\Raspberry\bin\arm-linux-gnueabihf-gcc.exe $(FULL_CURRENT_PATH) -l bcm2835 -o $(CURRENT_DIRECTORY)\$(NAME_PART)
O añadiendo la opción –ggdb al comando de compilación, lo que aportará al ejecutable abundante información de compilación que podrá explotarse con GDB, el depurador GNU:
De la misma manera, es fácil incorporar otro script que ejecutara directamente GDB (arm-linux-gnueabihf-gdb.exe) en la consola de Notepad++. Como ya se comentó en el primer post sobre la compilación cruzada para la RPi, el tutorial de SysProgs sobre su toolchain incluye una introducción muy sencilla y básica a la depuración remota desde Windows de una ejecución bajo el Linux de la Raspberry Pi.
Finalmente, podremos arrancar programas externos desde el propio Notepad++. Iremos al menú Ejecutar / Ejecutar, donde en la ventana correspondiente elegiremos el programa a ejecutar. Cuando pulsemos Guardar… se abrirá la venta de Shortcut que nos permitirá elegir una combinación de teclas para ejecutar el programa externo:
Creo que puede atisbarse la potencia de los scripts del plugin de Notepad++, así que expandamos nuestra ambición: ¿podríamos, entonces, complementar los comandos que hemos visto con algún otro que descargara el ejecutable directamente desde el entorno Windows a la Raspeberry Pi? Y ya puestos, ¿podríamos marcar de forma remota este fichero como ejecutable? ¿E iniciar su ejecución? Las respuestas son sí, sí y sí. Pero llevará su trabajo en el próximo post.
viernes, 2 de agosto de 2013
Un mundo de covers [algo ligerito, que estamos en verano, hombre]
[Somebody That I Used To Know | Gotye | Cover por Jake Coco y Madilyn Bailey | Nos falta Kimbra, pero casi no se echa de menos]
[Adele | Someone Like You | Cover por Walk off the Earth | No me digas que no es mejor que el original]
[The Verve Pipe | The Freshmen | Cover por Boyce Avenue | ¿Que para qué sirve un bajo?]
[Adele | Someone Like You | Cover por Walk off the Earth | No me digas que no es mejor que el original]
Suscribirse a:
Entradas (Atom)