Italian Translation: Fabio Zanotti
Copyright © 2002, 2003 Apache Software Foundation
Sommario
Questo documento è anche disponibile nelle seguenti lingue: Inglese, Russo
Questo documento è basato sulla versione 1.27 dell'originale in inglese.
Apache Rivet è un sistema per la creazione di contenuti web dinamici mediante un linguaggio di programmazione integrato con il Web Server Apache . È progettato per essere veloce, potente ed estensibile, utilizza poche risorse, è facile da imparare e fornisce all'utente una piattaforma che può pure essere utilizzata con altri programmi per lavori da eseguire fuori dal web (GUI, compiti di amministrazione di sistema, elaboratori di testo, gestori di database, XML e così via). Per ottenere questi risultati, è stato scelto il linguaggio di programmazione Tcl da utilizzare unitamente al Web Server Apache.
Con questo manuale aspiriamo ad aiutarvi ad iniziare ed a farvi scrivere codice di produzione il più velocemente possibile, dandovi un'idea di come ottenere grandi vantaggi dall'architettura Rivet, finalizzati alla realizzazione di diverse tipologie di siti web.
Questa documentazione è un lavoro in corso e, come ogni cosa riguardante Apache Rivet, è Software Libero. Se vedete qualche sezione che necessita di miglioramenti ed avete idee o suggerimenti al riguardo, non esitate a farcelo sapere. Se volete contribuire direttamente, meglio ancora!
Verifica delle dipendenze
Per installare Rivet, avete bisogno di Tcl 8.2 o superiore e Apache 1.3.xx. Può essere eseguito su Linux, FreeBSD, OpenBSD, Solaris e HPUX. È possibile utilizzarlo anche in Windows NT (per cortesia verificate le indicazioni nella distribuzione).
Procurarsi Rivet
Si possono scaricare i sorgenti di Rivet da http://tcl.apache.org/rivet/download. Attualmente è il solo modo per ottenere Rivet. In futuro, contiamo di distribuirlo anche direttamente nei formati utilizzati da FreeBSD, Debian, Red Hat e windows.
Procurarsi ed installare i sorgenti Apache
Rivet necessita di alcuni file include (.h) per essere costruito. Il modo più facile per ottenerli, è scaricare il codice sorgente dal server web di Apache, sebbene alcuni sistemi (Debian GNU/Linux per esempio) rendano disponibili per per l'installazione i file header ed altri file di sviluppo. Se intendete costruire Rivet staticamente (compilandolo nel server web Apache, invece di caricarlo dinamicamente), chiaramente necessitate dei sorgenti. Raccomandiamo di costruire Rivet con una libreria caricabile condivisa, per avere la massima flessibilità.
Il codice sorgente del server web Apache può essere reperito al seguente link: http://httpd.apache.org/.
Decomprimere i sorgenti
Assumiamo, a questo punto, che abbiate installato Apache. Dovrete decomprimere i sorgenti di Rivet nella directory dove vorrete compilarli.
gunzip tcl-rivet-X.X.X.tar.gz tar -xvf tcl-rivet-X.X.X.tar.gz
Compilare Rivet
Rivet usa un unico sistema di compilazione che abbiamo creato espressamente per questo progetto. Utilizza le informazioni incluse in Apache e Tcl, considerando le loro configurazioni, al fine di compilarlo tramite una serie di script Tcl, che sono ubicati nella directory buildscripts/.
Modificare src/make.tcl
Potrebbe essere necessario modificare a mano src/make.tcl, al fine di impostare alcune opzioni. Per prima cosa provate la prossima istruzione e vedete se ha successo.
A questo punto, siete pronti ad eseguire la compilazione del sistema:
cd src/ ./make.tcl option
dove option può essere shared (condivisa) o static (statica).
Installazione
Adesso siamo pronti ad eseguire il comando ./make.tcl install per installare i file risultanti. Questo dovrebbe copiare gli oggetti condivisi (come mod_rivet.so, se è stato creato con successo) nella directory di Apache libexec, come pure installare alcuni script di supporto e codice vario.
File di configurazione di Apache
Rivet è relativamente facile da configurare, cominceremo aggiungendogli il modulo:
LoadModule rivet_module /usr/lib/apache/1.3/ mod_rivet.so
Questo informa Apache che deve caricare l'oggetto condiviso Rivet, in qualsiasi parte esso risieda sul vostro file system. Ora abbiamo informato Apache su quali file sono del tipo "Rivet" e come elaborarli:
AddType application/x-httpd-rivet .rvt AddType application/x-rivet-tcl .tcl
Questo informa Apache di elaborare i file con le estensioni .rvt e .tcl come file Rivet.
Per altre direttive che Rivet fornisce per la configurazione di Apache, per cortesia, vedete la sezione chiamata “Direttive di Apache”.
Queste direttive sono utilizzate con i file di configurazione del server httpd di Apache per modificare il comportamento di Apache Rivet. Vi sono delle precedenze, come segue: RivetDirConf, RivetUserConf, RivetServerConf, questo significa che DirConf non terrà conto di UserConf, il quale a sua volta non terrà conto di ServerConf.
RivetServerConf GlobalInitScript "source /var/www/ foobar.tcl"
![]() | Nota |
---|---|
Questo codice è valutato globalmente e non all'interno del namespace di dove le pagine sono elaborate. |
makeurl /tclp.gifrestituisce http://[hostname]:[port]/tclp.gif. Dove hostname e port sono il nome dell'host e la porta del server in questione.
Seguono alcuni esempi sull'uso di Rivet. Si presuppone che conosciate, anche parzialmente, il linguaggio di programmazione Tcl. Se non conoscete molto Tcl, non c'è da preoccuparsi: è semplice e vi sono alcune buone risorse disponibili sul web che vi permetteranno di padroneggiarlo velocemente. A questo proposito, vedete la sezione web sites.
Esempio 1. Hello World
Come qualsiasi altro tool, è piacevole vedere qualcosa al lavoro, così andremo a creare una piccola pagina "Hello World".
Assumendo che sia stato configurato correttamente Apache, create un file chiamato hello.rvt in una directory dove Apache lo possa trovare, con il seguente contenuto:
<? puts "Hello World" ?>
Se poi vi accederete con vostro browser, sarà possibile vedere una pagina nera con il testo "Hello World" (senza apici).
Esempio 2. Generare una tabella
In un'altro semplice esempio, genereremo dinamicamente una tabella:
<? puts "<table>\n" for {set i 1} { $i <= 8 } {incr i} { puts "<tr>\n" for {set j 1} {$j <= 8} {incr j} { set num [ expr $i * $j * 4 - 1] puts [ format "<td bgcolor=\"%02x%02x%02x\" > $num $num $num </td>\n" \ $num $num $num ] } puts "</tr>\n" } puts "</table>\n" ?>
Se leggete il codice, è possibile vedere che è puro Tcl. È possibile mantenere lo stesso codice, eseguirlo fuori da Rivet e generare la stessa pagina HTML!
Il risultato sarà qualcosa di simile a questo:
Esempio 3. Accesso alle variabili
In questa sezione mostreremo come accedere alle variabili utilizzando gli operatori GET o POST.
Data una form HTML come la seguente:
<form action="vars.rvt"> <table> <tbody> <tr> <td><b>Title:</b></td> <td><input name="title"></td> </tr> <tr> <td><b>Salary:</b></td> <td><input name="salary"></td> </tr> <tr> <td><b>Boss:</b></td> <td><input name="boss"></td></tr> <tr> <td><b>Skills:</b></td> <td> <select name="skills" multiple="multiple"> <option>c</option> <option>java</option> <option>Tcl</option> <option>Perl</option> </select> </td> </tr> <tr> <td><input type="submit"></td> </tr> </tbody> </table> </form>
Potete utilizzare questo script di Rivet per ottenere i valori delle variabili:
<? set errlist {} if { [var exists title] } { set title [var get title] } else { set errlist "You need to enter a title" } if { [var exists salary] } { set salary [var get salary] if { ! [string is digit $salary] } { lappend errlist "Salary must be a number" } } else { lappend errlist "You need to enter a salary" } if { [var exists boss] } { set boss [var get boss] } else { set boss "Mr. Burns" } if { [var exists skills] } { set skills [var list skills] } else { lappend errlist "You need to enter some skills" } if { [llength $errlist] != 0 } { foreach err $errlist { puts "<b> $err </b>" } } else { puts "Thanks for the information!" ?> <table> <tbody> <tr> <td><b>Title:</b></td> <td><? puts $title ?></td> </tr> <tr> <td><b>Boss:</b></td> <td><? puts $boss ?></td> </tr> <tr> <td><b>Salary:</b></td> <td><? puts $salary ?></td> </tr> <tr> <td><b>Skills:</b></td> <td><? puts $skills ?></td> </tr> </tbody> </table> <? } ?>
La prima istruzione si assicura che la variabile boss sia passata allo script e poi fa qualcosa con quella informazione. Se non è presente, un errore viene aggiunto alla lista degli errori.
Nel secondo blocco del codice, la variabile salary è riportata con un'altro errore di controllo, poiché è un numero, è necessario che sia composto da cifre.
Alla variabile boss non è richiesto di essere inviata, la setteremo a "Mr. Burns" se non è tra le informazioni ricevute.
L'ultimo pezzo del codice di gestione delle variabili è un pezzo ingannatore perché skills è una listbox e può avere, potenzialmente, valori multipli. Opteremo di riceverla come una lista, in modo da poterla riutilizzare.
Lo script si assicura che la variabile errlist sia vuota e restituisce un messaggio di ringraziamento. Se errlist non è vuota, viene stampata la lista degli errori riscontrati.
Esempio 4. Caricare file
Il seguente HTML in un file, detto, upload.html
<form action="foo.rvt" enctype="multipart/form-data" method="post"> <input type="file" name="MyUpload"></input> <input type="submit" value="Send File"></input> </form>
Può essere usato con il seguente codice Tcl in un secondo file (upload.rvt per esempio) per creare una form che carica un file.
<? upload save MyUpload /tmp/uploadfiles/file1 puts "Saved file [upload filename MyUpload] \ ([upload size MyUpload] bytes) to server" ?>
In aggiunta al nucleo del modulo Apache, Rivet fornisce un numero di pacchetti Tcl che includono codice potenzialmente utile.
Se non avete trovato la soluzione al problema nella documentazione, la mailing list di Rivet è il primo posto da visitare per ottenere aiuto; spedite un'email a <rivet-user@tcl.apache.org>. Se avete una domanda, un'idea, o un commento circa il codice di Rivet, per cortesia mandate un'email a <rivet-dev@tcl.apache.org>. Per iscriversi ad entrambe le liste, mandate un'email a <rivet-list-subscribe@tcl.apache.org>.
Gli archivi delle mailing list sono disponibili a questo indirizzo: http://nagoya.apache.org/eyebrowse/SummarizeList?listId=118
Il newsgroup news:comp.lang.tcl è un buon posto per porre domande circa Tcl in generale. Gli sviluppatori di Rivet seguono anche il newsgroup, ma è meglio porre domande specifiche su Rivet presso la sua mailing list.
Ci sono diversi siti web che estensivamente trattano di Apache e Tcl.
Apache Rivet usa il sistema Apache Bug Tracking presso http://nagoya.apache.org/bugzilla/. Qui è possibile segnalare problemi o verificare se sono già conosciuti e quindi rintracciare pubblicazioni che lo descrivono.
Questa sezione facilmente pare sorpassata, come nuovo codice viene aggiunto, vecchio codice viene rimosso e di conseguenza vengono apportati i relativi cambiamenti. Il miglior posto dove poter verificare se sono state inserite nuove funzionalità è il suo codice sorgente. Se siete interessati ai cambiamenti osservate il FIXME.
Quando Apache è attivo, (o quando i processi figli di Apache sono attivi se un processo Tcl è in uso), Rivet_InitTclStuff viene chiamata, creando un nuovo interprete, o un interprete per host virtuale, dipendentemente dalla configurazione. Inoltre inizializza varie cose, come il canale di sistema RivetChan, crea i comandi Tcl specifici di Rivet ed esegue init.tcl. Il sistema di caching è anch'esso impostato e se c'è un GlobalInitScript, viene eseguito.
Il sistema RivetChan fu creato al fine di avere un canale Tcl reale che potesse redirigere lo standard output. Questo permette di usare, per esempio, il comando normale puts nelle pagine .rvt. Lavora creando un canale che bufferizza l'output e, a tempi predeterminati, lo passa al sistema IO di Apache. Il normale standard output di Tcl è rimpiazzato con un'istanza di questo tipo di canale, in modo che, predefinitamente, l'output venga inviato alla pagina web.
Quando una pagina Rivet viene richiesta, è trasformata in un normale script Tcl tramite l'analisi nel file delle etichette di elaborazione delle istruzioni <? ?>. Ogni cosa fuori da queste etichette diviene un'istruzione estesa puts ed ogni cosa dentro rimane codice Tcl.
Ogni file .rvt è valutato nel proprio ::request namespace, in modo che non sia necessario creare e distruggere gli interpreti dopo ogni pagina. Tuttavia, operando nel proprio namespace, ogni pagina non verrà eseguita sporcando le variabili locali create da altri scripts, perché verranno cancellate automaticamente quando il namespace termina, dopo che Apache ha finito di gestire le richieste.
![]() | Nota |
---|---|
Un problema corrente con questo sistema è che, mentre le variabili usano la garbage collection, e quindi vengono distrutte automaticamente quando non sono più usate, i gestori dei file non lo sono: è molto importante quindi che gli autori di script Rivet si assicurino di chiudere tutti i file che hanno aperto. |
Dopo che uno script è stato caricato ed analizzato dentro una form di "puro Tcl", viene pure immagazzinato, affinché possa essere utilizzato in futuro senza ricaricarlo (e rianalizzarlo) da disco. Il numero degli script immagazzinati in memoria è configurabile. Questa caratteristica può significativamente migliorare l'esecuzione.
Rivet ha rotto con il passato, in quanto noi, gli autori, ci siamo dedicati ad acquisire ciò che preferivamo dalle nostre passate fatiche e tolto o cambiato ciò che non abbiamo più curato. La compatibilità all'indietro non fu un obiettivo primario quando creammo Rivet, ma abbiamo fornito questa informazione che potrebbere essere utilizzata da chi desideri effettuare l'aggiornamento da installazioni mod_dtcl o NWS.
Rivet era originalmente basato su codice dtcl, ma ne è stata cambiata (migliorata !) una parte. I concetti rimangono gli stessi, ma alcuni dei comandi sono cambiati.