Con il post di sabato scorso siamo arrivati a 200. Due anni e mezzo di melabit e duecento post, in media uno ogni quattro giorni e mezzo. Non male, se si considerano i tanti impegni di ogni giorno, che mi impediscono di dare una periodicità più serrata al blog.
Poiché questo in fondo è un blog dedicato alla programmazione e ai sistemi operativi (anche se me ne dimentico spesso), invece di celebrare l’evento preferisco prendere la palla al balzo e descrivere alcuni semplici comandi di Terminale, che userò per fare una piccola analisi dei post scritti finora.
Lancio il Terminale (chi segue con continuità il blog dovrebbe sapere come fare, per gli altri il Terminale si trova in Applicazioni > Utility) e mi sposto nella cartella (directory) che contiene tutti i miei post,
$ cd ~/cartella/del/blog/
Per prima cosa voglio controllare di aver scritto veramente 200 post.
Sin dall’inizio ho deciso di usare per i nomi dei file sorgenti dei post il formato anno-mese-giorno-titolo-separato-da-trattini.md
, dove anno-mese-giorno
indica la data di pubblicazione, ad esempio 2016-07-05
per questo post, e .md
è l’estensione standard dei documenti scritti in Markdown, il linguaggio di formattazione per il web che uso per scrivere questi post. La cartella contiene altri file e cartelle, ma solo i post completi hanno il nome in questo formato. Per contare i post contenuti nella cartella mi basta quindi eseguire il comando,
$ ls 20*.md | wc
che con ls
(list) elenca tutti i file il cui nome inizia con il secolo corrente e termina con il suffisso .md
. L’output di ls
viene inviato tramite il simbolo |
(pipe) ad un ulteriore comando del Terminale (in realtà della shell bash
, ma oggi non voglio essere troppo pignolo), wc
(word count), che conta il numero di linee, parole e caratteri (e volendo anche di byte) di un file o, come in questo caso, dell’output del comando precedente.
La risposta del Terminale è
201 202 8704
dove il primo numero rappresenta il numero di linee dell’output di ls
, cioè il numero dei file elencati da ls
che rispettano le specifiche stabilite dal comando (e di conseguenza il numero dei post).
Il Terminale quindi mi dice che finora ho scritto 201 post. 201? Certo, i post sono 201 perché nella lista c’è anche questo post (potrei fare in modo da non considerarlo, ma renderebbe tutto inutilmente più complicato).
C’è però un dettaglio che non torna. Il secondo numero, 202, indica il numero di parole dell’output di ls
. Poichè, come già notato, il nome dei file è nel formato anno-mese-giorno-titolo-separato-da-trattini.md
, che per wc
equivale ad una parola singola, i primi due numeri restituiti da wc
dovrebbero essere identici. Se il Terminale indica che c’è una parola in più, significa che uno dei file contiene nel nome (per sbaglio) uno spazio al posto del trattino.
Per cercare il file in questione, eseguo questa volta
$ ls 20*.md | grep " "
inviando l’output di ls
a grep
, uno dei tool più importanti del Terminale, che serve per cercare una o più stringhe di testo in un file. Normalmente la ricerca viene effettuata usando una espressione regolare, ma in questo caso è più che sufficiente limitarsi a cercare la presenza di un semplice spazio nell’output di ls
. La risposta è,
$ 2015-12-23-first-draft-la prova.md
dove manca effettivamente il trattino fra “la” e “prova”. Correggo subito, eseguo di nuovo
$ ls 20*.md | wc
201 201 8704
e questa volta ottengo il risultato che mi aspetto.
Ora che ci siamo scaldati, proviamo qualcosa di più divertente. Voglio sapere quante parole in tutto ho scritto finora in questi famosi 200 post. Facile, basta sostituire ad ls
il comando cat
(concatenate), che stampa sul Terminale il contenuto dei file indicati dopo il comando. Eseguendo
$ cat 20*.md
non faccio altro che stampare sullo schermo uno dietro l’altro il contenuto di tutti i file dei post. La stampa dei file è velocissima, ma scrollando all’indietro nel Terminale si può verificare che ci sono veramente tutti. Se volessi potrei usare less
,
$ cat 20*.md | less
per stampare i file riempiendo una pagina alla volta del Terminale (e potendo anche tornare indietro). Ma non mi interessa, preferisco inviare l’output di cat
a wc
,
$ cat 20*.md | wc
10639 113141 836099
da cui risulta che i 200 (anzi 201) post scritti finora sono composti in tutto da 10639 linee (che equivalgono in pratica ai paragrafi, separati fra loro da un a capo) e da ben 113141 parole.1
Ogni post è quindi composto in media da
$ echo "113183 / 200" | bc
565
ben 565 parole.2 Per calcolare la media ho usato bc
, la calcolatrice integrata nel Terminale, un oggetto poco conosciuto ma a volte molto comodo. Anche in questo caso ho utilizzato il pipe (|
) per inviare alla calcolatrice l’outupt di echo
, il comando che stampa su schermo la stringa (o le stringhe) che lo segue. Volendo avrei anche potuto usare bc
in modo interattivo,
$ bc
bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
...
113183 / 200
565
quit
Il risultato non è precisissimo, ogni file dei post ha anche una intestazione che non compare su Wordpress e che contiene titolo, data, categoria e tag, e così via. E poi non bisogna dimenticare che c’è di mezzo anche questo 201-esimo post, che è già ben più lungo di 565 parole. Ma insomma, ad occhio dovremmo essere più o meno sulle 520-530 parole effettive per post.
Ma c’è modo di vedere quante parole ci sono in ciascuno dei post? Certo, basta racchiudere i comandi precedenti in un ciclo for
,
$ for i in `ls 20*.md`; do echo $i; cat $i | wc -w; done
dove i è l’indice del ciclo for , a cui viene associato di volta in volta uno dei nomi di file stampati da ls . Nel corpo del ciclo do... done , per ogni valore di $i (in bash, ogni volta che si usa una variabile, le si antepone il $ ), si stampa con echo $i prima il valore della variabile (cioè il nome del file), poi si usa ` cat $i |
wc -w per stampare il contenuto del file e inviarlo al _contatore_ wc. L'opzione -w (_word_) di wc` serve per contare solo le parole. Eseguendo il ciclo ottengo |
$ for i in `ls 20*.md`; do echo $i; cat $i | wc -w; done
2013-12-18-il-migliore-spot.md
238
2013-12-18-melabit-il-blog.md
497
2013-12-19-una-pinta-di-tablet.md
346
2013-12-20-la-dogana.md
165
2013-12-21-rinominare-i-file-con-il-terminale.md
669
...
2016-05-24-rapidweaver-7-in-anteprima.md
729
2016-05-27-cartellino-rosso-su-facebook.md
1385
2016-05-28-la-matematica-di-facebook.md
356
2016-06-05-playlist-per-bora-bora-brian-boru.md
278
2016-07-02-da-latex-a-word-e-ritorno.md
2278
2016-07-05-duecento.md
987
Per analizzare i dati è più comodo salvare la lista su un file, facendo in modo che il titolo del post e il conteggio delle parole stiano sulla stessa linea.
Facile, per salvare l’output di un comando di Terminale su un file si usa il simbolo >
seguito dal nome del file (ricapitolando, il simbolo |
invia l’output di un comando ad un altro comando, mentre il simbolo >
lo invia ad un file). Per stampare titolo e conteggio sulla stessa linea, è sufficiente aggiungere al comando echo
l’opzione -n
(no newline).
Eseguendo il comando così modificato,
$ for i in `ls 20*.md`; do echo -n $i; cat $i | wc -w; done > ~/Desktop/words.dat
compare sul Desktop il file words.dat
, le cui prime 5 righe sono,
$ head -5 ~/Desktop/words.dat
2013-12-18-il-migliore-spot.md 238
2013-12-18-melabit-il-blog.md 497
2013-12-19-una-pinta-di-tablet.md 346
2013-12-20-la-dogana.md 165
2013-12-21-rinominare-i-file-con-il-terminale.md 669
esattamente come richiesto. Partendo da questi dati, è facile calcolare la distribuzione del numero di post in funzione del numero di parole,
da cui è evidente che quasi la metà dei post contiene non più di 300 parole.
Più specificatamente, si trova che la mediana è uguale a 346, che significa che metà dei post contiene meno di 346 parole e l’altra metà ne contiene di più. Forse non sono poi così prolisso come ho sempre pensato.
Domanda (facoltativa): Perché c’è questa grossa differenza fra la media e la mediana del numero di parole che compongono i miei post?
-
Si noti che se l’output di un comando che stampa qualcosa sul Terminale viene inviato ad un altro comando per un’ulteriore elaborazione, l’output stesso viene risucchiato dal secondo comando e non compare più sullo schermo. ↩
-
Forse sono troppo prolisso, 565 equivalgono a più di una pagina (densa) di un libro di formato medio-grande. ↩