En qué ando estos días
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:
- 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 conFileZilla
. - 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 agrupadoscss
,fuentes
,img
yjs
que son las cosas necesarias para el diseño de la página.- Algunos ficheros
html
, como elindex.html
y los últimos artículos con su estructura de directorios para interactuar un poco en las pruebas.
- 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
Abrimos el navegador con la dirección
http://localhost:8080
. Por defecto el puerto donde se sirve el contenido es8080
. Si quieres cambiarlo, digamos por el6969
, 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 lsp
3. 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-mode
4 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:
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
.
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í:
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
.
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:
Si no lo recuerdas, lo puedes ver en https://www.youtube.com/watch?v=CxhFjPa_wd0
Por ejemplo, compilando erlang
la última vez me lanzó un par
de errores de C++ en mi máquina y pude resolverlas fácilmente.
Language Server Protocol
Un paquete adaptador para Debug Adapter Protocols, que sería la herramienta de depuración del entorno.
Comentarios