Vimium: Un plugin para navegar la web con el teclado

Por productividad y salud estoy intentando usar menos el ratón. Una de las situaciones donde más lo usaba era al navegar por páginas web y tras una pequeña búsqueda me he decidido por Vimium. Un plugin para Firefox, Chrome, y familia que permite usar las teclas de Vim para navegar.

Lo más molón, es la tecla f o F (de follow). Activa lo que llaman hint mode. Detecta todos los enlaces de la página y los marca con unas letras amarillas al lado. Al pulsar la secuencia de letras sigue el enlace. En la misma pestaña si se ha usado f, en otra pestaña si se ha pulsado F, o se teclea la secuencia en mayúsculas. Se puede usar Escape para desactivar los hints. Nuestras teclas preferidas de largo. Según como esté construida la página esta opción funciona también para aceptar avisos de cookies, …

Y en iCarto no soy yo sólo quien se ha hecho adicto.

Experimentos de «Monetization» en este blog

Hace unos días Tom MacWright publicaba en su blog un artículo titulado Monetization experiments on this website

Como él, un poco por tratar de pagar el hosting, y sobre todo por jugar un poco hice varios experimentos en este blog. Nunca fue algo que me tomara demasiado en serio. De hecho para escribir este artículo he intentado revisar algunos datos para descubrir que las estadísticas de Google Analytics dejaron de funcionar en mi blog, seguramente en alguna actualización y no tengo acceso a datos antiguos. Y me pasa lo mismo con las estadísticas de WordPress.com / Jetpack.

Cuando escribía en el blog algo más a menudo, sobre todo artículos más utilitaristas del tipo Como cifrar una partición de un disco duro externo tenía bastantes visitas para ser un blog personal, aunque ahora no me atrevo a dar una cifra. Con este desastre, no puedo dar datos muy concretos, pero para hacernos una idea, en base a mi memoria y los números que me encuentro en Google AdSense, en los últimos tres años constan 15.304 páginas vistas y 1.86€. En él último mes 376 páginas vistas y 0.01€

Los experimentos:

  • Desde que me dí de alta en AdSense (creo recordar que en 2011) he generado un saldo de 33.37€. Google sólo hace efectivos los pagos cuando se llega a 70€. Así que a este ritmo me quedan otros 9 años hasta poder cobrar algo. Al cancelar la cuenta hacen efectivo el pago si pasa de 10€
  • Algunos de los libros que comento en el blog tenían enlaces a Amazon a través del programa de Affiliates. De modo que si alguien lo comproba siguiendo el enlace me quedaba un porcentaje de la venta. Amazon nunca me notifico una compra a través de estos enlaces.
  • Otros libros o enlaces a descargas compartidas los ponía a través de adf.ly. Un anonimizador de enlaces que te obliga a pasar por una página previa de publicidad. He comprobado que mi cuenta está actualmente cancelada y en su momento tampoco recuerdo que llegará a obtener más de unos céntimos.
  • A través del botón de donaciones de paypal recibí un pago de 1.5€
  • En dos ocasiones me llegaron correos ofreciéndome escribir posts patrocionados. Uno de un casino online, el otro no recuerdo de que. Ofrecían unos 50€ pero no comprobé si era verdad porqué rechazé ambas

Así que arranco el nuevo año con un poco de limpieza:

  • Cerrando cuentas en servicios que aparecen en mi keepass en los que no he entrado desde hace tiempo.
  • Elimino la primera versión de este blog que todavía existía en blogspot.
  • Elimino del blog Google Analytics y Google AdSense
  • Borrados los enlaces a Amazon. En algún momento seguramente incluya enlaces a alguno de los sitios recomendados en este post
  • Los enlaces a adf.ly los he eliminado o substituido por los enlaces finales directamente

Amazon Afiliados y Google AdSense seguramente son una de las formas más sencillas en las que un blog personal al que dediques algo de mimo puede generar ingresos, pero por los cantidades que aportan, a mi al menos, no me compensan para ayudar a perpetuar los problemas que estas empresas causan.

Presentaciones de fotos en formato vídeo (slideshows) desde la línea de comandos

