El cacao de los requisitos de Windows 11

Minientrada

No solo mintieron con lo de que Windows 10 iba a ser la última versión de Windows, sino que Windows 11 tiene por el momento una importante subida de requisitos mínimos que ha enfadado a bastante gente. Quizá tenga su explicación lógica: los requisitos mínimos de Windows 10 en 2015 fueron tan bajos que a cualquier máquina compatible con Windows 7 se le ofreció actualizar a la versión 10, y en algún momento habrá que empezar a dejar de lado máquinas de 11 o 12 años de vida. Sin embargo, tal vez el timing no sea el más adecuado para pedirle a gente que se deshaga de hardware perfectamente funcional solo porque no es de la generación de procesadores que a Microsoft le parece bien.

Antes de que Microsoft decidiese tumbar la PC and Health Check bajo la promesa de mejorarla, la descargué y la instalé en mi gaming rig para ver la compatibilidad. Llevaba días escuchando que muchos ordenadores no tan viejos estaban reportando ser incompatibles, pero la herramienta hacía una pésima labor en decir por qué. El primer intento de ejecutarla sobre mi ordenador, comprado hace 7 meses, no me sorprendió del todo.

Interesante.

Hasta que Microsoft arregle su PC and Health Check y haga que muestre un mensaje de error un poco más claro, una forma de ver por qué no es compatible un ordenador con Windows 11 es utilizar WhyNotWin11. Este programa analiza las specs y muestra en detalle todas las specs mínimas para Windows 11 y las comprueba y reporta por separado de forma gráfica.

Foto del GitHub, no es mi ordenador.

Después de una pequeña confusión entre «Windows 11 requerirá activar Secure Boot» y «Windows 11 requerirá ser compatible con Secure Boot» (FreeBSD no utiliza todavía Secure Boot y no me gustaría complicarme el acceso a esa partición, bien gracias), el único problema está en TPM 2.0. Mi Ryzen tiene TPM, pero al ser un ordenador montado, se conoce que no viene activo por defecto en la configuración del UEFI.

Para poder activar TPM tuve que consultar varios vídeos en YouTube que me explicasen cómo utilizar el menú UEFI de mi ordenador, entender por cuál de las docenas de submenús me tengo que meter, y ser capaz de localizar la entrada correcta del menú, que tiene el sensual nombre de AMD CPU fTPM (a veces parece que los nombres de las cosas se eligen dejando caminar un gato sobre el teclado…)

Todo lo que podía pensar mientras hacía esto es cómo un usuario con menos conocimientos (y eso que yo no entiendo de hardware, por eso alguien montó mi ordenador por mí y por eso paralelamente mis otros dispositivos son Apple) iba a ser capaz de sobrevivir a este paso en el supuesto de que sea esto todo lo que tiene que hacer para hacer una máquina compatible con Windows 11.

Después de hacer este paso, la PC and Health reportó que mi máquina ya podría recibir la actualización a Windows 11 (¡gracias!).

Gracias, hombre.

Listar paquetes instalados no automáticamente con pkg

Minientrada

pkg es el gestor de paquetes de FreeBSD. Es una alternativa a ports que permite instalar paquetes adicionales en el sistema que no vienen con el sistema base.

Es posible listar los paquetes instalados utilizando pkg-info(8). Sin embargo, mi principal problema con casi todos los gestores de paquetes es lo mal que diferencian entre paquetes instalados por mi y paquetes instalados como dependencia.

Me interesa sacar una lista de los paquetes verdaderamente instalados por mi. Esos paquetes que puse explícitamente en mi terminal al escribir algún comando pkg install. Por supuesto es importante saber la lista de dependencias que hay instaladas en mi sistema, pero si estoy fabricando una copia de seguridad con el listado de paquetes que he instalado en mi máquina, me parece importante ocultar las dependencias que no haya pedido, porque puede ocurrir que en el futuro esa dependencia también cambie con respecto a mis programas y deje de ser necesaria (o aparezcan otras nuevas).

