sábado, 18 de junio de 2011

AppEngine: cómo evitar subir contenidos de un directorio

Al trabajar con Google App Engine, podemos crear un directorio en la base del proyecto, y luego configurar app.yaml para que ignore estos archivos. Por ejemlpo, si el directorio se llama local, hay que agregar a las siguientes líneas al archivo app.yaml:

skip_files:
- ^(.*/)?app\.yaml
- ^(.*/)?app\.yml
- ^(.*/)?index\.yaml
- ^(.*/)?index\.yml
- ^(.*/)?#.*#
- ^(.*/)?.*~
- ^(.*/)?.*\.py[co]
- ^(.*/)?.*/RCS/.*
- ^(.*/)?\..*
- ^local/.*

Todas las líneas excepto la última, corresponden a la configuración por default de skip_files. La última línea hace que el directorio local en la raiz del proyecto sea ignorado al ejecutar appcfg.py.

miércoles, 15 de junio de 2011

Compactar particiones con zerofree

Para realizar backups de imágenes de discos usadas en QEmu/KVM se puede optimizar usar zerofree. Este programa  escribe 0 (ceros) en los lugares de la imagen que NO está siendo usada por archivos, y que han sido usadas pero actualmente están libres (por ejemplo, en el lugar donde se haya creado un archivo que luego haya sido borrado).

Zerofree funciona para ext2/ext3/ext4, en particiones que no están montadas, o montadas solo-lectura. Esta utilidad es "inteligente" en el sentido que no hace "crecer" a los archivos sparse. 


Los pasos a seguir son:

  • cargar nbd

   ~$ sudo modprobe nbd max_part=16

  • asociar imagen de disco disk01.qcow2nbd1 y crear dispositivos asociados a particiones

   ~$ sudo qemu-nbd -c /dev/nbd1 -v disk01.qcow2
   ~$ sudo partprobe /dev/nbd1

  • ejecutar zerofree

   ~$ sudo zerofree -v /dev/nbd1p5

Listo! El archivo "disk01.qcow2" ocupa teóricamente 11G, pero como es un archivo sparse, en realidad está ocupado en disco sólo 1.9G:


   ~$ ls -lh disk01.qcow2
   -rw-r--r-- 1 root root 11G 2011-06-15 14:51 disk01.qcow2
   ~$ du -h disk01.qcow2 

   1.9G disk01.qcow2

El .tar ocupa sólo 918M:

   ~$ tar --sparse -cf disk01.qcow2.tar disk01.qcow2
   ~$ ls -lh disk01.qcow2.tar 
   -rw-r--r-- 1 horacio horacio 918M 2011-06-15 15:10 disk01.qcow2.tar

Y al comprimirlo solo nos queda 305M:

   $ gzip -1 disk01.qcow2.tar 
   $ ls -lh disk01.qcow2.tar.gz 
   -rw-r--r-- 1 horacio horacio 305M 2011-06-15 15:10 disk01.qcow2.tar.gz



   ~$ du -h *
   1.9G disk01.qcow2
   305M disk01.qcow2.tar.gz



En este caso, un archivo que ocupa inicialmente 1.9G lo llevamos a ocupar 918M (305M comprimido).

jueves, 9 de junio de 2011

Cómo compilar cliente spice

Seguiendo los pasos para instalar Spice (un nuevo protocolo para comunicarse con guests KVM/QEMU/etc.) me surgieron unos errores, no muy complicados de resolver.

En general, segui las instrucciones de http://spice-space.org/page/Building_Instructions.
La instalación la hice en /usr/local/slice, asi que reemplace "INST_ROOT" por "/usr/local/slice".


Para compilar e instalar el cliente, en un momento hay que ejecutar:

~$ cd $SRC_ROOT/spice
~$ ./autogen.sh --prefix=$INST_ROOT

Pero este ultimo comando me generó un error:


----------------------------------------
(...)
checking for PROTOCOL... no
configure: error: Package requirements (spice-protocol >= 0.6.0) were not met:
No package 'spice-protocol' found
Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.
Alternatively, you may set the environment variables PROTOCOL_CFLAGS
and PROTOCOL_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.
----------------------------------------

Esto se solucione usando:

~$ export PKG_CONFIG_PATH="/usr/local/spice/share/pkgconfig:/usr/local/spice/lib/pkgconfig"
~$ ./autogen.sh --prefix=/usr/local/spice
~$ cd client
~$ make install

Y... no funcionó...

----------------------------------------
make[1]: *** No rule to make target `../common/libspice-common.la', needed by `spicec'. Stop.
make[1]: Leaving directory `/mnt/sin_encriptar/src/spice-client-src/spice/client'
make: *** [install] Error 2

----------------------------------------

Pero, compilando manualmente lo del directorio "common", luego lo de "cliente" funciona:

~$ cd ..
~$ cd common
~$ make install
~$ cd ..
~$ cd client
~$ make install

Y ahora sí!

viernes, 3 de junio de 2011

Eliminando *.pyc del repositorio Git

Por un error subí archivos pyc al repositorio Git. Ya que no me hace falta mantener esos archivos en el repositorio, decidí intentar eliminarlos del historial, usando "git filter-branch". Resultó ser bastante fácil!

$ git filter-branch --tag-name-filter cat \
--index-filter 'git rm -r --cached --ignore-unmatch *.pyc' HEAD

Esto no es peligroso para repositorios "personales", pero SI para repositorios compartidos, ya que este comando reescribe todo el historial. También hay que tener cuidado si se están utilizando varios branches, ya que este comando solo trabaja en 1 branch a la vez.

La documentación del comando puede verse aqui.

Probando LM335 con PyArduinoProxy

Subi unos screenshots, mostrando cómo usé la interfaz web de PyArduinoProxy para testear unos LM335.

https://github.com/hgdeoro/py-arduino-proxy/wiki/Example%3A-Testing-LM335