Compilar programas para Windows desde Linux – Parte 1

¿Eres un usuario de Linux y disfrutas haciendo tus programitas en C o C++ pero quieres compartirlos con el resto del mundo que seguramente usa Windows?. Compartirles el código es una posibilidad pero el usuario promedio no sabría qué hacer con él así que tus opciones se reducen a entregarles un ejecutable listo para usar en Windows. Por suerte, compilar tus programas para Windows es relativamente fácil en Linux, sobre todo si alguna vez usaste MinGW en Windows. MinGW es, por así decirlo, el gcc para Windows. MinGW ofrece compiladores para C y C++ (entre otros) que generan archivos ejecutables .exe para Windows así que, como te imaginarás, solamente tenemos que instalar MinGW para poder usarlo para generar ejecutables para Windows desde nuestra distro de Linux. Para instalar MinGW en Debian Stretch, basta con instalar el paquete mingw-w64 desde el gestor de paquetes.

Read More

Previsualizar archivos de Markdown para github

Si estás escribiendo un archivo de Markdown para tu repositorio de github, por ejemplo, README.md, puedes usar el editor en línea de github, pero si estás trabajando offline es muy probable que quieras previsualizar el resultado antes de subirlo a github. Por suerte existe grip para esa tarea. grip es un paquete de python que puedes instalar usando pip pero que en Linux también lo puedes instalar desde el gestor de paquetes instalando el paquete grip.

Una vez instalado basta con que te dirijas al directorio en el que tienes tu archivo de Markdown y ejecutes el comando grip. Al ejecutarlo, grip montará un localhost que te permitirá previsualizar tu archivo en el navegador. Si tu archivo de Markdown tiene un nombre distinto a README.md, puedes especificar el nombre en la línea de comandos:

monstruosoft@debian:~/mi-proyecto$ grip LEEME.md 
* Running on http://localhost:6419/ (Press CTRL+C to quit)

Ahora puedes abrir la dirección indicada en tu navegador para previsualizar tu archivo de Markdown. Así de fácil.

GIMP 2.10 en Debian Stretch

Como lo he escrito múltiples ocasiones en otros posts, los repositorios estables son a la vez la mejor y la peor parte de Debian. Por un lado, el software en los repositorios estables está, en teoría, garantizado que funcione sin problemas pero por otro lado eso significa no es raro encontrarse con que el software en los repositorios estables es software con varios años de antigüedad 😦 . GIMP es un ejemplo de esto, la versión en el repositorio estable de Debian es la 2.8.18 a pesar de que la versión 2.10 ya fue lanzada de forma oficial hace tiempo, así que si quieres probar la nueva versión de GIMP, los repositorios estables no son una opción.

Es posible que la versión más reciente de GIMP esté disponible en repositorios como el de backports o el de debian-multimedia pero ahora la página oficial de GIMP ofrece un link a la versión para Flatpak que es lo más cercano a tener un ejectuable oficial. Para instalar y ejecutar GIMP para Flatpak basta ejecutar los comandos que aparecen en la página oficial de GIMP:

flatpak install https://flathub.org/repo/appstream/org.gimp.GIMP.flatpakref 
flatpak run org.gimp.GIMP//stable

Ya en el pasado hice un post sobre Flatpak también relacionado con GIMP, sobra mencionar que debes tener Flatpak instalado en tu sistema y que lo puedes instalar desde el gestor de paquetes de Debian Stretch. Si es la primera vez que instalas o ejecutas un programa de Flatpak se instalará una máquina virtual de Flatpak ya que, si recuerdas los posts anteriores, Flatpak es un sistema que ofrece una forma de virtualización que permite ejecutar programas aislados del resto del sistema y, sobre todo, gracias al uso de máquinas virtuales o runtimes, permite usar librerías diferentes a las instaladas en el sistema sin que estas causen conflictos.

gimp-2.10

La versión de Flatpak es lo más cercano que tendremos a un ejecutable oficial de GIMP para Linux y sin duda es mejor y más sencillo que tener que compilarlo manualmente como lo hicimos alguna vez con la versión de desarrollo 2.9. Sin embargo, sabemos que me gusta tomar el camino más difícil así que decidí intentar compilar GIMP manualmente y crear un ejecutable nativo para Debian Stretch.