pkg-query(8) es el front-end para la base de datos en la que pkg guarda su configuración y estado de los distintos paquetes. Lo bonito es que cuando se instala un paquete, sí recuerda si se ha hecho a consecuencia de ser una dependencia, o porque se haya pedido explícitamente. Así que se le puede pedir un filtro que deje fuera los paquetes que se han instalado automáticamente para listar sólo los que sí se han instalado intencionalmente con el siguiente comando: pkg query -e '%a = 0' '%n'.

danirod@beastie:~ % pkg query -e '%a = 0' '%n' | head
ImageMagick7
alacritty
base64
claws-mail
compton
doas
dsbmixer
en-freebsd-doc
feh
firefox

jq: filtrar índice inverso por valor de un subcampo

Minientrada

Amo jq, pero a la vez daría lo que fuera por poder aprender del todo su lenguaje de consulta porque a veces se me atraganta.

Sería muy fácil con jq hacer una búsqueda en un array de objetos en función de lo que vale uno de los campos de cada objeto, ¿verdad? Hablo de un array como este:

[
  {
    "nombre": "Carmen",
    "departamento": "Ventas",
    "superior": "Ana"
  }
]

Pero ¿qué pasa si en vez de un array tengo un objeto a modo de índice inverso? Me refiero a la clásica de fabricar con este array un objeto donde como valores tengo cada uno de los valores del array, pero como clave tengo algún identificador concreto de cada objeto. Al fin y al cabo, buscar items en una lista tiene complejidad O(n), pero hacerlo en un mapa tiene complejidad O(1). Es más rápido hacer lista["Ana"] que hacer lista.find(i => i.name == "Ana").

{
  "Carmen": {
    "nombre": "Carmen",
    "departamento": "Ventas",
    "superior": "Ana"
  }
}

El secreto está en usar to_entries y from_entries para convertir entre objeto y array de entries. jq 'to_entries | from_entries' < input.json se anula entre sí. Entre ambas sentencias podemos plantar un select para hacer un filtro de aquellos elementos del nuevo array generado por to_entries que filtre por una condición concreta para .[].value.whatever.

jq 'to_entries | select(.[].value.superior == "Ana") | from_entries' < empleados.json

La salida de to_entries es un array, por lo que cuando se hace el select para filtrar elementos que cumplan un criterio, hay que empezar la query con un .[], para poder hacer introspección sobre cada elemento del array. Realmente no es muy complejo, pero me lo apunto porque me ha costado un poco de ensayo y error dar con el orden correcto en el que tengo que poner los puntos y los corchetes.

Más notas sobre importar posts

Minientrada

Retomo el tema importar entradas en WordPress de forma masiva.

Recientemente volví a tirar de ese script para traerme un JSON con tweets viejos a danirod.es. Ni siquiera los he hecho públicos. Por el momento sólo los he hecho privados porque lo que me interesa es tenerlos consolidados. Tampoco son tweets recientes; estamos hablando de tweets que tienen más de una década. Todos los enlaces externos dan HTTP 404, están fatal escritos y, en general, es contenido poco interesante para internet. Pero me apetecía tenerlos a mano.

Uso el plugin Syndication Links para conectar entradas que sean importadas de otras redes sociales con su URL de referencia; las sindicaciones de Hacker News son un ejemplo. En el caso de tweets de una cuenta que ya ni siquiera existe, es bastante irrelevante plantar un u-syndication. Aun así, me apetecía ponerlo.

En el caso del plugin Syndication Links, la metadata sobre sindicación se guarda como un campo personalizado de WordPress llamado mf2_syndication. Con la API XML-RPC de WordPress es posible crear campos personalizados rellenando el array custom_fields. Hay que tener en cuenta que no es un clave-valor simple, sino que es un array de objetos, con su campo key para el título del campo, y su campo value para el valor del campo. En el módulo de npm, los campos se dan usando la key customFields en la llamada a newPost:

client.newPost({
  title: '...',
  content: '...',
  customFields: [
    { key: 'field-1', value: 'value value' },
    { key: 'field-2', value: 'more value more value' }
  ]
}, (e, id) => console.log(e, id));

Google Workspace for everyone

Enlace

Del anuncio que hizo hace un par de semanas Google anunciando la disponibilidad global de Workspace:

Starting today, you can enable the integrated experience in Google Workspace by turning on Google Chat. Use Rooms in Google Chat as a central place to connect, create and collaborate with others.

