sadasant

Daniel Rodríguez
{ "tags" : [ "spanish" , "thoughts" , "life" ] , "title" : "Estructuras" }

Recordar un rostro que llevamos viendo por años sólo habla de esos años viendo aquel rostro, y no del origen de las marcas que se asientan en las comisuras, o en los bultos que conforman el volumen de esa figura. Así mismo, el rostro de la ciudad en donde vivimos no es distinto al de un ser querido, por ello sentimos que es parte de nuestra propiedad, no lo que en realidad existe, sino lo que consiste para nosotros. Después de todo, las circunstancias se han adueñado de aquellas vidas mucho antes de proclamarlas, así como las ciudades han tenido muchos dueños. Eventualmente todos aprenden a servir a quienes les engendran. También eventualmente, los dueños cambian, y la figura cambia con ellos.

Una propuesta exitosa produce algo que toma direcciones predecibles por un tiempo breve, lo producido (lo entienda o no) cede a su diseño, es decir, tiene de manera inherente la responsabilidad de atender a lo que se le ha convocado. Es importante entender que toda figura tiene un diseño y un dueño, porque, por ejemplo, al mirar un busto de concreto que escapa el alcance de la mirada, sería muy inocente verle como algo producto del accidente, como si fuesen marcas en la luna; acusarle de tal sería tomar de imprevisto a cualquier vestigio de intención. Descubrimos quienes están detrás al intentar hacer cambios: si alteramos mucho, llegan a corregirnos.

La idea de que infinitos cambios pueden producir algo memorable no es impensable, nada plenamente aleatorio puede concluir de manera predecible, sin embargo parece improbable, sobre todo con tantas oportunidades de que cuanto mucho salga ruido. Algunos eruditos han llegado a decir que, por principios de diseño de la realidad, el desorden se organiza eventualmente, en redes que ceden a soluciones eficientes - por naturaleza.

También podríamos decir que la energía que nos conforma es en cualquier caso prestada, un asunto temporal al que nos acostumbramos. Sea cual sea la justificación a la que se sostenga, todos los que hemos sido producidos tenemos una deuda, si no, muchas. Eventualmente atendemos ese déficit, devolviendo el favor, incluso el de la vida.

Todos estos efectos toman forma de estructura cuando interactúan con diversos intérpretes. La intención se hace función. Así, nuestra vida termina siendo en función de muchos planes, protocolos, acuerdos, costumbres, etc. Nos acomodamos en una serie de actividades que apuntan a ciertos objetivos, y pasamos a través de muchas otras expectativas o campañas, ignorando la mayoría. Sin saberlo, todos participamos en conspiraciones, en juegos de otros, y otros participan en nuestras jugadas. Conformamos capas debajo de capas de composición similar, en cualquier ubicación estaremos encima de algunos y debajo de otros, decidiendo si jugar a construir volúmenes o fisuras, sin poder entender la gran figura.

by-nc-sa Daniel Rodríguez.
{ "tags" : [ "spanish" , "thoughts" , "life" ] , "title" : "2015" }

El primer día del año resultó ser un Jueves. Resaltar un día por su ubicación en la semana, o por su número en el mes, no demuestra significado alguno. Es una costumbre mirar a los relojes y concordar que la vida lleva un compás, que estamos acorde a las notas que recibimos de nuestros instrumentos vecinos, que queremos andar todos en armonía, junto a nuestros relativos. Nos alistamos para introducir a nuestra procedencia una fachada que pueda ilustrar a dónde nos dirigimos. Llevamos un ritmo y queremos hacer melodía.

En mi familia ahora me conocen por viajar, ciudadano del mundo me titulan, es un orgullo. Los últimos meses han consistido en mirar por ventanillas, sentir aterrizajes y andar con las mismas maletas a dormir. Una vez, llegando a Medellín, el resto de la tripulación recibió su tierra con un aplauso, como diciendo: ¡Milagro! ¡Hemos llegado (vivos)!

Entre vuelos, la idea de pisar firme se funde con ilusorias vacaciones (para quienes trabajan en oficinas) o con la ansiedad de regresar (para quienes no se ven lejos de casa), o con la idea de permanecer en grupo, cuando toca seguir volando un rato más. Nadie viaja sin necesidad, y nadie viaja solo, sea por quienes deja, quienes le acompañan o a quienes está por visitar.

He recomendado un par de veces que no se debe dudar a mitad del impulso, por el mismo hecho de ser concordantes, pero muchas veces he dudado. Siempre recuerdo a una querida amiga que alguna vez me dijo "no esperes nada de nadie", siendo ella la primera en reclamar cuando los demás no han cumplido, incluso supuestos, como felicitaciones por fechas festivas. Lo mismo me pasa, pero siempre decido (aunque tarde). En mi experiencia las decisiones de vida han llegado a tomar en realizarse al menos un año, aunque sé de quienes ven el futuro venir desde mucho antes y les admiro.

Este año espero que todas estas notas regadas cobren ritmo. No es nada más en mi cabeza que So called laws of nature de David Lang tiene sentido, después de todo la han tocado muchos grupos en muchos escenarios, y así como ella hay muchas otras composiciones con ideas similares. Puntos dispersos en el espacio, "el sistema consiste en puntos definidos no por sus distancias ... sino por etiquetas ... parecido a como una casa está ubicada en un pueblo por su número y calle...". Por supuesto, nada tiene que ver haber conseguido a "The so-called laws of nature" entre las páginas del libro Einstein's Theories of Relativity and Gravitation de James Malcolm Bird (en el capitulo dos: El Mundo y Nosotros), pero cómo han resonado esas notas en mi cabeza desde entonces...

Comparto estas cosas como pasa palos, por favor disfruten.
Felicidades.

by-nc-sa Daniel Rodríguez.
{ "tags" : [ "spanish" , "surrealism" , "fantasy" , "love" ] , "title" : "En otra vida" }

Al abrir los ojos me encontraba somnoliento y pesado, el último sueño que había tenido era uno de muchos con intensión similar: laberintos en la cotidianidad. A veces lo soñaba en escaleras de ministerios públicos que se repetían infinitamente, o que llevaban a puertas escondidas en las esquinas del techo, a las cuales debía entrar por una fuerza indescriptible. En otras oportunidades el escenario era un aeropuerto de innumerables escaleras y pasillos, con aviones de varios pisos y con caminos cerrados sin aviso; el sueño se dibujaba intencionalmente confuso y sus senderos me dirigían fácilmente a saltar entre barandas o colgar de algún borde, cualquier situación embarazosa.

Esta vez recordaba estar expuesto en el piso uno de un centro comercial, intentando llegar al cine por un pasillo tan estrecho que debía atravesarlo agachado, para que el vértigo no me tentase a saltar. Al lograr asomar mis ojos por el borde de la entrada, muy a mi decepción, estaba cerrado, por lo que debía regresar. Informé a los otros detrás de mi y ellos saltaron al piso de abajo. Absurdo. En todos esos sueños me preguntaba: ¿por qué tanto esfuerzo para aquellas nimiedades?

No siendo indescifrable el motivo, como un epíteto de la cotidianidad nacional, pasé a recorrer hacia atrás mis recuerdos matutinos y encontré un sueño profundamente incómodo.

Me hallaba en una fiesta techada bajo la luna. Entre la avalancha de sonidos típicos de aquella ocasión ocurría el despreciable andar de personas desconocidas, desviviéndose. Ya me empezaba a saturar. Caminando entre habitaciones en búsqueda de algún sitio tranquilo, me topé con tantas escenas que el impulso de salirme lograba mermarse. Fui por una bebida, y casi andando sobre cuerpos, llegué al bar. Me serví un trago. Al sorbo, presumí sentir alivio, pero sentí mareos y me desplomé sobre alguien.

Desperté en una calle. Caminé varias cuadras sin distinguir nada. Pregunté por algún sitio de comida y desayuné. Andaba sin celular y sin identificación. Pasé varias horas intentando ubicarme, sin resultados. Me preocupé, pero la situación me obligaba a tomar acciones, por lo que procedí a encontrar estadía. Por fortuna cargaba algo de dinero.

Varios días después, me encontré con una figura conocida: era mi novia, al menos era quien yo recordaba como mi novia, pero no me reconocía en lo absoluto. Manejé la situación para que no se alarmase y prontamente nos hicimos amigos.

Coordinamos varios viajes, paseamos en un carro viejo que ella tenía. Conocí algunas montañas cercanas, calles comerciales y plazas. Era un pueblo pintoresco. Me recordaba a Mérida, pero con edificios más grandes.

A las semanas ya me había invitado a quedarme en su lugar.

En aquel pueblo de grandes pilares, ella trabajaba en un edificio y yo encontraba trabajo por Internet desde su casa.

Una tarde, en su casa, me sentí cansado y me acosté; no entendía qué pasaba, ¿fiebre? Cerré mis ojos y al abrirlos, ya no estaba. No estaba en su mundo. Estaba en mi casa, vi la fecha y era el día después de esa fiesta terrible. De algún modo había logrado llegar a mi apartamento. Me agarré la cabeza con las manos y empecé a llamar a mis amigos, ¿quién me trajo? - uno de ellos confirmó haber sido y me comentó que yo andaba intoxicado, que él creía que había consumido alguna droga, me dijo: "no se en qué andas, pero ese estado no era normal, cuidado con meterte en algún peo". Fue droga. En mis contactos no estaba ella. Algo tenía que hacer.

Empecé a buscar y luego de unos días conseguí un posible vendedor. Esa noche me puse ropa discreta y lo busqué. Me hizo montarme en su carro, le di el dinero y me entregó la substancia. Me la introduje. Llegó el mareo sin falta y relajé mis músculos. Caí dormido. Desperté tirado en el suelo.

Caminé varias cuadras y logré ubicarme. Estaba acelerado, pues tenía que encontrarla. Pronto supe cómo llegar a su casa, toqué el timbre y allí estaba. Sentía su odio por haberme ido, pero yo estaba feliz. No quise explicarle, no me creería. Decidí intentar convencerla de otra manera, le dije que había ido a explorar una montaña. Luego de algunos días, logré recuperar su confianza y regresé a su lugar. En unas semanas llegaría la navidad.

Pasamos Diciembre juntos. Hizo frío y nos hizo bien la compañía. Nos acostumbramos una vez más.

Un día de Enero, recordé que regresaría; quizás muy tarde, pues empecé a sentir los mareos. Corrí a por ella, tomé un taxi hacia su trabajo, le llamé, nos encontramos afuera. Le expliqué y ella no comprendió, se molestó y salió a caminar en otra dirección, caminé detrás de ella, le dije "lo siento", me detuve, sentía que me iba. Preferí la sombra, para no despertar sospechas. Casi sin consciencia, la vi asomarse, pero ya me había ido.

Desperté en el carro de quien me había vendido la substancia. ¡Qué angustia! Regresé acelerado, molesto. En aquel sueño de la fiesta, no existía ella, sólo en aquella ciudad, ¿cómo era posible?, necesitaba más, necesitaba volver a verla, y encontrar algún modo de quedarme.

Recordar haber soñado eso, estando acostado en mi dormitorio, en un país distinto al de ella, me trajo un sentimiento profundamente incómodo. Aproveché para escribirle y contarle mi historia.

Daniel Rodriguez
Soñé que vivía otra vida y que en ella, un día por accidente, en una fiesta indeseable, probé sin querer una droga que me hizo viajar en el tiempo.
En ese viaje, entre mi confusión y mi sorpresa, me topé contigo
Nos enamoramos
Viajamos juntos, hicimos pequeñas aventuras, conocí tu mundo y en un punto me desaparecí: regresé a mi tiempo
Desesperado, busqué entender qué había ocurrido y comprendí que era una droga, así que busqué más de ella. Encontré un dealer, y le pagué buen dinero, me llevó en su carro y me dio la droga y en menos de lo examinable ya estaba en tu mundo
Te busqué, te dije que había ido a una montaña, regresamos, pasé navidad contigo
Un día, recordé que regresaría
Estaba en tu casa y tú en el trabajo, te fui a buscar, te explique, te molestaste, entre lágrimas te alejaste. Fui tras de ti y empecé a verme desaparecer, volteaste a buscarme y me conseguiste en el último instante, ya no estaba, estaba en el carro del dealer y la desesperación regresaba, necesitaba volver a estar contigo

Recomendación musical:
Bohren & der Club of Gore - Destroying Angels.

by-nc-sa Daniel Rodríguez.
{ "tags" : [ "narrative" , "spanish" , "fantasy" ] , "title" : "Citando a Iria" }

Mi buen amigo @jobliz me ha compartido un fragmento de uno de sus escritos, en el cual un personaje llamado Iria Ferreira se expresa de la siguiente manera:

La primera enseñanza que se le debería dar a una persona es que las buenas intenciones no necesariamente te llevan a buenos resultados, ni tampoco a ayudar a otras personas. Hay mucho egoísmo en este mundo, pero no hay nadie que realmente lo quiera destruir. Eso, sin embargo, es lo que logran todos los que se obsesionan con querer salvarlo. Las buenas intenciones son un peligro, un peligro hermoso y seductor en el que si te descuidas muchas veces provoca refugiarte para nunca salir. Acaso puedes esperar benevolencia de algunas personas cercanas a ti, pero no debes proyectar ese deseo al universo. No esperes de los demás una generosidad infinita igual a la que supuestamente tú y los tuyos tienen, porque entonces tu alma se torcerá y te alegrará negársela al que piensa distinto. Duele reconocerlo y es incómodo notar que saberlo te posiciona junto a muchos egoístas, pero aquellos que exigen buenas intenciones mediante religión o ideología deben ser neutralizados a cualquier precio, para mantenerlos lejos del poder. Los idealistas son los que más se corrompen con él, porque si tienen la oportunidad hacen todo lo posible por transformar sus inmensos sueños en planes absolutos para el destino de la humanidad. Por eso no espero de ti buenas intenciones hacia mí, sólo que nuestros intereses sean compatibles en algunos casos. En el resto estaré bien por mi cuenta, o junto a otras personas que también piensen así.

Espero les haya gustado. ¡Hasta pronto!

by-nc-sa Daniel Rodríguez.
{ "tags" : [ "english" , "linux" , "opensource" , "technology" , "tmux" , "vim" , "xmacro" ] , "title" : "Tasks Automation with XMacro" }

So it's time to make a more technical post.

If you're looking for tmux macros and you use Xorg, you will need this tip.

TL;DR

Install xmacro, record some commonly made actions, edit the recorded file to polish times and actions, make a script to reproduce them again and voilà, macros for any window manager using Xorg, easy to use from vim or tmux.

The story

I've been playing with linux for many years now. Like any typical user, I started with user friendly distributions, first Mandriva, then Ubuntu, then Mandriva again, then OpenSUSE, CentOS, Fedora, Arch Linux and now Manjaro, which is built on top of Arch and has a ready to use Net Edition. Just what I was looking for (check it out here).

So, while you're in Linux and you get all excited about being able to be very exquisit with which applications you are going to use (in matter of performance and low consumption), you'll end up using the terminal a lot. That's what I did, first using alsamixer to control the sound, then nano to edit files, then vim, as well as music players like mocp, IRC clients like irssi, email clients like mutt, then you might begin using xterm instead of any other fancy gtk terms, also you might switch from Gnome to OpenBox, and later to DWM, which could end up being your favorite one, because nothing is going to be so fast and simple. Then maybe you're too lazy to set up a background image each time you're setting up a machine, or like me, you get so uncomfortable selecting an image that you prefer to have none, and finally you end just using conky to give it a fancy style, but keeping things minimal, etc etc... well, the point is that you start to use the terminal a lot. Fine.

My current desktop.

Now, every time you open your computer to start working with a project, you open several terminals, maybe using TMUX, in some of them you run several applications, like databases, web servers, or your editor; you load your vim sessions to open all your needed files and then you start working, you do this some days and you feel fine, but eventually you begin to think that maybe you could be doing that automatically, because it's tedious to be opening the same stuff again and again and again and again...

For many years, I've encountered persons that asked me if I knew a way of scripting tmux to open several terminals and load your programs, or if there was a way of making macros with tmux, but I was unable to answer properly, I said: well, yes, in principle you can start tmux's server and tell it to load several applications, but it's not an automatic process, I mean, you can't just record your actions to play them again, you have to make the script and change it as you want new things to happen. I never explored the possibilities of that approach, but it looks so cumbersome that everyone I know ended up just doing things by hand and that's it.

Until now, ladies and gentlemen I present you: xmacro.

XMacro

For Arch Linux users, xmacro is available in the AUR: https://aur.archlinux.org/packages/xmacro

Essentially, xmacro records your pressed keys and saves them to a file. To run it, see the line below:

xmacrorec2 > myrecording

Once you call it, first you'll have to pick a quit-key (<Esc> is fine), then whatever you do will be recorded: moving your mouse, clicking, pressing any key, etc. Do some stuff, then press the quit-key, and you'll be able to replicate that behavior with the following command:

xmacroplay "$DISPLAY" < myrecording

Let's check myrecording file to see what we've got. As you'll see below, it looks very much like the output of xbindkeys -mk (after you click some keys there):

MotionNotify 949 749
KeyStrPress Alt_L
Delay 147
KeyStrPress 2
KeyStrRelease 2
KeyStrRelease Alt_L
Delay 783
KeyStrPress Alt_L
Delay 110
KeyStrPress 1
KeyStrRelease 1
KeyStrRelease Alt_L
Delay 2351
MotionNotify 918 536
ButtonPress 1
Delay 100
ButtonRelease 1
Delay 2396
MotionNotify 628 378
ButtonPress 1
Delay 100
ButtonRelease 1
Delay 1593
KeyStrPress Control_L
Delay 79
KeyStrPress c

In the previous code, first you see MotionNotify, which indicates the position of the cursor, then you can see that I pressed Alt_L, waited 147 milliseconds, then pressed 2, then released 2, then released Alt_L (Alt_L+2 sends you to the second desktop in DWM). The rest of the file consists of the same type of actions. It's fairly easy to edit (just remember to keep it clean of empty lines, empty lines produce errors). If you want to reproduce that again, but going to the third desktop instead, yo could change KeyStrPress 2 and KeyStrRelease 2 for KeyStrPress 3 and KeyStrRelease 3 respectively.

Fair enough, now you know a way of recording and replaying macros in X, and it's also very easy to customize. Now let's make it more practical.

An use-case

Let's define an use-case:

I, as an user, want to be able to open a new tab in tmux, and to cd to the directory in which my current active file in vim is located.

To follow the process with me, you'll need to have changed the behavior of tmux to work like vim, so please add the following lines to your .tmux.conf:

# vim keys
set-window-option -g mode-keys vi
bind-key -t vi-copy 'v' begin-selection
bind-key -t vi-copy 'y' copy-selection
bind-key h select-pane -L
bind-key j select-pane -D
bind-key k select-pane -U
bind-key l select-pane -R

I'm also using the default <Ctrl+b> behavior of tmux, so make sure you DON'T have lines like the followings in your ~/.tmux.conf:

unbind C-b
set -g prefix C-a
bind C-a send-prefix

So, how would you answer the use-case we stated? you could, for example, expand your current path with vim, typing :!# %:p:h and then pressing tab:

:!# %:p:h
<Tab>
:!# /home/youruser/your/path/
<Smile>

Then, as the use-case states, we're in tmux, so we can select that text pressing <Ctrl+b>[, it will stop rendering the terminal, and it will let you move over or select the rendered text, but starting from the point your cursor was before pressing those keys. So, as we set it to work like vim, now we can press 0 to go to the beginning of the line, then press 4l to move to the beginning of the path, then press v to start the selection, then press $ to go to the end of the line and now press y to copy the text to tmux's buffer. Finally press <Ctrl+c> to get out of tmux's special behavior.

Now, we press <Ctrl+b>c to open a new tab, in which we write cd and we paste tmux's buffer with <Ctrl+]>. That way we complete the use-case.

Manually opening a new tab in tmux, and changing to the directory in which my current active file in vim is located.

As you see, it's a complex process, even if you have done it so many times you can do it without thinking, it requires lots of key presses and it's error-prone, because you can miss keys and end up doing something else.

So let's automate it!

Automating the use-case

First, let's make a directory at home to store our macros, let's call it ~/.xmacros.

An easy (but wrong) way of doing this automation is to call xmacrorec2 > ~/.xmacros/vim_tmux_cd_newtab.macro (you can change the file name if you want) from another window (or terminal), then to switch to the one where you have tmux and vim, then to do the process above, and end the recording pressing the quit-key. Now, each time you want to do it, you'll have to switch to another window/terminal and run xmacroplay on it. This is not the preferred way, right? what if we make it possible from vim directly? Let's try it.

Let's edit vim_tmux_cd_newtab.macro to remove the window switching, just remove some of the first lines, they look like this:

KeyStrPress Alt_L
KeyStrPress 1
KeyStrRelease 1
KeyStrRelease Alt_L

(That was how I switch desktops).

You can also eliminate all the lines with Delay. Make sure it is exactly what you want before going to the next steps. The one that I'm using is the following: https://gist.github.com/9997147

If you try calling xmacroplay from vim, make sure to call it as follows:

:exec "!xmacroplay \"$DISPLAY\" < ~/.xmacros/vim_tmux_cd_newtab.macro &"

(the key points are "$DISPLAY" and the last &).

That's a way to do it. You'll probably prefer to set it in a mapping, but as the command is in double quotes, imagine trying to call another of your macros, you'll need to write it manually instead of being able to press tab until you reach your preferred.

An alternative could be to make a bash script and add it to your $PATH, that way you'll be able to call it from vim and complete the paths with <Tab>, just like we completed %:p:h.

This bash script is very simple, here's my approach, I call it run_xmacro:

(cd ~/; xmacroplay "$DISPLAY" < $1 > /dev/null 2>&1 &)

To use this script, be sure you give it execution rights with: chmod +x, then you can make a mapping to call it, put this in your .vimrc or in the file where you put the mappings (I use ~/.vim/plugin/mappings.vim);

nmap <Tab>m :!run_xmacro ~/.xmacros/

(I use <Tab> a lot, so <Tab>m is the first thing that came to mind, change it to fit your needs.)

Ok, so we're done! Now just press <Tab>m, the command will appear in vim, then you'll be able to press tab again and loop over all your xmacros! Click on one and it will run flawlessly.

Automatically opening a new tab in tmux, and changing to the directory in which my current active file in vim is located.

Done, now it's time to get creative and build your own macros, automate your workflow to speed up your daily life!

If you need any help please ping me @sadasant. (Just request to follow, if I forget to accept, send me an email).

// I made the gifs with tty2gif


Update: I actually found a very nice way to do that example with less work, just add this to your vim configs:

nmap <Tab>bc  :call system('tmux new-window -F "#S" -c "'.expand('%:p:h').'"')<cr>

And you'll be able to open a new tab in tmux with <Tab>bc :)

More here.

by-nc-sa Daniel Rodríguez.