martes, enero 31, 2017

Plantilla para recetas en Latex

Desde hace algún tiempo me ronda la idea de recopilar todas aquellas recetas de cocina que voy aprendiendo, así como recetas de mis padres y elaborar un pequeño recetario que me sirva de referencias con las mismas. La solución más cómoda para mi fue usar LaTeX. Es cierto, que introducir el marcado a mano cuando existen estupendos editores WYSIWYG, pero el acabo de los documentos realizados con este sistema siempre me ha gustado. Además, se ajusta bastante a mi manera de trabajar, con un editor de texto como vim y la posterior generación de pdf.

Ahora, tenía que buscar un conjunto de macros para LaTeX que me facilitase la creación del libro. Así que buscando en The Comprehensive TEX Archive Network para ver que posibles paquetes podía probar. Bajo cooking encontré varios tipos de macros que se podían ajustar más o menos a lo que iba buscando. Empecé probando cooking pero no me convenció demasiado. Así que pasé al siguiente xcookybooky

Tras instalarlo en el sistema, vi que era justo lo que necesita: Un entorno de receta, que permite especificar varias secciones y cuyo resultado es este:

La historia del Amiga, nuevos capítulos en Ars Technica

Hace algunos años, enlacé una serie artículos publicados en Ars Technica sobre un ordenador mítico de los años 80, el Commodore Amiga. Lo que no me imaginaba, es que iban a continuar publicando alguno más casi diez años después: La lista queda ampliada con:

Hay que agradecer el esfuerzo de Jeremy Reimer en escribir estos artículos y traernos del pasado, recuerdos de esas maravillosas máquinas.

Y de los tres, como no, el que más me gusta,el de la demoscene, un mundo que empecé a conocer en los 90, cuando comenzaba a perder fuelle, pero del que guardo gratos recuerdos.

Much like the Amiga itself, the demo scene ignited people’s passions and imaginations. It showed what amazing things people willing to spend time and effort on their craft could produce with the help of a computer. In the end, it spawned careers and industries too numerous to mention. While at first glance the demo scene might seem to be a part of history, its continued existence is nothing less than a triumph of the human spirit.

Y par terminar, esta pequeña entrada, nada como recordar un clásico de la época, Phenomena - Enigma

sábado, enero 28, 2017

Curiosidades de la Aviónica del JAS 39 Gripen

El Saab JAS 39 Grippen es un caza multirol diseñado por la compañía sueca Saab. Hace unos días, estuve buscando algo de información sobre su aviónica y di con Usage of Ada in the Gripen Flight Control System, un pequeño artículo que describe como son los ordenadores que controlan las leyes de vuelo.

El Gripen, como otros cazas de su generación, es un avión que usa Fly by wire: Con las entradas de diferentes sensores, los ordenadores calculan los comandos que deben de enviar a las superficies de control de vuelo de acuerdo a unas leyes.

El Gripen usa un sistema de triple redundancia con dos procesadores distintos: Un procesador principal, Motorola 68040 y uno secundario encargado de leyes más básicas y de la entrada y salida con el resto de los subsistemas del avión TMS320C30, un DSP de Texas Instruments. El primero de los procesadores está programado en ADA-83, y mientras que el segundo está programado en C. Decir que la máxima velocidad del micro principal, el Motorola era de 40 Mhz.

Cuando se escribió este documento, no era normal usar tareas de ADA o Excepciones en software que controlase aviónica, pero en la OFP del Gripen consiguieron usar un diseño para aprovechar esas características del lenguaje. Hay otro paper, sobre el tema Ada in the JAS 39 Gripen Flight Control, pero no consigo encontrarlo en PDF.

jueves, enero 26, 2017

Imagen ISO de un CD/DVD en MacOS El Capitan

Hasta OS X 10.10, la utilidad de DiskUtil.app del sistema operativo permitía generar imágenes en formato ISO de cualquier DVD o CDROM. Sin embargo, esta opción ha desaparecido a partir de la versión 10.11 de El Capitan. ¿Cómo generar una imagen, entonces?, pues se puede hacer fácilmente con la utilidad de línea de comandos hdiutil.

Para obtener la imagen del CD/DVD se usará la opción -srcdevice de la opción create y se especificará la opción -format UDTO para que sea el formato ISO necesario. Estas órdenes deben de ejecutarse con un usuario con privilegios de administrador y es necesario que el CD/DVD introducido en la unidad, esté desmontado:

mount
/dev/disk1 on / (hfs, local, journaled)
devfs on /dev (devfs, local, nobrowse)
map -hosts on /net (autofs, nosuid, automounted, nobrowse)
map auto_home on /home (autofs, automounted, nobrowse)
/dev/disk2s0 on /Volumes/CODONICS032700 (cd9660, local, nodev, nosuid, read-only, noowners)
sudo umount /dev/disk2s0
Password:
sudo hdiutil create -srcdevice /dev/disk2s0 -format UDTO /Users/cterron/salida.iso
Leyendo CODONICS032700                   (Apple_ISO: 0)…
...............................................................................
Tiempo transcurrido: 21.619s
Velocidad: 1.7Mbytes/s
Ahorro: 0.0%
created: /Users/cterron/salida.iso.cdr
file /Users/cterron/salida.iso.cdr 
/Users/cterron/salida.iso.cdr: ISO 9660 CD-ROM filesystem data 'CODONICS032700                 '

En esta secuencia de órdenes y su salida, el dispositivo de CDROM equivale a /dev/disk2s0 y lo averiguamos con la orden mount.

martes, enero 24, 2017

boto3: Colecciones y acceso a S3

Estos últimos días estoy empezando a usar el Amazon Web Services (AWS) SDK for Python, llamado boto3. Una de las cosas interesantes de esta versión del SDK es la disponibilidad de las colecciones, gracias a las cuales es muy sencillo iterar sobre conjuntos de datos o filtrar los mismos sin necesidad de usar los paginadores, ya que el sistema se encarga de hacerlo por nosotros.

Por ejemplo, obtener todos los objetos que hay en un bucket S3 es tan sencillo como:

bucket = s3.Bucket(TARGET_BUCKET)
for obj in bucket.objects.all():
    print(obj)

Recordar, que aunque parezca extraño, el espacio de nombres de un bucket S3 es plano. Todos los objetos están identificados por una clave única, sólo que por convención, se usa un separador de path (normalmente "/") para dar la ilusión de la existencia de directorios.

Es más, con ayudas de las colecciones se puede filtra para que nos devuelva todos los objetos cuya clave coincida con un prefijo determinado y pertenezca a un bucket:

TARGET_KEYS="list_3000_objects"
KEY_SEPARATOR="/"
s3 = boto3.resource('s3')
bucket = s3.Bucket(TARGET_BUCKET)
for obj in bucket.objects.filter(Bucket=TARGET_BUCKET, Prefix=TARGET_KEYS + KEY_SEPARATOR):
    print(obj)

La información la saqué de esta pregunta sobre boto3 en StackOverflow que hice.

domingo, enero 22, 2017

Crear usuarios en OS X desde la línea de comandos

Para añadir desde la línea de comandos un usuario en MacOS X es necesario usar el comando dscl - Directory Service command line utility -, cuya misión es interaccionar con el servicio de directorios de la máquina local o de una máquina remota.

Por ejemplo, para listar todos los usuarios que hay en la máquina se puede usar la siguiente orden que generará la salida que se muestra en el segundo bloque.

dscl . -list /Users
...
_amavisd
_appleevents
_appowner
_appserver
...

Si se quiere ver todos los atributos de los registros de usuario se puede ejecutar con las siguientes opciones y puede verse parte de la salida en el siguiente bloque:

dscl . -readall /Users
GeneratedUID: FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000053
NFSHomeDirectory: /var/virusmails
Password: *
PrimaryGroupID: 83
RealName:
AMaViS Daemon
RecordName: _amavisd amavisd
RecordType: dsRecTypeStandard:Users
UniqueID: 83
UserShell: /usr/bin/false

Para añadir un usuario nuevo, será necesario crear un nuevo registro bajo /Users y añadir una serie de atributos que configuren la cuenta. Para proceder a esta creación y modificación de atributos, será necesario ejecutar el comando dscl desde una cuenta que tenga los privilegios adecuados. Si se quiere crear un usuario mldonkey, cuyo directorio $HOME sea /Users/mldonkey, con contraseña password1234, los pasos necesarios son:

# Crear el nuevo registro
sudo dscl . -create /Users/mldonkey
# Añadir el atributo que define el shell
sudo dscl . -create /Users/mldonkey UserShell /bin/bash
# Crear el atributo donde se guarda el nombre
sudo dscl . -create /Users/mldonkey RealName "Usuario par ejecutar mldonkey"
# Añadir el directorio $HOME
sudo dscl . -create /Users/mldonkey NFSHomeDirectory /Users/mldonkey

Ahora, nos falta dos atributos importantes: El UniqueID, el número que define el uid del usuario y el PrimaryGroupID , el número que identifica el grupo primario del usuario. Normalmente, usamos el grupo llamado staff, pero será necesario ver cual es su GroupID. Para ello con el siguiente comando nos devolverá el valor que se necesita:

dscl . -read /Groups/staff|grep PrimaryGroupID
PrimaryGroupID: 20

El un sistema de tipo Unix, el uid es único. Normalmente, OS X asigna los uid de usuarios normales a partir de 500, y este debe ser único. ¿Cómo se puede generar el siguiente libre?. Pues con esta orden:

dscl . -readall /Users|grep UniqueID |awk -v max=0 '{if($2>max){v=$2; max=$2}} END{print v+1 }'

Una vez que se tienen esos dos números, se añaden al registro los atributos, se establece la password, se crea el directorio raíz del usuario y se le ponen los permisos adecuados. Por ejemplo, en mi sistema el siguiente uid libre es el 507 y el PrimaryGroupID de staff es 20

# Añadir el uid
sudo dscl . -create /Users/mldonkey UniqueID 507
# Añadir el atributo con el grupo primario
sudo dscl . -create /Users/mldonkey PrimaryGroupID 20
# Establecer la password. Ni se te ocurra usar una como la de ejemplo
sudo dscl . -passwd /Users/mldonkey password1234
# Crear el directorio $HOME
sudo mkdir /Users/mldonkey
# Establecer permisos de usuario en el $HOME
sudo chown mldonkey /Users/mldonkey
# Establecer el grupo en el $HOME
sudo chgrp staff /Users/mldonkey
# Establecer los permisos
sudo chmod 755 /Users/mldonkey

Por último, decir que mejor hacer un script que se encargue de todo :)

sábado, enero 21, 2017

La parroquia de mi pueblo en 3D

Mi prima Mª Dolores Mora se ha currado un estupendo modelo 3D de la parroquia de mi pueblo, la Iglesia de Santo Domingo de Guzmán. Una particularidad de este templo es su españada, no muy habitual en las iglesias de la costa de Huelva.

vim pathogen

pathogen es un script de Vim que permite manejar con facilidad la opción runtimepath del editor: La lista de directorios donde el editor buscará los diferentes scripts y ficheros necesarios para su ejecución, permitiendo que residan en directorios distintos bajo $HOME/.vim/bundle, siendo por tanto muy sencillo de instalar nuevas extensiones de Vim. Su autor es Tim Pope y puede encontrarse el código fuente del mismo en el repositorio de pathogen.

Instalar el plugin es el $HOME de un usuario es muy sencillo:

$ mkdir -p ~/.vim/autoload ~/.vim/bundle
$ curl -LSso ~/.vim/autoload/pathogen.vim \
    https://tpo.pe/pathogen.vim

Modificar el $HOME/.vimrc del usuario para que al principio incluya la siguiente llamada:

" Pathogen
execute pathogen#infect()

Una vez configurado de esta manera, se podrán añadir nuevos plugins y ficheros de runtime en $HOME/.vim/bundle, cada uno en un directorio separado.

Por último: No me gusta demasiado bajarme un fichero de script directamente de Internet y hacer que el vim lo ejecute: Aunque los troyanos de vim no suelen ser muy normales, se tiene acceso a todo el sistema y se puede colar un "bicho" al bajarlo con curl. Prefiero bajarlo del repositorio del autor y comprobarlo.

Otro sistema de este tipo, que no he probado es