Il sort della bella addormentata

Ormai è passato così tanto tempo dall’ultimo post che mi sembrava inutile riprendere in mano il blog. Ogni tanto torno al pannello di controllo e modifico qualcuno dei post in sospeso, senza peraltro terminarlo, ma poi non posto niente. Tempo Tiranno!

Ieri Qualche giorno fa, però, ho seguito un talk (video su youtube che non trovo più) sulla programming literacy e l’oratore ha illustrato, tra le altre cose, lo sleep sort. Un algoritmo bash, non troppo efficiente a dire il vero, per ordinare dei numeri. Sono rimasto folgorato dal suo contenuto ed ho pensato di postarlo qui.

 #!/bin/bashwhile [ -n "$1" ]; do
     (sleep "$1"; echo "$1") &
     shift 
done 
wait 

Il programma, per me, e semplicemente geniale. Non lo commento per non togliervi lo sfizio di farlo da soli.

Si, prima che me lo facciate notare, lo scrivo che non si tratta solamente di un algoritmo serio. E’ piuttosto un divertissement. Ma poi esistono gli algorimti seri? E cosa li differenzia da quelli che non lo sono? L’efficienza?

Alla prossima, sperando che non sia tra un anno.

1) Un mio neologismo per esprimere in due parole il contenuto della presentazione: Un bravo scrittore sa che per scrivere bene, e migliorarsi, non deve far altro che leggere continuamente libri scritti dai migliori autori nel suo campo. Un programmatore dovrebbe fare lo stesso ma quasi nessuno ha ancora preso coscienza di questo.

Bash: a spasso tra le directory.

La mia home directory è piena zeppa di cartelle e sottocartelle, immagino anche la vostra, perchè preferisco perdere i miei file in una gerarchia ben ordinata di cartelle che mi dia l’illusione, almeno finché non li cerco, che sia facile ritrovare i dati che mi servono.

Per chi utilizza principalmente l’interfaccia grafica la cosa può anche funzionare per chi invece consuma la tastiera e risparmia il mouse spesso questa scelta significa digitare path chilometrici.

Non più. Directory dai nomi lunghi? Path complicati da digitare? $CDPATH è la soluzione a tutti i vostri problemi. Non previene la caduta dei capelli, questo no, ma vi permetterà di risparmiare qualche decina di migliaia di battiture all’anno. I polpastrelli delle vostre dita ve ne saranno grati e voi passerete più piacevolmente il vostro tempo alla tastiera.

Non c’è neanche bisogno di installare pacchetit esoterici, tutto quello che dovrete fare è aggiornale la configurazione di bash.

Continua a leggere “Bash: a spasso tra le directory.”

Cavare una copertina da un file pdf

Se anche non si riesce a cavare sangue da una rapa, sicuramente è possibile creare un file immagine che rappresenti la copertina di un libro in pdf. Avendo cominciato a segnalare ebook da scaricare gratuitamente e legalmente ho dovuto imparare a creare, o estrarre delle immagini dai loro pdf per creare le copertine che accompagnano i post.

Ci sono diversi sistemi per risolvere il problema e ne vedremo alcuni, da quelli più alla portata di tutti ad altri, più comodi ma che necessitano di un terminale, che sono ugualmente alla portata di chiunque, sempre che chiunque ne sia a conoscenza o che lo scopra per errore. 🙂

Continua a leggere “Cavare una copertina da un file pdf”

Libri da scaricare: Bash scripting avanzato

Bash Scripting Avanzato
Bash Scripting Avanzato

Tutto quello che non avete mai osato chiedere sulla programmazione bash. Questo manuale, parliamo di più di ottocento pagine (nell’ultima versione in lingua originale), ha accompagnato spesso le mie nottate insonni, lo so che avrei potuto avere migliore compagnia, ma l’esame di Sistemi Operativi pretende questo ed altro.

A dispetto del titolo non c’è bisogno di alcuna esperienza pregressa, si parte dalle basi della programmazione shell, la programmazione tout court dovrete comunque padroneggiarla, per arrivare a sviscerate tutte le più recondite caratteristiche della bash.

E’ un’altro di quegli ebook da tenere sul desktop e da commentare pesantemente (in tutti i sensi), è un’utile reiferimento a cui attingere quando man bash non basta a risolvere il problema “che ronza nel vostro cervello come un insetto in una coppa di Champagne.”
Continua a leggere “Libri da scaricare: Bash scripting avanzato”

Icone Funzionali

Mettete il caso di dover convertire alcune immagini e di aver deciso di scrivere un post. Oggi vi appesterò con una storia breve sul problema di questa sera ma, siccome scrivere

convert -size 1024×768 *.jpg [1]

non sarebbe stato di grande aiuto, e neanche un gran post, ho pensato di parlare delle icone che stanno alla destra del mio desktop.

Le chiamo icone funzionali perché sono dei lanciatori (launcher) che fanno capo a piccoli programmi bash che mi aiutano in piccoli compiti.
Continua a leggere “Icone Funzionali”

XMLstar: Manipolazione XML a linea di comando

Oggi mi sono imbattuto in una utility interessante: XMLstarlet. Mi ha colpito perché permette di fare, con una discreta velocità, tutto quello che vi può venire in mente con i file xml.

In pratica si tratta di una interfaccia bash verso la libxml2. E’ possibile tra le altre cose, validare, trasformare, selezionare nodi, editare documenti (in batch) formattare e rendere in forma canonica dei documenti xml.

Interessante, ma poco più che una curiosità, il comando ls che rende in xml la directory corrente.

Altra particolarità è la possibilità che offre di passare da formato xml a formato pyx e viceversa. Si tratta di un formato comodo da manipolare con gli strumenti a linea di comando quali ad esempio grep, tail, head e sed che ha la stessa espressività di xml. Chi non ha familiarità con le trasformazioni con le query Xpath, e non volesse spendere tempo a colmare la lacuna, potrà utilizzare strumenti più congeniali per ottenere lo stesso risultato.

Prima di chiudere non mi resta che riportare un’altro link ad un altro rapido tutorial, vecchiotto ma molto valido, sul formato.

Un’ultima cosa: tra la documentazione segnalata troverete riferimento a due programmi xmln e xmlv che non sono altro che il convertitore xml->pyx ed il suo omologo pyx->xml.

Ed ora è davvero tutto.

Basta un click …

… Una spruzzata di pseudo xml e qualche riga di bash per creare applicazioni grafiche.

Stavo pascolando per tutta internet per ingannare il caldo quando mi sono imbattuto in questo programma che, se pur con delle pecche di gioventù mostra buone potenzialità.

Se non volete pasticciare con zenity per dare un’interfaccia grafica ai vostri script bash troverete in BUC una alternativa, a mio parere non altrettanto valida ma sicuramente promettente.

La prospettiva è rovesciata. Se in zenity sono disponibili delle finestre predefinite per interagire con  l’utente, buc vi permette di definire un’interfaccia grafica associando ai controlli degli script bash, che possono anche interagire tra loro. Cuore del sistema sono dei particolari file di configurazione che sul sito ufficiale vengono definiti come file xml.

L’xml di questi file è a dir poco particolare, può, in alcuni casi essere malformato e non passare le verifiche di xmllint. Ho fatto qualche prova perché mi sono stupito quando un piccolo e banale script di hello world non ha prodotto alcun risultato se non una finestra vuota. E’ saltato fuori che avevo saltato un tag e quindi l’xml non poteva essere interpretato correttamente.

L’unico motivo che possa impedire una validazione formale dell’input sarebbe la necessità di dover interpretare file malformati e così ho potuto valutare: le redirezioni vengono interpretate da xmllint come entità e la validazione non va a buon fine. La soluzione di un simile problema potrebbe essere banale, basterebbe inserire gli script con le redirezioni in un elemento CDATA per poter affrontare la validazione. Il programma non lo fa, almeno per ora, anche se lo sforzo per poter inserire questa feature non dovrebbe essere particolarmente importante.

Un altro peccato veniale del progetto è una certa mancanza di coerenza tra i tag, alcuni hanno opzioni specificate come sottoelementi, mentre in altri la stessa opzione viene specificata, per me più naturalmente, come attributo del tag. Mi riferisco agli elemento title dei tag tab ed all’attributo title dell’elemento button.

Altra pecca, l’attributo filter del tag file che può essere multiplo e sarebbe stato espresso più naturalmente come una sequenza di sottoelementi.

A parte questi appunti, che non sono altro che questioni di lana caprina, il progetto è interessante ed è già usabile e ne consiglio il test e l’utilizzo. I ragazzi del Sicilinux stanno facendo un bel lavoro.

Qualche riferimento per approfondire:

Nautilus: aprire una shell in una directory

Una comodità che apprezzo particolarmente è la possibilità di  aprire una shell in una directory semplicemente facendoci click da nautilus.

Per questo, una delle prime cose che faccio dopo aver installato un sistema è inserire nella directory degli script di nautilus questo piccolo script che non fa altro che permettere di aprire una finestra del terminale con la current working directory settata alla directory selezionata in nautilus.

#!/bin/bash
# apre un terminale nella directory selezionata

ERR01="Il comando funziona sulla finestra corrente o su una singola directory"
ERR02="Solo le directory locali possono essere raggiunte"

protocol=`echo $NAUTILUS_SCRIPT_CURRENT_URI | cut -c -7`

if [ $protocol='file://' ]; then
file_count=`echo -en "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" | wc -l`
TARGET=`echo $NAUTILUS_SCRIPT_CURRENT_URI | cut -c 8-`

  if [ $file_count -gt 1 ]; then
    zenity --warning --text "$ERR01"    
  else
    if [ $file_count -eq 1 ]; then
      CANDIDATE=`echo -en "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" | head -n 1`
      if [ -d  $CANDIDATE ]; then
        TARGET=$CANDIDATE
      fi
    fi
    gnome-terminal --working-directory "$TARGET"
  fi
else
  zenity --warning --text "$ERR02"
fi

Stasera ho installato una nuova macchina per un amico e mentre personalizzavo il sistema mi è capitato tra le mani questo file che uso talmente tanto da considerarlo scontato ed ho pensato di utilizzarlo come spunto per questo piccolo post.

Non sarà l’ultimo grido in fatto di scripting ma è comodo e magari, oltre ad aiutare qualcun altro, può essere un piccolo spunto per cominciare ad esplorare la programmazione di Nautilus.

E questo è tutto.

Traduzione a linea di comando

Questa mattina mi son svegliato, ed ho trovato un post stuzzicante che promette, e mantiene, di aggiungere alla linea di comando un semplice traduttore. Si tratta di uno script di una riga che si appoggia a http://www.wordreference.com per effettuare la traduzione.

Alla fine del post c’è la richiesta di spendere qualche minuto attorno a google ed al suo sistema di traduzioni per poter fare la stessa cosa.

una prima versione la trovate quì sotto, non si tratta più di un one line script perché ho l’ossessione di aggiungere parametri a tutto il codice che posso manipolare. Mi passerà.

Il codice non è elegantissimo ma più che qualche minuto non potevo assolutamente dedicargli.

#!/bin/bash
S='auto'
T='it'
if [ "$2" != "" ]; then
  S="$2"
fi
if [ "$3" != "" ]; the
  T="$3"
fi

lynx "http://translate.google.com/translate_t?sl=$S&tl=$T&text=$1" -dump | \
     grep "Suggest a better translation" -B2 | head --lines=1

I parametri sono semplicissimi da usare, ammesso di chiamare tran il file, basta invocarlo con la parola da tradurre come unico parametro. Google cercherà di individuare la lingua della parola e ne restituirà, se riesce, il corrispettivo in italiano.

In caso sia necessario allora si possono specificare anche il codice iso della parola da tradurre, ed il codice della lingua in cui tradurre, rispettivamente come secondo e terzo parametro.

Le migliorie possibili sono tante, ad esempio usare l’opzione -source invece che -dump in lynx in modo da essere sicuri di individuare la parola tradotta nell’html che google restituisce ma il tempo, per ora, è tiranno.