Duecento

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,

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?


  1. 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. 
  2. Forse sono troppo prolisso, 565 equivalgono a più di una pagina (densa) di un libro di formato medio-grande. 
Annunci
Tagged with: , , ,
Pubblicato su programmazione
12 comments on “Duecento
  1. Ascheroz ha detto:

    Non si è mai finito di imparare, grazie Sabino.

    Mi piace

  2. frix ha detto:

    Avendo realizzato che non avrò la possibilità di scrivere anche nel prossimo secolo per le date anteposte ai files ho deciso di utilizzare la forma 160705 escludendo il 20.

    Ottimo post. Grazie.

    Risposta alla domanda facoltativa (mi butto….):

    la mediana rappresenta un valore discriminante: num. di post con + o – di 346 parole
    la media indica il numero medio di parole scritto tra tutti i post.

    Mi piace

    • Sabino Maggi ha detto:

      ho deciso di utilizzare la forma 160705 escludendo il 20

      Non farlo, fra due settimane ti sarai dimenticato di com’è il formato…

      Risposta: perfetta, non ho bisogno di aggiungere altro.

      Mi piace

      • frix ha detto:

        non farlo….

        Non c’è pericolo, uso quel formato di data da anni. Ho lo snippet su textexpander. A volte mi sbaglio e la uso al posto delle date canoniche.

        Mi piace

        • Sabino Maggi ha detto:

          Ok. Io preferisco usare la forma standard e i trattini e perché altrimenti non mi ricorderei mai che diavolo significano quei numeri. Un po’ come quando devo scrivere ad un anglosassone: in UK o in Australia per la data usano prime il mese e poi il giorno come negli USA, o no? E allora, per evitare ambiguità scrivo il mese per esteso.

          Mi piace

          • frix ha detto:

            Ho iniziato ad usare questo sistema quando mi sono occupato dei studiare l’archiviazione dei files in studio, per ottenere un ordinamento univoco (cronologico) dei files di ciascun lavoro. Dovendo aggiungere anche una serie di altri codici (cliente, lavoro, tipologia di file. ecc…), togliere il 20 davanti fa la differenza sulla leggibilità del nome dei documenti a monitor.

            Accipicchia, ti ricordi il significato dei comandi per il terminale e pensi di aver difficoltà con 6 numerini? Non ci credo. 😉

            D’altra parte quando scrivi la data in formato canonico italiano su una lettera non ufficiale (dove sarebbe preferibile scrivere il nome del mese in lettere e quindi l’anno intero), non usi la forma abbreviata per l’anno? Penso che scriverai 07/07/16 e non 07/07/2016. Basta invertire i numeri iniziali e finali e togliere i delimitatori.

            Mi piace

          • Sabino Maggi ha detto:

            Ho iniziato ad usare questo sistema quando mi sono occupato dei studiare l’archiviazione dei files in studio, per ottenere un ordinamento univoco (cronologico) dei files di ciascun lavoro. Dovendo aggiungere anche una serie di altri codici (cliente, lavoro, tipologia di file. ecc…), togliere il 20 davanti fa la differenza sulla leggibilità del nome dei documenti a monitor.

            Fosse per me lascerei il “20” per distinguere il secolo dal resto, ma penso di capire quello che intendi, senza il 20 vedi tutto il nome del file in un colpo solo (ah, Mac OS classico dove sei?).

            Io devo usare un’altro metodo. Una delle cose che mi piacciono di più di OS X è la possibilità di sistemare i file in modo visuale in una cartella, in base all’utilizzo, allo stato o ad altri parametri. Uso anche un formato di nomi abbastanza definito, ma cercando anche di essere chiaro, altrimentii mi dimenticherei subito di cosa significano.

            Però la definizione di chiarezza dipende dalla logica di ciascuno. Ho chiesto ad un collega perché i file delle ultime misure si chiamassero con nomi incomprensibili come questo, “NNSTFIBSQDH_1_6_5K_I-V_Vs_B.OPJ”, ma per lui ha un significato chiarissimo (sulla seconda parte è vero, il problema è la prima).

            ti ricordi il significato dei comandi per il terminale e pensi di aver difficoltà con 6 numerini?

            Guarda, io ho una memoria zero sulle cose da imparare e basta, ottima se c’è dietro qualcosa che mi colpisce o che ha una regola comprensibile. Quindi memoria per date o nomi zero, faccio delle vere figuracce quando incontro persone che si ricordano tutto di me, e io so benissimo chi sono, ma vatti a ricordare come si chiamano
            Un comando di terminale ha una sua logica e poi comunque li uso sempre, 6 numerini… dipende.

            Mi piace

          • Sabino Maggi ha detto:

            Però in effetti ora che mi ci fai pensare: come diavolo faccio a ricordarmi i comandi del Terminale, di vari linguaggi di programmazione, il senso di tanti articoli che leggo, e non mi ricordo (mai!) il nome dell’inquilino che mi abita sopra? Sarà che è troppo antipatico per volerselo ricordare? 😀

            Mi piace

    • Sabino Maggi ha detto:

      Dimenticavo: grazie per la segnalazione degli errori nel testo!

      Mi piace

      • frix ha detto:

        Sulla memoria meglio che passi pure io…
        E pure sui nomi delle persone. Su questo ho anche una teoria (insana e confutabile, per la verità): ci sono persone che hanno il nome sbagliato per la loro faccia (per me). Ad es. c’è un tizio che io ho sempre chiamato Enrico perché (sempre a mio personale avviso) aveva la faccia da Enrico. Questi, dopo molto tempo mi ha confessato, quasi timidamente, di chiamarsi in altro modo (che ovviamente non ricordo). Però se mi chiedi com’è la faccia da Enrico, non saprei dirtelo. Sono sensazioni.

        Mi piace

        • Sabino Maggi ha detto:

          Per me è ancora peggio. Mi ricordo le facce ma i nomi no. E a volte anche tutto il resto. Una volta ho incontrato un vecchio amico che mi ha riconosciuto, chiamato per nome, ricordato episodi della nostra vita, tutto come se ci fossero visti il giorno prima. C’era pure la moglie, mi ha presentato. E io per tutto il tempo a chiedermi chi diavolo fosse! Sapevo benissimo di conoscerlo, ma… boh!
          Un’altra volta ho rivisto un amico con cui ero stato in albergo per una quindicina di giorni, mangiavamo insieme, uscivamo la sera insieme… Ho dovuto sbirciare un documento che aveva in mano per poterlo chiamare con il nome. Sono cose imbarazzanti…

          Mi piace

  3. kOoLiNuS ha detto:

    Ad majora!

    Mi piace

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

Informativa
Questo sito utilizza cookie di terze parti per inviarti pubblicità e servizi in linea con le tue preferenze. Se vuoi saperne di più o negare il consenso a tutti o ad alcuni cookie, clicca qui. Scorrendo questa pagina, cliccando su un link o su qualunque altro elemento o proseguendo la navigazione in altra maniera, acconsenti all'uso dei cookie.
Follow MelaBit on WordPress.com
Categorie
Archivi
%d blogger hanno fatto clic su Mi Piace per questo: