Approfondimenti
di Michael J. Hammel traduzione di Antonio Cartelli

Come gestire gli script Perl mediante l'uso di 'require' - continuo

A questo punto si sa come realizzare una subroutine e come includerla nei propri script cgi Perl.  In che modo, però, quanto detto ha a che fare con la possibilità di realizzare del codice HTML da condividere tra più pagine? È abbastanza semplice.  Assegnando innanzitutto i costrutti HTML ed ogni informazione relativa ai database a delle variabili globali, utilizzando poi tali variabili nelle pagine principali, nei punti in cui si vuole che le informazioni compaiano. A titolo di esempio supponiamo che si voglia includere uno striscione promozionale all'inizio di tutte le pagine:  si può allora scrivere un piccolo modulo che realizza una tabella per questo oggetto aggiuntivo, la centra nella pagina e le assegna la variabile globale $adbanner.  Alla fine si otterrà qualcosa di molto simile a quanto riportato di seguito: Poiché l'inclusione di una funzione Perl all'interno di un'altra, soprattutto quando si utilizzano le funzioni di CGI.pm, è prassi molto diffusa, per mia abitudine tendo ad allineare le parentesi chiuse in modo da tenere conto delle funzioni che sono state chiuse. Si noti che in questo esempio la funzione img() (che provvede a scrivere il tag HTML di tipo IMG) è argomento della funzione a() (che assegna un collegamento ipertestuale all'immagine), che a sua volta è argomento della funzione td(). Tale moltitudine di annidamenti diventa ancora più defatigante allorché si utilizzano le funzioni di tabella di CGI.pm (table(), Tr(), td()) per allineare gli elementi delle proprie pagine HTML. È per questo motivo che diventa conveniente utilizzare variabili cui assegnare i costrutti Tr() e td() per poi referenziarle direttamente all'interno dei costrutti table(). Un risultato immediato consiste nella maggiore leggibilità del codice, ma, cosa ancor più importante, si può creare una lista dei costrutti td() da inserire in un costrutto tr() semplicemente riportando l'elenco delle variabili utilizzate.

Se ora includiamo il modulo realizzato nel nostro script principale potremo avere in uscita, quando vorremo, la tabella che abbiamo creato:

Con quanto precede abbiamo mandato in uscita oltre alla striscia promozionale anche un'ulteriore tabella con informazioni aggiuntive per quella pagina.  Le variabili $news_table, $nav_bar, $book_table e $qd_table contengono buona parte del codice che non viene visualizzato qui, potrebbero contenere addirittura dei moduli esterni, così come accaduto per $adbanner.

Quest'ultima parte di codice è proprio quella che sto scrivendo per il mio sito della Musa della Grafica. Ho creato una tabella comune a tutte le pagine (la tabella prodotta a seguito della $adbanner dell'ultimo esempio) e dei moduli per l'assegnazione di codice HTML e dati alle varie $news_table, $nav_bar e $book_table. In tal modo ogni script CGI va a finire nella variabile $qd_table con dei dati specifici per la pagina da produrre e posso apportare ogni tipo di modifica al modo in cui tali dati vengono visualizzati all'interno della tabella stessa, ad esempio posso modificare news_table lavorando su un solo script. La gestione del sito diventa ancora più semplice rispetto a quando si devono modificare tutti gli script al presentarsi dell'esigenza di dover effettuare un singolo cambiamento in news_table; per di più non tedio coloro che vengono a vedere le mie pagine con l'utilizzo di frame.

Nel poco tempo durante il quale ho utilizzato il Perl è cresciuta in me l'ammirazione per la sua sofisticazione e la sua semplicità. Cose che dovrebbero essere semplici da realizzare risultano effettivamente semplici. Pacchetti addizionali quali CGI.pm ed Msql mi hanno consentito di integrare nel mio sito Web elementi Perl in un lampo. Sono riuscito a ricostruire ex-novo il mio sito in meno di due settimane e senza utilizzare appieno tutto ciò che il Perl mi consente di fare. Se si gestisce un sito Web e si ha accesso ad un'area cgi si dovrebbe prendere seriamente in considerazione la possibilità di apprendere il Perl, CGI.pm e un gestore di database tra quelli che il Perl supporta.
 
indent

 Divertirsi con Qbist

Uno dei plug-in del Gimp più interessanti è Qbist, scritto da Jens Ch. Restemeier e basato su un algoritmo di Jörn Loviscach che è apparso sul periodico c't nell'Ottobre del 1995.  Ho dedicato un bel po' di tempo a giocherellare con questo plug-in per creare sfondi, per logo e altre immagini ed ho potuto appurare che il filtro è abbastanza facile da utilizzare. Il "dialogo" col plug-in è costituito da un insieme di 9 finestre con relative immagini d'anteprima, cliccando su una di queste l'intero insieme viene aggiornato con nuove immagini mentre quella cliccata viene evidenziata come la nuova anteprima. In effetti l'immagine centrale viene utilizzata come base per generare le altre immagini d'anteprima. Volendo si può generare un insieme d'immagini d'anteprima piuttosto simili a quella di base cliccando sull'immagine mediana; nella maggior parte dei casi almeno una delle immagini generate sarà significativamente diversa da quella di base. Scegliendo un'altra immagine normalmente verranno generate immagini piuttosto differenti anche se ciò non è sempre garantito.

 
 
L'algoritmo è abbastanza casuale da far sì che sia possibile che a partire da un'immagine di base si possano avere oltre ad immagini completamente differenti da essa, anche immagini che siano quasi identiche. Da un punto di vista prettamente creativo trovo la cosa piuttosto interessante e, a volte, quando sono stanco di scrivere codice o testi, metto su questo filtro e divento "creativo". Le rappresentazioni (in gergo retini) che si ottengono sono il top della casualità con quel tanto di geometria riconoscibile da far dire "No, questo non è proprio quello giusto, ma quasi".  Il problema, ovviamente, è che consente di dirlo all'infinito o almeno fintanto che, molto dopo che sia trascorsa la mezzanotte, ci si rende conto che è rimasto soltanto il tempo di una tazza di caffè e di una lavata di faccia prima di andare al lavoro. È questo però il tipo di creatività con cui ho dovuto fare i conti fin da quando ho messo per la prima volta le mani su un PC per scrivere un programma (va bene, si trattava di un TRS-80, ma il senso dovrebbe essere chiaro) e devo dire che il rinnovarsi di queste sensazioni è sempre inebriante.

Una volta che si sia selezionato lo scenario che si vuole utilizzare per la propria immagine, ci si assicuri che sia stato selezionato e che venga visualizzato come scenario di base, se lo si vuole si può procedere ad aggiungerlo allo strato corrente della immagine su cui si sta lavorando premendo OK.
Qbist provvederà a riempire l'intero strato, o soltanto la zona selezionata, con una versione opportunamente dimensionata dello scenario prescelto. Si badi che non essendo previste, da parte di Qbist, modalità di mescolamento delle immagini, lo strato o l'area selezionata saranno completamente sovrascritti dal retino generato da Qbist.  Cose realmente interessanti e degne di attenzione sono: essere in grado di creare selezioni che non si sovrappongano agli oggetti geometrici esistenti, saper creare ombre spostate a partire dagli oggetti selezionati e riuscire a mettere in un stato di attesa immagini o testo che si trovino tra i vari strati.
 

Controindicazioni e limitazioni

Sebbene questo filtro mi piaccia molto devo dire che ha alcune controindicazioni.  Innanzitutto all'apertura della finestra di dialogo non sempre accade di ritrovare i medesimi scenari lasciati l'ultima volta che si è aperta la finestra stessa, anche se l'immagine di base è sempre la stessa.  Sarrebbe stato utile oltre che divertente avere lo stesso insieme di immagini fino a quando non si fosse individuato un nuovo scenario da utilizzare nella sessione Qbist corrente dopo aver selezionato l'immagine di base di lavoro. Sfortunatamente ciò è impossibile perché il dialogo col programma si interrompe dopo aver premuto il tasto OK. Si può anche cercare di salvare l'immagine di base ma il suo caricamento al riavvio del dialogo ha lo stesso identico effetto - le rimanenti immagini d'anteprima sono casuali e non è affatto detto che siano le stesse che sono state visualizzate grazie all'immagine di base selezionata.

Un ulteriore problema viene dal fatto che le opzioni Save/Load (salva/carica) non fanno rierimento ad un'area specifica di Qbist.  Ci sono diversi plug-in per far sì che i file salvati all'interno di varie aree finiscano nell'area $HOME/.gimp.  Non dovrebbe essere difficile far in modo che Qbist faccia lo stesso, apportando al software le dovute modifiche. Dovrebbe bastare guardarsi intorno ed individuare i programmi necessari.

Se guardiamo al codice, poi, un breve esame dei sorgenti di Qbist fa scoprire valori precodificati utilizzati in più parti, che sembrano proprio dei parametri che l'utente si aspetterebbe di poter configurare. Mi aspetterei allora che l'interfaccia possa essere estesa a comprendere la possibilità di modificarli. Mi riservo di provare a fare qualche esperimento al più presto per vedere in che modo i cambiamenti apportati ai parametri influenzano le immagini che Qbist è in grado di generare. Poiché non ho molta familiarità con l'algoritmo non mi è chiaro se questi valori sono specifici e necessari o se sono soltanto dei buoni valori iniziali. Altra opzione che ritengo utile selezionare da parte dell'utente è l'insieme dei colori da cui Qbist deve partire nel processo di rappresentazione dei retini. Al momento Qbist sceglie i colori in maniera autonoma, senza che l'utente possa immettere nulla.

Per finire, l'aspetto probabilmente più antipatico dell'attuale versione di Qbist è l'impossibilità di procedere ad alcun tipo di sovrapposizione delle immagini. A me, in modo particolare, sarebbe piaciuto poter prendere un retino prodotto da Qbist, selezionare un'ulteriore immagine prodotta dallo stesso software e sovrapporla mescolandola ad un angolo di quella iniziale. Certo, posso ottenere lo stesso effetto ricorrendo all'utilizzo di molteplici strati diversi ma sarebbe molto più conveniente riuscire ad ottenere questo risultato dall'interno di Qbist medesimo.  Qbist riesce a rappresentare i suoi retini in maniera abbastanza veloce, siano essi immagini in anteprima o la finestra dell'immagine definitiva, per cui ritengo che eventuali cambiamenti alla struttura del software, nella direzione auspicata, non facciano degradare in maniera significativa le prestazioni del programma.

Qbist è un filtro abbastanza divertente che come molti dei filtri di rappresentazione immagini a menu dà all'utente la possibilità di esplorare i meandri della propria creatività. Consentendo di muoversi a piacimento all'interno di una collezione casuale di retini consente di giocare con il computer in modo che il gioco sia sempre diverso. Sebbene il controllo dei retini sia piuttosto limitato ciò che il programma è in grado di generare è abbastanza affascinante da rendere Qbist un filtro meritevole di essere esplorato in dettaglio. exploring.


[ La pagina della Musa ] [ Indice ]


Per l'articolo originale: © 1998 Michael J. Hammel - Pubblicato sul n. 32 della Linux Gazette
Per l'edizione italiana: © 1998 A. Cartelli - Pubblicato sul n. 8 anno II di LGEI a cura di un gruppo di volontari