Navegando por
Categoría: Programación

Colaborando en el proyecto exhale – Parte 2

Colaborando en el proyecto exhale – Parte 2

Hola a todos,

Ayer, comencé a trabajar en mi segunda colaboración para el proyecto exhale, el cual convierte archivos al codec xHE-AAC USAC. Esta vez, trabajé en añadir una opción para mostrar la versión del programa en la consola.

exhale-V-argument-main-software

La imagen de arriba muestra la salida del programa al no pasar ningún argument o al pasar un argumento incorrecto.

No existía una opción que imprima únicamente la versión. Idealmente, quería una manera de que el programa imprima la versión como por ejemplo exhale version 1.0.3 ..... para poder capturarla así como hago con otras herramientas como Opusenc y Flac. Debido a esto, comencé a trabajar en añadir esta funcionalidad.

El programa verifica si solo hay un argumento (en realidad hay 2 argumentos: el ejecutable del programa y el segundo que sería la de imprimir la versión). Luego, verifica si el argumento pasado es -v o -V. Si esto es cierto, imprimimos la versión del programa al usuario:

Este es el resultado:

La salida es muy simple. Gracias a esto, puedo capturarla y pasarla a mi herramienta en desarrollo exchale GUI:

Este «Merge Request» fue aprobado y fusionado al código fuente, y está disponible para el uso de todo el mundo. Sobre mi interfaz gráfica, pronto la publicaré.

Haz click aquí para ver el «Merge Request» en GitLab.

Mi primera contribución en GitLab: Convertidor exhale

Mi primera contribución en GitLab: Convertidor exhale

Hola a todos,

Ayer, estuve colaborando con el proyecto exhale para añadir compatibilidad para compilarlo usando MinGW en Windows.

Este proyecto es un convertidor de audio de código abierto que nos permite convertir archivos de audio WAV al codec xHE-AAC bajo el contenedor M4A.

Originalmente, el proyecto compila en Windows usando Visual Studio, pero al intentar compilarlo usando MSYS2/MinGW, nos daba problemas, específicamente esto:

H:/repos/media-autobuild_suite/build/exhale-git/src/app/../../src/app/exhaleApp.cpp: In function 'int main(int, char**)':
H:/repos/media-autobuild_suite/build/exhale-git/src/app/../../src/app/exhaleApp.cpp:246:85: error: '_SH_DENYWR' was not declared in this scope
  246 |     if (_sopen_s (&inFileHandle, inFileName, _O_RDONLY | _O_SEQUENTIAL | _O_BINARY, _SH_DENYWR, _S_IREAD) != 0)
      |                                                                                     ^~~~~~~~~~
H:/repos/media-autobuild_suite/build/exhale-git/src/app/../../src/app/exhaleApp.cpp:320:100: error: '_SH_DENYRD' was not declared in this scope
  320 |     if (_sopen_s (&outFileHandle, outFileName, i | _O_SEQUENTIAL | _O_CREAT | _O_EXCL | _O_BINARY, _SH_DENYRD, _S_IWRITE) != 0)
      |                                                                                                    ^~~~~~~~~~
make[1]: *** [../makefile.base:112: ../../build/exhaleApp.d.o] Error 1
make[1]: Leaving directory '/build/exhale-git/src/app'
make: *** [makefile:18: all] Error 2

También nos daba problemas por una definición de fprintf_s. Unos cambios tuvieron que hacerse en el código.

Para resolver el problema de que _SH_DENYRD no estaba declarado, tuvimos que añadir el header share.h:

Para resolver el problema de fprintf_s, cambié el bloque #ifndef a #if !defined para verificar adicionalmente si estamos compilando bajo MinGW. Si esto es cierto, no declaramos esta variable que apunta a la función fprintf:

Luego de realizar estos cambios, el programa compiló exitosamente.

Lo proximo que hice fue hacer unos cambios al archivo makefile.base para que el proyecto Media Autobuild Suite pasara las variables CXXFLAGS y LDFLAGS a exhale:

Estos cambios fueron aprobados y fusionados al proyecto.

Mi inspiración para añadir esta herramienta al Media Autobuild Suite fue debido a que un usuario pidió que esta herramienta fuese añadido. Trabajé para añadirlo y abrí un «Pull Request», el cual refiné aplicando unas recomendaciones.

Este «Pull Request» fue fusionado al suite y ahora todos los usuarios pueden compilar y usar esta herramienta.

Contribuciones

Instalando Node.js en Ubuntu Focal (20.04) antes de su lanzamiento oficial

Instalando Node.js en Ubuntu Focal (20.04) antes de su lanzamiento oficial

Hola a todos,

Hoy, los guiaré por los pasos necesarios para instalar Node.js 10.x en Ubuntu Focal (20.04), el cual será oficialmente lanzado el 23 de abril de este año.

Actualmente, la instalación de Node.js usando los repositorios oficiales de NodeSource no funcionan en esta versión de Ubuntu ya que ellos no soportan las versiones de prueba.

Tal vez pienses que utilizar el repositorio de la versión de Ubuntu anterior funcione, pero no es así, ya que los paquetes de Python 2 han sido renombrados de python a python2.

Tratando de instalar Node.js usando el repositorio de NodeSource

La forma más sencilla de instalar Node.js 10.x es usando el repositorio de NodeSource. Para esto, usamos el siguiente comando:

curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash

El problema es que como esta versión de Ubuntu no ha sido oficialmente lanzada, se nos presenta el siguiente mensaje:

NodeJS script failing on Ubuntu Focal 20.04

No hay problema. Vamos a intentar instalar Node.js siguiendo las instrucciones para una instalación manual:

  1. Añadimos la llave de firma de los paquetes de NodeSource:
    curl -sSL https://deb.nodesource.com/gpgkey/nodesource.gpg.key | sudo apt-key add -
  2. Configuramos la versión de Node.js a node_10.x:
    VERSION=node_10.x
  3. Utilizaremos la distribución eoan, la versión oficial de Ubuntu más reciente:
    DISTRO="eoan"
  4. Ahora, añadiremos el repositorio a nuestra instalación de Ubuntu con los siguientes comandos:
    echo "deb https://deb.nodesource.com/$VERSION $DISTRO main" | sudo tee /etc/apt/sources.list.d/nodesource.list
    echo "deb-src https://deb.nodesource.com/$VERSION $DISTRO main" | sudo tee -a /etc/apt/sources.list.d/nodesource.list
  5. Los comandos se deben ver así al ejecutarlos:
    NodeJS Manual installation commands
  6. Ahora, actualizaremos la información del repositorio con sudo apt update:
    NodeJS manual installation apt update
  7. Procedemos a instalar Node.js usando sudo apt install nodejs:
    NodeJS installing nodejs fails

Como pueden ver, el proceso de instalación manual falla porque no existe el paquete python-minimal en Ubuntu 20.04. Para resolver esto, tenemos que descargar el paquete de Debian de Node.js manualmente y modificarlo para que se refiera a python2-minimal en vez de python-minimal.

Descargando, modificando e instalando Node.js 10.x manualmente

  1. Navegeremos manualmente al repositorio de NodeSource para descargar el archivo aquí: https://deb.nodesource.com/node_10.x/pool/main/n/nodejs/
    NodeJS HTTP repo
  2. Copiaremos el link de descarga de la versión de Node.js que queramos usar. Luego, usaremos wget para descargarlo en el terminal. Recomiendo que estés en una carpeta limpia ya que descomprimiremos varios archivos luego:
    Downloading the NodeJS debian package
  3. Una vez el archivo se haya descargado, lo descomprimiremos con la herramienta ar:
    ar x nodejs_10.19.0-1nodesource1_amd64.deb
    extracting the NodeJS debian package
  4. Ahora, descomprimiremos el archivocontrol.tar.gz:
    tar -xzf control.tar.gz
    Extracting control.tar.gz
  5. Usando nano o algún otro editor de texto, editaremos el archivo control. Busca la parte donde dicepython-minimal:
    nano control
    Editing the control file
  6. Cambiapython-minimal a python2-minimal:
    Renaming python-minimal to python2-minimal
  7. Grabaremos el arhico. Con nano, oprimiremos CTRL + O. Luego, saldremos el editor presionando CTRL + X.
  8. Necesitamos recrear el archivo tar control.tar.gz para incluir el archivo control modificado. Para recrearlo, usamos el siguiente comando:
    tar -czf control.tar.gz control md5sums postinst pr einst prerm
    Recreating the control.tar.gz file
  9. Finalmente, remplazaremos el archivo control.tar.gz en el paquete de debian. Usaremos el siguiente comando para reemplazarlo:
    ar -r nodejs_10.19.0-1nodesource1_amd64.deb control.tar.gz
    Replacing the control.tar.gz in the NodeJS debian package
  10. Ahora, podemos instalarlo usando dpkg. Correremos lo siguiente:
    sudo dpkg -i nodejs_10.19.0-1nodesource1_amd64.deb
    Installing the modified NodeJS debian package

