Archivo de la categoría: Tutoriales

El sistema de ficheros del Spectrum : la crisis de los 40 friki versión (Parte 2)

Posts in this series
  1. Volviendo : la crisis de los 40 friki versión (Parte 1)
  2. El sistema de ficheros del Spectrum : la crisis de los 40 friki versión (Parte 2)

Siguiendo con esta serie de artículos sobre la crisis de los 40 friki versión, vamos con lo primero que no conocía del spectrum.

Los sistemas de ficheros en cinta, porque ne mis tiempos hacías load"" (que "" era el *.* de ahora) y ya esta, bueno en mis tiempos también tenía el Pheenix (un clon del Phoenix) copiado en una cinta pirata que para cargarlo había que hacer load «» code .

Y por desgracia en mis tiempos mozos, no se por que pero mi Spectrum+2A no grababa las cintas con mi código basic, y era una tarea titánica porque los pasaba a papel y las versiones eran papeles nuevos…en algún sitio estarán.

Los siguientes datos técnicos están por un montón de lados y mejor explicados, no vengo a contaros el secreto de la rocacola.

Bueno pues las cintas de Spectrum pueden tener los siguientes ficheros:

  • ficheros de programas basic
    • los únicos autoejecutables
  • ficheros de datos binarios
    • imágenes, que hay un sugar syntax en basic para cargarlos con load "" screen$ pero son binarios.
  • ficheros de arrays de números (los json de la época o serializados)
  • ficheros de arrays de palabras (los json de la época o serializados)

Pues tengo que reconocer que hasta hace unas semanas no sabía que el único fichero autoejecutable era los ficheros de programas de basic.

Así que los juegos comerciales tienen sí o sí (salvo rayadas como el Pheenix pero no recuerdo si después tenias que ejecutarlo a mano) un pequeño programa en basic que hacia de cargador del juego propiamente dicho que venía en entero o troceado en varios ficheros binarios.

Normalmente un juego comercial simple era:

cargador pequeño basic -> fichero binario: pantalla de carga -> fichero binario: juego

Los había mas complejos que para compatibilidad con el 48kb troceaban el juego en varios ficheros binarios:

cargador pequeño basic -> fichero binario: pantalla carga -> fichero binario: juego -> fichero binario: nivel 1 -> fichero binario: nivel 2

Luego había gente que rizaba el rizo e intentaba hacer cargadores de lo mas complejos para que los críos de aquella época dijéramos «guauuu» como Dynamic con su contador de carga y sin las clásicas lineas de colores del borde del Army Moves.

Otra cosa que no viví en su época fue mini juegos durante la carga del juego principal, pero eso tuvo que ser espectacular.

En los siguiente episodios (no se en que orden o si alguno se fusionara):

  • voy a retomar el maze en basic que volví a escribir hace algunos años (que venia de un libro de programación infantil) quiero volver a re-entenderlo.
  • quiero explicar el randomize usr que por fin (hace unas semanas lo entendí)
  • quiero intentar hacer una calculadora simple en código maquina
  • quería hacer una prueba de velocidad de hacer algo en basic y hacer lo mismo en código maquina
  • los siguientes pasos para el juego

Volviendo : la crisis de los 40 friki versión (Parte 1)

Posts in this series
  1. Volviendo : la crisis de los 40 friki versión (Parte 1)
  2. El sistema de ficheros del Spectrum : la crisis de los 40 friki versión (Parte 2)

Creative 40th Birthday Cake Ideas - Crafty Morning

La crisis de los 40 a los hombres (del 1/2º mundo) a los que le viene, les pasa muchas cosas como:

  • suelen irse a Turquía a ponerse el pelo cual muñeca chochona (que pena que Santiago Segura no sea un ejemplo para nadie, porque ser metalero calvo mola…en mi caso pelos locos con frontal en plan Punset).
  • suelen divorciarse y arrejuntarse con una moza joven.
  • suelen comprarse una motarro grande…aunque nunca hayan conducido en moto, y o suelen comprarse un coche caro.
  • los mas pijos se hacen un Lifting escrotal como el puto Bono (no el político, si no el cantante vendido que iba de alternativo pero era un Michael Jackson de la vida), vamos que los llevan menos colganderos….recuerdo la hermana de un amigo muy maja que consiguió la plaza de profe muy joven en un instituto y le llego el típico huevos colgaderos a comerle la oreja….y lo peor que consiguió el premio, me dio mucha pena porque le tenía mucho aprecio…pero bueno esa gente come orejas podría ser lideres de una secta.
  • algunos se vuelven unos hippis de la vida y empiezan a ir a la India y a meditar, a vestir eco, cuando en su puta vida lo mas místico que han hecho ha sido la comunión vestidos de marineritos. Me huelo que sera por pillar cacho con mozas jovenes neo-hippys.
  • se vuelven unos culturetas de la vida, que escupirían a la cara a Woody Allen por no llegar a su nivel de cultureta. Los mas pudientes se gastan los dineros en ir a algún museo de arte moderno de alguna capital Europea a ver algún cuadro de algún manchurron, solo para tener conversación de cultureta. Otros les da por escribir libros de poemas. Y por supuesto las pelis de Detectives-pastores de cabras afganos subtituladas en sueco de la filmoteca.

Estas situaciones pueden darse algunas o todas.

Y después los frikis tenemos otro tipo de crisis ¿menos autodestructiva? y comienza con ese pensamiento «Jo, pues me gustaría hacer un juego para ese ordenador que tenía de crío».

