OpenGL en remoto (ssh) y Nvidia

Para el rendering OpenGL en un ordenador remoto se recurre (por defecto) a “indirect rendering” (los comandos Open GL pasan por el protocolo GLX). El “direct rendering” permite acceder directamente a la GPU del ordenador donde se ejecuta la aplicación. Este es el modo que usa por defecto el controlador nativo de Nvidia, que de hecho por defecto rechaza el uso del “indirect rendering” (se puede rehabilitar con la opción “AllowIndirectGLX” de la sección “ServerFlags” de xorg.con).

Así pues, ejecutando la instalación por defecto del driver nativo de Nvidia, se sustituye la biblioteca del sistema libGL. Con lo cual, se pierde el “indirect rendering” y las aplicaciones OpenGL dejan de funcionar en remoto (X11 sobre SSH)

Por otro lado, la biblioteca libGL que Nvidia instala puede ser necesaria para otras aplicaciones (por ejemplo, CUDA)

Una posibilidad es rescatar la biblioteca libGL original (del paquete libgl1-mesa-glx, o equivalente) y recurrir a ella para uso remoto, anteponiendo LD_PRELOAD=/ruta/a/libGLoriginal.so al programa a utilizar.

Si MESA recurre a swrast_dri.so para hacer el rendering (render por software), es probable que haya conflictos con bibliotecas como libstdc++.so.6 o libgcc_s.so (como suele suceder con UCSF Chimera, que tiene sus propias copias de esas bibliotecas en su directorio lib). En este caso se puede usar el mismo “truco” de LD_PRELOAD, pero con esas bibliotecas:

LD_PRELOAD=/usr/lib/gcc/x86_64-linux-gnu/4.9/libgcc_s.so:/usr/lib/x86_64-linux-gnu/libstdc++.so.6 chimera

Instalación de Ubuntu personalizada sin red

  • Descargar la ISO de la versión a instalar. Hacer un pendrive arrancable con la herramienta “Startup Disk Creator” (que basicamente copia la ISO al pendrive y configura el arranque EFI)
  • Preparar un repositorio local de paquetes.
    • Descargar los paquetes de interés con apt-get install -d
    • Copiarlos al pendrive
    • Generar el índice de paquetes con “dpkg-scanpackages . | gzip > Packages.gz”. La herramienta dpkg-scanpackages viene en el paquete dpkg-dev
    • Preparar un sources.list alternativo: “deb file:/media/…/deb/ ./”
  • Copiar el resto de programas y scripts al pendrive

Una vez el pendrive esté listo, se puede usar para arrancar la instalación de Ubuntu. Despúes, basta con sustituir el /etc/apt/sources.list por el alternativo, ejecutar apt-get update y proceder a la instalación de los paquetes desde el pendrive.

Analizar datos estructurados desde la línea de comandos

Para texto plano basta con herramientas clásicas como awk, pero para datos dentro de páginas HTML o en Json hay alternativas más cómodas:

  • jq: JSON
  • scrape: HTML (XPath)

Patrones

Extraer las celdas de una tabla

# -a permite seleccionar sólo uno de los atributos de los elementos encontrados
# la expresion Xpath puede contener "|" para elegir varios elementos según diferentes criterios
# para quedarse sólo con el texto debería bastar /text() , pero en scrape no funciona...
scrape -a id -e '//td[@class="temperature"]' < fichero

Unir dos líneas

# cada - une una nueva linea
paste - -
sed 'N'

Eliminar etiquetas HTML

sed 's_<[^>]*>__g'

Cambiar de separador

# de : a espacio
tr ":" " "

Pasar de hora a época

# actualizar base a la época correspondiente al dia
# en el ejemplo, se añaden 16 días extra 
# el fichero de entrada tiene tres columnas: hora, minuto, dato
awk 'BEGIN{base=1465596000+(16*24*3600)}{print ($1*3600 + $2*60 + base) " " $3}'

Gráfica de dos series de tiempos

gnuplot
plot "serie1.txt" using 1:2, "serie2.txt" using 1:2

Más info: Data science at the command line / Introducción a Xpath

lynx, xmllint y ejemplos Xpath

Más ejemplos de XPath

Combinar correspondencia con Inkscape

Una de las muchas ventajas de Inkscape es que el formato de fichero que utiliza es el estándar SVG, que a su vez se basa en XML. Al ser texto plano, se puede procesar fácilmente. Por ejemplo, se diseña un formulario con Inkscape en el que los campos (nombre, dirección…) se rellenan con identificadores únicos. Esos identificadores únicos se pueden sustituir luego con información de un fichero o una base de datos. El SVG resultante se puede imprimir y reutilizar con un nuevo registro.