L'USO DEI MODULI PERL IN IGSUITE (DOCUMENTO SCADUTO) ------------------------------------------------------------------------------ Indice Argomenti 1. Spaghetti Hack 2. Moduli utilizzati in IG 1. Spaghetti Hack I moduli Perl sono come gli ingredienti di un buon piatto. E' possibile combinarli per cucinare portate di ogni tipo, oppure combinarli per creare ulteriori ingredienti, come il sugo di un buon piatto di spaghetti. E come per la preparazione degli spaghetti, possiamo comprare un sugo già pronto, o prepararlo da noi utilizzando tutti gli ingredienti che lo compongono. Fare gli spaghetti con un sugo pronto o con uno preparato da noi ha rispettivi pregi e difetti: nel primo caso utilizzando il sugo già pronto ci possiamo dedicare ad altri aspetti del piatto, concentrando i nostri sforzi sull'obiettivo primario che rimane "servire un piatto di spaghetti". Inoltre possiamo affidare la cottura degli spaghetti anche ad altri cuochi che conoscendo il sugo ne faranno lo stesso uso che ne faremmo noi. Quando invece decidiamo di non usare un sugo già pronto, subentrano maggiori difficoltà per le quali però occorre prendere in considerazione i seguenti aspetti: * Il sugo che useremo se pur comprato (e quindi utilizzato da tantissime persone) sarà buono ? * Ammettendo che il sugo sia buono, perché non provarne una variante visto che TMTOWTDI ? * I sughi pronti hanno ingredienti all'interno che non possiamo togliere. Magari proprio quegli ingredienti che in genere non riusciamo a digerire e che rendono il sugo pesante. Tutto questo, porta inevitabilmente a dedurre che entrambi i metodi sono validi, ma che si adattano meglio in relazione alla problematica che dobbiamo affrontare. E allora quando l'uno e quando l'altro? Sicuramente sceglieremo di cucinare il nostro sugo quando: * vogliamo ottenere un prodotto su misura che meglio si adatti al tipo di pasta; * vogliamo che sia digeribile e quindi leggero anche al costo di una preparazione più lunga; * vogliamo essere pronti a situazioni in cui il sugo pronto non è disponibile Quest'ultima considerazione ci deve far riflettere su un aspetto. Se mai impariamo a cucinare il sugo, il giorno che troveremo il supermercato chiuso, potremmo trovarci veramente in mezzo ai guai! C'è poi una terza possibilità, e cioè quella di utilizzare un sugo pronto, ma di aggiungere qualche spezia per insaporirlo a nostro gusto. In IG sono state adottate tutte le soluzioni sopra esposte, abbiamo utilizzato moduli di CPAN lasciandoli inalterati, abbiamo preso moduli da CPAN e li abbiamo leggermente modificati affinchè fossero adatti ai nostri scopi, ed infine abbiamo scritto alcuni moduli from scratch, prestando particolare importanza per ognuna delle soluzioni adottate ai seguenti obiettivi: * Prestazioni * Portabilità * Facilità di installazione Purtroppo non tutti i moduli Perl in CPAN offrono tali caratteristiche. Ci sono moduli pesantissimi che inglobano centinaia di metodi e per i quali la maggior parte delle volte ci si trova ad usare il 5% delle features. Ci sono moduli che non funzionano su tutte le piattaforme supportate da Perl, ed infine ci sono moduli scritti in C che per essere installati, necessitano di una compilazione che inevitabilmente intacca la facilità di installazione da parte dell'utente. Come fare quindi per garantire Prestazioni, Portabilità e facilità di installazione pur utilizzando i moduli. Semplicemente facendo delle scelte caso per caso. Adottando l'una o l'altra soluzione a seconda della problematica da affrontare. E' chiaro che nel tempo tali scelte possono variare. Potrebbero uscire moduli che risolvono meglio una problematica, ad esempio meglio di come la si era risolta in precedenza con una delle tre soluzioni. Per questo motivo, si è scelto in molti casi di wrappare metodi forniti da moduli esterni, attraverso metodi forniti da IG.pm il Core module del Framework di IGSuite. A titolo d'esempio le chiamate a CGI.pm per leggere i parametri dai form sono Wrappate dal metodo IG::ReadParam (non lasciarsi ingannare dal nome) oppure le chiamate ai moduli per interfacciarsi agli RDBM sono wrappate dal metodo IG::DbQuery. In questo modo se nel tempo viene sviluppato un nuovo modulo più veloce ad esempio di CGI.pm basterà modificare IG.pm lasciando invariate tutte le applicazioni che ne fanno uso. Ovviamente quella esposta non è una regola generale ed è stata applicata in genere (CGI ne è l'eccezione) solo per i moduli non Core del Perl ma soprattutto per moduli a carattere ed uso generale. Sono invece i moduli Core del Perl che offrono tutte le caratteristiche sopra esposte e che vengono usati in IGSuite senza limiti. Per concludere, ci sono moduli non core scritti in Pure Perl, che si è preferito distribuire unbundle con il pacchetto di IGSuite. Oltre a semplificare la vita dell'utente che vuole installare IGSuite, si ha la certezza che la versione del modulo che sta utilizzando IGSuite in quel momento è in linea con il resto del progetto. Per quest'ultima tipologia di moduli, non volendo comunque alterare le librerie dell'utente, si è creato un namespace apposito IG:: (nell'omonima directory) che contiene tutti i moduli non Core scritti in Pure Perl. 2. Moduli utilizzati in IG !Modulo !! Provenienza !! Modalità d'Uso Uso |CGI::Simple || Non Core || Wrappato in IG.pm Accesso ai parametri dei form e ai Cookies |Carp || Core || Wrappato in IG.pm Gestione warning e die messages |Config || Core || Utilizzo diretto Utilizzato nell'installazione e nello script di autoaggiornamento del sistema |DBI/DBD/Pg || Non Core || Wrappato in IG.pm Accesso al RDBM |Digest::MD5 || Core || Utilizzo diretto IGWebMail |Fnctl || Core || Wrappato in IG.pm Utilizzato per flock |HTML::Entities || Core || Wrappato in IG.pm Encode HTML Entities |IG || Non Core || IG Core Module Definisce il framework di IG |IG::MimeBase64 || Non Core || Utilizzo diretto IGWiki IGWebMail |IG::MimeWords || Non Core || Utilizzo diretto IGWiki IGWebMail |IG::AlgorithmDiff || Non Core || Utilizzo diretto IGWiki |IG::Hylafax || IG Module|| Utilizzo diretto IGFax |IG::FileMMagic || Non Core || Utilizzo diretto IGFileManager IGWebMail |IG::Mydes.pm || IG Module|| Utilizzo diretto IGWiki |IG::MailPop3Client || Non Core || Utilizzo diretto IGWebMail |IG::QuotedPrint|| Non Core || Utilizzo diretto IGWebMail |IG::MailSendmail || Non Core || Utilizzo diretto IGWebMail |IG::Thumbnails || IG Module|| Utilizzo diretto IGFax IGFileManager IGArchive |IG::URI || Non Core || Utilizzo diretto IGWiki |IG::WikiFormat || IG Module|| Utilizzo diretto IGWiki |Lwp::Simple || Non Core || Utilizzo diretto isogestd |IG::SpreadsheetWriteExcel|| Non Core || Wrappato in IG.pm Export di dati in file Excel |Text::Wrap || Core || Utilizzo diretto IGWiki |Time::Local || Core || Utilizzo diretto checkmsg