Navegando por
Categoría: Programación

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!

Un Contador sencillo programado en Visual Basic .NET

Un Contador sencillo programado en Visual Basic .NET

Saludos a todos,

En este post, les compartiré un programa que desarrollé muchos años atrás.

El programa es muy, pero muy sencillo. Sólamente tiene 2 botones y un número gigante. Ese número es el contador:

Contador 1
El contador

El botón «+» es el que añade números al contador:

Contador 2
Añadiendo números

Para restar, oprimimos el botón «-«:

Contador 3
Restando números

Y ese es el programa. Es muy muy muy sencillo y lo diseñé sólo por diversión. Estaba aburrido en aquél momento jajaja.

Así que como era tan viejo este programa, lo tenía escondido en algún lugar pero finalmente apareció y decidí subir el código a GitHub. Pueden obtener el código en el siguiente enlace: https://github.com/moisespr123/Counter-VB

¿Qué tan simple es el código? Miren:

Contador 4
Código del contador

¡Así és! Sólamente 2 líneas de código cuando excluímos las líneas que nos genera Visual Studio automáticamente. Sólamente hay una línea de código en ambos botones. Uno para sumar, y el otro para restar.

¡Y eso es todo! ¡Espero que les guste este pequeño programita!

Mi nueva herramienta para subir archivos a Google Drive – Un dia de programación

Mi nueva herramienta para subir archivos a Google Drive – Un dia de programación

Hola a todos,

Ayer perdí la paciencia subiendo archivos a Google Drive. Como sabrán, edito y subo videos a Youtube, así que subo los archivos a Google Drive para tenerlos archivados en caso de que muera uno de los Discos Duros que tienen la data.

El problema es que a veces la conexión al internet no es estable, o a veces se va la electricidad o la computadora le ocurre algo y hace restart y hay que subir el archivo otra vez desde el principio. Parece que Google nunca implementará la habilidad de continuar subiendo un archivo desde el punto que se interrumpió tal y como lo hace YouTube.

Dicen que usar el programita de Google es la mejor opción pero ese programa solo sincroniza archivos. O sea, no tiene la opción de solamente subir un archivo, así que usar el programa oficial de Google no es una opción para mí.

También existen varios programas de terceros como los es NetDrive, que monta la cuenta de Google Drive como si fuese un Disco Duro local y permite el acceso a los archivos instantaneamente, pero no es una alternativa buena para subir archivos pues a veces tiende a trancar el Explorer y como quiera, si ocurre una interrupción, hay que comenzar a subir el archivo desde el principio nuevamente.

Mi solución a este problema fue codificar un programa «simple» que me permita subir mis archivos y en caso de que ocurra una falla, que continúe desde el punto que se interrumpió el proceso. Digo que es un programa «simple» porque lo és, pero la codificación fue un poco de dolor de cabeza.

Nunca habia trabajado con el API (Application Programming Interface) de Google Drive, así que ayer fue un día de mucho aprendizaje. Pude lograr subir un archivo pero no podía lograr que resumiera si fue interrumpido. Luego de ver los códigos de ejemplos en la pagina del API de Google Drive y en GitHub, vi un ejemplo que hacia lo que queria pero ese código fue escrito para YouTube. La cosa es que aunque el código era para YouTube, la mayoria aplicaba también para Google Drive. Al parecer, usan el mismo método de subir archivos, así que gracias a ese código, pude lograr que el archivo continuara subiendo desde el punto en que se interrumpió el Upload del archivo.

Ahora, como todo metodo de hacer backups de la data, es muy recomendado verificar la integridad de los archivos. Para ese propósito, utilicé una herramienta llamada HashCheck para verificar si lo que subí subió sin corrupción, y funconó!!! Interrumpí el proceso de subir el archivo a propósito y el programa me dice que falló. Entonces, cuando intento subir el archivo otra vez, él continúa desde el punto donde se quedó. O sea, funciona!! Y también tumbé el programa a propósito y cuando lo volví a abrir, también continuó el Upload desde el punto que se interrumpió. En todos estos casos, la integridad del archivo era correcto.

Este es el GUI (Grafical User Interface) del programita que escribí:

Google Drive Uploader v1.0

Ahora, hay algunas cosas adicionales que quiero hacer. En particular, quiero hacer que suba varios archivos, como una lista, que cuando termine de subir un archivo, suba el próximo y así sucesivamente hasta que suba el último archivo en la lista. Aparte de eso, el programa es súmamente sencillo de usar. Todavía no he publicado el programa, ya que sigo trabajando en él, pero me llega de alegría que el programa funcione en su estado actual 😀

Escribí la herramienta en Visual Basic .NET, usando Visual Studio 2017

Los ejemplos que usé para hacer esta herramienta son los siguientes:
https://developers.google.com/drive/v3/web/quickstart/dotnet
https://github.com/google/google-api-dotnet-client-samples/tree/master/Drive.Sample
https://github.com/google/google-api-dotnet-client-samples/tree/master/ResumableUpload.VB.Sample

Si, me encanta programar en Visual Basic .NET