Luego de seguir los pasos anteriores, debemos tener Node.js instalado en nuestro sistema operativo. Podemos confirmarlo corriento node -v y npm -v:

¡Y eso es todo! Hemos instalado Node.js de forma exitosa en nuestra instalación de Ubuntu Focal.

Opus GUI v1.10 ya disponible.

Opus GUI v1.10 ya disponible.

Hola a todos,

Hoy, publiqué la versión 1.10 de Opus GUI:

Opus GUI v1.10
Opus GUI v1.10

Esta nueva versión añade soporte para convertir archivos usando el convertidor Opus nativo de ffmpeg. También, incluí la última versión de opusenc.

Recomiendo usar el convertidor ffmpeg libopus ya que en mis pruebas, usando el convertidor nativo de ffmpeg, los audios tenían artefactos de compresión en el sonido. También, otra diferencia es que el convertidor de ffmpeg usa un bitrate constante mientras que el de ffmpeg libopus utiliza un bitrate variable. Esto quiere decir que el convertidor ffmpeg libopus producirá una mejor calidad de audio.

Puedes descargar la nueva versión en la página del proyecto en GitHub presionando aquí.

También, he publicado la versión más reciente de opus-tools:

opusenc 04-01-2019
opusenc 04-01-2019

Puedes descargarla aquí.

¡Disfruten!

Anunciando TIFF Recompressor

Anunciando TIFF Recompressor

Hola a todos,

He estado trabajando en una nueva herramienta llamada TIFF Recompressor:

TIFF Recompressor v0.1
TIFF Recompressor v0.1

Esta es una herramienta que te permite recomprimir archivos TIFF usando un método de compresión diferente. También te permite almacenar los archivos descomprimidos para que utilices tu herramienta preferida para comprimir los archivos.

El programa soporta los siguientes métodos de compresión:

  • CCITT3
  • CCITT4
  • LZW
  • RLE
  • Uncompressed

¡Pruebalo! Puedes descargarlo aquí:
https://github.com/moisesmcardona/TIFFRecompressor/releases/tag/v0.1

Para más información sobre el programa, puedes ir a la página del mismo oprimiendo aquí.https://moisescardona.me/tiff-recompressor-2/

¡Disfruten!

Opus GUI v1.9 ya está disponible

Opus GUI v1.9 ya está disponible

Hola a todos,

En el día de hoy, publiqué la versión 1.9 de Opus GUI:

Opus GUI v1.9
Opus GUI v1.9

Esta versión te permite copiar el texto de las versiones de opusenc y ffmpeg haciendo click en los labels de las versiones. Esto es util ya que te permite crear carpetas con el texto copiado para poder organizar mejor tu contenido, o archivar las conversiones de acuerdo a la versión del convertidor usado.

Carpetas creadas usando el contenido de los labels de versiones de Opus GUI
Carpetas creadas usando el contenido copiado de los labels de versiones de Opus GUI

El otro cambio es que si no tienes ffmpeg en tu sistema y quieres convertir archivos MP3 o M4A, estos serán omitidos, pues opusenc no es capáz de convertirlos directamente.

Descarga:

Puedes descargar esta versión en la página del proyecto en GitHub aquí:
https://github.com/moisesmcardona/opus_gui/releases/tag/v1.9

¡Espero que disfruten de esta nueva versión!

¡PAQCompress v0.3.7 disponible ya!

¡PAQCompress v0.3.7 disponible ya!

Hola a todos,

Hoy, he publicado la versión v0.3.7 de PAQCompress:

PAQCompress v0.3.7
PAQCompress v0.3.7

Esta nueva versión añade las siguientes versiones de PAQ:

  • paq8pxd v64
  • paq8pxv v6

Puedes descargar esta nueva versión en GitHub aquí:

El código se encuentra en la repositorio del proyecto en GitHub:
https://github.com/moisesmcardona/PAQCompress

Notas técnicas:

La versión v6 de paq8pxv solamente provee un ejecutable, y no lleva por nombre «jit.exe» o «vm.exe». Debido a esto, tuve que escribir una nueva función que verifica en la carpeta de la versión de PAQ si existen los ejecutables con estas terminaciones; si existen, activamos la opción «jit» si se encuentra el archivo terminando en «jit.exe», y «vm» si se encuentra la versión terminando en «vm.exe».

Si no se encuentra ninguna, simplemente desactivamos la selección del area titulada «compiler».

Aquí pueden ver el nuevo código:

Código de la nueva función de PAQCompress v0.3.7
Código de la nueva función de PAQCompress v0.3.7

Llamamos a esta función si hemos cambiado la versión de PAQ (podemos ver este llamado en la captura de arriba) o cuando cambiamos la familia o serie de PAQ:

Código de PAQCompress v0.3.7
Código de PAQCompress v0.3.7

Con esto, la versión v6 de paq8pxv funciona perfectamente.

¡Espero que disfruten de esta nueva version!

Opus GUI v1.8

Opus GUI v1.8

Hola a todos,

En el día de hoy, publiqué la versión 1.8 de Opus GUI:

Opus GUI v1.8
Opus GUI v1.8

Esta versión trae algunas mejoras. Ahora, es capaz de detectar si opusenc y ffmpeg existen en el sistema. También, mostrará la versión de ffmpeg si éste existe.

Como no publiqué las mejoras de la versión anterior, v1.7, aquí están los detalles:

  • Ahora puede convertir archivos individuales.
  • Si un archivo existe con el mismo nombre en el lugar del destino, el archivo no se convertirá.
  • «Drag-and-drop» será desactivado mientras se convierten los archivos. El mismo será activado luego de convertir.

Puedes descargar esta nueva versión en GitHub aquí: https://github.com/moisesmcardona/opus_gui/releases/tag/v1.8

El código fuente se encuentra aquí: https://github.com/moisesmcardona/opus_gui/

¡Espero que disfruten esta nueva versión!

Días de programación y de aprendizaje – DLNA Player, mi nuevo invento

Días de programación y de aprendizaje – DLNA Player, mi nuevo invento

Hola a todos,

Hace un tiempo, recibí mi reproductor de música HiBy R3 y lo he estado usando a diario. Recientemente, comencé a usar su función de DLNA.

DLNA es un protocolo que se usa para comunicarse con reproductores audiovisuales, enviarle contenido y controlarlos. Consiste usualmente de lo siguiente:

  • Servidor: Aquí es donde almacenamos nuestro contenido (música, videos, imágenes, etc). Éstos son enviados al reproductor mediante un controlador que nos permite navegar en el servidor, escojer el contenido que queremos reproducir, y controlar nuestro reproductor.
  • Reproductor (Renderer): Éste es el dispositivo que se encarga de decodificar el contenido que obtiene del servidor. Algunos reproductores también funcionan como controlador.
  • Controlador: Ésto es como un control remoto. Escojes el archivo multimedia y el reproductor a usar y lo controlas.

Aunque estos son los componentes básicos, es posible que uno de los anteriores haga la función de otra parte. Por ejemplo, puede ser que el servidor funcione como controlador y reproductor, que el reproductor funcione como controlador, y que el controlador actue como reproductor.

Usando la función DLNA con un equipo Android es sencillo gracias a una aplicación llamada BubbleUPnP, a la cual compré su licencia de uso ya que la versión gratuita tiene limitaciones. Con esto, puedo escojer mi HiBy R3 como reproductor y navegar mis archivos en el celular, escogiendo la música que quiero escuchar y controlar el reproductor. El problema que tuve fue que en Windows no encontraba un programa que fuese compatible con el HiBy R3, pues funcionaban parcialmente o símplemente no funcionaban. Es por eso que comencé a leer acerca del protocolo DLNA/UPnP y comencé a ver algunos ejemplos. Luego, comencé a escribir mi propio programa que cumpla con los requisitos que quería.

Encontré un recurso en CodeProject el cual pueden ver aquí. Habla sobre cómo comunicarse con un reproductor, enviar el archivo a reproducir y controlarlo. Cuando lo probé, funcionó excelente con mi servidor web, pero para el programa que quería programar quería que funcione como un reproductor normal, así que necesitaba implementar un servidor interno, y es eso lo que me puse a investigar luego.

Comencé a buscar ejemplos de servidores HTTP para el lenguaje de programación C# y comencé a probarlos. Algunos funcionaban y cumplían su función, pero mi HiBy R3 no podía reproducir las canciones a pesar de que identificaba la canción. Resulta que necesitaba un servidor capáz de enviar pedazos de los archivos, y investigando un poco más, encontré este excelente recurso también en CodeProject, el cual implementa un simple servidor HTTP para enviar archivos multimedia a equipos DLNA.

Ambos códigos son de código abierto y su licencia permite el uso en proyectos al igual que permite su modificación, por lo que modifiqué esos códigos para que funcionen con mi proyecto de acuerdo a mis requerimientos.

Conoce «DLNA Player»:

DLNA Player
DLNA Player Screenshot

