Alessio Biancalana Grab The Blaster di Alessio Biancalana

Burst 1.0.0 e una notte insonne in aeroporto: arrivano i customs

Mac keyboard

Arrivi in aeroporto a Santorini, hai il volo all’una e cinquanta di notte, dopodiché devi stare a Fiumicino per svariate ore finché verso le dieci del mattino non partirà il tuo prossimo volo. Questa è la condizione in cui mi sono trovato io qualche sera fa, ad attendere tra un aereo e l’altro costretto in aeroporto l’intera notte, con nulla da fare e nemmeno la minima voglia di studiare.

Così ho ripreso in mano Burst, che era tanto che non toccavo (come era tantissimo che non toccavo una riga di Ruby), ovvero il mio generatore di front-matter YAML per Jekyll, e ho cominciato a scrivere del codice nuovo per introdurre una feature che avevo buttato nel dimenticatoio.

Per prima cosa ho introdotto un file di configurazione, situato nella home dell’utente, in formato JSON, chiamato .burstrc. Successivamente, oltre ad inserire la possibilità di inserire un titolo di default per i post, ho cominciato a scrivere il codice per implementare una sorta di comportamento configurabile all’amatriciana.

Customs to the rescue!

Ho deciso di chiamare questi “cosi” customs, dato che sono a tutti gli effetti dei formati custom per il front-matter YAML di Jekyll. Il file di configurazione ha questa faccia:

{
  "defaultTitle": "This is a default title",
  "customs": {
    "link": {
      "replaces": {
        "layout": "link"
      },
      "adds": {
        "origlink": "http://dottorblaster.it"
      }
    },
    "foo": {
      "replaces": {
        "layout": "bar"
      },
      "adds": {
        "custom_field": "meh"
      }
    }
  }
}

È tutto un po’ verboso, ma efficace. La sezione del JSON in questione relativa per esempio al layout custom chiamato “link” mi permette di creare uno YAML al volo sostituendo il contenuto della chiave “layout” e aggiungendo una chiave “origlink” con un link che poi andrò a modificare. In pratica, con un meccanismo di questo tipo posso definire costantemente nuovi custom a seconda di quello che mi serve andando ad indicare un nome per il mio custom, cosa aggiungere, e cosa modificare del layout originale.

Il risultato finale è molto cool:

$ burst --custom link --title "You see customs here"

---
layout: link
status: publish
published: true
title: You see customs here
origlink: http://dottorblaster.it
date: 2016-08-15 18:10:58 +0200
categories:
- Category
tags:
- first_tag
- second_tag
---

Eh ma oggi è ferragosto, ci hai messo troppo

Vero. Ma ho anche imbellettato un po’ tutto con un po’ di colori :-) E ho anche rifattorizzato leggermente la classe che gestisce i customs (anche se c’è una cosa che non mi piace per niente…). Il prossimo passo è suddividere in più classi tutto quanto quello c’è nel burst.rb. E poi che diamine, mica potevo finire tutto subito: avevo da scrivere ferragosto ;-)

Note interessanti

Sviluppando i customs mi sono capitati un paio di episodi di “incriccamento”, ossia episodi durante i quali non sapevo andare avanti e avevo la sensazione di essermi incartato in qualcosa di troppo complicato.

Il primo è sicuramente dovuto al fatto che non avevo idea di come implementare il file di configurazione e di cosa scriverci dentro per facilitarmi la vita senza essere troppo d’intralcio al futuro me che dovrà solo usare questa roba (o magari altre persone). La soluzione è stata cominciare a scrivere di getto un JSON senza pensarci troppo e usandolo come una scatola delle sorprese, mettendoci dentro tutto quello che mi sarebbe piaciuto di più avere come un parametro configurabile.

Il secondo caso è stato più difficile da risolvere in modo elegante e devo solo ringraziare che l’aeroporto fosse vuoto per aver potuto concentrarmi a sufficienza. Nonostante il letame che ho lasciato sparso e che dovrei pulire, ho adottato un approccio funzionale per la mia classettina CustomsHandler che mi ha consentito come ultimo benefit di effettuare una combinazione di funzioni in un wrapper che ho usato come entrypoint per popolare tutto il cucuzzaro.

In entrambi i casi, è stato apprezzabile avere affianco la mia Moleskine.

Sono discretamente soddisfatto, è stato un bell’esercizio che oltre a farmi sorridere mi ha anche consentito di sopravvivere ad una notte insonne in aeroporto senza troppi effetti collaterali (a parte una grossa dormita una volta arrivato a destinazione).

Adesso devo solo documentare tutto nel README 8-)

Ferragosto e un esercizio di stile in Node.js

ferragosto nodejs CLI util

Proprio ieri pomeriggio, con la musica nelle orecchie, ero in cerca di un valido motivo per non studiare. Sono incappato per “caso” nel sito dedicato a Ferragosto di nois3, ovvero chefacciamoaferragosto.it, e con un po’ di curiosità ho cominciato a smanettarci su. Ficcanasando nel codice ho scoperto l’endpoint al quale la UI chiede le frasi, e ho deciso di mettermi a costruire un tool da riga di comando per farmi dare dei consigli su cosa fare a Ferragosto :-)

In capo a qualche ora ho messo in piedi il tutto, ed è possibile installare ferragosto tramite npm (il codice, ovviamente, è su GitHub):

$ npm install -g ferragosto

Dopodiché, per provarlo basta invocarlo come un qualsiasi altro comando. Ovviamente richiede Node.js.

Le cose interessanti

Grazie a Carlo che mi ha segnalato la sua ultima creatura, e grazie alla mia curiosità nel costruire questo programmino molto semplice ho potuto provare nopt, ovvero l’option parser per i programmi da CLI scritto dai ragazzi di NPM. È davvero ben fatto, anche se avrei apprezzato la possibilità di gestire un default sugli argomenti (come Trollop in Ruby, che uso in Burst).

Creare eseguibili in Node da pubblicare su NPM è un affare abbastanza semplice, sono rimasto abbastanza colpito sia dalla dimensione piccolina dal programma (che fa due cose in croce eh), sia da come con un debito tecnico abbastanza consistente io sia comunque stato in grado in un paio di ore di mettere insieme tutto in una forma non esattamente vicina alla sciatteria.

Queste diavolerie da giovani, altro che Node.js, ai miei tempi c’era il C

È vero! Devo tornare a studiare. ;-)

APT passa a CMake

Dato che ultimamente ho scritto spesso del codice C mi sono appassionato ai sistemi di build, ai Makefile, e a tutto quello che ci gira intorno. Stavo anche scrivendo la guida per i niubbi, ma l’ho lasciata nell’hard disk del fisso a casa mentre in vacanza ho portato il laptop (il quale ho scoperto essere poco utile per le notti in aeroporto: ho cestinato tutti i film che avevo…).

Tentando di giustificare il mio essere poco prolifico con queste frasi, passiamo oltre e andiamo a guardare che diamine ha fatto Julian Andres portando APT a CMake. È un sacco di roba, e penso che il passaggio più importante – almeno per me che sono a zero su C e building/bundling – sia questo:

Talking about CMake: I don’t really love it. As you might know, CMake differentiates between targets and files. Targets can in some cases depend on files (generated by a command in the same directory), but overall files are not really targets. You also cannot have a target with the same name as a file you are generating in a custom command, you have to rename your target (make is OK with the generated stuff, but ninja complains about cycles because your custom target and your custom command have the same name).

Alla fine della fiera è un lavoro secondo me molto, molto carino. E io vorrei saper mettere le mani a questo modo al sorgente di un tool così importante :-)

Ah però, questo Windows 10

Windows 10 Alienware

Stamattina ho letto in rapida successione il post di Nicola su Apple che a quanto pare è percepita come disinteressata verso la sua linea di prodotti “per fare cose serie” (ovvero i Mac), rispetto ai soliti iCosi tipo iPhone, iPad, eccetera, e gli articoli di OS News e di Architosh in proposito.

If Apple doesn’t care about its PC business, why should anyone else?

Questo mi ha fatto venire in mente che un paio di weekend fa, con il fisso sotto le mani, un po’ di tempo da perdere e una licenza Microsoft fresca fresca, ho installato a tempo perso Windows 10 affianco alla mia Arch Linux di fiducia giusto per fare qualche test e provare a convivere con quello che a conti fatti per me è qualcosa di nuovo.

La cosa che mi ha stupito è che a livello di esperienza utente non sono affatto deluso, anzi: chiaramente mi manca la personalizzabilità di Linux, e l’avere a disposizione out-of-the-box oppure installabili con un colpo di package manager tutti quei tool che sono abituato ad avere senza muovere un dito. Però, con un po’ di pazienza, qualche .exe piazzato per l’occasione e una shell un po’ meglio di quella di default che nemmeno so usare troppo bene (per il momento la Bash integrata in Sourcetree debitamente “shortcuttata”, non ho ancora avuto tempo di provare il runtime Unix dedicato), mi sono trovato a non soffrire più così tanto, anzi: comunque a fronte di un ambiente desktop gradevole a vedersi e da usarsi almeno per i miei gusti, i problemi sono pochi e sinceramente mi sento in potere di equiparare il lavoro che riesco a fare con questa configurazione a quello che riesco a fare con il mio Macbook.

E questo solo parlando di software: per quanto riguarda l’hardware, se il progetto che ho è quello di costruirmi un PC desktop nuovo più che carrozzato (e quindi non fare della mobilità il mio problema su cui ragionare), sicuramente anche sul lato degli ultrabook un Macbook Pro, Air o anche quell’altro nuovo aborto da 12 pollici dovrebbero sentirsi intimoriti da quello che può fare Dell con l’XPS 13 di nuova generazione, ed è solo il primo esempio che mi viene in mente dato che gli altri brand sono perfettamente in grado di stare dietro a questo trend, pur se con materiali tendenti al risparmio e componenti leggermente meno prestanti.

Quello che voglio dire, in ogni caso, è che sui PC “consumer”, anche i più scarsi, comincia ad approdare quell’esperienza utente curata tipica di un sistema come macOS, o Android, con un design finalmente “non brutto”. E se quelli potevano essere i cavalli di battaglia di Apple, adesso è tempo di muovere un ennesimo passo oltre, perché se avessi pensato di prendere un iMac, l’esperienza che ho avuto con Windows in queste settimane basterebbe da sola a farmi desistere dall’intento.

Nel frattempo comincio a riempire il carrello di Amazon.

P.S.: La cosa più fastidiosa, per la verità, sono i keybinding di Markdown Editor per Atom, fortemente legati a macOS. Credo che siano da rimappare.

Photo courtesy of Larry Qian

Perfect, Apache, GitHub e le licenze permissive

Chi ha visto un po’ del mio GitHub (almeno) sa che tendo a dotare dei miei software la licenza MIT, perché credo che sia quella che più si confà ai miei bisogni; sono sempre stato anche un grande fan delle licenze permissive in generale, sia per questioni pratiche che di puro idealismo.

Gli autori di Perfect, anche loro, si sono chiesti abbastanza di recente se la licenza GPL non fosse un peso per chi contribuiva al loro framework. La risposta corta è che lo era (quindi adesso la licenza è Apache), ma in particolare mi piace molto questo stralcio tra le loro motivazioni:

The eureka moment, however, came when I was sitting in a small office with Bob Young, the founder of Red Hat, discussing how we could explain the importance of the GPL in our context. His advice was simple and powerful. To paraphrase: “make sure the license isn’t a roadblock. If developers are confused by it in the slightest, it’s getting in the way.”

The simplicity of GitHub’s pull request has killed the GPL. We want people to play with Perfect, screw with it, and recommend improvements so we can strengthen and enhance it. Plus, Swift is licensed under Apache, and Perfect is Swift. It’s a no-brainer.

Ho sempre pensato che la GPL fosse leggermente fastidiosa da un punto di vista di contributi non strutturati. Ho sempre pensato che GitHub, per via del suo modello, avesse promosso un tipo di scambio (se vogliamo culturale, anche) molto più libero.

Quello che non mi era mai saltato in mente (abbastanza lampante, tuttavia) era di mettere in correlazione le due cose: pensavo che semplicemente la gente si fosse rotta le scatole di un ecosistema basato fortemente sull’economia dei vincoli.