Copyright © 2003 Tabasoft S.a.s.
È garantito il permesso di copiare, distribuire e/o modificare questo documento seguendo i termini della Licenza per Documentazione Libera GNU, Versione 1.2 o ogni versione successiva pubblicata dalla Free Software Foundation; senza Sezioni Non Modificabili, senza Testi Copertina, e senza Testi di Retro Copertina. Una copia della licenza in lingua inglese è acclusa nella sezione intitolata Appendice 1, GNU Free Documentation License.
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 Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled Appendice 1, GNU Free Documentation License.
Lista delle Figure
Sommario
bifernoadmin è un servizio web, interamente realizzato in linguaggio Biferno, che permette l'amministrazione remota e la modifica di una applicazione Biferno tramite una interfaccia accessibile da qualunque browser internet.
Per il concetto di applicazione Biferno si veda il Cap. 9 del documento: "Biferno: Language Guide". In generale, per una completa comprensione del presente documento è necessario aver letto il suddetto manuale (disponibile sul sito www.biferno.it) avendo compreso almeno i principi generali di Biferno e delle sue applicazioni.
bifernoadmin viene automaticamente installato all'atto della installazione di Biferno, ma rimane inattivo fino a configurazione completata come descritto in: Sezione 4, «Configurazione e note sulla sicurezza». Esso consiste di una cartella, di nome bifernoadmin, contenente gli script .bfr che implementano tutte le funzionalità del servizio.
Tale cartella viene installata nella directory BifernoHome del computer su cui si installa Biferno
![]() | Cos'è BifernoHome |
|---|---|
BifernoHome è il percorso della cartella centrale cui fa riferimento Biferno per le proprie impostazioni generali e per il salvataggio di alcuni file utili al suo funzionamento (file di log, file di spool delle mail etc...). La sua posizione dipende dal Sistema Operativo in cui si sta lavorando:
Su tutti i sistemi operativi è anche possibile sapere il percorso della cartella BifernoHome esaminando (in uno script biferno) la proprietà: biferno.home BifernoHome contiene anche l'applicazione main di cui tutte le altre applicazioni sono figlie (per il concetto di sottoapplicazione, o applicazione figlia, e per altri dettagli su BifernoHome si veda il manuale :"Biferno: Language Guide"). |
Per accedere a bifernoadmin è necessario digitare nel proprio browser la URL della cartella contenente l'applicazione che si vuole amministrare seguita dalla stringa bifernoadmin/index.bfr; la stringa index.bfr è facoltativa se si è impostata correttamente la DirectoryIndex nelle preferenze del server web, cioè la pagina che il server web deve mostrare qualora nella URL sia specificata solamente la directory.
Per esempio, per amministrare l'applicazione contenuta nella cartella MyApplication sul sito www.mysite.com si deve digitare la url:
https://www.mysite.com/MyApplication/bifernoadmin/index.bfr
per quanto riguarda l'uso del protocollo https nella URL (invece del semplice http) si veda: Sezione 4, «Configurazione e note sulla sicurezza» più avanti.
Si noti che nella cartella MyApplication non esiste nessuna cartella bifernoadmin (che si trova invece in BifernoHome), eppure la url viene ritrovata correttamente! Il trucco consiste nel fatto che Biferno automaticamente intercetta tutte le url che contengono la parola bifernoadmin e le redirige su: [BifernoHome]/bifernoadmin/index.bfr. Se così non fosse, sarebbe necessario replicare la cartella bifernoadmin in tutte le applicazioni, con un conseguente spreco di spazio su disco e una maggiore difficoltà nel mantenimento del codice. Da questo intuiamo anche che la parola bifernoadmin è una parola riservata e non deve mai essere usata per nominare i nostri script (o cartelle contenenti i nostri script).
bifernoadmin è costituito da quattro strumenti fondamentali:
Capitolo 2, Admin permette di modificare le preferenze dell'applicazione e di eseguire flush (svuotamento della cache) e reload (reinizializzazione) dell'applicazione stessa (per i dettagli su flush e reload si veda il Cap. 9 di "Biferno: Language Guide").
Capitolo 3, Edit viene usato per leggere e modificare i file e le cartelle dell'applicazione permettendo l'aggiunta e la correzione degli script che la compongono
Capitolo 4, Reference presenta la documentazione on line di tutte le classi e funzioni Biferno e permette di produrre nuova documentazione per classi e funzioni utente.
Capitolo 5, Cache ci consente di visualizzare (ed eventualmente eliminare dalla cache) i singoli file presenti nella cache dell'applicazione e consultare le ultime statistiche di accesso dei file stessi.
Più avanti esamineremo i dettagli di tutti questi strumenti.
L'accesso a bifernoadmin deve essere consentito solo allo sviluppatore (o all'amministratore) dell'applicazione per evitare intrusioni e possibili danni. Un utente male intenzionato potrebbe eseguire un reload dell'applicazione in un momento non desiderato o (peggio) modificare i file del nostro sito usando Edit. Dunque è importante soffermarci un momento sui meccanismi di protezione che il servizio mette in atto, e sulle possibili impostazioni che ne influenzano il comportamento
Per ottenere una protezione adeguata bifernoadmin agisce su tre livelli diversi:
Prima ancora di verificare l'identità dell'utente, bifernoadmin confronta il protocollo che si sta usando per richiedere l'accesso con la lista dei protocolli accettati. I protocolli accettati sono elencati nella variabile applicazione ADMIN_PROTOCOL definita nel Biferno.config.bfr dell'applicazione, come in:
ADMIN_PROTOCOL = "https"
che stabilisce come unico protocollo accettato l'HTTPS (HTTP sicuro). In particolare l'utilizzo del protocollo HTTPS prevede la trasmissione dei dati in modalità criptata ed è dunque più sicuro del semplice HTTP. Se si è definito questo protocollo e si cerca di accedere a bifernoadmin tramite semplice HTTP, si ottiene la seguente schermata:
Se si definisce ADMIN_PROTOCOL nel seguente modo:
ADMIN_PROTOCOL = "https, http"
oppure
ADMIN_PROTOCOL = "*"
si ottiene l'accesso anche in semplice HTTP (o in qualunque protocollo nel secondo caso). Questo però mette a rischio la sicurezza del sito in quanto i dati vengono trasmessi in chiaro.
L'uso dell'HTTPS richiede lavoro aggiuntivo, in particolare richiede l'installazione di un server sicuro, cioè di un server web che supporti il protocollo HTTP over SSL.
Si noti inoltre che bifernoadmin deve essere installato sullo stesso computer dell'applicazione che si vuole amministrare. Questo potrebbe richiedere la coesistenza di due server (per i due protocolli, HTTPS e HTTP) sullo stesso computer, infatti spesso l'HTTPS risulta necessario unicamente per bifernoadmin.
Alla prima installazione Biferno inizializza la variabile ADMIN_PROTOCOL al valore: "https".
Una volta verificato il protocollo, bifernoadmin controlla che l'indirizzo IP da cui proviene la richiesta sia compatibile con gli IP definiti nella variabile applicazione ADMIN_IP. Tale variabile, come le altre riguardanti bifernoadmin, è definita nel Biferno.config.bfr, come in:
ADMIN_IP = "195.136.128.10"
oppure
ADMIN_IP = "195.136.128.10, 192.128.137.*"
nel secondo esempio abbiamo abilitato tutti gli IP che cominciano per 192.128.137. più il singolo IP 195.136.128.10. Se si cerca di accedere bifernoadmin dall'IP 192.168.10.20 (che non è fra quelli abilitati) si ottiene la seguente schermata:
In questo modo bifernoadmin si assicura di ricevere richieste solo dagli IP abilitati. Si tenga presente, in ogni caso, che alterazioni dell'IP di provenienza sono comunque possibili (anche se non banali) da parte di hacker male intenzionati.
In alcuni casi bisogna tener conto del fatto che l'IP di una certa macchina che si connette a bifernoadmin non è sempre lo stesso. Questo succede nel caso in cui l'IP viene assegnato dinamicamente (per esempio dal proprio ISP) ad ogni nuova connessione ad Internet. Se proprio non si può evitare questa situazione, si può essere costretti a definire una maschera per ADMIN_IP, come nel secondo esempio (eludendo però il controllo IP di bifernoadmin per una intera rete di utenti, il chè può essere pericoloso).
Inoltre, le richieste provenienti da organizzazioni che si connettono ad internet tramite un router vengono ricevute dal server web come se provenissero da un unico indirizzo IP. Abilitando quell'indirizzo IP si abilita in realtà l'intera organizzazione a superare il controllo all'accesso in bifernoadmin.
Biferno, alla prima installazione, inizializza ADMIN_IP al valore "" (stringa vuota) non consentendo così l'accesso da nessuna postazione.
L'ultimo controllo che bifernoadmin esegue è quello della password. Se si sono superati i controlli di Protocollo e di IP, si accede alla finestra di login.
La finestra ci richiede la password per entrare. Il servizio ci informa anche che Reference (a differenza degli altri tre strumenti di bifernoadmin) può essere consultato liberamente, senza inserire nessuna password. Si noti però che anche Reference richiederà la password qualora si tenti di modificare la documentazione non limitandosi alla semplice consultazione.
Il servizio ci informa anche che è necessario avere i cookie attivati nel nostro browser per poter accedere a bifernoadmin
La password digitata deve coincidere con quella definita nella variabile ADMIN_PASSWORD, come in:
ADMIN_PASSWORD = "mypassword"
Biferno, alla prima installazione, inizializza ADMIN_PASSWORD al valore "" (stringa vuota) non consentendo così l'accesso a nessuno.
![]() | Nota |
|---|---|
Per non scrivere in chiaro la password nel file
ADMIN_PASSWORD = file("passw.x.bfr",,r).Get()
Si noti che il file della password finisce con ".x.bfr", suffisso che ne impedisce la richiesta via WEB (si veda la nota "Protezione dei file" all'inizio del Cap.9 "Applicazioni" in "Biferno: Language Guide").
Ancora meglio sarebbe NON scrivere la password in chiaro (inserendo nel file, per esempio, il risultato della
ADMIN_PASSWORD = file("passw.x.bfr",,r).Get().HTUUDecode()
|
Se la password digitata non è corretta, ci viene mostrato il messaggio «Sorry, invalid password. Please try again.»
Finalmente, dopo aver completato la configurazione ed aver inserito la password corretta ci viene consentito l'accesso alla prima pagina di bifernoadmin.
![]() | NOTA IMPORTANTE |
|---|---|
Dopo aver modificato le variabili: Il problema si può risolvere in due modi:
|
Una volta autenticati in bifernoadmin, automaticamente vieniamo riconosciuti da Biferno come se il nostro IP fosse fra quelli elencati nella variabile DEVELOPER_IP (si veda "Biferno: Language Guide" per i dettagli sul DEVELOPER_IP).
Riassumendo, il processo di autenticazione di bifernoadmin è pensato per evitare l'intrusione di utenti indesiderati. Tuttavia, grazie alla totale flessibilità delle impostazioni, esso lascia anche all'amministratore la possibilità di allentare la sicurezza per una gestione più comoda (ma meno sicura) degli strumenti di amministrazione.
Sommario
Una volta autenticati si ha accesso alla sezione Admin. In alto a destra si trova il menu che permette la navigazione nelle differenti sezioni di bifernoadmin. Tale menu è presente in tutte e quattro le sezioni.
In alto a sinistra, in ogni sezione, viene stampata la versione di Biferno, un link al sito Tabasoft.it e il nome dell'applicazione che si sta amministrando.
Nella sezione Admin seguono alcune indicazioni sull'ambiente operativo, tra cui:
System: il sistema su cui sta girando Biferno
esempio: Unix: 6.6 Darwin Kernel Version 6.6: Thu May 1 21:48:54 PDT 2003; Power Macintosh powerpc
Version: la versione di Biferno che sta girando sulla macchina
esempio: 1.0. Il link "check updates" consente di verificare la disponibilità di versioni più recenti sul sito della Tabasoft
WebServer: il web server che si sta usando
esempio: Apache/1.3.27 (Darwin)
BifernoHome: il path alla cartella BifernoHome
esempio: file://Users/BifernoHome/
Base Path: il path di base dell'applicazione, cioè la cartella in cui è contenuta l'applicazione
esempio: file://Library/WebServer/Documents/MyApplication/
Web Path: la url di base per raggiungere l'applicazione
esempio: http://www.mysite.com/MyApplication/
Up Since: la data di ultimo startup di Biferno
esempio: 14-05-2003 11:23:31
Children: le sottoapplicazioni dell'applicazione (si veda "Biferno: Language Guide" per il concetto di sottoapplicazione)
esempio: MySubApp1, MySubApp2
Nella pagina di Admin si trova anche una textarea per la gestione del file Biferno.config.bfr dell'applicazione. Sappiamo che il contenuto di questo file è fondamentale per gestire le preferenze della nostra applicazione e il suo codice viene eseguito solo al primo accesso all'applicazione. Nel caso della nostra semplice applicazione il file di config appare come nella seguente figura:
dopo aver eseguito l'editing del file è necessario premere il bottone «Save config and Reload» per rendere effettive le modifiche. Questa operazione salva il file di config e applica un reload all'applicazione per reinizializzarla con le preferenze appena modificate.
Premendo il bottone «Reload» viene eseguito il reload dell'applicazione. Questa operazione è indispensabile qualora si voglia rieseguire il processo di inizializzazione dell'applicazione stessa (cioè l'esecuzione del Biferno.config.bfr). Si noti anche che questa operazione azzera tutto ciò che è legato all'applicazione; per esempio azzera le variabili session degli utenti e svuota la cache dell'applicazione.
In particolare se si è modificato anche il Biferno.config.bfr nella textarea è necessario anche salvare il file premendo il bottone «Save config and Reload».
Tramite il bottone «Flush Cache» è possibile svuotare solamente la cache dell'applicazione. Si noti che questa operazione non ha alcun effetto se la cache non è attiva (cioè se la variabile CACHE dell'applicazione vale false).
Per i concetti di reload e flush si veda anche "Biferno: Language Guide"
![]() | Nota |
|---|---|
Le operazioni di flush e reload vengono automaticamente invocate anche su tutte le sottoapplicazioni, elencate nel campo Children delle informazioni generali (vedi: Sezione 1, «Informazioni generali sull'Applicazione»). |
Sommario
Clickando sul link "Edit" si entra in una pagina con l'elenco dei file presenti nella prima directory dell'applicazione:
![]() | Nota |
|---|---|
Nel caso dell'applicazione main la prima cartella mostrata da bifernoadmin non coincide sempre con quella dell'applicazione. Infatti in molti casi BifernoHome non è compresa nella radice del web server e quindi la sua pubblicazione potrebbe non essere desiderata. In questo caso viene mostrata, come radice dell'applicazione, la radice del web server. |
Il menu in alto («Current directory») mostra la directory in cui si sta navigando.
Nella colonna di sinistra si ha invece l'elenco dei files e delle directory presenti nella cartella. Clickando sulla freccia è possibile lanciare lo script e vedere il risultato della sua esecuzione
Clickando sul nome di un file si accede ad una pagina in cui è possibile editare il contenuto del file. In particolare la pagina presenta in alto una serie di bottoni (che vedremo più avanti) e una o più textarea per l'editing del contenuto.
![]() | Nota |
|---|---|
Se il file è protetto da scrittura un semplice testo non editabile verrà mostrato al posto della textarea. |
Il bottone «Save file» permette di registrare su disco le modifiche eseguite.
Se il file in esame è una immagine, questa viene mostrata a video e non è possibile eseguire modifiche sul contenuto del file.
E' anche possibile selezionare un file (senza editarlo) per poter eseguire su di esso alcune operazioni. Per selezionare un file si può premere il bottone circolare accanto al nome del file stesso. In questo caso la textarea per la modifica del file non viene mostrata. La semplica selezione del file può essere utile quando si vogliono eseguire operazioni su file molto grandi evitando così il tempo di caricamento del contenuto nella textarea.
Dopo aver selezionato (o editato) un file, in testa alla pagina vengono mostrate alcune informazioni sul file stesso.
In particolare viene mostrato il nome del file, la sua dimensione, la data di creazione e la data di ultima modifica (si noti che su Unix la data di creazione non è supportata).
Una serie di bottoni permettono anche di eseguire alcune operazioni sul file:
Trash file: premendo questo bottone viene mostrato all'utente un messaggio per richiedere la conferma dell'operazione («Si vuole veramente spostare il file nel cestino?»). Se l'operazione viene confermata il file viene spostato nella cartella «bfedit_trash» (il cestino). Questa cartella viene creata allo stesso livello del file la prima volta che si esegue un'operazione di questo tipo. Quando si esegue "Trash file" su un file ed esiste già un file con lo stesso nome nel cestino, quest'ultimo viene definitivamente cancellato e il primo lo sostituisce.
Una volta creata la cartella «bfedit_trash» è possibile svuotare il cestino accedendo a tale cartella e premendo il bottone «Empty Trash».
Delete file: con questo bottone si cancella definitivamente il file (prima di eseguire l'operazione viene richiesta comunque una ulteriore conferma).
Move File: questo bottone ci porta ad una pagina in cui possiamo specificare un nuovo path per il file.
Premendo, in questa pagina, il bottone «Move File» il file viene effettivamente spostato nella nuova posizione. Non è possibile muovere file in una cartella di livello superiore a quella dell'applicazione.
E' necessario avere i permessi di scrittura nella cartella di destinazione, altrimenti si riceverà un messaggio di errore.
Rename file: con questa funzione possiamo rinominare il file (una pagina successiva ci richiede il nuovo nome)
Download file: questa funzione permette di scaricare sul proprio disco il contenuto del file.
I primi due bottoni nella parte superiore della pagina permettono di creare un nuovo file e di caricare sul server un file dal nostro computer (upload).
Il bottone «New File» ci permette di creare un file vuoto nella cartella corrente. Una pagina successiva ci richiede il nome del file e, una volta creato, esso può essere editato sfruttando la funzione di modifica descritta in: Sezione 1, «Editing dei file».
Il bottone «Upload file» ci permette di caricare sul server un file presente sulla propria macchina. Una pagina successiva ci richiede di selezionare il file. Il file selezionato viene poi caricato nella directory corrente e può essere a sua volta modificato sfruttando la funzione di modifica descritta in: Sezione 1, «Editing dei file».
Se si clicka su una delle sottocartelle si possono editare i files in essa contenuti. Il menu in alto permette il ritorno alla cartella superiore (si noti che non è possibile, per motivi di sicurezza, visitare le directory al di sopra di quella della nostra applicazione).
Due bottoni nella parte superiore della pagina ci permettono di eseguire operazioni sulle directory.
New directory: permette la creazione di una directory nella cartella corrente (biferno deve avere il permesso di scrittura nella directory)
Delete current directory: premendo questo bottone viene cancellata la directory corrente. Questa operazione va a buon fine solo se la directory è vuota. Si noti che su alcuni sistemi le cartelle possono sembrare vuote se esaminate con Edit; in realtà possono ancora contenere file invisibili (per esempio file che iniziano per '.'). Su Unix, per esempio, si possono esaminare tali file usando il comando di terminale: ls -la
Per creare una sottoapplicazione è sufficiente creare una nuova cartella (se non esiste già) e accedere al suo contenuto. In alto apparirà la seguente linea:
Dopo aver inserito il nome dell'applicazione e premuto il bottone "Make this folder a new App" verrà mostrata la finestra di login della nuova applicazione. E' dunque necessario reinserire la password (identica a quella dell'applicazione madre) per accedere al bifernoadmin della nuova applicazione. Infatti tutte le variabili della applicazione appena creata (compresa la password) vengono ereditate dalla applicazione madre.
Se invece si accede ad una sottodirectory che contiene già una sottoapplicazione viene mostrata la seguente schermata:
per navigare nella cartella è allora necessario accedere al bifernoadmin della sottoapplicazione, la cui url viene presentata nel messaggio che sostituisce la lista dei files.
Edit consente di personalizzare alcune impostazioni. Premendo il bottone in alto a destra ("Preferences...") si aprono alcune finestre per la definizione delle preferenze. Vediamole di seguito.
E' possibile definire, nella sezione «File filter» come Edit deve mostrare i file in base al suffisso del loro nome.
Se si fornisce il suffisso *, la lista di Edit mostra tutti i tipi di file, altrimenti solo quelli che hanno un suffisso fra quelli dichiarati. Se si marca il bottone «Show not editable files» i file con suffisso diverso da quelli previsti sono mostrati nella lista ma non sono editabili (altrimenti tali file non vengono mostrati affatto).
Per rendere effettive le modifiche, in questa e nella successiva sezione, è necessario premere il bottone "ok"
Nella sezione «Icons settings» è possibile definire la grandezza delle icone mostrate per ogni file nella lista.
Se il file è una immagine (di tipo gif o jpeg) si può opzionalmente mostrare la miniatura (thumb) dell'immagine nella lista dei files. In questo caso è possibile definire anche la larghezza e la altezza delle miniature stesse.
Sommario
La sezione "Reference" presenta la guida di riferimento online di Biferno e delle classi e funzioni definite dall'utente. La «Reference On Line» presente sul sito www.biferno.it è una versione semplificata della sezione "Reference" di bifernoadmin.
Nella colonna di sinistra sono elencate tutte le classi predefinite (Predefined Classes), seguite dalle classi definite dall'utente (Application Classes, ovvero quelle implementate in linguaggio Biferno e caricate nell'applicazione corrente). Se si clicka sul link Functions (in fondo alla lista delle classi) si accede ad una pagina con l'elenco di tutte le funzioni predefinite (Predefined Functions) seguite dalle funzioni definite dall'utente (Application Functions).
![]() | Nota |
|---|---|
Solo le classi e funzioni utente di scope |
Clickando sul nome di una classe si accede alla documentazione della classe. Nella parte superiore vengono presentate quattro colonne contenenti:
i metodi della classe
le proprietà
le costanti definite dalla classe
gli eventuali errori propri della classe
La prima pagina documenta anche il significato e lo scopo della classe e il suo costruttore. In particolare per quanto riguarda la classe vengono mostrati i seguenti campi della documentazione:
Purpose: lo scopo e la funzionalità della classe
Description: una descrizione generica della classe
Notes: note aggiuntive
See Also: quali altre classi può essere utile consultare per comprendere meglio la corrente
Implementation: il tipo di implementazione. Ad oggi una classe (o metodo, proprietà etc.) può essere scritta in C (come tutti i metodi predefiniti) o in Biferno (come tutti i metodi application)
di seguito viene poi mostrata la documentzaione del costruttore della classe. In particolare per quanto riguarda il costruttore della classe vengono mostrati i seguenti campi della documentazione:
Purpose: lo scopo del costruttore, a quali necessità esso risponde
Description: una descrizione generica del costruttore
Parameters: la lista dei parametri con una descrizione dei parametri stessi
Returns: una descrizione del valore di ritorno del costruttore
Errors: quali errori può causare il costruttore
Notes: note aggiuntive di qualunque tipo
See Also: quali altri metodi può essere utile consultare
Implementation: il tipo di implementazione (vedi sopra)
inoltre viene mostrato il prototipo del costruttore stesso.
Clickando su un metodo, proprietà, costante o errore si accede alla relativa documentazione. In ogni pagina vengono mostrati i seguenti campi di documentazione (quanto detto di seguito per i metodi si applica, se non specificato diversamente, anche alle proprietà, costanti o errori):
Purpose: lo scopo del metodo, a quali necessità esso risponde
Description: una descrizione generica del metodo
Parameters: la lista dei parametri con una descrizione dei parametri stessi (questo campo è l'unico non applicabile a proprietà, costanti o errori)
Returns: una descrizione del valore di ritorno del metodo
Errors: quali errori può causare il metodo
Notes: note aggiuntive di qualunque tipo
See Also: quali altri metodi può essere utile consultare
Implementation: il tipo di implementazione
La documentazione delle funzioni è del tutto simile a quella dei metodi delle singole classi
Ogni pagina di documentazione contiene un link per modificare la documentazione stessa («Update Man Page»). Accedendo a questa pagina (protetta da password) è possibile modificare il contenuto di tutti i campi della documentazione.
![]() | Nota |
|---|---|
Solo le pagine Man di classi e funzioni aggiunte dall'utente (in C o Biferno) possono essere modificate. Tutte le pagine Man delle classi e funzioni comprese nella distribuzione di partenza di Biferno non possono essere modificate. |
In fondo alla pagina viene mostrata una anteprima della pagina di documentazione così come mostrata agli utenti.
Nei vari campi si deve inserire il relativo testo di documentazione tenendo presente le due seguenti regole:
Non è consentito inserire nel testo alcun tag HTML
E' consentito inserire alcuni tag XML (vedi: Sezione 3, «Struttura del file di documentazione»)
E' consentito inserire caratteri accentati
Dopo aver riempito le caselle, premendo il bottone "Modify Man Page" i dati vengono inviati a Reference che li assembla in un unico file di documentazione. Tale file costituisce la struttura fondamentale della Guida di Riferimento e sarà consultato da Biferno ogni volta che verrà richiesta la documentazione di un certo metodo, funzione, proprietà, costante, errore o classe.
Ogni file di documentaaione può documentare uno dei seguenti elementi di Biferno (documentation unit):
un metodo di una classe
una proprietà di una classe
una costante di una classe
un errore di una classe
una funzione
una classe in genere + il metodo costruttore della classe
Tale file deve essere anche distribuito insieme alla implementazione della propria classe (o metodo etc...). In questo modo si dà agli utenti la possibilità di consultarne la documentazione sul proprio servizio di Reference.
Il file di documentazione viene salvato in formato XML. Tuttavia non è richiesta alcuna conoscenza dell'XML da parte dell'utente per poter agire sul file in quanto la struttura interna viene completamente gestita da Biferno. Il paragrafo successivo tuttavia spiega come sia possibile, per gli utenti più esperti, controllare maggiormante la formattazione dei campi di documentazione.
Il file di documentazione creato da Biferno (man page) è un file XML che segue le regole di una DTD (Document Type Definition) definita da Biferno. Per i più curiosi, alla fine del paragrafo (vedi Figura 4.2, «La DTD per la documentazione di Biferno»), riportiamo la struttura della versione attuale della DTD di Biferno.
L'utente che sta editando la documentazione non deve comunque preoccuparsi di tutti i tag della DTD in quanto, come detto, Biferno assembla automaticamente i testi inseriti in altrettanti tag XML definiti dalla DTD.
E' possibile tuttavia inserire i seguenti tag all'interno dei campi della documentazione per ottenere una maggior controllo sulla struttura della documentazione stessa:
tag par: per la definizione dei paragrafi. Esempio:
<par>questo è un nuovo paragrafo</par>
Tutti i testi dei campi devono essere compresi in (almeno) una coppia di <par></par>. Tuttavia si tenga conto che Reference aggiunge automaticamente un <par> prima e un </par> dopo il testo di un campo di documentazione, se questo non ne contiene nessuno al suo interno.
tag code: per definire blocchi di codice in paragrafi separati. Esempio:
<code>a = 5</code>
Il codice costituirà un blocco separato dal testo.
tag inlinecode: per definire parole di codice in linea nel testo. Esempio:
<inlinecode>a = 5</inlinecode>
a differenza del tag precedente il codice non costituirà un blocco separato dal testo ma sarà mostrato in linea.
tag link: per definire link ad altri elementi della documentazione. La sintassi è:
<link linkend="[type].[class].[name]">[text of link]</link>
dove:
[type] = method | property | constant | error | class | function
[class] = nome della classe (o «function» se si sta referenziando una funzione)
[name] = nome della proprietà (o metodo etc..) che si vuole linkare (opzionale nel caso di una intera classe)
[text of link] = testo del link visibile all'utente
Per esempio per ottenere un link al metodo Walk della classe folder si può scrivere:
<link linkend="method.folder.Walk">folder.Walk</link>
oppure, per ottenere un link alla classe folder si può anche scrivere:
<link linkend="class.folder">class folder</link>
oppure, per ottenere un link alla funzione Eval si può scrivere:
<link linkend="function.Eval">function Eval</link>
Per inserire un link ad un sito esterno (per esempio www.tabasoft.it) è sufficiente scrivere
<link linkend="http://www.tabasoft.it">link a www.tabasoft.it</link>
(in questo caso è obbligatorio cominciare il testo del linkend con «http:»)
E' importante non inserire altri tag della DTD autonomamente per non interferire in maniera scorretta col processo di creazione dell'XML eseguito automaticamente da Reference.
E' possibile vedere il sorgente del file XML prodotto da Reference clickando sul link «Show Man File». Clickando invece sul link «Show Man XML» si può esaminare il file XML così come processato dal Browser. Quest'ultima operazione può essere utile per validare il file, verificando così di non aver inserito tag invalidi nel testo.
In linea di principio è possibile, per utenti esperti di XML, produrre il file di documentazione con qualunque editor di testo a partire dalla struttura della DTD di Biferno, di seguito riportata:
Figura 4.2. La DTD per la documentazione di Biferno
<?xml version='1.0' encoding='UTF-8' ?>
<!-- Biferno documentation DTD version 1.0 -->
<!ENTITY % isolat1 SYSTEM "./iso-lat1.ent">
<!ENTITY % isolat2 SYSTEM "./iso-lat2.ent">
<!ENTITY % isopub SYSTEM "./iso-pub.ent">
<!ENTITY % isonum SYSTEM "./iso-num.ent">
%isolat1;
%isolat2;
%isopub;
%isonum;
<!-- ********************* -->
<!ELEMENT bifdoc (class | method | property | constant | error | function)+>
<!-- ********************* -->
<!ELEMENT class (name , purpose? , descr , see_also? , note?)>
<!ATTLIST class implem (c | b) #REQUIRED >
<!-- ********************* -->
<!ELEMENT method (pclass , name , purpose? , prototype , descr , returns? ,
errors? , see_also? , note?)>
<!ATTLIST method static (yes | no ) #REQUIRED
visibility (private | public | protected ) #REQUIRED
varargs (yes | no ) 'no'
nonames (yes | no ) 'no' >
<!-- ********************* -->
<!ELEMENT property (pclass , name , purpose? , return_value , descr , returns? ,
errors? , see_also? , note?)>
<!ATTLIST property static (yes | no ) #REQUIRED
visibility (private | public | protected ) #REQUIRED >
<!-- ********************* -->
<!ELEMENT constant (pclass , name , purpose? , return_value , descr , returns? ,
errors? , see_also? , note?)>
<!ATTLIST constant static (yes | no ) #REQUIRED
visibility (private | public | protected ) #REQUIRED >
<!-- ********************* -->
<!ELEMENT error (pclass , name , purpose? , return_value , descr , errors? ,
see_also? , note?)>
<!ATTLIST error visibility (private | public | protected ) #REQUIRED >
<!-- ********************* -->
<!ELEMENT function (name , purpose? , prototype , descr , returns? , errors? ,
see_also? , note?)>
<!ATTLIST function implem (c | b) #REQUIRED
varargs (yes | no ) 'no'
nonames (yes | no ) 'no' >
<!-- ********************* -->
<!ELEMENT prototype (return_value? , param_list?)>
<!ELEMENT pclass (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT purpose (par)>
<!ELEMENT return_value (pclass , aeclass? , aelevel?)>
<!ELEMENT aeclass (#PCDATA)>
<!ELEMENT aelevel (#PCDATA)>
<!ELEMENT param_list (param)+>
<!-- ********************* -->
<!ELEMENT param (pclass , ptarget?, name , default? , aeclass? , aelevel? , descr)>
<!ATTLIST param mandatory (yes | no | undef ) 'undef'>
<!-- ********************* -->
<!ELEMENT ptarget (#PCDATA)>
<!ELEMENT default (#PCDATA)>
<!ELEMENT descr (par | code)+>
<!ELEMENT returns (par | code)+>
<!ELEMENT errors (par | code)+>
<!ELEMENT see_also (par | code)+>
<!ELEMENT note (par | code)+>
<!ELEMENT par (#PCDATA | link | code | inlinecode)*>
<!-- ********************* -->
<!ELEMENT link (#PCDATA)>
<!ATTLIST link linkend CDATA #REQUIRED >
<!-- ********************* -->
<!ELEMENT inlinecode (#PCDATA)>
<!ELEMENT code (#PCDATA)>
una volta completato, il file va copiato in una cartella che abbia per nome il nome della classe di cui fa parte il metodo, proprietà, costante o errore (o il nome «function» se si tratta di una funzione, o il nome della classe stessa se si tratta della pagina di descrizione di una classe). Questa cartella va poi copiata in una delle due seguenti posizioni:
se si tratta di una classe (o funzione) application si deve creare (se non esiste già) una cartella di nome «BfrMan» accanto al file .bfr in cui è stata dichiarata la classe (o funzione) e dentro di essa va posizionata la cartella di cui sopra
si tratta di una classe (o funzione) predefinita la cartella va posizionata nella cartella di nome Man2 in BifernoHome
(se si hanno dubbi sul posizionamento dei file si può comunque eseguire l'operazione da Reference e vedere dove questi vengono automaticamente posizionati).
Questo è un esempio di file di documentazione (il metodo IsDate della classe string):
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE bifdoc SYSTEM "http://www.tabasoft.it/biferno/bfdocdtd/bifdoc.dtd">
<bifdoc>
<method static="no" visibility="public">
<pclass>string</pclass>
<name>IsDate</name>
<purpose><par>Check the string for a
valid date</par></purpose>
<prototype>
<return_value>
<pclass>boolean</pclass>
</return_value>
<param_list>
<param>
<pclass>string</pclass>
<name>format</name>
<descr><par>specifies the expected
order of day, month, year ( the default is the
one defined by the application variable
DATE_FORMAT). A dash (-), a forward slash (/),
or the separator defined in DATE_FORMAT
can be used as
separators.</par></descr>
</param>
</param_list>
</prototype>
<descr><par>The IsDate method of the
string class returns
true if the string has the format of a valid
date</par></descr>
<note><par>Example:
<code>
aDate = "24-10-2001"
check_date = aDate.IsDate("d-m-y") //returns true
check_date = aDate.IsDate("y-m-d") //returns false
</code></par></note>
</method>
</bifdoc>
La seconda linea contiene la dichiarazione di DTD. Il file di DTD è disponibile online sul sito di tabasoft. Reference esegue la validazione ogni volta che una pagina viene modificata (bottone "Modify Man Page" della pagina "Update Man Page") e solo se l'estensione di Biferno xml_bfr è stata caricata all'avvio. Tuttavia, se un utente non è connesso ad Internet può continuare a modificare le pagine, ignorando il messaggio di errore nella validazione ("no DTD found!"). Potrà in seguito controllare la validità dei file risalvandoli più tardi, con una connessione di rete attiva.
![]() | Nota |
|---|---|
Nelle versioni di Biferno precedenti alla 1.1 la dichiarazione di DTD era:
|
I seguenti file sono anche inclusi dalla DTD:
iso-lat1.ent
iso-lat2.ent
iso-num.ent
iso-pub.ent
questo non dovrebbe tuttavia riguardare mai l'utente in quento questi files sono anch'essi presenti nella stessa cartella della DTD: http://www.tabasoft.it/biferno/bfdocdtd
L'ultima sezione di bifernoadmin riguarda la cache dell'applicazione. Il meccanismo di cache è spiegato nel Cap. 22 del manuale del linguaggio: "Gestione della Cache". Cache è utile solo se la variabile application CACHE vale true, cioè se la cache è attiva. In questo caso elenca tutti i file in essa contenuti, come nella figura seguente.
In questa schermata vediamo anche il numero totale dei files («Total pages in Cache») e la dimensione totale di tutti i file («Cache total size», espressa in Kilobytes). E' possibile visualizzare anche alcune grandezze legate ai file stessi e ordinarle in maniera ascendente o discendente.
In particolare è possibile visualizzare le seguenti grandezze:
Current Users: il numero di utenti che, attualmente, stanno eseguendo lo script
Hits: quante volte lo script è stato eseguito
Last Access: la data di ultima esecuzione dello script
Last (ms): il tempo di esecuzione (in millisecondi) richiesto dallo script l'ultima volta che è stato eseguito
Max (ms): il tempo massimo che ha richiesto l'esecuzione dello script (in millisecondi)
Min (ms): il tempo minimo che ha richiesto l'esecuzione dello script (in millisecondi)
Average (ms): il tempo medio che ha richiesto l'esecuzione dello script (in millisecondi)
Total (ms): il tempo totale che hanno richiesto tutte le esecuzione dello script (in millisecondi)
![]() | Nota |
|---|---|
Tutte queste grandezze sono relative all'intervallo di tempo compreso fra l'ultimo reload o flush dell'applicazione e il momento presente, non sono quindi delle reali statistiche ma danno solo un'idea dell'andamento dell'applicazione in un dato momento. |
E' possibile anche esaminare il dettaglio di tutte le grandezze per un determinato file clickando sul nome del file. In questo caso ci viene mostrata una finestra con i dati relativi al singolo file.
E' possibile eseguire un flush totale della cache premendo il bottone «Flush All». Questa operazione è analoga a quella vista in: Sezione 3, «Reload e Flush Cache».
E' anche possibile scaricare dalla cache uno o più file selezionando i file dal bottone nella colonna di destra e premendo il bottone «Flush Checked»
GNU Free Documentation License Version 1.2, November 2002 Copyright (C) 2000,2001,2002 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 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. 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 Back-Cover 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. 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 notices. 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. 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 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.