Diseñé mi reproductor de música usando los códigos anteriomente mencionados. Este reproductor te permite escojer un reproductor conectado a la red, construir una lista de archivos a reproducir, y controlar el mismo con sus botones de Play, Pausa, Stop, Track anterior y track siguiente. También permite navegar el archivo para poner la música en la parte que desees. Puedes ver el progreso de reproducción en tiempo real. Para ser mi primer programa que funcione así, no está nada mal 😁.

Algo importante es que el programa no reproduce los archivos, sino que símplemente lo copia a memoria para que el servidor interno responda a las llamadas del reproductor y le envíe la parte del archivo solicitada.

Para usar el programa, símplemente tienes que poner la dirección IP de tu computadora (El programa hace esto por tí, pero si tienes variaz interfaces de redes, el programa podría confundirse y usar una IP que no es la correcta), un puerto (lo que está luego del : en la dirección IP en la imagen de arriba), presionas el botón de aplicar (sólo si hubo algún cambio), y luego le das al botón de buscar reproductores. Selecciona uno y luego arrastra archivos al programa. Presiona el botón de Play y disfruta de la música.

El programa actúa como un servidor y es por eso que necesita la dirección IP de la computadora.

El código de este nuevo proyecto lo encuentran aquí. https://github.com/moisesmcardona/DLNA-Player

DLNA Player GitHub Repo

Esto lo probé con mi reproductor HiBy R3. Ahora puedo disfrutar de mi música descomprimida sin depender de conexiones Wifi, pues el programa envía el archivo original al reproductor y es el reproductor el que decodifica el archivo. Esto, y un buen amplificador y decodificador digital a análogo hacen que la música suene mucho mejor que nunca.

Espero que esta herramienta sea útil y esto ha sido una aventura de aprendizaje para mí. He estado prácticamente los pasados días en esto y lo importante es que no me rendí y pude hacer algo que disfrutaré todos los días, pues me encanta escuchar música a diario 😊.

Leyendo libros de Python

Leyendo libros de Python

Saludos,

He estado ausente en estos días ya que me he enfocado a leer libros de programación, en especial libros de Python. Hasta ahora, todos me han gustado y se los puedo recomendar si prefieren leerlos.

Los libros son de la editorial No Starch Press y están bien explicados. Algunos libros (en especial los «For kids» que en realidad es para todas las edades) contienen dibujos que motivan a seguir leyendo pues ilustran cada parte del código. Otros libros son más texto y código, pero también estan muy bien explicados.

Comenzemos (En orden en que los leí):

Automate the Boring Stuff with Python

Humble Bundle - Python Books - 1

En este libro, se nos enseñan conceptos básicos de programación y luego se nos muestran una serie de programas para automatizar tareas. Temas interesantes incluyen automatizar la descarga de contenido web, leer y enviar correos electrónicos, automatizar tareas en Excel, y mucho más.

Python Crash Course

Humble Bundle - Python Books - 2

Primero leí el libro anterior antes de leer este. Son similares, pero es bueno leerlo aunque parezca repetitivo (Al igual que el libro anterior, éste también te habla sobre conceptos básicos). Cada libro te habla de los temas con diferentes palabras, así que aprendes mucho mejor cada función pues cada autor tiene su punto de vista. También, aprendes a usar módulos y funciones que no has usado antes. Luego, se procede a hacer algunos proyectos que incluyen un juego usando PyGame, visualizar data y crear una página web usando Django. Muy bueno para aprender los conceptos sobre estos módulos y extender tus conocimientos.

Teach your kids how to code

Humble Bundle - Python Books - 3

No se confundan con el título. Aunque dice que es para niños, el libro aplica para todas las edades. Fue interesante leer este libro, pues nos enseña a trabajar con gráficas y figuras usando el módulo turtle. Otros proyectos incluyen hacer jueguitos simples pero divertidos, que son perfectos también para aprender los conceptos de programación de un videojuego. El libro tiene varias ilustraciones y también enseña los conceptos básicos.

Python for Kids

Humble Bundle - Python Books - 4

Similar al libro anterior, también es dirigido a niños con proyectos de videojuegos. Se nos enseñan primero los conceptos que necesitaremos saber antes de diseñarlos y luego procedemos a crearlos.

Actualmente, me encuentro leyendo el siguiente:
Python Playground

Es un libro más avanzado y lo estoy leyendo con calma, para entender el concepto detrás de sus proyectos. Recomendaría primero que lean los libros anteriores antes de proceder a éste.

También me faltan por leer los siguientes:

Ya con este resume de los libros que he leido, seguré leyendo el libro que actualmente estoy leyendo.

Todos estos libros fueron parte de un «Bundle» en Humble Bundle, el cual incluye los siguientes libros:

Humble Bundle - Python Books - 5

¡Hasta la próxima!