Breve introduzione a Linux (e dintorni...)
Transcript
Breve introduzione a Linux (e dintorni...)
Breve introduzione a Linux (e dintorni...) Luca Baldini, INFN - Pisa versione 1.1 23 dicembre 2003 Indice Introduzione Indice delle versioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 1 Login e Logout: la shell 1.1 Linux . . . . . . . . . . . . 1.2 Il Login . . . . . . . . . . . 1.3 La shell ed i comandi Linux 1.4 Il Logout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 4 5 5 6 2 Il filesystem Linux 2.1 I file Linux . . . . . . 2.2 Navigare nel filesystem 2.2.1 pwd . . . . . . 2.2.2 ls . . . . . . . . 2.2.3 cd . . . . . . . 2.3 Modificare il filesystem 2.3.1 mkdir . . . . . 2.3.2 rmdir . . . . . 2.3.3 rm . . . . . . . 2.3.4 cp . . . . . . . 2.3.5 mv . . . . . . . 2.3.6 chmod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 7 8 8 8 9 10 10 11 11 12 12 12 3 I file di testo 3.1 Visualizzare i file . . . . 3.1.1 more . . . . . . . 3.1.2 less . . . . . . . . 3.1.3 head . . . . . . . 3.1.4 tail . . . . . . . . 3.2 Modificare i file: emacs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 14 14 14 15 15 15 4 Qualcosa di più utile 4.1 I processi . . . . . 4.1.1 ps . . . . . 4.1.2 top . . . . . 4.1.3 kill . . . . . 4.2 La stampa . . . . . 4.2.1 lpr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 16 16 17 17 17 17 . . . . . . . . . . . . . . . . . . 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 18 18 18 18 19 19 19 19 19 19 20 20 20 21 21 5 Un 5.1 5.2 5.3 5.4 5.5 word-processor avanzato: LATEX Dalla stesura alla stampa . . . . . . Stesura del documento LATEX . . . . LATEX e la matematica . . . . . . . . Inserire le figure . . . . . . . . . . . Le funzioni avanzate di LATEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 22 23 25 26 27 6 Un 6.1 6.2 6.3 6.4 semplice programma di plotting: Lanciare gnuplot . . . . . . . . . . . Visualizzare una serie di dati . . . . Formattazione dei grafici . . . . . . . Fit dei dati . . . . . . . . . . . . . . gnuplot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 28 30 31 32 4.3 4.4 4.5 4.6 4.2.2 lpq . . . . . . . . . . 4.2.3 lprm . . . . . . . . . Accesso alle periferiche . . . 4.3.1 mount . . . . . . . . 4.3.2 umount . . . . . . . Accesso al floppy disk . . . 4.4.1 mdir . . . . . . . . . 4.4.2 mcopy . . . . . . . . 4.4.3 mdel . . . . . . . . . L’accesso alle risorse di rete 4.5.1 ping . . . . . . . . . 4.5.2 telnet . . . . . . . . 4.5.3 ssh . . . . . . . . . . 4.5.4 ftp . . . . . . . . . . Il compilatore C++ . . . . 4.6.1 g++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A Un esempio di fit con Scilab 36 A.1 Minimo χ2 nel caso lineare . . . . . . . . . . . . . . . . . . . . . 36 A.2 Implementare il fit con Scilab . . . . . . . . . . . . . . . . . . . . 37 Bibliografia 39 2 Introduzione Questo breve tutorial raccoglie un certo numero di informazioni (per la verità piuttosto superficiali, bisogna dirlo) sul sistema operativo Linux e sui principali pacchetti software, built in (come Emacs e LATEX) e no (come gnuplot), comunemente usati negli ambienti scientifici. Sono tutte cose che il “fisico quadratico medio” deve imparare, una volta nella vita; e allora... perchè non cominciare il prima possibile? La scelta degli argomenti da toccare, è bene notarlo, è stata eseguita secondo un criterio minimale; nel senso che, giunto all’ultima pagina, il lettore non saprà utilizzare Linux, non saprà utilizzare Emacs e men che meno LATEXe gnuplot (a meno che non sapesse già farlo sin dall’inizio, ma questo è un altro discorso...). L’idea è che uno dovrebbe acquisire un certo numero di idee fondamentali in modo da essere capace di andare avanti da solo, minimizzando in un certo senso il trauma dovuto all’impatto iniziale con questo mondo che per molti, probabilmente, potrebbe essere nuovo. D’altra parte la documentazione disponibile in rete è talmente vasta e cosı̀ facilmente reperibile, che c’è solo l’imbarazzo della scelta. Buona fortuna! Indice delle versioni • versione 1.1 Data: 22 dicembre 2003. Descrizione: Alcune piccole correzioni ortografiche e sintattiche. Credits: R. Metere • versione 1.0 Data: 21 febbraio 2003. Descrizione: versione iniziale. Credits: F. Angelini, B. Barsella, L. Martinelli. Segnalare errori ed inesattezze a [email protected]. 3 Capitolo 1 Login e Logout: la shell Nel 1965 i laboratori della Bell Telephone (una divisione della AT&T) decisero di interrompere una collaborazione avviata con la General Electric ed il Project MAC del MIT per la scrittura di un sistema operativo che avrebbe dovuto chiamarsi Multics. Purtuttavia due programmatori, Ken Thompson e Dennis Ritchie, ritennero che fosse un peccato sprecare il lavoro fatto; i loro sforzi culminarono nella realizzazione di una prima versione del sistema che un altro ricercatore, Brian Kernighan (futuro “inventore” del linguaggio di programmazione C), decise di chiamare, in opposizione a Multix, Unix. Nel 1973 Unix, originariamente scritto in assembly language venne interamente tradotto in C; questa riscrittura, è facile immaginarlo, aumentò notevolmente la portabilità del codice e segnò l’inizio della sua diffusione. Alla fine degli anni ’70 la AT&T fornı̀ a basso costo le licenze del sistema operativo a diversi college ed università americane ed in pochi anni la popolarità di Unix riuscı̀ a superare i confini ristretti delle istituzioni accademiche; ovviamente col tempo le cose sono andate avanti ed oggi esistono svariate versioni commerciali del sistema, per le diverse piattaforme hardware. Linux è un sistema operativo Unix a tutti gli effetti; è una sorta di “clone”, riscritto da zero, di Unix. La cosa interessante è che nessuna istituzione commerciale è stata coinvolta nella sua redazione (ed in effetti é assolutamente freeware); esso è il risultato dello sforzo congiunto di migliaia di persone che, in tutto il mondo, hanno dedicato (e continuano a dedicare) tempo e fatica per perfezionare ciò che era iniziato come progetto di esplorazione del chip 80386. Può essere curioso ricordare che uno dei primi “prodotti” di Linus Torvalds (l’ideatore e padre di Linux) fu un programma che, tramite due processi funzionanti in multitasking, doveva stampare alternativamente AAAA e BBBB. Ne è stata fatta di strada per arrivare al sistema operativo che conosciamo oggi! Un ultima cosa: nel seguito parleremo solamente di Linux, ma intendiamoci: probabilmente la maggior parte di quel che segue funzionerebbe altrettanto bene su un qualsiasi sistema Unix. 1.1 Linux Linux è un sistema operativo multi-utente e multi-tasking. Preciseremo il senso di questa affermazione “strada facendo”; purtuttavia spendere due parole 4 al proposito è probabilmente un buon punto di partenza. Multi-utenza significa che diversi utenti possono avere diversi dati, programmi ed impostazioni di sistema memorizzate separatamente sulla stessa macchina; la struttura del filesystem Linux è basata, come vedremo, sui concetti di proprietà e permesso. Per certi versi è ciò che accade nei sistemi operativi come Windows NT/2000 e simili; la differenza radicale è che Linux permette a piú utenti di accedere simultaneamente al sistema... Avremo occasione di apprezzare, per lo meno in parte, le nuove possibilità che tutto questo apre. Multi-tasking significa semplicemente che più comandi possono essere eseguiti contemporaneamente. Anche di questo ci occuperemo più in dettaglio tra breve. Come tutti i sistemi Unix, Linux è formato da un kernel e da programmi di sistema, oltre ovviamente alle applicazioni propriamente dette, con cui l’utente fa il lavoro vero e proprio. Il kernel costituisce il cuore del sistema operativo; avvia i processi e permette loro di operare contemporaneamente, assegna le risorse di sistema ai vari processi ed in definitiva fornisce tutti gli strumenti necessari ad implementare i servizi che normalmente si richiedono ad un sistema operativo; questa implementazione avviene attraverso chiamate di sistema. I programmi di sistema, ed a maggior ragione le applicazioni, girano “sopra” al kernel, in quella che si chiama modalità utente. 1.2 Il Login Una macchina Linux deve “sapere chi si trova di fronte” prima di permettere l’accesso al sistema. A tale scopo l’utente è tenuto a fornire il proprio username e la propria password (che presumibilmente sono state fornite dall’amministratore di sistema) per potersi “loggare” (cioè eseguire il Login) alla macchina. Esistono varie schermate di Login, che possono essere grafiche o testuali a seconda delle impostazioni di sistema e della distribuzione di Linux utilizzata... Ma questo è un altro discorso (per altro complicato) e ci porterebbe lontano dal punto essenziale della questione, che di complicato non ha niente. Una sola raccomandazione: Linux (al contrario di DOS e dei sistemi Windows in generale, come probabilmente qualcuno sa) distingue maiuscole e minuscole (cioè è case sensitive) per cui il nome utente, la password ed i comandi in generale devono essere digitati esattamente come sono! 1.3 La shell ed i comandi Linux Una volta loggato sulla macchina, l’utente può aprire una shell (se il sistema non è configurato per farlo automaticamente). La shell è il luogo in cui si impartiscono i comandi Linux; è per certi aspetti l’equivalente del prompt di DOS sulle macchine Windows, per chi ha un po’ di esperienza al proposito. Esistono svariati tipi di shell, che sostanzialmente differiscono tra di loro per quanto riguarda il linguaggio di scripting ed alcune altre funzionalità che probabilmente l’utente medio tipicamente non utilizza. Anche questo è un discorso che ci porterebbe molto lontano e non è il caso di approfondirlo adesso. L’uso della shell è semplicissimo e consiste essenzialmente nello scrivere un comando Linux valido e nel premere il tasto di INVIO. Ogni comando può avere delle opzioni (che sono precedute da un carattere - e ne determinano l’esito) e 5 può accettare dei parametri; in sostanza la struttura tipica di un comando Linux è del tipo: >comando -opzione argomento Sarà tutto più chiaro tra poco, quando vedremo alcuni esempi espliciti. Vale la pena di notare che Linux ha un efficiente sistema di documentazione che può rivelarsi utilissimo quando non si ricorda con precisione la sintassi di un comando o l’effetto di un opzione sul comando stesso. E’ sufficiente digitare dalla shell: >man comando per avere sul display tutta la documentazione disponibile (si torna alla shell semplicemente premendo q). Prima di andare avanti è utile ricordare che ci sono alcuni modi per “riprendere il controllo della shell” nel caso questo dovesse momentaneamente sfuggire (il che accade tipicamente quando si esegue un comando che si apetta l’inserimento di dati da parte dell’utente oppure quando si avvia un programma la cui esecuzione impiega più tempo del previsto): 1. CTRL + c Solitamente elimina ogni programma in esecuzione e riporta alla linea di comando. 2. CTRL + z Sospende il processo corrente mentre è in esecuzione e riporta alla linea di comando. 1.4 Il Logout Il processo di Logout chiude tutti i file che sono (per qualche ragione) aperti e termina ogni programma mandato in esecuzione dall’utente. E’ buona regola scollegarsi sempre, una volta che abbiamo finito di utilizzare il computer; questo permette agli altri utenti, eventualmente collegati da un terminale remoto, di utilizzare nel modo più efficiente possibile le risorse di sistema. Per fare il logout da una sessione testuale è sufficiente digitare dalla shell: >logout ed il sistema torna al prompt di login; un nuovo utente può collegarsi. Se la sessione è grafica si può in generale avviare la procedura di logout (ed eventualmente quella di spegnimento della macchina) accedendo all’apposito menu a tendina con il mouse. 6 Capitolo 2 Il filesystem Linux A differenza di ciò che accade nei sistemi operativi tipo Windows, in cui i vari drive sono associati alle lettere A, B, C, D ecc., il filesystem di Linux ha un’unica directory radice (che si chiama root e che si indica con il simbolo /). La directory root può contenere file ed altre directory e le directory dei livelli sottostanti possono a loro volta fare altrettanto. La struttura fisica dell’hardware è in un certo senso “nascosta” all’utente Linux: i drive appaiono semplicemente come sottodirectory della root (come dire che un hard disk non è altro che una directory...). Questa gestione del filesystem ha numerosi vantaggi che non è il caso di discutere qui. Ogni utente ha inoltre una home directory, che non ha niente di particolare a parte il fatto di essere quella in cui l’utente stesso si trova immediatamente dopo il Login. 2.1 I file Linux I file Linux hanno tre attributi: r, w ed x (che stanno per read, write ed execute); come dire che un file si può leggere, scrivere ed eseguire. O meglio che un determinato utente può avere (o non avere) i privilegi necessari per leggere, scrivere od eseguire un determinato file. Qualsiasi combinazione di questi tre attributi è ammissibile per il sistema operativo, anche se non tutte sono cosı̀ sensate; Linux confida nella ragionevolezza dell’utente e lo prende alla lettera... Ogni file Linux ha un proprietario (che è un utente con un account valido sulla macchina) ed ogni proprietario può appartenere ad un gruppo di utenti. I permessi su ogni file sono settati su tre livelli: quello del proprietario del file, quello del gruppo a cui appartiene il proprietario e quello di tutti gli altri utenti del sistema; tanto per fare un esempio, è possibile che un file sia leggibile, scrivibile ed eseguibile dal proprietario, solamente leggibile dal gruppo del proprietario ed assolutamente inaccessibile a tutti gli altri. Vedremo tra poco come è possibile visualizzare (ed eventualmente cambiare) i permessi relativi ad un determinato file o ad una directory. 7 2.2 Navigare nel filesystem Esiste un certo numero di comandi che sono dedicati alla navigazione nel filesystem e ne vedremo tra breve alcuni esempi; dovrebbero essere più o meno sufficienti per sopravvivere nel sistema, ma è sempre importante ricordare che ogni comando può avere un gran numero di opzioni che in generale è utile conoscere per “soddisfare” in pieno le proprie esigenze (ed il comando man può essere provvidenziale, a volte...). 2.2.1 pwd E’ l’acronimo di present work directory e restituisce sullo schermo il nome della directory corrente. E’ sufficiente digitare pwd per sapere dove siamo; ad esempio: >pwd /afs/pi.infn.it/user/lbaldini > 2.2.2 ls Elenca semplicemente i file contenuti in una certa directory (più o meno l’equivalente di dir in DOS); se l’utente non passa alcun argomento al comando, elenca i file nella directory corrente. Ad esempio: >ls Ciao.doc Temp ClusterAxes.eps > Cioè la directory contiene tre oggetti. A questo livello non siamo in grado di dire se essi sono files o directory. Per far questo è necessario invocare il comando con l’opzione -l: >ls -l total 5 -rw-rw-r-drwxrwxr-x -rw-rw-r-> 1 2 1 lbaldini glast lbaldini glast lbaldini glast 36352 2048 21847 Dec 20 18:18 Ciao.doc Jul 7 2002 Temp Jul 24 2002 Cluster.ps Adesso la soluzione si presenta molto più complicata; cerchiamo di chiarirla brevemente. La prima riga dice quanti sono gli oggetti nella directory (in questo caso cinque...capiremo tra un attimo il motivo per cui ne sono elencati solamente 3). Le linee successive visualizzano alcuni dettagli sugli oggetti in questione. Il primo campo indica se si tratta di un file (-), di una directory (d) o di un link (l); di seguito compaiono i permessi per il proprietario, per il gruppo del proprietario e per l’utente generico (r, w ed x indicano rispettivamente che l’utente possiede il permesso di lettura, scrittura ed esecuzione, mentre il simbolo - indica che il corrispondente permesso è disabilitato). Ad esempio -rw-rw-r– indica un file che il proprietario ed il suo gruppo possono leggere e modificare, 8 mentre tutti gli altri utenti possono solamente leggere. Invece Temp è una directory e cosı̀ via... Il campo successivo nella linea indica il numero di hard link all’oggetto in questione, ma per noi è poco importante. Seguono dunque il nome del proprietario (in questo caso lbaldini) e del gruppo (glast). Infine vediamo la dimensione dell’oggetto su disco, la data della sua ultima modifica ed il nome; da notare che, nel caso delle directory, la dimensione non corrisponde allo spazio su disco occupato dal contenuto, ma a quello occupato dal file dati che controlla la directory stessa. In generale Linux non mostra all’utente (a meno che esso non lo richieda esplicitamente) tutti i file contenuti in una directory. In particolare il semplice comando ls “nasconde” i file che cominciano con un punto (generalmente si tratta di file di configurazione). Per visualizzare tutti i file si può utilizzare l’opzione -a di ls: >ls -a . .. Ciao.doc Temp ClusterAxes.eps > Adesso compaiono anche gli oggetti . (che in Linux sta per “directory corrente”) e .. che viceversa indica la directory che nel filesystem si trova al livello immediatamente superiore rispetto a quella corrente. Notiamo che l’oggetto . esiste in tutte le directory e che .. esiste in tutte le directory fatta eccezione per la directory root (/), che si trova in assoluto al livello più alto nel filesystem. Il comando ls può accettare un argomento, che indica la directory della quale si vogliono elencare gli oggetti: >ls -a Temp . .. Luca.jpg > In questo caso ci dice che la directory Temp contiene (oltre ovviamente a . e ..) un solo file che si chiama Luca.jpg. Prima di andare avanti, un trucco utilissimo per risparmiare tempo: nei sistemi Linux il tasto TAB funziona da auto completion, cioè completa automaticamente i nomi di comandi od oggetti del filesystem, una volta che l’utente ne abbia scritto una parte abbastanza lunga da rimuovere eventuali ambiguità. Provare per credere, è più facile a dirsi che a farsi! 2.2.3 cd Esattamente come in DOS, questo comando serve per cambiare directory; necessita, come argomento, del nome della directory di destinazione. Il percorso verso quest’ultima può essere quello assoluto (cioè partendo da root) oppure quello relativo (cioè partendo dalla directory corrente). L’esempio seguente, che unisce i pochi comandi visti sino ad adesso, dovrebbe chiarire le idee: 9 >pwd /afs/pi.infn.it/user/lbaldini >ls Ciao.doc Temp ClusterAxes.eps >cd Temp >ls Luca.jpg >cd . >ls Luca.jpg >cd .. >ls Ciao.doc Temp ClusterAxes.eps >cd /afs/pi.infn.it/user/lbaldini/Temp >ls Luca.jpg > Notiamo che il comando cd . non fa niente (essendo . la directory corrente), mentre cd .. porta nella directory immediatamente superiore nel filesystem. La documentazione di Linux contiene un’esposizione esauriente di tutte le possibili opzioni del comando; per visualizzarla, al solito: >man cd (dopo di che barra spaziatrice o frecce per scorrere e q per tornare alla shell). 2.3 Modificare il filesystem Ovviamente navigare non è l’unica cosa che si può fare col filesystem... Esistono comandi per creare, copiare, muovere file e cosı̀ via. Al solito diamo un’occhiata a quelli veramente indispensabili. 2.3.1 mkdir Come si può intuire dal nome, crea una directory e richiede come argomento il nome della directory da creare. Al solito il percorso può essere assoluto o relativo; ovviamente se non si specifica niente, il nuovo oggetto viene creato nella directory corrente. Esempio: >pwd /afs/pi.infn.it/user/lbaldini >ls Ciao.doc Temp ClusterAxes.eps >mkdir NewDirectory 10 >ls Ciao.doc Temp ClusterAxes.eps NewDirectory > Un consiglio: sotto Linux è buona norma evitare gli spazi all’interno dei nomi di file o directory! 2.3.2 rmdir E’ il contrario del comando precedente e semplicemente rimuove una directory esistente, a patto che sia vuota: >ls Ciao.doc Temp ClusterAxes.eps NewDirectory >rmdir NewDirectory >ls Ciao.doc Temp ClusterAxes.eps > Come vedremo tra un attimo, per cancellare una directory non vuota è necessario usare il comando rm con l’opzione -f. 2.3.3 rm Rimuove il file che gli viene passato come argomento e la sintassi è analoga a quella di rmdir (solo che, ovviamente, accetta come parametro un file e non una directory). Ha alcune opzioni che forse vale la pena di conoscere: 1. -i il comando agisce in modo interattivo e chiede conferma prima di cancellare ogni file; caldamente consigliata quando si lavora a notte fonda! 2. -f il comando agisce in modo forzato senza tener conto dei permessi del proprietario del file. 3. -r il comando agisce in modo ricorsivo: con questa può accettare il nome di una directory come argomento ed in tal caso cancella ricorsivamente tutto il contenuto della directory stessa. Un breve commento: il risultato del comando rm è per ceri versi “più irreversibile” di quanto accada su altri sistemi operativi, nel senso che recuperare un file cancellato per sbaglio può essere, sotto Linux, un’impresa veramente disperata. Quando l’utente esegue il comando, ciò che fa la macchina è cancellare l’indirizzo che identifica la zona di memoria in cui i dati in questione sono fisicamente contenuti; dopo di che il filesystem tende a “rimodellarsi” piuttosto velocemente ed è piuttosto probabile che non occorra molto tempo prima 11 che questa zona di memoria venga effettivamente riscritta. Se proprio dovesse capitarvi di cancellare dei dati essenziali il consiglio è il seguente: smontare immediatamente il filesystem incriminato (impareremo che cosa vuol dire e come si fa), quindi rimontarlo in modalità read only e sperare che qualche programmino particolarmente intelligente possa aiutarvi. In ogni caso può essere buona abitudine utilizzare rm in modo interattivo (con l’opzione -i) e, cosa forse più utile, evitare di lavorare fino a notte fonda dopo una giornata faticosa ed una cena pesante! 2.3.4 cp E’ l’analogo di copy in DOS e serve per copiare un file di partenza (che viene passato come primo argomento) in un file o in una directory di destinazione (che costituisce viceversa il secondo argomento). Ad esempio il comando: >cp *.doc Temp > copia tutti i file il cui nome termina per .doc nella directory Temp. Il simbolo * è un carattere speciale per Linux ed è spesso molto utile per esguire le operazioni desiderate nel modo più rapido possibile. D’altra parte: >cp Ciao.doc Salve.doc > crea una copia del file Ciao.doc nella directory corrente chiamandola Salve.doc. 2.3.5 mv Serve per rinominare un file: >mv Ciao.doc Salve.doc > oppure per spostarlo in una directory di destinazione, se quest’ultima viene specificata: >mv Ciao.doc Temp > Per inciso notiamo che, dopo il primo comando, il file Ciao.doc non esiste più! 2.3.6 chmod Serve essenzialmente per cambiare i permessi su un file ed è spesso un comando veramente indispensabile. L’utente deve passare al comando il livello del permesso che vuole cambiare (u = proprietario, g = gruppo, o = utente generico), l’operazione da eseguire (+ = aggiungere permesso, - = togliere permesso), il tipo di permesso (r = lettura, w = scrittura, x = esecuzione) ed infine il nome del file su cui settare i nuovi permessi. E’ più semplice di quello che sembra; ad esempio: >chmod u-w Cluster.eps > 12 toglie al proprietario i privilegi necessari per poter modificare il file Cluster.eps. Con il comando ls -l, che abbiamo già visto, è possibile verificare facilmente il funzionamento di chmod. 13 Capitolo 3 I file di testo Al di là dei file di testo propriamente detti, molte applicazioni Linux (ed il sistema stesso!) utilizzano file di configurazione di tipo testuale, per cui è essenziale avere strumenti per visualizzare (ed eventualmente modificare) gli oggetti di questo tipo. 3.1 Visualizzare i file Linux offre un ampio set di comandi dedicati alla visualizzazione dei file di tipo testuale. Di seguito elenchiamo i principali; al solito le pagine man sono uno strumento utile per esplorare le svariate opzione che ognuno di questi comandi prevede. 3.1.1 more Accetta come argomento un file e ne visualizza il contenuto sullo schermo; per esempio >more Cluster.eps visualizza il contenuto del file Cluster.eps. La barra spaziatrice fa avanzare di una pagina, mentre il tasto b riporta indietro di una pagina; si torna alla shell premendo il tasto q. Le pagine man dovrebbero illustrare l’elenco completo dei comandi che si possono usare all’interno di more. 3.1.2 less La sintassi ed il funzionamento sono essenzialmente identici a quelli di more: >less Cluster.eps La differenza è che dovrebbe essere più facile muoversi all’interno del documento (in particolare si possono usare le frecce direzionali...). 14 3.1.3 head Visualizza le prime 10 righe (ma il numero può essere modificato utilizzando l’opportuna opzione) del file che gli viene passato come argomento. La sintassi è la solita: >head Cluster.eps E’ utile quando si vuole dare una sola occhiata ad un file. 3.1.4 tail Al contrario del precedente visualizza le ultime righe di un file. 3.2 Modificare i file: emacs La visualizzazione non è certo l’unica cosa di cui uno ha bisogno, lavorando con i file di tipo testuale; emacs è probabilmente l’editor di testo più diffuso tra gli utenti Linux, ormai. Descrivere, sia pur in modo sommario, le sterminate funzionalità di emacs ci porterebbe lontano dal filo della discussione; d’altra parte il programma ha un ampio sistema di documentazione integrata che dovrebbe essere più che sufficiente per cavarsela in ogni situazione. Essenzialmente si può aprire un file con emacs semplicemente digitando dalla shell: >emacs Cluster.eps Fatto questo, emacs funziona più o meno come un qualsiasi editor di testo; da notare che offre un grandissimo numero di comandi da tastiera (ad esempio CTRL + x CTRL + s per salvare...) che rendono veramente veloce ed efficiente (per lo meno per gli esperti) l’editing. Al solito provare a lavorare con emacs è il miglior modo per imparare ad usarlo. 15 Capitolo 4 Qualcosa di più utile E’ chiaro che dare un’occhiata ad un file di testo ed eventualmente modificarlo non è granchè... Ci sono molte altre cose che, presumibilmente, un utente vorrebbe essere in grado di fare (stampare, gestire le periferiche, accedere alla rete, ecc. ecc.); ne vedremo (molto superficialmente) alcune. 4.1 I processi Ogni comando Linux crea un processo che il sistema operativo esegue fino a quando non finisce o viene interrotto. Il punto fondamentale è che, essendo multitasking, Linux permette di mandare in esecuzione più di un processo contemporaneamente; permette inoltre di mandare in esecuzione processi in background (o, come si dice, dietro le quinte) semplicemente facendo seguire un & al comando. Un esempio può essere utile per chiarire le idee. Supponiamo di voler aprire con emacs il file Cluster.eps; possiamo farlo normalmente: >emacs Cluster.eps oppure possiamo farlo in background: >emacs Cluster.eps & [2] 12563 > La differenza, come si vede, è che nel secondo caso il sistema torna alla linea di comando e la shell è di nuovo utilizzabile, mentre nel primo la shell è inutilizzabile fino a che non chiudiamo emacs (possiamo sempre aprire una nuova shell...). Per completezza, i numeri [2] 12563 identificano il processo all’interno del sistema operativo. Linux offre un set di comandi per monitorare i processi ed eventualmente intervenire su di essi. Al solito vedremo i fondamentali. 4.1.1 ps Visualizza l’elenco dei processi in memoria dei quali l’utente è proprietario. Non servono argomenti e la sintassi è banale: 16 >ps Il risultato è una lista dei processi con il proprio numero di identificazione, lo stato (Running, Stopped, ecc.) ed altre informazioni per le quali si rimanda alle pagine man. 4.1.2 top Visualizza un elenco, aggiornato continuamente, di tutti i processi in memoria, fornendo inoltre alcune informazioni importanti come il numero di identificazione, il proprietario, il tempo di esecuzione, la priorità, ecc. Anche qui non servono argomenti >top e le pagine man riportano tutte le opzioni valide. Si torna alla shell digitando CTRL + c. 4.1.3 kill Capita a volte, per qualche ragione, di voler interrompere forzatamente un processo; in tal caso si utilizza il comando kill, che accetta come parametro il numero di identificazione del processo da eliminare. Ad esempio per uccidere il processo avviato quando prima avevamo lanciato emacs in background dovremmo fare: >kill -9 12563 [2]+ Killed > emacs Si rimanda alle pagine man per il significato dell’opzione -9. 4.2 La stampa L’installazione, la configuarzione e la gestione delle stampanti sono punti non proprio banali di cui generalmente si occupa l’amministratore di sistema. All’utente è sufficiente conoscere pochi comandi, che fortunatamente sono gli stessi in tutti i casi (stampante locale o stampante condivisa in rete). 4.2.1 lpr Permette di stampare un file e richiede come argomanti (nell’ordine) il nome della stampante ed il nome del file da stampare. Supponiamo ad esempio di avere una stampante postscript che si chiama laser00 e di voler stampare il solito Cluster.eps. La sintassi è: >lpr -P laser00 Cluster.eps > in cui l’opzione -P indica che stiamo utilizzando una stampante di tipo postscript. 17 4.2.2 lpq Accetta come parametro il nome di una stampante e mostra i processi nella coda di stampa per la stampante in questione. Esempio: >lpq -P laser00 4.2.3 lprm Permette di rimuovere un processo dalla coda di stampa, nel caso ve ne sia bisogno; supponiamo di voler eliminare il processo di stampa 123 (il numero di identificazione è fornito dal comando lpq): >lprm -P laser00 123 > 4.3 Accesso alle periferiche Abbiamo già detto che Linux non fa alcuna distinzione, dal punto di vista dell’utente che accede al filesystem, tra dispositivi (ad esempio hard disk) che sono fisicamente diversi tra loro. Questo è vero anche per le periferiche come cd rom o floppy disk. L’unica cosa che l’utente deve fare è dire al sistema come accedere a queste periferiche, dopo di che i dati in esse contenuti divengono disponibili nel filesystem esattamente come i file contenuti sull’hard disk. 4.3.1 mount Questo comando dice al sistema come accedere ad un disco o ad una periferica e come essa deve essere visualizzata all’interno del filesystem. Supponiamo per esempio di voler leggere il contenuto di un cd rom (che è probabilemnte una delle operazioni più comuni che l’utente medio esegue). I comandi >mount /dev/cdrom >cd /dev/cdrom > dovrebbero essere sufficienti per montare il dispositivo e spostarsi nella directory corrispondente del filesystem. A questo punto il contenuto del cd rom è disponibile nella directory stessa di modo che si possono eseguire senza particolari problemi tutte le operazioni che già conosciamo. 4.3.2 umount Non è il caso di preoccuparsi se non si riesce più ad aprire il drive del cd rom! Probabilmente dipende dal fatto che non si è fatto correttamente l’umount del dispositivo. E’ sufficiente digitare: >umount /dev/cdrom > per poter riprendere il controllo della situazione ed estrarre fisicamente il disco. 18 4.4 Accesso al floppy disk benché si possa accedere al floppy con i comandi mount e umount, esiste sotto Linux una serie di utility ispirate ai comandi DOS che sono spesso più pratiche da utilizzare. 4.4.1 mdir Visualizza il contenuto del floppy (che, come generalmente accade sotto Windows, viene identificato con a:). La sintassi tipo è: >mdir a: 4.4.2 mcopy Permette di copiare dei file da e su floppy. Un paio di esempi per chiarire... >mcopy Cluster.eps a: > copia il file Cluster.eps (che si trova nella directory corrente) sul floppy, mentre >mcopy a:/Cluster.eps ./Temp > copia il file Cluster.eps (sul floppy) nella directory Temp, che è contenuta nella directory corrente (./). 4.4.3 mdel Permette di rimuovere file dal floppy. Esempio: >mdel a:/Cluster.eps > 4.5 L’accesso alle risorse di rete Il fatto che Linux consenta a più utenti di lavorare contemporaneamente su una stessa macchina da terminali remoti rende l’accesso alle risorse di rete un capitolo estremamente importante del bagaglio di conoscenze richiesto all’utente. Dal proprio pc è possibile accedere al filesystem di un’altra macchina, lanciare processi su di essa e copiare file e directory dal filesystem in questione. Vediamo alcuni comandi essenziali. 4.5.1 ping Consente di verificare che la propria macchina sia in grado di “dialogare” con un altro pc Linux. Supponiamo di voler verificare la connessione con la macchina galileo; è sufficiente digitare: >ping galileo ed il nostro pc cercherà di trasmettere e ricevere indietro alcuni byte di test, verificando lo stato della connessione. 19 4.5.2 telnet E’ un semplice programma di terminale che consente di aprire sessioni di lavoro su una macchina remota (occorre ovviamente possedere un account su quella macchina...). Digitando ad esempio: >telnet galileo si apre il prompt di login sulla macchina remota (in questo caso galileo) e vengono richiesti lo username e la password. Una volta loggato, l’utente può agire come se stesse fisicamente lavorando sulla macchina remota (e quindi navigare nel filesystem, muovere e copiare file, eseguire programmi, ecc.). 4.5.3 ssh Telnet non è il massimo per la sicurezza... si tratta di un semplice protocollo di connessione il cui punto di forza consiste nell’essere disponibile su qualsiasi macchina Linux. In realtà quando è possibile (il che dipende probabilmente dal tipo di installazione e dalla release utilizzata) è consigliabile usare il comando ssh, che è l’acronimo di secure shell. E’ molto probabile, addirittura, che la macchina a cui state cercando di loggarvi rifiuti ogni tentativo di connessione, se non attraverso ssh... La sintassi è quella usuale: >ssh galileo Buona fortuna! 4.5.4 ftp Si tratta di un protocollo che consente di connettersi ad un server e, oltre a navigare nel modo consueto all’interno del filesystem, permette di trasferire dati da una macchina all’altra attraverso i comandi put e get (o mput ed mget, che supportano il trasferimento multiplo). Per inciso notiamo che esiste anche la versione “sicura” di ftp che, nemmeno a farlo a posta, si chiama sftp (la s sta per secure) ed è in un certo senso per ftp quello che ssh è per telnet. Digitando: >ftp galileo ci connettiamo al server remoto (ovviamente fornendo username e password). A questo punto possiamo ad esempio copiare su di esso il nostro Cluster.eps: >mput Cluster.eps > oppure copiare indietro il file nella directory Temp: >mget Cluster.eps ./Temp > Una precauzione: per evitare che il file si corrompa nel trasferimento può essere a volte necessario digitare: >set bin > 20 4.6 Il compilatore C++ Ogni sistema Linux include un compilatore C++ integrato, il che rende particolarmente facile la programmazione in C++ nelle macchine con questo sistema operativo (se vogliamo proprio dirla tutta, Linux offre anche un compilatore C, che si chiama gcc, ed un ottimo compilatore Fortran, il g77). E’ utile spendere due parole al proposito, anche per chi non ha mai programmato in C++ (o per chi non ha mai programmato tout court). In generale la realizzazione di un programma (funzionante!) si compone di tre operazioni: 1. Scrittura del codice sorgente (in C++ o in qualsiasi altro linguaggio di programmazione). 2. Compilazione, cioè traduzione del codice sorgente in un insieme di istruzioni interpretabili dalla macchina (che costituiscono il cosiddetto eseguibile). Il programma che esegue questa traduzione prende il nome di compilatore. 3. Esecuzione dell’eseguibile. 4.6.1 g++ Il comando g++ compila il programma che l’utente passa come parametro e crea un eseguibile che di default ha il nome di a.out. L’insieme di comandi riportato di seguito compila il file HelloWorld.cxx e lancia il corrispondente eseguibile, che non fa altro che stampare sullo schermo la stringa “Hello world!”. >ls HelloWorld.cxx >g++ HelloWorld.cxx >ls HelloWorld.cxx a.out >./a.out Hello world! > Notiamo che il comando ./a.out è quello che lancia l’eseguibile. 21 Capitolo 5 Un word-processor avanzato: LATEX Sulla maggior parte dei sistemi Linux è disponibile LATEX, un programma per la formattazione di documenti di testo molto potente che si è guadagnato negli anni una grossa popolarità all’interno della comunità scientifica e trai fisici in particolare. Come tutte le applicazioni ha i suoi pregi ed i suoi difetti; di sicuro offre alcune funzionalità che rendono la realizzazione di alcuni tipi di documenti (ad esempio quelli contenenti formule matematiche) particolarmente semplice (probabilmente su questo semplice non tutti sono d’accordo) e veloce. Per quel poco che può contare, queste brevi dispense sono state redatte utilizzando LATEX (più precisamente utilizzando LATEX sotto Windows! Solamente per notare che LATEX ed Emacs, come molte altre applicazioni, esistono anche per Windows e possono essere scaricate gratuitamente dalla rete. Ma questo è un altro discorso...). 5.1 Dalla stesura alla stampa LATEX non è un programma di formattazione del tipo WYSIWYG (what you see is what you get); il che può renderlo poco digeribile, per lo meno a prima vista, a chi è abituato ad utilizzare word-processor come Microsoft Word, tanto per citare quello che probabilmente è in assoluto il più diffuso. In un certo senso è più vicino ad un linguaggio di programmazione. Un documento LATEX è composto da un misto di testo e di comandi LATEX validi; il tutto va poi compilato, dopo di che può essere visualizzato e convertito in postscipt, che sotto Linux è il formato principe per la stampa. In sostanza la realizzazione del prodotto finale passa attraverso le seguanti operazioni ed i seguenti comandi Linux (che ovviamente si danno dalla shell...): 1. Stesura del documento LATEX. E’ il documento che contiene, come abbiamo già detto, il testo ed i comandi ed ha tipicamente l’estensione .tex; vedremo in seguito alcuni esempi. Tipicamente l’utente medio utilizza Emacs (che supporta alcune funzionalità speciali per LATEX) per questa operazione, ma ovviamente qualsiasi altro editor di testo va benissimo! 22 2. Compilazione. Si esegue dalla shell di Linux attraverso il comando LATEX. Ad esempio per compilare il documento Tutorial.tex è sufficiente digitare: >latex Tutorial.tex Con questo comando il programma crea un certo numero di file (Tutorial.aux, Tutorial.log e Tutorial.dvi) di varia natura. O meglio: dovrebbe farlo, a meno che non ci siano errori di sintassi all’interno del documento. Nel qual caso, non abbiate paura, ve ne accorgerete, poichè il compilatore si lamenterà (ed allora, al solito CTRL + Z per tornare alla shell, un’occhiata al file sorgente pr trovare l’errore e poi si prova di nuovo!). Il file .dvi contiene il documento compilato in una forma che permette la visualizzazione attraverso l’apposito programma xdvi. 3. Visualizzazione. xdvi consente di vedere quale sarà la forma finale del documento. Il comando è: >xdvi Tutorial.dvi 4. Conversione in formato postscript. Il comando >dvips -o Tutorial.dvi crea il file postscript contenente il documento pronto per la stampa. E’ possibile visualizzarlo con una applicazione che supporti il formato (ad esempio con ghostview digitando gv Tutorial.ps) e stamparlo con il comando usuale. 5.2 Stesura del documento LATEX Adesso non ci resta che imparare quali sono in effetti le regole per la stesura di un documento LATEX. Certamente in poche righe non è possibile descrivere in modo esauriente le sterminate possibilità che il pacchetto offre; qui si vogliono solamente introdurre alcune tra le idee base, di modo che poi andare avanti (magari con l’ausilio di un buon manuale...) risulti meno ostico. Un buon modo per cominciare (pur se un tantino brutale, forse) è dare un’occhiata al documento sorgente della primissima parte di questo tutorial: \documentclass[a4paper, 10pt]{report} \usepackage[latin1]{inputenc} \usepackage[dvips]{graphicx} \begin{document} \chapter{Login e Logout: la shell} Linux \‘e un sistema operativo {\itshape multi-utente} e {\itshape multi-tasking}. Preciseremo il senso di questa affermazione ‘‘strada facendo’’; purtuttavia spendere 23 due parole al proposito \‘e probabilmente un buon punto di partenza. Multi-utenza significa che diversi utenti possono avere diversi dati, programmi ed impostazioni di sistema memorizzate separatamente sulla stessa macchina; la struttura del {\itshape filesystem} Linux \‘e basata, come vedremo, sui concetti di propriet\‘a e permesso. Per certi versi \‘e ci\‘o che accade nei sistemi operativi come Windows NT/2000 e simili; la differenza radicale \‘e che Linux permette a pi\‘u utenti di accedere simultaneamente al sistema... Avremo occasione di apprezzare, per lo meno in parte, le nuove possibilit\‘a che tutto questo apre. Multi-tasking significa semplicemente che pi\‘u comandi possono essere eseguiti contemporaneamente. Anche di questo ci occuperemo pi\‘u in dettaglio tra breve. \section{Il Login} Una macchina Linux deve ‘‘sapere chi si trove di fronte’’ prima di permettere l’accesso al sistema. \end{document} Il risultato, dopo la compilazione, è sostanzialmente la prima parte di pagina 1 del nostro tutorial. Come si vede, già queste poche righe contengono un sacco di cose da capire; ma cominciamo dal principio. Il comando: \documentclass[a4paper, 10pt]{report} setta l’impostazione della pagina (in questo caso un normale foglio A4), la dimensione del font per il testo generico (10 pt) ed il tipo di documento che ci accingiamo a scrivere (report). Ogni comando LATEX, probabilmente lo avrete notato, è preceduto da un backslash; questo permette al compilatore di capire se l’utente sta cercando di immettere del semplice testo oppure, appunto, un comando. I comandi, inoltre, possono accettare degli argomenti (inclusi tra parentesi graffe, come in questo caso la classe del documento) e delle opzioni (che sono tra parentesi quadre, come il formato ed il font in questo caso). Il comando documentclass è obbligatorio; la classe report (ma ce ne sono molte altre: article, book, slides, letter...) prevede i comandi “supplementari” chapter, section e subsection, tra gli altri. Come si vede la grandezza dei font per il titoli dei capitoli, delle sezioni e delle sottosezioni avviene automaticamente, senza bisogno di dichiarare esplicitamente il cambiamento di corpo o do stile. Anche la numerazione avviene in modo completamente automatico, il che è particolarmente comodo nel caso uno decida, per esempio, di aggiungere un capitolo nel bel mezzo del suo documento: non è necessario rinumerare tutti i capitoli successivi, basta ricompilare e tutto va a posto da solo. A questo livello possiamo tranquillamente disinteressarci delle righe: \usepackage[latin1]{inputenc} \usepackage[dvips]{graphicx} 24 che costituiscono il cosiddetto preambolo; il documento vero e proprio è, nemmeno a dirlo, quello compreso tra i comandi begindocument ed enddocument (anch’essi obbligatori!). Un confronto tra il file sorgente ed il risultato della compilazione dovrebbe rendere chiaro immediatamente quale sia la sintassi LATEX per accentare le lettere, scrivere in corsivo, cominciare un nuovo paragrafo, dichiarare capitoli e sezioni, tanto per citare alcune delle operazioni che si eseguono con maggiore frequenza. Cosı̀ come si vede che il compilatore non si cura affatto degli spazi e dei ritorni a capo... E’ chiaro che questo è solamente l’inizio, ma come si dice... l’appetito vien mangiando e la letteratura su LATEX è cosı̀ estesa e cosı̀ facilmente reperibile in rete che andare avanti da soli non dovrebbe essere affatto difficile, una volta aperta la strada! 5.3 LATEX e la matematica Uno dei motivi principali per cui LATEX ha avuto un tale successo tra i fisici è probabilmente costituito dalla facilità con cui è possibile includere formule matematiche arbitrariamente complesse, il che, come si può ben immaginare, costituisce una notevole facilitazione nella redazione di documenti scientifici. Per illustrare le potenzialità che il pacchetto offre in questo senso, è necessario introdurre il concetto di ambiente. Un ambiente LATEX è una parte del documento delimitata dai comandi: \begin{ambiente} \end{ambiente} L’esempio più semplice è quello dell’ambiente document che già conosciamo e che si trova in ogni documento; ma ne esistono molti altri, ognuno con funzionalità e comandi diversi! Cosı̀ entro l’ambiente center il testo (come qualsiasi altro oggetto) viene centrato, tabular è usato per realizzare tabelle e enumerate elenchi, verbatim non fa altro che dire al compilatore di ignorare tutti i comandi e di “stampar fuori” il testo cosı̀ com’è (vi siete chiesti come ho fatto a riprodurre il sorgente del primo capitolo all’interno del documento senza che il compilatore si preoccupasse di tutti i comandi ivi contenuti?). LATEX offre diversi ambienti esplicitamente dedicati alla matematica, con innumerevoli simboli e comandi specifici. Tanto per fare un esempio il seguente frammento di “codice”: Actually, working out the calculation$^7$, one finds that the non relativistic, polarized photoemission cross section, in this case, is given by: \begin{equation} \frac{d\sigma}{d\Omega} = r_0^2 Z^5 \alpha^4 (\frac{m_e c^2}{h\nu})^{\frac{7}{2}} \frac{4 \sqrt{2} sin^2\theta cos^2\phi}{(1 - \beta cos\theta)^4} \end{equation} where $\theta$ is the polar angle between the direction of propagation $\mathbf{k}$ of the incoming photon and the direction of emission, $\phi$ the azimuthal angle measured starting from the direction of polarization of the radiation and $\beta$ is 25 the final velocity of the photoelectron in terms of the speed of light. fornisce, dopo la compilazione: Actually, working out the calculation7 , one finds that the non relativistic, polarized photoemission cross section, in this case, is given by: √ 2 7 4 dσ 2sin2 θcos2 φ 2 5 4 me c 2 = r0 Z α ( ) (5.1) dΩ hν (1 − βcosθ)4 where θ is the polar angle between the direction of propagation k of the incoming photon and the direction of emission, φ the azimuthal angle measured starting from the direction of polarization of the radiation and β is the final velocity of the photoelectron in terms of the speed of light. Anche qui un confronto tra il documento sorgente ed il risultato della compilazione dovrebbe essere un esercizio molto istruttivo, oltre che uno stimolo all’approfondimento. Per inciso, notiamo che le equazioni, come i capitoli ed i paragrafi, vengono numerate automaticamente; è uno dei vantaggi del “non vedere” quello che si sta facendo... 5.4 Inserire le figure Chiaramente LATEX offre la possibilità di inserire figure all’interno del testo, anche se per la verità accetta solamente il formato eps (encapsulated postscript) e questa rigidità è talvolta piuttosto limitante. Per inciso notiamo che, sotto Linux, praticamente qualsiasi formato grafico (jpg, tif, gif...) si può facilmente convertire in eps con il comando convert, di cui si rimanda alle pagine man. Per inserire una figura si utilizza l’ambiente figure ed è necessario caricare preventivamente l’estensione graphicx (ecco spiegata la prima riga del nostro preambolo...). Per chiarire il tutto osserviamo il frammento: \begin{figure} \begin{center} \begin{tabular}{c} \includegraphics[height=5.5cm]{./Cluster1376.eps} \includegraphics[height=5.5cm]{./Cluster52.eps} \end{tabular} \end{center} \caption[Samples] { Two real tracks collected in a run with 5.9 keV unpolarized radiation; the area of each hexagon is proportional to the charge inducted on the corresponding pixel of readout plane. The gas mixture used is Ne/DME 80/20 at 1 Atm; since Ne K-shell is 0.9 keV, photoelectron energy is in this case 5 keV. Note that most of this energy is released in the Bragg peak toward the end of the path.} \end{figure} 26 Hit Position Hit Position 25 25 20 20 15 15 10 10 5 5 0 0 5 10 15 20 0 0 25 5 10 15 20 25 Figura 5.1: Two real tracks collected in a run with 5.9 keV unpolarized radiation; the area of each hexagon is proportional to the charge inducted on the corresponding pixel of readout plane. The gas mixture used is Ne/DME 80/20 at 1 Atm; since Ne K-shell is 0.9 keV, photoelectron energy is in this case 5 keV. Note that most of this energy is released in the Bragg peak toward the end of the path. che, dopo la compilazione, genera la figura 5.1 (notare che, anche in questo caso, la numerazione è automatica!). Con la pratica noterete che LATEX tende a posizionare le figure (apparentemente!) un po’ dove “pare a lui”; in realtà esistono comandi specifici, anche se qui non è il caso di entrare nel dettagio, che consentono di riacquistare un minimo di controllo sul layout del documento finale. Del resto non è che con altri programmi di formattazione la situazione sia tanto meglio... 5.5 Le funzioni avanzate di LATEX LATEX offre tutta una serie di funzioni avanzate che non abbiamo tempo di descrivere in dettaglio ma che costituiscono il vero punto di forza del programma. Con LATEX è semplicissimo inserire dei riferimenti ad equazioni o figure che si aggiornano automaticamente ad ogni compilazione (di modo che non è necessario rinumerare 35 figure per il solo motivo di averne aggiunta una all’inizio!). Con LATEX è un gioco da ragazzi generare un indice analitico; cosı̀ come è facile scrivere la bibliografia di un documento (ed avere, anche in questo caso, riferimenti “sparsi” per il testo che si aggiornano da soli). Il consiglio è sempre lo stesso: armarsi di un buon manuale e provare; spero che queste poche pagine via abbiano convinto che ne vale la pena. 27 Capitolo 6 Un semplice programma di plotting: gnuplot Avere a disposizione (ed essere in grado di padroneggiare...) un programma efficiente di visualizzazione ed analisi di dati è una delle esigenze fondamentali di chiunque si occupi di fisica. Inutile ripetere anche qui che i prodotti a disposizione non si contano... E’ proprio il caso di dire che ce n’è per tutti i gusti (oltre che per tutte le piattaforme hardware e per tutti i sistemi operativi). I fisici delle alte energie, tanto per fare un esempio, tendono in genere ad essere molto affezionati a due pacchetti, paw e root, sviluppati al CERN (dalla cui pagina web possono essere scaricati gratuitamente) e dotati ampie potenzialità grafiche e computazionali; ma di nuovo: non è che una questione di gusti. Tipicamente i software che si gestiscono da linea di comando sono più indicati, per le applicazioni avanzate, rispetto a quelli che l’utente può comandare completamente a colpi di mouse da un’interfaccia grafica; questo perché essi consentono in modo semplice di realizzare dei piccoli programmi (quelli che in gergo si chiamano macro utili quando si desideri eseguire operazioni di routine di una certa complessità (come ad esempio potrebbe essere: leggere un file di dati, istogrammare certe serie di numeri ivi contenute e fittare il tutto con una funzione definita dall’utente). Intendiamoci: non è che i programmi tipici windows-based (primo tra tutti Excel) non offrano questa possibilità; solo che un approccio di questo tipo è molto più diretto ed immediato nei pacchetti programmabili da linea di comando (basta mettere insieme un certo numero di comandi in un file opportuno, lanciarlo ed il gioco è fatto!). 6.1 Lanciare gnuplot Su di un sistema Linux è sufficiente digitare il comando gnuplot per lanciare il programma (a patto che sia installato, intendiamoci!); cosı̀ facendo l’utente viene a trovarsi all’interno del prompt da cui è in grado di digitare i comandi. Il tutto dovrebbe apparire (più o meno!) cosı̀: >gnuplot G N U P L O T 28 1 sin(x)/x 0.8 0.6 0.4 0.2 0 -0.2 -0.4 -10 -5 Figura 6.1: Grafico della funxione gnuplot. 0 sinx x , 5 10 ottenuto utilizzando il comando plot di Version 3.7 patchlevel 3 last modified Thu Dec 12 13:00:00 GMT 2002 ... gnuplot> Al solito cominciamo dall’inizio: il comando gnuplot>help gnuplot> visualizza le pagine di aiuto on-line, che costituiscono sempre un ottimo punto di partenza (per altro sono abbastanza ben scritte, meritano un’occhiatina!). A parte questo, probabilmente, la cosa più semplice che l’utente possa fare è usare il comando plot per visualizzare l’andamento di una funzione; una cosa del tipo: gnuplot>plot sin(x)/x gnuplot> dovrebbe essere sufficiente a visualizzare un oggetto in qualche modo rassomigliante alla figura 6.1. Notiamo, per inciso, che gnuplot è in generale capace di plottare più o meno qualsiasi espressione matematica valida in C, FORTRAN, Pascal o BASIC (per esempio i le espressioni sin(x), cos(x), tan(x), asin(x), acos(x), atan(x), erf(x), exp(x), log(x), log10(x), sqrt(x) non dovrebbero aver bisogno di alcun commento). 29 50 ’LeggeOraria.txt’ using 1:2 45 40 35 30 25 20 15 10 5 10 15 20 25 30 Figura 6.2: Visualizzazione, mediante gnuplot, dei dati contenuti nel file LeggeOraria.txt. 6.2 Visualizzare una serie di dati Gnuplot è capace di visualizzare in modo molto semplice i dati contenuti in un file, purchè organizzati per colonne e separati con spazi o TAB. Supponiamo ad esempio di avere un file di testo (nominato LeggeOraria.txt) del tipo: # File LeggeOraria.dat: contiene la posizione x di una massa # puntiforme al variare del tempo. # Notare che gnuplot ignora automaticamente le linee che # cominciano con un carattere #, di modo che l’utente puo’ # aggiungere commenti a suo piacimento. # # Tempo (sec) Posizione (cm) Errore (cm) 5 10.1 2.0 10 17.8 1.5 15 26.6 1.5 20 32.8 2.0 25 40.2 2.5 30 47.4 2.0 Il comando: gnuplot>plot ‘‘LeggeOraria.txt’’ using 1:2 dovrebbe generare qualcosa di non troppo diverso dalla figura 6.2. 30 6.3 Formattazione dei grafici Il risultato, ammettiamolo, non si direbbe proprio esaltante, per lo meno dal punto di vista estetico. Uno vorrebbe essere in grado di visualizzare il titolo del grafico, i nomi degli assi e cosı̀ via; ovviamente gnuplot consente di fare tutto questo (e molto altro...). In particolare possiamo farlo, come abbiamo già detto, scrivendo una piccola macro e lanciandola. Una macro dovrebbe apparire più o meno come il file qui di seguito (che chiamiamo PlotMacro.txt): # PlotMacro.txt. # Breve script per plottare i dati contenuti nel file # LeggeOraria.txt. # Di nuovo: gnuplot ignora tutte le linee che iniziano # con il carattere #. # # Definizione del titolo. set title ’Legge oraria per una particella libera’ # Label per l’asse delle x. set xlabel ’Tempo (sec)’ # Label per l’asse delle y. set ylabel ’Posizione (cm)’ # Definizione del range per l’asse delle x. set xrange [0: 40] # Definizione del range per l’asse delle y. set yrange [0: 50] # Opzione per eliminare la legenda. set nokey # Comando di plot: plottiamo la colonna 2 contro la 1 # usando la 3 come colonna degli errori sulla y. plot ’LeggeOraria.txt’ using 1:2:3 with yerrorbars # Generazione del file .eps per la stampa. set out ’LeggeOrariaEdit.eps’ set terminal postscript replot # Ritorno al terminale usuale (l’output appare di nuovo # sullo schermo e non piu’ sul file). set terminal x11 La macro si lancia con il comando load: gnuplot>load ’PlotMacro.txt’ ed il risultato è un grafico come quello che appare in figura 6.3. Notiamo, per inciso, che scrivere una macro ed eseguirla non è affatto necessario; avremmo potuto inserire tutti i comandi, uno dopo l’altro, dal terminale ed il risultato sarebbe stato esattamente lo stesso. Cosı̀ come non sono necessari i commenti, del resto; una macro del tipo: set set set set title ’Legge oraria per una particella libera’ xlabel ’Tempo (sec)’ ylabel ’Posizione (cm)’ xrange [0: 40] 31 Legge oraria per una particella libera 50 45 40 Posizione (cm) 35 30 25 20 15 10 5 0 0 5 10 15 20 Tempo (sec) 25 30 35 40 Figura 6.3: Visualizzazione, mediante gnuplot, dei dati contenuti nel file LeggeOraria.txt, dopo la formattazione. set yrange [0: 50] set nokey plot ’LeggeOraria.txt’ using 1:2:3 with yerrorbars set out ’LeggeOrariaEdit.eps’ set terminal postscript replot set terminal x11 sarebbe andata più che bene. Inutile notare che quelli mostrati non costituiscono che una piccola parte dei comandi disponibili dentro gnuplot; al solito: in rete si trovano con estrema facilità manuali aggiornati e dettagliati del pacchetto e queste poche pagine non possono certo pretendere di sostituirli! 6.4 Fit dei dati Gnuplot non è solamente un programma di visualizzazione di dati, ma possiede anche alcune funzionalità di analisi ed in particolare è in grado di fittare una serie di dati con una generica funzione definita dall’utente. La macro seguente dovrebbe risultare chiarissima, ormai: # FitMacro.txt. # Breve script per plottare i dati contenuti nel file # LeggeOraria.txt e fittarli con una retta. # 32 # Definizione del titolo. set title ’Legge oraria per una particella libera’ # Label per l’asse delle x. set xlabel ’Tempo (sec)’ # Label per l’asse delle y. set ylabel ’Posizione (cm)’ # Definizione del range per l’asse delle x. set xrange [0: 40] # Definizione del range per l’asse delle y. set yrange [0: 50] # Opzione per eliminare la legenda. set nokey # # Definizione della funzione di fit (retta). f(x) = a + b*x # Stime iniziali dei parametri del fit. a = 1 b = 1 # Esecuzione del fit. fit f(x) ’LeggeOraria.txt’ using 1:2:3 via a, b # # Comando di plot: plottiamo la colonna 2 contro la 1 # usando la 3 come colonna degli errori sulla y. # Plottiamo anche la funzione di fit. plot ’LeggeOraria.txt’ using 1:2:3 with yerrorbars, a + b*x # Generazione del file .eps per la stampa. set out ’LeggeOrariaFit.eps’ set terminal postscript replot # Ritorno al terminale usuale (l’output appare di nuovo # sullo schermo e non piu’ sul file. set terminal x11 Il risultato è, come uno può aspettarsi, un grafico simile a quello riportato in figura 6.4, oltre ad una serie di messaggi che forniscono informazioni sulla convergenza del fit e sulla stima finale dei parametri. Il programma dovrebbe fornire anche il valore del χ2 diviso per il numero di gradi di libertà (ChiSquare / d.o.f), che permette di valutare in modo immediato la bontà del fit stesso; il tutto, tra l’altro , viene anche memorizzato su di un file fit.log che appare più o meno cosı̀: *********************************************************** Wed Feb 12 09:45:22 2003 FIT: data read from ’LeggeOraria.txt’ using 1:2:3 #datapoints = 6 function used for fitting: f(x) fitted parameters initialized with current variable values 33 Legge oraria per una particella libera 50 45 40 Posizione (cm) 35 30 25 20 15 10 5 0 0 5 10 15 20 Tempo (sec) 25 30 35 40 Figura 6.4: Visualizzazione, mediante gnuplot, dei dati contenuti nel file LeggeOraria.txt, dopo la formattazione ed il fit con un polinomio di grado 1. Iteration 0 WSSR : 209.004 delta(WSSR) : 0 lambda : 6.93718 delta(WSSR)/WSSR : 0 limit for stopping : 1e-05 initial set of free parameter values a b = 1 = 1 After 5 iterations the fit converged. final sum of squares of residuals : 0.686015 rel. change during last iteration : -2.87956e-12 degrees of freedom (ndf) : 4 rms of residuals (stdfit) = sqrt(WSSR/ndf) : 0.41413 variance of residuals (reduced chisquare) = WSSR/ndf : 0.171504 Final set of parameters ======================= Asymptotic Standard Error ========================== a b +/- 0.698 +/- 0.03902 = 3.25533 = 1.48589 34 (21.44%) (2.626%) correlation matrix of the fit parameters: a b a b 1.000 -0.897 1.000 35 Appendice A Un esempio di fit con Scilab Gnuplot utilizza una variante del metodo di minimo χ2 per eseguire i fit. Il procedimento in questione è di tipo iterativo: si parte da una stima iniziale dei parametri (fornita dall’utente) e si cambiano questi ultimi fino a che il χ2 non converge ad un minimo. Questo è il modo in cui, in genere, funzionano i pacchetti di analisi dati per effettuare dei fit. In realtà, per lo meno nei casi più semplici, non è affatto complicato scrivere dei piccoli programmi che eseguano dei fit; e provare a farlo, una volta nella vita, può sicuramente contribuire ad eliminare quell’aura di sacralità con cui l’utente medio tende ad osservare certi software complicati... In fondo il fatto che altre persone (magari molto più esperte di noi nel campo) abbiano scritto dei programmi che noi utilizziamo non significa che non dobbiamo avere idea di cosa questi programmi stiano facendo! A.1 Minimo χ2 nel caso lineare Supponiamo di avere una serie di dati sperimentali (per esempio quelli contenuti nel nostro solito file LeggeOraria.txt) e di volerli fittare con la funzione piú semplice in assoluto: f (x) = ax (A.1) (abbiamo scelto una funzione puramente lineare, è bene notarlo, solamente per semplicità; in generale azzerare l’intercetta non è un’operazione lecita!) Al solito, nell’ipotesi che gli errori sulla x siano “piccoli” (attenzione al significato di questa assunzione!) possiamo eseguire il fit minimizzando la quantità: χ2 = N X (yi − axi )2 (∆yi )2 i=0 (A.2) Nel nostro caso l’equazione da risolvere è: N X ∂χ2 (yi − axi )xi = −2 =0 ∂a (∆yi )2 i=0 36 (A.3) che conduce all’equazione per a: PN yi xi i=0 (∆yi )2 (xi )2 i=0 (∆yi )2 a = PN (A.4) Notiamo, per inciso, che introducendo i vettori N-dimensionali: xN x1 x2 , , ..., ) ∆y1 ∆y2 ∆yN y1 y2 yN w=( , , ..., ) ∆y1 ∆y2 ∆yN v=( (A.5) l’equazione per a si può scrivere in forma compatta come: a= v·w v·v (A.6) in cui il puntino sta ad indicare l’usuale prodotto scalare tra vettori. A.2 Implementare il fit con Scilab A questo punto eseguire il fit è una cosa semplice: basta prendere i dati ed eseguire, nella giusta sequenza, i prodotti, le divisioni e le somme necessarie a calcolare a secondo l’equazione scritta sopra. Una calcolatrice va benissimo, ma il tutto si può fare in modo più efficiente (specialmente nel caso si abbia un gran numero di dati) scrivendo un piccolo programma. Anche qui: qualsiasi linguaggio di programmazione può servire egregiamente allo scopo; noi proveremo a farlo con il software Scilab, che offre tutta una serie di funzioni utili per maneggiare matrici e vettori. Lo scopo del gioco dovrebbe essere quello di tirar fuori il “numerino” in modo trasparente (cioè avendo ben presente che cosa stiamo facendo). Scilab si lancia dalla shell (udite, udite!) con il comando: >scilab La prima cosa che dobbiamo fare è importare entro scilab la nostra matrice di dati, che chiameremo M; il comando da utilizzare è read: scilab>[M] = read(’LeggeOraria.txt’, 6, 3) [M] = | 5 10.1 2.0 | | 10 17.8 1.5 | | 15 26.6 1.5 | | 20 32.8 2.0 | | 25 40.2 2.5 | | 30 47.4 2.0 | scilab> Essenzilmente questo significa: leggiamo il file LeggeOraria.txt ed estraiamo una matrice di 6 righe e 3 colonne che chiamiamo M e che da questo momento è disponobile in memoria per effettuare le operazioni desiderate; ad ogni passo Scilab dovrebbe stampare sullo schermo ciò che abbiamo appena fatto, che è utile 37 per verificarne la correttezza. Una precisazione: Scilab non ama i commenti (le righe precedute da #, che invece non creavano problemi a gnuplot) per cui dobbiamo avere la precauzione di cancellarle dal file contenente i dati , prima di eseguire il comando. A questo punto dobbiamo estrarre dalla matrice i vettori che ci interessano, cioè quello delle x, quello delle y e quello degli errori sulla y. Il modo per farlo (con ovvio significato dei termini) è: scilab>[x] = M(:, 1) [x] = | 5 | | 10 | | 15 | | 20 | | 25 | | 30 | scilab>[y] = M(:, 2) | 10.1 | | 17.8 | | 26.6 | | 32.8 | | 40.2 | | 47.4 | scilab>[dy] = M(:,3) | 2.0 | | 1.5 | | 1.5 | | 2.0 | | 2.5 | | 2.0 | scilab> Cioè: definiamo il vettore x come la prima colonna della matrice M, il vettore y come la seconda colonna e dy come la terza colonna. Costruiamo quindi i vettori v e w definiti nel paragrafo precedente: scilab>v = x./dy scilab>w = y./dy scilab> (notare che l’operatore ./ è quello che consente, dentro Scilab, di eseguire la divisione membro a membro di due vettori). Non ci resta che eseguire i prodotti scalari per calcolare a: scilab>(v’*w)/(v’*v) (l’apostrofo ’ indica il vettore trasposto, dopo di che il prodotto scalare si esegue con l’usuale simbolo di moltiplicazione); Scilab dovrebbe visualizzare sullo schermo il valore del parametro cercato. Facile, no? 38 Bibliografia [1] Linux: guida dell’amministratore di sistema, Lars Wirzenius. ftp://ftp.pluto.linux.it/pub/pluto/ildp [2] Linux: guida dell’utente, Larry Greenfield. ftp://ftp.pluto.linux.it/pub/pluto/ildp [3] GNU - Emacs manual http://www.gnu.org/manual/emacs/index.html [4] Impara LATEX! (...e mettilo da parte), Marc Baudoin. ftp://ftp.pluto.linux.it/pub/pluto/ildp/misc/imparalatex [5] GNUPLOT - A brief Manual and Tutorial http://www.duke.edu/~hpgavin/gnuplot.html 39