Recompila tu propio Kodi

Toco bastante el código, así que la distribución precompilada de Kodi no me sirve. Para compilar Kodi por mi cuenta, hago lo siguiente:

$ cd  ~/hg/kodi/
$ git fetch
$ git checkout RAMA_QUE_NOS_INTERESA
$ mkdir /tmp/kodi; cd /tmp/kodi
$ cmake ~/hg/kodi/ -DCMAKE_INSTALL_PREFIX=/home/jcea/.kodi/
$ cmake --build . -- VERBOSE=1 -j$(getconf _NPROCESSORS_ONLN)
$ make install

Estas instrucciones descargan el código de Kodi, lo compilan y lo instalan.

Obsérvese el uso de getconf _NPROCESSORS_ONLN para obtener el número de procesadores en el ordenador y, de esta forma, aprovecharlos todos.

Un detalle muy interesante es que Kodi utilizará ccache, si lo tenemos instalado. Esto permite reducir el tiempo de compilación enormemente. Escribiré sobre esto en un artículo futuro.

Actualización 20180811: He escrito un artículo sobre ccache: Ccache o cómo recompilar rápido y sin dolor.

Decodificar mensajes JSON concatenados

Python dispone de funciones para codificar y decodificar JSON sin necesidad de instalar ninguna librería adicional, al menos si no necesitamos un rendimiento extremo. Su uso es bastante simple:

>>> import json
>>> json.dumps({1:'hola'})
'{"1": "hola"}'
>>> json.loads('{"1": "hola"}')
{'1': 'hola'}

El uso es simple, sí, pero la traducción entre la estructura Python y JSON es imperfecta debido a limitaciones del estándar JSON. Es un tema a tener en cuenta, pero que no nos interesa ahora mismo.

El problema consiste en decodificar secuencias JSON concatenadas. La forma evidente no funciona:

>>> json.loads('{"1": "hola"}{"3":"adiós"}')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.7/json/__init__.py", line 348, in loads
    return _default_decoder.decode(s)
  File "/usr/local/lib/python3.7/json/decoder.py", line 340, in decode
    raise JSONDecodeError("Extra data", s, end)
json.decoder.JSONDecodeError: Extra data: line 1 column 14 (char 13)

Esta función requiere decodificar un único objeto JSON completo.

¿Qué ocurre si tenemos una secuencia de objetos JSON? Lo evidente es llevar la cuenta de llaves abiertas y cerradas ({ y }), pero eso supone considerar también que una llave puede formar parte de una cadena de texto. La aproximación directa es frágil y con varios casos especiales. ¿Qué ocurre además si estamos recibiendo los objetos JSON a través de la red y tenemos fragmentos incompletos?

La solución a todo esto es el método json.JSONDecoder.raw_decode(). Este método intenta decodificar un objeto JSON. Esto puede fallar con una excepción si el objeto JSON está incompleto o bien proporcionarnos el objeto decodificado y la posición donde termina en la cadena de entrada. Con ese valor sabremos dónde empieza el siguiente objeto JSON.

Veamos un ejemplo real de código en producción:

Leer más…

Detección de presencia por ARP, o cómo saber si tu hijo está en casa

Los adolescentes prefieren morir antes que salir de casa sin su móvil y la condenación eterna antes que permitir que se quede sin batería, así que comprobar si el móvil de tu hijo está conectado a tu red WIFI es una buena forma de saber si está o no en casa.

El siguiente programa te avisa por Telegram cuando tu hijo entra o sale de casa. De modo general, te avisa cuando un determinado dispositivo pasa a estar presente o desaparece de tu red doméstica.

Este programa puede ejecutarse en cualquier máquina Unix-like de nuestra red local que esté encendida permanentemente. En mi caso utilizo una Raspberry PI que tiene otros usos adicionales.

Leer más…

¿Dónde comprar ordenadores personales compatibles con Linux?

Me cuesta mucho cambiar de ordenador personal porque para mí es una herramienta y no un fin en sí mismo, así que cualquier cambio me incomoda y me entorpece hacer el trabajo que realmente quiero hacer con el ordenador. En el caso de los portátiles la cosa es aún más dolorosa, porque el soporte de sistemas alternativos a Microsoft Windows es, como norma, ridículo.

Si te funciona el sonido, no te funcionará la WIFI. Si funciona la WIFI, olvídate de tener aceleración hardware 3D en la tarjeta gráfica. Si todo parece funcionar, hibernar el portátil y que se restaure correctamente será como jugar a la ruleta rusa.

En fin, desesperante.

Mi mejor opción hasta ahora ha sido preguntar a amigos que están usando Linux y contrastar experiencias. Lo malo es que a) mucha gente aprende a convivir con problemillas que no me apetece compartir tras gastarme 1.200 € en un portátil nuevo y b) cuando todo funciona perfectamente, o bien la máquina no se ajusta exactamente a lo que quiero (por ejemplo, ahora mismo quiero un portátil con una CPU marca AMD; no quiero Intel) o bien se ha dejado de fabricar.

