Por un puñado de euros…

El otro día compré un micrófono USB para poner en la mesa donde ahora mismo estoy realizando los talleres de poesía y escritura creativa en formato «mixto» y no acaba de servirme, pues parece que da algún tipo de problemas con meet.jit.si que no encuentro con Skype. Es un poco rollo esto de la tecnología y no lo puedo expresar con palabras menos «ñoñas», pues es un problema ñoño.

Pero el micrófono venía con una oferta («de tiempo limitado», como si algo no lo fuera) en la que prometían 10€ en cupones de amazon para aquella persona que enviase un email con una captura de pantalla que mostrase que se había escrito una reseña positiva (jejeje) con un vídeo del producto.

Yo publiqué lo siguiente, que era verdad:

He comprado este producto con la intención de utilizarlo en vídeoconferencias en las que necesitaba que el micrófono estuviese situado a unos 2 metros del PC y recogiese sonido multidireccional sin problemas.
Ha sido inmediata su instalación/configuración en Linux Mint (no siempre es fácil para los que vivimos en esos entornos) y tiene una consistencia o solidez que augura buen resultado.
El embalaje es compacto y bien etiquetado, con claridad y con un aspecto muy profesional.

Y subí un vídeo grabado para la ocasión en casa, con un mínimo de intimidad mostrada, pero me quedó una rara sensación de estar «vendiéndome» por un puñado de euros… pero la verdad es que si los recibo me alegrarán y sentiré que he gastado menos de lo que quise haber gastado en la adquisición de este producto que, el jueves pasado, me dejó tirado a mitad de una clase online, con gente presencial esperando que yo resolviese unos problemas absurdos y, sí, algo rollo.

Llegará el día en que añore las clases online

El otro día veíamos en un grupo una clase dedicada a Emmy Hennings, una de las fundadoras (olvidada, por motivos obvios) del Cabaret Voltaire, que dio origen a Dadá.

Me alegró la tarde (que no iba mal) que las dos personas que estaban asistiendo, en cuanto se mencionó la palabra «Cabaret», sacaron sendas boas cabareteras de colores vibrantes y no supe ni reaccionar. Me habría partido de risa, pero yo estaba «en modo serio» y me pilló con el pie cambiado. Ahora bien, no perdí la oportunidad de hacer una captura de pantalla que recogiera ese momento.

Poco a poco las clases de los Talleres de Poesía y Escritura Creativa de la Asociación Cultural Clave 53 vuelven a ser presenciales; así, por ejemplo, ya van a serlo los dos grupos de los jueves (a las 8 y a las 9), salvo excepciones y, por supuesto, manteniendo todas las medidas recomendables para garantizar la seguridad, dentro de lo posible, además de ofrecer la posibilidad de conectarse online a quienes por la razón que sea no puedan o quieran venir presencialmente (lo que va a quedarse al menos durante un curso más, pues pronto volverá a haber nuevos oleajes que nos tendrán en vilo).

Esta opción es algo incómoda porque hay muchas dificultades tecnológicas que afrontar, como el hecho de tener que usar 2 dispositivos de cámara, uno para que se oriente hacia mí y otro hacia la gente que haya venido a la clase a seguirla de manera presencial. Pero al mismo tiempo evitando que los dispositivos de audio de ambos dispositivos se acoplen produciendo sonidos muy molestos que nos recuerdan que hay un medio, y no un fin.

He probado algunas configuraciones de equipos y seguro que podría ser mejor, si hiciese un desembolso de dinero irrazonable para el uso que le voy a dar… espero.

De momento, el portátil de backup de Carmen de la Rosa es el que utilizo para seguir la clase (es un equipo que ya no está en su punto álgido de rendimiento, pero que ha sido preparado para aguantar un poco más), mientras mi móvil (un Xiaomi de gama baja) es utilizado para que quienes no están puedan ver a quienes están presentes, montándolo sobre un trípode para que esté a una altura conveniente.

El problema es que necesitaría un micrófono con altavoz inalámbrico para conectarlo al móvil que pudiese poner en el centro de la mesa y nos oyesen con claridad, pero quiero ahorrar ese consumo utilizando los recursos que ya tengo, así que he montado una especie de Frankenstein con unos micrófonos inalámbricos que tenía y un auricular también inalámbrico que me regalaron mis alumnos hace más de un lustro.

Probaré un par de clases a ver si tengo que terminar por adquirir un chisme más que seguro que me da algún problema de compatibilidad con mi Ubuntu Studio

Diccionario RAE Completo

He decidido dar por concluida la ordenación del Diccionario de la RAE, que me descargué con el programa buscaenrae.sh y el programa descargarae.sh hecho para la ocasión y que leía el archivo con la lista de palabras (al que impropiamente denominaba diccionario), para descargar, una a una, las páginas correspondientes.

Todo partió del trabajo que realicé para el proyecto del Diccionario Personal de Isidoro Valcárcel Medina, en 2015.

Ahí nos encontramos con la negativa de la RAE a ceder el diccionario en modo digital, así que tuve que teclear las entradas del mismo a lo largo de más de 3 meses. Finalmente, acabé teniendo una lista de 90940 palabras, algunas de las cuales eran acepciones repetidas. Si quitábamos las palabras que tenían más de una acepción y que estaban en el archivo etiquetadas con un número 1,2,… según procediera, nos quedaban 88296 palabras (debería llamarlas «entradas»).

Por supuesto, estaban plagadas de errores:

  1. En primer lugar los propios de tecleo.
  2. En segundo lugar (oh, my god!) tenía incluidas en mi colección las palabras que Isidoro había decidido incluir en su diccionario personal independientemente de las que hubiera en el de la RAE.
  3. En tercer lugar (y esto resultó ser lo peor), muchas palabras han «desaparecido», pues la entrada no corresponde a la palabra… por ejemplo, la palabra «poeta, tisa», no está en el diccionario sino en «poetisa», así que la palabra poeta no se encuentra en la RAE como tal.

Así que el programa contemplaba la necesidad de decirme si tal o cual palabra no estaba en el diccionario de la RAE (en la versión online)

Actualización 2020
La Real Academia Española (RAE) y la Asociación de Academias de la Lengua Española (ASALE) han emprendido ya las tareas de redacción de la nueva edición de su Diccionario de la lengua española (DLE), que tendrá las características fijadas en la planta aprobada por todas las Academias de ASALE. Con el objetivo de que el desarrollo de esa nueva edición, forzosamente lento, no retrase la inclusión de nuevas palabras y acepciones ni la modificación de las ya incorporadas que necesiten enmienda, se ha optado por publicar estas actualizaciones anualmente.

La que ahora se pone a disposición de todas las personas interesadas recoge las modificaciones aprobadas por todas las Academias en 2020 y tendrá la consideración de versión electrónica 23.4.

Ya de paso, como podía hacerlo, me informé de si la palabra que estaba consultando era o no conjugada, lo que significaba que era un verbo. Un bonito plus que no esperaba.

Con la lista de errores generada, fui revisándolas palabra a palabra, las 1245 entradas no encontradas, entre las que estaban, ni más ni menos: poeta.

Así que a lo largo de los últimos meses del 2020 fui dejándome los ojos para ir revisando esos errores y fabricando una lista de palabras que se corresponda lo más posible con la «oficial» de la RAE.