Retro Ordenadores Orty: ZX Spectrum +2A (revisión Z70830 ISSUE 2) (1987) (teclado español)

Pues allá vamos.

No es la primera vez que entro al trapo, ya con 38 me vino (o re-vino porque creo que no fue la primera vez) la crisis friki de los 40: https://gitlab.com/tres-14159/R_Tape_loading_error_0_1

Gracias a la gente del chat de telegram:  Spectrumero & Dario

Me he vuelto a enfocar, también mil y mil y mil unas gracias a Santiago Romero que ha hecho muy buenos tutoriales de programación en ensamblador del z80 y muchos otros de GNU/Linux como el de tutorial de tmux o el tutorial de vim .

Y varios pdf de libros antiguos y el manual del Spectrum +2A metidos en el móvil y mucho mejor, interesante y productivo para cagar en el WC que andar haciendo scroll al twitter.

Ya lo he dicho otras veces en este blog, en charletas en vivo, streamings y a desconocidos por la calle…mi acicate en la vida para ser un Stallmanista taliban del software libre fue en la infancia intentar hacer juegos de Spectrum con el Basic en un barrio de clase obrera (con una buena biblioteca pública pero poco mas), recuerdo la frustración de intentar hacer un triste matamarcianitos e ir eso a pedo por segundo y yo preguntadome ¿el porque?, el porque era que estaban hechos en código maquina algo que años después descubrí. Y esa rabia del código cerrado y el negar el acceso al conocimiento cuando descubrí en la uni el mundo del software libre fue como una revelación.

https://media.tenor.com/Oc4nf8N08jIAAAAM/mind-blow-galaxy.gif

¿Cómo van ha ser mis pasos en la espiral de autodestrucción de la crisis de los 40 friki?

  • Quiero intentar hacer un par de juegos «decentes» y completos para Spectrum.
    • con Basic mas o menos me apaño pero de ahí puedes sacar juegos arcade muy simples, y quizá muy buenos juegos de estrategia por turnos o aventuras de texto/conversacionales .
    • con Código Maquina ahí esta la chicha.
    • No quiero llegar (o eso espero) al punto friki de sacarlo en físico con su cajita de casete y tal….tentanciones tengo pero no.
  • Quiero al igual que los que restauran edificios romanos, de la edad media, crímenes rellenos de sobres de CalatrabaTeLaClava ser riguroso a nivel histórico. Y pienso ¿Cómo lo haría el Miguelin pequeñin de los 80/90 que programaba en Basic en su Spectrum?:
    • encontraría algún libro de código maquina que entendiera (hecho Código Maquina para Principiantes).
    • los primeros juegos los haría convirtiendo alguno lentorro de Basic a código maquina.
    • no usaría ningún ensamblador de aquella época, porque:
      • no creo que conociera la palabra ensamblador (recuerdo cuando descubrí la palabra emulador uff)
      • puede que mis padres hubieran pagado por el ensamblador de investronica (u otro), porque si se mojaban en todo lo que fuera que aprendiera eso de la informática, ains me tenían que haber enseñado a nacer rico y sin saber hacer la O con un canuto pero montar una startup IT para explotar a profesionales que sacaran el trabajo.
    • entonces al igual que en aquella época…mi spectrum no se por que pero no grababa cintas y todo el código que picaba en basic tenia que pasarlo a papel (en algún sitio estará), pues tendría enorme listados de código ensamblador que tendría que haber pasado a mano a código maquina.

Hablando seriamente de las crisis de la edad, una de las crisis de la edad que tenemos los seres humanos (del 1/2º mundo) es la de los 30, que es cuando te das cuenta de que tus padres son mayores e incluso ya están llegando a la vejez y sabes que mejor tarde pero tarde o temprano no estarán contigo, esa es la jodida.

Estad atentos en vuestras televisiones a los siguientes episodios de esta aventura del cuarentón friki quiere hacer un juego en Spectrum.

¡¡Oye que eso esta fuera de las coreutils!! Ahhh es en rust, oioioioi que bonicoooo

Un poco hasta los cojones de la tontería de que sean sustituciones no compatibles de las coreutils en Rust. Como por ejemplo Bat .

A ver me explico me encantan las mejoras, pero no me hagas el sistema lleno de incompatibilidades por ser guay….que esto no es un windoze.

Y si ahí esta el find que duele sus «long option» a lo «short» con:

$ find /tmp -type f -name "una_caca.txt"

Pero a mi lo que me ha «enfadado»…muy entrecomillas es que haya ido a preguntar al chat de #bash de Libera Chat sobre como se usa bien bien getopt que no estoy hablando de getopts.

Pues macho se me han puesto con que eso no es parte de las coreutils, que si blablabla….señores que estoy en GNU/Linux y que lo quiero porque getopts no tiene soporte para las «long option».

Pero eso si, cuando es algo en un golang o rustlang y tiene muchos colorines, la gente se la suda los estándares.

Pues al final lo resolví y me hice un pequeño ejemplo con getopt:

#! /bin/bash

#~ get_opt.example.sh
#~ Copyright (C) 2022 Miguel de Dios Matias

#~ This program is free software: you can redistribute it and/or modify
#~ it under the terms of the GNU General Public License as published by
#~ the Free Software Foundation, either version 3 of the License, or
#~ (at your option) any later version.

#~ This program is distributed in the hope that it will be useful,
#~ but WITHOUT ANY WARRANTY; without even the implied warranty of
#~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#~ GNU General Public License for more details.

#~ You should have received a copy of the GNU General Public License
#~ along with this program. If not, see <http://www.gnu.org/licenses/>.

