Archivo de la categoría: Tecnología

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.

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:

Volviendo a intentar aprender bien bien Vim

Es de esas cosas recurrentes que me vienen para sentirme realizado, programar en ensamblador en Z80, aprender a usar bien bien Vim.

Y en eso vuelvo, a ver yo creo que ya cualquier hijo de vecino sabe el :q! , :w , :wq , el rollo de buscar con / y n y shift+n. Y ya para coronar el famoso :set number y :set nonumber. Lo que no trago es el tema de usar h j k l para moverme pero bueno. Pero me pierdo cuando me aparecen varios paneles en la pantalla al final tiro de :q

Y claro pues si te apañas y tal, pero después vas a un editor de código come ram y peor privativo, o vas a algo mas liviano como mi querido Geany y dices como hago el autocompletado de estos como poco primero. Pues a ver ya esta ya te sientes inútil con Vim.

Pero es que he visto gente (me gustaría poner el nombre pero tendría que preguntarle) muy buena usando el Vim como verdadero y único editor, y flipás sin gastar RAM y CPU a lo tonto (y si me apuras sin gastar píxeles de pantalla a lo tonto) y sin dar paseos al ratón por la mesa, sin levantar las manos del teclado.

¿Y que hacemos con neovim? Pues de momento me esta llamando mucho la atención, el tema asíncrono y que le da un poco de vida al Vim.

Me falta entender y encontrar un buen gestor de paquetes y saber cuales son «los paquetes» estándar…si el rollito este que se sufre estos años con NPM o Pip, mucho nos reíamos de las guerras de editores de texto, pero al menos no era una peli de chinos donde salen un motón a la vez se pegan rápido rápido y no sabes a que caballo ganador apostar tu tiempo en aprenderlo. Por cierto no hay un único gestor de paquetes, ya el retorticimiento de lo torcido…pero bueno ahí esta Python con los miles de inventos…o js con npm y yarn.

Así que en esa estamos, y gracias a victorhck que esta haciendo mucha labor educativa y desde aquí se lo agradezco (aunque cuando lo conocí físicamente en las jornadas hacker de la EKO estuve un poco apagado…lo siento) y os pego links de su labor:

Después he encontrado cosas como:

  • VimAwesome: un listado de los paquetes de vim (no se si estarán todos pero eso parece) con un buscador y una ficha muy visual y estética.
  • Neovim en la wiki de archlinux: nunca he usado esa distribución pero todos amamos su documentación que nos ha sacado de muchos problemas.

Y de el señor Santos Gallegos el cual no tengo el placer de conocerle y que creo que será difícil porque esta del otro lado del charco:

Después la persona que no puedo nombrar (respeto su privacidad) me mando hablando de este tema estos días un dotfile (es curioso, la gente comparte su fichero de configuración orgullosamente por internet) que supuestamente es el principio y el fin de todo lo que necesitarías, os lo pego pero yo voy en plan rollo minimalista y poco a poco ir metiendo cosas en la configuración y entendiendo porque, pero bueno lo pongo el link The Ultimate vimrc .

Perdón añado uno que se me olvido: awesome-neovim.

Actualización:

Se me olvido también los tutoriales de Santiago Romero que leí hace años y que siguen online:

En busca de la mejor librería de TUI para Python

Los TUIs son algo que mola mucho porque ademas que queda muy hacker realizar cosas con ellos, te permiten interactuar con servidores por ssh de forma cómoda, y sobre todo aprovechando los pantallones que tenemos ahora, permite tener dashboard muy completos y cómodos como lazy_docker.

Si bien hay soporte nativo para ncurses, el rollo es que tienes que hacerte todo a mano.

Yo tenia mis esperanzas puestas en Urwid (incluso me he metido a arreglarles un bug hace meses) pero lamentablemente, puede que suene muy superficial, pero los botones son muy feos (por defecto, se les puede mejorar tirando código python) y no hacen efecto de click (esto no he encontrado nada).

Después he encontrado las librerías:

Las que me llaman mas la atención es picotui y blessed.

Ya os iré contando.