Hace ya algunos años apareció en este blog como hacer presentaciones de fotos en formato vídeo. A pesar de que hay muchos programas buenos para editar vídeo en GNU/Linux, esta vez quería tener un proceso sencillo y fácilmente replicable aún a costa de perder un poco de calidad o efectos (como degradado entre imágenes, …).

En este tutorial veremos, sin entrar en muchos detalles (mis conocimientos no dan para ello), una forma muy rápida de crear un slideshow con música usando únicamente el terminal. Como limitante partimos de la base de que todas las imágenes están en el mismo formato (en este caso JPEG)

Las herramientas


sudo apt-get install --install-recommends rename imagemagick ffmpeg

Normalizar los nombres y ordenar las imágenes

El primer paso es ordenar las imágenes poniéndolos un «nombre normalizado» que represente ese orden. En este caso partimos de unas imágenes que ya tienen cierto orden, pero arreglamos las mayúsculas, usamos dos caracteres para los números y ajustamos las del medio.

Cada caso será muy particular pero veamos un ejemplo:


$ cp -r original copia
$ cd copia
$ ls
0.JPG 1_1.JPG 12_1.JPG 13.jpg 15.jpg 17.JPG 19.jpg 20.jpg 22.jpg 24.jpg 26.jpg 28.jpg 2.JPG 31.jpg 4.JPG 6.JPG 8.JPG
10.JPG 11.JPG 12.JPG 14.jpg 16.jpg 18.jpg 1.JPG 21.JPG 23.jpg 25.JPG 27.jpg 29.jpg 30.jpg 3.JPG 5.jpg 7.JPG 9.JPG
$ rename 's/.JPG/.jpg/' *.JPG
$ rename 's/3(\d).jpg/5$1.jpg/' 3*.jpg
$ rename 's/2(\d).jpg/4$1.jpg/' 2*.jpg
$ rename 's/1([2-9]).jpg/3$1.jpg/' 1*.jpg
$ ls
0.jpg 1_1.jpg 12_1.jpg 2.jpg 33.jpg 35.jpg 37.jpg 39.jpg 40.jpg 42.jpg 44.jpg 46.jpg 48.jpg 4.jpg 51.jpg 6.jpg 8.jpg
10.jpg 11.jpg 1.jpg 32.jpg 34.jpg 36.jpg 38.jpg 3.jpg 41.jpg 43.jpg 45.jpg 47.jpg 49.jpg 50.jpg 5.jpg 7.jpg 9.jpg
$ mv 12_1.jpg 31.jpg
$ rename 's/1([0-1]).jpg/2$1.jpg/' 1*.jpg
$ rename 's/([1-9]).jpg/1$1.jpg/' ?.jpg
$ mv 0.jpg 00.jpg
$ mv 1_1.jpg 01.jpg
$ ls
00.jpg 11.jpg 13.jpg 15.jpg 17.jpg 19.jpg 21.jpg 32.jpg 34.jpg 36.jpg 38.jpg 40.jpg 42.jpg 44.jpg 46.jpg 48.jpg 50.jpg
01.jpg 12.jpg 14.jpg 16.jpg 18.jpg 20.jpg 31.jpg 33.jpg 35.jpg 37.jpg 39.jpg 41.jpg 43.jpg 45.jpg 47.jpg 49.jpg 51.jpg

Rotar las imágenes

A pesar de que en la previsualización del explorador de archivos podamos ver todas las imágenes rectas, alguna de ellas puede estar girada. Esto es por qué muchas herramientas usan por defecto los metadatos EXIF de la imagen para rotarlas de la forma lógica.


# las que no tengan un `1` están rotadas
identify -verbose * | grep -E '(Image:|Orientation)'

# Rotarlas. https://stackoverflow.com/a/19475281/930271
# Esto modifica todas las fotos, por lo que mejor usarlo sólo con la que deben
# ser rotadas
mogrify -auto-orient *.jpg

identify -verbose * | grep -E '(Image:(.*)|exif:Orientation: [2-9])'
mogrify -auto-orient 16.jpg
mogrify -auto-orient 45.jpg

