Sei sulla pagina 1di 68

I N O F F E R TA V B J 6 8

Scrivi a
Access Hacks Tips & COM and .NET
Tools for Wrangling Your book@infomedia.it Interoperability
Data specificando di A. Troelsen
di K. Bluttman
nell’oggetto della
O’ Reilly
e-mail: Apress
ISBN 0596009240
352 pp - 28,00 €
IN OFFERTA ISBN 1590590112
770 pp - 64,15 €
VBJ n. 68
OPPURE
inviaci il coupon
Programmare Microsoft Learning by Doing:
Access 2003 sottostante A Comprehensive Guide to Simu-
lations, Computer Games, and
di R. Dobson al numero di fax Pedagogy in e-Learning and Other
Educational Experiences
0587/732232 C. Aldrich

Mondadori Informatica Potrai acquistare John Wiley


ISBN 8804528907 ISBN 0787977357
896 pp - 75,00 €
i libri qui riportati con 400 pp - 60,80 €
uno
SCONTO
Building the Data
ECCEZIONALE Automating Microsoft
Warehouse, 4th Edition Access with VBA
di W. H. Inmon del 10% anche se di M. Gunderloy
acquisti solo un e S. Harkins

libro
John Wiley Que
ISBN 0764599445 OPPURE ISBN 0789732440
543 pp - 52,90 € 408 pp - 38,95 €
del 20% se acquisti
3 libri

VBJ 68
online.infomedia.it
n. 68 - marzo/aprile 2006
bimestrale - anno dodicesimo

Direttore Responsabile
Marialetizia Mari (mmari@infomedia.it)
Direttore Esecutivo
ED I T O R I A L E
Francesco Balena (fbalena@infomedia.it)
Managing Editor
Renzo Boni (rboni@infomedia.it)
La migrazione della
Collaboratori
Gionata Aladino Canova
Stefano Corti
applicazioni “legacy”
Daniele De Pedis

I
Raffaele Di Natale n questo periodo sto analizzando più da vicino il processo
Fabio Perrone
Stefano Savo di migrazione delle applicazioni VB6 verso il mondo .NET.
Scott Swigart Devo confessare che in questi anni mi sono concentrato
Fabio Testa
Lorenzo Vandoni soprattutto sulle enormi potenzialità di VB.NET, senza prestare
molta attenzione ai problemi posti dal processo di migrazione.
Per mia fortuna, infatti, non ho avuto la sfortuna di dover
migrare molte delle mie applicazioni, e quelle poche che ho
effettivamente dovuto portare in VB.NET le ho riscritte da zero,
per approfittare delle nuove feature di scalabilità di ADO.NET
o della potenza dei nuovi controlli di Windows Forms. Per mia fortuna si trattava
Direzione di applicazioni relativamente piccole, scritte per giunta con uno stile molto object-
Natale Fino (nfino@infomedia.it)
oriented, quindi la traduzione è stata relativamente semplice. Ma è stato comunque
Marketing & Advertising
un lavoro duro, perchè ho preferito fare tutto a mano e stare lontano dal wizard
Segreteria: 0587/736460
marketing@infomedia.it Artinsoft, quello incluso gratuitamente in Visual Studio.
Amministrazione
Sara Mattei Purtroppo il mio approccio al problema non è di fatto applicabile in molti casi, e
(amministrazione@infomedia.it)
sicuramente non è applicabile al progetto su cui sto lavorando al momento, che
Grafica consta di molte migliaia di righe di codice e che è frutto di numerosi anni-uomo di
Manola Greco (mgreco@infomedia.it)
lavoro. Di certo non è semplice effettuare una migrazione manuale di “mostri” di
Technical Book
Lisa Vanni (book@infomedia.it) questo tipo, che spesso non sono neanche scritti in modo ordinato e con stile OOP.
Senza contare che per effettuare una migrazione corretta occorre conoscere davvero
Segreteria
Enrica Nassi bene le tante sottili differenze tra i due linguaggi, differenze che spesso si traducono
(info@infomedia.it) in bug davvero insidiosi.

Stampa Per farla breve, da un po’ di tempo sto lavorando a un wizard di migrazione da VB6
TIPOLITOGRAFIA PETRUZZI a VB.NET che funzioni in modo sensibilmente migliore di quello incluso in Visual
Citta’ di Castello (PG)
Studio. Sono ancora in una fase di “alfa test”, ma i risultati sono decisamente in-
Ufficio Abbonamenti coraggianti. Il mio wizard è già in grado di gestire correttamente costrutti normal-
Tel. 0587/736460 - Fax 0587/732232 mente considerati “intraducibili” come i Gosub (calcolati e non), gli array con indice
e-mail: abbonamenti@infomedia.it
inferiore qualsiasi, i controlli Line, Shape, e Data control (con relativo binding), i
www.infomedia.it
menu popup, la creazione dinamica di controlli, e un sacco di altra roba. Chi fosse
Gruppo Editoriale Infomedia srl
Via Valdera P., 116 - 56038 Ponsacco (PI) Italia interessato può tenersi aggiornato sugli sviluppi di questo progetto e fornire consigli
Tel. 0587/736460 - Fax 0587/732232 e suggerimenti sul mio blog.
red_vbj@infomedia.it
Sito Web www.infomedia.it
Francesco Balena
fbalena@codearchitects.com
Manoscritti e foto originali anche se non pubblicati,
non si restituiscono. È vietata la riproduzione
anche parziale di testi e immagini.

Si prega di inviare i comunicati stampa e gli inviti stampa per


la redazione all’indirizzo: comunicatistampa@infomedia.it
Visual Basic Journal è una rivista di
Gruppo Editoriale Infomedia S.r.l. Via Valdera P, 116 Ponsacco - Pisa.
Registrazione presso il Tribunale di Pisa n. 20/1999
N. 68 - Marzo/Aprile 2006 VBJ 7
SOMMARIO
M A R Z O / A P R I L E

N.68 Editoriale
RUBRICHE

7
.NET Tools 60
SPECIALE
Progettazione di sistemi di Data Warehouse 10
Le linee guida per la comprensione e la progettazione dei sistemi di Data Warehouse
di Fabio Testa

VB6
Introduzione alla computer simulation 17
Un breve viaggio nel mondo della simulazione, di cui analizzeremo le possibilità, le tecniche di programmazione e
faremo esperienza con alcuni esempi in VB6.
di Daniele De Pedis

File compatti e illeggibili: Compressione (seconda puntata) 24


Crittografia e compressione di file in VB6 utilizzando il Microsoft .NET Framework
di Scott Swigart, Swigart Consulting LLC

ACCESS
Creare Add-in per VBE in Microsoft Access 30
Utilizzare strumenti che svolgono per noi i compiti ripetitivi, permette di concentrarsi sui concetti
della programmazione ed essere più produttivi.
di Gionata Aladino Canova

WEB
Analisi degli accessi ad un sito web (prima puntata) 38
Tra i mezzi di comunicazione di massa il web è quello che meglio si presta ad essere misurato; ma quanto sono affidabili
queste rilevazioni? E qual è il loro valore?
di Stefano Savo

SOFTWARE ENGINEERING
Programmazione Template-Oriented 44
La programmazione orientata ai template enfatizza il riuso non solo dei componenti, ma anche delle loro modalità di utilizzo
di Lorenzo Vandoni

APPLICATIVI

Controllo Remoto in Visual Basic .NET (quinta puntata)


In questa ultima puntata, creeremo una classe per gestire da remoto il registro di sistema
48
di Stefano Corti

N. 68 - Marzo/Aprile 2006 VBJ 9


DATA WAREHOUSE

Progettazione di sistemi
di Data Warehouse
Le linee guida per la comprensione e la progettazione
dei sistemi di Data Warehouse

di Fabio Testa

P
er definire cosa sia un data warehouse (da dipendente dal tempo: i dati
ora in poi DWH) ci rifacciamo alla defini- di un DWH hanno un orizzon-
zione di uno dei padri fondatori della disci- te temporale molto più esteso
plina del data warehousing, William H. Inmon: rispetto a quelli archiviati nei
sistemi operazionali. L’osser-
“Il data warehouse è una collezione di dati: orien- vazione “storica” del dato è
tata al soggetto, integrata, non volatile, dipenden- una peculiarità del DWH che
te dal tempo” ha dati che si legano alla mi-
sura tempo e si astraggono
I concetti chiave dalla pura scansione di even-
• orientata al soggetto: perché il DWH è orientato a ti del processo aziendale (es.
temi specifici dell’azienda piuttosto che alle appli- singoli scontrini fiscali nella
cazioni o alle funzioni. L’obiettivo, quindi, non è vendita al dettaglio).
più quello di minimizzare la ridondanza mediante
la normalizzazione ma quello di fornire dati che La struttura di un generico
abbiano una struttura in grado di favorire la pro- DWH comprende:
duzione e fruizione delle informazioni;
• Integrata: il DWH deve essere orientato all’inte- • una parte di ETL (estrazione,
grazione della raccolta dati, in esso confluiscono trasformazione e caricamen-
dati provenienti da più sistemi transazionali e to) che permette la “pulitura”
da fonti esterne. L’integrazione può essere rag- e conformazione dei dati pro-
giunta percorrendo differenti strade che non si venienti dai vari sistemi ope-
escludono tra: omogeneità semantica di tutte le razionali;
variabili, utilizzo di metodi di codifica uniformi, • una serie di data mart come
utilizzo delle stesse unità di misura, ecc.; unità di osservazione dei pro-
• non-volatile: i dati contenuti nel DWH consen- cessi aziendali;
tono accessi in sola lettura; • una parte di presentazione che
non è altro che un insieme di
applicativi desktop e/o web e
Fabio Testa si occupa di progettazione, consulenza e project di report creati su strumen-
management su software web/desktop based e di sistemi di ti proprietari (es. Crystal Re-
DW ed ha lavorato nei settori servizi IT per Public utilities, PMI,
banche e centri servizi bancari.
ports, Business Objects, vari
strumenti client OLAP, ecc.).

10 VBJ N. 68 - Marzo/Aprile 2006


DATA WAREHOUSE

Figura 1 Sistema di DW

La Figura 1 rappresenta lo schema di un JOIN superflui per recuperare i dati sparsi su


generico sistema di DWH. Alcuni dei concet- più tabelle (query più prestazionali).
ti espressi nella figura saranno esplicati nel Riguardo alle chiavi primarie (PK) e chiavi
seguito dell’articolo. esterne (FK) delle tabelle di dimensioni e fat-
ti, bisogna aggiungere che è opinione assun-
Concetti fondamentali ta dalla comunità degli esperti di DWH che
sulla modellazione dimensionale le chiavi dei sistemi operazionali vanno so-
Il modello di dati dimensionale differisce dal stituite da chiavi create “su misura” in area
modello normalizzato, ma ne eredita i concet- di staging, per separare completamente le lo-
ti fondamentali. giche dei sistemi operazionali da quelle del
Sono quindi ancora presenti le entità (nel- DWH, rendendolo indipendente in tutto e per
l’esempio in Figura 2, allievo e scuola), gli at- tutto. Queste chiavi così create sono chiama-
tributi (nome, cognome, ecc.) e, quando il mo- te chiavi surrogate, mentre le vecchie chiavi
dello dimensionale è relazionale, le relazioni. operazionali restano all’interno della tabel-
Cadono invece tutte le altre regole di norma- la dei fatti diventando dimensioni degenera-
lizzazione dei DB relazionali (prima, seconda te che non sono legate a tabelle di dimensio-
e terza forma normale). ni (es. numero fattura, numero di POS, ecc.).
Come si può osservare in Tabella 1 si ten- Le entità nei DB di DWH sono organizzate in:
de a denormalizzare il DB “appiattendo” nel- tabelle dei fatti (fact tables) e tabelle delle di-
le dimensioni valori “ripetuti”. mensioni (dimension tables).
Questo porta sicuramente ad uno spreco Le tabelle dei fatti sono le principali nel mo-
di spazio fisico su disco, ma per contro evita dello ed in esse sono memorizzate le misure

Tabella 1 Esempio di tabella denormalizzata

Rating Descrizione Livello Qualità Grado


1 Molto poco Scarso Bassa speciale
2 Medio Scarso Media standard
3 Buono Buono Media standard
4 Molto buono Buono Scarsa speciale

N. 68 - Marzo/Aprile 2006 VBJ 11


DATA WAREHOUSE

La tabella contiene misure che


parteciperanno a calcoli?
Se la risposta è SI la tabella è dei
fatti, altrimenti siamo di fronte ad
una candidata dimensionale.
Nell’analisi dimensionale si tende
ad uniformare uno schema stan-
dard definito Schema a Stella (Star
Schema).
Figura 2 Entità Relazioni La Figura 5 mostra lo schema di
un data mart che rappresenta i fat-
ti di vendita di una ipotetica azien-
da. Si può osservare il classico sche-
(measures) delle prestazioni numeriche del- ma a stella con la tabella dei fatti
l’azienda per un determinato processo azien- “Vendite Giornaliere”, le sue misure “Quanti-
dale. Supponiamo di analizzare la vendita di tà” e “Ammontare” e le chiavi esterne verso le
prodotti in un mercato e di scrivere l’importo varie dimensioni descrittive dei fatti (prodotti,
e quantità delle vendite ogni giorno, per cia- promozioni, negozio, ecc.).
scun prodotto in tutti i negozi delle catena. Non è sempre vero che bisogna attenersi ad
L’elenco degli attributi di dimensione de- uno schema star stretto.
finisce la grana ovvero la profondità dimen- In alcuni casi è necessario utilizzare anche
sionale della tabella dei fatti. Le tabelle delle schemi più articolati (uso di Outriggers Junk,
dimensioni sono quelle contenenti i “descrit- ecc.) che non trattiamo nel presente articolo.
tori” della tabella dei fatti e di solito hanno Quando lo schema indica dimensioni figlie, è
molte colonne e poche righe, anche se è pos- definito a fiocco di neve (snowflake, Figura 6).
sibile incontrare tabelle delle dimensioni con
milioni di righe (come ad esempio la dimen- Il processo in quattro passi per la pro-
sione cliente in alcuni modelli dimensionali gettazione di un DWH
– ad esempio entità clienti delle compagnie Per la progettazione di un sistema di data wa-
telefoniche). Spesso non è chiaro se la tabella rehouse si può indicare uno schema in quat-
debba essere considerata una tabella dei fat- tro passi che è stato proposto per primo dal
ti o di dimensione; una buona regola può es- guru del DWH Ralph Kimball.
sere quella di chiedersi:
Fase I: Selezionare il processo da
modellare
Ascoltare gli utenti è il modo più
efficiente per scegliere il proces-
so aziendale ed è bene ricorda-
re che quando si parla di proces-
si aziendali non ci si riferisce ad
un reparto o ad una funzione or-
ganizzativa; guardando ai reparti
si rischia di duplicare le estrazio-
ni, trasformazioni, pubblicazioni e
viste dei dati.
Figura 3 Esempio di tabella dei Fatti
Fase II: Dichiarare la grana del
processo aziendale

12 VBJ N. 68 - Marzo/Aprile 2006


DATA WAREHOUSE

Significa specificare esattamente ciò che


rappresenta una singola riga della tabella
dei fatti.
La domanda che ci si deve porre è: Come
si descrive un’unica riga della tabella dei
fatti?
Ecco alcuni esempi di dichiarazione di
grana:

• Una istantanea mensile per ogni conto cor-


rente Figura 4 Esempio di Tabella Dimensioni
• Una voce su una fattura ricevuta da un
medico
• Una singola voce di riga dello scontrino di
vendita La domanda a cui rispondere è:
In che modo coloro che lavorano in una
La definizione di grana è fondamentale e se azienda descrivono i dati generati dal pro-
si scopre che nelle fasi III e IV c’è un errore di cesso aziendale?
definizione, bisogna ritornare alla fase II.
Fase IV: Identificare i fatti numerici che po-
Fase III: Scegliere le dimensioni che si ap- poleranno ogni riga della tabella dei fatti.
plicano alla tabella dei fatti La domanda per individuare le misure è:
Se la definizione della grana è chiara e sod- Cosa stiamo misurando?
disfacente trovare le dimensioni di solito è È fondamentale che tutti gli attributi della
banale. tabella dei fatti candidati come misure rispet-

Figura 5 Star Schema

N. 68 - Marzo/Aprile 2006 VBJ 13


DATA WAREHOUSE

Pur essendo questa una ottima


regola da seguire in tutti i proget-
ti informatici complessi, bisogna
tener presente che scomporre il
problema NON significa creare il
DWH in parti isolate.
Un metodo di progettazione che
si è rivelato molto utile nella pro-
gettazione dei sistemi DWH com-
plessi è l’architettura BUS.
L’idea è quella di applicare alcu-
Figura 6 Snowflake Schema
ni dei paradigmi della program-
mazione object oriented ai DWH,
pensando ai fatti ed alle dimen-
sioni come ad oggetti riutilizzabi-
tino la grana. I fatti che appartengono ad una li all’interno di più data mart.
grana diversa devono trovarsi in una tabella Appare chiaro che nella fase di progettazione
dei fatti distinta. In sintesi, tabelle di fatti di- bisogna identificare fatti e dimensioni comu-
verse per misurazioni diverse. ni che sono detti conformati da potersi utiliz-
zare nei data mart.
Architettura BUS del data warehouse Perché le dimensioni ed i fatti siano confor-
L’implementazione di un sistema di DWH mati è necessario abbiano chiavi di dimensio-
è molto complessa e va scomposta in più ob- ni e fatto coerenti, nomi di colonne e attributo
biettivi raggiungibili e condivisi dal commit- coerenti, valori attributo e definizioni coeren-
tente. ti. In concreto le dimensioni ed i fatti confor-

Figura 7 Bus Data Warehouse

14 VBJ N. 68 - Marzo/Aprile 2006


DATA WAREHOUSE

mati sono un subset mate- Tabella 2 Matrice Bus Data Warehouse


matico identico oppure rigi-
do rispetto alla dimensione
più dettagliata.

Spedizioniere
Promozione
Per l’individuazione del-

Magazzino

Produttore

Contratto
Prodotto

Negozio
le dimensioni e fatti “riu- Processi Aziendali

Data
tilizzabili” ci viene in aiuto
la matrice bus del data wa-
rehouse che ha sulle righe Vendite al dettaglio X X X X
Inventario al dettaglio X X X
i data mart e sulle colonne
Consegne al dettaglio X X X
le dimensioni. I data mart Inventario al magazzino X X X X
così individuati sono defini- Consegne di magazzino X X X X
ti consolidati. Parlando del- Ordini di acquisto X X X X X X
le dimensioni conformate è
necessario specificare che
l’utilizzo del subsetting va
esteso quando i modelli dimensionali affron- A questo punto un solo data mart non può
tano problemi di analisi che richiedono livel- più rispondere alle esigenze del committen-
li di dettaglio differenti su subset dello stes- te e noi dobbiamo creare un nuovo data mart
so insieme. Pensiamo ad esempio alla situa- che risponda alle nuove esigenze di analisi.
zione di un DWH nel settore finanziario. In Osserviamo nella Figura 9 l’operazione di con-
questo settore i prodotti possono essere etero- formazione sui due prodotti bancari, una ope-
genei tra loro. In una banca le differenze che razione di intersezione o Drill Cross utile per
esistono tra un conto corrente di deposito e i rappresentare e quindi comprendere le carat-
depositi vincolati come i certificati di deposi- teristiche comuni e non comuni dei due sot-
to sono minime ma significative (es. i depo- toinsiemi di prodotti.
siti vincolati non hanno saldi minimi e limi-
ti di scoperto). Una osservazione globale con Conclusioni
possibilità di slice and dice (analisi a scelta La realizzazione di un sistema di data wa-
dell’utente lungo tutte le dimensioni) su cia- rehouse è di solito un progetto complesso che
scun prodotto è necessaria, ma sicuramente richiede competenze disparate, da quelle di
può sorgere la necessità di analisi particolari design del processo a quelle di modellazione
sulle caratteristiche non in comune. DB, alla realizzazione di software per le aree

Figura 8 Dimensioni Conformate

N. 68 - Marzo/Aprile 2006 VBJ 15


DATA WAREHOUSE

4. Il DWH deve
essere elastico ed
adattarsi pronta-
mente alle esi-
genze dell’utente

5. Il DWH deve
essere ACCET-
TATO dal com-
mittente e da-
gli utenti finali
(non sempre è
scontato)

6. Il DWH deve
essere un bastio-
ne sicuro per le
informazioni

Figura 9 Bus Data Warehouse 7. Il DWH deve


servire al com-
mittente per
prendere deci-
di staging e dei sistemi di delivery della re- sioni migliori e
portistica. In quanto complessi, questi pro- quindi la sua progettazione deve essere
getti presentano molte difficoltà ed è impor- orientata a questo scopo
tante che gli scopi del sistema di DWH siano
chiari e definiti all’interno dei seguenti pun- Bibliografia
ti riassuntivi: [1] Kimball Ralph, Ross Margy – “Data Wa-
rehouse la guida completa”, Hoepli, 2003
1. Rendere le informazioni dell’azienda facil- [2] Golfarelli Matteo, Rizzi Stefano – “Data
mente accessibili ed i dati devono essere Warehouse - Teoria e pratica della proget-
intuitivi e leggibili: tazione”, Mc Graw Hill, 2002
[3] W. H. Inmon – “Building the Data Ware-
- Fortemente deprecato l’utilizzo di codi- house (3rd Edition)”, John Wiley & Sons,
ci numerici 2005
- Fortemente deprecato l’uso di codici [4] Ralph Kimball, Laura Reeves – “The Data
parlanti Warehouse Lifecycle Toolkit”, John Wiley
- Utilizzo dei nomi attributi e tabelle chia- & Sons, 1998
ri e per esteso
- Struttura denormalizzata con pochi join Riferimenti
(possibilmente struttura a stella) [5] http://www.dmreview.com
[6] http://www.ittoolbox.com
2. Possibilità di presentazione in combina- [7] http://www.kimballuniversity.com
zioni infinite dei dati (slicing and dicing) [8] http://www.datawarehouse.com
[9] http://www.intelligententerprise.com/info_
3. I dati devono essere credibili, puliti e la centers/data_warehousing
loro qualità deve essere garantita

16 VBJ N. 68 - Marzo/Aprile 2006


VB6

Introduzione alla
computer simulation
Un breve viaggio nel mondo della simulazione,
di cui analizzeremo le possibilità, le tecniche di program-
mazione e faremo esperienza con alcuni esempi in VB6.

Simulation

di Daniele De Pedis

S
i sente spesso parlare di simulazioni fatte Con il termine emulazione
al computer per risolvere problemi scien- invece si intende la ripro-
tifici, finanziari o anche problemi di ca- duzione di processi gover-
rattere più generale. Ma cosa significa in prati- nati da rigide leggi fisico/
ca fare una simulazione al computer? matematiche. Tipici esempi
Prima di addentrarci in questo mondo, facciamo sono il gioco degli scacchi, i
subito una distinzione fra simulazione ed emula- programmi CAD o i simula-
zione. Molto spesso i due termini vengono usati in tori di volo (che in realtà do-
maniera scambievole ma in realtà essi stanno a si- vrebbero chiamarsi emulato-
gnificare due tecnologie molto diverse (e noi ci at- ri di volo) dove il comporta-
terremo a questa distinzione). mento dell’oggetto in esame
è perfettamente prevedibile
• Con il termine simulazione si intende la ri- in base alle leggi che li go-
produzione, mediante un algoritmo softwa- vernano.
re, di processi intrinsecamente stocastici o
governati da regole aleatorie. Tipico esem- In questo articolo affronteremo
pio è il lancio di un dado o di una moneta di gli aspetti pratici dei program-
cui, a priori, non possiamo prevedere il risul- mi di simulazione.
tato, ma solo la probabilità che esso accada.
Per la loro capacità di trattare processi aleatori, i Modellizzazione
programmi di simulazione vengono usualmente della simulazione
chiamati anche programmi Monte-Carlo, proprio Prima di procedere alla scrit-
in riferimento al gioco della roulette. tura di un programma di si-
mulazione è necessario astrar-
re, dal sistema che si vuole si-
mulare, quei componenti – e
Daniele De Pedis, laureato in Fisica, è un ricercatore dell’Isti-
tuto Nazionale di Fisica Nucleare. Ha partecipato a numerosi le loro interazioni – considera-
esperimenti presso i laboratori del CERN e del FNAL. È autore ti importanti al fine della mo-
o coautore di numerosi articoli su riviste scientifiche internazio- dellizzazione del sistema stes-
nali. Attualmente è responsabile del database di costruzione
dell’esperimento Atlas in allestimento al CERN.
so; questo significa fare deter-
minate assunzioni semplifica-

N. 68 - Marzo/Aprile 2006 VBJ 17


VB6

Per fare un semplice esempio supponiamo di


simulare la caduta di un asteroide sulla Terra
e supponiamo di saper descrivere, in termini
di effetti distruttivi, il comportamento di un
tale evento. Ci possiamo chiedere “È preferi-
bile che l’asteroide abbia un impatto come un
singolo corpo oppure è meglio provocarne la
frantumazione in corpi più piccoli prima che
raggiunga la Terra?”. È chiaro che non abbia-
mo a disposizione un asteroide per confron-
tare i risultati della nostra simulazione con la
realtà ma, per esempio, possiamo sulla base
di eventi successi nel passato o su analisi di
eventi analoghi accaduti sulla Luna inferire
quali possano essere le conseguenze di un tale
Figura 1 Figura geometrica di cui si vuole calcolare
la superficie evento. Questi parametri allora possono essere
introdotti nel nostro programma di simulazio-
ne, che ci darà quindi previsioni diverse a se-
tive che ne permettano l’implementazione conda della massa, traiettoria e composizione
software. Tuttavia, l’accuratezza dei risultati dell’asteroide in studio, o dei suoi frammen-
ottenuti dalla simulazione dipenderà stretta- ti, e quindi una risposta alla domanda prece-
mente da quanto tali assunzioni siano valide, dente. È da notare che in questo esempio la
perciò il primo passo sarà quello di definire parte di simulazione, cioè il processo aleato-
esattamente i parametri importanti che si vo- rio, è quello della frantuamazione e degli ef-
gliono misurare e quali componenti del siste- fetti distruttivi dei frammenti; viceversa, la
ma li influenzeranno. Inoltre occorre tener loro traiettoria e i punti di impatto, essendo
presente che nello sviluppo di un program- determinati da leggi fisiche, rappresentano la
ma di simulazione si procede (quasi) sempre parte di emulazione.
per successive approssimazioni, cioè si ini- Come è facilmente intuibile, una simulazio-
zia descrivendo in maniera semplice il pro- ne, essendo la riproduzione di processi alea-
cesso da simulare, si confrontano i risultati
di questo primo tentativo con la realtà e, nel
caso, si apportano le necessarie migliorie al
programma, si ripete la simulazione e si fa
un nuovo confronto e così via.
Tale processo di iterazione simulazione-ve-
rifica non è un futile e inutile lavoro; la tipi-
ca domanda che sorge è: “Qual è il beneficio
di una simulazione se poi devo confrontar-
la con la realtà?”. Occorre puntualizzare, in-
fatti, che in ogni nuova iterazione possiamo
introdurre differenti valori dei parametri (o
una descrizione che a priori non è prevedi-
bile o difficilmente verificabile) e la nuova
iterazione ci darà risultati differenti. L’insie-
me di tutte queste fasi di simulazione ci darà Figura 2 Figura geometrica di cui si vuole calcolare
quindi un potere predittivo enorme sul com- la superficie, inscritta in un quadrato
portamento del sistema in esame.

18 VBJ N. 68 - Marzo/Aprile 2006


VB6

Tabella 1 La funzione Rnd in Visual Basic

Se il valore di seme è La funzione Rnd ritorna


minore di zero lo stesso numero ogni volta usando numero come seme
maggiore di zero il successivo numero casuale nella sequenza
uguale a zero il risultato più recente già generato
omesso il successivo numero casuale nella sequenza

tori, sarà capace di riprodurre la realtà solo in dall’orologio di sistema e quindi sempre di-
senso statistico, cioè solo se il numero di even- verso dai precedenti.
ti simulati è grande. Infatti un fondamentale La ragione dell’esistenza di due differenti
teorema di statistica ci assicura, sotto ipotesi funzioni è dovuta alla necessità, in alcuni casi,
largamente generali, che l’errore fra la gran- di riprodurre esattamente la stessa sequenza,
dezza misurata e il suo valore vero è inversa- per esempio quando si vuol debuggare un pro-
mente proporzionale alla radice quadrata del gramma o quando si vuole eseguire un pro-
numero di misure effettuate [1]. gramma con condizioni iniziali fisse.
I numeri generati dalla Rnd hanno una di-
Il cavallo di battaglia della simulazio- stribuzione piatta nell’intervallo 0-1, cioè ogni
ne: la funzione Rnd numero in tale intervallo ha la stessa probabi-
Per quanto detto precedentemente appare lità di essere estratto. Questa non è una limi-
evidente che nell’affrontare una simulazione tazione; partendo infatti da una distribuzione
è fondamentale la disponibilità di una proce- piatta fra 0-1, è possibile generare una qualsi-
dura (funzione) che ci permetta di estrarre dei voglia distribuzione in qualsiasi intervallo.
numeri a caso (random) in un intervallo pre- Per esempio, se vogliamo una distribuzio-
definito di valori. Tutti i linguaggi di program- ne piatta nell’intervallo 10-15, sarà sufficien-
mazione mettono a disposizione tale strumen- te definire una funzione
to e, ovviamente, VB non è da meno, infatti
mette a disposizione due funzioni: la Rnd e Public Function MyRnd() as single
la Randomize. MyRnd = 10 + 5 * Rnd
Analizziamo da vicino la funzione Rnd, la End Function
cui sintassi è ([2]):
e in generale potremo scrivere
Rnd [(seme)]
MyRnd=Min + (Max-Min) * Rnd
Essa ritorna un numero a caso di tipo Sin-
gle – compreso fra zero e uno – a seconda del dove Max e Min sono gli estremi dell‘inter-
parametro seme, che è opzionale (vedi Tabel- vallo.
la 1). Per ogni dato seme iniziale viene ge- A volte necessita estrarre a caso un nume-
nerata la stessa sequenza di numeri poichè, ro intero in un dato intervallo, per esempio
per ogni chiamata, la Rnd usa come seme il nel simulare il lancio di un dado o nell’estra-
numero generato nella chiamata preceden- zione dei numeri del Lotto. In tal caso si può
te. Quindi successive iterazioni che partono usare la seguente funzione
con lo stesso seme daranno luogo a sequen-
ze identiche. Per ovviare a tale problema VB Public Function intRnd() as long
mette a disposizione l’istruzione Randomize intRnd = Int (Min + (Max - Min + 1) * Rnd)
che inizializza la Rnd con un seme derivato End Function

N. 68 - Marzo/Aprile 2006 VBJ 19


VB6

Listato 1 Listato "piove a catinelle" (continua...)

Private Declare Function Polygon Lib “gdi32” (ByVal hdc As Long, _


lpPoint As POINTAPI, ByVal nCount As Long) As Long

Private Type POINTAPI


x As Long
y As Long
End Type
Dim kPoint() As POINTAPI, nCount As Long

Dim FirstPoint As Boolean


Dim X0 As Single, Y0 As Single
Dim xPos As Single, yPos As Single
Dim inPoint As Long, outPoint As Long, totPoint As Long
Dim PicArea As Single, Area As Single

Private Sub Form_Load()

Width = 6300
Height = Width + 1700

With Picture1
.Move 0, 0, 6000, 6000
.FillStyle = vbFSSolid ‘ FillStyle non puo’ essere trasparente
.FillColor = vbRed ‘ Colore di riempimento figura
.BackColor = vbBlue ‘ Colore sfondo
.ScaleMode = vbPixels ‘ Misura in pixel.
.AutoRedraw = True ‘ Rendi l’immagine permanente
End With

FirstPoint = True
inPoint = 0
outPoint = 0

Randomize ‘ Rende la Rnd indipendente dalla iterazione in corso (vedi articolo)


End Sub

Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)


lblX.Caption = “X :” & x
lblY.Caption = “Y :” & y
End Sub

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)

‘ Colleziona i punti in un array di POINTAPI


nCount = nCount + 1
ReDim Preserve kPoint(nCount)
kPoint(nCount).x = x
kPoint(nCount).y = y

If FirstPoint = True Then ‘ Non disegnare se primo punto


Picture1.CurrentX = x
Picture1.CurrentY = y
X0 = x
Y0 = y
FirstPoint = False
Exit Sub
End If

Picture1.Line -(x, y) ‘ Disegna la linea congiungendola all’ultimo punto


End Sub

20 VBJ N. 68 - Marzo/Aprile 2006


VB6

Listato 1 (...fine)

Private Sub Picture1_DblClick()


Picture1.Cls ‘ Cancella i vecchi punti e
Polygon Picture1.hdc, kPoint(1), nCount ‘ disegna la figura in colore
End Sub

Private Sub cmdCalcola_Click()


If nCount = 0 Then
MsgBox “Non c’e’ nessuna figura disegnata !”, vbOKOnly
Exit Sub
End If

If cmdCalcola.Caption = “Calcola Superficie” Then


cmdCalcola.Caption = “Stop”
Else
cmdCalcola.Caption = “Calcola Superficie”
End If

PicArea = Picture1.ScaleWidth * Picture1.ScaleHeight

Do While cmdCalcola.Caption = “Stop”


xPos = Picture1.ScaleWidth * Rnd
yPos = Picture1.ScaleHeight * Rnd

If Picture1.Point(xPos, yPos) <> vbBlue Then


inPoint = inPoint + 1 ‘conta punti interni
Else
outPoint = outPoint + 1 ‘conta punti esterni
End If

If chkShow.Value = vbChecked Then


Picture1.PSet (xPos, yPos), vbGreen ‘visualizza i punti
End If

totPoint = totPoint + 1
Area = (inPoint / totPoint) * PicArea
lblArea = “Area= “ & Area
lblErr = “Err = “ & Area / Sqr(totPoint)

lblXPos = “xPos =” & xPos


lblYPos = “yPos =” & yPos
lblIn = “nIn = “ & inPoint
lblOut = “nOut = “ & outPoint
lblTot = “nTot = “ & totPoint

DoEvents
If totPoint = 10000 Then Exit Sub
Loop
End Sub

che ritorna un numero di tipo Long com- Public Function Gauss() as single
preso fra Min e Max. Dim Sum as single, i as integer
Sum = 0
Una distribuzione particolarmente utile For i =1 to 12
(data la sua implicazione nei processi di Sum = Sum + Rnd
misura) è quella Gaussiana che, nella sua Next i
forma standard, si ottiene dalla somma di Gauss =Sum-6
12 numeri generati con la Rnd, cioè End Function

N. 68 - Marzo/Aprile 2006 VBJ 21


VB6

che produce numeri casuali che seguono la 4. conteggiare i due casi separatamente;
distribuzione gaussiana con valor medio = 0 e 5. fare il rapporto fra questi due numeri che
varianza = 1. Nel software allegato al presente sarà uguale al rapporto fra le aree delle
articolo e scaricabile dal sito ftp.infomedia.it due figure.
è disponibile un controllo ActiveX che gene-
ra numeri a caso che seguono la distribuzio- È da evidenziare che il risultato fornito da
ne piatta, gaussiana o di Poisson con qualsi- questo algoritmo (a differenza di altri metodi
voglia intervallo e valor medio (riferirsi alle utilizzabili) è virtualmente indipendente dal
note d’uso accluse nei file scaricati per il suo tipo di figura in esame e, sempre per teore-
corretto utilizzo). mi generali di statistica, è affetto da un erro-
re proporzionale all’inverso della radice qua-
Un primo esempio: “piove a catinelle” drata del numero di punti impiegato, cioè err
Come primo esempio di simulazione affron- = 1/sqr(N).
tiamo il semplice problema di calcolare la su- La procedura precedente si traduce nel pro-
perficie di una figura geometrica con contor- gramma riportato nel Listato 1.
ni qualsiasi (Figura 1). Ci sono molte tecni-
che per risolvere questo problema ma noi lo Ci sono pochi punti importanti da analiz-
affronteremo facendo una simulazione. zare:
Supponiamo che la superficie di cui dob-
biamo calcolare l’area sia esposta all’aperto • Nella Form_Load dopo l’inizializzazio-
in una giornata di pioggia. Consideriamo un ne delle variabili incontriamo la funzio-
quadrato, sufficientemente grande, che possa ne Randomize che permette ad ogni av-
contenere tale superficie al suo interno (Fi- vio del programma di avere una differen-
gura 2). Allora, visto che piove, il numero di te sequenza dei numeri casuali generati
gocce d’acqua (distribuite in maniera unifor- dalla Rnd. Commentando questa istruzione
me) che cadono sul quadrato di riferimento ad ogni avvio del programma si avrà sem-
e sulla superficie sotto misura sarà propor- pre la stessa sequenza dei punti di caduta
zionale alle rispettive aree. Il rapporto fra il della pioggia.
numero di gocce cadute sul quadrato e quel- • Nella Picture1_MouseDown viene creato un
le cadute sulla superficie sarà quindi uguale array di punti rappresentativi delle coor-
al rapporto fra le loro aree(*). Si intuisce ora dinate (X,Y) dei vertici della figura in co-
qual è la strategia del nostro procedimento: struzione. Per ogni nuovo punto inserito
data la figura di area incognita (a parte il primo) viene disegnata una li-
nea che ha per estremi il punto corrente
1. racchiuderla in un quadrato di dimensio- e l’ultimo punto precedentemente inseri-
ni note; to. Si può inserire qualsivoglia numero di
2. estrarre coppie di numeri a caso che defi- punti.
niscono la posizione dei punti del quadra- • Nella Picture1_DblClick si interrompe il
to dove cadono le gocce di pioggia; processo di inserimento e viene disegna-
3. verificare se tali punti appartengano o no to un poligono di colore rosso che ha per
alla figura in esame; vertici i punti inseriti.
• La cmdCalcola_Click è il cuore del pro-
gramma:

(*)
Come i più smaliziati in matematica avranno già intui-
to, la stessa tecnica è applicabile per valutare gli integrali
° Nel ciclo While vengono estratti due
numeri a caso (xPos, yPos) che rappre-
definiti non analiticamente calcolabili. Inoltre è possibile
estendere l’algoritmo per calcolare il volume di un iper- sentano un punto del quadrato su cui
solido in un iperspazio ad n dimensioni (con n>2). cade la goccia di pioggia e, analizzando

22 VBJ N. 68 - Marzo/Aprile 2006


VB6

il suo colore, viene verificato se esso è Conclusioni


esterno o interno al poligono. La computer simulation è un potente stru-
mento di previsione e/o verifica del compor-
° Per mezzo del CheckBox è possibile vi- tamento di sistemi che possono non essere
sualizzare, in verde, il punto estratto. accessibili o la cui reale costruzione può ri-
Occorre osservare che la visualizzazio- chiedere ingenti investimenti economici e di
ne dei punti estratti può portare ad un “man power”.
piccolo errore nel computo dell’area. In-
fatti, quando il numero di punti è ele- La simulazione del loro comportamento, al
vato, può accadere che un punto venga variare dei parametri, può aiutare nella scel-
generato più volte e quindi il suo colore ta della soluzione migliore.
può dare una indicazione falsata della
sua posizione interna o esterna alla fi- Bibliografia
gura in esame. [1] H.D. Jung – “Elaborazione statistica dei
dati sperimentali”, Veschi editore, 1971
° La parte restante del codice si incarica [qualsiasi libro di statistica va bene]
di mostrare i valori dei parametri più
importanti. Da notare che l’unità di mi- Riferimenti
sura dell’area è il pixel. [2] http://msdn.microsoft.com

N. 68 - Marzo/Aprile 2006 VBJ 23


VB6

File compatti Seconda puntata

e illeggibili:
Compressione Compressione

Crittografia e compressione di file in VB6


utilizzando il Microsoft .NET Framework

di Scott Swigart, Swigart Consulting LLC

I
n questa serie di due articoli, si vedrà come bile una enorme quantità di co-
si possono aggiungere facilmente funziona- dice open-source di alta qualità
lità di crittografia e di compressione dati che è altrettanto facile da utiliz-
(ZIP) alle applicazioni VB6 esistenti utilizzando zare nelle proprie applicazioni
il .NET Framework. Benché la crittografia e la VB6. Creando dei sottili wrap-
compressione possano non sembrare tecnologie per di codice, si possono espor-
correlate, se si pensa ad esse, ciascuna prende re funzionalità di librerie open-
un insieme di dati ed esegue una trasformazione source e di terze parti (in origi-
si di esso. Nel caso della crittografia, i dati ven- ne sviluppate per l’utilizzo nelle
gono resi illeggibili, mentre con la compressio- applicazioni .NET) per estende-
ne i dati vengono resi più piccoli. Si vedrà an- re le proprie applicazioni VB6.
che che entrambe utilizzano molte delle mede- Siti come www.sourceforge.net
sime tecnologie sottostanti. e www.gotdotnet.com contengo-
no letteralmente migliaia di pro-
Introduzione getti open-source che forniscono
Sino ad ora, nella serie di articoli VB Fusion una gamma estremamente am-
[3], è stata mostrata una significativa quantità pia di ulteriori funzionalità.
di funzionalità fornite dal Microsoft .NET Fra- Alcuni esempi comprendono li-
mework, ma si deve anche sapere che è disponi- brerie per la RS232 (la porta se-
riale) la comunicazione, la mani-
polazione di flussi RSS, la mani-
© 2006 Microsoft Corporation. All rights reserved polazione di immagini e di file
multimediali, librerie per la rete,
Scott Swigart fornisce consulenza alle aziende su come uti- librerie FTP, replicazione di file,
lizzare al meglio l’attuale tecnologia e prepararsi al domani.
e migliaia di altre librerie.
A tal riguardo, Scott è un orgoglioso collaboratore del sito VB
Fusion, dove offre informazioni e strategie di reale utilizzo per Questo articolo si occuperà
gli sviluppatori VB che vogliono realizzare il maggior numero dell’utilizzo di una di queste li-
di funzionalità con il minimo sforzo. Scott è anche un Microsoft brerie open-source per la com-
MVP, ed è coautore di numerosi libri e articoli, ed è contattabile
all’indirizzo email scott@swigartconsulting.com.
pressione di file. SharpZipLib
è un progetto open-source che

24 VBJ N. 68 - Marzo/Aprile 2006


VB6

fornisce funzionalità
di compressione (nel
formato zip). Se si de-
sidera, si può libera-
mente comprendere
questa libreria an-
che in software di
tipo close-source, os-
sia da rivendere.
Prima di affron-
tare i dettagli del-
l’utilizzo di Sharp-
ZipLib, è bene con-
frontare come l’I/O
su file .NET differi-
sce dall’I/O su file in
VB6. Come rapido
Figura 1 Se si prova ad aprire il file su disco con qualcosa tipo Notepad, si
ripasso, VB6 utilizza può vedere che è stato scritto in un formato binario compresso
delle keyword per
controllare l’input/
output su file:
file, e le operazioni su file sono più reperibi-
‘ Lettura da un file con Visual Basic 6 li, poiché IntelliSense evidenzia tutte le ope-
Dim dataIn As String razioni disponibili (WriteLine, ecc.) quando
Open someFileName For Input As #1 si lavora con i file.
Do Until Eof(1) Ma il vantaggio reale di questi oggetti (noti
Line Input #1, dataIn anche come stream) è che permettono di im-
Debug.Print dataIn pilare le funzionalità di I/O su file.
Loop Nel primo articolo, si è visto come la crit-
Close #1 tografia fosse supportata semplicemente ag-
giungendo un CryptoStream allo stack degli
In Visual Basic .NET, invece, si devono uti- stream di I/O:
lizzare alcune classi specifiche del .NET Fra-
mework per eseguire le operazioni di File I/O: ‘ Stack di stream per abilitare la crittografia in VB.NET
fs = New FileStream(fileName, FileMode.Create,
‘ File I/O con Visual Basic .NET FileAccess.Write)
Dim dataIn As String cs = New CryptoStream(fs, rc2.CreateEncryptor(),
Dim sw As New StreamWriter(“C:\log.txt”) CryptoStreamMode.Write)
sw.WriteLine(“This is a test”) sw = New StreamWriter(cs)
sw.Close()
Pertanto, qualsiasi cosa scritta su StreamWri-
Con VB6, si devono gestire gli handle dei ter viene poi inviata attraverso CyrptoStream,
file, e si devono conoscere le relative keyword dove viene crittografata, e quindi inviata al Fi-
del linguaggio necessarie per operare con leStream dove viene scritta su disco.
questi handle di file.
Con Visual Basic .NET, la classe StreamWri- Compressione
ter racchiude tutte le funzionalità associate La compressione funziona esattamente allo
ai file. Non è necessario gestire gli handle di stesso modo:

N. 68 - Marzo/Aprile 2006 VBJ 25


VB6

Figura 2 Il codice richiede all’utente un file da comprimere in formato zip, e poi utilizza il wrapper per “zippare”
il file. Il risultato è un archivio Zip leggibile da Windows XP o con altri lettori del formato Zip

‘ Stack di stream per abilitare la compressione in VB.NET e.Open “c:\file.gzip”


Dim fs = New FileStream(fileName, FileMode.Create, e.WriteLine (txtMessage)
FileAccess.Write) e.Close
zs = New GZipOutputStream(fs)
sw = New StreamWriter(zs) txtMessage = “”
MsgBox “Compressed and Saved”
Come si può vedere, la compressione si com-
pone con l’I/O su file esattamente allo stesso Come si può vedere, basta utilizzare il wrap-
modo della crittografia, il che ha senso. Sia la per per aprire il file, scrivere quanto si vuole,
crittografia sia la compressione sono in realtà e quindi chiuderlo al termine.
una trasformazione dei dati. Nella crittogra- Se si prova ad aprire il file su disco con qual-
fia, i dati vengono trasformati in un formato cosa tipo Notepad, si può vedere che è stato
non leggibile senza una chiave. Con la com- scritto in un formato binario compresso (Fi-
pressione, i dati vengono trasformati in modo gura 1).
da richiedere meno byte per rappresentare gli Tuttavia, utilizzando una applicazione VB6,
stessi dati. L’intera classe .NET che permette si può facilmente utilizzare il wrapper per ri-
di scrivere informazioni su un file compresso leggere le informazioni compresse:
è riportata nel Listato 1.
È giunto il momento di utilizzarla da una ‘ Lettura del file compresso con VB6
applicazione VB6, per scrivere informazioni e.Open “c:\file.gzip”
su un file compresso. Grazie a questo wrap- While Not e.EOF
per, il codice VB6 è banale: txtMessage = txtMessage & e.ReadLine & vbCrLf
‘ Si potrebbe anche utilizzare semplicemente
‘ Codice VB6 per scrivere su un file compresso ‘ e.ReadToEnd per leggere l’intero file.
Dim e As wrappers.GZipFileWriterWrapper Wend
Set e = New wrappers.GZipFileWriterWrapper e.Close

26 VBJ N. 68 - Marzo/Aprile 2006


VB6

“Zippare” file e Listato 1 Classe VB.NET necessaria per la scrittura su un file compresso
cartelle
Il tipo di compres-
sione mostrata sino- Public Class GZipFileWriterWrapper
ra permette di com- Private fs As FileStream
Private zs As GZipOutputStream
primere le informa-
Private sw As StreamWriter
zioni prima di me-
morizzarle in un file. Public Sub Open(ByVal fileName As String)
fs = New FileStream(fileName, FileMode.Create, FileAccess.Write)
Tuttavia, capita spes- zs = New GZipOutputStream(fs)
so di voler creare un sw = New StreamWriter(zs)
End Sub
archivio Zip, ossia un
file Zip che contiene Public Sub WriteLine(ByVal value As String)
uno o più file. Que- sw.WriteLine(value)
End Sub
sta funzionalità vie-
ne fornita dal wrap- Public Sub Write(ByVal value As String)
sw.Write(value)
per attorno alla Shar- End Sub
pZipLib, il cui codi-
Public Sub WriteBytes(ByRef bytes() As Byte)
ce è riportato nel Li- zs.Write(bytes, 0, bytes.Length)
stato 2. End Sub

Public Sub Close()


Qui, la classe Zi- On Error Resume Next
pEntry viene utiliz- If Not sw Is Nothing Then sw.Close()
If Not zs Is Nothing Then zs.Close()
zata per scrivere in- If Not fs Is Nothing Then fs.Close()
formazioni sul file End Sub
End Class
che verrà aggiunto
all’archivio. Una vol-
ta scritta la ZipEntry
sullo ZipOutputStream, viene scritto il con- Infine, può essere necessario creare un file
tenuto effettivo del file. Il risultato è un ar- Zip di un’intera cartella, e anche per fare ciò
chivio Zip che può essere aperto utilizzando viene fornito un wrapper:
WinZip, o la funzionalità Zip nativa di Win-
dows XP. Realizzato il wrapper, per “zippare” ‘ Codice VB6 per creare lo zip di una intera cartella
un file da VB6 bastano poche righe: Dim e As wrappers.FileZipWrapper
Set e = New wrappers.FileZipWrapper
‘ Zippare un file da VB6
CommonDialog1.ShowOpen e.ZipFolder App.Path, App.Path & “\..\file.zip”
Dim source As String
source = CommonDialog1.FileName Eseguire l’esempio
Nella prima puntata dell’articolo, abbiamo
Dim e As wrappers.FileZipWrapper creato un esempio che permette di esercitarsi
Set e = New wrappers.FileZipWrapper con la funzionalità di crittografia. Ho modifi-
e.ZipFile source, source & “.zip” cato questo esempio per utilizzare i wrapper
di compressione forniti in questo articolo. Per
Il codice richiede all’utente un file da com- utilizzare l’esempio può essere necessario:
primere in formato zip, e poi utilizza il wrap-
per per “zippare” il file. Il risultato è un ar- • Scaricare e installare il Microsoft .NET Fra-
chivio Zip leggibile da Windows XP o con al- mework SDK (se si è installato Visual Stu-
tri lettori del formato Zip (Figura 2). dio .NET, si può saltare questo passo);

N. 68 - Marzo/Aprile 2006 VBJ 27


VB6

rà il file dall’archivio.
Infine, “Zip Folder”
comprime il conte-
nuto di una intera
cartella.
Per utilizzare que-
sta funzionalità dalla
propria applicazione,
basta eseguire “Bui-
ld and Register.bat”,
e poi aggiunge-
re un riferimento a
“wrappers.tlb” pre-
sente nella cartella
“c:\tlbs”.

Conclusioni
Microsoft .NET Fra-
mework compren-
de vaste funzionali-
tà per molti scena-
ri, ma la comunità
Figura 3 F5 fa eseguire l’applicazione d’esempio open-source ha pro-
dotto una quantità
sbalorditiva di ulte-
riori funzionalità che
• Scaricare il codice allegato all’articolo possono essere avvolte da un wrapper e uti-
[2]; lizzate altrettanto facilmente da VB6.
• Eseguire il file “Build and Register.bat” In un certo senso, non si tratta di nulla di
incluso in questo codice. Così facendo si nuovo. VB6 ha sempre goduto di una gran-
esegue il build del componente di critto- de comunità che è stata generosa nel for-
grafia e lo si registra in modo da poter- nire esempi di codice. Talvolta si trattava
lo utilizzare dalla propria applicazione di frammenti, e talvolta erano complete li-
VB6; brerie.
• Nel codice dell’articolo, aprire il proget- Tuttavia, con VB6, si era limitati a codice
to VB6 presente nella cartella “Compres- sviluppato e condiviso da altri sviluppatori
sion”; VB6. Con .NET, sia gli sviluppatori VB.NET
• Premere F5 per eseguire l’applicazione sia C# possono produrre codice che la pro-
d’esempio (Figura 3). pria applicazione può utilizzare (SharpZi-
pLib è stato scritto in C#, ma ciò non lo
Cliccando su “Compress”, il testo nella tex- rende più difficile da avvolgere e utilizzare
tbox verrà scritto su un file utilizzando l’al- da VB6 di quanto lo sarebbe se fosse scrit-
goritmo di compressione GZip. Cliccando su to in VB.NET).
“Decompress”, il contenuto verrà decodifi- Inoltre, un numero cospicuo di librerie
cato e visualizzato. scritte in origine in C++ e Java è stato
Cliccando su “Zip File”, verrà richiesto di portato in .NET.
scegliere un file, e verrà creato un archivio Ciò significa che si hanno a propria dispo-
.zip che contiene il file. “Unzip file” estrar- sizione migliaia di ulteriori librerie, mol-

28 VBJ N. 68 - Marzo/Aprile 2006


VB6

Listato 2 Wrapper VB.NET per creare un te delle quali sono state portate da librerie
archivio Zip sviluppate, migliorate e utilizzate per molti
anni nelle applicazioni di produzione.
Public Sub ZipFile(ByVal source As String, ByVal- Come ha mostrato la serie di articoli VB Fu-
dest As String) sion [3], si può sfruttare tutto ciò che .NET
fornisce pur preservando il proprio investi-
Dim entry As New ZipEntry(Path.GetFileName(source))
Dim fi As New FileInfo(source) mento pregresso in codice VB6.
entry.ExternalFileAttributes = fi.Attributes Come ha mostrato specificamente questo
entry.Size = fi.Length
articolo, non si è in alcun modo limitati al
Dim input As FileStream = File.OpenRead(source) solo .NET framework e alle librerie forni-
Dim output As New ZipOutputStream(File.Create(dest))
te da Microsoft.
output.PutNextEntry(entry) La florida comunità .NET è a vostra di-
sposizione.
Dim buffer(8191) As Byte
Dim len As Integer
Do Riferimenti
len = input.Read(buffer, 0, buffer.Length)
If len > 0 Then [1] http://www.icsharpcode.net/OpenSource/
output.Write(buffer, 0, len) SharpZipLib/Default.aspx/
End If
Loop Until len = 0
[2] ftp.infmedia.it/pub/VBJ
output.Close() [3] h t t p : / / m s d n . m i c r o s o f t . c o m / v b r u n/
input.Close() vbfusion
End Sub

N. 68 - Marzo/Aprile 2006 VBJ 29


ACCESS

Creare Add-in per VBE


in Microsoft Access
Utilizzare strumenti che svolgono per noi i compiti ripetiti-
vi, permette di concentrarsi sui concetti della programma-
zione ed essere più produttivi.

Add-in

di Gionata Aladino Canova

N
ell’articolo “Creare Add-in per Micro- leva in C per creare una fine-
soft Access” (VBJ n. 62) abbiamo visto stra in Windows, sa a cosa mi
come realizzare una barra di strumen- riferisco. Tanti sistemi moder-
ti che si integra nell’ambiente di Access, per au- ni, Access compreso, consento-
tomatizzare certe operazioni. In questo articolo no di fare molte cose in modo
vedremo come aggiungere al menu dell’editor semplice, nascondendo le com-
di VBA (VBE Visual Basic Editor) dei coman- plessità sottostanti. Creare un
di personalizzati che ci aiutino nella stesura del add-in in Access è sicuramente
codice. più facile che creare un add-in
Analizzeremo poi un add-in che utilizzo comu- per il VBE, poiché quest’ultimo
nemente per sviluppare, visibile in Figura 1. Tale nasconde un po’ meno cose. Ad
strumento è allegato all’articolo e scaricabile dal esempio, personalizzare i menu
sito FTP di Infomedia ed il suo utilizzo è gratui- di VBE è più complicato che
to; è fornito completo di sorgenti che possono es- personalizzare i menu di Ac-
sere modificati e ridistribuiti a condizione di non cess. Questo perché VBE è ba-
rimuovere le indicazioni sull’autore. Per la com- sato sul modello di Visual Stu-
prensione dell’articolo serve una discreta padro- dio e non su quello di Office.
nanza dell’ambiente di Access e la conoscenza del
VBA; i concetti esposti sono validi da Microsoft Ac- Progettare un add-in
cess 2000 in poi. La prima operazione da fare
per progettare un add-in è ana-
Le complessità nascoste lizzare quali operazioni deside-
La programmazione in un ambiente visuale è riamo implementare. Da questa
un problema complesso. Chi ha visto cosa ci vo- lista otterremo una serie di fun-
zioni che potranno logicamente
essere raggruppate. Ad esem-
Gionata Aladino Canova programma dai bei tempi del Sinclair pio, le funzioni che trattano la
Spectrum. Laureato in Informatica, è titolare della Aladino Infor- generazione di codice per la ge-
matica e socio di TDE Informatica srl. Sviluppa con Microsoft stione di recordset potranno es-
Access, VB.NET e realizza siti in ASP/ASP .NET. Può essere
contattato a g.canova@tdeinformatica.it.
sere organizzate tutte in un’uni-
ca form. Creata la lista delle

30 VBJ N. 68 - Marzo/Aprile 2006


ACCESS

form e delle eventua-


li funzioni da chiama-
re direttamente, sarà
facile progettare l’in-
terfaccia utente del-
l’add-in, ossia stabili-
re quali menu o barre
degli strumenti vada-
no create o quali sia-
no gli eventi da inter-
cettare. Nel wizard di
esempio vedremo la
creazione di un menu
e l’intercettazione del-
l’evento di compilazio-
ne. La parte finale del-
la progettazione sarà il
suddividere quali fun-
zioni vadano create in Figura 1 Il menu del VBE personalizzato tramite un add-in
quali moduli. La crea-
zione dell’add-in si svi-
lupperà nella stesura
del codice che realizza le funzioni e nella getti, andremo nella sezione Finestre di pro-
parte che crea l’interfaccia con l’utente. gettazione e faremo doppio click sulla voce
che, di default, si chiama AddInDesigner1.
Costruire lo scheletro dell’add-in Salviamo il file con il nome VBJAddIn. Nei
Iniziamo aprendo Access, cliccando sulla riferimenti (Strumenti – Riferimenti) dovre-
caption e spostandoci nell’editor VBE (tasto mo aggiungere:
rapido ALT+F11). La finestra è desolante-
mente vuota. Se la finestra
Progetto non è visualizzata,
Listato 1 Codice per le operazioni da implementare
dal menu Visualizza sele-
zioniamo Gestione Proget-
ti (CTRL+R). Dal menu
Option Explicit
File, selezioniamo l’opzio-
ne Nuovo Progetto e poi Public oHostApplication As Object
Public oAddIn As Object
Progetto Aggiunta. Nella fi- Public conNomeApp As String
nestra che compare, compi- Public Const conVersione = “1.0 del 12-02-2006”
liamo le voci Nome aggiun- Public Const conTitoloApp = “VBJ Wizard”

ta visualizzato inserendo Function wizCompila()


VBJ Wizard e Descrizione MsgBox “Stai compilando!”, vbInformation, “VBJAddIn”
End Function
aggiunta con un commen-
to a piacere, poi impostia- Sub wizInfo()
MsgBox “VBJ Wizard ver.” & conVersione, vbInformation, “VBJAddIn”
mo la voce Applicazione a End Sub
Visual Basic for Applica-
tion IDE. In futuro, per far Sub wizNumeroCasuale()
MsgBox “Il primo numero che mi viene in mente è: “ & Int(Rnd() * 1000)
ricomparire questa finestra, End Sub
dalla finestra Gestione Pro-

N. 68 - Marzo/Aprile 2006 VBJ 31


ACCESS

• Microsoft Access 10.0 Object Library (per è sufficiente selezionarle. Per provare la
l’oggetto VBE) compilazione, apriamo un database vuo-
• Microsoft Office 10.0 Object Library (per to, aggiungiamo un modulo ed una routine
la gestione delle barre degli strumenti, es. anch’essa vuota. Selezioniamo poi Debug/
CommandBarButton) Compila. Se tutto funziona, una message-
• Microsoft Visual Basic For Applications Ex- box ci avviserà che stiamo compilando.
tensibility 5.3 (per intercettare gli eventi • Finito il test, ritorniamo in Aggiunte/
delle Barre di VBE) Gestione Aggiunte e facciamo doppio cli-
ck sul nostro add-in (nell’esempio, VBJ Wi-
Aggiungiamo il modulo che conterrà le ope- zard), per scaricarlo. Questa operazione è
razioni da implementare. Inseriamo il codice necessaria per ripulire i menu di VBE dal-
contenuto nel Listato 1. La funzione wizCom- le voci che vi abbiamo aggiunto. Interrom-
pila ci avviserà che l’utente sta compilando. pendo semplicemente il progetto, non vie-
In un progetto reale potrebbe incrementare ne eseguita la routine di pulizia.
un numero di build (funzione mai gestita in • Selezioniamo Esegui/Interrompi progetto
Access!). La funzione wizInfo fornisce infor-
mazioni sul wizard, mentre wizNumeroCasua- Se saltiamo lo scaricamento dell’Add-in, op-
le visualizza una message-box che stampa un pure abbiamo commesso errori nel codice, il
numero a caso. Dal riquadro Proprietà, im- menu potrebbe rimanere sporco.
postiamo il nome del modulo a modMioCo- Per rimediare, se non abbiamo altre per-
dice. Dobbiamo adesso costruire l’interfaccia sonalizzazioni manuali, è sufficiente andare
con l’utente. in modifica delle barre dei menu, seleziona-
Facciamo un click destro su AddInDesigner1 re la Barra dei menu e selezionare la funzio-
e selezioniamo Visualizza codice. ne Reimposta.
Inseriamo il codice contenuto nel Listato 2.
Se proviamo a compilare, non dovremmo ot- Come funziona l’add-in
tenere errori. Prima di analizzare il codice del Vediamo adesso in dettaglio il funzionamen-
Listato 2, collaudiamo l’add-in. to dell’add-in.
Le operazioni che esso compie sono volu-
Collaudare l’add-in tamente banali, per potersi concentrare solo
Dopo essere riusciti a compilare senza errori, sul codice di base necessario per costruire
la sequenza per collaudare l’add-in è: l’add-in.
• Esegui/Esegui
Progetto/Ok (c’è
anche il corrispon-
dente pulsante sul-
la barra Standard.
• Aggiunte/Gestione
Aggiunte. Fare dop-
pio click sul nostro
add-in (nell’esem-
pio, VBJ Wizard),
per caricarlo, poi
premere Ok.
• Nel menu Aggiun-
te troveremo le Figura 2 La form per la generazione di recordset, contenuta nell’ “Aladino Developer
due opzioni da noi Wizard”
create. Per provarle

32 VBJ N. 68 - Marzo/Aprile 2006


ACCESS

Le dichiarazioni Queste routine devono stare nel modulo di


codice associato all’AddInDesigner e, ovvia-
Private WithEvents mnuItem1 As Office.CommandBarButton mente, possono contenere chiamate a routi-
Private WithEvents mnuItem2 As Office.CommandBarButton ne contenute in moduli esterni, come succe-
de in quella appena vista.
impostano due riferimenti per le due voci
di menu che andremo a creare nella routine La dichiarazione
CreaMenu. La parola chiave WithEvents in-
dica al compilatore che, di quei due oggetti, Private WithEvents cCompila As CommandBarEvents
vogliamo gestirne gli eventi. Il modo per ge-
stire gli eventi è dichiarare una routine, come ci permette invece di gestire l’evento legato
Access fa in maniera automatica quando gli all’opzione già esistente Compila. L’associa-
chiediamo di gestire un evento di un ogget- zione tra la variabile cCompila ed il pulsan-
to, con la sintassi te di compilazione viene effettuata all’inter-
no della routine AddinInstance_OnConnec-
Private Sub <nomeVariabile>_<NomeEvento>()[parametri]) tion, dalle righe

come si vede nell’esempio seguente, dove viene ‘ Intercetta l’evento di compilazione (Debug / Compila)
gestito l’evento Click dell’oggetto mnuItem1. Dim c As CommandBarControl
Set c = VBE.CommandBars(1).Controls(5).Controls(1)
Private Sub mnuItem1_Click(ByVal Ctrl As Set cCompila = VBE.Events.CommandBarEvents(c)
Office.CommandBarButton, CancelDefault As Boolean)
All’avvio dell’add-in, viene eseguita la routi-
ne AddinInstance_On-
Connection, nella qua-
le creiamo i menu ed
impostiamo l’intercet-
tazione dell’evento di
compilazione, come vi-
sto sopra. Alla chiusu-
ra dell’add-in, tramite la
routine AddinInstance_
OnDisconnection prov-
vediamo all’eliminazio-
ne delle voci di menu.
La routine CreaMenu
è abbastanza semplice,
se si ha un’idea di come
sia il modello ad ogget-
ti delle barre di menu.
Impostato il riferimen-
to in cbrMenu, alla barra
Add-Ins di VBE, per evi-
tare duplicazioni di op-
zioni, proviamo a cerca-
Figura 3 Aggiunta di una UserForm all’add-in
re se esiste già l’opzio-
ne che vorremmo crea-
re, altrimenti la aggiun-

N. 68 - Marzo/Aprile 2006 VBJ 33


ACCESS

Listato 2 Il corpo dell'Add-in (continua...)

Option Explicit

Private WithEvents mnuItem1 As Office.CommandBarButton


Private WithEvents mnuItem2 As Office.CommandBarButton

Private WithEvents cCompila As CommandBarEvents

Private Sub AddinInstance_OnConnection(ByVal Application As Object, ByVal Connect


Mode As AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst As Object, custom() As Variant)
‘Memorizzo le referenze all’avvio
Set oHostApplication = Application
Set oAddIn = AddInInst

conNomeApp = AddInInst.ProgId

‘Crea le opzioni aggiuntive nel menu di VBE


CreaMenu (AddInInst.ProgId)

‘ Intercetta l’evento di compilazione (Debug / Compila)


Dim c As CommandBarControl
Set c = VBE.CommandBars(1).Controls(5).Controls(1)
Set cCompila = VBE.Events.CommandBarEvents(c)
End Sub

Private Sub AddinInstance_OnDisconnection(ByVal RemoveMode As AddInDesignerObjects.ext_DisconnectMode, custom()


As Variant)
‘Rimuove le opzioni dal menu
RimuoviMenu
Set oAddIn = Nothing
Set oHostApplication = Nothing
End Sub

Sub CreaMenu(strProgID As String)


‘ Crea un elemento nel menu e lo collega all’addin.
Dim cbrMenu As Office.CommandBar
Dim ctlBtnAddIn As Office.CommandBarButton
Dim strKey As String

‘ Stabilisce un riferimento al menu Add-Ins


Set cbrMenu = VBE.CommandBars(“Add-Ins”)

‘ Prova a cercare il pulsante “VBJ - Numero casuale”


strKey = “VBJWizNumCasuale”
Set mnuItem1 = cbrMenu.FindControl(Tag:=strKey)

If mnuItem1 Is Nothing Then


‘ Aggiunge il pulsante
Set mnuItem1 = cbrMenu.Controls.Add(msoControlButton, , strKey, , True)

With mnuItem1
.Caption = “VBJ - Numero casuale”
.Tag = strKey
.Style = msoButtonCaption
.FaceId = 634
.OnAction = “!<” & strProgID & “>”
.BeginGroup = True
End With
End If

‘ Prova a cercare il pulsante “Informazioni su...”


strKey = “VBJWizInfo”
Set mnuItem2 = cbrMenu.FindControl(Tag:=strKey)

34 VBJ N. 68 - Marzo/Aprile 2006


ACCESS

Listato 2 (...fine)

If mnuItem2 Is Nothing Then


‘ Aggiunge il pulsante
Set mnuItem2 = cbrMenu.Controls.Add(msoControlButton, , strKey, , True)

With mnuItem2
.Caption = “Informazioni su VBJ Developer Wizard”
.Tag = strKey
.Style = msoButtonCaption
.FaceId = 634
.OnAction = “!<” & strProgID & “>”
.BeginGroup = True
End With
End If

End Sub

Sub RimuoviMenu()
On Error Resume Next
VBE.CommandBars(“Add-Ins”).Controls(“VBJ - Numero casuale”).Delete
VBE.CommandBars(“Add-Ins”).Controls(“Informazioni su VBJ Developer Wizard”).Delete
End Sub

‘ Qui inizia la sezione che gestisce gli eventi


Private Sub mnuItem1_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
wizNumeroCasuale
End Sub

Private Sub mnuItem2_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)


wizInfo
End Sub

Private Sub cCompila_Click(ByVal CommandBarControl As Object, Handled As Boolean, CancelDefault As Boolean)


‘ Viene gestito l’evento di compilazione
wizCompila
End Sub

giamo. L’operazione viene ripetuta tante volte ma AladinoDevWizard.vba e contiene, oltre a


quante sono le voci da inserire nel menu. La tutta l’infrastruttura vista fino ad ora, una form
routine RimuoviMenu è molto semplice, limi- per generare recordset, visibile in Figura 2.
tandosi solo a tentare di cancellare le voci crea-
te in precedenza. In pratica, avendo la lista del-
le opzioni che vogliamo creare, è necessario di- Vedremo come
chiarare n variabili come mnuItemX all’inizio
della routine, inserire la creazione e la distru- aggiungere comandi
zione delle opzioni in CreaMenu e RimuoviMe- personalizzati al menu
nu ed infine creare le corrispondenti routine di
intercettazione degli eventi. Il codice del Lista-
dell’editor di VBA
to 1 non ha bisogno di commenti, essendo un
esempio ridotto all’osso.
Analizzando la sub wizGeneraRecord-
Un Add-in reale Set troviamo del codice la cui analisi esu-
Nel codice allegato trovate anche un add-in la da questo articolo, ma che merita di es-
completo, che uso per sviluppare. Il file si chia- sere studiato.

N. 68 - Marzo/Aprile 2006 VBJ 35


ACCESS

La routine, come primo compito, controlla ‘ Create a new UserForm. You can use this new VBCompo-
di essere stata chiamata con il cursore pun- nent object to manipulate the User Form.
tato in VBE all’interno di una definizione di Set x = Application.VBE.ActiveVBProject.
sub o di function. Poi, dopo aver visualizza- VBComponents.Add (vbext_ct_MSForm)
to la form e letto i relativi dati, costruisce End Sub
una stringa che contiene il codice generato.
La stringa viene inserita nella posizione in Il risultato è visibile in Figura 3.
cui si trova il cursore, dalla riga
Installazione e distribuzione
VBE.ActiveCodePane.CodeModule.InsertLines lngStartLine, Per distribuire il nostro add-in, dovre-
strCode mo prima creare la DLL tramite l’opzione
File/CreaVBJAddIn.DLL, poi selezioniamo
Utilizzando come base questo codice, Aggiunte/Creazione guidata pacchetti (di-
possiamo costruire una form che ci chie- sponibile con la versione Developer di Offi-
da l’input che vogliamo, generare il codi- ce). Seguendo le istruzioni, verrà creato un
ce corrispondente ed inserirlo nel progetto pacchetto che consentirà la distribuzione del-
corrente. Per chi non ha mai lavorato con la nostra DLL, tramite un normale program-
il modello ad oggetti di VBE, consiglio di ma di setup.
cercare esempi in rete e di leggere [1] e [2]. Conclusioni
La stesura di un Add-in per VBE è un’ope-
razione non banale, ma fattibile tranquilla-
mente da chi programma tutti i giorni. È
La prima operazione da fare importante, nel lavoro quotidiano, capire se
per progettare un add-in è scriviamo spesso parti di codice ripetitive,
perché in questo caso si può trarre parec-
analizzare quali operazioni chio beneficio creando un add-in persona-
desideriamo implementare lizzato.
Per funzioni standard tipo conteggio di ri-
ghe, ordinamento di procedure o simili, con-
viene invece fare ricerche in rete, poiché si
Esistono metodi per aggiungere sub e fun- trovano add-in già pronti e collaudati, spes-
ction, spostarsi all’interno del codice e fare so gratuiti, veramente potenti. Un esempio
altre operazioni in maniera molto semplice. è VBA MZ-Tools 3.0 [3].
Nell’add-in è inclusa una UserForm. A dif-
ferenza di Word ed Excel, pare che in Ac- Riferimenti
cess non ci sia un modo immediato per ag- [1] Programming the Microsoft Office Visual
giungerla. Probabilmente perché si pensa Basic Editor
di utilizzare le form di Access. Per aggira- http://msdn.microsoft.com/library/
re il problema, ci sono due modi. Possiamo default.asp?url=/library/en-us/dnofftalk/
personalizzare la barra dei menu aggiungen- html/office07042002.asp
do il comando UserForm, nel menu Inserisci. [2] Before You Create a VB Add-In, Learn the
Oppure possiamo inserire in un modulo il IDE’s Object Model
codice seguente che, richiamato dalla fine- http://msdn.microsoft.com/library/
stra di debug, crea una UserForm. default.asp?url=/library/en-us/dninvb00/
html/IDEObjectModel.asp
Sub Add_Form1() [3] MZ-Tools 3.0 for Visual Basic 6.0, 5.0 and
‘ Declare a variable to hold the UserForm. VBA
Dim x As Object http://www.mztools.com/v3/mztools3.htm

36 VBJ N. 68 - Marzo/Aprile 2006


WEB

Analisi degli accessi


ad un sito web Prima puntata

Tra i mezzi di comunicazione di massa il web è quello che


meglio si presta ad essere misurato; ma quanto sono affi-
dabili queste rilevazioni? E qual è il loro valore?

di Stefano Savo

I
n questa serie di due articoli cercheremo stro sito da quello che noi sup-
di rispondere a queste domande facendo il poniamo che succeda. Un si-
punto sullo stato dell’arte. Riepilogheremo stema di rilevazione degli ac-
i motivi per i quali è utile rilevare gli accessi ad cessi al sito ci consente di mi-
un sito web, analizzeremo cosa è utile e cosa è surare alcuni dati oggettivi, che
possibile misurare, e quali sono i gradi di certez- poi andranno interpretati nella
za di questi dati. Infine analizzeremo quali sono i maniera più opportuna.
metodi più usati dai numerosi software esistenti Per cominciare è sicuramen-
e come orientarsi nel mare di offerte, che va da te importante capire quali sono
prodotti open source e gratuiti a servizi dal co- le pagine più viste del sito. È
sto di decine di migliaia di euro all’anno. anche utile raggruppare tutte
quelle pagine che rivelano un
Perchè analizzare il traffico interesse in un certo settore e
Cominciamo a vedere quali sono i motivi per i misurare quindi quali sono i
quali è utile analizzare il traffico di un sito web. settori di maggior interesse.
Conoscere i visitatori del sito vuol dire sapere Una volta individuate le risor-
da dove vengono, cosa cercano, ma anche come se più apprezzate, rilevando i
cercano quello che vogliono. Questa conoscenza percorsi che vengono seguiti
ci aiuta a disegnare un sito fruibile e di successo. dai nostri utenti possiamo ca-
Un sito di facile e di veloce fruizione non stanca pire se i visitatori raggiungo-
i suoi visitatori e ne attira di nuovi. Non è sem- no facilmente quello che cer-
plice avere un’idea precisa di quello che sono e di cano e possiamo pensare di ac-
quello che vogliono gli utenti (molto spesso non lo corciare il cammino necessario
sanno nemmeno loro) ma è importante cercare di a raggiungere le risorse più ap-
distinguere quello che succede veramente sul no- prezzate del sito. D’altra parte è
possibile che alcuni dei servizi
che il nostro sito offre non ri-
Stefano Savo è ingegnere informatico e lavora da più di sultino particolarmente apprez-
cinque anni nella analisi, progettazione e sviluppo di web zati. In questo caso o rivedia-
application. Tra i suoi interessi: Information Architecture e
Web Semantico.
mo la nostre convinzioni sugli
utenti o dobbiamo pensare che

38 VBJ N. 68 - Marzo/Aprile 2006


WEB

Figura 1 Path backwards (WebTrends)

il servizio non sia usato perché non è suffi- rale per annunci di questo tipo sia la home
cientemente noto o in evidenza. Nel primo page. Questo è spesso vero, ma dobbiamo
caso dovremo rivedere il servizio o addirit- evitare che la home page sia sovraccarica
tura eliminarlo, mentre nel secondo dovre- di informazioni e ricordare che non tutti i
mo cercare di comunicare ai visitatori l’esi- visitatori passano dalla home page: i visita-
stenza del servizio e le sue qualità. Questa tori regolari hanno probabilmente dei book-
esigenza di comunicazione di novità agli mark, mentre quelli che provengono dai mo-
utenti è assai comune nelle attività onli- tori di ricerca finiscono probabilmente su al-
ne che sono sempre in evoluzione: si può tre pagine. Misurando gli accessi possiamo
ad esempio voler comunicare la nascita di quantificare questi diversi tipi di accesso al
un nuovo prodotto o la disponibilità di una sito. Se verifichiamo che un buon numero di
particolare offerta commerciale. Un siste- utenti segue un determinato percorso e ac-
ma di analisi del traffico del sito ci aiuta a cede a particolari risorse, possiamo provare
individuare quali sono gli spazi più oppor- a guidare questi utenti verso informazioni e
tuni per effettuare questa comunicazione. servizi affini ai quali non avevano pensato.
Spesso si pensa che la posizione più natu- Introdurremo cioè dei link o dei banner ad

N. 68 - Marzo/Aprile 2006 VBJ 39


WEB

Figura 2 Path forward (WebTrends)

altri servizi offerti dal nostro sito che forse servizio, e giustificare così gli investimenti
sono poco noti o troppo complicati da rag- fatti per realizzarlo o quelli utili per miglio-
giungere. È la logica del supermercato: se rarlo. Viceversa potrete decidere di chiude-
siete entrati per comprare la birra e prima re i servizi che non vengono apprezzati da-
di uscire passate davanti ai salatini, è pro- gli utenti e dirigere verso altri obiettivi le
babile che vi venga voglia anche di quelli risorse impegnate.
(assumendo che ci sia un briciolo di Homer Particolarmente importante è capire da
Simpsons in ognuno di voi… ). dove vengono i visitatori del nostro sito:
Un altro motivo valido per rilevare le visi- da link su siti partner, da banner pubblici-
te ad un sito è che un dato simile può costi- tari su portali generalisti, dai motori di ri-
tuire un solido riscontro agli investimenti cerca o da email che noi stessi abbiamo in-
necessari alla realizzazione e alla gestione viato. Può essere anche molto utile capire
di un servizio web. se i visitatori che provengono da fonti diver-
Attraverso il sistema di rilevazione degli ac- se hanno comportamenti diversi, ossia se è
cessi al sito potrete portare una prova tangi- possibile segmentare gli utenti sulla base
bile dell’interesse dei visitatori per un dato della loro provenienza. Questi dati consen-

40 VBJ N. 68 - Marzo/Aprile 2006


WEB

tono di decidere una strategia efficace per rer (che riporta l’indirizzo HTTP della pagi-
portare utenti sul nostro sito: è meglio raf- na visualizzata precedentemente).
forzare le partnership esistenti o cercarne Tutte queste informazioni vengono analizza-
di nuove? Rendono di più i banner sui por- te dalle applicazioni di web analytics che ge-
tali generalisti o le keyword sponsorizzate neralmente utilizzano due sorgenti di dati (i
sui motori di ricerca? Abbiamo molti uten- log dei web server e/o degli script implemen-
ti affezionati che però navigano solo in una tati in Javascript client-side):
parte ristretta del sito? Allora probabilmen-
te piuttosto che cercare di acquisire nuo- • I log dei web server: il web server scrive in
vi utenti con campagne di web marketing, un file tutte le richieste HTTP che riceve
conviene cercare di offrire un servizio mi- ed i parametri ad esse associate (data e ora,
gliore ai visitatori regolari. Una volta indi- indirizzo IP del richiedente, url richiesto,
viduate le fonti principali di utenti, cerchia- referer, cookie);
mo di caratterizzarle: gli utenti che hanno • Javascript client side: degli appositi script
una determinata provenienza hanno interes- Javascript vengono aggiunti alle pagi-
si omogenei? Può essere utile allora presen- ne erogate, vengono eseguiti dal browser
tare a questi utenti una pagina ad hoc che dell’utente ed inviano le suddette informa-
evidenzi chiaramente quello che possiamo zioni ad un server.
offrire per servire i loro interessi.
Ultimo ma non meno importante: un con- Ciascuna di queste fonti di informazione
trollo regolare degli accessi consente di indi- ha i suoi pregi e i suoi difetti: in alcuni casi
viduare eventuali problemi tecnici di fruizio- può essere meglio utilizzare i log del web ser-
ne: dal link sbagliato, al file troppo pesante ver ed in altri i Javascript client-side, in altri
da scaricare al plug-in troppo poco diffuso o casi ancora può essere opportuno utilizzare
di installazione troppo complessa. entrambe le fonti.
In ogni caso rimangono dei margini di incer-
Cosa si può misurare tezza sulle informazioni raccolte, che dipen-
Gli accessi ad un sito sono per la maggior dono dalla grande varietà dei possibili uten-
parte anonimi, l’identificazione degli utenti ti del sito. Le cache del browser o del proxy
viene solitamente riservata ai casi in cui è possono ad esempio nascondere una richie-
strettamente necessaria. Nonostante ciò, tra sta ai log del web server e la configurazione
i mezzi di comunicazione di massa, il web è del browser può impedire l’esecuzione di Ja-
quello che ci consente di raccogliere più in- vascript o la memorizzazione di cookie.
formazioni su come viene utilizzato il servizio
e quali sono le caratteristiche dei suoi fruito- Cercheremo di analizzare in dettaglio queste
ri. Tutta la navigazione sul web è basata sul problematiche nel prossimo articolo, per ora
protocollo HTTP che è stateless (ovvero ogni vediamo quali dati si possono estrarre:
richiesta dovrebbe venire eseguita indipen-
dentemente dalle richieste precedenti e da • page views: è il dato classico, il più antico e
quelle successive). Tuttavia da diversi anni rimane un dato importante da analizzare;
le web application che comunemente siamo
abituati ad utilizzare collegano le varie richie- • visit: è una serie di pagine consecutive vi-
ste fatte in sequenza da un utente utilizzando ste dallo stesso visitatore. Se il visitatore
cookie o parametri, ed implementano così il non vede una nuova pagina in un interval-
concetto di sessione. Inoltre in una richiesta lo di tempo specificato, la prossima pagi-
HTTP fatta da un browser internet sono so- na che egli vedrà sarà considerata come
litamente presenti campi molto interessanti, l’inizio di una nuova visita. L’affidabilità
come l’indirizzo IP del visitatore ed il refe- di questo dato è fondamentale per la va-

N. 68 - Marzo/Aprile 2006 VBJ 41


WEB

lidità di alcuni dei dati elencati di segui- ra 2 mostra dove vanno i visitatori dopo
to: (visit ratio, paths, entry page, durata aver visto una particolare pagina.
di una visita);
• entry page/exit page: sapere qual è la pri-
ma pagina che vedono in una visita i nostri
È importante cercare di di- utenti è molto interessante. Si tratta del-
l’home page o piuttosto gli utenti si sono
stinguere quello che suc- creati bookmark ad altre pagine e le rag-
cede veramente sul nostro giungono direttamente? È bene ricorda-
re, infatti, che non necessariamente l’home
sito da quello che noi sup- page viene vista da tutti gli utenti. Anche
poniamo che succeda i navigatori che provengono da una query
sui motori di ricerca possono arrivare di-
rettamente sulla pagina contenente le in-
formazioni alle quali sono interessati. An-
• visit ratio: in media quante pagine ven- che la pagina di uscita è importante: sape-
gono viste in una visita? Se questo nu- re dove i visitatori abbandonano il sito può
mero è basso significa probabilmente che evidenziare dei problemi. Non di rado ad
l’utente non è interessato a tutto quello esempio noterete che la exit page è la pa-
che il sito offre. Bisogna cercare quindi gina in cui si richiede la registrazione: un
di rendere più accattivanti le varie pro- tasso di abbandono a questo punto è fisio-
poste. Tuttavia un rapporto alto non si- logico ma capire quanti visitatori si perdo-
gnifica necessariamente che l’utente sia no per voler consentire la fruizione di un
contento, potrebbe al contrario significare servizio ai soli utenti registrati consente
che il visitatore vaga per il sito non tro- di prendere delle decisioni consapevoli;
vando quello a cui è interessato;
• referrer: da dove provengono i nostri uten-
• unique visitors: premesso che questo è ti? Questo dato è spesso importante per
probabilmente uno dei dati più difficili poter segmentare la clientela o per indi-
da calcolare, esso vorrebbe rappresentare viduare possibili siti partner;
il numero di persone fisiche che visitano
il sito. Solitamente viene misurato settan- • Keywords: un certo numero di utenti rag-
do un cookie permanente nei browser dei giunge il nostro sito cercando delle parole
visitatori (tuttavia questo cookie può es- chiave sui motori di ricerca. I software di
sere rifiutato o cancellato successivamen- web analytics sono generalmente in gra-
te). Va comunque considerato che un visi- do di fare una classifica dei termini più
tatore può collegarsi con diversi browser, ricercati (estraendoli dal referrer delle ri-
con diversi computer, da casa, dall’ufficio chieste). Questa informazione è importan-
ecc; te per capire cosa cercano i visitatori che
raggiungono il nostro sito. Può anche es-
• paths: quali percorsi vengono seguiti dai sere rivelatrice del buono/cattivo posizio-
nostri visitatori? Questo è uno dei dati più namento del nostro sito rispetto a deter-
interessanti per capire le tipologie di uten- minate keyword e può spingerci a riorga-
ti. Esistono vari modi anche grafici di rap- nizzare il contenuto del sito, in modo che
presentarli. sia indicizzato meglio dai motori di ricer-
Ad esempio la Figura 1 mostra graficamen- ca, o aiutarci nella scelta dei termini da ac-
te i diversi percorsi seguiti per arrivare ad quistare, nel caso decidessimo di fare una
una determinata pagina, mentre la Figu- campagna sui motori di ricerca.

42 VBJ N. 68 - Marzo/Aprile 2006


WEB

• web campaign: quanti utenti sono stati stri visitatori hanno trovato il sito e come lo
portati sul nostro sito dal banner che ab- hanno esplorato è importante sia che voglia-
biamo messo su Virgilio e quanti da quello te aumentare il numero di visitatori o che vo-
che abbiamo messo su Repubblica? Questo gliate conoscere meglio quelli che già avete.
dato è fondamentale per valutare i risultati Cercare di capire cosa cercano i visitatori e
di una web campaign. Spesso è anche uti- se e come trovano quello che cercano è uti-
le incrociare questo dato con il numero di lissimo per decidere quali servizi ed infor-
pagine viste (o con gli acquisti effettuati, mazioni aggiungere o rimuovere dal vostro
se vendiamo online). In questo modo pos- sito. Tuttavia può essere molto complicato
siamo determinare l’affinità dei visitatori sia ottenere dei dati affidabili che saperli in-
del sito sorgente con le nostre attività e pia- terpretare. Nel prossimo articolo ci focaliz-
nificare di conseguenza le prossime cam- zeremo sulla scelta del modo più opportuno
pagne. Solitamente per poter collegare un per misurare gli accessi evidenziando i limi-
visitatore ad una campagna si aggiungo- ti di incertezza dei vari approcci.
no dei parametri identificativi ai link che
vengono seguiti cliccando sul banner (es.
Http://www.mysite.it?from=yahoo);
Rilevare gli accessi può co-
• page group: raggruppare le pagine del no- stituire un solido riscontro
stro sito secondo criteri diversi e valutare
quali sono le aree di maggiore interesse è
agli investimenti necessari
fondamentale. La flessibilità con la quale alla realizzazione e alla ge-
è possibile definire questi gruppi è una ca-
ratteristica importante dei software di web
stione di un servizio web
analytics. Specificare una per una le pagi-
ne che fanno parte di un gruppo può esse-
re molto faticoso, ma solitamente è possi-
bile definire delle espressioni regolari sia Bibliografia
sui nomi delle pagine che sul valore dei [1] Eric T. Peterson – “Web Site Measurement
parametri passati. In alcuni software una Hacks”, O’Reilly , 2005
pagina può appartenere ad un solo grup-
po e questo può essere limitante; Riferimenti

• durata di una visita: se è breve può esse- [2] WebTrends – www.netiq.com


re un dato positivo, e significa probabil- [3] NetTracker – www.sane.com
mente che il visitatore trova rapidamen- [4] Summary – www.summary.net
te quello che cerca. Questo dato è sicura- [5] Urchin – www.urchin.com
mente solo indicativo, viene infatti calcola- [6] Pilot Hit List – www.pilotsoftware.com
to misurando il tempo passato tra le varie [7] Analog – http://www.analog.cx/
richieste, ma non è solitamente possibile [8] WebAlizer
sapere per quanto tempo il visitatore si è http://www.mrunix.net/webalizer/
fermato sull’ultima pagina, perché quan- [9] Pathalizer
do egli abbandona il sito non viene invia- http://pathalizer.sourceforge.net/
ta alcuna informazione. [10] http://www.clickz.com/experts/crm/
actionable_analysis/
Conclusioni [11] http://www.webanalyticsdemystified.com/
Misurare gli accessi ad un sito web è inte- [12] http://www.coffeesuntechnology.com/
ressante per molti motivi. Sapere come i vo- [13] http://www.hurolinan.com/

N. 68 - Marzo/Aprile 2006 VBJ 43


SOFTWARE ENGINEERING

Programmazione
Template-Oriented
La programmazione orientata ai template enfatizza il riu-
so non solo dei componenti, ma anche delle loro modalità
di utilizzo

di Lorenzo Vandoni

I
n questo articolo descriverò un approccio gettisti la possibilità di creare
del tutto personale allo sviluppo del sof- framework anche molto com-
tware, che ho battezzato Programmazio- plessi.
ne Template-Oriented. L’idea alla base di que- Dal punto di vista dell’utente/
sto approccio è nata molti anni fa, quando ho programmatore, ovvero di co-
partecipato allo sviluppo di dBsee, un prodot- lui che ha la necessità di usa-
to CASE che ha avuto anche un discreto suc- re questi framework all’inter-
cesso commerciale. no delle proprie applicazioni,
È passato molto tempo, l’idea iniziale è lenta- le modalità di utilizzo di que-
mente maturata, ed ha acquisito nel tempo an- ste librerie non sono però cam-
che alcune basi teoriche. Si tratta per ora solo di biate molto, rispetto ad alcune
un’idea, ancora lontana da una realizzazione con- decine di anni fa.
creta, ma spero che a qualcuno possa interessare. Gli strumenti più utilizzati,
Andiamo però con ordine, analizzando anzitutto soprattutto nelle prime fasi
le motivazioni alla base di questo approccio, ov- di apprendimento, rimango-
vero alcuni limiti delle tecnologie attuali. no tuttora i manuali, l’help on
line, e soprattutto gli esempi
La programmazione object-oriented forniti a corredo della libreria.
La programmazione object-oriented (OOP) ha Molto frequentemente, il codi-
permesso di realizzare librerie di classi e fra- ce scritto per utilizzare una de-
mework strutturati decisamente meglio rispet- terminata libreria viene crea-
to alle librerie di funzioni un tempo disponibi- to adattando opportunamen-
li con linguaggi come C, Pascal, Basic e Clipper. te questi esempi. La disponi-
Il livello di astrazione è più alto, e i meccanismi bilità, la quantità e la qualità
di ereditarietà e incapsulamento offrono ai pro- di documentazione ed esempi
costituisce ancora oggi uno dei
fattori più importanti per deci-
Lorenzo Vandoni è laureato in Informatica, ed è uno specialista
dere di acquisire una determi-
di progettazione e sviluppo con tecniche e linguaggi object- nata libreria. Il tempo richiesto
oriented. Attualmente è direttore del Laboratorio di Ricerca e per l’apprendimento, inoltre, è
Sviluppo di Emisfera e coordina un progetto di ricerca sulle Reti
ancora una voce di costo non
Wireless finanziato nell’ambito del Sesto Programma Quadro
(FP6) della Comunità Europea. Può essere contattato tramite banale, e spesso capita di sce-
e-mail all’indirizzo vandoni@infomedia.it. gliere di utilizzare una libreria

44 VBJ N. 68 - Marzo/Aprile 2006


SOFTWARE ENGINEERING

solo perché ci è già nota, rinunciando ma- te come alternative alla classica OOP, ma
gari ad alternative di migliore qualità, ma come elementi aggiuntivi, da utilizzare per
mai precedentemente utilizzate. la risoluzione di particolari problemi.
Il limite di questa tecnologia, dal punto di Anche la programmazione Template-Orien-
vista del riuso del codice, è quindi la poca ted va nella stessa direzione. Prima di in-
attenzione rivolta agli stessi meccanismi di trodurla, però, dobbiamo fare un passo in-
riuso, ovvero alle modalità con cui un com- dietro nel tempo.
ponente riusabile possa essere selezionato,
compreso, utilizzato e quindi inserito nel I generatori di codice
contesto di un’applicazione. Gli anni ’90 hanno visto una certa prolife-
riazione di strumenti di sviluppo che si qua-
Sviluppi recenti nell’ingegneria lificavano come strumenti CASE di basso li-
del software vello. L’adozione di questi strumenti preve-
Alcuni tra i più recenti sviluppi nell’ambi- deva tipicamente l’utilizzo di strumenti vi-
to dell’ingegneria del software hanno mes- suali per specificare i vari componenti del-
so in luce, più o meno direttamente, questo l’applicazione, come ad esempio la struttu-
problema, e hanno proposto diverse possibi- ra della base dati, il design delle maschere
li soluzioni. Facendo una rapida carrellata, e dei report.
possiamo considerare: Il codice dell’applicazione veniva succes-
sivamente generato in modo del tutto auto-
• i Design Pattern, che hanno mostrato che matico, includendo anche molte funziona-
è possibile definire soluzioni generiche lità complesse, e ottenendo significativi ri-
per problemi ricorrenti. Questi pattern sparmi sui tempi di sviluppo e soprattutto
sono piuttosto generici, e mostrano come di manutenzione.
assemblare delle classi per risolvere un
problema;
• La Programmazione Aspect-Oriented
(AOP), che ha introdotto l’idea di pro- Gli strumenti più utilizza-
grammare separatamente gli aspetti ti sono tuttora i manuali,
“orizzontali” di un’applicazione, come
la gestione degli errori o della persi- l’help on line e gli esempi
stenza; forniti a corredo
• Model Driven Architecture (MDA) e Exe-
cutable UML (xUML), che hanno propo-
sto di generare automaticamente il codi-
ce applicativo a partire da descrizioni di Questi strumenti permettevano di imple-
alto livello; mentare applicazioni in modo molto simile
• Extreme Programming (XP), che ha posto a quanto oggi può essere fatto, ad esempio,
l’enfasi sul fatto, non del tutto lapalissia- per la realizzazione dei programmi di instal-
no, che l’unico modo per scrivere più ve- lazione, utilizzando tool come InstallShield.
locemente il codice è quello di scriverne Il problema principale dei generatori di co-
meno. dice, anche se allora non ci si rendeva con-
to di questo aspetto, era l’assoluta mancan-
Un aspetto comune a tutti questi approcci za di attenzione verso gli standard.
è quello di avere posto in evidenza alcuni Ogni strumento viveva in un mondo a sé,
limiti nelle attuali tecniche di progettazio- del tutto separato dagli altri, e permetteva
ne e programmazione ad oggetti, suggeren- di realizzare applicazioni sostanzialmen-
do però soluzioni che non vanno considera- te chiuse.

N. 68 - Marzo/Aprile 2006 VBJ 45


SOFTWARE ENGINEERING

Per questo ed altri motivi questo approccio un apposito tool, ottenendo la generazione
non ha avuto il successo che, forse, merita- del codice applicativo. La programmazione
va. Visto che però oggi, grazie soprattutto a Template-Oriented prevede quindi due fi-
MDA e xUML, si torna a parlare di genera- gure professionali: lo sviluppatore di siste-
zione di codice, può essere utile riconsidera- ma, che crea o conosce le librerie, e che si
re alcune lezioni che la storia legata all’uti- occupa di codificarne l’utilizzo all’interno
lizzo di questi strumenti ci dovrebbe avere dei template, e lo sviluppatore applicativo,
insegnato, e in particolare: che sfrutta i template per generare il codi-
ce applicativo.
• questi sistemi hanno funzionato solo se Questo tipo di programmazione si può af-
legati a un particolare dominio applicati- fiancare alle tecniche tradizionali, come
vo; non è mai stato costruito un genera- OOP, e a quelle più recenti, senza ambire
tore di codice del tutto generico; a sostituirle. Vediamo ora più in dettaglio
• la struttura delle applicazioni generate è come si potrebbe realizzare un sistema a
piuttosto rigida; questo, se da una par- supporto di questa idea.
te può essere un beneficio in termini di
omogeneità e standardizzazione del codi-
ce, dall’altra può risultare un problema in
MDA e xUML hanno pro-
quanto rende più difficile soddisfare esi-
genze particolari; posto di generare automa-
• in ogni caso, è impossibile evitare del tut- ticamente il codice appli-
to interventi manuali sul codice genera-
to, perché il generatore di codice non può cativo a partire da descri-
prevedere tutte le situazioni possibili; in- zioni di alto livello
tervenire sul codice significa anzitutto do-
verlo comprendere, e quindi prevedere un
meccanismo che preservi le modifiche ef-
fettuate nel caso di successive generazio- Un sistema Template-Oriented
ni di codice. Un template, come si è detto, è una por-
zione di codice parametrica, di dimensione
Credo che queste limitazioni non siano le- variabile, che codifica il modo con cui deve
gate a particolari caratteristiche degli stru- essere utilizzata una determinata libreria
menti presenti negli anni ’90, ma piuttosto per implementare un certo tipo di funzio-
intrinseche in un qualsiasi approccio che pre- ne. Ad esempio, potremmo avere un tem-
veda la generazione di codice a partire da de- plate che codifica la realizzazione di una
scrizioni di più alto livello. maschera gestionale di tipo testata-detta-
glio in ASP.NET.
La programmazione Il template contiene al suo interno ele-
Template-Oriented menti di tipo parametrico, scritti secondo
L’idea alla base della programmazione la sintassi di un particolare Template Lan-
Template-Oriented è quella di fornire un guage, che identificano le informazioni che
supporto concreto all’utilizzo di librerie e l’utente deve specificare per completare lo
framework per costruire applicazioni. stesso template, in modo che questo pos-
Ogni algoritmo che possa essere implemen- sa essere convertito in codice compilabile
tato tramite una libreria viene rappresentato e funzionante.
usando uno scheletro di codice, denomina- L’inserimento di queste informazioni vie-
to template, che può essere completato in- ne effettuato utilizzando un apposito tool,
terattivamente dal programmatore usando in grado di leggere il template, riconoscere

46 VBJ N. 68 - Marzo/Aprile 2006


SOFTWARE ENGINEERING

gli elementi parametrici, e permettere al- mazioni in template differenti. Per esem-
l’utente di completarli. Oltre a un tool di pio, se due template richiedono l’accesso
tipo generico, utilizzabile per tutti i templa- ad una tabella di database dove sono re-
te, è possibile prevedere alcuni tool specifici, gistrati i clienti dell’azienda, la stringa di
progettati per semplificare l’utilizzo di alcu- connessione per l’accesso a questa tabel-
ni template particolari. Ad esempio, la posi- la, il nome della stessa, e i nomi dei suoi
zione di un elemento grafico sullo schermo campi potranno essere registrati nel repo-
potrebbe essere definita trascinando l’ele- sitory e recuperati successivamente;
mento stesso alla posizione desiderata, e • un sistema che consenta di mantenere
non scrivendo manualmente le coordinate una visione globale dell’applicazione, che
corrispondenti. permetta di selezionare i vari template da
Questi tool specifici dovrebbero somiglia- utilizzare per realizzare i vari componenti
re a quelli comunemente presenti nei mo- del programma, e quindi di assemblare il
derni ambienti di sviluppo visuale, ed esse- codice generato.
re utilizzati soprattutto per la gestione dei Questo sistema potrebbe somigliare molto
template relativi all’interfaccia grafica del- ad uno dei moderni ambienti di sviluppo,
l’applicazione. o addirittura essere costituito da un add-
Una volta completati tutti gli elementi di in di uno di questi;
tipo parametrico, entrerà in gioco un gene- • un Template Editor rivolto agli sviluppa-
ratore di codice, in grado di produrre i sor- tori di sistema.
genti dell’applicazione a partire dal template
e dalle informazioni inserite dall’utente. Un sistema di questo tipo permetterebbe
un reale riuso delle conoscenze e delle com-
petenze, permettendo di utilizzare al meglio
framework e librerie.
Gli anni ’90 hanno Potrebbe essere utilizzato sia come stru-
visto la proliferiazione mento di uso interno, in un’organizzazione
che preveda una distinzione tra programma-
di strumenti CASE tori di sistema e applicativi, sia come suppor-
di basso livello to alla vendita o alla distribuzione di librerie
commerciali.

Conclusioni
Alcune caratteristiche aggiuntive Come detto, per ora l’idea è poco più che
La disponibilità di uno o più tool che sup- abbozzata, e tale rimarrà fino a quando non
portino l’utente nell’utilizzo dei template, e riuscirò a trovare un meccanismo per riu-
di un generatore di codice, costituiscono le scire a dedicarci più tempo e a coinvolge-
caratteristiche minime di un sistema Tem- re altri.
plate-Oriented. I prossimi passi dovrebbero riguardare
Perché questo possa essere però realmente una più precisa definizione dei componen-
utile, occorre prevedere alcune caratteristiche ti fondamentali del sistema, primo tra tutti
aggiuntive, ovvero: il Template Language, con particolare atten-
zione agli standard esistenti ed emergenti.
• un Repository che contenga tutte le infor- In ogni caso, al di là del fatto di riuscire o
mazioni inserite dall’utente e specifiche meno ad arrivare ad un risultato concreto,
per una determinata applicazione. Que- questo potrà servire a ragionare attivamen-
sto repository risulta utile soprattutto per te sulle tecnologie che utilizziamo ogni gior-
evitare di inserire più volte le stesse infor- no, invece di limitarsi a subirle.

N. 68 - Marzo/Aprile 2006 VBJ 47


APPLICATIVI

Controllo Remoto
in Visual Basic .NET
In questa ultima puntata, creeremo una classe per gestire
da remoto il registro di sistema

Quinta puntata
di Stefano Corti

D
opo avere esaminato il codice che im- È quindi possibile operare su
plementa tutte le funzionalità per tra- LocalMachine, CurrentUser,
sferire file di qualsiasi estensione tra le ClassesRoot e Users. Premen-
due macchine, occupiamoci della progettazione do il pulsante “Imposta Chiave
di una classe che espone proprietà e metodi per Hive Registro su cui lavorare”,
gestire da remoto il registro di sistema. viene memorizzata la chiave
In verità i sistemi operativi WindowsXP/2000/NT base sulla quale verranno ese-
consentono nativamente tale operazione, ma ri- guite le varie interrogazioni ed
teniamo opportuno implementare anche questo eventuali modifiche.
aspetto operativo nel nostro progetto, al fine di Vediamo come scrivere il co-
familiarizzare e comprendere in dettaglio le clas- dice per ottenere queste fun-
si del .NET framework che si occupano della ge- zioni. Nel Listato 1 si può ve-
stione del registry. In questa trattazione diamo dere il codice che gestisce, lato
però per scontato che il lettore, così come l’even- Controller, la GUI cui abbiamo
tuale amministratore che opera sulla macchina appena fatto cenno. In questo
Controller, conosca approfonditamente il registro caso il comando inviato attra-
e che sappia come gestirlo correttamente, avver- verso il nostro socket di flusso
tendo che un’errata operazione su tale sistema è SETREGISTRYBASEKEY>,
può compromettere definitivamente la stabilità seguito dal nome vero e proprio
dell’intera macchina, costringendo ad una com- della Hive del registro remoto.
pleta reinstallazione del sistema operativo. Naturalmente abbiamo anche
previsto, mediante un sempli-
Come si può osservare nella Figura 1, l’ammi- ce valore flag, l’apposito mes-
nistratore deve prima di tutto decidere su quale saggio di errore nel caso che
Hive intende agire, semplicemente selezionan- l’utente prema il pulsante sen-
do il pulsante radio corrispondente alla Hive in- za avere precedentemente se-
teressata. lezionato alcun radio button.
Vediamo ora come tutto que-
Stefano Corti si occupa di programmazione PHP e JSP lato sto viene gestito lato server.
server, della piattaforma .NET e di integrazione di sistemi legacy Nel Listato 2 possiamo vede-
con le nuove realtà del web, soprattutto in ambito gestionale, re la porzione all’interno del-
bancario e finanziario. È attualmente alle dipendenze di un
primario gruppo bancario italiano.
la struttura Select Case che si
occupa di interpretare e gestire

48 VBJ N. 68 - Marzo/Aprile 2006


APPLICATIVI

Figura 1 Controllo del registro remoto

tutti i comandi preposti alla gestione del re- del controller troviamo quindi un secondo
gistro. Precisiamo che abbiamo già provve- riquadro che contiene l’editor del registro
duto a creare un oggetto objReg di tipo Re- vero e proprio. Il primo pulsante permette
moteRegistry per il quale verranno invocati di eseguire un’esplorazione completa della
i relativi metodi pubblici esposti dall’omoni- Hive selezionata.
ma classe RemoteRegistry che ci accingiamo
a realizzare. Per impostare la chiave Hive
su cui lavorare, assegniamo quindi il valo- Occupiamoci della proget-
re di job(1) alla proprietà SelectedBaseKey tazione di una classe che
dell’oggetto objReg.
Nel Listato 3 possiamo vedere il codice che espone proprietà e meto-
implementa le tre semplici proprietà pub- di per gestire da remoto
bliche della nostra classe. In pratica il va-
lore di job(1) viene passato ad una variabi-
il registro di sistema
le privata all’interno della classe.
Questa variabile servirà esclusivamente
all’interno della classe medesima per man- Nel Listato 4 è possibile osservare il codice
tenere in memoria la chiave Hive del regi- che implementa il metodo pubblico explore-
stro sulla quale si sta lavorando. Nella GUI BaseRegistry() che permette al server Target

N. 68 - Marzo/Aprile 2006 VBJ 49


APPLICATIVI

Listato 1 Metodo che imposta la Hive di partenza

Private Sub impoBaseKeyBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles impoBaseKeyBtn.Click


Dim messGo As String = “SETREGISTRYBASEKEY>”
Dim ba_ke As String
Dim rFlag As Integer

If RadioRLocalMachine.Checked Then
ba_ke = “LocalMachine”
rFlag = 1
End If
If RadioRClassesRoot.Checked Then
ba_ke = “ClassesRoot”
rFlag = 1
End If
If RadioRCurrentUser.Checked Then
ba_ke = “CurrentUser”
rFlag = 1
End If
If RadioRUsers.Checked Then
ba_ke = “Users”
rFlag = 1
End If

If (rFlag) Then
Try
writer.Write(messGo & ba_ke)
inMessages.Clear()
inMessages.Text &= vbCrLf & “Comando Inviato: “ & _vbCrLf & messGo
Catch exception As SocketException
inMessages.Text &= “Errore di comunicazione con il computer remoto: “ & _exception.Message & vbCrLf
Catch ex As Exception
inMessages.Text &= “Errore: “ & ex.Message & vbCrLf
End Try
Else
MessageBox.Show(“Dovete scegliere una classe base”, “Errore Registro”, MessageBoxButtons.OK, MessageBoxIcon.Stop)
End If
End Sub

di restituire al Controller una stringa conte- con tutte le chiavi contenute all’interno del-
nente tutte le chiavi all’interno della Hive la Hive selezionata. A questo punto l’ammi-
selezionata. La stringa ottenuta può essere nistratore può selezionare una sottochiave,
“splittata” mediante un carattere separato- eseguire un’esplorazione della nuova sotto-
re e i vari elementi possono essere utilizza- chiave selezionata, oppure creare una sotto-
ti dal Controller per popolare il ListBox1 vi- chiave del tutto nuova. Nel Listato 5 è vi-
sibile in Figura 1. Osserviamo l’utilizzo del sibile il codice lato Controller che consen-
metodo pubblico GetSubKeyNames() mem- te di intercettare la sottochiave selezionata
bro della classe RegistryKey, che consente nel ListBox1 ed eseguire una nuova esplo-
di recuperare una matrice di stringhe con- razione. Il metodo pubblico della classe Re-
tenente i nomi delle sottochiavi. Tale matri- moteRegistry, che consente una successiva
ce viene quindi iterata nel successivo ciclo esplorazione relativa ad una sottochiave se-
For Each Next per costruire la stringa rRe- lezionata nel ListBox1, è visibile nel Listato
turnKeyNames il cui valore viene ritornato 6 e viene chiamato exploreTreeRegistry(). Si
al ciclo principale del server. Proseguendo tratta di un metodo abbastanza complesso
nella progettazione della GUI del Control- che ora analizzeremo in dettaglio. Prima di
ler, vediamo che il ListBox1 viene popolato tutto alla variabile rK viene passato per valo-

50 VBJ N. 68 - Marzo/Aprile 2006


APPLICATIVI

re il contenuto di job(1). La variabile privata


rKey di tipo RegistryKey, poiché modificata
mediante il metodo exploreBaseRegistry(),
contiene il valore della chiave Hive corrente.
Viene quindi invocato il metodo sovraccari-
co OpenSubKey() che consente di recupera-
re una sottochiave specificata e di determi-
nare l’accesso in scrittura alla chiave stessa,
impostando su True il secondo parametro di
overload di tipo Boolean. Successivamente
viene recuperato l’array di valori utilizzando
il metodo GetSubKeyNames(), già analizzato.
All’interno del ciclo For Each viene quindi
creata la stringa rKeyToExplore contenente
il percorso relativo di ciascuna sottochiave,
con tanti livelli quanto più l’esplorazione è
stata eseguita in profondità. Per delimita- Figura 2 Form3 per l’inserimento di nome/valore
all’interno di una chiave/sottochiave
re ciascun percorso, utilizziamo il consueto
carattere separatore, mentre il valore della
Hive di partenza si trova sempre memoriz-
zato nella variabile privata rKey. Il control- membri della classe RegistryKey. Vediamo
lo sulla matrice oSK, mediante la proprietà ora come creare una nuova sottochiave all’in-
Length, viene effettuato allo scopo di deter- terno della struttura del Registry. Il metodo
minare se l’array stesso contiene più di un in questione è visibile nel Listato 7, men-
elemento, ovvero se il numero totale di in- tre il Listato 8 contiene il codice che gesti-
dici è maggiore di zero. sce l’intera operazione dal lato Controller.
Prima di tutto l’amministratore deve sele-
zionare all’interno del ListBox1 una chiave
(o una sottochiave) all’interno della quale
Un'errata operazione sul generare una nuova ulteriore sottochiave.
registry può compromette- Alla variabile stringa kToC viene passato
il valore ritornato dalla funzione InputBox
re definitivamente la stabi- che determina la comparsa di una finestra
lità dell'intera macchina di prompt con relativo campo di testo, nel
quale l’utente dovrà inserire il nome della
sottochiave da generare (che sarà in defi-
nitiva una ulteriore sottochiave della sotto-
In caso contrario significa che l’ammini- chiave – o chiave – selezionata del ListBox1).
stratore è arrivato al livello più basso del- La stringa finale, contenuta nella variabi-
l’esplorazione e quindi l’ultima sottochia- le messGo, sarà dunque costituita dall’inte-
ve esplorata non può che contenere coppie ro persorso relativo (senza radice hive) co-
di nomi e valori. Tali elementi vengono re- piato direttamente dalla stringa seleziona-
cuperati tramite i metodi GetValueNames() ta nel ListBox1 più un carattere separatore
e GetValue(). Il primo metodo consente di seguito infine dal nome della nuova sotto-
recuperare un array di stringhe contenente chiave (valore stringa di KtoC). Il metodo
tutti i nomi dei valori associati alla chiave, publico createSubRegistryKey() in esecu-
mentre il secondo consente di recuperare il zione su Target, si occupa prima di tutto di
valore specificato. Entrambi i metodi sono segmentare la stringa inviata attraverso il

N. 68 - Marzo/Aprile 2006 VBJ 51


APPLICATIVI

Listato 2 Struttura Select Case per il controllo del registro (continua...)

Case Is = “SETREGISTRYBASEKEY”
Try
sentText.Clear()
sentText.Text = “IMPOSTATA CHIAVE BASE REGISTRO: “ & job(1) & vbCrLf
objReg.SelectedBaseKey = job(1)
writer.Write(“OKREGBASEKEY>” & objReg.SelectedBaseKey)
Catch exception As SocketException
sentText.Clear()
sentText.Text = “Errore di Comunicazione: “ & exception.Message & vbCrLf
Catch er As Exception
sentText.Clear()
sentText.Text = “Errore: “ & er.Message & vbCrLf
End Try

Case Is = “MODIFYREGKEYVALUE”
sentText.Clear()
sentText.Text = “Richiesta Modifica Registro.”
Try
writer.Write(“CONFIRMMODIFYREGKEYVALUE>” & objReg.showOnlyKeyValue(job(1)))
Catch exception As SocketException
sentText.Clear()
sentText.Text = “Errore di Comunicazione: “ & exception.Message & vbCrLf
Catch er As Exception
sentText.Clear()
sentText.Text = “Errore: “ & er.Message & vbCrLf
End Try

Case Is = “SETNEWKEYVALUE”
sentText.Clear()
sentText.Text = “Richiesta modifica Registro in corso...”
Try
writer.Write(“OKMODIFYREGKEYVALUE>” & objReg.modReg(job(1)))
Catch exception As SocketException
sentText.Clear()
sentText.Text = “Errore di Comunicazione: “ & exception.Message & vbCrLf
Catch er As Exception
sentText.Clear()
sentText.Text = “Errore: “ & er.Message & vbCrLf
End Try
Case Is = “SETNEWNAMEANDVALUE”
sentText.Clear()
sentText.Text = “Richiesta Inserimento Nuovi Valori in Registro in corso...”
Try
writer.Write(“RESULTCREATEREGKEYVALUE>” & objReg.creaReg(job(1)))
Catch exception As SocketException
sentText.Clear()
sentText.Text = “Errore di Comunicazione: “ & exception.Message & vbCrLf
Catch er As Exception
sentText.Clear()
sentText.Text = “Errore: “ & er.Message & vbCrLf
End Try
Case Is = “GETBASESUBKEYS”
Try
sentText.Clear()
sentText.Text = “Trasmissione sottochiavi base registro” & vbCrLf
writer.Write(“REPLYBASESUBKEYS>” & objReg.exploreBaseRegistry())
Catch exception As SocketException
sentText.Clear()
sentText.Text = “Errore di Comunicazione: “ & exception.Message & vbCrLf
Catch er As Exception
sentText.Clear()
sentText.Text = “Errore: “ & er.Message & vbCrLf
End Try

Case Is = “GETSELECTEDSUBKEYS”

52 VBJ N. 68 - Marzo/Aprile 2006


APPLICATIVI

Listato 2 (...fine)

sentText.Clear()
sentText.Text = “Richieste SottoChiavi del Registry di Sistema”
Try
writer.Write(objReg.exploreTreeRegistry(job(1)))
Catch exception As SocketException
sentText.Clear()
sentText.Text = “Errore di Comunicazione: “ & exception.Message & vbCrLf
Catch sre As Exception
sentText.Clear()
sentText.Text = “Errore: “ & sre.Message & vbCrLf
End Try

Case Is = “CREATESUBKEY”
sentText.Clear()
sentText.Text = “Creazione nuova Chiave/Sottochiave in corso” & vbCrLf
If (objReg.createSubRegistryKey(job(1))) Then
Try
writer.Write(“OKCREATESUBKEY>Nuova Chiave/Sottochiave creata correttamente”)
Catch exception As SocketException
MessageBox.Show(“Errore di Comunicazione: “ & exception.Message, _
“Errore di Comunicazione”, MessageBoxButtons.OK, MessageBoxIcon.Error)
Catch e As Exception
MessageBox.Show(“Errore Generico: “ & e.Message, _
“Errore di Comunicazione”, MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
Else
Try
writer.Write(“OKCREATESUBKEY>Errore: creazione nuova Chiave/Sottochiave non eseguita”)
Catch exception As SocketException
MessageBox.Show(“Errore di Comunicazione: “ & exception.Message, _
“Errore di Comunicazione”, MessageBoxButtons.OK, MessageBoxIcon.Error)
Catch e As Exception
MessageBox.Show(“Errore Generico: “ & e.Message, _
“Errore di Comunicazione”, MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End If

Case Is = “SHOWKEYNAMESANDVALUES”
sentText.Clear()
Dim rChain As String = objReg.showKeyNamesAndValues(job(1))
sentText.Text = “Trasmissione copie nomi/valori chiave registro” & vbCrLf
Try
writer.Write(rChain)
Catch exception As SocketException
MessageBox.Show(“Errore di Comunicazione: “ & exception.Message, _
“Errore di Comunicazione”, MessageBoxButtons.OK, MessageBoxIcon.Error)
Catch e As Exception
MessageBox.Show(“Errore Generico: “ & e.Message, _
“Errore di Comunicazione”, MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try

Case Is = “SHOWONLYKEYVALUE”
sentText.Clear()
sentText.Text = “Interrogazione contenuto valore chiave registry in corso...”
Dim vChain As String = “REPLYONLYKEYVALUE>” & objReg.showOnlyKeyValue(job(1))
Try
writer.Write(vChain)
Catch exception As SocketException
MessageBox.Show(“Errore di Comunicazione: “ & exception.Message, _
“Errore di Comunicazione”, MessageBoxButtons.OK, MessageBoxIcon.Error)
Catch e As Exception
MessageBox.Show(“Errore Generico: “ & e.Message, _
“Errore di Comunicazione”, MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try

N. 68 - Marzo/Aprile 2006 VBJ 53


APPLICATIVI

Listato 3 Proprietà pubbliche della classe tipo RegistryKey che rappresenta la Hive
RemoteRegistry di partenza.
In una particolare chiave o sottochiave
Public Property SelectedBaseKey() As String possono essere contenute diverse variabili
Get (o nomi) ed ogni nome può contenere dati
Return rBaseKey
di diverso tipo.
End Get
Set(ByVal Value As String) I valori consentiti nel registro di sistema
rBaseKey = Value possono essere di tipo DWORD, binario e
rCurrentKey = Nothing
End Set stringa. I valori di tipo stringa possono esse-
End Property re rappresentati dalle seguenti categorie:
Public Property CurrentKey() As String
Get • sz: i dati sono rappresentati come valore
Return rCurrentKey di tipo stringa Unicode con terminazione
End Get
Set(ByVal Value As String) null
rCurrentKey = Value
End Set
• multi_sz: i dati sono rappresentati come
End Property matrice di stringhe Unicode con termi-
nazione null
Public Property CurrentValue() As String
Get • expanded_sz: i dati sono rappresentati
Return rCurrentValue come stringa Unicode con terminazione
End Get null e riferimenti espansi alle variabili
Set(ByVal Value As String)
rCurrentValue = Value di ambiente
End Set
End Property
Ricordiamo che la chiave/sottochiave aper-
ta con il valore da impostare deve essere sta-
socket di rete, ottenendo quindi tutto il per- ta definita con l’accesso in scrittura e non
corso relativo gerarchico ed infine genera la può essere di sola lettura.
nuova sottochiave. Tutto questo viene ese- Una volta determinato l’accesso in scrittu-
guito dalla seguente linea di codice. ra a una chiave è possibile modificare i dati
associati a qualsiasi valore della chiave stes-
rKey.OpenSubKey(kCCC(0), True).CreateSubKey(kCCC(1)) sa. Inoltre è prevista anche la possibilità di
aggiungere nuove coppie nome/valore all’in-
terno di una particolare chiave o sottochia-
ve. In questo contesto creiamo una nuova
In una particolare chia- Form che verrà inizializzata e resa visibile
ve o sottochiave pos- quando l’amministratore premerà il relativo
sono essere contenute pulsante sulla GUI del controller. La Form
è visibile in Figura 2. Abbiamo previsto due
diverse variabili campi di testo nei quali l’utente può inseri-
re la variabile ed il valore associato.
Dal Listato 9 è possibile evincere che in
Il valore di kCCC(0) contiene il percorso questo contesto è direttamente la nuova
relativo completo all’interno della struttura Form che si occupa di iniettare nel socket
del registro, che viene passato al metodo so- di flusso i valori digitati dall’utente unita-
vraccarico OpenSubKey(), mentre kCCC(1) mente al comando relativo, in quando nella
è il valore che effettivamente viene passa- Form principale dell’applicativo Controller
to al metodo CreateSubKey() che si occupa (Form1) gli oggetti writer e reader – rispetti-
della generazione della nuova sottochiave. vamente di tipo BinaryWriter e BinaryRea-
Come sempre rKey contiene un valore di der – sono dichiarati pubblici e statici, quin-

54 VBJ N. 68 - Marzo/Aprile 2006


APPLICATIVI

di accessibili anche dalla classe Form3, in- Listato 4 Metodo che esplora le Hive del
vocabili direttamente specificando la classe Registry
di appartenenza, senza bisogno di istanzia-
re nuovi oggetti. Public Function exploreBaseRegistry() As String
Sul lato server il metodo che abbiamo im- rReturnKeyNames = Nothing
rCurrentKey = Nothing
plementato si chiama creaReg() ed utiliz-
If rBaseKey = “CurrentUser” Then
za la seguente linea di codice per creare i rKey = Registry.CurrentUser
nuovi valori. ElseIf rBaseKey = “LocalMachine” Then
rKey = Registry.LocalMachine
ElseIf rBaseKey = “ClassesRoot” Then
rKey.OpenSubKey(CCCC(0), True).SetValue(CCCC(1), CCCC(2)) rKey = Registry.ClassesRoot
ElseIf rBaseKey = “Users” Then
rKey = Registry.Users
Il metodo SetValue() prevede appunto due Else
parametri e genera così un nuovo nome di MessageBox.Show(“Errore nella Selezione _
Chiave Base”, “Errore Registry”, _
variabile ed il relativo valore all’interno della MessageBoxButtons.OK, MessageBoxIcon.Error)
chiave/sottochiave selezionata aperta per la End If
rListKeyNames = rKey.GetSubKeyNames()
scrittura dal metodo OpenSubKey(), più vol- For Each rArrayKeyNames In rListKeyNames
te menzionato. L’amministratore che opera rReturnKeyNames &= rArrayKeyNames & “*”
Next
sul programma Controller ha anche la pos- Return rReturnKeyNames
sibilità di modificare il valore di una o più End Function
variabili già presenti nella chiave/sottochia-
ve selezionata. Per prima cosa devono esse-
re elencate tutte le coppie nome-valore al- il server Target e la macchina Controller.
l’interno della sottochiave scelta. Prima di tutto alla pressione del pulsante
Tali elementi, recuperati mediante i metodi “Modifica Valore” viene inviato il coman-
già descritti, vengono visualizzati nel List- do MODIFYREGKEYVALUE> seguito dal-
Box2 nella par-
te inferiore dello Listato 5 Gestione del pulsante Esplora Hive Selezionata
schermo (vedi Fi-
gura 1). L’utente
può quindi sele- Private Sub subKeyExploBtn_Click(ByVal sender As System.Object, ByVal e As
zionare una par- System.EventArgs) Handles subKeyExploBtn.Click
ticolare variabi- Dim selRR As String = ListBox1.SelectedItem
If ((RadioRUsers.Checked Or RadioRLocalMachine.Checked Or _
le in questo List- RadioRClassesRoot.Checked Or RadioRCurrentUser.Checked) And _
Box e visualizzare (baseKeyField.Text <> Nothing Or baseKeyField.Text <> “”)) And _
(selRR <> Nothing Or selRR <> “”) Then
i dati in essa con- Dim messGo As String = “GETSELECTEDSUBKEYS>” & selRR
tenuti oppure può Try
writer.Write(messGo)
anche decidere di inMessages.Clear()
modificare i dati inMessages.Text &= vbCrLf & “Comando Inviato: “ & _
medesimi. Que- vbCrLf & messGo
Catch exception As SocketException
sto processo è un inMessages.Text &= “Errore di comunicazione con il computer remoto: “ & _
poco più comples- exception.Message & vbCrLf
Catch ex As Exception
so rispetto ai casi inMessages.Text &= “Errore: “ & ex.Message & vbCrLf
fin qui illustra- End Try
Else
ti, poiché preve-
MessageBox.Show(“Dovete prima scegliere e impostare una classe base” & _
de più sessioni vbCrLf & “poi selezionare una sottochiave dalla lista”, “Errore Registro”,
di comunicazio- MessageBoxButtons.OK, MessageBoxIcon.Stop)
End If
ne basate sul no- End Sub
stro protocollo tra

N. 68 - Marzo/Aprile 2006 VBJ 55


APPLICATIVI

Listato 6 Metodo che esplora gerarchicamente la struttura del Registry

Public Function exploreTreeRegistry(ByVal rK As String) As String


rKeyToExplore = Nothing
kToExplore = Nothing

kToExplore = rK

Dim oSK As String()


Try
rCurrentKey = kToExplore
oSK = rKey.OpenSubKey(kToExplore, True).GetSubKeyNames()
Dim listASK As String
If oSK.Length > 0 Then
For Each listASK In oSK
If (rCurrentKey <> Nothing) Then
rKeyToExplore &= kToExplore & “¥” & listASK & “*”
Else
rKeyToExplore &= kToExplore & “¥” & listASK & “*”
End If
Next
Return “REPLYSUBKEYS>” & rKeyToExplore
Else
Dim rMatr As String()
Dim rT As String
Dim rFS As String
rMatr = rKey.OpenSubKey(rCurrentKey, True).GetValueNames()
For Each rT In rMatr
rFS &= “Nome Chiave: “ & rT & vbCrLf
Try
rFS &= “Valore: “ & rKey.OpenSubKey(rCurrentKey, True).GetValue(rT) & “*”
Catch ecast As System.InvalidCastException
rFS &= “...........” & “*”
Catch erege As Exception
rFS &= “...........” & “*”
End Try
Next
Return “REPLYKEYVALUES>” & rFS
End If
Catch genex As Exception
MessageBox.Show(“Errore nell’interrogazione del registro: “ & genex.Message, MessageBoxButtons.OK,
MessageBoxIcon.Exclamation)
End Try
End Function

l’elemento selezionato nel


Listato 7 Metodo per la creazione di nuove chiavi/sottochiavi ListBox2.
Se osserviamo nuovamen-
te il Listato 2 possiamo no-
Public Function createSubRegistryKey(ByVal sToSplit As String) As Boolean tare che il server rispon-
Dim o_delimStr As String = “*”
Dim o_delimiter As Char() = o_delimStr.ToCharArray()
de con il comando di con-
Dim kCCC() As String = sToSplit.Split(o_delimiter, 2) ferma CONFIRMMODI-
Try FYREGKEYVALUE> se-
rKey.OpenSubKey(kCCC(0), True).CreateSubKey(kCCC(1))
Return True guito dal valore contenu-
Catch eCCC As Exception to nella variabile passata
Return False
End Try come argomento del meto-
End Function do, quindi l’elemento sele-
zionato nel ListBox2. Il va-

56 VBJ N. 68 - Marzo/Aprile 2006


APPLICATIVI

Listato 8 Gestione del pulsante Crea Sottochiave

Private Sub creaSubRKeyBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles


creaSubRKeyBtn.Click
Dim selCC As String = Nothing
selCC = ListBox1.SelectedItem
If (selCC <> Nothing Or selCC <> “”) Then
Dim kToC As String = Nothing
kToC = InputBox(“Immettere il nome della sottochiave da creare” & vbCrLf & _
“all’interno di “ & selCC, “Creazione Chiave/Sottochiave”)
Dim l_kToC = kToC.Length
If (kToC = Nothing Or kToC = “” Or kToC = “ “ Or l_kToC < 2)
Then MessageBox.Show(“Dovete immettere un nome di chiave valido”, _
“Errore Chiave/Sottochiave”, MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
Dim messGo As String = “CREATESUBKEY>” & selCC & “*” & kToC
Try
writer.Write(messGo)
inMessages.Clear()
inMessages.Text &= vbCrLf & “Comando Inviato: “ & vbCrLf & messGo
Catch exception As SocketException
inMessages.Text &= “Errore di comunicazione con il computer remoto: “ _
& exception.Message & vbCrLf
Catch ex As Exception
inMessages.Text &= “Errore: “ & ex.Message & vbCrLf
End Try
End If
Else
MessageBox.Show(“Dovete prima selezionare una chiave relativa dall’elenco”, _
“Errore nella creazione di nuova Chiave/Sottochiave”, MessageBoxButtons.OK, MessageBoxIcon.Warning)
End If
End Sub

lore viene ricavato invocando il metodo pub- funzione è visibile nel Listato 10. A questo
blico showOnlyKeyValue() passando per va- punto il Controller, in modo del tutto au-
lore il contenuto di job(1). tomatico, genera un nuovo comando SET-
In questo metodo è importante impostare, NEWKEYVALUE> seguito dal nuovo dato
prima dell’istruzione Return, la variabile pri- da attribuire alla variabile.
vata rCurrentValue uguale al contenuto di
nVVVa, ossia il valore di job(1) che in defi-
nitiva è il nome della variabile selezionata I valori consentiti nel regi-
del ListBox2, che contiene i dati da archi-
viare o modificare. stro di sistema possono
Tale variabile privata verrà infatti utiliz- essere di tipo DWORD,
zata nel metodo modReg(), che ci accingia-
mo ad esaminare.
binario e stringa
Quando il controller riceve il comando
CONFIRMMODIFYREGKEYVALUE> chia-
ma immediatamente la procedura function Tale valore è ottenuto mediante un Inpu-
modifyKeyProcedure() passando come ar- tBox che mostra il consueto prompt di in-
gomento il valore ritornato dal metodo serimento.
showOnlyKeyValue() e trasmesso dal ser- Nel Listato 2 possiamo infine osservare
ver attraverso il consueto socket TCP. Tale che quando il server riceve questo coman-

N. 68 - Marzo/Aprile 2006 VBJ 57


APPLICATIVI

Listato 9 Codice della classe Form3 do, provvede imme-


diatamente ad invo-
care il metodo mo-
Public Class Form3 dReg() visibile nel
Inherits System.Windows.Forms.Form Listato 11.
In questo metodo
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) troviamo i metodi
Handles Button1.Click della FCL già pre-
If (TextBox1.Text <> “” And TextBox1.Text <> Nothing And _
TextBox2.Text <> “” And TextBox2.Text <> Nothing) Then sentati.
Dim f3_messGo As String = Nothing Riteniamo oppor-
f3_messGo = “SETNEWNAMEANDVALUE>” & showRegPath.Text & “*” & _
TextBox1.Text & “*” & TextBox2.Text
tuno però richiama-
Try re l’attenzione sul-
Form1.writer.Write(f3_messGo) le variabili private
Catch e3 As Exception
MessageBox.Show(“Errore: “ & e3.Message, “Errore di Comunicazione”, _ rCurrentKey e rCur-
MessageBoxButtons.OK, MessageBoxIcon.Exclamation) rentValue il cui valo-
End Try
Me.Close() re viene modificato
End If dalla proprietà Cur-
End Sub
End Class
rentKey e Curren-
tValue della classe
RemoteRegistry.
Come il nome sug-
Listato 10-11 Modifica nome/valore all’interno di una chiave/sottochiave gerisce esplicita-
mente, queste va-
riabili contengono
Private Function modifyKeyProcedure(ByVal currKVal As String) As String la chiave/sottochiave
Dim InB As String = Nothing
Dim messGC As String = “SETNEWKEYVALUE>” attualmente in me-
InB = InputBox(“Valore Corrente: “ & currKVal & vbCrLf & “Inserire il nuovo valore.”, _ moria, unitamente
“Conferma Modifica Valori Registry Remoto”)
If (InB = Nothing Or InB = “”) Then
al valore corrente as-
MessageBox.Show(“Errore: Il valore da inserire non pu essere nullo”, _ sociato.
“Errore Modifica Registry Remoto”, MessageBoxButtons.OK, MessageBoxIcon.Stop) Alla variabile vTTTs
Else
Return messGC & InB viene quindi passato
End If per valore il contenu-
End Function
to di job(1) che espri-
me il nuovo dato da
associare alla rela-
Public Function modReg(ByVal vTTTs As String) As String
Dim retVal As String = Nothing tiva variabile all’in-
If (rCurrentKey <> Nothing) Then terno della chiave/
If (rCurrentValue <> Nothing) Then
Try sottochiave su cui si
rKey.OpenSubKey(rCurrentKey, True).SetValue(rCurrentValue, vTTTs) sta lavorando.
Catch eMMM As Exception
retVal = “Errore durante la scrittura nel registro: “ & eMMM.Message
Ecco quindi che il
End Try metodo della FCL
retVal = “Scrittura nel Registry eseguita correttamente.” SetValue() provve-
Else
retVal &= “Errore: non stato selezionato un nome di variabile.” de a scrivere il nuo-
End If vo dato da archivia-
Else
retVal &= “Errore: non stata selezionata una chiave/sottochiave.” re (vTTTS) associa-
End If to al valore espresso
Return retVal
End Function
dalla variabile priva-
ta rCurrentValue.

58 VBJ N. 68 - Marzo/Aprile 2006


.NET TOOLS
Bootstrapper per individuare ed eventualmente scaricare dal-
Manifest Generator la rete (o installare da un supporto quale un CD-
di Fabio Perrone ROM) un’applicazione e tutti i suoi componenti.
Una delle caratteristiche principali del Bootstrap-
Uno strumento gratuito per la creazione per di VS 2005 è la sua estensibilità, in quanto
dei package d’installazione è possibile permettere l’installazione di qualsia-
si componente tramite una coppia di file XML
Per chiunque scriva applicazioni desktop arriva (chiamati “manifest” XML del Bootstrapper) che
prima o poi il momento della distribuzione del- contengono tutti i dati necessari per eseguire l’in-
l’applicazione stessa e di tutte le componenti ri- stallazione. Questi due file XML sono il Product
chieste per il suo corretto funzionamento; chi ha Manifest, che contiene dati comuni alle differenti
già avuto un minimo di esperienza in questo cam- versioni localizzabili dell’applicazione, e il Packa-
po sa benissimo che questa operazione può esse- ge Manifest, che viene usato per dati specifici per
re particolarmente noiosa e “pericolosa”: se non ogni lingua, quali i messaggi di errore. Poiché la
vengono installate tutte le componenti, niente po- creazione di questi due file potrebbe essere abba-
trà impedire alla nostra applicazione di risponde- stanza complessa, ecco che viene in aiuto il tool
re con un bell’errore al momento del caricamento protagonista di questa recensione.
del componente mancante. Con l’arrivo di Visual Una volta creato il file d’installazione .msi con
Studio 2005 il problema si è notevolmente sem- VS 2005, lo si apre all’interno del Bootstrapper
plificato grazie al “Visual Studio 2005 Bootstrap- Manifest Generator (BMG). Immediatamente
per” che fornisce un metodo piuttosto immediato vengono creati i seguenti tab: Properties, Sy-
stem Checks, Install Con-
ditions, Exit Codes, Addi-
tional Files e Security. Il
tab “Properties” si utiliz-
za per passare al file di se-
tup eventuali argomenti a
riga di comando, per gesti-
re un eventuale reboot del
sistema dopo l’installazio-
ne, per fornire un tempo
stimato per l’installazione
(l’utilità di quest’opzione è
provvedere una progress-
bar che segue l’andamen-
to dell’installazione; il pro-
blema principale è che non
sempre si conosce la reale
velocità del PC su cui ver-
rà installata l’applicazione,

60 VBJ N. 68 - Marzo/Aprile 2006


.NET TOOLS

quindi non può essere altro che una stima), la sual Studio 2005 per creare i file “manifest” XML
dimensione dell’installazione. D’importanza fon- menzionati in precedenza. L’unico svantaggio è
damentale è il tab “System Checks”, che permet- che si abbia la leggera impressione che il deploy-
te di impostare delle condizioni per capire se un ment di un’applicazione sia sempre un proble-
determinato componente deve essere installato. ma da affrontare per ultimo, quando in realtà la
Il risultato di un System Check viene salvato in difficoltà e le complicazioni che possono sorgere
una proprietà che verrà poi utilizzata dalle “In- durante la distribuzione di un’applicazione par-
stall Conditions”. Qui è possibile controllare la ticolarmente complessa dovrebbero porre que-
presenza di un determinato file, l’esistenza di st’attività in primo piano. Questa considerazio-
una chiave di registro, un controllo personaliz- ne scaturisce dal fatto che la documentazione
zato scritto in qualsiasi linguaggio (in poche pa- del Bootstrapper corredata da relativi esempi è
role un eseguibile esterno che dovrebbe essere ancora, al momento della scrittura di quest’arti-
scritto in C++ unmanaged, in quanto il .NET colo, molto scarna.
Framework potrebbe non essere installato sulla Inoltre, la scarsa documentazione del prodot-
macchina target) oppure individuare se un pro- to stesso influenza non poco la capacità di esse-
dotto è già installato tramite il Product Code for- re produttivi immediatamente; tuttavia, una vol-
nito da un’installazione effettuata con Windows ta che sia ben chiaro lo scopo che ci si prefigge,
Installer. Mentre i System Check vengono effet- il suo valore è senza dubbio elevato. Da notare,
tuati per capire se sul PC target sia necessario o infine, che nella versione da noi provata il pro-
meno installare un componente, le Install Con- gramma talvolta ha mostrato alcune inesattezze
ditions pongono dei limiti entro i quali la proce- o errori imprevisti (anche se sempre ben gestiti),
dura di installazione deve essere eseguita, pena quindi la speranza è che venga rilasciata una nuo-
il suo fallimento, quali la versione del sistema va versione e che il progetto non sia giunto alla
operativo, la necessità di effettuare l’installazio- fine. Un’ultima nota: l’autore del BMG è David
ne con i diritti da Amministratore del sistema e Guyer che fa parte del team di test di VB.NET,
così via. L’utilizzo principale degli Exit Codes è quindi si può stare tranquilli sulla qualità del
invece quello di capire se l’installazione è anda- software (o almeno si spera!).
ta a buon fine e, in caso positivo, eventualmen-
te effettuare un reboot del sistema.
Se dovesse sopraggiungere qualche problema Prodotto
Bootstrapper Manifest Generator
è possibile fornire all’utente un messaggio di
errore personalizzato. Il tab “Additional Files” Url di riferimento
http://www.gotdotnet.com/workspaces/workspace.aspx?id=ddb
permette di inserire file aggiuntivi nell’installa- 4f08c-7d7c-4f44-a009-ea19fc812545
zione, mentre “Security” permette di determi-
Stato Release
nare se devono essere eseguite delle convalide Stabile, ma in continua manutenzione
prima dell’installazione del prodotto, per evita-
Semplicità d’uso 
re che l’installazione sia stata manomessa allo La distribuzione di applicazione è un argomento complesso, e il
scopo di installare sul PC dell’utente del malwa- programma ne richiede una certa conoscenza di base
re indesiderato. Utilità 
Una volta eseguite tutte le scelte, si compie una Strumento fondamentale per la creazione di file “manifest” XML
procedura di compilazione producendo un file senza dover conoscere la sintassi a memoria.
manifest che si potrà poi utilizzare con MSBui- Qualità prodotto 
ld o con un progetto di setup fatto con Visual Non sempre affidabile, nei test sul prodotto eseguiti ha talvolta
Studio 2005. mostrato qualche problema.

Per poter sfruttare completamente questo tool Qualità documentazione 


è necessario avere una buona conoscenza delle L’help dell’applicazione fornisce solo alcune indicazioni di base, per
il resto è necessario provvedere autonomamente.
procedure d’installazione d’applicazioni .NET ,
nonché della sintassi che viene prodotta da Vi-

N. 68 - Marzo/Aprile 2006 VBJ 61


.NET TOOLS

DayPilot
di Raffaele Di Natale

Un componente ASP.NET in C# per la


gestione di un calendario giornaliero
Outlook-like

Chi utilizza giornalmente Microsoft Outlook®


ed ha familiarità con il suo calendario giornalie-
ro apprezzerà senz’altro la possibilità di utiliz-
zare questo componente open source all’interno
di una propria web application. Infatti, il com-
ponente calendario standard, messo a disposi-
zione in Visual Studio .NET, integrandosi con
DayPilot, ci permette di gestire gli eventi pro-
grammati come se fossimo proprio in ambien-
te Outlook. DayPilot, fin dove è possibile, imi-
ta il comportamento di Outlook nella visualiz-
zazione giornaliera.

Prerequisiti
DayPilot è un componente ASP.NET sviluppato
in C# che si integra perfettamente in ambiente
VisualStudio .Net 2003.
L’applicazione dimostrativa realizzata per questo
articolo è stata eseguita su Windows XP SP2 con
Internet Information Services [IIS] e .NET Fra-
mework 2.0. DayPilot è testato su Internet Explo-
rer 5.0, 5.5 e 6.0 e FireFox 1.0 e 1.5.

Installazione
Dal sito [1] è possibile scaricare sia i file conte-
nenti il codice sorgente che i binari. Non esiste
una vera e propria installazione del prodotto, in Descrizione delle funzionalità principali
quanto è sufficiente aggiungere un riferimento DayPilot non è Outlook e quindi non ci aspet-
all’assembly DayPilot.dll per poterlo utilizzare tiamo di editare la descrizione degli eventi, né di
all’interno della nostra web application. effettuare il drag’n’drop degli stessi. Fatta questa
Se lo vogliamo avere a disposizione anche in premessa, c’è da dire che DayPilot si comporta in
altre applicazioni, e ritrovarlo fra gli altri com- maniera soddisfacente e risolve impeccabilmente
ponenti standard di Visual Studio .NET, basta i problemi tipici di sovrapposizione di eventi o di
cliccare sul menu “strumenti/aggiungi rimuovi eventi estesi su più giorni. Le principali caratte-
elementi casella degli strumenti” e selezionare ristiche di questo componente sono:
sempre DayPilot.dll.
In questo modo DayPilot apparirà tra gli al-  Grafica perfettamente somigliante a quella uti-
tri componenti della casella degli strumenti, lizzata in Outlook
pronto per essere trascinato all’interno di una  Gli eventi possono essere importati da una sorgen-
WebForm. te dati esterna oltre ad essere definiti da codice

62 VBJ N. 68 - Marzo/Aprile 2006


.NET TOOLS

 Possibilità di impostare le ore lavorative e di essere utilizzato nell’IDE ed averlo trascinato dal-
nascondere quelle che non lo sono la casella degli strumenti alla webform di destina-
 Possibilità di gestire il doppio click mediante zione, si può passare a personalizzare il calendario
JavaScript sia su un evento esistente che su giornaliero direttamente da codice o dalla finestra
un periodo libero delle proprietà del componente stesso.
L’aspetto saliente riguarda senz’altro l’inseri-
Mediante le proprietà del componente, oppu- mento degli eventi. Per iniziare è necessario os-
re direttamente da codice, sono possibili ulterio- servare che DayPilot utilizza una DataTable o un
ri personalizzazioni del componente in maniera DataSet opportunamente formattatti a partire dai
del tutto simile a quanto accade per il calenda- quali prelevare le informazioni relative agli eventi
rio giornaliero di Outlook: aumentare o diminui- che giornalmente devono essere visualizzati. In ge-
re la larghezza della pagina, variare l’altezza e la nerale una DataTable deve prevedere almeno quat-
larghezza dell’area assegnata ad una singola ora, tro colonne che potrebbero essere così definite:
definire l’ora iniziale e l’ora finale del calendario,
utilizzare un formato su 12 o 24 ore.  Id: identificativo univoco dell’evento
 Start: giorno e ora di inizio dell’evento
Utilizzare DayPilot in un’applicazione  End: giorno e ora di fine dell’evento
Prima di integrare questo componente all’inter-  Name: descrizione dell’evento
no di una web application esistente o in fase di
sviluppo, si consiglia di scaricare il codice della Questa operazione va effettuata utilizzando una
demo all’indirizzo [3]. Una versione online della property getData che restituirà DataTable popo-
demo può essere visionata direttamente all’indi- lata dagli inserimenti desiderati. Più dettagliata-
rizzo [4]. Dopo aver configurato il componente per mente scriveremo:

N. 68 - Marzo/Aprile 2006 VBJ 63


.NET TOOLS

protected DataTable getData protected DataTable getData


{ {
get get
{ {
DataTable myDataTable; string connectionString = “Driver={Microsoft Access Driver
myDataTable = new DataTable(); (*.mdb)};” + “DBQ=C:\\InetPub\\Daypilot\\Event.mdb;UID=;PWD=”;
myDataTable.Columns.Add(“start”, typeof(DateTime)); OdbcConnection myOdbcConnection = new OdbcConnection
myDataTable.Columns.Add(“end”, typeof(DateTime)); (connectionString);
myDataTable.Columns.Add(“name”, typeof(string)); OdbcCommand myOdbcCommand = myOdbcCommand.CreateCommand();
myDataTable.Columns.Add(“id”, typeof(string)); myOdbcCommand.CommandText = “SELECT * “ + “FROM Event”;
OdbcDataAdapter myDataAdapter = new OdbcDataAdapter();
DataRow myDataRow; myDataAdapter.SelectCommand = myOdbcCommand;
myDataRow = myDataTable.NewRow(); DataSet myDataSet = new DataSet();
myDataRow [“id”] = 0; myOdbcConnection.Open();
myDataRow [“start”] = Convert.ToDateTime(“10:00”).AddDays(1); myDataAdapter.Fill(myDataSet, “Event”);
myDataRow [“end”] = Convert.ToDateTime(“11:00”).AddDays(1); myOdbcConnection.Close();
myDataRow [“name”] = “Rinnovare abbonamento VBJ”; DataTable myDataTable;
myDataTable.Rows.Add(myDataRow); myDataTable = new DataTable();
return dt; myDataTable = myDataSet.Tables[“Event”];
} myOdbcConnection.Close();
} return myDataTable;
}
Il codice precedente, oltre ad instanziare una }
DataTable con le caratteristiche richieste, inseri-
rà una riga contenente l’evento “Rinnovare abbo- Come nel caso precedente è necessario imposta-
namento VBJ” che ha inizio alle ore 10:00 e fine re i campi DataSource con getData, PkColumn-
alle 11:00 della data odierna di default. Bisognerà Name con id, BeginColumnName con start, En-
inoltre valorizzare alcuni campi del componente dColumnName con end e NameColumnName con
DayPilot in questo modo: name. Ovviamente i parametri del componente
vanno adattati ai nomi reali delle colonne della
 DataSource: getData; tabella del database. In Figura 1 è visibile il ri-
 PkColumnName: id sultato di questa integrazione in cui emerge, tra
 BeginColumnName: start l’altro, la possibilità di sovrapporre gli eventi in
 EndColumnName: end perfetto stile Outlook.
 NameColumnName: name
Ulteriori personalizzazioni
Collegamento ad una sorgente dati DayPilot consente inoltre di configurare anche
Un’operazione del tutto simile alla precedente altri aspetti importanti quali per esempio:
può essere realizzata importando da una sorgente
dati esterna i dati relativi agli eventi da visualiz-  TimeFormat, per il formato 12/24 ore;
zare. Nel caso più semplice è possibile modificare  NonBusinessHour, che consente di visualizzare
la property getData integrando il codice relativo o meno le ore non lavorative (se possibile);
alla connessione al database esterno. Supponia-  JavaScriptEventAction, che definisce il codice
mo di aver precedentemente preparato un data- JavaScript da eseguire in seguito al doppio cli-
base, in formato Access, denominato “Event.mdb” ck su un evento visualizzato (dipende dal pa-
e formato da una sola tabella “Event” i cui campi ramentro EventClickHandling);
sono: id (chiave primaria), start (Data), end (Data)  JavaScriptFreeAction, che definisce il codice
e name (Testo). Pertanto: JavaScript da eseguire in seguito al doppio cli-

64 VBJ N. 68 - Marzo/Aprile 2006


.NET TOOLS

ck su un periodo libero (dipende dal paramen-


tro FreeTimeClickHandling);
Prodotto
DayPilot

Conclusioni Url di riferimento


http://www.daypilot.org
DayPilot usa una grafica rassicurante per tut-
ti coloro che usano già Outook per organizzare Stato Release
v. 1.1
i propri eventi: è questa la forza, ma anche il li-
mite del componente. Quante volte cliccheremo Semplicità d’uso 
Non trattandosi di un’applicazione, ma di un componente, qualche
sull’evento per provare a modificarne il conte- problema iniziale di integrazione può essere accettabile. La versio-
nuto? O tenteremo di spostare un evento in un ne dimostrativa online e il relativo codice sorgente sono senz’al-
periodo diverso? DayPilot nasce con uno scopo tro di grande aiuto in questo senso.
ben preciso e cioè quello di visualizzare eventi Utilità 
già impostati, ma la bontà del progetto software Chi ha in mente di sviluppare una web application in cui si gesti-
scono eventi può trarre notevoli vantaggi dall’utilizzo di questo
porta a pensare che nelle prossime release l’au-
componente open source.
tore inserirà un supporto AJAX che consentirà
di eseguire anche queste operazioni. Qualità prodotto 
Si tratta di un componente ben strutturato e versatile il cui com-
portamento è risultato davvero soddisfacente nei test effettuati.
Riferimenti
Qualità documentazione 
[1] http://www.daypilot.org La documentazione è disponibile solo in inglese; è chiara, ma for-
[2] http://www.daypilot.org/installation.html se un po’ troppo concisa. L’autore sembra puntare tutto sulla ver-
[3] http://www.daypilot.org/download.html sione dimostrativa
[4] http://www.daypilot.org/live-demo.html

N. 68 - Marzo/Aprile 2006 VBJ 65