v2007 05 vbj77

60

Transcript of v2007 05 vbj77

Page 1: v2007 05 vbj77
Page 2: v2007 05 vbj77
Page 3: v2007 05 vbj77
Page 4: v2007 05 vbj77

410X275 Visual Basic.indd 1 6-08-2007 9:25:37

Page 5: v2007 05 vbj77

410X275 Visual Basic.indd 1 6-08-2007 9:25:37

Page 6: v2007 05 vbj77

IN VETRINA VBJ 77IN VETRINA VBJ 77

VBJ 77

Scrivi a [email protected] specificando nell’oggetto della e-mail: IN VETRINA VBJ n. 77

oppure inviaci il coupon al numero di fax 0587/732232

Potrai acquistare i libri qui riportati con uno SCONTO ECCEZIONALE del 10% anche se acquisti solo un libro

oppure del 20% se acquisti 3 libri

Essential SharePoint 2007 2ed.A Practical Guide for Users,

Administrators and Developers di J. WebbO’ Reilly

445 pp - euro 41,40ISBN 9780596514075

Essential SharePoint 2007Delivering High-Impact Collaboration

di S. Jamison et al.Addison Wesley

456 pp - euro 44,95ISBN 9780321421746

Visual Basic 2005 Instant Results

di T. WillisJohn Wiley

316 pp - euro 35,00 ISBN 9780470118719

Core Internet Application Development

with ASP.NET 2.0di R. Connolly

Addison Wesley1088 pp - euro 48,95ISBN 9780321419507

Microsoft SharePoint 2007 For Dummiesdi V. L. Williams

John Wiley 456 pp - euro 27,50

ISBN 9780470099414

SharePoint 2007 and Office Development Expert

Solutionsdi R. Holloway et al.

John Wiley324 pp - euro 42,00

ISBN 9780470097403

Microsoft SharePoint Server 2007 Bible

di A. Corp et al.John Wiley

792 pp - euro 40,00ISBN 9780470008614

Advanced FPGA DesignArchitecture, Implementation,

and Optimizationdi S. Kilts

John Wiley336 pp - euro 75,20

ISBN 9780470054376

The ASP.NET 2.0 Anthology101 Essential Tips, Tricks & Hacks

di S. Allen et al.O’ Reilly - Sitepoint500 pp - euro 41.40

ISBN 9780980285819

Page 7: v2007 05 vbj77

IN VETRINA VBJ 77IN VETRINA VBJ 77

VBJ 77

Scrivi a [email protected] specificando nell’oggetto della e-mail: IN VETRINA VBJ n. 77

oppure inviaci il coupon al numero di fax 0587/732232

Potrai acquistare i libri qui riportati con uno SCONTO ECCEZIONALE del 10% anche se acquisti solo un libro

oppure del 20% se acquisti 3 libri

Microsoft SharePoint 2007 Unleashed

di M. Noel e C. SpenceSams

840 pp - euro 52,95ISBN 9780672329470

VBScript Programmer’s Reference, 3ed.

di A. Kingsley-Hughes et al. John Wiley

816 pp - euro 35,50ISBN 9780470168080

SharePoint 2007 User’s Guide

di S. Bates e T. SmithApress

407 pp - euro 46,50ISBN 9781590598290

Page 8: v2007 05 vbj77
Page 9: v2007 05 vbj77

��������

�����������������������������������

����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������

���������������

�� ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������

�������������������������������

����

������ �����������������������

��������������������������������������������������������������������������������������������������������������������������

������������������

��������

��

��

����������

���������������

��������

�� �������������������������������������������� ������� ��������������� ���� ����������� ��� ������������ ��� ��������� ���� ��� ���������������������

���������������������

��������������������������������������������������������������������������������������������

����������������

����������

��

���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������

������������������

���������������������������������������������������������������������������������������������������������������������������������������

������������������

������

�� ��������������������������������������������������������������������������������������������������������������������������������������������

������������������

����������

�� �������������������������������������������������������������������

�����������������

������������������������

��

Page 10: v2007 05 vbj77

�������������������

����������������������������������� ��

������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������

�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ��������� ����� ����� ����������������������� �� ���������� ��� �� ���������� ��������� ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ������� ������������� ��� ���������� ������������� ��� ��������� ��������� �����������������������

������������������������������������������

�����������������

��������������������

� � � � � � � � � � � � � � � � � � ���������������������������������

�����������������������������

����������������������������������������������������������������

�������������������������������������������������������������

�����������������������������������������������

�������������������������������������������������������������������������������������������

�����������������

������������������������������������������

�����������������������������������������������������������������������

���������������������������������������������

������������������������������

���������������������������������

������������������������������

������������������������������

����������������������

��������������������������������������������������������������������������������������

����������������

�������������������������������������������������������������������������������

������������������������������������������������������

�������������������������

�������������������������������������������������������������������������������������������������������������

������������������������������������

�������������������������������������������������������������������������������������������������������������������������

��������������������������������������������������������������������������������������������������������������

�����������������������������������������������������

Page 11: v2007 05 vbj77
Page 12: v2007 05 vbj77

12 VBJ N. 77 - Settembre/Ottobre 2007 13VBJ N. 77 - Settembre/Ottobre 2007

SHAREPOINT SHAREPOINT

SharePoint Object Model

di Paolo Pialorsi (www.devleap.com)

Microsoft Office SharePoint Server 2007 (MOSS2007) è un framework applicativo princi-palmente pensato per la realizzazione di soluzioni web di collaborazione, gestione documentale e pu-blishing. Come probabilmente saprete esiste una versione gratuita di SharePoint, chiamata Windows SharePoint Services 3.0 (WSS3), che sta alla base anche di MOSS2007, che semplicemente lo esten-de in termini di funzionalità e servizi accessori. Ad esempio MOSS2007, nelle sue varie versioni e licenze, offre un motore di ricerca evoluto e di li-vello enterprise, fornisce un motore di Single Sign On, consente il collegamento a sistemi e software gestionali esterni tramite il Business Data Cata-log, consente di gestire integrazioni con Microsoft Office Form Server e Microsoft Office Excel Ser-vices, ecc.

Tutti questi servizi e funziona-lità sono utilizzabili “out of the box” e gestibili con strumenti già pronti per l’uso, come Mi-crosoft Office SharePoint Desi-gner 2007 e Microsoft Office 2007 in generale.

Sviluppare soluzioni Share-Point

Molto spesso però non è suffi-ciente appoggiarsi a questi stru-menti e occorre sviluppare delle personalizzazioni, per integrare le proprie soluzioni con il moto-re di WSS3/MOSS2007.

Di seguito sono elencati alcuni dei più comuni ambiti di perso-nalizzazione e sviluppo di solu-zioni SharePoint:

• WebPart: controlli web pensati per arricchire la classica inter-faccia utente di SharePoint, de-

DevLeap è un gruppo di consulenti e autori specializzati nella formazione e consulenza per lo sviluppo di soluzioni basate sul Framework .NET di Microsoft. Possono essere contattati via email: [email protected]. I loro blog personali sono dispo-nibili all’indirizzo http://blogs.devleap.com/

Introduzione al modello ad oggetti di Microsoft Office SharePoint Server 2007 per lo sviluppo di soluzioni personalizzate.

Page 13: v2007 05 vbj77

12 VBJ N. 77 - Settembre/Ottobre 2007 13VBJ N. 77 - Settembre/Ottobre 2007

SHAREPOINT SHAREPOINT

dello grafico e la stessa struttura di conte-nuti (liste, cartelle documenti, ecc.). Si pensi alla gestione dei clienti e alla realizzazione di un mini-portale web, per ciascun clien-te o area commerciale, con le cartelle per le fatture attive, passive, gli indirizzi, gli appuntamenti, ecc. Creare un site templa-te corrisponde a formalizzare uno schema dei contenuti, delle personalizzazioni e del layout grafico di base, da applicare poi a tutte le singole istanze di sito web, costrui-te secondo quel modello.

• Workflow: sono processi di business rea-lizzati con Windows Workflow Foundation e che possono arricchire di funzionalità e comportamenti le liste di file e contenuti o i modelli di documento. Ad esempio è pos-sibile associare un workflow di approvazio-ne ad ogni documento di tipo “offerta”, op-pure collegare un workflow a qualsiasi do-cumento inserito in una specifica cartella,

finibili e configurabili anche dall’utente fi-nale, che si integrano con l’interfaccia web di SharePoint. Richiamano in tutto e per tut-to il concetto di WebPart di ASP.NET 2.0, in quanto ne rappresentano un’estensione.

• EventHandler: sono classi che intercettano azioni eseguite dagli utenti (inserimento di un file, cancellazione di un item da una lista, ecc.) e consentono di svolgere azioni corret-tive, se invocati pre-evento, o consequenzia-li, se invocati post-evento.

• List template: descrivono modelli di liste di documenti o elementi (contatti, appun-tamenti, task, ecc.) utilizzabili per creare N diverse istanze delle stesse, tutte con la stessa struttura e comportamento, in base a quanto definito nel modello.

• Site template: spesso si realizzano soluzioni basate su N siti web tutti con lo stesso mo-

Figura 1 SharePoint Object Model Hierarchy

Page 14: v2007 05 vbj77

14 VBJ N. 77 - Settembre/Ottobre 2007 15VBJ N. 77 - Settembre/Ottobre 2007

SHAREPOINT SHAREPOINT

oppure ancora definire un flusso da esegui-re ogni volta che viene inserito un appun-tamento in un’agenda on-line.

Vi sono molti altri ambiti in cui può essere necessario sviluppare porzioni di codice per SharePoint, ma quelli appena visti sono sicu-ramente tra i più diffusi. Ciò che conta mag-giormente però è il fatto che qualunque tipo di soluzione si vada ad implementare, uno de-gli strumenti principali da utilizzare è l’Object Model di SharePoint.

SharePoint Object ModelDal momento che SharePoint persiste sia la

propria configurazione che la configurazione e i contenuti dei suoi siti su dei database ap-plicativi, basati su Microsoft SQL Server, è ne-cessario appoggiarsi ad un modello ad oggetti per poter operare in modo sicuro e corretto.

Lo SharePoint Object Model è un framework di classi, realizzato con .NET Framework e parzialmente offuscato, che consente di la-vorare e interagire con tutti gli strumenti e gli oggetti definiti all’interno di una server farm SharePoint.

È una libreria di classi che è disponibile su qualsiasi server sul quale siano configurati i moduli di SharePoint. Non è pensato per es-sere referenziato ed utilizzato da applicazioni o servizi che girano su server diversi da quelli preposti ad ospitare SharePoint. Esistono in-fatti dei web service, pubblicati da SharePoint, pensati per tutte quelle situazioni in cui sia necessario utilizzare i server MOSS2007/WSS3 da server o applicazioni remote.

Esistono poco più di una ventina di name-

Qualunque soluzione si vada ad implementare, uno degli strumenti principali è l’Object Model

di SharePoint

space .NET che raggruppano diverse mi-gliaia di classi. Il namespace radice si chia-ma Microsoft.SharePoint e contiene nume-rosi altri namespace, alcuni dei più impor-tanti sono:

• Microsoft.SharePoint.Administration: con-tiene le classi per l’amministrazione e la gestione della topologia di soluzioni Sha-rePoint.

• Microsoft.SharePoint.WebControls: racchiu-de i controlli e le classi per la realizzazione di WebPart e WebControl.

• Microsoft.SharePoint.Workflow: rappresen-ta il namespace preposto a definire le clas-si relative all’integrazione tra SharePoint e Windows Workflow Foundation.

• Microsoft.SharePoint.Portal.Search: contie-ne le classi relative al motore di ricerca, pre-sente solo in MOSS2007 e non in WSS3.

• Microsoft.SharePoint.Portal.WebControls: controlli web specifici di MOSS2007.

• Microsoft.SharePoint.Portal.SingleSignOn: le classi che afferiscono al motore di Sin-gle Sign On di MOSS2007.

La topologia di una soluzione SharePoint prevede la definizione di una SharePoint Server Farm, rappresentata da oggetti di tipo SPFarm. Una SPFarm consente di ge-stire la configurazione della farm, importare/esportare utenti definiti nella farm stessa e svolgere operazioni di backup e restore dei servizi configurati. Di seguito un esempio di codice per accedere ad una SPFarm, in base alla stringa di connessione del suo database di configurazione:

C#

SPFarm farm = SPFarm.Open

(“server=localhost;database=SharePoint

_Config;integrated security=SSPI;”);

Page 15: v2007 05 vbj77

14 VBJ N. 77 - Settembre/Ottobre 2007 15VBJ N. 77 - Settembre/Ottobre 2007

SHAREPOINT SHAREPOINT

Console.WriteLine(“The current

SPFarm version is: {0}”, farm.BuildVersion);

Console.WriteLine(“The SPFarm name is: {0}”,

farm.DisplayName);

Una SPFarm è costituita da una o più Web Application, che in SharePoint Object Model si chiamano SPWebApplication. Queste ulti-me corrispondo ai siti IIS configurati sui ser-ver web di pubblicazione. Da una SPWebAp-plication si gestiscono le configurazioni della singola applicazione. Ad esempio di seguito si utilizza un oggetto SPWebApplication per con-figurare l’accesso anonimo all’applicazione:

C#

SPWebApplication webApplication =

SPWebApplication.Lookup

(new Uri(“http://moss2007dev:9501/”));

webApplication.IisSettings[SPUrlZone.Default].

AllowAnonymous = true;

webApplication.Update();

Come si vede già da questo primo esempio, le modifiche agli oggetti devono sempre es-sere confermate invocando l’apposito metodo Update(). Infatti mentre si lavora con gli og-getti si modifica solo una copia in memoria di quello che deve poi essere persistito nel da-

tabase di configurazione o applicativo, a se-conda dei casi.

All’interno di ciascuna Web Application tro-vano posto le Site Collection, oggetti di tipo SPSite, che non sono altro che insiemi di Siti Web, corrispondenti ad oggetti di tipo SPWeb. Gli SPSite raggruppano diversi SPWeb, con-sentendo di condividere il database di conte-nuti, gli utenti e i gruppi SharePoint, oltre ad alcune impostazioni generali.

Ecco un esempio di codice che scorre tut-ti gli SPSite configurati su una SPWebAppli-cation, per andare poi a mostrare le singole istanze di SPWeb in essi cotenute.

C#

SPWebApplication webApplication =

SPWebApplication.Lookup

(new Uri(“http://moss2007dev:9501/”));

Console.WriteLine(“\nHere are the Sites in the

SPWebApplication:”);

foreach (SPSite site in webApplication.Sites)

{

Console.WriteLine

(“\tPortal Name: {0}\n\tURL: {1}”,

site.PortalName, site.Url);

Console.WriteLine

(“\n\tHere are the Webs in the SPSite:”);

Riquadro 1 Ambiente di sviluppo SharePoint

Una domanda molto ricorrente nei corsi e negli eventi pubblici dedicati a SharePoint 2007 è quella relativa all’ambiente di sviluppo “ideale” per lavorare con SharePoint. Sono possibili almeno due diverse soluzioni. La prima prevede l’uso di un server SharePoint condiviso tra diversi sviluppatori, con una gestione dei sorgenti locali alle singole macchine di sviluppo ed un deployment centralizzato sul server di sviluppo e test. Questa soluzioni non consente di verificare e debuggare direttamente il codice, in particolare quello basato sullo SharePoint Object Model, in quanto manca l’infra-struttura di SharePoint installata sui singoli PC di sviluppo, però consente di avere un ambiente di testing condiviso e centralizzato. Una seconda soluzione possibile, e che personalmente utilizzo, prevede l’uso di macchine virtuali preposte all’esecuzione delle soluzioni e personalizzazioni SharePoint. Su queste macchine dedicate potranno essere installati tutti gli strumenti di sviluppo necessari e potrà essere svolto comodamente il debug del codice. Ovviamente in soluzioni di questo tipo diventa importante che ci sia un gestore dei sorgenti condivisi, come il Source Control di Team System, al fine di avere ambienti di sviluppo diversi ma collegati come sorgenti. In generale una postazione di lavoro (fisica o virtuale) per sviluppare soluzioni SharePoint prevede un sistema Windows Server 2003, con Visual Studio 2005 e .NET Framework 3.0, oltre ovviamente a WSS3/MOSS2007. Inoltre servono le estensioni per Visual Studio per lo sviluppo di Workflow e risultano molto comode le Visual Studio Extensions for Windows SharePoint Services 3.0, scaricabili dal sito pubblico di MSDN. Queste ultime permettono di avere una serie di modelli di classi e progetti, pensati per estendere in modo rapido e guidato l’ambiente di SharePoint. Con Visual Studio 2008 queste estensioni saranno già nativamente presenti nell’ambiente di sviluppo.

Page 16: v2007 05 vbj77

16 VBJ N. 77 - Settembre/Ottobre 2007 17VBJ N. 77 - Settembre/Ottobre 2007

SHAREPOINT SHAREPOINT

foreach (SPWeb web in site.AllWebs)

{

Console.WriteLine

(“\tTitle: {0}\n\tURL: {1}\n\tTemplate: {2}”,

web.Title, web.Url,

web.WebTemplate);

}

}

Il codice di esempio appena visto è definito all’interno di un’applicazione esterna, in que-sto caso specifico si tratta di un’applicazione Console, che interagisce con SharePoint. Mol-to spesso però il codice che scriviamo gira al-l’interno di pagine ASP.NET o WebPart, che in realtà sono ospitate all’interno di istanze di SPWeb. Per questo motivo gli oggetti SPWeb e SPSite possono essere costruiti anche sfrut-tando direttamente il contesto ASP.NET delle richieste che si stanno evadendo, per ricavare automaticamente il contesto SharePoint.

C#

SPSite site = SPControl.GetContextSite

(Context);

SPWeb web = SPControl.GetContextWeb(Context);

L’esempio appena riportato descrive come ac-cedere al SPSite e/o SPWeb corrente da una Web Part configurata in MOSS2007/WSS3. L’oggetto SPControl utilizzato si trova nel namespace Microsoft.SharePoint.WebControls, proprio ad indicare che è di uso ricorren-te da parte dei Web Control ASP.NET creati per girare in SharePoint.

Lavorare con le listeA prescindere dal fatto che si lavori con ap-

plicazioni esterne (servizi del sistema operati-vo, moduli batch da Console, programmi Win-dows Forms, ecc.) referenziando gli SPSite e SPWeb tramite la loro URI, oppure con pagi-ne ASP.NET e WebPart, utilizzando il conte-sto ASP.NET, tipicamente questi oggetti sono utilizzati non tanto o non solo per variare la configurazione dell’ambiente, ma soprattut-to per accedere in lettura e scrittura ai con-tenuti del portale.

Attraverso un’istanza di SPWeb si può ave-re accesso, da codice, alle liste di contenuti e documenti presenti all’interno di un portale SharePoint, sia esso MOSS2007 o WSS3. In-fatti ogni SPWeb espone la proprietà Lists, di tipo SPListCollection, tramite la quale si possono scorrere e ricercare le singole liste di contenuti. Pensiamo allora ad un classi-co portale SharePoint di collaborazione (det-to “Team Site”), dove sia presente una lista di “Contacts”. Il seguente codice mostra come ottenere e sfogliare l’elenco dei singoli con-tatti in essa contenuti:

C#

SPWeb web = SPControl.GetContextWeb(Context);

SPList listContacts = web.Lists[“Contacts”];

foreach (SPListItem contact in

listContacts.Items)

{

Respone.Write(String.Format

(“Last Name: {0} - EMail: {1}”,

contact[“Title”], contact[“Email”]));

}

Come si vede dall’esempio appena riportato, ogni item di una lista SharePoint è descrit-to da un oggetto di tipo SPListItem, il quale espone un dictionary di proprietà che corri-spondono ai campi informativi dell’elemen-to. Si noti che le chiavi utilizzate per acce-dere i singoli campi non corrispondo neces-sariamente ai nomi dei campi stessi (“Last Name” diventa “Title”). Inoltre ogni campo di un SPListItem ha un nome pubblico e de-scrittivo, chiamato Title, e un nome interno, chiamato InternalName. Nel nostro esempio

Attraverso un oggetto SPWeb si può avere accesso alle liste di

contenuti e documenti del portale

Page 17: v2007 05 vbj77

16 VBJ N. 77 - Settembre/Ottobre 2007 17VBJ N. 77 - Settembre/Ottobre 2007

SHAREPOINT SHAREPOINT

il campo con Title “Last Name” ha un Inter-nalName pari a “Title”. La ricerca dei campi su un SPListItem avviene sulla base dell’In-ternalName, che è case sensitivo. Per avere un elenco preciso dei nomi dei campi disponibi-li per gli SPListItem di un’istanza di SPList possiamo utilizzare la proprietà Fields dell’og-getto che descrive la lista.

C#

SPWeb web = SPControl.GetContextWeb(Context);

SPList listContacts = web.Lists[“Contacts”];

SPWeb web = new SPSite

(“http://moss2007dev/”).OpenWeb();

foreach (SPField field in listContacts.Fields)

{

Respone.Write(String.Format

(“Title: {0} - Internal Name: {1} - Type: {2}”,

field.Title, field.InternalName,

field.TypeAsString));

}

In alternativa possiamo utilizzare la proprie-tà SchemaXml che caratterizza ogni istanza di SPList, per avere la sua struttura in un solo passaggio, in formato XML.

Un’operazione ricorrente, oltre allo sfogliare una lista, è creare nuovi elementi al suo in-terno ovvero creare liste ex-novo. Di seguito è riportato un esempio di codice che aggiunge un contatto alla lista appena sfogliata:

C#

SPWeb web = new SPSite

(“http://moss2007dev/”).OpenWeb();

SPList listContacts = web.Lists[“Contacts”];

SPListItem newContact = listContacts.Items.

Add();

newContact[“Title”] = “Pialorsi”;

newContact[“First Name”] = “Paolo”;

newContact[“Email”] = “[email protected]”;

newContact.Update();

In questo caso l’accesso all’istanza di SPWeb avviene tramite il metodo OpenWeb() dell’og-getto SPSite. Di fatto questo metodo, se in-vocato nel suo overload senza parametri, re-stituisce l’istanza di SPWeb corrispondente al

sito web radice della Site Collection corrente. Sottolineo il fatto che l’elemento deve prima di tutto essere aggiunto alla lista, tramite il metodo Add() della collezione di Items, quin-di solo dopo aver valorizzato i suoi campi può essere salvato, chiamandone il metodo Upda-te(), già visto in precedenza.

Nel prossimo estratto di codice invece si crea, completamente da zero, una lista di clienti, con titoli “Clienti”, in un portale di collabo-razione SharePoint:

C#

SPWeb web = SPControl.GetContextWeb(Context);

Guid newListId = web.Lists.Add(“Clienti”,

“Lista Clienti”, SPListTemplateType.Contacts);

Response.Write(String.Format(“List {0} crea-

ted.”, web.Lists[newListId].Title));

La lista viene aggiunta, come accadeva per gli SPListItem, alla collezione delle Lists del SPWeb. Il risultato del metodo di Add(...) è il GUID che identifica univocamente in Share-Point la lista appena creata. Come si vede il tipo di lista è ottenuto tramite una enumera-zione di tipologie predefinite (SPListTempla-teType). In realtà è anche possibile utilizza-re template di liste personalizzati, per crea-re da codice N istanze di liste secondo mo-delli proprietari. Non soffermiamoci oltre su aspetti di dettaglio in un articolo introdutti-vo come questo.

Gestire file e documentiUno degli aspetti più interessanti e rivolu-

zionari di SharePoint è il fatto che è possi-

Le soluzioni WSS3/MOSS2007 di archiviazio-

ne documentale sono gestibili via Object Model

Page 18: v2007 05 vbj77

18 VBJ N. 77 - Settembre/Ottobre 2007 19VBJ N. 77 - Settembre/Ottobre 2007

SHAREPOINT SHAREPOINT

bile utilizzare portali e soluzioni SharePoint come valide alternative a sistemi di file sha-ring tradizionali.

Le soluzioni di archiviazione documentale basate su WSS3/MOSS2007 sono gestibili non solo attraverso l’interfaccia utente di Share-Point, Microsoft Office e Windows Explorer, ma anche attraverso l’Object Model. Ogni li-sta di documenti, dal punto di vista di Sha-rePoint, è innanzitutto una SPList, specializ-zata nel tipo SPDocumentLibrary. In pratica ogni SPDocumentLibrary non è altro che una classe, derivata da SPList, che specializza al-cuni dei suoi comportamenti e funzionalità. Mentre gli elementi di una SPList tradizionale sono oggetti di tipo SPListItem, i documenti all’interno di una SPDocumentLibrary sono oggetti di tipo SPFile. A ciascun SPFile cor-risponde però anche un SPListItem che rap-presenta il contenitore di meta-informazioni legate al singolo file (autore, data di upload, versione, ecc. e campi personalizzati).

Di seguito è riportato un esempio di codice per leggere i file presenti in una document library:

C#

SPWeb web = new SPSite

(“http://moss2007dev/”).OpenWeb();

SPDocumentLibrary doclib = web.Lists

[“Shared Documents”] as SPDocumentLibrary;

Console.WriteLine(“\n\tHere are the Files in

the SPDocumentLibrary:”);

foreach (SPFile file in doclib.RootFolder.Files)

{

Console.WriteLine(“\tTitle: {0}\n\tUrl:

{1}\n\tAuthor: {2}”,

file.Title, file.Url, file.Author.Name);

}

Qualora si voglia estrarre da SharePoint il contenuto binario di un file, è possibi-le accedervi tramite un oggetto di tipo System.IO.Stream, nel modo seguente:

C#

SPWeb web = new SPSite

(“http://moss2007dev/”).OpenWeb();

SPDocumentLibrary doclib = web.Lists

[“Shared Documents”] as SPDocumentLibrary;

SPFile fileInstance = doclib.RootFolder.Files

[“Notes.txt”];

Stream fileStream = fileInstance.OpenBinary-

Stream();

using (StreamReader sr = new StreamReader

(fileStream))

{

String data = sr.ReadToEnd();

Console.WriteLine(data);

}

Anche il salvataggio di un file in una car-tella documenti è un’operazione abbastan-za banale:

C#

SPWeb web = new SPSite

(“http://moss2007dev/”).OpenWeb();

SPDocumentLibrary doclib = web.Lists

[“Shared Documents”] as SPDocumentLibrary;

String fileContentAsText = “Sample document

content!”;

Byte[] fileContent = Encoding.Unicode.GetBytes

(fileContentAsText);

SPFile fileUploaded = doclib.RootFolder.Files.-

Add(“sample.txt”, fileContent);

fileUploaded.Item[“Title”] = “Sample Document”;

fileUploaded.Item.Update();

fileUploaded.Update();

Il codice .NET di Web Part o controlli ASP.NET, deve

essere autorizzato via Code Access Security

Page 19: v2007 05 vbj77

18 VBJ N. 77 - Settembre/Ottobre 2007 19VBJ N. 77 - Settembre/Ottobre 2007

SHAREPOINT SHAREPOINT

Come si vede possiamo scrivere il contenu-to del file sotto forma di array di Byte, oppu-re anche come Stream sfruttando un overload differente del metodo Add(...) della lista di Fi-les corrente. Ogni SPFile prevede poi una pro-prietà di nome Item che corrisponde al SPLi-stItem sottostante. Ogni lista di documenti in-fatti è prima di tutto una lista di SPListItem, che hanno però una serie di caratteristiche in più finalizzate a descrivere il file rappresen-tato. Nuovamente si sottolinea l’importanza dell’invocazione del metodo Update() sul SP-File e sul SPListItem sottostante.

Un’altra attività abbastanza semplice e ricor-rente è il check-in/check-out dei documenti da modello ad oggetti. SharePoint consente infatti di gestire politiche di accesso concor-rente ai documenti, sfruttando regole di che-ck-out esclusivo dei file e di check-in al ter-mine delle attività di modifica. Ecco un esem-pio di codice in grado di prendere un docu-mento, farne il check-out e successivamente il check-in, il tutto da Object Model.

C#

SPWeb web = new SPSite

(“http://moss2007dev/”).OpenWeb();

SPDocumentLibrary doclib = web.Lists

[“Shared Documents”] as SPDocumentLibrary;

String fileContentAsText = “Sample document

content!”;

Byte[] fileContent = Encoding.Unicode.GetBytes

(fileContentAsText);

SPFile fileUploaded = doclib.RootFolder.Files.-

Add(“sample.txt”, fileContent);

fileUploaded.Item[“Title”] = “Sample Document”;

fileUploaded.Item.Update();

fileUploaded.Update();

fileUploaded.CheckOut();

Stream fileStream = fileUploaded.OpenBinary-

Stream();

using (StreamReader sr = new StreamReader

(fileStream))

{

String data = sr.ReadToEnd();

data = data.ToUpper();

fileUploaded.SaveBinary(Encoding.Unicode.-

GetBytes(data));

}

fileUploaded.Update();

fileUploaded.CheckIn(“Upper case done.”);

I metodi più importanti di questo esempio sono CheckOut() e CheckIn(...), dove il nome indica già in modo inequivocabile lo scopo di ciascuno dei due. Volendo è anche possibile annullare un’operazione di check-out, invo-cando il metodo di UndoCheckOut().

ConclusioniIn questo articolo abbiamo “assaggiato” al-

cune delle potenzialità del modello ad og-getti di SharePoint. È importante ricordare che lo SharePoint Object Model è fruibile da qualsiasi postazione abbia SharePoint instal-lato. Inoltre è fondamentale sottolineare che il codice che usa l’Object Model dall’interno di Web Part o controlli ASP.NET, deve essere autorizzato a farlo, tramite apposite configu-razioni di Code Access Security (CAS), altri-menti il codice non sarà autorizzato a girare e non produrrà alcun effetto, anzi in alcune circostanze determinerà errori.

In articoli futuri approfondiremo alcuni di questi e altri temi relativi allo sviluppo per SharePoint, come per esempio la creazione di EventHandler e di Workflow personalizzati, l’utilizzo dei Web Service di SharePoint, per la gestione dei contenuti da remoto, e la con-figurazione della Code Access Security.

Riferimenti[1] http://msdn.microsoft.com/sharepoint/ [2] http://msdn2.microsoft.com/en-us/library/

bb530302.aspx[3] http://msdn2.microsoft.com/en-us/library/

bb530301.aspx[4] http://msdn2.microsoft.com/en-us/library/

bb153523.aspx

Page 20: v2007 05 vbj77

20 VBJ N. 77 - Settembre/Ottobre 2007 21VBJ N. 77 - Settembre/Ottobre 2007

LINQ LINQ

LINQ in pillole: architettura e filosofia di base

di Marco Russo e Paolo Pialorsi (www.devleap.com)

Questo articolo è il primo di una serie dedicata a LINQ in cui presenteremo le principali funzionali-tà di questo nuovo strumento che sarà disponibile in Visual Studio 2008.

Cosa è LINQLINQ (Language Integrated Query) è un modello

di programmazione che introduce all’interno dei lin-guaggi .NET (per ora C# e VB) dei costrutti sintatti-ci per l’interrogazione di strutture dati, siano esse in memoria o meno. Si tratta di vere e proprie estensio-ni dei linguaggi che espongono in maniera più sem-plice e intuitiva delle funzionalità presenti in una li-breria che fa parte del .NET Framework 3.5.

Grazie a LINQ è possibile scri-vere:

var query =

from c in Customers

where c.Country == “Italy”

select c.CompanyName;

foreach ( string name in query ) {

Console.WriteLine( name );

}

Questo codice (scritto in C# 3.0) estrae da Customers i clien-ti italiani, fornendo una lista che contiene solo il nome (quindi un elenco di stringhe). Questa sin-tassi richiama quella di SQL, an-che se ha un costrutto sintattico diverso soprattutto per l’ordine delle keyword, visto che select è alla fine anziché all’inizio. Si

Il primo di una serie di articoli in “pillole” per introdurre i concetti fonda-mentali di LINQ e capire quando e come usarlo al meglio, nell’attesa che arrivi insieme a Visual Studio 2008.

DevLeap è un gruppo di consulenti e autori specializzati nella formazione e consulenza per lo sviluppo di soluzioni basate sul Framework .NET di Microsoft. Possono essere contattati via email: [email protected]. I loro blog personali sono dispo-nibili all’indirizzo http://blogs.devleap.com/

Page 21: v2007 05 vbj77

20 VBJ N. 77 - Settembre/Ottobre 2007 21VBJ N. 77 - Settembre/Ottobre 2007

LINQ LINQ

In realtà Customers può anche essere un semplice array di oggetti in memoria:

Customer[] Customers;

Oppure una tabella in un DataSet:

DataSet ds = GetDataSet();

DataTable Customers = ds.Tables[“Customers”];

L’elemento centrale è che la sintassi che de-finisce la query sui dati è identica, indipen-dentemente dal fatto che l’oggetto della query sia una tabella su un database o un array di oggetti in memoria. Elenchiamo i motivi per cui questa uniformità è così importante:

• Programmazione dichiarativa: si definisce

tratta di una precisa scelta progettuale per migliorare il funzionamento di Intellisense. Ma cosa è Customers?

La risposta più intuitiva è che Customers sia una tabella all’interno di un database. Questa è una delle possibilità offerte da LINQ, ma non è l’unica e forse nemmeno la più impor-tante. L’oggetto di una query LINQ può esse-re un qualsiasi oggetto (da un punto di vista OOP) che esponga l’interfaccia IEnumerable. L’oggetto Customers dell’esempio precedente rappresenta una tabella in un database se è dichiarato in questo modo:

DataContext db = new DataContext( Connection

String );

Table<Customer> Customers =

db.GetTable<Customer>();

Figura 1 Architettura di LINQ

Page 22: v2007 05 vbj77

22 VBJ N. 77 - Settembre/Ottobre 2007 23VBJ N. 77 - Settembre/Ottobre 2007

LINQ LINQ

Architettura di LINQCome si può vedere in Figura 1, LINQ ha

un’architettura estendibile: il “motore” di LINQ lavora su oggetti in memoria e prende il nome di LINQ to Objects, ma altre estensio-ni consentono da subito di lavorare con dati relazionali (LINQ to SQL), DataSet (LINQ to DataSet), XML (LINQ to XML) ed entità for-nite da ADO.NET Entitiy Framework (LINQ to Entities). La scelta dell’estensione da usa-re dipende dal tipo dell’oggetto su cui agisce una query LINQ (con la conseguente dipen-denza da alcuni namespace e assembly).

Le query LINQ sono fisicamente imple-mentate attraverso due meccanismi: in uno il compilatore genera il codice che eseguirà la query (LINQ to Objects, LINQ to XML), nell’altro il compilatore genera una struttu-ra dati (expression tree) che può essere ana-lizzata, manipolata e infine compilata come codice (o convertita in altri linguaggi, come SQL) durante l’esecuzione.

Anche se a prima vista LINQ è importan-te per l’accesso ai dati relazionali, in realtà è il paradigma di programmazione dichiarati-va quello più interessante a lungo termine. Il fatto di scrivere codice a un livello “più alto” consente di lasciare maggiore libertà al compilatore piuttosto che al runtime per apportare ottimizzazioni di vario tipo al co-dice che deve essere eseguito, e tra queste un posto di primo piano spetta sicuramente al parallelismo.

All’interno di Microsoft un team sta svilup-

cosa si vuole ottenere e non come ottener-lo – il compilatore e il runtime hanno più informazioni per ottimizzare l’esecuzione, eventualmente facendo leva sul paralleli-smo;

• Sintassi uniforme: le regole sintattiche per le query sono le stesse anche se i dati risie-dono su sistemi con metodi d’accesso diffe-renti (o linguaggi di interrogazione diversi – es. dialetti SQL);

• Type-checking: il controllo sintattico sulla query e sulla correttezza dei tipi avviene al momento della compilazione anziché du-rante l’esecuzione. Questo è particolarmen-te importante se si pensa al fatto che oggi le query SQL annegate nel codice non han-no alcun controllo sintattico. Anche usando le stored procedure, resta il problema del-la mancanza di controllo sui tipi restituiti dalla stored procedure stessa.

A queste considerazioni se ne possono ag-giungere altre valide limitatamente ad alcune implementazioni di LINQ. Per esempio, dal punto di vista della sicurezza LINQ to SQL evita all’origine problemi di SQL injection nel codice SQL generato e inviato al database.

Il codice visto inizialmente è scritto in C# 3.0; in Visual Basic 9.0 dovremmo scriverlo nel modo seguente:

Dim query = _

From c In Customers _

Where c.Country = “Italy” _

Select c.CompanyName

For Each name in query

Console.WriteLine( name )

Next name

Le differenze sono minime e puramente sin-tattiche, almeno in questo caso. Esistono tut-tavia alcune differenze funzionali tra C# 3.0 e Visual Basic 9.0 che potrebbero variare da qui alla versione finale (LINQ, come Visual Studio 2008, è ancora in beta).

LINQ introduce all’interno dei linguaggi .NET

costrutti sintattici per l’interrogazione di

strutture dati

Page 23: v2007 05 vbj77

22 VBJ N. 77 - Settembre/Ottobre 2007 23VBJ N. 77 - Settembre/Ottobre 2007

LINQ LINQ

na a LINQ per la prima volta è la possibili-tà di manipolare strutture dati in memoria scrivendo meno codice che soprattutto diven-ta molto più chiaro da leggere e mantenere. LINQ non è solo accesso a dati relazionali, ma è soprattutto integrazione nei linguaggi di programmazione di istruzioni specifiche per l’accesso ai dati.

Nelle prossime pillole esamineremo più da vicino i principi base di LINQ e le specificità delle varie implementazioni.

Bibliografia[1] Paolo Pialorsi & Marco Russo – “Intro-

ducing Microsoft LINQ”, Microsoft Press, 2007

Riferimenti[2] http://introducinglinq.com

pando un’estensione chiamata PLINQ (Paral-lel LINQ). Altro non è che una versione di LINQ to Objects che consente di interrogare strutture dati in memoria sfruttando in ma-niera completamente automatica algoritmi che implementano tecniche di parallelismo, sfruttando così più CPU (o core) a disposizio-ne. Visto che nei prossimi anni difficilmen-te vedremo aumentare la velocità dei singoli core, ma ne avremo un numero sempre mag-giore per ogni PC, l’evoluzione di strumenti che semplifichino l’uso del parallelismo è di assoluta importanza.

ConclusioniLINQ è uno strumento che introduce nuo-

vi paradigmi nella programmazione, anche se ciò non deve automaticamente indurre a cambiare l’architettura di un applicativo. Un aspetto spesso sottovalutato da chi si avvici-

Page 24: v2007 05 vbj77

24 VBJ N. 77 - Settembre/Ottobre 2007 25VBJ N. 77 - Settembre/Ottobre 2007

ENTERPRISE ENTERPRISE

Architettura di applicazioni gestionali con .NET

di Lorenzo Vandoni

In questo articolo viene presentato uno studio che ha l’obiettivo di decidere quale architettura adottare per realizzare un’applicazione gestionale di grosse dimensioni, utilizzando Visual Studio.NET.

Lo studio prende spunto da un caso concreto, ov-vero dalla necessità reale di sviluppare un’applica-zione di questo tipo, presenta alcune alternative, ed arriva a proporre alcune scelte ben precise, spie-gando perché sono state adottate.

Trattandosi di un caso concreto, cominceremo con una discussione dei requisiti di questa appli-cazione.

Requisiti applicativiL’applicazione da realizzare è un “classico” sistema

informativo gestionale, che presenta quindi queste caratteristiche principali:

• Interfacciamento con un data-base relazionale già esistente (nel caso specifico, Oracle)

• Molte maschere con funziona-lità di ricerca ed inserimento dati

• Molti report

L’applicazione dovrà essere utilizzata da diverse aziende di grandi dimensioni, e con mol-te sedi sul territorio nazionale. Per questo motivo, sono parti-colarmente importanti questi requisiti:

• facilità di installazione e di aggiornamento

• efficienza, anche nell’accesso a grandi quantità di dati resi-denti su database remoti

Quale architettura adottare per realizzare un’applicazione gestionale con Visual Studio.NET?

Lorenzo Vandoni, è laureato in Informatica ed è uno spe-cialista di progettazione e sviluppo con tecniche e linguag-gi object-oriented in ambiente Windows. È direttore del Laboratorio di Ricerca e Sviluppo di Emisfera e coordina un progetto di ricerca internazionale sulle reti wireless, finanziato dalla Comunità Europea nell’ambito del Sesto Programma Quadro (FP6). Può essere contattato all’indirizzo [email protected]

Page 25: v2007 05 vbj77

24 VBJ N. 77 - Settembre/Ottobre 2007 25VBJ N. 77 - Settembre/Ottobre 2007

ENTERPRISE ENTERPRISE

• applicazione client-server di tipo classico

• applicazione web

• applicazione smart client

Nei prossimi paragrafi verranno descritte le caratteristiche principali di ognuna di que-ste alternative.

Applicazione client-server “classica”Col termine applicazione client-server “clas-

sica” intendo indicare un programma che ri-siede su una macchina client, e che dialoga tramite SQL con un server di database, come mostrato in Figura 1.

In un’applicazione di questo tipo, la logi-ca applicativa risiede quasi totalmente sul client. Al server vengono demandati alcuni controlli, come la duplicazione di chiave pri-maria o l’obbligatorietà dei campi, che però tipicamente vengono implementati anche lato client, e alcune funzionalità “database inten-sive”, tipicamente implementate tramite sto-red procedure.

Una soluzione di questo tipo presenta alcu-ni vantaggi e svantaggi:

• vantaggio: somiglianza archietturale con la soluzione attuale, con conseguente sem-

L’applicazione, di fat-to, consiste in un por-ting di un sistema precedente, realizzato utilizzando Visual Ba-sic 6, Crystal Repor-ts ed Oracle. Per que-sto motivo, sarà anche importante mantenere una sorta di continuità, dal punto di vista fun-zionale, con la versio-ne precedente.

In quella versione, il problema delle instal-lazioni e degli aggior-namenti era stato risol-to scegliendo di non installare il programma sul computer degli utenti, ma solo su alcune macchine, accessibili tramite Terminal Ser-ver. Questa soluzione, in parte, permetteva di risolvere anche il problema delle prestazioni, in quanto consentiva di applicare le ottimiz-zazioni di tipo sistemistico solo alle macchi-ne server, senza preoccuparsi dei vari client sparsi sul territorio.

Porting su .NET: motivazioni ed alternative

La scelta di effettuare il porting su .NET è principalmente motivata dalla necessità di sle-garsi da un sistema di sviluppo, Visual Basic 6, ormai abbandonato dal produttore. A que-sta necessità si aggiunge il desiderio di rea-lizzare alcuni miglioramenti “strutturali” al-l’applicazione, che non potrebbero essere im-plementati se non riscrivendola quasi com-pletamente.

La scelta di .NET, rispetto ad alternative come Java od altri sistemi, è legata a moti-vazioni di tipo aziendale, come corsi di for-mazione già effettuati e certificazioni già ac-quisite, per cui non verrà ulteriormente ap-profondita.

Scegliendo di utilizzare .NET, le scelte di-sponibili dal punto di vista architetturale, o almeno quelle che sono state esaminate, sono le seguenti:

Figura 1 Architettura client/server “classica”

Page 26: v2007 05 vbj77

26 VBJ N. 77 - Settembre/Ottobre 2007

ENTERPRISE

plicità “concettuale” della fase di porting

• vantaggio: semplicità architetturale, in quanto buona parte della logica applica-tiva risiede sul client

• svantaggio: l’applicazione client diviene particolarmente pesante

• svantaggio: problemi di installazione e so-prattutto di aggiornamento, in quanto di-viene necessario installare l’applicazione client sulle macchine di tutti gli utenti

Una possibile variante, per ovviare a que-st’ultimo problema, potrebbe essere quella di utilizzare Terminal Server. In questo modo, l’applicazione non verrebbe installata diret-tamente sulle macchine degli utenti, ma su un numero limitato di server, ai quali le mac-chine client potrebbero accedere come sem-plici terminali.

Questa, come già accennato, è anche la so-luzione adottata nel sistema attuale, e per-mette in effetti di semplificare le fasi di in-stallazione e di aggiornamento. I problemi di questa soluzione sono principalmente legati ai costi elevati (delle macchine server) e alla scalabilità limitata (ogni server può suppor-tare solo un determinato numero di utenti – se gli utenti aumentano è necessario instal-lare nuovi server).

Applicazione webLa seconda possibilità che è stata conside-

rata è quella di creare un’applicazione web, la cui architettura semplificata è mostrata in Figura 2.

In questo caso il programma è costituito da un insieme di pagine ASP.NET, che risie-dono sul server web, e che comunicano tra-mite SQL col server di database. La comu-nicazione con il client avviene tramite http, e il programma può essere utilizzato trami-te un web browser. Sul browser, oltre al co-dice HTML che costituisce l’interfaccia gra-fica del programma, può essere eseguito del codice Javascript.

In un programma di questo tipo, la logica applicativa risiede quasi totalmente sul ser-ver, ed è implementata dalle pagine ASP.NET. Al server di database possono essere deman-dati gli stessi controlli e le stesse funziona-lità menzionati al punto precedente, men-

L’applicazione da realizzare è un classico

sistema informativo gestionale

Figura 2 Architettura semplificata dell’applicazione web

Page 27: v2007 05 vbj77

26 VBJ N. 77 - Settembre/Ottobre 2007 27VBJ N. 77 - Settembre/Ottobre 2007

ENTERPRISE ENTERPRISE

tecnologie Ajax, cioè facendo in modo che la pagina web residente sul client possa comuni-care con il server e aggiornare il proprio con-tenuto. In questo caso, si otterrebbe una so-luzione simile a quella discussa nel paragra-fo successivo, ma basata su web.

Smart clientUno “smart” client è un’applicazione client

di livello intermedio rispetto alle due prece-dentemente esaminate. È più leggera di un’ap-plicazione client-server di tipo classico, ma è più intelligente rispetto a una normale appli-cazione web.

Uno smart client può essere realizzato sia come applicazione Windows, sia come appli-cazione web, utilizzando Ajax. La sua archi-tettura è mostrata in Figura 3.

tre sul client possono essere implementati, in Javascript, alcuni controlli e funzionalità elementari.

Per una soluzione di questo tipo, vantaggi e svantaggi sono i seguenti:

• vantaggio: problemi di installazione e di ag-giornamento molto limitati, e quasi esclu-sivamente costituiti dalla necessità di ve-rificare la compatibilità coi vari browser web disponibili

• svantaggio: l’architettura diviene più com-plessa, alcuni controlli (es. obbligatorietà di campi) potrebbero essere implementa-ti in ciascuno dei tre livelli

• svantaggio: lo sviluppo web presenta diffi-coltà di implementazione oggettivamente superiori, legate soprattutto al fatto che il web non è nato per ospitare applicazioni di questo tipo

• svantaggio: le applicazioni web sono ne-cessariamente più limitate, nell’interfac-cia grafica, e consentono una minore in-terattività con l’utente

Alcune di queste limitazioni potrebbero essere superate adottando delle tecniche/

Figura 3 Architettura della soluzione “smart client”

L’applicazione dovrà essere utilizzata da diverse

aziende di grandi dimensioni

Page 28: v2007 05 vbj77

28 VBJ N. 77 - Settembre/Ottobre 2007 29VBJ N. 77 - Settembre/Ottobre 2007

ENTERPRISE ENTERPRISE

In questo caso il programma client è costi-tuito da una classica applicazione Windows, che però demanda una gran parte della logi-ca applicativa a uno strato software residen-te sul web server, implementato tramite Web Service. La comunicazione tra smart client e programma server avviene tramite http, men-tre quest’ultimo usa SQL per interagire con il database.

In un programma di questo tipo la logica ap-plicativa è suddivisa tra i tre livelli. Rispetto alla soluzione precedente, il client è più in-telligente (“smart”, appunto), e potrà eseguire un maggior numero di controlli. Tipicamen-te, sul client verranno implementati controlli e funzionalità che possono essere gestiti uti-lizzando solo i dati precedentemente invia-ti dal server, senza accedere nuovamente al database.

In questo caso, i principali vantaggi e svan-taggi sono:

• vantaggio: problemi di installazione e di aggiornamento relativamente limitati

• vantaggio: semplicità di sviluppo, senza le complicazioni tipiche delle applicazio-ni web

• vantaggio: maggiori potenzialità nel dise-gno dell’interfaccia grafica

• svantaggio: l’architettura diviene molto più complessa

Un caso particolare di “smart” client, come precedentemente accennato, potrebbe essere costituito da un’applicazione web che, grazie all’utilizzo di Ajax, sia in grado di portare sul client un maggior numero di funzionalità.

Una soluzione di questo tipo potrebbe esse-re sicuramente interessante per lo sviluppo di un’applicazione Internet, ma nel nostro caso si rivela poco interessante, perché portereb-be con sé tutti gli svantaggi delle ultime due soluzioni esaminate (complessità architettura-le e complessità implementativa, soprattutto), senza apportare vantaggi significativi.

Quale soluzione scegliereUna volta esaminati vantaggi e svantaggi le-

gati alle varie soluzioni esaminate, la scelta è ricaduta su un’applicazione di tipo smart client. In particolare, sulla decisione hanno pesato la necessità di stratificare l’applicazio-ne per rendere meno pesante il programma client, e la complessità intrinseca lagata allo sviluppo di applicazioni gestionali in ambien-te web. Tale complessità avrebbe introdotto difficoltà sicuramente superabili, ma in gra-do di rallentare sensibilmente il processo di sviluppo.

Un ulteriore elemento a favore della soluzio-ne smart client, reso evidente dai test sui pri-mi prototipi, è legato alla maggiore velocità dell’applicazione, rispetto ad un’analoga ap-plicazione web. Il passaggio da una masche-ra ad un’altra, in particolare, risulta estrema-mente più veloce, in quanto tutti gli elemen-ti di interfaccia grafica sono già presenti sul client. In questo modo, l’utente ha la perce-zione di lavorare su un’applicazione remota, ma allo stesso tempo ottiene la maggior par-te dei benefici legati ad un programma che funziona localmente.

Altre caratteristiche dello smart clientAbbiamo finora esaminato solo le caratteri-

stiche più generali dell’architettura proposta. Per concludere l’articolo, vengono qui elenca-te altre caratteristiche del tipo di architettura che è stata successivamente realizzata:

• Installazione di tipo “ClickOnce”. Si tratta di un utile automatismo fornito con Visual Studio 2005, che permette la pubblicazione di un’applicazione su un sito web, e la con-seguente gestione automatica di installa-zioni ed aggiornamenti. L’adozione di que-sta tecnologia permette di risolvere gran parte dei problemi legati al deployment.

• Realizzazione di codice di libreria, lato ser-ver e lato client. Lo sviluppo dell’applica-zione è stato preceduto dalla realizzazione di alcune funzionalità di base, che risulta-no comuni ai vari moduli. Lato client, sono

Page 29: v2007 05 vbj77

28 VBJ N. 77 - Settembre/Ottobre 2007 29VBJ N. 77 - Settembre/Ottobre 2007

ENTERPRISE ENTERPRISE

stati realizzati o, in alcuni casi, adottati, tutti i componenti di interfaccia necessa-ri per realizzare un’applicazione gestiona-le di livello professionale: griglie, finestre di ricerca, campi di lookup, ecc. Sono sta-te inoltre realizzate delle classi base per incapsulare tutti i comportamenti comuni alle finestre dell’applicazione client. Lato server, sono state realizzate delle classi base per i Web Service.

• Gestione di profili in formato XML. La maggior parte delle caratteristiche ap-plicative (campi di ricerca, colonne da vi-sualizzare, relazioni tra le tabelle, regole di validazione, ecc.) sono state specifica-te all’interno di file di profilo, in formato XML, residenti sul server. Per ogni fun-zionalità (es. gestione clienti) sono sta-te create una o più form sul programma client (ClientiFrm.vb), un solo Web Servi-ce (ClientiWS.vb) e un solo file di profilo (Clienti.XML). Il file XML risiede sul ser-ver, ma contiene informazioni che riguar-dano anche l’interfaccia grafica. Per questo

motivo viene spedito dal server al client, che lo riceve come stringa, gestendolo in-teramente in memoria.

L’uso combinato di codice di libreria e pro-fili XML ha permesso di creare un’applica-zione estremamente versatile, in cui il codice applicativo è relativamente limitato. In par-ticolare, grazie alla gestione lato server dei profili, è possibile modificare diverse carat-teristiche applicative senza ricompilare l’ap-plicazione né installare aggiornamenti pres-so il cliente.

ConclusioniIn questo articolo è stato descritto il proces-

so decisionale che ha portato alla scelta di una particolare architettura per la realizza-zione di una complessa applicazione gestio-nale con Visual Studio.NET. Le considerazio-ni fatte in questo contesto possono essere ap-plicate in molti altri casi analoghi, anche se ovviamente non possono avere una valenza di tipo generale.

Page 30: v2007 05 vbj77

30 VBJ N. 77 - Settembre/Ottobre 2007 31VBJ N. 77 - Settembre/Ottobre 2007

INTELLIGENZA ARTIFICIALE INTELLIGENZA ARTIFICIALE

Programmazione Genetica e Strategie di Pianificazione

di Fabio Fabozzi

Sono sempre stato affascinato dall’Intelligenza Ar-tificiale e, soprattutto, dagli Algoritmi Genetici. In particolare, chi ha letto il mio primo libro e gli arti-coli scritti in passato, ha potuto apprezzare la bel-lezza di queste aree tematiche, naturalmente non grazie a me, ma al contributo dei grandi scienziati che vi hanno lavorato. La Programmazione Geneti-ca (PG), è il frutto di un’applicazione degli Algorit-mi Genetici (AG) da parte di John Koza. I risultati ottenuti da Koza e dagli altri studiosi in questa di-sciplina sono stupefacenti. Vi consiglio di visitare il sito della Genetic Programming Foundation [1], per seguire gli ultimi aggiornamenti e le novità. In questo articolo parleremo della PG e dei problemi

legati alle strategie di pianifica-zione, riproponendo un classico problema proposto (e risolto) da Koza: UNIVERSAL (Figura 1).

Tale gioco – o problema – con-siste nell’impilare dei cubi con delle lettere, disposti casualmen-te su un tavolo, finché non sia composta la parola “UNIVER-SAL”, appunto. Un problema che può sembrare banale, ma in realtà non lo è. Si tratta, in-fatti, di un problema riguardan-te le strategie di pianificazione, successivamente la presa di de-cisione e, naturalmente, la rela-tiva generazione di programmi che risolvano il problema.

Per ciò che concerne le basi del-la PG si consiglia di consultare la bibliografia alla fine di que-sto articolo.

Fabio Fabozzi è progettista software per tecnologie .NET e JAVA e di integrazioni tra differenti piattaforme. Attualmente, collabora con la ICM Italia S.p.A. sede di Roma. Tra i suoi principali interessi vi sono l’Intelligenza Artificiale e le Scien-ze Cognitive. È laureando in Scienze dei Processi Cognitivi, presso l’università “La Sapienza” di Roma. È autore del libro “Intelligenza Artificiale con VB” edito dal Gruppo Infomedia, con cui collabora da diversi anni. Può essere contattato al-l’indirizzo [email protected]

Prima puntata

Page 31: v2007 05 vbj77

30 VBJ N. 77 - Settembre/Ottobre 2007 31VBJ N. 77 - Settembre/Ottobre 2007

INTELLIGENZA ARTIFICIALE INTELLIGENZA ARTIFICIALE

rentetica di un albero. Tale peculiarità rende tale linguaggio partico-larmente adatto a rap-presentare le forme di pensiero deduttivo, sotto forma appunto di alberi decisionali e aiuta altresì a rappre-sentare la popolazione di un Algoritmo Gene-tico per l’applicazione di operatori come l’in-crocio. Cosa succede quando si vuole uti-lizzare un linguaggio diverso dal LISP, non funzionale quindi, ma procedurale e/o ad og-getti? La direzione in cui indagheremo è pro-prio questa.

L’idea di Koza

Il problema dell’impilamento dei blocchi ser-ve per sviluppare e verificare metodi di pia-nificazione. Koza per risolvere questo proble-ma utilizzò un insieme di tre terminali e cin-que funzioni. I terminali erano rappresenta-ti da sensori collegati ad una sorta di robot e controllato dal programma LISP. Ognuno di questi sensori rileva un insieme di informa-zioni (Tabella 1).

Le cinque funzioni erano quelle riportate nella Tabella 2.

Considerazioni iniziali

Koza ha sempre scelto la generazione di pro-grammi in LISP. La scelta è in questo caso giustificata: il LISP ha infatti a disposizione un’ampia scelta di primitive che consentono di effettuare operazioni immediate su liste, pile e code con estrema semplicità rispetto ad al-tri linguaggi. Inoltre il LISP consente di rap-presentare le operazioni sotto forma di alberi decisionali, ossia come rappresentazione pa-

Figura 1

PA Restituisce il nome del blocco in cima alla pila, altrimenti, se la pila è vuota, restituisce NIL, il corrispettivo in LISP dell’istruzione null, presente in altri linguaggi.

BS Restituisce il nome del Blocco Superiore Corretto; NIL se non corretto.

PN Restituisce il nome del blocco che è necessario per completare la parola UNIVERSAL; NIL se non è necessario nessun altro blocco.

Tabella 1

Page 32: v2007 05 vbj77

32 VBJ N. 77 - Settembre/Ottobre 2007

INTELLIGENZA ARTIFICIALE

gramma vada fatto “girare” prima di conosce-re la sua Idoneità.

Il resto, come nella PG, in generale segue le regole d’Incrocio, cioè i più idonei vengo-no incrociati tra loro.

I soggetti della popolazione erano rappre-sentati direttamente come espressioni LISP

La generazione della Popolazione partiva da questi due insiemi. Koza generò casualmen-te 300 individui.

L’Idoneità era calcolata in base al numero di casi prova che risultavano impilati in modo corretto.

Ciò implica, in parole povere, che ogni pro-

Figura 2

SP(x) Sposta un blocco x dal tavolo, sulla pila

ST(x) Sposta un qualsiasi blocco x dalla pila al tavolo

RF(espressione1, espressione2) Esegue l’espressione1 finche l’espressione2, un predicato, non restituisce True.

NOT(espressione1) Restituisce True se l’espressione1 è NIL, altrimenti NIL

EQ(espressione1, espressione2) Restituisce True se l’espressione1 e l’espressione2 sono equivalenti, NIL altrimenti.

Tabella 2

Page 33: v2007 05 vbj77

32 VBJ N. 77 - Settembre/Ottobre 2007 33VBJ N. 77 - Settembre/Ottobre 2007

INTELLIGENZA ARTIFICIALE INTELLIGENZA ARTIFICIALE

come e quanto impegnativo e relativamente oneroso sia scrivere queste primitive. Il “pre-mio finale” è comunque allettante.

Come procedere?

Per chi predilige la parte puramente tecni-ca, arriveremo a costruire questa applicazio-ne in C# per .NET Framework 2.0. L’ambiente di sviluppo usato sarà SharpDevelop 2.2, un IDE open source, scaricabile liberamente. Ad ogni modo, andrà bene qualsiasi versione di Visual Studio a vostra disposizione.

Laddove sono presenti diagrammi UML, vi segnalo che sono stati creati con Star UML, un Modeler open source.

I dati per risolvere il problema (l’insieme del-le informazioni e delle funzioni e l’obiettivo)

piuttosto che alberi nelle popolazioni PG clas-siche:

(EQ(ST PA)PN)

Ancora una volta la PG ha entusiasmato per i risultati raggiunti, soprattutto per ciò che concerne la complessità delle soluzioni can-didate e per il fatto che tale complessità au-menti con l’evoluzione, piuttosto che rimane-re prefissata come negli AG classici. Tuttavia le caratteristiche del LISP, che possono esse-re considerate ottimali per le caratteristiche della PG, potrebbero rappresentare proprio una sua limitazione se trasposte in un altro linguaggio di programmazione. Questo pro-blema potrebbe essere risolto scrivendo delle “primitive” ad hoc; il problema è di scrutare

Listato 1

private void MescolaLettere() { for (int i = 0; i < _blocchiLettere.Length; i++) { int tempIdx = _mescolatore.Next(0, _blocchiLettere.Length);

string tmpStr = _blocchiLettere[tempIdx]; _blocchiLettere[tempIdx] = _blocchiLettere[i]; _blocchiLettere[i] = tmpStr; }

}

Figura 3

Page 34: v2007 05 vbj77

34 VBJ N. 77 - Settembre/Ottobre 2007 35VBJ N. 77 - Settembre/Ottobre 2007

INTELLIGENZA ARTIFICIALE INTELLIGENZA ARTIFICIALE

li abbiamo già. Non resta che pianificare la progettazione

di questo software. La nostra ipotesi di partenza è di vedere

qual è il risultato che si può raggiungere, co-struendo delle primitive in C# per risolvere questo problema.

Funzioni e Terminali, specificati in questo problema, non sono altro che funzioni.

L’ assunzione da cui si può partire, ossia la più semplice, è di andare ad implementare delle primitive molto semplici. Tuttavia, pri-ma di effettuare questa operazione, sarà ne-cessario definire la classe che definisce il sog-getto della popolazione e le relative operazio-ni per generare la popolazione.

La classe “soggetto” e la classe “istruzioni”

Prima di analizzare Attributi, Proprietà e Me-todi della classe Soggetto e della classe Istru-zioni, vediamo i relativi Class Diagram per una panoramica più generale (Figura 2 e 3):

Tralasciando attributi, proprietà e meto-di di ordine generale, andiamo ad analizza-re le caratteristiche più salienti della classe Soggetto.

Iniziamo dai costruttori della classe. Il co-struttore parametrico lo tralasciamo perché più semplice. Per ciò che concerne il costrut-tore parametrico, troveremo che esso riceve

in ingresso 3 parametri:

- la lunghezza del programma- l’insieme dei terminali- l’insieme delle funzioni

Ciò è abbastanza semplice da intuire: la lun-ghezza del programma viene selezionata in modo random, dal programma principale, così come l’insieme dei terminali e delle funzioni ha già dimensioni predefinite. Ciò ci dice che ogni soggetto genererà il suo programma in modo autonomo. La prima operazione che il costruttore esegue è un metodo privato, ossia, “MescolaLettere()”. Tale metodo ha l’effetto di effettuare il mescolamento dei blocchi che compongono la parola UNIVERSAL.

Ogni generazione, dunque, mescolerà i bloc-chi da impilare in modo diverso (Listato 1).

Il metodo successivo lanciato dal costrutto-re si occuperà di generare il programma re-lativo ad un determinato soggetto, con i pa-rametri passati al costruttore. Naturalmen-te, l’avvicendarsi tra terminali e funzioni è regolato totalmente da generazioni random (Listato 2).

Noterete che il programma è un Array di tipo Istruzioni. Nello specifico, la classe istru-zioni consente di memorizzare dei parametri che sono, praticamente, dei terminali e/o fun-zioni. In tal modo, sarà possibile eseguire il flusso del programma senza troppe complica-

Figura 4

Page 35: v2007 05 vbj77

34 VBJ N. 77 - Settembre/Ottobre 2007 35VBJ N. 77 - Settembre/Ottobre 2007

INTELLIGENZA ARTIFICIALE INTELLIGENZA ARTIFICIALE

zioni. Per ciò che concerne la classe istruzioni la sua implementazione è abbastanza sempli-ce, come avete potuto già constatare dal suo class diagram.

Infine, il metodo “EseguiProgramma()” ese-gue il programma per il soggetto e produce il risultato in termini di blocchi impilati, che rappresentano la soluzione che il programma stesso è riuscito a risolvere (Listato 3).

Come noterete, al verificarsi di alcune con-dizioni, “EseguiProgramma()”, richiama altri metodi al suo interno, che non sono altro che le primitive di cui avevamo bisogno.

Questa tematica verrà affrontata in modo più approfondito, in quanto dall’ implementazio-ne delle primitive dipende il successo di riso-luzione del problema di pianificazione.

Strategie di definizione delle primitive all’interno della classe soggetto

Probabilmente qualcuno si sarà posto la se-guente domanda: “È possibile scrivere un AG, nell’ambito della PG, che possa scrivere un programma corretto seguendo la logica della scimmia che preme a caso i tasti su una ta-stiera e compone un’opera letteraria?” I risul-tati dicono che ciò è possibile.

Pur pensando o credendo che questi risul-tati siano oltremodo oltraggiosi ed irriveren-ti nei confronti di tutti i nostri anni di studio nel campo dell’ingegneria del software, non è possibile ignorarli.

Tuttavia, il progettista del software ha anco-ra un ruolo: definire le procedure attraverso le quali la “scimmia” possa scrivere il program-

PUNTI DI FORZA PUNTI DI DEBOLEZZA

- Risparmio tempo sulla definizione delle primitive- Realizzo una soluzione comunque robusta

- La soluzione che raggiungo è completa solo al 89% circa

OPPORTUNITA’ MINACCE

- Arrivo ad una soluzione, per approssimazione, pressoché completa

- I presupposti della mia progettazione mi portino su una “strada sbagliata”

Figura 5

Tabella 3

Page 36: v2007 05 vbj77

36 VBJ N. 77 - Settembre/Ottobre 2007 37VBJ N. 77 - Settembre/Ottobre 2007

INTELLIGENZA ARTIFICIALE INTELLIGENZA ARTIFICIALE

ma o l’opera letteraria in modo corretto.Un modo corretto e completo sarebbe di pro-

gettare un parser che ricostruisca il flusso del programma in modo corretto.

Nonostante ciò, le primitive possono essere costruite in modo molto più semplice, ma non solo: il flusso può essere anche considerato come lineare, cioè eseguendo il programma dalla prima istruzione fino all’ultima. Cosa si

perde e cosa si guadagna comportandosi così? Questo comportamento progettuale potrebbe essere riassunto attraverso un quadro di ana-lisi S.W.O.T. (Tabella 3).

Per non lasciare il lettore perplesso e, so-prattutto, per dimostrarvi che il mio ragiona-mento presentato nel quadro S.W.O.T. non è errato, vi mostrerò (solo in parte, per non ro-vinarvi il finale) due condizioni, attraverso le

Listato 2

private void GeneraProgramma(string[] insiemeTerminali, string[] insiemeFunzioni) { _programma = new Istruzioni[_lunghezzaProgramma]; for (int i = 0; i < _programma.Length; i++) {

int tmpSel = _selettoreTF.Next(0,2); if (tmpSel == 1) { int tmpSelT = _selettoreT.Next(0, 2); _programma[i] = new Istruzioni(); _programma[i].Istruzione = insiemeTerminali[tmpSelT];

} else { _programma[i] = new Istruzioni(); int tmpSelF = _selettoreF.Next(0, 4); _programma[i].Istruzione = insiemeFunzioni[tmpSelF]; if (_programma[i].Istruzione == “RF(espressione1, espressione2)”) { int tmpSelP1 = _selettorePar1.Next(0,1); _programma[i].Parametro1 = insiemeFunzioni[tmpSelP1]; int tmpSelP2 = _selettorePar2.Next(0, 2); _programma[i].Parametro2 = insiemeTerminali[tmpSelP2]; }

if (_programma[i].Istruzione == “NOT(espressione1)”) { int tmpSelP1 = _selettorePar1.Next(0, 1); _programma[i].Parametro1 = insiemeFunzioni[tmpSelP1]; }

if (_programma[i].Istruzione == “EQ(espressione1, espressione2)”) { int tmpSelP1 = _selettorePar1.Next(0, 1); _programma[i].Parametro1 = insiemeFunzioni[tmpSelP1]; int tmpSelP2 = _selettorePar2.Next(0, 2); _programma[i].Parametro2 = insiemeTerminali[tmpSelP2]; }

} } }

Page 37: v2007 05 vbj77

36 VBJ N. 77 - Settembre/Ottobre 2007 37VBJ N. 77 - Settembre/Ottobre 2007

INTELLIGENZA ARTIFICIALE INTELLIGENZA ARTIFICIALE

Listato 3

public void EseguiProgramma() { int spostaBloccoDaTavolo = 0; int spostaBloccoDaPila = 0; int maxBlocchi = 8; int minBlocchi = 0; bool _scelta = true; for (int i = 0; i < _programma.Length; i++) { ... if (_programma[i] == “SP(X)”) { SP(ref spostaBloccoDaTavolo, ref spostaBloccoDaPila, ref maxBlocchi); } if (_programma[i] == “ST(X)”) { ST(ref spostaBloccoDaTavolo, ref spostaBloccoDaPila, ref minBlocchi); } ... } }

quali posso sapere che le “cose” sono andate, tutto sommato, bene.

Condizione 1

Faccio girare il mio AG con questi parame-tri :

- popolazione max = 300 individui- fitness bersaglio da raggiungere = 8

Nonostante le condizioni un po’ pretenziose, cioè popolazione esigua e fitness abbastanza alta da raggiungere, questo è il risultato ot-tenuto (Figura 4).

Ossia, in 3 epoche su 1.000 in cui il program-ma ha ciclato, ho ottenuto un certo numero di soggetti che hanno realizzato un program-ma che si è avvicinato alla soluzione di circa il 89%, cioè i programmi relativi ad ogni sog-getto hanno impilato 8 blocchi su 9 corretta-mente. Non male direi.

Condizione 2

- popolazione max = 300 individui- fitness bersaglio da raggiungere = 9

Tuttavia, come avevo già annunciato nel qua-dro S.W.O.T, nel voler raggiungere una fitness bersaglio = 9, con una popolazione di n sog-getto ho raggiunto dei risultati piuttosto scar-si (Figura 5).

Ho ottenuto una fitness pari a 6 ed i pro-grammi sono stati accurati al 67% circa, os-sia, hanno impilato 6 blocchi su 9.

Questo punto è importante, perché in questo modo, che in seguito potrete testare anche voi, so già che il mio programma è in grado di rag-giungere sempre un’accuratezza, al minimo, del 89% circa. Cercheremo, naturalmente, in seguito di migliorare questa prestazione.

Ora, se vi rivelassi che ho raggiunto questi risultati implementando due sole primitive, ci credereste?

Beh! Dovete crederci perché è proprio così.

Page 38: v2007 05 vbj77

38 VBJ N. 77 - Settembre/Ottobre 2007

INTELLIGENZA ARTIFICIALE

Listato 4

private void SP(ref int spostaBloccoDaTavolo,ref int spostaBloccoDaPila,ref int maxBlocchi) { if (spostaBloccoDaTavolo < maxBlocchi) { _blocchiDaImpilare[spostaBloccoDaPila] = _blocchiLettere[spostaBlocco DaTavolo]; spostaBloccoDaPila++; spostaBloccoDaTavolo++; } } private void ST(ref int spostaBloccoDaTavolo,ref int spostaBloccoDaPila,ref int min Blocchi) { if (spostaBloccoDaPila > minBlocchi) { _blocchiDaImpilare[spostaBloccoDaPila] = “”; spostaBloccoDaPila--; spostaBloccoDaTavolo--; } }

Come mai?Per inciso, a mio avviso, le primitive più im-

portanti sono quelle che riguardano lo spo-stamento dei blocchi dal tavolo e, successi-vamente, vengono impilati per formare la pa-rola UNIVERSAL. Due di queste, tra quelle che troverete nel codice sorgente, sono SP() e ST() (Listato 4).

Per fare una digressione sulla “scimmia”, menzionata precedentemente, i risultati rag-giungibili sono molto alti, seppur semplifica-ti. Nonostante la nostra ricerca in questo ar-ticolo sia focalizzata sullo scrivere delle pri-mitive in C#, che emulino il comportamento delle primitive in LISP, in realtà il meccani-smo più grande lo gioca proprio l’ AG stesso. Naturalmente, se le primitive sono progetta-te ed implementate bene, allora tutto andrà “per il verso giusto”.

Conclusioni

In questa prima parte abbiamo analizzato alcune tematiche per risolvere questo pro-blema. I primi risultati sono stati abbastan-za promettenti.

Nella seconda parte analizzeremo la per-

formance globale di tutto l’algoritmo rispet-to alle primitive delineate, per vedere se, e soprattutto quanto, ci siamo avvicinati al no-stro obiettivo.

Bibliografia

[1] Genetic Programming Foundation – “http://www.geneticprogramming.org”

[2] Fabio Fabozzi – “Predizione di flussi dati in sistemi caotici attraverso gli algoritmi ge-netici”, Computer Programming, Febbraio 2006, Gruppo Editoriale Infomedia

[3] Fabio Fabozzi – “Intelligenza Artificiale con Visual Basic”, Dicembre 2004, Gruppo Ed-itoriale Infomedia, ISBN 8881500183

[4] Fabio Fabozzi – “Programmazione Genetica in Visual Basic”, VBJ n°50, Marzo/Aprile 2003, Gruppo Editoriale Infomedia

[5] Melanie Mitchell – “Introduzione agli Al-goritmi Genetici”, Apogeo Scientifica, 1998, ISBN 8873035000

[6] Kenneth Lange – “Mathematical and Statistical Methods for Genetic Analysis” Springer, 1997, ISBN 0387949097

[7] Ilya Prigogine – “Le Leggi del Caos”, Laterza Editore

Page 39: v2007 05 vbj77
Page 40: v2007 05 vbj77

40 VBJ N. 77 - Settembre/Ottobre 2007 41VBJ N. 77 - Settembre/Ottobre 2007

OFFICE OFFICE

Creare un controllo utente tramite Visual Studio Tools for Office

di Emanuele Mattei

Con questo articolo proseguiamo la programma-zione Microsoft Office 2003 tramite Visual Studio Tools for Office, iniziata in precedenza. In partico-lare vedremo come aggiungere un controllo perso-nalizzato per la formattazione del testo in Microsoft Word 2003. Il controllo avrà il compito di impostare il testo nel documento con la formattazione di tipo grassetto, corsivo o di colore rosso.

Aggiunta del controlloSi crea un nuovo progetto per Office selezionan-

do nella finestra dei modelli di Visual Studio 2005 il modello denominato “Documento di Word”; verrà aperta una finestra che chiede se creare un nuovo documento o utilizzarne uno esistente, nel nostro caso si crea un nuovo documento.

A questo punto viene aperto l’ambiente di sviluppo con l’in-terfaccia simile ad un documen-to Word (come illustrato nel pri-mo articolo); dal menu di scelta rapida (tasto destro del mouse sul nome della soluzione appe-na creata) selezionare la voce di menu “controllo utente”, situa-ta sotto la voce “aggiungi” (Fi-gura 1).

Verrà aperta una finestra, (Figu-ra 2) in cui è possibile impostare il nome del controllo utente (es. UserFormattazione); dopo aver impostato il nome e cliccato sul pulsante “Ok” della finestra, ver-rà inserito nel progetto un user-control. Inserite tre controlli che-ckbox, ed impostate le proprie-tà “Name” rispettivamente con il valore “chkgrassetto”, con il va-

In questo articolo vedremo come creare un controllo personalizzato in am-biente Office utilizzando la tecnologia .NET

Emanuele Mattei è sviluppatore presso una società d’infor-matica di Roma. Attualmente collabora con altri webmaster al sito www.shareoffice.it il primo usergroup italiano dedicato alla programmazione di office, tramite la tecnologia .NET. Può essere contattato all’indirizzo email [email protected]

Page 41: v2007 05 vbj77

40 VBJ N. 77 - Settembre/Ottobre 2007 41VBJ N. 77 - Settembre/Ottobre 2007

OFFICE OFFICE

C#

//se il checkbox è spuntato rendo il testo

(i primi 5 caratteri) in grassetto

if (chkGrassetto.Checked ==

CheckState.Checked)

{

for (int i = 1; i <= 5; i++)

{

Globals.ThisDocument.Characters[1].

Font.Bold = true;

}

}

else //tolgo il grassetto dal testo

{

for (int i = 1; i <= 5; i++)

{

Globals.ThisDocument.Characters[1].

Font.Bold = false;

}

}

Con lo stesso metodo è possibile rendere il testo in corsivo (oppure sottolineato o barra-to, ecc.) semplicemente sostituendo la pro-prietà appropriata (ad esempio Italic) alla proprietà Bold.

lore “chkcorsivo” e l’ultimo con il valore “chkrosso”, mentre per la proprietà “text”, impostate per il primo il valore “Grassetto”, il se-condo con il valore “Corsivo” ed il terzo con il valore “Rosso”. L’aspet-to del controllo dev’essere simile a quello mostrato in Figura 3.

Stesura del codiceDopo aver predisposto con le do-

vute formattazioni il nostro user control, facciamo doppio click sul controllo checkbox, denomi-nato “chkgrassetto”, in modo da passare in visualizzazione codi-ce, e più precisamente nell’even-to CheckedChanged del controllo selezionato.

Questo evento viene eseguito nel momento in cui si fa click sul controllo che-ckbox, per mettere o togliere la spunta dalla casella. In tale evento inseriamo il codice che permette di impostare il testo (in modo gra-duale) in grassetto. In particolare tramite la proprietà Font della proprietà Characters im-postiamo le dovute formattazioni al testo, in questo caso in grassetto tramite la proprietà “bold”. Il codice dev’essere simile a quello riportato qui di seguito.

VB.NET

‘se il checkbox è spuntato rendo il testo

(i primi 5 caratteri) in grassetto

If chkGrassetto.Checked = CheckState.Checked

Then

For i As Integer = 1 To 5

Globals.ThisDocument.ActiveWindow.

Document.Characters(i).Font.Bold = True

Next

Else ‘tolgo il grassetto dal testo

For i As Integer = 1 To 5

Globals.ThisDocument.ActiveWindow.

Document.Characters(i).Font.Bold = False

Next

End If

Figura 1 La voce di menu controllo utente per inserire il controllo

Page 42: v2007 05 vbj77

42 VBJ N. 77 - Settembre/Ottobre 2007 43VBJ N. 77 - Settembre/Ottobre 2007

OFFICE OFFICE

Ritorniamo in visualizzazione designer, e fac-ciamo doppio click sul terzo ed ultimo con-trollo checkbox, quello per l’impostazione del colore del testo. Tramite la sotto-proprietà Co-lor della proprietà Font, possiamo impostare il colore del carattere. Di seguito si riporta un esempio di codice per impostare i primi 5 ca-rattere di colore rosso.

VB.NET

‘se il checkbox è spuntato rendo il testo

(i primi 5 caratteri) in rosso

If chkRosso.Checked = CheckState.Checked Then

For i As Integer = 1 To 5

Globals.ThisDocument.ActiveWindow.

Document.Characters(i).Font.Color =

Word.WdColor.wdColorRed

Next

Else ‘tolgo il grassetto dal testo

For i As Integer = 1 To 5

Globals.ThisDocument.ActiveWindow.

Document.Characters(i).Font.Color =

Word.WdColor.wdColorAutomatic

Next

End If

C#

//se il checkbox è spuntato rendo il testo

(i primi 5 caratteri) in rosso

if (chkRosso.Checked == CheckState.Checked)

{

for (int i = 1; i <= 5; i++)

{

Globals.ThisDocument.Characters[1].

Font.Color = Word.WdColor.wdColorRed;

}

}

else //tolgo il grassetto dal testo

Figura 2 La finestra di dialogo per impostare il nome del controllo utente

I controlli personalizzati possono aiutare il pro-

grammatore ad ampliare la vasta gamma della

classi e controlli forniti da Microsoft Visual Studio

Tools for Office

Page 43: v2007 05 vbj77

42 VBJ N. 77 - Settembre/Ottobre 2007 43VBJ N. 77 - Settembre/Ottobre 2007

OFFICE OFFICE

re in un progetto per Microsoft Office 2003 un controllo personalizzato, un semplice controllo per la formattazione del testo. L’articolo ha volu-to introdurre il lettore alla creazione di controlli personalizzati in ambiente Microsoft Office 2003; i controlli personalizzati possono aiutare il pro-grammatore ad ampliare la vasta gamma della classi e controlli forniti da Microsoft Visual Stu-dio Tools for Office. Sul sito FTP di Infomedia (ftp://ftp.infomedia.it/pub/VBJ/Listati/) trovate il codice sorgente dell’applicazione.

{

for (int i = 1; i <= 5; i++)

{

Globals.ThisDocument.Characters[1].

Font.Color = Word.WdColor.wdColorAutomatic;

}

}

Una volta scritto il codice occorre compila-re: dal menu “Genera” selezioniamo la voce di menu “Genera soluzione”; se apriamo il progetto VSTO troviamo nella barra degli strumenti il nostro usercontrol appena crea-to, come mostrato in Figura 4.

Esecuzione del codiceA questo punto occorre verificare ed eseguire

il nostro progetto; restando in visualizzazione Word, digitiamo nel documento la parola “Pro-va” ed al termine facciamo doppio click sul pul-sante invio della tastiera, a questo punto inse-riamo il nostro user control.

Fatto ciò, tramite il menu “debug” selezionia-mo la voce “Avvia debug” (oppure direttamen-te con il pulsante F5 della tastiera) verrà aperto un documento Microsoft Word con il controllo personalizzato: se facciamo click nei vari che-ckbox il testo inserito precedentemente verrà formattato.

ConclusioniIn questo articolo abbiamo visto come inseri-

Figura 4 La barra degli strumenti con il controllo utente personalizzato

Figura 3 L’aspetto del controllo utente che stiamo realizzando

Page 44: v2007 05 vbj77

44 45N. 77 - Settembre/Ottobre 2007 VBJVBJ N. 77 - Settembre/Ottobre 2007

OFFICE OFFICE

Utilizzare una fonte dati da VSTO

di Emanuele Mattei

In questo articolo vedremo come collegare una fonte dati – più precisamente un database creato con Microsoft Access 2003 – ad un foglio di Excel, utilizzando la tecnologia Visual Studio Tools for Of-fice, in modo del tutto visuale.

Creazione della base datiAi fini del nostro esempio, si crei un nuovo da-

tabase in Microsoft Access, con le tabelle Settore e Prodotto.

Nella tabella Settore si creino quattro campi:

• idsettore, di tipo chiave e contatore;

• descrizione, di tipo testo;

• reparto, di tipo testo;

• piano, di tipo numero.

La tabella Prodotto avrà quat-tro campi:

• idprodotto, di tipo contatore e chiave,

• idsettore, di tipo numerico ed in relazione con il campo id-settore della tabella Settore;

• prezzo, di tipo valuta (euro);

• nome, di tipo testo.

Una volta create le tabelle e le relazioni, e valorizzate con i dati, possiamo passare a Visual Stu-dio 2005.

In questo articolo vedremo come creare uno Smart Tag in ambiente Office utilizzando la tecnologia .NET

Emanuele Mattei è sviluppatore presso una società d’infor-matica di Roma. Attualmente collabora con altri webmaster al sito www.shareoffice.it il primo usergroup italiano dedicato alla programmazione di Office, tramite la tecnologia .NET. Può essere contattato all’indirizzo email [email protected]

Page 45: v2007 05 vbj77

44 45N. 77 - Settembre/Ottobre 2007 VBJ

OFFICE OFFICE

sta che fare click sul pulsante Test connessio-ne per verificare che tutto sia corretto e poi sul pulsante Ok.

A video verrà visualizzato un messaggio che ci chiede se vogliamo salvare una copia del database nella cartella output, selezioniamo il

pulsante Si, per avere tutti i file in un’uni-ca cartella.

Nella finestra successiva verranno visua-lizzate le tabelle del nostro database; se-lezionare la tabella Settore e selezionarne tutti campi, mentre per la tabella Prodotti selezioniamo tutti i campi Prezzo ad esclu-sione del campo IdProdotto, come mostrato in Figura 3. A questo punto fate click sul pulsante Fine.

Impostare l’ambienteAl termine del wizard, nella barra origini

dati troveremo un dataset, contenente due tabelle; selezioniamo il campo descrizione della tabella Settore; nella casella di riepilo-go selezioniamo l’impostazione combo-box, e trasciniamo il controllo nel foglio Excel. Due righe sotto, scriviamo nella prima co-lonna (cella A8) il testo “Nome prodotto” e nella successiva cella (B8) trasciniamo,

Creazione del progetto e collegamento al database

Si apra Visual Studio 2005, dal menu File selezioniamo Nuovo pro-getto, nella parte indicante i tipi di progetto selezioniamo Office, e tra i modelli messi a disposizione sele-zioniamo quello con la voce Cartel-la di Lavoro Excel. Nella finestra ci verrà chiesto se vogliamo crea-re un nuovo documento o copiarne uno esistente, lasciamo l’opzione su Crea nuovo documento.

Verrà aperto l’ambiente di svilup-po con l’interfaccia di Microsoft Excel, dal menu selezioniamo la voce dati, e poi la voce Aggiungi nuova origine dati. Nella finestra che viene aperta (Figura 1) sele-zionare la voce Database, fate cli-ck sul pulsante Avanti. Nella fine-stra successiva fate click sul pulsante Nuova connessione, e dalla finestra che viene aperta (Figura 2) selezionare come origine dati il file database Microsoft Access, mentre tramite il pulsante Sfoglia ricercare il database Access creato in precedenza; a questo punto non re-

Figura 1

Figura 2

Page 46: v2007 05 vbj77

46 VBJ N. 77 - Settembre/Ottobre 2007

OFFICE

dalla barra Origine dati, la casella denomina-ta “Nome della tabella prodotto”, situata sot-to la tabella Settore; nella successiva colonna (cella C8) scriviamo il testo “Prezzo” e nel-la successiva cella di destra (D8) inseriamo, dalla barra origine dati, il campo Prezzo della tabella Prodotto. L’aspetto dev’essere simile a

quello mostrato in Figura 4.Così ad ogni cambiamento nella

combo-box, verranno modificati i valori degli altri campi.

Effettuare delle proveDopo aver impostato i vari cam-

pi, non resta che eseguire il pro-getto, tramite il pulsante F5: avvia-mo il programma, e nel selezionare le varie voci della combo-box, ve-dremo cambiare i valori nelle va-rie caselle.

ConclusioniIn questo breve articolo abbiamo

visto come tramite la tecnica del data binding si possono gestire i dati di un database in un foglio Excel senza ricorrere alla stesura di codice. Le funzionalità offerte

dal nuovo ambiente di sviluppo Visual Studio Tools per Office permettono agli sviluppatori di creare potenti applicazioni per il pacchetto Microsoft Office 2003 con semplicità. Sul sito ftp di Infomedia (ftp://ftp.infomedia.it/pub/) trovate il codice sorgente dell’applicazione.

Figura 3

Figura 4

Page 47: v2007 05 vbj77
Page 48: v2007 05 vbj77

Prodotti & News

48 VBJ N. 77 - Settembre/Ottobre 2007

Prodotti & News

49N. 77 - Settembre/Ottobre 2007 VBJ

È online l’osservatorio sulla sicurezza informatica È on-line da Ottobre il sito internet dell’Osservatorio Nazionale per la Sicurezza Informatica. L’indirizzo è www.osservatoriosicurezzainformatica.org e sarà uno strumento in più che l’Osservatorio metterà a disposizione di aziende, navigatori, giornalisti, per conoscere meglio le questioni inerenti alla sicurezza in-formatica, alla tutela della privacy on line, alla sicurezza nelle comu-nicazioni cellulari e wifi, alle truffe che utilizzano internet.

“Il nostro Osservatorio è attivo da ormai un anno ed ha ottenuto non pochi riconoscimenti al proprio lavoro. Abbiamo messo a dispo-sizione dei media e dei cittadini importanti dati ed informazioni, contribuendo a sensibilizzare gli utenti delle nuove tecnologie e quindi prevenire tentativi di truffa o di incursione nei sistemi infor-matici di aziende e privati. – ha dichiarato Mirko Gatto della Yarix srl – Inseriremo sul nostro sito gli interventi ed i dati delle nostre ricerche che saranno a disposizione gratuitamente, costituendo piano piano una vera banca dati on-line che potrà fornire una informazione corretta sui vari aspetti legati alla sicurezza informatica.

Ad esempio uno degli ultimi studi che abbiamo divulgato, sui ten-tativo di incursione provenienti dalla Cina per inserirsi sui segreti aziendali di imprese italiane, ha permesso a molti di conoscere questo fenomeno e di correre ai ripari per non essere più esposti al rischio. In questo modo abbiamo contribuito concretamente a far crescere la consapevolezza di molti imprenditori.”.

Sul sito saranno attivati nei pros-simi mesi anche alcuni servizi per i navigatori: fin da subito è pos-sibile attraverso il sito segnalare casi “dubbi” di phishing: gli esperti del’Osservatorio risponderanno in breve tempo a tutti.

Antec presenta una nuova linea di prodotti a risparmio energetico

La certificazione 80 PLUS® è un inno-vativo programma nord americano di incentivi che ha lo scopo di integrare i computer da tavolo e i server con ali-mentatori più efficienti dal punto di vista del consumo energetico. Infatti, la maggior parte degli alimentatori ha un’efficienza massima del 60-70%, e perde dal 30% al 40% dell’energia che consuma. La certificazione 80 PLUS® invece assicura un’efficienza minima pari all’80%, riducendo almeno della metà la dispersione di energia e fa-cendo così risparmiare sui costi della bolletta elettrica, della manutenzione del computer e del raffreddamento. I nuovi case di Antec costituiscono dunque un ottimo punto di parten-za per la realizzazione dei sistemi conformi al programma statunitense Energy Star 4. Per maggiori informazioni sul pro-gramma Energy Star dell’UE, visitare il sito www.eu-energystar.org/it/index.html

I modelli della serie New Solutions che sono stati aggiornati includo-no: NSK1380, NSK1480, NSK2480, NSK3480, NSK4480, NSK4480B (nero) e NSK6580. Il NSK1380, un case microATX dal design estrema-mente compatto, può essere utilizza-to sia come computer da tavolo che come postazione mobile per giochi. Il NSK2480 è un case microATX per computer da tavolo, mentre il NSK1480 è un case per media center di fascia economica. Il NSK3480 è una mini torre per PC da tavolo equi-paggiato per schede madri microATX. Infine i modelli NSK4480, NSK4480B e NSK6580 offrono gli standard di un case ATX, in piccolo e medio formato.L’intera gamma di case New Solution è dotata di alimentatori certificati 80 PLUS®, ed è già disponibile presso i maggiori rivenditori, e-tailer e di-stributori, ad un prezzo che va dai 49,00€ ai 114,00€. Antec fornisce una garanzia di qualità di 3 anni sia ai prodotti che a tutti gli accessori.Per ulteriori informazioni visitare il sito www.antec.com.

Serena migliora il Change Management Serena Software ha presentato Serena® Dimensions® Express™, strumento SCM (software configu-ration management) leggero per sviluppatori, con caratteristiche pre-stazionali e funzionali pacchettizzate in modo tale da facilitarne l’utilizzo e la messa in produzione. È basato sulla tecnologia Serena Dimensions 10 che ne facilita l’implementazione e l’adozione rapida.Gli sviluppatori, in particolare i team di sviluppo piccoli e agili, devono po-tere trovare un equilibrio tra imple-mentazione rapida e usabilità da un lato, e controllo e gestione dall’altro: Serena Dimensions Express risponde a queste esigenze. Dimensions Express fornisce capacità di livello enterprise senza penalizzare la facilità d’uso. Gli utenti hanno i vantaggi del supporto nativo del-la piattaforma per il repository o workspace che preferiscono, del-l’integrazione nativa con gli IDE più importanti e di una terminologia coerente e standard. L’integrazione IDE è profonda, ma non invasiva. Gli strumenti di Configuration Manage-ment e di controllo delle versioni di cui gli sviluppatori hanno bisogno sono parte integrante dell’interfaccia IDE. Mentre gli sviluppatori appor-tano variazioni al codice sorgente, Dimensions Express traccia, autentica e gestisce il controllo delle versioni così che, in caso di necessità, possano tornare facilmente alla configurazio-ne precedente. Gestire i team di sviluppo e le va-riabili di progetto è molto difficile, virtualmente impossibile senza stru-menti adeguati. Il supporto completo allo sviluppo in parallelo reso possi-bile da Dimensions Express elimina le complessità, in quanto fornisce branching e merging a livello di item e di progetto. Dimensions Express è fatto per essere implementato e messo in produzione in modo veloce e facile. La confi-gurazione out-of-the-box segue un modello di processo testato e basato su best practice. I clienti possono implementare il prodotto con assi-

Page 49: v2007 05 vbj77

Prodotti & News

48 VBJ N. 77 - Settembre/Ottobre 2007

Prodotti & News

49N. 77 - Settembre/Ottobre 2007 VBJ

stenza remota all’installazione o con consulenza on-site, per un servizio più completo e personalizzato.Gli sviluppatori vogliono strumenti con le migliori prestazioni e Dimen-sions Express è all’altezza delle aspet-tative: è costruito su una architettura altamente scalabile con prestazioni senza precedenti in reti LAN e WAN. Spesso le aziende hanno bisogno di un approccio evolutivo e incremen-tale per implementare l’Applica-tion Lifecycle Management (ALM). Dimensions Express fornisce un elemento centrale dell’ALM – il sof-tware di Configuration Management avanzato - come capacità standalone. Le aziende possono quindi far fronte a esigenze immediate e allo stesso tempo essere pronte ad assumere un approccio più olistico e completo in caso di future necessità. Dimensions Express è già disponibile. Maggiori informazioni sono disponi-bili al sito www.serena.com.

Samplitude Music Studio 2008: Home-Recording professionale I prodotti della serie Samplitude di MAGIX si distinguono per la qualità del suono e le numerose opzioni per l’elaborazione Audio & MIDI. Alla già ampissima gamma di prodotti, si ag-giunge ora Samplitude Music Studio 2008. Il nuovo nato della famiglia Samplitude stupirà il pubblico con tante nuove funzioni: Hybrid Audio Engine, modalità di lavoro orientata all’oggetto, registrazione multitrac-cia, nuovi strumenti Vital ed automa-zioni per gli effetti. Samplitude Music Studio 2008 è disponibile nei migliori negozi a soli 99,99 €.

Il nuovo motore del software di produzione musicale più venduto* unisce tutte le fasi del lavoro in un’ unica interfaccia: dalla registrazione all’arrangiamento, l’elaborazione, il mixaggio, per terminare con la ma-sterizzazione. Questo motore offre una latenza minima con massimo rendimento. I brevi tempi di calcolo degli effetti della traccia facilitano, per esempio, il controllo della registrazione multi-

traccia dal vivo. Inoltre, la Samplitu-de Playback Engine, rende possibili delle azioni che necessitano un alto rendimento del sistema come l’ap-plicazione degli effetti agli oggetti. Samplitude Music Studio 2008 offre poi una totale neutralità del suono, caratteristica tipica delle console high-end analogiche. Samplitude Music Studio 2008 non lascia soli gli user che non dispongo-no di strumenti analogici: ai cinque Vital instruments di Yellow Tool già inclusi, si aggiungono adesso i nuovi “E-Guitar”, “Power Chords”, “Electric-Guitar” e le “Soundtrack Percussion”. Questi possono essere suonati con la tastiera del PC o quella MIDI produ-cendo un suono assolutamente neu-trale. Gli strumenti virtuali a corda e i fiati sono degni di una grande orchestra. Il nuovo sintetizzatore analogico polifonico “Revolta 2” crea tutti i suoni adeguati a tutti i tipi di musica elettronica.L’automazione migliorata degli effetti permette di ottimizzare i parametri VST, volume e panorama, attraverso il disegno diretto della curva del-l’automazione sulla traccia. Questa funzione può essere utilizzata, per esempio, per controllare l’eco in un luogo preciso. Gli strumenti VST multicanale, che possono scrivere i MIDI-Events su fino a 16 canali, sono compatibili con il VST Multiout. Il Cotroller-Hardware, infine, garanti-sce un effetto studio perfetto.MAGIX non si dimentica nemmeno di coloro che iniziano solo adesso ad utilizzare Music Studio. Grazie ai nuovi elementi di controllo e alle diverse modalità di visualizzazione, è molto semplice trovare cìò che si sta cercando. Con le pratiche cinque preconfigurazioni di divisione dello schermo, lo user non perderà mai la panoramica sul progetto; se poi ne-cessitasse di aiuto per le proprie pro-duzioni musicali, trova le risposte e le soluzioni nella nuova infoCommunity multimediale alla quale si accede di-rettamente dal programma.

* Si riferisce ai prodotti software venduti al dettaglio secondo il rile-vamento mensile di Media Control Germania (PC/CD-ROM non-games D secondo i criteri del VUD); GfK Chart

Paesi Bassi, Belgio, Francia, Spagna; Chart Track UK; NPD Data Charts PC/CD-ROM non-games USA. Gen-naio-Luglio 2007.

FileMaker lancia un nuovo sito web per il settore Education

FileMaker, Inc., produttore del po-polare software database FileMaker Pro, ha realizzato un nuovo micro-sito Education (www.filemaker.it/education) per aiutare docenti, studenti, ricercatori e personale scolastico-amministrativo a gestire efficacemente i propri dati e le in-formazioni.Presente nel settore Education da oltre 20 anni, FileMaker si adatta ai bisogni e alle esigenze di ciascuno dei suddetti soggetti del mondo scolasti-co sviluppando soluzioni specifiche quali, ad esempio, il Campus Produc-tivity Kit, appositamente studiato per gli studenti.Sono centinaia gli insegnanti e i direttori scolastici che quotidiana-mente utilizzano FileMaker Pro per raccogliere le informazioni sugli stu-denti, organizzare le proprie lezioni o gestire progetti e materiale a propria disposizione.All’interno del nuovo micro-sito dedicato, FileMaker offre numerose risorse centralizzate volte a supporta-re chi opera nel mondo della Scuola, siano essi utenti esperti oppure prin-cipianti, ad ottimizzare l’utilizzo del proprio software database FileMaker.

Tra le nuove risorse, FileMaker lancia una newsletter a cadenza trimestra-le.Oltre a presentare le ultime novità di prodotto, consigli e suggerimenti ed offerte speciali, le newsletter FileMaker Education proporranno la testimonianza di diversi attori del sistema scolastico che hanno volutotrasmettere e condividere la propria esperienza di utilizzo del software FileMaker nelle proprie attività quo-tidiane. L’iscrizione alla newsletter FileMaker Education è gratuita e può essere effettuata all’indirizzowww.filemaker.it/education

Page 50: v2007 05 vbj77

.NET TOOLS

50 N. 77 - Settembre/Ottobre 2007

.NET TOOLS

51N. 77 - Settembre/Ottobre 2007

Refactor! per C++ Visual Studio .NET 2005

di Raffaele Di Natale

Un add-in indispensabile per effettuare il Refactoring di progetti C++ in ambiente

VS.NET 2005

“Refactor!” è stata con ogni probabilità l’escla-mazione di tanti programmatori che, lavorando ad un progetto in C#, hanno riscontrato la presenza di una serie di funzionalità di refactoring integra-ta nell’IDE. Successivamente, gli stessi program-matori, passati poi ad un progetto C++ nel me-desimo IDE, si sono domandati “Refactor?”. Sì, perché con grande sorpresa il bel menu che cam-peggiava prima nel progetto C# è sparito una vol-ta aperto quello C++.

IntroduzioneCitando Martin Fowler [1], uno dei massimi

esperti in questo ambito, il refactoring è una tec-nica utilizzata per migliorare il design di una base esistente di codice. La sua essenza consiste nel-l’applicazione di una serie di piccole trasformazio-ni che, preservando comunque il comportamento dell’applicazione, non risultano singolarmente im-portanti. Tuttavia l’effetto cumulativo di ciascuna di queste trasformazioni è abbastanza significati-vo per l’intero progetto. Inoltre, l’applicazione di tecniche di refactoring consente di ristrutturare il progetto software pur garantendo la sua con-sistenza. È vero però che il refactoring manuale e non assistito potrebbe farci incappare in errori ed è per questo che risulta quasi indispensabile avere a disposizione un tool che in maniera au-tomatica estende su tutto il progetto i piccoli ag-giustamenti che apportiamo.

VS. Net 2005 & C++ & RefactoringCome accennato, la mancanza di un supporto al

refactoring per i progetti C++ è apparso striden-te a tanti: un disallineamento inaspettato. Come è stato evidenziato in altre occasioni [2], la Micro-soft, in questi casi di “assenza di soluzione”, è so-lita consigliare nei propri siti tool gratuiti presenti sul mercato. Così, anche in questo caso, all’indiriz-zo [3] Microsoft suggerisce l’utilizzo di Refactor! riassumendone le funzionalità con annessa spie-gazione del perché di questo approccio.

Download ed installazioneRefactor! si presenta come un add-in per Visual

Studio .Net 2005. Può essere scaricato gratuita-mente dal sito [4] e successivamente installato. L’effettivo successo dell’installazione sarà evi-denziato sia dalla presenza del logo del tool nel-lo splash-screen di avvio di Visual Studio, sia ac-cedendo all’Add-in Manager (menu Tools/Add-in Manager) di VS.

La famiglia Refactor!Refactor! per C++ appartiene ad una suite di

applicazioni denominate IDE Productivity Tools sviluppata da Developer Express [5] e pensata per il refactoring di progetti in ambiente Visual Stu-dio .NET 2005. Alla versione per C++ si aggiun-gono quella per ASP .NET e per Visual Basic. Ol-tre alle suddette versioni gratuite sono disponi-bili le più complete versioni Pro, a pagamento. Refactor! non può essere installato nelle versio-ni Express Edition di Visual Studio.

Refactoring PatternIl refactoring o, in altre parole, il consolidamen-

to del codice esistente, è un’attività basata su pic-cole operazioni di “lifting” del codice. Così come l’applicazione di tecniche e modelli nello svilup-po del codice ha portato alla definizione dei “De-

Page 51: v2007 05 vbj77

.NET TOOLS

50 N. 77 - Settembre/Ottobre 2007 51

.NET TOOLS

N. 77 - Settembre/Ottobre 2007 VBJ

sign Pattern”, allo stesso modo nell’ambito del re-factoring si sono affermate delle tecniche poi rag-gruppate sotto il nome di “Refactoring Pattern”. È chiaro che, per ovvie ragioni, un tool di refacto-ring che si rispetti deve per forza confrontarsi con tali pattern. Ovviamente non tutti i pattern de-vono per forza essere gestiti, ma di certo un tool deve garantire un supporto per quelli più utiliz-zati ed efficaci. Di seguito si elencano due esem-

pi di categorie di refactoring pattern, con relativo refacto-ring pattern e riferimento alla funzionalità del tool:

§ Composing Methods, tra cui RefactoringExtractMethod (Ex-tract Method di Refactor!);

§ Organizing Data, tra cui Re-factoringEncapsulateField (En-capsulate Field di Refactor!);

In Tabella 1 sono presenti le funzionalità di refactoring di Refactor! con relativa descri-zione. Per un completo ed ag-giornato elenco di Refactoring Pattern, si consiglia una lettura del sito [6], mentre per una det-

tagliata lista di tool di refactoring per tutti i lin-guaggi di programmazione visitate [7].

Confronto col refactoring standard VS.NET 2005

In Figura 1 è possibile osservare il menu rela-tivo alle funzioni di Refactor! per progetti C# in ambiente VS.NET 2005. Le funzionalità suppor-tate sono:

Refactoring Descrizione

Add Block Delimiters Inserisce {} in corrispondenza di un’istruzione

Case to Conditional Trasforma una sequenza di case ad una di if

Conditional to Case Effettua l’operazione inversa alla precedente

Create Overload Crea un overload per il metodo selezionato

Encapsulate Field Incapsula un campo esponendolo mediante get/set

Extract Function (outside of class) Estrae una funzione all’esterno di una classe

Extract Method Crea un metodo della classe a partire dal blocco di codice selezionato.

È possibile inoltre fissarne la posizione all’interno della classe.

Introduce Constant Introduce una costante

Move Method to Header Sposta il metodo nell’header

Move Method to Source File Sposta il metodo nel file sorgente

Remove Block Delimiters Rimuove le {} nei casi non necessari

Rename Rinomina un oggetto, una funzione, un metodo

Reorder Parameters Riordina i parametri

Reverse Conditional Inverte la logica di una condizione e scambia il blocco if con il blocco else

Simplify Expression Semplifica un’espressione che fa uso

Widen Scope Promuove una variabile locale a variabile membro

Funzioni di refactoring di Refactor! per C++Tabella 1

Il menu “Refactor” standard di Visual Studio .Net 2005Figura 1

Page 52: v2007 05 vbj77

52

.NET TOOLS

VBJ N. 77 - Settembre/Ottobre 2007 53

.NET TOOLS

N. 77 - Settembre/Ottobre 2007 VBJ

1. Rinominare una funzione, una variabile…2. Estrazione di un metodo;3. Incapsulamento di un campo pubblico;4. Estrazione dell’interfaccia;5. Promozione di una variabile locale a parame-

tro;6. Rimozione di parametri;7. Ordinamento dei parametri.

Da un semplice confronto con la Tabella 1 si può notare che, ad eccezione della 4 e della 6, tutte le voci sono supportate anche da Refactor!

Refactor! e l’IDE VS.NET 2005Refactor! per C++ è perfettamente integrato

nell’ambiente VS.NET 2005 e l’utilizzo richia-ma per molti aspetti quello standard dei proget-ti C#. Rispetto a quest’ultimo, Refactor! usa un po’ di grafica in più per facilitare le scelte del-l’utente, mostrando in anteprima l’effetto del re-

factoring corrente (ad esempio la semplifica-zione di un’espressio-ne, oppure l’estrazio-ne di un metodo), sen-za però risultare mac-chinoso. La regola per utilizzare al massimo Refactor! è molto sem-plice: bisogna pensa-re a quale refactoring applicare e di conse-guenza quale porzione di codice dovrà esse-re influenzata da tale cambiamento. Succes-sivamente, la sempli-ce pressione del tasto destro del mouse sul codice selezionato ci permetterà di accede-re alla voce di menu “Refactor!” che elen-cherà i refactoring di-sponibili per la sele-zione in corso.

Un esempio

Un’applicazione interessante di Refactor! è sen-za dubbio l’estrazione di un metodo a partire da un blocco di codice esistente. In Figura 2 si può notare come, in seguito alla pressione del tasto destro del mouse in prossimità di un blocco di codice precedentemente selezionato (che si vuo-le spostare a livello di funzione membro di una classe), venga suggerito il nome della funzione e i rispettivi parametri; successivamente, sarà pos-sibile stabilire la posizione della funzione all’in-terno della dichiarazione della classe.

Conclusioni I tempi stringenti nella consegna di progetti sof-

tware, ovvero ritardi negli stati di avanzamento dovuti ai problemi più disparati, portano spesso i programmatori a scrivere codice efficace e maga-ri non eccessivamente “pulito”. Un progetto che deve essere gestito per più anni, e non quindi un

Estrazione di un metodo mediante Refactor!Figura 2

Page 53: v2007 05 vbj77

52

.NET TOOLS

VBJ N. 77 - Settembre/Ottobre 2007 53

.NET TOOLS

N. 77 - Settembre/Ottobre 2007 VBJ

ProdottoRefactor! per C++

Url di riferimento http://www.devexpress.com/Products/NET/IDETools/RefactorCPP/

Stato Releasev. 2.5.4

Semplicità d’uso ªªªªªPerfettamente integrato con l’IDE

Utilità ªªªªªChi esegue ordinariamente il refactoring di progetti software in C++ trova in questo add-in una soluzione ad un’evidente lacu-na dell’IDE

Qualità prodotto ªªªªª Non sono stati riscontrati problemi degni di nota

Qualità documentazione ªªªª²In lingua inglese, qualche esempio in più aiuterebbe i neofiti del refactoring

Internet Explorer Developer Toolbar

di Fabio Perrone

Uno strumento per comprendere a fondo le applicazioni web

Per comprendere più a fondo le applicazioni web che ognuno di noi scrive, o semplicemente come strumento di apprendimento per carpire i “segreti” di pagine web scritte da terzi, la Deve-loper Toolbar di Internet Explorer si può rivela-re uno strumento alquanto soddisfacente. Fino-ra uno strumento simile era presente soltanto per il browser Firefox con l’add-in Firefox Web Deve-loper Extension, già recensito in passato su que-sta rivista.

Grazie infatti alle sue molteplici caratteristiche, tra le quali l’esplorazione del Document Object Model di una pagina web, la visualizzazione delle parti di HTML presenti su una pagina, l’eviden-ziazione di tabelle, la visualizzazione delle dimen-sioni delle immagini (solo per citarne alcune), è possibile approfondire la conoscenza di qualsiasi pagina presente nel browser.

Dopo avere effettuato senza alcun problema l’in-stallazione (richiede almeno Windows 2000) trove-remo l’icona dell’applicazione sotto la barra degli strumenti di Internet Explorer. È da notare che questo tool funziona sia con Internet Explorer 6 che con Internet Explorer 7.

Una volta lanciata la Developer Toolbar, questa si posizionerà automaticamente nella parte bassa dello schermo, ma è anche possibile effettuarne il “detach” e lasciarla mobile sulla pagina.

La caratteristica principale presente nel cuore dell’applicazione è il DOM Explorer, che permette di esplorare e approfondire il significato dell’HT-ML di qualsiasi pagina, analizzandone i diversi attributi e stili presenti sulla pagina stessa. Que-sta funzionalità avviene tramite la visualizzazione gerarchica di tutti gli elementi presenti, esposti alla navigazione tramite un treeview situato sul lato sinistro dell’applicazione. Quando si evidenzia un elemento tramite un click con il tasto sinistro

software “usa e getta”, merita ripetute sessioni di refactoring tra una release e l’altra. Avere oggi a disposizione tool come Refactor! che ci permette di raggiungere i nostri obiettivi col minimo sforzo rende il refactoring un grosso investimento per il futuro della soluzione sviluppata col minimo co-sto nel presente.

Bibliografia e riferimenti[1] http://martinfowler.com/books.html#refactoring[2] R. Di Natale - “. Net Tools”, Visual Basic Jour-

nal, n.70, Lug/Ago 2006 [3] http://msdn2.microsoft.com/en-us/visualc/

bb737896.aspx[4] http://www.devexpress.com/Products/NET/

IDETools/RefactorCPP/[5] http://www.devexpress.com/Products/NET/

IDETools/Index.xml[6] http://www.refactoring.com/tools.html[7] http://www.refactoring.com/catalog/index.html

Raffaele Di Natale è laureato in Scienze dell’In-formazione presso l’università di Catania, insegna Informatica presso l’ITI. Attualmente si occupa di pro-grammazione in ambito mobile, di help authoring, content management system, content syndication ed e-learning.

Page 54: v2007 05 vbj77

54

.NET TOOLS

VBJ N. 77 - Settembre/Ottobre 2007 55

.NET TOOLS

N. 77 - Settembre/Ottobre 2007 VBJ

del mouse, vengono mostrate nel lato destro del-l’applicazione le proprietà e gli stili dell’elemento prescelto. Tuttavia, scorrere tutto il DOM di una pagina alla ricerca di un elemento può non essere un’operazione completamente agevole, ma fortu-natamente è possibile fare click direttamente su di un elemento della pagina affinché questo ven-ga immediatamente evidenziato nel DOM: senza dubbio, una grande comodità.

Oltre all’analisi del DOM, vediamone altre fun-zionalità. Molto importante ed utile è senza dub-bio la possibilità di ridimensionare il sito per si-mulare altre risoluzioni sullo schermo, così da po-ter evidenziare eventuali difetti di visualizzazio-ne della pagina, la visualizzazione delle tabelle, delle celle e dei DIV.

Vista la loro enorme importanza nelle applica-zioni web, le immagini hanno meritato un menu a parte, in cui è possibile disabilitarle , mostrarne le dimensioni (in pixel) nonché il peso delle im-magini stesse e il percorso completo da cui ven-gono recuperate. Tutte queste informazioni pos-sono essere visualizzate insieme o singolarmen-te. Infine, l’Image Report crea un file XML con-tenente tutte le immagini presenti sulla pagina con le loro caratteristiche.

Da notare anche la presenza di alcune informa-zioni legate ai cookie, quali la possibilità di visua-lizzarne alcune informazioni, di disabilitarli per poter così controllare se si verificano malfunzio-namenti, oppure la loro eliminazione.

La presenza di un righello interattivo che com-pare sulla pagina quando si richiama la voce di menu “Tools -> Show Ruler” permette di stabi-lire con estrema precisione le dimensioni degli oggetti.

Ultimamente le applicazioni web stanno pren-dendo sempre più piede anche per applicazioni gestionali, quindi non sono più semplicemente un contenitore di informazioni da esporre agli utenti, ma ci si attende che gli utenti stessi im-mettano dati all’interno di web form ed è quindi importante che il TabIndex dei controlli che ac-cettano dei valori sia corretto: la voce “View -> TabIndexes” mostra (in modo simile alla fase di progettazione delle applicazioni Windows Forms all’interno di Visual Studio) l’ordine di tabulazio-ne di tutti i controlli.

Ulteriori funzionalità ci vengono fornite dal menu “Validate”: sono presenti tutti i link alle pagine W3C che permettono di effettuare la con-valida dell’HTML, dei CSS, dei Feed e dei link

Figura 1

Page 55: v2007 05 vbj77

54

.NET TOOLS

VBJ N. 77 - Settembre/Ottobre 2007 55

.NET TOOLS

N. 77 - Settembre/Ottobre 2007 VBJ

ProdottoInternet Explorer Developer Toolbar

Url di riferimento http://www.microsoft.com/downloads/details.aspx?FamilyID=E59C3964-672D-4511-BB3E-2D5E1DB91038&displaylang=en

Stato ReleaseStabile

Semplicità d’uso ªªª²²Nonostante le disparate funzionalità, sono tutte molto imme-diate

Utilità ªªª²²Per chi desidera approfondire la conoscenza delle applicazio-ni web

Qualità prodotto ªªª²² Affidabile, nei test sul prodotto eseguiti non ha mai mostrato par-ticolari problemi

Qualità documentazione ªª²²²Ma l’utilizzo dei tool è immediato

Fabio Perrone, laureato in Matematica e MCTS (Web) in C# 2.0, lavora presso TSF s.p.a. dove si occupa di progettazione e sviluppo di applicazioni Windows e Web.

presenti sulla pagina. La convalida delle pagine web è fondamentale per poter esporre sulle pagi-ne stesse il logo “W3C”, sinonimo di qualità e di conformità agli standard della pagina stessa.

Infine, un piccolo strumento utile per riprodurre alcune immagini è un color picker che permette di recuperare il colore di qualsiasi elemento pre-sente sul sito.

L’Internet Explorer Developer Toolbar, oltre ad uno strumento di esplorazione per sviluppatori esperti, è senza dubbio anche un ottimo strumen-to di apprendimento che permette di andare ol-tre al semplice “Visualizza HTML” presente nel browser, permettendo così di rivolgersi sia ad un pubblico di beginner che ad un pubblico di svi-luppatori avanzati.

Nonostante il download sia irrisorio (624 kb), le notevoli potenzialità di questa applicazione pos-sono permettere di comprendere maggiormente qualsiasi tipo di applicazione web e di riuscire ad approfondire la comprensione e le tecniche di creazione di qualsiasi pagina.

Page 56: v2007 05 vbj77
Page 57: v2007 05 vbj77
Page 58: v2007 05 vbj77

OFFERTE ABBONAMENTI

INDIRIZZO DI SPEDIZIONENome/Società __________________________________________________________

Codice Fiscale (obbligatorio) ________________________________________________

Indirizzo _______________________________________________________________

CAP _____________ Città ___________________________________ Prov. ______

Telefono ____________________________ Fax ______________________________

E-Mail ________________________________@_______________________________

Codice Cliente __________________________________________________________

MODALITA’ DI PAGAMENTO� Allego fotocopia del Bonifico Bancario effettuato sul C/C 000000014804

CAB 25200 ABI 01030 Cin “A” - Monte dei Paschi di Siena - Agenzia di Perignano

� Allego fotocopia della ricevuta del versamento sul C/C Postale N.14291561 intestato a: “Gruppo Editoriale Infomedia S.r.l. - Ponsacco”

� Allego assegno bancario intestato a: “Gruppo Editoriale Infomedia S.r.l.” NON TRASFERIBILE

� Contrassegno (+ € 11.00 contributo spese postali)

� Autorizzo l’addebito dell’importo di € _____________________ sulla mia CARTASI’/VISA

N. ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___

Scad. ___ ___ / ___ ___ (mm/aa) Codice di sicurezza “CV2” ___ ___ ___

Nome del Titolare ____________________________________________________

Data di nascita ____________________________________________________

Firma del Titolare ____________________________________________________

� Collegati al sito www.infomedia.it dove potrai effettuare il pagamento con carta di credito in modalità sicura (banca SELLA)

SI, mi voglio iscrivere gratuitamente alla newsletter Infomedia che mi tiene aggiornato sui prossimi argomenti delle mie riviste di programmazione e mi informa delle offerte, le nuove uscite e le prossime pubblicazioni. Questo è il mio indirizzo di posta elettronica:

______________________________@____________________________

Posso annullare la mia iscrizione in qualsiasi momento alla pagina: www.infomedia.it/newsletter.htm

PRIVACY Con la presente si autorizza al trattamento dei dati personali ai sensi delle vigenti norme sulla privacy

FIRMA________________________________________________

Garanzia di riservatezza - Gruppo Editoriale Infomedia garantisce la massima riservatezza dei dati da lei forniti e la possibilità di richiederne gratuitamente la rettifica o la cancellazione scrivendo a: Responsabile Dati - Gruppo Editoriale Infomedia Srl - Via Valdera P. 116 - 56038 Ponsacco (PI). Le informazioni custodite nel nostro archivio elettronico verranno trattate in conformità alla legge 196/03 sulla tutela dati personali.L’IVA sul prezzo dell’abbonamento cartaceo è assolta dall’Editore e non sussiste l’obbligo di emissione della fattura, ai sensi del D.M. 9 aprile 1993, art.1, comma 5; pertanto, ai fini contabili, farà fede la sola ricevuta di pagamento; perciò la fattura verrà emessa solo se esplicitamente richiesta al momento dell’ordine.Lei può dedurre il costo dell’abbonamento dal reddito d’impresa e dai redditi derivanti dall’esercizio di arti e professioni (artt. 54 e 56 del TUIR)

• I prezzi degli abbonamenti Web sono conprensivi dell’ IVA al 20%

• I prezzi degli abbonamenti per l’estero sono maggiorati di spese di spedizione.

• Gli abbonamenti decorrono dal primo numero raggiungibile. Per attivazioni retroattive contattaci al numero 0587/736460 o invia una e-mail all’indirizzo: [email protected]

INDIRIZZO DI FATTURAZIONE (solo per riviste web)

Nome e Cognome _______________________________________________________

Ditta __________________________________________________________________

Indirizzo _______________________________________________________________

CAP ____________ Città _________________________________ Prov. _________

P.IVA _________________________________________________________________

E-Mail per invio fattura _________________________ @ ________________________

GRUPPO EDITORIALE INFOMEDIA S.R.L.Via Valdera P. 116 - 56038 Ponsacco (PI) - Tel. 0587 736460 - Fax 0587 732232

www.infomedia.it - [email protected]

Per l’abbonamento in spedizione con posta prioritaria aggiungere i seguenti importi:

durata 1 anno:� + € 18.00 per CP� + € 18.00 per DEV� + € 10.00 per VBJ� + € 10.00 per LOGIN� + € 10.00 per JJ

Totale ordine € _______________________

durata 2 anni:� + € 36.00 per CP� + € 36.00 per DEV� + € 20.00 per VBJ� + € 20.00 per LOGIN� + € 20.00 per JJ

RIVISTE WEB

CP web compreso archivioDEV web compreso archivioVBJ web compreso archivioLOGIN web compreso archivioJJ web compreso archivio

2 web a scelta compreso archivio3 web a scelta compreso archivio4 web a scelta compreso archivio5 web compreso archivio

€ 45.00 �€ 45.00 �€ 35.00 �€ 35.00 �€ 35.00 �

€ 60.00 �€ 85.00 �

€ 115.00 �€ 140.00 �

1 anno (IVA 20% INCLUSA)

RIVISTE CARTACEE + WEB

COMPUTER PROGRAMMINGDEVVISUAL BASIC JOURNALLOGINJAVA JOURNAL

CP+DEV+VBJ+LOGIN+JJ

€ 75.00 �€ 75.00 �€ 65.00 �€ 65.00 �€ 63.00 �

€ 296.00 �

1 anno (IVA 20% INCLUSA)

Estate 2007

• OFFERTA SPECIALE: Con soli 20€ di differenza avrai la possibilità di accedere per un intero anno anche alla versione online (compreso archivio) della rivista a cui ti sei abbonato

RIVISTE CARTACEE

COMPUTER PROGRAMMINGDEVVISUAL BASIC JOURNALLOGINJAVA JOURNAL

CP+DEV+VBJ+LOGIN+JJ

€ 100.00 �€ 100.00 �€ 80.00 �€ 80.00 �€ 75.00 �

€ 380.00 �

€ 55.00 �€ 55.00 �€ 45.00 �€ 45.00 �€ 43.00 �

€ 196.00 �

1 anno 2 anni

Page 59: v2007 05 vbj77
Page 60: v2007 05 vbj77