En entornos empresariales, es común crear un repositorio de código en Git para la web, y al menos uno más cuando se trabaja con un monolito. Si hablamos de microservicios, el backend podría estar dividido en varios repositorios independientes.
Una alternativa interesante son los monorepos, que permiten gestionar múltiples proyectos o servicios dentro de un solo repositorio.
En mi caso, estoy trabajando en una aplicación personal para gestionar mis redes sociales y he decidido crearla como un monorepo. Ya que tengo experiencia con Angular, aprovecharé la oportunidad para explorar NestJS en el backend, en lugar de optar por una solución basada únicamente en Node.js.
El popular lector de libros Kindle nos permite el envío de nuestros libros a nuestro dispositivo por correo electrónico. De acuerdo con la documentación los pdf se pueden convertir al formato de Kindle enviando un correo electrónico a nuestra cuenta de Kindle con el asunto convertir.
Para simplificar esta tarea en Mac OSX podemos usar una utilidad que viene por defecto llamada Automator. Lo que vamos a hacer es crear una acción rápida para que podamos enviar el correo simplemente seleccionando un PDF en Finder.
Crear la tarea en Automator
Primero abrimos Automator y seleccionamos "acción rápida".
Menú tipo de documento
Añadiremos dos acciones:
Filtrar items de finder
Nuevo mensaje de correo electrónico
En la acción filtrar items de finder añadimos el filtro para extensión de archivo que contiene pdf.
Dentro de enviar correo electrónico seleccionamos en para nuestro correo de Kindle y en el asunto "convertir".
La tarea tiene que quedar de esta forma.
Resultado de la tarea con Automator
Guardamos la tarea (Comando + S).
Podemos probarla seleccionado un pdf donde en acciones rápidas veremos nuestra tarea.
Acción rápida para enviar PDF a Kindle
Opcionalmente podemos añadir un paso más en la tarea para enviar el e-mail automáticamente.
Añadida tarea envío e-mails salientes
De esta forma nos ahorraremos unos cuantos clicks de ratón cada vez que queramos enviar un PDF a Kindle.
A partir de la versión 5.9.3 del popular programador de tareas de Android Tasker viene una nueva integración con Termux. Termux es un emulador de terminal de Linux para Android bastante potente.
Sin embargo esta nueva función no tiene mucha documentación disponible para integrarlo. En este breve tutorial indicaremos como hacer que funcione correctamente la integración.
Configuración de Termux
Para que Termux pueda ser controlado por una aplicación externa tenemos que abrir Termux y crear un fichero en la ruta:
~/.termux/termux.properties
Lo más fácil es instalando dentro de Termux el programa nano de esta forma:
apt update
apt install nano
una vez instalado nano ejecutamos dentro del propio Termux de esta forma:
mkdir ~/.termux
nano ~/.termux/termux.properties
he introducir la siguiente línea:
allow-external-apps=true
Ctrl +x para guardar el fichero.
De esta forma permitimos a Termux recibir Intents de otras aplicaciones para recibir comandos tal como dice la documentación del código.
Configuración de Tasker
Una ver configurado Termux podemos crear tareas en Tasker que ejecuten comandos de Termux.
Configuración previa
Previamente tenemos configurar los permisos adicionales de Tasker para permitir que interactúe con Ternux. Tenemos que asegurarnos que está habilitado el permisos "Run commands in Termux environment".
Adicionalmente es recomendable darle a Termux permisos para iniciarse automáticamente. De lo contrario pueden no funciona las tareas de Tasker si Termux no se encuentra abierto, dando un error.
Creando una tarea
Una vez tenemos todo listo podemos crear nuestra primera tarea en Tasker.
Creamos una tarea. En la categoría buscamos en el filtro Termux de esta forma:
Nos aparece un dialogo donde introducimos los parámetros:
Ruta del comando.
Parámetros.
Directorio donde se ejecuta el script.
Si se ejecuta en segundo plano (true/false).
Las rutas son absolutas sobre la raíz. Aunque podemos usar la variable $PREFIX que apunta a la ruta de Termux dentro del teléfono algo como /data/data/com.termux/files
Para apuntar al home del Termux podemos usar simplemente: ~/
Por ejemplo podemos ejecutar una función de Tasker para que cree un fichero vacío de la siguiente forma:
Si todo ha ido bien como resultado nos habrá generado el fichero hola.txt en la raíz de Termux
Allá por el 2016 me hice con una TV Box china llamada wowbox r7 que compré en una tienda de electrónica. No recuerdo exactamente el precio pero posiblemente en su día rondaría unos 60€. El aparatito viene con un procesador Amlogic S805, una memoria interna NAND de 8gb y 1gb de memoria RAM.
Parte frontal de la caja original
Parte trasera de la caja original
Imagen stock
Como detalle curioso incluye un símbolo de Bluetooth en la caja aunque nunca me lo detectó.
Respecto al sistema, trae una versión de Android personalizada basada en la versión 4.4.
Logo de wowbox en el arranque
El arranque es algo lento y tras la carga nos aparece el menú principal. Trae una versión de Kodi ya desfasada cuando se llamaba SPMC Kodi.
Menú principal
Navegando a las opciones avanzadas podemos ver la versión de Android en la que está basada la imagen y la versión del Kernel.
Versión
En general la imagen oficial es algo lenta. Además está anclada en la versión 4.4.2 de Android lo cual limita la actualización de nuevas aplicaciones. No hay opción de encontrar una nueva versión del firmware, de hecho buscando información sobre el modelo wowbox r7 no aparecen resultados en el buscador. Tocará investigar para encontrar una solución para reemplazar el viejo firmware.
No es posible encontrar información sobre este dispositivo. Solo encuentro algunas entradas en tiendas de electrónica en Internet pero no aparece ninguna página web sobre el fabricante.
Comienzo a tirar del hilo buscando dispositivos con la versión del Kernel KOT49H.20151225 test-keys y encuentro un resultado interesante.
El dispositivo es el mismo que un modelo de la marca MXQ donde se pueden encontrar webs como the MXQ project donde existe información útil para actualizar el firmware de la vieja wowbox R7.
Actualizando el recovery
El primer paso para poder actualizar el firmware es actual es entrar en recovery mode para poder instalar nuevas imágenes.
En los dispositivos MXQ utilizan el método del "palillo de dientes", es decir meter apagar el dispositivo y arrancarlo metiendo un palillo que haga contacto en el agujero del jack de los auriculares para que arranque.
Sin embargo en la wowbox va a ser mucho más fácil. Simplemente arrancando el dispositivo con el botón reset pulsado unos segundos hasta que aparezca el logo accedemos al modo recovery.
Botón reset
El recovery que viene con la versión stock es bastante limitado y no permite hacer copias de seguridad así que el primer paso es reemplazarlo por la versión TWRP preparada para este dispositivo.
Instalando TWRP
Siguiendo las instrucciones de este blog sobre el modelo MXQ S805 para actualizar el recovery a TWRP. Para proceder necesitamos una tarjeta micro SD que hay que insertar en el lector de tarjetas y descargar el link a la imagen de TWRP para Amlogic.
Antes de proceder te advierto que debes de proceder con sumo cuidado y que no me hago responsable de los posibles daños efectuados por un mal uso durante el proceso.
Descargamos el fichero recovery-twrp-amlogic-mxq.tgz y obtendremos un fichero llamado recovery.img. Hay que copiar este fichero en una tarjeta micro SD limpia y copiarlo allí.
Existe un tutorial para realizar el proceso en The MXQ project. La única diferencia es que en lugar de arrancar mediante el método del "palillo de dientes" en nuestro caso simplemente iniciamos el dispositivo manteniendo el botón reset pulsado. Podemos seguir el siguiente tutorial de Youtube.
Es importante hace un backup de todo el firmware original y guardarlo puesto que no será posible obtener una copia en Internet de los originales.
Instalando Kodi
Una vez hemos hecho un backup del firmware original ya podemos a proceder a actualizar el firmware del dispositivo.
En este caso escogí una versión basada en LibreELEC, una imagen de Linux que nos cargará Kodi de forma integrada. LibreELEC no da soporte de forma oficial al S805 (el dispositivo equivalente a nuestra Wowbox R7), aunque existe un hilo en el foro de LibreELEC donde un usuario tiene compiladas imágenes adaptadas a este dispositivo. Podemos acceder a las imágenes en este enlace.
Esta versión es funcional sin embargo el desarrollo está abandonado.
Sin embargo buscando información encuentro que existe un fork de este proyecto llamado AlexELEC donde se puede encontrar un desarrollo activo para el dispositivo.
Para instalar AlexELEC podemos seguir este tutorial en The MXQ project. Podemos seguir el siguiente vídeo de Youtube para instalarlo. Simplemente tenemos que arrancar con el botón reset presionado en lugar de usar el método del palillo de dientes.
Siguiendo el tutorial simplemente tenemos que descargar la imagen de este repositorio. Existen diferentes imágenes adaptadas a diferentes dispositivos. Curiosamente la imagen MXQ_v20 que es el dispositivo primo hermano de nuestra Wowbox R7 no funciona correctamente, sin embargo la imagen llamada VANDER reconoce la wifi perfectamente.
En mi caso como uso Mac y no tengo Windows he usado el programa balenaEtcher para poder flashear la imagen en una memoria micro SD.
La primera vez que arrancamos la imagen nos instalará AlexELEC en la micro SD y cambiará la imagen de arranque para que cargue el firmware desde esta en lugar de cargar el almacenamiento interno. Tras finalizar el proceso de instalación si todo ha ido bien nos cargará el nuevo firmware.
La diferencia de rendimiento respecto al firmware original es enorme. El sistema carga más rápido y va mucho más fluido. Podemos ver en la información del sistema la versión del nuevo firmware.
Información del sistema en AlexELEC
Problemas comunes
Cambiando el idioma
AlexELEC viene por defecto en ruso así que es necesario la primera vez hasta la opción de cambio de idioma. Tenemos que acceder al menú de configuración de idioma tal como muestra un usuario en el foro de LibreELEC
Imagen del foro LibreELEC
Calibrado de vídeo
La primera vez que arrancamos posiblemente el dispositivo no reconozca bien los límites del televisor así que necesitaremos calibrarlo tal como se indica en este tutorial.
El monitor se ve borroso
Si arrancamos el dispositivo y no tenemos encendido primero el televisor es posible que se muestre la imagen borrosa. Durante el arranque el dispositivo intenta detectar una pantalla conectada al HDMI si no la detecta pasará al modo VGA y nuestra pantalla se verá borrosa.
Error al entrar en modo VGA
Si se nos ha iniciado en modo VGA por error tenemos que reiniciar el dispositivo para forzar que detecta la salida HDMI y se vea correctamente.
Conectar dispositivos Bluetooth
A pesar de que el dispositivo tiene en la caja el logotipo de Bluetooth yo nunca he conseguido hacerlo funciona. Ni siquiera cambiando el firmware me lo ha detectado. Sospecho que este dispositivo directamente no tiene controlador Bluetooth.
Para poder conectarle unos auriculares inalámbrico me compré un adaptador USB asegurándome que fuera compatible con Linux (AlexELEC / LibreELEC es una imagen de Linux).
En mi caso me hice con un adaptador de la marca Pluggable que hace que me reconozca dispositivos Bluetooth perfectamente sin tener que instalar ningún driver adicional.
Para configurarlo tenemos que ir al apartado AlexELEC dentro del menú de configuración y acceder a la opción de Bluetooth.
Recientemente me hice con la Raspberry Pi modelo B a través del pack de Labits. Una de las primeras cosas que echaba en falta es un sistema VNC para poder acceder remotamente a la Raspberry y no tener que recurrir a tenerla conectada a una pantalla, teclado y ratón. Por defecto viene con el sistema operativo NOOBS, una de las distribuciones oficiales basada en Debian.
Por defecto viene instalado el servicio de VNC Real el cual requiere de un cliente de pago para poder conectarte. Además me daba problemas al arrancar la Raspberry y no tener una pantalla conectada. De modo que decidí desinstalarlo.
Desinstalado RealVNC
El primer paso es abrir una terminal por ssh y ejecutar el siguiente comando:
Una vez hecho esto ya hemos desinstalado el servidor Real VNC y su cliente.
Además podemos eliminar las dependencias no necesarias de la siguiente forma:
pi@raspberrypi:~ $ sudo apt autoremove
Instalando Tightvncserver
Una vez hemos eliminado el servidor VNC por defecto podemos instalar Tightvncserver:
pi@raspberrypi:~ $ sudo apt-get install tightvncserver
Tras realizar la configuración en el asistente donde establecemos el password, podemos arrancar la sesión con
pi@raspberrypi:~ $ tightvncserver
New 'X' desktop is raspberrypi:1 Starting applications specified in /home/pi/.vnc/xstartup Log file is /home/pi/.vnc/raspberrypi:1.log
El mensaje nos indica que hemos arrancado correctamente la sesión.
Ahora necesitamos saber nuestra ip local para conectarnos remotamente.
pi@raspberrypi:~ $ ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.1.43 netmask 255.255.255.0 broadcast 192.168.1.255
En este caso nuestra ip local es la 192.168.1.43
Por defecto se usará el puerto 5900 + número de sesión, en este caso la 1 quedando el puerto 5901.
Introducimos la ip y el puerto separado por dos puntos de la siguiente forma:
192.168.1.43:5901
En este caso usamos el cliente nativo de Mac OSX llamado compartir pantalla.
Nos pedirá la contraseña que hemos configurado durante la instalación y por fin accedemos la escritorio de nuestra Raspberry Pi.
Últimamente he estado creando algunos perfiles en la maravillosa aplicación Tasker. Hay algo que me ha extrañado y es que por sí sóla no puede realizar capturas de pantalla. Para solucionar el problema hay que recurrir al comando screencap. La sintaxis es:
screencap -p /sdcard/[nombredelfichero].png
Después del parámetro -p se escribe la ruta del fichero destino.
Existen también otras opciones disponibles en la ayuda:
shell:/ $ screencap -h
usage: screencap [-hp] [-d display-id] [FILENAME]
-h: this message
-p: save the file as a png.
-j: save the file as a jpeg.
-d: specify the display id to capture, default 0.
If FILENAME ends with .png it will be saved as a png.
If FILENAME is not given, the results will be printed to stdout.
Esta es la acción que se debe de incluir en una tarea de Tasker para que nos cree la captura:
Es importante tener en cuenta que para que funcione tenemos que activar la casilla de "usar root" de lo contrario no funcionará. Como resultado nos guardará la captura en la sd interna.
me encuentro problema de quedar montarme un servidor en Ubuntu en un disco duro externo USB para poder trastear entre varios ordenadores sin tener que configurar nada. Para ello voy a hacer uso del popular programa de virtualización Virtual Box.
Me disponía a instalar la guest tools de Virtual Box vía ssh cuando me he percatado que no era posible. No me había percatado que estaba accediendo a Internet en la máquina virtual utilizando la interfaz NAT, la cual no permite acceder desde la máquina anfitriona (un Mac OS X en este caso).
Tras buscar en la documentación oficial no encontraba una solución convincente. Hasta que googleando un poco me he encontrado un blog con una solución.
La idea es mantener la red NAT para que nuestro servidor Ubuntu pueda seguir conectándose a Internet. Adicionalmente vamos a crear una red host only que nos va a permitir acceder a nuestra máquina virtual (menú de preferencias en Virtual Box).
Ahora en nuestra máquina virtual (el servidor Ubuntu) añadimos una segunda interfaz de red.
Una vez configuradas las dos interfaces arrancamos nuestra máquina virtual Ubuntu. La interfaz host only está desactivada por defecto así que tenemos que modificar nuestro fichero /etc/network/interfaces para que queda de la siguiente forma:
This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto enp0s3
iface enp0s3 inet dhcp
# Host only network
auto enp0s8
iface enp0s8 inet static
address 192.168.56.5
netmask 255.255.255.0
network 192.168.56.0
broadcast 192.168.56.255
La interfaz enp0s3 nos la ha creado Virtual Box para que nuestra máquina acceda a Internet mediante NAT. Por otra parte la interfaz enp0s8 es nuestra interfaz host only que nos permite acceder a la máquina huésped. Le vamos a asignar una ip de forma estática aunque podría hacerse también de forma dinámica de forma similar a la interfaz enp0s3.
Por último para acceder cómodamente por ssh a nuestra máquina huésped sin tener que memorizar la ip podemos editar nuestro fichero /etc/hosts en la máquina anfitriona (Mac) añadiendo las siguiente s líneas:
# Ubuntu guest machine
192.168.56.5 ubuntu
De esta forma desde Mac OS X escribiendo en el terminal:
ssh ubuntu
podremos acceder por ssh a nuestra máquina huésped.
Retomamos la serie de mini-tutoriales para Tasker con un tutorial divertido para la red social Tinder. Tinder te muestra perfiles de personas cerca de la zona donde te encuentras a través de geolocalización. Puedes hacer "likes" sobre los perfiles que te gusten. Si el "like" es mutuo entonces puedes hablar con la persona que te interese.
Foto de Tinder en la Play Store
Un forma de acelerar este proceso es hacer "like" a todos los perfiles, así que si en el caso de que la otra persona te hiciera el "like" mutuo se te mostrará. De esta forma evitas perder el tiempo haciendo "like" en perfiles con los que nunca tendrás una coincidencia. En todo caso si tienes una coincidencia con alguien que no interesa siempre puedes cancelar la compatibilidad en el momento que quieras.
En este blog se muestra un tutorial en inglés utilizando Tasker. Es preciso tener el dispositivo rooteado.
Primera creamos un perfil en Tasker en aplicación y seleccionamos la aplicación Tinder (previamente tiene que estar instalada). Creamos una nueva tarea que se active cuando abramos la aplicación.
Tenemos primero que conocer las coordenadas en la pantalla del botón "like". Para ello tenemos que activar las opciones de desarrollador de Android. Una vez activamos el menú de desarrollador tenemos que entrar en el mismo y activar la opción "ubicación del puntero". Se nos mostrará en la parte superior un menú con las coordenadas de cada click que hacemos en la pantalla. Tenemos que hacer ahora clic en el botón "like" (el corazón verde en la imagen) y guardar las coordenadas x e y.
Ahora vamos a crear una acción en Tasker que nos reproduzca un click en el botón "like" de tinder .
En acción -> código -> ejecutar consola introducimos el siguiente comando:
input tap x y
Donde x e y son las coordenadas que hemos identificado previamente. Tenemos que activar la opción usar root para que funcione. En nuestro ejemplo las coordenadas capturadas son respectivamente 880 y 1910. Añadimos además 1 segundo de desfase para que le de tiempo al sistema a cargar al perfil antes de reproducir un clic en el botón "like".
Creamos una segunda tarea que nos servirá para iterar haciendo click mientras la pantalla de la aplicación Tinder se encuentra abierta. Creamos una nueva acción en tareas -> ir a acción. Añadimos un salto a la acción anterior (acción 1) si se cumple la condición que tinder se encuentra abierto. Para eso capturamos la variable de sistema %WIN y en el caso de que tenga el valor "Tinder" es que estamos en Tinder.
en esta entrada voy a mostrar una pequeña receta para activar los datos en un dispositivo dependiendo del proveedor de telefonía gracias a Tasker.
Pongámonos en el caso de que tenemos un dispositivo y alternamos entre dos SIM, una con la que tenemos una tarifa de datos y la otra o no. En un descuido al cambiar de SIM se nos podrían activar los datos en la tarifa donde no tenemos la tarifa plana con los costes innecesarios que acarrearía.
Empezamos en la pestaña perfiles, creamos uno como Estado, seleccionamos en categoría Estado Variable y Editar Estado.
Vamos a añadir dos condiciones: una condición para que en el caso de que la SIM activa sea "Yoigo" se active ese perfil.
Además añadimos una doble condición para que sólo se active el perfil en el caso de que no nos encontremos en una red Wifi.
Ahora añadimos una tarea para que se nos activen los datos móviles en el caso de que este perfil esté activo. Vamos a utilizar el módulo Secure Settings que fue presentado anteriormente. Esta vez activaremos la opción Mobile Data con el valor "enabled".
Con este sencillo perfil activaremos los datos de nuestro terminal en el caso de que el dispositivo tenga la SIM con la tarifa plana.
voy a relanzar este blog con la idea de hablar con temas de tecnología y programación aprovechando que ya he finalizado mi doctorado en informática.
Uno de los últimos temas en los que me he interesado es Tasker, una app de pago para Android que permite automatizar tareas a bajo nivel en dispositivos Android.
Tasker puede ejecutar tareas (un conjunto de acciones) dependiendo si se activa un contexto (nos encontramos en una ubicación determinada, estamos en un rango horario determinado, se ejecuta una aplicación determinada, etc.).
Los contextos se definen en la pestaña de perfiles de aplicación. A modo de ejemplo mostramos cómo crear una perfil que nos active el modo avión en el terminal desde las 0:00 a las 7:00. El primer paso es crear el perfil en la pestaña con el mismo nombre.
Un perfil puede ejecutar una tarea cuando se activa y también cuando se desactiva. En este caso cuando se active nuestro contexto (estar en la franja horario de 0:00 a 7:00) ejecutaremos la tarea Modo Avión On.
Tasker nos da a elegir entre múltiples opciones para crear una tarea (cambiar un ajuste del sistema, ejecutar aplicaciones, y un largo etc.). En este caso nos encontramos con el problema de que la activación del modo avión en las versiones posteriores a Kit Kat (4.4.4) no se puede activar de forma automática, deda que estas aplicaciones están protegidas. En este caso tenemos que recurrir a un plugin externos llamado Secure Settings y tenemos que tener el dispositivo rooteado.
Volviendo al ejemplo dentro de la tarea Modo Avión On vamos a definir una acción que llama al plug-in Secure Setting, dándole la orden de que active el modo avión como muestra la imagen.
Una vez defina la tarea nuestro dispositivo entrará en modo avión en el rango horario seleccionado.
Hace poco me hice con un Archos Platinum 97 HD. Lo que más me llamó la atención fue la claridad de sus colores y su bonita pantalla de 2048 x 1536 pixeles, buen procesador Quad-core A9 @ 1.6GHz y 2 Ghz de RAM. En teoría una buen tablet sobre el papel. Sin embargo la experiencia de usuario tras unas semanas de uso ha sido paupérrima. Un lag interminable, algo tan simple como navegar por un foro se me hacía imposible con poca cobertura.
Buceando por Internet en busca de soluciones algunas opiniones apuntaban a la sobrecarga en la partición de Aplicaciones con la configuración inicial.
Al final encontré la siguiente solución: el tablet Archos comparte y es compatible con el hardware de las tabletas Onda v972. Con la herramienta Phoenix Suite podemos usar el instalador de las tabletas Onda.
Una cosa molesta en Mac es que se crean ficheros con la extensión "._" en las memorias USB. Si se utiliza el USB como memoria para almacenar música puede llegar a ser muy molesto tener este tipo de ficheros.
Para eliminar este tipo de ficheros podemos usar un script para automatizar el trabajo. Para crearlo tenemos que abrir la aplicación Terminal. Escribimos en la ruta donde queremos almacenar el script:
nano limpiarsub.sh
y pegamos el siguiente código:
echo "limpiamos en $1"
find $1 -name "._*" -exec rm '{}' \; -print
Le damos permisos de ejecución al script
chmod +x limpiarusb.sh
y lo ejecutamos de la siguiente forma:
./limpiarusb.sh /Volumes/MUSIC
* En este caso MUSIC es la etiqueta de la memoria USB que contiene la música.