Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Enterprise JavaBeans
Scrivi a Java I/O, 2ed
3.0, 5th Edition book@infomedia.it di E. Harold
di R. Monson-Haefel,
e B. Burke
specificando
nell’oggetto della
O’ Reilly e-mail: O’ Reilly
ISBN 059600978X
760 pp - 49,99 €
IN OFFERTA ISBN 0596527500
800 pp - 45,00 €
VBJ n. 68
OPPURE
inviaci il coupon
Computer Numerical Learning UML 2.0
Control:Operation and sottostante di R. Miles
Programming, 3rd
Edition
al numero di fax e K. Hamilton
di J. Stenerson
e K. Curran
0587/732232
Potrai acquistare
Prentice Hall O’ Reilly
ISBN 0131115472 i libri qui riportati con ISBN 0596009828
528 pp + cd - 85,95 € uno 286 pp - 44,99 €
SCONTO
Cryptography and ECCEZIONALE Introduction to
Network Security, Programming Using
4th Edition del 10% anche se Visual Basic 2005
di Stallings, W.
acquisti solo un di D. Schneider
VBJ 68
online.infomedia.it
n. 69 - maggio/giugno 2006
bimestrale - anno dodicesimo
Direttore Responsabile
Marialetizia Mari (mmari@infomedia.it)
Direttore Esecutivo
EDITORIALE
Francesco Balena (fbalena@infomedia.it)
Managing Editor Informatica, università,
e il progetto S@MP
Renzo Boni (rboni@infomedia.it)
Collaboratori
Raffaele Di Natale
Maurizio Mammuccini
Fabio Perrone
D
Paolo Pialorsi
Stefano Savo a qualche tempo sono tornato in contatto con la mia vec-
Scott Swigart chia università, dove ho preso la laurea quasi venti anni
fa. È stato un bel tuffo nel passato, ma anche nel presente
e nel futuro, che mi ha portato a fare qualche considerazione
inaspettata.
RUBRICHE
Editoriale 7
.NET Tools 54
SPECIALE
VB6
ENTERPRISE
WEB
WinFX: Windows
Communication
Foundation
Vediamo i componenti chiave di WinFX, la prossima WinFX
versione di API managed per Windows
di Paolo Pialorsi
I
niziamo con questo articolo una serie di appun- famiglia Windows. È pensato
tamenti dedicati all’introduzione di WinFX. Win- per consentire la comunicazio-
FX è la sigla che identifica la prossima versione ne tra processi, macchine e si-
di API managed per Windows, cioè basate sul .NET stemi informativi anche etero-
Framework di Microsoft, che vedrà la luce verso la genei, sfruttando protocolli di
fine del 2006, insieme a Windows Vista. WinFX fun- comunicazione personalizza-
zionerà anche su Windows XP Service Pack 2 e su bili e configurabili, utilizzan-
Windows Server 2003, rendendo molto interessanti le do un’infrastruttura “plugga-
sue caratteristiche anche per chi non svilupperà da bile” di servizi e funzionalità
subito applicazioni per Windows Vista. al contorno.
Da un punto di vista pratico WinFX è un insieme • WPF (Windows Presentation
di librerie managed per la gestione delle applica- Foundation): si tratta del suc-
zioni future, che copre aree come la gestione del- cessore di GDI, sviluppato in
l’interfaccia utente, la comunicazione tra processi ambiente .NET. Fornirà tut-
e/o macchine, la gestione della sicurezza e dei flus- ti gli strumenti per la defi-
si operativi dei software che sviluppiamo. nizione grafica delle appli-
Dal punto di vista della sua architettura e composi- cazioni per Windows Vista.
zione, WinFX è costituito da tre mattoni principali: Sarà utilizzabile sia da codi-
ce, sia attraverso appositi de-
• WCF (Windows Communication Foundation): è signer che produrrano del co-
l’infrastruttura di comunicazione del futuro per la dice XAML, una grammatica
XML per la definizione di pri-
mitive grafiche vettoriali da
utilizzare in WPF.
Paolo Pialorsi è un consulente e autore specializzato nello • WF (Windows Workflow
sviluppo di Web Service e soluzioni Web con il Framework Foundation): un framework
.NET di Microsoft. Lavora nell’omonima società Pialorsi Sistemi applicativo sviluppato in co-
S.r.l. e fa parte del gruppo DevLeap. Può essere contattato via
dice managed .NET e pensa-
email: paolo@devleap.it. Paolo mantiene un blog all’indirizzo:
http://blogs.devleap.com/paolo/. to per gestire/creare work-
flow che interagiscano con i
Come si vede ad oggi abbiamo un’offerta di struttura di WCF. I messaggi possono es-
servizi decisamente articolata e spesso non sere pensati in ottica SOA, pensando pri-
ben amalgamata e coesa. Cosa accade nel mo- ma di tutto al XSD, oppure possono esse-
mento in cui dobbiamo sviluppare un servi- re oggetti .NET da serializzare e trasferi-
zio SOAP via HTTP, sicuro con WS-Security re, come accade oggi con .NET Remoting.
e transazionale? Come possiamo scegliere tra Esistono diversi modi di rappresentare i
ASMX, WSE3 e un ServicedComponent? messaggi WCF, in base al tipo di applica-
WCF nasce proprio con l’obiettivo di convo- zione che si vuole realizzare.
gliare in un unico framework tutte le caratte- • Channel: si tratta del canale di trasporto
ristiche e funzionalità orientate allo sviluppo dei messaggi e può essere pensato come
di componenti e applicazioni distribuite, con una pipeline attraverso la quale transitano
l’obiettivo di offrirci un framework unico e i messaggi, applicando estensioni e servizi
completo per lo sviluppo delle infrastrutture sia a livello di messaggio che di protocollo
di comunicazione del domani (Figura 1). di trasporto.
• Endpoint: punto attraverso il quale è possi-
Architettura di WCF bile raggiungere un servizio. Un Endpoint
Dal punto di vista architetturale WCF è pen- è costituito di tre informazioni: Address,
sato per essere estremamente estendibile e Binding e Contract (Figura 2). L’Address
personalizzabile. Alla base della sua architet- rappresenta l’indirizzo al quale è possibi-
tura vi sono i concetti di: le raggiungere il servizio WCF. Il Binding
indica il tipo di protocollo da utilizzare per
• Message: rappresenta il contenitore delle dialogare con quel servizio. Il Contract de-
informazioni da trasferire tramite l’infra- scrive il contratto, cioè l’insieme di opera-
zioni e messaggi, da sottoscrivere con il tocolli di trasporto dei messaggi, che sono det-
servizio per poter dialogare. ti Binding, sono personalizzabili in termini di
• Endpoint Listener: stanno in ascolto di funzionalità e laddove non ci bastino i Binding
messaggi su un particolare Channel che nativi, possiamo crearne di nostri, estendendo
espone un Endpoint. il modello ad oggetti di WCF. I servizi esposti
• ServiceHost: si tratta di chi ospita uno o
possono offrire più o meno funzionalità al con-
più servizi, esponendo un set di Endpoint torno, rispetto al servizio stesso, utilizzando dei
Listener. I ServiceHost possono essere ap- modificatori di comportamento, detti behavior,
plicazioni nostre (self-hosting) o servizi del che sono altrettanto configurabili partendo da
sistema operativo, come per esempio ASP. un insieme di base o definibili in autonomia,
NET con Internet Information Services. creando delle classi .NET ad hoc.
• ChannelFactory: creano canali di comunica-
zione consumer-side, cioè dal lato del client WCF Service Provider
di un servizio, per poter raggiungere un En- Vediamo quindi un esempio di servizio WCF,
dpoint. Da un punto di vista SOA è più cor- creando insieme un Service Provider, cioè
retto parlare di consumer che non di client. un’applicazione che espone un servizio WCF.
Dal momento che un servizio è descritto da
Come si vede l’architettura è assolutamente una terna ABC (Address, Binding, Contract),
orientata ai servizi, in un’ottica squisitamente per prima cosa dobbiamo decidere che tipo
SOA. Tutto ciò di cui è costituita l’architettura di servizio vogliamo realizzare e quindi defi-
di WCF non è solo utilizzabile, ma è anche per- nirne il contratto. Esistono infatti diverse ti-
sonalizzabile e ridefinibile. Ad esempio i pro- pologie di servizi e di contratti:
Accesso al filesystem
da Visual Basic 6
con classi .NET
Come accedere alle funzionalità del Microsoft .NET Framework ine-
renti al filesystem dalle applicazioni Visual Basic 6 esistenti, e ottenere
l’estensione di un file, la parte directory del percorso o il nome del file e
come scatenare eventi quando cambia il contenuto di una directory
L’
accesso al filesystem è un prerequisito
comune di una applicazione, e in que-
sto articolo mostrerò come si può acce-
dere ad alcune delle migliori funzionalità del .NET
Framework inerenti al filesystem dalle applicazio-
ni Visual Basic 6.
In primo luogo, esiste la classe Path. Questa classe
semplifica notevolmente l’interazione con e l’estra-
zione di parti delle stringhe dei percorsi del filesy-
stem. Con una sola riga di codice, si può ottenere
l’estensione di un file, o la parte directory di un
percorso, o ricavare la parte del nome del file da
un percorso. Si può anche modificare l’estensione
di un file, o determinare se un percorso è relativo
o assoluto.
Figura 1 La finestra di dialogo Folder Browser
Inoltre, esiste la classe FolderBrowserDialog, che
facilita la visualizzazione di una finestra di dialogo
© 2006 Microsoft Corporation. All rights reserved che permette all’utente di sele-
zionare un percorso a una car-
Scott Swigart fornisce consulenza alle aziende su come uti- tella (Figura 1).
lizzare al meglio l’attuale tecnologia e prepararsi al domani.
La visualizzazione di questa fi-
A tal riguardo, Scott è un orgoglioso collaboratore del sito VB
Fusion, dove offre informazioni e strategie di reale utilizzo per nestra di dialogo di sistema da
gli sviluppatori VB che vogliono realizzare il maggior numero Visual Basic 6 richiede una certa
di funzionalità con il minimo sforzo. Scott è anche un Microsoft quantità di invocazioni alle API
MVP, ed è coautore di numerosi libri e articoli, ed è contattabile
all’indirizzo email scott@swigartconsulting.com.
Win32. Tuttavia, utilizzando la
libreria IOLib allegata a questo
articolo (scritta in Visual Basic 2005), si può può utilizzare IOLib dalle proprie applicazio-
facilmente visualizzare questa finestra di dia- ni Visual Basic 6. Se si è interessati a come
logo da una applicazione Visual Basic 6. è stato costruito IOLib, l’articolo si conclu-
Infine, l’articolo esamina la classe FileSy- de con una analisi sulla realizzazione di pro-
stemWatcher. Questa classe può scatenare prie classi wrapper.
eventi ogni volta che cambia il contenuto di
una directory. Pertanto questa classe è l’idea- Utilizzo della classe Path
le se si ha un’applicazione che deve processa- da Visual Basic 6
re nuovi file man mano che vengono creati o Talvolta, un’applicazione deve manipolare
modificati. E di nuovo, può essere utilizzata una stringa di percorso di un file. Ad esem-
facilmente da Visual Basic 6. pio, si può avere un percorso completo a un
file, ma si è interessati a ricavare la sola par-
I fondamenti: invocare .NET da Visual te directory del percorso. Altre volte, si può
Basic 6 voler ottenere solo il nome del file, senza le
In genere, non si possono invocare diretta- informazioni sulla directory. In ulteriori casi,
mente da Visual Basic 6 classi del .NET Fra- si può voler esaminare l’estensione del file in
mework poiché queste non vengono esposte modo da poter intraprendere azioni differenti
come oggetti COM. Tuttavia, si può utilizza- per differenti tipi di file. Si può anche voler
re Visual Basic 2005 per creare dei wrapper modificare l’estensione di un file se lo si sta
COM per le parti del .NET Framework che si caricando in un formato e lo si vuole salvare
intende utilizzare. Il proprio codice Visual Ba- con un formato differente.
sic 6 invoca il wrapper COM, e questo invoca La classe Path è concepita per rendere que-
il.NET Framework (Figura 2). sti tipi di operazioni molto semplici. La clas-
Si tratta dell’approccio utilizzato in que- se IOLib allegata a questo articolo avvolge la
sto articolo. Il codice d’esempio dell’articolo classe Path .NET in modo da poterla invoca-
comprende il progetto Visual Basic 2005 de- re da Visual Basic 6 o da altri ambienti basa-
nominato IOLib che funge da wrapper delle ti su COM. Attraverso questo wrapper COM,
classi Path, FolderBrowserDialog e FileSy- si può accedere alle funzionalità elencate in
stemWatcher del .NET Framework. Nell’ar- Tabella 1.
ticolo verrà inizialmente mostrato come si L’analisi che segue illustra l’utilizzo della
GetFileName Restituisce nome e estensione del file della stringa di percorso specificata
Restituisce un file temporaneo a lunghezza zero di nome univoco creato su disco e restituisce il
GetTempFileName
percorso completo a questo file
Fornisce un array di caratteri, dipendente dalla piattaforma, che non può essere specificato negli
InvalidPathChars
argomenti della stringa di percorso passati ai membri della classe Path
RootFolder Restituisce o imposta la cartella radice da dove inizia l’esplorazione del filesystem
Restituisce o imposta un valore che indica se il pulsante New Folder appare nella
ShowNewFolderButton
finestra di dialogo per esaminare le cartelle
4. Nella finestra di dialogo New Project: • Per Templates, selezionare COM Class.
• (Solo VS 2005) Per Project Types, selezio- • Per Name inserire FolderBrowserDialog
nare Visual Basic Projects. Wrapper.
• Per Templates, selezionare Class Library. • Cliccare OK.
• Per Name, inserire FBWrapper. Ciò ha creato l’inizio della classe wrapper.
• Cliccare OK. Ora è necessario scrivere il codice che av-
5. In Solution Explorer, effettuare un clic de- volgerà la classe FolderBrowserDialog.
stro su Class1.vb e selezionare Delete. 9. Selezionare il comando di menu Project |
6. Cliccare OK. Add Reference.
Class1 non è necessaria poiché è una 10. Nella finestra di dialogo Add Reference:
semplice classe .NET, ma non è una clas- • Cliccare System.Windows.Forms.dll.
se COM. Per il wrapper, dobbiamo creare • Cliccare Select.
una classe COM in modo che possa esse- • Cliccare OK.
re utilizzata come oggetto COM da Visual 11. Prima del costruttore Public Sub New, in-
Basic 6. serire la seguente riga di codice:
7. Selezionare il comando di menu Project |
Add New Item. Private fb As New System.Windows.Forms.Folder
8. Nella finestra di dialogo Add New Item: BrowserDialog
Imports System.Windows.Forms
<ComClass(FolderBrowserDialogWrapper.ClassId, FolderBrowserDialogWrapper.InterfaceId, Folder-
BrowserDialogWrapper.EventsId)> _
Public Class FolderBrowserDialogWrapper
Get
Return _folderBrowser.Description
End Get
End Property
Get
Return _folderBrowser.RootFolder
End Get
End Property
Get
Return _folderBrowser.SelectedPath
End Get
End Property
End Property
End Class
Ciò crea un’istanza del FolderBrowserDia- dler d’evento Form_Load, e apra l’editor di
log che si andrà ad avvolgere. codice.
12. Dopo Public Sub New, ma prima di End 20. Nell’evento Form_Load, inserire il seguen-
Class, inserire il seguente codice: te codice:
Interoperabilità
COM e .NET Prima puntata
Comprendere e confrontare i modelli di eventi in .NET ed
in COM non solo può aiutarci a specializzare la nostra
conoscenza del framework .NET stesso ma può essere utile
per un miglior riutilizzo event-driven, in applicazioni
.NET, di software binario COM già scritto
COMNET
di Maurizio Mammuccini
I
n questo articolo approfondiamo questioni zare, al meglio, un patrimo-
di interoperabilità .NET e COM concentran- nio software di componenti
doci sui rispettivi modelli di eventi. L’in- binari già scritti
teroperabilità delle architetture d’eventi COM,
deve essere conosciuta da ogni progettista sof- Entrambi i punti elencati, a
tware .NET, anche principiante, il quale intenda mio avviso, richiedono una trat-
sfruttare al meglio le enormi potenzialità insite tazione poiché, eccettuate rare
nell’infrastruttura .NET di Microsoft ed il me- eccezioni nella letteratura di
glio di COM. settore, la loro elaborazione ap-
L’articolo è stato pensato e realizzato con un du- profondita in libri od articoli
plice scopo: è sempre stata abbastanza li-
mitata.
• fornire una breve descrizione non del tutto esau- Ai tempi dei libri su COM/
stiva dell’architettura ad eventi di COM e svol- DCOM, un argomento come
gere delle considerazioni di confronto con il mo- la notifica di un messaggio da
dello ad eventi di .NET Framework un oggetto COM ad un relati-
• fornire utili osservazioni che possano aiutare tut- vo client è stato trattato poco
ti quei progettisti software che in tempi recenti in profondità e molti progettisti
sono migrati (o che stanno migrando) da COM e programmatori si sono spes-
a .NET e che si pongono il problema di riutiliz- so affidati agli esempi tratti da
MSDN o altri siti di sviluppo del
software.
In questo articolo, pur tenen-
Maurizio Mammuccini ha esperienza decennale nella progetta-
zione e sviluppo di software. Dedica particolare attenzione alle do sempre presente la sintesi
tecnologie di calcolo distribuito. Utilizza sin dalle primissime versioni espositiva, cercherò di appro-
il Visual Studio di Microsoft. Attualmente è formatore per PCS fondire – in continuità col pre-
Umbria a Perugia e consulente per aziende del settore informatico.
È MCSD for VS6 - MCDBA for Sql Server 2000 - MCAD for .NET
cedente [10] – la trattazione del-
- MCSD for .NET ed MCT. Vive e risiede in Umbria. Può essere le architetture di eventi in COM
contattato all’indirizzo mmammuccini@infomedia.it e .NET e come in tale ambito il
.NET Framework renda possibile una ottima di riutilizzo di componenti software, ossia di
interoperabilità. file binari al cui interno sono state compila-
Soprattutto in questa prima puntata presen- te funzionalità molto particolari.
terò un’utile panoramica a coloro che hanno Cerchiamo di descrivere sinteticamente
l’esigenza di comprendere l’utilizzo event-dri- quanto appena enunciato. Partiamo dal con-
ven di un componente COM in .NET. cetto di interfaccia così come stabilito nella
programmazione OOP (Object Oriented Pro-
Perché ancora COM? gramming): un’interfaccia non è altro che una
Perché interessarsi a COM, dover conoscere collezione di prototipi (o sintassi) di funziona-
la maniera in cui COM implementa la propria lità esposte da un qualche manufatto.
architettura di eventi, come .NET la traduce, Perché un’interfaccia è così importante nel-
visto che c’è .NET? la programmazione ad oggetti? L’intento del-
Ecco qualche risposta personale: l’OOP è quello di incapsulare, entro classi, dati
e funzionalità sui dati, in modo da nascondere
1. COM non è ‘morto’; gli attuali sistemi ope- all’esterno i dettagli di implementazione (al-
rativi Microsoft lo prevedono ancora al loro goritmi) di queste funzionalità [10].
interno ed esso continua ad essere un’otti- Ciò non perché si intenda soltanto custodi-
ma infrastruttura a componenti binari per re gelosamente i segreti degli algoritmi, ben-
macchine Windows, senza nulla togliere a sì perché ciò che ci interessa in una classe è
.NET. quali funzionalità essa realmente mette a di-
2. Esiste un po’ ovunque (anche in Italia) sposizione e non come effettivamente le im-
un immenso patrimonio di software bina- plementi al suo interno. Ciò ai fini del riutiliz-
rio scritto per COM (es. in Visual Basic, zo del software, che sostanzialmente significa
in C++, in MFC, in ATL) ed implementa- riutilizzo di dati ed operazioni su quei dati.
to dentro applicazioni anche grandi e co- Quindi l’idea è di raccogliere le funzionalità
stose, la cui corretta migrazione a .NET ri- in un costrutto (appunto l’interfaccia) e por-
chiede che si affrontino le tematiche espo- lo a disposizione di chiunque voglia imple-
ste nell’articolo. mentare quelle funzionalità in un manufatto
3. Gli argomenti sono comunque belli di per binario. Per un riutilizzatore è sufficiente la
sé, al di là dell’utilità o meno della loro trat- conoscenza delle interfacce esposte al fine di
tazione espositiva. stabilire se quel manufatto possa o meno es-
sere impiegato in un progetto.
Comunque deve essere chiaro che nel pros- La scrittura di un’interfaccia in uno specifico
simo futuro il design del nostro patrimonio linguaggio dipende dal particolare costrutto
di applicazioni dovrà necessariamente es- formale che tale linguaggio implementa. Ciò
sere aggiornato o riprodotto completamen- vale anche per la realizzazione del manufat-
te avendo come target la piattaforma .NET e to. Spesso in Microsoft Windows le interfacce
a tale scopo bisogna capire come COM vada vengono implementate in classi (es. in C++)
ad interoperare con .NET a livello di gestio- e queste compilate entro DLL.
ne di eventi. Visto che stiamo trattando COM, vogliamo in
questa parte discutere un po’ di come COM in-
COM tenda le interfacce; questo è un punto delicato
È data per acquisita una minima conoscen- per tutti i ragionamenti che seguiranno.
za della tecnologia Microsoft COM; comun- Il protocollo COM di Microsoft impone uno
que ricordiamo che COM (Component Object standard binario per le interfacce, ossia ne
Model) è uno standard binario ad interfacce, stabilisce il layout binario di memoria. Ciò
proprietario Microsoft, pensato e realizzato ha una profonda conseguenza concettuale so-
per fornire una maniera potente ed efficace prattutto per quei programmatori provenien-
Figura 7 RCW
Opzione Descrizione
/? Visualizza l’help del comando d’utilità
/keyfile:filename Firma l’assembly con la chiave fornita in filename
/namespace:namespace Indica lo spazio dei nomi per l’assembly
/out:filename Specifica il nome dell’assembly prodotto
/primary Rende l’assembly prodotto un PIA (Primari Interoperability Assembly)
Ad esempio C#
public enum REGKIND
tlbimp CPPObject.dll /out: CPPObjectInt.dll {
REGKIND_DEFAULT = 0,
genera l’assembly d’interoperabilità CP- REGKIND_REGISTER,
PObjectInt.dll corrispondente alla dll COM REGKIND_NONE
CPPObject.dll. } //REGKIND
Comunque anche l’utilità TlbImp.exe per
quanto importante ed utile non rimane l’unico VB.NET
strumento per esporre tipi COM in .NET. Private Enum RegKind
Inoltre, nello spazio dei nomi System.Run-
time.InteropServices viene fornita la classe RegKind_Default = 0
TypeLibConverter che mette a disposizione RegKind_Register = 1
metodi estremamente efficaci per la conver- RegKind_None = 2
sione delle coclassi e delle interfacce di una
libreria dei tipi in metadati entro assembly. End Enum ‚REGKIND
Questa API .NET è in grado di generare gli
stessi metadati prodotti da TlbImp.exe. A dif- dove la descrizione dei valori d’enumerazio-
ferenza però della TlbImp.exe, la classe Type- ne è riportata nella Tabella 2.
LibConverter è in grado di convertire in meta- Detto ciò evidenziamo inoltre che la clas-
dati soltanto una libreria dei tipi in memoria, se TypeLibConverter dispone di due fonda-
ossia precedentemente caricata in memoria mentali metodi per conseguire la conversio-
ad esempio con la potentissima WIN32 API ne desiderata:
LoadTypeLibEx. • ConvertAssemblyToTypeLib – Converte un as-
La LoadTypeLibEx permette infatti di cari- sembly .NET in una libreria di tipi COM
care in memoria una libreria di tipi ed op- • ConvertTypeLibToAssembly – Converte una
zionalmente ne permette la registrazione nel libreria di tipi COM in un assembly .NET
registro di sistema. Cerchiamo quindi ora di approfondire un
È bene prevedere di utilizzare la LoadType- po’ il meccanismo di generazione via co-
LibEx piuttosto che la LoadTypeLib in quanto dice .NET dell’assembly d’interoperabilità
quest’ultima registra comunque la libreria. che vede coinvolta l’API TypeLibConverter,
Per specificare la modalità o meno di regi- a partire da una libreria COM.
strazione della libreria specifichiamo in input Nel codice che segue e che vede utilizzata la
alla LoadTypeLibEx un valore tratto da una classe TypeLibConverter faremo ricorso al me-
enumerazione, la REGKIND fornita nell’SDK todo ConvertTypeLibToAssembly (che poi è lo
di Windows. stesso metodo utilizzato sia da Visual Studio
Diamo qui per facilitare la lettura e com- che dall’utilità a riga di comando TlbImp.exe
prensione del codice che seguirà, questa enu- per produrre assembly d’interoperabilità).
merazione: Per prima cosa, visto che dobbiamo carica-
re a runtime in memoria una libreria binaria,
typedef enum tagREGKIND{ dobbiamo collocare nel codice .NET la dichia-
REGKIND_DEFAULT, razione dell’API LoadTypeLibEx, a tal scopo si
REGKIND_REGISTER, dia uno sguardo al Listato 1.
REGKIND_NONE DLLImport così come utilizzato nei brani di
} REGKIND; codice precedenti è un utilissimo attributo che
permette di far vedere al nostro codice gestito
la cui traduzione in C# e Visual Basic.NET .NET, l’API LoadTypeLibEx scritta nella libre-
è: ria DLL non gestita oleaut32.dll.
L’attributo DLLImport ha
Tabella 2 Significato dei valori di enumerazione REGKIND
tra i suoi utilizzi appun-
to quello di permettere la
referenziazione di funzio- Valore Descrizione
C#
// Dichiarazione in C# dell’API Win32 LoadTypeLibEx
public enum REGKIND
{
REGKIND_DEFAULT = 0,
REGKIND_REGISTER,
REGKIND_NONE
} //REGKIND
[DllImport(“oleaut32.dll”, CharSet=CharSet.Unicode)]
public static extern void LoadTypeLibEx(string strTypeLibName,
REGKIND regKind,
out UCOMITypeLib TypeLib);
VB.NET
‘ Dichiarazione in VB.NET dell’API Win32 LoadTypeLibEx
Private Enum RegKind
RegKind_Default = 0
RegKind_Register = 1
RegKind_None = 2
<DllImport(„oleaut32.dll“, CharSet:=CharSet.Unicode)> _
Private Shared Sub LoadTypeLibEx(ByVal strTypeLibName As [String],
ByVal regKind As RegKind,
<MarshalAs(UnmanagedType.Interface)> ByRef typeLib As [Object])
End Sub
Se la chiamata a funzione ha successo, in en- una libreria di tipi COM, passando per l’uti-
trambi i casi di codice otteniamo la valorizza- lizzo della classe TypeLibConverter è piutto-
zione di un riferimento (tlbToImport) alla li- sto laboriosa se paragonata agli altri due me-
breria COM in memoria. todi precedentemente esposti.
Il passo conclusivo è quello di ottenere l’as- Se si dispone di Visual Studio o comunque
sembly d’interoperabilità e salvarlo su disco utilizzando l’utilità TlbImp.exe fornita nel-
pronto per essere utilizzato fattivamente. l’SDK di .NET Framework, possiamo conse-
Per conseguire quest’ultimo risultato non guire lo stesso risultato in minor tempo e con
dobbiamo far altro che istanziare la TypeLib- minor scrittura di codice.
Converter ed invocarne il metodo Convert- Concludiamo questo paragrafo evidenziando
TypeLibToAssembly. che il metodo ConvertTypeLibToAssembly del-
L’esecuzione del metodo ConvertTypeLi- la classe TypeLibConverter necessita di un pa-
bToAssembly restituisce un oggetto di classe rametro (che non può essere null o Nothing)
System.Reflection.Emit.AssemblyBuilder che che costituisca un riferimento ad istanza di
tramite il relativo metodo Save ci permette il una classe implementante l’interfaccia Itype-
salvataggio su file-system dell’assembly d’in- LibImporterNotifySink.
teroperabilità ottenuto (Listato 2). L’interfaccia ITypeLibImporterNotifySink di-
Come vediamo la tecnica di produzione di un chiara e mette a disposizione un meccanismo
assembly d’interoperabilità .NET a partire da di callback per il convertitore della libreria
C#
// Salvataggio in C# dell’assembly d’interoperabilità
TypeLibConverter conv = new TypeLibConverter();
string FileName = nome; //nome dell’assembly prodotto con estensione dll
string assemblyName = destinazione //destinazione dell’assembly prodotto;
AssemblyBuilder intAssembly = conv.ConvertTypeLibToAssembly(tlbToImport,
assemblyName + “\\” + FileName,
0, new SinkToITypeLibImporter(),
null, null, false);
//salvataggio
intAssembly.Save(FileName);
VB.NET
‘ Salvataggio in VB.NET dell’assembly d’interoperabilità
Dim conv As TypeLibConverter = New TypeLibConverter()
Dim FileName As String = nome ‘nome dell’assembly prodotto con estensione dll
Dim assemblyName As String = destinazione //destinazione dell’assembly prodotto
Dim intAssembly As AssemblyBuilder = conv.ConvertTypeLibToAssembly(tlbToImport,
assemblyName + “\” + FileName,
0, New SinkToITypeLibImporter(),
Nothing, Nothing, False);
‘salvataggio
intAssembly.Save(FileName);
dei tipi, in modo da informare il chiaman- Si tenga presenta a tal scopo il codice del-
te sullo stato della conversione, così da coin- l’oggetto CPPObject scritto nella dll COM CP-
volgerlo attivamente nell’intero processo di PObject.dll allegato a questo articolo. Per i
conversione. programmatori Visual Basic si tenga presen-
Ovviamente si possono fornire implemen- te il codice dell’oggetto VBObject scritto nel-
tazioni di questa interfaccia a seconda di la dll COM VBObject.dll. I due oggetti sono
come si vuole controllare l’intero svolgimen- quasi identici a parte alcune differenze, do-
to della produzione dell’assembly d’intero- vute alle profonde differenze tra i linguaggi
perabilità. Visual C++ 6 (VC++) e Visual Basic 6.
Nel codice del Listato 3 non ci interessa di Il componente COM C++ è stato ricava-
essere coinvolti nella fase di conversione e for- to utilizzando l’infrastruttura Microsoft ATL
niamo un sink implementato banalmente. 3.0 in Visual C++ 6.0, mentre il componente
A questo punto dell’articolo abbiamo ormai COM Visual Basic è stato ricavato utilizzan-
capito come il .NET Framework permetta l’uti- do Visual Basic 6.0.
lizzo di eventi notificati da componenti COM, L’oggetto comunque incapsula una sola va-
a client .NET. riabile di stato di tipo booleano che viene
modificata e letta tramite una proprietà di
Mappatura in assembly .NET nome Valore.
di eventi di componenti COM e gestione Quando lo stato dell’oggetto cambia (a segui-
early-binding in codice gestito to della modifica del campo booleano incap-
In questa parte dell’articolo cercheremo di sulato), allora scatta la notifica al client del-
chiarire come vengono interpretati e trascrit- l’evento onStatusChanged.
ti dentro un assembly .NET, gli eventi di un In VC++ l’oggetto in questione pubblica
oggetto COM pubblicati in una libreria dei un’interfaccia d’uscita _IBooleanoEvents con-
tipi. tenente il solo metodo onChangedStatus, la
C#
// Implementazione banale in C# della ITypeLibImporterNotifySink
VB.NET
‘ Implementazione banale in VB.NET della ITypeLibImporterNotifySink
Return Nothing
End Function
End Class
MSIDL
// Interfaccia in ingresso IBooleano
[
object,
uuid(98EEE356-88FB-476D-9531-601B774E91C1),
dual,
helpstring(“IBooleano Interface”),
pointer_default(unique)
]
interface IBooleano : IDispatch
{
[propget, id(1), helpstring(«Legge e scrive il valore booleano incapsulato»)]
HRESULT Valore([out, retval] BOOL *pVal);
[propput, id(1), helpstring(“Legge e scrive il valore booleano incapsulato”)]
HRESULT Valore([in] BOOL newVal);
};
VB6
‘Variabile o variabili locali per la memorizzazione dei valori delle proprietà.
Private mvarValore As Boolean ‘Copia locale.
‘evento di notifica
Public Event StatusChanged(pValue As Boolean)
End If
End Property
End Property
Vediamo infatti da essa che il compilatore de- La parola chiave WithEvents fornita dal Visual
finisce la coclasse clsBoolean come una clas- Basic nella dichiarazione del reference all’og-
se COM che implementa le due interfacce, _ getto, permetterà in compilazione la scrittu-
clsBoolean (singolo underscore iniziale) con- ra del codice di creazione di un sink che im-
tenente la proprietà Valore come interfaccia plementa le interfacce d’uscita descritte dal-
d’ingresso e l’interfaccia d’uscita __clsBoo- l’oggetto collegabile.
lean con il metodo di notifica d’evento di- Però non ci interessa qui ed ora produrre un
chiarata al suo interno. client VB6 o VC++ 6 di questi oggetti, bensì
Val la pena osservare che dal punto di vi- di vederne uno realizzato in .NET (ad esempio
sta dei linguaggi OOP questo modo di fare in C# o in VB.NET) cercando di capire come
del compilatore Visual Basic è poco ortodos- possano essere tradotti e gestiti gli eventi sol-
so, visto che molti dettagli di strutturazione levati dall’oggetto COM.
OOP del codice vengono tolti al program- Ebbene, in questa sezione dell’articolo ve-
matore (anche perché VB6 come linguaggio diamo l’utilizzo di un assembly d’interopera-
non ne è dotato intrinsecamente) e delega- bilità così da collegarci early-binding al com-
ti al compilatore in una successiva fase di ponente.
compilazione. Nella successiva seconda puntata dell’arti-
In entrambi gli oggetti prodotti – sia quel- colo vedremo un metodo altrettanto interes-
lo in VC++ 6 che in VB6 – viene pubblica- sante ma a mio avviso di minor impatto sul-
ta un’interfaccia in uscita in corrisponden- le prestazioni runtime che sfrutta il late-bin-
za della quale, se vogliamo essere richiama- ding al componente, ossia non passa per la
ti, nel client dovremo fornire il relativo sink produzione di un assembly d’interoperabilità
d’eventi. nel collegamento all’oggetto COM.
Questo in Visual Basic 6 è molto semplice. Applicando, come detto in precedenza,
l’utilità T l b I m p . e x e
produciamo l’assem-
bly d’interoperabili-
tà CPPObjectInt.dll al
componente COM CP-
PObject.dll.
Si può procedere nel-
lo stesso modo alla pro-
duzione dell’assembly
d’interoperabilità an-
che per il componen-
te scritto in VB6. A li-
vello binario per il CLR
di .NET i due assem-
bly sono identici, eccet- Figura 9 Disassemblato MSIL del componente d’interoperabilità
to nelle differenze dei
nomi delle entità scrit-
te all’interno che riflet-
tono in modo ovvio le identiche differenze di faccia d’uscita _IBooleanoEvents è stata rea-
nomi nei componenti originari. lizzata una corrispondente classe con il nome
Ci concentriamo dunque sull’assembly d’in- così strutturato
teroperabilità CPPObjectInt.dll.
Ricorrendo al disassemblatore Ildasm fornito NomeInterfacciaDiUscita_NomeMetodoEventHandler
con l’SDK di .NET Framework osserviamo che
le interfacce IBooleano (interfaccia d’ingres- Questa classe estende la System.Multica-
so) ed _IBooleanoEvents (interfaccia in uscita) stDelegate; per ogni metodo nell’interfaccia
vengono importate nell’assembly come inter- in uscita è stato creato nell’assembly d’intero-
facce gestite a tutti gli effetti, mantenendo gli perabilità un delegato opportuno ([10]).
stessi nomi che hanno nel componente COM Dalla Figura 11 notiamo che le sintassi dei
e con gli stessi membri dichiarati nell’inter- metodi nell’interfaccia d’uscita sono mante-
faccia (Figura 10). nute nelle classi delegate corrispondenti, con
Si osservi che per ogni metodo nell’inter- la sola sostituzione del nome in Invoke e la
trasformazione dei tipi
non gestiti nelle contro-
parti gestite.
Nell’assembly d’inte-
roperabilità (Figura 12)
troviamo inoltre l’inter-
faccia _IBooleanoEven-
ts_Event e le due clas-
si _IBooleanoEvents_
EventProvider (privata)
ed _IBooleanoEvents_
SinkHelper.
La classe con suffisso
_SinkHelper implemen-
Figura 10 Eventi COM come delegati in .NET
ta l’interfaccia .NET _
IBooleanoEvents for-
∑ gestione .NET late binding di eventi nei [2] Julian Templeman e John Paul Muel-
componenti COM ler – “COM programming with Microsoft
∑ CCW (COM Callable Wrapper) ed interope- .NET”, Microsoft Press, 2003
rabilità di componenti .NET in COM [3] Guy Eddon ed Enry Eddon – “Inside Di-
∑ Considerazioni finali sull’interoperabilità stribuited COM”, Mondadori Informati-
COM/.NET ca, 1998
[4] George Sheperd e Brad King – “Inside
Sono grato alle opere citate in bibliografia i cui ATL”, Mondadori Informatica, 1999
autori mi hanno aiutato a comprendere e poi a [5] Jeffrey Richter, Francesco Balena “Program-
mettere in pratica i concetti della moderna pro- mazione avanzata con Microsoft Visual Ba-
grammazione distribuita a componenti, secondo sic .NET” Mondadori Informatica, 2002
gli standard industriali della Microsoft. [6] http://msdn.microsoft.com/library/default.
Invito l’attento lettore ad approfondire su asp?url=/library/en-us/csref/html/vcref-
questi libri i concetti discussi nel presente thedelegatetype.asp
articolo, sperando che oltre all’acquisizione [7] http://msdn.microsoft.com/library/default.
di tecniche e metodologie, egli possa perce- asp?url=/library/en-us/csref/html/vcwlke-
pire l’intrinseca bellezza dei contenuti con- ventstutorial.asp
cettuali. [8] http://msdn2.microsoft.com/en-us/library/
75s611wc.aspx
Bibliografia e Riferimenti [9] E. Deana – “IUnknown, CLSID, IDispatch,
[1] Jeffrey Richter – “Microsoft .NET Pro- IID”, Visual Basic Journal n. 29
grammazione avanzata”, Mondadori In- [10] M. Mammuccini – “ .NET: Delegate e model-
formatica, 2002 lo di eventi”, Visual Basic Journal n. 66
cement”) permette di descrivere quali parti del- tomaticamente gli Imports e i riferimenti neces-
lo snippet possono essere variate dinamicamen- sari per un suo corretto funzionamento. In que-
te una volta inserito nel codice. sto caso ci vengono in aiuto i tab “References” e
“Imports” che permettono di assolvere in modo
estremamente semplice a questo compito. L’ulti-
mo tab, “Test”, permette di compilare lo snippet
I code snippet non sono e controllare così se sono stati prodotti degli er-
niente altro che semplici rori durante la creazione.
La semplice Toolbar permette di salvare lo snip-
file XML che seguono uno pet (con estensione .snippet), di esportare lo snip-
schema determinato pet in un file con estensione .vsi (cioè Visual Stu-
dio Installer, quindi distribuibile a terzi), e di im-
postare le opzioni per l’applicazione, quali il font
e l’aspetto. Poiché il progetto è assolutamente
Dato che la filosofia di base degli snippet è sem- open source, non è da sottovalutare l’opportuni-
plificare al massimo la scrittura di codice e acce- tà (per i più curiosi) di scaricare il codice sorgen-
lerare i tempi di sviluppo, una volta richiamato te direttamente dal workspace di Snippet Editor
uno snippet è compito dello stesso inserire au- su gotdotnet.
BugTracker.NET richiede il .Net Framework Nel primo caso basterà eseguire lo script setup.
1.1, SQL o MSDE ed un server web. La versio- sql mediante QueryAnalyzer e solo in seguito si
ne descritta nel presente articolo è stata testata potrà modificare il file web.config nella parte re-
su Windows XP SP2 con IIS, .Net Framework 1.1 lativa alla connessione al database. Nel secondo
ed MSDE 8.0. caso sarà invece necessario effettuare qualche pas-
so in più. Infatti, dopo aver modificato la stringa
Installazione di connessione predefinita come in:
Per cominciare bisogna effettuare il download del
pacchetto dal sito [5]. La prima fase dell’installazio- <add key=”ConnectionString” value=”server=(local);
ne consiste nel creare una directory virtuale su IIS database=MASTER;uid=sa;pwd=mypwd”/>
che chiameremo BtNet: indirizzeremo pertanto la
nostra applicazione mediante http://localhost/btnet/. basterà andare alla pagina http://localhost/btnet/
Il passo successivo consiste nel creare l’apposito da- query.aspx e creare il database usando la consue-
tabase che sarà successivamente utilizzato dall’ap- ta sintassi Sql
plicazione. Come suggerito nella documentazione
tecnica, i casi possibili sono essenzialmente due: CREATE DATABASE BTNET
1. creazione e configurazione di un database con (BTNET è fornito solo a scopo d’esempio) e solo
SQL; successivamente tornare a modificare la chia-
2. creazione e configurazione di un database con ve ConnectionString della pagina web.con-
MSDE. fig settando il nome prescelto per il database.
Prodotto
Tali cambiamenti saranno visibili nel momento BugTracker.Net
in cui si accederà alla pagina dei bug per selezio- Url di riferimento
nare una particolare vista degli stessi. Ulteriori ed http://btnet.sourceforge.net/bugtrackernet.html
importanti cambiamenti alle impostazioni di base Stato Release
possono essere realizzati sia mediante le funzio- v.2.2.5
nalità dell’applicazione, sia tramite le key di web. Semplicità d’uso ™™™™™
config, tutte commentate e con esempi allegati. Chi ha utilizzato altri tool di bug-tracking noterà la notevole sem-
plicità d’uso. Per un utilizzo “standard” poco o nulla deve essere
fatto per cominciare a lavorare.
Limite dell’applicazione
Un’osservazione importante che i lettori devono Utilità ™™™™™
Un team composto da due o più persone difficilmente può fare a
tenere in considerazione è che, come dichiarato meno di un sistema come BugTracker.Net. È una di quelle applica-
dallo stesso autore di BugTracker.NET, l’applica- zioni che più si usano, più si apprezzano e più diventano utili.
zione è stata interamente sviluppata basandosi sul Qualità prodotto ™™™™≤
.Net Framework utilizzando un semplice editor di BugTracker.Net è una buona applicazione, scritta avvalendosi anche
testo. Ciò significa che del concetto di code-behind, di componenti esterni di massima qualità ed affidabilità.
alla base di qualsiasi applicazione ASP.NET svi- Qualità documentazione ™™™™≤
luppata in ambiente Visual Studio .NET, non c’è Bisognerebbe dare il massimo dei voti in quanto moltissimi sug-
gerimenti e chiarimenti sono presenti nella documentazione tec-
quasi traccia. Chi pensa di aggiungere dei nuovi nica del pacchetto di installazione. L’unico difetto è che tali infor-
moduli potrebbe incontrare qualche ostacolo dal mazioni risultano poco aggregate.
punto di vista dell’integrazione.
di Stefano Savo
N
ella prima puntata abbiamo visto i moti- presenti nella richiesta HTTP.
vi per i quali è utile analizzare il traffico Ai fini dell’analisi degli acces-
di un sito internet e quali dati è utile e si è importante che i file di log
possibile misurare; in questo secondo articolo cer- contengano le seguenti informa-
cheremo di vedere nel dettaglio quanto sono cer- zioni: data e ora, indirizzo IP del
ti questi dati e quanto l’affidabilità della rilevazio- richiedente, url richiesto, refe-
ne dipenda dalla scelta del modo più opportuno rer, cookie.
di misurare gli accessi. Vedremo poi alcuni fatto- A titolo di esempio ecco una
ri da considerare nella scelta del software di ana- possibile riga di un file di log:
lisi di tali dati.
I primi software di web analytics sono nati, ormai 192.168.1.3 jay.bird.com - fred
diversi anni fa, dall’analisi dei log dei web server. [25/Dec/1998:17:45:35 +0000]
Un web server riceve una richiesta HTTP e resti- “GET /~sret1/ HTTP/1.0” 200 1243
tuisce in risposta il documento richiesto, eventual- “http://www.site.com/” “Mozilla/
mente richiedendo ad un application server la ge- 2.0 (X11; I; HP-UX A.09.05)”
nerazione dinamica del documento sulla base dei
parametri presenti nella richiesta. I lettori più smaliziati avran-
Il web server annota anche in un apposito file di no già individuato due criticità
log le richieste HTTP ricevute e le loro caratteri- fondamentali di un’analisi che
stiche. si basi su questi dati:
Per ridurre le dimensioni dei file di log talvolta i
web server vengono configurati in modo tale che • L’indirizzo IP del richieden-
vengano riportate solo alcune delle informazioni te non è sempre disponibile
con certezza: molti utenti ac-
cedono al web tramite proxy
o firewall che mascherano
Stefano Savo è ingegnere informatico e lavora da più di l’IP dell’utente. In questi casi
cinque anni nella analisi, progettazione e sviluppo di web
diversi utenti che accedono
application. Tra i suoi interessi: Information Architecture e
Web Semantico. dalla stessa rete potrebbero
sembrare avere lo stesso IP.
• Non tutte le pagine che noi vediamo du- gine più viste che hanno la maggiore proba-
rante la navigazione di un sito internet bilità di essere cachate e conseguentemente
provengono dal web server. Quando richie- di non essere rilevate.
diamo una pagina già vista, la richiesta Se avete un’idea precisa di come i vostri
viene in molti casi soddisfatta dalla cache utenti accedano al sito (ad esempio perchè si
del browser e la richiesta non raggiunge tratta di un sito sulla intranet aziendale) po-
nemmeno il web server e quindi esso non tete valutare quanto questi problemi posso-
può annotarla nel file di log. Caso analo- no impattare sulle vostre analisi.
go si presenta quando gli utenti accedo- È comunque possibile considerare alcune
no ad internet attraverso un proxy (molto contromisure per evitare un’eccessiva distor-
frequente per gli utenti connessi alla rete sione dei dati.
aziendale). In questo caso non è nemme- Alcuni prodotti utilizzano l’indirizzo IP del
no necessario che l’utente abbia già visto visitatore in combinazione con la versione di
la pagina ma è sufficiente che uno degli browser utilizzata per identificare l’utente.
utilizzatori del proxy lo abbia fatto, affin- Questo accorgimento può servire a distingue-
chè il proxy stesso serva la pagina senza re due utenti che accedano al sito utilizzando
inviare la richiesta al web server remoto. lo stesso proxy ma browser diversi. Questa
soluzione può comunque non essere soddi-
L’indirizzo IP del richiedente è un dato che sfacente, ad esempio capita spesso che i di-
viene spesso usato per identificare l’utente, pendenti di un’azienda abbiano esattamen-
ma ciò comporta che gli utenti che accedo- te la stessa versione del browser ed utilizzi-
no usando lo stesso proxy rischiano di esse- no lo stesso proxy. È allora importante assi-
re considerati come un utente unico che vede curarsi che il software prescelto per l’anali-
moltissime pagine, falsando l’analisi. si dei log consenta di identificare una visita
Anche il caching di browser e proxy è poten- utilizzando altre informazioni. Un’informa-
zialmente molto dannoso: sono proprio le pa- zione che può utilmente essere utilizzata per
identificare con ragionevole certezza una visi- merosi accessi) vengono sorprendentemente
ta è l’identificativo di sessione che viene ge- implementate euristiche più approssimative
nerato dall’application server ed inviato dal ma più semplici. Se volete avere un’idea pre-
browser per tutte le richieste successive alla cisa dell’affidabilità dei dati calcolati da un
prima. Questo codice può essere memorizza- certo software è fondamentale a mio avvi-
to in un cookie o passato come parametro in so l’approccio sperimentale. Su un ambien-
ogni richiesta a seconda della vostra configu- te di test effettuate una decina di visite da
razione. In questo modo se avete un appli- varie macchine e fate analizzare il log così
cation server che gestisce le sessioni potete ottenuto dai vari software. In questo modo
calcolare in maniera sufficientemente affida- sapete quali risultati aspettarvi e probabil-
bile questo dato. Per la prima richiesta che mente vi sorprenderete nel vedere le diffe-
viene fatta in una visita però l’identificativo renze nei risultati calcolati dai vari tool, an-
di sessione non viene inviato dal browser al che da quelli che hanno avuto più successo
web server, in tal caso il software di analisi sul mercato.
può utilizzare diverse euristiche per cercare Nel corso del tempo ai sistemi di analisi dei
la prima pagina di ogni sessione. Ad esem- log si sono aggiunte altre soluzioni, che pre-
pio può partire dalla prima richiesta che con- vedono l’inserimento di apposito codice Java-
tenga un ID di sessione e cercare le richie- script nelle pagine erogate. Gli script vengo-
ste provenienti dallo stesso IP di poco ante- no eseguiti sul browser dell’utente ed invia-
cedenti o può utilizzare il referer per identi- no le informazioni al server, aggirando così il
ficare la pagina precedente. I prodotti leader problema della cache. Un’altro vantaggio di
di mercato spesso non indicano in maniera questi sistemi è che possono inviare le infor-
molto dettagliata l’algoritmo che applicano mazioni ad un server diverso da quello che
per identificare le pagine che appartengono eroga il sito web consentendo così di ester-
ad una sessione. Inoltre spesso per garanti- nalizzare il servizio di analisi degli accessi.
re un’alta velocità nell’analisi dei dati (che È nata così la possibilità di scegliere tra l’ac-
è sicuramente un aspetto importante per un quisto di un software da installare e quello
software destinato ad analizzare siti con nu- di un servizio di analisi. Alcuni servizi con-
sentono addirittura l’analisi in tempo reale tanti per la gestione tecnica del sito, come ad
degli accessi, che può essere un’informazio- esempio l’accesso da parte degli spider dei mo-
ne preziosa quando si vogliono gestire degli tori di ricerca (che solitamente non eseguono
eventi sul web. Questa possibilità non è tut- i Javascript) o, in caso di load balancing, qua-
tavia sempre così importante, sembra inve- le sia il carico sui diversi server.
ce fondamentale la possibilità di aggirare i Per concludere: è spesso utile combinare
problemi dovuti al caching. Tuttavia l’utiliz- un’analisi dei file di log con i dati generati
zo di un sistema basato sui Javascript client- dai Javascript client-side, ed infatti i softwa-
side comporta anche degli inconvenienti. Il re moderni quasi sempre supportano entram-
più grave ma forse quello meno importan- bi i sistemi di analisi.
te dal punto di vista numerico è che esisto-
no browser che non supportano Javascript e Assumendo quindi di aver fatto le scelte che
che in tutti browser è possibile disabilitare consentono la maggior correttezza possibile
l’esecuzione degli script. Questi utenti non dei dati raccolti, possiamo passare ad analiz-
verrebbero tracciati per nulla; tuttavia da zare altre qualità di un sistema di analisi de-
un punto di vista statistico la grande mag- gli accessi al sito.
gioranza degli utenti è in grado di eseguire Un fattore discriminante nella scelta del tool
i Javascript sul proprio browser e non li di- migliore può essere la flessibilità con la quale
sabilita. Un altro problema di questi sistemi il tool consente di definire gruppi di contenu-
è la limitazione nella possibilità di traccia- ti. È spesso utile infatti raggruppare insiemi
re l’uso di documenti che non possono ospi- di pagine per capire quali siano gli interessi
tare Javascript. Ad esempio per tracciare lo degli utenti e le modalità di utilizzo del sito.
scaricamento di un documento PDF, dovre- Valutando nel dettaglio le offerte dei diversi
mo inserire un Javascript sull’evento “oncli- software vediamo che molti impongono alcu-
ck” del link che punta al PDF. ni limiti in questa funzionalità: alcuni impon-
gono che le pagine di un gruppo appartenga-
no ad una stessa directory, altri consentono
di definire gruppi basandosi solo sull’uri del-
Un fattore discriminante le pagine e non sui parametri passati (e que-
sto può essere un problema per le pagine ge-
nella scelta del tool nerate dinamicamente); altri ancora impon-
migliore può essere gono che una pagina appartenga ad uno ed
un solo gruppo.
la flessibilità con la quale
il tool consente di definire Un’altra funzionalità distintiva consiste nel-
l’analisi dei path, ovvero dei percorsi seguiti
gruppi di contenuti dagli utenti nella navigazione.
Alcuni software si limitano ad identificare
le sequenze di pagine in una visita e a con-
tare il numero di visite composte dalle stes-
Questo consente di tracciare l’interesse al se pagine. Essendo molto difficile avere del-
documento, tuttavia richiede un attento in- le visite esattamente identiche nella sequen-
tervento del webmaster: se alcuni link non za di pagine, questo dato è spesso di difficile
sono configurati correttamente, le informa- lettura. Altri software invece effettuano una
zioni sulla navigazione non verranno mai re- vera e propria “cluster analysis” ovvero indi-
gistrate e saranno perse per sempre. viduano all’interno delle varie visite le sotto-
Con i Javascript client-side inoltre non è pos- sequenze più comuni e questo può essere un
sibile rilevare dati che possono essere impor- dato veramente interessante.
Conclusioni Bibliografia
In generale le variabili da considerare nel- [1] Eric T. Peterson – “Web Site Measurement
l’analisi degli accessi ad un sito internet sono Hacks”, O’ Reilly, 2005
numerose proprio per l’eterogeneità caratte-
ristica di questo ambiente. Talvolta possiamo Riferimenti
fare delle assunzioni sul modo in cui gli uten- [2] WebTrends – www.netiq.com
ti accedono al servizio (con quali browser, con [3] NetTracker – www.sane.com
che configurazione, attraverso quali proxy) e [4] Summary – www.summary.net
semplificare in questo modo l’analisi, ma ciò [5] Urchin – www.urchin.com
non è sempre possibile. Non è possibile, in [6] Pilot Hit List – www.pilotsoftware.com
generale, avere la certezza di tracciare tutte [7] Analog – http://www.analog.cx/
le visite al sito ma è possibile avere delle im- [8] WebAlizer – http://www.mrunix.net/weba-
portanti indicazioni statistiche. Un’attenta va- lizer/
lutazione delle caratteristiche specifiche del [9] Pathalizer – http://pathalizer.sourceforge.net/
vostro ambiente e del vostro sito, e l’identifi- [10] http://www.clickz.com/experts/crm/actio-
cazione dei dati che vi interessa misurare vi nable_analysis/
consentirà allora di scegliere il software più [11] http://www.webanalyticsdemystified.com/
adatto per analizzare gli accessi al sito e per [12] http://www.coffeesuntechnology.com/
monitorare nel tempo i risultati. [13] http://www.hurolinan.com/