El proceso fue largo y difícil ya que GIMP 2.10 tiene como dependencias muchas librerías que no están en el repositorio estable de Debian; además, muchas, si no es que la mayoría, de esas librerías también tienen versiones mínimas requeridas que son superiores a las que usamos antes para compilar GIMP 2.9 por lo que las versiones que usamos para compilar GIMP 2.9 ya no sirven. Después de cazar versiones recientes de muchas librerías, sistemas de compilación como meson y todas sus dependencias, después de luchar para compilar librerías que requieren opciones que no son nada obvias y de instalarlas en rutas personalizadas ajustando las respectivas variables de entorno, finalmente fui capaz de compilar exitosamente el GIMP 2.10 en Debian Stretch y, aunque escribí una larga lista de instrucciones detalladas para compilarlo, no creo que valga la pena obligar a nadie a pasar por todo eso ahora que existe la versión oficial para Flatpak. Todo ese trabajo para compilar GIMP 2.10 manualmente aún puede ser de utilidad si quieres probar la versión de desarrollo más reciente… tengo planeado un post sobre eso.

Ripear DVD con FFmpeg, Recargado

Hace tiempo escribí algunos posts con instrucciones para ripear un DVD usando FFmpeg. En esos posts mencionaba que primero deberías probar con Handbrake antes de intentar ripear el DVD de la forma difícil desde la línea de comandos usando MPlayer y FFmpeg. Entonces, ¿cuál es la razón para escribir este post? ¿Cuál es el problema con Handbrake?. El problema de Handbrake es el típico problema de Linux de interfaces de usuario terribles 😦 . Si eres como yo y quieres ripear todos los títulos de un DVD, con Handbrake tienes que seleccionar un título, configurar las opciones, agregarlo a la cola de tareas y después seleccionar el siguiente título y repetir 😦 . Aunque el proceso puede tomar solamente unos cuantos clicks, cuando te encuentras con un DVD con muchos títulos, esos son algunos cientos de clicks más de los que quiero hacer; sin mencionar que tienes que escribir manualmente el nombre para cada uno de los archivos de salida ya que Handbrake te sugerirá el mismo nombre para todos los títulos sin importar si ya tienes uno con ese nombre en la cola de tareas. No entiendo como el programa “especializado” para ripear DVDs no tiene una opción para seleccionar varios o todos los títulos de un DVD 😦 .

Read More

Hibernación en Debian Stretch

En un episodio más de la saga de “¡¿Por qué hasta las cosas más simples tienen que fallar épicamente en Linux?!”, en esta ocasión hablaré sobre la opción de hibernar en Debian Stretch. El menú de apagado de LXDE (y de cualquier otro escritorio, supongo) muestra prominentemente las opciones de apagar, reiniciar, suspender e hibernar. Las primeras dos opciones no necesitan más explicación. A grandes rasgos, la opción de suspender apaga todos los dispositivos pero mantiene el voltaje en la memoria RAM de manera que cuando reinicies la PC todo estará tal como lo dejaste. La opción de hibernar es muy parecida a la opción de suspender pero esta vez el estado de la PC se guarda en el disco duro (efectivamente se guarda en el disco duro una copia de todo lo que está en la RAM) y después la PC se apaga completamente, no se mantiene el voltaje en ningún dispositivo y, cuando reinicias la PC, el sistema restaurará la copia de la RAM de manera que la PC volverá al estado en que estaba antes de apagarla.

Mi problema en esta ocasión es que, mientras que la opción de suspender funciona correctamente, al seleccionar la opción de hibernar en Debian Stretch lo que obtengo es que la pantalla se apaga y el disco duro se pone a trabajar como si estuviera guardando la copia de la RAM pero después, ¡boom!, estoy de vuelta en la pantalla de inicio de Debian porque la hibernación falló 😦 . Como es usual en estos casos, no hay un mensaje de error o alguna información útil para saber cual fue el problema; como es usual, estás a ciegas 😦 .

Para no hacer este post tan largo, resulta que Linux hiberna usando el espacio de swap, esta es una solución ingeniosa y que tiene sentido y debe ser la razón por la que siempre te recomiendan crear una partición de swap mínimo con el mismo tamaño que tu memoria RAM (algunas fuentes recomiendan incluso el doble de la RAM) pero, en mi caso, cuando instalé Linux en un disco de 10 GB para probarlo, no podía usar la mitad del disco duro como swap así que elegí crear una partición de swap de apenas 464 MB así que cuando la carga promedio de RAM en mi sistema con algunos programas abiertos es de ~1.5 GB era obvio que no cabía en la partición de swap y por lo tanto sería imposible hibernar con todos mis programas abiertos pero… si cierro todos mis programas la carga de RAM está por debajo de los 400 MB, suficiente para que quepan en la partición de swap y que el sistema pueda hibernar de forma correcta, ¿cierto?. ¡NO! ¡La hibernación sigue fallando aún con una carga de apenas ~350 MB en la RAM!. Maldición 😦 .

¿Por qué pasar tantos problemas si igual estoy cerrando todos mis programas? Bueno, mantener mis puntos de montaje manuales y el estado de pointerkeys son razón para preferir la hibernación a un apagado total, sin mencionar que el arranque desde el estado de hibernación es un poco más rápido que un arranque normal.

Entonces, ¿por qué la hibernación no puede guardar ~350 MB de RAM en uso en una partición swap de 464 MB?. Resulta que Linux mantiene en caché en la RAM los programas y archivos que has abierto recientemente en caso de que quieras abrirlos otra vez, esto es bueno, Linux administra la RAM así que no tienes que preocuparte por este caché ya que Linux lo liberará automáticamente si tus programas en ejecución solicitan más memoria. Aunque el caché de archivos en RAM es bueno para el uso de la PC, la hibernación no libera este caché (en mi opinión, debería) y eso causa que la memoria usada por el caché sea marcada como memoria en uso a pesar de que en realidad sean solamente ~350 MB los que están siendo usados por programas activos, así que para poder lograr que el sistema entre en modo de hibernación es necesario borrar manualmente el caché en la RAM y, para variar, esto requiere usar algunos oscuros y arcanos comandos desde la línea de comandos:

monstruosoft@debian:~$ sudo sh -c 'echo 1 >/proc/sys/vm/drop_caches' 
[sudo] password for monstruosoft: 
monstruosoft@debian:~$ sudo sh -c 'echo 2 >/proc/sys/vm/drop_caches'
monstruosoft@debian:~$ sudo sh -c 'echo 3 >/proc/sys/vm/drop_caches'

Después de ejecutar los comandos anteriores, la memoria en uso reportada será solamente la que está siendo usada por los programas activos, no más archivos en caché. Ahora es posible seleccionar la opción de hibernar y la PC entrará correctamente en modo de hibernación. Puedes poner estos comandos junto con el comando systemctl hibernate en un script y ejecutar el script cuando quieras poner la PC en modo de hibernación.

Para entender mejor lo que está pasando, veamos el uso de memoria antes y después de limpiar el caché:

# Uso de memoria habitual con varios programas abiertos
# 1.3 GB en uso, 1.6 GB en el caché, 2.2 GB libres
monstruosoft@debian:~$ free
              total        used        free      shared  buff/cache   available
Mem:        3975924     1398856      959596       96980     1617472     2190836
Swap:        475132       42668      432464
# Uso de memoria después de cerrar todos los programas
# 400 MB en uso, 2.5 GB en el caché, 3.2 GB libres
monstruosoft@debian:~$ free
              total        used        free      shared  buff/cache   available
Mem:        3975924      408548     1015396       23796     2551980     3254324
Swap:        475132       42664      432468
# Uso de memoria después de limpiar el caché en RAM
# 380 MB en uso, 120 MB en el caché, 3.4 GB libres
monstruosoft@debian:~$ free
              total        used        free      shared  buff/cache   available
Mem:        3975924      383188     3471164       23796      121572     3399740
Swap:        475132       42664      432468

Todos estos problemas para hibernar si tu partición de swap es pequeña se podrían resolver fácilmente si el comando para hibernar liberara automáticamente el caché en RAM pero como siempre, Linux tiene que hacer incluso las cosas más sencillas terriblemente complicadas 😦 . Oh, olvidé mencionar que si tienes archivos en directorios ramfs, como /dev/shm, es mejor que los borres manualmente también o la hibernación intentará mantenerlos y podría incrementar el tamaño de la copia de la RAM que se tiene que almacenar en tu partición swap.

Convertir video para reproductor de DVD LG DP122

Muchos reproductores de DVD antiguos de la marca LG tienen soporte para reproducir archivos de video MPEG4 (no confundir con MP4) basado en los codecs Xvid o DivX. Estos codecs eran los más populares en el internet de hace unos años antes de la llegada de codecs como x264. Si, como yo, tienes uno de estos antiguos reproductores de DVD y quieres convertir un video al formato MPEG4 para poder reproducirlo, debes tener en cuenta las siguientes condiseraciones:

  • Revisa que tu reproductor de DVD tenga el logo MPEG4 o DivX.

  • El formato contenedor debe ser AVI, recuerda que es un reproductor antiguo.

  • El codec de video debe ser Xvid o DivX.

  • El codec de audio debe ser MP3.

  • El FourCC de video debe ser XVID o DIVX.

  • Los formatos soportados por tu DVD pueden ser diferentes, revisa la documentación.

Para convertir un video al formato necesario para reproducirlo en el DVD usaremos FFmpeg:

monstruosoft@debian:~$ ffmpeg -i video.mkv -c:v mpeg4 -vtag XVID -c:a mp3 -b:a 128k -q:v 4 salida.avi

La opción -vtag hará que FFmpeg use el FourCC XVID en lugar del valor predeterminado FMP4 que no es reconocido por el reproductor de DVD.