¿Porque no existe un text-overflow: scale en CSS?

Si has picado código o diseñado páginas web, seguro que te ha pasado mas de una vez que un texto se desborda por la izquierda o por abajo.

Pues parece que ha mas gente le molesta eso y han pedido en el foro de la Web Incubator CG con el título de Auto-sizing text to fit container.

Mas o menos en el dialogo, han dicho una posible solución que debería añadirse a CSS y es un valor mas a text-overflow para que escale el texto y además añadir un max-font-size y un min-font-size para controlar los limites (o los treshold como dice un conocido que mete esa palabra en toda conversación…cualquier día va al burguer y pide un treshold con patatas fritas).

La pena es que los estándares en la W3C van lentos aparecer y lentos de aplicar en los navegadores.

Convenciones de nombres en programación

Es de ser bien nacido ser agradecido y he encontrado un articulo en adrianalonso.es : Convención de nombres: desde el CamelCase hasta el kebab-case .

Me ha encantado, porque estaba leyendo una documentación sobre las API RestFul y leí kebab case….me quede todo loco, conocía la CamelCase y la snake_case pero kebab-case y en la primera búsqueda que me salio el blog de este hombre que no conozco pero que esta muy bien explicado cada tipo de forma de escribir los palabros para las variables.

FZF: El buscador fuzzy para gnu/linux

Puede que sea ya agua pasada o no este de moda, pero para quitarme jaquecas al buscar en el historial de comandos porque muchas recuerdo el comando por el medio y no se como empezaba y además «el buscador clásico» solo ofrece una alternativa a la vista.

Pues recordé el famoso fuzzy search (que por desgracia lo use en el asqueroso pycharm, mierda puta para hacer desarrolladores blandengues y dependientes de software privativo) y recordé que había fzf (picado en go pero bueno dicen que hay alternativa en rust).

Encontré este genial articulo de un tal Alejandro Amaral sobre el fzf con el título de: FZF – EL buscador *nix.

Al que añado mi salsa personal:

  • para instalarlo, por suerte ya esta en casi todas las distribuciones de forma oficial, por ejemplo en debian es:
    $ apt install fzf
  • Después yo de momento he metido solo lo de los «atajos de teclado» y no lo del ** o lo de kill desde fzf.
    • ctrl+r: te sale el fzf buscando en el history de comandos
    • ctrl+t: mientras estas escribiendo un comando te sale el fzf buscador desde el directorio que estas y buscas y te lo pone como path del comando.
    • Para instalarlo se da acceso al script en el .bashrc de tu usuario, yo lo tengo en el final casi:
      #fzf
      
      source /usr/share/doc/fzf/examples/key-bindings.bash
  • Si lanzas el fzf a mano, te sale un buscador de solo los ficheros desde el path que estas ahora mismo en la shell.
  • Y después trucos:
    • Para buscar en otro path e incluso mas cosas que ficheros es:
      $ find /tmp 2>/dev/null | fzf
    • Y para usar el fzf en otro comando es:
      cd $(find / 2>/dev/null | fzf)

Y eso es fzf, no se si quema mas CPU y o RAM frente a «los buscadores clásicos» pero ayuda bastante sobre todo cuando te acuerdas de cosas de enmedio de lo que buscas.

Estrellitas, mis proyectos favoritos en github (Parte 22)

Continuación con la lista de Estrellitas, mis proyectos favoritos en github (Parte 21) .

Los dos patitos, ya he llegado a la parte de la lista de mis proyectos favoritos en github que les he dado una estrellita. Veo el final pero no se si sera este.

Adelante lista:

  • PepperTown: un videojuego tipo idle game o clicker basado en el mundo de Pepper & Carrot, una tira cómica de una bruja y un gato que es cultura libre y que esta creciendo un mundo a su alrededor de contenido multimedia y juegos. Cosa que es muy importante para luchar en la actualidad contra Di$n€y, tener un lore libre que pueda ser fuente de muchas obras libres.
  • atlas: un programa que muestra un mundo en 3D bastante realista usando el algoritmo «perlin noise terrain generator» en C y con OpenGL, no es muy suckless o compatible hacia atrás porque mete shaders pero bueno.
  • cardiac: implementación en python de una chuleta en papel (con partes móviles) de como funciona una CPU hecha por Bell Laboratories en 1969. Muy curioso. Os dejo un vídeo:

  • brew: si ya teniamos jaleo con estos sistemas de paquetes para usuarios sin root (flatpak, snap, appimage…) otro mas y encima viene de la asquerosa manzanita los famoso homebrew, porque en MacOS no te deja instalar nada fuera de su tienda y tienes que hacer el invento este de meter un sistema de paquetes. Ha cogido tanta fama que ya hay aplicaciones que tienen versión para homebrew, pero por suerte hay versión del sistema de paquetes para GNU/Linux.
  • 90-Second-Portraits: gracias a Nascii Boy porque recordame este genial videojuego programado en Löve, lo jugué hace mucho mucho tiempo y se me olvido, es un juego en que tienes que haces de un pintor callejero y tienes que vender cuadros pintados a toda hostia de la gente.
  • duckmarines: otro genial juego que es un clon libre de Chu Chu Rocket de la mítica Dreamcast. Hecho en Löve. Otro que se me olvido y que me recordo Nascii Boy.
  • Cavez-of-Phear: también recomendación de Nascii Boy, este no lo conocía, una versión libre en terminal del Boulder_Dash (fue el ¿Primer juego de su género o hay otro antes?) que era de ir escavando buscando las gemas y evitando que te cayera las piedras.
  • ncurses: un repo de Nascii Boy donde recopila juegos propios y de otras personas hechos para terminal.
  • mario-shellscript: demake en ascii y en terminal mario bros 1 de la nes de 8 bits. Y alucina pepinillos escrito en lenguaje de script Bash. Recomendación de Nascii Boy.
  • tira-ecol: un backup de la tira de ecol, una mítica tira cómica del mundo del GNU/Linux y software libre en la comunidad hispana. Recuerdo otra muy famosa que despareció el autor sin dejar rastro la de «Raulito el friki».
  • FreeBoardGames.org: una plataforma software libre para jugar a juegos mesa en navegador. Un proyecto espectacular.
  • thinktank: un juego de mesa libre para navegador hecho para la anterior plataforma.
  • boardgame.io: el proyecto madre donde nació freeboardgames, todavía esta ahí, no se si es donde se desarrolla todo el tema de programación.
  • opentyrian: la versión libre del videojuego matarmacianitos Tyrian, que originalmente estaba en Pascal y fue pasado a C. Es muy curioso el juego porque tiene un toque de rol, al usar el dinero en el juego para comprar mejoras a la nave.
  • civ-clicker: repositorio que rescata o resucita de la muerte un proyecto libre que estaba en sourceforge…pero que también esta muerto desde el 2017. Para mi pertenece al panteón de los mejores juegos de idle game o clicker game, en este simulas el auge de una civilización. Esta programado muy simple con js. Y mola mucho ponerle nombres tontos a las cosas, como la construcción de mi maravilla que se llama «La polla».

Bueno, bueno hemos llegado al final de la lista, han pasado semanas con 22 artículos para recorrer mi lista personal de favoritos…que seguirá creciendo. Quiero saber vuestra opinión:

  • ¿Os ha gustado?
  • ¿Algún proyecto que recomendar de github?

Gracias por aguantarme hasta el final de la lista.

Estrellitas, mis proyectos favoritos en github (Parte 21)

Continuación con la lista de Estrellitas, mis proyectos favoritos en github (Parte 20) .

Estamos cerquita cerquita de el final de esta serie de artículos episodicos sobre los proyectos favoritos que tengo en el github y les he dado una estrellita, y en esta serie de artículos están ordenados según lo vieja que es la estrellita. Bueno adelante lista:

  • BYTEPATH: un matamarcianitos (Shoot ‘em up como diría aquel becario que nos dijo plazformer…coño plataformas) que me han recomendado y que todavía no he probado, esta hecho en uno de mis amores el pasado, Löve un engine de videojuegos que se programan en Lua.
  • shapez.io: me encanta este juego, aunque esta mal programado, quema CPU para lo que es. Ya veis que estamos cerca de las estrellas mas nuevas.Bueno pues este juego es un deconstrucción de un juego, que a su vez este es una deconstrucción de otro juego.

    El juego origen es un juego privativo indie pero muy bueno, que se llama Factorio, es genial salvo por el tema de los cables eléctricos que queda todo muy enguarrado (y hace poco ya sacaron la versión 1 y sigue igual) a mi me ponía de los nervios ver los cables por ahí tirados (debe ser que tengo toc). El Factorio es un tower defense con un sistema de fabricas y crafteo, muy divertido en lineas generales. El argumento es que eres un astronauta humano que te has estazao en un planeta alien y tienes que hacer una fabrica empezando por la edad de piedra para construirte un cohete para pirarte del planeta….pero claro contaminas como un cabrón y eso cabréa a las formas de vida alienígenas que te atacan como ecologistas enfurecidos.

    De este hubo un demake (una palabra que me encanta, porque es un remake en el que se quitan cosas para simplificarlo o por motivos técnicos de meterlo en una videoconsola antigua o por que le dan la gana) pues el demake es Mindustry que ya hemos hablado en la lista de estrellitas en otros episodios u en otro árticulo. Mindustry realmente tiene como 2 épocas, la de demake que eran las primeras versiones y no obstante era genial. Y la 2 época cuando metieron la navecita espacial. En este juego se quedan solo con el tema de tower defense, crafteo e industria. Y lo convierten en uno de los mejores y mas divertidos juegos libres que hay.

    Y después llega shapez.io que todavía deconstruye mas la tortilla de patata y se queda con el tema de crafteo e industria. Es genial y relajante, es como ver un acuario cybernetico que vas montando poco a poco. Y el reto es mejorar lo que ya has diseñado de industria, nadie te dice que estas haciendolo mal, no tienes limite de altura como el tetris o monstruos que te ataquen por hacer mal las cosas, el juego te reta a ti a ser mejor porque el mapa es infinito.

    Como curiosidad, la versión libre es una demo pero esta el juego completo, yo jugué la demo sin modificar el código que me ponía el banner de demo por hacer las cosas bien y al final lo compre y lo disfrute.

  • Nuklear: una librería para hacer guis en C rollo siguiendo la filosofía suckless, otra cosa que tengo pendiente de probar.
  • tui-rs: una librería para hacer interfaces en texto TUI (text user interface) rollo Urwid o ncurses pero para Rust.
  • cursive: otra librería para hacer TUI con Rus un poco mas simple que tui-rs.
  • awesome-rust: una awesome list, o lo vuelvo a explicar (que lo he dicho muchas veces en esta saga de artículos) una lista de cosas o repositorios en github, en este caso de cosas del lenguaje Rust.
  • tarpaulin: un plugin para cargo (el sistema de paquetes y make de Rust) para tener code coverage de los test (porcentaje de código testeado por los test del proyecto), la lastima ohhh lo siento manzanitas hipsters y windowseros vagos….es que Rust es en parte un lenguaje compilado, no hay soporte para estas mierdas de sistemas operativos porque el desarrollador le toca un pie (o que paguen) para hacer la cobertura de código en sus cochambrosos sistemas operativos.
  • OpenLoco: gracias a la ingeniería inversa que se hizo con el OpenRCT2 para liberar el motor del juego, se aprovecho en este proyecto para liberar otro juego del mismo creador pero en vez de parques de atracciones, de empresas de transportes, es la 2º parte espiritual del mítico OpenTTD.
  • BespokeSynth: un sintentizador modular que se usa con programación gráfica de nodos al estilo de nodos de Blender o Godot. Muy muy interesesante.
  • i3-gaps: un fork del sistema de ventanas de tiles mas famoso de GNU/Linux, el I3. En este caso tiene alguna mejora como meter aire entre las ventanas.
  • regolith-desktop: una distribución y proyecto de escritorio de tiles que evoluciona de I3, tiene cosas que pintan muy bien.