: '
Examples the calls:

$ ./getopt.example.bash --arg-b 111 -a 2222 3333
argA 1
argB 111
argC 
argD 0
unamedOptions 2222 3333

$ ./getopt.example.bash -a --arg-b=111
argA 1
argB 111
argC 
argD 0
unamedOptions 

$ ./getopt.example.bash -c abc def
argA 0
argB 
argC abc
argD 0
unamedOptions def
'

function help() {
    echo "$0 [(--arg-a | -a)] [(--arg-b | -b) <data_b>] [(--arg-c | -c <data_c>)] [-d] [(--help | -h)]"
}

LONG_OPTION_LIST=(
    "arg-a"
    "arg-b:"
    "arg-c:"
    "help"
)
SORT_OPTION_LIST=(
    "a"
    "b:"
    "c:"
    "d"
    "h"
)
# Read the parameters
opts=$(getopt -q \
  --longoptions "$(printf "%s," "${LONG_OPTION_LIST[@]}")" \
  --name "$(basename "$0")" \
  --options "$(printf "%s" "${SORT_OPTION_LIST[@]}")" \
  -- "$@"
)
eval set -- "$opts"

argA=0
argD=0
unamedOptions=()
# It it is same a queue (process the head) because $1 and $2
while true
do
    case "$1" in
        --arg-a | -a)
            argA=1
            ;;
        --arg-b | -b)
            argB=$2
            shift 1
            ;;
        --arg-c | -c)
            argC=$2
            shift 1
            ;;
        -d)
            argD=1
            ;;
        --help | -h)
            help
            exit 0
            ;;
        --)
            # End options now the unamed options
            ;;
        *)
            unamedOptions+=("$1")
            ;;
    esac
    shift 1
    if [ $# -eq 0 ]
    then
        break
    fi
done

echo "argA $argA"
echo "argB $argB"
echo "argC $argC"
echo "argD $argD"
echo "unamedOptions ${unamedOptions[@]}"

Te da asco twitch y quieres convertirlo en un La2

Desde hace 1 año o así estoy como prosumidor en Twitch, la red social de moda de videos (dejando de lado Tiktok y youtube).

La verdad es que es un basurero de videos:

  • de tías en bikini o poca ropa lamiendo y besando micrófonos con forma de orejas de plástico.
  • de traders que realmente son niñatos neoliberales pobres en el dormitorio de sus papas
  • de comentaristas de fútbol…por dios volador del espagueti que ya tenemos las teles, periódicos y las radios soltando todo el rato fútbol, fútbol…
  • de juegos comerciales e insulsos
  • de Andorranos que no pagan impuestos en España (ojala se pongan enfermos cuando estén USA no tengan dinero para pagarse el hospital privado y se MUERAN, si repito deseo que se MUERAN esos cabrones que NO PAGAN IMPUESTOS y cuales futbolistas que meten mierda en la cabeza a la gente joven diciendo que es guay ser cabrones). Es que, que hijos de puta mas egoístas y malas personas.

Pues gracias a Fanta que me pregunto por una extensión para navegador para bloquear cosas en twich…pues estaba con el runrun en la cabeza.

Y la encontré Unwanted Twitch:

Una vez instalado te saldrá en la barrita de arriba un botón con acceso al panel de configuración de Unwanted Twitch, el botón aparece gris cuando no estas navegando por la página de twitch, no es muy necesario entrar porque puedes hacerlo desde fuera todo:

¿Pero Miguel no me has dicho que hace plugin? ¿Hackea los drones de bastardos unidos para meterles un tiro en la frente a los twitcheros insolirarios que se han ido de España pero siguen vendiendo sus productos inculturales en España?

No, no…ya podía ser como el episodio de las abejas de Black Mirror…pero no.

Vas seleccionando la mierda que no quieras ver que puede ser:

  • twitcheros de mierda
  • etiquetas de mierda
  • categorías (o juegos de mierda)
  • regex (para casar titulos de emisones de mierda)

Lo que hace es quitarte de casi todos los sitios (del carrusel de vídeos de la home de twitch sale basura) pero de la página te limpia de mierda los:

  • Barra de la izquierda:
    • Canales que sigo, incluso sigues a un/a muchacho/a que hace videos de videojuegos retro o sigues a un pavo/a que hace videos de videojuegos de software libre, te desaparece de ahí si le da por hacer un video de mierda en una categoría/etiqueta/regex_titulo de mierda, lo siento mi tiempo es mas importante que el tuyo y mis pixeles de la pantalla también…si quieres emitir una partida del juego de futbol de mierda del Fifa lo siento «no existes».
    • Canales recomendados, sigue saliendo mierda…o eso creo.
  • Página de siguiendo, te limpia de mierda los canales recomendados. Y en directo también te limpia de mierda.
  • Página de explorar, ahí es una gran delicia en canales en directo te quita pero mierda, pero mierda, mierda a paladas, te queda una lista de canales mucho clara y encuentras cosas interesantes, por ejemplo yo he encontrado twitcheros que juegan al Wargames de los de cartoncitos de antes en mi querido pero viejo Vassal para jugar, o canales con partidas del ajedrez japones (o Shogi). Todas esas cosas buenas se perderán como lagrimas en el mar de mierda. En serio es un cambio brutal. Y también en la pestaña de Categorías también te limpia de tarjetas de categorías de mierda y juegos de mierda.

Un par de screenshots o capturas de pantalla del antes y después (ojo que son echas por la mañana en diario en España, porque en España cuando hay mucho jaleo y emisiones es por la tarde noche.

Y como es la página sin plugin o desactivado (OJO A LA CANTIDAD DE MIERDA):

Ahí esta el insolirario de elmorenus y una twitchera famosa que lame y besa orejas de plástico.

Para volver a sufrir en twitch en el icono de arriba de la barrita te sale un menú pues tan simple con darle al botón de deshabilitar:

¿Y como se saca la lejía para limpiar de mierda twitch?

Pues tan simple como según vas navegando darle al botón de la X que te aparece sobre las tarjetas de canales o categorias/juegos, y en etiquetas pero ojo abajo de la tarjeta del video que se ilumina en morado, la de arriba del buscador no esa es para quitar la etiqueta en el filtrado.

Aquí si es para eliminar mierda etiquetada con esa etiqueta:

Es curioso porque una vez aplicado Unwanted Twitch el twitch parece como sintonizaras La2 y vieras cosas interesantes…y eso que me queda mucha mierda que quitar y nueva mierda que aparece para eliminar.

El botón de Gestionar Lista Negra que esta en el menú que te lanza el icono de arriba de la extensión, te abre una pestaña interna de la extensión donde viene la lista de mierdas que limpias organizadas por cajas verticales:

Y en especial os enseño la lista de twitcheros de mierda bloqueados…que da un gustirrinin mandarlos a tomar por culo en el acantilado de no hacerles ni puto caso, no existen ese el castigo como un castillo (salvo en esta lista):

De momento solo hay 14 desgraciaos/as, los que han ido apareciendo delante de mi mirilla de francotirador, ya irán apareciendo mas, que me ha recordado buen temazo de DefConDos la de Blanco Perfecto.

Y a parte de la salud mental que te da este plugin para navegadores, ayuda a la sociedad, porque si no los ves a los twitcheros insolidarios de mierda que no pagan impuestos en España, pues ganaran menos dinero de la publicidad y menos impacto entre la gente porque no hablaran de ellos cuando vayas con el vecino desconocido en el ascensor. No sería gracioso ver en el burriquin o el WC Donalds ver detrás del mostrador a un twitchero andorrano volviendo a ser clase trabajadora preguntándote si quieres ketchup en la patatas.

xj: herramienta para traducir html (no muy pocho) a json

De casualidad en algún portal de estos de noticias (no se si newsycombinator u otro) he encontrado el proyecto xj que convierte cualquier html a json.

Me parece muy útil cuando lo conjugas con jq para parsear el html y sacarle algún dato sin tener que tirar de xpath o inventos similares.

Aunque en el este awesomelist en github listan muchas alternativas: https://github.com/dbohdan/structured-text-tools

Después de instalado es bastante sencillo de usar:

$ echo "<html><head><title>prueba 1</title></head><body style='background: red;'><h1>TITULO</h1><p>aaa <b>bbb</b> ccc</p><p>ddd</p></body></html>" | xj | jq '.html[] | select(.body) | .[] | .[] | select(.h1) | .[] | .[0]' -r

TITULO

Odio Postman: Alternativas en software libre (de verdad) al asqueroso Postman

¿Por qué odio Postman?

  • Porque no es software libre de verdad. Nada mas abrirlo te pide registrate en su servicio online, si no viene capado de serie. Hay otros proyectos de software libre como NextCloud que te dan la alternativa de usar «su nube» o no, pero estos no, son rollo JetBrains de repartir droga a la puerta del colegio en busca de nuevos jonkis.
  •  Bloadware, ya sabéis y no lo sabéis ahora os lo digo, soy fan de la filosofía kiss y suckless. Y el puñetero Postman es un bicho de casi 200 mb (porque tiene Electron dentro) para un interfaz incomible.
  • No es fácil de usar. ¿Cómo se hace para meter un JWT de forma fácil y automática? Supongo que tendrá algo parecido a pipelines pero no lo he encontrado. Y lo peor, te obliga (porque es Electron) a usar javascript si quieres scriptarlo.

Alternativas CLI a Postman

Dicho esto, que soluciones tenemos para jugar con API RESTFul y cositas en swagger en GNU/Linux. Ya sabéis, es lo que toca cuando eres fullstack engineer o un doctor brown.

OJO aviso (para evitar sustos): La lista de alternativas son CLI por que, digan lo que digan con un –help y autocompletado (usa tu amiga la tecla tabulador) cualquier herramienta CLI le da mil vueltas en facilidad a cualquier herramienta de botoncitos y dando vueltas con el ratoncito, además menos es mas, y cuanto menos CPU, RAM y disco duro te consuma la herramiento mejor.

  • Curl : el viejo y confiable curl te saca de un aprieto como netcat  o telnet sin pedirte nada a cambio, es que son un primor.
    • (ventaja/pro) viene en todas las distribuciones de GNU/Linux de base sin instalar nada y en casi todos los lenguajes de script python, etc. Entonces es un estándar.
    • (desventaja/contra) es un caos los parámetros…aunque cuando te haces un par de snippets o recetas con los que mas usas, vives feliz…el problema cuando quieres hacer algo raro. Truco: Firefox o Chromium si no conoces el panel de depuración web…ya estas tardando, porque en la pestaña de «network» puedes ver las llamadas al API y copiar/guardar «as Curl».
  • HTTPie : Le tengo mucho cariño a esta herramienta porque con cuatro lineas de bash puedes hacer cualquier cosa contra un API.
    • (ventaja/pro) es muy muy fácil de usar, la descripción del proyecto es «CLI, cURL-like tool for humans».
    • (desventaja/contra) bueno para algunos es que «es python» pero bueno estreñidos hay por el mundo además en Debian hay paquete httpie y si hay paquete en Debian es un estándar y punto.
  • HTTP Prompt: Es un subproyecto de la gente de HTTPie, la pena es no le dan muchos mimos a este proyecto y tiene fallos, pero es super curioso como plantea el API como si fuera un árbol de directorios.
    • (ventaja/pro) es muy fácil de usar y puede comerse el «spec» del API para autogenerar el CLI.
    • (desventaja/contra) esta un pelín verde y tiene fallos.

Como usar HTTPie

Primero hay que instalarlo, puedes o desde pip :

$ sudo pip3 install -U httpie

O desde (si es Debian o alguna derivada como Ubuntu o Linux Mint):

$ sudo apt install httpie

Hay un plugin muy interesante para soportar jwt que mas o menos es un estándar de login y mantenter sesión para comunicarse con APIs aunque hay plugins para mas estándares como Oauth2 y así. Para instalarlo, este si es necesario de momento pip porque no esta empaquetado en Debian:

$ sudo pip3 install -U httpie-jwt-auth

Aunque en algún ejemplo siguiente te enseñare que casi no es necesario mas que para ahorrase unas lineas en bash.

Por cierto la combinación httpie + jq es mucho mejor que el melón con jamón. Si no conoces jq ya estas tardando porque es el como un grep hipervitaminado de los json.

la sintaxis de httpie es:

http <verbo POST|PUT|GET> <url_endpoint> <parámetros header|get|post> <opciones_httpie>

Ejemplos con HTTPie

Usando como base publicapis.org que es un proyecto muy interesante que guarda y lista APIs públicas de muchos tipos.

Vamos a poner un par de ejemplos reales:

Sacar las categorías de publicapis

Tan simple como lanzarle un get a la enpoint de categorías

$ http get https://api.publicapis.org/categories
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Content-Length: 716
Content-Type: application/json
Date: Sun, 17 Oct 2021 21:22:49 GMT
Server: Caddy
X-Rate-Limit-Duration: 1
X-Rate-Limit-Limit: 10.00
X-Rate-Limit-Request-Forwarded-For: 89.219.91.239
X-Rate-Limit-Request-Remote-Addr: 172.17.0.1:49224

[
    "Animals",
    "Anime",
    "Anti-Malware",
    "Art & Design",
    "Authentication",
    "Blockchain",
    "Books",
    "Business",
    "Calendar",
    "Cloud Storage & File Sharing",
    "Continuous Integration",
    "Cryptocurrency",
    "Currency Exchange",
    "Data Validation",
    "Development",
    "Dictionaries",
    "Documents & Productivity",
    "Entertainment",
    "Environment",
    "Events",
    "Finance",
    "Food & Drink",
    "Games & Comics",
    "Geocoding",
    "Government",
    "Health",
    "Jobs",
    "Machine Learning",
    "Music",
    "News",
    "Open Data",
    "Open Source Projects",
    "Patent",
    "Personality",
    "Phone",
    "Photography",
    "Science & Math",
    "Security",
    "Shopping",
    "Social",
    "Sports & Fitness",
    "Test Data",
    "Text Analysis",
    "Tracking",
    "Transportation",
    "URL Shorteners",
    "Vehicle",
    "Video",
    "Weather"
]

Y por ejemplo usando jq para sacar la lista de API relacionados con la música los parámetros get se ponen como == :

$ http https://api.publicapis.org/entries category=="Music" | jq ".count"
31

Guardar el json de los API relacionados con la música

$ http https://api.publicapis.org/entries category=="Music" > /tmp/music.json

Y revisando el listado me fije que teniamos a mi querido jamendo pero también se puede filtrar con ayuda de jq la entrada de este proyecto de música libre:

$ http https://api.publicapis.org/entries category=="Music" | jq '.entries | .[] | select(.API=="Jamendo")'

Y para hacer un post de un formulario los parámetros se separan con = , la gente de httpie tiene un api simple para hacer pruebas:

$ http --form POST pie.dev/post name='John Smith'
HTTP/1.1 200 OK
CF-Cache-Status: DYNAMIC
CF-RAY: 69fd13e64d786611-MAD
Connection: keep-alive
Content-Encoding: gzip
Content-Type: application/json
Date: Sun, 17 Oct 2021 22:49:01 GMT
NEL: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
Report-To: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=FhO29LNgr1Dn0bY%2FDOESxrq5o%2BR5tePJpkCOElIS0asl4hDNC6uhN%2F8EYa4NU37kSUEqfMrHvKt6OMJh4s4rZ4BCSPQawxVVpT%2FQ0Q1KJAfq%2FcIG0yn01Zop"}],"group":"cf-nel","max_age":604800}
Server: cloudflare
Transfer-Encoding: chunked
access-control-allow-credentials: true
access-control-allow-origin: *
alt-svc: h3=":443"; ma=86400, h3-29=":443"; ma=86400, h3-28=":443"; ma=86400, h3-27=":443"; ma=86400

{
    "args": {},
    "data": "",
    "files": {},
    "form": {
        "name": "John Smith"
    },
    "headers": {
        "Accept": "*/*",
        "Accept-Encoding": "gzip",
        "Cdn-Loop": "cloudflare",
        "Cf-Connecting-Ip": "87.219.94.239",
        "Cf-Ipcountry": "ES",
        "Cf-Ray": "69fd13e64d786611-FRA",
        "Cf-Visitor": "{\"scheme\":\"http\"}",
        "Connection": "Keep-Alive",
        "Content-Length": "15",
        "Content-Type": "application/x-www-form-urlencoded; charset=utf-8",
        "Host": "pie.dev",
        "User-Agent": "HTTPie/2.6.0"
    },
    "json": null,
    "origin": "87.219.94.239",
    "url": "http://pie.dev/post"
}

Hacer un post de un json a un API, yo lo hago en dos partes para trabajar tranquilamente en el terminal:

$ json="{\"name\": \"pepito\", \"description\": \"El pinocho.\", \"color\": \"shitbrown\"}"
$ echo "$json" | http POST http://127.0.0.1:8080/api/v1/prueba

Y subir un fichero es tan simple (en comparación con curl) como, donde fichero es nombre del parámetro de fichero:

$ http POST "http://127.0.0.1:8080/api/v1/uploads/" fichero@"file.png"

Si necesitas cookies o guardar algún tipo de sesión, lo puedes hacer como por ejemplo:

$ http --session=/tmp/caca.json POST http://127.0.0.1:8080/api/v1/auth

Y después el típico jwt lo puedes hacer a mano con por ejemplo:

user="usuario"
password="mi voz es mi pasaporte, verifícame"

$ passhash=$(echo -n "$password" | sha256sum | cut -d" " -f1)
$ jwt=$(echo "{ \"username\": \"$user\", \"password\": \"$passhash\" }" | http POST http://127.0.0.1:8080/api/v1/auth | jq .token -r)

En este ejemplo ya con ayuda de jq he metido en la variable $jwt el token para usarlo por ejemplo en las siguientes llamadas:

$ http GET http://127.0.0.1:8080/api/v1/caballos Authorization:"Bearer $jwt"

El parámetro Authorization es un parametro del header que le mandamos, httpie lo detecta por el : .

Y ahí le metemos tal cual dice el estandár de jwt el token de autorización.

Pero también se puede hacer con el plúgin httpie-jwt-auth mas sencillo y con menos lineas:

$ http GET http://127.0.0.1:8080/api/v1/caballos --auth-type=jwt --auth="$jwt"

O metiendo la variable como variable de entorno

$ export JWT_AUTH_TOKEN=$jwt
$ http GET http://127.0.0.1:8080/api/v1/caballos --auth-type=jwt

Y los script en bash es que son tan legibles con httpie, porque empiezas con un login y después con la ristra de acciones que tienes que ir haciendo.

Un touch pero que también me cree todo el path

Es de esas cosas tontas que haces con dos comandos primero un:

$ mkdir -p <path>

Y después un:

$ touch <fichero>

Pero se puede hacer del tirón como:

$ install -D /dev/null /home/md/.config/nvim/init.vim

Donde -D es para hacer que cree todo el path. Y el /dev/null para que copie el fichero mágico de los Unix y los GNU/Linux de tamaño 0.

Lo encontré buscando como crear el init.vim para neovim de un tirón en: mkdir -p for files

Neovim pre 0.5 LSP o como mandar a tomar por culo a los cabrones de JetBrains

Me gustaría decirlo para Vim fue mi primer amor, no acabamos de entendernos pero nos queríamos mucho, paso el tiempo y nos separamos, pero me quise en serio y después descubrí NVim o NeoVim y en ese estoy…de casualidad coincidió con la famosa versión 0.5 …pero claro como buen usuario perro viejo, no voy navegando la cresta de la ola porque no me gusta darme la hostia y por ejemplo en Debian Testing la versión de neovim es:

$ apt list neovim
Listing... Done
neovim/testing 0.4.4-1 amd64

Y con eso me remangue las manos y  a base de muchos cabezazos le metí soporte de LSP.

«¿Pero…qué es LSP Miguel?»

LSP con mucha mucha desgracia es un puto invento de Micro$oft, aunque no lo parece, pero porque funciona bien, y es un protocolo basado en JSON RPC en plan anillo único, porque intenta estar entre medias de los editores y los «programas que ayudan a programar».

Normalmente los IDE son monolíticos y vienen todo metido, y este invento separa el IDE por un lado, entre medias el LSP y por el otro el servidor de lenguaje. Y esto ayuda a que se puedan hacer potentes servidores de lenguaje (como la gente de Rust) y no hacer un invento para cada IDE. Es muy disruptivo porque ya no sería necesario usar IDE piticlin para programar en algún lenguaje asqueroso de esos que es verboso y con mas capas de de lasaña..porque la gente hace las cosas tan difíciles adrede….

Por cierto hablando de IDEs, hay mucho desgraciado (he conocido mucho con portátil de manzanita) que no sabe mergear un branch de git a mano sin un IDE de jetbrains, y es una pena que gente así sea tan dependiente de la magia de un IDE y lo peor que sean tan arrogantes cuando no son nadie sin la magia que no viene de sus propias manos.

«¿Pero…cómo Miguel?»

  • Instalar nvim por ejemplo:
    $ sudo apt install neovim
  • Instalar un gestor de paquetes para vim/neovim (si hijo si, hasta los platanos van a tener gestores de paquetes…bueno en este caso es útil), hay varios famosos, yo elegí vim-plug (no recuerdo porque) pero en la sección de Install vim-plug neovim tienes la linea de código de curl para instalarlo, que básicamente es ponerlo en los scripts autoload de neovim.
  • Editar el fichero init.vim, ojo que no esta de creado por defecto puedes probar su existencia con el comando :checkhealth  …una vez que tengas el fichero de configuración de neovim, añadir los siguientes plugins en el bloque de plugins de plug, te quedará mas o menos que así:
    "PLUGINS
    call plug#begin()
    <otros_plugins_tuyos>
    Plug 'autozimu/LanguageClient-neovim', {
    \ 'branch': 'next',
    \ 'do': 'bash install.sh',
    \ }
    Plug 'ncm2/ncm2'
    Plug 'roxma/nvim-yarp'
    <otros_plugins_de_tu_perro>
    call plug#end()
  • Explicación de los plugins:
    • autozimu/LanguageClient-neovim: es el plugin (escrito en Rust) que te da soporte para LSP para versiones pre 0.5 de neovim, creo que hay mas plugins…no recuerdo porque riguroso estudio elegí este plugin frente a otros, creo que porque era el mas optimizado (había otro en python y la gente se quejaba de que comia mucha memoria e iba muy lento, pero este al ser rust…).
    • ncm2/ncm2: este plugin complementa al anterior porque aunque ya tienes LSP solo con el anterior…oye un poco de ayuda visual con popups y mensajes en colorines ayuda mucho, este te lo da.
    • roxma/nvim-yarp: plugin  necesario para ncm2, le da soporte para que el otro haga llamadas remotas.
  • Una vez añadidos, y recargada la configuración (ahora no recuerdo el comando) o reiniciado el neovim, los instalas con:
    :PlugInstall
  • Y ahora te falta ir instalando los servidores de lenguaje, uno a uno, cada uno tiene su forma, te pongo un par, puedes encontrar una lista de lenguajes y proyectos de servidor de lenguajes en https://langserver.org/ pero te pongo los mios:
  • Y después los configure en el init.vim así:
    let g:LanguageClient_serverCommands = {
    \ 'python': ['/usr/local/bin/pylsp'],
    \ 'rust': ['rls'],
    \ 'javascript': ['typescript-language-server', '--stdio'],
    \ 'typescript': ['typescript-language-server', '--stdio'],
    \ 'javascript.jsx': ['typescript-language-server', '--stdio'],
    \ 'typescript.tsx': ['typescript-language-server', '--stdio'],
    \ }
  • También añadí las lineas estas de configuración necesarias para mejorar el funcionamiento de ncm2:» enable ncm2 for all buffers
    autocmd BufEnter * call ncm2#enable_for_buffer()
    » enter inserts newline when completion window is open
    inoremap <expr> <CR> (pumvisible() ? «\<c-y>\<cr>» : «\<CR>»)

    » tab completion
    inoremap <expr> <Tab> pumvisible() ? «\<C-n>» : «\<Tab>»
    inoremap <expr> <S-Tab> pumvisible() ? «\<C-p>» : «\<S-Tab>»

    » IMPORTANT: :help Ncm2PopupOpen for more information
    set completeopt=noinsert,menuone,noselect

  •  Y ya esta.

Tienes funcionalidades iguales a los asquerosos IDEs de JetBrains ocupando megas de memoría frente a Gigas de memoria y kilos de falsedad e hipocresía porque son de los mejores ejemplos de droga a la puerta del colegio porque van del rollo open source cuando su core es privativo y asqueroso para enganchar a los desprevinidos infantes a la siguiente dosis de su droga.

Nota final: Puede que este mintutorial te valga para vim pero no lo he probado. Para 0.5 nvim, ya trae soporte, pero todavía no he tenido el momento de ponerme a probarlo. Y como siempre agradecer a Victorhck por sus tutoriales de vim/neovim que tanto me han ayudado.

Mindustry, mod para tener trucos y cheats

Mindustry es de esas joyas que hay en el software libre, es un videojuego espectacular de estrategia, del subgénero tower defense pero tiene su salsa para no ser un aburrido juego de esos que había en flash.

Originalmente el juego era un demake , si no conoces la palabra es un remake (si no conoces esta, un homenaje o copia del original) pero o para una consola vieja retro, o es actual quitando cosas pero guardando el espíritu y la jugabilidad, pues Mindustry era al principio un demake del Factorio, pero con cada nueva versión nueva mas y mas cosas han cambiado y es un juego muy muy diferente al Factorio pero con cosas en común.

Pues con la salida de la versión 6 con su modo campaña con el famoso planeta divido en hexágonos, vino la dificultad, en serio que he estado semanas (y diría que meses) peleando, buscando y pensando como ganar el modo campaña.

Y me cansé, porque los territorios conquistados que tenías cerca de territorios con base enemiga (sobre todo en el polo norte de ese planeta) eran cada dos por tres atacados, e intentar entrar a esas bases enemigas era misión suicida, centenares de intentos, pero es que las plataformas de lanzamiento son muy lentas para abastecer la maquinaria de guerra cuando estas metido en un fregado de estos, lo he intentado en serio y he sufrido una amarga derrota, una y otra vez.

Y como me cansé, empece a buscar trucos para Mindustry….y por desgracia no hay….pero hay mod (un mod es un parche o script q para activar cheats.

CheatMod

Para instalarlo es tan simple como abrir en el menú de la derecha la sección de Mods .

Y después hay que hacer click en el botón de Importar mod .

Te saldrá otro menú, clicka en el botón Importar Mod de Github.

Te sale una cajita de texto que tienes que copiar y pegar o escribir paulieg626/Cheat que es la dirección del mod en github.

Le clickas en OK y te saldrá la siguiente pantalla con el icono del gatete:

Y pulsas en el botón de Atrás y te dirá que tienes que reiniciar el juego para que se active el mod de los trucos.

Y cuando activas, el título cambiara diciendo que ya tienes los trucos activados:

¿Qué te da este mod?

Pues te da un buen puñado de cosas para construir entre las destacadas:

  • Killing turret: una torreta de coste gratis, con un alcance espectacular una velocidad de tiro exageada y cuando finaliza la trayectoria la bala explota en fragmentos y estas al final también en fragmentos llenando la pantalla de mortiferos fragmentos…ojo que puede ralentizar tu ordenador.
  • Item source: un pozo de los deseos por 0 euros, de ahí salen todos los elementos que elijas hasta el infinito, ya podía haber uno de dinero en la vida real para dejar de tener que pagar un alquiler por un piso para vivir a los asquerosos parásitos de los caseros.
  • Liquid source: igual que item source pero para todos los líquidos que tiene el juego, petroleo, agua, liquido criogénico, magma…vamos una fuente infinita exactamente como dicen la palabra.
  • Energy source: otro edificio espectacular y al igual que los anteriores es una fuente infinita de energía…como las pilas de aquel conejo de juguete de los ochenta.
  • Super protection: no no es un condón para tener sexo con una niña pija del territorio cacerolo, cayetano o simplemente pijofacha. Es un escudo gigante e imposible de romper que se despliega cubriendo una gran superficie de donde pongas el edificio, y sin gastar energía y a coste gratis.
  • Filler: es un edificio que al construirlo, automáticamente en tu contador de minerales y otros elementos se ponen todos 900 millones. Para hacerlo funcionar otra vez, tienes que volver a construirlo.
  • Magic workbench: y por último (hay mas edificios pero para mi estos son los destacados) este edificio que te permite desplegar cualquier unidad y casi cualquier cantidad (tiene un limite de unidades el juego y si lo superas explotan según salen) que te da el juego, ver meganaves disparar rayos en las Puerta de Tannhäuser eso nunca se perderá en tu recuerdo.

    Cuando la tienes construida, al hacer click en este edificio con diana azul, te sale el menú que pongo en la captura de pantalla.

    Te salen las unidades organizadas de menor nivel a mayor (de izquierda a derecha) y agrupadas por tipos, haz click todas las veces que quieras en cada una (es decir si pulsas 5 veces en la araña robótica gigante de último nivel y después 2 al soldado raso, te aparecerán esas unidades), y si después le das al botón de play aparecen al en donde este el cuadrado rojo, Con las flechas mueves el cuadrado rojo. La calavera explota todas tus unidades. Y cada vez que le des al play tienes que darle otra vez repetidos clicks a las unidades que quieres que salgan antes de volver a darle al play, si no no sale nada.

Y hasta ahí el mod para tener trucos en el Mindustry. Pero OJO «un gran poder lleva una gran responsabilidad.» Y te recomiendo no usar trucos hasta que no estés hasta los huevos, porque es la manera mas triste de romper un juego y yo ya he roto así muchos juegos en el pasado, no porque dejen de funcionar si no porque ya no me apetecía jugarlos.

Probando los temas de plantuml con un par de lineas de bash

Seguro que se puede hacer mejor, pero bueno me ha funcionado.

No sabia que PlantUML ahora han metido un themes. Y para probarlos he tirado 4 lineas en bash y parece que ha salido.

Me he creado este fichero en /tmp/caca.puml :

@startuml
!theme spacelab

skinparam backgroundColor #7f7f7f

Pepito <- DonJose : Hola Don Pepito
Pepito -> DonJose : Hola Don Jose
Pepito <- DonJose : ¿Paso ayer por mi casa?
Pepito -> DonJose : Por su casa yo pasé
@enduml

Esta puesto adrede después de !theme spacelab el skinparam para poner en gris el fondo para machacar la configuración del theme.

Y después creo un directorio /tmp/resultados/ .

Y finalmente otro fichero donde saco los themes disponibles en plantuml /tmp/list_themes.puml :

@startuml
help themes
@enduml

Y convierto ese help a un txt (que es en plan asciiart):

java -jar plantuml.jar /tmp/list_themes.puml -ttxt

Y el churro en una linea:

line=$(cat /tmp/list_themes.atxt | tr -d " " | grep -Ev "^$" | grep "Thepossiblethemesare:" -n | cut -d: -f1); for theme in $(cat /tmp/list_themes.atxt | tr -d " " | grep -Ev "^$" | tail +$(( $line + 1 ))); do echo "$theme"; cat /tmp/caca.puml | sed -e "s/spacelab/$theme/" | java -jar plantuml.jar -pipe -tpng > /tmp/resultados/caca.$theme.png ; done

Y la explicación:

  • $line se saca de hacerle un cat al fichero de la lista de themes como asciiart, quitarle todos los espacios en blanco (porque por suerte todos los themes son sin espacios en blanco), con grep inverso ( -v) y regex (con -E) quito las lineas en blanco. Y de esto lo pipeo para sacar el número linea de donde empieza los themes buscando la frase apiñada (sin espacios en blanco) «Thepossiblethemesare» y le saco el campo con cut.
  • Después  tiro un bucle for del cual chupo de (suerte otra vez que no tiene espacios en blanco porque si no tendría que tirar de IFS) casi completa la anterior churro para sacar $line, salvo el grep final que lo cambio por un tail para sacar a partir de la linea N.
    • Y en cada iteración tengo el $theme que le hago una sustitución en vivo al fichero de template de hola don pepito y voy creando fichero a fichero de cada theme finalizando el nombre con .theme.png .

Y subo un puñado de ficheros generados: