Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Scrivi a
A First Look at SQL Ser- Applicare UML e i pattern
ver 2005 for Developers book@infomedia.it Analisi e progettazione
di B. Beauchemin et al. specificando orientata agli oggetti
3a Ed.
nell’oggetto della di C. Larman
Addison Wesley
e-mail: Addison Wesley Italia
ISBN 0321180593
736 pp - 46,95 €
IN OFFERTA ISBN 8871922700
768 pp - 43,00 €
VBJ n. 67
OPPURE
inviaci il coupon
Microsoft SQL Server 2005 Using UML:Software
Changing the Paradigm sottostante Engineering with Objects
(SQL Server 2005 Public al numero di fax and Compone, Edition 2
Beta Edition) di P. Stevens
0587/732232
Sams Potrai acquistare Addison Wesley
ISBN 0672327783 ISBN 0321269675
504 pp - 34,70 €
i libri qui riportati con 272 pp - 57,95 €
uno
SCONTO
ADO.NET and
ECCEZIONALE Cryptography in the
System.Xml v. 2.0-The Database
Beta Version, Edition 2 del 10% anche se The Last Line of Defense
di A. Homer et al. acquisti solo un di K. Kenan
libro
Addison Wesley Prentice Hall
ISBN 0321247124 OPPURE ISBN 0321320735
560 pp - 39,95 € 312 pp - 39,95 €
del 20% se acquisti
3 libri
VBJ 67
online.infomedia.it
n. 67 - gennaio/febbraio 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)
Guerre informatiche
Collaboratori
Stefano Corti
Raffaele Di Natale
di religione
Andrea Ferendeles
U
Fabio Perrone na delle cose più belle della comunità degli sviluppatori
Scott Swigart
Lorenzo Vandoni nel mondo è di essere animata da passioni ferventi, come
Pietro Vite quelle che ti fanno passare la notte in bianco fino a quando
il problema non è stato definitivamente risolto. È bello vedere tante
persone di ogni età affrontare il proprio lavoro con l’entusiasmo
di teenager, o quasi.
D’altra parte, una delle cose più discutibili della comunità degli
sviluppatori è di essere animata da passioni troppo ferventi. Quando
cominciai a smanettare sui computer, il mondo si divideva tra gli
appassionati del Sinclair Spectrum e quelli del Commodore C64,
ciascuno dei quali poteva passare ore a discettare sulle virtù del proprio computer e sui
Direzione difetti del computer avversario. La disputa si spostò presto sul confronto Amiga-Atari-
Natale Fino (nfino@infomedia.it) Apple, e dopo ancora IBM PC vs Macintosh. Quest’ultima è probabilmente la querelle di
Marketing & Advertising più lunga durata, visto che è continuata immutata fino ad oggi, anche se ora la materia
Segreteria: 0587/736460 del contendere si è spostata sul sistema operativo.
marketing@infomedia.it Nel campo del software la discussione è stata persino più accesa. Prima erano i dialetti
Amministrazione del Basic, poi la contrapposizione C vs Pascal, poi C e C++, Visual Basic e Delphi, SQL
Sara Mattei Server e Oracle, Windows e Linux, e più recentemente le piattaforme .NET e Java. Se
(amministrazione@infomedia.it) volete avere dei dati che supportino le vostre convinzioni, fatevi un giro in Internet e
Grafica troverete sicuramente dei benchmark che vi garantiscono che il linguaggio-sistema
Manola Greco (mgreco@infomedia.it) operativo-database che preferite è assolutamente migliore di quello che invece detestate,
Technical Book con buona pace di tutti.
Lisa Vanni (book@infomedia.it) Forse è l’eta, forse il fatto di avere la sensazione di aver già visto questo film altre volte,
Segreteria ma non riesco più ad appassionarmi a queste battaglie. O comunque, cerco di non per-
Enrica Nassi dere mai di vista il fatto che, molto spesso, dietro le community di persone appassionate
(info@infomedia.it) e in buona fede, che dedicano davvero il loro tempo a curare blog e forum, si muovono
interessi commerciali enormi. In questo piccolo spazio a mia disposizione, posso solo
darvi un paio di consigli.
Stampa
Quando leggete i risultati di un case-study o unasurvey che mette a confronto due tec-
TIPOLITOGRAFIA PETRUZZI
Citta’ di Castello (PG) nologie, per prima cosa andate a vedere chi l’ha fatta e soprattutto chi l’ha commissio-
nata. A seconda di come si selezionano i criteri di valutazione e i benchmark, è possibile
Ufficio Abbonamenti dimostrare tutto e il contrario di tutto. Ad esempio, non è difficile provare che in alcune
Tel. 0587/736460 - Fax 0587/732232 configurazioni Access sia molto più veloce di SQL Server o Oracle, oppure che VB4 sia più
e-mail: abbonamenti@infomedia.it performante di C# o Java. Controllate sempre i dettagli di questo tipo prima di prendere
www.infomedia.it
le conclusioni come buone.
Gruppo Editoriale Infomedia srl E quando vi imbattete in dichiarazioni di IBM, Sun o Oracle che promuovono Java e Linux
Via Valdera P., 116 - 56038 Ponsacco (PI) Italia come espressioni del “software libero” contro lo strapotere Microsoft, andatevi a rileggere
Tel. 0587/736460 - Fax 0587/732232
red_vbj@infomedia.it le cronache degli anni ‘70, quando IBM aveva il monopolio assoluto in questo settore.
Sito Web www.infomedia.it Ovviamente non sto dicendo che non si ha il diritto di criticare Microsoft, ma solo che
sarebbe bene non farsi coinvolgere più di tanto nelle guerre tra i colossi del software.
A meno che ovviamente, non abbiate investito tutti i vostri risparmi nelle azioni di uno o
Manoscritti e foto originali anche se non pubblicati, dell’altro. Ma quello è un problema vostro...
non si restituiscono. È vietata la riproduzione
anche parziale di testi e immagini.
Francesco Balena
Si prega di inviare i comunicati stampa e gli inviti stampa per fbalena@codearchitects.com
la redazione all’indirizzo: comunicatistampa@infomedia.it
Visual Basic Journal è una rivista di
Gruppo Editoriale Infomedia S.r.l. Via Valdera P, 116 Ponsacco - Pisa.
Registrazione presso il Tribunale di Pisa n. 20/1999
N. 67 - Gennaio/Febbraio 2006 VBJ 5
SOMMARIO
GENNAIO/FEBBRAIO
N.67 Editoriale
RUBRICHE
5
.NET Tools 61
SPECIALE
TECNICHE
Multithreading semplice e robusto in applicazioni
Windows Forms 1.1 e 2.0 34
Chi sviluppa in .NET 2.0 può scrivere applicazioni Windows Forms multithreaded in modo semplice grazie al nuovo
componente BackgroundWorker. In questo articolo vedremo come implementare un identico controllo in .NET 1.1 e
come estenderlo per renderlo persino più potente del componente fornito con Visual Studio 2005.
di Francesco Balena
VB6
File compatti e illeggibili - Crittografia(prima puntata) 40
Crittografia e compressione di file in VB6 utilizzando il Microsoft .NET Framework.
di Scott Swigart, Swigart Consulting LLC.
SOFTWARE ENGINEERING
Executable UML 44
UML (xUML) è un formalismo che consente di applicare concretamente le linee guida fornite dalla Model Driven
Architecture (MDA).
di Lorenzo Vandoni
WEB
DotNetNuke: creazione di un modulo 50
DotNetNuke è un portale open source sviluppato in tecnologia Microsoft .Net. In questo articolo ne vedremo le
caratteristiche principali e le soluzioni adottate per costruire con esso un portale intranet.
di Pietro Vite
APPLICAZIONI
Controllo Remoto in Visual Basic .NET (quarta puntata) 55
Il pattern Adapter suggerisce come modificare una classe server in modo da adattarsi all’interfaccia richiesta da altre classi client.
di Stefano Corti
TDO
di Andrea Ferendeles
G
ià nel numero 62 abbiamo avuto modo di Più avanti vedremo che tutte
parlare della prima versione di Tdo. Oggi le operazioni possibili che pos-
questo strumento si presenta rinnovato ed siamo eseguire sul nostro data-
in linea con le novità introdotte dal .NET framework base (select, insert, update, de-
2.0 ma soprattutto in versione open source (http:// lete, stored procedure, ecc…)
tdo.sourceforge.net). partiranno proprio dall’invoca-
zione di metodi presenti all’in-
Che cos’è Tdo terno degli oggetti della classe
Tdo è l’acronimo di Typed Data Object ovvero Og- TdoHelper.
getto Dati Tipizzato e si compone di un assembly
.NET (Tdo.dll) e di un generatore di codice sorgen- Tdo è Open Source
te (TdoCodeGenerator.exe). Tdo, a partire da questa ver-
Il generatore di codice produce un insieme di sione (2.0) è divenuto un pro-
classi derivate (VB.NET / C#.NET ) che estendo- getto open source e sia i sor-
no le classi base presenti all’interno dell’assem- genti che il pacchetto di in-
bly Tdo.dll, il tutto secondo un rigoroso modello stallazione sono scaricabili da
Object Oriented. sourceforge.net all’indirizzo
Ogni classe generata ha lo scopo di “rappresenta- web: http://tdo.sourceforge.net.
re” un oggetto del nostro database SQL, dove per Il pacchetto di installazione
oggetti si intendono Tabelle, Viste, Stored Proce- installa sia la libreria di base
dure, Funzioni. Proprio secondo questo modello, Tdo.dll che il generatore di co-
ogni tabella, vista, ecc… viene considerata un og- dice TdoCodeGenerator.exe.
getto che espone a sua volta attributi ed operazio- Per poterlo utilizzare è
ni (proprietà e metodi). consigliabile disporre di MS
Ciò significa che il singolo campo di una tabella Visual Studio .NET 2005 e Sql
o il singolo parametro di una stored procedure sa- Server 2005 (o 2000 o 7.0).
ranno a loro volta oggetti. Tutte queste classi sono
racchiuse gerarchicamente in un unico macro-og- Generazione del codice
getto a rappresentazione dell’intero database – la sorgente e del DataSet
classe TdoHelper. tipizzato
La prima operazione da com-
Andrea Ferendeles ha iniziato ad appassionarsi di informati- piere è sicuramente quella di in-
ca dai tempi del VIC20. Ha sviluppato in BASIC, Logo, Turbo stallare Tdo e quindi di genera-
Pascal, C, C++, Visual Basic, fino ad arrivare ai linguaggi
re il codice sorgente necessario
.NET, quali VB.NET e C#. È certificato MCP, MCAD, MSF,
MCSD (.NET), MCDBA, MCT. Può essere contattato via email: (occorre aver precedentemente
aferendeles@infomedia.it. installato il .NET Framework
Ovviamente è possibile,
con lo stesso metodo, inve-
ce specificare quali campi
includere nel result-set.
Listato 5:
C#
//SELECT EmployeeId, LastName,
FirstName FROM dbo.Employees
Figura 4 Stato di avanzamento della generazione
DataTable dtEmployees =
tdo.tEmployees.SelectDataTable
( VB.NET
tdo.tEmployees.Employeeid, ‘SELECT EmployeeId, LastName, FirstName
tdo.tEmployees.Lastname, ‘ FROM(dbo.Employees)
tdo.tEmployees.Firstname ‘ WHERE LastName=’Davolio’ AND FirstName=’Nancy’
); Dim dtEmployees As DataTable = tdo.tEmployees.SelectData
Table( _
VB.NET Clause.Where(tdo.tEmployees.Lastname = “Davolio” And
‘SELECT EmployeeId, LastName, FirstName FROM dbo.Employees tdo.tEmployees.Firstname = “Nancy”), _
Dim dtEmployees As DataTable = tdo.tEmployees.SelectData tdo.tEmployees.Employeeid, _
Table( _ tdo.tEmployees.Lastname, _
tdo.tEmployees.Employeeid, _ tdo.tEmployees.Firstname)
tdo.tEmployees.Lastname, _
tdo.tEmployees.Firstname) … il tutto ancora con una sola riga di codice.
Figura 5 Diagramma delle classi e gerarchia degli oggetti alla quale appartiene la classe EmployeesTable
New DateTime(1950, 1, 1), New DateTi- // ORDER BY TitleOfCourtesy DESC, LastName, FirstName
me(1960, 12, 31) _ DataTable dtEmployees = tdo.tEmployees.SelectDataTable
) _ (
) _ Clause.OrderBy
) (
tdo.tEmployees.Titleofcourtesy,
Un esempio di Order by e Group By nei Li- OrderByOperator.Desc,
stati 10 e 11: tdo.tEmployees.Lastname, OrderByOperator.Asc,
tdo.tEmployees.Firstname, OrderByOperator.Asc
Listato 10: )
C# );
//SELECT *
// FROM dbo.Employees VB.NET
Riquadro 1 Elenco degli operatori .NET in overloading per espressioni T-SQL secondo il modello Tdo Sql
Expression DOM
= == =
<> != <>
> > >
>= >= >=
< < <
<= <= <=
NOT ! NOT
AND & And
OR | Or
LIKE % Mod
NOT LIKE - -
Figura 7 Diagramma delle classi della stored procedure Cust Order Hist
La classe Tdo.Common.TdoSqlExpression
DOM.JoinInfo è dotata di ben 5 costruttori
Figura 9 Organizzazione di namespace dell'assembly
Tdo.dll per ammettere operazioni di JOIN che
coinvolgano al più 6 tabelle/viste. Altri metodi
interessanti della classe TdoHelper sono:
Clause.Where(tdo.tOrders.Customerid == “ALFKI”),
tdo.tOrders.Orderid, tdo.tOrders.Customerid, • CreateCommand per creare rapidamente og-
tdo.tOrders.Orderdate, gettiSqlCommand,conlapossibilitàdipassare
tdo.tOrderDetails.Productid, tdo.tOrderDetails. un parametro di tipo SqlNotificationRequest
Quantity, tdo.tOrderDetails.Unitprice); (rif.: http://msdn.microsoft.com/library/
d e f a u l t . a s p ? u r l = / l i b r a r y / e n - u s/
//[SQL Profiler Trace]: dnvs05/html/querynotification.asp).
//--------------------- Nel Listato 25 un esempio di utilizzo del
//exec sp_executesql N’select Orders.OrderID as [OrderID] , metodo CreateCommand con l’oggetto Sys
Orders.CustomerID as [CustomerID] , tem.Data.Sql.SqlDependency per SQL Ser-
// Orders.OrderDate as [OrderDate] ,[Order ver 2005.
Details].ProductID as [ProductID] , • CreateDataAdapter per creare rapidamen-
// [Order Details].Quantity as [Quantity] ,[Order te oggetti SqlDataAdapter.
Details].UnitPrice as [UnitPrice] • ExecuteNonQuery, ExecuteReader, Execu-
// from Orders INNER JOIN dbo.[Order Details] ON teScalar, ExecuteXmlReader.
Orders.OrderID = [Order Details].OrderID • Fill, FillSchema.
// WHERE (Orders.CustomerID = @_p10513825641) ‘, N’@_
p10513825641 nvarchar(5)’, @_p10513825641 = N’ALFKI’ Listato 25:
C#
VB.NET public void example_025()
Dim dtOrder_OrderDetails As DataTable = tdo.SelectJoin( _ {
New JoinHelper(Join.InnerJoin, this.tdo = new TdoHelper(@”.\SQL2005”,”Northwind”);
tdo.tOrders.Orderid, JoinOperator.Equal, SqlDependency.Start(tdo.Connection.ConnectionString);
tdo.tOrderDetails.Orderid), _ SqlCommand empCmd = tdo.CreateCommand(
Clause.Where(tdo.tOrders.Customerid = “ALFKI”), _ String.Format(“select * from {0}.{1}”,tdo.tEmploy-
tdo.tOrders.Orderid, tdo.tOrders.Customerid, ees.SchemaName ,tdo.tEmployees.EntityName),
tdo.tOrders.Orderdate, _ CommandType.Text);
tdo.tOrderDetails.Productid, tdo.tOrderDetails. SqlDependency dep = new SqlDependency(empCmd);
Quantity, tdo.tOrderDetails.Unitprice) dep.OnChange += new OnChangeEventHandler(dep_OnChange);
tdo.OpenConnection();
‘[SQL Profiler Trace]: SqlDataReader dr = empCmd.ExecuteReader();
‘--------------------- //do something with dr
‘exec sp_executesql N’select Orders.OrderID as [OrderID] dr.Close();
,Orders.CustomerID as [CustomerID] , }
• TdoTables
• TdoViews
• TdoStoredProcedures
• TdoTableFunctions
Figura 12 Ogni classe che espone una tabella ha tutti i campi della tabella stessa esposti come proprietà
degli anni… ho visto molti sviluppatori im- con clausola where? Saremmo costretti, an-
pazzire con database di configurazione (con cora una volta, a scrivere la clausola where di-
dentro i nomi delle tabelle e dei campi), file rettamente nel testo della query. L’altro pun-
xml chilometrici o peggio ancora sviluppa- to di maggior rilievo è dato dal fatto che Tdo
tori tesserati ai fun-club “tutto con Stored è molto più “spinto” per operazioni in moda-
Procedure” ☺ mascherandosi dietro al fin- lità connessa, delegando ad ADO.NET 2.0 la
to motivo delle prestazioni. parte disconnessa.
Anche qui non so quanti di voi ad esem-
pio utilizzano DataSet e DataAdapter per
operazioni di aggiornamento in applicazioni
Il pacchetto installa ASP.NET; personalmente lo evito, non tanto
sia la libreria per questioni di performance, ma perchè si fi-
nisce sempre ad usarlo allo vecchia maniera
di base Tdo.dll che stile ADO VB6: l’utente modifica un record in
il generatore di codice una schermata… e subito corriamo ad aggior-
TdoCodeGenerator.exe nare il database con DataSet e DataAdapter.
Questa è paranoia!!! Discorso diverso invece
se l’applicazione è progettata per funzionare
in modalità disconnessa… ma non se ne ve-
Proprio su questo argomento qualcuno dono molte in giro.
di voi potrebbe obiettare dicendo: “ma ci Un altro punto a favore di Tdo è la possibili-
sono i DataSet tipizzati”; giusto, ma van- tà di scrivere espressioni T-SQL direttamente
no bene solo per operazioni disconnesse. in C# o VB.NET, quindi un solo linguaggio e
In ADO.NET 2.0 c’è stato un tentativo da soprattutto controllo sui tipi in fase di compi-
parte di Microsoft (con i TableAdapters) di lazione. Ultimo punto ma non il meno impor-
compensare questa mancanza, ma in realtà tante è che Tdo è open source: sia i sorgenti
il gap è ancora grande. della libreria base (Tdo.dll) sia del generato-
re di codice (TdoCodeGenerator) sono dispo-
nibili per il download su tdo.sourceforge.net
e questo vuol dire customizzazione del codi-
Le classi Tdo ed il codice ce e maggior controllo. Chiunque fosse inte-
generato da TdoCodeGene- ressato a partecipare al continuo sviluppo di
Tdo o semplicemente per maggior chiarimen-
rator sono serializzabili sia in
ti può mettersi in contatto con me.
formato binario che XML
Bibliografia
[1] Andrea Ferendeles - “Performance con
I TableAdapters, che poi non sono nient’al- GAC e NGEN in ASP.NET”, VBJ n.64/
tro che SqlDataAdapter uno per ogni tabella, Infomedia, 2005.
ed i comandi Insert/Update/Delete e Select [2] Andrea Ferendeles - “Tdo Typed Data Ob-
che il dataset tipizzato genera, sono ancora ject 1.0”, VBJ n.62/Infomedia, 2005.
troppo generici e poco adattabili alle diver-
se tipologie di query di cui si ha bisogno a Riferimenti
run-time. Ad esempio il metodo Insert pre- [3] Tdo home site: http://tdo.sourceforge.net
vede che gli vengano passati TUTTI i valori (documentazione e quickstart).
dei campi; e se volessimo inserirne solo al- [4] Tdo sourgeforge site: http://sourceforge.net/
cuni e settare gli altri a Null?! projects/tdo (download, news, forum, mail-
Oppure se volessimo eseguire una select ing list).
Multithreading
semplice e robusto in
applicazioni Windows
Forms 1.1 e 2.0
Chi sviluppa in .NET 2.0 può scrivere applicazioni Win- Multithreading
dows Forms multithreaded in modo semplice grazie al
nuovo componente BackgroundWorker. In questo articolo
vedremo come implementare un identico controllo in .NET
1.1 e come estenderlo per renderlo persino più potente del
componente fornito con Visual Studio 2005.
di Francesco Balena
S
crivere applicazioni Windows Form mul- A questi problemi si aggiunge
ti-threaded non è mai stato un compi- però un’altra limitazione, che
to semplice. Ad esempio, occorre pren- è peculiare delle sole applica-
dere in considerazione tutti i possibili fattori zioni Windows Form: l’impos-
che possono portare a deadlock oppure a erro- sibilità di invocare un metodo
ri derivanti da race condition oppure ancora a o accedere alle proprietà di un
dati inconsistenti causati dall’accesso non sin- controllo di un form (o un altro
cronizzato a variabili o altre risorse condivise elemento dell'interfaccia uten-
tra i vari thread dell'applicazione. I problemi di te) dal codice in esecuzione da
questo tipo sono in realtà comuni a tutte le ap- un thread secondario.
plicazioni che eseguono codice su più thread e Ad esempio, se il thread se-
si possono risolvere solo mediante una attenta condario sta eseguendo una
analisi del codice e un uso accorto delle primi- azione in background, non è
tive di sincronizzazione offerte dal linguaggio permesso aggiornare un con-
(lock in C#, SyncLock in VB.NET) e dal .NET trollo ProgressBar per infor-
Framework (gli oggetti Monitor, Mutex, Reade- mare l’utente sullo stato di
rWriterLock, Interlocked, ManualResetEvents e avanzamento dell'azione.
AutoResetEvents), o ancora le API messe a di- Per essere più precisi, ac-
sposizione da Windows (ad esempio i semafo- cedere a un controllo da un
ri, che però sono disponibili come oggetti ma- thread secondario è un'azione
naged nella versione 2.0 di .NET). fortemente sconsigliata perchè
può portare a malfunzionamenti o errori fa- controllo che è stato creato nel thread di in-
tali dell'applicazione: in alcuni casi un bug terfaccia utente solo per mezzo di un com-
di questo tipo può rimanere “in sonno” per plicato sistema di delegate.
giorni o settimane, ma nella maggioranza In pratica, il codice che gira nel thread se-
dei casi prima o poi un'applicazione che con- condario deve creare un delegate che pun-
tiene questo errore di programmazione an- ta alla procedura che vuole eseguire nel
drà rovinosamente in crash, per giunta la- thread UI e deve passare questo delegate
sciandovi ignari di cosa sia realmente avve- al metodo Invoke del form (vedremo i det-
nuto. Questo è un errore talmente comune tagli tra breve).
che in .NET 2.0 il comportamento delle ap- Poichè il meccanismo non è proprio sem-
plicazioni Windows Forms è stato modifica- plice, molti programmatori lo implementano
to e ogni tentativo di accedere a un controllo male o non lo implementano affatto.
creato in un altro thread genera un'eccezio- Per semplificare la vita agli sviluppatori,
ne se il programma esegue in modalità De- .NET 2.0 contiene un nuovo controllo chia-
bug: in modo che il programmatore si possa mato BackgroundWorker. L’uso di questo
rendere conto del problema sin dalla fase controllo è davvero banale. Supponiamo ad
di test (l’errore non avviene in modalità Re- esempio che il thread secondario debba ese-
lease perchè avrebbe reso inutilizzabili le guire un countdown, contando da N a 0 e
poche applicazioni esistenti in cui l’errore mostrando su un controllo Label il numero
esiste ma non ha effetti rovinosi). dei secondi che mancano alla fine del pro-
cesso. Ecco nel Listato 1 come si può fare
Il controllo BackgroundWorker tutto ciò in VB 2005.
di .NET 2.0 Per maggiori informazioni sul control-
In .NET 1.1 un thread secondario – detto lo BackgroundWorker si consulti la docu-
anche thread non-UI – può accedere a un mentazione della versione 2.0 del .NET Fra-
mework. Nonostante le sue indubbie qualità, thread di .NET o creato mediante un og-
il controllo BackgroundWorker non è esente getto System.Threading.Thread.
da difetti e limiti. Ad esempio:
Per tutti questi motivi, ma anche per dare
• Non permette di impostare la priorità del la possibilità di utilizzare il controllo Back-
thread secondario. groundWorker nelle applicazioni .NET 1.1,
• Non permette di impostare il nome del ho deciso di creare una versione custom del
thread secondario, il che può rendere controllo (Figura 1). Questa versione è scrit-
difficoltoso il debug dell'applicazione (il ta in C# per Visual Studio 2003 ed è qua-
nome del thread serve proprio per iden- si perfettamente compatibile con la versio-
tificare in modo univoco quale thread sta ne per 2.0. Questo significa che se utilizzate
eseguendo il codice su cui abbiamo posto questo controllo nelle applicazioni .NET 1.1
un breakpoint). potrete poi migrare il codice senza proble-
• Non offre alcun altro tipo di controllo sul mi su .NET 2.0 (utilizzando il “vero” control-
thread, ad esempio la possibilità di sospen- lo BackgroundWorker). A meno che, ovvia-
derlo o terminarlo prima del termine na- mente, non abbiate deciso di usare una delle
turale dell'esecuzione. feature extra sopra descritte, che il mio con-
• Non permette di decidere se il thread se- trollo BackgroundWorker aggiunge al con-
condario debba essere preso dal pool dei trollo di .NET 2.0.
Delegate visita tutti gli oggetti che hanno questa proprietà è True. Ad esempio, il codice
registrato l’evento da scatenare (per mezzo che esegue il countdown dovrebbe essere mo-
del metodo GetInvocationList) e utilizza il dificato in questo modo:
primo che supporta l’interfaccia ISynchro-
nizeInvoke. Private Sub BackgroundWorker1_DoWork(ByVal sender As O
c) Se nessun oggetto supporta questa inter- bject, ByVal e As DoWorkEventArgs) _
faccia, l’evento viene sollevato nel thread Handles BackgroundWorker1.DoWork
secondario (ovviamente, in questo caso non Dim start As Integer = CInt(e.Argument)
si dovrebbe accedere ai controlli di inter- For i As Integer = start To 0 Step -1
faccia utente). BackgroundWorker1.ReportProgress(i)
System.Threading.Thread.Sleep(1000)
L’ultimo punto di interesse è nel fatto che il If BackgroundWorker1.CancellationPending Then Exit Sub
controllo BackgroundWorker supporta l’inter- Next
faccia IExtenderProvider e quindi implementa End Sub
il suo metodo CanExtend. Come è noto, que-
sta interfaccia è normalmente usata per im- Per quanto questo meccanismo possa sembra-
plementare i provider control, come HelpPro- re poco raffinato a prima vista, si consideri che
vider e ToolTip, ma in questo caso il controllo questa tecnica è semplice da implementare e
non espone alcuna proprietà extender, quindi mette comunque al riparo dall'eventualità che
l’implementazione di questa interfaccia sem- una cancellazione “brusca” del thread provochi
brerebbe inutile a prima vista. una perdita dei dati. Se però il thread secon-
dario richiama altri componenti o esegue una
query molto lunga, questa tecnica potrebbe non
essere sufficiente, perchè in tali casi il thread
Per semplificare la vita agli
deve davvero essere interrotto a tutti i costi. In
sviluppatori, .NET 2.0 contie- questo caso può essere conveniente impostare
ne un nuovo controllo chia- la proprietà WorkerUsesThreadPool a False e
usare il metodo Abort dell’oggetto Thread espo-
mato BackgroundWorker sto dal controllo:
BackgroundWorker1.Thread.Abort()
L’unico motivo per implementare questa in-
terfaccia è la possibilità di impostare automati- Quando l’esecuzione del thread secondario è
camente la proprietà SynchronizingObject pari interrotta in uno dei due modi descritti, la pro-
al valore del form al momento della creazione prietà Canceled dell’oggetto RunWorkerComple-
del controllo. Questo è infatti il comportamen- tedEventArgs ricevuto dall’evento RunWorker-
to di default del controllo BackgroundWorker Completed è impostata al valore True, e il codi-
in .NET 2.0, come pure di altri componenti che ce può determinare il motivo della cancellazio-
devono sollevare eventi in thread secondari, ad ne testando la proprietà Error.
esempio FileSystemWatcher.
Conclusioni
Il metodo CancelAsync Il controllo BackgroundWorker descritto nel-
Il metodo CancelAsync richiede una spiega- l’articolo può essere usato nelle applicazioni
zione ulteriore. In realtà, questo metodo non fa .NET 1.1 per prepararsi alla migrazione ver-
null’altro che impostare a True il valore della so .NET 2.0, ma può anche essere usato in
proprietà CancellationPending. È compito del VisualStudio 2005 per sfruttare alcune fea-
codice nell’evento DoWork di terminare “dol- ture che Microsoft ha “dimenticato” di inse-
cemente” la sua esecuzione quando scopre che rire nel controllo.
e illeggibili:
Crittografia Crittografia
Introduzione
I
n questa serie di due articoli, si vedrà come
si possono aggiungere facilmente funziona- Ho un segreto, e non voglio
lità di crittografia e di compressione dati che lo conosciate. In effetti, ho
(ZIP) alle applicazioni VB6 esistenti utilizzando una applicazione, e voglio es-
il .NET Framework. Benché la crittografia e la sere in grado di memorizzare
compressione possano non sembrare tecnologie le informazioni in un formato
correlate, se si pensa ad esse, ciascuna prende crittografato in modo che non
un insieme di dati ed esegue una trasformazio- possano essere lette da utenti
ne su di esso. Nel caso della crittografia, i dati non autorizzati. Visual Basic 6
vengono resi illeggibili, mentre con la compres- non ha alcuna funzionalità na-
sione i dati vengono resi più piccoli. Si vedrà an- tiva per eseguire la crittografia
che che entrambe utilizzano molte delle mede- o la decrittazione dei dati, ma
sime tecnologie sottostanti. il Microsoft .NET Framework
dispone in modo nativo di crit-
tografia forte. In questo arti-
© 2006 Microsoft Corporation. All right reserved
colo descrivo un componente
VB.NET che fornisce le funzio-
Scott Swigart è consulente, autore e speaker su tecnologie nalità di crittografia e di decrit-
emergenti e convergenti. Nella sua professione ha lavorato con tazione, e si può utilizzarlo mol-
una vasta gamma di tecnologie, iniziando con la programmazio- to facilmente da VB6, ASP o da
ne del Commodore 64 all’età di 12 anni, scrivendo diagnostica
dell’hardware per sistemi UNIX in C++, e realizzando applica-
qualsiasi altro ambiente COM.
zioni Windows desktop e Web. Negli anni, Scott ha lavorato Prima di tutto, è bene esamina-
allo sviluppo di componenti, con tecnologie XML, .NET, Web re come Visual Basic 6 permet-
service e altri linguaggi, piattaforme e paradigmi. Grazie a que-
te di operare con i file. VB6 for-
sta esperienza, Scott ha visto come la tecnologia evolve nel
tempo, e si è concentrato nell’aiutare le organizzazioni a trarre nisce diverse keyword del lin-
il massimo vantaggio dalla tecnologia odierna, pur preparandosi guaggio per l’I/O su file:
alla tecnologia di domani. Scott è anche un Microsoft MVP,
ed è coautore di numerosi libri e articoli. Scott può essere
‘ Lettura da file con Visual Basic 6
contattato all’indirizzo scott@swigartconsulting.com.
Dim dataIn As String
Con VB6, si eseguono tutte le proprie opera- ‘ I/O di file con Visual Basic .NET
zioni su un handle di file (#1 in questo caso), Dim sw As New StreamWriter(“C:\log.txt”)
e sta a voi gestire questo handle di file. Non vi sw.WriteLine(“This is a test”)
è un unico oggetto che incapsula le operazioni sw.Close()
su file, esistono invece diverse keyword (Open,
Close, Input, ecc). Se si vuole eseguire la crit- Si può vedere che Visual Basic .NET fornisce
tografia e la decrittazione con Visual Basic 6, specificamente delle classi per la lettura e la scrit-
si dovrebbero leggere tutti i dati in memoria, tura da file (e da altri dispositivi di I/O). In que-
crittografarli utilizzando un componente di ter- sto caso, il codice utilizza la classe StreamWri-
ze parti (generando ciò che è noto come “testo ter per scrivere righe di testo in un file. L’og-
cifrato”), e poi memorizzare il testo cifrato su getto StreamWriter è molto comodo, poiché non
un file di output. Sarebbe auspicabile poter far si deve tener traccia di un handle di file, e tut-
fluire le informazioni attraverso il proprio pro- te le operazioni per operare con un file vengo-
gramma, ma ciò non sarebbe facile da fare. Per no evidenziate da Intellisense. Oltre alla classe
facilitare realmente una facile crittografia da StreamWriter, ci sono anche le seguenti classi:
VB6, ho creato un componente di crittografia/
decrittazione. In seguito si vedrà come questo FileStream Lettura e scrittura da un fi-
componente è stato implementato, ma è bene le binario.
menzionare che non è necessario comprende- NetworkStream Lettura e scrittura da una
re i dettagli di implementazione per utilizza- rete.
re effettivamente il componente. Se si vuole MemoryStream Lettura e scrittura dalla me-
semplicemente utilizzare il componente sen- moria come se fosse un file.
za addentrarsi in come funziona, basta legge-
re il paragrafo “Crittografia VB6”. In realtà, la classe StreamWriter del codice
di esempio utilizza in-
ternamente un oggetto
FileStream per scrivere
informazioni su disco.
FileStream permette di
creare, aprire e accoda-
re dati in file su disco,
e di aprirli in lettura e
scrittura. Tuttavia, File-
Stream vuole leggere e
scrivere blocchi di dati
(array di byte) da e ver-
so file. Quando si opera
con il testo, tipicamen-
Figura 1 Tentativo di visualizzare i dati crittografati con Notepad
te si vuole lavorare con
righe, non con blocchi
di 1024 byte, pertanto
decodificati:
Executable UML
Executable UML (xUML) è un formalismo che consente di
applicare concretamente le linee guida fornite dalla Model
Driven Architecture (MDA)
di Lorenzo Vandoni
N
el precedente numero di questa rubrica che abbia sostituito la babele
abbiamo parlato della Model Driven Ar- di linguaggi e modelli propo-
chitecture (MDA) proposta dall’Object sti ed utilizzati nelle scorse de-
Management Group (OMG), che si pone l’obiet- cadi. Executable UML (xUML)
tivo di separare completamente la logica appli- estende UML con l’introduzio-
cativa dalla piattaforma sulla quale l’applicazio- ne di aspetti dinamici che con-
ne dovrà essere implementata. sentono ai diagrammi di essere
In particolare, abbiamo visto come questa archi- eseguibili, verificabili, e quindi
tettura preveda la realizzazione di un modello di traducibili in codice applicativo
alto livello denominato Platform Independent Mo- da speciali compilatori. Di fat-
del (PIM), che descriva il comportamento dell’ap- to, in questo caso alcuni auto-
plicazione. Questo modello verrà successivamen- ri parlano di “Executable and
te convertito, più o meno automaticamente, in un Translatable” UML, indicato
modello specifico per una o più piattaforme, come con l’acronimo xtUML.
CORBA, COM, Java o .NET (Platform Specific Mo- xUML è quindi un sottoinsie-
del, o PSM), e quindi in un programma funzionante me di UML (nel senso che ne
(Platform Specific Implementation, o PSI). utilizza solo alcuni costrutti,
Executable UML, come vedremo, non è altro che come Package, diagrammi di
uno strumento per mettere in pratica le linee gui- classe e diagrammi di stato), e
da di MDA. una sua estensione, nel senso
che adotta strumenti aggiuntivi
Da UML a xUML per specificare dettagli e aspet-
UML è un formalismo di alto livello, che or- ti dinamici dei sistemi model-
mai si è fortunatamente imposto come la nota- lati. Inoltre xUML è una meto-
zione di riferimento per la stesura di diagrammi dologia di lavoro automatizza-
di analisi e di progettazione. Al di là del fatto di ta, basata sulla notazione UML,
apprezzare o meno questo tipo di notazione, in- che formalizza alcuni concetti
fatti, non si può non considerare positivo il fat- chiave di MDA. xUML non è
to che questa sia universalmente riconosciuta, e ancora uno standard, ma pro-
babilmente lo diventerà pre-
sto, perché OMG ha già avvia-
Lorenzo Vandoni è laureato in Informatica, ed è uno spe- to il processo di standardizza-
cialista di progettazione e sviluppo con tecniche e linguaggi
object-oriented. Ha collaborato alla realizzazione di framework,
zione con una richiesta di pro-
strumenti di sviluppo e software commerciali in C++, Java e poste in questo senso. In ogni
Visual Basic. Può essere contattato tramite e-mail all’indirizzo caso xUML è basato su questi
vandoni@infomedia.it. concetti:
gono espressi tramite clausole del linguaggio evitare la generazione di codice ripetitivo,
Object Constraint Language (OCL). ed incapsula un insieme di classi e funzio-
Questo particolare permette anche di defi- ni di utilità
nire chiaramente delle linee guida per capi-
re quando un modello è veramente comple- Quando il progettista richiede la generazio-
to. Normalmente, infatti, il livello di detta- ne del codice, il sistema di traduzione estrae
glio e il numero di informazioni inserite nel le informazioni necessarie dal modello xUML,
modello sono lasciati alla sensibilità del pro- e utilizza le regole per selezionare i pattern
gettista. Con xUML, invece, un modello sarà da applicare.
completo solo quando potrà essere mandato
in esecuzione.
sviluppo. Esempi di strumenti del genere sono • possibilità di riutilizzo dei modelli appli-
BridgePoint di Project Technology, che può es- cativi, o parte di essi, indipendentemente
sere trovato su www.projtech.com, e la MDA dalla piattaforma di riferimento: un buon
Product Suite di Kennedy Carter, che può es- modello di gestione del magazzino scritto
sere trovata su www.kc.com/products.php. per un’applicazione Java client-server può
tranquillamente essere riutilizzato per rea-
Benefici di xUML lizzare un sistema per Pocket PC
I benefici legati all’utilizzo di xUML sono
più o meno gli stessi già enunciati nel prece- • facilità di manutenzione, legata al fatto
dente articolo, relativamente ad MDA. Oltre a che modifiche al modello, o al processo
quelli più ovvi, legati al fatto di poter descri- di traduzione, possono essere facilmen-
vere l’applicazione ad alto livello, poter scri- te trasferite all’applicazione finale. Ad
vere meno codice, e poter agevolmente con- esempio, l’ottimizzazione di un partico-
vertire un’applicazione da una piattaforma (es. lare algoritmo, codificato nel processo
Java su Linux) ad un’altra (es. Microsoft.NET), di traduzione ed utilizzato in molti pun-
vale la pena di citare i seguenti: ti dell’applicazione, potrà essere facil-
mente riportata sull’intera applicazione
• anzitutto, il codice generato può essere ot- semplicemente generando nuovamente
timizzato per la piattaforma di riferimen- il codice sorgente
to. Tale ottimizzazione può essere codifi-
cata una volta per tutte nel processo di • il codice ottenuto è tipicamente ben do-
traduzione, senza richiedere particolari cumentato. Lo sforzo di documentare il
competenze da parte degli sviluppatori codice può essere fatto una volta sola ap-
plicandolo ai pattern utilizzati per la ge-
• la possibilità di mandare in esecuzione nerazione
i modelli UML permette ai clienti e agli
utilizzatori finali di verificare la correttez- Alcune perplessità
za del modello applicativo fin dalle prime La visione di xUML come meccanismo che
fasi dello sviluppo permetterà di abbandonare, in un futuro più
o meno lontano, linguaggi come Java e C++, risultare positivo per applicazioni commerciali
esattamente come da tempo è ormai stato ab- da introdurre sul mercato, ma di solito è ne-
bandonato l’assembler, è certamente affasci- gativo nel caso di applicazioni sviluppate su
nante, ma personalmente non nascondo al- commissione, in quanto quasi sempre ogni
cune perplessità. cliente avrà esigenze particolari.
L’idea di tradurre descrizioni di alto livel- L’esperienza inoltre ha mostrato che rara-
lo in codice non è certamente nuova. Tra la mente si riuscirà a codificare all’interno dei
fine degli anni ‘80 e la prima metà degli anni pattern tutte le particolari esigenze di un pro-
’90 erano abbastanza diffusi i cosidetti stru- gramma, e che per gestire le innumerevoli ec-
menti CASE “di basso livello”, ovvero orien- cezioni sarà necessario intervenire manual-
tati alla progettazione e alla generazione di mente, modificando il codice generato. Oc-
codice. Con questi strumenti, di solito rivol- correrà quindi acquisire le necessarie com-
ti ad applicazioni per la gestione di databa- petenze relative alla struttura di questo codi-
se, lo sviluppatore doveva disegnare un dia- ce e della libreria di runtime, nonché adotta-
gramma dello schema della base dati, e poi re qualche meccanismo che permetta di pre-
aveva a disposizione degli editor grafici per servare gli interventi manuali a fronte di una
disegnare le maschere e i report del program- nuova generazione del codice.
ma. Contrariamente a quanto accade con am- Non è detto, infine, che UML possa essere
adatto per specificare tutti gli aspetti di un’ap-
plicazione. I dettagli dell’interfaccia grafica,
ad esempio, o la progettazione fisica di una
Il sistema di traduzione base dati relazionale, sono difficilmente cat-
applica regole e pattern turabili con questo tipo di notazione.
al modello per generare il
Conclusioni
codice corrispondente Il tentativo di realizzare modelli applicativi
di alto livello che siano eseguibili e consen-
tano quindi di verificare la correttezza delle
bienti di sviluppo visuali come Delphi o Vi- specifiche non è nuova, ed era anzi tra i prin-
sual Studio, queste maschere e report veniva- cipali temi di ricerca nella comunità scien-
no automaticamente dotate di molte funzio- tifica agli inizi degli anni ’90. Nel frattem-
nalità di alto livello. L’architettura complessi- po, però, UML si è affermato come notazio-
va del sistema era sorprendentemente molto ne standard per l’analisi e la progettazione
simile a quella ora proposta da xUML: un in- di applicazioni object-oriented, e quindi que-
sieme di regole di traduzione, un motore in ste idee hanno trovato nuovi stimoli.
grado di interpretarle, e una libreria di run- Come già evidenziato nello scorso numero,
time di supporto. non si può non notare come MDA e xUML
Questi sistemi soffrivano di varie limitazio- vadano quasi in direzione opposta rispetto
ni: alcune di queste erano legate al periodo alle metodologie agili, che stanno ultima-
storico in cui erano nati, prima tra tutte la mente avendo un grande successo. Da una
mancanza di standard come UML, ma altre parte abbiamo un’attenzione quasi ossessiva
potrebbero rimanere valide anche per gli at- per le fasi di analisi, dall’altra un atteggia-
tuali tool basati su xUML. Non bisogna sot- mento più pragmatico, e una maggiore en-
tovalutare le lezioni del passato. fasi per il ruolo dei programmatori. Sicura-
Tra queste limitazioni, una è data dalla ri- mente MDA e xUML trovano una giustifica-
gidità del processo di traduzione, che porta zione nell’ambito di progetti molto grossi,
ad ottenere applicazioni con un look-and-feel dove le metodologie agili possono mostra-
piuttosto uniforme. Questo aspetto potrebbe re alcuni limiti.
DotNetNuke:
creazione di
un modulo DNN
di Pietro Vite
D
otNetNuke [5] è un portale scritto in sato a portali Web in tecnologia
VB.NET da Shaun Walker ed altri, Microsoft .NET perchè anche i
usando come base l’applicazione IBuy- capitoli più tecnici, per esempio
Spy WorkShop, sviluppata da Microsoft come quello sulle modalità di installa-
uno dei Source Project che accompagnano il ri- zione e sulle pratiche di ammini-
lascio di .NET Framework 1.0 Beta. strazione, sono molto chiari, ma
Nel primo capitolo del libro della Wrox dal titolo soprattutto perché è stato scritto
“Professional DotNetNuke ASP.NET Portals” [1], dal creatore di DotNetNuke. Nel
Shaun Walker racconta la genesi di DotNekNuke, sito www.dotnetnuke.org è an-
fino alla attuale versione 3.0. La necessità di svi- che citato un altro libro interes-
luppare e gestire portali per piccole e medie azien- sante, edito da PACKT, dal tito-
de e a basso costo spinge Shaun a rimaneggiare il lo “Building Websites with VB:
codice VB.NET di IBuySpy WorkShop, applicativo NET and DotNetNuke 3.0” [2].
sviluppato da Microsoft per illustrare, con un’appli-
cazione web completa, le potenzialità di ASP.NET. La storia del portale Dot-
Nel libro, con molta sincerità, l’autore racconta gli NetNuke di AWD Sim
errori commessi, le difficoltà superate e il gruppo Nel 2004 AWD Sim [3] inizia a
di persone che si raccolsero intorno al progetto, in- valutare la possibilità di dotarsi di
sieme al concreto supporto di Microsoft stessa, in- un portale aziendale, molto utile
teressata allo sviluppo di questa iniziativa, normal- per la gestione delle informazioni
mente appannaggio di comunità Perl, Pyton, Php da erogare alla Rete di Vendita,
o, al più, Java. Shaun Walker ha scritto un libro ma gli impegni di business piani-
che mi sento di consigliare a chi può essere interes- ficati impediscono di trasforma-
rere i requisiti di business in un
progetto software. Nel 2005, dopo
Pietro Vite è IT Manager di AWD Sim Italia. Ha lavorato per
diverse SIM e istituti di credito nell’area Finance e IT. Può essere una profonda riorganizzazione, il
contattato tramite e-mail all’indirizzo pvite@infomedia.it. management decide di soddisfa-
• Account Login permette l’accesso profilato lità delle soluzioni disponibili per soddisfare
• Announcement rende disponibile la pre- esigenze molto diverse.
sentazione di annunci su una pagina
• Banners permette di mostrare banner agli Struttura di un modulo DotNetNuke
utenti che si sono loggati al sito. È possi- e tutorial
bile selezionare il numero e il tipo di ban- Il modulo è un componente software (assem-
ners da presentare bly dll). L’interfaccia WYSYWYG del modulo
• Contacts mette a disposizione le informa- offre una discreta autonomia ai redattori di te-
zioni anagrafiche per un gruppo di lavoro sti e di contenuti. Nei libri precedentemente
• Discussions rende disponibile la tipica la- citati lo sviluppo di un nuovo modulo è sem-
vagna di discussione (threaded discussion pre correlato alla possibilità di usare Visual
board) Studio 2003. Per sottolineare la relativa sem-
• Documents mette a disposizione una lista plicità di sviluppo di nuovi moduli mi limi-
di documenti, compresi i classici link e to ad usare NotePad e Visual Basic.NET, lin-
download guaggio con il quale è stato sviluppato tutto
• Events rende disponibili item che possono il codice del portale. È necessario possedere
scadere automaticamente una installazione funzionante di DotNetNuke.
• FAQ permette di gestire una lista di Fre- Il tutorial che segue descrive la costruzione
quented Asked Question e le risposte cor- dello sviluppo di un modulo che estrae da una
rispondenti tabella SQL Server l’ultimo messaggio da mo-
• FeedBack permette ai visitatori di inviare strare nel componente. Iniziamo a costruire
messaggi all’amministratore del portale la tabella all’interno, per esempio, del classi-
• IFrame, particolare per Microsoft Internet co database NorthWind. Di seguito è riporta-
Explorer, rende disponibili contenuti ap- to il codice T-SQL per la creazione della ta-
partenenti ad un altro sito web all’interno bella e della vista.
di un frame
• Image permette di mostrare immagini at- T-SQL
traverso il classico HTML IMG Tag // esempio di codice
• Links presenta una lista di link ad altri siti CREATE TABLE [dbo].[Messages] (
web [no_message] [int] NULL ,
• News Feeds (RSS) permette la distribuzione [message] [nvarchar] (100) COLLATE SQL_Latin1_General_
di syndicated news feed nel formato Rich CP1_CI_AS NULL
Site Summary ) ON [PRIMARY]
• Search Input abilita le ricerche nel sito web
e il corrispondente modulo Search Results CREATE VIEW dbo.vw_last_Message
permette di mostrare i risultati della ricerca AS
• Text/HTML permette di esporre porzioni SELECT message
di testo o HTML FROM dbo.Messages
• User Accounts abilita utenti profilati WHERE (no_message = (SELECT MAX(no_message) AS max_no_
• User Defined Table rende disponibili sul message FROM dbo.Messages))
sito dati tabellari
• XML/XLS permette di mostrare informa- Non mi soffermo, qui e in altre parti del-
zioni a partire da contenuti XML median- l’articolo, a valutare la necessità di imposta-
te trasformazioni XLS re indici e vincoli sulle tabelle, come a gesti-
re tutte le possibili eccezioni nel codice, per
Esistono moltissimi altri moduli addizionali. non appesantire la lettura. L’esecuzione de-
La carrellata permette di valutare la comples- gli script T-SQL con Query Analyzer produ-
sità della costruzione del portale e la flessibi- ce la tabella e la vista collega ad essa. Sem-
pre con SQL Server Analyzer si possono in- Public ReadOnly Property ModuleActions() As ModuleAction
serire alcuni messaggi e analizzare l’output Collection Implements IActionable.ModuleActions
della vista. Per costruire l’interfaccia uten- Get
te è necessario preparare un file .ascx con- Dim actions As New ModuleActionCollection
tenente la label che mostrerà l’ultimo mes- actions.Add(GetNextActionID(), Localization.GetString
saggio della tabella. Il codice è riportato nel (ModuleActionType.AddContent, LocalResourceFile),
file ShowMessage.ascx visibile in Figura 1 e ModuleActionType.AddContent, “”, “”, EditUrl(), False,
nel file ShowMessage.ascx.resx ed entrambi DotNetNuke.Security.SecurityAccessLevel.Edit, True, False)
i file non presentano caratteristiche partico- Return actions
larmente interessanti. Passiamo al codice che End Get
estrae dalla tabella Messages il messaggio da End Property
mostrare nel modulo. Il file LastMessage.vb
è allegato all’articolo e di seguito illustriamo Il codice dell’estrazione del messaggio dalla
alcuni elementi interessanti. tabella è ‘standard’ MSDN per quanto riguar-
da l’utilizzo di ADO.NET.
Visual Basic .NET
// esempio di codice Installazione del modulo DotNetNuke
‘ Code adapted from DAL Builder Pro from www.dotnetnuke.dk e tutorial
Passiamo ora a documentare l’installazione.
Imports System È necessario creare il nuovo folder LastMes-
Imports System.Data sage sotto la directory DesktopModules del-
Imports System.Data.SqlClient l’installazione di DotNetNuke e aggiungere
Imports System.Drawing il file .ascx e .vb descritti sopra. All’interno
Imports System.Web.UI.WebControls di LastMessage si è creato il folder App_Lo-
Imports DotNetNuke calResources contenente il file .resx discusso
Imports DotNetNuke.Common prima. Possiamo ora loggarci a DotNetNuke
Imports DotNetNuke.Services.Search come Amministratori Host (user Host, per in-
Imports DotNetNuke.Entities.Modules tenderci) ed accedere alla maschera Module
Imports DotNetNuke.Entities.Modules.Actions Definitions del menu Host. Editiamo le de-
Imports DotNetNuke.Services.Localization finizioni del nuovo modulo avendo cura di
Imports DotNetNuke.Services.Exceptions compilare il text Folder Name con il nome
del folder costruito in precedenza. Digitiamo
Namespace LastMessage Update e l’applicazione ci presenta la masche-
ra delle Definitions della quale compiliamo il
Come si può vedere dal codice qui sopra è text New Definitions con il nome del modulo.
necessario importare molti package dell’appli- Digitiamo Add Definitions e l’applicativo ci
cativo DotNetNuke. Come si vede dalla porzio- presenta la maschera del Default Cache Time
ne di codice qui sotto è necessario definire la che impostiamo a zero (0) e digitiamo Upda-
classe ShowMessage che eredita dalla classe te Cache Properties. Finalmente giungiamo
di DotNetNuke PortalModuleBase ed imple- alla maschera del Control, che deve risultare
menta l’interfaccia IActionableImports vuota. Digitiamo Add Control e l’applicativo
presenta la maschera di Edit Control Module
Visual Basic .NET nella quale troviamo già impostati e text Mo-
// esempio di codice dule e Definition ed impostiamo: il text Title
Public Class ShowMessage con il nome del modulo; il list Source, sele-
Inherits PortalModuleBase zionando la posizione del nostro file .ascx; il
Implements IActionableImports System.Data list Type selezionando View. A questo punto
(….) il modulo è caricato nell’anagrafica dei mo-
Controllo Remoto
in Visual Basic .NET
Quarta puntata
di Stefano Corti
I
n questa quarta parte del nostro progetto ana- PRNTreport = “OK>>>”
lizzeremo un importante metodo della classe End If
RemoteProcesses, la cui trattazione è già stata Return PRNTreport
introdotta nella precedente puntata. Abbiamo vi- End Function
sto che questa classe fondamentale ci consente di
implementare metodi e proprietà per controllare e Definiamo un semplicissi-
monitorare processi in esecuzione sulla macchina mo metodo pubblico chiama-
remota. Riteniamo possa essere assai utile defini- to printPrintableFile() che
re anche un semplice metodo che permetta l’uti- restituisce un semplice valore
lizzo di un’eventuale stampante collegata alla po- di flag di tipo String se l’opera-
stazione di cui abbiamo il controllo mediante il no- zione di stampa è stata eseguita
stro programma. Come sempre il .NET Framework correttamente. Prima di tutto
ci viene incontro mediante proprietà appartenenti definiamo l’oggetto myp di tipo
alla propria Class Library. Diamo uno sguardo alla Process, dopo di ché non ci re-
seguente porzione di codice. sta che assegnare alla proprie-
tà FileName il valore di ppff
Public Function printPrintableFile(ByVal ppff As String) As String passato come argomento del-
Dim PRNTreport As String = Nothing la funzione medesima. Tale va-
Dim myp As New Process() lore dovrà contenere il percor-
Try so assoluto all’interno del file-
myp.StartInfo.FileName = ppff system della macchina remota
myp.StartInfo.CreateNoWindow = True che punta al file che si desidera
myp.StartInfo.Verb = “print” stampare. Impostiamo quindi a
myp.Start() True la proprietà CreateNoWin-
Catch pp As Exception dow, al fine di non determina-
PRNTreport = “Errore: “ & pp.Message re la comparsa di alcuna GUI
End Try sullo schermo del PC Target.
If PRNTreport = Nothing Then Molto importante è invece la
proprietà Verb che ci consente
di impostare il canale da utiliz-
Stefano Corti si occupa di programmazione PHP e JSP zare nell’apertura dell’applica-
lato server, della piattaforma .NET e di integrazione di
sistemi legacy con le nuove realtà del web, soprattutto in
zione o del documento specifi-
ambito gestionale, bancario e finanziario. È attualmente alle cato dalla proprietà FileName.
dipendenze di un primario gruppo bancario italiano. Può Se il percorso specificato ricon-
essere contattato via email: scorti@infomedia.it. duce ad un file di cui è possi-
bile la stampa, il proces- Listato 1 Struttura Select Case per la gestione del sistema di chat-line
so ha inizio e la stampan-
te predefinita verrà attiva-
ta, altrimenti sarà solleva- Case Is = “TEXT”
ta un’eccezione che il no- inMessages.Clear()
inMessages.Text &= job(1)
stro codice intercette-
If CheckBox1.Checked Then
rà mediante un generico Dim objPop As MessagePopUp = New MessagePopUp()
blocco Try Catch. objPop.Comingfrom = ControllerID.Text
objPop.Poptext = job(1)
Ora che abbiamo esami- objPop.PopUp()
nato gli aspetti più im- writer.Write(vbCrLf & “Messaggio inviato”)
End If
portanti della nostra clas-
se RemoteProcesses, pas- Case Is = “TEXTWITHREPLY”
siamo ad illustrare una inMessages.Clear()
inMessages.Text &= job(1)
semplice classe del no- Dim objPop As MessagePopUp = New MessagePopUp()
stro progetto che ci con- objPop.Comingfrom = ControllerID.Text
objPop.Poptext = job(1)
sente di instaurare com- objPop.PopReply()
plete sessioni di chat te- writer.Write(“REPTEXT>” & objPop.Replytext)
stuali tra Controller e Case Is = “TEXTERRORMESSAGE”
Target. Riteniamo infatti inMessages.Clear()
importante poter effettua- inMessages.Text &= job(1)
Dim objPop As MessagePopUp = New MessagePopUp()
re uno scambio di messag- objPop.Comingfrom = ControllerID.Text
gi tra gli utenti delle due objPop.Poptext = job(1)
objPop.PopError()
macchine, al fine di ren- writer.Write(vbCrLf & “Messaggio inviato”)
dere le operazioni di assi-
stenza maggiormente in-
terattive e senza spreco di ulteriori risorse End Sub
tecniche, come ad esempio l’utilizzo del tele-
fono cellulare laddove la connettività di uno Public Sub PopError()
dei due utenti sia del tipo dial-up. In detta- fPrompt &= oPromptTitle
glio, il Controller sarà in grado di inviare su MessageBox.Show(oMessage, fPrompt,
Target ogni genere di messaggio, che com- MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
parirà sotto forma di una finestra di pop-up, End Sub
anche qualora la GUI Target sia stata ridotta
ad icona nella Systray. Tali pop-up potranno Come possiamo notare si tratta di tre proce-
essere di tipo meramente informativo, di er- dure Sub (quindi non restituiscono alcun valo-
rore oppure con un campo di testo vuoto per re) che si occupano semplicemente di visualiz-
permettere l’inserimento di una risposta di ri- zare altrettante tipologie di Pop-Up contenen-
torno. Vediamo i tre metodi principali. ti i relativi messaggi testuali. Questi metodi
provvedono alla visualizzazione del messag-
Public Sub PopUp() gio leggendo la stringa testuale dalla variabile
fPrompt &= oPromptTitle privata oMessage, di tipo String. La scritta che
MessageBox.Show(oMessage, fPrompt, comparirà nella barra del titolo della finestra
MessageBoxButtons.OK, MessageBoxIcon.Information) viene invece ricavata dalla variabile oPrompt-
End Sub Title. La variabile oMessage viene imposta-
ta per mezzo della proprietà Poptext, mentre
Public Sub PopReply() la proprietà di sola lettura Replytext consen-
fPrompt &= oPromptTitle te al ciclo principale del server di leggere la
oReply = InputBox(oMessage, fPrompt) stringa testuale memorizzata nella variabile
il messaggio testuale inviato dall’applicativo mento che l’analoga operazione risulterà ov-
Controller, che viene immediatamente pas- viamente molto simile ed intuitiva su Con-
sato alla proprietà Poptext. Successivamen- troller. Passiamo subito all’esame del Listato
te viene invocato il metodo che determina la 2. Come possiamo facilmente notare, questo
comparsa della relativa finestra. Osserviamo nuovo server è in ascolto sulla porta 13010.
anche che, nel caso in cui il Controller tra- Abbiamo scelto infatti un numero di porta
smetta un messaggio con risposta di ritorno differente, in quanto vogliamo mantenere
obbligatoria, tale risposta possa essere indi- completamente separato il flusso di coman-
viduata leggendo la proprietà di sola lettura di del nostro protocollo applicativo, dai flus-
Replytext, come abbiamo visto precedente- si binari che rappresentano i byte trasmessi
mente. Il valore stringa ritornato da questa del nostro file. Per il resto la progettazione
proprietà viene quindi immesso nel socket del codice non differisce molto da ciò che ab-
di comunicazione preceduto dal comando ap- biamo già implementato nelle prime puntate.
plicativo <REPTEXT>. Come abbiamo det- Ricordiamo che anche l’esecuzione di questo
to, si tratta di una classe estremamente sem- server viene inserita in un apposito Thread
plice, la cui trattazione non merita ulteriori il cui ciclo di vita viene inizializzato nel co-
approfondimenti. struttore della form dopo la chiamata a Ini-
Incominciamo ora a
parlare di una funziona-
Listato 3 Procedura Sub di realizzazione del client per il trasferimento file
lità molto importante del
nostro progetto, ovvero
la possibilità di sposta-
Public Sub beginToUpLoad(ByVal fileUp As String)
re qualunque tipo di file Dim t_client As TcpClient
tra i due end-point. An- Dim ip As String = inIP.Text
Dim port As Int32 = 13010
che in questo caso do- t_client = New TcpClient()
vremo provvedere a vei- t_client.Connect(ip, port)
colare i flussi binari di t_output = t_client.GetStream()
t_writer = New BinaryWriter(t_output)
byte, utilizzando come t_reader = New BinaryReader(t_output)
sempre TCP/IP e preve- ProgressBar1.Visible = True
ProgressBar1.Minimum = 1
dendo un’architettura di ProgressBar1.Maximum = CInt(FileLen(fileUp) / 120)
tipo client-server. Imple- ProgressBar1.Value = 1
Dim buffer(1024) As Byte
menteremo quindi appo-
Dim count As Integer
site procedure Sub che Dim infile As FileStream = _
implementeranno tutto File.Open(fileUp, FileMode.Open, FileAccess.Read)
Try
il codice necessario per count = infile.Read(buffer, 0, 1024)
porre in ascolto su de- While count > 0
t_writer.Write(buffer, 0, count)
terminate porte due ele- count = infile.Read(buffer, 0, 1024)
mentari server, sia su ProgressBar1.PerformStep()
Controller, sia su Target, End While
Catch ef As Exception
dal momento che deside- inMessages.Text &= “Errore durante l’UpLoad del File: “ & _
riamo progettare un si- vbCrLf & ef.Message
Finally
stema che ci consenta di infile.Close()
trasferire file in entram- t_writer.Close()
t_reader.Close()
be le direzioni. In questa t_output.Close()
puntata ci concentrere- t_client.Close()
mo particolarmente sul- inMessages.Text &= vbCrLf & “FILE TRASFERITO A PC REMOTO.”
End Try
l’implementazione del End Sub
server su Target, dal mo-
fettivamente i dati su disco, utilizzando il pri- anche in questo caso un array di tipo Byte,
mo parametro come matrice in cui vengono impostando la dimensione massima a 1024
scritti i byte. Il valore 0 è in pratica la posi- e apriamo il file con il metodo Open() della
zione di offset dei byte da cui iniziare la scrit- classe File, che ancora una volta restituisce
tura e count rappresenta il numero massimo un valore di tipo FileStream. Quindi in un ci-
dei byte da scrivere, ovvero il valore Integer clo While del tutto analogo a quello previsto
letto precedentemente dallo stream binario per il server, scriviamo all’interno del socket
con il metodo Read(), già discusso. Nel Lista- di flusso precedentemente stabilito i blocchi
to 3 è invece visibile il codice di implemen- di byte che, ad opera dei servizi esposti dai
tazione del client relativo al processo appe- livelli più bassi del modello ISO/OSI, di cui
na descritto. A parte la gestione di una Pro- non ci occupiamo, dovranno raggiungere at-
gressBar che mostra lo stato di avanzamento traverso la rete, qualunque essa sia, la mac-
del trasferimento in corso, il codice non pre- china Target per essere nuovamente estratti
senta particolari aspetti degni di attenzione. e scritti su disco per ottenere una copia esat-
In pratica la funzione accetta un parametro ta del file di partenza. Nella prossima pun-
stringa che contiene il percorso assoluto al- tata concluderemo la trattazione delle funzio-
l’interno del file system del Controller dove ni e dei metodi per il trasferimento dei file e
si trova il file che desideriamo inviare alla vedremo come implementare un elementare
macchina Target. Successivamente creiamo sistema di autenticazione.
e quando deve essere tracciato, .NETMon per- popoli eventualmente qualche tabella di data-
mette di impostare una serie di valori che aiu- base per poter effettuare ricerche più avanzate,
tano a scegliere se mostrare o nascondere de- come conoscere da quali assembly viene richia-
terminati assembly, namespace o metodi; que- mato un metodo, quante volte un metodo viene
sta funzionalità è assolutamente indispensabile richiamato e così via.
perché, ovviamente, il programma tiene traccia Per chi è particolarmente curioso, potrebbe es-
di tutti i metodi che vengono eseguiti, compre- sere interessante dare un’occhiata a quanti e qua-
si i metodi del CLR. li metodi del CLR vengono richiamati durante
È importante ricordare che all’avvio di una l’esecuzione di una nostra applicazione mana-
nostra applicazione il CLR esegue una grande ged, permettendo di capire un po’ più a fondo
quantità di metodi d’inizializzazione, che pos- quel bellissimo ma assai ampio mondo che è il
sono anche non essere tracciati grazie appun- .NET Framework.
to alla proprietà “Initial Delay”. Tale proprietà A corredo dell’applicazione vengono forniti alcu-
permette di impostare il ritardo iniziale di tra- ni esempi per familiarizzare con le impostazioni
cing dei metodi, cioè è un contatore che indica dell’applicazione, nonché una buona documen-
a .NETMon quando iniziare ad effettuare il tra- tazione in formato pdf.
cing dell’applicazione. Per impostare un valore Nonostante un leggero sforzo iniziale e l’inter-
corretto di questa proprietà sono necessarie un faccia grafica non proprio accattivante, il tool
po’ di prove, ma il grande vantaggio è che, una della Foundstone ripaga ampiamente fornendo
volta trovato un valore ottimale, è possibile ini- uno strumento gratuito di fondamentale impor-
ziare a seguire la nostra applicazione senza at- tanza per qualsiasi tester che desideri controlla-
tendere troppo tempo mentre il CLR esegue tut- re un’applicazione in modo più approfondito uti-
te le sue inizializzazioni. lizzando il flow tracing o sviluppatore che voglia
Per applicazioni che utilizzano pesantemente conoscere più a fondo le parti intrinseche di qual-
il multithreading, è possibile ordinare i meto- siasi applicazione. È necessario ricordare che pur-
di per thread, in modo da creare un tracing se- troppo la versione attuale prevede la piena com-
parato per ogni thread. Com’è lecito aspettarsi, patibilità solo con il .NET Framework 1.1.
è possibile interrompere l’analisi del flusso in
qualsiasi momento premendo sull’apposito but-
ton “STOP”. Prodotto
.NETMon
Il vero valore di questi strumenti senza dubbio
non è soltanto la possibilità di eseguire il flow Url di riferimento
http://www.foundstone.com/index.htm?subnav=resources/navigat
tracing, quanto fornire al tester i dati ottenuti ion.htm&subcontent=/resources/proddesc/dotnetmon.htm
in modo da poterli manipolare in qualche modo,
Stato Release
mettendo a disposizione dei valori su cui è pos- Stabile
sibile eseguire ulteriori studi, quali per esem-
Semplicità d’uso
pio capire da chi è stato chiamato un determi- Per poter ottimizzare le impostazioni dell’applicazione è necessa-
nato metodo. rio conoscerla un po’ a fondo
I dati ci vengono quindi forniti o in una Text- Utilità
box nell’ordine in cui i metodi vengono esegui- Strumento molto importante per chi desidera utilizzare il flow
ti o in un TreeView che organizza le funzioni in tracing di applicazioni
base alle chiamate annidate che vengono effet- Qualità prodotto
tuate, escludendo eventualmente il tipo di ritor- Affidabile, nei test sul prodotto eseguiti non ha mai mostrato par-
no d’ogni metodo e il nome del namespace: que- ticolari problemi