Topolinux 11 - Vecchiomago

Transcription

Topolinux 11 - Vecchiomago
Editoriale
Bentrovati!
Quanto tempo è passato dall’ultimo numero? Moltissimo e per la
precisione sette mesi! Sono veramente tanti rispetto alla partenza
del progetto in cui le uscite avevano frequenza quasi bimestrale.
Direi che vi stiamo facendo penare le nuove uscite ma abbiamo
dalla nostra parte alcune scusanti, concedetecelo ;)
Era nostra intenzione far uscire il nuovo numero in contemporanea con la nuova veste del portale ma quest’ultimo ci sta portando via veramente più tempo del previsto e quindi per non lasciarvi
a corto di lettura e per fare un piccolo regalo natalizio abbiamo
infine deciso di pubblicare il nuovo numero sul vecchio portale e
rimandarvi a Gennaio per il nuovo vestito, vi assicuro che non ve
ne pentirete.
Prima di parlarvi del numero 11 dell’ezine, vorrei ricordarvi che
TopoLinux è in continua ricerca di persone volenterose che contribuiscano alla sua crescita.Quindi se hai scritto qualche articolo,
una pillola e vuoi vederla pubblicata quì tra le nostre pagine non
esitare ti aspettiamo!
Bene, presentate le scusanti e rinnovato l’invito direi che è il caso
di dare una panoramica di cosa troverete tra le pagine dell’ultimo numero segnalando che ai vecchi articolisti si sono affiancati
Luca Gambetta e Marco Magnatti che ringrazio.
Proseguono il loro viaggio su questo numero il tutorial su Inkscape e la rubrica echo $feedback che stando a quanto arrivato in
redazione hanno riscosso un discreto successo tra i nostri lettori,
cosa che ovviamente ci fa molto ma molto piacere.
Finalmente superati i problemi logistici siamo riusciti a pubblicare
l’ultima parte del tutorial dedicato agli attacchi DDos quindi ora
riprendete i vecchi numeri e leggete la serie tutta di un fiato.
Vi sveleremo anche come far parlare Amarok e come accedere ai
dati di un sistema che non riesce ad avviarsi.
Putroppo per problemi di studio e lavoro dobbiamo sospendere
temporanemanete il corso di Shell Script che comunque riprenderà dal prossimo numero.
Penso ora di avervi detto proprio tutto e forse di essermi anche
dilungato un po’ troppo.
Vi saluto con un augurio di Felicissimo Natale da parte di tutta la
redazione di TopoLinux!
Ringraziamenti
Fabiana per il nome dell’e-zine;
Rockaffé per tutti i suggerimenti dati;
MakPaolo per il supporto con i CSS;
AngelinoAnt per il supporto hack phpBB;
ed in particolare tutti i membri dello staff!
Numeri arretrati
I numeri arretrati dell’e-zine sono disponibili
per il download sul sito e
consultabili on-line nella sezione ‘Arretrati’
Sito Web
http://www.topolinux.org
Forum
http://forum.topolinux.org
Newsletter
Per rimanere sempre informati
su tutte le attività riguardanti l’e-zine,
è possibile iscriversi sul sito
nella sezione ‘Newsletter’
Lettere alla redazione
[email protected]
Direttore:
Lemoeb ([email protected])
Redattore:
Neon ([email protected])
Correttore di bozza:
Rolly
Giornalisti freelance:
Stonedz
JoErNano
Collaboratori esterni:
Gil (OpenSourceMania.it)
Versione elettronica curata da:
DnDVault ([email protected])
Klaudia ([email protected])
Lemoeb
Copertina:
Klaudia ([email protected])
Copyright (c) 2007 Topolinux
è garantito il permesso di copiare, distribuire e/o modificare
questo documento seguendo i termini della Licenza per
Documentazione Libera GNU, Versione 1.1 o ogni versione
successiva pubblicata dalla Free Software Foundation; con le
Sezioni Non Modificabili Sommario e Lettere alla Redazione, con i Testi
Copertina “Topolinux l’ezine italiano completamente dedicato al Pinguino”.
Una copia della licenza è acclusa nella sezione intitolata “GNU FDL”.
SO MM A RI O
Recensioni
Recensione di KDE 4 Beta 1................................................................................pag.
4
Sistema
Installazione e configurazione di Tomcat 5.5..........................................................pag.
11
Accedere ai dati di un sistema che non si avvia..................................................pag.
18
Ambiente desktop
Inkscape - Parte 2....................................................................................................pag.
21
Connettersi ad internet con un cellulare Bluetooth................................................pag.
26
Sicurezza
DDos Attacco e Difesa - Terza ed ultima parte..................................................pag.
29
Pillole
Amarok Parla!..........................................................................................................pag.
35
Echo $feedback
La rubrica che stampa a schermo i vostri consigli.............................................pag.
36
Recensioni
KDE 4 Beta 1
Nota iniziale
strato che permette alla propria applicazione di
“vivere” non cambierà, a parte la correzione dei
bug. Da adesso in poi, quindi, non sarà più tempo di giocare, si farà sul serio!
Questo articolo è stato scritto da Luca ‘Ziabice’
Gambetta, e pubblicato sul famosissimo blog
“Pollycoke”, che ha accettato la pubblicazione
su Topolinux. Tutto lo Staff di Topolinux ringrazia pubblicamente Felipe e Luca per la loro disponibilità. Potete trovare l’articolo originale al
seguente indirizzo: http://pollycoke.word-
Nonostante il freeze sono venute fuori diverse
novità, tra le quali la più succosa per me è quella
del supporto al compositing in KWin. Volevo verificare come questo fosse stato integrato nel sistema e devo dire che non sono rimasto deluso,
non c’è nessun cubo o finestra che “wobbla”, ma
tutto il resto, come vedremo, è “alive’n’kickin”.
Vi anticipo subito che già da adesso KDE 4 ha
tutte le carte in regola per fare un gran figurone.
In particolare la responsività del sistema e la velocità nell’avvio delle applicazioni mi ha favorevolmente colpito. Togliersi lo sfizio
press.com/2007/08/06/recensione-di-kde4-beta-1/
Pane al pane…
Mi tolgo subito il sassolino dalla scarpa: i programmatori di KDE hanno completamente sbagliato il piano di rilascio per KDE 4. Inutile dargli
torto, per carità (anche Vista è arrivato con anni
di ritardo), il progetto è complesso, ma chiamare
questo rilascio “beta 1″ è a dir poco controproducente, dato che crea aspettative inevitabilmente
destinate ad essere disattese. E’ una alfa e non
ci piove, prendetela quindi per quello che è: una
collezione di software altamente immaturo che
crasha ogni tre per due.
Inizialmente la prova doveva basarsi sul Live
CD “ufficioso” che potete trovare qui: http://
home.kde.org/~binner/kde-four-live/ .
Dopo il classico test effettuato usando una macchina virtuale eseguita in VirtualBox ho deciso
che era meglio usare una macchina reale. Purtroppo tutti i tentativi di boot del CD con la mia
workstation sono falliti e dato che non mi faccio
mancare nulla, ho deciso di compilare dai sorgenti un sistema minimale. La prova su strada
è stata effettuata su una distro Arch Linux aggiornata all’ultimo rilascio, che gira sul seguente
hardware:
• Athlon 64 3000+ (2ghz su socket 754)
• 1 GB Ram
• NVIDIA GeForce FX5700LE con 256 MB
RAM
• 1 HD SATA da 200 GB
• 2 HD PATA da 120 in RAID 1 su controller 3ware
Il sistema appena avviato
• Kernel 2.6.22 (ricompilato ed ottimizzato
per il sistema in uso)
…e vino al vino
“Cambiare tutto per non cambiare niente“: mai
motto fu più calzante! Lo scopo di questa release è quella di presentare al grande pubblico le
librerie stabilizzate (occhio non ancora completamente stabili), ossia le fondamenta sulle quali
costruire tutto il resto del sistema. Perciò da qui
in avanti ogni programmatore saprà che il sub-
• XOrg 7.2
• Driver NVIDIA 100.14.11
• GCC 4.2.1
• GLibc 2.6
Il sistema è stato installato nella directory /opt/
kde4. E’ stata usata la libreria Qt 4.3.0 fornita
Recensioni
nel repository “community”, installata con:
Primo impatto
pacman -S qt4
Fin da subito mi ha colpito molto la responsività del sistema: se è vero che le azioni portano
ad un crash dell’applicazione, nel poco di tempo
che questa funziona lo fa in modo rapido e reattivo, come ci si aspetterebbe da un Desktop Environment nuovo di pacca. Sarebbe poco onesto non ammettere che gran parte del merito va
attribuito alle librerie Qt4, una base solidissima
su cui impostare il sistema. Anche la resa grafica ne ha tratto beneficio, con caratteri definiti, finalmente poche cornici e grafica vettoriale dove
possibile. L’aspetto base è molto “flat”, aspetto
questo che ho molto gradito, ma la tinta ghiaccio
è un po’ troppo chiara.
Tutte le altre dipendenze erano già soddisfatte
in quanto sulla macchina è già presente KDE
3.5.7. Lo scopo della prova era vedere come si
comportasse un sistema base in un ambiente
“sterile”: perciò ho compilato in prima istanza
solo i pacchetti:
strigi-0.5.4 (messo in /usr/local)
kdelibs-3.92.0
kdepimlibs-3.92.0
kdebase-3.92.0
kdegraphics-3.92.0
La compilazione è molto semplice, davvero il
passaggio a CMake si fa sentire, rendendo il
processo chiaro ed alla portata praticamente di
chiunque (figata la percentuale di avanzamento nella compilazione). Inutile dire che in caso
di dubbi ci sono delle pagine apposite sul sito
ufficiale (http://techbase.kde.org/Getting_
Started/Build/KDE4_Alpha_1). Per farla breve
con la compilazione, dopo aver settato delle variabili di ambiente, per ogni pacchetto ho eseguito:
tar jxvf nomepacchetto.tar.bz2
cd nomepacchetto
Un assaggio dello stile utilizzato nei pannelli di
configurazione (in questo caso di KWrite). Tutto reso
molto vivo dalle belle icone e dai colori di Oxygen
mkdir build
cd build
cmake -DCMAKE_INSTALL_
PREFIX=/opt/kde4 ..
Si nota subito la presenza del “vecchio” Kicker
(che verrà sostituito da Plasma) sul quale tra
l’altro non girava la systray, rendendo le applet
normali finestre. Anche Plasma è a dieta: in questo rilascio non sono presenti componenti oltre
al classico orologio, che peraltro non funziona
correttamente. Nota personale: odio il modo in
cui Plasma si attiva, ossia il fatto che se sposto
il mouse in alto a sinistra si srotola il pannellino di controllo coi componenti. Lo trovo molto
poco funzionale e troppo invasivo, preferirei di
gran lunga una discreta applet nella systray per
controllare il tutto o una genialata (tipo click del
tastro centrale sul desktop o la pressione degli
inutili tasti Windows).
make
make install
Al termine della compilazione ho creato un utente con il quale eseguire i test di utilizzo, in un
ambiente che potrei definire “sterile”: ho infatti
rimosso tutte le variabili d’ambiente e path che
permettessero al sistema di riconoscere applicazioni preesistenti sulla macchina. Nella compilazione ho escluso il supporto a Soprano e di
conseguenza a Nepomuk, quindi niente desktop
semantico, come pure niente supporto per poppler-qt4 perchè mi avrebbe incasinato un po’ la
distro e di conseguenza niente supporto per i
PDF e i PS in Okular. Tanto sarebbe andato in
crash, fidatevi… ;)
Il fatto di avere compilato pochi sorgenti mi ha
permesso di rendermi subito conto di una cosa:
ci sono poche applicazioni, ma il sistema base
è dannatamente complesso e renderlo usabile
Recensioni
e configurabile sarà una vera sfida. C’è davvero
da perdersi tra i menu di configurazione, uno per
ogni applicazione, tutti resi più o meno semplici.
L’analisi del core ridotto mi permette allo stesso
tempo di focalizzarmi su quei componenti che
tutti useremo spesso anche senza esserne coscienti: basti pensare ad esempio che l’editor di
testo è la parte fondante anche di Kdevelop o di
Quanta. E proprio da qui voglio partire…
opzioni, ma quelle che vi servono per un editing al volo sono tutte lì nella toolbar. Davvero
bella la funzione di ricerca inline: basta premere
CTRL+F e appaiono nella statusbar i controlli
per effettuare una ricerca i cui risultati si aggiornano mano a mano che si scrive, in una maniera
simile a Firefox.
Cercando il pelo nell’uovo mi lasciano un po’
perplesse le icone: quella per l’azione “Open” è
davvero poco intellegibile, “Close” proprio fuori
contesto. Impostando la dimensione delle icone
a 64×64 la situazione migliora, ma non di molto (per farlo andate sulla toolbar, premete il tasto destro e selezionate la voce nel menu “Icon
Size”). In generale ho notato che le icone nella
loro versione a media risoluzione (22×22) sono
poco chiare, mentre danno il meglio di se a partire da 32×32 pixel.
L’editor di testo, uno solo: KWrite
L’editor di testo di default è adesso KWrite, che
raggruppa in un’unica applicazione KWrite, Kate
e KEdit già presenti in KDE 3. Il nome non vi inganni: è Kate aggiornato ed è davvero ben fatto.
Veloce, pieno di funzionalità e semplicissimo da
utilizzare. Interessante il fatto che vada bene sia
per un programmatore che per l’editing estemporaneo.
I problemi delle icone Oxygen risolti aumentando la
risoluzione
Scrivendo l’articolo con tale editor ho notato un
KWrite alle prese col codice sorgente PHP. piccolo degradamento delle performance al creIn particolare si nota l’evidenziazione dei blocchi di scere del testo. Spero che sia un problema pascodice con diversi colori seggero che verrà risolto quanto prima.
Il visualizzatore di
immagini: Gwenview
Come potete vedere dallo screenshot, quando
si edita del codice sorgente viene automaticamente fatto il folding ed utilizzato il colore per
evidenziare i blocchi di codice. Va fatto un plauso all’usabilità: nei menu ci sono un milione di
Nonostante non sia presente nel menu “Graphi-
La schermata iniziale di Gwenview
La ricerca inline di KWrite
Recensioni
cs”, il visualizzatore di immagini predefinito in
KDE 4 è Gwenview.
in due parti differenti). La cosa simpatica è che
quello che fate in una finestra si riflette nell’altra:
ad esempio se aprite Midnight Commander in
una tab che poi suddividete e staccate, mentre
muovete il cursore in una finestra potrete vedere
accadere la stessa cosa nell’altra, come se fosse uno specchio.
Ancora da rifinire in quanto ad usabilità (la barra sinistra di navigazione tra le directory grida
vendetta), brilla per la sua velocità. Si avvia in
un attimo ed in un attimo ti permette di navigare tra la tua collezione di immagini. Strano che
non mostri le preview delle immagini JPEG con
tag EXIF, spero che sia un mio errore in fase di
compilazione. Durante le prove non è mai andato in crash e per un software riscritto da zero
non può che essere un buon segno. Okular
L’occhio che tutto vede, purtroppo l’ho compilato senza il supporto per i file PDF e PS e quindi
è un po’ orbo, ma quel che c’è rende l’idea (sì
lo so è poco serio fare una recensione in questa
maniera, ma non volevo incasinare la distro, abbiate pazienza).
La split view di Konsole
Mi manca un po’ l’opzione (che sapevo sarebbe
stata implementata) di una finestra stile Yakauke
(ossia come la console di Quake), che apparisse dall’alto (o basso, destra, sinistra, of course)
col solo magico tocco di un tasto. Peccato, ma
spero la implementino. Mi piace come è stato
implementato il cambio dell’aspetto del terminale, con una live preview del cambiamento delle
impostazioni che rende bene l’idea. Attivando la
voce del menu “Settings” -> “Edit Current Profile” e selezionando la tab “Appearance”, verrete innanzitutto salutati da un simpatico effetto
grafico (simpatico solo le prime due o tre volte,
beninteso) in cui vedrete i vari stili grafici materializzarsi nel selettore e passandoci su
vedrete la finestra del
terminale sottostante
cambiare al volo.
Okular che visualizza una immagine. Sembra buona,
ma la mia Kiki è addestrata ad azzannare nelle parti
basse e a deridere la vittima dandogli del
“ciucciababbano”
E’ il “visualizzatore di tutti i formati file supportati
al mondo” di KDE 4, ossia l’applicazione che dovrebbe aprirsi nel 90% dei vostri click su un file.
Anche qui grande velocità nell’avvio, ma un pelino meno velocità nell’apertura dei file. Ho testato con diversi file CHM ed è risultato molto lento
nell’apertura, ma poi veloce nella navigazione.
La qualità del rendering dei caratteri non mi ha
convinto. Attendiamo sviluppi.
Idem per il font di
caratteri. Non so se
l’effetto “a comparsa”
verrà esteso anche
ad altri controlli, ma
va secondo me ponderato bene, dato che
potrebbe
generare
disturbo se usato su
Il terminale: Konsole
Ahhhh… il terminale, compagno di tante avventure! Per me è uno dei componenti fondamentali
del sistema ed è pure uno di quelli che ha subito
tanti interventi. Tra i più evidenti c’è la possibilità di suddividere la visualizzazione in verticale o orizzontale (ossia vedete la stessa finestra
Configurazione di Konsole
Recensioni
larga scala. Ho notato una non eccelsa velocità
di rendering del testo, speriamo bene per la versione finale…
Il file manager: Dolphin
Conosciuto ai più come “il file manager che fa
solo il file manager” o dai tignosi come “Abbiamo berciato anni contro Nautilus ed ora dovrei
dire che un clone di Nautilus era proprio quello
che ci voleva?”, nella sua attuale incarnazione
non delude, anzi cresce sempre meglio. E’ una
scheggia e perciò ho usato un suo degno rivale
per fare una prova alla pari, buttando nella mischia Thunar incluso in XFce 4.4.
Dolphin, dopo qualche personalizzazione all’interfaccia
Riportando il pupo alla sua forma base, ma lasciando attivo il pannello informazioni (sulla destra) verremo omaggiati di un elegante effetto
grafico all’avvio della preview dei file: passando
col mouse su un file infatti l’immagine cambierà con un effetto morfing allargandosi o restringendosi in modo fluido, molto bello e funzionale,
peccato che però non venga eseguito se ho un
file selezionato e passo col mouse sopra un altro file nell’elenco.
Odiosa invece la navigazione “in punta di click”:
se si clicca una volta sola viene automaticamente lanciata l’applicazione associata al tipo MIME
del file. In un attimo mentre navigavo in una directory con dei file musicali e delle immagini m’è
partito il player mp3 e Gwenview, intasandomi lo
schermo. C’è chi sostiene che il singolo click sia
più usabile, ma a me lascia un po’ perplesso. Il
guaio è che non ho trovato il modo per impostare il comportamento “a doppio click”.
Ad ogni modo nel suo utilizzo Dolphin è piacevole ed intuitivo, ma soffre di un degrado di performance non appena i file diventano un po’ di
più o la visuale viene impostata su “Columns”.
Dacci il proibito!
L’interfaccia grafica
Separati alla nascita: Dolphin (sopra) e Thunar (sotto)
Se guardate gli screenshot delle schermate iniziali dei due programmi penserete come me che
siano stati separati alla nascita: Thunar sembra
più brutto perchè non ho settato nessuno stile
Gtk, ma con le icone Tango fa comunque la sua
figura. Se d’acchito l’interfaccia è ben pulita, basta qualche click maligno nel sottomenu “View”
-> “Panels”, per trasformarla nel mostro che potete vedere in figura.
Adesso vi aspettereste fighi screenshot col tema
Oxygen, con me che tesso lodi e sbrodolo un po’
a destra e a manca. Invece vi sbagliate, perchè
ciò che sto per mostrarvi è molto meglio e molto
più arcano.
Nel pannello di controllo non ve n’è traccia, perchè per attivarlo bisogna usare tutte le arti magiche che solo un nerd possiede. Portate il mouse
sulla decorazione superiore della finestra e premete il tasto destro, selezionate “Configure Win
Recensioni
dow Behavior”, selezionate “Desktop Effects”. A
questo punto spuntate “Enable Desktop Effects”
e poi pigiate “Apply” e la pornografia è servita!
Anche KDE4 ha exposé
Dove i poteri arcani risiedono
Il selettore di applicazioni (attivabile con ALT+Tab):
trasparenze e fading a go go!
Il bello è che tutto è stato implementato in maniera ultramodulare, permettendo un controllo
fine su tutti gli effetti, proprio come avviene in
Compiz. Certo è ancora acerbo, ma sapere di
Subito dopo l’attivazione degli effetti vengono attivati
dei plugin minimi: ombre e offuscamento delle finestre
in secondo piano
Per magia compariranno le ombre sotto le finestre e quelle in secondo piano si scuriranno.
Portando il mouse nell’angolo in altro a destra
partirà l’effetto “à la Exposè” per scegliere tra
le finestre attive. Ed è solo l’inizio! Tutto l’ambiente desktop si avvantaggerà delle possibilità
di compositing.
Una caratteristica davvero interessante è che è
possibile scegliere quale motore di composizione si vuole, se OpenGL o XRender. Il che vuole
dire che anche un PC senza una scheda grafica
con driver ultimo grido può avvantaggiarsi delle
funzionalità aggiuntive (appena saranno implementate, ovviamente).
Ecco cosa si ottiene premendo “Advanced Options...”
nel dialogo “Enable desktop effects”.
Recensioni
averlo built-in è la marcia in più di KDE 4 rispetto
alla concorrenza. No, per adesso non ci sono
cubi, ma c’è tutto quello che è utile nell’uso quotidiano e non è per niente invasivo.
Nota stonata (ma non credo potesse essere altrimenti per un primo rilascio) un certo degrado
delle performance, penso che sia dovuto alla
mancata ottimizzazione per le applicazioni che
generano parecchi aggiornamenti dello schermo. Mentre scrivevo questa recensione con
KWrite ad esempio era evidente la perdita di
frame. La lunga strada verso la vittoria
Conclusioni
Ne è valsa la pena? Sì, ne è valsa la pena. Non
sono purtroppo nello stato di inebetimento da
release spaccamascella, ma so che quando mi
sveglierò dalla camera criogenica in cui mi porrò
per arrivare fresco ad ottobre (ottobre? ma chi
ci crede, facciamo fine novembre, va) troverò il
mio desktop environment dei sogni pronto a cullarmi nel mio lavoro quotidiano. Vedo tutti i pezzi, qualcuno è al proprio posto, mentre lo spazio
vuoto lo immagino riempito con la materia di cui
sono fatti i sogni.
Novembre, accendo il PC e parte “Your Ex-Lover Is Dead” degli Stars mentre le pareti intorno
a me scompaiono ed io mi libro in cielo arrivando
presso la sede del prossimo GUADEC, plano e
faccio il gesto dell’ombrello ai convenuti, mentre
grido “usabilitatemi questo!”. Poi torno a casa e
resto ore a giocare con l’orologio al Plasma, la
pistola al Plasma, i Plasmon, il BFG-9000, a plasmare mondi e benedire Aaron Seigo…
Luca ‘Zia Bice’
Gambetta
10
Sistema
Installazione e configurazione di
Tomcat 5.5
U
na guida basilare ma completa per l’installazione e la configurazione del sever
web Apache Tomcat 5.5, con alcuni preziosi suggerimenti per facilitarsi la vita. Può non
essere del tutto esaustiva, ma dovrebbe essere
più che sufficiente per comprendere il funzionamento del web server, considerando che le
informazioni reperibili in rete sono spesso frammentarie.
Il sottoscritto ha installato il server su Ubuntu linux, quindi alcuni parametri o directory possono
differire rispetto ad altri sistemi. In generale cercherò di specificare sempre quali sono le cose
dipendenti dal tipo di sistema in uso.
innanzitutto che la jvm di default in uso nel sistema sia quella che volete voi, ossia quella relativa
a JRE versione 5.0 (o 1.5, che dir si voglia) che
avete installato: potete trovare la procedura qui
per i sistemi Ubuntu. Su windows non dovrebbero esserci problemi, visto che nell’installazione
base non è prevista una virtual machine. Gli altri
si arrangino, almeno per ora.
Configurare la variabile d’ambiente $JAVA_
HOME, corrispondente al path in cui è installata
la virtual machine:
cd ~
nano .bashrc
Richiede un minimo di familiarità con java.
E aggiungete in fondo al file la riga:
Installazione
export JAVA_HOME=<path_in_
cui_avete_installato_la_jvm>
Ovviamente, scaricate e installate Java JDK, dal
sito della sun o dai repository della vostra distribuzione. Vi consiglio caldamente l’ultima versione, che al momento è la 5.0 (quella successiva
alla 1.4, per intendersi), per non avere problemi
di compatibilità con le ultime specifiche di servlet e JSP.
Un esempio di path può essere /usr/lib/jvm/java1.5.0-sun-1.5.0.06, ma questo varia a seconda
della distribuzione e della versione di java.
Scaricate Tomcat dal sito ufficiale (tomcat5.5
download page). Attualmente la versione più recente è la 5.5.17, è importante scaricare questa
in quanto corregge molti dei bug (ma non tutti…)
della versione 5.0. In generale, è bene tenere il
server sempre aggiornato alla versione più recente.
Altrimenti potete installare la versione fornita
con la vostra distribuzione, se disponibile; in
ogni caso non ve lo consiglio, in quanto le versioni presenti sui repository tendono ad essere
poco aggiornate. Nel secondo caso, tipicamente
il server viene installato in /usr/share/tomcat5,
vi consiglio di usare la stessa directory anche
se lo installate scaricandolo dal sito di Apache.
D’ora in poi faremo riferimento al percorso di installazione con $CATALINA_HOME, qualunque
esso sia.
Assicurarsi di stare utilizzando la virtual machine
giusta; è possibile che sul sistema ve ne sia più
di una installata. Per stare tranquilli, assicuratevi
Creiamo la variabile d’ambiente $CLASSPATH
che servirà per compilare file .java, e in particolare le servlet per tomcat. Il classpath indica alla
jvm dove andare a cercare le definizioni di classe necessarie alla compilazione. Nuovamente:
cd ~
nano .bashrc
E aggiungiamo
export CLASSPATH=.:./:$CATALINA_
HOME/common/lib/jsp-api.
jar:$CATALINA_HOME/common/
lib/servlet-api.jar
Dove $CATALINA_HOME è la directory in cui
è installato tomcat. Ovviamente, perchè quanto
riportato funzioni, dovete sostituire a $CATALINA_HOME il percorso di installazione, o, ancora
meglio, creare proprio tale variabile con procedimento analogo (aggiungere ”export CATALINA_HOME=<path…>”). NB: il classpath nell’esempio comprende quattro percorsi distinti,
separati da ”:”. I due archivi .jar contengono le
varie classi necessarie per servlet e jsp: bisogna
quindi far sapere, tramite il classpath, alla jvm
dove andare a cercarle, altrimenti le vostre serv11
Sistema
let non compileranno mai… Utile anche inserire
”.” nel classpath, così da poter compilare ogni
file nella sua stessa directory (la jvm cerca anche lì le definizioni necessarie), così come ”./”,
necessario per cercare nelle sottocartelle (eventuali package).
Nota: se usate un IDE, come Eclipse ad esempio, per lo sviluppo delle vostre applicazioni, non
avete bisogno di impostare il classpath, in quanto, di solito, è l’IDE stesso a richiedervi di configurare, tra le sue opzioni, i path di tutte le librerie
necessarie alla compilazione.
Estraete il contenuto dell’archivio apachetomcat-5.5.17.tar.gz che avete scaricato. Dentro la cartella bin, estraete il contenuto dell’archivio jsvc.tar.gz in jsvc. Si tratta dell’applicazione
che useremo per avviare/fermare tomcat; prima
però dobbiamo compilarla. A questo punto:
# siamo ancora dentro
la cartella bin
cd jsvc
autoconf
./configure
make
# spostiamo il file generato
dentro la cartella bin
cp jsvc ..
Rinominate l’archivio che avete scaricato ed
estratto (apache-tomcat-5.5.17 e non jsvc!), ad
esempio, in ”tomcat5.5”, e spostate la cartella in
”/usr/share/”, o dove meglio credete.
Apache fornisce anche uno script di avvio basilare, che però non funziona così com’è… Lo
script in questione è ./bin/jsvc/native/Tomcat5.
sh. Semplicemente usate quello che è riportato
nel riquadro 1, che ho modificato a partire da
quello fornito col server. Ovviamente, modificate i parametri che non corrispondono alla vostra
configurazione.
Potete usare questo script per avviare tomcat
in automatico (ve lo sconsiglio) come servizio di
sistema; ad esempio, mettendo questo script in
/usr/bin e creando un altro script “tomcat-start.
sh”, che aggiungerete agli script di avvio automatico della vostra macchina, che lo invochi con
l’opzione start; in ogni caso, seguite la procedura corretta per la vostra distribuzione. Per i
sistemi Ubuntu, la trovate qui.
Volendo si può aggiungere allo script un caso
“restart” che fermi e riavvii il server sfruttando il
codice già esistente.
Risorse correlate:
Tomcat setup: http://tomcat.apache.org/
tomcat-5.5-doc/setup.html
L’installazione termina qui, il server dovrebbe
già funzionare, ma siamo solo all’inizio… Per
vedere se tutto è ok, avviamo tomcat; se avete
installato dai repository:
cd /etc/init.d/
sudo ./tomcat5 start
# in generale,la sintassi è ./tomcat5
start|stop|restart
Oppure possiamo ottenere lo stesso risultato
semplicemente riavviando il computer…
Se invece avete installato scaricando dal sito
di apache, usate lo script che vi ho fornito. Nel
browser, andiamo a http://localhost:8080,
e dovremmo vedere la home page di default di
tomcat. La porta di default potrebbe essere 8180
se avete installato il server dai repository Ubuntu
(tratteremo nella sezione seguente come cambiare la porta di default).
Suggerimento: può risultare comodo assegnarsi
permessi di scrittura sui file contenuti in webapps
e in conf. Se avete installato dai repository, tali
file e cartelle sono di proprietà dell’utente root.
Altrimenti, sono di proprietà del vostro utente,
dal momento che avete semplicemente estratto un archivio… In questo caso ovviamente i
permessi di scrittura li avete già, ma non è una
buona pratica lasciare il vostro utente standard
come proprietario di tutta l’installazione. Il metodo migliore consiste nel creare un nuovo gruppo
di utenti (ad esempio, developers), aggiungere il
proprio account utente a tale gruppo, assegnare
i file in webapps e in conf a tale gruppo e concedere permessi di scrittura sui file agli utenti del
gruppo, impostando (o lasciando) l’utente root
come proprietario. Nel riquadro 2 sono riportati i
comandi necessari a realizzare quanto descritto
per la cartella webapps; ripetere gli ultimi due
comandi per la cartella conf.
Attenzione: se avete installato il server dai repository Ubuntu, alcune cartelle e alcuni file dentro
conf e dentro webapps sono dei collegamenti!
Le cartelle a cui puntano NON saranno influenzate dal comando chown, quindi dovrete seguire
12
Sistema
#!/bin/sh
##############################################################################
#
#
Copyright 2004 The Apache Software Foundation.
#
#
Licensed under the Apache License, Version 2.0 (the “License”);
#
you may not use this file except in compliance with the License.
#
You may obtain a copy of the License at
#
#
http://www.apache.org/licenses/LICENSE-2.0
#
#
Unless required by applicable law or agreed to in writing, software
#
distributed under the License is distributed on an “AS IS” BASIS,
#
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#
See the License for the specific language governing permissions and
#
limitations under the License.
##############################################################################
#
# Small shell script to show how to start/stop Tomcat using jsvc
# Adapt the following lines to your configuration
JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun-1.5.0.06
# se avete già definito CATALINA_HOME in .bash_rc potete commentare la riga seguente
CATALINA_HOME=/usr/share/tomcat5.5
DAEMON_HOME=$CATALINA_HOME/bin
TOMCAT_USER=tomcat5
# for multi instances adapt those lines.
TMP_DIR=/var/tmp
PID_FILE=/var/run/jsvc.pid
CATALINA_BASE=$CATALINA_HOME
CATALINA_OPTS=”-Djava.endorsed.dirs=$CATALINA_HOME/common/endorsed”
# ho commentato queste righe (presenti nel file originale) perchè aggiungo il classpath e gli archivi
# .jar direttamente ai paramentri di avvio
# di jsvc nel caso “start” (vedi sotto, dopo l’opzione -cp)
# CLASSPATH=\
# $JAVA_HOME/lib/tools.jar:\
# $CATALINA_HOME/bin/commons-daemon.jar:\
# $CATALINA_HOME/bin/bootstrap.jar
case “$1” in
start)
# Start Tomcat
echo “Starting Apache Tomcat 5 using Java from $JAVA_HOME...”
$DAEMON_HOME/jsvc -user $TOMCAT_USER -home $JAVA_HOME -Dcatalina.home=$CATALINA_HOME \
-Dcatalina.base=$CATALINA_BASE \
-Djava.io.tmpdir=$TMP_DIR \
-wait 10 \
-pidfile $PID_FILE \
-outfile $CATALINA_HOME/logs/catalina.out \
-errfile ‘&1’ \
$CATALINA_OPTS \
-cp $CLASSPATH:$CATALINA_HOME/bin/bootstrap.jar:$JAVA_HOME/lib/tools.jar:$CATALINA_HOME/bin/commonsdaemon.jar: \
org.apache.catalina.startup.Bootstrap
#
# To get a verbose JVM
#-verbose \
# To get a debug of jsvc.
#-debug \
echo “Done.”
exit $?
;;
stop)
# Stop Tomcat
echo “Stopping Apache Tomcat 5...”
$DAEMON_HOME/jsvc -stop -pidfile $PID_FILE org.apache.catalina.startup.Bootstrap
echo “Done.”
exit $?
;;
*)
echo “Usage tomcat.sh start|stop”
exit 1;;
esac
Riquadro 1
13
Sistema
#crea il gruppo:
sudo addgroup developers
#aggiungersi al gruppo:
sudo nano /etc/group
#cercare il nome del gruppo, e aggiungere il proprio utente alla lista, ad esempio:
# ...
# developers:x:1001:nome_utente
# ...
#assegnare utente root e gruppo developers ai file in webapps:
cd $CATALINA_HOME
sudo chown -R root:developers webapps
#concedere permessi di scrittura al gruppo:
sudo chmod -R g+w webapps
Riquadro 2
i link e ripetere la procedura nelle cartelle effettive (di solito in /etc/tomcat5, mi pare). Avere permessi di scrittura risulta utile in fase di sviluppo,
sia per fare il deploy dell’applicazione (dovete
copiare i file in webapps), sia per, eventualmente, compilare in loco i file .java.
Cambiare la porta di default del server
Nota: attenzione, quanto appena detto vale per
una installazione del server pensata per “pubblicare” il vostro lavoro. Se in fase di sviluppo
utilizzate Eclipse (ve lo consiglio caldamente),
non avrete quasi mai bisogno di toccare la vostra installazione del server, perchè sarà Eclipse stesso ad avviare tomcat usando la directory
del vostro progetto come root del webserver,
facendo automaticamente il deploy della vostra
applicazione, senza dover spostare i file nella
cartella di installazione del server. Vedremo la
cosa più in dettaglio nella sezione finale dedicata ad Eclipse.
port=”8180” minProcessors=”5”
maxProcessors=”75”
Configurazione
Abbiamo installato tomcat, adesso dobbiamo
capire come funziona. In $CATALINA_HOME vi
sono varie cartelle; tra queste:
webapps/: contiene le web application! è la cartella dove andremo a mettere le applicazioni che
creeremo. Notare bene che questa cartella non
funziona come la “root” di un tipico webserver
(www o htdocs, ad esempio, per apache). Ogni
web application va attentamente configurata tramite appositi file .xml, argomento che tratteremo
in seguito nella sezione “deployment”.
conf/: contiene file di configurazione per il server e le web applicatin pubblicate.
Iniziamo con un po’ di configurazione di base:
Installazione da repository Ubuntu: nella cartella
conf/ aprite il file server.xml e trovate le seguenti
righe:
<Connector className=”org.apache.
coyote.tomcat5.CoyoteConnector”
enableLookups=”true”
acceptCount=”10” debug=”0”
connectionTimeout=”20000”
useURIValidationHack=”false” />
Modificate l’attributo “port” cambiando il valore
da 8180 a quello che preferite. Se tomcat è l’unico server web che avete installato, può convenire usare la porta 80, così da non doverla specificare nel browser. Installazione tramite archivio
scaricato: il file è lo stesso, le righe da modificare sono leggermente diverse… non chiedetemi
perchè…
<Connector port=”8080”
maxHttpHeaderSize=”8192”
maxThreads=”150” minSpareThreads=”25”
maxSpareThreads=”75”
enableLookups=”false” redirectPort=”8443”
acceptCount=”100”
connectionTimeout=”20000”
disableUploadTimeout=”true” />
Anche qui, modificate l’attributo “port”.
Abilitare l’invoker servlet
L’invoker servlet, se attivata, permette di accedere alle web application sul server senza doverne fare il deployment, ovvero senza bisogno di
definirne il context path e senza dover scrivere il
file web.xml (ne parleremo in dettaglio nella sezione seguente). Personalmente comunque ne
sconsiglio l’utilizzo, si avranno problemi di portabilità. Per attivare l’invoker servlet, aprite il file
14
Sistema
conf/web.xml, e decommentate quanto segue:
<servlet>
<servlet-name>invoker</servlet-name>
<servlet-class>
org.apache.catalina.
servlets.InvokerServlet
</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
Struttura di una web application: vediamo ora
come deve essere organizzata la nostra applicazione. Per semplicità, facciamo riferimento
alla figura:
E decommentate, nello stesso file (un po’ di righe più in basso), anche il mapping relativo all’invoker servlet:
<servlet-mapping>
<servlet-name>invoker</servlet-name>
<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>
Aggiungere amministratori per il tomcat
manager
“Tomcat manager” è un’applicazione, accessibile dalla pagina iniziale di tomcat, che permette di monitorare e gestire le web application in
esecuzione, e inoltre di fare il deploy automatico
degli archivi .war.
Per aggiungere un utente che possa utilizzare
il manager, aprire il file conf/tomcat-users.xml e
aggiungere quanto segue:
<tomcat-users>
...
<role rolename=”manager”/>
<user username=”user” password=”password”
roles=”tomcat,manager”/>
...
</tomcat-users>
Deployment delle web application
Per “deployment” di una web application si intende in sostanza la sua pubblicazione. Per
poter essere pubblicata e risultare accessibile,
un’applicazione deve essere conforme ad un
certo “standard”.
Collocamento della web application: innanzitutto, le nostre web application, costituite da
servlet e/o pagine jsp, devono essere collocate
nella cartella webapps. Conviene porre ciascuna web application in una diversa sottocartella
di webapps. Per esempio, creiamo un’applicazione di prova, che collocheremo in webapps/
prova.
Fondamentale è WEB-INF: questa cartella
DEVE avere questo nome ed essere collocata
proprio qui. Dentro di essa troviamo:
1. il file web.xml, il descrittore di deployment
dell’applicazione, che definisce le modalità di
accesso all’applicazione ed eventuali parametri
iniziali. Ne parleremo in dettaglio fra poco.
2. la cartella classes: anche questa cartella è necessaria, e deve contenere le servlet compilate.
Se una delle classi appartiene ad un package,
bisogna collocarla in sottocartelle che rispecchino la struttura del package. Ad esempio, se
TestServlet appartiene al package MyTest, allora TestServlet.class andrà collocata in classes/
MyTest.
3. la cartella src: opzionale, può essere comoda
per tenere il sorgente dell’applicazione durante
lo sviluppo
4. la cartella lib: non in figura, anch’essa opzionale, può contenere file o archivi java condivisi
dall’applicazione.
Nella cartella principale vengono poi collocate le
pagine jsp che eventualmente fanno parte dell’applicazione. Il file welcome.html (o .jsp, .htm
o altro) viene caricato di default se nel browser
viene richiesto solo il context-path dell’applicazione, cioè con una richiesta del tipo http://
localhost:8080/context-path. Se tale file
non c’è, viene cercato un index.html|htm|jsp; se
anche questo manca, viene visualizzata la pagina di errore 404…
15
Sistema
Context path della web application: collocare la web application, con tutta la sua struttura, in webapps non è sufficiente per renderla
accessibile. Per rendere accessibili le nostre
servlet e pagine JSP, bisogna definire correttamente il context path dell’applicazione. Riprendiamo l’esempio precedente: abbiamo messo i
nostri file in webapps/prova. Andiamo allora in
$CATALINA_HOME/conf/{Server Name}/{Host
Name}, dove di solito {Server Name} è “Catalina” e {Host Name} è “localhost”. Creiamo un file
prove.xml, nel quale definiremo il Context della
web application, e in particolare l’attributo che ci
serve, il path:
<servlet> <servlet-name>ProvaServlet</
servlet-name>
<Context path=”/prova” docBase=”/
usr/share/tomcat5/webapps/prova”
reloadable=”true”>
</Context>
Ricordiamo ancora che il context-path NON
deve essere per forza “verosimile”.
L’attributo path rappresenterà la directory (o
percorso) di root della nostra applicazione. Notare che si tratta di un path “virtuale”, non deve
per forza trovare riscontro nella struttura delle
directory dell’applicazione, anche se è comodo
usare nomi simili per non confondersi. Al posto
di ”/prova”, avremmo potuto usare ”/test/prova1”.
Riprenderemo il discorso nel prossimo paragrafo, quando parleremo del descrittore di deployment. La docBase indica la posizione dei file nel
filesystem. L’attributo reloadable, messo a true,
indica al server di ricaricare l’applicazione se
ci sono delle modifiche, senza dover riavviare
tomcat. Vi sono molti alti parametri configurabili,
per maggiori dettagli, fare riferimento al sito di
Apache Tomcat: http://tomcat.apache.org/
tomcat-5.5-doc/config/context.html
Descrittore di deployment: web.xml: questo
file, da collocare in WEB-INF, mappa ciascuna
servlet della web application in una url. Vediamo
un esempio di base, con i parametri fondamentali:
<?xml version=”1.0” encoding=”ISO-8859-1”?>
<web-app xmlns=”http://java.
sun.com/xml/ns/j2ee”
xmlns:xsi=”http://www.
w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=”http://java.
sun.com/xml/ns/j2ee http://java.sun.
com/xml/ns/j2ee/web-app_2_4.xsd”
version=”2.4”>
<display-name>Applicazione
di prova</display-name>
<servlet-class>TestServlet</servlet-class>
<init-param>
<paramname>ParametroProva</param-name>
<paramvalue>Ciao</param-value>
</init-param>
</servlet>
<servlet-mapping> <servletname>ProvaServlet</servletname> <url-pattern>/Test</urlpattern> </servlet-mapping>
</web-app>
Tra le proprietà elencate in web.xml, fondamentale è l’url-pattern associato alla servlet; esso
rappresenta l’url tramite il quale la servlet sarà
accessibile, relativamente al context-path. Analogamente a quest’ultimo, nemmeno l’url-pattern
deve necessariamente essere verosimile.
Gli url complessivi per accedere alle servlet
sono SEMPRE del tipo http://server:porta/
context-path/url-pattern.
Per accedere alle pagine JSP: http://server:
porta/context-path/percorso/nome-file.
jsp, dove percorso è, stavolta, il path vero rela-
tivo alla root della web application. In sostanza, i
file Jsp rimangono accessibili normalmente, non
vanno mappati come le servlet.
Nel nostro esempio, per accedere alla servlet “TestServlet.class”, dovremmo andare a
http://localhost:8080/prova/Test.
Per accedere all’index.jsp della figura, ci basterebbe andare a http://localhost:8080/prova/index.jsp. Se mettessimo index.jsp in una
sottocartella, ad esempio “pages”, allora andremmo a http://localhost:8080/prova/pages/index.jsp.
Al posto di ”/Test”, come url-pattern, avremmo
potuto usarne uno del tutto “inverosimile”, ad
esempio ”/servlet/prova/pippo/miotest” e non
avrebbe fatto alcuna differenza, basta che l’url
inserita nel browser corrisponda a quella complessiva che avete mappato. Può sembrare una
cosa strana, ma è invece ben congeniata: su
tomcat, solo quello che rendete esplicitamente
pubblico è accessibile agli utenti, mentre sui tra16
Sistema
dizionali server web, normalmente, tutto il contenuto di una cartella pubblica è accessibile.
Cambiare la pagina di default e di errore 404:
è possibile specificare, nel file web.xml, la pagina di default per la web-application e la pagina
che viene visualizzata quando si verifica un errore http 404, cioè un “not-found”. Per fare questo,
aggiungete quanto segue in web.xml (annidato
dentro l’elemento web-app, ovviamente):
<welcome-file-list>
<welcome-file>home.jsp</welcome-file>
</welcome-file-list>
<error-page>
<error-code>404</error-code>
<location>/error404.html</location>
</error-page>
Uso dell’invoker servlet per il deployment:
questa procedura può velocizzare il deployment
delle applicazioni, cosa che può tornare utile in
fase di sviluppo o di test, ma è in generale una
soluzione che può generare problemi di portabilità. Se l’invoker servlet è attivo, è possibile fare
il deployment di un’applicazione semplicemente
collocando le servlet e le classi compilate (.class)
in webapps/ROOT/WEB-INF/classes. Non c’è
bisogno nè del file web.xml nè di definire il context path dal momento che questi sono già definiti per l’invoker servlet e per la default servlet
(vedere conf/web.xml). Una servlet così pubblicata è accessibile a http://localhost:8080/
servlet/NomeClasseServlet, dove NomeClasseServlet è il nome della classe a cui si vuole
accedere, e “servlet” non è nient’altro che l’url
pattern associato all’invoker servlet. Ad esempio, riprendendo il caso precedente, se mettessimo la nostra TestServlet.class in ROOT/WEBINF/classes, questa sarebbe accessibile come
http://localhost:8080/servlet/TestServlet.
Eclipse & Tomcat
Per chi non lo conoscesse, Eclipse è un IDE
avanzato per lo sviluppo di applicazioni Java e,
grazie ai sempre più numerosi plugin, C/C++,
PHP…. e quello che più ci interessa, ossia applicazioni J2EE. Potete scaricare Eclipse da
http://www.eclipse.org/downloads/.
menti, potete scaricare una versione essenziale
dell’IDE, di circa 33 MB, comprendente solo il
supporto per lo sviluppo in Java (e altri plugin,
tipo JUnit), e aggiungere successivamente i
plugin che desiderate, recuperandoli attraverso
l’update manager di Eclipse. Questa seconda
soluzione può essere più lunga, ma avrete un
IDE più leggero e veloce a caricarsi. Per fare
questo, andate alla pagina di download generale
di Eclipse, dove trovate tutte le versioni disponibili, selezionate la build più recente e scorrete la
pagina fino alla voce “Platform Runtime Binary”.
Qui selezionate la versione che volete (quella
per linux). Di seguito tratteremo come aggiungere i plugin per applicazioni J2EE.
Aggiungere plugin J2EE: dal menu di Eclipse,
scegliere “Help”→“Software Updates”→“Find
and Install”. Spuntate la casella “Web Tools
Platform Updates” e proseguite. A questo punto, sotto “Web Tools Platform”, selezionate tutte
le componenti. Questo vi fornirà il supporto per
creare progetti J2EE, servlet e pagine jsp. Per lo
sviluppo di applicazioni J2EE, trovate un bellissimo tutorial qui. Non aggiungo altro, leggetevi
il tutorial, spiega tutto!
Debug: Eclipse vi permette anche di avviare il
server in modalità Debug, per controllare cosa
non va nelle vostre applicazioni. Per avviare
la modalità debug, nel tab “Servers” (ne parla
il tutorial accessibile dal link che ho messo nel
paragrafo precedente) cliccate col tasto destro
sul server tomcat, e selezionate “Debug” (se il
server è fermo) o “Restart”→“Debug” (se è già in
esecuzione). Aspettate che la procedura di avvio sia completa, fissate i “break point” facendo
doppio clic a sinistra delle linee di codice che volete monitorare, e aprite/ricaricate l’applicazione
sul browser. Automaticamente Eclipse passerà
alla “Debug Perspective”, che vi permetterà di
visualizzare il valore di tutte le variabili esistenti al momento dell’esecuzione di ciascuno dei
breakpoint.
Di default, vi viene proposto di scaricare Eclipse
SDK, che consiste di circa 110 MB, e include vari
plugin, tutorial, esempi, documentazione. Altri-
Marco Magnatti
17
Sistema
Accedere ai dati di un sistema che non
si avvia
Prologo
- “Sono quattro anni che utilizzi Debian, è mai
possibile che non ti è MAI venuto in mente di
ottimizzare le prestazioni grafiche della tua macchina installando gli appositi driver?”
- “E che ci devo fare coi driver? Non uso Linux
per giocare.”
- “Non sai cosa ti perdi.”
- “A dire la verità non saprei neanche da che
punto incominciare....”
- “Appunto!”
- “Io non lo voglio un desktop con effetti grafici
tridimensionali canterini! A me va benissimo il
mio GNOME, nero su grigio così come mamma
l’ha fatto.”
- “Scansafatiche!”
Come Accedere al Sistema in
caso di Morte Apparente
Quando, dopo aver lavorato ore e ore per configurare un particolare aspetto della propria macchina, all’avvio ti trovi di fronte a una schermata
nera, brutta, immobile e che non ti permette il
classico Ctrl+Alt+F(1-12) per accedere a una
shell, è normale sentirti salire la bile.
Nonostante la prima reazione sia sbattere i pugni sulla tastiera tu, intrepido TopoLinaro, non
devi fare altro che aprire il terzo cassetto della
scrivania, agguantare il “medikit” incastrato con
cautela tra il cacciavite a stella e il martello tedesco da 800 grammi e prepararti psicologicamente per risolvere il problema cum grano salis.
Medikit
Strumenti necessari:
1.1 CD di una distribuzione Linux a scelta
che permetta l’installazione del sistema
in modalità testuale.
Introduzione
A volte mi trovo a discutere con Lemoeb. Quella
volta ci trovavamo ad Aprilia 2, sotto il sole cocente tipico dell’Agosto nell’Agro Pontino.
IMPORTANTE La distribuzione deve
essere stata compilata per l’architettura del processore della macchina su cui
risiede il sistema Linux da riesumare.
Io personalmente uso Slackware per processori a 32 bit e Slamd per processori a
64 bit.
C’è chi dopo pranzo schiaccia un pisolino e c’è
chi si fa una chiacchierata sulle OpenGL, sui driver delle schede grafiche, sull’esistenzialismo o
sulla teoria dell’eliocentrismo dell’universo.
Quello che più mi da fastidio è che ha ragione:
non ho mai avuto voglia di stare a smanettare
per poter sfruttare al pieno le capacità della mia
scheda video.
Qualche giorno fa, forse per colpa di qualche
strano fenomeno astronomico, ho deciso che
avrei provato a installare i drivers per la mia nVidia GeForce. Ho seguito tutti i passi riportati nella guida Installare NVidia su Debian comparsa
sul mitico TopoLinux anno 1 numero 1.
Lo giuro, li ho seguiti tutti. Al riavvio però mi si è
presentato davanti uno schermo completamente nero.
Veniamo dunque allo scopo di questo articolo.
2. Un minimo di esperienza con i comandi
shell.
Preparazione
Per prima cosa devi avviare la macchina usando il CD della distribuzione Linux che hai scelto.
Devi naturalmente aver impostato l’opzione che
permette l’avvio della macchina da CD attraverso la configurazione del BIOS.
Successivamente devi seguire le istruzioni fornite dalla procedura di avvio di installazione della
suddetta distribuzione fino al punto in cui ci ti
presenta davanti una bella shell da cui poter impartire dei comandi alla macchina.
Come già specificato, personalmente consiglio
di usare una Slackware perché le uniche due
18
Sistema
istruzioni da seguire sono l’impostazione della
lingua da utilizzare durante l’installazione e della
lingua della tastiera con cui stiamo lavorando.
Quasi istantaneamente, poi, compare il login
che effettueremo da root e eccoti la tua tanto
agognata shell!
A questo punto ti devi ricordare quale partizione
di quale Hard Disk contiene i dati del sistema
Linux da riesumare. Qualora ti fosse difficile ricordare, un bel
/dev/sda4
20105347+
10736
83
13238
Linux
Partition table entries are
not in disk order
Nel mio caso si tratta del primo disco SCSI e
il sistema Linux da riesumare si trova dentro la
partizione /dev/sda4 (come da figura).
Procedura
•
Crea una cartella
fdisk /dev/hdX
Dove X può essere a, b, c, ecc a seconda se si
tratti del primo, del secondo, del terzo, ecc Hard
Disk IDE. Nel caso di Hard Disk SCSI invece la
sintassi diventa
Al riavvio del PC la cartella verrà cancellata.
fdisk /dev/sdX
Per maggiori informazioni sugli Hard Disk ti rimando all’articolo Partizionare i Dischi anno 3
numero 3 di TopoLinux.
Dopo aver lanciato fdisk, ti si presenta una
schermata di questo tipo:
DebianBox-B:/home/joe# fdisk /dev/sda
The number of cylinders for
this disk is set to 24321.
There is nothing wrong with that,
but this is larger than 1024,
and could in certain setups
cause problems with:
2) booting and partitioning
software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Command (m for help):
A questo punto digita p e premi INVIO:
Command (m for help): p
Disk /dev/sda: 200.0 GB, 200049647616 bytes
255 heads, 63 sectors/track, 24321 cylinders
Units = cylinders of 16065
* 512 = 8225280 bytes
/dev/sda1
4506201
82
•
mount /dev/sda4 /mnt/joernano
•
Montaci dentro la partizione contenente il
sistema Linux da riesumare
Usa il chroot sulla cartella
chroot /mnt/joernano
Il comando chroot serve per impostare come
directory root (la directory / ovvero quella da cui
partono le varie /etc, /usr, /var, ecc.) la cartella
specificata dopo il comando.
Il comando chroot è estremamente utile perché,
cambiando la directory root utilizzata, permette di avere a portata di mano tutti i comandi e i
programmi che si trovano installati sul sistema
Linux montato nella cartella /mnt/joernano.
Potrai perciò facilmente accedere ai file che devi
modificare per risolvere il tuo problema.
1) software that runs at boot time
(e.g., old versions of LILO)
Device Boot
Start
Blocks
Id System
mkdir /mnt/joernano
End
1
561
Linux swap / Solaris
/dev/sda2
81722655
*
6
562
10735
FAT16
/dev/sda3
89024197+
13239
HPFS/NTFS
24321
7
Semplificando, nel mio caso stavo riesumando
una Debian e dovevo andare a modificare il file
di configurazione di Xorg. Senza usare chroot
avrei dovuto usare il percorso /mnt/joernano/etc/X11/xorg.conf per accedere a xorg.
conf. Usando il chroot: impostando come root (/)
la cartella /mnt/joernano vi accedevo direttamente attraverso il percorso /etc/X11/xorg.
conf.
N.B. Qualora il comando chroot dovesse dare il
seguente errore:
chroot: cannot execute /bin/
bash: No such file or directory
Molto probabilmente vuol dire che la distribuzione che stai usando non contiene pacchetti compilati per l’architettura del processore della tua
macchina. Usando una distribuzione corretta il
suddetto errore non dovrebbe comparire.
19
Sistema
Conclusione
In questo articolo non ho spiegato come riesumare un sistema che non si avvia: sarebbe stato
impossibile trattare ogni singolo caso e ipotizzare
per ognuno una soluzione. Mi sono invece limitato
a illustrare una semplice procedura per accedere ai dati di un sistema operativo che non si avvia.
La soluzione al problema dipende per prima
cosa dal problema in se. Non sono Wolf, non
risolvo problemi.
Ti offro solo un metodo che ti possa aiutare nel
risparmiare i soldi che spenderesti per ogni tastiera rotta in preda alla rabbia.
Usalo con saggezza.
JoErNano
20
Ambiente Desktop
Inkscape - Parte 2
S
alve a tutti maniaci del vettoriale! Vi siete
esercitati un po’ in questo mese di pausa?
Bene, perché oggi inizieremo il primo progetto
“complesso” di questa serie di tutorial: creare
una serie di pulsanti per il nostro sito.
Perché chiamiamo questo un “progetto”? Semplice: perché in questa lunga serie di tutorial su
Inkscape, ci concentreremo ogni volta su un
progetto specifico e cercando di raggiungere il
nostro risultato impareremo tecniche e trucchi di
questo meraviglioso programma.
L’ultimissima puntata del tutorial, poi, conterrà
una serie di “Tavole di riferimento” complete di
scorciatoie e trucchi, che potrete stampare e
tenere a portata di mano per facilitare il vostro
lavoro.
Scopo del progetto: creare una serie di pulsanti per il web utilizzando la grafica vettoriale.
Durata: circa un’ora
Livello: facile
Requisiti: conoscenza di base dell’interfaccia di
Inkscape e tanta tanta pazienza...
Passo 1: impostiamo la pagina
Come in ogni programma di grafica che si rispetti, anche Inkscape ci permette di definire
alcune proprietà della pagina su cui lavoreremo.
Iniziamo quindi premendo MAIUSC-CTRL-D o
andando nel menù File -> Proprietà del documento e decidiamo quale sarà la dimensione dei
tasti che creeremo.
Una mano qui e l’altra là
Prima di iniziare il nostro progetto sarà bene
spendere due parole sulla “filosofia” che sta dietro all’interfaccia di Inkscape.
Inkscape, infatti, è progettato per permettere di
lavorare tenendo sempre una mano sul mouse
e l’altra sulla tastiera: ogni pulsante ha la sua
combinazione di tasti. I tasti della barra degli
strumenti, ad esempio, sono tutte attivabili velocemente usando:
1. seleziona e trasforma oggetti (F1)
2. modifica nodi del tracciato o maniglie di
controllo (F2)
3. ingrandisci o rimpicciolisci (F3)
4. rettangoli e quadrati (F4)
5. cerchi ellissi e archi (F5)
6. stelle e poligoni (*)
7. spirali (F9)
e così via. D’ora in poi utilizzeremo spesso queste scorciatoie per velocizzare il nostro lavoro.
Progetto 1: pulsanti per il web
La finestra che abbiamo davanti ci permette di
definire molte cose.
Innanzitutto troviamo l’unità di misura predefinita per questo disegno. Lasciamola pure su “px”
cioè “pixel”. Segue il colore di sfondo della pagina. I colori in Inkscape sono sempre espressi
con 4 numeri esadecimali. Sì avete capito bene
quattro e non tre: i primi tre numeri esadecimali
(come sul web) indicano i valori di rosso verde e
blu, l’ultimo la trasparenza, dove 00 è completamente trasparente e FF è completamente opaco.
Lasciamo pure il colore di sfondo su trasparente
e spostiamoci poco sotto.
21
Ambiente Desktop
Nella sezione Formato possiamo scegliere tra
una serie di dimensioni predefinite o specificare le nostre. Inseriamo come dimensioni 190 px
per la larghezza e 45 per l’altezza, tralasciando il resto. In questa sezione c’è anche un tasto molto interessante “Adatta la pagina della
selezione” (dovrebbe essere “alla selezione”...
avvertiremo i traduttori italiani). Questo tasto ridimensiona automaticamente la pagina in base
agli oggetti selezionati nella finestra di disegno.
Ora non ne abbiamo bisogno, ma tenetelo a
mente perché ci torneremo alla fine del progetto.
Nella sezione Bordo possiamo scegliere se visualizzare i bordi e l’ombra della pagina: sono impostazioni che influiscono solo sulla finestra di disegno
e non vengono mai trasferite nel disegno stesso.
Scegliete quindi ciò che più vi piace.
Passo 2: la forma base
Ora premiamo F1 per passare allo strumento
“seleziona e trasforma oggetti” e mantenendo selezionato il nostro rettangolo inseriamo 0
come valore per x e y nella barra di controllo.
Avete capito cosa abbiamo fatto?
Dopo aver dato delle misure precise al rettangolo abbiamo detto a Inkscape di posizionarlo nel
punto 0,0 del foglio, così ora siamo sicuri che il
rettangolo in questione sia grande esattamente
come la pagina e sia tutto contenuto in essa.
Passo 3: bordi in 3D
Ora viene la parte più difficile: creare l’effetto tridimensionale.
Mantenendo selezionato il rettangolo premiamo
il pulsante “crea e modifica i gradienti” (CTRL-F1
ma potrebbe non funzionare su KDE) e tracciamo una linea obliqua sopra al rettangolo, come
mostrato qui sotto
Stiamo creando una serie di pulsanti, quindi
avranno tutti lo stesso sfondo e la stessa forma.
Passiamo quindi a creare la forma base comune
a tutti i pulsanti.
Spostiamoci nella finestra di disegno e attiviamo la forma “rettangoli” (F4), poi clicchiamo e trasciniamo per creare un rettangolo
che sia il più possibile grande come la pagina
Per dare le misure esatte al rettangolo useremo le caselle numeriche nella barra di controllo
dello strumento rettangolo. Impostiamo come
larghezza 190, come altezza 45 e come arrotondamento (Rx e Ry) 10. Controlliamo di non
aver impostato un bordo e nel caso eliminiamolo
cliccando col tasto destro sul colore del bordo
(nell’angolo in basso a sinistra della finestra,
accanto alla lettera “S:”) e scegliendo “Rimuovi
contorno”.
Poi premiamo il pulsante Modifica nella barra di
controllo di questo strumento.
Abbiamo appena aperto la finestra di modifica di
un gradiente.
Come primo colore scegliamo il bianco, poi premiamo sulla tendina sopra ai pulsanti “aggiungi
passaggio” e “rimuovi passaggio” e selezioniamo il secondo colore.
Come secondo colore scegliamo il nero. Mi raccomando: verificate che i colori siano completamente opachi, cioè che l’ultima casella numerica
sia impostata a 255
22
Ambiente Desktop
Ora torniamo allo strumento di selezione (F1) e
premiamo CTRL-D oppure il tasto
DUE VOLTE per creare due duplicati di questo rettangolo.
Uno dei due duplicati muoviamolo fuori del foglio
da qualche parte, perché per ora non ci servirà,
poi selezioniamo l’altro.
mendo entrambi i tasti selezionati nella figura
qui sotto
È il momento di scegliere il colore che daremo
ai nostri pulsanti.
Se avessimo fretta potremmo premere su uno
dei colori che vedete in basso sotto alla finestra
di disegno per assegnarlo al rettangolo selezionato, ma non abbiamo fretta, quindi clicchiamo
sul rettangolo col tasto destro del mouse e scegliamo “Riempimento e contorni” per impostarlo
a mano.
Nella sezione “Riempimento” premiamo il pulsante “colore unico” e impostiamo nella casella RGBA
il valore 3771c8ff per ottenere un bell’azzurro.
Prima di chiudere questa finestra spostiamoci
nella casella “Sfocatura” ed inseriamo 20
Ciò che abbiamo ottenuto è un rettangolo che
da un colore pieno al centro sfuma verso i bordi, lasciando intravedere il colore del rettangolo
sottostante (il gradiente nero-bianco) e dando
quindi l’impressione della tridimensionalità.
Però c’è un problema: la sfumatura continua anche oltre ai bordi della pagina e non è bella da
vedere.
Per evitare che questo accada useremo uno
strumento assai potente ma poco conosciuto di
Inkscape: il fissaggio (o “clipping” in inglese)
Il fissaggio funziona un po’ come una mascherina
di cartone ritagliata: selezionando più oggetti e impostando il fissaggio, tutto ciò che non rientra nell’area dell’oggetto più in alto diventerà invisibile.
Se non avete capito non preoccupatevi con la
pratica vi sarà tutto più chiaro...
Ora verifichiamo di avere ancora lo strumento
“seleziona e trasforma oggetti” e nella barra ci
controllo assegniamo i valori 185 a W (larghezza) e 40 a H (altezza).
Sì avete capito bene: stiamo ridimensionando
questo rettangolo colorato.
Prendete il duplicato del rettangolo che avevate spostato fuori dal disegno e tanto per essere
chiari dategli un colore assurdo come ad esempio fuxia, poi centratelo sulla pagina usando “Allinea e distribuisce oggetti”
Dovreste ottenere qualcosa come in questa figura: il rettangolo fuxia è sopra a tutti gli altri
e si intravede solo la sfumatura del rettangolo
sottostante.
Per centrarlo sulla pagina useremo lo strumento
“Allinea e distribuisce oggetti” (MAIUSC-CTRLA), impostando “relativo a” su “pagina” e pre23
Ambiente Desktop
Ora premete CTRL-A (seleziona tutto) e dal
menù Oggetto scegliete Fissaggio -> imposta.
MAGIA!
Avete capito cosa è successo? Tutto quello che
era fuori dal rettangolo fuxia, cioè i bordi sfumati che uscivano dal disegno, è stato nascosto.
Siccome stiamo lavorando in vettoriale è ancora
possibile modificare la sfumatura, il colore e tutto il resto, abbiamo solo impostato una sorta di
mascherina che nasconde tutto ciò che non era
compreso nel rettangolo fuxia.
Ora abbiamo davvero un tasto 3d, non ci resta
che aggiungere qualche icona e i testi dei nostri
pulsanti e lo faremo utilizzando i livelli.
Passo 4: I livelli
Se avete già usato The Gimp o un programma
di grafica simile, saprete già cosa sono i livelli.
Se non lo sapete vi basterà pensare ai livelli
come a fogli trasparenti appoggiati l’uno sull’altro: mentre disegnate su un livello tutto ciò che è
sugli altri livelli non viene toccato, ma ovviamente ciò che sta su un livello inferiore viene coperto
dal disegno di quello superiore.
Anche Inkscape possiede i livelli. Se guardate in basso a sinistra nella vostra finestra, infatti, vedrete scritto “Livello 1”: è il
nome di default del primo livello di Inkscape.
Prima di creare altri livelli diamogli un nome più significativo: andiamo nel menù Livello, scegliamo
“rinomina livello” e diamo come nome “pulsante.
Poi premiamo il tasto a forma di lucchetto a
fianco del nome per bloccare il livello, in questo
modo eviteremo di danneggiare questo piccolo
capolavoro che è il nostro pulsante 3d.
Ora possiamo creare un nuovo livello (Livello ->
Aggiungi livello) e dargli come nome... “download”
Selezioniamo lo strumento “Crea e modifica gli
oggetti testuali” (F8) e impostiamo nella bara di
controllo il font Sans, dimensione 18, grassetto.
Poi clicchiamo sull’area del pulsante e inseriamo il testo “DOWNLOAD”, quindi rendiamolo di colore bianco cliccando sul colore bianco nella barra dei colori in basso.
Per ora non preoccupiamoci troppo del posizionamento e pensiamo piuttosto all’icona per questo tasto “download”.
Per nostra fortuna il sito http://openclipart.org possiede una enorme collezione di
immagini vettoriali liberamente riutilizzabili.
Per questa icona abbiamo scelto l’immagine di
Selanit rilasciata sotto Public Domain e disponibile a questo indirizzo: http://openclipart.
org/Xiph/files/Selanit/3298
Salviamola sul nostro disco ed apriamola con
Inkscape (si aprirà una nuova finestra). Questa
immagine è composta, ovviamente, da molti
“pezzi”. Prima di copiarla e incollarla nel nostro disegno, quindi, selezioniamo tutto (CTRLA) e raggruppiamo tutto premendo il tasto
“Raggruppa gli oggetti selezionati” (CTRL-G)
Quindi con il solito CTRL-C e CTRL-V incolliamo l’immagine nel nostro disegno. Per ridimensionarla mantenendo le proporzioni prendiamo
la freccia diagonale in alto a destra e tenendo
premuto CTRL ingrandiamo l’immagine fino ad
ottenere qualcosa di simile alla figura qui sotto
poi correggiamo il testo spostandolo come più
ci piace e allineandolo verticalmente al centro
con lo strumento di allineamento richiamabile
con CTRL-A.
Ora blocchiamo il livello e nascondiamolo
premendo sull’occhio a fianco del lucchetto.
Poi creiamone un altro chiamato “guestbook”
e utilizzando le stesse tecniche e l’immagine di
Ausis disponibile all’indirizzo: http://openclipart.org/Xiph/files/Ausis/1557 creiamo un
pulsante come questo:
Passo 5: Pulsanti a volontà
Possiamo andare avanti creando altri pulsanti
24
Ambiente Desktop
per il nostro sito. Personalmente ho provato a
creare pulsanti utilizzando queste immagini (tutte rilasciate come Public Domain):
•
Pulsante “Contatti” http://openclipart.
org/media/files/ernes/4251 - Nessun bisogno di raggruppare prima di copiare, ho
ruotato l’immagine un poco
Alla fine salviamo l’immagine vettoriale con
CTRL-S o dal menù File in modo da mantenere
una copia di lavoro in caso dovessimo fare altri
pulsanti.
Conclusione
•
Pulsante “Notizie” http://openclipart.
org/SOMbanners/tags/noticias - Nessun
bisogno di raggruppare prima di copiare
•
Pulsante
In questa puntata abbiamo visto come impostare le Proprietà del documento, come utilizzare la
barra di controllo degli strumenti per dare valori
numerici precisi alle nostre forme, come allineare e raggruppare gli oggetti e come utilizzare i
livelli.
Nessun bisogno di raggruppare, ho ruotato
l’immagine. Vi prego di notare l’ombra del
pennello che si adatterà perfettamente alla
superficie del tasto.
Abbiamo inoltre creato il nostro primo gradiente e abbiamo utilizzato il Fissaggio, una tecnica
poco conosciuta ma estremamente potente, soprattutto se usata in congiunzione con la sfumatura di una forma.
•
Galleria http://openclipart.
org/Xiph/files/valessiobrito/3713
-
Pulsante Links http://openclipart.org/
media/files/barretr/2942 - Nessun bisogno di raggruppare
Passo 6: Esportare in PNG
Quando avremo finito di creare tutti i nostri pulsanti ci rimarranno due ultimi passaggi da fare:
ridimensionare la pagina in modo che comprenda ogni elemento del disegno e creare le immagini PNG finali che useremo nel sito (visto che le
immagini SVG sono poco supportate dai browser)
Ma soprattutto abbiamo usato Inkscape e lo
abbiamo usato tanto, e siccome l’esercizio e la
pratica portano l’uomo alla perfezione, mi raccomando: continuate ad esercitarvi!
Cosa vi aspetta nel prossimo tutorial? Non sono
ancora sicuro... forse un incredibile progetto basato su cloni, spirali e arabeschi, forse la realizzazione di un logo a mano libera utilizzando i
tracciati...
... curiosi? Beh non vi resta che aspettare la
prossima puntata :-)
Per ridimensionare la pagina facciamo così:
. sblocchiamo tutti i livelli
2. andiamo su Modifica -> Seleziona tutto in
ogni livello
3. apriamo la finestra delle Proprietà del documento (MAIUSC-CTRL-D) e premiamo il pulsante che avevamo visto all’inizio, quello con
la scritta “Adatta la pagina della selezione”
A questo punto non resta che rendere visibile un livello per volta (mantenendo ovviamente il livello “pulsante” sempre visibile), premere
MAIUSC-CTRL-E, selezionare “Pagina” (e non
“Disegno”!) e scegliere un nome per ciascuna
PNG che vogliamo creare.
Come tutte le finestre in Inkscape, anche quella
dell’esportazione del disegno non ci impedisce
di continuare a lavorare nelle altre, quindi possiamo nascondere e rendere visibili i vari livelli
senza doverla riaprire ogni volta per esportare
la nuova PNG.
CoD
25
Ambiente Desktop
Connettersi ad Internet con un cellulare
Bluetooth
I
n questa guida spiegherò brevemente come
connettersi ad internet utilizzando un cellulare GPRS/UMTS connesso via Bluetooth alla
nostra adorata Linux Box.
Il primo passo è procurarsi l’indirizzo fisico del
nostro cellulare, quindi lanciamo un bel
hcitool scan
per scoprirlo. Otterremo un output simile a questo “00:19:2D:12:30:FF Luca”, il primo risultato
è l’indirizzo fisico del cellulare, il secondo è il
nome assegnato. Io, con fantasia estrema, ho
chiamato “Luca” il mio cellulare. Annotiamoci il
numero da qualche parte, ci servirà tra un attimo. Come root (quindi utilizzando sudo con
*buntu e su con le altre distro), editiamo il file
/etc/bluetooth/rfcomm.conf con il nostro editor
preferito, e inseriamo queste righe:
Lasciamo provider come nome della connessione e proseguiamo.
rfcomm0 {
# Questo serve per indicare al nostro
# computer di assegnare un device al
# cellulare all’avvio
bind yes;
# Questo è l’indirizzo fisico di
# prima
device 00:19:2D:12:30:FF
# Questo è il canale per la
# connessione
channel 1;
# Questa è la descrizione arbitraria
# del dispositivo. Puoi anche
# lasciarlo vuoto.
comment “Nokia N70″;
}
A questo punto è necessario riavviare il servizio Bluetooth, con molte distro è sufficiente un
/etc/init.d/bluetooth restart lanciato come root,
se siamo troppo pigri per farlo basta riavviare.
Il prossimo passo è impostare i dati per la connessione vera e propria. Lanciamo come root
pppconfig, e selezioniamo la voce create, la prima.
Selezioniamo con dynamic come tipo di DNS
(con spazio si seleziona la voce), quindi premiamo invio per passare al passo successivo
Bisogna ora selezionare “PAP” come metodo di
autenticazione, quindi proseguiamo.
26
Ambiente Desktop
In questo passaggio bisogna specificare la propria volontà di inserire manualmente il dispositivo con il quale effettuare il collegamento, quindi
rispondiamo no alla proposta di usare il rilevamento automatico.
A questo punto si deve inserire il nome utente
per la connessione, che per la maggior parte degli operatori telefonici è ininfluente, tanto ci fanno pagare lo stesso :D quindi inseriamo qualsiasi cosa e proseguiamo.
Ora specifichiamo il device /dev/rfcomm0 e andiamo avanti.
Apparirà una schermata riepilogativa, salviamo
la configurazione premendo Finished
Stesso discorso per la password, qualsiasi cosa
scriviate va bene. Lasciamo il valore di default
come velocità della porta e proseguiamo. Anche
in questo passo lasciamo l’opzione predefinita,
cioè “Tone” e andiamo avanti.
Ecco, adesso bisogna inserire il numero da comporre per la connessione. Nei cellulari Nokia (e
se non sbaglio anche Sony-Ericsson) bisogna
inserire *99# per indicare l’intenzione di usare
il GRPS/UMTS. Per le altre marche sarà sufficiente una breve ricerca su internet per scoprire
il numero adatto.
Infine una schermata ci dà alcune informazioni
tecniche che possiamo tranquillamente ignorare
e proseguire. Usciamo allora da pppconfig premendo Quit.
A questo punto, se tutto è andato a buon fine,
basterà lanciare pon per iniziare la connessione
27
Ambiente Desktop
e poff per disconnettersi. Ah, fate bene attenzione alle tariffe per la navigazione web, sono davvero alte. L’anno scorso avevo attivato “Internet
GPRS in libertà” della Vodafone, che a fronte
della spesa di 20 euro per l’attivazione forniva
500 Mb di traffico (upload compreso) da utilizzare in 30 giorni, il traffico extra si paga normalmente 0.6 cent/Kb. Perché aggiungo questo?
Per quello che è successo dopo. La promozione
doveva scadere il 5 settembre, se non sbaglio.
Ebbene, il 5 settembre alle 3 del pomeriggio mi
connetto, gironzolo un po’ per il web e quindi
mi disconnetto. In serata controllo il traffico disponibile: 0,74 euro, ultimo addebito poco più di
40 euro. Cosa?! E la promozione?! Come mi ha
risposto una simpatica (?) signorina del 190, era
finita a mezzogiorno e dieci, perché io l’avevo
attivata a mezzogiorno e 10. Ovviamente dell’ora della scadenza non si faceva menzione da
nessuna parte. E io non ho mai più rivisto i miei
40 euro. State in guardia.
28
Sicurezza
DDos Attacco & Difesa
Terza ed ultima parte
Attacchi d’amplificazione
Tecniche di attacchi DDoS
Non tutti hanno a disposizione una quantità di
banda tale da poter, con un attacco flooding,
mettere in ginocchio grandi colossi come Yahoo!
o AOL, quindi già da tempo sono state messe a
punto delle tecniche che richiedono un numero minore di pacchetti rispetto al SYN Flooding
per esaurire le risorse di un sistema. Le tecniche
usate vengono chiamate Smurf e Fraggle e si
basano entrambe su una rete amplificatrice.
Obiettivo primario di un attaccante è quello di
non esporsi direttamente, dato che per le forze
dell’ordine sarebbe semplice risalire ai computer utilizzati per l’attacco vista l’enorme mole di
traffico generato. Inoltre c’è la necessità di “reclutare” computer (slave agent) per eseguire
l’attacco distribuito.
Smurf
Lo smurfing sfrutta un broadcast ping, ovvero un
pacchetto ICMP spedito all’indirizzo di broadcast
di una rete per generare un flusso di ping di ritorno veramente pericoloso. Esso si basa sulla
cattiva configurazione della rete amplificatrice
che risponde ad un ping effettuato all’indirizzo
di broadcast. L’attaccante modifica il campo mittente dei pacchetti che trasmette con l’indirizzo
IP della vittima usando lo spoofing e comincia a
spedire quanti più pacchetti può verso l’indirizzo di broadcast della rete amplificatrice. Questi
verranno inoltrati a tutti gli host attivi che invieranno pacchetti di risposta echi ICMP alla vittima, generando un traffico notevole. Per fare un
esempio ipotizziamo che l’attaccante abbia un
modem analogico e riesca a generare 33,600
Kbit di traffico al secondo. Ha a disposizione una
(o più) reti amplificatrici con 100 host. Il traffico
che la vittima riceve è circa 100 volte maggiore
di quello che genera l’attaccante, cioè 3,36 Mbit
al secondo.
Fraggle
Questo tipo di attacco utilizza la stessa tecnica
dello smurf ma utilizza pacchetti UDP anziché
ICMP. Se l’host attaccato è configurato, alla ricezione di un pacchetto UDP risponde con un
altro pacchetto UDP “echo reply”. Nel caso in
cui, invece, l’host non sia configurato, risponde
con un pacchetto “unreachable”. Il vantaggio del
Fraggle è che indipendentemente dalla configurazione dell’host, genera in ogni caso traffico, e
funziona anche nelle reti che non permettono il
ping broadcast.
Ottenere il controllo di una rete
Il primo passo da seguire è individuare una rete
di computer vulnerabile e ottenerne il controllo.
Per far ciò è possibile sfruttare le potenzialità di
numerosi software, quali worms, virus, troyan,
rootkit , il cui compito è quello di fornire il controllo remoto della macchina e fornire backdoor
utili all’attaccante per poter installare programmi
ad hoc.
Questo tipo di attacchi sono noti con il nome di
semi-automatici. In alcuni casi la comunicazione
tra i software avviene in modo diretto: l’indirizzo
dell’handler (macchina che svolge da server) è
inserito nel codice che viene successivamente
installato sullo slave. Ogni slave riferisce la propria disponibilità all’handler che salva l’indirizzo
IP su un file per le future comunicazioni.
Ovviamente quest’approccio non è dei più convenienti, poiché la scoperta di una macchina
porta all’esposizione di un’intera rete, inoltre
handler e slave restando in ascolto di connessioni e quindi sono facilmente identificabili da
scanner di rete.
In altri casi la comunicazione avviene in modo
indiretto: recenti attacchi forniscono un esempio
d’uso di reti IRC per la comunicazione tra handler e slave. Quello di IRC è solo un esempio di
come un attaccante può utilizzare servizi legittimi per scopo che non lo sono.
Nel caso la comunicazione avvenga in modo
indiretto, c’è sempre la possibilità per l’attaccante di essere scoperto. Per questo motivo si
usa una variante chiamata attacchi automatici.
La data, la durata e l’indirizzo della vittima sono
pre-programmati nel codice del software usato.
In questo modo si evita la comunicazione tra
29
Sicurezza
l’attaccante e le macchine che fanno da slave
agent. Inoltre, essendo un processo automatizzato, un attaccante è capace di compromettere
ed installare tool su un singolo host in meno di 5
secondi. In altre parole, migliaia di host possono
essere infettati in meno di un’ora.
La propagazione del codice maligno può avvenire in svariati modi:
• Origine singola: il codice risiede su uno
o più server centrali. Dopo l’infiltrazione,
il codice è spedito tramite meccanismi di
file transfer. Il worm li0n opera in questo
modo.
• Propagazione con Back-chaining: il codice viene scaricato inizialmente dalla
macchina infettata per prima. Di volta in
volta la nuova macchina infettata diventa la sorgente di propagazione. In questo
modo si evita che con la scoperta della
macchina sorgente si blocchi l’infezione
dell’intera rete. I worm Ramen e Morris
hanno usato questa tecnica di propagazione.
• Propagazione autonoma: le istruzioni di
attacco sono introdotte nell’host bersaglio direttamente in fase di exploit. Code
Red , Wharol Worm e la maggior parte
dei virus basati su e-mail utilizza questa
tecnica.
Soluzioni
Prevenzione e protezione
Possiamo distinguere due sottocategorie di protezione: meccanismi di protezione del sistema e
meccanismi di protezione del protocollo.
Meccanismi di protezione del sistema
Sono quelli volti ad aumentare il livello generale
di sicurezza del sistema, puntando l’attenzione
sugli accessi illegittimi al sistema, alla rimozione
dei bug del software, al costante aggiornamento del sistema e all’identificazione di eventuali
software maligni. Altri esempi di meccanismi di
difesa del sistema includono:
La storia insegna che non esiste una macchina
protetta al 100%, ma facendo un buon lavoro è
sicuramente possibile ridurre frequenza e forza
degli attacchi DDoS.
Meccanismi di protezione del protocollo
Sono quelli rivolti alla risoluzione del problema
della cattiva progettazione del protocollo di comunicazione. Molti protocolli contengono operazioni che risultano essere di poco costo per il
client ma dispendiose per il server. In questi casi
iniziando una larga serie di richieste simultanee
le risorse tendono ad esaurirsi facilmente.
Esempi classici sono gli attacchi TCP SYN, gli
attacchi a server d’autenticazione e gli attacchi
basati sulla malformazione del pacchetto IP.
Firewall
I firewall furono il primo passo verso il miglioramento della sicurezza. Il principio fondamentale
è quello di limitare la disponibilità di connessioni
TCP e UDP. Per fare ciò si limita l’accesso a
determinate porte e si generano lunghi log di sistema dove si trovano le informazione su tutte le
connessioni accettate e non accettate.
Negli ultimi anni è in via di sviluppo un nuovo
tipo di firewall: stateful inspection firewall. Un
firewall di questo tipo controlla l’header di un
pacchetto e prende decisioni basate su un set di
regole. La decisione di bloccare o consentire un
accesso è applicata a tutti i pacchetti seguenti
della sessione (una sessione è definita da una
sorgente, una destinazione, un protocollo e un
timer). Il corrente scopo è quello di sviluppare
uno scanner che sia capace di lavorare in tempo
reale ed applicare politiche di sicurezza bastate
su contenuti,sorgente,destinazione e porta dell’applicazione; essenzialmente distinguere buoni e cattivi pacchetti ispezionando in profondità
il pacchetto stesso. Purtroppo oggi questo tipo
di ispezione risulta ancora inefficiente poiché
spesso analizzare un pacchetto richiede molto
tempo e rallenta troppo lo smistamento dei pacchetti.
Esempi possono essere:
• accesso monitorizzato
• puzzle auction
• virus scanner
• proxy servers
• sistemi con supporto per le capability
• sistemi client-ligitimacy-based
Sviluppare un sistema di sicurezza del protocollo può rendere la vittima totalmente immune agli
attacchi basati su exploit del protocollo. Natural30
Sicurezza
mente questi approcci sono compatibili e complementari a tutti gli altri.
un indirizzo non usato.
Cercare di prevenire la possibilità di un attacco
DDoS risulta essere spesso una mossa risolutiva che però non sempre è facile mettere in pratica. La prevenzione si basa essenzialmente sulla modifica della configurazione di sistema per
eliminare ogni possibilità di attacco DDoS.
Per fare il backtracing di un attacco DoS bisogna innanzitutto vedere se il prefisso sorgente
dell’attacco è nascosto. Se non è nascosto si
può procedere tramite:
BackTracing dell’attacco DoS
• Utilizzo delle routing table
• Utilizzo dell'Internet Routing Registry
(IRR)
Metodi di intercettazione
I metodi principali per l’intercettazione di un attacco DoS sono 3: controllare l’uso della CPU,
controllare l’uso della banda, e la creazione di
ACLs (Access List). Tramite un monitoraggio
costante dell’uso della CPU, ci si può accorgere
se il computer è impegnato ad eseguire operazioni che nella norma non richiedono una tale
percentuale d’uso della CPU; questo è possibile, ad esempio, se il pc è vittima di una serie di
richieste di operazioni che hanno priorità sull’uso
della CPU e rischiando di mandare in starvation
processi importanti per il corretto funzionamento, ma che hanno priorità minore sull’accesso
alla CPU rispetto ai processi che la stanno occupando.
Tramite l’utilizzo di un NetFlow è possibile monitorare la quantità di traffico di rete in modo
da evitare che, in presenza di elevati pacchetti
magari in seguito ad un attacco SYN Flood, le
risorse di rete della vittima non riescano più a
svolgere il loro normale lavoro perché impegnate a rispondere a richieste di connessione.
Utilizzando poi un ACL (Access List) è possibile
non solo monitorare il tipo di pacchetti in uscita, in modo da potersi accorgere dell’attacco in
corso, ma anche del tipo di tale attacco, come
ad esempio un elevato invio di pacchetti di tipo
ICMP_REPLY, sono di risposta ad un’elevata
richiesta di pacchetti ICMP_REQUEST, e ciò
denota un attacco ICMP Ping Flood.
I datagrammi ICMP (Internet Control Message
Protocol) vengono spesso utilizzati per attacchi
DoS, in quanto servono per segnalare eventi
speciali come la non raggiungibilità di un host,
una redirezione di traffico, un controllo di congestione o la raggiungibilità di un host della rete.
Il vantaggio nell’utilizzo di un ACL è la possibilità
di redirezionare il traffico in ingresso proveniente da host che stanno inondando la vittima di richieste, verso un “Blackhole Router”, cioè verso
• Contattando direttamente la sorgente
dell'attacco
Se l'IP sorgente dell'attacco è nascosto, si procede tramite i seguenti metodi:
• Operando un trace dei pacchetti attraverso la rete
• Rintracciare l'ISP da cui passano i pacchetti dell'attacco
• Continuando il trace descritto nei primi
due punti fino ad arrivare all'IP sorgente
Nel primo caso, è molto semplice rintracciare la
sorgente dell'attacco semplicemente controllando le routing table interne per trovare l'IP da cui
proviene l'attacco, ma nella maggior parte degli
attacchi vengono utilizzati dei proxy che permettono di “nascondere” l'IP da cui l'attacco proviene; in tal caso si procede con l'interrogare le
routing table dei router da cui l'attacco proviene,
e tale operazione va eseguita in modo ricorsivo
fino ad arrivare alla sorgente dell'attacco, continuando di volta in volta il backtracing sull'IP del
router trovato da quello eseguito in precedenza.
In tal modo si arriva a rintracciare l'IP e il MAC
address del pc attaccante, ma, come spesso accade, questa non è un’operazione semplice da
effettuare, a causa dei notevoli redirezionamenti da parte di chi attacca, e controllare di volta
in volta le routing table di tutti i router utilizzati
nell'attacco può rivelarsi una operazione molto
costosa.
Difesa proattiva
Analizziamo ora le principali difese contro i Denial of Service.
Difesa basata sul filtraggio dei pacchetti
Questo tipo di difesa è stato uno dei primi proposti contro gli attacchi DoS, e consiste nell’inserire dei filtri degli IP di ingresso in tutti i punti
31
Sicurezza
di accesso della rete che si vuole proteggere.
Questo permette di prevenire che eventuali attaccanti inseriscano IP arbitrari nei pacchetti
coinvolti nell’attacco e inoltre riduce i tipi di attacchi che possono essere lanciati nei confronti
della rete in questione.
Tale tecnica è stata utilizzata per diversi anni,
ma col passare del tempo è divenuta sempre
più inefficace, poiché adesso attacchi DoS vengono lanciati su larga scala con un elevato numero di hosts e l’IP sorgente di tale attacco non
è mai visibile ai router di ingresso della rete sotto attacco.
Metodi di difesa contro Ping Flood Attack
La dimensione di un pacchetto ping, specificata
dal livello IP, è di 64KB. L’attacco si basa proprio
sulla dimensione di 64KB, infatti, alcuni sistemi
possono andare in crash o in reboot in presenza
di pacchetti di dimensione maggiore ai 64KB.
L’host attaccato è costretto a rispondere a numerose richieste ICMP ECHO_REQUEST con
messaggi di risposta ICMP ECHO_REPLY. Una
possibile soluzione consiste nel far sì che l’host
sotto attacco ignori le richieste ICMP di dimensioni maggiori ai 64KB. Fortunatamente questo
tipo di attacco ha successo solo se tra l’host attaccante e la vittima dell’attacco c’è una banda
sufficiente a mandare una notevole quantità di
richieste ICMP.
Metodi di difesa contro SYN Flood Attack
Come descritto in precedenza, l’attacco SYN
Flood consiste nel chiedere di instaurare connessioni ad un host vittima con hosts che non
esistono, lasciando così la vittima con una lunga
coda di connessioni in attesa dell’instaurazione.
Generalmente, l’attaccante nasconde il proprio
IP, sostituendolo con IP inesistenti, e la vittima
si ritrova in attesa di instaurare una connessione
da un host che in realtà non esiste.
Il Flood Attack è uno degli attacchi più diffusi nella tipologia DoS, ed è anche da cui è più
complesso e difficile difendersi.
Innanzitutto bisogna avere un’ottima architettura della rete da difendere, in cui tutto il traffico in
ingresso e uscita viene fatto passare attraverso
un firewall (questa architettura dovrebbe essere
applicata comunque in qualsiasi rete) che monitori il traffico.
Per difendersi in tempo contro i SYN Flood attack, è necessario che sia presente nella rete
una macchina con un monitor di rete in grado
di rilevare attacchi che agiscono ad un basso
livello di rete.
Si può anche impostare un limite al traffico ICMP
che può essere presente in una rete in un certo
intervallo di tempo.
Esistono diverse tipologie di procedure da attuare in caso di SYN Flood attack, basate a livello
dell’host attaccato e a livello di firewall. A livello
host, le procedure da seguire sono 2: la prima
prevede di diminuire il valore del timeout dello
stato SYN-RECEVEID, che generalmente è posto a 75 secondi. Diminuendo questo valore, si
riduce il numero delle connessioni instaurate a
metà, e quindi anche la durata dell’attacco. E’
anche vero però che un valore di timeout troppo
basso rischierebbe di non instaurare connessioni legittime che provengono da host con una
bassa velocità di connessione. La seconda procedura da seguire a livello di host, prevede di
incrementare la coda delle connessioni da accettare in modo da non intasarla in caso di attacco; questo dipende sopratutto dalle risorse che
l’host ha a disposizione per aumentare lo spazio
destinato alla coda.
Infine si può evitare che dalla propria rete partano attacchi smurf diretti verso altre reti, impostando i router in modo che non inoltrino verso
l’esterno pacchetti che hanno un indirizzo sorgente non presente nella sottorete gestita dal
router.
A livello firewall, è necessaria la presenza di
un gateway che agisca a livello di circuito, che
bypassi tutte le richieste di connessioni. Quando
arriva una richiesta di connessione, il pacchetto
SYN non arriva direttamente all’host indicato nel
pacchetto, ma al gateway e sarà esso a rispon-
Metodi di difesa contro Smurf Attack
Le difese possibili contro tali attacchi sono di
configurare il sistema sotto attacco in modo che
non risponda a datagrammi ICMP diretti in broadcast verso una sottorete. Molti sistemi operativi
permettono di abilitare o disabilitare la possibilità da parte dell’host di rispondere in broadcast
ad ICMP ECHO_REQUEST, inoltre si possono
impostare i router della propria rete in modo che
non siano usati per attaccare altre reti, bloccando il traffico IP in broadcast.
32
Sicurezza
dere a tale richiesta con un SYN+ACK; quando
riceve la risposta, il gateway fungerà da relay,
e si occuperà di instaurare la connessione con
l’host interessato della sua rete. Il problema di
tale scelta è che a sua volta il gateway potrà
essere oggetto di eventuali attacchi e quindi
dovrà essere in grado di gestirli; inoltre ci saranno dei ritardi introdotti nella comunicazione
dal gateway. Questo problema è uno dei punti
di debolezza riscontrato in tutte le reti in cui è
presente un firewall.
Una soluzione proposta per risolvere il problema
dei ritardi introdotti dai gateway nella comunicazione, è quella dei “gateway semi-trasparenti”.
Quando arriva una richiesta di connessione, il
gateway la lascia passare verso l’host interessato, aspettando il SYN+ACK di risposta. Una volta
passato, il gateway entra in azione generando il
necessario ACK per la chiusura del Three-WayHandshake e mandandola verso l’host della sua
rete a cui è stata richiesta la connessione. Se la
connessione in questione era legittima, il client
invia il suo ACK che viene raccolto e scartato
dal gateway in quanto la connessione per il server è stata già stabilita. In caso di un attacco,
l’ACK da parte del client esterno alla rete non
arriverà mai, e dopo il periodo di timeout della
connessione, il gateway avvierà la procedura
di fine connessione con l’host server della sua
rete. Il vantaggio dei “gateway semi-trasparenti”
è, come detto prima, il fatto che non vengono
introdotti dei ritardi.
Un ultima soluzione proposta è quella basata
sulla classificazione degli indirizzi IP sorgenti. Il
tool che permette di applicare questa procedura
si chiama Synkill e deve operare sulla macchina
incaricata di monitorare il traffico di rete. Monitorando il traffico, il Synkill classifica gli indirizzi IP
esterni nel seguente modo:
cedure del TWH e quella di fine connessione.
Il Synkill, presenta purtroppo due debolezze:
la prima, comune anche ai metodi prima menzionati, è quella di chiudere connessioni che in
realtà sono legittime provenienti da IP giudicati
inizialmente come new. Il secondo punto di debolezza del Synkill viene alla luce quando gli
IP da cui provengono gli attacchi non sono mai
ripetuti; in questo caso il database degli IP interno al Synkill non può essere utilizzato, o è
del tutto inutile, in quanto gli indirizzi IP da cui
arriva l'attacco sono sempre differenti da quelli
precedenti.
Purtroppo le normali tecniche di difesa usate per
gli attacchi DoS , non sono ugualmente efficaci
per i DDoS. La differenza risiede principalmente
nella differenza nel numero di host coinvolti e
nella mole di traffico generato.
Qui di seguito sono spiegate alcune tra le possibili soluzioni. Alcune pensate per contrastare un
particolare tipo di attacco DDoS come ad esempio un attacco verso web server. Altri approcci
invece tentano di risolvere il problema in modo
più generico.
Lo scopo di questa tassonomia è di aiutare a
capire non solo quali siano i metodi per evitare
un DDoS, ma anche scoprire come combinarli
assieme per risolvere il problema.
Rilevamento e reazione
Se la prevenzione e la protezione hanno fallito, l’unico modo per contrastare un attacco è
tentare di limitarne i danni. Per far ciò c’è bisogno di scoprire l’attacco e di rispondere ad
esso. L’obiettivo dell’identificazione dell’attacco
è quello di scoprire il più presto possibile ogni
tentativo di DDoS e di avere un basso livello di
falsi positivi.
• indirizzi affidabili (good)
Un attacco può essere scoperto attraverso Rilevazione di anomalie, Hybrid detection, Pattern
detection e Third-party detection.
• indirizzi potenzialmente sospetti (new)
Rilevazione di anomalie
• indirizzi sicuramente sospetti (bad)
Questi tipi di meccanismi si basano su un modello d’andatura normale, come ad esempio un
modello del normale traffico di rete o del normale carico di sistema. Lo stato corrente del sistema è paragonato periodicamente con i modelli
per determinare anomalie.
• indirizzi sconosciuti (null)
Quando il Synkill riceve richieste di connessioni
da indirizzi IP che rientrano nella sua categoria
di sicuramente sospetti, ha 2 possibilità di azione: avviare direttamente la procedura di fine
connessione verso l'host attaccante, oppure instaurarla e poi chiuderla tramite le apposite pro-
Il vantaggio di questo approccio rispetto ad altri,
33
Sicurezza
è che è anche attacchi di tipo non classificato
possono essere scoperti. Tuttavia questo meccanismo ha bisogno di attenzione su due problemi:
1. Livelli di tolleranza: le anomalie sono
smascherate in quando lo stato corrente
del sistema differisce dai modelli per un
certo livello. Un livello di tolleranza troppo basso può portare a troppi falsi positivi, mentre un livello troppo alto riduce la
sensibilità del meccanismo.
2. Aggiornamento dei modelli: sistemi e comunicazioni si evolvono col passare del
tempo e i modelli hanno bisogno di essere aggiornati per riflettere questo cambiamento. Solitamente i modelli si auto-aggiornano usando le statistiche generate
quando non è stato trovato nessun attacco. Questo approccio però rende il
meccanismo vulnerabile ad un eventuale
continuo aumentare degli attacchi che
possono ingannare i modelli ed evitare la
rilevazione di attacchi.
Pattern Attack Detection
Questo tipo di meccanismo memorizza le “parti-
colarità” (signatures) di un attacco ben conosciuto in un database. Ogni comunicazione è analizzata e comparata con le entries del database
per scoprire un’occorrenza dell’attacco DDoS.
Occasionalmente il database viene aggiornato
con nuove signatures.
L’ovvio lato negativo di questo approccio è che
può scoprire solo attacchi ben conosciuti. Poche
volte aiuta a scoprire un nuovo tipo di attacco ,
magari perché si tratta di una piccola variazione
di uno ben noto. Dall’altra parte, però, non vi è
la presenza di falsi positivi (o comunque la percentuale è molto bassa).
Hybrid Attack Detection
Questa strategia combina le caratteristiche del
Pattern Attack Detection e quella delle Rilevazione di Anomalie, usando i dati degli attacchi
scoperti con la Rilevazione di Anomalie per aggiornare il database delle signatures. Questo è
uno dei metodi più usati.
Third-party Attack Detection
La rilevazione è affidata ad un processo esterno che si fa carico di spedire un messaggio per
segnalare la presenza di una attacco un corso
usando una tecnica di traceback.
PinetoLUG
34
Pillole
Pillole
AmaroK parla!
In questa pillolina parlerò di AmaroK Espeak.
Cos’è? È un micro script che permette di interfacciare AmaroK con espeak, che è un sintetizzatore vocale. Il risultato? AmaroK ci dice che
canzone stiamo ascoltando! L’idea (e la realizzazione dello script) è di Pete Jewell, io ho semplicemente tradotto le due frasette fisse (”Welcome to AmaroK Espeak” e “You are listening
to:”) e cambiato la voce utilizzata da espeak,
mettendo quella italiana.
In AmaroK lo script bisogna installarlo e attivarlo: Strumenti/Gestore script/Installa script, selezionare il file appena scaricato e confermare.
Individuare nella cartellina “Generale” amarokEspeak e abilitarlo con “Esegui”. Fatto. Ora provate a riprodurre una canzone, o a mettere in
pausa e riprendere quella corrente. Soddisfatti?
P.S.: provate con una canzone in inglese…
Tuttoeniente
Che logo elaborato, eh? L’ho fatto io…
Ecco come utilizzare questo prodigio della tecnica.
Per prima cosa bisogna installare espeak, se
non è già presente nel sistema, in Ubuntu basta
un classico
apt-get install espeak
Per le distribuzioni per cui non fossero disponibili
i pacchetti precompilati, è sufficiente andare sul
sito ufficiale del progetto e scaricare i sorgenti.
Fatto questo, si può provare se funziona con
espeak -v it ‘Ciao, sono
espeak, e sono installato!’
Da notare l’opzione ‘-v it’ che specifica di utilizzare la voce italiana, anche se nulla vieta di usare
quella tedesca, francese, spagnola, portoghese,
ungherese, finlandese, ecc., basta sostituire it
con la sigla della lingua desiderata (per esempio
de, fr, es, pt, hu, fi, ecc.)
Passiamo quindi al download dello script: lo trovate qui. Consiglio a chi non avesse una connessione veloce di scaricarlo da un amico, sono
761 byte. :D
35
Echo $feedback
La rubrica che stampa a schermo i vostri
consigli sul php
B
envenuti a echo $feedback; la rubrica di Topolinux dedicata a voi, professionisti del php, e ai
codici che vorrete spedirci. Qui, in queste poche pagine, discuteremo dei vostri trucchi, delle
vostre soluzioni, analizzeremo gli script che ci manderete e produrremo qualcosa di stabile,
sicuro e adatto per l’uso in produzione.
Per cui scrivete a cod [AT] topolinux.org!
I vostri codici
Iniziamo con un piccolo script segnalatomi da tuttoeniente: si tratta di una funzioncina veloce per
calcolare il tempo di generazione di una pagina.
<?php
function getmytime(){
list($usec, $sec) = explode(‘ ‘, microtime());
return ((float) $usec + (float) $sec);
}
?>
Questa funzione sarà di sicuro utile a chi vorrà fare un po’ di “benchmarking” sul proprio sito.
Il secondo codice che vi proponiamo ci arriva da Alessio Di Fazio (slux83 @ gmail.com) ed è un
codice per la generazione del cosiddetto CAPTCHA. Per chi non lo sapesse il CAPTCHA è quella
immagine contenente caratteri alfanumerici da ricopiare in una form. Serve ad evitare che programmi automatici quali i bot spammers o altri si registrino sui nostri forum o sui nostri guestbook
inviando poi messaggi decisamente indesiderati.
Il codice è un pochino lungo ma vale la pena di essere letto: è ben commentato e indentato, come
nella migliore tradizione :)
<?
/*
* Copyright (c) 2007 by Alessio Di Fazio a.k.a. Slux
* Captcha: a captcha image generator anti-spammers.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program 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.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
* Contacts:
* ----------------------------------------* Skype:
slux-slack
* E-Mail: [email protected]
* Website: http://www.capponcino.it/alessio
*/
36
Echo $feedback
/**
* How to use:
* <img src=”captcha.php” title=”click the image to choose another value”
* alt=”captcha error”
* onclick=”javascript:this.src = ‘captcha.php?refresh=’ + Math.random();” />
*
* To include this script into your blog/guestbook or something else, you have
* to save the $text number (line 103) for example into the user session and
* control the value inserted through a form with the session value. If these
* are equals, the user isn’t a spammer!
*/
// Config
$CONFIG[ ‘width’ ]
= 180;
$CONFIG[ ‘height’ ]
= 80;
/*
* the fonts dir contain all *.ttf files named font0.ttf, font1.ttf, ...
*/
$CONFIG[ ‘font_folder’ ] = “fonts”;
//don’t type slashes
/*
* font files (how many fonts u have?)
* example: 4 = font0.ttf, font1.ttf, font2.ttf, font3.ttf
*/
$CONFIG[ ‘font_numbers’ ] = 4;
/**
* Float random function
*
* @param $intMin
* @param $intMax
* @param $intDecimals
*/
function fprand($intMin, $intMax, $intDecimals)
{
if($intDecimals)
{
$intPowerTen = pow(10, $intDecimals);
return rand($intMin * $intPowerTen, $intMax * $intPowerTen) / $intPowerTen;
}
else
return rand($intMin,$intMax);
}
function rgb_grayscale( $rgb
{
$color[ ‘r’ ] = 0.299
$color[ ‘g’ ] = 0.299
$color[ ‘b’ ] = 0.299
return $color;
}
)
* $rgb[ ‘r’ ] + 0.587 * $rgb[ ‘g’ ] + 0.114 * $rgb[ ‘b’ ];
* $rgb[ ‘r’ ] + 0.587 * $rgb[ ‘g’ ] + 0.114 * $rgb[ ‘b’ ];
* $rgb[ ‘r’ ] + 0.587 * $rgb[ ‘g’ ] + 0.114 * $rgb[ ‘b’ ];
function rgb_complementary( $rgb )
{
$color[ ‘r’ ] = 255 - $rgb[ ‘r’ ];
$color[ ‘g’ ] = 255 - $rgb[ ‘g’ ];
$color[ ‘b’ ] = 255 - $rgb[ ‘b’ ];
return $color;
}
function rgb_rand( $min=0, $max=255 )
{
$color[ ‘r’ ] = rand( $min, $max );
$color[ ‘g’ ] = rand( $min, $max );
37
Echo $feedback
}
$color[ ‘b’ ] = rand( $min, $max );
return $color;
function rgb_create( $r=0, $g=0, $b=0 )
{
$color[ ‘r’ ] = $r;
$color[ ‘g’ ] = $g;
$color[ ‘b’ ] = $b;
return $color;
}
function rgb_merge( $lhs, $rhs
{
$color[ ‘r’ ] = ( $lhs[
$color[ ‘g’ ] = ( $lhs[
$color[ ‘b’ ] = ( $lhs[
return $color;
}
)
‘r’ ] + $rhs[ ‘r’ ] ) >> 1;
‘g’ ] + $rhs[ ‘g’ ] ) >> 1;
‘b’ ] + $rhs[ ‘b’ ] ) >> 1;
/* Rand number */
$text = fprand(0, 999, rand(1, 3));
// Creates a simple image
$image = imagecreate($CONFIG[ ‘width’ ], $CONFIG[ ‘height’ ]);
// Create random colors
$rgb = array();
$rgb[ ‘background’ ] = rgb_rand( 0, 255 );
$rgb[ ‘foreground’ ] = rgb_grayscale( rgb_complementary( $rgb[ ‘background’ ] ) );
if ( $rgb[ ‘foreground’ ][ ‘r’ ] > 127 )
{
$inicio = -127;
$rgb[ ‘foreground’ ] = rgb_merge( $rgb[ ‘foreground’ ], rgb_create( 255, 255, 255 ) );
$rgb[ ‘shadow’ ] = rgb_merge( rgb_complementary( $rgb[
‘foreground’ ] ), rgb_create( 0, 0, 0 ) );
}
else
{
$inicio = 0;
$rgb[ ‘foreground’ ] = rgb_merge( $rgb[ ‘foreground’ ], rgb_create( 0, 0, 0 ) );
$rgb[ ‘shadow’ ] = rgb_merge( rgb_complementary( $rgb[
‘foreground’ ] ), rgb_create( 255, 255, 255 ) );
}
// Allocate color resources
$color = array();
foreach($rgb as $name => $value)
{
$color[$name] = imagecolorallocate( $image, $value[ ‘r’ ], $value[ ‘g’ ], $value[ ‘b’ ] );
}
// Draw background
imagefilledrectangle( $image, 0, 0, 120, 30, $color[ ‘background’ ] );
// Write some random text on background
for ( $i = 0; $i < rand( 20, 40 ); $i++ )
{
$x = rand( 0, $CONFIG[ ‘width’ ] );
$y = rand( 0, $CONFIG[ ‘height’ ] );
$f = rand( 0, 5 );
$c = rgb_grayscale( rgb_rand( 127 - $inicio, 254 - $inicio ) );
imagefttext ( $image, rand(7,14), rand(0, 170), $x, $x, imagecolorallocate(
$image, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255)), “$CONFIG[font_folder]/
font”.rand(0, $CONFIG[‘font_numbers’]-1).”.ttf”, rand(99999, 113000));
}
// Write the captcha text with shadow (improves the human vision in some cases)
38
Echo $feedback
$font_fg = “$CONFIG[font_folder]/font”.rand(0, $CONFIG[‘font_numbers’]-1).”.ttf”;
// text rotation angle
$rotation = rand(-6,8);
imagefttext( $image, 26, $rotation, 12, 52, $color[ ‘shadow’ ], $font_fg, $text);
imagefttext( $image, 26, $rotation, 10, 50, $color[ ‘foreground’ ], $font_fg, $text);
imagefttext( $image, 11, 0, 5, 76, $color[ ‘foreground’ ],
“$CONFIG[font_folder]/text.ttf”, “Click me to change!”);
// Returns the image
header( ‘Content-type: image/png’ );
imagepng( $image );
// Free resources
foreach($color as $name => $value)
{
imagecolordeallocate( $image, $value );
}
imagedestroy( $image );
?>
L’approfondimento di questa settimana
Questa settimana oltre alle email dei nostri lettori discuteremo di un argomento teorico che non
mancherà di interessare chi si occupa di database: la Normalizzazione dei dati.
La Normalizzazione
In un database si può memorizzare quasi qualsiasi cosa... il problema poi è estrarre quello che serve. Molto spesso infatti si vedono database caotici e pieni di informazioni a volte poco omogenee
tra loro che sono affetti da tremende “anomalie”, ovvero che non si comportano come dovrebbero
quando si cerca di modificare, aggiungere o eliminare un dato. Non parliamo poi di quei database
che ci mettono addirittura dei minuti per recuperare le informazioni richieste!
La fase cosiddetta di Normalizzazione è una fase molto delicata del lavoro e consiste nell’applicare
un modello di dati teorico (una delle Forme Normali dei database) che permetta di evitare tutti questi problemi che potrebbero verificarsi quando agiremo in qualche maniera sul nostro database.
Le forme normali sono 7: la prima, la seconda e la terza forma normale si usano quasi sempre,
mentre le altre (la quarta, la quinta, la forma normale Boyce-Codd e la forma normale dominio-chiave) sono piuttosto teoriche e le tralasceremo in questo breve articolo.
La Prima Forma Normale
Perché una tabella sia considerata in Prima Forma Normale deve rispondere ai seguenti requisiti:
1. ogni cella deve contenere un valore “atomico”. Un dato per ogni cella. Niente insieme di dati
in array o altre cose simili
2. ogni colonna deve avere un nome unico
3. la tabella deve avere una chiave primaria che identifica in maniera univoca le righe
4. due righe non possono essere identiche
5. non sono ammessi gruppi ripetuti di dati
Il punto 1 mette fuori gioco molte tabelle che utilizzano campi di testo per memorizzare valori separati da virgole o altri dati simili. Per esperienza so che il modo migliore per memorizzare gruppi di
dati mantenendo la prima forma normale è usare semplici sequenze di 0 e 1 in cui ogni posizione
rappresenti un valore. Ad esempio: in un sistema di utenti e gruppi, per memorizzare l’appartenenza di un utente a certi gruppi si può usare un sistema come quello mostrato nella figura qui sotto
39
Echo $feedback
Il punto 5 va sicuramente spiegato meglio: immaginate una tabella “Libri” in cui archiviare tutti i libri
della vostra casa e strutturata così:
Tabella Libri
id
Autore
Titolo
Editore
Linus Torvalds
Io amo Topolinux
Topolinux
1
2
Bill Gates
Tutti pazzi per la BSOD
Redmond press
Ci saranno sicuramente più libri che avranno lo stesso editore: bene questo significa che la vostra
tabella non è in prima forma normale.
Perché questo è importante? Perché i database relazionali sono stati progettati per gestire le relazioni tra i dati e per combattere il più possibile le anomalie che i vecchi database non-relazionali
avevano. Se ad esempio scoprissimo che il nome corretto per un editore non è “Topolinux” ma “Topolinux edizioni”, dovremmo modificare ogni riga in cui compare questo nome, senza contare che
questo sistema è assai ridondante e quindi mangia spazio e velocità di elaborazione.
Il trucco sta nel creare una seconda tabella chiamata “Editori” e contenente solo due colonne: una
chiave primaria e il nome dell’editore. Nella colonna Editore della tabella libri archivieremo solo un
puntatore (il valore della chiave primaria relativa a quell’editore nella tabella editori) ed in questo
modo avremo una tabella in Prima Forma Normale, veloce, non ridondante e aggiornabile in qualunque momento senza troppo sforzo:
Tabella Libri
id
Autore
Linus Torvalds
1
2
Bill Gates
Titolo
Io amo Topolinux
Tutti pazzi per la BSOD
Editore
1
3
Tabella Editori
id
Editore
Topolinux edizioni
1
2
Mondadori
3
Redmond press
La Seconda Forma Normale
A volte si rende necessario creare delle chiavi primarie che usino più colonne: quando questo succede la Seconda Forma Normale può essere d’aiuto nella modellazione dei dati. Una tabella che
ha una sola chiave primaria ed è in Prima Forma Normale è di sicuro anche in Seconda Forma
Normale, mentre se avete una chiave primaria “spalmata” su più colonne dovrete fare un attimo
mente locale.
I requisiti per la Seconda Forma Normale sono:
1. la tabella deve essere in Prima Forma Normale
2. nessuna colonna deve dipendere da parte della chiave
Prendiamo ancora la nostra tabella Libri, ma questa volta immaginiamo di avere più edizioni dello
stesso volume, editi però da diverse case editrici. Negli esempi precedenti per identificare ogni
riga usavamo una chiave primaria numerica memorizzata nella colonna “id”; qui invece potremmo
decidere che la chiave primaria per identificare un libro sia l’insieme delle colonne “Titolo”, “Autore”
ed “Editore”, perché di sicuro non avremo in casa due libri che abbiano tutte e tre queste colonne
uguali.
40
Echo $feedback
Stiamo usando, quindi, una chiave primaria su più colonne.
Tabella Libri
Autore
Titolo
Editore
Scaffale
Luogo di nascita autore
Linus Torvalds Io amo Topolinux
1
1
Helsinki
Linus Torvalds Io amo Topolinux
2
1
Helsinki
Tutti pazzi per la
Bill Gates
3
1
Seattle
BSOD
Come vedete un libro è stato pubblicato da due case editrici differenti, ma... che mi dite della colonna “Luogo di nascita dell’autore”? Essa dipende dall’autore, certo, ma non dall’editore del libro né
dal suo titolo: lo stesso autore può aver scritto più libri e quindi avremmo dati ripetuti nella nostra
tabella e questo potrebbe causare anomalie. Abbiamo quindi una colonna che dipende da una parte di chiave primaria, ma non dalla chiave intera (autore + titolo + editore)
Come fare a risolvere questo pasticcio che potrebbe causare anomalie di inserimento ed eliminazione? Creando, anche qui, una nuova tabella Autori contenente un codice che identifichi l’autore,
una colonna “Nome” dell’autore e una “Luogo di nascita” dell’autore. Nella tabella Libri, poi, salveremo solo il codice dell’autore e così non avremo colonne che fanno riferimento solo ad una parte
della chiave primaria
Autore
1
1
2
id
1
2
Tabella Libri
Titolo
Io amo Topolinux
Io amo Topolinux
Tutti pazzi per la BSOD
Autore
Linus Torvalds
Bill Gates
Editore
1
2
3
Scaffale
1
1
1
Tabella Autori
Luogo di nascita dell’autore
Helsinki
Seattle
La Terza Forma Normale
Se riuscirete a portare i dati in Terza Forma Normale potrete dormire sonni abbastanza tranquilli,
sicuri che il vostro db sia, almeno in teoria ordinato e pulito. Le regole perché una tabella sia considerata in Terza Forma Normale sono:
1. la tabella deve essere in Seconda Forma Normale
2. non devono esserci dipendenze transitive
Ma cosa è una dipendenza transitiva? è quella cosa che accade quando una colonna dipende da
un’altra colonna invece che dalla chiave primaria.
Immaginiamo ancora la nostra tabella Libri, ma per semplificare diciamo che abbiamo una sola
chiave primaria, come all’inizio. Siccome però siamo incredibilmente gentili e abbiamo prestato un
sacco di libri, abbiamo deciso di tenere traccia dei prestiti:
id
1
2
Tabella Libri
Autore
Titolo
Editore
Prestato a
Linus TorvalIo amo Topolinux 1
Bill Gates
ds
Tutti pazzi per la
Bill Gates
3
BSOD
Indirizzo
Redmond - Via le mani
dal codice n. 1
La colonna “Prestato a” conterrà quindi il nome della persona a cui abbiamo prestato il libro, mentre
la colonna “indirizzo” conterrà l’indirizzo della persona in questione... ebbene: non siamo in Terza
Forma Normale. Perché? Perché abbiamo una dipendenza transitiva, ovvero: la colonna “indirizzo”
dipende dalla colonna “prestato a” che dipende a sua volta dalla chiave primaria. Occorre pensare
in termini teorici: non tutte le colonne della tabella riguardano il libro o sono legate in qualche modo
ad esso e il libro è il soggetto della nostra tabella, quindi abbiamo un’anomalia: dobbiamo rimuo41
Echo $feedback
vere la colonna indirizzo. Anche qui la cosa più semplice da fare e togliere i dati che non c’entrano
con il libro e metterli in un’altra tabella.
id
1
2
Autore
Linus Torvalds
Bill Gates
id
1
Nome
Bill Gates
Tabella Libri
Titolo
Io amo Topolinux
Tutti pazzi per la BSOD
Editore
1
3
Prestato a
1
Tabella Prestiti
Indirizzo
Redmond - Via le mani dal codice n. 1
Conclusione
Normalizzare le proprie tabelle può essere un percorso lento e noioso e a volte si può arrivare a
chiedersi quale sia il senso di alcune regole che sulle prime appaiono abbastanza oscure. Ma le
tabelle sono come i palazzi: fino a un certo peso reggono, poi scricchiolano... e crollano. Quando
le tabelle iniziano ad avere 10.000 record o più ci si rende conto di quanto sia utile averle portate
in Terza Forma Normale: le anomalie di aggiunta, modifica ed eliminazione sono frequentissime e
spesso interventi multipli di vari utenti portano il database ad un livello di entropia inimmaginabile.
Con una tabella in Terza Forma Normale, invece, persino la modifica della struttura del database
o il passaggio ad un altro formato non fanno paura: i dati si incastrano alla perfezione ma sono comunque sempre separati e trattabili con tranquillità.
Anche questo mese siamo arrivati alla fine della nostra rubrica. Di cosa parleremo il mese prossimo? Ma dei vostri codici è ovvio: scrivete scrivete scrivete!
... e se volete discutere degli argomenti di questo mese, venite a trovarci sul nostro forum: http://
forum.topolinux.org/
<?php
echo “Arrivederci al prossimo numero!”;
?>
CoD
42
GNU FDL
GNU Free Documentation License
Version 1.2, November 2002
Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
0. PREAMBLE
The purpose of this License is to make a manual, textbook, or other functional and useful document
“free” in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it,
with or without modifying it, either commercially or noncommercially.
Secondarily, this License preserves for the author and publisher a way to get credit for their work,
while not being considered responsible for modifications made by others.
This License is a kind of “copyleft”, which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a
copyleft license designed for free software.
We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same
freedoms that the software does. But this License is not limited to software manuals; it can be used
for any textual work, regardless of subject matter or
whether it is published as a printed book. We recommend this License principally for works whose
purpose is instruction or reference.
1. APPLICABILITY AND DEFINITIONS
This License applies to any manual or other work, in any medium, that contains a notice placed
by the copyright holder saying it can be distributed under the terms of this License. Such a notice
grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions
stated herein. The “Document”, below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as “you”. You accept the license if you copy, modify or distribute
the work in a way requiring permission under copyright law.
A “Modified Version” of the Document means any work containing the Document or a portion of it,
either copied verbatim, or with modifications and/or translated into another language.
A “Secondary Section” is a named appendix or a front-matter section of the Document that deals
exclusively with the relationship of the publishers or authors of the Document to the Document’s
overall subject (or to related matters) and contains nothing that could fall directly within that overall
subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may
not explain any mathematics.) The relationship could be a matter of historical connection with the
subject or with related matters, or of legal, commercial, philosophical, ethical or political position
regarding them.
The “Invariant Sections” are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License.
43
GNU FDL
If a section does not fit the above definition of Secondary then it is not allowed to be designated as
Invariant. The Document may contain zero Invariant Sections. If the Document does not identify
any Invariant Sections then there are none.
The “Cover Texts” are certain short passages of text that are listed, as Front-Cover Texts or BackCover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words.
A “Transparent” copy of the Document means a machine-readable copy, represented in a format
whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or
(for drawings) some widely available drawing editor, and that is suitable for input to text formatters
or for automatic translation to a variety of formats suitable for input to text formatters. A copy made
in an otherwise Transparent file format whose markup, or absence of markup, has been arranged
to thwart or discourage subsequent modification by readers is not Transparent.
An image format is not Transparent if used for any substantial amount of text. A copy that is not
“Transparent” is called “Opaque”.
Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo
input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that
can be read and edited only by
proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word
processors for output purposes only.
The “Title Page” means, for a printed book, the title page itself, plus such following pages as are
needed to hold, legibly, the material this License requires to appear in the title page. For works in
formats which do not have any title page as such, “Title Page” means the text near the most prominent appearance of the work’s title, preceding the beginning of the body of the text.
A section “Entitled XYZ” means a named subunit of the Document whose title either is precisely
XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here
XYZ stands for a specific section name mentioned below, such as “Acknowledgements”, “Dedications”, “Endorsements”, or “History”.) To “Preserve the Title” of such a section when you modify the
Document means that it remains a section “Entitled XYZ” according to this definition.
The Document may include Warranty Disclaimers next to the notice which states that this License
applies to the Document. These Warranty Disclaimers are considered to be included by reference
in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License.
2. VERBATIM COPYING
You may copy and distribute the Document in any medium, either commercially or noncommercially,
provided that this License, the copyright notices, and the license notice saying this License applies
to the Document are reproduced in all copies, and that you add no other conditions whatsoever to
those of this License. You may not use
technical measures to obstruct or control the reading or further copying of the copies you make or
distribute. However, you may accept compensation in exchange for copies. If you distribute a large
enough number of copies you must also follow the conditions in section 3.
44
GNU FDL
You may also lend copies, under the same conditions stated above, and you may publicly display
copies.
3. COPYING IN QUANTITY
If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document’s license notice requires Cover Texts, you
must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover
Texts on the front cover, and Back-Cover Texts on
the back cover. Both covers must also clearly and legibly identify you as the publisher of these
copies. The front cover must present the full title with all words of the title equally prominent and
visible. You may add other material on the covers in addition.
Copying with changes limited to the covers, as long as they preserve the title of the Document and
satisfy these conditions, can be treated as verbatim copying in other respects.
If the required texts for either cover are too voluminous to fit legibly, you should put the first ones
listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages.
If you publish or distribute Opaque copies of the Document numbering more than 100, you must
either include a machine-readable Transparent copy along with each Opaque copy, or state in or
with each Opaque copy a computer-network location from which the general network-using public
has access to download using public-standard network protocols a complete Transparent copy of
the Document, free of added material.
If you use the latter option, you must take reasonably prudent steps, when you begin distribution of
Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the
stated location until at least one year after the last time you distribute an Opaque copy (directly or
through your agents or retailers) of that edition to the public.
It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version
of the Document.
4. MODIFICATIONS
You may copy and distribute a Modified Version of the Document under the conditions of sections 2
and 3 above, provided that you release the Modified Version under precisely this License, with the
Modified Version filling the role of the Document, thus licensing distribution
and modification of the Modified Version to whoever possesses a copy of it. In addition, you must
do these things in the Modified Version:
A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and
from those of previous versions (which should, if there were any, be listed in the History section of
the Document). You may use the same title as a previous version if the original publisher of that
version gives permission.
B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of
the modifications in the Modified Version, together with at least five of the principal authors of the
Document (all of its principal authors, if it has fewer than five), unless they release you from this
requirement.
C. State on the Title page the name of the publisher of the Modified Version, as the publisher.
D. Preserve all the copyright notices of the Document.
E. Add an appropriate copyright notice for your modifications adjacent to the other copyright noti45
GNU FDL
ces.
F. Include, immediately after the copyright notices, a license notice giving the public permission
to use the Modified Version under the terms of this License, in the form shown in the Addendum
below.
G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given
in the Document’s license notice.
H. Include an unaltered copy of this License.
I. Preserve the section Entitled “History”, Preserve its Title, and add to it an item stating at least
the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If
there is no section Entitled “History” in the Document, create one stating the title, year, authors,
and publisher of the Document as given on its Title Page, then add an item describing the Modified
Version as stated in the previous sentence.
J. Preserve the network location, if any, given in the Document for public access to a Transparent
copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the “History” section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original
publisher of the version it refers to gives permission.
K. For any section Entitled “Acknowledgements” or “Dedications”, Preserve the Title of the section,
and preserve in the section all the substance and tone of each of the contributor acknowledgements
and/or dedications given therein.
L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles.
Section numbers or the equivalent are not considered part of the section titles.
M. Delete any section Entitled “Endorsements”. Such a section may not be included in the Modified
Version.
N. Do not retitle any existing section to be Entitled “Endorsements” or to conflict in title with any
Invariant Section.
O. Preserve any Warranty Disclaimers.
If the Modified Version includes new front-matter sections or appendices that qualify as Secondary
Sections and contain no material copied from the Document, you may at your option designate
some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections
in the Modified Version’s license notice.
These titles must be distinct from any other section titles.
You may add a section Entitled “Endorsements”, provided it contains nothing but endorsements of
your Modified Version by various parties--for example, statements of peer review or that the text
has been approved by an organization as the authoritative definition of a standard.
You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one
passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover,
previously added by you or by arrangement made by the same entity you are acting on behalf of,
you may not add another; but you may replace the old one, on explicit permission from the previous
publisher that added the old one.
The author(s) and publisher(s) of the Document do not by this License give permission to use their
names for publicity for or to assert or imply endorsement of any Modified Version.
46
GNU FDL
5. COMBINING DOCUMENTS
You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination
all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty
Disclaimers.
The combined work need only contain one copy of this License, and multiple identical Invariant
Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same
name but different contents, make the title of each such section unique by adding at the end of it, in
parentheses, the name of the original author or publisher of that section if known, or else a unique
number.
Make the same adjustment to the section titles in the list of Invariant Sections in the license notice
of the combined work.
In the combination, you must combine any sections Entitled “History” in the various original documents, forming one section Entitled “History”; likewise combine any sections Entitled “Acknowledgements”, and any sections Entitled “Dedications”. You must delete all sections Entitled “Endorsements”.
6. COLLECTIONS OF DOCUMENTS
You may make a collection consisting of the Document and other documents released under this
License, and replace the individual copies of this License in the various documents with a single
copy that is included in the collection, provided that you follow the rules of this License for verbatim
copying of each of the documents in all other respects.
You may extract a single document from such a collection, and distribute it individually under this
License, provided you insert a copy of this License into the extracted document, and follow this
License in all other respects regarding verbatim copying of that document.
7. AGGREGATION WITH INDEPENDENT WORKS
A compilation of the Document or its derivatives with other separate and independent documents or
works, in or on a volume of a storage or distribution medium, is called an “aggregate” if the copyright
resulting from the compilation is not used to limit the legal rights of the compilation’s users beyond
what the individual works permit.
When the Document is included in an aggregate, this License does not apply to the other works in
the aggregate which are not themselves derivative works of the Document.
If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the
Document is less than one half of the entire aggregate, the Document’s Cover Texts may be placed
on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if
the Document is in electronic form.
Otherwise they must appear on printed covers that bracket the whole aggregate.
8. TRANSLATION
Translation is considered a kind of modification, so you may distribute translations of the Document
under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections
in addition to the original versions of these Invariant Sections. You may include a translation of
this License, and all the license notices in the Document, and any Warranty Disclaimers, provided
that you also include the original English version of this License and the original versions of those
notices and disclaimers. In case of a disagreement between the translation and the original version
47
GNU FDL
of this License or a notice or disclaimer, the original version will prevail.
If a section in the Document is Entitled “Acknowledgements”, “Dedications”, or “History”, the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title.
9. TERMINATION
You may not copy, modify, sublicense, or distribute the Document except as expressly provided
for under this License. Any other attempt to copy, modify, sublicense or distribute the Document
is void, and will automatically terminate your rights under this License. However, parties who have
received copies, or rights, from you under this License will not have their licenses terminated so
long as such parties remain in full compliance.
10. FUTURE REVISIONS OF THIS LICENSE
The Free Software Foundation may publish new, revised versions of the GNU Free Documentation
License from time to time. Such new versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns. See
http://www.gnu.org/copyleft/. Each version of the License is given a distinguishing version number.
If the Document specifies that a particular numbered version of this License “or any later version”
applies to it, you have the option of following the terms and conditions either of that specified version
or of any later version that has been published (not as a draft) by the Free Software Foundation. If
the Document does not specify a version number of this License, you may choose any version ever
published (not as a draft) by the Free Software Foundation.
ADDENDUM: How to use this License for your documents
To use this License in a document you have written, include a copy of the License in the document
and put the following copyright and license notices just after the title page:
Copyright (c)
YEAR
YOUR NAME.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.2
or any later version published by the Free Software Foundation;
with no Invariant Sections, no FrontCover Texts, and no Back-Cover Texts.
A copy of the license is included in the section entitled “GNU
Free Documentation License”.
If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the “with...Texts.”
line with this:
with the Invariant Sections being LIST THEIR TITLES, with the
Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
If you have Invariant Sections without Cover Texts, or some other combination of the three, merge
those two alternatives to suit the situation.
If your document contains nontrivial examples of program code, we recommend releasing these
examples in parallel under your choice of free software license, such as the GNU General Public
License, to permit their use in free software.
48