Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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
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.
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
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
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.).
Figura 1 Sistema di DW
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
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
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-
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
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
Listato 1 (...fine)
totPoint = totPoint + 1
Area = (inPoint / totPoint) * PicArea
lblArea = “Area= “ & Area
lblErr = “Err = “ & Area / Sqr(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
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
e illeggibili:
Compressione Compressione
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
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:
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
“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
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-
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
Add-in
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
• 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
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-
Option Explicit
conNomeApp = AddInInst.ProgId
With mnuItem1
.Caption = “VBJ - Numero casuale”
.Tag = strKey
.Style = msoButtonCaption
.FaceId = 634
.OnAction = “!<” & strProgID & “>”
.BeginGroup = True
End With
End If
Listato 2 (...fine)
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
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
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
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
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-
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-
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.
• 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
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
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.
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
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.
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
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
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-
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”
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
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-
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
kToExplore = rK
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-
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.
DayPilot
di Raffaele Di Natale
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
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: