Qualche giorno fa, ero deciso ad iniziare a studiare senza tergiversare oltre, quindi ho messo le cuffie ed ho aperto YouTube per ascoltare un po' di Lo-fi. Ma qualcosa non è andato per il verso giusto e mi sono ritrovato a vagare per la rete, dimenticandomi dell'obiettivo iniziale per una quantità di tempo non trascurabile.

Per evitare che una situazione del genere si riproponga ancora nel corso della mia vita, ho deciso di cambiare approccio: mai più passare per la home, da oggi la lofi si mette con un semplice comando da terminale.

La prima soluzione è stata dannatamente semplice ed efficace:

# ~/.bash_aliases
alias lofi="python -mwebbrowser https://youtube.com/watch?v=8nXqcugV2Y4"

Orgoglioso, sorseggiavo tè caldo alle tre di notte.

via GIPHY

Ovviamente, si tratta di una soluzione con un grosso limite: apre sempre lo stesso link, non c'è brivido della sorpresa e della scoperta. Mi sono detto: "e se volessi estendere la lista di link a cui fare riferimento?".

Abbiamo parecchie vie per raggiungere questo scopo. Cito le prime due che mi sono venute in mente:

  • Piccolo script in python in cui inserire sia la logica che la lista dei link;
  • Mantenere un dotfile .lofi-links da cui bash possa recuperare una linea random ogni volta.

La seconda opzione sembrava quella più pulita, ma in verità non apprezzo moltissimo scriptare cose molto lunghe in bash, perché lo ritengo poco leggibile e le funzioni sono più complesse di quanto non sembrino in primo luogo. Capirei se utilizzassi bash ogni giorno, ma non è così e c'è il rischio che io debba andare a ricercare il manuale di ogni funzione impiegata qualora decidessi di modificare la logica da qui a qualche anno.

Alla fine, il cambio di passo radicale: perché non usare lisp?

The emacs way§

Innanzitutto, si assegna ad una variabile una lista di link a nostra scelta:

(setq links '("https://www.youtube.com/watch?v=8nXqcugV2Y4" 
                "https://www.youtube.com/watch?v=FVue6P2VoTc"
                "https://www.youtube.com/watch?v=kgx4WGK0oNU"
                "https://www.youtube.com/watch?v=5qap5aO4i9A"))

Siccome vogliamo prelevare un link a caso, è il momento di mischiare le carte:

;; Implementation of the knuth shuffle
(defun nshuffle (sequence)
  (cl-loop for i from (length sequence) downto 2
        do (cl-rotatef (elt sequence (random i))
                    (elt sequence (1- i))))
  sequence)

Questa è l'origine della funzione, io l'ho solo modificata leggermente per esplicitare l'utilizzo di funzioni in Common Lisp.

Infine va scritta la funzione vera e propria, che non fa altro che lanciare il comando originale sostituendovi il primo link della lista che abbiamo generato con la funzione di shuffle:

(defun play-lofi ()
  "Play random lofi music on your browser"
  (interactive)
  (shell-command (concat "python -mwebbrowser " (car (nshuffle links)))))

Il fatto che la funzione sia stata dichiarata interactive, ci consente di lanciarla dall'interno dell'editor con Alt+x e digitando play-lofi. Potremmo anche assegnare una shortcut a piacere, a questo punto. Rimane un po' di perplessità sul ricorso a python nel comando che passiamo alla shell: sicuramente si potrebbe fare a meno richiamando l'apertura della pagina web direttamente da Emacs, ma per il momento va bene così. Python è ovunque, dubito che questa cosa possa essere un problema per molto molto tempo.

Ma, aspetta, adesso dobbiamo per forza aprire Emacs tutte le volte che vogliamo lanciare un po' di Lo-fi?

Sì e no. Mi spiego meglio.

Ritorno al terminale§

Visto che Emacs nei miei sistemi è sempre vivo in modalità Daemon ed io mi limito a spawnare i client all'occorrenza, questo significa che possiamo anche richiamare le funzioni da terminale senza aprire una finestra.

Nella pratica, ciò significa che possiamo risolvere semplicemente riformulando l'alias:

# ~/.bash_aliases
alias lofi="emacsclient -e \(play-lofi\)"

Per lanciare la vostra musica dal terminale, proprio come all'inizio, sarà sufficiente lanciare un comando:

lofi

The end (per adesso, almeno).


Head Artwork by jisung_clouds -> https://www.wattpad.com/...