Había olvidado completamente que Google Chat también es un producto que existe. Lo he abierto con curiosidad y me he encontrado con un historial viejo de Google Hangouts, por lo que asumo que definitivamente este es el reemplazo de Hangouts Chat. El reemplazo de las llamadas de Google Hangouts fue Google Meet.

Sin embargo, no hay que confundir Google Meet con Google Duo, el cual me pareció ver hace poco que seguía vivo. No corre la misma suerte Google Allo, que parece que sí ha muerto. ¿Y Google Spaces? En la entrada se le menciona, pero si visito https://spaces.google.com se me redirige a la página de inicio de Google Workspace también.

No sé si en Google son conscientes de lo cómico que resulta de puertas para fuera su política sobre aplicaciones de mensajería que nacen, crecen, se reproducen y mueren, pero es que es difícil de narices saber qué productos coexisten a la vez en su ecosistema.

Abrir en una ventana nueva, Slack Edition

Minientrada

Hablemos de Slack. Slack tiene un menú de acceso rápido que permite saltar rápidamente a otra conversación pulsando ⌘K. Se trata de otro acto de respeto hacia los power users que consideran que levantar las manos del teclado para agarrar el teclado, desplazarlo a la barra lateral, localizar la conversación y hacer clic en ella es una pérdida de tiempo pudiendo teclear ⌘-K-D-A-N-I-Enter. Muy estilo Vim. Es otra forma diferente de mostrar respeto.

Pero sigue sin ser abrir en ventana nueva. No puedo trabajar con dos conversaciones a la vez. A lo sumo con una conversación abierta en la pantalla principal y un hilo abierto en la barra lateral. No puedo consultar información o un código que me hayan enviado por una conversación mientras la discuto o hablo sobre ella por otra conversación. Todo lo que puedo hacer es utilizar su versión web desde mi navegador web y abrir múltiples instancias de la misma aplicación web, y aun así estoy condenado a tener en todas las instancias la misma barra lateral y el mismo encabezado en la parte superior.

Ojo, no estoy negando que haya complejidad. Me leí el post que publicaron hace un par de años en su blog de ingeniería. Entiendo que todo es una aplicación React gigante con estados de Redux globales. Aquí sólo me estoy lamentando en voz alta de que hayamos aceptado esta nueva normalidad plagada de aplicaciones no nativas sin considerer este tipo de casos de uso más avanzados.

Vamos, Slack, aquí te dejo una idea de cómo se podría ver. Haría también el concepto de cómo sería ese pop-up: una ventana nueva donde sólo se vea la barra de título del sistema operativo y luego el área principal con la conversación (sin barras laterales ni superiores), pero se acaba mi descanso de la hora de comer y no tengo tiempo de diseñar esa pantalla.

Concepto. Este menú no existe. (Ojalá.)

elfcat

Enlace

elfcat es un visualizador gráfico para inspeccionar las estructuras de datos y bytes internos de un binario ELF. Genera un archivo HTML que tiene metainformación y que con el ratón permite ver cada estructura de datos de forma individual. Está programado en Rust.

Esto me hubiese venido estupendamente hace un tiempo cuando me dedicaba en mis ratos libres a escribir parsers ELF y ese tipo de cosas como parte del sistema operativo homebrew que estaba construyendo y que sabe Dios cuándo retomaré.

No se admitirán devoluciones

Minientrada

Hace mucho que no opino mal, pero siempre es un buen momento para romper la racha. Como siempre, yo escribo para desahogar, los demás leen bajo su propio riesgo.

Ayer se abrió un precedente peligroso. De todos los atropellos y situaciones «fuera de lo normal» que venimos viendo en este país en los últimos tiempos, no termino de comprender por qué tenemos que tragar y asimilar como normal que a ciertas personas se les trate por encima de lo que las leyes más básicas y esenciales del país establecen.

No se admitirán devoluciones: próximamente serán los del bando contrario los que vengan con excentricidades que posiblemente suenen fuera de la ley, o como mínimo de naturaleza cuestionable también. No valen llantos. Si vamos a abrir este tipo de melones, aquí va a haber melón para todos.