Feeds:
Articoli
Commenti

Archive for agosto 2011

Ci eravamo lasciati con questo semplice script:


#!/bin/bash
 for name in $(ls *.txt)
 do
    without_txt=$(echo $name | cut -d'.' -f1)
    mv -f $name $without_txt.dat
 done

Capire cosa fa è il compito che vi avevo lasciato da svolgere sotto l’ombrellone. L’avevo chiamato “txt2dat.sh”, e 2 (“two” in inglese) si pronuncia come “to”. Ecco quindi la risposta. Lo script semplicemente converte i fle .txt della directory in files con estensione .dat Può essere utile fare questa conversione per esempio se si usa MATLAB, che interpreta automaticamente i file con estensione .dat come file di dati.

Nello script ci sono alcune cose interessanti, come il ciclo “for”, l’uso della pipe “|” per concatenare due comandi e l’uso del carattere $ per estrarre il valore di una variabile. Ma veniamo alla spiegazione riga per riga.

La direttiva:

#!/bin/bash

serve a segnalare che il contenuto del file deve essere interpretato con la bash shell (in ogni distribuzione Linux sono implementate diverse shells).

Il comando:

 for name in $(ls *.txt)

segna l’inizio del un ciclo for annidato tra i comandi “do” e “done”.

Il comando:

 without_txt=$(echo $name | cut -d'.' -f1)

definisce la variabile “without_txt”, ché è il nome del file privato dell’estensione .txt Per ottenerlo indirizziamo l’output del comando “echo $name”, che scrive il nome del file completo (esempio: “dati.txt”) all’input del comando “cut -d’.’ -f1” che ne restituisce la parte che sta prima del punto. Per provare che funziona, possiamo semplicemente inserire dal terminale un comando come questo:

giovanni@fz6:~> echo qui.quo | cut -d’.’ -f1
qui

Cosa fa il comando “cut” in questo caso è semplice, ma per saperne di più posso consultare la man page:
giovanni@fz6:~> man cut

Infine il comando:

 mv -f $name $without_txt.dat

aggiunge l’estensione .dat al nome del file file.

Infine notiamo che questo comando:

mv -f $name ${name%.txt}.dat

ha lo stesso effetto delle righe 4 e 5 (il segno % elimina il .txt dal nome del file), ma non avrei usato la pipe…

Read Full Post »

In un articolo precedente, ho parlato del terminale e dei comandi della shell. Una delle cose che rende la shell uno strumento potente, è la possibilità mettere una lista di questi comandi in un file di testo, che chiameremo per esempio txt2dat.sh. Dopo aver reso eseguibile il file:

>chmod +x txt2dat.sh

Eseguiremo il nostro codice con il comando:

>./txt2dat.sh

Gli script possono essere complessi a piacere, ma per ottenere qualcosa di utile non è necessario inoltrarsi in tecniche di programmazione complesse e fare i propri script è sempre una attività divertente. Siccome precisamente in questo momento sei sotto l’ombrellone, magari con l’iPad in mano, ti lascio come compito per l’estate di spiegare esattamente cosa va questo script Linux:


#!/bin/bash
 for name in $(ls *.txt)
 do
    without_txt=$(echo $name | cut -d'.' -f1)
    mv -f $name $without_txt.dat
 done

Read Full Post »

R è un linguaggio di programmazione orientato alla statistica e all’analisi dati. R è open source, molto utilizzato in diverse discipline scientifiche e può essere scaricato e usato liberamente a partire da questo link:

The R Project for Statistical Computing

Il fatto che questo software sia open source e gratuito porta con sé numerosi vantaggi rispetto a soluzioni commerciali. A questi vantaggi si aggiunge il fatto che ha un’ampia diffusione. Non mi dilungo su questi due aspetti, che tuttavia sono molto importanti nella scelta di un linguaggio di programmazione su cui spendere le proprie energie intellettuali. Se ancora non sei convinto ad usare R, guarda il video di questo scienziato che spenderà qualche minuto per convincerti:

dello stesso autore, su youtube trovate anche video didattici sull’uso di R.

A livello zero, R può essere utilizzato come una calcolatrice, per esempio:

> 5 + 3*2 # calcolo una semplice espressione aritmetica
[1] 11
> a <- 5 + 3*2 # assegno l’espressione aritmetica alla variabile a
> a                    # ecco il valore di a
[1] 11
> a +1              # ecco il valore di a + 1
[1] 12
> pi                  # R “conosce” il valore della costante pi greca
[1] 3.141593
> sin(pi/2.)   # applico la funzione sin(x)
[1] 1

Il simbolo # indica un commento, cioè tutto quello che segue questo simboletto non viene interpretato da R e quindi può essere usato per spiegare quello che si sta facendo.

Per mettere R alla prova, partiamo ora dalla distribuzione di probabilità di Gaus, detta anche distribuzione normale. Per generare 10 000 numeri casuali con una distribuzione normale, basterà lanciare il comando:

> x  <- rnorm(10000)

che genera una array x con 10 000 numeri con una distribuzione normale (sigma = 1, media = 0)

Per ottenere un istogramma (con 50 bin) della distribuzione che abbiamo generato è sufficiente il comando:

> hist(x,50)

Di default la distribuzione è generata con un valore medio uguale a zero e una deviazione standard uguale a 1. Questi due valori di defalut ovviamente possono essere cambiati. Per esempio, il comando:

x  <- rnorm(10000, mean=10., sd=2)

genera 10 000  numeri con un valore medio (mean) uguale a 10 e una deviazione standard uguale a 2.

Per mettere alla prova la potenza di R, ora generiamo 10 000  array x, ognuno fatto di 10 000 numeri. Di ognuno di questi 10 000 array calcoliamo la media. Per questo esperimento numerico dobbiamo quindi generare 100  milioni di numeri casuali! Questa operazione su un pc  richiede solo qualche secondo; 100  milioni di numeri in qualche secondo, non male. Con R è sufficiente lanciare il comando:

xx <- replicate(10000,mean(rnorm(10000)))

Quindi plottiamo l’istogramma con il comando:

> hist(xx,50)

Se diamo un’occhiata all’asse orizzontale, notiamo che la gaussiana è ora 100 volte più stretta di prima, come ci aspettiamo. 100 infatti è la radice quadrata di 10 000, che è il numero di valori su cui abbiamo calcolato la media. In generale infatti l’errore sulla stima della media è uguale alla deviazione standard divisa per la radice quadrata del numero di valori sui quali la media è stata calcolata.

Read Full Post »

Dopo l’uscita della nuova versione del meraviglioso sistema operativo mac OS X Lion, questo articolo devo proprio scriverlo. L’interfaccia utente dei sistema operativo installato nei Mac è straordinaria, ma non intacca la potenza e l’utilità del terminale unix.

Il titolo  di questo articolo contiene tre parole difficili: terminale, unix, shell. Ma non è mia intenzione allontanare i lettori dal mio blog, anzi, quello che sto per spiegare è molto semplice e utile in molte situazioni. Se cercate con google su questo argomento troverete un’infinità di materiale più o meno tecnico, più o meno complicato. Tuttavia i comandi di base da conoscere per usare in modo proficuo il Terminale non sono molti. Prima di tutto occorre spiegare gli arcani nomi che ho usato:

Cos’è il Terminale? In passato il Terminale era un monitor e una tastiera, ma oggi è una applicazione che permette di interagire con il proprio computer tramite una tastiera. Quando parlo di “interagire” intendo fare quello che “normalmente” si fa con mouse e tastiera: creare files, folders, lanciare un programma, ecc…

Cos’è unix? Unix è il Sistema Operativo, cioè il software di base che permette al computer di funzionare. Quando parlo di “terminale unix” intendo che parlo di una applicazione che mi permette di comunicare con un sistema operativo unix.

Cos’è la shell? La “shell” è l’interprete dei comandi. Questo significa che se digiti il comando “ls” la shell riconosce il comando, manda l’istruzione al sistema operativo, che ti restituisce un risultato (l’elenco dei files). Nei computer nulla accade per caso!

Mi sembra utile fornire una lista dei comandi che considero essenziali per cominciare:

  • “pwd” Scrive la directory corrente
  • “ls” Scrive la lista dei files presenti nella directory corrente
  • “cd nome_directory” Entra nella directory nome_directory
  • “mv” Rinomina un file o una directory
  • “cp file1 file2” Copia file1 in file2
  • “rm” Cancella un file
  • “rmdir” Cancella una directory
  • “mkdir” Crea una directory
  • “cat nome_file” Scrive brutalmente il contenuto del file nome_file.
  • “more nome file” Simile a “cat”, ma impagina il file di testo
  • “|” Questa è la pipe. Permette di concatenare due o più comandi. Per esempio “cat nome_file | more”
  • “man”. Restituisce la man page di un comando, per esempio “man ls” spiega cosa fa il comando “ls” e tutte le opzioni che si possono usare.

Ma perché  usare il Terminale quando i computer hanno una meravigliosa possibilità di fare tutto (o quasi tutto) con il mouse? Credo che le ragioni siano almeno tre:

  1. E’ semplice! Basta memorizzare una manciata di comandi e potete fare quasi tutto.
  2. E’ potente! Dopo un po’ di pratica, vedrete che in molti casi con il Terminale sarà possibile fare le cose più velocemente che con il mouse. Per esempio se devo spostare nel folder “paperinopoli” tutti i files che iniziano con “paperino”, digiterò “mv paperino* paprinopoli/”. La shell è anche un linguaggio di programmazione. Questo significa che è possibile anche raggruppare complesse sequenze di comandi in uno script.
  3. Accede a programmi scritti per lui! Questo è un punto importante. Vi sono diversi programmi che funzionano solo se lanciati da un terminale. La ragione è semplice: i programmi senza interfaccia grafica (finestre, bottoni, menù, ecc..) funzionano praticamente su tutti i computer e sono più semplici da scrivere. Potrete anche voi scrivere i vostri programmi, senza bisogno di studiare complessi tomi dal titolo “learning objective C and cocoa for mac OS X”, per riuscire dopo un mese a scrivere un programma che, solo sui computer Mac, apre una finestrella con scritto “Ciao Mondo!”.  Un altro esempio: se uno scienziato inventa un potente algoritmo che cambierà il mondo, potrà scrivere un programma in C e condividere con il mondo intero il frutto delle sue idee. E con questo spero di avervi convinto che del Terminale non se ne può proprio fare a meno.

Read Full Post »