Identificar tamaños y «aspect ratio»

Para montar las imágenes en el vídeo debemos investigar sus tamaños y sobre todo la relación de aspecto. El comando identify de ImageMagick nos puede dar la información más relevante y podemos ordenarla por aspect ratio, anchura, …


# https://unix.stackexchange.com/questions/50252

# ordenadas por aspect ratio
$ identify -format "%[fx:w/h] %w %h %M\n" *.jpg | sort -n -k1

1.5 4608 3072 20.jpg
0.75 1944 2592 15.jpg
0.75 2304 3072 16.jpg
0.75 3864 5152 45.jpg
1.33333 1280 960 44.jpg
1.33333 1280 960 46.jpg
1.33333 1280 960 47.jpg
1.33333 2592 1944 13.jpg
1.33333 3072 2304 17.jpg
1.33333 3264 2448 01.jpg
1.33333 3264 2448 14.jpg
1.33333 3264 2448 19.jpg
1.33333 3264 2448 33.jpg
1.33333 4000 3000 43.jpg
1.33333 4000 3000 50.jpg
1.33333 4000 3000 51.jpg
1.33333 4320 3240 18.jpg
1.33333 4608 3456 31.jpg
1.33333 4672 3504 34.jpg
1.33333 4672 3504 35.jpg
1.33333 5120 3840 49.jpg
1.33333 5152 3864 32.jpg
1.33333 5152 3864 37.jpg
1.33472 1280 959 38.jpg
1.33884 2592 1936 00.jpg
1.33884 2592 1936 11.jpg
1.49841 3776 2520 21.jpg
1.77778 3072 1728 12.jpg
1.77778 3264 1836 39.jpg
1.77778 3968 2232 41.jpg
1.77778 5312 2988 36.jpg
1.77778 5312 2988 40.jpg
1.77778 5312 2988 42.jpg
1.77778 5312 2988 48.jpg

# ordenadas por width
identify -format "%[fx:w/h] %w %h %M\n" *.jpg | sort -n -k2

Aquí la clave es:

  • Ajustar las imágenes para que tengan todas la misma relación de aspecto y que no salgan deformadas. Cosa que haremos directamente con ffmpeg al crear el vídeo.
  • Escoger el tamaño de referencia a usar para las imágenes. La «redimensión» la haremos directamente al crear el vídeo.

Sin entender mucho de vídeos mi criterio es coger el aspect ratio más común a las imágenes, en este caso 1.333, y un tamaño intermedio, de modo que haya pocas imágenes por debajo de ese tamaño, y que al ampliar no pixelen demasiado, en este caso me quedo con 2592×1936

Montar el vídeo

La wiki de ffmpeg da el comando básico para hacer el slideshow, y en stackoverflow también hay buenas respuestas

El comando que usaremos en este caso es:


ffmpeg -framerate 1/5 -pattern_type glob -i '*.jpg' -i audio.mp3 -vf 'scale=2592:1936:force_original_aspect_ratio=decrease,pad=2592:1936:(ow-iw)/2:(oh-ih)/2,setsar=1' -c:v libx264 -c:a copy -crf 14 -r 25 -pix_fmt yuv420p -shortest output.mp4

Los parámetros más relevantes para el slideshow:

  • -framerate 1/5: El denominador define cuanto se mostrará cada imagen
  • -pattern_type glob -i '*.jpg': Cuando las imágenes no están ordenadas exactamente de forma secuencial con este parámetro las meterá en el video ordenadas por nombre
  • 'scale=2592:1936:force_original_aspect_ratio=decrease,pad=2592:1936:(ow-iw)/2:(oh-ih)/2,setsar=1': Escala las imágenes a 2592×1936 y mete bandas negras de relleno cuando no se pueda conservar la relación de aspecto

Circular Dependencies Webcast por Miguel Grinberg

Un Webcast de Miguel Grinberg sobre como evitar Dependencias Circulares en una aplicación Python / Flask.

My Metadata

  • Descripción: Un webcast de 1h en el que se refactoriza una aplicación Flask que empieza con un único fichero a varios paquetes y módulos.
  • Calificación: 3 sobre 5
  • Día de Visualización: 2020-06-28
  • Año de publicación: 2018
  • Duración: 68 minutos
  • Velocidad de reproducción recomendada: 1.75
  • Etiquetas: python; flask; dependencies; refactoring

Lecciones aprendidas

  • Mantener el entry point tan limpio como sea posible. Incluso con un único import.
  • El módulo que es ejecutado inicialmente por Python adquiere el nombre de __main__ a nivel interno, por ello los «nombres» que se definan en este módulo, no se identificarán inicialmente a efectos de dependencias como myfile.myvar si no como __main__.myvar, lo que es más fácil que genere un error de dependencias circulares
  • No usar los __init__.py como mecanismo para acortar los imports. Hay tantas opiniones a favor como en contra sobre el tema. A mi me ha generado más problemas que soluciones.
  • Usar imports desde la «raíz» from myapp.models.user import User y no estilo from user import User.
  • No pasa nada por no poner los import al inicio del fichero cuando tenga sentido que sea de otra forma, por ejemplo para evitar dependencias circulares. Usar # noqa para que no pite el linter en estos casos es aceptable.

Comprar un portátil para desarrollo en 2019

Toca cambiar de portátil. 8GB de RAM ya se quedan cortos. La patilla de la pantalla está dañada y no parece que vaya a aguantar mucho más. Y la batería con una vm, el ide y el navegador no dura mucho más de 1h.

Para situarnos el anterior comprado hace cuatro años era un MSI GE60 2PC Apache:

  • Micro i7-4720HQ. 2.60GHz de frecuencia base, hasta 3.60GHz con el Turboboost. 4 cores, 8 threads, 6MB de cache y un TDP de 47W.
  • 8GB RAM SODIMM DDR3 a 1600 fabricada por Kingston. No se cual es la latencia.
  • Nvidia GeForce GTX 850M con 2MB RAM
  • Disco duro mecánico de 1TB a 7200rpm
  • Pantalla de 15.5 y resolución de 1920×1080 normalita
  • Wireless-AC 3160, b/g/n y bt 4.0
  • hdmi, vga. 2 puertos USB 2.0 y 2 puertos USB 3.0, además de jacks para salida y entrada de audio.
  • 383 x 249 x 30 y 2.6kg de peso con batería
  • Batería de 6 celdas, 49Wh

Cuando lo compré escribí una guía de compra de portátil que aunque desactualizada me sirve de base para buscar uno nuevo. En base al rendimiento actual los requisitos no han variado demasiado:

  • Todo lo importante debe funcionar al 100% con linux. Si no va la luz del teclado me da igual. Si deja de funcionar el wifi con cada actualización del kernel adios.
  • Mínimo 16GB de RAM
  • Un i7 o equivalente en AMD. Un vistazo rápido me dice que los i5-82xxu que se montan en este rango de precios no son mucho mejores que mi micro actual y no me interesa averiguar si con un i5 me llega.
  • Resolución pantalla mínima 1920 x 1080. Como la mayoría del tiempo uso una externa como principal no necesito que sea extraordinariamente buena pero no quiero quemarme los ojos así que será un plus interesante
  • Mínimo 1TB de disco
  • No tengo necesidad de gráfica dedicada pero prefiero que no me coma RAM extra
  • No lo quiero más grande ni pesado que el actual. A pesar de que el 85% del tiempo está apoyado en una mesa, el 15% restante de viajes en tren, reuniones y uno o dos viajes de trabajo al año hacen que prefiera uno más pequeño. Pero no voy a sacrificar más de 150€ o rendimiento por ello
  • Quiero un teclado «bueno» a pesar de que la mayor parte del tiempo use uno externo
  • No tengo demasiadas necesidades de conectividad y puertos, no necesito Bluetooth y me da igual que tenga salida VGA y lector de DVD. Estos detalles me ayudaran en la decisión final pero asumo que con el resto de características que busco las necesidades mínimas en este aspecto estarán cubiertas. Update: Cuando revisé las opciones disponibles esto varió un poco, más en otro post
  • La marca no me preocupa. Hay demasiadas opiniones y experiencias particulares a favor y en contra de todas las marcas. Por experiencias cercanas doy puntos positivos a MSI y Slimbook y negativos a los HP y los Dell pero sólo en la clasificación final cuando haya dudas. No a priori. Y lo mismo con otras consideraciones como el uso de minerales de zonas de conflicto
  • Mi orquilla inicial es amplia y la reduciré a medida que investigue un poco. Empezaré por portátiles entre 900 y 1300€ con IVA. Una cantidad por la que se puede comprar algo aceptable para cuatro años si estás dispuesto a sacrificar alguna característica a cambio de precio como: batería, tamaño o potencia.

Hay un par de puntos clave sobre los que tenía dudas al principio:

  • Tamaño de la pantalla. Probablemnte la decisión más eliminadora a la hora de comprar el portátil. El de ahora es de 15.6 y para mi uso es cómodo. Pero siempre dudo con coger uno más pequeño. 14» sería perfecto. A los de 13» les tengo algo de manía. Update: Al poco de empezar a buscar los de 14» quedaron prácticamente descartados porque no me interesaba tanto sacrificar rendimiento o precio a cambio de mejoras de tamaño y batería
  • Con el disco duro también tengo dudas. De comprar unicamente un único disco magnético (HDD) tengo claro que sea de 7.200rpm. Una búsqueda rápida me dice que hay algún SSD de 1TB (lo ideal) a partir de 1.100€ pero en general suben bastante el precio. La opción de dos discos SSD + HDD puede ser buena pero me da que consume bastante batería y me puede fastidiar un poco mi organización actual de particiones, donde guardo las cosas cifrado y backups. Update: Cerca de tomar la decisión final quedó claro que en ese rango de precios tengo que sacrificar mi organización actual.

Con esto en la cabeza preparo mi hoja de cálculo y la inicializo con un par de configuraciones de Slimbook que me servirán de referencia. Luego voy rellenando algunos datos principales y descartando algunos directamente a partir de la búsqueda en un par de páginas. Fundamentalmente:

  • https://www.pccomponentes.com/
  • https://slimbook.es/
  • https://www.vantpc.es/
  • Amazon

y un vistazo rápido a:

  • http://tiendas.mediamarkt.es/ordenadores-portatiles
  • https://www.worten.es/inicio/informatica/ordenadores/portatil.html
  • http://www.elcorteingles.es
  • https://www.dell.com/es-es
  • https://www.pcbox.com/
  • https://www.lenovo.com/

Si estás interesado en este tema puedes ver otros artículos parecidos o seguir esta serie en esta etiqueta.

Virtualbox + Windows + VideoConferencia Múltiple en Skype

Si usas linux no sería extraño que alguna vez te hayas encontrado con una ineludible videoconferencia de grupo por Skype y hayas tenido que hacer números para poder participar.

Quien dice Skype, dice alguno de esas extrañas aplicaciones privativas de videoconferencia que alguna gente (clientes) insisten en usar.

Si tienes una licencia de Windows que puedas reusar para una máquina virtual, a mi estas instrucciones me funcionan en Ubuntu 18.04 para poder usar webcam y micro.


# Substituir por el usuario deseado
USER=$(whoami)

sudo apt install virtualbox virtualbox-ext-pack virtualbox-guest-additions-iso virtualbox-guest-x11 virtualbox-dkms
sudo usermod -a -G vboxusers $USER
sudo usermod -a -G video,audio,pulse-access $USER
sudo usermod -a -G audio pulse

Tras crear la máquina guest con Windows:

  • Encender la máquina virtual
  • `Dispositivos ópticos` -> `montar una nueva iso` -> En `/usr/share/virtualbox` seleccionr VBoxGuestAdditions.iso.
  • En caso de que no se ejecute automáticamente el cd/iso, ejecutaremos el .exe desde el explorador de archivos.

Con estas instrucciones tendremos una máquina virtual que soporte webcam, audio, usbs, portapapeles bidireccional (a activar en la configuración de cada máquina), …

Cifrar una disco duro externo en Ubuntu

La sencillez con que se pueden hacer ciertas tareas en Ubuntu u otras distros GNU/Linux ha mejorado enormemente desde la última vez que escribí sobre esto como cifrar un disco duro.

A día de hoy en Ubuntu la mejor opción es usar el asistente gráfico. Llega con insertar el USB y desmontarlo. A continuación desplegamos el menú contextual del disco externo pulsando con el botón derecho sobre él en el navegador de archivos y seleccionamos Format.

En la ventana de opciones seleccionamos las que aparecen en la siguiente captura.

Y listo, ya tenemos un disco duro externo cifrado en formato ext4 ideal para hacer copias de seguridad.

Migrar a GitLab manteniendo mirrors en GitHub

En iCarto habíamos planificado hace un tiempo migrar nuestra infraestructura de desarrollo (repositorios de código principalmente) a GitLab. Estos días hemos terminado la migración y he aprovechado para escribir un artículo de como se pueden mantener mirrors de los repos de gitlab en github a través de la propia plataforma o con un servidor intermedio.

Libro: El corredor del laberinto

He aprovechado las vacaciones de navidad a uno de mis «placeres culpables» que es la lectura de sagas Young Adult de ciencia ficción o fantasía. En este caso toco el turno de «El corredor del laberinto» de James Dashner.

Poco que decir de este libro a parte de ser una decepción absoluta. De los que me he tragado hasta ahora Harry Potter, Los Juegos del Hambre, Divergente, … esta serie es la peor y no la recomiendo.

Clasificación: 2/5

Te gustará si: Eres un fan incodicional de este tipo de novelas y Divergente te pareció buena.

Puedes comprarlo en tu tienda habitual, aunque hay quien te lo presta gratis en epubgratis.

Libro: Dive Into Python

Hay una versión del libro para python 2, cuya última edición es de 2004, y una versión centrada en python 3 con algo de contenido reescrito. El autor original Mark Pilgrim hace tiempo que desapareció de internet, pero los libros continúan siendo mantenidos aunque poco actualizados en github.

Ambas versiones de los libros tienen buenas puntuaciones en Amazon y Goodreads [v2] [v3]

Se venden como un hands-on en python, es decir poca teoría y presentar ejemplos prácticos.

La estructura de ambas versiones es la misma para todos los capítulos comienza con un ejemplo de código, y a continuación lo explica paso a paso. Durante el proceso va introduciendo nuevas funcionalidades del lenguaje. Tal y como está estructurado no es adecuado para alguien sin conocimientos de programación previos. Tampoco me parece adecuado para gente que sepa de otro lenguaje y quiera aprender python.

Algunos de los capítulos de la segunda versión se quedan antiguos y/o muy específicos como trabajar con http, xml o html. La parte de testing, tdd y refactoring es bastante limitada y no me acaba de convencer, aunque hay que reconocer que pocos libros no específicos tratan estos temas, por lo que es de agradecer que al menos los mencionen. Los primeros tres capítulos y el de expresiones regulares son casi un relleno, me parecen avanzados para alguien que no sepa python, poco útiles para quien ya controle del lenguaje. Los capítulos de Introspección, POO, Programación Funcional y Funciones dinámicas pueden aportar algún conocimiento de interés y funcionalidades del lenguaje algo menos habituales de usar.

En la versión 3 pasa más o menos lo mismo, aunque los capítulos sobre Closures & Generatos, Classes & Iteratos, Advanced Iteratos, y Special Method Names son interesantes. Esta versión tiene un poco menos de carga en la parte de Programación orientada a objetos, así que esos capítulos se pueden revisar en la versión para python 2. Los capítulos sobre migración de python 2 a python 3 sólo son de interés para quien tenga que abordar un proyecto de ese tipo.

Si estás buscando un libro para aprender python sepas o no programar previamente esta no es una buena opción. Pero si merece la pena cuando ya tengas idea del lenguaje y estés buscando aprender un poco más y conocer algunos idioms, sobre todo en modo lectura rápida. Abre cada capítulo y trata de entender el ejemplo propuesto, si no tienes dudas puedes pasar al siguiente capítulo. Si el ejemplo tiene algo que te resulta de interés lee un poco más de ese capítulo.