Ha quedado una lista de 88024 «entradas» que se corresponden con 90452 palabras (ya teniendo en cuenta que algunas entradas o vocablos tienen varias palabras (a veces me confundo y denomino a eso acepciones).

Una vez corregida y revisada, aunque asumo aún un error considerable que no puedo prever, tengo la posibilidad de descargar el diccionario completo palabra a palabra con el programa buscaenrae.sh

 

#!/bin/bash

### FUNCIONES ÚTILES PARA EL PROGRAMA
# uso() Instrucciones del programa y salida en caso de error.
uso () {
  echo "Uso: $0 salida palabra"
  echo -e "\tsalida es un valor númerico que identifica:"
    echo -e "\t[0] para generar un archivo HTML con la respuesta"
    echo -e "\t[1] para generar un archivo TXT  con la respuesta"
    echo -e "\t[2] para generar una línea  TXT  con la respuesta"
  exit
}
f_verbos="00000_VERBOS.txt"
f_errores="00000_ERRORES.txt"

# CONTROL DE ENTRADA DE VARIABLES y ASIGNACIÓN
if [ $# -lt 2 ]
then
  # Reportar uso inapropiado
  uso
else
  salida=$1
  if [ $# -eq 2 ]; then
    palabra="$2"
  elif [ $# -eq 3 ]; then 
    palabra="$2 $3"
  elif [ $# -eq 4 ]; then 
    palabra="$2 $3 $4"
  elif [ $# -eq 5 ]; then 
    palabra="$2 $3 $4 $5"
  fi
  # echo "Palabra es #$palabra#"
fi

# CONSULTA DEL SERVIDOR de la RAE simulando ser uno de los diversos navegadores posibles
navegador=(
  "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:15.0) Gecko/20100101 Firefox/15.0.1"
  "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:77.0) Gecko/20100101 Firefox/77.0"
  "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:77.0) Gecko/20190101 Firefox/77.0"
  "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A"
)
rnd=`echo $(($RANDOM%${#navegador[@]}))` # Elegimos un navegador al azar
# Hacemos la petición a la web de la RAE
curl -s --user-agent "${navegador[$rnd]}" https://dle.rae.es/"$palabra" > ./"$palabra.html"

# PROCESAMOS EL ARCHIVO OBTENIDO (Cortamos, retiramos lo innecesario, etc)
# Si se trata de un verbo, quitar las conjugaciones
id_conjugacion="<div id='conjugacion'>"
esunverbo=`grep -c "$id_conjugacion" ./"$palabra.html"`
if [ $esunverbo -gt 0 ]
then
  echo "$palabra es un verbo" >> $f_verbos
  # ELIMINAMOS la(s) CONJUGACIÓN(ES)
  sed -i "/${id_conjugacion}/d" ./"$palabra.html"
fi

# Si tiene más de una acepción (Calcular cuántas después de saber si es un verbo)
id_acepcion="<article id="
id_acepcion_fin="<\/article>"
num_acepciones=`grep -c "$id_acepcion" ./"$palabra.html"`
# Si no tiene acepciones, la palabra no existe. No continuamos.
if [ $num_acepciones -eq 0 ]
then
  echo "$palabra no se ha encontrado en la RAE" >> $f_errores
  rm "./$palabra.html"
  exit
fi

# PARTIR en $num_acepciones EL FICHERO $palabra.html"
# acepciones y acepciones_fin son 2 arrays de líneas PRECISO CONVERTIRLOS a cortes[]
acepciones=`grep -n "$id_acepcion" ./"$palabra.html"|awk -F":" '{print $1}'|sed ':a;N;$!ba;s/\n/ /g'`
c=0
for i in $acepciones
do
  let cortes[$c]=$(($i))
  let c=$(($c+1))
done
acepciones_fin=`grep -n "$id_acepcion_fin" ./"$palabra.html"|awk -F":" '{print $1}'|sed ':a;N;$!ba;s/\n/ /g'`
c=0
for i in $acepciones_fin
do
  let cortes_fin[$c]=$(($i))
  let c=$(($c+1))
done

# GENERA FICHEROS palabra.X.html por cada ACEPCIÓN
for (( i=0; i<$num_acepciones; i++ ))
do
  # echo "El comienzo del corte está en ${cortes[$((i))]}"
  # echo "El fin del corte está en ${cortes_fin[$((i))]}"
  sed "${cortes[$((i))]},${cortes_fin[$((i))]} !d" "./$palabra.html" > "./$palabra.$i.html"
  # Distintas salidas del programa, en función de la variable "salida"
  if [ $salida -gt 0 ]   # Salida a modo TXT
  then
    w3m "./$palabra.$i.html" > "./$palabra.$i.txt"
    if [ $salida -gt 1 ] # En una sóla línea
    then
      sed ':a;N;$!ba;s/\n/ /g' "./$palabra.$i.txt"|sed 's/  / /g' > "./$palabra.$i.1linea"
    fi
  fi
done

# BORRAR indica si dejar o no los archivos que no se deseen como salida 
BORRAR=1
if [[ $BORRAR -eq 1 ]] && [[ $salida -gt 0 ]]
then
  rm "./$palabra."*html
  if [ $salida -eq 2 ]
  then
    rm "./$palabra."*txt
  fi
fi
# SALIDA FORZADA
exit

 

Este programa era invocado con el siguiente miniprogramita que, leyendo de la lista de palabras corregidas que, impropiamente, denominé diccionariosinrepes.txt, obtiene las diversas, impropiamente denominadas, acepciones y las separa en 90452 archivos de una única línea.

#!/bin/bash

### FUNCIONES ÚTILES PARA EL PROGRAMA
# uso() Instrucciones del programa y salida en caso de error.
uso () {
  echo "Uso: $0 [diccionario]"
  exit
}

# CONTROL DE ENTRADA DE VARIABLES y ASIGNACIÓN
if [ $# -gt 1 ]
then
  # Reportar uso inapropiado
  uso
elif [ $# -eq 1 ]
then
  diccionario=$1
else
  diccionario=diccionariosinrepes.txt
fi

while IFS= read -r line
do
  buscaenrae.sh 2 $line
done < $diccionario

Descargadas y archivadas en una estructura de carpetas obvia:

dict -> LETRA

Se pueden reordenar o «recompilar» en una LETRA, con sus definiciones incluidas, sin incluir, etc…

Lo hago usando otro script simple:

#!/bin/bash

# El diccionario completo está por acepciones en las carpetas
# dict/LETRA
# Cada acepción (en realidad entrada en el diccionario) tiene
# un archivo denominado PALABRA.N.1linea conteniendo su definición.
# (donde N es el número de acepción contando desde cero)

letras="A B C D E F G H I J K L M N Ñ O P Q R S T U V W X Y Z"
for letra in $letras
do
  ls dict/$letra > dictporletra/$letra.archivos.txt
  awk -F"." '{print $1}' dictporletra/$letra.archivos.txt > dictporletra/$letra.acepciones.txt
  ls dict/$letra/*.0.1linea |awk -F"/" '{print $3}'|awk -F"." '{print $1}' > dictporletra/$letra.sinrepes.txt
  cat dict/$letra/* > dictporletra/$letra.definiciones.txt
done

cat dictporletra/*.archivos.txt > DICCIONARIO_TOTAL.archivos.txt
cat dictporletra/*.acepciones.txt > DICCIONARIO_TOTAL.acepciones.txt
cat dictporletra/*.sinrepes.txt > DICCIONARIO_TOTAL.sinrepes.txt
cat dictporletra/*.definiciones.txt > DICCIONARIO_TOTAL.definiciones.txt

Pero queda por resolver un problema que me tiene algo martirizado desde hace meses y es que la ordenación es muy compleja realizarla, pues muchas entradas en el diccionario son dobles, como «ad hoc», pero las definiciones descargadas incluyen líneas que son del tipo: «i Escrito con…» y desde el punto de vista del uso del comando sort, es más o menos lo mismo que decir que si quiero ordenar las primeras como «adhoc», la «iEscrito» se sale de su lugar.

He ordenado muchas manualmente sobre esta compilación, pero es un trabajo absolutamente aberrante y seguro que se puede hacer mejor, así que de momento he decidido dejar de trabajar en esto y dar por cerrado este proyecto que, en realidad, es la puerta de entrada a muchos otros.

Espero que el orden no sea algo tan terrible en esos otros proyectos venideros.

Dejo a disposición pública el Diccionario Completo que he generado de esta manera, con la estructura de carpetas generada, así como los programas utilizados para su procesamiento.

RAE-COMPLETO.tar

Repositorios microsoft en RaspBerry Pi con Raspbian

Desde que tengo mi Raspberry PI 3, he instalado diversas cosas, pero no recuerdo haber instalado nada de Microsoft ni por asomo. Sé que Raspbian no un Debian puro, pero de ahí a que me añadan un repositorio de Micro$oft… creo que va un abismo.

Así que estoy desando tener algo de tiempo libre para instalar mi servidor web y blog de backup o de desarrollo en un Debian puro sobre Raspberry, que sé que es posible, aunque aún no he encontrado ese huequito temporal.

No es algo que me preocupe mucho, pero he de reconocer que me molesta hacer tan siquiera un ping a un servidor de la empresa en cuestión.

Configurar mail/mailx en Linux

He pasado un par de días, desde que hube de formatear mi Linux Mint 19.3 para actualizarlo a Linux Mint 20.1 recuperando pequeñas personalizaciones que había hecho en el PC.

Una de ellas es la herramienta (script) de realización de BackUps que, entre otras cosas, me envía por correo electrónico diariamente el resultado de la sincronización realizada.

Lo uso desde hace más de 10 años y lo he ido perfeccionando con el paso del tiempo. Entre otras cosas, ahora lo ejecuto con un «cron«, de línea de comandos, que hace una llamada al programa en cuestión y envía el correo informativo utilizando el programa mail del sistema operativo.

Pero he tardado mucho en configurarlo.

No recordaba qué había que hacer para que funcionase, pero, tras unas cuantas horas, lo he logrado con un par de cosas sencillas que no sé muy bien porqué no tenía apuntadas.

Tenía una restricción, más o menos tonta autoimpuesta, que era que no quedase abierto un servidor SMTP (ni su puerto 25) permanente en el PC (obsesiones absurdas de seguridad), así que algunas de las soluciones que pasan por instalar un MTA como Sendmail o Postfix estaban descartadas. (Aunque también las probé, ya cuando empezaba a desesperar)

Por más que intentaba configurar mailutils (que incluye mail/mailx) no conseguía enviar un correo fuera del equipo, utilizando una cuenta de correo personal en mi hosting preferido (giusseppe.net). Creo que revistando la información del manual de mailutils sí que habría sido posible enviar correos sin que fuese preciso instalar nada más, pero no daba con la forma, así que probé con alternativas a mailutils, como era s-nail, pero me daba resultados no deseados y algunas configuraciones que había que hacer no me apetecía tenerlas así.

Finalmente, instalé sSMTP y su configuración fue trivial:

sSMTP es un programa que entrega correo electrónico desde un ordenador local a un servidor de correo configurado (mailhub). No es un servidor de correo (como si lo es el servidor de correo rico en funciones sendmail) y no recibe correo, ni expande alias, ni administra una cola. Uno de sus usos principales es reenviar el correo electrónico automatizado (como las alertas del sistema) desde su equipo a una dirección de correo electrónico externa.

Por supuesto, tenía que instalar el pequeño programita mailutils que serviría para los comandos mail/mailx. No he optado por ninguna de las alternativas que no aportan nada que me sea útil. (No obstante, también se puede enviar correo sólo usando sSMTP, pero no se dispone del comando mail)

Para instalar ambas utilidades, bastaba un simple:

sudo apt-get update && sudo apt-get install ssmtp mailutils

 

Y después proceder a configurar el fichero /etc/ssmtp/ssmtp.conf con lo siguiente:

#
# Config file for sSMTP sendmail
#
# The person who gets all mail for userids < 1000
# Make this empty to disable rewriting.
root=jmdomin@giusseppe.net

# The place where the mail goes. The actual machine name is required no
# MX records are consulted. Commonly mailhosts are named mail.domain.com
mailhub=mail.giusseppe.net:587
AuthUser=jmdomin@giusseppe.net
AuthPass=LAFAMOSACONTRASEÑA
UseSTARTTLS=YES

# Where will the mail seem to come from?
#rewriteDomain=

# The full hostname
hostname=giusseppe.net

# Are users allowed to set their own From: address?
# YES - Allow the user to specify their own From: address
# NO - Use the system generated From: address
#FromLineOverride=YES

 

Ahora mis correos salen estupendamente y lo puedo poner a prueba con un simple:

echo "Este es el cuerpo del mensaje" | mail -s "Este es el subject" jmdomin@gmail.com

Recortar una imagen desde la línea de comandos

A veces tomo una fotografía y parte de lo que hay en los laterales me sobra. Especialmente cuando hago muchas, como una serie de imágenes captadas desde el móvil con un dispositivo disparador bluetooth que evite que toque el teléfono y provoque temblor o distorsión en la imagen.

El viernes pasado estuve trabajando sobre unas imágenes de «blackout-poetry» que había hecho y eran más de 40, así que no era muy razonable ir abriéndolas con GIMP y buscar el mismo corte, pues era el mismo corte, en todas y cada una de ellas.

En cuanto tengo que hacer algo más de 5 veces seguidas, pienso si existe una manera «automática» o más eficaz de tratar la serie. Que puede no serlo en pequeñas series, pero que me permite ir aprendiendo por si alguna vez necesito aplicar el mismo procedimiento en una serie más numerosa.

En esta ocasión, gracias a un tutorial que he encontrado en internet sobre cómo recortar imágenes en línea de comando con Imagemagick, recurrí a un utilísimo comando o programa linux que ya había usado con anterioridad, pero en esta ocasión para aplicar un corte o «crop» a las imágenes que con esta sencilla línea quedaron como las quería:

mogrify -crop 1800x3100+190+280 *

Transformando imágenes de 2250×4000 en una imagen recortada a partir del pixel 190 de la izquierda (la x) y 280 pixels hacia abajo (la y), con un nuevo tamaño: 1800×3100, despreciando lo que no esté ahí.

Soy un fan de la línea de comandos linux

Quizá porque mi primer contacto con un ordenador fue con línea de comandos, allá por los tiempos en los que en la UAM usé un AIX desde una terminal conectada a un ordenador central que era el único que tenía entorno gráfico.

Quizá porque es más rápida y consume menos recursos que los sofisticados programas de gestión de software que vienen con las distribuciones populares de Linux (yo, de hecho, lo primero que instalo es Synaptic).

Quizá porque lo puedo hacer remotamente desde mi teléfono móvil o, como hoy, desde mi PC mediante una conexión (bien configurado su acceso PKI) por SSH, conectándome a la Raspberry que tengo de servidor de backup y de desarrollo, al mismo tiempo que me conecto al PC que habitualmente usa Carmen para trabajar (mientras ella está trabajando, de hecho).

Cada noche hago un repaso de los dispositivos conectados y tecleo un

sudo apt update
sudo apt upgrade

 

(y si procede un sudo apt autoremove, para limpiar lo innecesario)

Termino con un shutdown now que me remite a aquellos tiempos de mis primeros tecleos… donde una broma habitual era hacerse con la password de root y proceder a un apagado de los 5 terminales conectados al central. ¡Qué vandalismo!.

Había una forma muy sencilla que consistía en simular una pantalla con un «login» en el que la persona que había de encender y administrar los equipos se conectaba y devolver un pantallazo tras haber capturado su contraseña. A continuación, se volvía a mostrar la verdadera pantalla de login y parecía un minúsculo error de tecleo… Sigue siendo un ataque eficaz a pesar de lo poco sofisticado del método.

Fondo blanco en PNG

Para eliminar la transparencia (canal alpha), existe este valioso comando linux que he utilizado más de una vez para luego poder subir las fotos a mi galería que maneja Piwigo:

mogrify -background white -alpha remove -alpha off *.png

Puede combinarse, por supuesto, con un find bien manejado, como el comando que usé para modificar los tamaños de múltiples archivos simultáneamente.

Soñé en ensamblador

Nunca he programado en ensamblador
y eso que se decía
en una época que ya ni recuerdo
que había que entender ensamblador
para comprender cómo una máquina
comprendía a los humanos.

Ni siquiera sé
y eso que podría buscarlo en internet
si se trata de un lenguaje compilado
o interpretado.

Cuando acabe este poema
leeré sobre ello e incluso
realizaré algún programa
que salude al mundo
desde mi máquina
con la que tanto me entiendo
con la que tanto me enciendo.

Pero hace unas semanas
soñé que tenía que preparar para Carmen
una coreografía de Tango
en ensamblador.

En el suelo
no sé cómo iba a hacerla.
En el sueño
no sé cómo iba a programarla.

Soñé que no la iba a tener a tiempo
e iba a decepcionar a Carmen
que estaba esperando
ese código ensamblador
no recuerdo para qué.

Nunca he programado en ensamblador
y eso puedo resolverlo
hoy mismo.

La decepción
sin embargo…

Esto no es una broma