Notxor tiene un blog

Defenestrando la vida

En qué ando estos días

Notxor
2021-02-09

Tengo la sensación, quizá subjetiva de que escribo poco en el blog últimamente. Aunque algún que otro artículo he sacado, me parece que podría quizá ser más generoso en mis escritos. Lo cierto es que estoy liado con mis cosas y tengo que contarlo. Así pues, en este artículo, os vais a encontrar un poco de todo: hablaré sobre el blog y su cambio de aspecto, hablaré sobre rust y sobre cómo estoy utilizando Emacs para aprender con algún que otro problemilla que he ido solventando sobre la marcha.

Cambio de aspecto del blog con css

Los cambios recientes en el blog están incompletos, aún me faltan algunas cosas que quiero matizar un poco. Lo fundamental es que he abandonado el diseño de una columna por el de dos y la cabecera aparece ahora a la izquierda con su menú. Lo que me ha costado más ha sido hacerme con un fondo para el blog. No quería simplemente utilizar alguna fotografía de las miles que se pueden encontrar por Internet para fondos web; prefiero algo más personal. Alguno de los antiguos lectores recordarán que hice una animación1 para un tema en Esperanto y he tomado de ahí algunos de los modelos para fabricar el fondo. No es un fondo espectacular, ni profesional, pero al menos es mío.

Trabajar en Emacs para la web

Aprovechando la tesitura de los cambios, ─y puesto que algunos me habéis preguntado cómo me las apaño para levantar un servidor web con el editor─, os cuento cómo lo hago con las pruebas.

En este caso, para toquetear el css y ver cómo van reaccionando los distintos parámetros en la página, sin estropear nada de la actual, lo que hago es copiar algunos ficheros en otro directorio. Me explico:

  1. Tengo copia local del blog para hacer pruebas en el directorio ~/public_html y cuando publico algo, org-static-mode lo guarda ahí. Hago pruebas de visualización en local, corrijo errores y cuando creo que está todo correcto lo subo a su sitio en Internet con FileZilla.
  2. Para no estropear ese directorio y terminar arrastrando demasiada basura al sitio correspondiente lo que hago es copiar algunos directorios y ficheros para las pruebas. Para este caso:
    • ~/public_html/medios, donde se encuentran agrupados css, fuentes, img y js que son las cosas necesarias para el diseño de la página.
    • Algunos ficheros html, como el index.html y los últimos artículos con su estructura de directorios para interactuar un poco en las pruebas.
  3. Todo eso va copiado a un directorio que se puede llamar, por ejemplo, ~/proyectos/cambios-web que será donde tengamos que levantar el servidor de pruebas:
    • M-x httpd-serve-directory tras pulsar <RET> le decimos nuestro directorio de trabajo, en el ejemplo ~/proyectos/cambios-web.
    • Y por último, levantamos el servidor con M-x httpd-start
  4. Abrimos el navegador con la dirección http://localhost:8080. Por defecto el puerto donde se sirve el contenido es 8080. Si quieres cambiarlo, digamos por el 6969, tienes que evaluar la expresión:

    (setq httpd-port 6969)
    

Posteriormente el trabajo consiste en ir haciendo las modificaciones que consideramos oportunas e ir actualizando la visualización pulsando <F5> en el navegador. Algunas veces, incluso se pueden ir modificando los pichorros en las herramientas de desarrollador, C-s-i, en el navegador para probar directamente y posteriormente pasar esos parámetros al código.

El servidor lo podemos parar con el comando M-x httpd-stop. Tampoco quiero enrollarme mucho sobre el tema. Si te parece interesante y te gustaría saber un poco más sobre cómo trabajar en Emacs para la web me lo dices por los canales habituales y dedico un artículo completo con todo lujo de detalle al tema.

Aprendiendo rust

Llevo un tiempo ya aprendiéndolo, como un mes leyendo documentación y haciendo pruebas simples. Algunos me han preguntado si he abandonado erlang y no es el caso. Ese lenguaje llegó para quedarse y ya me encuentro bastante cómodo con él. Como lenguaje concurrente es increíble y lo uso con bastante asiduidad ahora para prototipado rápido, cuando antes tiraba de Python. Pero mi idea era también avanzar en algún lenguaje compilado, que no es para hacer prototipos rápidos pero sí veloces de ejecución. C/C++ ya lo conozco y tengo algunas habilidades2. El caso es que me propuse aprender Rust, que parece que todo el mundo dice que es muy rápido y muy seguro.

Después de leerme el libro del lenguaje y, como ocurre en estas ocasiones, enterarme de más bien poco, ─porque no aprendo hasta que no tropiezo─, decidí iniciar un proyecto para tropezar. Si has leído más cosas en el blog te sonará una serie de programar un raytracer con erlang, pues bien: voy a hacer lo mismo con Rust aunque sin contarlo por aquí, porque eso me convertiría en el pesao de los raytracer.

De momento, no soy nada productivo con el lenguaje. Su sintanxis e idiosincrasias lo hacen un lenguaje un tanto farragoso al principio. Además, su intención de ser seguro lo llevan casi a la paranoia y se queja por todo. Bien es cierto que en esas mismas quejas advierte claramente qué problemas encuentra y sugiere cómo se pueden atajar. Pero creo que es un buen lenguaje y me está gustando.

Aún no siendo productivo aún con Rust, sí creo que le estoy cogiendo el tranquillo y, aunque el proyecto avanza muy lentamente, voy consiguiendo pequeños logros, sin copiar el código de ningún sitio. Mi primera pelea fue con las interfaces hasta que las encontré, la segunda para separar el código en módulos, luego con los operadores y cómo definirlos para nuevos tipos de datos, luego con los tests, luego escribir la salida en un fichero... y así a trompicones avanzo poco a poco.

Configurando Emacs para usarlo con Rust

Hay un paquete para trabajar con Rust en Emacs que se llama rustic. Ya os advierto que más rústico y rural que yo no lo hay. La instalación es como siempre sencilla:

M-x package-install <RET> rustic <RET>

En la configuración sólo añadí un escueto:

(require 'rustic)

Sin embargo, cada vez que abría un fichero .rs el modo rustic preguntaba por lsp3. Como sabéis, lsp es un modo que permite a Emacs convertirse en un IDE moderno integrándose con otros paquetes como company, projectile o flycheck. Hasta ahora no había probado lsp porque la otra vez que lo intenté, resultó en un enlentecimiento casi desesperante del editor y no le vi la utilidad.

Supongo que aquel problema sería con respecto al modo de edición, que en aquella ocasión era Python, esta vez, siguiendo los pasos de configuración, que no han sido muchos, la cosa va un poco mejor. Tarda en arrancar el Emacs, ha duplicado el tiempo de carga y se sitúa en tres segundos y medio, más o menos. Cuando abro algún proyecto de Rust también tarda en cargar el fichero de código mientras levanta el servidor y se conecta, pero luego funciona con soltura.

El problema creo que viene del montón de dependencias que tiene lsp-mode cuando lo instalas. Tienes que instalar también otros paquetes, como lsp-ivy (o lsp-helm), company-lsp, lsp-ui, dap-mode y también parece que es recomendable instalar eglot. Después de intentar configurarlo todo he ido renunciando a algunas cosas, aunque mantengo los paquetes instalados por compatibilidad, lo demás que uso viene en el código:

(require 'lsp-mode)
(add-hook 'rust-mode-hook #'lsp)
(add-hook 'rust-mode-hook '(lsp-install-server 'rust-analyzer))
(add-hook 'rustic-mode-hook 'englot-ensure)

El paquete dap-mode4 he sido incapaz de hacerlo funcionar, pero puesto que es un paquete de depuración tiro del clásico gdb de toda la vida para hacer lo mismo.

Depuración con gdb

Y si no funciona el chismático de depuración moderno, pues habrá que tirar del clásico. Es un poco menos vistoso pero funciona con solvencia. El problema es que al no estar integrado en el IDE tienes que hacer un par de cosas más tú a mano.

Si ya has utilizado antes Emacs como un entorno gráfico de depuración con gdb te puedes saltar éste punto. Si no lo has hecho, voy a dar unas breves pinceladas de cómo lo hago yo. Si crees que es interesante el tema, ya me lo dices y prometo que escribiré un artículo completo sobre el tema.

Arrancar gdb en Emacs es sencillo: M-x gdb, nos pregunta por el comando que utilizará, que por defecto es gdb -i=mi y obtendremos una ventana parecida a:

Captura-pantalla_gud.png

Es un buffer que se llama gud y que muestra el prompt del depurador gdb. Si estamos acostumbrados a utilizar gdb desde la línea de comandos lo podemos hacer aquí directamente. Si os sale una ventana divida en varios buffers, es porque tenéis configurada la variable gdb-many-windows a t.

Captura-pantalla_gdb-many-windows.png

En todo caso, si no tenéis esa variable activada y queréis activar los buffers de visualización, sólo tenéis que teclear M-x gdb-many-windows y os aparecerán.

De momento, hemos cargado el depurador pero en vacío y no hay un programa que depurar. Para hacerlo, nos vamos al buffer gud, si no estamos en él, y tecleamos file nombre-del-ejecutable. En este caso yo he tecleado:

file ~/proyectos/rust/rustracer/target/debug/rustracer

Debería abrirnos el fichero principal de código también, pero si no es así, lo abrimos nosotros... La pantalla quedaría así:

Captura-pantalla_gud-cargado.png

Ahora sólo necesitamos hacer que nuestro programa se pare en algún sitio durante la ejecución para poder inspeccionar cómo evoluciona. Establecer un punto de parada o breakpoint podemos hacerlo de varias formas. Yo utilizo dos, principalmente. Una es teclear en el buffer gud el comando break NN donde NN es el número de línea donde quiero establecer el punto de parada. La otra es ir al buffer donde se muestra el código fuente, ir a la línea donde quiero hacer la parada y llamar al comando gud-break.

Captura-pantalla_break-points.png

Sea cual sea el método empleado, podemos observar que nos señala gráficamente el punto de parada con un círculo rojo la línea donde lo hemos establecido y además aparece en la lista del buffer de breakpoints, abajo a la derecha.

El resto de acciones las podemos llevar a cabo manualmente desde gud o utilizar la barra de botones, que es muy similar a cualquier otra herramienta de depuración.

Conclusiones

Ando liado porque soy así de liable, siempre con un montón de proyectos, siempre con ganas de aprender cosas nuevas y agotando todo mi tiempo libre para no permitirme descansar a mí mismo. Y ahora, después de haberos cansinado con varias cosas deslabazadas, sin un hilo conductor coherente os estaréis preguntado Y ¿a mí qué? a lo que yo os respondo: A mí tampoco, ¡gracias!. Bueno, de acuerdo, era sólo por escribir un poco y que no penséis que tengo el blog abandonado... es que no doy para más: hago lo que puedo.

Footnotes:

1

Si no lo recuerdas, lo puedes ver en https://www.youtube.com/watch?v=CxhFjPa_wd0

2

Por ejemplo, compilando erlang la última vez me lanzó un par de errores de C++ en mi máquina y pude resolverlas fácilmente.

3

Language Server Protocol

4

Un paquete adaptador para Debug Adapter Protocols, que sería la herramienta de depuración del entorno.

Categoría: blog emacs rust

Comentarios

Debido a algunos ataques mailintencionados a través de la herramienta de comentarios, he decidido no proporcionar dicha opción en el Blog. Si alguien quiere comentar algo, me puede encontrar en esta cuenta de Mastodon, también en esta otra cuenta de Mastodon y en Diaspora con el nick de Notxor.

Si usas habitualmente XMPP (si no, te recomiendo que lo hagas), puedes encontrar también un pequeño grupo en el siguiente enlace: notxor-tiene-un-blog@salas.suchat.org

Disculpen las molestias.