En España, por suerte, existen un puñado de empresas que importan y certifican máquinas compatibles con Linux. Mi problema con ellas es que la selección de modelos suele ser muy reducida y que, al no ser fabricantes sino importadores de productos OEM, puede haber cambios de catálogo en cualquier momento.

Iré actualizando la lista siguiente de vez en cuando:

Leer más…

Parar y relanzar Kodi en una instalación OSMC

OSMC es una distribución Debian para Raspberry PI (entre otros) que incluye Kodi. Con ella puedes convertir tu Raspberry PI en un centro multimedia, conectarla a la televisión, manejarla desde el mando a distancia, etc.

OSMC arranca automaticamente Kodi al encender la Raspberry PI y lo relanzará si Kodi muere por algún motivo. A veces, no obstante, es necesario parar Kodi de forma controlada para -por ejemplo- realizar modificaciones en su base de datos o ficheros de configuración de forma manual.

Para detener Kodi de forma controlada en OSMC, podemos entrar en la Raspberry PI mediante SSH y ejecutar el siguiente comando:

$ sudo systemctl stop mediacenter.service

Una vez que hayamos completado el trabajo, podemos relanzar todo el sistema con un reboot normal y corriente o bien con el siguiente comando, si no queremos reiniciarlo todo:

$ sudo systemctl start mediacenter.service

Proveedores de alojamiento baratos

Hago un uso intensivo de mis servidores, así que prefiero usar alojamiento dedicado en vez de no tener ni idea de lo que voy a pagar cada mes (y que además sería bastante, dado mi perfil de uso) si emplease la nube.

No quiero servidores compartidos ni gestionados. Solo trabajo con servidores dedicados que provisiono de forma simple con SmartOS y Ansible, y que tienen siempre los discos duros llenos y las CPUs y la memoria al 99%.

Siempre estoy a la caza de proveedores de alojamiento baratos. Iré actualizando la lista de vez en cuando:

Cómo se procesó el audio de "El relato como creación de la realidad en Borges"

La charla de Elena El relato como creación de la realidad en Borges se grabó con una Sony ICD-PX312. Es una buena grabadora, pero las condiciones de la sala eran muy complicadas: ruido de fondo monumental (ruido de otras aulas, ruido de los tubos fluorescentes), los alumnos tosiendo constantemente, jugando con los bolígrafos, tecleando en los ordenadores, Elena moviéndose por la tarima y preguntas y lecturas de los alumnos, alejados del micrófono. Incluso se puede oír perfectamente a un alumno afilar sus lápices con un afilador eléctrico.

Intentar obtener un audio inteligible de una calidad mínima ha sido difícil. Voy a describir los pasos aquí. Usé el software Audacity.

Leer más…

El relato como creación de la realidad en Borges

Nota

Elena Marcela González Gómez es filóloga y profesora de lengua y literatura española en un instituto de Madrid.

Este texto sirvió como preparación para una charla impartida a alumnos de cuarto de filología en una universidad madrileña el 14 de marzo de 2018. La charla se grabó, pero, lamentablemente, el sonido tiene una calidad muy deficiente.

Aquí tenéis la grabación en formato Opus. Tiene una duración de una hora y cuarenta minutos.

Si tienes problemas para escuchar ese audio, puedes intentarlo con una versión de menor calidad en el vetusto y anticuado formato MP3.

Explico algunos detalles sobre el procesado de este audio en Cómo se procesó el audio de "El relato como creación de la realidad en Borges".

Leer más…

Activación/Desactivación de extensiones Mercurial de forma puntual

A veces necesitamos una extensión Mercurial de forma puntual y no queremos tenerla activada por defecto en nuestra configuración. Por ejemplo, porque se trata de una extensión de uso delicado o experimental.

Podemos invocar Mercurial desde la línea de comandos de la siguiente manera:

$ hg --config extensions.histedit= histedit

Aquí estamos activando la extensión histedit para modificar changesets en fase secreta o borrador.

Te puede interesar conocer extensiones Mercurial comunes o cómo activar o desactivar una extensión de forma permanente.

Si lo que quieres es desactivar puntualmente una extensión activada en la configuración por defecto, puedes indicarlo con un ! (signo de admiración). Por ejemplo:

$ hg --config extensions.mq=! COMANDO

Durante esta invocación de Mercurial, la extensión Mercurial Queues estará desactivada. Por ejemplo:

$ hg qseries --config extensions.mq=!
hg: unknown command 'qseries'
'qseries' is provided by the following extension:

    mq            manage a stack of patches

(use 'hg help extensions' for information on enabling extensions)

Podemos usar el mismo principio para modificar cualquier opción configurada en los ficheros INI de Mercurial.