Experimentalia

Appunti raminghi

Archive for Maggio 2008

Bash tee

con un commento

No, il te (preferisco il lapsang souchong) non c’entra nulla. Il protagonista di questo rapido post è il comando tee che permette di duplicare il suo standard input e salvarne una copia su file mentre l’altra viene reindirizzata allo standard output.

Attenzione: tee si disinteressa dello standard error (che magari è più interessante da tracciare) perché |, il simbolo di pipe, inoltra un solo flusso alla volta, di solito stdout.

I parametri utili sono solamente due,

  • -a che permette di aprire in modalità append il file su cui riportare il flusso di dati che passa attraverso tee
  • -i che istruisce tee ad ignorare gli interrupt che dovessero raggiungerlo.

A cosa può servire un comando del genere? Per prima cosa è utile per salvare un risultato intermedio dall’interno di una pipe, ad esempio per fare debug o per manipolare successivamente, in maniera differente da quella implementata nella pipe gli stessi dati.
Una obiezione naturale potrebbe essere: peché non dividere l’elaborazione in due parti, salvare i dati in un file ed utilizzarli successivamente per far partire due elaborazioni parallele? Essenzialmente si tratta si gusti personale, o per dirla come Larry Wall, esistono più modi di scuoiare un gatto. Un’altro motivo che rende controindicato spezzare l’elaborazione in più parti, specie in caso di test, può essere l’alta variabilità dell’output di un comando, se l’output varia ogni volta che lanciamo un comando, lanciarlo e per vedere l’output che produce non basta perché un eventuale errore non sarebbe così individuabile.
Un altro utilizzo che se ne può fare è utilizzarlo come un semplice registratore dell’output di uno script (basta piazzare in fondo alla riga di comando un | tee file.log) .

Una cosa importante da valutare è che tee nasconde il codice d’uscita del programma di cui replica l’output. Verifichamolo:

Costruiamo un semplice script (test):

#!/bin/bash
echo Ciao
exit 1

e digitiamo a linea di comando:

./test ; echo $?

$? non è altro che l’exitlevel della pipe al momento della valutazione (nel nostro caso il valore restituito dallo script test) e, correttamente la linea di comando stampa 1. Non c’è bisogno che ve lo dica, la pipe

./test|tee ; echo $?

stampa 0. Si tratta dell’exitlevel di tee che, ovviamente, è zero.

Questo significa che uno script che fa affidamento sull’exit code di un comando precedente potrebbe non funzionare.

Written by eineki

Maggio 23, 2008 alle 23:24 pm

Pubblicato in bash, linux

Minima Moralia – Estratti

con un commento

Prima regola di prudenza dello scrittore: esaminare ogni testo, ogni brano, ogni periodo e Minima moralia, copertinachiedersi se il motivo centrale emerge con sufficiente chiarezza. Uno è talmente preso da quello che vuole dire, che si lascia trasportare senza riflettere: è troppo vicino all’intenzione, è troppo «nei suoi pensieri», e dimentica di dire quello che vuole.

Non c’è correzione, per quanto marginale o insignificante, che non vale la pena di effettuare. Di cento correzioni, ognuna può sembrare meschina e pedante; insieme possono determinare un nuovo livello del testo.

Non essere mai avari nelle cancellature. La lunghezza del testo non conta, e il timore di non aver scritto abbastanza è puerile. Nulla va ritenuto degno di esistere perché c’è già, perché è stato scritto. Proposizioni che formulano lo stesso pensiero non sono spesso che tentativi di afferrare qualcosa di cui l’autore non è ancora in possesso. In questo caso bisogna scegliere la formulazione migliore ed elaborarla ulteriormente. La tecnica letteraria impone di rinunciare anche a pensieri fecondi, se la costruzione lo richiede. I pensieri soppressi contibuiscono alla sua forza e alla sua ricchezza. Come a tavola non bisogna inghiottire l’ultimo boccone, o vuotare il bicchiere fino in fondo. Altrimenti ci si rende sospetti di povertà.

Chi vuole evitare i clichés, non deve limitarsi alle singole parole, se non vuole cadere nella civetteria volgare. La grande prosa francese del secolo decimonono era particolarmente sensibile a questo pericolo. La parola singola di rado è banale: anche nella musica il singolo suono non si presta al commercio al minuto. I clichés più detestabili sono combinazioni di parole del genere di quelle infilzate da Karl Kraus: chiaro e tondo, ora e sempre, per la vita e per la morte.

Theodor W. Adorno, Minima Moralia – p. 91 e segg. (nella traduzione di Renato Solmi)

Non vorrei aggiungere altro se non che questo apre un nuovo filone di articoli che mi si sono rintanati nel cervello da un po’ di tempo. Un estratto di una pagina o poco più (mai di meno) da un libro che sto leggendo o che mi è particolarmente caro.

Written by eineki

Maggio 13, 2008 alle 0:34 am

Pubblicato in estratti, libro

Cambio veste grafica

nessun commento

Informazione di servizio, ad oggi diventa definitivo (fino al prossimo) il cambio di veste grafica.

La nuova veste ha meno fronzoli della già scarna veste precedente ma ha molto più spazio in orizzontale per le linee di codice (e chi programma sa quanto il codice ben scritto sia molto più easy di quello formattato, dovrei dire indentato, male.

Questo è tutto, per ora.

Cercate di godervi la nuova veste e non sentitevi troppo spaesati ;)

Written by eineki

Maggio 9, 2008 alle 10:03 am

Bash: Trasposizioni

nessun commento

Venerdì mattina, tempo soleggiato e pomeriggio in permesso, domani è sabato, nulla potrà rovinarmi la giornata. A parte un mio collega che entra in ufficio e se ne esce con una frase che comincia con – abbiamo trovato il baco ieri sera – e finisce con - dobbiamo trasporre le cinquecento matrici che usiamo per i test. L’entusiasmo per la prima parte della frase si smorza subito non appena realizzo cosa sottindende la seconda: niente pausa caffè (tè nel mio caso) prima di aver modificato i file visto che con i test fermi nessun altro potrà lavorare.

Mi metto subito al lavoro ed inizialmente penso di fare un programmino in C. Quando mi ricordo (shame on me) che non ho tanto fresca la sintassi del linguaggio penso che farei prima con un paio di righe di bash piuttosto che rinfrescarmi la memoria.

Il problema che devo risolvere consiste nel manipolare i file che contengono le matrici (una per file) e salvare al loro posto la matrice trasposta.

La trasposta di una matrice è una matrice in cui sono state scambiate le righe con le colonne (in pratica la prima riga della matrice diventa la prima colonna della trasposta, la seconda riga rappresenta la seconda colonna e così via…)

La soluzione è più semplice del previsto e la riporto subito prima di commentarla. In particolare mi è piaciuto (perché risalito d’un tratto dagli abissi della memoria) l’uso di xargs che forse potrebbe lasciare qualcuno interdetto

#!/bin/bash
for i in $(seq 1 $3)
do
  head $1 -n $2 | cut -d \  -f $i | xargs
done

Lo script non fa altro che predere una matrice, rivoltarla e stamparla in standard output. A questo punto redirigere l’output in un nuovo file diventa banale, come è banale processare tutti i file in automatico. Torniamo allo script ed al suo commento, Chiamiamolo ad esempio trasponi.

Viene invocato come trasponi file 4 3 per trasporre una matrice, file, di 4 righe per 3 colonne. Sull’output avremo una matrice di 3 righe per 4 colonne. Nel file le matrici sono memorizzate per righe ed in ogni riga un elemento è separato dagli altri da uno spazio.

La riga di codice che crea le diverse righe è head $1 -n $2 | cut -d \ -f $i | xargs e potrebbe anche essersi ridotta in cut $1 -d \ -f $i | xargs ma l’ho scritta in quel modo per evidenziare il numero di righe della matrice da elaborare.

La prima parte del pipe seleziona la colonna da trasformare, l’ultima si occupa di assemblarla come riga.

xargs, di solito, si usa per leggere dallo standard input dei parametri da passare ad un comando. Se non viene specificato si assume che il comando a cui passare i parametri sia echo.
Un altro utilizzo di xargs, magari non così convenzionale, è mettere tutti su una riga i parametri che gli vengono passati in input uno per volta (sfruttando il fatto che il parametro predefinito sia echo).

Le potenzialità di xargs, tra l’altro, non si esaurscono qui, ci sono altre funzioni a cui può assolvere oltre quella canonicamente riconosciuta di “fornitore di parametri”. Potenzialità che saranno oggetto di un ulteriore post.

E questo, per ora, è tutto

Written by eineki

Maggio 4, 2008 alle 12:04 pm

Pubblicato in bash, linux, quick fix