viernes, marzo 30, 2012

Algunas notas de VirtualBox (I)

Llevo bastante tiempo usando VirtualBox para usar diversas máquinas virtuales que utilizo a la hora de trabajar. Están montada sobre una Debian Squeeze que hace de host y los sistemas invitados que se montan es básicamente una distribución derivada de Debian. Suelo manejar las máquinas virtuales desde la línea de comandos, puesto que es lento (o directamente no funciona) el uso de las consolas vía XWindow o el uso de vrdp. Entro en la máquina host con ayuda del ssh y controlo las máquinas vboxmanage. Estos dos últimos días he estado buscando información para hacer que funcionara de manera más o menos correcta y conocer las posibilidades que hay para su manejo.

Arrancar una máquina virtual headless

A la hora de arrancar una máquina virtual, VirtualBox nos muestra una ventana con la consola de la máquina. Pero puede que no se desee usarse. Para ello se puede usar en el comando startvm el parámetro --type=headless. De esta manera, el sistema operativo que se ejecuta dentro de VirtualBox esta en background. Los otros parámetros que admite son gui, para usar el entorno gráfico que se esté usando o sdl, para usar las librerías del mismo nombre.

VBoxManage startvm test --type=headless
Llegado el momento, se puede usar el protocolo vrdp para poder tener acceso a la consola, conectándonos a la máquina virtual con un cliente de Terminal Server.

Clonar una máquina virtual

Para clonar una máquina virtual se usa el comando VBoxManage clonevm, pasándole los parámetros adecuados. Se puede seleccionar el nombre de la máquina, lo que se quiere clonar y si se quiere que la nueva máquina clonada se registre en sistema. Por ejemplo:

VBoxManage clonehd test --register --name desarrollo

El comando anterior va a clonar la máquina registrada llamada test y va a crear y registrar una nueva llamada desarrollo. En este caso, el directorio donde se va a crear el fichero es el que utilice la VirtualBox por defecto para almacenar las máquinas recien creadas. Si se quiere especificar otro directorio para el destino, se puede añadir el parámetro --basefolder con el path donde se quiere que se cree la máquina virtual. ¡Ojo!, si este path es relativo utilizará como raíz el directorio $HOME/.VirtualBox.

Obtener información de la máquina virtual

El comando para obtener la información de una máquina virtual es muy sencilla showvminfo. Muestra un listado de todos los parámetros de
configuración

VBoxManage VBoxManage showvminfo nombre_máquina_virtual
Una cosa importante es que la salida del comando anterior es que es dificil de parsear por un script. Si se deseara, hay una salida mucho más lógica que es añadirle el parámetro --machinereadable. De esta manera, se puede parsear más fácilmente la salida.

Instalar las extensiones de Oracle

Una cosa importante cuando se trabaja con VirtualBox son las extensiones para la máquina virtual Oracle VM VirtualBox Extension Pack. Esta paquete contiene una serie de extensiones que son muy útiles a la hora de manejar la máquina virtual, en especial aquella que te permite ofrecer una interfaz VRDP para conectarse con un cliente de virtual server. Puede verse en Installing VirtualBox and extension packs las mejoras que introduce en la máquina virtual.
Instalarla es bastante sencillo:
  1. Se baja de la web de virtualbox la última versión que se necesite.
  2. Se comprueba los hash de la misma.
  3. Se utiliza el comando VBoxManage para instalar la extensión, como usuario root de la máquina.
La sintaxis exacta del último punto es la siguiente:

VBoxManage extpack install --replace Oracle_VM_VirtualBox_Extension_Pack-4.1.10-76795.vbox-extpack
Al añadir el parámetro --replace la instalación se asegura de poder borrar una versión antigua que exista en el sistema de las mismas. Un detalle, ojo con la extensiones que utilizan la licencia VirtualBox PUEL.

Montar ficheros .vdi desde Linux

Para poder montar archivos .vdi (los discos duros del VirtualBox) es necesario recurrir a qemu y a la utilidad qemu-ndb que viene incluido
en el paquete. El kernel de Linux debe de tener soporte para Network Block Device, que permite que Linux sea un servidor remoto de su sistema de ficheros. Los pasos que hay que dar, aparte de tener instalado qemu y de asegurarase que el kernel tiene soporte para nbd compilado como módulo:

modprobe nbd

qemu-nbd -c /dev/nbd0 fichero.vdi

ls -al /dev/nbd0p*

mount -t ext3 /dev/nbd0p1 /mnt

La secuencia de órdenas anterior realiza los siguientes pasos:
  1. Carga el módulo de network block device
  2. Usando qemu, asigna el dispositivo /dev/nbd0 con el fichero que se le indica
  3. Las particiones que tiene el dispositivo aparecerán una ver ejecutada la orden anterior como /dev/nbd0pN, donde N es un entero que indica el
    número de partición: De la 1 a la 4 indica particiones primarias.
  4. Montamos la primera partición en /mnt
Una vez que se ha acabado de usar los discos, se desmonta la partición que se está usando y se desactiva el network block device que se ha creado con qemu-nbd:

umount /mnt

qemu -d /dev/nbd0
Por defecto, el sistema creará 16 network block devices que se pueden usar para ver los ficheros .vdi

Referencias

  1. Oracle VM VirtualBox, User Manual
  2. VirtualBox FAQ
  3. How do you mount a .vdi image on Linux?

Technorati Tags:

jueves, marzo 29, 2012

Twitter y #farolasesquirol

Reconozco que me estoy partiendo la caja con lo crédula que es la gente y como hacen los RT sin ni siquiera comprobar la información. Hay un hash tag en Twitter, #farolasesquirol donde se está acusando a los ayuntamientos de encender las luces para falsear el consumo eléctrico. El problema es que he comprobado las dos últimas horas y salen las mismas cuatro fotos. Y una de ellas, tras verle el EXIF es del día 27. La gente debería tener un poco de sentido crítico antes de dar al RT .... aunque claro, en la batalla de la propaganda eso de "sentido critico" no vale.




Y por último dejo esta con el EXIF del día 27/03


Technorati Tags: ,

sábado, marzo 24, 2012

La nauseabunda justificación de la Ley de Igualdad

Hay muchas razones para considerar la ley de Igualdad la Ley Orgánica 3/2007, de 22 de marzo , pergueñada por el gobierno de Rodriguez Zapatero, como un engendro prescindible. Quizás, el mayor disparate que contiene sea la inversión de la carga de la prueba: Si una persona acusa a otra de discriminación, la persona acusada debe de demostrar que no ha discriminado, cuando en todas las legislaciones con un mínimo de sentido común es justo lo contrario: todo el mundo es inocente hasta que se demuestre lo contrario. Pueden ver el artículo 13 de la citada ley para comprobarlo.

Pero me ha resultado vomitivo leer la justificación de la misma que daba hoy en El País Inmaculada Montalbán, en un artículo titulado Una norma para la transformación social. En el mismo hay dos perlas que justifican la ingeniería social por parte del Estado para lograr los objetivos de igualdad

Hace cinco años se promulgó una ley, la Ley Orgánica 3/2007, de 22 de marzo, para la igualdad efectiva de mujeres y hombres, que ha demostrado ser un instrumento de transformación social capaz de penetrar en todo el ordenamiento jurídico.
[...]
[...]
Estos cinco años demuestran que la Ley de Igualdad es un instrumento jurídico destinado a transformar la realidad y llevar a la conciencia de la ciudadanía y de los operadores jurídicos los valores y principios de una sociedad igualitaria.
[...]

Quizás la señora que ha escrito semejante disparate lo ignore, pero usar la ley para transformar la sociedad es algo que caracteriza a todos los regímenes totalitarios con los que la culta Europa nos recompensó durante el siglo XX. Y a mi personalmente me lleva, una vez más, a ver el Estado no como un conjunto de instituciones al servicio del ciudadano sino como un conjunto de instituciones al servicio de las ideologías de turno que se lleva por delante la libertad de las personas. Y este tipo de leyes, no hace sino ahondar en la dictadura en la que estamos inmersos desde hace mucho tiempo, la de lo políticamente correcto.

Bajo las estupideces que promueve esta nueva dictadura respaldada por estas leyes se ha llegado a denunciar en Bélgica al comic de Hergé Tintin en el Congo, para que se prohíba su venta, hay editores que han censurado las aventuras Huckleberry Finn, se ha llegado a acusar en los tribunales a un profesor que describía el proceso del curado del jamón o se crean infumables guías de lenguaje no sexista (no se pierda la respuesta de la Sexismo lingüístico y visibilidad de la mujer en respuesta a tanta tontería)

Lo que tiene que existir es igualdad de oportunidades, cosa que dista bastante del disparate que es esta ley por mucho que utilice extensivamente dicho término en su articulado.


Technorati Tags:

martes, marzo 20, 2012

Desactivar la restauración de ventanas y aplicaciones en MacOS X Lion

La última versión de MacOS X tiene una nueva funcionalidad que permite recordar que ventanas y documentos se tenían abiertos a la hora de cerrar una aplicación y volverlos a abrir cuando la aplicación se vuelva a lanzar. Puede controlarse por aplicación o bien puede desactivarse de manera general en todo el sistema. A mi es una funcionalidad que me enlentence el lanzado de aplicaciones, así que decidí desactivarla de manera general en el sistema. Para ello hay que irse a Preferencias del Sistema, General y buscar la opción Restaurar ventanas al cerrar y volver a abrir aplicaciones. Si la desactivamos, el sistema ya no nos restaurará las ventanas al iniciar la la aplicación. Puede verse en la siguiente captura de pantalla:



Si se quiere desactivar por aplicación, hay que modificar la configuración de la misma con defaults. Lo primero que es necesario hacer es averiguar cual es el dominio que está usando la aplicación para guardar su configuración. Es relavamente fácil: El estado de la aplicación se guarda en el directorio ~/Library/Saved Application State/. Lo único que hay que hacer es ver el nombre de los directorios con un ls, se descarta el sufijo .savedState del nombre y se tendrá el nombre del dominio que usa la aplicación. Por ejemplo:


swordcoast:~ terron$ cd ~/Library/Saved Application State

swordcoast:~ terron$ ls

...

com.apple.SetupAssistant.savedState

com.apple.SoftwareUpdate.savedState

com.apple.SystemProfiler.savedState

com.apple.Terminal.savedState

com.apple.appstore.savedState

...



Por ejemplo se puede ver que el directorio donde la aplicación de terminal es com.apple.Terminal.savedState y por tanto el nombre del dominio que usa es com.apple.Terminal.

Para desactivar el uso de la funcionalidad lo único que hay que hacer es:


defaults write com.apple.Terminal NSQuitAlwaysKeepsWindows -bool false


Este ejemplo está sacado de la tercera referencia. Lo que no encuentro es la documentación de Apple en la parte de desarrollo que hace referencia a esta manera de desactivar la funcionalidad.

Referencias

  1. How do I stop the Finder and other applications from restoring windows?
  2. Disable Mac OS X Lion Resume & App Window Restore Completely
  3. Turn Off Resume on a Per App Basis in Mac OS X Lion with defaults write

Technorati Tags:

sábado, marzo 17, 2012

La automatización y el accidente del AF-447

Soy una persona muy aficionada a la aviación - un aerotrastornado -, y busco información sobre ese mundillo por simple curiosidad. Uno de los campos que más
me ha llamado la atención ha sido como la investigación de los accidentes ha servido para ir aumentado las medidas de seguridad en la aviación comercial, y como un hecho puntual que parece muy simple, puede llegar a desencadenar una tragedia donde hay cientos de muertos. Cuando ocurre un accidente grave, las autoridades son capaces de pasar años buscando y recopilando toda la información posible para poder sacar unas conclusiones que permitan aumentar la seguridad de
todos los usuarios de las líneas aéreas.

El 1 de junio del año 2009 desaparecía en medio del Atlántico el Airbus A330-200 de Air France que hacía cubría el vuelo AF-447 entre Río de Janeiro y París, dejando apenas unos restos en el óceano y una serie de mensajes ACARS recogidos por las estaciones.Tras dos años de intensa búsqueda, los restos del aparato, junto con las cajas negras fueron recuperadas a casi 4000 metros de profundidad en medio del oceáno atlántico. La información que estaba almacenada en las mismas, tanto la encargada de grabar los parámetos de vuelo como la encargada de grabar las conversaciones de la cabina pudo ser recuperada y la la BEA - el organismo francés encargado de la investigación de accidentes sigue trabajando con toda la información que tiene para intentar llegar a las conclusiones de cuales fueron las posibles causas del accidente.

Los Airbus, a partir del A320 tienen una particularidad que los diferenciaba de otros aviones de su época: La disponibilidad de un sistema de Fly-by-wire donde las órdenes que el avión recibe de los pilotos son filtradas y adaptadas por una serie de sistemas computerizados para asegurar una serie de protecciones - por ejemplo que no se sobrepase el límite G del avión - que hagan que nunca el avión pueda entrar en una envolvente de vuelo que ponga en peligro su seguridad. Esto funciona siempre muy bien, cuando el avión está dentro de los parámetros que establecen el modelo de comportamiento, pero ¿qué ocurre si esto no es así?. Pues una posible explicación la tenéis en la serie de artículos The Airbus Aircraft Family & System Safety publicadas por Matthew Squair intentando analizar todos los aspectos de seguridad de la automatización resposable de la implementación del Fly-by-wire en Airbus.

De la lectura de los artículos que aparecen en el enlace anterior, quizás hay dos que me han llamado la atención. El primero de ellos es The Myth of the Perfect Automatic Man donde el autor del mismo habla de los límites que se tienen a la hora de automatizar procesos que antes eran llevados a cabos por humanos:

We should also be realistic about the ability of automation to make correct decisions under conditions of uncertainty. If skilled human operator’s can make mistakes why do we think that simplistic automated decision making can or will do better.

De la misma serie, On the Brittleness of Software.porque toca un tema clave: la interfaz hombre máquina y como es de importante de mostrar la información para que sea comprendida para los consimidores de la misma:

As Nancy Leveson has pointed out, often how we represent and communicate complex logical statements is just as important in avoiding error as actually understanding the functional requirements.


Technorati Tags:

Cambiando la plantilla del blog

Llevaba tiempo pensando en cambiar la plantilla usaba en el blog. Había dos aspectos de la plantilla antigua que no me gustaban demasiado. El primero es que su anchura estaba diseñada para las resoluciones de pantalla que existían en el año 2004. La segunda es que el esquema de colores no era el más adecuado para la lectura. Así que viendo un poco las opciones que daba Blogger me he decidido por esta plantilla que para mi es más cómoda de leer - aunque tengo que corregir algunos post que se salen del ancho que hay - .

He aprovechado para quitar el antiguo contador que tenía con webstat. Sospecho que era el responsable de desplegar una ventana de publicidad de vez encuando. La publicidad que tenía en la barra superior del blog también la he cambiado y la he dejado integrada con la plantilla de Blogger.

Tengo todavía que explorar las opciones de la plantilla nueva. Quizás lo que menos me gusta es que el histórico del blog y los enlaces quedan en un desplegable que está situado en la parte izquierda del mismo y no se ven demasiado bien. También quiero jugar un poco con las anchuras de las entradas, puesto que hay texto que se sale de la zona que tiene acotada. Iré trabajando en la plantilla poco a poco.


Technorati Tags:

viernes, marzo 16, 2012

El historial de Safari: Uso de plist desde Python


Tenía la curiosidad por saber como el navegador de Apple - Safari - almacena el historial en la cuenta de cada usuario. Pensaba que iba a usar sqlite, como hace por ejemplo Firefox, pero tras mirar en ~/Library/Safari el fichero que contiene el historial es History.plist. Esta es un archivo en formato plist binario.

Para poder curiosear con él, lo primero que hay que hacer es pasarlo a formato de texto, que es un xml codificado con el formato utf-8. Para facilitar la conversión MacOS X tiene la herramienta en línea de comandos plutil. La conversión de salida está controlada por la opción -convert, así que si queremos pasar la plist binaria a una plist en XML, se puede
hacer con la siguiente orden:


swordcoast:~ terron$ plutil -convert xml1 -o history_xml.plist History.plist

La order anterior habrá creado el fichero history_xml.plist que se puede ver con cualquier editor de texto que soporte codificaciones utf-8 como vim

Como muchos sabréis, si se tiene el Xcode instalado, se puede abrir la lista en formato binario sin problemas. Con un simple open History.plist en la línea de comandos se puede ver el contenido de la misma y editarlo si se desea - suponiendo que el sistema tenga asociado la extensión .plist a Xcode -.

Me gusta bastante Python, y quería procesar el contenido de la lista - una vez convertida a formato XML - para ver las entradas que había ido visitando. No es necesario parsear el XML, puesto que Python tiene un módulo oficial, plistlib que nos permite leer y procesar los ficheros plist de MacOS X. Por ejemplo el siguiente script lee el historial en XML, escribe la URL y la fecha de la última visita.


#!/usr/bin/python
import plistlib
import sys
import time
import calendar

def dump_files (filepath):
    pl = plistlib.readPlist(filepath)
    history = pl['WebHistoryDates']
    for entry in history:
            url = entry['']
            lastdate = float(entry['lastVisitedDate'])
            toffset = calendar.timegm(time.strptime("01/01/2001", "%d/%m/%Y"))
            print "%s;'%s'" % (time.ctime(lastdate),url)+toffset
for f in sys.argv[1:]:
        dump_files(f)

Como puede verse, plist.readPlist() nos devuelve una lista donde cada una de las entradas es un diccionario. En este caso, cada entrada tiene una serie de claves que se puede obtener:

ClaveDescripción
vacíaLa URL del historial.
displayTitleTítulo de la página a la que se ha visitado.
lastVisitedDateFecha de la última visita
titleTítulo de la página tal como se ha obtenido del servicor
visitCountNúmero de visitas
lastVisitWasFailureBoleano que indica que la última visita ha fallado

Aparte, existe otros campos que son arrays como W y D que no se lo que son. Un detalle sobre el campo lastVisitedDate es que implica el número de segundos desde el 1 de enero del 2001, ya que corresponde con el tipo de datos CFAbsoluteTime que mide el tiempo desde el 1 de enero del 2001 GMT. Por eso el script suma toffset a la hora de convertir el tiempo para la referencia de Unix


Technorati Tags: ,

jueves, marzo 15, 2012

Usar varias grabadoras en MacOS X desde línea de comandos

Tengo uan grabadadora USB externa que utilizo en vez de la que internal del portatil. Puede usarse sin problema con la Utilidad de discos, pero suelo usar bastante la línea de comandos en MacOS X, y quería aprender a usarla sin necesidad de la interfaz gráfica. Investigando un poco, encontré como hacerlo.

Una vez más, la interfaz para acceder a todo el framework de grabación es hdiutil.

Para poder especificar la grabadora que se está usando es necesario obtener el path del dispositivo, en formato de OpenFirmware. Para ello se recurre al parámetro -list del verbo burn


swordcoast: terron$ hdiutil burn -list

MATSHITA DVD-R   UJ-898 via ATAPI (DRDeviceSupportLevelAppleShipping)

        IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@1F,2/AppleIntelPchSeriesAHCI/PRT1@1/IOAHCIDevice@0/IOAHCISerialATAPI/IOSCSIPeripheralDeviceNub/IOSCSIPeripheralDeviceType05/IODVDServices

   TSSTcorp CDDVDW SE-208AB via USB (DRDeviceSupportLevelUnsupported)

        IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/EHC1@1D,7/AppleUSBEHCI/MT1806 @fd130000/6238--Storage@0/IOUSBMassStorageClass/IOSCSIPeripheralDeviceNub/NMSmartplugSCSIDevice/IODVDServices


En el listado anterior puede verse las dos grabadoras que tiene el sistema. El path completo (Lo que empieza por IOService) es lo que hay que especificar al parámetro -device a la hora de grabar. Por tanto, para usar la segunda grabadora y grabar en el soporte la imagen iso image.iso, la orden que hay que introducir es:

hdiutil burn -device "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/EHC1@1D,7/AppleUSBEHCI/MT1806 @fd130000/6238--Storage@0/IOUSBMassStorageClass/IOSCSIPeripheralDeviceNub/NMSmartplugSCSIDevice/IODVDServices" image.iso

El sistema nos grabará y verificará la imagen en el grabador seleccionado. Como puede verse, he puesto el path del device entre comillas porque tiene un espacio y da problemas en el shell.


Technorati Tags: