Matematica e disegno
Transcript
Matematica e disegno
Appunti di informatica libera 2003.01.01 Volume VII Matematica e disegno 3735 Appunti Linux Copyright © 1997-2000 Daniele Giacomini Appunti di informatica libera Copyright © 2000-2003 Daniele Giacomini Via Morganella Est, 21 -- I-31050 Ponzano Veneto (TV) -- daniele @ swlibero.org Le informazioni contenute in questa opera possono essere diffuse e riutilizzate in base alle condizioni poste dalla licenza GNU General Public License, come pubblicato dalla Free Software Foundation. In caso di modifica dell’opera e/o di riutilizzo parziale della stessa, secondo i termini della licenza, le annotazioni riferite a queste modifiche e i riferimenti all’origine di questa opera, devono risultare evidenti e apportate secondo modalità appropriate alle caratteristiche dell’opera stessa. In nessun caso è consentita la modifica di quanto, in modo evidente, esprime il pensiero, l’opinione o i sentimenti del suo autore. L’opera è priva di garanzie di qualunque tipo, come spiegato nella stessa licenza GNU General Public License. Queste condizioni e questo copyright si applicano all’opera nel suo complesso, salvo ove indicato espressamente in modo diverso. The informations contained inside this work can be spread and reused under the terms of the GNU General Public License as published by the Free Software Foundation. If you modify this work and/or reuse it partially, under the terms of the license, the notices about these changes and the references about the original work, must be evidenced conforming to the work characteristics. IN NO EVENT IS ALLOWED TO MODIFY WHAT ARE CLEARLY THE THOUGHTS, THE OPINIONS AND/OR THE FEELINGS OF THE AUTHOR. This work is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. These conditions and this copyright apply to the whole work, except where clearly stated in a different way. Una copia della licenza GNU General Public License, versione 2, si trova nell’appendice A. A copy of GNU General Public License, version 2, is available in appendix A. 3736 The main distribution for Appunti di informatica libera is described below. For every distribution channel the maintainer’s name and address is also reported. Internet • direct reading: <http://a2.swlibero.org/> download: <ftp://a2.swlibero.org/a2/> and <http://a2.swlibero.org/ftp/> Michele Dalla Silvestra, mds @ swlibero.org • direct reading: <http://appuntilinux.torino.linux.it/> download: <ftp://ftp.torino.linux.it/appunti-linux/> Carlo Perassi, carlo @ linux.it • direct reading: <http://sansone.crema.unimi.it/linux/a2/HTML/> download: <http://sansone.crema.unimi.it/linux/a2/> Fabrizio Zeno Cornelli, zeno @ filibusta.crema.unimi.it • direct reading: <http://www.pctime.it/servizi/appunti-linux/> download: <http://www.pctime.it/servizi/appunti-linux/a2-prelievo/> Franco Lazzero, PCTIME, pctime @ pctime.net • direct reading: <http://www.a2.prosa.it/> download: <ftp://ftp.a2.prosa.it/> Davide Barbieri, paci @ prosa.it • direct reading: <http://linux.pueste.it/> download: <http://linux.pueste.it/filearea/AppuntiLinux/> David Pisa, david @ iglu.cc.uniud.it • direct reading: <http://www.informasiti.com/Appunti/HTML/> download: <http://www.informasiti.com/Appunti/> Claudio Neri, Sincro Consulting, neri.c @ sincroconsulting.com GNU distributions • GNU/Linux Debian <http://packages.debian.org/appunti-informatica-libera> Massimo Dal Zotto, dz @ cs.unitn.it Italian magazine’s CD-ROM • inter-punto-net <http://www.interpuntonet.it> Michele Dalla Silvestra, mds @ swlibero.org • Internet News <http://inews.tecnet.it> Francesco Facconi, francescofacconi @ libero.it Fabio Ferrazzo, fabio.fr @ tiscalinet.it • Linux Magazine <http://www.edmaster.it/prodotti/linux/ult-riv.html> Emmanuele Somma, esomma @ ieee.org La diffusione di questa opera è incoraggiata in base ai termini della licenza. The spread of this work is encouraged under the terms of the license. 3737 Parte lxvii Foglio elettronico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3739 329 Concetti generali sui fogli elettronici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3740 330 Spreadsheet Calculator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3750 Parte lxviii Applicazioni matematiche e grafiche varie . . . . . . . . . . . . . . . . . . . . . . . . . . 3767 331 Gnuplot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3768 332 Octave . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3777 333 Applicazioni matematiche varie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3783 Indice analitico del volume . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3787 3738 Parte lxvii Foglio elettronico 329 Concetti generali sui fogli elettronici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3740 329.1 Coordinate di celle e di zone . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3740 329.2 Tipi di dati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3741 329.3 Espressioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3742 329.4 Riferimenti relativi e riferimenti assoluti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3746 329.5 Titoli, protezione delle celle e aree nascoste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3747 329.6 Grafici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3748 329.7 Riordino . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3749 330 Spreadsheet Calculator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3750 330.1 Concetti generali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3750 330.2 Avvio e opzioni di funzionamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3753 330.3 Inserimento e modifica dei valori nelle celle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3754 330.4 Formato delle celle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3756 330.5 Comandi per intervenire sui file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3758 330.6 Comandi per intervenire su zone del foglio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3759 330.7 Comandi vari . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3761 330.8 Espressioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3762 330.9 Formato del file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3764 3739 Capitolo 329 Concetti generali sui fogli elettronici Il foglio elettronico è un insieme di celle accessibili attraverso delle coordinate, organizzate generalmente in forma bidimensionale. Le celle in questione sono delle variabili, rappresentate dalle coordinate relative. Figura 329.1. Schema tipico di un foglio elettronico bidimensionale. ---------------------------------------------------------------------------. | A | B | C | D | E | F | ---|-----------|-----------|-----------|-----------|-----------|-----------| 1 | | | | | | | ---|-----------|-----------|-----------|-----------|-----------|-----------| 2 | | | | | | | ---|-----------|-----------|-----------|-----------|-----------|-----------| 3 | | | | | | | ---|-----------|-----------|-----------|-----------|-----------|-----------| 4 | | | | | | | ---|-----------|-----------|-----------|-----------|-----------|-----------| 5 | | | | | | | ---|-----------|-----------|-----------|-----------|-----------|-----------| 6 | | | | | | | ---|-----------|-----------|-----------|-----------|-----------|-----------| 7 | | | | | | | ---------------------------------------------------------------------------’ Solitamente, le coordinate sono composte dall’accoppiamento di una lettera a un numero (intero), come per esempio A1, B25 e F43, ricordando ciò che si fa normalmente nelle notazioni matematiche: a1, b25, f43. Visivamente, le celle di un foglio vengono disposte su una tabella, dove le colonne sono identificate da una o più lettere e le righe sono identificate da un numero intero. Secondo la tradizione, nelle coordinate delle celle non si distingue tra lettere maiuscole o lettere minuscole. La dimensione di una tabella di un foglio elettronico varia a seconda delle potenzialità elaborative disponibili. In linea di principio non ci sono limiti teorici, dal momento che si possono indicare colonne anche attraverso l’abbinamento di più lettere alfabetiche.1 329.1 Coordinate di celle e di zone La rappresentazione delle celle in forma tabellare è la caratteristica fondamentale del foglio elettronico. Questa disposizione facilita l’identificazione di gruppi di celle, ovvero di zone, disposte su aree rettangolari, dove una cella singola equivale alla zona più piccola disponibile. Mentre il riferimento a una cella singola avviene in modo abbastanza uniforme tra i fogli elettronici comuni, l’individuazione di una zona avviene attraverso forme di rappresentazione differenti. In generale rimane un elemento comune: si individua una zona indicando due celle opposte. Per esempio, osservando la figura 329.2, si vede che è stato circoscritto un gruppo di celle rettangolari; per individuare tutto il gruppo basterebbe fare riferimento alla zona che va da C3 a E6, oppure da E3 a C6, oppure da C6 a E3, oppure da E6 a C3. In pratica, di solito non ha importanza l’ordine in cui si indicano le due celle opposte. 1 Si osservi che la numerazione alfabetica è diversa da quella che avviene solitamente attraverso cifre numeriche. Per la precisione, il problema nasce dal fatto che nella numerazione alfabetica non esiste lo zero. Infatti, se 01 è uguale a 1, in questo contesto «A» non è uguale ad «AA». 3740 Concetti generali sui fogli elettronici 3741 Figura 329.2. Individuazione di una zona. ---------------------------------------------------------------------------. | A | B | C | D | E | F | ---|-----------|-----------|-----------|-----------|-----------|-----------| 1 | | | | | | | ---|-----------|-----------|-----------|-----------|-----------|-----------| 2 | | | | | | | ---|-----------|-----------#####################################-----------| 3 | | # | | # | ---|-----------|-----------#-----------|-----------|-----------#-----------| 4 | | # | | # | ---|-----------|-----------#-----------|-----------|-----------#-----------| 5 | | # | | # | ---|-----------|-----------#-----------|-----------|-----------#-----------| 6 | | # | | # | ---|-----------|-----------#####################################-----------| 7 | | | | | | | ---------------------------------------------------------------------------’ Per abbinare le celle opposte che descrivono una zona, si usano simbologie differenti. La tabella 329.1 riassume le modalità comuni. Tabella 329.1. Forme comuni di rappresentazione delle zone. Descrizione zone normali intervalli di colonne intervalli di righe Applicativo Gnumeric SC StarOffice MS-Excel 1-2-3 SC SC Rappresentazione xm :yn xm :yn xm :yn xm :yn xm ..yn x :y m :n Alcuni tipi di foglio elettronico consentono di attribuire un nome a delle zone di celle, per potervi fare riferimento in modo più intelligibile all’interno delle espressioni. 329.2 Tipi di dati Lo scopo del foglio elettronico è il calcolo automatico di espressioni contenute nelle celle. In generale, le celle possono essere vuote, possono contenere una costante oppure un’espressione da calcolare. Volendo fare una classificazione più dettagliata, si può distinguere tra: • celle vuote, nel senso che non contengono alcunché; • celle contenenti una costante numerica; • celle contenenti un’espressione che genera un risultato numerico; • celle contenenti una costante stringa; • celle contenenti un’espressione che genera un risultato stringa. Alcuni fogli elettronici prevedono la rappresentazione di informazioni logiche (booleane). In questi casi si utilizzano valori numerici che nel contesto sono interpretati come logici: lo zero vale come Falso, qualunque altro valore vale come Vero. Concetti generali sui fogli elettronici 3742 Nell’ambito dei fogli elettronici hanno una rilevanza particolare le indicazioni di date e di orari. Generalmente, questi tipi di valori sono gestiti attraverso l’attribuzione di un significato speciale ai numeri comuni. Di solito, un numero n intero positivo indica l’n -esimo giorno a partire da un certo riferimento, mentre un numero positivo, minore o uguale a uno, rappresenta una frazione di giorno, ovvero un’ora particolare. 329.3 Espressioni Tutto ciò che si inserisce all’interno di una cella ha la forma di un espressione; anche la costante è un’espressione. In particolare, le costanti vanno inserite secondo una forma prestabilita, per distinguere tra stringhe e numeri. Generalmente, i numeri si introducono nella forma cui si è abituati di solito, oppure vengono inseriti in un’espressione esplicita, mentre le stringhe possono richiedere un prefisso per poterle distinguere, oppure vanno inserite anche queste in un’espressione esplicita. Tabella 329.2. Forme comuni di inserimento delle costanti. Descrizione stringa normale stringa esplicita stringa allineata a sinistra stringa allineata a destra stringa centrata espressione Applicativo Gnumeric SC StarOffice MS-Excel 1-2-3 Gnumeric SC StarOffice MS-Excel 1-2-3 1-2-3 1-2-3 Gnumeric SC StarOffice MS-Excel 1-2-3 Espressione stringa (non disponibile) stringa stringa stringa (non disponibile) "stringa ’stringa ’stringa ’stringa "stringa ^stringa =espressione =espressione =espressione =espressione espressione Il caso di 1-2-3 è eccezionale. Come si vede nella tabella 329.2, si distinguono tre prefissi differenti per inserire una stringa, in base al tipo di allineamento desiderato. In generale i fogli elettronici non pongono questa limitazione, gestendo l’allineamento in modo indipendente. Le espressioni vere e proprie si realizzano generalmente attraverso degli operatori e delle funzioni. La tabella 329.3 cerca di riassumere gli operatori comuni nei vari tipi di fogli elettronici. Tabella 329.3. Elenco degli operatori comuni nei fogli elettronici. Descrizione nessun effetto inversione di segno Applicativo Gnumeric SC StarOffice MS-Excel 1-2-3 Gnumeric SC StarOffice MS-Excel Espressione +n +n +n +n +n -n -n -n -n Concetti generali sui fogli elettronici Descrizione somma sottrazione moltiplicazione divisione concatenamento di stringhe raggruppamento, precedenza 3743 Applicativo 1-2-3 Gnumeric MS-Excel SC StarOffice 1-2-3 Gnumeric SC StarOffice MS-Excel 1-2-3 Gnumeric SC StarOffice MS-Excel 1-2-3 Gnumeric SC StarOffice MS-Excel 1-2-3 Gnumeric SC StarOffice MS-Excel 1-2-3 Gnumeric SC StarOffice MS-Excel 1-2-3 Espressione -n m +n m +n m +n m +n m +n m -n m -n m -n m -n m -n m *n m *n m *n m *n m *n m /n m /n m /n m /n m /n m &n m #n m &n m &n m &n (...) (...) (...) (...) (...) Ciò che non si può fare con gli operatori normali, si ottiene generalmente attraverso delle funzioni, la cui notazione varia a seconda dell’applicativo. Generalmente, una funzione è costituita da un nome seguito da dei parametri tra parentesi: nome_funzione (parametro ...) Si pongono due tipi di problemi: la distinzione dei parametri e il modo in cui si riesce a distinguere che si tratta di una funzione. La separazione dei parametri avviene generalmente attraverso l’uso di virgole o di punti e virgola, a seconda dei casi. Per quanto riguarda il riconoscimento della funzione, potrebbe essere necessario iniziare ogni nome con un simbolo speciale. Le funzioni dei fogli elettronici sono solitamente già stabilite. Purtroppo, la tradizione ha portato alla traduzione di questi nomi in base alla localizzazione. Dalla localizzazione può dipendere anche la scelta tra la virgola o il punto e virgola per separare i parametri delle funzioni, dal momento che si pone la scelta del simbolo usato per rappresentare la separazione tra parte intera e parte decimale di un numero. La tabella 329.4 elenca alcune funzioni tipiche nella tradizione dei fogli elettronici, secondo la localizzazione italiana.2 2 Per completezza si indica anche l’espressione condizionale di SC, che usa operatori e non una funzione. Concetti generali sui fogli elettronici 3744 Tabella 329.4. Elenco di funzioni comuni nei fogli elettronici. Descrizione sommatoria radice quadrata arrotondamento selezione condizionale Applicativo Gnumeric SC StarOffice MS-Excel 1-2-3 Gnumeric SC StarOffice MS-Excel 1-2-3 Gnumeric SC StarOffice MS-Excel 1-2-3 Gnumeric SC StarOffice MS-Excel 1-2-3 Espressione sum(zona ) @sum(zona ) somma(zona ) somma(zona ) @somma(zona ) sqrt(n ) @sqrt(n ) radq(n ) radq(n ) @radq(n ) round(n ;decimali ) @round(n ,decimali ) arrotonda(n ;decimali ) arrotonda(n ;decimali ) @arrot(n ;decimali ) if(condizione ;risultato_vero ;risultato_falso ) condizione ?risultato_vero :risultato_falso se(condizione ;risultato_vero ;risultato_falso ) se(condizione ;risultato_vero ;risultato_falso ) @se(condizione ;risultato_vero ;risultato_falso ) Il caso della sommatoria è speciale, in quanto si usa generalmente passando come parametro una zona intera. In tale situazione, se non fosse disponibile una funzione del genere, capace di accettare una zona intera come argomento, sarebbe necessario scrivere un’espressione, eventualmente molto lunga, utilizzando sempre l’operatore ‘+’. I parametri delle funzioni possono essere costituiti da costanti o da espressioni di vario genere, anche se questo poi si paga con una difficile leggibilità. In questo contesto, le costanti stringa sono rappresentate generalmente delimitandole tra apici doppi. Anche se nelle celle di un foglio non dovesse essere stato previsto il tipo di dati logico, ci sono funzioni che prevedono tra i parametri dei valori logici. In questi casi, può trattarsi solo di espressioni che restituiscono un valore Vero o Falso. Queste espressioni si realizzano attraverso operatori di comparazione, assieme a operatori o funzioni logiche, che generalmente corrispondono a quanto elencato nella tabella 329.5. Tabella 329.5. Elenco degli operatori di confronto, degli operatori logici e delle funzioni logiche, comuni nei fogli elettronici. Descrizione uguale diverso minore Applicativo Gnumeric SC StarOffice MS-Excel 1-2-3 Gnumeric SC StarOffice MS-Excel 1-2-3 Gnumeric SC StarOffice MS-Excel 1-2-3 Espressione x =y x =y x =y x =y x =y x <>y x !=y x <>y x <>y x <>y x <y x <y x <y x <y x <y Concetti generali sui fogli elettronici Descrizione maggiore minore o uguale maggiore o uguale AND OR NOT 3745 Applicativo Gnumeric SC StarOffice MS-Excel 1-2-3 Gnumeric SC StarOffice MS-Excel 1-2-3 Gnumeric SC StarOffice MS-Excel 1-2-3 Gnumeric SC StarOffice Espressione x >y x >y x >y x >y x >y x <=y x <=y x <=y x <=y x <=y x >=y x >=y x >=y x >=y x >=y and(x ;y ;z ... ) x &y e(x ;y ;z ... ) MS-Excel 1-2-3 Gnumeric SC StarOffice x #AND#y or(x ;y ;z ... ) x |y o(x ;y ;z ... ) MS-Excel 1-2-3 Gnumeric SC StarOffice MS-Excel 1-2-3 [ ] [ ] e(x ;y[;z ...]) [ ] [ ] o(x ;y[;z ...]) x #OR#y not(x ) ~x non(x ) non(x ) #NOT#x 329.3.1 Date e orari Esistono diversi modi per rappresentare il tempo nei fogli elettronici. In generale esistono due filoni fondamentali; nelle situazioni più comuni si utilizza un numero la cui parte intera rappresenta la quantità di giorni trascorsi a partire da un tempo di riferimento, mentre le frazioni dell’unità rappresentano le stesse frazioni di 24 ore; in altri casi, si usa un numero intero che esprime la quantità di secondi trascorsi da un tempo di riferimento. In generale, non ha importanza sapere quale sia il tempo di riferimento, tranne per il fatto che non si possono gestire date precedenti a quello. Al contrario, il modo in cui si annota effettivamente il tempo ha poi delle implicazioni operative significative, che verranno descritte. Per gestire questi numeri, si utilizzano solitamente delle funzioni apposite, che generano il numero corretto per la rappresentazione del tempo desiderato. La tabella 329.6 riassume le funzioni più comuni a questo proposito. Concetti generali sui fogli elettronici 3746 Tabella 329.6. Elenco delle funzioni comuni per l’inserimento di valori legati al tempo. Descrizione data orario Applicativo Gnumeric SC StarOffice MS-Excel 1-2-3 Gnumeric SC StarOffice MS-Excel 1-2-3 Espressione date(anno ;mese ;giorno ) @dts(mese ,giorno ,anno ) data(anno ;mese ;giorno ) data(anno ;mese ;giorno ) @data(anno ;mese ;giorno ) time(ore;minuti ;secondi ) @tts(ore,minuti ,secondi ) orario(ore;minuti ;secondi ) orario(ore;minuti ;secondi ) @orario(ore;minuti ;secondi ) Quando il tempo è rappresentato da un numero che rappresenta una quantità di giorni e frazioni di giorno, è facile fare delle operazioni; per esempio è facile calcolare quanti giorni sono contenuti in un intervallo di date, perché basta fare una sottrazione e il valore intero che si ottiene è proprio ciò che si cerca. Lo stesso tipo di operazione diventa più complicato quando il tempo è rappresentato in una quantità di secondi. Generalmente, oltre alle funzioni che generano il valore corrispondente al tempo, ce ne sono altre per estrapolare alcune componenti: il giorno, il mese, l’anno, l’ora, i minuti e i secondi. 329.3.2 Rappresentazione dei dati Esiste una distinzione importante tra la sostanza dei dati, il modo di memorizzarli e il modo di rappresentarli. Generalmente, il tipo di memorizzazione dei dati è anche il limite alla realtà che può essere rappresentata. A titolo di esempio, si può prendere in considerazione il problema già descritto della forma in cui vengono annotate le informazioni legate al tempo: il tempo, a livello umano, ha un significato che si traduce in qualche modo in un numero; poi, questo numero deve poter essere rappresentato in un qualche modo comprensibile a livello umano. All’inizio del capitolo è stato chiarito che normalmente i dati inseriti nelle celle sono numeri, stringhe o espressioni che si risolvono in questi due tipi di dati. Un numero può avere un significato diverso a seconda del contesto. I fogli elettronici più recenti sono in grado di interpretare questo contesto, cercando di rappresentare i valori nel modo ritenuto più appropriato; quando questo non basta, occorre intervenire chiarendo il significato che l’informazione deve avere. Volendo fare un esempio più semplice di quanto riferito alla gestione del tempo, basta pensare ai valori percentuali: il numero 0,1 può trovarsi in un contesto per cui sia giusto rappresentarlo proprio così, oppure potrebbe rappresentare un valore percentuale, ovvero il 10 %. 329.4 Riferimenti relativi e riferimenti assoluti Una delle caratteristiche fondamentali di un foglio elettronico è la possibilità di copiare o spostare intere zone in punti diversi da quelli originali, inoltre deve essere possibile l’inserimento e l’eliminazione di righe e colonne. In questa prospettiva, quando si scrivono delle espressioni che fanno riferimento a delle celle, o a delle zone, questi riferimenti sono generalmente relativi. Si osservi la figura 329.3, in cui si vede la zona A1:B3 che si desidera copiare in D2:E4. Concetti generali sui fogli elettronici 3747 Figura 329.3. Si vuole copiare la zona A1:B3 in D2:E4. ---------------------------------------------------------------------------. | A | B | C | D | E | F | ---|-----------|-----------|-----------|-----------|-----------|-----------| 1 | Primo | 23456 | | | | | ---|-----------|-----------|-----------#########################-----------| 2 | Secondo | 87654 | # | # | ---|-----------|-----------|-----------#-----------|-----------#-----------| 3 | Totale | 111110 | # | # | ---|-----------|-----------|-----------#-----------|-----------#-----------| 4 | | | # | # | ---|-----------|-----------|-----------#########################-----------| 5 | | | | | | | ---|-----------|-----------|-----------|-----------|-----------|-----------| 6 | | | | | | | ---|-----------|-----------|-----------|-----------|-----------|-----------| 7 | | | | | | | ---------------------------------------------------------------------------’ Si intuisce che la cella B3 debba contenere un’espressione per il calcolo del totale, per esempio SOMMA(B1:B2); evidentemente ci si aspetta che la copia della zona A1:B3 in D2:E4 avvenga in modo «logico», ovvero che l’espressione in E4 sia modificata correttamente in SOMMA(E2:E3). In modo analogo, ci si aspetta un comportamento «logico» se si desidera inserire un riga nuova tra la prima e la seconda. In tal modo, la terza riga diventerebbe la quarta, per cui l’espressione che prima si trovava in B3 andrebbe a finire in B4. A questo punto, sarebbe auspicabile che l’espressione fosse aggiornata in modo coerente, diventando SOMMA(B1:B3). Quando si scrive una coordinata e si vuole evitare che questa venga modificata da tali comportamenti, apparentemente logici, si deve aggiungere l’indicazione di quale parte della coordinata non può essere modificata. Generalmente si aggiunge il simbolo ‘$’ davanti alla lettera della colonna, davanti al numero della riga, o davanti a entrambi. Per esempio, $A3 è un riferimento alla cella A3, in cui l’indicazione della colonna non può essere alterata per nessun motivo; nello stesso modo, A$3 è un riferimento alla cella A3, in cui la riga non può essere modificata. Ovviamente, per impedire qualunque modifica si indica semplicemente $A$3. 329.5 Titoli, protezione delle celle e aree nascoste Il foglio elettronico si presta particolarmente per la realizzazione di modelli già pronti, in cui può bastare l’inserimento di alcuni dati in celle prestabilite, per ottenere il completamento necessario in modo automatico. A titolo di esempio si può pensare al modello di una fattura, in cui basta inserire la descrizione dell’articolo, la quantità e il prezzo unitario per aggiornare tutte le altre informazioni. In questa situazione, può essere utile fare in modo di proteggere tutto il foglio liberando solo alcune celle. In pratica, si consente l’inserimento di dati solo nelle celle previste, impedendo errori che potrebbero costare l’alterazione di espressioni eventualmente complesse. Generalmente si usa un approccio di questo tipo: le celle si possono considerare protette o non protette, ma si possono alterare comunque finché non viene attivata la protezione del foglio. In pratica, solo quando si richiede la protezione del foglio, nel suo complesso, viene preso in considerazione lo stato individuale di protezione delle celle. In base a questa logica, tutte le celle di un foglio nuovo sono protette in modo predefinito, fino a quando l’utilizzatore non toglie, singolarmente o a zone, la loro protezione; solo dopo questo lavoro di selezione si può abilitare le protezione globale del foglio, attraverso cui le celle protette non possono essere più modificate. Alcuni applicativi del genere attivano e disattivano la protezione globale semplicemente a richiesta, mentre altri richiedono l’inserimento di una parola d’ordine, che rende la protezione più efficace. 3748 Concetti generali sui fogli elettronici Nel momento in cui si usa il foglio elettronico per realizzare modelli complessi, diventa interessante la possibilità di nascondere delle righe o delle colonne. Questo consente di inserire al loro interno espressioni per calcoli intermedi di qualche risultato che non conviene mostrare all’utente a cui verrà fatto utilizzare poi tale lavoro. Questa funzionalità, quando disponibile, si abbina convenientemente alla protezione del foglio, che può impedire eventualmente l’estrazione di queste informazioni nascoste.3 A completamento di queste funzionalità di protezione, si può aggiungere la possibilità di bloccare lo scorrimento di alcune righe e colonne iniziali. Si fa riferimento a questo concetto parlando di «titoli» o di «riquadri». Lo scopo di tale meccanismo è il mantenere in vista alcune righe e alcune colonne che permettono di interpretare i dati delle celle, quando si realizzano tabelle di dati molto grandi che superano l’estensione visuale dello schermo. 329.6 Grafici Attraverso i dati contenuti nelle celle di un foglio elettronico è possibile ottenere generalmente un grafico, scelto in base al tipo di informazioni che si intendono rappresentare. Il comportamento dei programmi di questo tipo può variare di molto nel modo di richiedere le informazioni necessarie alla realizzazione di tali grafici. In generale, per quanto riguarda i grafici che si dispongono su assi cartesiani, vengono distinti due gruppi di informazioni fondamentali: una serie di stringhe descrittive che vanno disposte sull’asse X e più insiemi di valori da disporre sull’asse Y in corrispondenza dei riferimenti sull’asse X. Per fare un esempio, osservando la figura 329.4, si vedono tre gruppi di valori abbinati alle descrizioni «Primo», «Secondo» e «Terzo». Si intende che le stringhe contenute nella zona A1:A3 vanno collocate nell’asse X, mentre le zone B1:B3, C1:C3 e D1:D3 sono i valori relativi da rappresentare. Figura 329.4. Si vuole realizzare il grafico dei dati contenuti nella zona A1:D3. ---------------------------------------------------------------------------. | A | B | C | D | E | F | ---|-----------|-----------|-----------|-----------|-----------|-----------| 1 | Primo | 10 | 15 | 20 | | | ---|-----------|-----------|-----------|-----------|-----------|-----------| 2 | Secondo | 20 | 17 | 15 | | | ---|-----------|-----------|-----------|-----------|-----------|-----------| 3 | Terzo | 30 | 19 | 5 | | | ---|-----------|-----------|-----------|-----------|-----------|-----------| 4 | | | | | | | ---|-----------|-----------|-----------|-----------|-----------|-----------| 5 | | | | | | | ---------------------------------------------------------------------------’ In questo caso, i valori da rappresentare, ovvero le serie di valori, sono organizzati in modo verticale. Quando il programma che si utilizza guida alla realizzazione del grafico, potrebbe proporre delle soluzioni errate; in questo caso potrebbe proporre la lettura delle serie di valori in modo orizzontale. È evidente, quindi, che quando si realizza un grafico occorre poi controllare che ciò che si ottiene corrisponda effettivamente a ciò che si vuole rappresentare. Ci si può allenare su questo problema provando a ottenere lo stesso grafico orientando diversamente la tabella dei dati, come si vede nella figura 329.5. 3 Non si deve considerare questa come una misura di sicurezza molto potente. Si tratta piuttosto di una possibilità più utile allo scopo di evitare errori all’utente inesperto a cui si fa compilare un modello del genere già pronto. Concetti generali sui fogli elettronici 3749 Figura 329.5. Si vuole realizzare il grafico dei dati contenuti nella zona A1:C4. ---------------------------------------------------------------------------. | A | B | C | D | E | F | ---|-----------|-----------|-----------|-----------|-----------|-----------| 1 | Primo | Secondo | Terzo | | | | ---|-----------|-----------|-----------|-----------|-----------|-----------| 2 | 10 | 20 | 30 | | | | ---|-----------|-----------|-----------|-----------|-----------|-----------| 3 | 15 | 17 | 19 | | | | ---|-----------|-----------|-----------|-----------|-----------|-----------| 4 | 20 | 15 | 5 | | | | ---|-----------|-----------|-----------|-----------|-----------|-----------| 5 | | | | | | | ---------------------------------------------------------------------------’ 329.7 Riordino Il foglio elettronico non è un sistema adatto per l’elaborazione di dati al livello di una base di dati. Tuttavia, può essere utile inserire elenchi brevi che poi conviene riordinare in base a qualche criterio. Generalmente tali dati vengono inseriti suddivisi in righe. Successivamente il riordino può avvenire in base alla selezione della zona rettangolare in cui si trova l’elenco, specificando quali colonne usare come criterio di ordinamento. Il riordino fatto in questo modo riguarda solo la zona selezionata, senza interferire con il resto del foglio, sia in orizzontale che in verticale. Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org Capitolo 330 Spreadsheet Calculator SC, 1 ovvero Spreadsheet Calculator, è un applicativo per l’elaborazione di fogli elettronici di vecchia concezione che è tuttora valido. La sua origine è molto lontana, a partire da un lavoro apparso su Usenet, modificato successivamente da più autori. Oggi esistono diverse varianti di questo applicativo, ognuna con un nome particolare; è disponibile anche una versione per Dos. A prima vista, l’uso di questo foglio elettronico è piuttosto complicato. In effetti, si tratta di uno di quei programmi che richiede studio e anche un po’ di memoria per i comandi che non sono così intuitivi. Nonostante tutti questi problemi, rimane un applicativo fondamentale nell’informatica del software libero. 330.1 Concetti generali In condizioni normali, una volta avviato SC, si vede una schermata simile a quanto riportato in figura 330.1. Figura 330.1. Aspetto iniziale del foglio elettronico su uno schermo di 80 colonne per 24 righe. A0 (10 2 0) [] A 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 B C D E F G < Sullo schermo si distinguono quattro parti. La prima riga in alto, serve per visualizzare il contenuto delle celle e per l’inserimento dei comandi da parte dell’utilizzatore. La seconda riga viene usata dal programma per mostrare dei messaggi, che si solito servono per conoscere l’esito di un comando appena impartito. La terza riga e le prime quattro colonne mostrano le coordinate delle celle, dove le righe sono identificate attraverso un numero e le colonne attraverso una lettera. Infine, la parte restante dello schermo è riservata alle celle del foglio elettronico. Le coordinate delle celle sono indicate usando prima la lettera e poi il numero, per esempio A0. È possibile usare lettere maiuscole o minuscole indifferentemente. 1 SC dominio pubblico 3750 Spreadsheet Calculator 3751 Sono disponibili due cursori: uno per navigare tra le celle; l’altro per scrivere i comandi. Osservando la figura 330.1 si può notare che il cursore del foglio si trova sulla cella A0, alla cui destra appare il simbolo ‘<’. In condizioni normali, la cella è anche evidenziata con un colore adatto. È interessante interpretare ciò che appare nella prima parte della prima riga dello schermo. Nel caso della figura, si vede: A0 (10 2 0) [] Significa che il cursore si trova sulla cella A0, che il formato della cella è espresso in qualche modo dalle cifre «10 2 0» e che si il suo contenuto è nullo (è vuota). Il formato si interpreta nel modo schematizzato nella figura 330.2. Figura 330.2. Interpretazione delle cifre che descrivono il formato numerico di una cella. A0 (10 2 0) [] | | | | | | | | tipo di formato: | | 0 = quantità fissa di cifre decimali | | 1 = notazione scientifica | | 2 = notazione ingegnieristica | | 3 = data (senza orario) | | | numero di cifre decimali | larghezza della colonna in caratteri Il formato numerico espresso in questo modo, può essere definito solo su una colonna intera e non si può circoscrivere a un gruppo più limitato di celle. In un gruppo di celle è possibile intervenire successivamente per modificare la rappresentazione dei valori numerici, senza alterare la larghezza della colonna. Prima di descrivere i comandi di SC è bene sapere subito che un comando non completato può essere annullato premendo il tasto [ Esc ], anche più volte se necessario. 330.1.1 Zona In tutti gli applicativi per l’elaborazione di fogli elettronici, la zona è un rettangolo di celle che va da un minimo di una sola cella fino al massimo della dimensione del foglio. Per delineare questo rettangolo si indicano le coordinate di due celle che si trovano negli angoli opposti di questo rettangolo. Con SC si usano i due punti (verticali) per unire queste due coordinate. Per esempio, A0:A0 è la zona che si riduce alla sola cella A0; A0:B1 è una zona di quattro celle totali, composta in pratica da A0, B0, A1 e B1. Di solito, salvo situazioni particolari, l’inversione nell’ordine delle coordinate e l’utilizzo degli altri due estremi non cambia il significato, per cui A0:B1 è uguale a B1:A0, così come è uguale a A1:B0 e a B0:A1. In certe situazioni, quando si vuole sottolineare il fatto che si sta facendo riferimento a un intervallo di colonne, si usa una forma simile, in cui non appaiono le coordinate numeriche delle righe. per esempio, A:C rappresenta le colonne A, B e C. Nello stesso modo è possibile indicare un intervallo di righe; per esempio, 1:3 indica le righe 1, 2 e 3. Spreadsheet Calculator 3752 330.1.2 Navigazione nel foglio La navigazione all’interno del foglio potrebbe non essere così intuitiva come ci si aspetterebbe. Teoricamente, si possono usare i tasti freccia; in pratica, questo potrebbe non essere vero. Quando ci sono difficoltà bisogna affidarsi alla tradizione, ovvero al metodo di VI, con l’aggiunta di qualche altra possibilità. La tabella 330.1 riepiloga i comandi per lo spostamento del cursore nel foglio. Bisogna considerare che per ottenere l’inserimento di un’informazione in una cella, occorre usare prima il comando apposito che permette di entrare nella fase di inserimento. Pertanto, la pressione «casuale» di un tasto si traduce quasi sempre in un comando. Tabella 330.1. Comandi principali per la navigazione tra le celle del foglio. Comando h j k l Alternativa Ctrl+b Ctrl+n Ctrl+p Ctrl+f Spostamento A sinistra di una cella. In basso di una cella. In alto di una cella. A destra di una cella. Esistono anche una serie di comandi utili per raggiungere posizioni particolari in modo rapido. In particolare, può essere utile raggiungere solo celle che contengono già qualcosa (nella documentazione originale si parla di «celle valide»). La tabella 330.2 riepiloga altri comandi per lo spostamento nel foglio. Tabella 330.2. Comandi speciali per la navigazione nel foglio. Comando ^ # 0 $ b w gcoordinata Spostamento Sulla prima riga della colonna attuale. Sull’ultima riga che contiene qualcosa, della colonna attuale. Sulla prima colonna della riga attuale. Sull’ultima colonna che contiene qualcosa, della riga attuale. Sulla cella precedente che contiene qualcosa. Sulla cella successiva che contiene qualcosa. Sulla cella indicata dalla coordinata. 330.1.3 Inserimento e modifica di dati nella riga di comando L’aspetto più complicato per un principiante alle prese con questo applicativo è probabilmente la modifica del testo nella riga di comando. Ci sono varie situazioni in cui occorre inserire un’informazione; di solito si tratta di introdurre il valore di una cella, oppure si deve completare un comando specificando una zona, o altro. In queste situazioni, si accede alla parte superiore dello schermo, in quella che qui viene chiamata la riga di comando. Quando il contesto porta a inserire qualcosa, tutto avviene come ci si potrebbe aspettare, inserendo normalmente il testo, dove il tasto [ backspace ] funziona regolarmente per cancellare. Tuttavia, la cosa non è così semplice come appare, perché si tratta di una riga che riconosce i comandi di VI: è sufficiente premere [ Esc ] per passare alla modalità di comando. La tabella 330.3 riepiloga le funzionalità più importanti della modalità di comando, quando si sta lavorando sulla prima riga dello schermo. Spreadsheet Calculator 3753 Tabella 330.3. Comandi disponibili quando si modifica qualcosa sulla prima riga dello schermo. Comando i a h l x [ Invio ] Descrizione Termina la modalità di comando e inizia l’inserimento. Termina la modalità di comando e inizia l’inserimento dopo il cursore. Va a sinistra di un carattere. Va a destra di un carattere. Cancella il carattere corrispondente al cursore. Conferma e conclude. 330.2 Avvio e opzioni di funzionamento L’avvio di questo programma è molto semplice. Sono disponibili alcune opzioni che hanno dei comandi corrispondenti in fase di funzionamento del programma. sc [opzioni] [file] La tabella 330.4 riepiloga le opzioni più importanti. Successivamente vengono mostrate altre tabelle contenenti la descrizione di comandi interattivi. Tabella 330.4. Opzioni principali da dare all’avvio dell’eseguibile. Opzione -r -c -m -n Descrizione Ricalcola per righe (predefinito). Ricalcola per colonna. Disabilita il ricalcolo automatico. Inserimento numerico rapido. Durante il funzionamento sono disponibili due gruppi di comandi per modificare l’impostazione del programma. Si tratta di comandi che scambiano alcune modalità, attivandole o disattivandole, in funzione dello stato precedente, oppure di comandi che impostano in modo preciso. I comandi che scambiano le modalità iniziano con la combinazione [ Ctrl+t ] e seguono con un’altra lettera; i comandi di impostazione iniziano con la lettera ‘S’ (maiuscola), che richiede poi l’inserimento di un comando scritto per esteso. Per esempio, la sequenza [ Ctrl+t ][ a ] attiva o disattiva la modalità di ricalcolo automatico; nello stesso modo, il comando [ S ] seguito da ‘iterations=7’ stabilisce che le iterazioni da eseguire per ricalcolare i valori delle espressioni devono essere sette. La tabella 330.5 riepiloga i comandi più importanti da impartire in questo modo. Tabella 330.5. Alcuni comandi che modificano la modalità di funzionamento, distinguendo tra quelli di scambio, che iniziano con iniziano con [ S ]. Comando Ctrl+t a Ctrl+t c Ctrl+t n Ctrl+t t S byrows S bycols S iterations=n S tblstyle=0 S tblstyle=tbl S tblstyle=latex S tblstyle=tex S tblstyle=frame [ Ctrl+t ] e quelli di impostazione, che Descrizione Attiva o disattiva il ricalcolo automatico delle celle. Attiva o disattiva l’evidenziamento della cella corrente. Attiva o disattiva la modalità di inserimento numerico rapido. Attiva o disattiva la visualizzazione di informazioni sulla prima riga. Definisce un ricalcolo delle celle per righe. Definisce un ricalcolo delle celle per colonne. Definisce il numero massimo di cicli per il ricalcolo delle celle. Esporta la tabella con i campi separati da due punti. Esporta la tabella in formato Tbl (*roff). Esporta la tabella in formato LaTeX. Esporta la tabella in formato TeX. Esporta la tabella in formato FrameMaker. Spreadsheet Calculator 3754 È opportuno sottolineare che le impostazioni di esportazioni si riferiscono al comando ‘T’, con il quale si esporta il contenuto della tabella in un altro formato. 330.3 Inserimento e modifica dei valori nelle celle Questo tipo di elaboratore di fogli elettronici, distingue tra diversi contesti di funzionamento. Inizialmente ci si trova in una modalità di comando, dove molti dei tasti (lettere o numeri) possono rappresentare l’inizio di un comando. In base a questa logica, l’inserimento dei dati nelle celle deve essere preceduto da un comando apposito: ‘"’ inizia l’inserimento di una cella che rappresenta un valore stringa; ‘=’ inizia l’inserimento di una cella che rappresenta un valore numerico. Tale premessa permette di comprendere che questo tipo di foglio elettronico è in grado di gestire soltanto due tipi di dati: stringhe e numeri (reali). Questi valori possono essere inseriti in forma costante, oppure si possono indicare delle espressioni che generano un risultato del tipo previsto. L’uso del comando ‘=’ o ‘"’ porta il programma in un contesto di funzionamento particolare, in cui si digita l’espressione (costante o meno) sulla prima riga dello schermo, che mostra l’invito ‘i>’ (insert). i> Tale digitazione è sottoposta al controllo che è già stato descritto in precedenza: è come se fosse stato iniziato un comando di inserimento con il programma VI, dal quale, se si preme il tasto [ Esc ] si passa alla modalità di comando relativa, che viene fatta notare attraverso l’invito ‘e>’ (edit). e> Questo è riassunto nella tabella 330.3 che è già stata mostrata in precedenza. L’informazione viene memorizzata nella cella solo se si conclude l’inserimento con la pressione di [ Invio ]; pertanto, se si passa alla modalità di comando (attraverso il tasto [ Esc ]) e poi si preme nuovamente [ Esc ], si annulla l’inserimento. L’inserimento di qualcosa in una cella, viene filtrato attraverso un comando di un linguaggio interno al foglio elettronico. Se si assegna una stringa, il comando è label cella = {stringa_delimitata|espressione_stringa} mentre se si assegna un valore numerico, il comando è let cella = {costante_numerica |espressione_numerica } Quando si inserisce un valore, bisogna fare attenzione a non modificare la parte iniziale del comando, a meno che si tratti di un’azione voluta. Per modificare il contenuto di una cella, in generale è possibile cancellarlo prima, per poi inserire quello nuovo, dove la cancellazione si ottiene con il comando ‘x’. La modifica del contenuto richiede invece di passare a un contesto di funzionamento analogo a quello di inserimento, in cui però ci si trova inizialmente in modalità di modifica. In pratica, ci si trova subito di fronte all’invito ‘e>’ e ci si deve comportare di conseguenza. Per passare alla modifica del contenuto di una cella, si usano due comandi differenti, a seconda che si intenda modificare un valore stringa, ‘E’, o un valore numerico, ‘e’. Questo serve a cambiare il comando interno del foglio elettronico, che nel primo caso è ‘label’, mentre nel secondo è ‘let’. Tutto questo ha un significato che diventerà più chiaro in seguito, quando verrà descritto il formato in cui vengono salvati i dati. Spreadsheet Calculator 3755 Per il momento, è importante comprendere che una cella può contenere simultaneamente due valori: uno numerico e uno stringa. In generale, una cosa del genere non dovrebbe essere ammissibile, ma la logica di SC porta a tale situazione. Tabella 330.6. Comandi di inserimento e modifica dei valori delle celle. I comandi particolari che sono disponibili durante il contesto di modifica, sono già stati descritti in un’altra tabella. Comando = " < > e E Descrizione Inizia l’inserimento di un valore numerico. Inizia l’inserimento di un valore stringa (centrato). Inizia l’inserimento di un valore stringa a sinistra. Inizia l’inserimento di un valore stringa a destra. Inizia la modifica di un valore numerico. Inizia la modifica di un valore stringa. 330.3.1 Particolarità dell’inserimento di valori ed espressioni stringa L’inserimento di una stringa, inizia con il comando ‘"’, che porta ad attivare la riga di comando sulla prima riga dello schermo. Supponendo di intervenire sulla cella A7, si ottiene questo: i> label A7 = "_ Il cursore per la digitazione della stringa si trova subito dopo gli apici doppi che si vedono nell’esempio. Quello che si sta inserendo è un’istruzione del foglio elettronico, con la quale si assegna la stringa (label) alla cella A7. Si intuisce che gli apici doppi iniziali servono a delimitare una stringa costante. Supponendo di voler inserire la parola «ciao», si può procedere come di seguito: i> label A7 = "ciao_ Alla fine, si può concludere la stringa con un altro apice doppio, oppure si può anche farne a meno. In ogni caso, al termine si conclude con un [ Invio ]. La stringa può essere collocata al centro della cella, a sinistra o a destra. Il comando ‘"’ inizia l’inserimento di una stringa centrata; per l’allineamento a sinistra si usa il comando ‘<’; per l’allineamento a destra si usa il comando ‘>’. A questi comandi corrispondono altrettante istruzioni interne del foglio elettronico, che vengono generate automaticamente: • label cella = espressione stringa centrata; • leftstring cella = espressione stringa allineata a sinistra; • rightstring cella = espressione stringa allineata a destra. Fino a questo punto è stato mostrato l’inserimento di stringhe costanti. Per quanto riguarda le espressioni che generano un risultato stringa, bisogna considerare che l’apice doppio iniziale, inserito automaticamente, deve essere eliminato. Per esempio, se la cella A0 contiene una stringa, volendo fare riferimento al suo contenuto nella cella B3, si deve usare il riferimento alla cella A0, senza delimitazioni. In pratica, all’inizio si ha questa situazione: i> label B3 = " 3756 Spreadsheet Calculator Quindi, si cancella l’apice doppio e si inserisce l’espressione desiderata: i> label B3 = A0[ Invio ] Probabilmente, in una stringa costante è impossibile indicare un apice doppio; inoltre, si può usare una barra obliqua iniziale per ottenere la ripetizione della parte successiva, per tutta la larghezza della colonna. In pratica, i> label A10 = "\-=[ Invio ] si traduce in pratica nella cella nel modo seguente: -=-=-=-=-= 330.3.2 Particolarità dell’inserimento di valori ed espressioni numerici L’inserimento di valori numerici non presenta situazioni particolari. Infatti, un valore numerico costante non richiede alcuna delimitazione, così come le espressioni che generano un risultato numerico. A questo proposito, si può valutare la possibilità di abilitare l’inserimento numerico rapido, con il comando [ Ctrl+t ][ n ], oppure attraverso l’opzione ‘-n’. In generale, per coerenza, non è il caso di intervenire in questo modo; tuttavia, di fronte alla necessità di inserire un gran numero di costanti numeriche, può essere conveniente questo approccio. 330.4 Formato delle celle La gestione del formato delle celle è piuttosto strana, per cui è necessario trattare l’argomento in modo particolare. Per prima cosa occorre considerare la larghezza della colonna che viene determinata attraverso il comando ‘f’. Questo attende l’inserimento di tre valori numerici: la larghezza in caratteri, la quantità di cifre decimali e il tipo. Questa cosa è già stata anticipata nella figura 330.2, in cui è descritto dettagliatamente il significato dell’ultimo valore. Per fare un esempio molto semplice, il formato ‘10 2 0’, che è quello predefinito, rappresenta una colonna di 10 caratteri di larghezza, in cui i valori vengono rappresentati con due decimali, attraverso una notazione normale a virgola fissa. In pratica, in queste condizioni, si possono rappresentare numeri da ‘-999999.99’ a ‘9999999.99’. Anche la notazione scientifica e quella ingegnieristica, definite rispettivamente dal tipo uno e due, utilizzano l’informazione sulla quantità di decimali. Al contrario, il formato delle date (il numero tre), non dipende dalla quantità dei decimali. In pratica, il comando ‘f’ definisce il formato numerico generale di una colonna, cosa che si traduce anche nella definizione della larghezza della colonna stessa. Evidentemente, per quanto riguarda le stringhe, queste risentono solo della larghezza della cella e non delle altre informazioni. Nell’ambito di una sola cella, è possibile cambiare il formato generale della colonna attraverso il comando ‘F’, mentre per un gruppo di celle si usa il comando analogo ‘/F’. Questo richiede l’inserimento di una stringa speciale, composta da caratteri che servono a rappresentare un formato numerico. Il significato di questi simboli appare descritto nella tabella 330.7. Spreadsheet Calculator 3757 Tabella 330.7. Comandi per il controllo del formato delle colonne e della visualizzazione dei valori numerici. Comando f larghezza decimali tipo tipo: 0 1 2 3 F stringa_formato # 0 . , % \x E+ e+ E- e; /F zona stringa_formato | | Descrizione Formato generale della colonna. Virgola fissa. Notazione scientifica. Notazione ingegnieristica. Data. Formato particolare della cella. Cifra numerica eventuale. Cifra numerica fissa. Separatore decimale. Separatore delle migliaia. Inserisce il simbolo e mostra in forma di percentuale. Tratta x in modo letterale. Notazione scientifica. Notazione scientifica mostrando il segno solo quando negativo. Divide due formati per i valori positivi e i valori negativi. Formato particolare di una zona di celle. Si possono osservare i comandi interni del foglio elettronico nel momento in cui si definisce il formato della colonna, oppure il formato specifico di un gruppo di celle. Nel primo caso si tratta dell’istruzione ‘format’: format colonna larghezza decimali tipo Nel secondo caso, l’istruzione si abbrevia: fmt zona stringa_di_formato_delimitata Nel seguito vengono mostrati alcuni esempi, cercando di riprodurre nel modo migliore possibile la situazione che si vede sullo schermo. Si deve tenere presente che l’istruzione interna del foglio elettronico viene generata automaticamente; quello che serve, semmai, è di fare attenzione a non cancellarla. L’informazione che appare tra parentesi quadre nell’istruzione del foglio elettronico (‘[for column]’ e ‘[format]’), non fa parte dell’istruzione stessa. Viene collocata per facilitare all’utilizzatore la comprensione dell’azione che si sta compiendo. I comandi ‘F’ e ‘/F’ sono identici dal punto di vista del foglio elettronico, perché generano la stessa istruzione interna. Nel primo caso, la zona viene indicata automaticamente, riferendola alla cella corrente. Esempi [f ] i> format [for column] A 15 3 0[ Invio ] Modifica il formato della colonna A, in modo da avere 15 caratteri di larghezza, riservando tre cifre per i decimali, mostrando valori a virgola fissa. [f ] i> format [for column] A 15 3 1[ Invio ] Spreadsheet Calculator 3758 Come nell’esempio precedente, utilizzando però una notazione scientifica. [F] i> fmt [format] A1 "########.000[ Invio ] Modifica il formato particolare della cella A1, in modo da rappresentare valori che vanno da un minimo di -9999999,999 a un massimo di 99999999,999. [F] i> fmt [format] A2 "###%[ Invio ] Modifica il formato particolare della cella A1, in modo da rappresentare valori percentuali interi. [F] i> fmt [format] A3 "########.000;\(########.000\)[ Invio ] Modifica il formato particolare della cella A3, in modo da rappresentare valori che vanno da un minimo di -99999999,999 a un massimo di 99999999,999. In particolare, i valori negativi sono rappresentati tra parentesi. 330.5 Comandi per intervenire sui file Per caricare o salvare il foglio, si interviene con comandi composti da una lettera, seguita dal nome del file e forse da altre indicazioni. Vengono descritti brevemente questi comandi. • G file_da_caricare Il comando ‘G’ sta per Get e permette di caricare un foglio elettronico che in precedenza era stato salvato su un file. Appena si preme la lettera ‘G’, si passa sulla parte superiore dello schermo a scrivere il nome di tale file, che deve essere conosciuto preventivamente, perché non viene dato alcun ausilio di ricerca: i> get ["source"] "prova[ Invio ] L’esempio mostra in pratica il completamento del comando per caricare il file ‘prova’ che si trova nella directory corrente. • M file_da_caricare Il comando ‘M’ sta per Merge e permette di caricare un altro foglio elettronico che vada a sommarsi a quanto appare già sullo schermo. In pratica, le celle che dovessero già contenere qualcosa, vengono sovrascritte, perdendo l’informazione precedente. • P [[file_da_salvare] ] zona Il comando ‘P’ sta per Put e permette di salvare il foglio elettronico in un file. Appena si preme la lettera ‘P’, si passa sulla parte superiore dello schermo a scrivere il nome di tale file, che però non è necessario se in precedenza il foglio era già stato salvato. i> put ["dest" range] "prova[ Invio ] L’esempio mostra in pratica il completamento del comando per salvare il foglio nel file ‘prova’. Se il nome era già stato stabilito in precedenza, è sufficiente premere [ Invio ] per confermare l’operazione con il nome precedente. Volendo, è possibile salvare solo una parte del foglio elettronico, definendo le coordinate della zona a cui si è interessati. Spreadsheet Calculator 3759 i> put ["dest" range] "prova-1" A0:F10[ Invio ] In questo caso, si vuole salvare la zona delimitata dalle coordinate A0:F10 nel file ‘prova-1’. Si noti che in questo caso è stato necessario concludere la delimitazione del nome del file attraverso gli apici doppi finali. • W [[file_di_testo] ] zona Il comando ‘W’ sta per Write e si comporta in modo analogo a ‘P’, con la differenza che genera un file di testo contenente la rappresentazione finale del foglio. In pratica, si tratta di una forma di esportazione che potrebbe essere diretta anche alla stampa. i> write ["dest" range] "| lpr" A0:F10[ Invio ] Con questo comando si vuole stampare la zona A0:F10, attraverso l’invio della stessa al comando ‘lpr’. • T [[file_da_esportare] ] zona Il comando ‘T’ sta per Table e serve a esportare una zona, o tutto il foglio, in un formato differente, definito attraverso il comando ‘S tblstyle’, già descritto nella tabella 330.5. Il funzionamento è analogo ai comandi ‘P’ e ‘W’. Tabella 330.8. Comandi per la gestione dei file. Comando G file M file P file zona [ [ ]] W [file [zona]] T [file [zona]] Descrizione Carica il file. Sovrappone il file al foglio attuale. Salva il foglio o solo una zona particolare. Salva (esporta) in formato testo. Esporta in un altro formato. In generale, tutti i comandi che servono a salvare o a esportare dati, permettono l’indicazione di un file su disco, oppure di un comando del sistema operativo da alimentare attraverso una pipeline. In pratica, se il nome del file inizia con il simbolo ‘|’, si intende che si tratti di una pipeline. 330.6 Comandi per intervenire su zone del foglio Per qualche ragione, i comandi che intervengono su una zona rettangolare del foglio, iniziano tutti con la barra obliqua normale (‘/’) e continuano con una lettera, dopo la quale, di solito, si è invitati a inserire la zona a cui si fa riferimento. Da questo si intende che le coordinate delle zone vanno scritte sempre dopo aver iniziato il comando, nel modo che è già stato mostrato: coordinata_iniziale :coordinata_finale In alternativa, si può indicare il nome della zona, che eventualmente gli fosse stato assegnato in precedenza con il comando ‘/d’. Il programma offre anche qualche accorgimento per facilitare l’inserimento delle zone, ma in generale non si tratta di soluzioni convenienti, per cui di solito è meglio usare la digitazione normale. La tabella 330.9 riepiloga brevemente i comandi principali di questo tipo, mentre nel seguito sono mostrati alcuni esempi, in cui si vede anche l’istruzione interna del foglio elettronico, che comunque viene generata automaticamente. Spreadsheet Calculator 3760 Tabella 330.9. Comandi per la gestione delle zone del foglio. Comando /x zona /c zona_destinazione zona_origine /c zona_destinazione cella_origine /f zona_destinazione n_iniziale incremento /d stringa_nome zona /u zona /s /l zona /U zona /F zona stringa_formato Descrizione Cancella il contenuto delle celle nella zona indicata. Copia una zona. Copia una cella riempiendo una zona. Riempie una zona di valori. Assegna un nome a una zona di celle. Cancella il nome assegnato alla zona in precedenza. Mostra l’elenco delle zone che hanno un nome. Impedisce la modifica della zona. Libera la zona indicata che così può essere modificata. Assegna un formato a una zona di celle. Esempi [ / ][ x ] i> erase A0:F20[ Invio ] Elimina il contenuto delle celle che si trovano nella zona delimitata da A0:F20. [ / ][ c ] i> copy A0:A7 D0:D7[ Invio ] Copia la zona D0:D7 in A0:A7. [ / ][ c ] i> copy A0:A7 D0[ Invio ] Copia la cella D0 in tutta la zona A0:A7. [ / ][ f ] i> fill B0:B7 10 2[ Invio ] Riempie le celle della zona B0:B7 a partire dal numero 10, per continuare con numeri che si incrementano di due unità ogni volta. [ / ][ d ] i> define "elenco" B0:B7[ Invio ] Assegna alla zona B0:B7 il nome ‘elenco’. [ / ][ s ] Mostra l’elenco delle zone che hanno un nome, inviando l’elenco sotto il controllo di Less o di un altro programma analogo secondo quanto indicato nella variabile di ambiente ‘PAGER’. Per uscire dalla visualizzazione, occorre usare i comandi di quel programma. Con Less basta premere la lettera ‘q’. [ / ][ F ] i> fmt B0:B7 "####.0000"[ Invio ] Assegna alla zona B0:B7 il formato ‘####.0000’. Spreadsheet Calculator 3761 330.6.1 Aiuto alla definizione delle celle e delle zone Una volta entrati nell’idea di funzionamento di questo tipo di foglio elettronico, le cose non sono più tanto difficili e può essere utile sfruttare qualche accorgimento che facilita l’inserimento di coordinate riferite a celle o zone. Nel momento in cui ci si trova nella fase di inserimento, nella prima riga dello schermo, sono disponibili alcuni comandi. In particolare i comandi [ Ctrl+b ], [ Ctrl+n ], [ Ctrl+p ] e [ Ctrl+f ] sono ancora disponibili, per evidenziare una zona nel foglio sottostante. Usando questi comandi, la zona evidenziata diventa la zona «predefinita», che si può inserire automaticamente con il tasto [ Tab ]. Bisogna provare un po’ e poi si comprende il senso di questo. Tabella 330.10. Comandi speciali disponibili durante la digitazione nella prima riga dello schermo. Comando Ctrl+b Ctrl+n Ctrl+p Ctrl+f Tab Ctrl+v Effetto Back, estende a sinistra la zona predefinita. Next, estende in basso la zona predefinita. Previous, estende in alto la zona predefinita. Forward, estende a destra la zona predefinita. Inserisce la zona predefinita nella riga. Inserisce la cella corrente nella riga. 330.6.2 Coordinate relative o assolute Le espressioni del foglio elettronico vengono descritte in seguito. Tuttavia, in questa fase è importante rendersi conto della rappresentazione delle celle e delle zone di celle, che in pratica sono le variabili di un foglio elettronico. Quando un’espressione contiene un riferimento a una cella o a una zona, se questa cella viene copiata in un’altra posizione, questi riferimenti vengono modificati in modo relativo. Per esempio, se la cella A0 contiene un riferimento alla cella B1, copiando la cella A0 in C2, il riferimento interno alla cella C2 sarà alla cella D3. Per indicare un riferimento assoluto, si aggiunge nelle coordinate il simbolo ‘$’, davanti alla componente che si vuole «bloccare». Si osservino gli esempio seguenti: • ‘X4’ riferimento relativo alla cella X4; • ‘$X$4’ riferimento assoluto alla cella X4; • ‘$X4’ riferimento alla cella X4, dove la colonna è un’informazione assoluta, mentre la riga rimane un’indicazione relativa; • ‘X$4’ riferimento alla cella X4, dove la riga è un’informazione assoluta, mentre la colonna rimane un’indicazione relativa; 330.7 Comandi vari Nelle sezioni precedenti sono stati esclusi alcuni comandi. In particolare non è ancora stato spiegato come si termina il lavoro con questo programma: ciò si ottiene con [ Q ], [ q ], oppure [ Ctrl+c ]; se il foglio attuale non è stato salvato viene chiesto se si vogliono salvare i dati, oppure se si intende rinunciare. La tabella 330.11 riepiloga questi comandi. Spreadsheet Calculator 3762 Tabella 330.11. Comandi vari. Comando Q q Ctrl+c Esc Ctrl+g Ctrl+l Ctrl+r Ctrl+x @ m c + [ Invio ] ? Descrizione Conclude il funzionamento del programma. " " Annulla il comando in corso. " Ridisegna lo schermo. Evidenzia le celle che contengono costanti numeriche. Evidenzia le celle che contengono espressioni. Ricalcola le espressioni. Copia il contenuto della cella in un’area transitoria. Incolla il contenuto dell’area transitoria nella cella corrente. In condizioni normali, incrementa il valore numerico della cella. In condizioni normali, decrementa il valore numerico della cella. Passa all’inserimento di un’istruzione libera. Mostra la guida interna. 330.8 Espressioni Le celle del foglio sono fatte per contenere delle espressioni. Queste possono essere semplicemente dei valori costanti, numerici o stringa, oppure può trattarsi di qualcosa di più complesso. Le espressioni si ottengono attraverso l’uso di operatori e anche attraverso funzioni che hanno la caratteristica di iniziare con il simbolo ‘@’. Nel seguito vengono mostrate alcune tabelle che riassumono gli operatori e le funzioni di uso più comune. Resta sempre la documentazione originale per conoscere le altre possibilità a disposizione. Si può osservare che è possibile rappresentare un risultato booleano. In pratica, Vero corrisponde al valore numerico uno; Falso corrisponde al valore numerico zero. Le espressioni possono essere raggruppate attraverso l’uso di parentesi tonde, più o meno annidate. Tabella 330.12. Elenco degli operatori utilizzabili in presenza di valori numerici e logici. Espressioni -op op1+op2 op1-op2 op1*op2 op1/op2 op1%op2 op1^op2 op1<op2 op1>op2 op1<=op2 op1>=op2 op1=op2 op1!=op2 ~op op1&op2 op1|op2 op1?op2:op3 Descrizione Inverte il segno dell’operando. Somma i due operandi. Sottrae dal primo il secondo operando. Moltiplica i due operandi. Divide il primo operando per il secondo. Modulo: il resto della divisione tra il primo e il secondo operando. Eleva il primo operando alla potenza del secondo. Vero se il primo operando è minore del secondo. Vero se il primo operando è maggiore del secondo. Vero se il primo operando è minore o uguale al secondo. Vero se il primo operando è maggiore o uguale al secondo. Vero se gli operandi si equivalgono. Vero se gli operandi sono differenti. NOT, inversione logica. AND logico. OR logico. Restituisce il secondo operando se il primo è Vero, altrimenti il terzo. Spreadsheet Calculator 3763 Tabella 330.13. Elenco di alcuni operatori e di alcune funzioni che hanno a che fare con le stringhe. Espressioni str1 # str2 @substr(str1,n ,m ) @fmt(stringa_printf ,n ) @upper(str1) @capital(str1) @eqs(str1,str2) Descrizione Concatena le due stringhe. La sottostringa dalla posizione n per m caratteri. Converte un numero in stringa, in base al formato indicato. Converte in maiuscolo. La prima lettera di ogni parola in maiuscolo. Vero se le due stringhe sono uguali. Tabella 330.14. Elenco di alcune funzioni che intervengono su zone. Espressioni @sum(zona ) @prod(zona ) @avr(zona ) @count(zona ) @max(zona ) @min(zona ) Descrizione Sommatoria dei valori della zona. Prodotto dei valori delle celle. Media aritmetica di tutti i valori validi. Quantità di celle contenenti valori validi. Valore massimo. Valore minimo. Tabella 330.15. Elenco di alcune funzioni matematiche comuni. Espressioni @sqrt(n ) @exp(n ) @ln(n ) @log(n ) @floor(n ) @ceil(n ) @rnd(n ) @round(n ,m ) @abs(n ) @pow(n ,m ) @pi @dtr(n ) @rtd(n ) @sin(n ) @cos(n ) @tan(n ) @asin(n ) @acos(n ) @atan(n ) Descrizione Radice quadrata. Funzione esponenziale. Logaritmo naturale. Logaritmo a base 10. L’intero più grande non superiore del valore fornito. L’intero più piccolo non inferiore del valore fornito. Arrotonda all’intero. Arrotonda n all’m -esima cifra decimale. Valore assoluto. n elevato alla potenza di m . P-greco. Converte da gradi a radianti. Converte da radianti a gradi. Seno. Coseno. Tangente. Arco-seno. Arco-coseno. Arco-tangente. Tabella 330.16. Elenco di alcune funzioni relative a date e orari. Espressioni @now @dts(mese ,giorno ,anno ) @tts(ore,minuti ,secondi ) @date(tempo_in_secondi ) @year(tempo_in_secondi ) @month(tempo_in_secondi ) @day(tempo_in_secondi ) @hour(orario_in_secondi ) @minute(orario_in_secondi ) @second(orario_in_secondi ) Descrizione Tempo attuale in secondi (dal riferimento del 31 dicembre 1969). Tempo in secondi corrispondente alla data fornita. Orario in secondi a partire dalla mezzanotte. Restituisce la data corrispondente in forma di stringa. Restituisce l’anno. Restituisce il mese. Restituisce il giorno. Restituisce l’ora. Restituisce i minuti. Restituisce i secondi. Spreadsheet Calculator 3764 330.9 Formato del file I file gestiti da SC sono file di testo contenenti direttive del linguaggio interno al foglio elettronico. Per fare un esempio iniziale, basti pensare a un foglio in cui siano state assegnate solo le celle A0 e B1, come si vede nell’esempio: 0 1 A 123.00 B ciao C D E F G < In pratica, la cella A0 contiene il numero 123, mentre la cella B1 contiene la stringa ‘ciao’. Tutto il resto si considera inutilizzato. Salvando questo lavoro in un file, si ottiene ciò che segue: # This data file was generated by the Spreadsheet Calculator. # You almost certainly shouldn’t edit it. let A0 = 123 label B1 = "ciao" goto B1 Si intuisce che le righe che iniziano con il simbolo ‘#’, assieme a quelle che sono bianche o semplicemente vuote, vengono ignorate. Tutto il resto viene definito in forma di direttiva, corrispondente a istruzioni del foglio elettronico. In particolare, è stata anche memorizzata la posizione del cursore, che si presume si trovasse sulla cella B1. Nell’ambito delle direttive, ciò che appare racchiuso tra parentesi quadre viene considerato un commento; di conseguenza viene ignorato. Per esempio, se si modifica il file a mano, nel modo seguente, # This data file was generated by the Spreadsheet Calculator. # You almost certainly shouldn’t edit it. let [ciao ciao] A0 = 123 label B1 = "ciao" [ciao ciao] goto B1 tutto funziona regolarmente, senza che queste cose influiscano. Negli esempi che sono già stati mostrati nel capitolo, al riguardo di queste istruzioni interne del foglio elettronico, sono già apparse indicazioni tra parentesi quadre, usate per suggerire all’utente le informazioni da inserire. Evidentemente, tali indicazioni non fanno parte delle istruzioni. La tabella 330.17 riepiloga le istruzioni principali del foglio elettronico, con le quali si può realizzare direttamente un file per SC. Altre istruzioni possono essere individuate semplicemente osservando il comportamento di questo programma. Tabella 330.17. Alcune istruzioni interne del foglio elettronico, utili per la realizzazione diretta dei suoi file. Espressioni let cella = espr_num label cella = espr_str format colonna = larghezza decimali tipo fmt zona str_formato set byrows set bycols set iterations = n_iterazioni set tblstyle = stile set autocalc set !autocalc set numeric set !numeric set cellcur Descrizione Assegna alla cella un’espressione numerica. Assegna alla cella un’espressione stringa. Modifica il formato di una colonna. Modifica il formato di una zona. Ricalcola per righe. Ricalcola per colonne. Iterazioni per il ricalcolo. Definisce lo stile di esportazione delle tabelle. Ricalcola automaticamente. Non ricalcola automaticamente. Inserimento numerico rapido. Inserimento numerico normale. Evidenzia la cella corrente. Spreadsheet Calculator Espressioni set !cellcur set toprow set !toprow goto cella 3765 Descrizione Non evidenzia la cella corrente. Mostra le informazioni sulla prima riga. Non mostra le informazioni sulla prima riga. Porta il cursore sulla cella indicata. Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org 3766 Spreadsheet Calculator Parte lxviii Applicazioni matematiche e grafiche varie 331 Gnuplot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3768 331.1 Avvio e interazione normale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3769 331.2 Comandi comuni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3769 331.3 Espressioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3771 331.4 Script e file di dati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3774 331.5 Controllare l’uscita grafica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3775 332 Octave . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3777 332.1 Avvio e interazione normale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3777 332.2 Variabili di Octave e calcoli elementari . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3778 332.3 Vettori e matrici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3779 332.4 Disegno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3780 332.5 Script di Octave . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3781 332.6 File di dati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3781 333 Applicazioni matematiche varie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3783 333.1 Geg -- GTK+ Equation Grapher . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3783 333.2 QCad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3786 Indice analitico del volume . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3787 3767 Capitolo 331 Gnuplot Gnuplot 1 è un programma applicativo per il disegno di funzioni e di dati nello spazio a due e tre dimensioni. Il suo funzionamento avviene per mezzo di istruzioni impartite attraverso una riga di comando e in questo senso il suo utilizzo può risultare un po’ strano all’utilizzatore occasionale. Gnuplot è disponibile su molti sistemi operativi differenti e per quanto riguarda GNU/Linux, si utilizza l’interfaccia grafica X. Per la precisione, si deve impegnare una finestra di terminale, attraverso la quale impartire i comandi. Questi generano eventualmente una rappresentazione grafica che viene mostrata in una finestra separata. L’esempio seguente mostra una sessione di lavoro brevissima utilizzando l’eseguibile ‘gnuplot’ per visualizzare la funzione x2 * sin(x), dove sia l’asse X che l’asse Y vanno da -P-greco a +P-greco. $ gnuplot[ Invio ] G N U P L O T Linux version 3.5 (pre 3.6) patchlevel beta 347 last modified Mon Jun 22 13:22:33 BST 1998 Copyright(C) 1986 - 1993, 1998 Thomas Williams, Colin Kelley and many others Send comments and requests for help to [email protected] Send bugs, suggestions and mods to [email protected] Terminal type set to ’x11’ gnuplot> splot [-pi:pi] [-pi:pi] x**2 * sin(y)[ Invio ] La figura 331.1 mostra il risultato di questa funzione, così come appare nella finestra generata dal comando di Gnuplot che è appena stato visto. Figura 331.1. Una funzione nello spazio tridimensionale disegnata con Gnuplot. La versione per GNU/Linux di Gnuplot utilizza la libreria Readline per il controllo della riga di comando: questo facilita la sua configurazione (attraverso il file ‘~/.inputrc’) e il riutilizzo di 1 Gnuplot software libero con licenza speciale 3768 Gnuplot 3769 comandi già inseriti, attraverso lo scorrimento dello storico. In pratica, chi utilizza già la shell Bash dovrebbe trovarsi a suo agio di fronte alla riga di comando di Gnuplot. 331.1 Avvio e interazione normale Gnuplot viene avviato attraverso l’eseguibile ‘gnuplot’, utilizzando necessariamente una finestra di terminale. Non è previsto l’uso di opzioni speciali, a parte quelle comuni per l’uso di programmi nel sistema grafico X (‘-geometry’, ‘-display’, ecc.). gnuplot [opzioni] [file_script ...] Eventualmente, come si vede dallo schema sintattico, possono essere indicati dei file da caricare ed eseguire. Si tratta di script di Gnuplot, composti semplicemente da una sequenza di comandi che potrebbero essere impartiti attraverso la riga di comando normale dello stesso. Il disegno delle funzioni avviene attraverso il comando ‘plot’, per il disegno di curve nello spazio a due dimensioni, e ‘splot’, per il disegno di piani nello spazio a tre dimensioni. Il funzionamento interattivo di Gnuplot (quello normale che si ottiene quando non si indicano file da caricare) prevede in particolare il comando ‘help’ per ottenere una guida rapida ai comandi e il comando ‘exit’ (o ‘quit’) per terminarne il funzionamento. La guida rapida ottenibile con il comando ‘help’ permette di selezionare degli argomenti particolari che generalmente corrispondono ai nomi dei comandi utilizzabili. Il comando ‘help’ da solo mostra un’introduzione all’uso di Gnuplot e termina elencando gli argomenti per i quali si possono richiedere informazioni specifiche. 331.2 Comandi comuni I comandi di Gnuplot sono numerosi e complessi. Qui viene mostrato solo l’uso di alcuni di questi e in modo elementare, dove in particolare anche gli schemi sintattici vengono semplificati. In generale, è possibile mettere assieme più comandi in un’unica riga separandoli con il punto e virgola (‘;’); i comandi possono continuare nella riga successiva se si utilizza la barra obliqua inversa (‘\’) esattamente alla fine di una riga da continuare. Alcuni argomenti dei comandi sono delle stringhe, nel senso che non fanno riferimento a parole chiave previste; in tal caso devono essere delimitate con gli apici singoli (‘’’) o con gli apici doppi (‘"’), dove le stringhe delimitate con apici doppi espandono alcune sequenze precedute dalla barra obliqua inversa, mentre le altre no. Una riga di comando di Gnuplot può contenere anche stringhe delimitate da apici inversi (‘‘’). In tal caso queste stringhe vengono interpretate come comandi del sistema operativo sottostante e vengono rimpiazzate con il risultato dell’esecuzione del comando stesso. I comandi possono contenere dei commenti che iniziano nel momento in cui appare il simbolo ‘#’ e fanno in modo che venga ignorato tutto quello che appare di seguito fino alla fine della riga. Quando un comando prevede l’indicazione di un intervallo di valori, questo viene indicato utilizzando la notazione ‘[inizio :fine ]’, con le parentesi quadre che fanno parte della notazione stessa. Se per qualche motivo si deve indicare un intervallo predefinito in modo esplicito, si possono usare le parentesi aperte e chiuse senza alcuno contenuto: ‘[]’. Alcuni comandi help [voce] | ? [voce] Mostra la guida interna riferita alla voce richiesta, oppure all’introduzione di Gnuplot. Gnuplot 3770 exit | quit I comandi ‘exit’ o ‘quit’ concludono il funzionamento di Gnuplot. plot [intervalli] funzione [title ] stringa_titolo Il comando ‘plot’ serve per il disegno di punti su un piano (lo spazio a due dimensioni). Di solito si utilizza preferibilmente per il disegno di una funzione, come nella sintassi mostrata qui. Gli intervalli sono al massimo due: il primo si riferisce all’asse X e il secondo all’asse Y. Il titolo che può essere indicato in una stringa dopo la parola chiave ‘title’ serve a definire una didascalia per la curva che viene disegnata. plot [intervalli] stringa_file_dati [title ] stringa_titolo ‘plot’ può essere usato per visualizzare anche una serie di punti come indicato all’interno di un file di dati che viene descritto più avanti. È importante osservare comunque che un file di dati di Gnuplot non ha lo stesso formato degli script di questo. splot [intervalli] funzione [title ] stringa_titolo Il comando ‘splot’ serve per il disegno di punti su uno spazio (a tre dimensioni). Di solito si utilizza preferibilmente per il disegno di una funzione, come nella sintassi mostrata qui. Gli intervalli sono al massimo tre: il primo si riferisce all’asse X, il secondo all’asse Y e il terzo all’asse Z. Il titolo che può essere indicato in una stringa dopo la parola chiave ‘title’ serve a definire una didascalia per il piano che viene disegnato. splot [intervalli] stringa_file_dati [title ] stringa_titolo ‘splot’ può essere usato per visualizzare anche una serie di punti come indicato all’interno di un file di dati, esattamente come nel caso di ‘plot’, con la differenza che le coordinate in questione sono fatte di tre elementi. load stringa_file_script ‘load’ carica ed esegue il contenuto di uno script di Gnuplot. Al termine dell’esecuzione dello script riprende il funzionamento normale. save stringa_file_script ‘save’ salva l’impostazione e il disegno attuale in uno script di Gnuplot. Eventualmente si può modificare manualmente il file in questione utilizzando un file per la modifica dei file di testo. | print espressione stringa ‘print’ restituisce il risultato dell’espressione oppure la stringa fornita come argomento. In pratica permette di fare il calcolo di un valore o di mostrare una frase. [ if (condizione ) comando ; comando ]... ‘if’ esegue il comando (o i comandi se ne viene indicato più di uno) solo se la condizione posta tra parentesi risulta vera. pause n_secondi [stringa] ‘pause’ serve a fare una pausa della durata indicata dal primo argomento. Se si vuole che per proseguire debba essere premuto il tasto [ Invio ], occorre indicare il valore -1. La stringa è facoltativa e permette di mostrare un messaggio contenente la stringa stessa. ‘pause’ è particolarmente adatto negli script di Gnuplot. Esempi gnuplot> help plot Mostra la guida interna riferita al comando ‘plot’. gnuplot> plot sin(x) Gnuplot 3771 Disegna la funzione seno utilizzando una zona predefinita degli assi cartesiani. gnuplot> plot sin(x) title ’seno di x’ Come nell’esempio precedente, indicando la stringa ‘seno di x’ come didascalia riferita alla curva disegnata. gnuplot> plot [-3:3] sin(x) title ’seno di x’ Come nell’esempio precedente, limitando l’ampiezza dell’asse X da -3 a +3. gnuplot> plot [-pi:pi] sin(x) title ’seno di x’ Come nell’esempio precedente, limitando l’ampiezza dell’asse X da -P-greco a +P-greco. gnuplot> plot ’mio_file.gnuplot’ Disegna nello spazio a due dimensioni i punti annotati nel file ‘mio_file.gnuplot’ che si trova nella directory corrente. gnuplot> splot x**2 * sin(y) Disegna un piano nello spazio corrispondente alla funzione ottenuta dal quadrato di x moltiplicato per il seno di y. gnuplot> splot x**2 * sin(y) title ’quadrato di x per seno di y’ Come nell’esempio precedente, indicando la stringa ‘quadrato di x per seno di y’ come didascalia riferita al piano disegnato. gnuplot> splot [-3:3] [-5:5] x**2 * sin(y) title ’quadrato di x per seno di y’ Come nell’esempio precedente, limitando l’ampiezza dell’asse X da -3 a +3 e quella dell’asse Y da -5 a +5. gnuplot> plot [0:pi] [-pi:pi] x**2 * sin(y) title ’quadrato di x per seno di y’ Come nell’esempio precedente, limitando l’ampiezza dell’asse X da zero a +P-greco e quella dell’asse Y da -P-greco a +P-greco. gnuplot> splot ’mio_file.gnuplot’ Disegna nello spazio a tre dimensioni i punti annotati nel file ‘mio_file.gnuplot’ che si trova nella directory corrente. gnuplot> if (1==1) print ’ovvio: 1 è uguale a 1’ Dal momento che la condizione si avvera, mostra la frase «ovvio: 1 è uguale a 1». 331.3 Espressioni Le espressioni che si possono utilizzare con Gnuplot sono più o meno le stesse dei linguaggi di programmazione più comuni e, in generale, gli spazi orizzontali sono ignorati. Tra le altre cose questo giustifica il motivo per cui diversi tipi di argomenti dei comandi di Gnuplot devono essere definiti come stringhe delimitate. L’aritmetica di Gnuplot distingue tra numeri interi e numeri a virgola mobile, per cui, utilizzando numeri interi si hanno risultati interi, mentre utilizzando valori a virgola mobile si ottengono risultati a virgola mobile. In pratica: gnuplot> print 10/3[ Invio ] Gnuplot 3772 3 gnuplot> print 10/3.0[ Invio ] 3.33333333333333 gnuplot> print 10/2[ Invio ] 5 gnuplot> print 10/2.0[ Invio ] 5.0 Le costanti numeriche possono essere indicate nei modi consueti, con o senza segno, separando la parte intera da quella decimale attraverso un punto, oppure si può usare anche una notazione esponenziale. Per esempio: gnuplot> print 1e2[ Invio ] 100.0 gnuplot> print 1e-2[ Invio ] 0.01 Gli operatori che si possono utilizzare nelle espressioni di Gnuplot sono in pratica quelle del linguaggio C. La tabella 331.1 elenca e descrive gli operatori aritmetici e quelli di assegnamento. Tabella 331.1. Elenco degli operatori aritmetici e di quelli di assegnamento relativi a valori numerici. Operatore e operandi +op -op op1 + op2 op1 - op2 op1 * op2 op1 / op2 op1 % op2 var = valore op1 ** op2 Descrizione Non ha alcun effetto. Inverte il segno dell’operando. Somma i due operandi. Sottrae dal primo il secondo operando. Moltiplica i due operandi. Divide il primo operando per il secondo. Modulo: il resto della divisione tra il primo e il secondo operando. Assegna alla variabile il valore alla destra. Eleva il primo operando alla potenza del secondo. Molti degli operatori matematici hanno senso solo perché Gnuplot consente di definire delle variabili al volo, semplicemente assegnandoci un valore. Per esempio, gnuplot> a = 2*pi[ Invio ] assegna alla variabile ‘a’ il doppio del P-greco. Per visualizzarne il contenuto basta utilizzare il comando ‘print’: gnuplot> print a[ Invio ] 6.28318530717959 Gli operatori di confronto determinano la relazione tra due operandi. Il risultato dell’espressione composta da due operandi posti a confronto è di tipo booleano, rappresentabile all’interno di Gnuplot come !0, o non-zero (Vero), e zero (Falso), esattamente come accade nel linguaggio C. È importante sottolineare che qualunque valore diverso da zero equivale a Vero in un contesto logico. Gli operatori di confronto sono elencati nella tabella 331.2. Gnuplot 3773 Tabella 331.2. Elenco degli operatori di confronto. Le metavariabili indicate rappresentano gli operandi e la loro posizione. Operatore e operandi op1 == op2 op1 != op2 op1 < op2 op1 > op2 op1 <= op2 op1 >= op2 Descrizione Vero se gli operandi si equivalgono. Vero se gli operandi sono differenti. Vero se il primo operando è minore del secondo. Vero se il primo operando è maggiore del secondo. Vero se il primo operando è minore o uguale al secondo. Vero se il primo operando è maggiore o uguale al secondo. Quando si vogliono combinare assieme diverse espressioni logiche, comprendendo in queste anche delle variabili che contengono un valore booleano, si utilizzano gli operatori logici (noti normalmente come: AND, OR, NOT, ecc.). Il risultato di un’espressione logica complessa è quello dell’ultima espressione elementare a essere valutata. Gli operatori logici sono elencati nella tabella 331.3. Tabella 331.3. Elenco degli operatori logici. Le metavariabili indicate rappresentano gli operandi e la loro posizione. Operatore e operandi ! op op1 && op2 op1 || op2 Descrizione Inverte il risultato logico dell’operando. Se il risultato del primo operando è Falso non valuta il secondo. Se il risultato del primo operando è Vero non valuta il secondo. Gnuplot riconosce una serie di funzioni in parte elencate nella tabella 331.4, oltre alla costante ‘pi’ (solo al minuscolo) che rappresenta il P-greco. Tabella 331.4. Alcune funzioni riconosciute da Gnuplot. Operatori e operandi rand(op) int(op) abs(op) sqrt(op) log10(op) log(op) exp(op) sin(op) cos(op) tan(op) asin(op) acos(op) atan(op) sinh(op) cosh(op) tanh(op) Descrizione Numero casuale. Parte intera. Valore assoluto. Radice quadrata. Logaritmo in base 10. Logaritmo naturale. e^x. Seno. Coseno. Tangente. Arco-seno. Arco-coseno. Arco-tangente. Seno iperbolico. Coseno iperbolico. Tangente iperbolica. Infine, Gnuplot, oltre alla possibilità di creare e assegnare dei valori a delle variabili, può definire delle funzioni. Per esempio, gnuplot> funzione(x,y) = x**2 * y[ Invio ] definisce la funzione denominata ‘funzione’ che ha due variabile, ‘x’ e ‘y’, che si traduce nell’espressione ‘x**2 * y’. In seguito, si può utilizzare la funzione appena creata per farci dei calcoli, Gnuplot 3774 gnuplot> print funzione(2,3)[ Invio ] 12 oppure per disegnarne il grafico: gnuplot> splot funzione(x,y)[ Invio ] Naturalmente la stessa cosa vale per le funzioni con una sola variabile. 331.4 Script e file di dati I file che possono essere indicati alla fine degli argomenti della riga di comando dell’eseguibile ‘gnuplot’ e quelli che possono essere caricati attraverso il comando ‘load’, sono degli script di Gnuplot. La sintassi di questi file è molto semplice: si tratta solo di un elenco di comandi di Gnuplot. In particolare, se esiste il file ‘~/.gnuplot’, questo viene trattato come uno script da eseguire all’avvio di Gnuplot. A titolo di esempio viene mostrato uno script del genere il cui scopo è quello di mostrare una serie di funzioni come in una sequenza di diapositive. # # Sequenza di funzioni con Gnuplot. # plot [-1:1] 2*x title ’f(x) = 2x’ pause -1 ’premere <Invio> per continuare’ plot [-2:2] x**2 title ’f(x) = x^2’ pause -1 ’premere <Invio> per continuare’ plot [-2:100] log(x) title ’log(x)’ pause -1 ’premere <Invio> per continuare’ plot [-pi:pi] sin(x) title ’seno’ pause -1 ’premere <Invio> per continuare’ plot [-pi:pi] tan(x) title ’tangente’ pause -1 ’premere <Invio> per continuare’ splot [-5:5] [-5:5] 2*x+y title ’f(x,y) = 2x+y’ pause -1 ’premere <Invio> per continuare’ splot [-5:5] [-5:5] x**2*y title ’f(x,y) = x^2 * y’ pause -1 ’premere <Invio> per continuare’ splot [-pi/4:pi/4] [-pi/2:pi/2] sin(x)*cos(y) title ’f(x,y) = sin(x)*cos(y)’ pause -1 ’fine della rappresentazione’ # Fine Gnuplot è in grado di gestire anche i file di dati, ovvero dei file contenenti solo delle coordinate corrispondenti a punti da rappresentare. Si tratta sempre di file di testo, in cui vengono ignorati i commenti preceduti dal simbolo ‘#’ oltre alle righe bianche e a quelle vuote, mentre le altre righe contengono coordinate nella forma: x y [z] Per esempio, la riga 1 2 rappresenta il punto di coordinata X=1 e Y=2, mentre la riga Gnuplot 3775 1 2 3 rappresenta il punto di coordinata X=1, Y=2 e Z=3. Eccezionalmente, i comandi ‘plot’ e ‘splot’ possono essere utilizzati direttamente per visualizzare una serie di punti senza doverli caricare da un file esterno. Per ottenere questo si utilizzano nel modo seguente: | plot splot ’-’ coordinata ... e Per esempio, plot ’-’ 0 0 1 1 2 2 3 3 4 4 e mostra cinque punti appartenenti alla retta f(x)=x. In questo stesso modo si possono rappresentare più gruppi di punti, aumentando conseguentemente i trattini che fungono da argomento di ‘plot’ o di ‘splot’. Per esempio, plot ’-’, ’-’ 0 0 1 1 2 2 3 3 4 4 e 0 1 1 2 2 3 3 4 4 5 e mostra cinque punti appartenenti alla retta f(x)=x e altri cinque punti (colorati in modo diverso) appartenenti alla retta f(x)=x+1. 331.5 Controllare l’uscita grafica I disegni realizzati con Gnuplot sono diretti normalmente in una finestra di X. Gnuplot controlla il formato delle immagini che crea attraverso il comando ‘set terminal’.2 set terminal tipo_di_uscita_grafica [altri_argomenti] Per esempio, nel caso specifico della rappresentazione normale in una finestra di X, la sintassi diventa: set terminal x11 [reset] [n_finestra ] Per la precisione, si possono visualizzare più finestre contemporaneamente, numerate a partire da zero. Utilizzando però la parola chiave ‘reset’, si eliminano tutte le finestre. 2 I vari formati grafici in cui possono essere resi i disegni di Gnuplot dipendono dal modo in cui questo è stato compilato. In pratica, la disponibilità o meno di un certo formato dipende da delle librerie incluse o meno in fase di compilazione. Gnuplot 3776 Alternativamente si può fare in modo di generare un’immagine che non viene visualizzata, ma salvata in un file. La sintassi seguente riguarda la possibilità di generare immagini in formato PNG. set terminal png [small|medium|large] [monochrome|gray|color] Nello schema sintattico, le parole chiave ‘small’, ‘medium’ e ‘large’, si riferiscono alla dimensione dei caratteri utilizzati nelle scale e nelle didascalie. Le parole chiave ‘monochrome’, ‘gray’ e ‘color’, si riferiscono alla colorazione o meno che devono avere le immagini. Il comando appena descritto non permette di stabilire la destinazione del file generato, pertanto questa è semplicemente lo standard output. Questo fatto rende praticamente impossibile la gestione di immagini PNG attraverso l’uso di Gnuplot in modo interattivo. In pratica, si deve realizzare uno script, in modo da poter avviare Gnuplot ridirigendo lo standard output verso il file desiderato. Quello che segue è un esempio banale di un tale script. # parabola.gnuplot set terminal png medium color plot x**2 Per generare il file ‘parabola.png’, basta il comando seguente: $ gnuplot parabola.gnuplot > parabola.png Eventualmente si può generare anche un’immagine GIF. [ ][ ] [small|medium|large] [colore_disegno ...] ] set terminal gif transparent interlace ,→ size pixel_o ,pixel_v colore_sfondo colore_assi [ ][ ←- La schema sintattico è più complesso e di conseguenza offre maggiori possibilità. Le dimensioni dei caratteri usati per le scale, i titoli e le didascalie, sono controllate dalle stesse parole chiave viste per il formato PNG. La parola chiave ‘transparent’ controlla la realizzazione di un disegno con un fondale trasparente; ‘interlace’ fa in modo di generare un file GIF interlacciato. La dimensione dell’immagine può essere definita attraverso l’opzione ‘size’, seguita dalla quantità di punti grafici (pixel) orizzontali e verticali (come si vede dallo schema). In particolare possono essere controllati i colori, indicati attraverso degli argomenti che vengono posti nella parte finale del comando. Il primo di questi colori si riferisce al fondale, il secondo è quello degli assi X, Y ed eventualmente Z. I colori successivi si riferiscono agli elementi visualizzati (le curve o i piani nello spazio). Gli argomenti che esprimono i colori hanno il formato seguente: xrossoverdeblu I tre colori fondamentali sono espressi da coppie di cifre esadecimali. Per esempio: ‘xffffff’ è il bianco, ‘x000000’ è il nero, ‘xff0000’ è il rosso, ‘x00ff00’ è il verde e ‘x0000ff’ è il blu. set terminal gif xffffff x0000ff x00ff00 splot (x**2)*y L’esempio mostra uno script con il quale si vuole generare un file GIF (di dimensioni normali) contenente il grafico della funzione f(z)=(x2)*y, utilizzando dei colori particolari: bianco per lo sfondo, blu per gli assi e verde per il reticolo che rappresenta il piano nello spazio. Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org Capitolo 332 Octave Octave 1 è un linguaggio di programmazione ad alto livello per il calcolo matematico, usato fondamentalmente in modo interattivo. Viene usato attraverso un terminale a caratteri, come una console virtuale di GNU/Linux, ma per ottenere dei grafici si avvale di Gnuplot che così è opportuno sia installato assieme a Octave. L’interazione tra Gnuplot e Octave è trasparente, se il secondo viene utilizzato in una finestra di terminale all’interno del sistema grafico X. In queste sezioni si mostra solo qualche piccolo assaggio di Octave che dispone di ampia documentazione per conto proprio: octave.info. Anche Octave utilizza la libreria Readline per il controllo della riga di comando, con tutti i vantaggi che ciò comporta per l’utilizzatore. 332.1 Avvio e interazione normale Octave viene avviato attraverso l’eseguibile ‘octave’. Bisogna ricordare che se si vogliono disegnare dei grafici deve essere avviato da una finestra di terminale all’interno di X, diversamente basta una console virtuale di GNU/Linux. ‘octave’ riconosce una serie di opzioni che qui non vengono descritte (eventualmente basta utilizzare il comando ‘octave --help’ per ottenerne la descrizione) e può eseguire il contenuto di un file se viene indicato come ultimo argomento della riga di comando. octave [opzioni] [file_di_comandi ] Il file di comandi è uno script contenente semplicemente comandi di Octave, dove in particolare il simbolo ‘#’ serve a indicare l’inizio di un commento che si conclude alla fine della riga e le righe vuote o bianche vengono semplicemente ignorate. Eventualmente, uno script di Octave può essere reso eseguibile, purché all’inizio del file venga aggiunta la solita indicazione dell’interprete da utilizzare: #!/usr/bin/octave Se Octave viene avviato in modo normale (senza argomenti particolari e senza l’indicazione di uno script da eseguire), si ottiene il funzionamento interattivo normale: $ octave[ Invio ] Octave, version 2.0.13 (i386-redhat-linux-gnu). Copyright (C) 1996, 1997, 1998 John W. Eaton. This is free software with ABSOLUTELY NO WARRANTY. For details, type ‘warranty’. octave:1> _ L’invito di Octave (il prompt) è un po’ particolare: mano a mano che si introducono dei comandi si incrementa il numero che appare. Di seguito sono elencati alcuni comandi elementari di Octave; in altre sezioni ne vengono mostrati degli altri. Alcuni comandi help [-i] [argomento] Il comando ‘help’ permette di ottenere alcune indicazioni sul funzionamento di Octave. In particolare, se non si utilizza l’opzione ‘-i’ si ottiene una guida stringata, mentre con ‘-i’ 1 Octave GNU GPL 3777 Octave 3778 viene attivata la consultazione del documento octave.info riferito al contesto definito dalla parola chiave che indica l’argomento. exit | quit Conclude il funzionamento di Octave. pause [(n_secondi )] Il comando ‘pause’ serve a fare una pausa della durata indicata dall’argomento (che deve essere racchiuso tra parentesi tonde). Se non viene indicato l’argomento, la pausa può essere interrotta solo attraverso la pressione del tasto [ Invio ]. Questo comando è utile negli script di Octave. Esempi octave:x> help help[ Invio ] Mostra la guida per utilizzare il comando ‘help’. octave:x> help -i help[ Invio ] Mostra la descrizione del comando ‘help’ consultando il documento octave.info. 332.2 Variabili di Octave e calcoli elementari Octave gestisce variabili scalari di tipo numerico e di tipo stringa (delimitate da apici singoli o doppi), come avviene comunemente nei linguaggi evoluti più comuni; inoltre permette la definizione di strutture, in particolare i vettori e le matrici (nel senso matematico dei termini), in modo trasparente. La dichiarazione di una variabile si ottiene semplicemente assegnandoci un valore. Per esempio, octave:1> a = 123[ Invio ] crea, o sovrascrive la variabile ‘a’ assegnandole il valore 123. Assegnando un valore a una variabile si ottiene anche l’eco del risultato e ciò può essere utile se l’assegnamento avviene in corrispondenza di un’espressione di qualche tipo. octave:2> b = a / 2[ Invio ] In questo caso, viene assegnato alla variabile ‘b’ il valore pari alla metà di ‘a’ e si ottiene opportunamente l’informazione b = 61.500 che così precisa quale valore è stato assegnato a ‘b’. Le espressioni possono essere calcolate anche senza bisogno di assegnarne il risultato a qualche variabile; per esempio: octave:3> a / b[ Invio ] ans 2 In questo caso, ‘ans’ sta per answer (risposta). Con la stessa logica per la quale un’espressione che non viene assegnata a una variabile genera un risultato che viene visualizzato comunque, per conoscere il contenuto di una variabile basta indicarla sulla riga di comando: octave:4> a[ Invio ] a = 123 Octave 3779 octave:5> b[ Invio ] b = 61.500 332.3 Vettori e matrici Al posto degli array dei linguaggi di programmazione normali, Octave tratta direttamente con vettori e matrici (per la precisione: matrici a una e a due dimensioni). Una costante letterale che rappresenta un vettore ha la forma seguente: [ elemento_1 , elemento_2 , ... elemento_n ] In particolare, le parentesi quadre fanno parte della dichiarazione e delimitano in pratica gli elementi del vettore. Una costante letterale che rappresenta una matrice a due dimensioni ha una forma simile a quella del vettore, con la differenza che gli elementi di una riga rispetto a quelli di un’altra sono separati da un punto e virgola: [ r1c1, r1c2, ...; r2c1, r2c2, ...; rnc1 , rnc2 , ... ] Si osservino gli esempi seguenti. octave:1> a = [ 1, 2, 3 ][ Invio ] a = 1 2 3 octave:2> b = [ 4, 5, 6 ][ Invio ] b = 4 5 6 octave:3> c = [ 1, 2, 3; 4, 5, 6 ][ Invio ] c = 1 4 2 5 3 6 Eventualmente si possono anche fare delle combinazioni: octave:4> d = [ a, b ][ Invio ] d = 1 2 3 4 5 6 octave:5> e = [ a; b ][ Invio ] e = 1 4 2 5 3 6 Con i vettori e le matrici si possono fare anche dei calcoli nei modi in cui si è abituati in matematica. In particolare, la notazione ‘x ’’ restituisce la matrice trasposta di x . octave:6> c’[ Invio ] ans = 1 4 Octave 3780 2 3 5 6 L’esempio seguente mostra il prodotto tra due matrici; precisamente il prodotto tra la matrice ‘c’ e la sua trasposta. octave:7> c * c’[ Invio ] ans = 14 32 32 77 È possibile anche moltiplicare una costante scalare per tutti gli elementi di una matrice: octave:8> 2 * c[ Invio ] ans = 2 8 4 10 6 12 Pur senza approfondire il funzionamento di Octave, è il caso di mostrare l’uso della funzione interna ‘rand()’, il cui scopo è quello di restituire una matrice (a due dimensioni) contenente valori casuali: octave:9> f = rand( 2, 3)[ Invio ] In questo caso, crea la matrice ‘f’ contenente due righe e tre colonne, con valori casuali compresi tra zero e uno. 332.4 Disegno Si è già accennato al fatto che Octave dipende da Gnuplot per le rappresentazioni grafiche. Ciò avviene in modo trasparente, purché si utilizzi Octave da una finestra di terminale all’interno del sistema grafico X. L’approccio alla grafica di Octave è più complesso di Gnuplot, perché il suo scopo è differente. In generale tutto viene visto in forma di vettori e matrici. Di solito, la prima cosa da fare è prendere confidenza con la funzione ‘linspace()’ il cui scopo è quello di generare un vettore con una serie di valori equidistanti (lineari): linspace ( inizio , fine , quantità ) Il primo argomento della funzione definisce il valore del primo elemento del vettore; il secondo definisce quello dell’ultimo; il terzo argomento definisce la quantità di elementi complessivi e la funzione determina i valori rimanenti in modo lineare. Per esempio, il comando seguente serve a creare un vettore di 11 elementi con valori progressivi da 0 a 10: octave:1> x = linspace( 0, 10, 11)[ Invio ] x = 0 1 2 3 4 5 6 7 8 9 10 Un’altra cosa da osservare è il fatto che le funzioni matematiche che possono funzionare utilizzando un argomento numerico, possono essere applicate anche a vettori e matrici. Si osservi l’esempio seguente in cui si genera il vettore ‘y’ calcolando il seno di ogni valore del vettore ‘x’. octave:2> y = sin(x)[ Invio ] Octave 3781 y = Columns 1 through 8: 0.00000 0.84147 0.90930 Columns 9 through 11: 0.98936 0.41212 0.14112 -0.75680 -0.95892 -0.27942 0.65699 -0.54402 Per disegnare il seno calcolato in questo modo, si utilizza la funzione interna ‘plot()’ che ha bisogno di almeno due argomenti: il vettore dei valori per l’asse X e il vettore corrispondente dei valori da rappresentare nell’asse Y. Si intuisce che il numero di elementi di questi due vettori deve essere uguale. plot ( vettore_x , vettore_y ) Tornando all’esempio, il comando si limita a questo: octave:3> plot (x, y)[ Invio ] Se il secondo argomento della funzione ‘plot()’ è una matrice, si ottiene la visualizzazione di tante curve quante sono le colonne o le righe della matrice (la scelta viene fatta in base alla corrispondenza con gli elementi del vettore utilizzato come primo argomento). octave:4> y = [ sin(x); 2 * sin(x)][ Invio ] Il comando appena mostrato genera la matrice ‘y’ con due righe corrispondenti a due vettori: il seno dei valori del vettore ‘x’ e due volte il seno dei valori del vettore ‘x’. octave:5> plot (x, y)[ Invio ] Disegnando il grafico della matrice ‘y’ si ottengono due curve corrispondenti ai valori delle due righe della stessa. 332.5 Script di Octave Si è accennato alla possibilità di realizzare degli script con le istruzioni di Octave. In questo caso non c’è nulla di speciale rispetto a quanto è stato visto fino a questo punto. A titolo di esempio viene mostrato uno script con il quale si arriva a disegnare il grafico del seno di x nell’intervallo di valori da -P-greco a +P-greco. #!/usr/bin/octave x = linspace( -pi, +pi, 200) y = sin(x) plot (x,y) pause Lo script può essere reso eseguibile e avviato autonomamente (purché l’eseguibile ‘octave’ si trovi effettivamente nella directory ‘/usr/bin/’). 332.6 File di dati Diversa è invece la possibilità di salvare le variabili. Per questo si utilizzano i comandi ‘save’ e ‘load’: [opzioni] load [opzioni] save file variabile ... file variabile ... Octave 3782 Attraverso le opzioni si specifica normalmente il formato in cui deve essere realizzato il file delle variabili che vengono salvate; se non viene specificato dovrebbe trattarsi di quello più semplice: un file di testo puro e semplice. Le variabili da salvare o da ricaricare vanno annotate dopo il nome del file. Per facilitare la cosa possono essere usati dei caratteri jolly, con significato equivalente a quello delle shell normali. Alcune opzioni -ascii Salva o carica utilizzando il formato ASCII di Octave. -binary Salva o carica utilizzando il formato binario di Octave. -mat-binary Salva o carica utilizzando il formato binario di Matlab. -force Quando vengono caricate le variabili, forza la sovrascrittura di quelle esistenti. Esempi octave:x> save prova a b c[ Invio ] Salva le variabili ‘a’, ‘b’ e ‘c’, nel file ‘prova’ (nella directory corrente) utilizzando il formato predefinito. octave:x> save -ascii prova a b c[ Invio ] Come nell’esempio precedente, specificando esplicitamente che si vuole usare il formato ASCII di Octave. octave:x> save -ascii prova a*[ Invio ] Salva tutte le variabili che iniziano per ‘a’ nel file ‘prova’ utilizzando il formato ASCII di Octave. octave:x> load -ascii -force prova[ Invio ] Carica tutte le variabili dal file ‘prova’, che dovrebbe essere in formato ASCII di Octave, sovrascrivendo le variabili eventualmente già esistenti. Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org Capitolo 333 Applicazioni matematiche varie In questo capitolo si raccolgono informazioni su altri programmi matematici e di disegno che non hanno trovato una collocazione migliore in altri capitoli. 333.1 Geg -- GTK+ Equation Grapher Geg 1 è un programma applicativo per il disegno di funzioni matematiche a due dimensioni, del tipo f(x)=y, che utilizza per questo l’interfaccia grafica X. È molto semplice e non offre sostegni particolari dal punto di vista matematico, ma è facile e intuitivo da usare. La figura 333.1 mostra come si presenta la finestra di Geg, in cui appare la visualizzazione delle funzioni sin(x), sin(2x) e sin(2x)+sin(x). Figura 333.1. Geg. Nella parte superiore della finestra di Geg è disponibile il menù a tendina, assieme ad alcuni pulsanti grafici per la selezione rapida delle funzionalità di uso comune. Sotto, nella parte destra, appare il riquadro ‘f(x)’, ovvero il piano cartesiano su cui vengono disegnate le funzioni. Alla sinistra appare il riquadro ‘Range’, dove possono essere indicati in modo preciso i valori degli intervalli di visualizzazione dell’asse X e dell’asse Y; in pratica, basta modificare questi valori e premere [ Invio ] per modificare la scala e la zona visualizzata a destra. A sinistra in basso appare il riquadro ‘Log’ che elenca le operazioni compiute: nella parte superiore appare l’ultimo comando eseguito e in quella inferiore il comando più vecchio. Più in basso, sempre a sinistra, appare il riquadro ‘Status’ che mostra le coordinate cartesiane in cui si trova il puntatore del mouse, ammesso che questo sia posizionato sull’area del grafico. Infine, nella parte bassa della finestra appare la riga di comando all’interno della quale si possono inserire le funzioni da visualizzare. 1 Geg GNU GPL 3783 Applicazioni matematiche varie 3784 333.1.1 Avvio e interazione normale Geg viene avviato attraverso l’eseguibile ‘geg’ per il quale non sono previste opzioni speciali, a parte quelle comuni per l’uso di programmi nel sistema grafico X (‘-geometry’, ‘-display’, ecc.). geg [opzioni] Per disegnare una funzione occorre selezionare il riquadro inferiore, con un clic del mouse, in modo da fare apparire il cursore per la scrittura; quindi si scrive la funzione (utilizzando solo la variabile x ) e la si disegna premendo [ Invio ] oppure selezionando il pulsante grafico GO! . Le operazioni necessarie a ottenere il risultato mostrato nella figura 333.1 sono in pratica quelle seguenti: f(x) = sin(x)[ Invio ] f(x) = sin(2x)[ Invio ] f(x) = sin(2x)+sin(x)[ Invio ] ottenendo nel riquadro del riepilogo dei comandi impartiti la sequenza seguente: sin(2x)+sin(x) sin(2x) sin(x) Per modificare la scala e la zona di grafico visualizzata si può intervenire con i pulsanti I N e O U T ; oppure attraverso il mouse, utilizzando il primo tasto per delimitare (trascinando) la zona di grafico su cui si vuole porre l’attenzione; oppure in modo ancora più preciso attraverso il riquadro ‘Range’. Nella figura 333.2 viene mostrato l’esempio già visto con la scala dell’asse Y espansa. Figura 333.2. Modifica della scala di visualizzazione. In particolare, i valori sull’asse X possono essere mostrati anche in radianti, ovvero in unità Pgreco. Per questo basta selezionare il pulsante grafico R A D I A N , mentre per tornare alla scala decimale basta selezionare il pulsante D E C I M A L . Con il terzo tasto del mouse (quello destro) è possibile indicare una zona del grafico all’interno della quale si vuole conoscere l’intersezione della curva con uno degli assi. Per esempio, indi- Applicazioni matematiche varie 3785 cando una zona vicina al punto -2 nell’asse X, si ottiene il risultato seguente nel riquadro del riepilogo che mostra due intersezioni riferite ad altrettante funzioni: Axis Intercepts:sin(2x)+sin(x), X=-2,0944 sin(2x), X=-1,5708 Con il secondo tasto del mouse (quello centrale) è possibile indicare una zona del grafico all’interno della quale si vuole conoscere l’intersezione tra le curve. Per esempio, indicando una zona vicina al punto +1 nell’asse X e prima del punto +2 nell’asse Y, si ottiene il risultato seguente nel riquadro del riepilogo, che mostra due intersezioni distinte: Function Intercepts:sin(x) and sin(2x)+sin(x) at: X=1,5708, Y=1,0000 sin(x) and sin(2x) at: X=1,0472, Y=0,8660 In pratica, le funzioni sin(x) e sin(2x)+sin(x) si incontrano nel punto X=1,5708, Y=1,0000, inoltre le funzioni sin(x) e sin(2x) si incontrano nel punto X=1,0472, Y=0,8660. 333.1.2 Sintassi delle funzioni Le funzioni che possono essere disegnate da Geg devono rispettare una certa sintassi riepilogata nella guida interna di questo applicativo. In generale si possono usare tutti i tipi di parentesi che si impiegano normalmente in matematica (da quelle tonde a quelle graffe); si possono usare le notazioni del tipo 3x , 4x ,... dove si sottintende la moltiplicazione della costante numerica per la variabile; la lettera ‘x’ è l’unica variabile di cui si può fare uso; sono riconosciute le costanti ‘e’ (intesa come la base del logaritmo naturale) e ‘PI’ (intesa come P-greco). La tabella 333.1 riepiloga gli operatori e le funzioni utilizzabili. Tabella 333.1. Operatori e funzioni di Geg. Operatori e operandi op1 + op2 op1 - op2 op1 * op2 costanteop op1 / op2 op1 ^ op2 sqrt(op) cbrt(op) abs(op) u(op) log(op) ln(op) sin(op) cos(op) tan(op) asin(op) acos(op) atan(op) sinc(op) sinh(op) cosh(op) tanh(op) Descrizione Somma i due operandi. Sottrae dal primo il secondo operando. Moltiplica i due operandi. Moltiplica l’operando per il valore della costante. Divide il primo operando per il secondo. Elevamento a potenza del primo operando per il secondo. Radice quadrata. Radice cubica. Valore assoluto. Restituisce uno se l’operando è positivo, zero se negativo. Logaritmo in base 10. Logaritmo naturale. Seno. Coseno. Tangente. Arco-seno. Arco-coseno. Arco-tangente. Seno iperbolico. Coseno iperbolico. Tangente iperbolica. Applicazioni matematiche varie 3786 333.2 QCad QCad 2 è un programma applicativo per il CAD professionale in grado di generare e di leggere il formato DFX. L’utilizzo di un programma del genere richiede delle conoscenze particolari. Lo scopo della sezione è soltanto quello di mostrare la disponibilità di questo applicativo. Figura 333.3. QCad dopo aver caricato uno degli esempi che lo accompagna. Nella figura 333.3 si vede in particolare, nella parte sinistra della finestra di QCad, un menù a pulsanti grafici. Quello che appare nella figura è il menù principale, dal quale si può selezionare un menù particolare attraverso un clic con il tasto sinistro del mouse. Per ritornare indietro a un livello di menù precedente, si preme invece il tasto destro del mouse sopra un pulsante grafico qualunque. Non è il caso di aggiungere altro su questo applicativo, che comunque dispone di una sua documentazione. Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org 2 QCad GNU GPL Indice analitico del volume CAD, 3786 Geg, 3783 Gnuplot, 3768 Octave, 3777 QCad, 3786 SC, 3750 Spreadsheet Calculator, 3750 3787 3788 Appunti di informatica libera 2003.01.01 Volume VIII Argomenti avanzati e accessori 3789 Appunti Linux Copyright © 1997-2000 Daniele Giacomini Appunti di informatica libera Copyright © 2000-2003 Daniele Giacomini Via Morganella Est, 21 -- I-31050 Ponzano Veneto (TV) -- daniele @ swlibero.org Le informazioni contenute in questa opera possono essere diffuse e riutilizzate in base alle condizioni poste dalla licenza GNU General Public License, come pubblicato dalla Free Software Foundation. In caso di modifica dell’opera e/o di riutilizzo parziale della stessa, secondo i termini della licenza, le annotazioni riferite a queste modifiche e i riferimenti all’origine di questa opera, devono risultare evidenti e apportate secondo modalità appropriate alle caratteristiche dell’opera stessa. In nessun caso è consentita la modifica di quanto, in modo evidente, esprime il pensiero, l’opinione o i sentimenti del suo autore. L’opera è priva di garanzie di qualunque tipo, come spiegato nella stessa licenza GNU General Public License. Queste condizioni e questo copyright si applicano all’opera nel suo complesso, salvo ove indicato espressamente in modo diverso. The informations contained inside this work can be spread and reused under the terms of the GNU General Public License as published by the Free Software Foundation. If you modify this work and/or reuse it partially, under the terms of the license, the notices about these changes and the references about the original work, must be evidenced conforming to the work characteristics. IN NO EVENT IS ALLOWED TO MODIFY WHAT ARE CLEARLY THE THOUGHTS, THE OPINIONS AND/OR THE FEELINGS OF THE AUTHOR. This work is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. These conditions and this copyright apply to the whole work, except where clearly stated in a different way. Una copia della licenza GNU General Public License, versione 2, si trova nell’appendice A. A copy of GNU General Public License, version 2, is available in appendix A. 3790 The main distribution for Appunti di informatica libera is described below. For every distribution channel the maintainer’s name and address is also reported. Internet • direct reading: <http://a2.swlibero.org/> download: <ftp://a2.swlibero.org/a2/> and <http://a2.swlibero.org/ftp/> Michele Dalla Silvestra, mds @ swlibero.org • direct reading: <http://appuntilinux.torino.linux.it/> download: <ftp://ftp.torino.linux.it/appunti-linux/> Carlo Perassi, carlo @ linux.it • direct reading: <http://sansone.crema.unimi.it/linux/a2/HTML/> download: <http://sansone.crema.unimi.it/linux/a2/> Fabrizio Zeno Cornelli, zeno @ filibusta.crema.unimi.it • direct reading: <http://www.pctime.it/servizi/appunti-linux/> download: <http://www.pctime.it/servizi/appunti-linux/a2-prelievo/> Franco Lazzero, PCTIME, pctime @ pctime.net • direct reading: <http://www.a2.prosa.it/> download: <ftp://ftp.a2.prosa.it/> Davide Barbieri, paci @ prosa.it • direct reading: <http://linux.pueste.it/> download: <http://linux.pueste.it/filearea/AppuntiLinux/> David Pisa, david @ iglu.cc.uniud.it • direct reading: <http://www.informasiti.com/Appunti/HTML/> download: <http://www.informasiti.com/Appunti/> Claudio Neri, Sincro Consulting, neri.c @ sincroconsulting.com GNU distributions • GNU/Linux Debian <http://packages.debian.org/appunti-informatica-libera> Massimo Dal Zotto, dz @ cs.unitn.it Italian magazine’s CD-ROM • inter-punto-net <http://www.interpuntonet.it> Michele Dalla Silvestra, mds @ swlibero.org • Internet News <http://inews.tecnet.it> Francesco Facconi, francescofacconi @ libero.it Fabio Ferrazzo, fabio.fr @ tiscalinet.it • Linux Magazine <http://www.edmaster.it/prodotti/linux/ult-riv.html> Emmanuele Somma, esomma @ ieee.org La diffusione di questa opera è incoraggiata in base ai termini della licenza. The spread of this work is encouraged under the terms of the license. 3791 Parte lxix Multimedialità . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3795 334 Introduzione alla gestione dell’audio e uso del lettore CD . . . . . . . . . . . . . . . . . . . . . . . 3797 335 Lettore CD audio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3801 336 Gestione della scheda audio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3813 337 Audio compresso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3823 338 Audio attraverso la rete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3837 339 Filmato digitale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3844 340 Masterizzazione di CD audio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3846 341 X-CD-Roast . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3858 Parte lxx Transizione verso il software libero . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3867 342 File con formati speciali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3868 343 DOSEMU: l’emulatore di hardware DOS compatibile . . . . . . . . . . . . . . . . . . . . . . . . . . 3876 344 Servente X su altre piattaforme grafiche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3884 345 Applicazioni proprietarie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3887 Parte lxxi Prevenzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3903 346 Copie di sicurezza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3904 347 Emergenza con GNU/Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3915 348 nanoLinux II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3923 349 Dischetti di emergenza delle distribuzioni GNU/Linux e di altre fonti . . . . . . . . . . . . 3938 Parte lxxii Laboratorio didattico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3943 350 Accorgimenti per usare GNU/Linux nella didattica di massa . . . . . . . . . . . . . . . . . . . . . 3944 351 Diskless: elaboratori senza disco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3951 Parte lxxiii Informatica gestionale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3963 352 Codici a barre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3964 353 Barcode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3979 354 Trasformazione in lettere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3982 Parte lxxiv Annotazioni sulla distribuzione Debian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3989 355 Configurazione di una distribuzione Debian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3990 356 Accorgimenti per una distribuzione Debian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4001 Parte lxxv Annotazioni sulla distribuzione Red Hat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4013 357 Configurazione di una distribuzione Red Hat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4014 358 Accorgimenti per una distribuzione Red Hat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4029 Parte lxxvi i86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4043 3792 359 Minix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4044 360 ELKS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4064 Parte lxxvii Dos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4067 361 Dos: introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4070 362 Dos: dischi, file system, directory e file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4084 363 Dos: configurazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4092 364 Dos: script dell’interprete dei comandi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4099 365 Dos: gestione della memoria centrale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4105 366 FreeDOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4107 367 Progetto GNUish . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4110 368 The valuable DOS Freeware page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4112 369 Clean the Clipper 5.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4118 370 nanoBase 1997 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4143 371 nanoBase 1997 user manual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4149 Parte lxxviii Sistemi operativi speciali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4279 372 LeeOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4280 Parte lxxix Braille . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4283 373 Introduzione al sistema braille . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4284 374 Sistemi di interazione per non vedenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4289 Parte lxxx Aspetti umani . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4293 375 Manifesto GNU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4294 376 Il progetto GNU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4302 377 Proprietà del software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4317 378 L’ipotesi del futuro, nel bene e nel male . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4321 Indice analitico del volume . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4323 3793 3794 Parte lxix Multimedialità 334 Introduzione alla gestione dell’audio e uso del lettore CD . . . . . . . . . . . . . . . . . . . . . . . 3797 334.1 Kernel per le funzionalità audio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3797 334.2 Riferimenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3800 335 Lettore CD audio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3801 335.1 Ascolto di un CD audio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3801 335.2 CDDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3806 335.3 Tracce CDDA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3807 336 Gestione della scheda audio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3813 336.1 Aumix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3813 336.2 Esecuzione e registrazione di brani campionati . . . . . . . . . . . . . . . . . . . . . . . . . . . 3816 336.3 Wavtools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3818 336.4 Xwave . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3818 336.5 Sox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3819 337 Audio compresso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3823 337.1 Informazioni contenute in un file MP3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3823 337.2 LAME . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3827 337.3 MP3blaster . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3830 337.4 Xmms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3832 337.5 FreeAmp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3834 337.6 Riferimenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3835 338 Audio attraverso la rete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3837 338.1 NetStreamer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3837 338.2 Icecast . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3841 339 Filmato digitale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3844 339.1 GTV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3844 339.2 PlayMPEG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3844 339.3 Riferimenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3845 340 Masterizzazione di CD audio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3846 340.1 Cdrdao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3847 340.2 Cdrecord . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3854 340.3 Wav2cdr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3855 340.4 Riferimenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3857 3795 341 X-CD-Roast . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3858 341.1 Configurazione e permessi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3858 341.2 Masterizzazione dati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3861 341.3 Copia di un CD contenente dati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3862 341.4 CD contenente tracce audio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3863 341.5 Riferimenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3865 3796 Capitolo 334 Introduzione alla gestione dell’audio e uso del lettore CD Negli ultimi tempi, l’elaboratore viene visto sempre più spesso come una macchina multimediale tuttofare. In questo documento non c’è ancora una parte dedicata soddisfacentemente ai vari aspetti della «multimedialità» con GNU/Linux. Per il momento, qui si raccolgono soprattutto alcune notizie utili per la gestione delle funzionalità audio con il sistema GNU/Linux. In generale, per gestire l’«audio» in qualche modo non è strettamente necessario disporre di componenti speciali. Per esempio, il lettore CD-ROM può essere gestito in modo indipendente per ascoltare i CD musicali, eventualmente anche per estrarre le tracce audio (anche se poi mancherebbe la possibilità di ascoltare quanto estratto senza una scheda audio).1 334.1 Kernel per le funzionalità audio Per includere le funzionalità audio, attraverso dell’hardware apposito, è molto probabile che il kernel debba essere ricompilato. Tuttavia, il vero problema sta nel fatto che esiste una grande quantità di schede audio, per cui si deve scegliere attentamente l’hardware e per ogni situazione si possono presentare degli imprevisti.2 La maggior parte del codice scritto per la gestione delle schede audio è fatto per componenti un po’ vecchi, realizzati per il bus ISA, senza prevedere le funzionalità Plug & Play. Questo comporta il problema di dover provvedere alla configurazione di tali schede attraverso altri sistemi operativi, oppure per mezzo dei programmi del pacchetto Isapnptools, a cui si accenna nel capitolo 38. La parte principale del kernel ha un limite nella sua dimensione massima. Dal momento che di solito la gestione dell’audio non dovrebbe essere una funzionalità vitale, è consigliabile utilizzare i moduli per queste cose. Per prima cosa si deve abilitare la gestione dell’audio, in modo da permettere l’accesso alle altre voci di configurazione del kernel relative a questa gestione (29.2.16). Nella maggior parte dei casi, la gestione della propria scheda audio rientra nel gruppo OSS (Open sound system), di conseguenza dovrebbe essere necessario attivare la voce relativa. Successivamente si dovrà selezionare precisamente il tipo di scheda. Se si intende realizzare un kernel modulare, come viene suggerito qui, occorre poi fare in modo che i moduli relativi vengano caricati opportunamente, soprattutto specificando i parametri necessari a raggiungere correttamente la scheda. A titolo di esempio, supponendo di disporre di una vecchia scheda SoundBlaster a 8 bit, predisposta per utilizzare l’indirizzo di I/O 22016, il livello di IRQ 5 e il canale DMA 1, si può caricare il modulo relativo con il comando seguente: 1 È bene non farsi illusioni sulle possibilità di un sistema GNU/Linux nei confronti della gestione dell’audio. Il comportamento può cambiare notevolmente da una scheda audio all’altra e non è detto che le cose migliorino quando la qualità dell’hardware è eccezionale. In generale è possibile ottenere i risultati più buoni con una scheda a 16 bit di quelle gestite dai driver «OSS» (esiste una classificazione apposita nei sorgenti del kernel con questa sigla). 2 Purtroppo, il fatto che una scheda audio sia «compatibile» con una qualche altra scheda più conosciuta, non è sufficiente per determinare che queste siano effettivamente equivalenti. In generale, a meno che si stia utilizzando una scheda audio «originale» che risulta individuata perfettamente nell’elenco proposto dal programma di configurazione del kernel, è indispensabile localizzare l’integrato principale e annotare il nome o la sigla che vi appare. Con questa informazione si dovranno leggere i file di documentazione che accompagnano i sorgenti del kernel alla ricerca di notizie precise al riguardo. 3797 Introduzione alla gestione dell’audio e uso del lettore CD 3798 # modprobe sb irq=5 io=0x220 dma=1 In questo modo vengono caricati automaticamente anche i moduli da cui dipende ‘sb.o’. Lo si può verificare con ‘lsmod’: # lsmod Per verificare che la scheda sia stata riconosciuta correttamente, si può «interpellare» il file di dispositivo ‘/dev/sndstat’, ovvero il file virtuale ‘/proc/sound’: # cat /dev/sndstat # cat /proc/sound OSS/Free:3.8s2++-971130 Load type: Driver loaded as a module Kernel: Linux dinkel.brot.dg 2.2.5 #4 SMP lun mag 10 15:02:40 CEST 1999 i586 ... In seguito, si potrà sistemare meglio la cosa inserendo nel file ‘/etc/conf.modules’ le righe seguenti: alias sound sb options sb irq=5 io=0x220 dma=1 La documentazione più aggiornata riferita alle schede audio è contenuta nel pacchetto dei sorgenti del kernel. Precisamente si tratta dei file contenuti nella directory ‘/usr/src/linux/ Documentation/sound/’. È importante leggere i file riferiti alla propria scheda audio e in generale i file ‘Introduction’ e ‘README.*’. 334.1.1 File di dispositivo I file di dispositivo relativi alle funzionalità audio sono descritti nel file <file:///usr/src/linux/Doassieme a tutti gli altri. Il documento in questione è precisamente Linux allocated devices, curato da Peter H. Anvin. Quello che segue è l’estratto significativo di questo file. cumentation/devices.txt>, [...] 13 char [...] 14 char PC speaker 0 = /dev/pcmixer 1 = /dev/pcsp 4 = /dev/pcaudio 5 = /dev/pcsp16 Emulates Emulates Emulates Emulates Sound 0 = 1 = 2 = 3 = 4 = 6 = 8 = 16 = 17 = 18 = 19 = 20 = 33 = 34 = Mixer control Audio sequencer First MIDI port Digital audio Sun-compatible digital audio Sound card status information Sequencer -- alternate device Second soundcard mixer control Sequencer patch manager Second MIDI port Second soundcard digital audio Second soundcard Sun digital audio Sequencer patch manager Third MIDI port card /dev/mixer /dev/sequencer /dev/midi00 /dev/dsp /dev/audio /dev/sndstat /dev/sequencer2 /dev/mixer1 /dev/patmgr0 /dev/midi01 /dev/dsp1 /dev/audio1 /dev/patmgr1 /dev/midi02 /dev/mixer /dev/dsp (8-bit) /dev/audio /dev/dsp (16-bit) Introduzione alla gestione dell’audio e uso del lettore CD 50 = /dev/midi03 3799 Fourth MIDI port [...] A titolo di esempio, dovendo creare il dispositivo ‘/dev/audio’, si potrebbe usare il comando seguente: # mknod /dev/audio c 14 4 Sono importanti anche i permessi di questi file. In generale dovrebbero appartenere all’utente ‘root’ e al gruppo ‘audio’, oppure ‘sys’ in sua mancanza. Inoltre, per cominciare potrebbero avere i permessi di lettura e scrittura per tutti gli utenti: 06668.3 Volendo utilizzare il lettore CD-ROM per ascoltare dei CD audio normali, occorre regolare anche i permessi del dispositivo corrispondente al lettore stesso. In pratica, occorre prendersi cura del dispositivo a cui punta il collegamento simbolico ‘/dev/cdrom’. Questo dispositivo, dal momento che è riferito a un’unità in sola lettura, potrebbe essere accessibile in lettura e scrittura a qualunque utente (a meno che si voglia controllare per qualche motivo). Per questo, di solito si attribuiscono i permessi 06668. # chmod 0666 /dev/cdrom Quando l’elaboratore che dispone di scheda audio è collegato a una rete, potrebbero porsi dei problemi di sicurezza riguardo ai permessi per gli utenti comuni sui file di dispositivo di questa. Infatti, un utente che può accedere all’elaboratore, avrebbe la possibilità di attivare la scheda audio e ascoltare attraverso il microfono, ammesso che questo sia collegato. Nello stesso modo potrebbe attivare il canale della linea in ingresso e così anche tutte le altre fonti disponibili. Pertanto, generalmente, questi file di dispositivo sono sprovvisti del permesso di lettura per gli utenti diversi dal proprietario e dal gruppo di questi file. 334.1.2 # sndconfig La distribuzione Red Hat ha preparato un programma che facilita la configurazione dei moduli per la gestione delle funzionalità audio, provvedendo eventualmente anche a sistemare la configurazione Plug & Play delle schede ISA. Il programma è molto utile, soprattutto perché è in grado di predisporre il file ‘/etc/conf.modules’ correttamente, inoltre, ammesso che la scansione Plug & Play si concluda senza incidenti, si ottiene il file di configurazione ‘/etc/isapnp.conf’ corretto (e completo) per la propria scheda audio ISA Plug & Play.4 sndconfig [--noprobe] [--noautoconfig] Se ‘sndconfig’ viene utilizzato senza opzioni, si prepara immediatamente a eseguire una scansione dell’hardware Plug & Play. Eventualmente, questo può portare anche al blocco del sistema operativo; pertanto conviene utilizzare questa verifica solo quando l’elaboratore non sta svolgendo alcuna attività importante (meglio ancora se il livello di esecuzione è quello singolo). È molto importante che non venga avviata questa scansione se non c’è alcuna scheda ISA di tipo Plug & Play. L’opzione ‘--noprobe’ serve per evitare che venga eseguita una scansione Plug & Play. Così si potrà selezionare in modo guidato il tipo di scheda audio e gli indirizzi necessari a gestirla. L’opzione ‘--noautoconfig’ serve per evitare che venga configurata automaticamente una scheda audio Plug & Play. In questo modo si lascia all’utilizzatore la scelta dei parametri di configurazione relativi. 3 4 In seguito è il caso di ridurre i permessi, in modo di abilitare l’accesso alle funzionalità audio solo ad alcuni utenti. ‘sndconfig’ dovrebbe funzionare anche nelle distribuzioni diverse dalla Red Hat. 3800 Introduzione alla gestione dell’audio e uso del lettore CD La figura 334.1 mostra la maschera di ‘sndconfig’ con la quale si indicano le caratteristiche di una vecchia scheda audio SoundBlaster (configurata attraverso ponticelli), in modo che venga generato il file ‘/etc/conf.modules’ più adatto (in questo caso, il file ‘/etc/isapnp.conf’ non serve perché non si tratta di una scheda Plug & Play). Figura 334.1. Configurazione manuale di una vecchia scheda di cui si conosce la configurazione hardware. .---------------| Card Settings |----------------. | | | Please adjust the settings below to match the | | dip switch settings on your sound card. | | | | I/O PORT IRQ DMA | | | | >0x220< 3 >1< | | 0x240 >5< | | 7 | | 9 | | | | .----. .--------. | | | Ok | | Cancel | | | ‘----’ ‘--------’ | | | | | ‘------------------------------------------------’ Per comprendere meglio il funzionamento di questo programma, ma soprattutto per capire come ci si deve comportare con la configurazione del file ‘/etc/isapnp.conf’, è opportuno dare un’occhiata al capitolo 38, in particolare per quello che riguarda il pacchetto Isapnptools. 334.2 Riferimenti • Jeff Tranter, The Linux Sound HOWTO <http://www.linux.org/docs/ldp/howto/HOWTO-INDEX/howtos.html> • Documentazione del kernel <file:///usr/src/linux/Documentation/sound/> Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org Capitolo 335 Lettore CD audio Indipendentemente dal fatto che sia disponibile una scheda audio, è possibile ascoltare dei CD musicali attraverso il lettore CD-ROM, che dovrebbe essere provvisto di un’uscita autonoma (una presa stereo per cuffia sulla parte frontale dell’unità). Naturalmente, se è disponibile la scheda audio, il lettore CD-ROM potrebbe esservi stato collegato attraverso un cavetto schermato, in modo da poter utilizzare le funzionalità della stessa scheda per rielaborare il suono. 335.1 Ascolto di un CD audio Il software che si occupa di mettere in funzione il lettore CD-ROM come lettore di CD audio, interviene solo sul dispositivo ‘/dev/cdrom’ (o meglio, sul dispositivo a cui punta questo collegamento simbolico, che come già spiegato deve avere i permessi opportuni). Il segnale audio può essere prelevato direttamente dal lettore CD, oppure può essere gestito attraverso la scheda audio per mezzo di altro software. Se la scheda audio non è di ottima qualità, questa potrebbe generare un rumore di fondo. Di conseguenza, per essere certi di prelevare il segnale più pulito possibile, è necessario utilizzare l’uscita del lettore CD stesso. Il software che permette l’ascolto di un CD audio, non richiede di tenere sotto controllo il lettore, per cui potrebbe essere costituito anche da un semplice programma a riga di comando, come nel caso di ‘dcd’. I programmi per l’ascolto di CD audio potrebbero comportarsi in maniera differente tra di loro, tanto che non va esclusa la presenza di errori che impediscono la lettura di CD che in condizioni normali risultano realizzati correttamente. In altri termini, se per qualche ragione non si riesce a leggere un CD audio attraverso l’uso di un certo programma, conviene tentare di utilizzarne altri, prima di arrivare alla conclusione che il CD o il lettore possano essere difettosi. Molti programmi per l’ascolto di CD musicali, abbinano anche la funzionalità di interrogazione della base di dati CDDB. Ciò viene descritto nella sezione 335.2. 335.1.1 Dcd Dcd 1 è un programma di servizio molto semplice, composto dall’eseguibile ‘dcd’, che segue la filosofia dei comandi a riga di comando, con tutti i vantaggi che questo può dare. In pratica, senza impegnare una console virtuale o un terminale, manda al lettore i comandi richiesti di volta in volta. [n_traccia ...] dcd {stop|restart|next|prev|info|dir|loop [n ...]} dcd La sintassi è molto semplice: se si indica un numero n si intende avviare l’esecuzione della traccia n -esima corrispondente; se si indicano più numeri si intende ottenere l’esecuzione di quelle tracce nella sequenza indicata; se si indica un’altra parola chiave, si vuole impartire il comando corrispondente: 1 Dcd GNU GPL 3801 Lettore CD audio 3802 • ‘stop’ ferma l’esecuzione (se non funziona basta selezionare la prima traccia e quindi usare il comando ‘prev’); • ‘restart’ riavvia la traccia che si sta ascoltando; • ‘next’ passa alla prossima traccia; • ‘prev’ passa alla traccia precedente; • ‘info’ restituisce alcune informazioni sulla traccia attuale; • ‘dir’ elenca le tracce contenute nel CD; • ‘loop [n ...]’ esegue la sequenza ripetendo quando raggiunge la fine della sequenza (in tal caso ‘dcd’ impegna la shell). Alcuni esempi $ dcd Avvia l’esecuzione del primo brano del CD, proseguendo fino all’ultimo. $ dcd 1 Esattamente come nell’esempio precedente. $ dcd 1 3 5 7 Richiede l’esecuzione dei brani numero uno, tre, cinque e sette, in sequenza. $ dcd next Passa all’esecuzione del brano successivo. 335.1.2 TCD TCD 2 è un pacchetto composto da due programmi: uno per lo schermo a caratteri e uno per il sistema grafico X. L’utilizzo è intuitivo e non occorrono molte spiegazioni. È importante osservare che il controllo del volume riguarda il lettore CD e non la scheda audio. In altri termini, si tratta del volume del segnale che viene generato dal lettore CD: sia quello che si ottiene attraverso l’uscita sul pannello frontale dell’unità, sia quello che viene inviato alla scheda audio (ammesso che esista) per mezzo del cavetto schermato interno all’elaboratore. La figura 335.1 mostra il funzionamento di TCD nella versione per terminali a caratteri, mentre la figura 335.2 mostra la versione per il sistema grafico X3 2 TCD GNU GPL TCD si dovrebbe trovare incluso anche nella raccolta degli applicativi di Gnome; in tal caso, l’aspetto della versione grafica è un po’ diverso rispetto a quanto si vede nelle figure riportate qui. 3 Lettore CD audio 3803 Figura 335.1. Esempio del funzionamento di TCD nella versione per terminali a caratteri. .-TCD v2.0, by Tim Gerla------Control Panel------------------------------------. | | | | Status: Paused | [P] - Start playing. [-] - Previous track. | | Track: 10 of 12 | [U] - Pause or restart. [+] - Ne|t track. | | Time: 03:36 | [E] - Eject CDROM. [G] - Go to track #. | | CD: 55:17 | [S] - Stop playing. []] - Skip ahead. | | | [[] - Skip back. | |-Track List----------------| [M] - Change play mode. < > - Adjust volume. | | | Current Mode: Normal Current Volume: 10% | | 01a - 06:10 | | | 02a - 06:21 | | | 03a - 03:22 | | | 04a - 04:06 | | | 05a - 05:51 | | | 06a - 08:05 | [T] - Edit track database. | | 07a - 04:38 | [D] - Download CDDB data. | | 08a - 05:10 | | | 09a - 07:55 | | | 10a - 08:29 | [Q] - Quit. | | 11a - 04:54 | | | 12a - 06:37 |-Disc Information---------------------------------| | | Length: 71:40 | | | Title: Unknown / Unknown | | | Track: Track 10 | ‘------------------------------------------------------------------------------’ Figura 335.2. Esempio del funzionamento di TCD nella versione grafica. Gli eseguibili sono rispettivamente ‘tcd’ e ‘gtcd’. La lettera «g» di ‘gtcd’ sta per GTK+, ovvero le librerie grafiche utilizzate. Una cosa interessante di TCD sta nel fatto che più copie dei suoi eseguibili possono funzionare in modo concorrenziale, risultando tutte perfettamente sincronizzate, a parte qualche difficoltà nella regolazione del volume. 335.1.3 Cdcd Cdcd 4 è un altro programma per l’ascolto di CD musicali che consente un funzionamento a riga di comando, oppure in modo interattivo, ma sempre attraverso una console. La prima volta che viene avviato da ogni utente, richiede alcune informazioni elementari di configurazione, con cui crea il file ‘~/.cdcdrc’: $ cdcd[ Invio ] 4 Cdcd GNU GPL 3804 Lettore CD audio La prima cosa che viene richiesta è il file di dispositivo abbinato al lettore CD: Welcome to cdcd 0.5.0. You will now be asked a series of questions which will configure cdcd for your platform. The default answers are given in brackets. What is the name of your CD-ROM device? [/dev/cdrom] Se esiste il collegamento simbolico ‘/dev/cdrom’ che punta al dispositivo corretto, come già è stato suggerito, basta confermare con la pressione del tasto [ Invio ]. [ Invio ] Successivamente, Cdcd cerca di ottenere le informazioni necessarie ad accedere alla rete, allo scopo di contattare una base di dati CDDB, oppure qualcosa di equivalente. Are you connected to a network (y/n)? [y] [ Invio ] There are two methods of retrieving CD track information, CDDB and CD Index. Using the CD Index will be somewhat faster, but does not yet facilitate inexact matching. Both methods may be used through HTTP proxy servers. Choose a method: 1) CDDB 2) CD Index Which method? [1] Avendo confermato la disponibilità di un accesso alla rete, viene proposto di accedere a una base di dati CDDB, oppure a un altro tipo di indice. La scelta più comune è proprio la base di dati CDDB, come suggerito dal programma stesso. [ Invio ] Use a HTTP proxy server? [n] In questo caso si suppone che non sia necessario utilizzare un proxy, per cui si conferma la proposta del programma. [ Invio ] cdcd version 0.5.0, Copyright (C)1998-99 Tony Arcieri Distributed under the GNU General Public License. See file COPYING for details. Built with libcdaudio 0.99.1 Enter ? for help. cdcd> Termina così la configurazione e il programma si mette a funzionare in una modalità interattiva, in attesa di comandi, dove l’invito è la stringa ‘cdcd>’. Per terminare basta dare il comando ‘quit’. cdcd> quit[ Invio ] È già stato specificato che Cdcd può funzionare sia in modo non interattivo, a riga di comando, sia in modo interattivo. In pratica, l’eseguibile ‘cdcd’ può essere avviato indicando un comando come argomento, per cui eseguirà la richiesta e terminerà di funzionare, oppure può essere avviato senza argomenti e in tal caso mostrerà un invito rimanendo in attesa di comandi. Naturalmente, i comandi in questione sono gli stessi, sia quando usati come argomento della riga di comando, sia quando usati nel funzionamento interattivo. Lettore CD audio cdcd 3805 [comando] Si ottiene l’elenco dei comandi disponibili con il comando ‘help’, mentre per conoscere la sintassi precisa di ogni comando basta il comando ‘help nome_comando ’. Per esempio: $ cdcd help[ Invio ] cdcd commands: play stop next prev info tracks open getvol edit close setvol ext pause resume ff rew status rndplay slot list refresh device verbose quit sites submit access For more specific help, type ’help <command>’ $ cdcd help play[ Invio ] Usage: play [starttrackname/track #] [endtrackname/track #] [min:sec] By default, play starts at the beginning of the CD. You may specify tracks using either the number of the track or a section of the track’s name. The disc will play from where it starts to the end of the disc or a track you specify. You may also specify a position within the first track to start. La tabella 335.1 descrive brevemente i comandi principali di Cdcd. Tabella 335.1. Comandi principali di Alcune opzioni della riga di comando di Cdcd. Comando play open, eject pause resume ff, rew next, prev status info, tracks, ext quit Descrizione Avvia l’esecuzione, dall’inizio o da una certa traccia. Termina l’esecuzione ed espelle il CD dal lettore. Mette in pausa l’esecuzione del CD. Riprende l’esecuzione dopo una pausa. Fa avanzare o retrocedere rapidamente nell’ambito del brano che si sta ascoltando. Fa avanzare alla traccia successiva o retrocedere alla traccia precedente. Visualizza la situazione del CD. Visualizza informazioni ottenibili attraverso CDDB. Termina il funzionamento di Cdcd quando questo funzionava in modalità interattiva. 335.1.4 Gcd Gcd 5 è un programma grafico per l’ascolto di CD musicali. Può funzionare in modo molto poco appariscente, come si vede nella figura 335.3, oppure anche come si vede nella figura 335.4. All’avvio cerca normalmente di contattare una base di dati CDDB e se la connessione fallisce, la cosa viene segnalata con un messaggio di errore in un riquadro separato. Figura 335.3. Pannello normale di Gcd. 5 Gcd GNU GPL Lettore CD audio 3806 Figura 335.4. Pannello di Gcd con il dettaglio delle tracce. Gcd si avvia con l’eseguibile ‘gcd’ e oltre a questo non c’è molto da aggiungere, dal momento che il suo funzionamento interattivo è molto intuitivo, guidato anche da etichette a scomparsa che descrivono il significato dei pulsanti grafici che appaiono sul pannellino di controllo. 335.2 CDDB CDDB è una base di dati dei CD musicali offerta attraverso la rete. A fianco di servizi CDDB proprietari, il cui accesso può essere sottoposto a delle condizioni, esiste anche un servizio CDDB pubblico, corrispondente a Freedb.org (<http://www.freedb.org>). Il protocollo usato per l’accesso a una base di dati CDDB è denominato CDDBP e utilizza la porta 8880. Con questo protocollo si può interrogare il servizio utilizzando i pochi dati che fornisce il CD sui brani che contiene, oppure si possono fornire le informazioni conosciute sul CD, mettendole a disposizione di tutti. Molti programmi per l’ascolto di CD audio sono organizzati per l’interrogazione automatica di questo servizio, allo scopo di fornire tutte le notizie conosciute su ciò che si sta ascoltando. Alcuni sistemi grafici integrati, come Gnome, utilizzano un programma cliente che si occupa di eseguire le interrogazioni per conto dei programmi che possono averne bisogno, come TCD (nella versione per Gnome). Nel caso di Gnome si tratta precisamente di ‘cddbslave’, il quale poi memorizza le informazioni nella directory ‘~/.cddbslave/’, su più file, mentre altri programmi potrebbero salvare le loro informazioni in file con nomi simili, per esempio ‘~/.cddb’. Tanto per fare un esempio di come possa funzionare il meccanismo, si fa riferimento a TCD nella versione per Gnome. Sul pannello frontale, tra le varie icone se ne trova una che permette di accedere alla finestra di inserimento e modifica delle informazioni sulle tracce. Queste informazioni sono memorizzate naturalmente nella propria directory personale. Si vede questa finestra nella Lettore CD audio 3807 figura 335.5. In questo caso appaiono anche i titoli dei vari brani, se così non fosse, si potrebbe interrogare la base di dati CDDB, come suggerisce il pulsante grafico nella parte bassa. Figura 335.5. Finestra di accesso alle informazioni sulle tracce del CD musicale. Il servizio offerto da Freedb.org avviene per mezzo di diversi nodi, in particolare freedb.freedb.org. Tuttavia, il software che si utilizza dovrebbe essere già predisposto per interrogare correttamente questi indirizzi. 335.3 Tracce CDDA Le tracce audio di cui si compone un CD musicale sono in pratica dei file audio in un formato particolare. Anche se con qualche difficoltà, è possibile estrarre queste tracce e, teoricamente, si possono ricomporre masterizzando un nuovo CD. È importante ricordare che l’acquisto di un CD non dà implicitamente il diritto di farne quello che si vuole. In generale si ottiene solo il diritto di ascoltarlo per sé; mentre altre operazioni come la copia, l’esecuzione in pubblico e la trasmissione, sono attività che devono essere autorizzate espressamente da chi detiene i diritti di quella pubblicazione sonora, senza contare l’eventuale presenza di una tassa. Lettore CD audio 3808 Qui viene mostrato a titolo didattico il modo in cui le tracce audio di un CD possono essere estratte. Tuttavia, utilizzare questa tecnica per memorizzare tali brani in un’unità di memorizzazione qualunque, vuol dire farne una «copia», ovvero un’azione che normalmente è vietata da chi possiede i diritti sulla pubblicazione relativa. L’estrazione delle tracce da un CD non è necessariamente un’operazione illegale, anche se la prima idea che viene in mente a chiunque è quella di fare così delle copie digitali perfette. In certi casi può essere l’unico modo per riuscire ad ascoltare un CD attraverso un lettore in cui l’uscita audio non funziona; in ultima analisi potrebbe essere il modo per realizzare un sistema audio completamente digitale fino all’ultima fase del processo di elaborazione che si vuole attuare. In generale, per estrarre le tracce audio da un CD si utilizza Cdda2wav, Cdparanoia o Grip. Il problema più difficile dell’estrazione dei brani è quello di riuscire a individuarne correttamente l’inizio e la fine, oltre alla necessità di seguire correttamente la traccia senza salti. 335.3.1 Dispositivi Quando si utilizzano programmi che accedono direttamente alle tracce audio del lettore CD, è necessario che i file di dispositivo abbiano i permessi necessari, a meno che si voglia utilizzarli solo in qualità di utente ‘root’. Di solito si fa riferimento a ‘/dev/cdrom’ come collegamento simbolico al file di dispositivo corretto per il tipo di lettore di cui si dispone. Dal momento che gli applicativi in questione devono poter interagire con il lettore, nel caso questo sia di tipo SCSI è necessario prendersi cura anche del «dispositivo generico», in pratica di uno che corrisponde al modello ‘/dev/sgn ’. Alcune distribuzioni GNU/Linux utilizzano una forma non standard per i nomi di questi file di dispositivo: ‘/dev/sga’, ‘/dev/sgb’,... In questi casi, è necessario creare anche i file corretti, o abbinare a questi dei collegamenti simbolici opportuni. In generale, da quanto si legge nel Linux allocated devices, documento mantenuto da Peter H. Anvin e corrispondente al file <file:///usr/src/ linux/Documentation/devices.txt>: [...] 21 char Generic SCSI access 0 = /dev/sg0 1 = /dev/sg1 ... First generic SCSI device Second generic SCSI device Most distributions name these /dev/sga, /dev/sgb...; this sets an unnecessary limit of 26 SCSI devices in the system and is counter to standard Linux device-naming practice. [...] Naturalmente, ‘/dev/sgn ’ si abbina a ‘/dev/srn ’ o ‘/dev/scdn ’. Volendo creare per esempio il primo di questa serie, si può utilizzare il comando seguente: # mknod /dev/sg0 c 21 0 Il dispositivo generico deve avere i permessi di scrittura se si vuole permettere a questi applicativi di funzionare. Lettore CD audio 3809 335.3.2 Cdparanoia Cdparanoia 6 è in grado di estrarre le tracce audio di un CD in modo digitale, senza passare per l’elaborazione della scheda audio. Può generare diversi tipi di formati, tuttavia al principiante conviene un formato con intestazione, come il WAV-RIFF. Si compone di un eseguibile unico, ‘cdparanoia’: cdparanoia [opzioni] intervallo_di_esecuzione [file_da_generare] La caratteristica più importante di questo applicativo sta nel fatto che è in grado di leggere e rileggere più volte le tracce audio in modo da escludere errori, attraverso il confronto delle letture successive. A parte il caso in cui venga utilizzata l’opzione ‘-B’, è obbligatorio specificare l’intervallo di tracce e di tempo di registrazione. Semplificando al massimo, si tratta dell’intervallo di tracce espresso semplicemente nella forma m -n , dove m è la traccia iniziale e n quella finale. Nella pagina di manuale cdparanoia(1) si può leggere una spiegazione un po’ più dettagliata che permette di individuare meglio la porzione desiderata. Alcune opzioni -w | --output-wav Genera un formato WAV-RIFF. -B | --batch Genera una serie di file, uno per ogni traccia. -Z | --disable-paranoia Disabilita il processo di rilettura e correzione degli errori. Esempi $ cdparanoia -w 1 mio_file.wav Crea il file ‘mio_file.wav’ ottenuto dalla prima traccia del CD contenuto nel lettore. $ cdparanoia -w 1-2 mio_file.wav Crea il file ‘mio_file.wav’ ottenuto dalle prime due tracce del CD contenuto nel lettore. $ cdparanoia -w -B Crea una serie di file, nella directory corrente, uno per ogni traccia del CD contenuto nel lettore. I file sono in formato WAV-RIFF. $ cdparanoia -w 1 - | sox - .wav -t ossdsp /dev/dsp Legge la prima traccia audio del CD contenuto nel lettore e la passa a un altro programma, attraverso una pipeline. Quel programma si occupa di convertire il formato in modo da poterlo inviare al dispositivo ‘/dev/dsp’ che in pratica corrisponde a un ingresso digitale della scheda audio (viene mostrato nel prossimo capitolo). A parte la qualità della riproduzione che si ottiene, eventualmente anche pessima, questo esempio mostra in che modo si può prelevare una traccia audio per rielaborarla prima dell’ascolto, senza passare per l’uscita audio del CD. 6 Cdparanoia GNU GPL Lettore CD audio 3810 335.3.3 Grip Grip 7 è un altro programma in grado di estrarre tracce audio da un CD, pilotando eventualmente anche la conversione in formato MP3. Eventualmente può funzionare come lettore CD puro e semplice; in tal caso, si comporta esattamente come Gcd, che in effetti è una versione ridotta dello stesso Grip. Anche Grip è quindi un programma grafico interattivo, come lo è Gcd, ma in questo caso è molto importante la configurazione, che viene memorizzata nel file ‘~/.grip’. Due aspetti molto importanti della configurazione riguardano il modo in cui vengono prelevate le tracce (figura 335.6) e la conversione eventuale in MP3 (figura 335.7). Figura 335.6. Configurazione del prelievo delle tracce audio attraverso Grip. 7 Grip GNU GPL Lettore CD audio 3811 Figura 335.7. Configurazione della conversione delle tracce prelevate in MP3. Il prelievo normale può avvenire direttamente attraverso Grip stesso, senza l’ausilio di altri programmi, ma in particolare viene definita in questa fase la collocazione dei file ottenuti (che sono di tipo WAV-RIFF). Nella figura 335.6 si vede in particolare che i file vengono definiti in base alla stringa ‘~/mp3/%a/%d/%n.wav’. Evidentemente, ‘%a’, ‘%d’, e ‘%n’ sono dei metacaratteri che rappresentano rispettivamente: il nome dell’artista, il nome del disco e la traccia completa di numero sequenziale. In pratica, se non è stato ottenuto il nome dell’artista e del CD, la prima traccia corrisponde al file ‘~/mp3/noartist/unknown_disk/track_1.wav’. La conversione in MP3 delle tracce richiede un programma apposito. Grip è in grado di utilizzarne diversi, in particolare LAME (capitolo 337). Nella configurazione (figura 335.7) deve essere indicato il tipo di programma usato per la conversione, il percorso assoluto dell’eseguibile e le opzioni da dargli; inoltre, come nella situazione precedente deve essere indicato in che modo comporre il nome del file. Anche nella riga di comando del programma di conversione vengono indicati dei metacaratteri; nella figura si vede l’uso di ‘%b’, ‘%f’ e ‘%o’ che rappresentano rispettivamente il settore di inizio da cui iniziare la conversione, il nome del file WAV-RIFF da convertire e il nome del file MP3 da generare. Naturalmente, per leggere l’elenco completo di questi metacaratteri, soprattutto allo scopo di comprendere il significato della configurazione predefinita, è sufficiente leggere la pagina di manuale grip(1). Dopo la configurazione, per passare al prelievo occorre prima selezionare le tracce desiderate, come si vede nella figura 335.8, utilizzando il mouse, premendo il terzo tasto (quello destro). Successivamente si può passare al prelievo, come si vede nella figura 335.9, dove si può scegliere se prelevare semplicemente le tracce, generando file di tipo WAV-RIFF, con il pulsante grafico R I P O N L Y , oppure si può ottenere direttamente la conversione in formato MP3, con il pulsante grafico R I P +E N C O D E . Lettore CD audio 3812 Figura 335.8. Selezione delle tracce. Figura 335.9. Prelievo delle tracce. Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org Capitolo 336 Gestione della scheda audio La scheda audio essenziale è semplicemente un mixer audio comprendente diversi ingressi e una o più uscite. I dispositivi più importanti relativi alla scheda audio sono ‘/dev/audio’ e ‘/dev/ dsp’. In particolare, il primo permette di trasmettere alla scheda dei file in formato digitale Sun, ovvero quelli che normalmente hanno l’estensione ‘.au’. Volendo gestire l’audio in modo diretto, attraverso questo file di dispositivo, occorre convertire i file audio nel formato Sun (questo si ottiene di solito attraverso l’applicativo Sox). Nello stesso modo, leggendo da questo file di dispositivo, si ottiene un file in formato digitale Sun del segnale gestito o generato dalla scheda audio. In pratica: $ cat mio_file.au > /dev/audio questo comando serve a eseguire il file ‘mio_file.au’, mentre il prossimo $ dd if=/dev/audio of=registratore.au bs=8k count=8 serve a registrare per otto secondi (ogni secondo è un blocco di 8 Kibyte) generando il file ‘registratore.au’. 336.1 Aumix Aumix 1 è un applicativo per la gestione delle funzionalità di miscelazione e di equalizzazione della scheda audio. Può essere usato in modo interattivo, richiedendo in questo caso lo schermo di un terminale a caratteri, oppure direttamente attraverso le opzioni della riga di comando. In particolare, nella modalità interattiva mostra solo i canali audio che possono essere controllati effettivamente. Il funzionamento di Aumix e degli altri programmi analoghi non è perfetto. Alle volte possono apparire dei controlli che di fatto non producono alcun risultato. Purtroppo questo dipende dalla qualità del codice scritto nel kernel per la gestione della scheda audio di cui si dispone. 336.1.1 Funzionamento interattivo di Aumix La figura 336.1 mostra il funzionamento interattivo di Aumix, che si ottiene avviando l’eseguibile ‘aumix’ senza indicare alcun argomento. In particolare si fa riferimento a una scheda audio SoundBlaster standard a 16 bit. Figura 336.1. Esempio del funzionamento di Aumix in modalità interattiva. aumix Quit Load Save Keys Mute 1 ++++++++++++++++++++++++++++++O+++<Vol ++++++++++++++++++++++++++++++O+++ Bass ++++++++++++++++++++++++++++++O+++ Trebl PO+++++++++++++++++++++++++++++++++ Synth ++++++++++++++++++++++++++++++O+++ Pcm O+++++++++++++++++++++++++++++++++ Spkr PO+++++++++++++++++++++++++++++++++ Line RO+++++++++++++++++++++++++++++++++ Mic PO+++++++++++++++++++++++++++++++++ CD O+++++++++++++++++++++++++++++++++ Mix O+++++++++++++++++++++++++++++++++ IGain ++++++++++++++++++O+++++++++++++++ OGain 0 Level 100 Aumix GNU GPL 3813 ++++++++++++O+++++++++++++ ++++++++++++O+++++++++++++ ++++++++++++O+++++++++++++ ++++++++++++O+++++++++++++ ++++++++++++O+++++++++++++ ++++++++++++O+++++++++++++ ++++++++++++O+++++++++++++ ++++++++++++O+++++++++++++ ++++++++++++O+++++++++++++ L Balance R Gestione della scheda audio 3814 Tanto per rendersi conto di questa variabilità nell’apparenza di Aumix, si può osservare anche la figura 336.2 che mostra cosa accade con una vecchia scheda SoundBlaster a 8 bit. Figura 336.2. Aumix con una vecchia scheda a 8 bit. aumix Quit Load Save Keys Mute ++++++++++++++++++++++++++++++O+++<Vol PO+++++++++++++++++++++++++++++++++ Synth ++++++++++++++++++++++++++++++O+++ Pcm PO+++++++++++++++++++++++++++++++++ Line RO+++++++++++++++++++++++++++++++++ Mic PO+++++++++++++++++++++++++++++++++ CD 0 Level 100 ++++++++++++O+++++++++++++ ++++++++++++O+++++++++++++ ++++++++++++O+++++++++++++ ++++++++++++O+++++++++++++ ++++++++++++O+++++++++++++ L Balance R I canali stereofonici hanno anche la possibilità di essere bilanciati, come si vede intuitivamente dalle figura. Per selezionare un canale si possono utilizzare i tasti [ freccia su ] e [ freccia giù ]; per passare alla regolazione del bilanciamento si può utilizzare il tasto di tabulazione, [ Tab ], così come lo si può usare per tornare indietro all’elenco dei canali. Infine i tasti [ freccia sinistra ] e [ freccia destra ] permettono di regolare il volume del canale o di cambiare il bilanciamento, a seconda di dove si trova il cursore. È interessante notare che anche il mouse funziona, se gestito attraverso il demone ‘gpm’. A fianco di alcuni livelli di volume appare la lettera «P», oppure la lettera «R». La prima sta per play, mentre la seconda sta per record. In pratica, i canali contrassegnati con la lettera «P» rappresentano un segnale in ingresso nel mixer audio, diretti semplicemente all’amplificatore finale (le uscite normali della scheda audio). Invece, i canali contrassegnati con la lettera «R», oltre che essere diretti all’amplificatore finale, sono utilizzati per il campionamento del segnale (di solito uno soltanto) ed è ciò che si riesce a leggere dal dispositivo ‘/dev/audio’. Generalmente è solo il canale del microfono ad avere la sigla «R» e questo per ovvie ragioni. Tuttavia, è possibile modificare il comportamento di alcuni canali utilizzando la [ barra spaziatrice ], oppure il mouse (basta fare un clic sulla lettera per scambiarne il valore). Tabella 336.1. Alcuni comandi utili per l’uso di Aumix in modo interattivo. Tastiera pagina su, freccia su pagina giù, freccia giù Tab, Invio, >, < +, freccia destra -, freccia sinistra | Spazio S, s L, l K, k M, m Esc, Q, q Descrizione Passa al canale precedente. Passa al canale successivo. Scambia tra la regolazione del livello e del bilanciamento. Sposta il cursore a destra. Sposta il cursore a sinistra. Centra il bilanciamento. Scambia la modalità di registrazione e di esecuzione. Salva le impostazioni nel file di configurazione. Carica le impostazioni dal file di configurazione. Mostra un guida sull’uso della tastiera. Azzera o ripristina il volume generale. Termina il funzionamento. 336.1.2 Avvio di Aumix aumix [opzioni_di_canale] [altre_opzioni] L’eseguibile ‘aumix’ è tutto ciò che compone l’applicativo omonimo. In modo particolare, le opzioni possono servire per regolare il volume di un certo canale (purché questo abbia una corrispondenza con la scheda audio disponibile effettivamente), oppure per conoscere il livello attuale o ancora per scambiare le modalità «R» (record) e «P» (play). Gestione della scheda audio 3815 Alcune opzioni di canale |[ ] -v percentuale q uery Definisce o richiede di conoscere il valore del volume generale, espresso in forma percentuale rispetto al massimo. |[ ] -s percentuale q uery Definisce o richiede di conoscere il valore del volume del sintetizzatore, espresso in forma percentuale rispetto al massimo. |[ ] -w percentuale q uery Definisce o richiede di conoscere il valore del volume di una riproduzione digitale (PCM), espresso in forma percentuale rispetto al massimo. Si tratta del volume dell’esecuzione di un brano contenuto in un file. |[ ]|R|P -l percentuale q uery Definisce o richiede di conoscere il valore del volume della linea di ingresso esterna, espresso in forma percentuale rispetto al massimo. Se si utilizza la lettere ‘R’ o la lettera ‘P’, si intende passare alla modalità di registrazione o a quella di esecuzione. |[ ]|R|P -m percentuale q uery Definisce o richiede di conoscere il valore del volume del microfono, espresso in forma percentuale rispetto al massimo. Se si utilizza la lettere ‘R’ o la lettera ‘P’, si intende passare alla modalità di registrazione o a quella di esecuzione. |[ ]|R|P -c percentuale q uery Definisce o richiede di conoscere il valore del volume del canale relativo al lettore CD, espresso in forma percentuale rispetto al massimo. Se si utilizza la lettere ‘R’ o la lettera ‘P’, si intende passare alla modalità di registrazione o a quella di esecuzione. Altre opzioni generali -L Carica le impostazioni dal file di configurazione ‘~/.aumixrc’ o in sua mancanza dal file ‘/etc/aumixrc’. -q Interroga lo stato di tutti i canali esistenti e mostra il risultato attraverso lo standard output. -S Salva le impostazioni nel file ‘~/.aumixrc’. Esempi $ aumix -v 70 Regola il volume generale al 70 %. $ aumix -m 0 -l R Regola il volume del canale microfonico a zero e indica la linea di ingresso come canale in registrazione. 3816 Gestione della scheda audio 336.1.3 Configurazione La configurazione di Aumix consiste semplicemente dei file ‘~/.aumixrc’. Il file di configurazione personale viene creato utilizzando l’eseguibile ‘aumix’ con l’opzione ‘-S’, oppure quando il programma funziona in modalità interattiva, attraverso la pressione del tasto [ s ]. Il file di configurazione non viene caricato automaticamente: lo si può richiedere attraverso l’opzione ‘-L’, oppure attraverso il tasto [ l ]. Quando viene caricata la configurazione, se il file ‘~/.aumixrc’ manca, Aumix fa riferimento a ‘/etc/aumixrc’, che potrebbe essere ottenuto semplicemente copiando una configurazione personale che si ritiene adatta a livello generale, in mancanza d’altro. A titolo di esempio viene mostrato il contenuto di uno di questi file di configurazione, dove il significato delle righe che lo compongono dovrebbe essere intuitivo. vol:76:76:P synth:0:0:P pcm:0:0:P line:0:0:P mic:0:0:R cd:0:0:P Alcune distribuzioni GNU/Linux utilizzano Aumix per memorizzare e ripristinare le regolazioni della scheda audio. In pratica, nella procedura di inizializzazione del sistema si fa in modo di salvare in un file, presumibilmente ‘/etc/.aumix’, i valori utilizzati per ultimi durante la fase di arresto, mentre dallo stesso file vengono riletti durante la fase di avvio. 336.2 Esecuzione e registrazione di brani campionati Per verificare il funzionamento del sistema di registrazione e di riproduzione di brani campionati, si possono usare direttamente i dispositivi ‘/dev/audio’ e ‘/dev/dsp’. Entrambi permettono di leggere il risultato di un campionamento e di riprodurre gli stessi brani se questi vengono scritti sugli stessi dispositivi. Il primo dei due file di dispositivo, ‘/dev/audio’, fa riferimento al formato standard della Sun, semplificato al massimo. I file audio con questo formato hanno normalmente l’estensione ‘.au’. Il secondo, ‘/dev/dsp’, rappresenta un formato audio grezzo. Per «registrare» da questi dispositivi, basta leggerli e inviare ciò che si ottiene verso un file normale. Lo stesso file può essere diretto al dispositivo attraverso cui è stato generato, ottenendone la riproduzione. Tuttavia, per registrare occorre selezionare un canale dalla scheda audio, specificando che per questo è abilitata la registrazione. In generale si può trattare del canale microfonico, di quello del CD e della linea di ingresso esterna. In pratica, utilizzando Aumix, si tratta di avviare l’eseguibile ‘aumix’ con l’opzione ‘-m’, ‘-c’ o ‘-l’, rispettivamente, con l’argomento ‘R’. In queste condizioni, 8 Kibyte corrispondono a un secondo di riproduzione audio, di conseguenza, si può utilizzare uno dei due comandi seguenti per campionare e memorizzare per un minuto in un file. $ dd if=/dev/audio of=registratore.au bs=8k count=60 $ dd if=/dev/dsp of=registratore bs=8k count=60 Per riprodurre questi file, si devono utilizzare gli stessi dispositivi da cui sono stati generati. Rispettivamente, valgono i due comandi seguenti. $ cat registratore.au > /dev/audio Gestione della scheda audio $ cat registratore > /dev/dsp 3817 Gestione della scheda audio 3818 336.3 Wavtools Wavtools 2 è un altro pacchetto per l’esecuzione e la registrazione di file audio in formato WAV. Utilizza in particolare il dispositivo ‘/dev/dsp’. Si compone di quattro eseguibili: ‘wavr’ e ‘gwavr’ per la registrazione; ‘wavp’ e ‘gwavp’ per l’esecuzione. [opzioni] gwavr [opzioni] wavr wavp file_wav gwavp file_wav_gsm In pratica, non c’è bisogno di opzioni per eseguire un file attraverso ‘wavp’ o ‘gwavp’. La lettera «g» iniziale di ‘gwavr’ e ‘gwavp’, indica che si tratta della versione predisposta per un formato WAV compresso utilizzando l’algoritmo GSM. Alcune opzioni di wavr e gwavr -f file_wav Specifica il file da registrare. -r frequenza_campionamento Specifica la frequenza di campionamento. Alcuni valori comuni sono: 44100, 22050, 11025 e 8000. -d dimensione_campione Definisce la dimensione del campione in bit. Di solito si usano i valori 8 o 16. | -c 1 2 Definisce il numero dei canali: uno per una registrazione monofonica, due per una registrazione stereofonica. -l n_secondi Programma la durata della registrazione. 336.4 Xwave Xwave 3 è un applicativo relativamente completo per la registrazione, la modifica e l’esecuzione di brani musicali registrati in vari formati, in particolare in WAV-RIFF. Si tratta di un applicativo per X. Nella figura 336.3 si vede il pannello principale dopo aver caricato un file WAV. 2 3 Wavtools GNU GPL Xwave GNU GPL Gestione della scheda audio 3819 Figura 336.3. Pannello principale di Xwave. Il programma eseguibile che svolge tutto il lavoro è ‘xwave’. Non richiede opzioni e il suo funzionamento è intuitivo. È interessante la possibilità offerta di modificare un brano, per esempio usando il taglia-incolla (basta selezionare una porzione della traccia con il mouse), oppure introducendo degli effetti. Può darsi che la registrazione non sia perfetta, ma questo è un particolare trascurabile rispetto alle altre possibilità di questo applicativo. 336.5 Sox Sox 4 è attualmente lo strumento più importante di conversione di file audio. In linea di massima, Sox è in grado di convertire da un formato a un altro, anche se i passaggi da una frequenza di campionamento a un’altra non danno risultati ottimi; inoltre riesce a introdurre degli effetti interessanti. Meritano attenzione alcuni effetti che Sox permette di introdurre attraverso la rielaborazione digitale del segnale: è possibile estrarre solo una porzione delle frequenze audio; si possono introdurre effetti di eco e di vibrato; è possibile invertire il brano. Una particolarità di Sox è quella di distinguere i formati audio in base all’estensione dei nomi dei file (in quasi tutti i casi). La tabella 336.2 riporta l’elenco di alcuni di questi; per un elenco completo e una descrizione più dettagliata si può consultare la pagina di manuale sox(1). Tabella 336.2. Alcuni dei formati audio gestiti da Sox. Estensione/tipo .8svx .au .dat .smp .voc .wav ossdsp 4 Sox licenza speciale Descrizione Amiga 8SVX. AU della Sun Microsystems. Audio espresso in formato testo. TurtleBeach MediaVision. SoundBlaster VOC. MS-Windows WAV-RIFF. Formato del dispositivo ‘/dev/dsp’. Gestione della scheda audio 3820 336.5.1 $ sox [ ][ ] sox opzioni_generali opzioni_di_formato ,→ file_in_ingresso effetti [ ] file_in_ingresso [opzioni_di_formato ] ←- ‘sox’ è l’eseguibile che svolge tutto il lavoro dell’applicativo Sox. Purtroppo la sintassi è un po’ confusa e lo schema che si vede qui è già una semplificazione di quella completa. In generale è necessaria l’indicazione di un file in ingresso e di uno in uscita. Per stabilire il formato di un file si fa riferimento all’estensione utilizzata nel nome; eventualmente si possono realizzare anche delle pipeline indicando un trattino orizzontale (‘-’) al posto del nome del file corrispondente (in ingresso o in uscita), però in questo caso occorre indicare un’opzione apposita per specificare il formato a cui si fa riferimento. Le opzioni di formato si applicano al file indicato subito dopo; in pratica, quelle che appaiono prima del file in ingresso, si riferiscono a questo, mentre quelle indicate dopo il file in ingresso, riguardano il file in uscita. Gli effetti che Sox è in grado di generare si indicano attraverso delle parole chiave collocate alla fine della riga di comando, dopo l’indicazione del file in uscita. Alcune opzioni generali -V Emette una serie di informazioni sulle fasi del processo di elaborazione. Serve per avere un rapporto chiaro delle trasformazioni che sta applicando Sox. -v volume Permette di cambiare il volume del segnale. Il valore ‘1.0’ rappresenta il livello iniziale: valori inferiori diminuiscono il volume, mentre valori superiori lo aumentano. Alcune opzioni di formato -t tipo_di_file Permette di specificare il formato del file successivo (in ingresso o in uscita), attraverso una stringa che rappresenta l’estensione normale di questo (‘.au’, ‘.wav’, ecc.). -r frequenza_di_campionamento Permette di specificare la frequenza di campionamento del file successivo (in ingresso o in uscita), attraverso l’indicazione di un numero che rappresenta la frequenza in hertz. In generale, è più probabile l’utilizzo di questa opzione in riferimento a un file in uscita. -c n_canali Permette di specificare il numero di canali audio del file successivo (in ingresso o in uscita). Come si può intendere, uno rappresenta un file monofonico, due stereofonico e quattro quadrifonico. Alcune opzioni che rappresentano un effetto band frequenza_centrale ampiezza Applica un filtro passa-banda. Gli argomenti di questa opzione sono valori numerici che si riferiscono a una frequenza in hertz. highp frequenza_filtro Applica un filtro passa-alto a partire dalla frequenza indicata come argomento. In pratica, le frequenze inferiori risulteranno molto attenuate. echo ritardo volume Gestione della scheda audio 3821 Inserisce un effetto eco in cui il ritardo è espresso in secondi e il volume è riferito all’unità, per cui si utilizzano normalmente dei valori inferiori a uno per indicare un’attenuazione relativa. vibro velocità profondità Inserisce un effetto vibrato. La velocità indica la frequenza della vibrazione nel volume del segnale, mentre la profondità indica il volume dell’oscillazione di questo. reverse Inverte il corso del brano. Potrebbe servire in particolare per scoprire dei messaggi nascosti che siano stati introdotti ad arte nel segnale audio. Esempi $ sox prova.wav prova-vibrato.wav vibro 5 0.7 Legge il file ‘prova.wav’ (di tipo WAV, data l’estensione) e lo trasforma nel file ‘prova-vibrato.wav’, mantenendo le stesse caratteristiche riguardo al campionamento, ma aggiungendo un effetto vibrato. $ sox prova.wav prova-eco.wav echo 1 0.7 Legge il file ‘prova.wav’ (di tipo WAV, data l’estensione) e lo trasforma nel file ‘prova-eco.wav’, mantenendo le stesse caratteristiche riguardo al campionamento, ma aggiungendo un effetto eco. $ sox prova.wav prova-1000.wav band 1000 500 Legge il file ‘prova.wav’ (di tipo WAV, data l’estensione) e lo trasforma nel file ‘prova-1000.wav’, mantenendo le stesse caratteristiche riguardo al campionamento, ma filtrando il segnale in modo da selezionare in particolare le frequenze da 750 Hz a 1250 Hz. $ sox prova.wav -t .wav - band 1000 500 > prova-1000.wav Come nell’esempio precedente, ma in questo caso il file in uscita viene ottenuto attraverso lo standard output, per cui occorre specificare il tipo con l’opzione ‘-t’. Non vengono mostrati esempi in cui si cambia il formato dei file audio, perché si tratta di un’operazione delicata e per questo è meglio leggere la documentazione originale. In particolare, non conviene tentare di ridurre la frequenza di campionamento, perché di solito il risultato è pessimo. 336.5.2 $ play, rec play file rec file Sox è accompagnato generalmente da due script: ‘play’ e ‘rec’. Il loro scopo è quello di facilitare l’ascolto e la registrazione, facendo affidamento sulle capacità di Sox di convertire al volo il formato di questi file. Quando non si ha la possibilità di utilizzare un programma più comodo, questa potrebbe essere l’unica risorsa per riuscire a gestire con un minimo di comodità le funzionalità audio. A volte, questi script sono errati, probabilmente per un piccolo errore di sintassi nella scrittura di una struttura di selezione (‘case’). Per semplificare le cose, viene mostrato il contenuto essenziale di questi due script. L’esecuzione di un brano registrato in un file avviene in pratica con un comando come quello seguente: 3822 Gestione della scheda audio sox file_da_eseguire -t ossdsp -w -s /dev/dsp Naturalmente, prima del file potrebbero essere aggiunte altre opzioni, se lo si ritiene opportuno; nello stesso modo si potrebbero aggiungere delle opzioni riferite a effetti da inserire nell’audio, indicandole alla fine del comando. In modo analogo, si può registrare un file: sox -t ossdsp /dev/dsp file_da_registrare Valgono le stesse considerazioni fatte per il caso dell’esecuzione di un brano, in particolare, le opzioni riferite al file che si vuole ottenere vanno messe subito prima di questo file, cioè dopo l’indicazione del dispositivo ‘/dev/dsp’. Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org Capitolo 337 Audio compresso È molto difficile ridurre un file contenente informazioni sonore. In questo contesto, quando si parla di compressione, si fa riferimento a metodi di semplificazione delle informazioni memorizzate, basati sulla percezione umana. Questa «semplificazione» si traduce in pratica in una riduzione e distorsione nei suoni riprodotti. In generale, il formato più comune per i file audio compressi è MP3, ovvero «MPEG-1 layer 3», «MPEG-2 layer 3» o «MPEG-2.5 layer 3». Lo standard MPEG definisce il formato e la decodifica dei dati, mentre non fissa un metodo per la codifica. Sulla codifica sono state sviluppate tecniche differenti, alcune delle quali sono brevettate. A causa di questo problema, lo sviluppo di software libero in grado di generare file MP3 è limitato alla produzione in forma di sorgenti, non potendo in pratica arrivare alla distribuzione di applicativi già compilati. 337.1 Informazioni contenute in un file MP3 Un file MP3 può includere delle informazioni importanti sul suo contenuto, oltre a ciò che è indispensabile per la riproduzione (come per esempio l’informazione sulla frequenza di campionamento). In generale, conviene stabilire questi dati nella fase di codifica del file stesso, mentre una parte di questi può essere modificata anche dopo. Tabella 337.1. Informazioni comuni che possono essere inserite in un file MP3. Informazione originale copyright titolo artista album anno commento traccia genere Tipo booleano booleano testo testo testo testo testo numero numero Significato Indica se il contenuto è originale. Indica se il contenuto è coperto da copyright. Titolo della canzone o di ciò che è contenuto nel file. Nome dell’artista o degli artisti. Nome dell’album di cui fa parte il contenuto del file. Anno di edizione. Commento aggiuntivo. Numero della traccia nel CD a cui si fa riferimento. Genere, definito da un codice numerico prestabilito. Tabella 337.2. Genere, secondo lo standard ID3. Prima parte. Genere 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 Definizione Blues Country Disco Grunge Jazz New Age Other R&B Reggae Techno Alternative Death Metal Soundtrack Ambient Vocal Fusion Classical Acid Genere 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 3823 Definizione Classic Rock Dance Funk Hip-Hop Metal Oldies Pop Rap Rock Industrial Ska Pranks Euro-Techno Trip-Hop Jazz+Funk Trance Instrumental House Audio compresso 3824 Genere 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 Definizione Game Gospel Alt. Rock Soul Space Instrumental Pop Ethnic Darkwave Electronic Eurodance Southern Rock Cult Top 40 Pop/Funk Native American New Wave Rave Trailer Tribal Genere 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 Definizione Sound Clip Noise Bass Punk Meditative Instrumental Rock Gothic Techno-Industrial Pop-Folk Dream Comedy Gangsta Rap Christian Rap Jungle Cabaret Psychedelic Showtunes Lo-Fi Acid Punk Tabella 337.3. Genere, secondo lo standard ID3. Seconda parte. Genere 74 76 78 80 82 84 86 88 90 92 94 96 98 100 102 104 106 108 110 112 114 116 118 120 122 124 126 128 130 132 134 136 138 140 Definizione Acid Jazz Retro Rock & Roll Folk National Folk Fast-Fusion Latin Celtic Avantgarde Progressive Rock Symphonic Rock Big Band Easy Listening Humour Chanson Chamber Music Symphony Primus Satire Club Samba Ballad Rhythmic Soul Duet Drum Solo Euro-House Goa Club-House Terror BritPop Polsk Punk Christian Gangsta Rap Black Metal Contemporary Christian Genere 75 77 79 81 83 85 87 89 91 93 95 97 99 101 103 105 107 109 111 113 115 117 119 121 123 125 127 129 131 133 135 137 139 141 Definizione Polka Musical Hard Rock Folk/Rock Swing Bebob Revival Bluegrass Gothic Rock Psychedelic Rock Slow Rock Chorus Acoustic Speech Opera Sonata Booty Bass Porn Groove Slow Jam Tango Folklore Power Ballad Freestyle Punk Rock A Cappella Dance Hall Drum & Bass Hardcore Indie Negerpunk Beat Heavy Metal Crossover Christian Rock Audio compresso Genere 142 144 146 3825 Definizione Merengue Thrash Metal JPop Genere 143 145 147 Definizione Salsa Anime Synthpop Le informazioni più voluminose, come il titolo e le altre stringhe di testo, vanno aggiunte in coda al file MP3. Il modo in cui questi dati vengono segnalati nel file dipende da standard differenti che nel tempo sono stati aggiornati. In questo senso, alcuni programmi non aggiornati potrebbero anche non essere in grado di leggere ciò che viene scritto con standard più recenti. 337.1.1 MP3info MP3info 1 è un programma molto semplice con lo scopo di estrarre le informazioni tipiche dai file MP3, con la possibilità di modificare i dati descrittivi. Si compone dell’eseguibile ‘mp3info’, che si utilizza secondo la sintassi seguente: mp3info [opzioni] file_mp3 ... Se non si indica alcuna opzione, si ottengono le informazioni sui file in forma stringata. Tuttavia, con l’opzione ‘-F’, o meglio ancora con l’opzione ‘-f’, si può controllare il modo in cui tali informazioni vengono fornite. L’opzione ‘-f’ prevede un argomento composto da una stringa contenente delle sequenze di escape, che si distinguono per il fatto che iniziano con il simbolo di percentuale (‘%’). La tabella 337.4 riporta un elenco parziale di queste sequenze di escape, escludendo in particolare quelle che rappresentano una scelta sottoposta a una condizione. Per il loro approfondimento è sufficiente leggere la poca documentazione originale. Con alcune shell, questi simboli di percentuale potrebbero essere interpretati in modo diverso, come nel caso di Midnight Commander. Tabella 337.4. Alcune sequenze di escape utilizzabili come argomento dell’opzione ‘-f’. Stringa %% %t %a %l %y %c %g %# %v %V %L %A %C %b %F %M %O %o 1 MP3info GNU GPL Effetto ‘%’ Titolo Artista Album Anno Commento Genere in forma testuale Genere in forma numerica Versione MPEG in forma numerica Versione MPEG in forma testuale Strato MPEG (layer) in numero romano Strato MPEG (layer) in numero arabo Protezione dagli errori (restituisce zero o uno) Quantità di bit utilizzati al secondo Frequenza di campionamento Modalità: mono, stereo, ecc. Copyright (restituisce zero o uno) Originale (restituisce zero o uno) Audio compresso 3826 Stringa %m %s %S %N %f %B %i Effetto Lunghezza espressa in minuti Lunghezza rimanente in secondi Lunghezza complessiva in secondi Interruzione di riga Nome del file, come indicato nella riga di comando Nome del file senza percorso Dimensione del file in byte Per comprendere meglio il significato di tutto questo, l’esempio seguente consente di estrarre esattamente il nome dell’artista e il titolo della canzone (o di qualunque altra cosa si tratti), ponendo le due informazioni su righe differenti: $ mp3info -f "%a%N%t" prova.mp3[ Invio ] Bla bla bla bla Pinco Pallino Volendo si potrebbe realizzare uno script per visualizzare tutto quello che c’è da sapere nel file, come nell’esempio seguente, in cui si può fare riferimento a un solo file alla volta: #!/bin/sh mp3info mp3info mp3info mp3info mp3info mp3info mp3info mp3info mp3info mp3info mp3info mp3info mp3info mp3info mp3info mp3info -f -f -f -f -f -f -f -f -f -f -f -f -f -f -f -f "file: "dimensione: "formato: "CRC: "bitrate: "campionamento: "modalità: "durata: "copyright: "originale: "titolo: "artista: "album: "anno: "annotazioni: "genere: %f" %i" %V layer %L" %C" %b Kibit/s" %F Hz" %M" %m:%s" %O" %o" %t" %a" %l" %y" %c" %# %g" $1 $1 $1 $1 $1 $1 $1 $1 $1 $1 $1 $1 $1 $1 $1 $1 MP3info consente anche la modifica di alcune di queste informazioni, ma ciò avviene attraverso opzioni apposite e le sequenze di escape dell’opzione ‘-f’ non hanno alcun ruolo in questo contesto. Alcune opzioni -f stringa_di_formato Mostra le informazioni secondo la stringa di formato indicata come argomento. Si utilizzano le sequenze di escape della tabella 337.4. -F n Mostra le informazioni secondo un formato prestabilito, rappresentato da un numero intero positivo. Basta provare per rendersi conto di come possono essere rappresentate le informazioni in questo modo. Si tratta evidentemente di una semplificazione per chi non vuole usare l’opzione ‘-f’. -w Richiede espressamente la scrittura di informazioni aggiornate. In generale non serve indicare espressamente questa opzione, perché viene richiamata automaticamente in presenza di opzioni che implicano la modifica di qualche informazione. Audio compresso 3827 -W Cancella le informazioni descrittive (titolo, artista, ecc.) contenute nel file. -t titolo Imposta il titolo. L’uso di questa opzione implica automaticamente la scrittura, senza bisogno di specificare l’opzione ‘-w’. -a artista Imposta l’artista. L’uso di questa opzione implica automaticamente la scrittura, senza bisogno di specificare l’opzione ‘-w’. -l album Imposta l’album. L’uso di questa opzione implica automaticamente la scrittura, senza bisogno di specificare l’opzione ‘-w’. -y anno Imposta l’anno. L’uso di questa opzione implica automaticamente la scrittura, senza bisogno di specificare l’opzione ‘-w’. -c commento Imposta il commento. L’uso di questa opzione implica automaticamente la scrittura, senza bisogno di specificare l’opzione ‘-w’. -g n | -G genere_testuale Imposta il genere, in forma di numero o in modo testuale. L’uso di questa opzione implica automaticamente la scrittura, senza bisogno di specificare l’opzione ‘-w’. Si osservi che l’impostazione del genere in forma testuale deve avvenire usando la definizione prevista. [] -p n Elenca i generi in ordine numerico, utilizzando n colonne. Esempi Sono già stati mostrati degli esempi riferiti all’uso dell’opzione ‘-f’, che qui non viene riproposta. $ mp3info -t "Bla bla bla" -a "Pinco Pallino" -y "2001" ←,→-g 112 prova.mp3 Imposta il titolo, l’artista, l’anno e il genere (tango) nel file ‘prova.mp3’. $ mp3info -p1 Mostra l’elenco dei generi in una sola colonna, secondo l’ordine numerico attribuito dallo standard. 337.2 LAME LAME 2 è un progetto per la codifica in formato MP3 ed eventualmente anche in altri formati audio compressi. Il progetto produce esclusivamente del codice sorgente (compilabile facilmente) perché la distribuzione di pacchetti già compilati viene impedita di fatto dalla presenza di vari brevetti. In un sistema GNU/Linux la compilazione di LAME avviene in modo molto semplice. Supponendo di disporre del file ‘lame.tar.gz’ e di volere installare i file a partire da ‘/opt/lame/’, si potrebbe procedere nel modo seguente: 2 LAME GNU LGPL Audio compresso 3828 $ tar xzvf lame.tar.gz $ cd lame $ ./configure --prefix=/opt/lame $ make $ su # make install Naturalmente, occorre poi preoccuparsi di inserire il percorso ‘/opt/lame/bin/’ nella variabile di ambiente ‘PATH’. Si veda eventualmente quanto descritto nel capitolo 20. Al termine della compilazione si ottiene l’eseguibile ‘lame’, che può essere utilizzato secondo la sintassi seguente: lame [opzioni] file_in_ingresso file_in_uscita In pratica, il primo argomento dopo le opzioni indica un file, solitamente in formato WAV-RIFF (salvo la specificazione di qualcosa di differente), mentre il secondo è il file MP3 che si vuole generare. Naturalmente, se si utilizza il carattere ‘-’ al posto del nome dei file, si fa riferimento allo standard input e allo standard output rispettivamente. Alcune opzioni -r Il file in ingresso è di tipo PCM grezzo. -x Forza lo scambio dei byte in ingresso. -s frequenza_di_campionamento Definisce la frequenza di campionamento in ingresso, espressa in kilohertz. Il valore predefinito è di 44,1 kHz, che si esprime come ‘44.1’. --mp1input Indica che il file in ingreso è di tipo «MPEG layer I». --mp2input Indica che il file in ingreso è di tipo «MPEG layer II». --mp3input Indica che il file in ingreso è di tipo «MPEG layer III». --ogginput Indica che il file in ingreso è di tipo «Ogg Vorbis». -m modalità Consente di specificare la modalità di registrazione, attraverso l’indicazione di una lettera. Quelle fondamentali sono: • ‘s’ stereo; • ‘j’ stereo congiunto (predefinito); • ‘m’ mono; Audio compresso 3829 Le modalità di registrazione effettivamente disponibili dipendono anche dal tipo di codifica usato. -a Mescola i canali del file in ingresso per generare un file monofonico. --decode Decodifica un file MP3 generando un file WAV-RIFF. In questo modo, il primo file indicato nella riga di comando deve essere in formato MP3, mentre ciò che si genera è un file WAV-RIFF. -h Utilizza una compressione lenta dove la qualità è preservata. -f Utilizza una compressione rapida dove la qualità dovrebbe essere sufficiente. -c Attiva l’indicatore relativo al copyright. -o Indica come non originale. -p Aggiunge 16 bit di controllo alla fine di ogni frame. -tt titolo Aggiunge il titolo. -ta artista Aggiunge l’indicazione dell’artista o degli artisti. -tl album Aggiunge il titolo dell’album a cui appartiene il contenuto del file. -ty anno Aggiunge l’anno. -tc commento Aggiunge un commento libero. -tn n Specifica il numero di traccia del CD originale, con un numero che va da 1 a 255. -tg genere Specifica il genere, espresso per nome o attraverso un numero. --genre-list Elenca i generi secondo lo standard ID3. Da questo elenco si può trarre il numero da usare con l’opzione ‘-tg n ’. Esempi $ lame -h prova.wav prova.mp3 L’esempio mostra la situazione più comune di utilizzo, in cui si specifica l’opzione ‘-h’ per ottenere un buon risultato. In pratica, si ottiene il file ‘prova.mp3’ a partire da ‘prova.wav’. Si intende che il file ‘prova.wav’ sia di tipo WAV-RIFF, 16 bit, stereo, 44100 Hz. $ lame -h -p prova.wav prova.mp3 Audio compresso 3830 Come nell’esempio precedente, ottenendo però un file un po’ più lungo, per l’aggiunta di un codice di controllo alla fine di ogni frame. $ lame -h -p -c prova.wav prova.mp3 Come nell’esempio precedente, con l’attivazione dell’indicatore del copyright. $ lame -h -p -c -tg 101 ←,→-tt "Conferenza sul software libero" -ta "Pinco Pallino" ←,→-ty "2001" prova.wav prova.mp3 Come nell’esempio precedente, con l’aggiunta di altre informazioni utili. Si osservi l’uso del genere 101. $ lame --decode prova.mp3 prova.wav Riproduce il file ‘prova.wav’, completo di intestazione, a partire dal file ‘prova.mp3’. 337.3 MP3blaster MP3blaster 3 è un programma interattivo per l’esecuzione di file audio (inizialmente solo per file MP3). Se viene avviato senza argomenti, si ottiene il pannello di controllo che si vede nella figura 337.1. Figura 337.1. Pannello principale di MP3blaster. .------------------------------------------------------------------------------. |F 1: Select files | 01:Default | -| |F 2: Add group |---------------------------------------------------|--| |F 3: Delete group | |01| |F 4: Set group’s title | | | |F 5: load/add playlist | | | |F 6: Write playlist | | | |F 7: Toggle group mode | | | |F 8: Toggle play mode | | | |F 9: Play list | | | |F10: Change #threads | | | | | | | | | | | |Current group’s mode: | | | |Play in normal order | | | | | | | |Current play-mode: | | | |Play all groups in | | | |normal order | | | | | | | |Threads: 100 | | | |------------------------------------------------------------------------------| |Press ’?’ to get a screen with key functions. +| ‘------------------------------------------------------------------------------’ In condizioni normali, durante l’esecuzione di un brano viene messo a disposizione un mixer, come si vede nella figura 337.1, tenendo conto che sono a disposizione anche i controlli di volume delle linee del mixer che non si vedono; queste appaiono eventualmente scorrendo con i tasti [ freccia su ] e [ freccia giù ]. I comandi a disposizione durante la modalità di esecuzione di un brano sono elencati brevemente nella tabella 337.5, mentre gli altri comandi per l’uso interattivo non vengono mostrati. 3 MP3blaster GNU GPL Audio compresso 3831 Figura 337.2. Esecuzione di un brano con la funzionalità di mixer attiva. .-----------------------------------|01.mp3|-----------------------------------. | Mpeg-1 layer 3 at 44100hz, 128 kb/s (stereo) | | ### 00:13/03:31(-03:18) | | Songname: 01.mp3 Year : | | Artist : Genre : | | Album : | | Info : | | | | Vol | | [##################################################] L | | [##################################################] R | | Pcm | | [######################################## ] L | | [######################################## ] R | | Spkr | | [###################################### ] L | | [###################################### ] R | | | | | | |< << |> >> >| || [] | | 1 2 3 4 5 6 7 | |------------------------------------------------------------------------------| | MP3Blaster V2.0b16 (press ’q’ to return to Playlist Editor) | ‘------------------------------------------------------------------------------’ Tabella 337.5. Comandi utili in fase di esecuzione dei brani. Tasto freccia su freccia giù freccia sinistra freccia destra 1 2 3 4 5 6 7 q Effetto Seleziona la linea del mixer precedente. Seleziona la linea del mixer successiva. Abbassa il volume della linea selezionata. Alza il volume della linea selezionata. Salta al brano precedente. Torna indietro nel brano in corso di esecuzione. Avvia l’esecuzione del brano corrente. Avanza nel brano in corso di esecuzione. Salta al brano successivo. Pausa. Stop. Conclude la modalità di esecuzione. 337.3.1 Avvio e riga di comando MP3blaster si avvia attraverso l’eseguibile ‘mp3blaster’, con o senza argomenti: mp3blaster [opzioni] [file]... In generale, se alla fine della riga di comando vengono indicati dei file, viene avviata la loro esecuzione; altrimenti si ottiene generalmente il pannello iniziale del programma, dal quale si possono selezionare le funzioni desiderate. Alcune opzioni --nomixer | -n Disabilita la gestione del mixer in fase di esecuzione dei brani. {||||||||| } --runframes= 1 2 3 4 5 6 7 8 9 10 {||||||||| } -r= 1 2 3 4 5 6 7 8 9 10 Audio compresso 3832 Permette di definire la quantità di frame che devono essere decodificati per ogni ciclo. Ciò permette di regolare l’esecuzione in base alle capacità di elaborazione disponibili. In generale, i valori più alti migliorano le prestazioni con microprocessori più lenti. Il valore predefinito per questa opzione è cinque. --sound-device=file | -s=file In generale, il programma dovrebbe essere già predisposto per utilizzare il file di dispositivo giusto per accedere all’interfaccia audio. Tuttavia, in caso di necessità può essere definito attraverso questa opzione. Nei sistemi GNU/Linux si tratta normalmente di ‘/dev/dsp’. Esempi $ mp3blaster Avvia MP3blaster in modalità interattiva. $ mp3blaster brani/01.mp3 Avvia MP3blaster per l’esecuzione del file ‘brani/01.mp3’. Al termine conclude il suo funzionamento. $ mp3blaster brani/*.mp3 Avvia MP3blaster per l’esecuzione di tutti i file MP3 contenuti nella directory ‘brani/’. Al termine conclude il suo funzionamento. 337.4 Xmms Xmms, 4 ovvero X multimedia system, è un lettore multimediale grafico, per i formati audio più comuni. Avviandolo per la prima volta, attraverso l’eseguibile ‘xmms’, si ottiene il pannello di controllo che si vede nella figura 337.3. Figura 337.3. Pannello principale di Xmms al primo avvio. Oltre al pannello principale è possibile visualizzare il mixer e l’elenco dei brani pronti per l’esecuzione (playlist), come si vede nella figura 337.4, dove si vede anche l’esecuzione di un brano di musica. 4 Xmms GNU GPL Audio compresso 3833 Figura 337.4. Pannello completo di Xmms. I brani da eseguire possono essere indicati attraverso l’interazione con il pannello, utilizzando il menù che si ottiene facendo un clic con il tasto destro del mouse, oppure indicandoli nella riga di comando. Per esempio: $ xmms *.mp3 In tal caso, come si intuisce, si caricano tutti i file con estensione ‘.mp3’ della directory corrente. La prima volta che si avvia, Xmms crea la directory ‘~/.xmms/’, in cui si collocano i file di configurazione. Questa configurazione memorizza anche l’ultimo elenco di brani selezionati, consentendo il riavvio successivo di Xmms con il recupero degli stessi dati. Xmms richiede l’interfaccia grafica X per funzionare; tuttavia, una volta avviato è possibile controllarlo attraverso altre istanze del comando ‘xmms’, con delle opzioni apposite. Per esempio, • $ xmms -u mette in pausa l’esecuzione in corso, oppure la fa riprendere; • $ xmms -e *.mp3 aggiunge altri brani all’elenco attuale; • $ xmms -p fa partire l’esecuzione dell’elenco di brani attuale; • $ xmms -s ferma l’esecuzione. Dal pannello grafico, così come è possibile far apparire il mixer e l’elenco dei brani, è possibile fare anche sparire tutti i pannelli. In tal senso, la possibilità di controllare l’esecuzione attraverso i comandi del tipo mostrato, diventa molto conveniente. Eventualmente, per far riemergere il pannello principale si può usare il comando: $ xmms -m Audio compresso 3834 337.5 FreeAmp FreeAmp, 5 è un programma grafico per l’esecuzione di file audio MP3. All’avvio si presenta come si vede nella figura 337.5. Figura 337.5. Pannello frontale di FreeAmp. L’eseguibile che compie il lavoro è ‘freeamp’ che può ricevere eventualmente come argomento il nome di un file MP3 da eseguire immediatamente: freeamp [file_mp3] Dal pannello frontale è possibile regolare facilmente il volume della linea di amplificazione; inoltre è possibile spostare la posizione dell’esecuzione (il punto di inizio). Attraverso il pulsante grafico M Y M U S I C si accede a una finestra simile a quella che si vede nella figura 337.6, che ha lo scopo di consentire un accesso facilitato ai file nel proprio disco fisso. Figura 337.6. Gestore di file MP3 incorporato in FreeAmp. Tra le tante funzionalità di FreeAmp esiste anche la possibilità di modificare facilmente le informazioni ID3 dei file MP3. Per modificare i dati di un file, basta selezionarlo nell’ambito della finestra a cui si accede con il pulsante grafico M Y M U S I C , selezionando da lì il pulsante E D I T . Si ottiene una maschera simile a quella che si vede nella figura 337.7. 5 FreeAmp GNU GPL Audio compresso 3835 Figura 337.7. Modifica delle informazioni ID3. FreeAmp è anche in grado di collegarsi a un flusso di dati MP3 fornito attraverso il protocollo HTTP, ovvero uno stream HTTP, come quello generato da Icecast, descritto nella sezione 338.2. Per un collegamento del genere, basta avviare l’eseguibile ‘freeamp’ indicando l’URI corretto, come nell’esempio seguente: $ freeamp http://dinkel.brot.dg:8000 Come si vede dal comando, pur trattandosi del protocollo HTTP, si utilizza solitamente una porta differente da quella standard. La figura 337.8 mostra in che modo appare FreeAmp quando si collega a un flusso HTTP. Figura 337.8. Pannello frontale di FreeAmp collegato a un flusso HTTP. 337.6 Riferimenti • Eric Scheirer, Frequently Asked Questions: MPEG, Patents, and Audio Coding, 1998 <http://sound.media.mit.edu/~eds/mpeg-patents-faq> • The LAME project <http://www.mp3dev.org/mp3/> • Martin Nilsson, ID3 tag version 2, 1998 <http://www.id3.org/id3v2-00.txt> • Phill Kerr, The Linux MP3-HOWTO <http://www.linux.org/docs/ldp/howto/HOWTO-INDEX/howtos.html> 3836 Audio compresso Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org Capitolo 338 Audio attraverso la rete Ci sono tanti modi di gestire l’audio attraverso la rete. La tecnica più semplice, anche se non è necessariamente la più efficace, consiste nella realizzazione di una connessione TCP normale dove ogni nodo intrattiene una sessione indipendente. Si intende il limite di questo nel fatto che ogni utente che si collega aggiunge del carico alla rete. In pratica, questo approccio può andare bene solo in reti locali poco popolate, oppure con particolari doti di velocità. Figura 338.1. Idea generale del funzionamento di un sistema di diffusione di audio attraverso la rete, per mezzo di un servente con funzione di ripetitore. .--------------. .-------------. | Servente |----------->| Cliente per | .----->| ripetitore |------. | l’ascolto | | ‘--------------’ | ‘-------------’ | | V | | .-------------. .--------------. | | Cliente per | | Cliente di | | | l’ascolto | | trasmissione | | ‘-------------’ ‘--------------’ V .-------------. | Cliente per | | l’ascolto | ‘-------------’ 338.1 NetStreamer Lo schema di funzionamento di NetStreamer 1 si basa su un demone, ‘NrServer’, che comunque deve essere avviato esplicitamente sullo sfondo, il quale svolge il ruolo di ripetitore nei confronti di uno o più clienti di trasmissione. Successivamente, gli utenti che vogliono collegarsi al ripetitore per ascoltare ciò che viene trasmesso, utilizzano altri clienti specifici per la ricezione. Come accennato le connessioni sono di tipo TCP e di solito si utilizza la porta 8888. Un solo servente NetStreamer può gestire più sorgenti audio (provenienti da altrettanti clienti per la trasmissione), per cui i clienti hanno la possibilità di scegliere su quale trasmissione «sintonizzarsi». In base a questo principio, NetStreamer simula la gestione di una stazione radio UHF che opera sulle frequenze tra 88 MHz e 108 MHz: i clienti di trasmissione, quando si collegano definiscono il nome della propria «stazione radio» e la «frequenza», rappresentando questa ultima attraverso un valore che esprime decimi di megahertz; i clienti per la ricezione si sintonizzano utilizzando come riferimento il valore della frequenza utilizzata dalle stazioni di trasmissione. È importante osservare che la ricezione delle trasmissioni attraverso diversi clienti di ricezione, non può essere sincronizzata. Ciò accade a causa dell’esigenza di accumulare una memoria tampone necessaria a garantire la continuità nel flusso della riproduzione audio. 338.1.1 Attivazione di un ripetitore Il ripetitore è quindi il servente di NetStreamer. Nella stessa rete possono essere predisposti diversi serventi indipendenti, anche se questo non dovrebbe essere di alcuna utilità. Tutto si limita all’avvio di ‘NrServer’ con l’indicazione della porta TCP da utilizzare per le comunicazioni: # NrServer :8888 & 1 NetStreamer GNU GPL 3837 3838 Audio attraverso la rete In alternativa, è possibile indicare anche il nome del nodo, per uniformità con la notazione utilizzata dai clienti: # NrServer localhost:8888 & Si osservi il fatto che ‘NrServer’ deve essere messo esplicitamente in funzione sullo sfondo. 338.1.1.1 Attivazione di una trasmittente Il cliente che trasmette al ripetitore può essere collocato indipendentemente nello stesso elaboratore del ripetitore o in un altro nodo. Naturalmente, collocandolo nello stesso elaboratore si evita di intasare ulteriormente la rete locale con questa connessione. Si tratta di utilizzare ‘NrTransmitter’, il quale deve avere una fonte di audio digitale, indicando in particolare il nodo del ripetitore, la porta di comunicazione, il nome della stazione radio virtuale e la frequenza virtuale di trasmissione. Si distinguono tre situazioni importanti in funzione del modo in cui viene fornita l’informazione audio digitale al programma ‘NrTransmitter’: i file di dispositivo standard, lo standard input o una serie di file di registrazioni precedenti, realizzati sempre con NetStreamer. 338.1.1.2 Audio digitale proveniente dai dispositivi standard Quando si dispone di una scheda audio, quello che questa è in grado di catturare, ovvero il canale audio indicato per la registrazione, può essere letto dai soliti file di dispositivo già mostrati più volte. Per fare in modo che un cliente di trasmissione NetStreamer prenda questa fonte, si utilizza la sintassi seguente: NrTransmitter Device campionamento frequenza_virtuale nome_stazione [host]:porta La parola chiave ‘Device’ posta come primo argomento serve proprio a specificare questo comportamento del cliente di trasmissione. La frequenza di campionamento è un numero che si riferisce a kilohertz e comunque può essere scelto solo tra 8 e 16. La frequenza virtuale è un numero che esprime i decimi di megahertz a cui si vuole simulare la trasmissione radio. A titolo di esempio, volendo trasmettere quello che viene dalla scheda audio con un campionamento di 16 kHz utilizzando la frequenza virtuale di 88,5 MHz per la stazione radio denominata «Stazione 1», che utilizza il ripetitore dinkel.brot.dg alla solita porta 8888, si può utilizzare il comando seguente: $ NrTransmitter Device 16 885 "Stazione 1" dinkel.brot.dg:8888 & In alternativa, se il ripetitore si trova nello stesso elaboratore, si poteva fare riferimento al nodo localhost, abbreviando eventualmente nel modo seguente: $ NrTransmitter Device 16 885 "Stazione 1" :8888 & 338.1.1.3 Audio digitale proveniente dallo standard input Quando l’audio viene fornito a ‘NrTransmitter’ attraverso lo standard input, questo deve essere in un formato PCM, ovvero senza intestazione particolare, praticamente quello che genera ‘MP3blaster’, solo che per il momento ‘MP3blaster’ non può emetterlo in questo modo: mp3blaster --sound-device=file_temporaneo file_mp3 Audio attraverso la rete 3839 Successivamente: cat file_temporaneo | NrTransmitter StdIn campionamento frequenza_virtuale nome_stazione ,→ host :porta campionamento_in_ingresso [ ] ←- Rispetto alla sintassi vista per l’utilizzo dei dispositivi standard, in questo caso il primo argomento è la parola chiave ‘StdIn’, aggiungendo in coda un numero corrispondente alla frequenza di campionamento con cui arrivano i dati in ingresso. L’esempio dei comandi seguenti mostra l’utilizzo di una pipe con nome per ricreare un flusso continuo. $ mkfifo /tmp/musica $ mp3blaster --sound-device=/tmp/musica In un altro terminale o console virtuale: $ cat /tmp/musica | NrTransmitter StdIn 16 885 "Stazione 1" ←,→dinkel.brot.dg:8888 44 & oppure, se la trasmissione avviene nello stesso nodo locale: $ cat /tmp/musica | NrTransmitter StdIn 16 885 "Stazione 1" :8888 44 & 338.1.2 Audio digitale contenuto all’interno di «nastri» Attraverso NetStreamer è possibile registrare dei file con un formato audio digitale speciale, che nella logica di questo applicativo sono dei nastri, esattamente come si farebbe in una stazione radio. Verrà mostrato in seguito come realizzare tali file; per il momento si tenga presente che devono avere l’estensione ‘.tape’. NrTransmitter Directory campionamento frequenza_virtuale nome_stazione ,→ host :porta directory_dei_nastri [ ] ←- Rispetto a quanto visto in precedenza, si osserva che il primo argomento è la parola chiave ‘Directory’ e in coda si nota l’indicazione di una directory all’interno della quale ‘NrTransmitter’ va a cercare i file che terminano con l’estensione ‘.tape’. Questi file vengono scelti con una sequenza casuale e trasmessi in continuazione. Vengono riproposti i due esempi già visti in precedenza; in particolare, si fa riferimento ai file contenuti probabilmente in un disco montato per l’occasione: ‘/mnt/musica’. $ NrTransmitter Directory 16 885 "Stazione 1" dinkel.brot.dg:8888 ←,→/mnt/musica & $ NrTransmitter Directory 16 885 "Stazione 1" :8888 /mnt/musica & 338.1.3 Ricezione di una stazione radio virtuale La ricezione è un procedimento più semplice; tutto quello che serve è indicare la frequenza virtuale e il ripetitore a cui ci si vuole collegare: NrReceiver frequenza_virtuale [host]:porta Il risultato viene passato ai file di dispositivo per l’input dell’audio digitale. Per esempio, per ascoltare la trasmissione proveniente dal ripetitore collocato nel nodo dinkel.brot.dg (alla solita porta) alla frequenza virtuale di 88,5 MHz, si può usare il comando seguente: $ NrReceiver 885 dinkel.brot.dg:8888 Audio attraverso la rete 3840 In alternativa a ‘NrReceiver’ si può utilizzare ‘NrRecFrontend’ che, come suggerisce il nome, è un programma frontale per X. In tal caso si indica solo il ripetitore a cui collegarsi, perché la frequenza è specificata attraverso il pannello di questo programma. NrRecFrontend [host]:porta La figura 338.2 mostra come si può presentare ‘NrRecFrontend’ quando è collegato alla stazione radio virtuale vista tante volte in questi esempi. Figura 338.2. Pannello frontale del ricevitore di NetStreamer. Come si può osservare, appare anche il pulsante R E C O R D . Questo permette di iniziare una registrazione in un file ‘.tape’ di NetStreamer. Per la precisione, si registra la trasmissione nel file ‘~/default.tape’. Questo file può essere poi rinominato e utilizzato per le trasmissioni. 338.1.4 Creazione di nastri Oltre alla possibilità di registrare dei file ‘.tape’ per NetStreamer attraverso il pannello di un ricevitore ‘NrRecFrontend’, si può usare il programma ‘NrEncoder’ che è in grado di generare tali file a partire da un formato PCM. NrEncoder campionamento_in_ingresso campionamento_in_uscita Lo schema sintattico mostra che gli unici argomenti sono il campionamento in ingresso e quello in uscita espressi in kilohertz. L’input viene fornito attraverso lo standard input e l’output si ottiene dallo standard output. Per esempio, con l’aiuto di ‘mp3blaster’ si può convertire un file MP3 in due passaggi: $ mp3blaster --sound-device=/tmp/musica mio_file.mp3 $ cat /tmp/musica | NrEncoder 44 16 > mio_file.tape Il formato di questi file di NetStreamer è precisamente: CCITT ADPCM. Audio attraverso la rete 3841 338.2 Icecast Icecast 2 è un sistema di trasmissione di audio digitale MP3 attraverso il protocollo HTTP. Il meccanismo di funzionamento è quello a cui si accenna all’inizio del capitolo, con la particolarità di presentare il flusso digitale come fa il protocollo HTTP, iniziando con l’intestazione seguente, seguita poi dalla codifica MP3: HTTP/1.0 200 OK Server: icecast/1.0.0 Content-type: audio/mpeg Icecast si compone di un servente, corrispondente all’eseguibile ‘icecast’ e di un programma cliente per la trasmissione al servente, ovvero al ripetitore, dei file MP3 che altri clienti possono poi ricevere e riprodurre. Il servente ‘icecast’ non richiede file di configurazione, dal momento che tutte le informazioni necessarie per il suo funzionamento vengono fornite attraverso la riga di comando; tuttavia, le distribuzioni GNU/Linux possono organizzare il pacchetto in modo da avviare il servizio nell’ambito della procedura di inizializzazione del sistema, dove lo script di avvio potrebbe leggere un file di configurazione con le informazioni necessarie a comporre il comando completo di avvio di ‘icecast’. icecast [opzioni] A titolo di esempio si può vedere come potrebbe essere strutturato, in modo elementare, lo script per l’avvio del servizio Icecast: #!/bin/sh # # init.d/icecast {start|stop|restart} # # Importazione della configurazione di Icecast . /etc/defaults/icecast # Analisi dell’argomento usato nella chiamata. case "$1" in start) echo -n "Avvio del servizio Icecast: " /usr/sbin/icecast $OPZIONI & echo ;; stop) echo -n "Disattivazione del servizio Icecast: " killall icecast echo ;; *) echo "Utilizzo: pippo {start|stop}" exit 1 esac exit 0 Si può osservare che lo script importa inizialmente il file ‘/etc/defaults/icecast’, nel quale evidentemente viene dichiarata la variabile di ambiente ‘OPZIONI’. Per esempio, sempre semplificando al massimo, questo file esterno potrebbe essere strutturato nel modo seguente, con l’unico scopo di stabilire una parola d’ordine per l’invio di un flusso audio da ritrasmettere: PASSWORD=ciao OPZIONI="-p $PASSWORD" 2 Icecast GNU GPL Audio attraverso la rete 3842 Il servente di Icecast utilizza in modo predefinito delle porte TCP per ricevere e inviare il flusso audio MP3. La porta 8000 viene utilizzata normalmente per concedere l’accesso ai programmi cliente, la porta 8001 viene utilizzata per ricevere il flusso audio da ritrasmettere ed eventualmente la porta 8002 serve per l’amministrazione remota del servente. Si osservi il fatto che un servente di Icecast potrebbe essere utilizzato anche da un utente comune, tanto più in considerazione dell’utilizzo normale di porte non privilegiate per il suo funzionamento. In tal caso, evidentemente, non si farebbe uso di script della procedura di inizializzazione del sistema. L’esempio mostrato anticipa l’uso dell’opzione ‘-p’, con la quale si stabilisce una parola d’ordine. Ciò permette di evitare che un cliente non autorizzato possa utilizzare il servente per trasmettere un flusso audio. Le opzioni principali per l’utilizzo di ‘icecast’ sono riepilogate brevemente nella tabella 338.1. Tabella 338.1. Opzioni principali di ‘icecast’. Opzione -P n -E n -A n -m n -p stringa Descrizione Porta TCP per le connessioni dei clienti in ascolto. Porta TCP per le connessioni dei clienti di trasmissione. Porta TCP per le connessioni dei clienti di amministrazione remota. Numero massimo di clienti a cui è consentito l’accesso. Parola d’ordine. 338.2.1 Trasmissione al ripetitore Icecast offre il programma ‘shout’ per la trasmissione al servente del flusso audio MP3: shout host [opzioni] [file_mp3]... In condizioni normali, è più che sufficiente l’indicazione dell’indirizzo o del nome del nodo in cui si trova il servente da contattare per la trasmissione, assieme all’elenco di file MP3 da trasmettere. Spesso è necessario aggiungere una parola d’ordine per accedere al servente e questo si ottiene con l’opzione ‘-P’. La tabella 338.2 riepiloga alcune opzione di uso comune. Tabella 338.2. Opzioni principali di ‘shout’. Opzione -P stringa -e n -l -p file_elenco -r Descrizione Parola d’ordine da trasmettere al servente. Accede al servente attraverso la porta indicata. Continua la trasmissione all’infinito. Indica i file da trasmettere attraverso l’elenco contenuto nel file. Sequenza casuale nella trasmissione dei file audio. $ shout dinkel.brot.dg -P ciao *.mp3 L’esempio precedente fa sì che vengano trasmessi i file corrispondenti al modello ‘*.mp3’ al servente dinkel.brot.dg, fornendo la parola d’ordine «ciao», utilizzando la porta TCP predefinita (8001). $ shout dinkel.brot.dg -P ciao -p elenco Questo secondo esempio è simile al precedente, con la differenza che i file MP3 non vengono elencati nella riga di comando, ma sono forniti in un elenco contenuto nel file di testo ‘elenco’. Audio attraverso la rete 3843 $ shout dinkel.brot.dg -P ciao -r -l -p elenco Questo ultimo esempio aggiunge l’uso delle opzioni ‘-r’ e ‘-l’, con le quali si ottiene rispettivamente una sequenza casuale nell’ordine dei file audio trasmessi e una trasmissione senza fine. 338.2.2 Ricezione del flusso audio digitale Il sistema usato da Icecast per trasmettere audio digitale MP3 attraverso il protocollo HTTP è uno standard diffuso, per cui sono diversi i programmi per l’esecuzione di file MP3 che sono anche in grado di collegarsi a un flusso di questo tipo. In particolare è disponibile FreeAmp, che per accedere a un servente Icecast si utilizza semplicemente così: freeamp http://host :porta Per esempio, $ freeamp http://dinkel.brot.dg:8000 fa sì che FreeAmp si colleghi al nodo dinkel.brot.dg, alla porta 8000 in attesa di un flusso MP3. Icecast offre anche un programma cliente abbastanza spartano, che si limita a emettere il flusso ottenuto attraverso lo standard output. Si tratta di ‘listen’: listen host porta [proxy ] porta La sintassi del programma è essenziale; in particolare si può osservare il vantaggio dato dall’uso del protocollo HTTP, che in questo modo consente di utilizzare anche un proxy se ciò è necessario per raggiungere la rete esterna. Da solo, ‘listen’ serve a poco, perché non fa altro che ricevere il flusso MP3 emettendolo attraverso lo standard output; tuttavia può essere utile per verificare il funzionamento del servizio di Icecast. Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org Capitolo 339 Filmato digitale La gestione di filmati avviene generalmente utilizzando il formato MPEG. Per la riproduzione di questi file, sono disponibili due librerie: MPEG Library 1 e SMPEG, 2 nota anche con il nome esteso SDL MPEG. MPEG sta per Moving picture experts group e rappresenta uno standard per la rappresentazione di immagini, filmati e audio. Gli standard per i filmati sono fondamentalmente due: MPEG-1 e MPEG-2. Il primo è quello più comune, mentre il secondo riguarda prevalentemente i dischi DVD (Digital versatile disk). L’informazione audio utilizza i formati MP2 e MP3 (MPEG audio layer 2 e 3). Normalmente, l’estensione di un file contenente un filmato MPEG è ‘.mpg’. In generale, il software disponibile consente di visualizzare il formato MPEG-1 con audio MP2 o MP3. 339.1 GTV GTV 3 è un programma molto semplice, per il sistema grafico X, che si avvale della libreria SDL MPEG. Si compone dell’eseguibile ‘gtv’ e si utilizza senza opzioni nella riga di comando, con la possibilità di indicare un solo file MPEG. All’avvio si presenta come si vede nella figura 339.1. Figura 339.1. Pannello di controllo di GTV, dopo aver aperto e avviato il file ‘/tmp/ prova.mpg’. Si può osservare la disponibilità di una visualizzazione al doppio della dimensione normale, attraverso il bottone D O U B L E , così come la possibilità di eseguire il file in modo continuo con il bottone L O O P . Dalla figura si può vedere che il bottone A U D I O non è disponibile, perché il file in questione non incorpora audio; lo scopo del bottone è proprio quello di abilitare, quando disponibile, l’ascolto dell’audio. 339.2 PlayMPEG PlayMPEG 4 è un altro programma per l’esecuzione di file MPEG, per il sistema grafico X, che utilizza la libreria SDL MPEG. Si compone dell’eseguibile ‘plaympeg’ e si utilizza soltanto attraverso la riga di comando. Al momento, PlayMPEG non offre alcuna possibilità di controllo durante l’esecuzione dei brani; tuttavia è almeno possibile indicare una sequenza di file che poi viene visualizzato in modo continuo. plaympeg [opzioni] file_mpeg ... 1 MPEG Library software libero con licenza speciale SDL MPEG GNU LGPL 3 GTV GNU GPL 4 PlayMPEG GNU GPL 2 3844 Filmato digitale 3845 Alcune opzioni --noaudio Esclude l’audio, se il file contiene questa informazione. --novideo Esclude il video se presente. Anche se potrebbe sembrare strano, PlayMPEG è in grado di eseguire file di formati audio compatibili con quelli che può includere il formato MPEG video. --fullscreen Utilizza lo schermo intero, ma richiede di funzionare con i privilegi dell’utente ‘root’. --double | -2 Raddoppia la dimensione dell’immagine. --loop Esegue la sequenza di ogni file in modo continuo. In generale, conviene usare questa opzione solo quando si tratta di un file singolo, perché non si ottiene la ripetizione dell’intera sequenza di file. --volume n | -v n Permette di specificare il livello del volume sonoro, aggiungendo un numero, da 0 a 100, dove ovviamente il primo rappresenta un volume nullo e il secondo indica il volume massimo. Esempi $ plaympeg *.mpg Esegue in sequenza tutti i file che terminano con l’estensione ‘.mpg’. $ plaympeg *.mp3 Esegue in sequenza tutti i file che terminano con l’estensione ‘.mp3’. Presumibilmente si tratta di file audio in formato MP3. $ plaympeg --double *.mpg Esegue in sequenza tutti i file che terminano con l’estensione ‘.mpg’, ingrandendo le immagini al doppio della dimensione originale. 339.3 Riferimenti • MPEG pointers and resources <http://www.mpeg.org/MPEG/index.html> Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org Capitolo 340 Masterizzazione di CD audio La realizzazione di un CD audio non è altrettanto semplice quanto creare un CD-ROM (dati). Esistono diversi fattori di cui occorre prendersi cura: 1. la disposizione corretta delle tracce e delle pause, rispettando gli standard; 2. la conclusione corretta della registrazione (finalization), senza la quale mancherebbero le informazioni necessarie a raggiungere le tracce, impedendo l’ascolto del CD; 3. la registrazione a una velocità adeguata al tipo di supporto (a seconda delle caratteristiche del CD vergine possono non essere ammissibili velocità di incisione troppo basse o troppo alte); 4. il tipo di supporto adatto agli apparecchi di riproduzione comuni. La scelta del CD vergine incide quindi anche sulla possibilità o meno di utilizzare una certa velocità di incisione. Di solito si consiglia una velocità doppia (2x), anche se in pratica occorre sperimentare per determinare effettivamente quale sia la velocità migliore (sia per il tipo di CD vergine, sia per la possibilità effettiva di ascoltare il CD in apparecchi standard). A ogni modo, occorre considerare che una velocità di incisione bassa, scalda di più il CD vergine, che se non è realizzato per sopportarla, può risultare danneggiato al termine del ciclo di registrazione. Esistono alcuni apparecchi di riproduzione per CD audio che non accettano espressamente i CD realizzati in modo non industriale. In quei casi, non c’è alcuna possibilità di produrre un CD compatibile, se non disponendo di tutta l’attrezzatura necessaria. Quando si realizza un CD audio, capita facilmente che questo funzioni correttamente utilizzando il lettore di un elaboratore, mentre sia impossibile ascoltarlo in un impianto audio normale. Il motivo più comune per cui ciò accade è l’utilizzo di un formato non perfettamente standard, probabilmente a causa di una carenza del programma utilizzato per l’incisione. In questa situazione, può succedere di trovare che il CD che si ottiene non funzioni affatto in certi apparecchi audio, mentre in altri non riesce a cominciare dall’inizio. Anche le caratteristiche del CD vergine possono essere motivo di discriminazione tra un lettore e un altro, ma si tratta di problemi meno frequenti. Tuttavia, per questo si tende a usare CD vergini realizzati appositamente per le registrazioni audio (consumer), che però richiedono una velocità di incisione molto bassa: singola (1x) o doppia (2x). Nel capitolo 70 è già stato mostrato brevemente l’uso di Cdrecord e di Cdrdao, allo scopo di realizzare CD-ROM molto semplici. Qui viene ripreso l’uso di questi programmi in merito alla realizzazione di CD audio. L’intento di questo capitolo è esclusivamente quello di diffondere la conoscenza sull’uso del CD come unità di memorizzazione di informazioni audio. È responsabilità di chi utilizza le informazioni sapere quando queste attività sono legali e quando non lo sono, perché lesive del diritto di autore. 3846 Masterizzazione di CD audio 3847 340.1 Cdrdao Cdrdao 1 è un programma per l’incisione di CD-R, che richiede la definizione di un file di testo contenente tutte le informazioni necessarie a collocare correttamente le tracce audio e dati. Si fa riferimento a questo file come al «file TOC». Questo fatto può apparire come una complicazione eccessiva per la gestione del programma, ma occorre considerare che oltre all’eseguibile ‘cdrdao’, utilizzato attraverso la riga di comando, è disponibile anche ‘xcdrdao’ che è un pannello frontale interattivo in grado di guidare alla realizzazione di tali file TOC per produrre CD audio. È opportuno richiamare la sintassi per l’utilizzo dell’eseguibile ‘cdrdao’, dove in particolare si distingue un primo argomento contenente un comando, seguito da opzioni eventuali e alla fine dall’indicazione del file TOC: cdrdao comando [opzioni] file_toc ... Il problema dell’indicazione dell’unità SCSI è già stato descritto nel capitolo 70, a ogni modo, quando l’unità del masterizzatore è collegato attraverso un adattatore SCSI, si utilizza l’opzione ‘--device’ nel modo seguente: --device unità_controllo_scsi ,scsi_id,lun Per poter approfondire le direttive del file TOC occorrerebbe conoscere adeguatamente il tipo di informazioni che un CD audio può contenere. In pratica, nella realizzazione di un CD non professionale non si inseriscono informazioni speciali; in particolare non è sensato l’inserimento di un numero di identificazione. Pertanto, in condizioni normali è sufficiente fare riferimento a pochi esempi significativi. In ogni caso è necessario sapere che le righe vuote e quelle bianche vengono ignorate, mentre i commenti si indicano preceduti da due barre oblique: ‘//’. CD_DA TRACK AUDIO FILE "data.wav" 0 L’esempio che appare sopra è il caso più semplice in cui si vuole ottenere un CD a partire da una sola traccia audio, contenuta nel file ‘data.wav’ (di tipo WAV-RIFF), collocato nella directory corrente, senza altre inserzioni particolari. Questo tipo di configurazione si presta pertanto alla registrazione di una conferenza, di una lezione, o di qualunque altra cosa che non ha senso spezzettare in tracce distinte. CD_DA // Traccia 1 TRACK AUDIO NO PRE_EMPHASIS TWO_CHANNEL_AUDIO FILE "traccia-01.wav" 0 // Traccia 2 TRACK AUDIO NO PRE_EMPHASIS TWO_CHANNEL_AUDIO FILE "traccia-02.wav" 0 L’esempio che appare sopra è un po’ più lungo e mostra l’inserimento di due tracce, corrispondenti ai file ‘traccia-01.wav’ e ‘traccia-02.wav’. Le direttive ‘NO PRE_EMPHASIS’ e ‘TWO_CHANNEL_AUDIO’ sono abbastanza intuitive e rappresentano anche la situazione comune per la registrazione di un CD. 1 Cdrdao GNU GPL 3848 Masterizzazione di CD audio CD_ROM // Traccia 1 dati TRACK MODE1 DATAFILE "dati.iso9660" ZERO 00:02:00 // post-gap // Traccia 2 audio TRACK AUDIO SILENCE 00:02:00 // pre-gap START FILE "audio-1.wav" 0 // Traccia 3 audio TRACK AUDIO FILE "audio-2.wav" 0 Questo esempio ulteriore è il più complesso tra quelli mostrati. Si può osservare la dichiarazione iniziale come CD-ROM, attraverso la direttiva ‘CD_ROM’. Alla fine della prima traccia (dati), corrispondente al file ‘dati.iso9660’, viene aggiunto uno spazio, azzerato, della lunghezza di due secondi. All’inizio della prima traccia audio, corrispondente al file ‘audio-1.wav’, viene aggiunta una pausa di silenzio di due secondi; la seconda traccia audio inizia normalmente. Si osservi che in un CD che deve contenere sia dati che audio, conviene che ci sia una sola traccia dati e che sia la prima. 340.1.1 Copia di un CD Il comando ‘copy’ di Cdrdao consente di ottenere una copia di un CD. Per ottenere questo risultato, Cdrdao deve essere in grado di riconoscere le tracce e le caratteristiche che le riguardano. In pratica, la copia avviene generando prima un file TOC in base alle informazioni tratte dal CD, quindi il CD viene letto generando un file temporaneo unico, infine viene eseguita l’incisione usando il file temporaneo e il file TOC. Eventualmente è possibile saltare la fase di memorizzazione del file temporaneo, se il lettore è diverso dal masterizzatore e se il primo ha una velocità di accesso tale da garantire che il flusso di dati non venga interrotto. In pratica, non conviene fare la copia al volo, anche se le unità di lettura e di scrittura sono distinte. In questa situazione è importante osservare che il file contenente i dati e le tracce audio è uno solo, per cui il file TOC che si genera è un po’ particolare, a causa della necessità di delimitare la posizione delle tracce. A titolo di esempio viene mostrato ciò che si potrebbe ottenere da un CD audio reale:2 CD_DA CATALOG "0028942693623" // Track 1 TRACK AUDIO NO COPY NO PRE_EMPHASIS TWO_CHANNEL_AUDIO SILENCE 00:00:32 FILE "data.bin" 0 03:11:00 START 00:00:32 2 È per questo che appare la direttiva ‘NO COPY’: si tratta di un CD musicale reale per il quale è comunque vietata la riproduzione. L’esempio serve a vedere come viene interpretato il contenuto di un CD industriale tipico da parte di Cdrdao. Masterizzazione di CD audio // Track 2 TRACK AUDIO NO COPY NO PRE_EMPHASIS TWO_CHANNEL_AUDIO ISRC "NLA506300346" FILE "data.bin" 03:11:00 03:13:00 // Track 3 TRACK AUDIO NO COPY NO PRE_EMPHASIS TWO_CHANNEL_AUDIO ISRC "NLA506300347" FILE "data.bin" 06:24:00 02:44:00 // Track 4 TRACK AUDIO NO COPY NO PRE_EMPHASIS TWO_CHANNEL_AUDIO FILE "data.bin" 09:08:00 04:20:00 // Track 5 TRACK AUDIO NO COPY NO PRE_EMPHASIS TWO_CHANNEL_AUDIO ISRC "NLA506300349" FILE "data.bin" 13:28:00 03:06:00 // Track 6 TRACK AUDIO NO COPY NO PRE_EMPHASIS TWO_CHANNEL_AUDIO FILE "data.bin" 16:34:00 03:27:00 // Track 7 TRACK AUDIO NO COPY NO PRE_EMPHASIS TWO_CHANNEL_AUDIO ISRC "NLA506300351" FILE "data.bin" 20:01:00 03:24:00 // Track 8 TRACK AUDIO NO COPY NO PRE_EMPHASIS TWO_CHANNEL_AUDIO ISRC "NLA506300352" FILE "data.bin" 23:25:00 03:53:00 // Track 9 TRACK AUDIO NO COPY NO PRE_EMPHASIS TWO_CHANNEL_AUDIO 3849 3850 FILE "data.bin" 27:18:00 02:07:00 // Track 10 TRACK AUDIO NO COPY NO PRE_EMPHASIS TWO_CHANNEL_AUDIO ISRC "NLA506300354" FILE "data.bin" 29:25:00 03:06:00 // Track 11 TRACK AUDIO NO COPY NO PRE_EMPHASIS TWO_CHANNEL_AUDIO FILE "data.bin" 32:31:00 03:28:00 // Track 12 TRACK AUDIO NO COPY NO PRE_EMPHASIS TWO_CHANNEL_AUDIO ISRC "NLA506300356" FILE "data.bin" 35:59:00 03:00:00 // Track 13 TRACK AUDIO NO COPY NO PRE_EMPHASIS TWO_CHANNEL_AUDIO FILE "data.bin" 38:59:00 03:47:00 // Track 14 TRACK AUDIO NO COPY NO PRE_EMPHASIS TWO_CHANNEL_AUDIO ISRC "NLA506300358" FILE "data.bin" 42:46:00 03:16:00 // Track 15 TRACK AUDIO NO COPY NO PRE_EMPHASIS TWO_CHANNEL_AUDIO FILE "data.bin" 46:02:00 03:29:00 // Track 16 TRACK AUDIO NO COPY NO PRE_EMPHASIS TWO_CHANNEL_AUDIO ISRC "NLA506300360" FILE "data.bin" 49:31:00 02:37:00 // Track 17 TRACK AUDIO NO COPY Masterizzazione di CD audio Masterizzazione di CD audio 3851 NO PRE_EMPHASIS TWO_CHANNEL_AUDIO FILE "data.bin" 52:08:00 03:26:00 // Track 18 TRACK AUDIO NO COPY NO PRE_EMPHASIS TWO_CHANNEL_AUDIO FILE "data.bin" 55:34:00 04:06:00 Si può osservare che ogni traccia fa riferimento allo stesso file, qui indicato come ‘data.bin’, dove ogni volta si indica la posizione iniziale, espressa in minuti, secondi e centesimi di secondo, assieme alla lunghezza della traccia, indicata nello stesso modo. L’esempio successivo è ottenuto da un CD-ROM industriale. Si può osservare la presenza di una sola traccia: CD_ROM // Track 1 TRACK MODE1 NO COPY DATAFILE "data_1" 62:14:27 // length in bytes: 573597696 Infine, ecco come si può copiare un CD, indipendentemente dal fatto che si tratti di un CD-ROM (dati), di un CD audio, o di un CD dati e audio. In particolare, si fa riferimento a un lettoremasterizzatore collocato nell’unità SCSI numero tre. È evidente che il file TOC, denominato ‘elenco.toc’ viene creato automaticamente. # cdrdao copy -v 2 --speed 4 --device 0,3,0 --buffers 64 ←,→--paranoia-mode 3 --datafile data.bin elenco.toc L’esempio crea una copia di un CD utilizzando la stessa unità per la lettura del CD e per la scrittura successiva. In particolare, oltre alle opzioni che dovrebbero essere già note: il file temporaneo che viene creato è ‘data.bin’ (opzione ‘--datafile data.bin’); viene richiesto un controllo particolare del CD letto (opzione ‘--paranoia-mode 3’). In alternativa, per fare più copie dello stesso CD, basta creare un’immagine, con il comando ‘read-cd’, che poi viene riprodotta con il comando ‘write’ normale. Per esempio, # cdrdao read-cd -v 2 --device 0,3,0 --paranoia-mode 3 ←,→--datafile data.bin elenco.toc per creare il file ‘data.bin’, assieme al file TOC ‘elenco.toc’, quindi # cdrdao write -v 2 --speed 4 --device 0,3,0 --buffers 64 elenco.toc per incidere un CD in base a quanto contenuto nel file ‘elenco.toc’, da ripetere per tutte le copie che si vogliono ottenere. 340.1.2 Xcdrdao Xcdrdao è un programma frontale per la realizzazione di file TOC di CD audio, guidando fino all’operazione di incisione dei CD vergini. Se si vuole arrivare a pilotare l’incisione del CD, occorre avviarlo con i privilegi dell’utente ‘root’; in tal caso dovrebbe essere in grado di individuare l’unità adatta alla masterizzazione, ma se necessario è possibile intervenire nel menù Settings alla voce Devices. Masterizzazione di CD audio 3852 Figura 340.1. Xcdrdao all’avvio senza l’indicazione di un file TOC. Xcdrdao si compone dell’eseguibile ‘xcdrdao’, che può essere avviato eventualmente indicando il nome di un file TOC. La figura 340.1 mostra il caso comune di Xcdrdao avviato senza alcuna indicazione, dove tutto deve essere definito. xcdrdao [file_toc] A titolo di esempio, si suppone di disporre di due file WAV-RIFF da inserire in un CD. La prima cosa che si fa è quella di dare un nome al file TOC, salvandolo anche se vuoto. Per questo si seleziona la voce Save As del menù File; si ottiene così una finestra che consente la navigazione tra le directory e l’indicazione del file che si vuole salvare. Per iniziare a inserire le tracce, si procede selezionando la voce Add Track dal menù Tools; si ottiene la finestra che si vede nella figura 340.2, dove già ci si accinge a inserire il file ‘/tmp/wav/1.wav’. Figura 340.2. Aggiunta delle tracce nel file TOC. Masterizzazione di CD audio Dopo la conferma con il pulsante grafico 3853 OK , si può aggiungere un altro file, in questo caso ‘/tmp/wav/2.wav’. Dopo aver confermato anche l’ultimo inserimento, si conclude selezionan- do il pulsante grafico C A N C E L . Al termine, per visualizzare la situazione dei file aggiunti, conviene selezionare la voce Fullview dal menù View. Ovviamente conviene anche salvare il file TOC. Figura 340.3. Xcdrdao dopo la selezione dei file audio da aggiungere. Al termine della selezione delle tracce, una volta visualizzato il risultato grafico dell’insieme, è possibile fare una prova di ascolto del CD, prima ancora di passare all’incisione. Si ottiene questo semplicemente selezionando il pulsante grafico P L A Y . Al termine si può decidere di passare all’incisione, attraverso la voce Record dal menù Actions. Ovviamente, in questo modo si va a pilotare l’eseguibile ‘cdrdao’ con il file TOC sul quale si sta lavorando. Figura 340.4. Ultima conferma prima dell’incisione del CD. A titolo di esempio, viene mostrato anche il file TOC generato in questo modo: Masterizzazione di CD audio 3854 CD_DA // Track 1 TRACK AUDIO NO COPY NO PRE_EMPHASIS TWO_CHANNEL_AUDIO FILE "/tmp/wav/1.wav" 0 10555247 SILENCE 529 // Track 2 TRACK AUDIO NO COPY NO PRE_EMPHASIS TWO_CHANNEL_AUDIO FILE "/tmp/wav/2.wav" 0 8461487 SILENCE 421 Si può osservare che sono stati aggiunte in modo predefinito le direttive di opzione ‘NO COPY’, ‘NO PRE_EMPHASIS’ e ‘TWO_CHANNEL_AUDIO’, così come le pause di silenzio alla fine delle tracce. 340.2 Cdrecord Cdrecord 3 non è particolarmente adatto alla realizzazione di CD audio, tuttavia è opportuno completare il quadro mostrando in che modo ciò potrebbe essere fatto con questo programma. In particolare si utilizza l’opzione ‘-audio’ per specificare che i file successivi sono da intendersi delle tracce audio. È opportuno richiamare la sintassi per l’utilizzo dell’eseguibile ‘cdrecord’: cdrecord [opzioni_generali] dev=dispositivo [opzioni_di_traccia] file_traccia ... Il problema dell’indicazione dell’unità SCSI è già stato descritto nel capitolo 70, a ogni modo, quando l’unità del masterizzatore è collegato attraverso un adattatore SCSI, si specifica l’unità in uno dei due modi seguenti: dev=unità_controllo_scsi ,scsi_id,lun dev=scsi_id,lun In pratica, il secondo modo può essere utilizzato quando si dispone di un’unica unità di controllo SCSI. Per quanto riguarda l’uso delle opzioni ‘-data’ e ‘-audio’, è necessario sapere che Cdrecord considera automaticamente tracce audio i file che terminano con le estensioni ‘.au’ e ‘.wav’. Vengono mostrati solo alcuni esempi. # cdrecord -v -speed=2 dev=3,0 -audio prova_*.wav Questo esempio rappresenta il caso più comune. Viene richiesta l’incisione di un CD contenuto nell’unità SCSI numero tre del primo adattatore SCSI, a doppia velocità, dei file che corrispondono al modello ‘prova_*.wav’. # cdrecord -v -speed=2 dev=3,0 immagine.iso9660 -audio prova_*.wav Questo esempio ulteriore mostra il caso di un CD contenente una traccia dati e una serie di tracce audio. In pratica, differisce dall’esempio precedente solo per l’aggiunta dell’indicazione del file 3 Cdrecord GNU GPL Masterizzazione di CD audio 3855 ‘immagine.iso9660’, che si intende un’immagine di un file system ISO 9660. Si osservi la mancanza dell’opzione ‘-data’, perché non indispensabile. 340.3 Wav2cdr Wav2cdr 4 è un programma nato originariamente per convertire file WAV-RIFF nel formato CDR, ovvero quello adatto alla masterizzazione di CD audio. Tuttavia, sia Cdrdao, sia Cdrecord sono in grado di accettare direttamente file in formato WAV-RIFF, senza bisogno di convertirli prima in formato CDR, per cui questa funzionalità di Wav2cdr non è più così importante. L’eseguibile che compie il lavoro è ‘wav2cdr’ e la sua sintassi generale è molto vaga: wav2cdr opzioni La caratteristica più importante di Wav2cdr è invece quella di riuscire a individuare facilmente le pause di silenzio all’interno di un file e di consentirne la suddivisione. Prima di arrivare a comprendere il meccanismo è necessario prendere confidenza con l’opzione ‘--cut’ che richiede l’indicazione di una serie di coppie di numeri, secondo l’unità «C», che per Wav2cdr esprime 1/72 di secondo. Per esempio, --cut 10000C 20000C 20100C 50000C 55000C 70000C serve a delimitare tre pezzi che vanno dalla posizione 10001 alla 20000, dalla 20101 alla 50000 e dalla 55001 alla 70000. Si osservi quindi che nell’elenco di argomenti dell’opzione ‘--cut’, il primo numero di ogni intervallo è escluso. Per individuare le pause in modo automatico, Wav2cdr deve essere informato della durata minima che queste devono avere e dell’ampiezza sonora massima da considerare come «silenzio» (il livello di soglia del rumore di fondo). La durata delle pause si definisce attraverso l’opzione ‘--silencedelay’, a cui segue l’indicazione del numero corrispondente a quantità di 1/72 di secondo (come già visto per l’opzione ‘--cut’), mentre il livello sonoro massimo di queste pause è definito dall’opzione ‘--silencethresh’, a cui si aggiunge un numero da determinare in base a delle prove. In generale, il valore predefinito per questo livello sonoro è 10; incrementandolo si intende superare un rumore di fondo eventuale, come quello contenuto in una registrazione su nastro magnetico analogico. Per suddividere un file audio con Wav2cdr si passa generalmente per due stadi: la scansione del file per individuare gli intervalli, utilizzando l’opzione ‘--silencecuts’, generando un file contenente l’indicazione di tali intervalli; quindi la suddivisione del file, con l’opzione ‘--cut’, riutilizzando il file contenente l’elenco dei tagli da fare. Ecco come si potrebbe procedere con una registrazione ottenuta da una cassetta audio analogica: $ wav2cdr --inwav --infile prova.wav ←,→--silencecuts --silencedelay 30C --silencethresh 80 > elenco $ wav2cdr --inwav --towav --infile prova.wav ←,→--outfile traccia --cut ‘cat elenco‘ Come si può intuire, il file WAV-RIFF che viene scandito e poi separato è ‘prova.wav’, mentre il file contenente l’elenco delle sezioni separate dalla pausa stabilita è ‘elenco’. Il secondo dei due comandi creerà quindi una serie di file, in questo caso ancora WAV-RIFF in quanto richiesto espressamente, con nomi corrispondenti al modello ‘traccian ’ (‘traccia01’, ‘traccia02’, ecc.). 4 Wav2cdr GNU GPL Masterizzazione di CD audio 3856 Dopo una suddivisione del genere è utile ascoltare i vari file ottenuti per determinare se le suddivisioni sono corrette o meno. Nel caso si voglia eliminare una suddivisione è facile modificare l’elenco. Per esempio, supponendo di avere l’elenco 0C 2528C 2528C 3236C 3236C 5422C 5422C 6597C 6597C 18907C 18907C 27772C 27772C 40000C si può decidere di eliminare completamente il primo intervallo, di fondere assieme il secondo con il terzo e il quarto con il quinto, lasciando stare il resto. Basterebbe modificare l’elenco nel modo seguente, ottenendo in pratica solo quattro suddivisioni: 2528C 5422C 5422C 18907C 18907C 27772C 27772C 40000C Alcune opzioni --cut n_iniziale_escluso C n_finale_incluso C [n_iniziale_escluso C ]... n_finale_incluso C Delimita gli intervalli di tempo da estrarre dal file in ingresso. --infile nome_file_in_ingresso Definisce il nome del file audio in ingresso. --outfile radice_nome_file_in_uscita Definisce la radice del nome dei file audio ottenuti dalla separazione del file in ingresso. A questo nome viene aggiunto un numero composto da due cifre, per distinguerne la sequenza. --inwav | --incdr Il file in ingresso è di tipo WAV-RIFF, oppure è in formato CDR. --towav | --tocdr I file da generare devono essere in formato WAV-RIFF oppure CDR. --silencecuts Emette l’elenco di intervalli distinguibili dalle pause di silenzio (da definire in base alle opzioni ‘--silencedelay’ e ‘--silencethresh’). Si osservi che l’elenco viene emesso attraverso lo standard output, mentre dallo standard error si ottengono ugualmente altre informazioni generali. --silencedelay n C Definisce la durata minima delle pause di silenzio, dove il numero esprime unità di 1/72 di secondo. Se non si usa questa opzione è stabilita una pausa minima di «30C», pari a 0,4 s. --silencethresh n Esprime il livello sonoro massimo, al di sotto del quale si intende si tratti di silenzio. Il valore predefinito è 10 e valori superiori alzano la soglia del rumore di fondo consentito. Masterizzazione di CD audio 340.4 Riferimenti • Jeff Tranter, CDROM HOWTO <http://www.linux.org/docs/ldp/howto/HOWTO-INDEX/howtos.html> • Winfried Trümper, CD-writing HOWTO <http://www.linux.org/docs/ldp/howto/HOWTO-INDEX/howtos.html> Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org 3857 Capitolo 341 X-CD-Roast X-CD-Roast 1 è un sistema di programmi fatti per la masterizzazione di CD audio e dati, raccolti assieme sotto un pannello di controllo grafico per X. X-CD-Roast non è un applicativo indispensabile, tuttavia promette di essere aggiornato nel tempo e di facilitare sempre di più la realizzazione di CD. Come al solito, a questo proposito, occorre ricordare che l’acquisto di un CD audio non dà implicitamente il diritto di farne quello che si vuole. In generale si ottiene solo il diritto di ascoltarlo per sé; mentre altre operazioni come la copia, l’esecuzione in pubblico e la trasmissione, sono attività che devono essere autorizzate espressamente da chi detiene i diritti di quella pubblicazione sonora. Tra le altre cose, X-CD-Roast facilita notevolmente l’estrazione di tracce dati e audio da un CD; tuttavia, utilizzare questa tecnica per memorizzare brani musicali o altri dati in un’unità di memorizzazione qualunque, vuol dire farne una «copia» e ciò rappresenta un’azione che normalmente è vietata da chi possiede i diritti sulla pubblicazione relativa, salvo che si tratti di software libero, o di un’altra forma di espressione artistica altrettanto libera. In generale, a meno di provvedere da soli alla compilazione dei sorgenti di X-CD-Roast, questo applicativo funzionerà bene solo se quello che si installa è un pacchetto fatto proprio per la propria distribuzione GNU/Linux. In questo modo, tra le altre cose, si garantisce che siano soddisfatte tutte le dipendenze con i vari programmi, la cui presenza è necessaria per tutte le funzioni che X-CD-Roast è in grado di controllare. 341.1 Configurazione e permessi Per svolgere le sue funzioni correttamente, X-CD-Roast richiede spesso i privilegi dell’utente ‘root’. Sarebbe meglio che questo programma venisse usato soltanto dall’utente ‘root’, ma spesso questa limitazione non è tollerabile e si è quasi costretti ad attivare il bit SUID dell’eseguibile ‘xcdroast’ per scavalcare tutti i vincoli. Per limitare il problema le funzioni disponibili agli utenti comuni che dovessero avviarlo sfruttando la presenza del permesso SUID sono limitate; tuttavia, ciò non può bastare per garantire contro l’uso improprio del programma e tanto meno per risolvere tutti i problemi di sicurezza che potrebbero apparire in futuro. Quindi, se si decide di attivare il bit SUID dell’eseguibile ‘xcdroast’, bisogna sapere che il sistema non è più tanto sicuro (ammesso che prima lo fosse). Una volta installato per la prima volta X-CD-Roast, prima di manomettere i suoi permessi, l’utente ‘root’ che vuole concedere l’uso dell’applicativo anche agli altri utenti deve avviare una volta l’eseguibile ‘xcdroast’ con l’opzione ‘-nonroot’. Dopo una prima schermata di avvertimento, con la quale si chiede di prendere atto dei pericoli che si corrono utilizzando questo applicativo, si arriva alla maschera del menù generale, in cui si vede chiaramente che la modalità di funzionamento è quella definita come ‘nonroot’. Si veda a questo proposito la figura 341.1. # xcdroast -nonroot 1 X-CD-Roast GNU GPL 3858 X-CD-Roast 3859 Figura 341.1. Menù iniziale di X-CD-Roast. Si osservi che il programma sta funzionando in modalità ‘nonroot’. La prima cosa da fare è quella di definire la configurazione di partenza, per gli aspetti a cui gli utenti comuni non potranno accedere successivamente. Si fa questo selezionando il pulsante grafico S E T U P . Figura 341.2. Configurazione del masterizzatore e del lettore. In questo caso, il lettore è lo stesso masterizzatore. In particolare, meritano attenzione le cartelle per la configurazione del masterizzatore e del lettore, oltre all’area da utilizzare per le immagini delle tracce. Nella figura 341.2 si vede che X-CDRoast dovrebbe essere in grado di individuare da solo il tipo di masterizzatore e il tipo di lettore di CD, ma qui deve essere regolata almeno la velocità di masterizzazione. Nella figura 341.3 si vede invece la definizione dell’area di memoria da utilizzare per preparare o per scaricare le immagini delle tracce. Se si dispone di un elaboratore di fascia media, è più che sufficiente la scelta di una directory apposita. Nella figura si mostra l’uso di ‘/tmp/’. X-CD-Roast 3860 Figura 341.3. Configurazione dell’area di memoria temporanea, nel disco fisso, per le immagini delle tracce. Si osservi la selezione della directory ‘/tmp/’. Dopo aver controllato anche le altre cartelle, si può salvare la configurazione selezionando il pulsante grafico S A V E . Ciò fa sì che venga creato il file di configurazione generale, che potrebbe essere ‘/etc/xcdroast/xcdroast.conf’, o un altro simile collocato altrove (ma questo fatto non è auspicabile). Da questo momento in poi, l’utilizzo di X-CD-Roast è sempre in modalità ‘nonroot’ e si può attivare il bit SUID se lo si ritiene opportuno (per uscire dalla configurazione basta selezionare il pulsante grafico D O N E e quindi E X I T per terminare il funzionamento di questa sessione di lavoro particolare). # chmod u+s /usr/bin/xcdroast In seguito, X-CD-Roast può essere usato anche dagli utenti comuni, che avranno accesso a una configurazione ridotta; in particolare non potranno cambiare la definizione della memoria temporanea per la gestione delle tracce. La configurazione personalizzata degli utenti viene memorizzata nel file ‘~/.xcdroast/xcdroast.conf’. Però, non è ancora tutto finito se si vuole lasciare effettivamente che gli utenti comuni utilizzino questo programma. Infatti, è necessario regolare i permessi dei file di dispositivo relativi alle unità a cui deve accedere X-CD-Roast. In generale, i file di dispositivo corrispondenti ai lettori CD devono avere esclusivamente i permessi di lettura e scrittura per l’utente ‘root’; # chmod 0600 /dev/sg* /dev/sr* /dev/scd* ma per consentire la copia rapida, è necessario che gli utenti in questione possano leggere il dispositivo corrispondente al lettore CD. Se si suppone che il collegamento simbolico ‘/dev/ cdrom’ corrisponda al file di dispositivo corretto, basta intervenire su questo. Prima di modificare tali permessi, però, si pone il problema di decidere quale libertà dare agli utenti comuni. Se si decide di concedere l’accesso a tutti, si può usare il comando: # chmod a+r /dev/cdrom Invece, se si vuole limitare l’accesso agli utenti che appartengono al gruppo di questo file di dispositivo (di solito si tratta di ‘disk’), occorre limitare i permessi al gruppo: # chmod g+r /dev/cdrom X-CD-Roast deve poter accedere anche al file di dispositivo ‘/dev/dsp’, almeno in scrittura. Anche in questo caso vale la possibilità di distinguere se si vuole concedere l’accesso solo a chi appartiene anche al suo gruppo (di solito si tratta di ‘audio’), oppure se si ritiene opportuno lasciare l’accesso a qualunque utente: X-CD-Roast 3861 # chmod g+w /dev/dsp oppure # chmod a+w /dev/dsp Se si lasciano i permessi di lettura agli utenti, questi possono ascoltare attraverso la scheda audio, anche attraverso la rete, arrivando a poter spiare le conversazioni che si svolgono nella stanza in cui si trova quell’elaboratore. Questo è il motivo per cui si cerca di evitare di dare i permessi di lettura a questo file di dispositivo. 341.2 Masterizzazione dati La masterizzazione tradizionale, che parte dalla creazione di un’immagine per arrivare all’incisione di un disco, avviene per mezzo della funzione accessibile tramite il pulsante grafico M A S T E R CD , del menù principale di X-CD-Roast. La figura 341.4 mostra la selezione della directory a partire dalla quale si vuole ottenere l’immagine del contenuto. Figura 341.4. Definizione della directory di partenza per la creazione di un’immagine. Con il pulsante S E T I M A G E -T Y P E si accede a una maschera con la quale si definiscono alcuni dettagli importanti sulle caratteristiche dell’immagine. In generale, conviene attivare simultaneamente sia le estensioni Rock Ridge che quelle Joliet. Con il pulsante M A S T E R I M A G E si accede alla maschera con la quale poi si può confermare l’avvio della creazione del file contenente l’immagine ISO 9660, che successivamente potrà essere trasferita nel CD. Per iniziare, basta selezionare il pulsante S T A R T M A S T E R I M A G E . La figura 341.5 mostra la finestra di attesa per il processo di preparazione dell’immagine. X-CD-Roast 3862 Figura 341.5. Attesa per la preparazione dell’immagine. Con il pulsante W R I T E I M A G E si accede alla maschera con la quale poi si può confermare l’avvio dell’incisione del CD vergine. Si osservi nella figura 341.6 la disponibilità di una casella di selezione con la quale si può richiedere di eseguire l’operazione solo in simulazione, per controllare che il flusso di dati possa avvenire effettivamente alla velocità stabilita. Con il pulsante V E R I F Y B U R N E D I M A G E si accede alla maschera di controllo del CD appena inciso. Il controllo avviene attraverso la lettura integrale della traccia. Infine, con il pulsante D E L E T E I M A G E S si accede alla maschera con la quale si possono selezionare i file che rappresentano le immagini contenute nella directory temporanea che funge da serbatoio di questi. Figura 341.6. Preparazione alla scrittura del CD. 341.3 Copia di un CD contenente dati La copia di un CD contenente dati consiste nel trasferimento dell’immagine dalla traccia dati del CD-ROM in un file e nel successivo riutilizzo per l’incisione di un altro CD. L’operazione è molto semplice, ma bisogna ricordare che questo tipo di copia può essere fatto solo quando i dati in questione possono essere riprodotti legalmente. Si accede a questa funzione di X-CD-Roast attraverso il pulsante grafico C O P Y D A T A -CD del menù principale, quindi, in breve: • RE A D IM A G E • VE R I F Y IM A G E • WR I T E IM A G E legge l’immagine del CD-ROM in un file; monta l’immagine e ne permette il controllo, prima di incidere un CD; inizia l’incisione di un nuovo CD; X-CD-Roast • VE R I F Y 3863 BURNED IM A G E verifica l’integrità del CD appena inciso; • permette di eliminare facilmente le immagini che non servono più dalla directory che le contiene; • Q U I C K CD C O P Y permette di incidere un CD a partire da un originale, senza passare per la generazione di un file-immagine (ammesso che sia disponibile un altro lettore CD. DE L E T E IM A G E S 341.4 CD contenente tracce audio Un CD contenente dati, di solito è composto da una sola traccia, mentre un CD audio è composto da tante tracce quanti sono i brani musicali contenuti. La riproduzione di un CD audio passa normalmente per l’estrazione di tutte le tracce in altrettanti file, che poi possono essere ricomposte come si vuole in un altro CD. Per accedere a queste funzionalità, si seleziona il tasto grafico C O P Y A U D I O -CD del menù principale. Per l’ennesima volta, si ricorda che queste cose si possono fare solo se sono concesse espressamente da chi detiene i diritti di autore. In questa sezione, piuttosto che mostrare in dettaglio come estrapolare le tracce da un CD audio, per generarne una copia, si preferisce puntare l’attenzione sulla creazione di un CD audio in proprio. Tuttavia, non ci si devono aspettare risultati eccellenti, dal momento che spesso, per qualche motivo, i CD che si ottengono non funzionano sugli apparecchi di ascolto comuni. X-CD-Roast consente di partire da tracce audio in formato grezzo, oppure in formato WAV-RIFF (16 bit, stereo, 44100 Hz). Il secondo, essendo fornito di intestazione, rappresenta decisamente la scelta migliore; infatti, se si vuole usare un formato grezzo, occorre poi preoccuparsi di stabilire l’ordine giusto dei byte. Una volta preparati i file WAV, questi vanno collocati nella directory in cui X-CD-Roast si aspetta di trovare le tracce da registrare. Nella figura 341.7 si vede la situazione mostrata dalla maschera che si raggiunge con il tasto W R I T E T R A C K S , prima di avere selezionato i file WAV da utilizzare per le tracce del CD da registrare. È importante che la casellina indicata come ‘Fix Wav-Files’, sia selezionata, come si vede nella figura. X-CD-Roast 3864 Figura 341.7. Preparazione alla scrittura del CD audio. In questo caso si vede già che sono disponibili due file (tracce), dei quali, nessuno è stato ancora indicato. Per farlo, occorre selezionare il pulsante grafico S E L E C T /S H O W T R A C K S T O W R I T E e, nella finestra che si ottiene, occorre indicare l’ordine delle tracce. Nella figura 341.8 si vede che è appena stato indicato questo ordine, mentre nella figura 341.9 si vede il risultato confermato con la selezione del pulsante grafico R E F R E S H . Al termine, si esce da questa finestra con il pulsante grafico D O N E . Figura 341.8. Selezione delle tracce audio. X-CD-Roast 3865 Figura 341.9. Conferma della selezione delle tracce audio. Dalla maschera precedente, basta selezionare il pulsante grafico avviare l’incisione del CD. ST A R T WR I T E TR A C K S per Il CD audio che si ottiene potrebbe non funzionare in un lettore normale di sistemi audio, ma questa è una carenza del sistema di riproduzione, non del procedimento con cui si realizza il CD. 341.5 Riferimenti • Thomas Niederreiter, Manual for X-CD-Roast <file:///usr/share/doc/xcdroast/README.html> Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org 3866 X-CD-Roast Parte lxx Transizione verso il software libero 342 File con formati speciali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3868 342.1 Conversione da un insieme di caratteri a un altro . . . . . . . . . . . . . . . . . . . . . . . . . 3868 342.2 File .DBF -- dBase III e derivati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3870 342.3 File tipici di MS-Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3873 343 DOSEMU: l’emulatore di hardware DOS compatibile . . . . . . . . . . . . . . . . . . . . . . . . . . 3876 343.1 Predisporre un ambiente adatto al Dos all’interno di DOSEMU . . . . . . . . . . . . 3876 343.2 La configurazione di DOSEMU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3877 343.3 Installare e utilizzare il Dos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3879 344 Servente X su altre piattaforme grafiche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3884 344.1 MI/X . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3884 344.2 X-Win32 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3886 345 Applicazioni proprietarie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3887 345.1 Motif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3887 345.2 StarOffice 3.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3887 345.3 StarOffice 5.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3893 345.4 StarOffice 5.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3895 345.5 Netscape . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3896 345.6 XV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3898 345.7 Riferimenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3902 3867 Capitolo 342 File con formati speciali Uno degli aspetti deleteri dell’informatica è stato il proliferare di formati incompatibili nei file di dati. In questo capitolo si raccolgono le informazioni sugli strumenti a disposizione per poter recuperare dati contenuti in file con un formato che in passato hanno avuto una certa diffusione. Come si può intuire, di solito non si tratta delle dotazioni normali di una distribuzione GNU/Linux, per cui, i programmi che vengono descritti qui vanno forse cercati tra i «contributi» esterni alla propria distribuzione. 342.1 Conversione da un insieme di caratteri a un altro Quando si convertono dati da un formato a un altro, il primo problema è e quello di traslitterare l’insieme di caratteri. Purtroppo, non sempre è possibile «traslitterare» in modo reversibile, spesso si è costretti ad accettare una trasformazione che non permette più di riottenere lo stesso formato iniziale. Questo fatto si comprende facilmente pensando alla necessità eventuale di convertire un insieme di caratteri in un altro in cui non si dispone di alcuni simboli del primo. Un caso particolare riguarda le conversioni di file di testo dove da un sistema di interruzioni di riga composte dalla sequenza <CR><LF> si vuole passare al solo <LF>. Per qualche motivo, il file di origine potrebbe contenere qualche codice <LF> isolato, che nel file di destinazione verrebbe interpretato alla fine come un’interruzione di riga. In pratica, se si volesse riconvertire il file nel formato precedente, tutti i codici <LF> verrebbero riconvertiti in <CR><LF>. 342.1.1 $ recode recode [opzioni] codifica_prima ..codifica_dopo [file ...] ‘recode’ 1 è un programma per la conversione di file da un insieme di caratteri a un altro. ‘recode’ non si limita semplicemente a questo; spesso è in grado di intervenire anche su codifi- che composte da sequenze di caratteri, anche se in queste situazioni il suo utilizzo si complica e i risultati non sono sempre garantiti. Osservando lo schema sintattico mostrato, si può vedere che è necessario indicare il tipo di conversione attraverso due parole chiave: la prima serve a stabilire il modo in cui sono codificati i dati in ingresso, la seconda stabilisce in che modo li si vuole trasformare in uscita. Uno o più file in ingresso possono essere indicati alla fine della riga di comando, facendo sì che ‘recode’ tenti di sovrascriverli; in alternativa, un file in ingresso può essere fornito attraverso lo standard input, ottenendo come il risultato della conversione dallo standard output. Bisogna essere prudenti con ‘recode’ quando si indicano i file nella riga di comando, perché la conversione potrebbe essere irreversibile. Nel suo piccolo, ‘recode’ è un programma complesso. Questa sezione mostra solo alcuni aspetti banali, mentre per sfruttare bene tutte le sue potenzialità è necessario leggere la documentazione originale: recode.info. 1 recode GNU GPL 3868 File con formati speciali 3869 Alcune opzioni -a [codifica] | --auto-check [codifica] Questa opzione è speciale e di solito viene usata da sola, senza indicare altri argomenti nella riga di comando di ‘recode’. Serve per ottenere da ‘recode’ un riassunto sulle possibilità di conversione da o verso la codifica indicata. -g | --graphics Questa opzione riguarda la conversione dall’insieme di caratteri ‘IBM-PC’, a un altro tipo, dove si vuole tentare di trasformare in qualche modo i simboli grafici tipici di quella codifica. È evidente che questa conversione è irreversibile. Alcune codifiche Le codifiche da utilizzare nelle conversioni sono indicate attraverso la notazione codifica_prima ..codifica_dopo , come si vede nello schema sintattico introduttivo. Le parole chiave utilizzate per questo possono essere indicate indifferentemente utilizzando le lettere minuscole o maiuscole. L’elenco delle codifiche (e quindi delle trasformazioni possibili) è molto lungo e potrebbe essere ottenuto un riepilogo attraverso l’opzione ‘-a’. Tuttavia, sarebbe meglio leggere prima ciò che è stato annotato nel documento recode.info al riguardo, per non rischiare di trovarsi poi nei pasticci. IBM437 | 437 | cp437 Rappresenta la codifica IBM usata normalmente nel Dos. Quando si converte da questa codifica a un’altra, i codici di interruzione di riga vengono lasciati inalterati. IBM-PC | ibmpc È praticamente la stessa codifica IBM437, con la differenza che quando si converte da questa codifica a un’altra, i codici di interruzione di riga vengono trasformati. IBM850 | 850 | cp850 Rappresenta la codifica IBM usata normalmente nel Dos per la localizzazione europea. ISO_8859-1:1987 l1 | ISO_8859-1 | ISO-8859-1 | CP819 | IBM819 | iso-ir-100 | | latin1 Si riferisce alla codifica ISO 8859-1. Esempi $ recode -a IBM437 Mostra tutte le possibilità di abbinamento con la codifica IBM437. $ recode -a IBM-PC Mostra tutte le possibilità di abbinamento con la codifica IBM-PC. $ recode IBM-PC..ISO_8859-1 lettera Converte il file ‘lettera’ dalla codifica IBM-PC a ISO 8859-1, sovrascrivendo il file. $ recode IBM-PC..ISO_8859-1 < lettera > lettera2 Converte il file ‘lettera’ dalla codifica IBM-PC a ISO 8859-1, generando il file ‘lettera2’. $ recode -g IBM-PC..ISO_8859-1 < schema1 > schema2 Converte il file ‘schema1’ dalla codifica IBM-PC a ISO 8859-1, generando il file ‘schema2’, tentando di convertire anche i simboli grafici. File con formati speciali 3870 342.2 File .DBF -- dBase III e derivati Il software basato sui file in formato ‘.DBF’, ovvero quelli di dBase III, è stato molto importante nell’ambito del sistema operativo Dos. Nel suo piccolo ha permesso agli utenti di quel sistema operativo di realizzare delle strutture di dati che si avvicinavano alle potenzialità di una base di dati relazionale. Ancora oggi si trovano programmi applicativi gestionali basati su questo formato, scritti probabilmente con il famoso compilatore Clipper. Attualmente è disponibile il compilatore Harbour, che si ripromette di offrire un ambiente totalmente compatibile con il passato; tuttavia è possibile leggere il contenuto di questi attraverso alcuni piccoli programmi. 342.2.1 $ dbview dbview [opzioni] file_dbf Il programma ‘dbview’ 2 consente di leggere il contenuto dei file ‘.DBF’ di dBase III e probabilmente anche le versioni di dBase IV. Se viene avviato senza opzioni, si ottiene la visualizzazione del contenuto del file indicato nel formato predefinito, come si vede dall’esempio seguente: Articolo Descr Prezzo u Import Scadenza Note : : : : : : 1 bicicletta uomo 500.00 T 20011120 2 Articolo Descr Prezzo u Import Scadenza Note : : : : : : 2 bicicletta donna 550.00 Articolo Descr Prezzo u Import Scadenza Note : : : : : : 3 bicicletta uomo/donna leggera 600.00 20011120 3 20011120 4 In realtà, in questo modo, i nomi dei campi vengono mostrati in modo diverso dal reale, utilizzando anche le lettere minuscole ed eliminando i trattini bassi. Utilizzando l’opzione ‘-r’, il primo record apparirebbe così: ARTICOLO DESCR PREZZO_U IMPORT SCADENZA NOTE : : : : : : 1 bicicletta uomo 500.00 T 20011111 2 È necessario osservare che i campi booleani (in questo caso si tratta di quello intitolato ‘IMPORT’) mostrano solo la lettera ‘T’ per il valore Vero, altrimenti non si ha alcuna indicazione; inoltre, le date vengono espresse secondo il formato AAAAMM GG . Infine, dall’esempio non si intuisce, ma il campo ‘NOTE’ è di tipo «memo» e in questo caso si sono persi i dati. I dati contenuti nei file ‘.DBF’, dal momento che sono stati memorizzati presumibilmente con un sistema operativo Dos, utilizzano molto probabilmente un insieme di caratteri diverso da 2 dbview GNU GPL File con formati speciali 3871 Latin 1 o comunque diverso da ciò che si utilizza con GNU/Linux. Pertanto, è probabile che sia necessario rielaborare ciò che si ottiene con ‘dbview’ attraverso un programma di conversione come ‘recode’. Tuttavia, è bene considerare che nella storia dei file ‘.DBF’ sono state usate anche codifiche differenti dal solito IBM437 e di questo occorre tenerne conto quando ci si accorge che la conversione non funziona come ci si aspetterebbe. Alcune opzioni --browse | -b Se si utilizza questa opzione, i record vengono mostrati su una sola riga per volta, separando i campi con un simbolo, il separatore, che di solito è costituito dai due punti (‘:’). --delimiter x | -d x Con questa opzione è possibile specificare il simbolo da utilizzare per separare i campi dei record che vengono visualizzati. Il simbolo di separazione predefinito sono i due punti (‘:’) --description | -e x In questo caso, oltre a mostrare il contenuto del file, nella parte iniziale vengono riepilogate le caratteristiche dei campi contenuti. --omit | -o x Non elenca il contenuto del file, ma si limita a dare le altre informazioni se richieste attraverso le opzioni opportune. --reserve | -r x Mostra i nomi dei campi così come sono stati memorizzati. Esempi $ dbview articoli.dbf Elenca il contenuto del file ‘articoli.dbf’ nella forma predefinita. $ dbview -b articoli.dbf Mostra i record utilizzando una sola riga per ognuno. $ dbview -b articoli.dbf | recode ibm437:latin1 Come nell’esempio precedente, ma utilizza ‘recode’ per trasformare i caratteri speciali che altrimenti non sarebbero visibili correttamente (per esempio le lettere accentate). 342.2.2 $ dbf2pg dbf2pg [opzioni] file_dbf Il programma ‘dbf2pg’ 3 consente di leggere il contenuto di un file ‘.DBF’ e di inserire i dati relativi in una tabella di una base di dati di PostgreSQL (capitolo 324 e successivi). In base alle opzioni che vengono indicate, i dati possono essere aggiunti a una tabella esistente, oppure possono sostituire le righe di tale tabella, oppure si può creare una tabella da zero. Quello che conta è che i permessi fissati attraverso PostgreSQL consentano l’accesso e le operazioni che si intendono svolgere. 3 dbf2pg software libero con licenza speciale File con formati speciali 3872 ‘dbf2pg’ non è in grado di trasferire i campi «memo», quelli che tradizionalmente venivano creati utilizzando file con estensione ‘.DBT’. Alcune opzioni -v -vv Permette di avere informazioni sulle operazioni svolte, ottenendo un dettaglio maggiore nel secondo caso. -h host Permette di specificare il nodo a cui accedere per connettersi con il servente di PostgreSQL. In mancanza di questa indicazione, viene tentato l’accesso a localhost. -d base_di_dati Permette di specificare il nome della base di dati a cui ci si vuole connettere. In mancanza di questa indicazione, viene tentata la connessione con la base di dati ‘test’. -t tabella Permette di specificare il nome della tabella in cui si vogliono trasferire i dati del file ‘.DBF’. In mancanza di questa indicazione, viene tentato l’inserimento nella tabella ‘test’. -D Con questa opzione, si fa in modo di cancellare il contenuto della tabella di destinazione, prima di iniziare l’inserimento dei dati. -c Richiede espressamente che sia creata la tabella di destinazione. In mancanza di questa opzione, la tabella deve essere già disponibile, altrimenti l’operazione fallisce. Nel caso si utilizzi questa opzione mentre una tabella con lo stesso nome esiste già, si ottiene la cancellazione del suo contenuto prima di iniziare, come se fosse stata usata al suo posto l’opzione ‘-D’. -f Prima di procedere, converte i nomi dei campi in modo che questi siano scritti utilizzando solo lettere minuscole. -l -u Con l’opzione ‘-l’ si fa in modo che il contenuto dei campi venga convertito in lettere minuscole, mentre con l’opzione ‘-u’ si ottiene una conversione in maiuscole. -s nome_vecchio =nome_nuovo [,nome_vecchio =nome_nuovo ]... Con questa opzione si può stabilire la sostituzione di alcuni nomi dei campi della tabella. Ciò può essere particolarmente utile nel caso in cui i nomi originali siano incompatibili con PostgreSQL. -s n_riga_iniziale -e n_riga_finale Le opzioni ‘-s’ e ‘-e’ permettono di definire l’intervallo di righe da trasferire, dove nel primo caso si indica la riga iniziale e nel secondo quella finale. Se non si indicano, il trasferimento parte dall’inizio e prosegue fino alla fine. Esempi $ dbf2pg -d Anagrafe -c -t Indirizzi address.dbf File con formati speciali 3873 Crea la tabella ‘Indirizzi’ nella base di dati ‘Anagrafe’ disponibile presso l’elaboratore locale, prelevando i dati dal file ‘address.dbf’. $ dbf2pg -h localhost -d Anagrafe -c -t Indirizzi address.dbf Esattamente come nell’esempio precedente, con l’indicazione precisa del nodo locale. 342.3 File tipici di MS-Windows Alcuni formati di file utilizzati con MS-Windows sono considerati da molti degli «standard». Tra tutti, il più «importante» è quello di MS-Word, con in più il problema che di questo ne esistono molte versioni. 342.3.1 $ mswordview mswordview [opzioni] file_doc ‘mswordview’ 4 è un programma il cui scopo è quello di convertire file di MS-Word in HTML. La conversione non può essere perfetta, ma il progetto è condotto con impegno e i risultati che dà questo programma sono buoni. Inizialmente, ‘mswordview’ è in grado di convertire i file di MS-Word 8, ma dovrebbero aggiungersi successivamente anche i formati precedenti. ‘mswordview’ è in grado di convertire solo un file alla volta, precisamente quello che viene indicato alla fine degli argomenti. Se non viene richiesto qualcosa di particolare attraverso le opzioni, ‘mswordview’ tenta di creare un file con lo stesso nome di quello che viene convertito, con l’aggiunta dell’estensione ‘.html’. Inoltre, se il file contiene delle immagini incorporate, queste vengono trasferite su file esterni. Alcune opzioni -o file_html | --outputfile file_html Permette di indicare esplicitamente il file HTML che si vuole generare. -g file_errori | --errorfile file_errori Permette di annotare gli errori incontrati durante la conversione nel file indicato. 342.3.2 $ catdoc catdoc catdoc [opzioni] [opzioni] file_doc < file_doc 5 è un programma molto semplice, che si sostituisce idealmente a ‘cat’ quando si tratta di visualizzare il contenuto di file scritti in formato MS-Word. Il suo funzionamento è intuitivo e in generale non servono opzioni: il file indicato come argomento, o fornito attraverso lo standard input, viene emesso dallo standard output dopo una conversione in formato testo. Se il file originale contiene in realtà solo testo puro, non avviene alcuna conversione. ‘catdoc’ 4 5 mswordview GNU GPL + alcuni file con licenza speciale catdoc GNU GPL File con formati speciali 3874 Alcune opzioni -b Cerca di elaborare anche file MS-Word che apparentemente non lo sono, a causa di una firma iniziale errata. -mn Specifica il margine destro del testo ottenuto. Il margine predefinito è a colonna 72. Si osservi che l’opzione ‘-m0’ equivale a ‘-w’. -w Specifica il margine destro del testo ottenuto di lunghezza indefinita, in modo da ottenere che i paragrafi occupino una riga intera. -v Genera alcune informazioni diagnostiche prima del testo trasformato. Configurazione Per quanto semplice, ‘catdoc’ prevede una configurazione, composta dal file ‘/etc/ catdocrc’ per il sistema e dai file ‘~/.catdocrc’ per gli utenti. Senza entrare nel dettaglio delle direttive di configurazione, è il caso di descrivere quella che rappresenta l’impostazione comune: charset_path=/usr/lib/catdoc map_path=/usr/lib/catdoc source_charset=cp1252 target_charset=8859-1 unknown_char=’?’ Come si può intuire, le direttive ‘charset_path’ e ‘map_path’ servono a indicare la collocazione di file utilizzati da ‘catdoc’ per la conversione. La direttiva ‘source_charset’ permette di stabilire la codifica predefinita del file sorgente, quando questo non appare utilizzare la UTF-16. La direttiva ‘target_charset’ permette di definire la codifica da usare per il testo generato; come si vede nell’esempio viene usata la codifica ISO 8859-1. Infine, è possibile stabilire in che modo mostrare i caratteri che non possono essere rappresentati, attraverso la direttiva ‘unknown_char’, che in questo caso usa il punto interrogativo. Esempi $ catdoc pippo.doc | less Visualizza il contenuto del file ‘pippo.doc’, con l’aiuto di ‘less’ per scorrerlo. $ catdoc pippo.doc > pippo.txt Genera il file ‘pippo.txt’ a partire da ‘pippo.doc’. 342.3.3 $ antiword antiword [opzioni] file_doc ... ‘antiword’ 6 è un programma molto semplice per convertire file dal formato MS-Word (versione 6 o successiva) in testo puro e semplice, oppure in PostScript , estrapolando anche le immagini. Il suo funzionamento è intuitivo e in generale non servono opzioni: il file indicato come argomento, viene emesso attraverso lo standard output dopo la conversione. 6 Antiword GNU GPL File con formati speciali 3875 Alcune opzioni -t Genera una conversione in formato testo puro e semplice. L’uso di questa opzione è implicito. -w n_colonne Permette di specificare, nell’ambito di una conversione in formato testo, l’ampiezza del testo in caratteri. Se si utilizza il valore zero, si ottiene ogni paragrafo in una sola riga. -m file_mappa Consente di indicare la conversione che si vuole ottenere da Unicode in un insieme di caratteri a 8 bit. Se non si usa questa opzione, è come se fosse stato stabilito ‘-m 8859-1.txt’, corrispondente alla richiesta di ottenere una conversione nello standard ISO 8859-1. Questi file di conversione dovrebbero trovarsi nella directory ‘/usr/share/antiword/’. -p dimensioni_carta L’utilizzo di questa opzione richiede implicitamente la conversione in formato PostScript, mentre in condizioni normali si ottiene un testo puro e semplice. L’argomento dell’opzione stabilisce la dimensione della carta e può trattarsi delle parole chiave seguenti, con il significato intuitivo che hanno: ‘10x14’, ‘a3’, ‘a4’, ‘a5’, ‘b4’, ‘b5’, ‘executive’, ‘folio’, ‘legal’, ‘letter’, ‘note’, ‘note’, ‘quarto’, ‘statement’, ‘tabloid’. -L Nell’ambito di una conversione in PostScript, indica un orientamento orizzontale del foglio. -i livello_di_visualizzazione_immagini Consente di specificare cosa fare delle immagini che fossero eventualmente contenute nel file di partenza. L’argomento è un numero che ha il significato descritto nell’elenco seguente. • 0 genera un file compatibile con Ghostscript, ma non adatto a stampanti PostScript comuni. Tuttavia, in condizioni normali, se si arriva alla stampa, si passa generalmente per Ghostscript, per cui questo valore è quello che può essere adatto. • 1 non estrapola le immagini. • 2 PostScript livello 2. • 3 PostScript livello 3. -s Include anche il testo nascosto, indicato come tale nel file originale. Esempi $ antiword pippo.doc | less Visualizza il contenuto del file ‘pippo.doc’, con l’aiuto di ‘less’ per scorrerlo. $ antiword -p a4 pippo.doc > pippo.ps Genera il file ‘pippo.ps’ (PostScript, A4) a partire da ‘pippo.doc’. Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org Capitolo 343 DOSEMU: l’emulatore di hardware DOS compatibile DOSEMU 1 è fondamentalmente un emulatore dell’hardware x86 per vari sistemi Unix funzionanti su architettura i386. Il suo obiettivo è quello di permettere il funzionamento del sistema operativo Dos (MS-Dos o cloni). Si tratta di un progetto eternamente in fase di sviluppo (alpha), anche se da diversi anni è sufficientemente funzionante. Tuttavia non ci sono punti fermi: da una versione all’altra si possono incontrare novità imprevedibili. Dal momento che l’emulazione riguarda l’hardware, il Dos deve essere installato all’interno di questo sistema di emulazione; quindi, è necessaria una copia di questo sistema operativo, insieme alla licenza d’uso. DOSEMU permette di utilizzare la stessa copia installata del Dos su più terminali contemporaneamente. Se si intende concedere l’utilizzo simultaneo di una singola copia di questo sistema operativo, è necessario un numero maggiore di licenze d’uso, oppure una licenza multipla. A fianco del lavoro su DOSEMU è anche in corso quello sul progetto FreeDOS per un sistema operativo Dos libero (capitolo 366). 343.1 Predisporre un ambiente adatto al Dos all’interno di DOSEMU Perché il sistema operativo Dos possa funzionare all’interno di DOSEMU, occorre preparare un file-immagine di un disco Dos dal quale si possa effettuare l’avvio del Dos stesso. Questo file che viene descritto di seguito, verrà visto dal Dos come disco ‘C:’. Successivamente è conveniente predisporre uno spazio all’interno del file system del proprio sistema GNU/Linux da utilizzare per i programmi Dos che verrà letto come un disco di rete. 343.1.1 Un disco C: immagine Per effettuare l’avvio del Dos occorre che sia predisposta l’immagine di un disco di piccole dimensioni. Questo potrebbe essere un file contenuto nella directory ‘/var/lib/dosemu/’, oppure ‘/var/state/dosemu/’, il cui nome inizia normalmente per ‘hdimage’. Attualmente, il file dovrebbe chiamarsi ‘hdimage.first’ e al limite potrebbe essere un collegamento simbolico a un altro file che costituisce l’immagine vera e propria. Se non esiste questo file è necessario copiarlo dal pacchetto sorgente. Il nome dovrebbe essere ‘hdimage.dist’, o qualcosa di simile. Questa immagine verrà preparata in seguito. 1 DOSEMU GNU GPL 3876 DOSEMU: l’emulatore di hardware DOS compatibile 3877 343.1.2 Un disco D: virtuale o di rete In questa fase conviene preparare una directory che servirà per definire l’inizio (la radice) del disco ‘D:’ virtuale utilizzato dai programmi Dos. Stabiliamo che questo sia ‘/var/emul/dos/’. Da questo punto in poi, ‘D:\’ è equivalente a ‘/var/emul/dos/’. 343.1.3 La struttura essenziale del disco D: virtuale Il disco ‘D:’ virtuale dovrebbe contenere alcune directory che riproducono in pratica il classico ambiente Dos: • ‘D:\TEMP\’ equivalente a ‘/var/emul/dos/temp/’; • ‘D:\DOS\’ equivalente a ‘/var/emul/dos/dos/’. Per evitare la proliferazione di directory temporanee, è possibile utilizzare al posto di ‘/var/ emul/dos/temp/’ un collegamento simbolico che punti a ‘/tmp/’. # ln -s /tmp /var/emul/dos/temp 343.2 La configurazione di DOSEMU La configurazione di DOSEMU consiste nella modifica dei file ‘/etc/dosemu.conf’ e di ‘/etc/dosemu.users’. Il file ‘/etc/dosemu.users’ permette di definire gli utenti che possono utilizzare DOSEMU, mentre l’altro stabilisce tutte le altre caratteristiche. Purtroppo, la configurazione di DOSEMU, specialmente per ciò che riguarda il file ‘/etc/ dosemu.conf’, è complessa e cambia da versione a versione. Inoltre, DOSEMU può costituire anche un problema per la sicurezza del sistema dal momento che di solito l’eseguibile ‘dos’, deve essere SUID-root (cioè deve appartenere a ‘root’ e avere il bit SUID attivato) per utilizzare funzionalità particolari dell’hardware (soprattutto l’adattatore grafico VGA).2 343.2.1 /etc/dosemu.users DOSEMU permette di distinguere alcune categorie di utenti, attribuendogli privilegi differenti, in base a una diversa configurazione nel file ‘/etc/dosemu.conf’. Tali categorie di utenti dipendono quindi dalla configurazione di questo file. Il file ‘/etc/dosemu.users’ può contenere righe di commento, introdotte dal simbolo ‘#’, righe bianche o vuote, che vengono ignorate, e direttive espresse dalla sintassi seguente: utente [variabile_di_configurazione ...] In pratica, si possono abbinare a un utente una o più variabili di configurazione che fanno riferimento a elementi del file ‘/etc/dosemu.conf’. È da osservare, in particolare, che si può indicare anche un utente particolare, ‘all’, per fare riferimento a tutti gli utenti a cui non si fa menzione in modo esplicito. 2 Se ci si accontenta di uno schermo a caratteri, senza grafica e senza cornici, non dovrebbe essere necessario attivare il bit SUID. DOSEMU: l’emulatore di hardware DOS compatibile 3878 A titolo di compromesso, viene mostrato un esempio di configurazione del file ‘/etc/ dosemu.users’ che dovrebbe essere sufficiente nella maggior parte delle situazioni. Si tratta in pratica della versione standard distribuita assieme a DOSEMU, con l’aggiunta di qualche utente ipotetico. # This is a sample /etc/dosemu.users file # For more details look at ./doc/README.conf root c_all nobody guest guest guest # # # # root is allowed to do all weird things variable ’guest’ is checked in /etc/dosemu.conf to allow only DEXE execution login guest treated as ’nobody’ # Utenti inseriti normalmente tizio caio semproni # If you want to allow limited dosemu to all users, uncomment the line below #all restricted # all other users have normal user restrictions Come si intuisce, l’utente ‘root’ ha tutti i diritti necessari a compiere quello che vuole dall’interno di DOSEMU. Sono previsti gli utenti ‘nobody’ e ‘guest’, a cui sono concesse solo poche cose, mentre agli utenti ‘tizio’, ‘caio’ e ‘semproni’ sono concessi privilegi normali. Infine, appare commentata la direttiva ‘all restricted’, con la quale si potrebbe consentire l’utilizzo di DOSEMU a tutti gli altri utenti, con privilegi ridotti. 343.2.2 /etc/dosemu.conf La preparazione di ‘/etc/dosemu.conf’ è invece più delicata. Il file di esempio già fornito all’interno del pacchetto di distribuzione di DOSEMU è commentato molto dettagliatamente, però è anche molto complesso. Di seguito vengono indicate solo alcune parti particolarmente importanti. Le altre direttive di questo file, possono essere lasciate come sono, ignorandole, almeno fino a quando non si raggiunge una buona esperienza con l’uso di DOSEMU. # Viene impostata la mappa della tastiera per uniformarsi alla # disposizione dei tasti in Italia. $_rawkeyboard = (1) # bypass normal keyboard input, maybe dangerous $_layout = "it" # one of: finnish(-latin1), de(-latin1), be, it, us # uk, dk(-latin1), keyb-no, no-latin1, dvorak, po # sg(-latin1), fr(-latin1), sf(-latin1), es(-latin1) # sw, hu(-latin2), hu-cwi, keyb-user $_keybint = (on) # emulate PCish keyboard interrupt # Vengono definite le potenzialità dello schermo # (per poter utilizzare la grafica, come impostato in questo # esempio, occorre avviare il programma dos con i privilegi # dell’utente root). $_video = "vga" # one of: plainvga, vga, ega, mda, mga, cga $_console = (1) # use ’console’ video $_graphics = (1) # use the cards BIOS to set graphics $_videoportaccess = (1) # allow videoportaccess when ’graphics’ enabled $_vbios_seg = (0xc000) # set the address of your VBIOS (e.g. 0xe000) $_vbios_size = (0x10000)# set the size of your BIOS (e.g. 0x8000) $_vmemsize = (1024) # size of regen buffer $_chipset = "" # one of: plainvga, trident, et4000, diamond, avance # cirrus, matrox, wdvga, paradise $_dualmon = (0) # if you have one vga _plus_ one hgc (2 monitors) # Viene definito l’uso dei dischetti e dell’immagine del disco C:. $_floppy_a ="threeinch" # or "fiveinch" or empty, if not existing DOSEMU: l’emulatore di hardware DOS compatibile $_floppy_b = "" 3879 # ditto for B: $_hdimage = "hdimage.first" # list of hdimages under /var/lib/dosemu # assigned in this order such as # "hdimage_c hdimage_d hdimage_e" # If the name begins with ’/dev/’, then partition # access is done instead of virtual hdimage such as # "/dev/hda1" or "/dev/hda1:ro" for readonly # Currently mounted devices and swap are refused. # Hdimages and devices may be mixed such as # "hdimage_c /dev/hda1 /dev/hda3:ro" # Note: ’wholedisk’ is _not_ supported. $_hdimage_r = $_hdimage # hdimages for ’restricted access (if different) # Viene definita la stampante. $_printer = "lp" # list of (/etc/printcap) printer names to appear as # LPT1, LPT2, LPT3 (not all are needed, empty for none) $_printer_timeout = (20)# idle time in seconds before spooling out $_ports = "" # list of portnumbers such as "0x1ce 0x1cf 0x238" # or "0x1ce range 0x280,0x29f 310" # or "range 0x1a0,(0x1a0+15)" 343.3 Installare e utilizzare il Dos Il prossimo problema è quello di riuscire a installare il Dos nel file-immagine che servirà per effettuare l’avvio del Dos stesso. L’immagine in questione, che probabilmente è il file ‘/var/ lib/dosemu/hdimage.first’, contiene già una serie di programmi Dos che fanno parte di DOSEMU e come tali non vanno cancellati. Ma l’immagine che viene distribuita così non è avviabile e il problema è proprio quello di inserirvi il kernel del Dos e l’interprete dei comandi ‘COMMAND.COM’, salvo il caso in cui sia già presente una versione di FreeDOS. 1. Preparazione di un dischetto di avvio Per prima cosa occorre preparare un dischetto Dos avviabile che contenga qualche programma di servizio indispensabile. Da un elaboratore che stia eseguendo il sistema operativo Dos si procede come segue: C:> FORMAT A: /S C:> COPY C:\DOS\SYS.* A: C:> COPY C:\DOS\FDISK.* A: Oltre a questi file converrebbe preparare nel dischetto un programma per la creazione e modifica di file di testo. Servirà per preparare i file ‘CONFIG.SYS’ e ‘AUTOEXEC.BAT’. 2. Avvio del dischetto attraverso DOSEMU È necessario quindi avviare il Dos contenuto nel dischetto appena creato attraverso DOSEMU. Per fare questo, dall’elaboratore GNU/Linux si avvia DOSEMU nel modo seguente: # dos -A Se tutto è andato bene si avvia il Dos; quindi, dopo la richiesta della data e dell’ora appare l’invito classico (il prompt), per l’inserimento dei comandi attraverso la shell (‘COMMAND.COM’). A:\> DOSEMU: l’emulatore di hardware DOS compatibile 3880 3. Trasferimento del sistema Per trasferire nel file-immagine il sistema contenuto nel dischetto, in modo da rendere questa immagine avviabile, occorre procedere prima con la creazione di un MBR (Master boot record): A:\> FDISK /MBR quindi con il trasferimento del sistema: A:\> SYS C: Se è andato tutto bene, adesso il disco ‘C:’, cioè l’immagine, è pronto.3 4. Controllo del disco C: Il disco ‘C:’ dovrebbe contenere alcuni file di DOSEMU. Per verificare il contenuto è sufficiente spostarsi in ‘C:’. A:\> C: C:\> DIR 5. Modifica di config.sys Trovandosi in ‘C:’, potrebbe essere conveniente modificare i file ‘CONFIG.SYS’ e ‘AUTOEXEC.BAT’. Si inizia con ‘CONFIG.SYS’. Si stabilisce di poter utilizzare tutte le lettere di unità (drive) a disposizione. LASTDRIVE=Z Si definisce attraverso il driver ‘EMUFS.SYS’ di DOSEMU che la prossima lettera di disco a disposizione punti alla directory ‘/var/emul/dos/’. Di conseguenza, quella directory verrà interpretata come disco ‘D:’ DEVICE=C:\EMUFS.SYS /var/emul/dos Viene avviato il driver ‘EMS.SYS’ di DOSEMU che si occupa della gestione della memoria estesa. DEVICE=C:\EMS.SYS Se in seguito sarà opportuno, si potrà sempre apportare modifiche a questo file. 6. Modifica di ‘AUTOEXEC.BAT’ Inizialmente il file non necessita di modifiche. Si vedrà in seguito come configurare al meglio questo file. 7. Conclusione dell’installazione Per terminare la sessione di lavoro dell’installazione occorre fare terminare l’esecuzione di DOSEMU che era stato avviato in precedenza con il comando ‘dos -A’. Per chiudere si utilizza il programma ‘EXITEMU.COM’: C:\> C:\EXITEMU 8. Verifica Se tutto è andato come previsto, il Dos è pronto. Si può provare ad avviare il Dos senza l’uso del dischetto semplicemente con il comando: $ dos Se ha funzionato, si otterrà l’invito normale: 3 Il comando ‘FDISK /MBR’ riguarda precisamente MS-Dos, mentre nel caso di cloni le cose potrebbero essere differenti; per esempio potrebbe essere necessario avviare il programma nel modo solito e poi specificare la richiesta selezionando una voce da un menù. DOSEMU: l’emulatore di hardware DOS compatibile 3881 C:\> Per uscire si utilizza il programma ‘EXITEMU.COM’: C:\> EXITEMU 343.3.1 I dischi virtuali con LREDIR.COM Il programma ‘LREDIR.COM’ è in grado di consentire l’accesso a porzioni del file system di GNU/Linux attribuendo una lettera di unità. Per esempio: C:\> LREDIR X: \linux\fs\/home fa sì che il disco ‘X:’ corrisponda al contenuto della directory ‘/home/’. Invece, C:\> LREDIR Y: \linux\fs\${home} fa sì che il disco ‘Y:’ corrisponda al contenuto della directory personale dell’utente che sta usando DOSEMU. 343.3.2 Il mouse Teoricamente, DOSEMU è in grado di gestire da solo il mouse. In pratica potrebbe non essere così. In tal caso conviene provare ad avviare un programma apposito all’interno del ‘CONFIG.SYS’ o di ‘AUTOEXEC.BAT’. 343.3.3 Un esempio di AUTOEXEC.BAT Nell’esempio seguente viene utilizzato un programma per la gestione del mouse estraneo a DOSEMU. Il disco ‘D:’ era stato definito implicitamente all’interno di ‘CONFIG.SYS’ attraverso ‘DEVICE=C:\EMUFS.SYS /var/emul/dos’. @echo off LREDIR H: linux\fs\${home} LREDIR R: linux\fs\/mnt/cdrom PROMPT=$p$g PATH=c:\ PATH=%PATH%;D:\;D:\DOS SET TEMP=D:\TEMP D: D:\DOS\MOUSE ECHO "Questo è DOSEMU. Benvenuto!" 343.3.4 DOSEMU e le console virtuali Quando viene avviato il Dos attraverso DOSEMU, questo opera nella console virtuale sulla quale ci si trova. Di solito, per passare da una console virtuale all’altra è sufficiente premere la combinazione [ Alt+F1 ] o [ Alt+F2 ]... Quando ci si trova su una console virtuale all’interno della quale sta funzionando il Dos, per passare a un’altra si agisce con la combinazione [ Ctrl+Alt+F1 ] o [ Ctrl+Alt+F2 ]... 3882 DOSEMU: l’emulatore di hardware DOS compatibile 343.3.5 DOSEMU da X Per avviare il Dos in una finestra del sistema grafico X, conviene avviare DOSEMU attraverso ‘xdos’ che normalmente è un collegamento simbolico a ‘dos’. 343.3.6 DOSEMU e Mtools Nelle sezioni precedenti si è visto l’uso del file-immagine ‘/var/lib/dosemu/hdimage’, che costituisce normalmente il disco ‘C:’ per DOSEMU. Questo file non è gestibile con strumenti Unix normali, soprattutto perché non è un’immagine standard. Si tratta dell’immagine di un piccolo disco fisso contenente una partizione, con l’aggiunta di un’intestazione aggiuntiva. Questo disco ‘C:’ può essere utilizzato principalmente attraverso strumenti Dos all’interno di DOSEMU, così come è stato già mostrato, oppure può essere raggiunto anche tramite Mtools, purché configurato opportunamente. Infatti, è sufficiente informare Mtools sulla posizione esatta in cui ha inizio la prima partizione all’interno del file-immagine, per potervici accedere anche con questo strumento. Potrebbe trattarsi della direttiva seguente, nel file di configurazione ‘/etc/ mtools.conf’. drive n: file="/var/lib/dosemu/hdimage.first" partition=1 offset=128 In tal modo, per Mtools, il disco ‘N:’ corrisponderebbe al disco ‘C:’ di DOSEMU. È importante fare attenzione al valore dello scostamento (offset) che potrebbe cambiare da una versione all’altra di DOSEMU. 343.3.7 Implicazioni sulla gestione dei permessi Il Dos non è un sistema operativo multiutente e di conseguenza non è in grado di attribuire dei permessi ai file. Quando si utilizza il Dos all’interno di DOSEMU, i permessi vengono gestiti in modo predefinito. Quando si crea un file gli vengono attribuiti i permessi predefiniti in base a quanto stabilito con la maschera dei permessi; inoltre, l’utente e il gruppo proprietario corrispondono all’utente che ha avviato DOSEMU e al gruppo cui questo utente appartiene. Quando si accede a un file, l’apparenza delle caratteristiche di questo cambiano a seconda che l’accesso avvenga da parte di un utente rispetto a un altro: l’utente che ha creato il file può modificarlo, un altro potrebbe trovarlo protetto in sola lettura. In particolare, i file contenuti nel file-immagine che costituisce il disco ‘C:’ hanno le proprietà e i permessi del file-immagine stesso. Ma il Dos non è in grado di gestire tutte le finezze che può invece amministrare un sistema Unix, di conseguenza, quando si tenta di fare qualcosa che i permessi non consentono, si ottengono per lo più delle segnalazioni di errore che normalmente non si vedono quando si usa il Dos da solo senza emulazioni. Quando si utilizza il Dos con DOSEMU su un sistema al quale accede un solo utente, non dovrebbero porsi problemi: basta che l’unico utente utilizzi sempre lo stesso nominativo (lo stesso UID). Quando lo si utilizza invece in un sistema al quale accedono più utenti, è ragionevole desiderare che i dati personali possano essere inaccessibili agli altri; quindi, questo modo trasparente di gestire i permessi può essere solo positivo. Quando si vogliono gestire alcune attività in gruppo DOSEMU: l’emulatore di hardware DOS compatibile 3883 si può aggirare eventualmente l’ostacolo utilizzando un utente comune creato appositamente per quel compito. Un’ultima annotazione deve essere fatta per i file eseguibili che non necessitano dei permessi di esecuzione, come invece richiederebbe GNU/Linux. È generalmente sufficiente che ci siano i permessi di lettura. A volte sono necessari anche quelli in scrittura, ma prima di dare questi permessi è meglio verificare, onde evitare di lasciare campo libero a un possibile virus. Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org Capitolo 344 Servente X su altre piattaforme grafiche Una delle caratteristiche importanti di X è quella di permettere l’utilizzo di un servente grafico in una stazione di lavoro diversa dall’elaboratore in cui il programma applicativo viene eseguito realmente. Normalmente, quando la propria rete locale è composta sia da elaboratori con sistema operativo Unix che di altro tipo, si può accedere agli elaboratori Unix attraverso il protocollo TELNET, ma con questo strumento manca la possibilità di utilizzare le applicazioni che usano la grafica. Per questo occorre un programma che svolga le funzioni di X anche nelle altre piattaforme. Generalmente, tale programma sfrutta l’ambiente grafico del sistema operativo in cui si trova a funzionare. Un software del genere è anche chiamato terminale X , perché in pratica permette l’utilizzo di un elaboratore come terminale grafico per le applicazioni X. 344.1 MI/X MI/X 1 è un servente X in grado di gestire le finestre di applicazioni in funzione su altri elaboratori. Può funzionare solo se nell’elaboratore in cui viene installato è attivata la gestione delle connessioni TCP/IP. Ne esistono due versioni: una per MS-Windows 95/98/NT/2000 e una per MacOS. È prodotto da MicroImages, Inc., <http://www.microimages.com/>, che ne rilascia una versione gratuita, non molto sofisticata, ma funzionante. L’installazione di questo servente non richiede alcuna configurazione particolare, bisogna però ricordarsi di avviarlo prima di tentare di utilizzare applicativi che ne richiedono la presenza. Basta fare una connessione TELNET con l’elaboratore dal quale si vogliono avviare gli applicativi da utilizzare attraverso il servente grafico e ricordarsi di mettere l’opzione ‘-display’ seguita dall’indirizzo dell’elaboratore locale e del numero dello schermo, come nell’esempio seguente. L’elaboratore locale (MS-Windows) è roggen.brot.dg e quello remoto (Unix o GNU/Linux) è dinkel.brot.dg. C:\> TELNET dinkel.brot.dg[ Invio ] login: tizio[ Invio ] Password: ****[ Invio ] Finalmente appare l’invito dell’elaboratore remoto. dinkel$ xterm -display roggen.brot.dg:0[ Invio ] In questo modo dovrebbe apparire la finestra di terminale nel servente X locale. Il servente MI/X sfrutta l’ambiente grafico del sistema operativo in cui è stato installato, in particolare utilizza una finestra che, a sua volta, diventerà la finestra principale per tutte le applicazioni X. Il solo servente grafico non può essere sufficiente a gestire le finestre delle varie applicazioni. Per questo, MI/X incorpora un gestore di finestre simile a ‘twm’. MI/X può essere ottenuto direttamente da MicroImages, Inc., all’indirizzo <http:// www.microimages.com/freestuf/mix/download.htm>.2 1 2 MI/X software proprietario La versione gratuita di questo servente funziona bene se la profondità di colori è di 256, pari a 8 bit. Non è in grado 3884 Servente X su altre piattaforme grafiche di funzionare se la risoluzione è inferiore, mentre se è superiore, funziona, ma si possono presentare dei problemi. 3885 3886 Servente X su altre piattaforme grafiche 344.2 X-Win32 X-Win32 3 è un servente X in grado di fare gestire a MS-Windows 95/98/NT/2000 le finestre di applicazioni X che sono in funzione su altri elaboratori. Può funzionare solo se nell’elaboratore in cui viene installato è attivata la gestione delle connessioni TCP/IP. È prodotto da StarNet Communications Corporation <http://www.starnet.com/>. Di questo software non esiste alcuna versione gratuita, ma può essere scaricato liberamente dalla rete e provato in modalità dimostrativa (dopo alcune ore di funzionamento si interrompe eliminando i processi). Il funzionamento è analogo a quello di altri prodotti del genere. La particolarità più importante sta nella gestione delle finestre completamente a carico di MS-Windows, cosa che facilita notevolmente l’impiego. X-Win32 può essere ottenuto direttamente da StarNet all’indirizzo già segnalato. La stessa azienda produce anche una versione di questo servente funzionante su MS-Windows 3. . * Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org 3 X-Win32 software proprietario Capitolo 345 Applicazioni proprietarie La disponibilità di software proprietario per GNU/Linux dimostra la maturità di questo sistema operativo. Negli ambienti meno preparati dal punto di vista informatico, i sistemi operativi Unix sono semplicemente temuti. Il software proprietario confortevole e spesso uniforme tra una piattaforma e un’altra, permette di attenuare questi problemi di inserimento. Attualmente il software libero offre molte alternative valide alla maggior parte del software proprietario; pertanto, le notizie che appaiono in questo capitolo, hanno più un valore storico che altro. 345.1 Motif Motif 1 è un’interfaccia grafica sviluppata originariamente da OSF (Open software foundation), divenuta attualmente parte di The Open Group. Motif costituisce ancora uno standard molto importante, tanto che quasi tutte le applicazioni grafiche proprietarie, funzionanti su Unix e quindi su X, utilizzano questa GUI. La cosa più importante di Motif sono le librerie che possono fornire ai programmi una serie di funzioni e di oggetti grafici. 345.1.1 Link statico o dinamico Un programma che utilizza le librerie Motif può essere stato compilato utilizzando queste librerie in modo differente: con un link statico o dinamico. Un programma prodotto con un link statico si trova in pratica a incorporare le librerie, per cui, può essere utilizzato così com’è senza la necessità di installarle separatamente. Un programma prodotto con un link dinamico richiede la presenza delle librerie, ma ha il vantaggio di richiedere un po’ meno risorse rispetto a quello compilato in modo statico. Normalmente, la licenza di Motif consente di incorporare le librerie nel programma e non di distribuirle assieme al programma. Di conseguenza, se si vogliono utilizzare programmi che si servono delle librerie Motif in modo dinamico, occorre acquistare una copia delle librerie Motif. 345.1.2 Il prezzo del nome Motif viene commercializzato da diverse aziende che spesso utilizzando nomi differenti. Nella maggior parte dei casi si tratta sempre di lavori derivati dagli stessi sorgenti e perfettamente compatibili con l’originale, ma l’uso del nome Motif ha un prezzo. Per quanto riguarda la piattaforma i386 si possono trovare nomi come Moo-tiff, SWiM, Metro Link, MoTeeth,... 345.2 StarOffice 3.1 StarOffice 2 è stato prodotto dalla Star Division, oggi acquisita dalla Sun Microsystems (<http:// www.sun.com/staroffice/>). Si tratta di un pacchetto integrato per ufficio, comprendente un programma di scrittura, un foglio elettronico, un programma di disegno vettoriale, un programma per il fotoritocco, un disegnatore di grafici e un programma per la scrittura di equazioni. 1 2 Motif software proprietario StarOffice 3.1 software proprietario, gratuito per alcuni tipi di utenti 3887 3888 Applicazioni proprietarie Una delle caratteristiche più importanti è la sua compatibilità con i formati di altri prodotti proprietari, almeno fino alle versioni esistenti nell’anno 1997; inoltre, anche se si tratta di un’edizione molto vecchia, c’è da considerare che si tratta della versione che esige meno risorse per funzionare e per questo è l’unica che possa essere usata su macchine con poco più di 16 Mibyte di memoria centrale. La versione per GNU/Linux può essere ritrovata ancora in diversi FTP e per raggiungerli si può sempre chiedere aiuto a FTPSearch <http://www.alltheweb.com/?c=ftp>.3 345.2.1 Archivi necessari La versione GNU/Linux di StarOffice è organizzata in blocchetti contenuti in archivi compressi attraverso ‘tar’ e ‘gzip’. I file utili sono: • ‘StarOffice31-common.tar.gz’; • ‘StarOffice31-english.tar.gz’; • ‘StarOffice31-dynbin.tar.gz’, nel caso si disponga di Motif 2.0; • ‘StarOffice31-statbin.tar.gz’, nel caso non si disponga di Motif 2.0. Nel caso si disponga già dei file della versione 3.1beta4, basta utilizzare l’archivio ‘StarOffice31-upgrade2final.tar.gz’ per togliere la scadenza di funzionamento che aveva quella versione. Di fatto la versione 3.1 non è altro che la stessa 3.1beta4 senza alcuna scadenza. 345.2.2 Librerie Le versioni Unix di StarOffice, utilizzano la libreria grafica Motif 2.0, cioè un altro prodotto proprietario. Per questo motivo, tra i file di StarOffice che vengono distribuiti, esistono due tipi di binari: quelli che richiedono la presenza della libreria Motif e quelli che sono stati compilati in modo da contenerla già come libreria statica. I secondi sono i binari che possono essere utilizzati senza la libreria Motif, anche se ciò penalizza notevolmente le prestazioni di StarOffice. 345.2.2.1 libc StarOffice richiede la presenza di una versione di ‘libc’ superiore o uguale a 5.4.4. Se nel proprio sistema è installata una versione precedente, bisogna provvedere all’aggiornamento. Se non si ha la possibilità di effettuare un aggiornamento automatico, dopo aver copiato i file aggiornati della libreria nella directory ‘/lib/’, occorre correggere il collegamento ‘libc.so.5’, ma in un colpo solo! Supponendo di avere copiato i file della versione 5.4.28, si può procedere come nell’esempio seguente: # ln -sf /lib/libc.so.5.4.28 /lib/libc.so.5 3 Oltre alle considerazioni di carattere tecnico per motivare la scelta di una versione così antiquata, è importante notare che la versione 3.1 disponeva di una licenza molto chiara per la parte che riguarda l’utilizzo «non-commerciale», al contrario delle versioni immediatamente successive. Con l’acquisizione del prodotto da parte della Sun Microsystems, la versione 5.1 ha offerto il prodotto gratuitamente, con una licenza non ambigua. Applicazioni proprietarie 3889 345.2.3 Localizzazione StarOffice è sensibile al contenuto della variabile di ambiente ‘LANG’. Se contiene il valore corretto, cioè ‘it_IT’ (o ‘it_IT.ISO-8859-1’, si può verificare con ‘locale -a’), tutti i messaggi (o quasi) appariranno in italiano. Vale la pena di predisporre in ogni caso questa variabile, non solo per StarOffice. 345.2.4 Collocazione La collocazione del programma non è obbligatoria, a parte il nome della directory da cui si dirama tutto l’applicativo: ‘StarOffice-3.1/’. Normalmente si pongono due alternative: installare a partire dalla directory ‘/usr/local/’, oppure da ‘/opt/’: negli esempi che seguono si suppone di installare da questa ultima directory. Ci si posiziona nella directory ‘/opt/’ e da lì si espandono i file necessari. Se si installa la versione beta, occorre espandere l’archivio ‘StarOffice31-upgrade2final.tar.gz’ per ultimo. # cd /opt # tar xzvf StarOffice31-common.tar.gz # tar xzvf StarOffice31-english.tar.gz ... 345.2.5 Librerie dinamiche (ld.so) L’archivio ‘StarOffice31-common.tar.gz’, espandendosi, colloca una serie di librerie nella directory ‘/opt/StarOffice-3.1/linux-x86/lib/’. Prima di poter fare qualunque cosa con StarOffice, occorre aggiornare il file ‘/etc/ld.so.conf’ e avviare il programma ‘ldconfig’ in modo da ottenere un nuovo file ‘/etc/ld.so.cache’. Si procede aggiungendo la riga seguente al file ‘/etc/ld.so.conf’. /opt/StarOffice-3.1/linux-x86/lib/ Quindi si avvia semplicemente il programma ‘ldconfig’ che provvede a fare il resto. # ldconfig Eventualmente, se non si vuole intervenire in questo modo, si può agire su una variabile di ambiente, ‘LD_LIBRARY_PATH’, che deve contenere anche il percorso necessario a raggiungere le librerie di StarOffice. Questa variabile viene gestita normalmente attraverso uno script creato automaticamente dalla procedura di installazione. Applicazioni proprietarie 3890 345.2.6 Installazione personale: setup Finalmente, al termine di tutte queste operazioni ogni utente è pronto per installare StarOffice nella propria directory personale. Le operazioni seguenti vanno svolte utilizzando una finestra di terminale (come ‘xterm’ per esempio) all’interno dell’ambiente grafico X. $ cd /opt/StarOffice-3.1 $ ./setup StarOffice 3.1 Installation Tool Figura 345.1. Inizio della procedura di installazione personale di StarOffice. Dopo la presentazione, viene offerta una scelta possibile tra diversi tipi di installazione: • installazione da rete o CD; • personalizza installazione; • installazione minima; • installazione standard. Nel primo caso, viene creata la directory ‘~/StarOffice-3.1/’ contenente altre directory e poi soltanto collegamenti a file contenuti nella posizione originale. Negli altri casi, vengono copiate localmente le porzioni di StarOffice che si intendono utilizzare. In generale, dovrebbe essere sufficiente il primo tipo di installazione. Al termine, nella directory personale dell’utente si troveranno due script: ‘.sd.sh’ e ‘.sd.csh’. Il primo è fatto per essere interpretato da una shell Bourne o una compatibile, mentre il secondo da una shell C. In pratica, se si utilizza la shell Bash, si tratta di includere alla fine di ‘~/.bash_profile’ o ‘~/ .profile’, o ancora in ‘~/.bashrc’ (a seconda di come è organizzato il proprio sistema), la riga seguente: . ~/.sd.sh In questo modo, il file ‘.sd.sh’ viene letto ed eseguito. Il file ‘.sd.sh’, come pure ‘.sd.csh’, contiene la dichiarazione della variabile ‘LANG’ con il valore ‘us’. Evidentemente questo è sbagliato. Se è stato seguito il consigliato di predisporre la variabile ‘LANG’ nel modo corretto, basta commentare questa dichiarazione. Applicazioni proprietarie 3891 345.2.6.1 Se setup non funziona Potrebbe anche capitare che il programma ‘setup’ non funzioni nella propria installazione di GNU/Linux. Tuttavia, non è detto che sia pregiudicato il funzionamento del resto dell’applicativo. La cosa più importante che viene svolta dal programma di installazione è la creazione dei due file script citati precedentemente. Si può sostituire la loro funzione con lo script seguente, adatto per una shell Bourne o derivata. #!/bin/sh PATH="/opt/StarOffice-3.1/linux-x86/bin:$PATH" export PATH LD_LIBRARY_PATH="/opt/StarOffice-3.1/linux-x86/lib:$LD_LIBRARY_PATH" export LD_LIBRARY_PATH XPPATH="/opt/StarOffice-3.1/xp3" export XPPATH HELPPATH="/opt/StarOffice-3.1/linux-x86/modules" export HELPPATH XENVIRONMENT="/opt/StarOffice-3.1/starview.xres" export XENVIRONMENT SVFONTPATH="/opt/StarOffice-3.1/fonts/75dpi:\ /opt/StarOffice-3.1/fonts/75dpi/bdf:/opt/StarOffice-3.1/fonts/type1" export SVFONTPATH SVHOME="$HOME" export SVHOME Evidentemente, se si intende installare StarOffice a partire da una directory differente da ‘/opt/’, occorre cambiare i percorsi indicati nell’esempio. La creazione della directory ‘~/ StarOffice-3.1/’ (quella che parte dalla directory personale dell’utente) e delle discendenti, con il loro contenuto di collegamenti simbolici, non è strettamente necessaria: a volte si potrebbero ricevere delle segnalazioni di errore, così come qualche componente potrebbe non funzionare perfettamente. Eventualmente si può provare a creare un collegamento simbolico che punti direttamente alla posizione originale dell’applicativo, come nell’esempio seguente: $ ln -s /opt/StarOffice-3.1 ~/StarOffice-3.1 345.2.7 Avvio I file binari di StarOffice sono collocati nella directory ‘/opt/StarOffice-3.1/linux-x86/ bin/’, ma se l’installazione personale è stata eseguita correttamente, dovrebbero essere raggiungibili senza l’indicazione del percorso. Prima di avviare un eseguibile qualunque di StarOffice, conviene attivare la guida interattiva e il sistema di comunicazione interna. $ svdaemon $ svportmap I programmi a disposizione sono: • ‘sdraw3’ -- un disegnatore vettoriale; Applicazioni proprietarie 3892 • ‘swriter3’ -- un programma di scrittura; • ‘scalc3’ -- un foglio elettronico; • ‘smath3’ -- un programma per la scrittura di equazioni matematiche; • ‘schart3’ -- un programma di grafici; • ‘simage3’ -- un programma per il fotoritocco. 345.2.8 Linguaggio Se la variabile ‘LANG’ è configurata correttamente, i messaggi appaiono in lingua italiana, ma non tutti, dove mancano le traduzioni appaiono in inglese o in tedesco. È importante sapere che «beenden» significa terminare, ovvero, «fine lavoro». 345.2.9 Stampa StarOffice è (almeno in teoria) in grado di gestire alcuni tipi di stampanti diversi da PostScript. Utilizzando ‘lpr’ (cioè il sistema di stampa BSD, o uno compatibile), è sufficiente avere predisposto un filtro di stampa adatto a convertire il formato PostScript in quello della propria stampante. Quando si stampa, quindi, si deve scegliere il tipo di stampante ‘lp’, eventualmente modificando la riga di comando. Di solito è sufficiente specificare la voce corrispondente alla stampante o al filtro di stampa più adatto alle proprie esigenze. Figura 345.2. Richiamando l’impostazione della stampante, vengono proposti diversi tipi di driver, ma se il proprio sistema è configurato correttamente, dovrebbe essere sufficiente selezionare il tipo standard: ‘lp’. Applicazioni proprietarie 3893 Figura 345.3. La riga di comando per ottenere la stampa può essere modificata a seconda delle esigenze, per esempio si può cambiare l’indicazione della voce del file ‘/etc/printcap’ e di altre indicazioni. Di solito, non serve alcuna intestazione, in tal caso, l’opzione ‘-T’ non serve e può essere cancellata. 345.2.10 Semplificazioni nella distribuzione Debian La distribuzione GNU/Linux Debian organizza un pacchetto speciale, per installare StarOffice 3.1. Il nome del pacchetto in questione è ‘staroffice3’; con questo basta procurarsi i file che compongono la distribuzione originale di StarOffice 3.1 e collocarli nella directory ‘/tmp/’. L’installazione del pacchetto Debian, attraverso l’avvio degli script di installazione, provvede a installare anche i file di StarOffice, predisponendo tutti gli accorgimenti necessari a garantire il suo funzionamento corretto. Il pacchetto ‘staroffice3’ organizza anche alcuni script che avvolgono gli eseguibili originali. Questo serve a controllare all’avvio che tutto sia in ordine e, se necessario, ad avviare prima l’installazione personale del programma. In questo modo, vengono creati automaticamente anche i file ‘~/.sd.sh’ e ‘~/.sd.csh’, che poi vengono caricati automaticamente, senza la necessità di manomettere la configurazione della propria shell. In breve, se si utilizza la distribuzione Debian, l’installazione di StarOffice 3.1 diventa un’operazione banale. Se si vuole disinstallare StarOffice 3.1, quando questo è stato installato con l’aiuto del pacchetto Debian a cui si fa riferimento, basta disinstallare il pacchetto: i suoi script di disinstallazione provvedono a eliminarlo. 345.3 StarOffice 5.1 StarOffice 4 nella versione 5.1 torna a essere accessibile gratuitamente, con una licenza che consente espressamente la duplicazione per uso interno. Quello che conta è acquisire «correttamente» il pacchetto degli eseguibili binari, da una fonte autorizzata. A questo proposito, la stessa Sun Microsystems vende il CD-ROM (senza assistenza) a un prezzo molto basso. Comunque, è bene non fare confusione: non si tratta di software libero, ma di software gratuito.5 Questa versione di StarOffice è disponibile solo su piattaforma i386 e richiede molta memoria centrale: 64 Mibyte, anche se teoricamente ne basterebbero solo 32. Per quanto riguarda 4 StarOffice 5.1 e 5.2 software gratuito, non libero Per quanto riguarda la versione 5.1, la Sun Microsystems non consente la ridistribuzione del prodotto, benché questo sia gratuito, a meno che sia stato ottenuto un permesso esplicito dalla Sun stessa. In particolare, alle scuole è consentito di firmare una licenza apposita, nella quale viene consentito espressamente di distribuire l’applicativo al personale di facoltà e agli studenti, purché queste persone accettino a loro volta le condizioni della licenza. Per ottenere questo risultato, è necessario spedire una copia firmata di questa licenza specifica, che si ottiene dal sito della Sun. 5 3894 Applicazioni proprietarie GNU/Linux, è importante poter disporre di un kernel relativamente recente, sono indispensabili le librerie GNU C Library (ovvero ‘/lib/libc.so.6*’) ed è necessario che X sia messo in funzione con una risoluzione di almeno 256 colori (8 bit). 345.3.1 Archivio di partenza, documentazione e installazione nel sistema La versione GNU/Linux di StarOffice 5.1 è distribuita in pratica in un solo archivio ‘tar’, che non è compresso perché i file che contiene sono già stati compressi in precedenza. Il file in questione è ‘so51a_lnx_39.tar’, oppure potrebbe trattarsi di un nome simile in caso di edizioni successive, anche se attribuibili sempre alla stessa versione 5.1. Il contenuto di questo file deve essere estratto da qualche parte, per esempio in una directory temporanea: # tar xvf so51a_lnx_39.tar Come si vede, in questa fase conviene agire con i privilegi dell’utente ‘root’. Dopo aver estratto il contenuto dell’archivio, si ottengono due sottodirectory: in una si trova la documentazione (‘so51inst/documentation/’), che dovrebbe essere distribuita in forma di file PDF, mentre nell’altra (‘so51inst/office51/’) si trovano una serie di file che vengono usati nell’installazione. # cd so51inst/office51 Conviene spostarsi nella directory contenente i file necessari all’installazione, come si vede nell’esempio. Qui si dovrebbero trovare un paio di file di testo: ‘LICENSE’, che è bene leggere prima di iniziare l’installazione, e ‘README’ che riepiloga le informazioni salienti sull’installazione del pacchetto. Per iniziare l’installazione basta avviare l’eseguibile ‘setup’, tenendo conto però che è necessario farlo a partire dall’ambiente grafico. La prima volta che si installa il pacchetto nel sistema, è bene utilizzare l’opzione ‘/net’, in modo da renderla disponibile a tutti gli utenti: # ./setup /net A questo punto, il programma di installazione si avvia e comincia a mostrare le finestre di dialogo attraverso le quali guida l’amministratore all’installazione dell’applicazione. Viene mostrato il testo del file ‘README’ e del file ‘LICENSE’, quindi viene richiesta l’approvazione esplicita del contenuto del secondo. Successivamente si passa alla selezione dei componenti che si vogliono installare: in condizioni normali si seleziona tutto, «installazione standard», evitando così di essere interrogati ulteriormente a questo proposito. Dopo questa fase, subito prima di passare all’installazione dei file, viene richiesta la directory in cui dovrà risiedere l’applicativo. In questa situazione, è consigliabile limitarsi a due sole alternative: ‘/opt/Office51’, oppure ‘/usr/local/Office51’. Purtroppo, l’installazione generale non basta: ogni utente che vuole usare l’applicativo deve avviare una sua configurazione, attraverso la quale verrà anche invitato a registrarsi personalmente (anche se per questo non si è obbligati espressamente). Applicazioni proprietarie 3895 345.3.2 Installazione personale e avvio Una volta che i file di StarOffice sono stati installati nel sistema dall’amministratore, supponendo che questo sia avvenuto nella directory ‘/opt/Office51/’, l’utente che vuole farne uso deve configurarlo la prima volta, sempre attraverso l’interfaccia grafica: $ /opt/Office51/bin/setup Questa volta, oltre a chiedere l’approvazione della licenza d’uso, l’utente è invitato a inserire i propri dati, allo scopo di effettuare la registrazione. La compilazione di questa mascherina non è indispensabile per il funzionamento di StarOffice. Successivamente viene chiesto di precisare il tipo di «installazione» che si intende eseguire. Infatti, devono essere installati alcuni file, potendo scegliere tra l’installare solo il minimo indispensabile, «installazione workstation standard», oppure l’installazione dell’applicativo completo in una sottodirectory della propria directory personale. In condizioni normali, gli utenti sceglieranno la prima ipotesi. In ogni caso, questi file vanno installati da qualche parte ed è normale che questo avvenga nella directory ‘~/Office51/’. A partire dalle versioni 4. di StarOffice, è stato introdotto il file ‘.sversionrc’ nella directory personale degli utenti che hanno installato la sua configurazione. All’interno di questo file sono elencate le versioni installate dell’applicativo, assieme al percorso dell’eseguibile da avviare. Se l’utente ha già installato personalmente una copia dell’applicativo, che poi ha cancellato manualmente, mentre adesso vuole reinstallarne la configurazione, deve prima cancellare in questo file la riga che vi fa riferimento, altrimenti il programma propone di modificare l’impostazione dell’installazione precedente, anche se questa non c’è più. * L’avvio dell’applicativo, una volta completate le fasi di installazione e di configurazione, avviene per mezzo dell’eseguibile ‘soffice’, meglio se con tutto il suo percorso iniziale: $ /opt/Office51/bin/soffice & 345.3.3 Stampa In generale, se il proprio sistema GNU/Linux è stato configurato correttamente per ciò che riguarda la stampa, in modo che attraverso il comando ‘lpr’ possano essere stampati file PostScript, non c’è bisogno di modificare l’impostazione predefinita di StarOffice sulla stampa. Eventualmente, l’amministratore del sistema potrebbe valutare la possibilità di ritoccare qualcosa attraverso il programma ‘spadmin’: # /opt/Office51/bin/spadmin 345.4 StarOffice 5.2 StarOffice 5.2 ha un’installazione simile a quella della versione 5.1. L’archivio viene fornito in forma binaria, dove l’estrazione del contenuto prima dell’installazione vera e propria avviene in modo automatico, creando una directory temporanea che al termine viene rimossa. Per l’installazione è sufficiente il file eseguibile ‘so-5_2-ga-bin-linux-it.bin’, procedendo semplicemente secondo i passi seguenti: Applicazioni proprietarie 3896 1. l’utente ‘root’ avvia X e da lì, con una finestra di terminale, avvia l’eseguibile ‘so-5_2-ga-bin-linux-it.bin’ con l’opzione ‘/net’; # so-5_2-ga-bin-linux-it.bin /net & 2. l’utente ‘root’ richiede l’installazione in una directory conveniente, per esempio ‘/opt/ Office52/’; 3. al termine dell’installazione, l’utente ‘root’ conclude il funzionamento di X; 4. l’utente comune che vuole utilizzare StarOffice deve avviare a sua volta X; 5. l’utente comune, attraverso una finestra di terminale, avvia l’installazione personalizzata con l’eseguibile ‘setup’, specificando la modalità workstation standard, quando richiesto; $ /opt/Office/program/setup & 6. al termine dell’installazione personalizzata, l’utente comune può avviare StarOffice con il comando ‘/opt/Office/program/soffice’. $ /opt/Office/program/soffice & 345.5 Netscape Netscape Communicator 6 è prodotto dalla Netscape Communications Corporation (<http:// www.netscape.com>). Si tratta di un cliente integrato per diversi tipi di protocolli Internet, in particolare: HTTP, FTP e GOPHER, oltre che per la posta elettronica e i gruppi di discussione. Recentemente, la Netscape Communications Corporation ha dichiarato ufficialmente di rilasciare il suo prodotto, nella versione normale, in forma gratuita per qualunque piattaforma. 345.5.1 Configurazione Ogni utente ha una propria configurazione di Netscape e una propria gestione della memoria cache delle pagine visitate di recente. La prima volta che viene avviato, viene richiesta l’accettazione esplicita delle condizioni della licenza d’uso, quindi viene creata la directory ‘~/.netscape’ che poi si articola ulteriormente. $ netscape[ Invio ] 6 Netscape Communicator software gratuito, non libero Applicazioni proprietarie 3897 Figura 345.4. Quando un utente avvia per la prima volta Netscape, viene richiesta l’accettazione esplicita della licenza d’uso. Trattandosi di un prodotto proprietario, per quanto gratuito, è bene leggere e verificare la licenza. Figura 345.5. Dopo l’accettazione della licenza, viene creata una directory per contenere la configurazione e la memoria cache delle pagine visitate. La configurazione di Netscape è abbastanza intuitiva. In generale vi si accede attraverso il menù Edit, selezionando la voce Preferences. Applicazioni proprietarie 3898 Figura 345.6. La configurazione di Netscape, attraverso la selezione della voce dal menù Edit. Preferences, 345.5.2 Tempi morti Un problema che riguarda un po’ tutti questi programmi cliente, sono i tempi morti. Questi programmi, quando tentano di accedere a un risorsa senza riuscirci, restano a lungo in attesa prima di restituire una segnalazione di errore. Se si utilizza, o si gestisce, un servente DNS e questo non risulta raggiungibile, oppure a sua volta non riesce a raggiungere gli altri serventi DNS di livello superiore, le attese sono dovute al ritardo nella risposta nella risoluzione dei nomi. Quando si vuole utilizzare Netscape semplicemente per delle attività locali e si notano questi problemi nelle risposte, se si gestisce un servente DNS locale che, almeno temporaneamente, non ha accesso alla rete esterna, si può provare a disattivarlo utilizzando il comando seguente: # rndc stop[ Invio ] In seguito, per riattivarlo, basterà utilizzare il comando opposto. # rndc restart[ Invio ] 345.6 XV XV 7 è un applicativo proprietario di tipo shareware, anche se abbastanza permissivo, per l’elaborazione di immagini. È relativamente completo, nel senso che consente di effettuare un buon numero di operazioni e trasformazioni. Il suo funzionamento è un po’ insolito e le prime volte possono sfuggire molte delle sue buone qualità. 7 XV software gratuito, non libero Applicazioni proprietarie 3899 345.6.1 Avvio di XV xv [opzioni] [file ...] L’eseguibile ‘xv’ è quello che svolge tutto il lavoro. Si tratta di un programma interattivo con cui solitamente non viene usata alcuna opzione e nemmeno alcun nome di file. Quello che si ottiene è una finestra di presentazione sulla quale basta portare il cursore e fare un clic con il terzo tasto per ottenere il pannello di controllo del programma. Figura 345.7. All’avvio dell’eseguibile ‘xv’ senza argomenti, viene visualizzata questa immagine. Basta portavi sopra il puntatore del mouse e fare un clic con il terzo tasto per fare apparire il pannello di controllo. La finestra che contiene questa immagine di presentazione è quella utilizzata per mostrare le immagini che si elaborano, o che semplicemente si vogliono visualizzare. XV potrebbe essere utilizzato anche solo come mezzo per visualizzare delle immagini. In tal caso, indicando i nomi dei file nella riga di comando dell’eseguibile, si ottiene la visualizzazione del primo nella finestra iniziale e le operazioni più semplici possono essere compiute attraverso l’uso della tastiera. La tabella 345.1 elenca i comandi che possono essere impartiti attraverso la tastiera per ottenere lo scorrimento, la rotazione e l’ingrandimento delle immagini. Tabella 345.1. Alcuni comandi utili per l’uso di XV come visualizzatore di immagini. Tastiera Spazio m n t h v q Descrizione Passa all’immagine successiva. Ingrandisce l’immagine al massimo consentito dallo schermo. Riporta l’immagine alla sua dimensione normale. Ruota di 90 gradi in senso orario. Rovescia l’immagine orizzontalmente. Rovescia l’immagine verticalmente. Termina l’esecuzione del programma. 345.6.2 Controlli Come accennato precedentemente, portando il puntatore del mouse sull’immagine e premendo il terzo tasto appare il pannello di controllo di XV. La parte centrale di questo mostra un elenco di file di immagini. Questo potrebbe essere vuoto se il programma è stato avviato senza argomenti, come nel caso mostrato nella figura 345.8. Applicazioni proprietarie 3900 Figura 345.8. Il pannello di controllo di XV. Tutto attorno a questa zona centrale appaiono una serie di pulsanti grafici, che permettono di accedere a menù nascosti oppure eseguono subito delle funzioni particolari. 345.6.3 Caricamento, salvataggio, scorrimento e stampa I pulsanti grafici posti alla destra dell’elenco di file sono particolarmente importanti. La figura 345.9 mostra un elenco di immagini e i pulsanti relativi. Figura 345.9. Le funzioni principali del pannello di controllo di XV. La tabella 345.2 elenca le funzioni riferite a questi pulsanti. Tabella 345.2. Alcuni comandi utili per l’uso di XV come visualizzatore di immagini. Nome Previous Next Load Save Print Delete Descrizione Visualizza l’immagine precedente dell’elenco. Visualizza l’immagine successiva dell’elenco. Carica un file, lo aggiunge all’elenco e lo visualizza. Salva un’immagine, eventualmente cambiandone il formato o il nome. Stampa l’immagine selezionata. Elimina un’immagine dall’elenco oppure cancella il file corrispondente. Applicazioni proprietarie 3901 345.6.4 Funzionalità di uso frequente Nella parte inferiore del pannello di controllo appaiono alcuni pulsanti con significati che possono apparire più o meno oscuri, fino a quando non si è appreso il loro funzionamento. La figura 345.10 mostra questa serie di pulsanti. Figura 345.10. Le funzionalità di uso frequente, poste nella parte inferiore del pannello di controllo di XV. I pulsanti che non possono essere utilizzati, in funzione del contesto, sono offuscati. Molte di queste funzioni fanno riferimento a una zona dell’immagine selezionata. Questa zona può essere definita utilizzando il mouse, puntando il cursore su un punto nella finestra contenente l’immagine, premendo il primo tasto e trascinando. I pulsanti grafici della prima fila sono particolarmente importanti: 1. copia la zona selezionata dell’immagine visualizzata; 2. taglia la zona selezionata dell’immagine visualizzata; 3. riproduce la zona copiata o tagliata precedentemente; 4. cancella il contenuto di una zona; Per riprodurre una zona copiata o tagliata precedentemente, è necessario prima selezionare l’immagine su cui intervenire (potrebbe essere la stessa di origine). Quindi occorre selezionare la zona di destinazione, nel solito modo, attraverso un’operazione di trascinamento del mouse. Per facilitare tutto questo si può usare lo stesso pulsante grafico di riproduzione della zona ritagliata: la prima volta che viene richiamato evidenzia un rettangolo nell’immagine attuale che può essere spostato dove serve, trascinandolo con il mouse; la seconda volta che viene richiamato, incolla il ritaglio in quel punto. Quando di un’immagine serve solo una parte, basta selezionare la zona nel solito modo, attraverso il mouse. Quindi, utilizzando il pulsante C R O P si ottiene una nuova immagine contenente solo il pezzo selezionato precedentemente. Eventualmente, si può evitare questo metodo utilizzando al suo posto il salvataggio della sola zona selezionata. Un’altra funzionalità importante, racchiusa in questa parte del pannello di controllo, è il pulsante G R A B . Attraverso questo è possibile catturare una finestra o una zona dello schermo. 345.6.5 Menù Nella parte superiore del pannello di controllo appaiono alcuni pulsanti grafici che in realtà richiamano diversi menù. Possono apparire più o meno oscuri, fino a quando non si è appreso il loro funzionamento. Il manuale di XV è il punto di riferimento migliore per apprendere l’uso di queste funzioni. La figura 345.11 mostra questo sistema di menù. Figura 345.11. Il sistema di menù posto nella parte superiore. Applicazioni proprietarie 3902 In particolare, con il pulsante W I N D O W S è possibile selezionare un menù contenente un po’ di tutto. Attraverso la funzione Visual Schnauzer si ottiene un gestore di file (file manager) per la ricerca e la visualizzazione in anteprima delle immagini da caricare. La figura 345.12 mostra l’aspetto di questo gestore di file. Figura 345.12. Il gestore di file di XV. 345.7 Riferimenti • Matthew Borowski, StarOffice mini-HOWTO <http://www.linux.org/docs/ldp/howto/HOWTO-INDEX/howtos.html> Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org Parte lxxi Prevenzione 346 Copie di sicurezza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3904 346.1 Scelta del sistema di copia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3904 346.2 Strategia nelle copie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3906 346.3 Supporti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3908 346.4 Compressione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3908 346.5 Archiviazione e recupero attraverso tar e gzip . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3909 346.6 Archiviazione di un file system . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3914 347 Emergenza con GNU/Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3915 347.1 Dischetti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3915 347.2 Personalizzazione di dischetti di emergenza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3917 347.3 Dischetti Slackware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3918 347.4 Kernel per dischetti di emergenza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3920 347.5 Cavi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3921 347.6 Utenti e gruppi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3922 348 nanoLinux II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3923 348.1 Lavoro di cesello . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3923 348.2 Dischi più grandi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3927 348.3 Provare nanoLinux II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3927 348.4 Organizzazione di nanoLinux II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3930 348.5 Personalizzazione della procedura di inizializzazione del sistema . . . . . . . . . . 3936 349 Dischetti di emergenza delle distribuzioni GNU/Linux e di altre fonti . . . . . . . . . . . . 3938 349.1 SuSE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3938 349.2 Dischetti realizzati per scopi specifici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3942 3903 Capitolo 346 Copie di sicurezza L’amministrazione di un sistema Unix è da sempre un grosso problema sotto tutti i punti di vista. Il primo tra tutti è quello della salvaguardia dei dati, ma al rischio della loro perdita si pone rimedio solo attraverso una corretta gestione delle copie di sicurezza. 346.1 Scelta del sistema di copia Gli strumenti a disposizione per eseguire copie di sicurezza sono molti e si possono distinguere due estremi possibili: • copiare i file e le directory; • copiare una partizione o un disco intero. La copia di una partizione o di un disco può avere il vantaggio di permettere l’archiviazione della situazione esatta in cui si trova, problemi inclusi. Inoltre, non avendo un processo di lettura sui file, la data di lettura di questi non viene modificata. Lo svantaggio fondamentale di tale tipo di copia è che questa è riferita a un disco particolare (o a una partizione) di una macchina particolare: è molto poco probabile che si possano recuperare dati archiviati in questo modo in un disco fisso diverso. Questa tecnica, più che per eseguire delle copie di sicurezza, viene utilizzata per archiviare dischetti nel loro stato originale. La copia di file e directory non tiene conto del supporto fisico in cui si trovano e nemmeno del tipo di file system utilizzato. Questo comporta una serie di conseguenze: • i file e le directory vengono scanditi in lettura, alterando quindi le date di lettura; • i collegamenti simbolici vanno copiati come tali e non devono essere copiati gli oggetti a cui questi puntano; • i collegamenti fisici potrebbero non essere distinti. In generale, dal momento che una copia di file e directory è portabile, mentre una copia di un dispositivo intero non lo è (quando non si tratta di un dispositivo standard come i dischetti), dovrebbe essere preferibile la prima di queste due soluzioni. 346.1.1 Archiviazione È intuitiva la ragione per la quale le copie di sicurezza non vanno fatte archiviando un dispositivo intero come se fosse un file unico. La copia pura e semplice dei file e delle directory è una tecnica possibile, ma richiede condizioni particolari: • l’unità di destinazione deve essere in grado di accogliere i dati come sono all’origine, in pratica dovrebbe trattarsi di un disco; • deve trattarsi di unità rimovibili; • la capacità di queste unità deve essere maggiore di quella del file più grande che si ha a disposizione. Di solito si preferisce la tecnica dell’archiviazione dei dati in un file unico (che rappresenta l’archivio), assieme a tutte le informazioni necessarie per riprodurre i file e le directory originali. In questo modo si possono utilizzare unità di memorizzazione di qualunque tipo, eventualmente suddividendo l’archivio in pezzi più piccoli contenibili al loro interno. 3904 Copie di sicurezza 3905 346.1.2 Archiviazione di file speciali Gli oggetti contenibili in un file system possono essere di vario tipo (file puri e semplici, directory, file di dispositivo, collegamenti, ecc.) e così pure i loro attributi (permessi, date, ecc.). Il sistema di archiviazione che si utilizza deve essere in grado riprodurre correttamente tutti i dati del tipo di file system che si utilizza. Per esempio, non sarebbe possibile archiviare i dati di un file system Unix in un archivio ‘.zip’ che è nato per gli ambienti Dos. 346.1.3 Utenti e gruppi proprietari Tra gli attributi dei file, è molto importante l’indicazione degli utenti e dei gruppi proprietari. I programmi di archiviazione potrebbero non essere in grado di memorizzare il numero UID e GID, limitandosi ad annotare solo i nomi degli utenti e dei gruppi. In tal modo, nel momento del recupero, i numeri UID e GID verrebbero riprodotti in base alle caratteristiche del sistema, cioè in base alla particolare configurazione dei file ‘/etc/passwd’ e ‘/etc/group’. Il fatto che il programma di archiviazione memorizzi i numeri UID e GID, oppure che memorizzi i nomi di utenti e gruppi, ha delle implicazioni che si traducono, a seconda delle circostanze, in vantaggi o svantaggi. Se i dati archiviati devono essere riprodotti in un sistema diverso da quello di origine, in cui ci sono gli stessi nomi di utenti e di gruppi, che però potrebbero corrispondere a numeri UID e GID differenti, diventa conveniente un metodo di archiviazione che ignori i numeri degli utenti e dei gruppi. Tuttavia, se alcuni nomi di utenti o gruppi non sono presenti nel sistema di destinazione, la proprietà di questi file verrebbe assegnata automaticamente all’utente ‘root’. Quando si esegue una copia di sicurezza di un intero sistema e poi lo si vuole riprodurre altrove, si agisce per mezzo di un sistema operativo minimo, avviato probabilmente attraverso dischetti. In queste condizioni, lo scopo è quello di riprodurre esattamente il sistema originale, per cui, i numeri UID e GID andrebbero rispettati fedelmente, nell’attesa che sia ripristinato tutto, compresi i file ‘/etc/passwd’ e ‘/etc/group’ originali. Quando il programma di archiviazione memorizza entrambe le informazioni, sia UID/GID che i nomi, nel momento del recupero si pone il problema di come comportarsi quando questi non corrispondono. Si presentano queste alternative: • se i numeri corrispondono ai nomi, non si pongono problemi nell’estrazione; • se i numeri e i nomi non sono utilizzati nel sistema di destinazione, si possono estrarre i dati utilizzando i numeri originali, anche se non sono abbinati ad alcun nome; • se i numeri non sono utilizzati nel sistema di destinazione, mentre i nomi sì, si possono cambiare i numeri in modo che corrispondano i nomi; • se i nomi non sono utilizzati nel sistema di destinazione, mentre i numeri corrispondono a nomi differenti, non si può fare altro che recuperare i numeri come solo, assegnando in pratica la proprietà a utenti e gruppi con nomi differenti; • se sono presenti sia i nomi che i numeri, ma questi non hanno lo stesso abbinamento (cioè i numeri corrispondono a nomi diversi), dovrebbe essere preferibile cambiare i numeri in modo che corrispondano ai nomi. 3906 Copie di sicurezza 346.1.4 Percorsi assoluti o relativi Quando si intende archiviare una porzione di file system e quindi solo ciò che si trova a partire da una certa directory in poi, è importante sapere come si comporta il programma di archiviazione al riguardo della registrazione dei percorsi (path). Se si vuole archiviare la directory ‘/home/ tizio/esempi/’, il programma di archiviazione potrebbe registrare il suo contenuto in uno dei tre modi seguenti. 1. ‘/home/tizio/esempi/*’ 2. ‘home/tizio/esempi/*’ 3. ‘./*’ Naturalmente, ciò dipende anche dal modo in cui vengono date le istruzioni al programma stesso. Nel primo caso, quando dovesse rendersi necessario il recupero dei dati, questi verrebbero collocati esattamente nella directory indicata, in modo assoluto. Nel secondo, verrebbero collocati in modo relativo a partire dalla directory corrente, ottenendo così la directory ‘./home/ tizio/esempi/ ’. Nel terzo caso si avrebbe il recupero del contenuto di quella directory senza * informazioni sul percorso precedente. 346.2 Strategia nelle copie Le copie di sicurezza permettono di conservare la situazione dei dati in un istante determinato, ma i dati sono soggetti a continui aggiornamenti. Per questo occorre una procedura attraverso la quale si possa avere una gestione ordinata e ragionevolmente sicura delle copie. A parte i rischi connessi con il tipo di supporto utilizzato per le copie e il luogo in cui queste vengono conservate, vanno almeno considerate le modalità sequenziali con cui queste possono essere eseguite. È importante rispettare un paio di regole elementari: 1. non si riutilizzano i supporti contenenti la copia effettuata la volta precedente; 2. non si utilizzano supporti in cattive condizioni. 346.2.1 Generazioni delle copie Per distinguere una copia effettuata in un momento rispetto a quella fatta in un altro, si parla di generazione . In pratica, l’ultima copia di sicurezza effettuata è l’ultima generazione, mentre le altre sono tutte generazioni precedenti. Questo termine si riferisce naturalmente a copie fatte sullo stesso insieme di dati. Il buon senso suggerisce di utilizzare almeno tre generazioni di copie: l’ultima, quella precedente e quella ancora precedente. Copie di sicurezza 3907 346.2.2 Livelli delle copie La copia di un file system intero comporta solitamente un impegno consistente, sia in termini di tempo che di supporti impiegati. Il programma che si utilizza per le copie, oppure un gruppetto opportuno di script di shell, potrebbe permettere di effettuare la copia successiva dei soli file che sono stati modificati nel frattempo. Quando si esegue una copia dei soli file che risultano diversi rispetto all’ultima copia completa, si parla di copia di primo livello; quando se ne esegue un’altra in un momento successivo per le variazioni avvenute dopo quella di primo livello, si parla di secondo livello e così di seguito. A parte le difficoltà legate alla conservazione dell’informazione sullo stato dei file (di solito si tratta della data di modifica e di creazione), si pongono poi dei problemi nel momento in cui dovesse essere necessario un ripristino dalle copie. Si dovrebbe ripristinare l’ultima copia completa, seguita da tutte quelle aggiuntive dei soli file modificati, nello stesso ordine in cui sono state fatte: dalla più vecchia alla più recente. Sotto questo aspetto, quando non si vuole ripetere una copia completa troppo frequentemente, si cerca almeno di eseguire copie successive sempre di primo livello (si hanno quindi più generazioni di copie di primo livello). In tal modo, un eventuale recupero richiederebbe solo il ripristino dell’ultima generazione di copia completa e dell’ultima generazione di copia di primo livello. Questo sistema potrebbe non tenere conto dei file cancellati dopo l’ultima generazione di copia completa: in tal modo, un eventuale recupero dalle copie di sicurezza potrebbe comportare il ripristino di file che non servono più. 346.2.3 Distribuire le responsabilità In un sistema monoutente, l’unico utilizzatore è anche l’amministratore del proprio sistema e di conseguenza anche l’unico responsabile. Sarà quindi lui (o lei) a sapere esattamente cosa ha fatto e cosa è necessario copiare per sicurezza. In un sistema multiutente o comunque quando si condividono dati in gruppo, anche se a prima vista potrebbe sembrare conveniente la gestione delle copie in modo centralizzato, è comunque utile affidarla in parte anche alla responsabilità dei singoli: • periodicamente, un amministratore potrebbe occuparsi di eseguire la copia complessiva di tutto il sistema; • ogni giorno, gli utenti dovrebbero preoccuparsi di eseguire le copie dei dati di loro competenza. Nel momento in cui dovesse essere necessario, si dovrebbero recuperare i dati dalle copie generali fatte dall’amministratore e successivamente da quelle particolari dei singoli utenti. Se determinate attività vengono svolte in gruppo, si potrebbe eleggere ugualmente un responsabile all’interno di questo che si occupi delle copie di quell’attività. Il vantaggio di questo metodo sta nell’alleggerimento delle responsabilità dell’amministratore e nella soluzione più facile di piccoli problemi locali: • se un gruppo di lavoro ha alterato i dati a causa di un’operazione errata, è sufficiente recuperare i dati di quel gruppo senza disturbare l’intero sistema; • la distribuzione della responsabilità aumenta la consapevolezza da parte degli utenti. 3908 Copie di sicurezza 346.3 Supporti La scelta del supporto di conservazione della copia è importante e comporta alcune conseguenze: • il costo; • la disponibilità di unità in grado di utilizzarli; • la facilità o difficoltà nel recupero di porzioni dei dati archiviati. Il supporto tradizionalmente più economico e più diffuso nel passato è il nastro magnetico. Questo ha però lo svantaggio fondamentale di essere un mezzo di memorizzazione sequenziale: non è possibile estrarre un file se prima non si scorre tutto il nastro (o tutti i nastri) che c’è prima di quel dato. Un altro svantaggio importante sta nella necessità di rileggere il suo contenuto, dopo la copia, per verificare che i dati siano stati registrati correttamente. Da alcuni anni si possono trovare dischi rimovibili di grandi capacità a prezzi ragionevolmente bassi. Questi hanno il vantaggio di poter essere utilizzati come dischi normali, pertanto, il recupero di dati parziali diventa molto più facile, anche quando la copia di sicurezza avviene per mezzo di un’archiviazione tradizionale. Anche i CD-R sono diventati un ottimo mezzo di archiviazione, data l’economicità dei supporti: anche se è possibile una sola registrazione, il prezzo di un CD vergine è molto contenuto. La preparazione di un CD-ROM richiede molto spazio su disco per la preparazione dell’immagine prima dell’operazione di «incisione» (burn) e richiede anche l’investimento del masterizzatore. Si tratta di soldi ben spesi: una copia di sicurezza fatta su CD-ROM può essere letta ovunque ci sia un lettore, ma questo è ormai un accessorio standard degli elaboratori; inoltre, il CD-ROM ha una vita media molto lunga, garantendo la durata delle copie di sicurezza. Esiste tuttavia un problema nuovo: si deve essere prudenti con le copie obsolete. Infatti, quando le copie di sicurezza sono molto vecchie e non servono più, si può essere tentati di conservare i CD o di donarli a qualcuno, magari per gioco, o perché li usi come un addobbo. È evidente che si tratta di un’idea sbagliata: dal momento che questi CD-ROM sono stati usati per delle copie di sicurezza, contengono potenzialmente informazioni delicate e riservate. I CD-ROM contenenti copie di sicurezza obsolete vanno distrutti prima di essere gettati nel cassonetto del riciclaggio del materiale plastico! Per distruggere un CD, basta tagliarlo a metà con una forbice normale. Quando i dati da archiviare sono pochi, può convenire l’utilizzo dei soliti dischetti: sono sicuramente una scelta economica e le unità a dischetti sono disponibili ovunque. Per quanto riguarda la facilità di estrazione dei dati, ciò dipende dal modo con cui questi vengono usati: se si registrano i dati al loro interno senza fare uso di alcun file system, si ottiene un comportamento equivalente ai nastri; se si utilizzano con un file system, è necessario che l’archivio sia contenibile all’interno di un solo dischetto. 346.4 Compressione Il problema della dimensione dei dati da archiviare può essere ridotto parzialmente con l’aiuto della compressione. La tecnica della compressione può essere applicata all’archiviazione in due modi possibili: • prima della costruzione dell’archivio, ottenendo così un’archivio di file compressi; Copie di sicurezza 3909 • dopo la costruzione dell’archivio, ottenendo così un archivio compresso. La differenza è enorme. La compressione introduce un elemento di rischio maggiore nella perdita di dati: se una copia di sicurezza viene danneggiata parzialmente, l’effetto di questo danno si riflette in una quantità di dati maggiore (spesso è compromesso tutto l’archivio). 346.4.1 Compressione prima dell’archiviazione I programmi di archiviazione compressa maggiormente diffusi negli ambienti Dos utilizzano la tecnica della compressione prima dell’archiviazione. È questo il caso degli archivi ‘.zip’, ‘.arj’, ‘.lzh’ e di altri ancora. Tale sistema ha il vantaggio di permettere una facile scansione dell’archivio alla ricerca di file da estrarre (e decomprimere) o un ampliamento dell’archivio in un momento successivo alla sua creazione. Un altro vantaggio è la minore sensibilità alla perdita dei dati: se una parte dell’archivio è danneggiato, dovrebbe essere possibile ripristinare almeno il resto. Lo svantaggio principale è che la compressione fatta in questo modo, a piccoli pezzi, non è molto efficiente. 346.4.2 Compressione dopo l’archiviazione La compressione fatta dopo l’archiviazione elimina ogni possibilità di accedere ai dati contenuti nell’archivio e di poterlo ampliare, se non dopo averlo decompresso. Questo significa anche che un danneggiamento parziale dell’archivio implica la perdita di tutti i dati da quel punto in poi.1 Un altro tipo di problema deriva dalla difficoltà di distribuire un archivio compresso suddividendolo su più unità di memorizzazione. In questo caso però, l’efficienza della compressione è massima. Negli ambienti Unix, di fatto, è questa la scelta preferita. 346.5 Archiviazione e recupero attraverso tar e gzip La coppia ‘tar’ e ‘gzip’ rappresenta lo standard nell’archiviazione dei dati: ‘tar’ genera un archivio non compresso che può comprendere anche collegamenti simbolici e file speciali; ‘gzip’ lo comprime generando un archivio più piccolo. La coppia funziona così bene che ‘tar’ è in grado di utilizzare ‘gzip’ direttamente senza dover far uso di pipeline, purché il risultato dell’archiviazione non debba essere suddiviso su più supporti. L’origine del nome ‘tar’ è Tape archive, ma questo programma permette ugualmente di gestire qualunque altro tipo di sistema di memorizzazione. La versione GNU di ‘tar’ (quella utilizzata normalmente nelle distribuzioni GNU/Linux), non memorizza percorsi assoluti. I programmi ‘tar’ e ‘gzip’ sono descritti rispettivamente nelle sezioni 76.1.2 e 76.2.1. Nelle sezioni seguenti sono riportati alcuni esempi. Negli esempi seguenti si immagina di dover archiviare il contenuto della directory ‘~/ lettere/’, equivalente a ‘/home/tizio/lettere/’, comprese eventuali sottodirectory discendenti. 1 Ci sono programmi di archiviazione che si comportano così anche se non subiscono compressioni successive. 3910 Copie di sicurezza Negli esempi si cerca di utilizzare la forma tradizionale per l’indicazione delle opzioni standard di ‘tar’. Alcune di queste possono fare a meno del trattino iniziale, come nel caso di ‘c’ e ‘x’. Altre opzioni hanno quel trattino, ma possono essere aggregate in un’unica serie di lettere, come nel caso di ‘czvf’, dove si ha l’unione di: ‘c’, ‘-z’, ‘-v’ e ‘-f’. Copie di sicurezza 3911 346.5.1 Archiviazione diretta su dispositivi di memorizzazione L’archiviazione attraverso la registrazione diretta sui dispositivi utilizza completamente il supporto di memorizzazione destinatario, anche se la quantità di dati da archiviare è molto piccola. Quello sotto indicato è un esempio di archiviazione in un nastro magnetico singolo: l’opzione ‘c’ sta per Create; ‘-f’ sta per File e permette di definire la destinazione dell’archiviazione; ‘-z’ attiva la compressione attraverso ‘gzip’. Dal momento che si utilizza la compressione, l’archiviazione multivolume non è ammissibile. # tar czf /dev/ftape ~/lettere I dischetti possono essere utilizzati come i nastri, in modo sequenziale, ma questo lo si fa solo quando l’archivio generato non è contenibile in un solo dischetto: si ha quindi una copia multivolume e in tal caso non è ammissibile l’uso della compressione. # tar cf /dev/fd0u1440 -M ~/lettere In questo caso, l’opzione ‘-M’ sta proprio per Multivolume indicando quindi la possibilità che il supporto di destinazione non sia in grado di contenere l’intero archivio. In tal modo, ‘tar’ si prende cura di sospendere l’archiviazione ogni volta che viene raggiunta la capienza massima. ‘tar’ non è in grado di determinare da solo questa capacità, per cui, nell’esempio, il dispositivo del dischetto è stato indicato in modo da riconoscerne la geometria, ma in alternativa si poteva utilizzare l’opzione ‘-L’ seguita dalla dimensione: # tar cf /dev/fd0 -M -L 1440 ~/lettere Quando si utilizzano in questo modo, i dischetti non contengono un file system e di conseguenza non possono essere montati. La lettura del loro contenuto avviene nello stesso modo della scrittura, attraverso il nome del dispositivo. L’archiviazione su dischetti, attraverso il dispositivo, richiede comunque che questi siano già stati inizializzati (a basso livello) secondo il formato che viene indicato. Non conta che siano vuoti: è importante che ci siano le tracce e i settori come previsto. 346.5.2 Archiviazione normale su file Quando l’archiviazione può essere fatta su dischi (con file system ) di dimensione sufficiente a contenere l’archivio intero, invece di utilizzare l’opzione ‘-f’ per specificare un file di dispositivo, si può indicare direttamente un normalissimo file al loro interno, come nell’esempio seguente: $ tar cf /mnt/mo1/lettere.tar ~/lettere In pratica, nel caso appena visto, si utilizza un disco montato nella directory ‘/mnt/mo1/’ e si crea il file ‘lettere.tar’ al suo interno. L’archiviazione compressa, con l’utilizzo di ‘gzip’, può essere ottenuta semplicemente con l’opzione ‘-z’, come nell’esempio seguente: $ tar czf /mnt/mo1/lettere.tar.gz ~/lettere In tal caso l’estensione standard utilizzata (ma non obbligatoria) è ‘.tar.gz’ che rende esplicito il fatto che la compressione è stata fatta dopo l’archiviazione. In alternativa si può usare anche ‘.tgz’, diffusa nei sistemi Dos. 3912 Copie di sicurezza 346.5.3 Archiviazione e percorsi Gli esempi seguenti, pur archiviando gli stessi dati, mostrano un modo diverso di registrare i percorsi all’interno dell’archivio. La directory di lavoro nel momento in cui si avvia il comando, è ‘/home/tizio/’, corrispondente alla directory personale dell’utente. /home/tizio$ tar czf /mnt/mo1/lettere.tar.gz ~/lettere /home/tizio$ tar czf /mnt/mo1/lettere.tar.gz /home/tizio/lettere /home/tizio$ tar czf /mnt/mo1/lettere.tar.gz lettere /home/tizio$ tar czf /mnt/mo1/lettere.tar.gz ./lettere Nei primi due esempi, viene archiviata l’indicazione del percorso precedente, ma pur essendo stato dato in modo assoluto (‘/home/tizio/lettere’), questo viene reso relativo da ‘tar’, eliminando la prima barra obliqua che si riferisce alla directory radice.2 Negli ultimi due esempi, viene archiviata l’indicazione della sola directory ‘lettere/’, sempre in modo relativo. 346.5.4 Archiviazione di periodi I file sono forniti di informazioni orarie. In base a queste è possibile eseguire delle copie di sicurezza riferite a dei periodi. Le copie di sicurezza a più livelli possono essere ottenute in modo semplificato attraverso l’uso dell’opzione ‘-N’ seguita da una data di partenza: si ottiene l’archiviazione di quanto variato a partire da una certa data; di solito si utilizza quella dell’ultima archiviazione completa.3 $ tar czf /mnt/mo1/lettere.tar.gz -N 19970801 ~/lettere In questo caso, la data che segue l’opzione ‘-N’ rappresenta la mezzanotte del primo agosto 1997. $ tar czf /mnt/mo1/lettere.tar.gz -N "19970801 15:30" ~/lettere Questo ultimo esempio aggiunge alla data l’indicazione di un’ora particolare, 15:30; per evitare che sia interpretato in maniera errata, il gruppo data-orario viene racchiuso tra virgolette. 346.5.5 Archiviazione limitata a un’unità Quando si eseguono delle copie di sicurezza, è probabile che si voglia archiviare solo la situazione di una certa unità di memorizzazione (partizione o directory condivisa in rete). In tal caso si deve indicare precisamente questo limite con l’opzione ‘-l’ (Limit). 346.5.6 Estrazione dei percorsi Quando si accede all’archivio per estrarne il contenuto o per compararlo con i dati originali, entra in gioco il problema dei percorsi. I dati vengono estratti normalmente nella directory corrente, oppure vengono comparati utilizzando come punto di partenza la directory corrente. Quindi, se l’archivio contiene la directory degli esempi precedenti, registrata a partire dalla radice (ma come già spiegato, senza l’indicazione della radice stessa), questi verranno estratti in ‘./home/tizio/ lettere/’, oppure comparati con i dati contenuti a partire da questo percorso. 2 Questo comportamento riguarda almeno il programma ‘tar’ di GNU. Il concetto di variazione, in questo caso, si deve intendere come variazione del contenuto o degli attributi. Quindi si tratta della data di modifica o della data di «creazione». 3 Copie di sicurezza 3913 Se in fase di estrazione o comparazione si vuole fare riferimento a percorsi assoluti, si può utilizzare l’opzione ‘-P’. In questo modo si afferma esplicitamente che i percorsi indicati nell’archivio vanno considerati come discendenti dalla directory radice. Questo particolare della gestione dei percorsi è molto importante quando si fanno le copie di sicurezza: spesso si hanno dischi montati su punti di innesto provvisori, pertanto non è molto conveniente memorizzare anche il percorso su cui sono montati. 346.5.7 Recupero Per poter effettuare un recupero di dati da un archivio è necessario conoscere in particolare il modo in cui questo era stato creato: normale, compresso, multivolume. In generale, per recuperare dati da un archivio si utilizza l’opzione ‘x’ (Extract) al posto di ‘c’ e a essa si devono eventualmente aggiungere ‘-z’ nel caso di estrazione da un archivio compresso con ‘gzip’ o ‘-M’ nel caso di un archivio multivolume. Durante il recupero di una copia di sicurezza è importante fare in modo che i dati riprodotti mantengano gli stessi attributi originali (permessi e proprietà). Per questo si aggiungono le opzioni ‘-p’ (riproduce i permessi) e ‘--same-owner’ (riproduce le proprietà: UID e GID). L’esempio seguente mostra un recupero da un archivio multivolume su dischetti. ~$ tar x -M -p --same-owner -f /dev/fd0u1440 L’esempio seguente mostra un recupero con percorso assoluto: i percorsi indicati all’interno dell’archivio vengono aggiunti alla directory radice. $ tar xz -P -p --same-owner -f /mnt/mo1/lettere.tar.gz 346.5.8 Recupero parziale Il recupero parziale del contenuto di un archivio ‘tar’ può essere fatto per file singoli o per directory, oppure attraverso l’uso di caratteri jolly. In questo ultimo caso però, occorre fare attenzione a evitare che la shell esegua l’espansione: è compito di ‘tar’ determinare a cosa corrispondano all’interno dei suoi archivi.4 Valgono le regole solite: l’asterisco rappresenta un insieme di caratteri qualunque; il punto interrogativo rappresenta un carattere qualsiasi; le parentesi quadre rappresentano un carattere a scelta tra un insieme o tra un intervallo determinato. Quando si indicano nomi di file o directory, o quando si utilizzano i caratteri jolly, occorre tenere presente che si sta facendo riferimento ai dati contenuti nell’archivio, con i percorsi memorizzati originariamente. Inoltre, se con i caratteri jolly si determina la corrispondenza con una directory, si ottiene l’estrazione del contenuto complessivo di quella. L’esempio seguente mostra in che modo potrebbero essere recuperate le lettere contenute nella directory ‘home/tizio/lettere/nuove/’ (l’esempio appare diviso su due righe, a causa della sua lunghezza). $ tar xz -P -p --same-owner -f /mnt/mo1/lettere.tar.gz ←,→home/tizio/lettere/nuove L’esempio seguente mostra l’estrazione di tutti i file e delle directory corrispondenti a ‘home/ tizio/lettere/ve ’. Gli apici sono necessari per evitare che intervenga la shell a espandere * l’asterisco. 4 Questo è un po’ quello che accade a ‘find’ con l’opzione ‘-name’: è ‘find’ stesso ad analizzare i caratteri jolly. 3914 Copie di sicurezza $ tar xz -P -p --same-owner -f /mnt/mo1/lettere.tar.gz ←,→’home/tizio/lettere/ve*’ 346.5.9 Elenco e controllo Per ottenere un elenco del contenuto di un archivio e per compararne il contenuto con i dati originali, valgono le stesse regole del recupero dei dati. In particolare, al posto dell’opzione ‘x’ si deve utilizzare ‘t’ (List) per gli elenchi e ‘d’ (Diff ) per la comparazione. 346.6 Archiviazione di un file system L’archiviazione di un file system intero, va fatta considerando le caratteristiche di questo, in particolare della sua struttura fisica: partizioni e condivisione attraverso la rete. In generale dovrebbe essere conveniente l’archiviazione separata per ogni partizione e per ogni file system condiviso in rete. Oltre a questo occorre evitare di archiviare anche l’archivio che si sta creando: quando la destinazione dell’archiviazione è un file su disco, questo deve essere montato da qualche parte e per questo si potrebbe creare un circolo vizioso. Ci sono directory che, per la loro natura, non conviene o non devono essere archiviate: per ‘/tmp/’ non conviene; con ‘/proc/’ non si deve.5 In questi casi si deve solo ricordare di ricreare queste directory, nel momento in cui fosse necessario il recupero.6 346.6.1 Strumenti per il recupero L’archiviazione di copie di sicurezza non è sufficiente a garantirsi contro gli incidenti: in che modo si può avviare un elaboratore in cui è appena stato sostituito il disco fisso? Evidentemente, occorre essere più previdenti e predisporre in anticipo gli strumenti necessari per preparare le partizioni di un nuovo disco fisso e per recuperare i dati archiviati precedentemente. Questo argomento viene trattato nei prossimi capitoli. Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org 5 6 GNU/Linux Non bisogna dimenticare i permessi: ‘/tmp/’ 17778 e ‘/proc/’ 05558. Capitolo 347 Emergenza con GNU/Linux Nel momento dell’imprevisto si può agire solo se si è stati previdenti, pensando ai tipi di situazioni che si possono presentare e preparando gli strumenti necessari in anticipo. Le copie di sicurezza sono la prima cosa da fare per prepararsi ai guai, ma da sole non bastano: occorrono altri strumenti per rimettere in sesto un sistema prima di poter effettuare un eventuale recupero dalle copie. 347.1 Dischetti Di fronte a un problema qualunque di una gravità tale da non permettere l’avvio di un sistema locale, l’unica possibilità di intervenire è data da strumenti su dischetti. Esistono diversi tipi di dischetti che possono essere stati preparati in precedenza: • dischetti di avvio; • dischetti di installazione della distribuzione GNU/Linux; • dischetti preparati appositamente. 347.1.1 Dischetti di avvio Un dischetto di avvio può essere utile quando, per qualche motivo, il metodo normale di caricamento del sistema operativo non funziona più. Esistono almeno tre tipi di dischetti di questo tipo: • dischetti con un settore di avvio, ma senza kernel; • dischetti con un settore di avvio e con il kernel; • dischetti contenenti solo l’immagine del kernel. 347.1.1.1 Settore di avvio senza il kernel La prima soluzione, quella del dischetto senza kernel, non è adatta per avviare un sistema in difficoltà: è solo un modo per verificare una configurazione di LILO quando non si vuole interferire con l’MBR del disco fisso. In pratica si ottiene semplicemente indicando nel file ‘/etc/ lilo.conf’ la riga ‘boot=/dev/fd0’, come nell’esempio seguente: boot=/dev/fd0 prompt timeout=50 image=/boot/vmlinuz label=linux root=/dev/hda2 read-only Quando viene avviato l’eseguibile ‘lilo’ con questa configurazione, si ottiene la scrittura del primo settore del primo dischetto (il dischetto deve essere stato inizializzato in precedenza e può anche non contenere alcun file system). Ma in questo modo si intende che i file per il caricamento del sistema si devono trovare nella directory ‘/boot/’ del momento in cui si esegue ‘lilo’, 3915 3916 Emergenza con GNU/Linux ovvero nel file system in funzione in quel momento e non nel dischetto. Inoltre, anche il kernel ‘/boot/vmlinuz’ si intende contenuto in quel file system e non nel dischetto. Quando si avvia con un dischetto fatto in questo modo, il programma contenuto nel primo settore va alla ricerca del kernel e degli altri file, necessari per il caricamento del sistema, nel disco fisso nel momento dell’utilizzo di LILO. Se il sistema non si avvia perché questi file o il kernel sono stati spostati, a nulla serve un dischetto fatto in questo modo. 347.1.1.2 Settore di avvio e kernel Per fare in modo che il dischetto avvii un kernel contenuto al suo interno, è necessario che questo dischetto contenga un file system, che vi sia stata copiata la directory ‘/boot/’ con il suo contenuto, la directory ‘/etc/’ con il file ‘lilo.conf’ e che sia stata riprodotta la directory ‘/dev/’ con il file di dispositivo ‘fd0’ (assieme agli altri file di dispositivo necessari a individuare i dischi o le partizioni a cui si vuole fare riferimento). Quindi è sufficiente eseguire ‘lilo’ con l’opzione ‘-r’, come descritto nella sezione 18.4. Esiste anche la possibilità di usare SYSLINUX, che permette di realizzare un dischetto con le stesse caratteristiche e con meno difficoltà. SYSLINUX è descritto nel capitolo 16. Rispetto alla prossima tecnica, un dischetto contenente LILO e il kernel, come appena descritto, è uno strumento di avvio più completo perché permette di specificare, sia attraverso la configurazione del file ‘/etc/lilo.conf’ che per mezzo del cosiddetto bootprompt, alcuni parametri di avvio particolari del quale il proprio sistema potrebbe avere bisogno. 347.1.1.3 Immagine del kernel L’ultima possibilità è la più semplice e, sotto questo aspetto, anche la più sicura: il file del kernel viene copiato sul dispositivo del dischetto, senza fare uso di alcun file system. Si può utilizzare uno dei due modi seguenti. # cp vmlinuz /dev/fd0 # dd if=vmlinuz of=/dev/fd0 Evidentemente, il file del kernel è speciale perché riesce ad avviare se stesso. Il kernel da solo, però, potrebbe non sapere quale dispositivo contiene il file system principale da montare al momento dell’avvio. È necessario utilizzare il programma ‘rdev’ per inserire questa e altre notizie nel kernel. Supponendo che si debba avviare la partizione ‘/dev/hda2’, inizialmente in sola lettura, si procede come segue per fare queste annotazioni in un kernel copiato in un dispositivo ‘/dev/ fd0’: # rdev /dev/fd0 /dev/hda2 # rdev -R /dev/fd0 1 Emergenza con GNU/Linux 3917 347.1.2 Dischetti di una distribuzione La maggior parte delle distribuzioni GNU/Linux predispone dei dischetti di emergenza che consentono generalmente di accedere al disco fisso e di fare delle piccole riparazioni. Tra tutti, i dischetti più rudimentali sono quelli della distribuzione Slackware. La loro semplicità è da considerare un pregio, dal momento che utilizzandoli ci si trova di fronte un sistema GNU/Linux più o meno tradizionale, senza ottimizzazioni particolari. 347.1.3 Dischetti realizzati appositamente Ogni sistema ha le proprie caratteristiche ed esigenze. I dischetti di emergenza preparati da altri, oppure ottenuti da una distribuzione GNU/Linux, possono adattarsi a un certo insieme di situazioni, ma non a tutte. Quando si vuole essere sicuri di avere gli strumenti giusti al momento giusto, occorre che questi siano stati preparati e collaudati bene, in modo da non sprecare tempo inutilmente. In sostanza, la realizzazione o la personalizzazione di dischetti di emergenza è una tappa importante per chi vuole amministrare seriamente il proprio sistema. 347.2 Personalizzazione di dischetti di emergenza L’utilizzo di dischetti di emergenza preparati da altri è un buon punto di partenza, ma le particolarità che ogni sistema può avere consigliano almeno una personalizzazione del kernel. 347.2.1 Loopback block device Per poter costruire o almeno personalizzare dei dischetti di emergenza è particolarmente utile attivare nel kernel la gestione diretta delle immagini di questi (sezione 29.2.7). In questo modo, un’immagine non compressa di un dischetto può essere montata con un comando simile a quello seguente: mount -o loop -t tipo_di_file_system file_immagine punto_di_innesto 347.2.2 disco RAM Il file system principale può essere caricato in memoria centrale (RAM) e montato da lì. Si ottiene un cosiddetto disco RAM. A parte ogni considerazione sui vantaggi che questo può avere nelle prestazioni del sistema, si tratta di una modalità quasi obbligata per l’utilizzo di dischetti di emergenza. Infatti, un disco RAM può essere ottenuto a partire da un’immagine compressa: è il kernel stesso che la espande in memoria all’atto del caricamento. Quindi, si può fare stare in un dischetto un’immagine di dimensioni superiori alla sua capacità. Oltre a questo vantaggio, che però richiede la presenza di molta memoria RAM, un dischetto contenente un file system che è stato trasferito nella RAM, può essere rimosso subito dopo il suo caricamento, permettendo il riutilizzo dell’unità a dischetti, magari per accedere ad altri programmi di servizio non inclusi nel disco RAM. Per la gestione di un disco RAM occorre che il kernel sia configurato appositamente (29.2.7). 3918 Emergenza con GNU/Linux 347.2.3 Scostamento (offset) Quando il kernel carica un disco RAM da un’immagine contenuta in un dischetto, deve conoscere la posizione di inizio di questa immagine. Ciò è importante quando sia il kernel che l’immagine da caricare risiedono nello stesso dischetto. Quando l’immagine da caricare nel disco RAM è contenuta in un dischetto separato, questa si troverà normalmente a partire dall’inizio di questo, cioè da uno scostamento pari a zero. 347.3 Dischetti Slackware I dischetti della distribuzione Slackware sono i più semplici ed efficaci in situazioni di emergenza. Per essere avviati necessitano di un dischetto di avvio (boot) contenente il kernel, ma questo può essere eventualmente predisposto localmente in modo da avere a disposizione la configurazione più adatta al proprio sistema. Questi dischetti sono reperibili normalmente presso gli indirizzi seguenti: <http://www.ibiblio.org/pub/Linux/distributions/slackware/rootdsks/> <http://www.ibiblio.org/pub/Linux/distributions/slackware/bootdsks.144/> Il dischetto migliore per la soluzione di problemi è rappresentato dall’immagine compressa ‘rescue.gz’. Se si intende utilizzare anche un dischetto di avvio ottenuto dalla distribuzione, occorre sceglierlo in base alle indicazioni che si trovano nei file di testo inclusi nelle directory indicate. L’immagine ‘rootdsks/rescue.gz’ è compressa e contiene in pratica un disco in formato Ext2 di qualche mebibyte (simbolo: Mibyte). Questo implica che per poterne fare uso occorre molta memoria RAM. Nelle prime versioni della distribuzione Slackware era distribuita un’immagine ‘rescue.gz’ molto più piccola, che poteva essere espansa e collocata comodamente su un dischetto da 1440 Kibyte. Questa immagine è ancora disponibile e si trova nel percorso ‘rootdsks/ obsolete/rescue.gz’. Il fatto di poterla decomprimere su un dischetto da 1440 Kibyte permette di evitare il caricamento nella RAM. Per elaboratori aventi fino a 8 Mibyte di memoria RAM, questo è l’unico dischetto di emergenza che possa essere utilizzato ragionevolmente. Se si intende utilizzare l’immagine ‘rootdsks/obsolete/rescue.gz’, è necessario avviare con un kernel in grado di gestire i vecchi binari a.out. 347.3.1 Organizzazione dei dischetti Slackware Come già accennato, la distribuzione Slackware mette a disposizione immagini di dischetti di avvio, contenenti essenzialmente il kernel, assieme a immagini di dischetti contenenti il file system principale (root). Le immagini per l’avvio rappresentano dischetti con un file system normale, contenente un settore di avvio, la directory ‘/boot/’ e il kernel. Si tratta in pratica di dischetti realizzati in modo analogo a quanto descritto in precedenza nella sezione 347.1.1, quando si faceva riferimento a dischetti contenenti questi elementi. Le immagini dei dischetti di avvio, anche se non sono di dimensioni pari a quelle di un dischetto normale, non dovrebbero essere compresse e si possono copiare semplicemente sul dispositivo del dischetto di destinazione. Emergenza con GNU/Linux 3919 # dd if=net.i of=/dev/fd0 Le immagini dei dischetti contenenti il sistema minimo (root), sono invece dischetti di qualche mebibyte, compressi in modo da poter essere collocati all’interno di un dischetto da 1440 Kibyte, costringendo però all’uso di un disco RAM. 347.3.2 Utilizzare un kernel personalizzato Per abbinare un kernel personalizzato a un dischetto contenente il sistema minimo della distribuzione Slackware, si potrebbe ricostruire un dischetto di avvio seguendo le stesse modalità usate dalla distribuzione stessa, oppure in maniera più semplice, copiando il kernel in un dischetto direttamente attraverso il suo dispositivo e poi intervenendo con il programma ‘rdev’. Viene descritta l’ultima di queste modalità. # dd if=zImage of=/dev/fd0 La copia di un kernel in un dischetto, attraverso il suo dispositivo, genera il solito dischetto di avviamento già descritto tante volte. Questo kernel su dischetto deve però essere informato di dove e come fare il caricamento del sistema. Il file system principale viene caricato da un dischetto, quindi si scrive questo messaggio nel kernel attraverso ‘rdev’. # rdev /dev/fd0 /dev/fd0 I dischetti contenenti il sistema minimo della distribuzione Slackware non prevedono il controllo del file system e il successivo montaggio in lettura e scrittura. In pratica, il file system principale deve essere montato inizialmente in lettura-scrittura. # rdev -R /dev/fd0 0 Infine si deve specificare che: • l’immagine del dischetto contenente il sistema (compressa o meno che sia) si trova in un dischetto separato e parte dalla posizione iniziale: lo scostamento è pari a zero; • si vuole, oppure non si vuole, che tale dischetto sia caricato in un disco RAM; • si vuole un preavviso per sapere quando si può togliere il dischetto del kernel per inserire il dischetto contenente il sistema. Per fare questo si agisce su una serie di bit configurabili attraverso ‘rdev’ con l’opzione ‘-r’: • i primi 11 (dal bit 0 al bit 10) permettono di definire l’indirizzo dello scostamento (in blocchi di 1024 byte); • il bit 14 indica che si vuole caricare un disco RAM; • il bit 15 indica che si vuole avere una pausa per lo scambio dei dischetti. Se si vuole caricare il file system principale in un disco RAM si deve utilizzare ‘rdev’ nel modo seguente: # rdev -r /dev/fd0 49152 infatti, 215 + 214 + 0 = 49152. Se invece non si vuole il disco RAM si deve utilizzare ‘rdev’ nel modo seguente: Emergenza con GNU/Linux 3920 # rdev -r /dev/fd0 32768 infatti, 215 + 0 + 0 = 32768. 347.4 Kernel per dischetti di emergenza Quando si configura un kernel da utilizzare assieme a dischetti di emergenza, occorre tenere presente che non è ragionevolmente possibile utilizzare i moduli ed è importante attivare determinate caratteristiche che di solito non vengono considerate per i sistemi normali. • Gestione dei binari a.out. I dischetti di emergenza obsoleti sono nel vecchio formato a.out. Il kernel deve essere stato predisposto per gestirli. Kernel support for a.out binaries • File system Minix. Il file system più utilizzato in passato per i dischetti di emergenza, specialmente quando questi dovevano essere di dimensioni minime, è Minix. Anche se adesso i dischetti di emergenza che si trovano in circolazione sono prevalentemente in formato Ext2, conviene includere la gestione di questo vecchio tipo di formato. Minix fs support • dischi RAM. Anche se non si intendono utilizzare dischetti caricati in memoria RAM, vale la pena di preparare un kernel che ne permetta comunque l’utilizzo. RAM disk support • Porta parallela PLIP. Un kernel per un dischetto di emergenza deve permettere la gestione della rete (TCP/IP) e, in particolare, invece di attivare la gestione della porta parallela per la stampa, conviene attivare la gestione della connessione PLIP. PLIP (parallel port) support 347.4.1 Tastiera Quando si usano dei dischetti di emergenza si hanno già molte limitazioni e a queste si aggiunge anche la scomodità di una tastiera che non combacia con quella USA. Si può risolvere il problema direttamente nel kernel senza dover tentare di inserire il programma ‘loadkeys’ in dischetti già troppo piccoli. È sufficiente trovare il file della mappa della tastiera italiana (di solito si tratta del file ‘it.kmap’ collocato nella directory ‘/usr/share/keymaps/ piattaforma /qwerty/’) e quindi generare il sorgente ‘defkeymap.c’. Si procede come segue, nel caso si utilizzi la piattaforma i386. # cd /usr/src/linux/drivers/char # loadkeys --mktable /usr/share/keymaps/i386/qwerty/it.kmap ←,→> defkeymap.c La compilazione successiva di un nuovo kernel utilizzerà la mappa italiana come predefinita e non ci sarà bisogno di utilizzare ‘loadkeys’. Emergenza con GNU/Linux 3921 347.5 Cavi Quando si ha la disponibilità di più elaboratori, è probabile che il danno presentatosi su uno di questi non si sia riprodotto in tutti. Una piccola rete locale potrebbe essere di aiuto in situazioni di emergenza e in sua mancanza potrebbero andare bene anche dei cavi paralleli PLIP. Questo tipo di cavo viene descritto nella parte xciv. La sua realizzazione non è difficile: basta un piccolo saldatore, un po’ di stagno, due connettori maschi DB-25 e una piattina multipolare con almeno 13 fili. La schermatura non è necessaria. Con i dischetti della distribuzione Slackware, preferibilmente con l’immagine ‘resque.gz’, è possibile stabilire una semplice connessione con un servente NFS. 347.5.1 Ethernet Attraverso una connessione Ethernet, con un’interfaccia riconosciuta come ‘eth0’, si può agire come nell’esempio seguente. Si suppone in particolare che l’indirizzo di rete sia 192.168.1.0, che la maschera di rete sia 255.255.255.0 e di poter utilizzare l’indirizzo IP 192.168.1.17 per l’elaboratore avviato con i dischetti di emergenza. # ifconfig eth0 192.168.1.17 netmask 255.255.255.0 # route add -net 192.168.1.0 netmask 255.255.255.0 dev eth0 Per verificare la connessione si può fare un ‘ping’ verso l’elaboratore da raggiungere: potrebbe trattarsi dell’indirizzo 192.168.1.1. # ping 192.168.1.1 Se tutto è andato bene si può procedere. Si suppone che l’elaboratore 192.168.1.1 metta a disposizione il suo file system a partire dalla directory radice. # mount -t nfs 192.168.1.1:/ /mnt 347.5.2 PLIP Nel caso di una connessione PLIP, la procedura è un po’ differente. In particolare bisogna ricordare che l’elaboratore dal quale si vogliono attingere i dati attraverso il protocollo NFS, deve avere un kernel compilato in modo da gestire questo tipo di connessione. Si fa riferimento allo stesso esempio riportato nella sezione precedente. L’unica differenza sta nell’interfaccia usata per la comunicazione: si suppone che sia stata riconosciuta la ‘plip1’ da entrambi i lati. Il procedimento di connessione va fatto da entrambi i capi, infatti, raramente un elaboratore ha una connessione PLIP stabile, per cui non si trova ad avere un indirizzo e una tabella di instradamento già pronti. Dal lato dell’elaboratore avviato con i dischetti si procede come segue: rescue# ifconfig plip1 192.168.1.17 pointopoint 192.168.1.1 rescue# route add -host 192.168.1.17 dev plip1 rescue# route add -host 192.168.1.1 dev plip1 3922 Emergenza con GNU/Linux Dal lato dell’elaboratore servente si effettua l’operazione inversa. server# ifconfig plip1 192.168.1.1 pointopoint 192.168.1.17 server# route add -host 192.168.1.1 dev plip1 server# route add -host 192.168.1.17 dev plip1 Per verificare la connessione si può fare un ‘ping’. rescue# ping 192.168.1.1 Se tutto è andato bene si può procedere montando il file system di rete. rescue# mount -t nfs 192.168.1.1:/ /mnt 347.5.3 Considerazioni accessorie Il dischetto di emergenza ha bisogno di un altro punto di innesto per accedere a un disco fisso locale. È sufficiente creare un’altra directory. Quando si accede a un servente NFS e non è possibile farlo mantenendo i privilegi dell’utente ‘root’, una semplice copia attraverso ‘cp -dpR’ non dà un risultato garantito: alcuni file potrebbero risultare inaccessibili in lettura. La cosa si risolve facilmente impacchettando quello che serve nell’elaboratore di origine e dando a questo archivio tutti i permessi necessari. 347.6 Utenti e gruppi Quando si utilizza un sistema operativo minimo, avviato attraverso dischetti di emergenza, per recuperare i dati da uno o più archivi, occorre fare mente locale al problema dell’abbinamento utenti/gruppi, UID/GID. Trattandosi di un sistema minimo, conterrà alcuni nomi di utenti e di gruppi, presumibilmente non «umani», ma comunque esistenti. Solitamente, questi nomi di utenti e di gruppi sono standardizzati, tuttavia il loro abbinamento con numeri UID/GID non è sempre uniforme. A questo punto, se si recuperano i dati di un sistema in cui questi nomi non corrispondono esattamente, si rischia di riprodurre una copia differente, che non sarà valida quando il sistema normale sarà ripristinato. Se non ci sono alternative, si può accettare l’inconveniente, riavviare il sistema rigenerato e ripetere il recupero. In questo modo, i file verranno sovrascritti e le proprietà saranno abbinate in base ai nuovi file ‘/etc/passwd’ e ‘/etc/group’. In generale, proprio per questo problema, sarebbe opportuno che il dischetto di emergenza contenesse esclusivamente l’indicazione dell’utente e del gruppo ‘root’, eliminando qualunque altro tipo di utente di sistema. Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org Capitolo 348 nanoLinux II In questo capitolo si intende descrivere in che modo si può preparare un sistema GNU/Linux di emergenza attraverso un esempio allegato a questa documentazione. In questo periodo le unità di memorizzazione a disco, di medie o alte capacità, diventano sempre più accessibili e presto potrebbero addirittura sostituire completamente i nastri. In questa situazione, un piccolo sistema GNU/Linux potrebbe risiedere all’interno di dischi, insieme a delle copie di sicurezza, di modo che, con l’aiuto di un semplice dischetto di avvio, si possa ripristinare facilmente un sistema danneggiato. A parte le considerazioni legate a una buona strategia per la sicurezza del proprio sistema, un piccolo sistema GNU/Linux può essere un buon banco di scuola per apprendere il funzionamento di componenti che altrimenti sfuggono nell’intrico di file di cui un sistema normale è composto. Le condizioni alle quali è sottoposto l’utilizzo di nanoLinux II sono riportate nell’introduzione. nanoLinux II contiene una vecchia edizione di Secure Shell, con una licenza particolare, benché gratuita. nanoLinux II è un lavoro ormai obsoleto, ma può essere ancora utile in situazioni di emergenza. 348.1 Lavoro di cesello Il modo più semplice per arrivare a una mini configurazione è quello di preparare una piccola partizione, installarvi GNU/Linux selezionando il minimo numero possibile di pacchetti, cancellando tutto quello che sembra inutile per i propri scopi. Naturalmente, non si può fare tutto in una volta, bisogna andare per tentativi: a un certo punto si potrebbe scoprire semplicemente che questo sistema non si avvia più. Quanto più la distribuzione GNU/Linux che si utilizza è sofisticata, attenta alla sicurezza e gradevole da utilizzare, tanto più difficile sarà questa operazione. Se il risultato finale è di dimensioni ragionevolmente piccole (la dimensione critica potrebbe essere intorno agli 8 Mibyte), si può decidere di preparare un file-immagine. Quindi, con un po’ di fortuna, se comprimendolo si riesce a stare al di sotto della dimensione fatidica di 1440 Kibyte, si può realizzare il proprio dischetto di emergenza, altrimenti occorre lasciare fuori una parte che non pregiudichi l’avvio, caricandola durante la fase di inizializzazione del sistema. 348.1.1 Scegliere la fonte Un mini sistema GNU/Linux necessita di pochi attributi: semplicità e funzionalità. La sicurezza non conta, o almeno non dovrebbe. Quando si sceglie la fonte di GNU/Linux da «cannibalizzare» per arrivare a una propria miniconfigurazione, non contano le misure di sicurezza che potrebbero invece servire a complicare le cose ulteriormente. Per questo è il caso di rivolgersi alla distribuzione Slackware: la più semplice e spartana, sia per il modo in cui sono realizzati i pacchetti che per la semplicità nella struttura degli script della procedura di inizializzazione del sistema (‘/etc/rc.d/*’). Vale la pena di ricordare che per installare un pacchetto Slackware qualunque basta decomprimere i pacchetti con ‘tar’ ed eseguire lo script ‘/install/doinst.sh’. 3923 3924 nanoLinux II 348.1.2 Installare e cancellare il superfluo Dopo aver installato il minimo indispensabile, si procede con la cancellazione di ciò che non è assolutamente necessario, come per esempio la documentazione. Il vero problema sono le librerie: bisogna conservare fino all’ultimo quelle contenute in ‘/lib/*’; solo dopo che è stato deciso quale insieme di programmi si vuole mantenere si potranno eliminare le librerie superflue. Ci sono due librerie essenziali: • ‘/lib/ld.so’, la libreria dinamica per i binari compilati in formato a.out; • ‘/lib/ld-linux.so’, la libreria dinamica per i binari compilati in formato ELF. Se si utilizza solo uno dei due formati di programmi binari, basta la libreria dinamica relativa. Il nome effettivo di queste librerie è formato spesso dall’aggiunta dei numeri di versione. Quindi, ‘ld.so’ potrebbe essere in realtà ‘ld.so.1.7.14’, o qualunque altra cosa. Per fare in modo che non ci siano problemi a raggiungere le librerie, occorre abbinare dei collegamenti (di solito sono collegamenti simbolici) in modo da mantenere i riferimenti ai nomi normali. Per conoscere di quali altre librerie si può avere bisogno, basta utilizzare il programma ‘ldd’. Per esempio: $ ldd /bin/gzip[ Invio ] libc.so.5 => /lib/libc.so.5.4.38 (0x40002000) Quando si interviene con i file di libreria, specialmente nel caso in cui questi vengano spostati o aggiunti, è necessario rigenerare il file ‘/etc/ld.so.cache’, attraverso il programma ‘ldconfig’. Se si sta tentando di preparare un sistema su un disco che non sia il file system principale attuale, il file ‘ld.so.cache’ potrebbe trovarsi ovunque, per esempio in ‘/mnt/prove/etc/ ld.so.cache’. In una situazione del genere, si può utilizzare l’opzione ‘-r’, come mostrato nell’esempio seguente: # ldconfig -r /mnt/prove 348.1.3 Revisione della procedura di inizializzazione del sistema Vale la pena di analizzare e modificare anche l’insieme di script che compongono la procedura di inizializzazione del sistema, quelli che solitamente si trovano sotto ‘/etc/rc.d/’. Da loro dipende l’avvio e l’arresto corretto del sistema. L’attivazione di tutti i demoni superflui può essere eliminata. Se l’obiettivo finale è quello di realizzare un dischetto da caricare come disco RAM, non è possibile fare il controllo della partizione o del disco contenente il file system principale. nanoLinux II 3925 348.1.4 Preparazione di un file-immagine Quando si pensa di avere raggiunto un risultato accettabile, se le dimensioni sono ragionevoli, si può preparare un file da utilizzare come immagine di un disco ipotetico. Si pone subito il problema della scelta del formato: Ext2 o Minix? Probabilmente il sistema appena sintetizzato avrà un numero molto elevato di file a causa dei dispositivi elencati all’interno di ‘/dev/’. Se non si eliminano quelli superflui, un’immagine Minix potrebbe non permettere l’inserimento di un numero di file così elevato. Nel caso del tipo Ext2 occorre specificare una dimensione di inode molto piccola per permettere l’inserimento del massimo numero di voci possibili. Si inizia con la creazione del file-immagine, per esempio di 4 Mibyte. # dd if=/dev/zero of=~/miniroot.img bs=1k count=4k Nell’esempio viene creato il file ‘~/miniroot.img’, composto da caratteri <NUL>. Si procede quindi con la creazione di un file system Ext2. # mke2fs -v -m 0 -i 1024 ~/miniroot.img In questo modo si ottiene la creazione del file system; in particolare non viene riservata alcuna parte per l’utente ‘root’ e la dimensione degli inode viene limitata a 1024 byte (il minimo possibile). Si ottiene quindi la possibilità di inserire un massimo teorico di 4096 file al suo interno. Il programma fa notare che non si tratta di un disco, ma basta confermare e l’operazione procede ugualmente. Un controllo può essere utile per verificare la situazione. # e2fsck ~/miniroot.img Infine, per potervi inserire il sistema GNU/Linux creato, si deve eseguire il montaggio dell’immagine (sempre che il kernel permetta di farlo). # mount -o loop -t ext2 ~/miniroot.img /mnt Nel file-immagine non vanno copiati i file contenuti nella directory ‘/boot/’ e tanto meno il kernel. 348.1.5 Preparazione del dischetto Con un po’ di fortuna, si riesce a comprimere il file-immagine portandolo a una dimensione così piccola da poter essere contenuto in un dischetto. Prima di farlo, occorre che sia stato smontato. # umount /mnt # gzip -9 ~/miniroot.img Il risultato sarà naturalmente il file ‘~/miniroot.img.gz’. Se è andato tutto bene, si può trasferire in un dischetto. # dd if=~/miniroot.img.gz of=/dev/fd0 Al termine il dischetto è pronto. nanoLinux II 3926 348.1.6 Kernel L’ultima cosa da fare è la preparazione del kernel. Nel capitolo precedente sono state descritte alcune caratteristiche importanti che questo dovrebbe avere. Vale la pena di ricordare che deve essere in grado di gestire i dischi RAM, altrimenti non si può avviare un’immagine compressa. Alla fine deve essere preparato nel modo seguente: 1. Viene copiato nel dispositivo del dischetto. # dd if=zImage of=/dev/fd0 2. Il file system principale si troverà nel dischetto posto nella prima unità (anche se si tratta di un’immagine compressa). # rdev /dev/fd0 /dev/fd0 3. Il file system principale viene aperto inizialmente in lettura e scrittura: trattandosi di un disco RAM non è possibile fare altrimenti. # rdev -R /dev/fd0 0 4. L’immagine contenente il file system principale si trova in un dischetto separato, nel quale si colloca a partire dalla posizione iniziale dello stesso: lo scostamento è zero; si vuole che l’immagine del file system principale sia caricata in un disco RAM; si vuole un preavviso per sapere quando si può togliere il dischetto del kernel per inserire il dischetto successivo. 215 + 214 + 0 = 49152 # rdev -r /dev/fd0 49152 La dimensione predefinita del disco RAM è di 4 Mibyte. Se questo non basta, occorre informare il kernel in qualche modo. Se ci si trova in questa situazione, non è più tanto conveniente l’utilizzo di un kernel copiato direttamente e configurato attraverso ‘rdev’; piuttosto diventa preferibile la preparazione di un dischetto con LILO che provvede all’avvio del kernel con tutte le opzioni necessarie. A questo proposito, si potrebbe usare una configurazione di ‘/etc/lilo.conf’ simile a quanto descritto più avanti in riferimento a nanoLinux II. 348.1.7 Ultime considerazioni Se si è fortunati, la coppia di dischetti è pronta per essere collaudata. Naturalmente, oltre alla fortuna occorre avere anche una buona quantità di memoria RAM. C’è un particolare che è stato trascurato fino ad ora e qualcuno potrebbe porsi il problema. Cosa deve contenere il file ‘/etc/fstab’ sulla riga che descrive il file system principale? Si tratta di un disco RAM e teoricamente vi si dovrebbe fare riferimento utilizzando il file di dispositivo ‘/dev/ram’. Se non dovesse funzionare così, si può lasciare il nome del dispositivo del dischetto, benché ciò sia falso. /dev/fd0 / ext2 defaults 1 1 nanoLinux II 3927 348.2 Dischi più grandi Se si hanno a disposizione dischi più grandi, non è necessario indaffararsi così tanto: con l’aiuto del programma di installazione della distribuzione che si ha a disposizione dovrebbe essere facile, relativamente, arrivare a una configurazione inferiore ai 20 Mibyte. 348.3 Provare nanoLinux II nanoLinux II richiede molta memoria RAM per poter funzionare, almeno 20 Mibyte. Per poterlo utilizzare occorrono tre dischetti: uno per contenere il kernel, un altro per l’immagine compressa del file system principale e l’ultimo per i file aggiuntivi che non potevano essere contenuti nell’immagine compressa. 348.3.1 Reperire nanoLinux II nanoLinux II dovrebbe essere raggiungibile presso lo stesso nodo dal quale è stato ottenuto questo documento, oppure presso uno dei vari siti speculari FTP di Appunti di informatica libera. Si tratta di tre file: uno contenente l’immagine di un dischetto avviabile con un kernel molto semplice, in grado di gestire un disco RAM, una scheda Ethernet NE2000 e una connessione PLIP; gli altri due sono il vero nanoLinux II, cioè un’immagine compressa del file system principale, seguita da una serie di file aggiuntivi che non potevano essere contenuti nell’altro dischetto. I nomi dovrebbero essere strutturati nel modo seguente: 1. ‘nLinux-II.boot’ 2. ‘nLinux-II.root1.gz’ 3. ‘nLinux-II.root2.tar.gz’ I file vanno copiati così come sono nei dischetti, senza decomprimerli. 348.3.2 Preparazione dei dischetti Si procede nel solito modo trasferendo prima l’immagine di avvio. # dd if=nLinux-II.boot of=/dev/fd0 Se invece di utilizzare questa immagine si preferisce un kernel realizzato personalmente, sarebbe meglio ricostruire un dischetto simile a quello che accompagna nanoLinux II, di tipo Ext2, contenente LILO. Infatti, è necessario specificare l’utilizzo di un disco RAM complessivo di 7 Mibyte. In pratica, è necessario il file ‘/etc/lilo.conf’ seguente: boot=/dev/fd0 #map=/boot/map install=/boot/boot.b prompt #timeout=50 #message=/intro.txt image=/vmlinuz label=linux root=/dev/fd0 append="ramdisk_start=0 load_ramdisk=1 prompt_ramdisk=1 ramdisk_size=7168" read-write nanoLinux II 3928 Quindi si possono preparare gli altri dischetti. # dd if=nLinux-II.root1.gz of=/dev/fd0 # dd if=nLinux-II.root2.tar.gz of=/dev/fd0 348.3.3 Avvio di nanoLinux II Per avviare nanoLinux II basta avviare l’elaboratore con il dischetto del kernel. Nel momento in cui il kernel presenta la richiesta VFS: Insert root floppy disk to be loaded into ramdisk and press ENTER si deve sostituire il dischetto con quello successivo (‘*.root1.*’) e quindi si può premere [ Invio ]. RAMDISK: Compressed image found at block 0 Se l’elaboratore è dotato di memoria sufficiente, l’immagine compressa contenuta nel dischetto viene caricata ed espansa, altrimenti si blocca il sistema. Inizia quindi la procedura di inizializzazione del sistema e viene richiesto quasi subito l’inserimento dell’ultimo dischetto. Inserire il secondo dischetto e premere un tasto. Successivamente viene richiesto di inserire la parola d’ordine per l’utente ‘root’. È necessario definire tale parola d’ordine, dal momento che nanoLinux II mette in funzione alcuni servizi di rete che, nel tempo in cui vengono usati, potrebbero essere sfruttati per attaccare l’elaboratore su cui sono in funzione. Appare quindi la richiesta di un possibile utilizzo della rete. Conviene rispondere affermativamente, almeno nella maggior parte dei casi. "Si vuole utilizzare un collegamento in rete? (s/n)" s[ Invio ] Viene quindi richiesta l’indicazione del tipo di interfaccia di rete da utilizzare. Selezionare l’interfaccia 1) eth0 2) eth1 3) eth2 4) plip0 5) plip1 6) plip2 #? Supponendo di volere utilizzare una connessione PLIP sulla porta parallela, probabilmente si dovrà utilizzare l’interfaccia ‘plip1’.1 5[ Invio ] Selezionare l’indirizzo. 1) 1.nano 4) 4.nano 2) 2.nano 5) 5.nano 7) 7.nano 8) 8.nano 1 Dipende dal kernel l’assegnazione di questi nomi di interfaccia. Le nuove versioni 2.1.x e successive, potrebbero assegnare alla prima porta parallela l’indirizzo zero e di conseguenza si avrebbe ‘/dev/lp0’ o ‘plip0’. nanoLinux II 3) 3.nano #? 3929 6) 6.nano 9) 9.nano nanoLinux II prevede già una rete e degli indirizzi abbinati a dei nomi, in modo da facilitare le operazioni di connessione con un altro elaboratore avviato con gli stessi dischetti. In questa fase, un indirizzo vale l’altro: viene scelto il primo. 1[ Invio ] Dal momento che si tratta di una connessione PLIP e quindi punto-punto, è necessario indicare l’indirizzo dell’elaboratore all’altro capo. L’altro elaboratore verrà avviato nello stesso modo, utilizzando la stessa coppia di dischetti, ma facendo riferimento a indirizzi inversi. Selezionare l’indirizzo dell’altro 1) 1.nano 4) 4.nano 7) 2) 2.nano 5) 5.nano 8) 3) 3.nano 6) 6.nano 9) #? capo. 7.nano 8.nano 9.nano 2[ Invio ] Al termine si ottiene un riassunto finale. La configurazione selezionata è la seguente. Interfaccia plip1 Indirizzo 1.nano Indirizzo punto-punto 2.nano Si intende confermarla? (s/n) Se va tutto bene si conferma. s[ Invio ] La procedura di inizializzazione del sistema prosegue e al termine viene presentata la richiesta di identificazione per l’accesso. (none) login: Si può usare solo l’utente ‘root’ e la parola d’ordine è quella specificata in precedenza, all’inizio della procedura di avvio. root[ Invio ] 348.3.4 NFS Continuando con lo stesso esempio iniziato nella sezione precedente, supponendo che anche l’elaboratore all’altro capo del cavo sia stato configurato correttamente (2.nano), le operazioni per il montaggio del file system di rete sono state semplificate opportunamente. # mount /mnt/2 Quello appena visto è il modo più semplice per montare tutto il file system (a partire dalla directory radice) del nodo 2.nano nella directory ‘/mnt/2/’. Sono state previste tutte le directory necessarie, più altre aggiuntive (‘/mnt/a/’ e ‘/mnt/b/’ per i dischetti Dos-VFAT, ‘/mnt/ cdrom/’ per il CD-ROM e ‘/mnt/hd*/’ per i dischi fissi). 3930 nanoLinux II 348.3.5 SMB nanoLinux II contiene anche il necessario per collegarsi a un servente SMB (Samba). sotto questo aspetto, se la cosa non scandalizza, potrebbe anche essere utilizzato per ripristinare un elaboratore su cui si utilizza MS-Windows 95/98, accedendo a un altro elaboratore del genere. Per eseguire il montaggio di una directory condivisa da un servente SMB, si deve utilizzare ‘smbmount’. Per esempio, se il servente ‘\\W5\’ offre la condivisione di una directory identificata con il nome ‘C’ e il suo indirizzo IP è 192.168.100.1, la si può montare nel modo seguente: # smbmount //W5/C /mnt/extra1 -c micro -I 192.168.100.1 Parte delle opzioni di questo comando potrebbero essere ridondanti, ma conviene avere un esempio completo piuttosto che insufficiente. La directory condivisa viene montata a partire da ‘/mnt/extra1/’; l’elaboratore locale (quello avviato con il dischetto) verrà identificato con il nome ‘micro’ ai fini del protocollo NetBIOS; l’elaboratore da raggiungere ha l’indirizzo IP 192.168.100.1 (questo deve essere specificato se si deve attraversare un router). Operando come utente ‘root’, per smontare il file system di rete basta il normale ‘umount’. # umount /mnt/extra1 348.3.6 Spegnimento La conclusione avviene nel modo solito. # shutdown -h now 348.4 Organizzazione di nanoLinux II nanoLinux II è il risultato delle operazioni di finitura descritte in precedenza, a partire dai binari di una distribuzione Slackware 3.5 e in parte da una distribuzione S.u.S.E. 5.2. Si tratta di un mini sistema di emergenza che comprende anche un servente NFS, un servente Rlogin/Rsh e un servente Secure Shell, in modo da permettere il trasferimento di dati tra elaboratori connessi in una piccola rete locale o attraverso un cavo parallelo (PLIP), senza bisogno di un servente già esistente. Per motivi di comodità di utilizzo, la shell è Bash. Tutto questo occupa un file system Ext2 di 7 Mibyte, al quale si può accedere decomprimendo l’immagine del dischetto contenente il file system (‘*.root1.*’) e copiandovi dentro il contenuto della seconda immagine (che in pratica è solo un file tar+gzip). mount -o loop -t ext2 nLinux-II.root1 punto_di_innesto cd punto_di_innesto ; tar xzvf nLinux-II.root2.tar.gz 348.4.1 Struttura La struttura di questa specie di dischetto è molto semplice ed è schematizzabile nel modo seguente: / |-- bin | | | ‘ binari di uso generale nanoLinux II | |-| | | |-| | | | | | | | | | | |-| | | |-| | | |-| |-| | | |-| |-| | | |-| | | | | | |-| |-| | | | | | ‘-- 3931 dev | ‘ file di dispositivo etc | |-- rc.d | | | |-- init.d | | | | | ‘ script per il controllo dei servizi | | | ‘ script di inizializzazione | ‘ file di configurazione lib | ‘ file di libreria mnt | ‘ varie directory di innesto proc root | ‘ file di configurazione dell’utente root sbin --> bin script | ‘ script di servizio share |-- terminfo | | | ‘ informazioni sui tipi di terminale | ‘ file condivisi tmp usr | |-|-|-‘-- bin --> ../bin sbin --> bin lib --> ../lib share --> ../share var | ‘ directory e file amministrativi vari 348.4.2 Procedura di inizializzazione del sistema La prima cosa da fare per comprendere il funzionamento di un sistema particolare, è l’analisi della procedura di inizializzazione del sistema: ‘/etc/inittab’ e gli script collegati. • ‘/etc/inittab’ nanoLinux II 3932 # # # # # # # # Livelli di esecuzione: 0 Arresto del sistema 1 Monoutente 2 3 Multiutente 4 5 6 Riavvio # Livello di esecuzione predefinito. id:3:initdefault: # Inizializzazione del sistema - viene eseguito all’avvio. si::sysinit:/etc/rc.d/rc Sysinit # Monoutente l1:1:wait:/etc/rc 1 # Multiutente: Servente di rete l3:3:wait:/etc/rc.d/rc 3 # [Ctrl+Alt+Canc]. ca::ctrlaltdel:/sbin/shutdown -t5 -rfn now # Il livello di esecuzione 0 ferma il sistema. l0:0:wait:/etc/rc.d/rc 0 # Il livello di esecuzione 6 riavvia il sistema. l6:6:wait:/etc/rc.d/rc 6 # Attivazione della console. c1:3:respawn:/sbin/agetty 38400 c2:3:respawn:/sbin/agetty 38400 c3:3:respawn:/sbin/agetty 38400 c4:3:respawn:/sbin/agetty 38400 c5:3:respawn:/sbin/agetty 38400 c6:3:respawn:/sbin/agetty 38400 tty1 tty2 tty3 tty4 tty5 tty6 linux linux linux linux linux linux Come si può osservare i livelli di esecuzione sono i soliti. Il livello normale è il numero tre, che permette la gestione dei demoni per l’attivazione dei servizi di rete. Si fa riferimento sempre solo a uno script: ‘/etc/rc’. A seconda dei casi, viene chiamato con un argomento differente. • ‘/etc/rc.d/rc’ Il file ‘/etc/rc.d/rc’ è organizzato in funzioni, in modo da permettere un’organizzazione strutturata dello script. Quello che segue è lo schema che ne riassume il funzionamento. #!/bin/bash function Sysinit () { ... /sbin/update & ... OperazioniIniziali } function ControlloDisco () { ... fsck ... ... } function OperazioniIniziali () { ... } function OperazioniFinali () { ... } nanoLinux II 3933 function Net () { ifconfig ... route add ... } function Monoutente () { ... } function Multiutente () { Net Server OperazioniFinali } function Server () { /etc/rc.d/init.d/portmap start /etc/rc.d/init.d/nfs start /etc/rc.d/init.d/inet start ... } function Conclusione () { ... /etc/rc.d/init.d/inet stop /etc/rc.d/init.d/nfs stop /etc/rc.d/init.d/portmap stop ... sync ... umount ... } function Halt () { halt -f } function Reboot () { reboot -f } #----------------------------------------case $1 in Sysinit) Sysinit 0) Conclusione ; Halt 1) Monoutente 3) Multiutente 6) Conclusione ; Reboot Server) Server esac ;; ;; ;; ;; ;; ;; Lo script inizia alla fine, dopo la dichiarazione di tutte le funzioni. A seconda dell’argomento ricevuto, esegue una catena differente di funzioni. 348.4.3 Configurazione della rete La rete è già stata configurata in modo da facilitare le connessioni volanti tra un piccolo gruppo di elaboratori avviati con nanoLinux II. È stata definita una rete secondo gli elementi riportati nella tabella 348.1. nanoLinux II 3934 Tabella 348.1. Configurazione preimpostata della rete all’interno di nanoLinux II. Elemento rete loopback loopback rete esterna elaboratore 1 elaboratore 2 elaboratore 3 elaboratore 4 elaboratore 5 elaboratore 6 elaboratore 7 elaboratore 8 elaboratore 9 Indirizzo IP 127.0.0.0 127.0.0.1 192.168.100.0 192.168.100.1 192.168.100.2 192.168.100.3 192.168.100.4 192.168.100.5 192.168.100.6 192.168.100.7 192.168.100.8 192.168.100.9 Nome completo localdomain localhost.localdomain nano 1.nano 2.nano 3.nano 4.nano 5.nano 6.nano 7.nano 8.nano 9.nano Abbreviazione localhost uno due tre quattro cinque sei sette otto nove • ‘/etc/host.conf’ Non si usa alcun servente DNS e quindi la risoluzione dei nomi viene fatta esclusivamente utilizzando il file ‘/etc/hosts’. order hosts multi on • ‘/etc/networks’ loopback nano 127.0.0.0 192.168.100.0 • ‘/etc/hosts’ 127.0.0.1 192.168.100.1 192.168.100.2 192.168.100.3 192.168.100.4 192.168.100.5 192.168.100.6 192.168.100.7 192.168.100.8 192.168.100.9 localhost 1.nano 2.nano 3.nano 4.nano 5.nano 6.nano 7.nano 8.nano 9.nano localhost.localdomain uno due tre quattro cinque sei sette otto nove 348.4.4 File system Il file ‘/etc/fstab’ è organizzato in modo tale da facilitare il montaggio dei file system di rete e di dischetti Dos eventuali. Quindi, per esempio, per montare un dischetto Dos, è sufficiente il comando # mount /mnt/a e per montare la directory ‘/mnt/’ dell’elaboratore 5.nano basta il comando seguente: # mount /mnt/5 • ‘/etc/fstab’ #dispositivo /dev/ram proc 1.nano:/mnt 2.nano:/mnt 3.nano:/mnt mount / /proc /mnt/1 /mnt/2 /mnt/3 tipo ext2 proc nfs nfs nfs opzioni defaults ignore noauto noauto noauto dump 1 fsck 1 nanoLinux II 3935 4.nano:/mnt 5.nano:/mnt 6.nano:/mnt 7.nano:/mnt 8.nano:/mnt 9.nano:/mnt /dev/fd0 /dev/fd1 /mnt/4 /mnt/5 /mnt/6 /mnt/7 /mnt/8 /mnt/9 /mnt/a /mnt/b nfs nfs nfs nfs nfs nfs vfat vfat noauto noauto noauto noauto noauto noauto noauto noauto • ‘/etc/exports’ Il sistema consente l’utilizzo del proprio file system a partire dalla directory ‘/mnt/’, in lettura e scrittura a tutta la rete locale 192.168.100.0 (il dominio nano), specificando anche che l’utente ‘root’ può mantenere i suoi privilegi. In aggiunta, è consentito l’accesso in lettura a tutto il file system / /mnt *.nano(ro) 192.168.100.*(ro) *.nano(rw,no_root_squash) 192.168.100.*(rw,no_root_squash) 348.4.5 Shell La shell utilizzata è Bash, in modo da concedere all’utilizzatore un minimo di comodità. Il file dello storico dell’utente ‘root’ e dell’utente generico sono in realtà diretti a ‘/dev/null’ in modo da non utilizzare inutilmente lo spazio prezioso. • ‘/etc/profile’ Attraverso la configurazione della shell si introducono dei sistemi minimi di protezione contro gli errori: la cancellazione, lo spostamento e la copia, non possono eliminare file senza una conferma precisa da parte dell’utente. PATH="/sbin:/usr/sbin:/usr/local/sbin:/bin:/usr/bin:\ /usr/local/bin:/script:." TERM=linux PS1=’\u:\w\$ ’ PS2=’> ’ ignoreeof=10 export PATH TERM PS1 PS2 ignoreeof umask 022 alias cp=’cp -i’ alias rm=’rm -i’ alias mv=’mv -i’ 348.4.6 Attivazione e disattivazione dei servizi All’avvio, nanoLinux II attiva il supervisore dei servizi di rete, il demone per i servizi RPC (da cui dipende NFS), quelli per il servizio NFS e quello di Secure Shell. L’attivazione e la disattivazione di questi servizi può essere comandata agevolmente, utilizzando gli script collocati nella directory ‘/etc/rc.d/init.d/’. È sufficiente utilizzare gli argomenti ‘start’, ‘stop’ e ‘restart’ per ottenere rispettivamente l’avvio, la conclusione e il riavvio dei servizi relativi. Non sono state prese misure per controllare se un servizio è già attivo o meno. A titolo di esempio, viene mostrato come disattivare il servizio NFS. # /etc/rc.d/init.d/nfs stop 3936 nanoLinux II 348.5 Personalizzazione della procedura di inizializzazione del sistema La procedura di inizializzazione del sistema (Init) è il primo punto su cui intervenire per una possibile personalizzazione. Oltre al file ‘/etc/rc.d/rc’, vengono anche utilizzati quelli seguenti. ‘/etc/rc.d/rc.config’ è uno script che serve a configurare la rete al volo prima che il sistema sia avviato completamente. Lo script, attraverso una serie di domande, prepara il file ‘/etc/ rc.d/rc.netconfig’ che viene letto successivamente dallo stesso ‘/etc/rc.d/rc’. Lo script ‘/etc/rc.d/rc.config’ viene avviato all’interno della funzione ‘OperazioniIniziali’, mentre ‘/etc/rc.d/rc.netconfig’ viene letto all’interno della funzione ‘Net’. # OperazioniIniziali ... #-------------------------------------------------------------# Obbliga l’utente a configurare il sistema. # Se si vuole usare una configurazione fissa nel file # /etc/rc.d/rc.netconfig, si può commentare. #-------------------------------------------------------------/etc/rc.d/rc.config ... # Net ... #-------------------------------------------------------------# Carica la configurazione contenuta in /etc/rc.d/rc.netconfig. #-------------------------------------------------------------. /etc/rc.d/rc.netconfig ... Per quanto riguarda la gestione della rete, vanno considerate due parti: la connessione alla rete stessa, attraverso l’indicazione degli indirizzi a cui si appartiene, e i servizi che si intendono concedere all’esterno. La funzione ‘Net’ è quella che si occupa di reperire e configurare gli indirizzi; la funzione ‘Server’ è quella che avvia i servizi concessi all’esterno. L’obiettivo di nanoLinux II è quello di facilitare la connessione tra elaboratori attraverso il protocollo NFS e altri servizi. Quindi, nella funzione ‘Server’ sono avviati per questo scopo vari demoni, attraverso gli script contenuti nella directory ‘/etc/rc.d/init.d’, che a loro volta accettano gli argomenti ‘start’ (per l’avvio) e ‘stop’ (per l’arresto). 348.5.1 Utilizzo in una partizione normale Se si vuole trasferire nanoLinux II in una partizione, nel file ‘/etc/rc.d/rc’ occorre togliere, o commentare, il caricamento del contenuto del secondo dischetto di root, attivando il sistema di controllo attraverso ‘fsck’. Si interviene nella funzione ‘Sysinit’. # Sysinit ... #-------------------------------------------------------------# Carica il secondo dischetto. # Per qualche strano motivo, sono necessari due read. #-------------------------------------------------------------#cd / #echo "Inserire il secondo dischetto e premere un tasto." #read #read #tar xzf /dev/fd0 2> /dev/null #-------------------------------------------------------------- nanoLinux II 3937 # Controlla l’integrità del file system principale. # Commentare in caso di disco RAM! #-------------------------------------------------------------ControlloDisco ... Oltre a questo, si dovrà modificare il file ‘/etc/fstab’ in modo da indicare correttamente la partizione utilizzata per il file system principale. Probabilmente occorre aggiungere la directory ‘/boot/’ con il suo contenuto opportuno, in modo da poter utilizzare LILO per l’avvio. Infine, il file ‘/etc/lilo.conf’ andrà adattato opportunamente. Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org Capitolo 349 Dischetti di emergenza delle distribuzioni GNU/Linux e di altre fonti All’inizio di questa serie di capitoli si è accennato alla distribuzione GNU/Linux Slackware contenente un buon dischetto utilizzabile per emergenza: il file-immagine ‘rescue.gz’. Il problema di quella distribuzione sta piuttosto nella mancanza di un buon dischetto di avvio, organizzato in modo da poter caricare i moduli necessari per le caratteristiche particolari del proprio sistema. Molte altre distribuzioni permettono di gestire l’installazione di GNU/Linux in modo agevole, proprio attraverso questo meccanismo del caricamento dei moduli, cosa che potrebbe rendere più facile anche la realizzazione di dischetti da usare in caso di emergenza. Purtroppo, solo poche distribuzioni sono ben organizzate anche dal punto di vista della gestione delle situazioni di emergenza. 349.1 SuSE La distribuzione SuSE è nata come un’evoluzione della distribuzione Slackware, tanto che da essa ha ereditato una struttura dei pacchetti molto simile. Nello stesso modo ha ereditato l’idea della realizzazione di diversi dischetti di avvio e diversi dischetti contenenti il sistema minimo (la tecnica è diversa dalla distribuzione Slackware, ma l’idea essenziale è la stessa). I dischetti di avvio sono tutti costruiti a partire da kernel modulari, ma la distinzione è necessaria perché non sempre tutti i dispositivi funzionano correttamente sotto forma di moduli. Per quanto riguarda i dischetti con il sistema, in pratica dovrebbe trattarsi di uno solo, l’immagine ‘rescue’, da usare in caso di emergenza, dal momento che l’installazione dovrebbe poter avvenire utilizzando esclusivamente il primo dischetto di avvio. Come si può intuire, una volta scelto il dischetto di avvio più adatto, abbinandolo al dischetto con il sistema di emergenza contenuto in ‘rescue’, oppure abbinandolo allo stesso nanoLinux, si ottiene un mini sistema operativo di emergenza. Il vantaggio di poter utilizzare il dischetto di avvio scegliendolo da questa distribuzione, sta nella sua organizzazione che viene descritta nelle sezioni seguenti. Per la precisione, si fa riferimento al file-immagine ‘eide01’ che dovrebbe addattarsi alla maggior parte delle configurazioni hardware esistenti. Le immagini dei dischetti della distribuzione SuSE possono essere ottenute da uno dei vari siti speculari nella sottodirectory ‘SuSE-Linux/versione /disks/’, dove la versione è rappresentata da un numero (per esempio 6.0). Eventualmente si può provare l’URI <ftp://ftp.suse.com/pub/suse/>. 349.1.1 Preparazione e avvio Come al solito, trattandosi di dischetti distribuiti in forma di immagine su file, questi dovranno essere riprodotti su dischetti reali, nel solito modo, utilizzando dischetti già formattati in precedenza. # cp eide01 /dev/fd0 # cp rescue /dev/fd0 Una volta inserito il dischetto ottenuto dal file-immagine ‘eide01’ e riavviato il sistema, viene richiesto il linguaggio da utilizzare e la tastiera disponibile. Negli esempi vengono mostrati i messaggi in inglese, perché quelli in italiano non sono sempre tradotti perfettamente e possono risultare ambigui. 3938 Dischetti di emergenza delle distribuzioni GNU/Linux e di altre fonti 3939 Figura 349.1. Scelta del linguaggio per i messaggi e le voci di menù. .----------------------------. | Please choose the language | ‘----------------------------’ .--------------------. | Deutsch | | English | | Italiano | ‘--------------------’ .--------. .--------. | Ok | | Back | ‘--------’ ‘--------’ Il funzionamento del programma che guida all’installazione della distribuzione SuSE è abbastanza semplice e intuitivo: i tasti freccia spostano il cursore sulle voci di menù, il tasto [ Tab ] permette di selezionare uno dei pulsanti grafici, il tasto [ Esc ] permette di tornare indietro, [ Invio ] seleziona la voce corrispondente al pulsante grafico evidenziato. Figura 349.2. Scelta tra visualizzazione monocromatica o a colori. .-------------------------------------. | What kind of display do you use? | ‘-------------------------------------’ .-----------------------------. | Color Display | |______Monochrom Display______| ‘-----------------------------’ .--------. .--------. | Ok | | Back | ‘--------’ ‘--------’ Figura 349.3. Scelta della mappa della tastiera. .-------------------------------------. | Please choose a keyboard map. | ‘-------------------------------------’ .---------------. | Deutsch | | American | | Suomi | | British | | Français | | Espanol | |___Italiano____| ‘---------------’ .--------. .--------. | Ok | | Back | ‘--------’ ‘--------’ Dopo avere selezionato la lingua, il tipo di schermo e la disposizione dei tasti sulla tastiera, si giunge al menù principale (figura 349.4). Figura 349.4. Menù generale del sistema di installazione SuSE. .---------------------------------------. | main menu | ‘---------------------------------------’ .---------------------------------------. | Settings | | System informations | | Kernel modules (hardware drivers) | | Start installation / system | | End / Reboot | ‘---------------------------------------’ .--------. .--------. | Ok | | Back | ‘--------’ ‘--------’ 3940 Dischetti di emergenza delle distribuzioni GNU/Linux e di altre fonti 349.1.2 Utilizzo delle voci di menù L’utilizzo normale di questo dischetto, prevede la selezione dei moduli necessari e quindi l’avvio dell’installazione, o del dischetto di emergenza. Vale comunque la pena di dare un’occhiata a tutte le voci, nell’ordine in cui sono. 1. ‘Settings’ La selezione della voce ‘Settings’ permette di modificare le impostazioni iniziali dello schermo e della tastiera. Sotto questo aspetto non c’è niente di importante, almeno per lo scopo di utilizzo che ci si prefigge in questo capitolo. 2. ‘System informations’ La voce ‘System informations’ permette di dare un’occhiata alle informazioni conosciute sul sistema, in pratica quanto il kernel mette a disposizione nel file system virtuale ‘/proc/’. A questo proposito, è opportuno tenere presente che sono disponibili informazioni anche sulle diverse console virtuali. È importante tenere presente che le informazioni che si ottengono in questo modo, dipendono anche dalla presenza o assenza di determinati moduli. 3. ‘Kernel modules (hardware drivers)’ Attraverso la voce ‘Kernel modules’ è possibile caricare i moduli di cui si conosce la necessità. La figura 349.5 mostra l’elenco delle voci del menù a cui si accede. Figura 349.5. Menù per la gestione dei moduli. .---------------------------------------. | Load SCSI module | | Load CD-ROM module | | Load network card module | | Load PCMCIA modules | | Show loaded modules | | Unload modules | | Autoload of modules | ‘---------------------------------------’ A titolo di esempio si carica il modulo per la connessione PLIP attraverso la porta parallela. Per questo si deve selezionare la voce ‘Load network card module’. Si ottiene l’elenco dei moduli disponibili per le interfacce di rete, dal quale si deve selezionare il modulo ‘plip’. Figura 349.6. Selezione del modulo per l’interfaccia di rete. .----------------------------------------------. | ... | | arcnet : ARCnet | |________plip : PLIP (IP via Parallel Port)____| | 3c505 : 3Com 505 | | 3c507 : 3Com 507 | | 3c515 : 3Com 515 | | ... | ‘----------------------------------------------’ Dopo avere selezionato un modulo, a seconda del tipo, ne vengono richieste le caratteristiche. Il capitolo 31 tratta l’argomento e riporta la descrizione di alcuni moduli con il tipo di informazioni che devono essere fornite. Nel caso del modulo ‘plip’, appare la maschera illustrata dalla figura 349.7 che permette l’inserimento dell’indirizzo di I/O e del numero di IRQ abbinato alla porta parallela che si vuole utilizzare per questo scopo. Viene anche proposto un esempio che corrisponde alla configurazione comune. Dischetti di emergenza delle distribuzioni GNU/Linux e di altre fonti 3941 Figura 349.7. Maschera di inserimento delle caratteristiche del dispositivo da utilizzare. .----------------------------------------------. | Please enter parameters for "plip" | | | | Example: io=0x378 irq=7 | ‘----------------------------------------------’ .----------------------------------------------. | ################################## | ‘----------------------------------------------’ Se tutto va bene, cioè se il modulo non entra in conflitto con altri e l’impostazione fornita è corretta, si ottiene un messaggio di conferma, dopo il quale si può proseguire. Se si ritiene di avere caricato un modulo errato si può utilizzare la voce ‘Unload modules’, mentre se si vuole tentare di caricare i moduli in modo automatico si può anche usare la voce ‘Autoload of modules’ (anche se ciò non porta solitamente a risultati corretti). 4. ‘Start installation / system’ Una volta caricati i moduli necessari, si può scegliere tra l’avvio di un sistema già installato o di un sistema di emergenza, oltre ad altre operazioni possibili. Si veda la figura 349.8. Figura 349.8. Scelta tra l’avvio dell’installazione, di un sistema già installato o di un sistema di emergenza. .----------------------------------. | Start installation | | Boot installed system | | Start rescue system | | Start CD-ROM demo | ‘----------------------------------’ Questa, finalmente, è la scelta più importante. Infatti, con la voce ‘Boot installed system’ è possibile indicare una partizione da cui avviare il file system principale che per qualche motivo non si avvia più da solo. Con la voce ‘Start rescue system’ si può avviare un sistema in un dischetto: l’immagine ‘rescue’ della stessa SuSE, nanoLinux, oppure anche il file ‘rescue.gz’ della Slackware. 349.1.3 Avvio di un sistema su dischetto Quando si seleziona la voce ‘Start rescue system’, è possibile indicare diverse fonti da cui potrebbe essere reperita l’immagine del dischetto da avviare. La possibilità di avviare tale immagine da una fonte diversa da un dischetto, riguarda solo quanto già predisposto dalla distribuzione SuSE. Nel caso si voglia avviare un dischetto qualunque (purché compatibile con il kernel) si deve usare solo la voce corrispondente all’uso di un dischetto. È stato ripetuto più volte che si possono usare anche altri dischetti alternativi a quello generato dall’immagine ‘rescue’ della distribuzione SuSE. Tuttavia occorre tenere presente che deve trattarsi sempre di immagini compresse: se si tenta di caricare la vecchia immagine ‘rescue.gz’ della distribuzione Slackware (quella obsoleta che si trova nella directory ‘rootdsks/obsolete/’) dopo averla decompressa (è l’unico mini-sistema in circolazione che possa essere contenuto in un dischetto da 1440 Kibyte), questa non verrà caricata. Come ormai dovrebbe essere chiaro, il dischetto che viene avviato in questo modo, diviene in pratica un disco RAM. Per poter utilizzare il dischetto di emergenza predisposto dalla distribuzione SuSE, occorre disporre di almeno 16 Mibyte. 3942 Dischetti di emergenza delle distribuzioni GNU/Linux e di altre fonti 349.2 Dischetti realizzati per scopi specifici Vale la pena di annotare l’esistenza di progetti specifici per la realizzazione di dischetti di emergenza particolari, anche se spesso si tratta di lavori conclusi che non verranno aggiornati in futuro. • Small Linux <http://sourceforge.net/projects/smallinux/> Consente di avviare un sistema minimo utilizzando meno di 4 Mibyte di memoria RAM, montando il file system principale dal dischetto, senza caricarlo in un disco RAM. • LOAF: Linux on a floppy <http://www.ecks.org/projects/loaf/> Consente di avviare un sistema minimo disponendo almeno di 4 Mibyte di memoria RAM, a partire da un solo dischetto, contenente kernel e file system principale. Il file system viene caricarlo in un disco RAM. Lo scopo di questi dischetti è di consentire l’avvio di un elaboratore che possa accedere alla rete, per esempio attraverso Telnet. Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org Parte lxxii Laboratorio didattico 350 Accorgimenti per usare GNU/Linux nella didattica di massa . . . . . . . . . . . . . . . . . . . . . 3944 350.1 Utente speciale per uno scopo speciale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3944 350.2 Spegnimento da parte di utenti comuni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3944 350.3 Autorizzare chiunque ad aggiungersi come nuovo utente . . . . . . . . . . . . . . . . . . 3946 350.4 Sincronizzazione di file di configurazione senza NIS . . . . . . . . . . . . . . . . . . . . . 3948 351 Diskless: elaboratori senza disco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3951 351.1 Principio di funzionamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3951 351.2 Preparazione del cliente GNU/Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3951 351.3 Preparazione del servente GNU/Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3954 351.4 Riferimenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3961 3943 Capitolo 350 Accorgimenti per usare GNU/Linux nella didattica di massa La gestione di un laboratorio munito di elaboratori in una scuola media è problematica, a causa di diversi fattori: l’età degli studenti; il poco tempo a disposizione degli insegnanti; la necessità di svolgere una gran mole di esercitazioni specifiche. GNU/Linux è un sistema operativo sofisticato e sotto questo aspetto non è adatto a un ambiente del genere. In questo capitolo si raccolgono delle idee su possibili soluzioni ai problemi tipici di un tale laboratorio. 350.1 Utente speciale per uno scopo speciale Quando si vuole permettere agli utenti comuni di compiere attività che altrimenti sarebbero esclusivamente di competenza dell’utente ‘root’, si può utilizzare ‘sudo’, oppure si può creare un utente apposito nell’elenco del file ‘/etc/passwd’, al quale, invece di associare una shell, si associa il programma o lo script che si vuole fare eseguire. CIAO::0:0:Esempio generico:/:/etc/script/.CIAO L’esempio mostra una riga del file ‘/etc/passwd’ in cui viene definito l’utente ‘CIAO’, senza parola d’ordine, con lo stesso UID e GID dell’utente ‘root’, avendo di conseguenza gli stessi privilegi, al quale viene però associata la directory ‘/’ (per motivi di sicurezza è meglio evitare l’uso di ‘/tmp/’), dove al posto di una shell si abbina lo script ‘/etc/script/.CIAO’. In questo modo, accedendo con il nominativo ‘CIAO’, si esegue lo script ‘/etc/script/.CIAO’. Al termine dell’esecuzione dello script, la sessione di lavoro come utente ‘CIAO’ termina. Il meccanismo rende il sistema molto poco sicuro, ma ha il vantaggio di essere un modo semplice per l’esecuzione di alcuni comandi che sono normalmente di competenza dell’utente ‘root’. È importante che la dichiarazione del vero utente ‘root’ sia precedente a quella di questi finti utenti ‘root’. Per fare in modo che gli eventuali sistemi di sicurezza abbandonino ogni resistenza, è probabile che si debba includere l’ipotetico programma ‘/etc/script/.CIAO’ nel file ‘/etc/shells’. Inoltre, dovrebbe essere evidente che in una situazione del genere non sia sensata l’attivazione delle password shadow (si veda anche quanto scritto a proposito del file ‘/etc/login.defs’ nel capitolo dedicato proprio alle password shadow). Se si intende utilizzare questo tipo di utente attraverso un programma per l’accesso remoto (‘rlogin’, ‘rsh’, ‘telnet’ o ‘rexec’) è necessario che il file ‘/etc/securetty’ contenga l’indicazione dei terminali da cui questo pseudo utente ‘root’ può accedere. 350.2 Spegnimento da parte di utenti comuni Generalmente, un utente comune non è autorizzato a utilizzare ‘shutdown’ o equivalenti, per chiudere l’attività di GNU/Linux. Però, in certi casi, può essere utile che ciò sia possibile. Il modo più semplice di permettere agli utenti comuni di avviarlo, è attribuirgli il permesso SUID, come nell’esempio seguente: # chmod u+s /sbin/shutdown 3944 Accorgimenti per usare GNU/Linux nella didattica di massa 3945 Eventualmente si può completare la cosa creando un collegamento nella directory ‘/bin/’ in modo che sia accessibile facilmente agli utenti comuni, senza bisogno di indicarne il percorso. # ln -s /sbin/shutdown /bin/shutdown Viene mostrata anche una tecnica diversa che si basa sul trucco dell’utente speciale descritta sopra. Questo modo può sembrare più laborioso e inutile; in realtà ci sono dei vantaggi, in particolare la possibilità di controllo sull’operazione stessa. Come è già stato mostrato nella sezione precedente, si aggiunge l’utente ‘SPEGNIMI’ nel file ‘/etc/passwd’: SPEGNIMI::0:0:Spegnimento dell’elaboratore:/:/etc/script/.SPEGNIMI Quindi, lo script ‘/etc/script/.SPEGNIMI’ potrebbe essere preparato in modo da poter abilitare o disabilitare la possibilità di eseguire la procedura di arresto del sistema. #!/bin/bash #====================================================================== # .SPEGNIMI #====================================================================== #-----------------------------------------------------------------# Verifica la presenza del file SPEGNIMI.OK #-----------------------------------------------------------------if [ -f /etc/script/data/SPEGNIMI.OK ] then #-------------------------------------------------------------# Il file esiste e si può spegnere. # Esegue lo shutdown con un’attesa di 10 secondi. #-------------------------------------------------------------sleep 10s /sbin/shutdown -h now else #-------------------------------------------------------------# L’operazione di spegnimento non è consentita. #-------------------------------------------------------------echo "L’operazione richiesta di spegnimento non è consentita!" fi Lo script deve essere accessibile in tutti i modi solo all’utente ‘root’ e in nessun modo agli altri utenti (07008). L’esecuzione di ‘shutdown’ dipende quindi dalla presenza del file ‘/etc/script/data/ SPEGNIMI.OK’. In questo modo è possibile regolare semplicemente l’accessibilità a questa funzione di spegnimento. Per utilizzare in pratica questo sistema, si può agire attraverso un accesso locale o remoto. Attraverso un accesso normale è possibile spegnere il sistema: basta utilizzare l’utente ‘SPEGNIMI’, per il quale non è richiesta alcuna parola d’ordine. Attraverso ‘rlogin’ è possibile attivare una connessione con lo stesso elaboratore su cui si sta operando, ottenendone lo spegnimento. L’esempio seguente utilizza ‘hostname’ per determinare il nome dell’elaboratore: è importante che questo restituisca un nome corretto. rlogin -l SPEGNIMI ‘hostname‘ Nello stesso modo si può spegnere un elaboratore attraverso la rete da un’altra posizione. rlogin -l SPEGNIMI indirizzo_da_spegnere Per rendere più facile il meccanismo, si può creare uno script ulteriore con lo stesso nome dell’utente fittizio ‘SPEGNIMI’. #!/bin/sh #====================================================================== # SPEGNIMI Accorgimenti per usare GNU/Linux nella didattica di massa 3946 #====================================================================== rlogin -l SPEGNIMI ‘hostname‘ In tal modo si utilizza lo stesso termine, sia in presenza di una richiesta di accesso, sia durante una sessione di lavoro normale. Per avviare la procedura di arresto del sistema su un gruppo di elaboratori in un colpo solo, si può creare uno script che esegue una serie di ‘rlogin’ su tutti gli elaboratori interessati. #!/bin/sh #====================================================================== # SPEGNITUTTI #====================================================================== rlogin rlogin rlogin rlogin rlogin #... -l -l -l -l -l SPEGNIMI SPEGNIMI SPEGNIMI SPEGNIMI SPEGNIMI host01.brot.dg host02.brot.dg host03.brot.dg host04.brot.dg host05.brot.dg & & & & & In alternativa, se per qualunque motivo si ha difficoltà a utilizzare ‘rlogin’ o ‘rsh’ come si vorrebbe, si può utilizzare Secure Shell (capitolo 202), configurandola in modo che utilizzi una forma di autenticazione che non richieda l’inserimento di una parola d’ordine. Lo script potrebbe essere modificato nel modo seguente: #!/bin/sh #====================================================================== # SPEGNITUTTI #====================================================================== ssh -l ssh -l ssh -l ssh -l ssh -l #... SPEGNIMI SPEGNIMI SPEGNIMI SPEGNIMI SPEGNIMI host01.brot.dg host02.brot.dg host03.brot.dg host04.brot.dg host05.brot.dg & & & & & 350.3 Autorizzare chiunque ad aggiungersi come nuovo utente Normalmente, non è sensato concedere a chiunque di registrarsi da solo all’interno di un sistema, ma su un elaboratore destinato alla didattica, in un ambiente in cui non si vuole utilizzare il NIS, questo potrebbe essere più che giustificato. Con la tecnica già vista nella sezione, si aggiunge l’utente ‘AGGIUNGI’. AGGIUNGI::0:0:Aggiunta nuovo utente:/:/etc/script/.AGGIUNGI Lo script ‘/etc/script/.AGGIUNGI’ potrebbe essere preparato in modo da poter abilitare o disabilitare la possibilità di eseguire il programma ‘adduser’. Il programma ‘adduser’ non è necessariamente presente con questo nome e con lo stesso comportamento in tutte le distribuzioni GNU/Linux. In questi esempi si suppone che ‘adduser’ accetti un solo argomento: il nome dell’utente da aggiungere. #! /bin/bash #====================================================================== # .AGGIUNGI #====================================================================== Accorgimenti per usare GNU/Linux nella didattica di massa 3947 #====================================================================== # Inizio. #====================================================================== #-----------------------------------------------------------------# Verifica la presenza del file AGGIUNGI.OK #-----------------------------------------------------------------if [ -f /etc/script/data/AGGIUNGI.OK ] then #-------------------------------------------------------------# Il file esiste e si può aggiungere l’utente. # Si inizia ottenendo il nome da utilizzare. #-------------------------------------------------------------echo "Inserisci il nome dell’utente." echo "Si possono utilizzare al massimo otto caratteri." read #-------------------------------------------------------------# Controlla la risposta data dall’utente. #-------------------------------------------------------------if [ ${#REPLY} = 0 ] then #---------------------------------------------------------# La risposta è nulla, così si interrompe l’inserimento. #---------------------------------------------------------exit fi #-------------------------------------------------------------# Finalmente viene creato l’utente. #-------------------------------------------------------------NUOVO_UTENTE=$REPLY /usr/sbin/adduser $NUOVO_UTENTE #-------------------------------------------------------------# Viene definita la password. #-------------------------------------------------------------while [ 0 ] # FOREVER do if /usr/bin/passwd $NUOVO_UTENTE then #-----------------------------------------------------# La password è stata inserita correttamente. #-----------------------------------------------------break else #-----------------------------------------------------# Meglio ripetere l’operazione. #-----------------------------------------------------continue fi done else #-------------------------------------------------------------# L’operazione non è consentita. #-------------------------------------------------------------echo "L’operazione richiesta non è consentita!" fi #====================================================================== Lo script deve essere accessibile in tutti i modi solo all’utente ‘root’ e in nessun modo agli altri utenti (07008). L’esecuzione di ‘adduser’ dipende quindi dalla presenza del file ‘/etc/script/data/ AGGIUNGI.OK’. In questo modo è possibile regolare semplicemente l’accessibilità a questa funzione. Per utilizzare in pratica questo sistema, basta identificarsi come l’utente ‘AGGIUNGI’ in fase di accesso. Accorgimenti per usare GNU/Linux nella didattica di massa 3948 350.4 Sincronizzazione di file di configurazione senza NIS Un laboratorio potrebbe essere organizzato in modo da centralizzare le directory personali degli studenti in un solo file system di rete (di solito NFS), allo scopo di consentire a ogni studente di utilizzare qualunque elaboratore. In generale, per ottenere questo risultato c’è bisogno di centralizzare anche il sistema di autenticazione, normalmente attraverso un servizio NIS. Tuttavia, questa ultima necessità può diventare eccessivamente onerosa per l’amministratore. Di per sé, l’uso di un file system di rete e del NIS, mette tutto il sistema in una condizione di estrema debolezza rispetto alla possibilità di un’aggressione esterna. Pertanto, si vuole proporre qui un metodo alternativo al NIS, altrettanto debole, ma più semplice da realizzare. Figura 350.1. Schema semplificato di una rete per un laboratorio, in cui si condividono le directory personali degli utenti, ma non si usa il NIS. .------. .------. .------. .------. .------. .------. | nodo | | nodo | | nodo | | nodo | | nodo | | nodo | B ‘------’ ‘------’ ‘------’ ‘------’ ‘------’ ‘------’ | | | | | | - -*-----------*-----------*-----*-----*-----------*-----------*---- - - rete locale del laboratorio | | .--------------------------. | Elaboratore contenente i | | servizi e le directory | A | personali che i nodi | | normali condividono. | ‘--------------------------’ Osservando la figura 350.1, l’elaboratore «A» deve consentire l’accesso alla directory ‘/home/’, attraverso il protocollo NFS, mentre gli elaboratori «B» montano il file system di rete nella stessa directory, che per loro sarebbe vuota. A questo punto, l’aggiunta di un utente dovrebbe passare per l’elaboratore «A», attraverso la procedura normale, cosa che comporta la modifica dei file ‘/etc/passwd’ e ‘/etc/group’ (salvo l’uso delle password shadow, che in questo caso non hanno una ragione valida per essere utilizzate), inoltre, genera le directory personali che normalmente si collocano al di sotto di ‘/home/’. Quando gli elaboratori «B» montano la directory ‘/home/’, si trovano di fronte alla stessa situazione dell’elaboratore «A», per cui, per consentire l’accesso agli studenti da questi nodi, basterebbe ricopiare i file ‘/etc/passwd’ e ‘/etc/group’. Per farlo in modo automatico, si potrebbe usare Rsync (capitolo 171), predisposto in modo da non dover digitare manualmente delle parole d’ordine, ogni volta che si aggiorna un nodo di tipo «B». Per usare Rsync in modo autonomo, senza l’ausilio di alcuna shell remota, bisogna configurare tutti i nodi «B» nel modo elencato di seguito. 1. È necessario verificare che il file ‘/etc/services’ contempli il servizio RSYNC, contenendo le righe seguenti: rsync rsync 873/tcp 873/udp # rsync # rsync 2. È necessario aggiornare il file ‘/etc/inetd.conf’, in modo da avviare ‘rsync’ come demone, quando viene interpellata la porta del servizio corrispondente: rsync stream tcp nowait root /usr/bin/rsync rsyncd --daemon Naturalmente occorre riavviare il supervisore dei servizi di rete (‘inetd’), in modo che venga acquisita la modifica fatta in questo file di configurazione. Accorgimenti per usare GNU/Linux nella didattica di massa 3949 3. Si deve preparare il file di configurazione di Rsync, per il suo utilizzo in qualità di demone. Il file in questione dovrebbe essere ‘/etc/rsyncd.conf’, ma in caso di dubbio, si può usare l’opzione ‘--config’ (in questo caso, la riga è spezzata in due per motivi tipografici): rsync stream tcp nowait root /usr/bin/rsync ←,→rsyncd --daemon --file=/etc/rsyncd.conf Il file in questione deve contenere la dichiarazione di un modulo adatto per questo scopo: [utenze] uid = root gid = root path = /etc read only = false auth users = root strict modes = false secrets file = /etc/rsyncd.secrets comment = Esportazione delle utenze attraverso Rsync 4. Nel file di configurazione si vede la dichiarazione di un file di «segreti», che in pratica contiene le parole d’ordine in chiaro degli utenti che possono utilizzare tale servizio. In questo caso, si tratta esclusivamente dell’utente ‘root’, per cui il file ‘/etc/rsyncd.secrets’ potrebbe contenere la riga seguente: root:supersegretissimo La parola d’ordine è in chiaro, per cui sarebbe bene che il file fosse accessibile esclusivamente all’amministratore, utilizzando dei permessi 06008. In particolare, nella configurazione è stata specificata la direttiva ‘strict modes = false’ in modo da evitare che il demone Rsync possa opporsi all’accesso nel caso i permessi non siano esattamente così. Eventualmente, se si preferisce si può abilitare questo controllo: ‘strict modes = true’. A questo punto, dal lato dei nodi «B» è tutto pronto; basta solo preparare uno script opportuno nell’elaboratore «A», per automatizzare l’operazione: #! /bin/sh RSYNC_PASSWORD=supersegretissimo export RSYNC_PASSWORD rsync -zv /etc/passwd [email protected]::utenze rsync -zv /etc/group [email protected]::utenze rsync -zv /etc/passwd [email protected]::utenze rsync -zv /etc/group [email protected]::utenze rsync -zv /etc/passwd [email protected]::utenze rsync -zv /etc/group [email protected]::utenze #... Evidentemente si suppone che i vari nodi «B» abbiano gli indirizzi IP 192.168.1.1*. Naturalmente, se è disponibile il servizio DNS si potevano usare dei nomi al posto degli indirizzi. Dal momento che questo tipo di approccio non è esente da incidenti, prima di organizzare un sistema di sincronizzazione occorre essere sempre sicuri di disporre di dischetti di emergenza con cui poter avviare gli elaboratori «B», nel caso i file ‘/etc/passwd’ e ‘/etc/group’ dovessero risultare danneggiati in qualche modo. Pertanto, tali dischetti di emergenza devono disporre di un sistema autonomo, in quanto non basterebbe un kernel che monta il file system principale che contiene gli stessi file danneggiati. 3950 Accorgimenti per usare GNU/Linux nella didattica di massa Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org Capitolo 351 Diskless: elaboratori senza disco Una caratteristica importante del sistema di condivisione dei file system attraverso la rete, l’NFS, è quella che permette l’utilizzo di macchine senza disco: diskless. Nel passaggio da una macchina autonoma a una senza disco, ci sono varie fasi intermedie, in cui si possono sfruttare più o meno intensivamente le risorse NFS di altri serventi. La macchina senza disco, perché non ha fisicamente il disco fisso, oppure perché non lo adopera per contenere dati o programmi, ha comunque un certo fascino, che si avverte particolarmente quando si deve allestire un certo numero di macchine uniformi e amministrate in modo centralizzato. A differenza del terminale remoto che utilizza ‘telnet’ o un programma di comunicazione su linea seriale o dedicata, la macchina senza disco ha il vantaggio di poter utilizzare la grafica con il sistema X. In questo senso, una macchina senza disco è normalmente ben dotata dal punto di vista del processore e della memoria centrale. 351.1 Principio di funzionamento L’idea alla base della macchina senza disco è molto semplice: 1. viene caricato il kernel in qualche modo, con tutte le informazioni necessarie ad accedere alla rete e al servente NFS; 2. viene eseguito il montaggio del file system principale (dalla rete) in lettura e scrittura; 3. viene eseguita la procedura di inizializzazione del sistema (Init). Il vero problema di tutto questo è il primo punto, ovvero l’avvio del kernel con le informazioni necessarie, specialmente quelle sull’indirizzo IP dell’interfaccia di rete utilizzata. Volendo predisporre una vera macchina senza disco, sarebbe necessario realizzare, o procurarsi, una ROM speciale da applicare alla scheda di rete. Questa, con il software contenuto al suo interno, attraverso vari protocolli, dovrebbe permettere alla scheda di rete di ottenere il proprio indirizzo IP e subito dopo di ricevere il kernel da avviare. A meno di avere il sostegno di persone qualificate, in grado di predisporre una macchina senza disco a tutti gli effetti, ci si accontenta solitamente di preparare un dischetto con un kernel adatto, assieme a tutte le informazioni necessarie sulla rete locale e il servente NFS da raggiungere. Questa è la soluzione che viene presa in considerazione nel capitolo. 351.2 Preparazione del cliente GNU/Linux La preparazione del cliente cioè del dischetto necessario ad avviare l’elaboratore senza disco fisso, è la parte più semplice, pertanto viene mostrata per prima. 351.2.1 Kernel Prima di tutto, occorre preparare un kernel adatto alla stazione senza disco che si vuole utilizzare. Di sicuro, occorre attivare la gestione della rete (sezione 29.2.9), la gestione necessaria per l’interfaccia di rete che si utilizza (sezione 29.2.12) e la gestione relativa all’NFS, indicando eventualmente la necessità di montare il file system principale attraverso il protocollo NFS (29.2.9). 3951 Diskless: elaboratori senza disco 3952 Naturalmente, tali funzionalità devono essere incluse come elementi del kernel monolitico, perché non disponendo di un disco locare sarebbe complicato caricare dei moduli. Date le difficoltà che comporta la preparazione di un sistema senza disco è il caso di consigliare l’utilizzo di soli kernel monolitici, anche per i dispositivi che potrebbero essere caricati in un secondo momento. La stazione senza disco potrebbe, nonostante il nome, dover accedere anche a unità a disco locali, come un dischetto o un lettore CD-ROM. Nel momento in cui si predispone un kernel per tale scopo, è bene tenere presente anche queste esigenze. 351.2.2 Parametri di avvio All’avvio, il kernel deve ottenere alcuni parametri che gli permettano di configurare l’interfaccia di rete, di definire l’instradamento e di montare il file system principale attraverso il protocollo NFS. root=/dev/nfs Si tratta di un messaggio con cui si informa il kernel di voler utilizzare come file system principale ciò che viene fornito attraverso il protocollo NFS. Il dispositivo ‘/dev/nfs’ non esiste in realtà. [ ] [ [ ]] nfsroot= ip_del_servente : directory_radice ,opzione_nfs ,... Serve a definire le informazioni necessarie al montaggio della directory del servente che verrà utilizzata come radice del file system. L’indirizzo IP del servente è facoltativo, perché viene indicato nuovamente nel parametro ‘nfsaddrs’. Le opzioni_NFS sono facoltative e, in ogni caso, si tratta delle stesse opzioni utilizzabili in condizioni normali con i file system NFS (il modello sintattico viene spezzato in due per mancanza di spazio). [ ][ ][ ][ ][ ] ] nfsaddrs= ip_del_cliente : ip_del_servente : ip_del_router : maschera_di_rete :←,→ nome_dell’host : dispositivo_di_rete : auto_configurazione [ ][ Il parametro ‘nfsaddrs’ permette di definire tutte le informazioni necessarie a stabilire il collegamento nella rete. Tutte le informazioni possono essere determinate in modo predefinito, ma non tutte contemporaneamente. Come si potrà intuire: le informazioni sugli indirizzi del cliente e del servente possono essere ottenute automaticamente in base ai protocolli RARP o BOOTP; l’indirizzo di un router non è necessario nel caso tutto si svolga in una rete locale; la maschera di rete può essere determinata automaticamente in base alla classe di indirizzi utilizzati; il nome del nodo potrebbe corrispondere allo stesso numero IP attribuitogli; infine l’interfaccia di rete potrebbe essere semplicemente la prima a essere individuata. Almeno le prime volte, non è una buona idea lasciare che i valori vengano determinati automaticamente. L’ultima opzione, permette di definire il metodo di configurazione automatica. Si possono utilizzare le parole chiave ‘rarp’ o ‘bootp’ per indicare che si vuole sia utilizzato il protocollo RARP oppure BOOTP, rispettivamente. In alternativa si può indicare la parola chiave ‘both’ per fare sì che vengano gestiti entrambi, oppure ‘none’ per non utilizzarne alcuno. Se non viene indicato nulla nell’ultimo campo, si intende che non si deve utilizzare alcun protocollo. Se non viene utilizzato alcun protocollo per la configurazione automatica, è chiaro che occorre specificare necessariamente gli indirizzi IP del cliente e del servente. Diskless: elaboratori senza disco 3953 351.2.3 Un esempio Prima di proseguire con la descrizione di ciò che serve per predisporre un cliente senza disco, conviene introdurre una situazione di esempio, che poi verrà utilizzata nelle spiegazioni successive. Si suppone di disporre di un servente nella stessa rete locale in cui si vuole collocare il cliente. In tal caso, pur non essendo necessario, viene indicato ugualmente un router che in pratica corrisponde allo stesso indirizzo del servente. La tabella 351.1 mostra questa situazione. Tabella 351.1. Configurazione di esempio. Elemento servente cliente router maschera di rete nome del cliente interfaccia di rete directory remota Valore 192.168.1.1 192.168.1.7 192.168.1.1 255.255.255.0 diskless7 eth0 /tftpboot/192.168.1.7 In questa situazione, i parametri del kernel dovranno essere quelli indicati qui di seguito. root=/dev/nfs nfsroot=192.168.1.1:/tftpboot/192.168.1.7 nfsaddrs=192.168.1.7:192.168.1.1:192.168.1.1:255.255.255.0:diskless7:eth0: La scelta della directory remota da utilizzare come file system principale non è casuale; si tratta di una convenzione diffusa: /tftpboot/indirizzo_del_cliente / 351.2.4 /dev/boot255 Esistono diversi modi per avviare un kernel. Dovendo fare in modo che il kernel si avvii montando il file system principale dalla rete, si utilizza il parametro ‘root=/dev/nfs’, dove ‘/dev/ nfs’ non esiste in realtà. Quando si utilizza LILO, ma anche in altre situazioni, è necessario fare riferimento a un dispositivo esistente realmente, almeno nel momento in cui si «installa» il sistema di avvio. Per questo si deve creare il dispositivo denominato ‘/dev/boot255’, con numero primario zero e numero secondario 255. # mknod /dev/boot255 c 0 255 351.2.5 Avvio del kernel dal dischetto L’avvio del kernel da un dischetto è un problema che è stato già descritto a sufficienza in questo documento, in particolare nel capitolo 16. Qui si intende solo riepilogare in che modo configurare i vari sistemi di avvio. • Se si intende avviare il kernel copiandolo in un dischetto senza file system, utilizzando quindi ‘dd’ (o anche ‘cp’), non è possibile fornire alcun parametro, tranne l’indicazione del dispositivo attraverso il programma ‘rdev’. In pratica, se il dischetto immagine del kernel si trova nella prima unità, si utilizza il comando seguente: Diskless: elaboratori senza disco 3954 # rdev /dev/fd0 /dev/boot255 Tutte le altre informazioni, devono provenire dal protocollo RARP o BOOTP. Pertanto, questo tipo di avvio non è consigliabile in generale. • Se si realizza un dischetto contenente il kernel, avviato attraverso LILO, si possono dare i parametri necessari attraverso la configurazione del file ‘/etc/lilo.conf’. Segue il pezzo significativo, relativo all’esempio proposto in precedenza (la direttiva ‘append’ appare spezzata su più righe per motivi tipografici, ma dovrebbe occupare una riga sola). image=/vmlinuz label=diskless root=/dev/boot255 append="root=/dev/nfs ←,→nfsroot=192.168.1.1:/tftpboot/192.168.1.7 ←,→nfsaddrs=192.168.1.7:192.168.1.1:192.168.1.1:255.255.255.0:diskless7:eth0:" • SYSLINUX si configura in modo simile a LILO, con la differenza che basta collocare i file necessari nel dischetto, senza creare collegamenti tra loro. In questo senso è particolarmente comodo e decisamente preferibile quando si deve avviare un kernel da dischetto. Segue un pezzo della configurazione del file ‘SYSLINUX.CFG’ (anche in questo caso, la direttiva ‘APPEND’ appare spezzata su più righe per motivi tipografici, ma dovrebbe occupare una riga sola). LABEL diskless KERNEL LINUX APPEND "root=/dev/nfs ←,→nfsroot=192.168.1.1:/tftpboot/192.168.1.7 ←,→nfsaddrs=192.168.1.7:192.168.1.1:192.168.1.1:255.255.255.0:diskless7:eth0:" Si osservi il fatto che qui non viene utilizzato il dispositivo ‘/dev/boot255’. • Loadlin richiede la preparazione di un dischetto con un sistema Dos minimo, dal quale poter avviare (di solito attraverso il file ‘AUTOEXEC.BAT’) il programma ‘LOADLIN.EXE’. Segue l’esempio di questo comando, separato su più righe per motivi tipografici. LOADLIN vmlinuz root=/dev/nfs nfsroot=192.168.1.1:/tftpboot/192.168.1.7 ←,→nfsaddrs=192.168.1.7:192.168.1.1:192.168.1.1:255.255.255.0:diskless7:eth0: 351.3 Preparazione del servente GNU/Linux Il servente richiede una preparazione più complessa e delicata, da studiare prima a tavolino in funzione delle cose che si vogliono fare con le macchine senza disco. Il problema, a questo proposito, risiede nel fatto che ogni distribuzione GNU/Linux ha una sua impostazione, dove sono proprio queste diversità che richiedono lo sforzo maggiore nello studio necessario ad arrivare a un servente per questo scopo. Ogni distribuzione GNU/Linux dovrebbe fornire gli strumenti necessari ad automatizzare la creazione e la gestione del servente; in realtà solo poche fanno tanto. In queste sezioni si fa riferimento a un servente realizzato su una distribuzione Red Hat, ma senza porre un accento eccessivo sulle particolarità di questa distribuzione. 351.3.1 Pianificare gli obiettivi da raggiungere È importante decidere prima quali sono le attività per le quali verranno utilizzate le stazioni senza disco e quindi quali programmi verranno utilizzati. Ciò servirà per stabilire quali componenti devono essere predisposti nella gerarchia utilizzata come directory radice NFS. È bene chiarire in mente che i clienti dovrebbero avere una configurazione uniforme e che su quelle stazioni non ci dovrebbero essere utenti ‘root’, a parte l’amministratore del servente. Diskless: elaboratori senza disco 3955 Se non fosse così, i vantaggi nell’utilizzo di macchine senza disco sarebbero troppo pochi per giustificare lo sforzo necessario a predisporle. Se si intende utilizzare il sistema grafico X, anche l’uniformità delle schede video sarebbe auspicabile. Le password shadow non dovrebbero essere utilizzate. Come ultima considerazione, i clienti non dovrebbero offrire servizi di rete. 351.3.2 Directory radice NFS La cosa più delicata da organizzare è la directory radice dei clienti senza disco. Queste directory, per tradizione (e per stare fuori dai guai), vanno collocate a partire da ‘/tftpboot/indirizzo /’. Per fare un esempio, il cliente individuato dall’indirizzo IP 192.168.1.7, dovrebbe trovare la sua directory radice a partire dalla directory ‘/tftpboot/192.168.1.7/’ del servente. Generalmente se ne prepara una per un cliente particolare; una volta verificato che tutto funziona come si vuole, si preparano le altre utilizzando dei collegamenti fisici. Se tutto va bene, non ci sarà bisogno di modificare la configurazione riferita a un cliente particolare, rispetto agli altri. La directory radice NFS di ogni cliente deve contenere il necessario a permettere l’avvio del cliente stesso, lasciando che il resto venga montato durante la fase di inizializzazione del sistema. In pratica, sono necessarie le directory ‘bin/’, ‘dev/’, ‘etc/’, ‘home/’, ‘lib/’, ‘mnt/’, ‘opt/’, ‘proc/’, ‘root/’, ‘sbin/’, ‘tmp/’, ‘usr/’ e ‘var/’. Alcune di queste vanno copiate, così come sono le directory corrispondenti del file system principale del servente, altre servono vuote, altre vanno copiate solo parzialmente. Nella spiegazione seguente si fa l’esempio della predisposizione della directory radice NFS per il cliente 192.168.1.7; tutte le directory degli altri clienti verranno ottenute attraverso l’uso di collegamenti fisici, a partire dall’esempio di partenza. Si inizia creando la directory ‘/tftpboot/’ e quindi la directory ‘/tftpboot/ 192.168.1.7/’. # mkdir /tftpboot # mkdir /tftpboot/192.168.1.7 Si prosegue copiando alcune directory così come sono nel servente (è meglio non fare collegamenti ai file utilizzati dal sistema del servente) e creando altre directory vuote. # cp -dpRv /bin /tftpboot/192.168.1.7 # cp -dpRv /dev /tftpboot/192.168.1.7 # cp -dpRv /etc /tftpboot/192.168.1.7 # mkdir /tftpboot/192.168.1.7/home # cp -dpRv /lib /tftpboot/192.168.1.7 # mkdir /tftpboot/192.168.1.7/mnt # mkdir /tftpboot/192.168.1.7/opt # mkdir /tftpboot/192.168.1.7/proc Diskless: elaboratori senza disco 3956 # mkdir /tftpboot/192.168.1.7/root # cp -dpRv /sbin /tftpboot/192.168.1.7 # mkdir /tftpboot/192.168.1.7/tmp # chmod 1777 /tftpboot/192.168.1.7/tmp # mkdir /tftpboot/192.168.1.7/usr # cp -dpRv /var /tftpboot/192.168.1.7 A questo punto si rifinisce un po’. • Nella directory ‘lib/’ si potrebbero eliminare i moduli, se si è deciso che i kernel dei clienti non ne faranno uso. • Nella directory ‘etc/’ si potrebbero eliminare tutti i file e le sottodirectory riferite a programmi, inclusi i demoni, che non verranno utilizzati. • Nella directory ‘etc/’, i file ‘passwd’ e ‘group’ potrebbero essere dei collegamenti fisici ai file corrispondenti della directory ‘/etc/’ del servente.1 • Nella directory ‘var/’ bisognerebbe eliminare tutto quello che non serve, lasciando comunque, almeno le directory vuote dove necessario. In particolare vanno eliminati tutti i file di lock, i file delle registrazioni e tutti i file amministrativi dei programmi che non riguardano i clienti. Altri file vanno lasciati, ma per ognuno di questi occorre conoscerne il motivo. Per fare un esempio, il file ‘var/lib/dosemu/hdimage’ serve per avviare DOSEMU e potrebbe essere condiviso tranquillamente tra tutti i clienti. Anche le directory riferite alle stampanti costituiscono un problema. Se la stampa è necessaria, è il caso di predisporre le directory e i file necessari per una stampante di rete, in modo da poter poi condividere tra tutti i clienti la stessa configurazione. Dopo quanto descritto sulla directory ‘var/’, potrebbe essere utile proporre una struttura di esempio, come guida per la scelta su cosa sia da eliminare o meno. var |-|-| | | | | | | | | | | |-|-| | 1 cache/ catman/ |-- X11/ | |-- cat1/ | |-- cat2/ | ... |-- cat1/ |-- cat2/ ... ‘-- local/ |-- cat1/ |-- cat2/ ... dhcpd/ lib/ ‘-- texmf/ |-- fonts/ Questa soluzione non è «sicura», ma dovrebbe servire per centralizzare la gestione degli utenti senza la presenza di un sistema NIS. Tuttavia, potrebbe essere inutile, dal momento che programmi come ‘useradd’ rinominano i file ‘passwd’ e ‘group’ e poi ne generano sempre di nuovi: in questo caso conviene fare uno script per ricopiare questi file nelle directory relative ai sistemi senza disco ogni volta che si fa una modifica. Diskless: elaboratori senza disco | |-|-| |-| | | | | | |-|-|-| |-| | | | | | | | | | ‘-- 3957 ‘-- texfonts/ local/ lock/ ‘-- subsys/ log/ |-- cron/ |-- dmesg/ |-- maillog/ |-- messages/ |-- secure/ ‘-- spooler/ nis/ preserve/ run/ ‘-- netreport/ spool |-- at/ | ‘-- spool/ |-- cron/ |-- lpd/ | |-- lp/ | | | | ... ... (dipende se si vuole gestire la stampa) |-- mail/ |-- mqueue/ ‘-- rwho/ tmp -> /tmp Come si può osservare nell’esempio, si è scelto di fare in modo che ‘var/tmp’ sia un collegamento simbolico alla directory ‘tmp/’, per non perdere il controllo sulla proliferazione dei file temporanei. 351.3.3 Directory radice NFS da usare come base di partenza È stato indicato che basta predisporre una directory radice per un cliente senza disco e poi le altre per gli altri clienti possono essere ottenuti a partire da quella, con una serie di collegamenti fisici. Questo è vero in parte. Quando si utilizza anche una sola volta il cliente di esempio, vengono creati una serie di file amministrativi, temporanei, nella directory ‘var/’ (e nelle sue sottodirectory). Questi file vengono cancellati quando non servono più, o sostituiti, ma questo non avviene regolarmente alla conclusione dell’attività, ma solo quando serve. Questi file non possono essere condivisi tra i vari clienti e quindi non se ne può fare il collegamento. Ecco quindi che diviene necessario predisporre una directory radice NFS standard che non verrà utilizzata direttamente da alcun cliente e che servirà per generare le altre. La directory standard va preparata congiuntamente a quella del primo cliente utilizzato come prova del buon funzionamento della directory radice NFS. Quando si cambia qualcosa nella directory del cliente, lo si deve fare anche in quella standard, se questa modifica non si riflette già automaticamente per effetto di eventuali collegamenti fisici. Per avere un riferimento con gli esempi, stabiliamo che la directory radice NFS standard sia ‘/tftpboot/standard/’. 351.3.4 Procedura di inizializzazione del sistema Il problema più grosso da risolvere è la procedura di inizializzazione del sistema. A partire dal file ‘etc/inittab’ è necessario analizzare tutto quello che succede nella propria distribuzione GNU/Linux e intervenire in modo da permettere l’avvio dei clienti senza disco. 3958 Diskless: elaboratori senza disco Prima di farlo, si deve fare mente locale alla situazione che si ha di fronte: il kernel dei clienti provvede da solo a definire l’indirizzo dell’interfaccia di rete e a instradarsi verso il servente; inoltre monta da solo il file system principale attraverso il protocollo NFS. Quindi, la procedura di inizializzazione del sistema non ha alcuna necessità, né la possibilità di eseguire un controllo del file system principale e nemmeno di altri dischi; inoltre non deve configurare la rete, che è già configurata. A questo si può aggiungere il fatto che sarebbe meglio eliminare la gestione dei moduli del kernel, in modo da avere un problema in meno a cui badare. Nel caso della distribuzione Red Hat, si può modificare il file ‘etc/rc.d/rc.sysinit’ nel modo seguente: #! /bin/sh # Set the path PATH=/bin:/sbin:/usr/bin:/usr/sbin export PATH # Clear mtab >/etc/mtab mount -av if grep -i nopnp /proc/cmdline >/dev/null ; then PNP= else PNP=yes fi # set up pnp if [ -x /sbin/isapnp -a -f /etc/isapnp.conf ]; then if [ -n "$PNP" ]; then echo "Setting up ISA PNP devices" /sbin/isapnp /etc/isapnp.conf else echo "Skipping ISA PNP configuration at users request" fi fi # Clean out /etc. rm -f /etc/mtab~ /fastboot /fsckoptions >/var/run/utmp # Delete UUCP lock files. rm -f /var/lock/LCK* # Delete stale subsystem files. rm -f /var/lock/subsys/* # Delete stale pid files rm -f /var/run/*.pid # Delete X locks rm -f /tmp/.X*-lock # Set the system clock. echo -n "Setting clock" ARC=0 UTC=0 if [ -f /etc/sysconfig/clock ]; then . /etc/sysconfig/clock # convert old style clock config to new values Diskless: elaboratori senza disco 3959 if [ "${CLOCKMODE}" = "GMT" ]; then UTC=true elif [ "${CLOCKMODE}" = "ARC" ]; then ARC=true fi fi if [ -x /sbin/hwclock ]; then CLOCKFLAGS="--hctosys" CLOCK=/sbin/hwclock else CLOCKFLAGS="-a" CLOCK=/sbin/clock fi if [ $UTC = "true" ]; then CLOCKFLAGS="$CLOCKFLAGS -u"; echo -n " (utc)" fi if [ $ARC = "true" ]; then CLOCKFLAGS="$CLOCKFLAGS -A"; echo -n " (arc)" fi echo -n ": " $CLOCK $CLOCKFLAGS date # Initialize the serial ports. if [ -f /etc/rc.d/rc.serial ]; then . /etc/rc.d/rc.serial fi # Now that we have all of our basic modules loaded and the kernel going, # let’s dump the syslog ring somewhere so we can find it later dmesg > /var/log/dmesg # Feed entropy into the entropy pool /etc/rc.d/init.d/random start La cosa più importante da osservare in questo esempio è il fatto che il montaggio dei file system elencati nel file ‘etc/fstab’ viene fatto quasi subito; tutta la gestione del controllo dei dischi, l’attivazione della memoria virtuale e dei moduli del kernel sono stati eliminati. Eventualmente, è anche possibile l’attivazione della memoria virtuale utilizzando per questo il disco fisso dei clienti senza disco, ammesso che ce ne sia uno nella realtà, cosa che comunque appare un po’ come un controsenso: che motivo ci sarebbe di montare il file system principale dalla rete, se si dispone di un disco fisso, per quanto piccolo possa essere. Dal momento che la gestione della rete non è più compito della procedura di inizializzazione del sistema, nel caso della distribuzione Red Hat è opportuno eliminare i file ‘etc/sysconfig/network’, ‘etc/sysconfig/static-routes’ e tutta la directory ‘etc/ sysconfig/network-scripts/’. 351.3.5 Servizi e demoni Un’altra cosa a cui fare attenzione, sono i demoni avviati nei clienti. Bisogna ridurli al minimo indispensabile, anche in considerazione del fatto che è improbabile l’attivazione di servizi su dei clienti senza disco. Diskless: elaboratori senza disco 3960 351.3.6 Configurazione di etc/fstab Il file ‘etc/fstab’ utilizzato dai clienti senza disco va predisposto in modo da montare ciò che manca dopo il file system principale di tipo NFS. Si tratta delle directory ‘proc/’, ‘usr/’, ‘opt/’ e ‘home/’; la prima in modo predefinito, la seconda e la terza in sola lettura, mentre la quarta anche in scrittura. Se si vogliono utilizzare dischetti e CD-ROM nei clienti, sarà il caso di predisporre i punti di innesto rispettivi. L’esempio seguente dovrebbe essere chiaro a sufficienza, tenendo conto che si riferisce al nodo identificato dall’indirizzo IP 192.168.1.7. 192.168.1.1:/tftpboot/192.168.1.7 none 192.168.1.1:/usr 192.168.1.1:/opt 192.168.1.1:/home /dev/fd0 /dev/fd0 /dev/cdrom / /proc /usr /opt /home /mnt/floppy /mnt/a /mnt/cdrom nfs proc nfs nfs nfs ext2 vfat iso9660 defaults defaults ro ro defaults user,noauto user,noauto user,noauto,ro 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Si può intendere quindi che anche la directory ‘mnt/’ deve essere organizzata opportunamente. L’indicazione esplicita del file system principale va fatta per permettere la chiusura corretta del funzionamento quando si avvia la procedura di arresto del sistema. Infatti, il file system principale è già montato quando il sistema legge questo file all’avvio. 351.3.7 Esportazione del file system nel servente Perché la gestione degli elaboratori clienti senza disco possa funzionare, occorre evidentemente che il servente consenta l’accesso al proprio file system attraverso il protocollo NFS. Si tratta, in pratica, di configurare correttamente il file ‘/etc/exports’ e quindi di riavviare i demoni che ne permettono l’uso. Seguendo gli esempi già visti, il modo più corretto per configurare tale file dovrebbe essere il seguente: /tftpboot 192.168.1.0/255.255.255.0(rw,no_root_squash) # /usr 192.168.1.0/255.255.255.0(ro,squash_uids=0-100,squash_gids=1-80) /opt 192.168.1.0/255.255.255.0(ro,squash_uids=0-100,squash_gids=1-80) /home 192.168.1.0/255.255.255.0(rw,no_root_squash) # /lib 192.168.1.0/255.255.255.0(ro,squash_uids=0-100,squash_gids=1-80) /bin 192.168.1.0/255.255.255.0(ro,squash_uids=0-100,squash_gids=1-80) /sbin 192.168.1.0/255.255.255.0(ro,squash_uids=0-100,squash_gids=1-80) /etc 192.168.1.0/255.255.255.0(ro,squash_uids=0-100,squash_gids=1-80) /mnt 192.168.1.0/255.255.255.0(ro,squash_uids=0-100,squash_gids=1-80) /var 192.168.1.0/255.255.255.0(ro,squash_uids=0-100,squash_gids=1-80) Dagli esempi mostrati in questo capitolo, è indispensabile la condivisione delle sole directory ‘/tftpboot/’, ‘/usr/’, ‘/opt/’ e ‘/home/’. Tuttavia, le altre directory indicate potrebbero essere utili, ed è meglio prevederne subito la condivisione. Purtroppo, i demoni che gestiscono il servizio NFS potrebbero non essere in grado di interpretare correttamente la sintassi dell’esempio mostrato, per quanto questa sia corretta. Se si notano difficoltà, si può rimediare accontentandosi della configurazione seguente, dove il dominio brot.dg corrisponde a quello utilizzato nella rete 192.168.1.0/255.255.255.0. /tftpboot *.brot.dg(rw,no_root_squash) # /usr *.brot.dg(ro) Diskless: elaboratori senza disco /opt /home # /lib /bin /sbin /etc /mnt /var 3961 *.brot.dg(ro) *.brot.dg(rw,no_root_squash) *.brot.dg(ro) *.brot.dg(ro) *.brot.dg(ro) *.brot.dg(ro) *.brot.dg(ro) *.brot.dg(ro) 351.3.8 Attivazione di un nuovo cliente Per attivare un nuovo cliente basta riprodurre la directory radice NFS standard, creando solo collegamenti fisici, come nell’esempio seguente, in cui si suppone di aggiungere il cliente 192.168.1.77. # cp -ldpR /tftpboot/standard /tftpboot/192.168.1.77 In questo modo vengono copiate le directory, mentre i file vengono riprodotti come collegamenti. 351.3.9 Memoria virtuale In questo capitolo è stato ignorato volutamente il problema della memoria virtuale. Per attivare la sua gestione, le macchine usate come cliente dovrebbero avere un disco fisso e in tal senso dovrebbe essere modificata la procedura di inizializzazione del sistema. 351.4 Riferimenti • Gero Kuhlmann, Mounting the root filesystem via NFS (nfsroot) <file:///usr/src/linux/Documentation/nfsroot.txt> • Stefano Salvi, AngoLinux, Realizzazione di un Laboratorio Diskless <http://www.itis.mn.it/linux/> Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org 3962 Diskless: elaboratori senza disco Parte lxxiii Informatica gestionale 352 Codici a barre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3964 352.1 Codice di controllo «modulo n » . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3964 352.2 UPC-E e UPC-A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3965 352.3 EAN-8 e EAN-13 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3965 352.4 Code 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3971 352.5 Code 128 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3972 352.6 ITF, ovvero i25 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3976 352.7 Sistemi bidimensionali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3977 352.8 Riferimenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3977 353 Barcode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3979 353.1 Utilizzo del programma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3979 353.2 Codifica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3980 354 Trasformazione in lettere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3982 354.1 Da numero a sequenza alfabetica pura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3982 354.2 Da numero a numero romano . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3983 354.3 Da numero a lettere, nel senso verbale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3986 3963 Capitolo 352 Codici a barre I codici a barre sono dati memorizzati in forma ottica, attraverso l’uso di barre verticali che possono essere lette e interpretate facilmente con strumenti non troppo complessi. La tecnica dei codici a barre nasce negli anni 1960 e si diffonde negli anni 1970, con lo scopo di identificare rapidamente imballaggi e merci. Gli standard sui codici a barre sono molti e il problema più importante da risolvere quando si vogliono usare è il decidere quale sia quello più conveniente per i propri fini. Si parla di simbologia per fare riferimento al tipo di codice a barre, ovvero allo standard di rappresentazione dei dati; la simbologia definisce implicitamente il tipo di dati che possono essere memorizzati. Per fare un esempio abbastanza comune, i codici ISBN dei libri sono scritti usando codici a barre di tipo EAN-13, che si compongono di 13 cifre numeriche; in questo caso, la simbologia è EAN-13, con la quale si vanno a rappresentare in pratica i codici ISBN. Le rappresentazioni normali di un codice a barre sono a una sola dimensione, ovvero, è prevista una lettura orizzontale unica. Nella lettura vengono attraversate barre verticali nere e spazi bianchi; queste barre di larghezze differenti e gli spazi di ampiezze diverse sono gli elementi della simbologia; ogni simbologia usa un proprio numero di elementi differenti. Nel capitolo vengono descritte brevemente alcune simbologie standard. 352.1 Codice di controllo «modulo n » Alcuni tipi di codici numerici utilizzano un numero di controllo (o codice di controllo) per permettere una verifica facile dell’integrità del dato rappresentato. Esiste un genere comune di algoritmi per il calcolo di tali numeri di controllo, a cui si fa spesso riferimento con la definizione modulo n , dove n è un numero intero maggiore di uno. In questo modo si fa riferimento a una somma di valori, ottenuta moltiplicando ogni cifra del numero di partenza, compreso il numero di controllo, per un certo peso (un altro numero intero positivo), che deve essere un multiplo del numero n stabilito. Si osservi l’esempio seguente, in cui il numero di controllo finale è calcolato con i pesi dati, dividendo per il modulo 5: Valore Peso Peso*Valore 1 5 5 3 4 12 5 3 15 7 2 14 4 1 4 5 + 12 + 15 + 14 + 4 = 50 50 è divisibile perfettamente per cinque, senza lasciare resti, garantendo l’integrità del valore. In pratica, il peso che si dà al valore da usare come numero di controllo è solitamente uno, per cui diventa facile il calcolo di questa cifra: 5 + 12 + 15 + 14 = 46; 46 / 5 = 9, con il resto di 1; 5 - 1 = 4, ovvero il valore cercato come numero di controllo. 3964 Codici a barre 3965 352.2 UPC-E e UPC-A UPC è un insieme di simbologie standard utilizzato in particolare negli Stati Uniti e nel Canada. Con UPC-E e UPC-A si possono rappresentare solo cifre numeriche: UPC-A consente di rappresentare 11 cifre più una di controllo; UPC-E consente di rappresentare sei cifre, senza codice di controllo (il controllo di integrità avviene in forma differente). La figura 352.1 mostra rispettivamente l’esempio di 123456 con UPC-E e di 12345678901 con UPC-A. Figura 352.1. Esempi di codici a barre con simbologia UPC-E e UPC-A. Gli elementi utilizzati nella simbologia UPC sono otto, composti da quattro tipi di barre nere e quattro tipi di spazi. Il codice di controllo di UPC-A si calcola moltiplicando in modo alterno le cifre che compongono il numero, per tre, o per uno, sommando alla fine i risultati. Ciò che si ottiene si divide per 10 e si tiene il resto; infine, 10 meno il resto ottenuto dà il codice di controllo cercato (modulo 10). Per esempio, nel caso di 12345678901 si ottiene il codice di controllo due, in base al calcolo seguente: Valore Peso Peso*Valore 1 3 3 2 1 2 3 3 9 4 1 4 5 3 15 6 1 6 7 3 21 8 1 8 9 3 27 0 1 0 1 3 3 Il totale che si ottiene è 98; pertanto: 98/10 = 9 con un resto di 8; 10-8 = 2. 352.3 EAN-8 e EAN-13 EAN (European article number) è un insieme di simbologie standard di origine europea, utilizzato anche in altri paesi, nato come estensione delle simbologie UPC. EAN-8 e EAN-13 permettono di rappresentare solo cifre numeriche: EAN-8 consente di rappresentare sette cifre più una di controllo, mentre EAN-13 consente di rappresentare 12 cifre numeriche più una di controllo. La figura 352.2 mostra rispettivamente l’esempio di 1234567 con EAN-8 e di 123456789012 con EAN-13. Figura 352.2. Esempi di codici a barre con simbologia EAN-8 e EAN-13. Il codice di controllo di EAN-8 e di EAN-13 si calcola nello stesso modo di UPC-A. Per esempio, nel caso di 1234567 (EAN-8) si ottiene il codice di controllo zero, mentre nel caso di 123456789012 (EAN-13) si ottiene otto. Codici a barre 3966 Valore Peso Peso*Valore 1 3 3 2 1 2 3 3 9 4 1 4 5 3 15 6 1 6 7 3 21 Il totale che si ottiene è 60; pertanto: 60/10 = 6 con un resto di 0; 10-0 = 10, da cui si prende solo l’ultima cifra (lo zero). Valore Peso Peso*Valore 1 1 1 2 3 6 3 1 3 4 3 12 5 1 5 6 3 18 7 1 7 8 3 24 9 1 9 0 3 0 1 1 1 2 3 6 Il totale che si ottiene è 92; pertanto: 92/10 = 9 con un resto di 2; 10-2 = 8. La rappresentazione di ogni cifra numerica può avere tre forme differenti, a cui si attribuisce convenzionalmente una lettera alfabetica maiuscola: A, B e C. Nella simbologia EAN-8, le prime quattro cifre sono rappresentate secondo la forma A, mentre le ultime quattro secondo la forma C. Invece, la rappresentazione delle cifre nella simbologia EAN-13 è più complessa, per l’esigenza di essere compatibile con UPC-A. Con EAN-13 si rappresentano effettivamente solo le ultime 12 cifre (incluso il codice di controllo), mentre la prima viene determinata in base al modo in cui vengono rappresentate le sei cifre successive. In pratica, a seconda del valore della prima cifra, si determina la combinazione delle forme A e B, per le sei cifre che seguono la prima, mentre le ultime sei sono rappresentate con la forma C. Valore iniziale 0 1 2 3 4 5 6 7 8 9 A A A A A A A A A A A A A A B B B B B B A B B B A B B A A B A A B B A A B B B A A B A B B A A A B B A B B A B B A B A A Dallo specchietto si può notare che con una prima cifra pari a zero, le sei cifre successive si rappresentano secondo la forma A, esattamente come avviene nella simbologia UPC-A. In pratica, a parte qualche differenza estetica minima, un codice a barre realizzato con la simbologia EAN-13 è uguale a un altro realizzato con la simbologia UPC-A, quando la prima cifra è pari a zero, tenendo conto che lo zero iniziale non può cambiare nulla anche nel calcolo del codice di controllo finale. 352.3.1 Codici UCC ed EAN In generale, la simbologia EAN-13 viene utilizzata per identificare degli «articoli», intesi principalmente come prodotti in vendita. Per poter applicare un codice a barre del genere occorre naturalmente avere ottenuto il numero per uno scopo preciso;1 tuttavia esiste un prefisso iniziale che fa parte dello standard e serve a stabilire l’origine del codice. l’origine è un concetto riferito precisamente a chi ha rilasciato il numero, che nella maggior parte dei casi si riferisce a un’organizzazione con competenza nazionale. 1 L’ente italiano competente per l’attribuzione dei codici EAN è Indicod. Codici a barre 3967 Questo prefisso iniziale dipende principalmente da due organizzazioni: UCC (Uniform code council) ed EAN (European article number). La prima organizzazione, definisce codici in cui la prima cifra identifica l’origine nell’area nell’ambito di Stati Uniti e Canada, mentre la seconda copre tutto il mondo, includendo la codifica UCC a cui si aggiunge la cifra iniziale zero. Le tabelle 352.6 352.7 mostrano in pratica un elenco abbastanza completo dei prefissi EAN, che solitamente si applicano ai codici a barre con simbologia EAN-13. Si può osservare che ormai i codici assegnati all’area Stati Uniti e Canada non ha più solo lo zero iniziale; resta comunque l’abbinamento tra codice UCC e codice EAN, per cui il primo si trasforma nel secondo aggiungendo uno zero iniziale. Tabella 352.6. Attribuzione dei prefissi secondo la codifica EAN. Prima parte. Prefisso 00-13 2 380 384 386 388-389 45 470 472-473 475 477 479 481 483 485 487 489 50 520 528 530 532-534 536-538 54 560 569 58 591-593 595-598 600-601 609 611 613 616 619 621 623 625 627 629 64 690-693 Contesto USA, Canada uso interno Bulgaria ISO 3166 US, CA Giappone JP Lettonia Lituania Sri Lanka Belarus LV LT LK BY Armenia Kazakistan Hong Kong Gran Bretagna Grecia Libano AM KZ HK UK GR LB Belgio, Lussemburgo Portogallo Islanda BE, LU PT IS Sud Africa Mauritius Marocco Algeria Kenia Tunisia Siria ZA MU MA DZ KE TN SY Giordania Kuwait Emirati Finlandia Cina JO KW AE FI CN BG Prefisso 14-19 30-37 383 385 387 400-440 460-469 471 474 476 478 480 482 484 486 488 49 51 521-527 529 531 535 539 55 561-568 57 590 594 599 602-608 610 612 614-615 617-618 620 622 624 626 628 63 65-68 694-699 Contesto ISO 3166 Francia Slovenia Croazia Bosnia Erzegovina Germania Federazione russa Taiwan Estonia Azerbaijan Uzbekistan Filippine Ucraina Moldavia Georgia FR SI HR BA DE RU TW EE AZ UZ PH UA MD GE Giappone JP Cipro Macedonia Malta Irlanda CY MK MT IE Danimarca Polonia Romania Ungheria DK PL RO HU Egitto Libia Iran Arabia Saudita EG LY IR SA Codici a barre 3968 Tabella 352.7. Attribuzione dei prefissi secondo la codifica EAN. Seconda parte. Prefisso 70 729 740 742 744 746 750 759 770 773 775 777 779 781-783 785 787-788 80-83 850 858 860 867 869 880 885 888 890 893 899 92 94 955 958 977 980 983-989 Contesto Norwegia Israele Guatemala Honduras Costa Rica Repubblica Dominicana Messico Venezuela Colombia Uruguay Perù Bolivia Argentina ISO 3166 NO IL GT HN CR DO MX VE CO UY PE BO AR Italia Cuba Slovacchia Jugoslavia Nord Korea Turchia Sud Korea Thailandia Singapore India Vietnam Indonesia IT CU SK YU KP TR KR TH SG IN VN ID Nuova Zelanda Malaysia Macau periodici (ISSN) ricevute di rimborso (refund receipts) NZ MY MO Prefisso 710-728 73 741 743 745 747-749 751-758 76 771-772 774 776 778 780 784 786 789 84 851-857 859 861-866 868 87 881-884 886-887 889 891-892 894-898 90-91 93 950-954 956-957 959-976 978-979 981-982 99 Contesto Svezia El Salvador Nicaragua Panama Svizzera Cile Paraguay Ecuador Brasile Spagna Czech Olanda Austria Australia libri (ISBN) tagliandi di valuta (common currency cou tagliandi (coupons) Si può osservare in particolare che il prefissi 978 e 979 sono riservati per i libri, mentre il prefisso 977 è riservato per i periodici (riviste). Dal momento che il prefisso EAN definiva originariamente un’area nazionale, era stato attribuito al codice 978 la denominazione bookland (la terra dei libri). Molta documentazione sui codici a barre e sulla numerazione ISBN fa ancora riferimento a questo nome per indicare tale prefisso. Un altro prefisso interessante è il due, che rimane libero. Molti negozi usano codici a barre EAN13, con prefisso due per annotare il prezzo di qualcosa che non è identificabile diversamente, come gli alimentari ottenuti da un banco di salumi e formaggi. La figura 352.3 mostra un esempio reale in cui, tra le altre cose, si annota un prezzo di 5835 LIT. Codici a barre 3969 Figura 352.3. Esempio di un codice a barre con simbologia EAN-13, usato per annotare un prezzo. 2 000120 058354 352.3.2 ISBN La simbologia EAN-13 viene usata in diverse situazioni comuni, in particolare per ciò che riguarda le pubblicazioni. La codifica ISBN (International standard book number) permette di identificare un libro in una sua edizione precisa, attraverso un numero composto da 10 cifre. Il numero in questione contiene quattro parti: l’origine (ovvero l’ente che lo ha rilasciato), l’editore, il titolo (il libro) e un numero di controllo finale (una sola cifra). Per facilitare la lettura di queste informazioni, le quattro parti vengono mostrate solitamente come separate, attraverso un trattino. Per esempio, ‘88-8331-223-6’ indica l’origine 88 (Italia), l’editore 8331, il titolo 233 e il numero di controllo 6. Le varie parti in cui si suddivide l’informazione contenuta in un numero ISBN non sono di lunghezza fissa e la dimensione dell’una limita quella delle altre. In generale sono disponibili i raggruppamenti seguenti. 1. La prima parte identifica l’area (nazionale, linguistica e geografica) e viene attribuita dall’agenzia internazionale dell’ISBN. Il numero assegnato all’Italia è 88. • 0-7 • 80-94 • 950-994 • 9950-9989 • 99900-99999 2. La seconda parte identifica l’editore e viene attribuito dall’agenzia ISBN competente nell’area di riferimento. • 00-19 • 200-699 • 7000-8499 • 85000-89999 • 900000-999999 3. La terza parte identifica il titolo, relativamente all’editore a cui si fa riferimento, utilizzando lo spazio rimanente, escludendo il numero di controllo finale. 4. Il numero di controllo viene calcolato moltiplicando le cifre per un numero che va da 10 a uno, sommando ciò che si ottiene e dividendo per il «modulo 11. In questo modo, il valore che si ottiene può andare da 0 a 10, dove il 10 si rappresenta con una lettera «X». Codici a barre 3970 Per comprendere il meccanismo del calcolo del numero di controllo, conviene vedere un esempio reale, il numero ISBN ‘88-8331-223-6’. In pratica, si tratta di verificare che il numero sei sia effettivamente il numero di controllo corretto. Valore Peso Peso*Valore 8 10 80 8 9 72 8 8 64 3 7 21 3 6 18 1 5 5 2 4 8 2 3 6 3 2 6 6 1 6 Il totale che si ottiene è 286, che diviso per 11 dà esattamente 26, senza resto, a conferma della validità del numero di controllo. Non conoscendo il numero di controllo lo si potrebbe calcolare: la somma che si otterrebbe sarebbe solo 280, che divisa per 11 dà 25 con il resto di 5, per cui, 11 - 5 dà 6, il numero cercato. Il numero ISBN si trasforma in EAN-13 mettendo anteriormente il valore 978 e togliendo il numero di controllo finale che va sostituito con quello calcolato secondo lo standard EAN-13; naturalmente, i trattini di divisione sono perduti. La figura 352.4 mostra l’esempio del codice ISBN 88-481-0113-5 rappresentato secondo la simbologia EAN-13, che si trasforma nel numero 9788848101134. Figura 352.4. ISBN 88-481-0113-5. A seconda del paese in cui si utilizza il numero ISBN, può essere obbligatorio o meno un codice a barre aggiuntivo contenente l’informazione sul prezzo. 352.3.3 ISSN La codifica ISSN permette di identificare una pubblicazione periodica attraverso una tecnica simile a quella del numero ISBN per i libri. In questo caso, il numero è composto da otto cifre numeriche (compreso il numero di controllo), che vanno inserite in una simbologia EAN-13 aggiungendo all’inizio il prefisso 977, togliendo il numero di controllo ISSN, aggiungendo due cifre che rappresentano il codice del prezzo e aggiungendo il codice di controllo EAN-13. Inoltre, va aggiunto un codice a barre ulteriore per rappresentare due o cinque cifre in cui si indica il numero del fascicolo. Per esempio, il numero ISSN ‘1129-1346’ di una rivista potrebbe tradursi nel codice a barre 9771129134006, con l’aggiunta di 10110, dove il codice del prezzo è assente e si fa riferimento al fascicolo numero 110. La figura 352.5 mostra l’esempio del codice di due riviste, in cui appare anche un’estensione contenente il numero della pubblicazione. Figura 352.5. Esempio di due codici ISSN, riferiti a riviste, con un’estensione contenente il numero della pubblicazione (rispettivamente 106 e 23). Codici a barre 3971 352.4 Code 39 La simbologia denominata Code 39, ovvero 3 of 9, consente di rappresentare 42 simboli, composti da lettere maiuscole, cifre numeriche e pochi altri segni. La tabella 352.9 riepiloga l’insieme di caratteri. Un codice a barre Code 39 è composto da un carattere di inizio, dai dati che deve contenere, da un codice di controllo (che non appare tradotto per la lettura umana) e dal carattere di fine. Il carattere usato per iniziare e per concludere la sequenza è l’asterisco, che quindi non può essere utilizzato nei dati contenuti. Tabella 352.9. Insieme di caratteri per la simbologia Code 39. Valore 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Carattere 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L Valore 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 inizio/fine Carattere M N O P Q R S T U V W X Y Z . space $ / + % * Figura 352.6. Esempio di codice a barre Code 39. Gli elementi utilizzati nella simbologia Code 39 sono quattro, composti da due tipi di barre nere e due tipi di spazi. Ogni carattere o segno che può essere rappresentato con questa simbologia, si avvale di cinque barre e di quattro spazi, per un totale di nove elementi. Il nome della simbologia, che si può tradurre come «tre su nove», indica il fatto che tre elementi su nove sono sempre di tipo largo (rispetto agli altri che invece sono stretti). Il codice di controllo si ottiene sommando assieme i valori abbinati ai segni che si possono rappresentare, secondo la tabella di conversione 352.9, dividendo per 43. Il resto della divisione è il codice di controllo. Nel caso dell’esempio che appare in figura 352.6, si tratta della lettera ‘L’: «CIAO» = 12 + 18 + 10 + 24 = 64 Codici a barre 3972 64 / 43 = 1 lasciando un resto di 21 = ‘L’ 352.4.1 Code 39 esteso Esiste anche un’estensione della simbologia Code 39, allo scopo di consentire la rappresentazione dell’ASCII standard completo. Si ottiene questo risultato scrivendo due simboli normali al posto di uno. Naturalmente, dal momento che non esiste un modo per distinguere la codifica standard da quella estesa, è necessario che il lettore di codice a barre sia impostato nel modo più conveniente. La tabella 352.10 mostra l’insieme di caratteri esteso e la corrispondenza con i segni della simbologia Code 39 normale. Tabella 352.10. Insieme di caratteri esteso per la simbologia Code 39. ASCII <NUL> <SOH> <STX> <ETX> <EOT> <ENQ> <ACK> <BEL> <BS> <HT> <LF> <VT> <FF> <CR> <SO> <SI> <DLE> <DC1> <DC2> <DC3> <DC4> <NAK> <SYN> <ETB> <CAN> <EM> <SUB> <ESC> <FS> <GS> <RS> <US> Code 39 %U $A $B $C $D $E $F $G $H $I $J $K $L $M $N $O $P $Q $R $S $T $U $V $W $X $Y $Z %A %B %C %D %E ASCII <SP> ! " # $ % & ’ ( ) * + , . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? Code 39 = /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O 0 1 2 3 4 5 6 7 8 9 /Z %F %G %H %I %J ASCII @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ Code 39 %V A B C D E F G H I J K L M N O P Q R S T U V W X Y Z %K %L %M %N %O ASCII ‘ a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ <DEL> Code 39 %W +A +B +C +D +E +F +G +H +I +J +K +L +M +N +O +P +Q +R +S +T +U +V +W +X +Y +Z %P %Q %R %S %T Codici a barre 3973 352.5 Code 128 La simbologia denominata Code 128, ovvero USS Code 128, consente di rappresentare 106 simboli, che possono essere interpretati secondo tre insiemi di caratteri, distinti in base a una lettera: A, B e C. Per questa ragione, un codice a barre realizzato secondo la simbologia Code 128 inizia sempre con la dichiarazione dell’insieme di caratteri. L’informazione non ha una lunghezza predeterminata e può essere modificato l’insieme di caratteri quando serve. La simbologia Code 128 prevede l’inserimento di un codice di controllo, calcolato automaticamente per consentire la verifica della lettura meccanica, ma questa cifra non viene mostrata per la lettura umana. Tabella 352.11. Insiemi di caratteri per la simbologia Code 128. Prima parte. L’ultima colonna riporta anche la descrizione della rappresentazione a barre, dove un numero da uno a tre indica la larghezza della barra, ‘b’, o dello spazio, ‘s’, dalla grandezza più piccola alla più grande. Valore Code A Code B Code C 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 <SP> <SP> ! " # $ % & ’ ( ) * + ’ . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H ! " # $ % & ’ ( ) * + ’ . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 Barre e spazi: bsbsbs 212222 222122 222221 121223 121322 131222 122213 122312 132212 221213 221312 231212 112232 122132 122231 113222 123122 123221 223211 221132 221231 213212 223112 312131 311222 321122 321221 312212 322112 322211 212123 212321 232121 111323 131123 131321 112313 132113 132311 211313 231113 Codici a barre 3974 Valore Code A Code B Code C 41 42 43 44 45 46 47 48 49 50 51 52 I J K L M N O P Q R S T I J K L M N O P Q R S T 41 42 43 44 45 46 47 48 49 50 51 52 Barre e spazi: bsbsbs 231311 112133 112331 132131 113123 113321 133121 313121 211331 231131 213113 213311 Tabella 352.12. Insiemi di caratteri per la simbologia Code 128. Seconda parte. Si osservi che lo stop ha una barra in più alla fine. Valore Code A Code B Code C 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 U V W X Y Z [ \ ] ^ _ U V W X Y Z [ \ ] ^ _ ‘ a b c d e f g h i j k l m n o p q r s t u v w x y z 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 <NUL> <SOH> <STX> <ETX> <EOT> <ENQ> <ACK> <BEL> <BS> <HT> <LF> <VT> <FF> <CR> <SO> <SI> <DLE> <DC1> <DC2> <DC3> <DC4> <NAK> <SYN> <ETB> <CAN> <EM> <SUB> Barre e spazi: bsbsbs 213131 311123 311321 331121 312113 312311 332111 314111 221411 431111 111224 111422 121124 121421 141122 141221 112214 112412 122114 122411 142112 142211 241211 221114 413111 241112 134111 111242 121142 121241 114212 124112 124211 411212 421112 421211 212141 214121 Codici a barre 3975 Valore Code A Code B Code C 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 <ESC> <FS> <GS> <RS> <US> { | } ~ FNC 3 FNC 2 Shift Code C Code B FNC 4 FNC 1 Start A Start B Start C Stop FNC 3 FNC 2 Shift Code C FNC 4 Code A FNC 1 Start A Start B Start C Stop 91 92 93 94 95 96 97 98 99 Code B Code A FNC 1 Start A Start B Start C Stop <DEL> Barre e spazi: bsbsbs 412121 111143 111341 131141 114113 114311 411113 411311 113141 114131 311141 411131 211412 211214 211232 2331112 Gli insiemi di caratteri A, B e C sono elencati nelle tabelle 352.11 e 352.12. Come si può vedere, l’insieme A consente di rappresentare l’alfabeto maiuscolo, le cifre numeriche, vari simboli di punteggiatura e caratteri di controllo; in pratica, ciò che si può rappresentare con la prima parte della codifica ASCII, tenendo conto che le posizioni non corrispondono. L’insieme B consente di rappresentare praticamente tutto l’alfabeto ASCII, compresa la distinzione tra lettere maiuscole e minuscole, a esclusione dei caratteri di controllo. L’insieme C consente di rappresentare valori numerici a coppie, per cui, un valore composto da un numero dispari di cifre acquisisce uno zero iniziale. Figura 352.7. Esempio di due codici Code 128, realizzati usando l’insieme B e l’insieme C, per rappresentare due dati equivalenti: «Ciao» e 37 736 578. La figura 352.7 mostra la comparazione tra un codice a barre realizzato usando l’insieme B e un altro con l’insieme C. L’informazione contenuta è la stessa dal punto di vista dei valori rappresentabili (eventualmente si osservino le tabelle degli insiemi di caratteri). Se fosse possibile sovrapporre i due codici, si noterebbe che cambia solo la parte iniziale, quella in cui si dichiara l’insieme di caratteri, e la parte finale, dove si inserisce il codice di controllo. Si può anche osservare che gli ultimi elementi rimangono uguali e sono quelli che contengono il codice di conclusione. Volendo entrare nel dettaglio, l’esempio di figura 352.7 si compone di: ‘Start B’, 35, 73, 65, 79, codice_di_controllo , ‘Stop’; ovvero, nel secondo caso, ‘Start C’, 35, 73, 65, 79, codice_di_controllo , ‘Stop’. Quando si vuole cambiare l’insieme di caratteri, si inserisce un simbolo ‘Code A’, ‘Code B’ o ‘Code C’, per introdurre l’insieme a cui si vuole fare riferimento da quel punto in poi. Il codice di controllo finale si calcola sommando il valore corrispondente alla dichiarazione iniziale dell’insieme di caratteri alla somma dei valori successivi, moltiplicati per la loro posizione. Codici a barre 3976 La somma complessiva va divisa per 103 e il resto che si ottiene è il codice di controllo finale. Si osservi l’esempio: Peso Valore Peso*Valore Start B 1 104 104 C 1 35 35 i 2 73 146 a 3 65 195 o 4 79 316 Stop Pertanto: 104 + 35 + 146 + 195 + 316 = 796 796 / 103 = 7 con resto di 75. Il codice di controllo è il simbolo corrispondente al valore 75. Usando l’insieme di caratteri C la cosa cambia, perché il simbolo iniziale ha il valore 105, per cui il codice di controllo finale è 76: Peso Valore Peso*Valore Start C 1 105 105 35 1 35 35 73 2 73 146 65 3 65 195 79 4 79 316 Stop Dalla simbologia Code 128 derivano diverse applicazioni speciali che si distinguono per avere una struttura particolare. Esiste anche una variante che consente la rappresentazione di più caratteri rispetto all’ASCII standard. 352.5.1 UCC/EAN 128 La simbologia UCC/EAN 128 è un’applicazione di Code 128, in cui si inizia dichiarando l’insieme di caratteri e si inserisce subito dopo il simbolo ‘FNC 1’ (Function code one).2 Dopo il simbolo ‘FNC 1’ viene indicato un codice che indica il tipo di applicazione. Si fa riferimento a questo con la sigla AI (Application identifier). L’informazione in questione viene rappresentata per la lettura umana tra parentesi tonde, proprio per facilitare l’interpretazione, a sottolineare il fatto che si tratta di un prefisso. Naturalmente, l’informazione può essere anche più complessa e altre parti dei dati successivi possono essere separate ed evidenziate nello stesso modo o in modi differenti. 352.6 ITF, ovvero i25 La simbologia ITF, o i25, nota come Interleaved two of five, ovvero «interfogliata due su cinque», consente la rappresentazione di soli valori numerici, di lunghezza indefinita, purché in numero di cifre pari. La simbologia prevede una cifra di controllo finale, opzionale. La simbologia si compone di due tipi di barre e due tipi di spazi. Ogni simbolo si rappresenta con cinque barre e cinque spazi, dove due barre su cinque e due spazi su cinque sono più larghi. La simbologia è detta «interfogliata», perché una cifra è codificata nelle barre e la successiva lo è negli spazi che separano gli elementi del carattere precedente. Prima dei dati è previsto un simbolo iniziale, composto da una barra sottile, uno spazio breve, una barra sottile e un altro spazio breve; alla fine c’è un simbolo finale, composto da una barra larga, uno spazio sottile e una barra sottile. 2 L’uso comune è dell’insieme di caratteri C, ma ciò non è imposto dallo standard. Codici a barre 3977 Figura 352.8. Esempio di codice a barre con simbologia interfogliata due su cinque. 352.7 Sistemi bidimensionali Il codice a barre comune è a una sola dimensione, nel senso che contiene una sola riga di informazioni, eventualmente anche molto breve. Semplificando le cose, si può dire che quando si sovrappongono più righe in un codice a barre, questo diventa a due dimensioni. Un sistema di codice a barre a due dimensioni, con lo scopo di memorizzare dati, deve essere organizzato in modo da permettere al lettore meccanico di riconoscere e seguire le righe; inoltre deve essere previsto un sistema di informazioni ridondanti, anche molto complesso, in modo da garantire la lettura in presenza di errori. Lo standard più comune per i codici a barre a due dimensioni è il PDF417, che comunque qui non viene descritto. 352.8 Riferimenti • EAN international <http://www.ean-int.org/> • The EAN.UCC system <http://www.ean-int.org/barcodes.html> • Tino Hempel, Die Europäische Artikelnummer (EAN) <http://members.aol.com/hempeltino/info/mathe/ean/ean.pdf> • Barcoding for Beginners & Bar Code FAQ <http://www.idautomation.com/barcoding4beginners.html> • Code 39 Barcode FAQ and Tutorial <http://www.idautomation.com/code39faq.html> • Code 128 / USS Code-128 Barcode FAQ & Tutorial <http://www.idautomation.com/code128faq.html> • PDF417 Barcode FAQ <http://www.idautomation.com/pdf417faq.html> • UPC / EAN Barcode Font Data Sheet <http://www.bizfonts.com/upc-ean/faq.htm> • PDF417 <http://www.pdf417.com/> Codici a barre 3978 • Uniform Code Council, UPC symbol specification manual, 1986 <http://www.uc-council.org/reflib/01302/d36-t.htm> • Uniform Code Council, UPC symbol specification manual, Specification for The EAN Code <http://www.uc-council.org/reflib/01302/d36-g.htm> • Uniform Code Council, UCC/EAN-128 application identifier standard, 1995 <http://www.uc-council.org/reflib/00403/d30-t.htm> • Uniform Code Council, UPC film master verification manual, 1996 <http://www.uc-council.org/reflib/01403/d35-t.htm> • Russ Adams, Barcode 1 <http://www.barcode-1.com/> • International ISBN Agency: Coordinator of the International Standard Book Number system <http://www.isbn.spk-berlin.de/> • International ISBN Agency, The ISBN Users’ Manual <http://www.isbn.org/standards/home/isbn/International/ISBNmanual.asp> • AIE - Agenzia ISBN <http://www.aie.it/ISBN/intro.asp> Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org Capitolo 353 Barcode Barcode 1 è una libreria e anche un programma molto semplice per la realizzazione di codici a barre standard a una sola dimensione. Il codice a barre viene realizzato in forma di file PostScript, che successivamente può essere utilizzato direttamente o convertito in altri formati grafici, attraverso programmi standard. 353.1 Utilizzo del programma Barcode, come programma, si compone in pratica dell’eseguibile ‘barcode’. Questo genera un file PostScript che normalmente viene emesso attraverso lo standard output. barcode [opzioni] Teoricamente si può usare Barcode anche senza l’indicazione di alcun argomento, per ottenere la conversione automatica di quanto inserito attraverso lo standard input, scegliendo la simbologia in modo automatico. Tuttavia, in genere è opportuno accertarsi di selezionare la simbologia attraverso l’opzione ‘-e’. Le opzioni che vengono mostrate qui sono poche; in particolare mancano quelle che servono a definire la stampa di codici a barre in modo organizzato sul foglio, allo scopo di centrare delle etichette adesive. Per approfondire basta leggere la documentazione originale: barcode.info. Alcune opzioni -e simbologia Consente di specificare la simbologia dei codici a barre che si vogliono realizzare. Sono disponibili diverse parole chiave da usare come argomento dell’opzione, secondo la tabella 353.1. -i file Stabilisce il nome di un file contenente un elenco di codici da trasformare in codici a barre. Se manca questa indicazione e se manca anche l’opzione ‘-b’, viene letto lo standard input. La lettera dell’opzione richiama mnemonicamente la parola «input». -b stringa Consente di indicare una stringa da convertire in un codice a barre singolo. La stringa deve essere compatibile con i tipi di dati che possono essere rappresentati con la simbologia prescelta. La lettera dell’opzione richiama mnemonicamente la parola barcode, ovvero il codice a barre che si vuole ottenere dalla stringa. -E Genera un file PostScript incapsulato (EPS). Esempi $ barcode -E -e i25 -b "12345678" > prova.ps Converte il numero 12345678 in un codice a barre secondo la simbologia interfogliata sue su cinque, generando il file ‘prova.ps’, di tipo EPS. $ barcode -E -e i25 -b "12345678" -o prova.ps Esattamente come nell’esempio precedente. 1 Barcode GNU GPL 3979 Barcode 3980 $ barcode -E -e isbn -b "88-386-4177-3" -o prova.ps Come nell’esempio precedente, usando la simbologia EAN-13 per rappresentare un codice ISBN, come indicato con l’opzione ‘-b’. 353.2 Codifica Generalmente, Barcode viene utilizzato indicando il tipo di simbologia, attraverso una parola chiave secondo l’elenco della tabella 353.1. In generale, si tratta di nomi che fanno riferimento al tipo di codice a barre; in alcuni casi, il nome indica anche altre caratteristiche. Per esempio, la parola chiave ‘code128b’ indica la simbologia Code 128, nella quale si utilizza l’insieme di caratteri B; inoltre, la parola chiave ‘isbn’ fa riferimento al codice ISBN, che viene rappresentato correttamente secondo la simbologia EAN-13. Tabella 353.1. Simbologie disponibili con Barcode. Simbologia UPC-A UPC-E UPC-A o UPC-E automaticamente EAN-8 EAN-13 EAN-8 o EAN-13 automaticamente Code 39 Code 128 insieme di caratteri B Code 128 insieme di caratteri C Code 128 insieme di caratteri A, B o C, automaticamente Code 128 libero interfogliata due su cinque Codabar Plessey ISBN attraverso EAN-13 Parola chiave upc-a upc-e upc ean8, ean-8 ean13, ean-13 ean code39, 39 code128b, 128b code128c, 128c code128, 128 128raw i25, interleaved 2 of 5 cdr, codabar pls, plessey isbn Nel caso dell’uso della simbologia Code 128, si pone il problema di rappresentare i codici da <NUL> a <US>, il codice <DEL> e le funzioni speciali previste dalla simbologia. Usando l’eseguibile ‘barcode’ diventa difficile indicare questi simboli; con la libreria non ci sono problemi a indicare i codici ASCII da <SOH> a <US> e il codice <DEL>, mentre negli altri casi viene fatta una trasformazione, come rappresentato nella tabella 353.2. Tabella 353.2. Rappresentazione dei caratteri speciali per la simbologia Code 128, quando si usa la libreria Barcode. Codice o simbolo <NUL> FNC 1 FNC 2 FNC 3 FNC 4 Ottale 2008 3018 3028 3038 3048 Decimale 128 193 194 195 196 Esadecimale 8016 C116 C216 C316 C416 Sempre a proposito della simbologia Code 128, è possibile utilizzando la parola chiave ‘128raw’ per indicare un codice attraverso una stringa espressa nella forma: n_1 n_2 ... n_n In pratica, si indicano una serie di numeri separati tra loro da uno spazio. I numeri in questione Barcode 3981 rappresentano il valore indicato nelle tabelle 352.11 e 352.12; inoltre occorre tenere in considerazione che va fornito anche il valore iniziale, con il quale si definisce solitamente l’insieme di caratteri A, B o C, mentre il codice di controllo finale e lo stop sono aggiunti automaticamente. Appunti di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini -- daniele @ swlibero.org Capitolo 354 Trasformazione in lettere Nell’ambito della realizzazione di applicativi gestionali, capitano frequentemente problemi di conversione di numeri interi in una qualche forma alfabetica. In questo capitolo vengono mostrati degli algoritmi molto semplici per risolvere questo tipo di problemi. 354.1 Da numero a sequenza alfabetica pura Esiste un tipo di numerazione in cui si utilizzano solo le lettere dell’alfabeto, dalla «a» alla «z», senza accenti o altri simboli speciali, senza distinguere tra maiuscole e minuscole. In generale, i simboli da «a» a «z» consentono di rappresentare valori da 1 a 26, dove lo zero è escluso. Per rappresentare valori superiori, si possono accoppiare più lettere, ma il calcolo non è banale, proprio perché manca lo zero. Attraverso la pseudocodifica introdotta nel capitolo 282, si può descrivere una funzione che calcoli la stringa corrispondente a un numero intero positivo, maggiore di zero. Per prima cosa, occorre definire una sotto funzione che sia in grado di trasformare un numero intero, compreso tra 1 e 26 nella lettera alfabetica corrispondente; ciò si ottiene abbastanza facilmente, attraverso la verifica di più condizioni in cascata. Il vero problema, purtroppo, sta nel costruire una stringa composta da più lettere, quando si vuole rappresentare un valore superiore a 26. Non essendoci lo zero, diventa difficile fare i calcoli. Se si parte dal presupposto che il numero da convertire non possa essere superiore a 702, si sa con certezza che servono al massimo due lettere alfabetiche (perché la stringa «ZZ» corrisponderebbe proprio al numero 702); in tal caso, è sufficiente dividere il numero per 26, dove la parte intera rappresenta la prima lettera, mentre il resto rappresenta la seconda. Tuttavia, se la divisione non dà resto, la stringa corretta è quella precedente. Per esempio, il numero 53 corrisponde alla stringa «BA», perché 53/26 = 2 con un resto di 1. Nello stesso modo, però, 52 si traduce nella stringa «AZ», perché 53/26 = 2, ma non c’è resto, pertanto, «B » diventa «AZ». La pseudocodifica seguente riepiloga il concetto in modo semplificato, dove, a seconda delle esigenze, la conversione è sempre limitata a un valore massimo. Le omissioni sono parti di codice facilmente intuibili. INTEGER_TO_ALPHABET (N) ALPHABET_DIGIT (DIGIT) IF DIGIT = 0 THEN RETURN "" ELSE IF DIGIT = 1 THEN RETURN "A" ELSE IF DIGIT = 2 THEN RETURN "B" ... ... ELSE IF DIGIT = 26 THEN RETURN "Z" ELSE RETURN "##ERROR##" FI END ALPHABET_DIGIT IF N <= 0 THEN RETURN "##ERROR##"; 3982 Trasformazione in lettere 3983 ELSE IF N <= 26 THEN RETURN ALPHABET_DIGIT (N) ELSE IF N <= 52 THEN N := N - 52 RETURN "A" ALPHABET_DIGIT (N) ELSE IF N <= 78 THEN N := N - 78 RETURN "B" ALPHABET_DIGIT (N) ... ... ELSE IF N <= 702 THEN N := N - 702 RETURN "Z" ALPHABET_DIGIT (N) ELSE IF N <= 728 THEN N := N - 728 RETURN "AA" ALPHABET_DIGIT (N) ELSE IF N <= 754 THEN N := N - 754 RETURN "AB" ALPHABET_DIGIT (N) ... ... ELSE RETURN "##ERROR##" END IF END INTEGER_TO_ALPHABET 354.2 Da numero a numero romano La conversione di un numero intero positivo in una stringa che rappresenta un numero romano, ha un discreto livello di difficoltà, perché la numerazione romana non prevede lo zero, perché la tecnica prevede la somma e la sottrazione di simboli (a seconda della posizione) e poi perché diventa difficile indicare valori multipli delle migliaia. Per prima cosa è necessario conoscere il valore associato ai simboli elementari: Simbolo I V X L C D M Valore corrispondente 1 5 10 50 100 500 1000 Un simbolo posto alla destra di un altro simbolo con un valore maggiore o uguale di questo, viene sommato; al contrario, un simbolo posto alla sinistra di un altro simbolo con un valore maggiore o uguale di questo, viene sottratto. Per esempio, «VI» equivale a 5+1, mentre «IV» equivale a 5-1. Esistono comunque anche altri vincoli, per evitare di creare numeri difficili da interpretare a causa di una complessità di calcolo eccessiva. Per risolvere il problema con un algoritmo relativamente semplice, si può scomporre il valore di partenza in fasce: unità, decine, centinaia e migliaia (la conversione di valori superiori genererebbe soltanto una serie lunghissima di «M» che risulta poi troppo difficile da leggere). Trasformazione in lettere 3984 INTEGER_TO_ROMAN (N) LOCAL LOCAL LOCAL LOCAL DIGIT_1 DIGIT_2 DIGIT_3 DIGIT_4 DIGIT_1 DIGIT_2 DIGIT_3 DIGIT_4 := := := := INTEGER INTEGER INTEGER INTEGER 0 0 0 0 DIGIT_1_TO_ROMAN (DIGIT) IF DIGIT = 0 THEN RETURN "" ELSE IF DIGIT = 1 THEN RETURN "I" ELSE IF DIGIT = 2 THEN RETURN "II" ELSE IF DIGIT = 3 THEN RETURN "III" ELSE IF DIGIT = 4 THEN RETURN "IV" ELSE IF DIGIT = 5 THEN RETURN "V" ELSE IF DIGIT = 6 THEN RETURN "VI" ELSE IF DIGIT = 7 THEN RETURN "VII" ELSE IF DIGIT = 8 THEN RETURN "VIII" ELSE IF DIGIT = 9 THEN RETURN "IX" END IF END DIGIT_1_TO_ROMAN DIGIT_2_TO_ROMAN (DIGIT) IF DIGIT = 0 THEN RETURN "" ELSE IF DIGIT = 1 THEN RETURN "X" ELSE IF DIGIT = 2 THEN RETURN "XX" ELSE IF DIGIT = 3 THEN RETURN "XXX" ELSE IF DIGIT = 4 THEN RETURN "XL" ELSE IF DIGIT = 5 THEN RETURN "L" ELSE IF DIGIT = 6