Tool di sviluppo Source control system Ricci Gian Maria [email protected] 1° Workshop...

38
Tool di sviluppo Tool di sviluppo Source control system Source control system Ricci Gian Maria Ricci Gian Maria [email protected] [email protected] 1° Workshop “DotNetMarche.Start 1° Workshop “DotNetMarche.Start ()” ()” Giovedì 12 ottobre 2006 Giovedì 12 ottobre 2006 DotNetMarche.Start () DotNetMarche.Start ()

Transcript of Tool di sviluppo Source control system Ricci Gian Maria [email protected] 1° Workshop...

Page 1: Tool di sviluppo Source control system Ricci Gian Maria ricci.gm@nablasoft.com 1° Workshop DotNetMarche.Start () Giovedì 12 ottobre 2006 DotNetMarche.Start.

Tool di sviluppoTool di sviluppoSource control systemSource control system

Ricci Gian MariaRicci Gian [email protected]@nablasoft.com

1° Workshop 1° Workshop “DotNetMarche.Start ()”“DotNetMarche.Start ()”Giovedì 12 ottobre 2006Giovedì 12 ottobre 2006

DotNetMarche.Start ()DotNetMarche.Start ()

Page 2: Tool di sviluppo Source control system Ricci Gian Maria ricci.gm@nablasoft.com 1° Workshop DotNetMarche.Start () Giovedì 12 ottobre 2006 DotNetMarche.Start.

Cosa fa un source control systemCosa fa un source control system Centralizza la memorizzazione di filesCentralizza la memorizzazione di files Permette a più utenti di lavorare Permette a più utenti di lavorare

contemporaneamente sugli stessi filescontemporaneamente sugli stessi files Gestisce il versioning dei fileGestisce il versioning dei file Costituisce un backup condiviso del progettoCostituisce un backup condiviso del progetto

Repository

Working copy (client 1)

Working copy (client 2)

Working copy (client 3)

Page 3: Tool di sviluppo Source control system Ricci Gian Maria ricci.gm@nablasoft.com 1° Workshop DotNetMarche.Start () Giovedì 12 ottobre 2006 DotNetMarche.Start.

A chi è diretto un SCSA chi è diretto un SCS

Team di sviluppo Team di sviluppo Permette a più persone di lavorare sugli stessi filesPermette a più persone di lavorare sugli stessi files Gestisce la concorrenza delle modificheGestisce la concorrenza delle modifiche Centralizza la posizione di tutti i file di un progettoCentralizza la posizione di tutti i file di un progetto

Singoli sviluppatoriSingoli sviluppatori Mantiene lo storico di tutte le versioniMantiene lo storico di tutte le versioni Permette di creare snapshot di particolari momenti di Permette di creare snapshot di particolari momenti di

vita di un progetto (Es: Beta, Release)vita di un progetto (Es: Beta, Release) Gestisce deviazioni dal processo principale (branching)Gestisce deviazioni dal processo principale (branching) È un implicito backup di un progetto.È un implicito backup di un progetto.

Ogni sviluppatore dovrebbe utilizzare un Ogni sviluppatore dovrebbe utilizzare un Source control system per i propri Source control system per i propri progettiprogetti

Page 4: Tool di sviluppo Source control system Ricci Gian Maria ricci.gm@nablasoft.com 1° Workshop DotNetMarche.Start () Giovedì 12 ottobre 2006 DotNetMarche.Start.

Gestire la concorrenza con LockGestire la concorrenza con Lock

V3

V3

V2

Mario

Luigi

Repository

Update/Lock

V3V4

CommitV4

Punti di forza Punti di forza Evita completamente ogni conflitto di versioneEvita completamente ogni conflitto di versione Permette di conoscere chi sta lavorando ai vari filePermette di conoscere chi sta lavorando ai vari file

Punti deboliPunti deboli Riduce la concorrenza possibileRiduce la concorrenza possibile Richiede più attenzione per non dimenticare lock attiviRichiede più attenzione per non dimenticare lock attivi

Page 5: Tool di sviluppo Source control system Ricci Gian Maria ricci.gm@nablasoft.com 1° Workshop DotNetMarche.Start () Giovedì 12 ottobre 2006 DotNetMarche.Start.

Gestire la concorrenza senza lockGestire la concorrenza senza lock

V3

V3

V2

Mario

Luigi

Repository

UpdateV3

V3V4a

V4b

CommitV4a

V4a

V3

V5

V5

Resolve ConflictV5

Punti di forza Punti di forza Minimizza la serializzazione delle modificheMinimizza la serializzazione delle modifiche Evita la presenza di lock dimenticatiEvita la presenza di lock dimenticati Forza un aumento della comunicazioneForza un aumento della comunicazione

Punti deboliPunti deboli In caso di conflitto è necessario un intervento In caso di conflitto è necessario un intervento

manualemanuale Può creare problemi su tipi di file non “fondibili”Può creare problemi su tipi di file non “fondibili”

Page 6: Tool di sviluppo Source control system Ricci Gian Maria ricci.gm@nablasoft.com 1° Workshop DotNetMarche.Start () Giovedì 12 ottobre 2006 DotNetMarche.Start.

Pregi Pregi Elevata integrazione con il Visual StudioElevata integrazione con il Visual Studio

DifettiDifetti Scarse prestazioni in ambienti internetScarse prestazioni in ambienti internet Possibilità di corruzione repository per Possibilità di corruzione repository per

operazioni interrotteoperazioni interrotte È un prodotto a pagamentoÈ un prodotto a pagamento Difficoltà di uso in ambiente internetDifficoltà di uso in ambiente internet Bassa scalabilità per numero di utentiBassa scalabilità per numero di utenti Richiede un accesso costante al Richiede un accesso costante al

repositoryrepository

Pregi e difetti di Source SafePregi e difetti di Source Safe

Page 7: Tool di sviluppo Source control system Ricci Gian Maria ricci.gm@nablasoft.com 1° Workshop DotNetMarche.Start () Giovedì 12 ottobre 2006 DotNetMarche.Start.

Pregi Pregi Prodotto gratuitoProdotto gratuito Prodotto in continua evoluzioneProdotto in continua evoluzione Elevate prestazioni anche in ambienti Elevate prestazioni anche in ambienti

internetinternet Alta scalabilitàAlta scalabilità Buona integrazione con la shell (tortoise)Buona integrazione con la shell (tortoise) Non richiede un accesso costante al Non richiede un accesso costante al

repositoryrepository Commit transazionali, il database non si Commit transazionali, il database non si

corrompe per connessioni interrottecorrompe per connessioni interrotte DifettiDifetti

Scarsa o nulla integrazione con il Visual Scarsa o nulla integrazione con il Visual StudioStudio

Pregi e difetti di SubversionPregi e difetti di Subversion

Page 8: Tool di sviluppo Source control system Ricci Gian Maria ricci.gm@nablasoft.com 1° Workshop DotNetMarche.Start () Giovedì 12 ottobre 2006 DotNetMarche.Start.

IstallazioneIstallazione Basta eseguire il setup e rispondere alle Basta eseguire il setup e rispondere alle

domande di ritodomande di rito Gestione (programmi istallati)Gestione (programmi istallati)

Admin: Permette di creare repository nel file Admin: Permette di creare repository nel file system e definire le credenziali di accesso ai system e definire le credenziali di accesso ai vari repository creativari repository creati

SourceSafe (browser): Permette di vedere il SourceSafe (browser): Permette di vedere il contenuto di un repository e di eseguire le contenuto di un repository e di eseguire le varie operazioni di checkout/checkin, etc…varie operazioni di checkout/checkin, etc…

Analizzatori: Controllano lo stato del db per Analizzatori: Controllano lo stato del db per verificare e/o correggere erroriverificare e/o correggere errori

Source safeSource safe

Solitamente è sufficiente lavorare Solitamente è sufficiente lavorare all’interno del Visual Studio e lasciare che il all’interno del Visual Studio e lasciare che il plugin svolga il lavoro dietro le quinte in plugin svolga il lavoro dietro le quinte in modo quasi trasparente.modo quasi trasparente.

Page 9: Tool di sviluppo Source control system Ricci Gian Maria ricci.gm@nablasoft.com 1° Workshop DotNetMarche.Start () Giovedì 12 ottobre 2006 DotNetMarche.Start.

Source safe – integrazione VSSource safe – integrazione VS

Page 10: Tool di sviluppo Source control system Ricci Gian Maria ricci.gm@nablasoft.com 1° Workshop DotNetMarche.Start () Giovedì 12 ottobre 2006 DotNetMarche.Start.

Source safe – integrazione VSSource safe – integrazione VS

Page 11: Tool di sviluppo Source control system Ricci Gian Maria ricci.gm@nablasoft.com 1° Workshop DotNetMarche.Start () Giovedì 12 ottobre 2006 DotNetMarche.Start.

Source safe – ConsoleSource safe – Console

Page 12: Tool di sviluppo Source control system Ricci Gian Maria ricci.gm@nablasoft.com 1° Workshop DotNetMarche.Start () Giovedì 12 ottobre 2006 DotNetMarche.Start.

È possibile lavorare disconnessi in Source Safe semplicementeÈ possibile lavorare disconnessi in Source Safe semplicementetogliendo l’attributo readonly ai file che si vogliono modificare.togliendo l’attributo readonly ai file che si vogliono modificare.Al successivo GetLatest il Source Safe chiede per ogni file se siAl successivo GetLatest il Source Safe chiede per ogni file se sivuole scartare le modifiche oppure se si vuole fare un chekoutvuole scartare le modifiche oppure se si vuole fare un chekoutdel file nel repository per poi aggiornarlo con le proprie modifichedel file nel repository per poi aggiornarlo con le proprie modifiche

Lavorare disconnessi in source Lavorare disconnessi in source safesafe

ProPro Non è necessario avere una connessione Non è necessario avere una connessione

continua al database aumentando la continua al database aumentando la scalabilitàscalabilità

ControContro È possibile sovrascrivere le modifiche fatte È possibile sovrascrivere le modifiche fatte

da altri utenti durante il lavoro disconnesso da altri utenti durante il lavoro disconnesso a meno che non venga esplicitamente fatto a meno che non venga esplicitamente fatto il checkout prima di disconnettersiil checkout prima di disconnettersi

Page 13: Tool di sviluppo Source control system Ricci Gian Maria ricci.gm@nablasoft.com 1° Workshop DotNetMarche.Start () Giovedì 12 ottobre 2006 DotNetMarche.Start.

Subversion Subversion Scaricare ed installare l’ultima versioneScaricare ed installare l’ultima versione Scegliere una cartella del proprio server dove Scegliere una cartella del proprio server dove

tenere i repositorytenere i repository Creare un repository con l’istruzione Creare un repository con l’istruzione svnadmin svnadmin

create d:\svnrep\Testcreate d:\svnrep\Test Istallare il servizio con Istallare il servizio con sc create svnserver sc create svnserver

binpath= “c:\..\bin\svnserve.exe --service --root binpath= “c:\..\bin\svnserve.exe --service --root d:\svnrep" displayname= "subversion server“d:\svnrep" displayname= "subversion server“

TortoiseTortoise Scaricare ed installare l’ultima versione Scaricare ed installare l’ultima versione Testare con un repository browser se è Testare con un repository browser se è

possibile accedere al repository possibile accedere al repository svn://localhost/Testsvn://localhost/Test

Istallare SubversionIstallare Subversion

Page 14: Tool di sviluppo Source control system Ricci Gian Maria ricci.gm@nablasoft.com 1° Workshop DotNetMarche.Start () Giovedì 12 ottobre 2006 DotNetMarche.Start.

Configurare il repositoryConfigurare il repository

File path\conf\svnserve.conf File path\conf\svnserve.conf Contiene la configurazione del Contiene la configurazione del

repositoryrepository Per una configurazione di default Per una configurazione di default

decommentare le seguenti lineedecommentare le seguenti linee anon-access = noneanon-access = none auth-access = writeauth-access = write password-db = passwdpassword-db = passwd

File path\conf\passwdFile path\conf\passwd Contiene le password del repositoryContiene le password del repository Le password sono memorizzate in Le password sono memorizzate in

chiaro come coppia utente=passwordchiaro come coppia utente=password

Page 15: Tool di sviluppo Source control system Ricci Gian Maria ricci.gm@nablasoft.com 1° Workshop DotNetMarche.Start () Giovedì 12 ottobre 2006 DotNetMarche.Start.

Repository BrowserRepository Browser

Page 16: Tool di sviluppo Source control system Ricci Gian Maria ricci.gm@nablasoft.com 1° Workshop DotNetMarche.Start () Giovedì 12 ottobre 2006 DotNetMarche.Start.

CheckOutCheckOut

Page 17: Tool di sviluppo Source control system Ricci Gian Maria ricci.gm@nablasoft.com 1° Workshop DotNetMarche.Start () Giovedì 12 ottobre 2006 DotNetMarche.Start.

Aggiunta di file al repositoryAggiunta di file al repository

Page 18: Tool di sviluppo Source control system Ricci Gian Maria ricci.gm@nablasoft.com 1° Workshop DotNetMarche.Start () Giovedì 12 ottobre 2006 DotNetMarche.Start.

Icone di subversionIcone di subversion

Page 19: Tool di sviluppo Source control system Ricci Gian Maria ricci.gm@nablasoft.com 1° Workshop DotNetMarche.Start () Giovedì 12 ottobre 2006 DotNetMarche.Start.

Eseguire un commitEseguire un commit

Page 20: Tool di sviluppo Source control system Ricci Gian Maria ricci.gm@nablasoft.com 1° Workshop DotNetMarche.Start () Giovedì 12 ottobre 2006 DotNetMarche.Start.

Modifiche concorrenti senza Modifiche concorrenti senza conflittoconflitto

Page 21: Tool di sviluppo Source control system Ricci Gian Maria ricci.gm@nablasoft.com 1° Workshop DotNetMarche.Start () Giovedì 12 ottobre 2006 DotNetMarche.Start.

Modifica concorrente con conflittoModifica concorrente con conflitto

Page 22: Tool di sviluppo Source control system Ricci Gian Maria ricci.gm@nablasoft.com 1° Workshop DotNetMarche.Start () Giovedì 12 ottobre 2006 DotNetMarche.Start.

Numeri di versione in subversionNumeri di versione in subversion Ad ogni operazione di update il subversion Ad ogni operazione di update il subversion

incrementa il numero di versioneincrementa il numero di versione Per commit di file multipli ad ogni file viene Per commit di file multipli ad ogni file viene

assegnato il nuovo numero di versioneassegnato il nuovo numero di versione Il repository locale tiene nella .svn la copia Il repository locale tiene nella .svn la copia

dei file relativi all’ultimo update per dei file relativi all’ultimo update per confronto con il repositoryconfronto con il repository

Alcune revisioni sono così importanti che Alcune revisioni sono così importanti che hanno un modo particolare per essere hanno un modo particolare per essere individuateindividuate Head: Rappresenta la versione attualmente più Head: Rappresenta la versione attualmente più

recente di un file o cartellarecente di un file o cartella BASE: La versione presente attualmente nella BASE: La versione presente attualmente nella

cartella .svn della working copy cartella .svn della working copy COMMITTED: L’ultima revisione in cui un file è COMMITTED: L’ultima revisione in cui un file è

stato cambiato prima di BASEstato cambiato prima di BASE PREV: COMMITTED – 1, la precedente versione PREV: COMMITTED – 1, la precedente versione

rispetto a COMMITrispetto a COMMIT

Page 23: Tool di sviluppo Source control system Ricci Gian Maria ricci.gm@nablasoft.com 1° Workshop DotNetMarche.Start () Giovedì 12 ottobre 2006 DotNetMarche.Start.

Risolvere il conflittoRisolvere il conflitto

Page 24: Tool di sviluppo Source control system Ricci Gian Maria ricci.gm@nablasoft.com 1° Workshop DotNetMarche.Start () Giovedì 12 ottobre 2006 DotNetMarche.Start.

Controllare la storia di un fileControllare la storia di un file

Page 25: Tool di sviluppo Source control system Ricci Gian Maria ricci.gm@nablasoft.com 1° Workshop DotNetMarche.Start () Giovedì 12 ottobre 2006 DotNetMarche.Start.

Verificare lo stato dei fileVerificare lo stato dei file

Page 26: Tool di sviluppo Source control system Ricci Gian Maria ricci.gm@nablasoft.com 1° Workshop DotNetMarche.Start () Giovedì 12 ottobre 2006 DotNetMarche.Start.

Utilizzare lock in SubversionUtilizzare lock in Subversion Effettuare un lock impedisce agli altri utenti di Effettuare un lock impedisce agli altri utenti di

effettuare il commiteffettuare il commit I lock possono essere I lock possono essere rottirotti (rimuovere un lock di (rimuovere un lock di

un altro utente) o un altro utente) o rubati rubati (acquisire un lock (acquisire un lock anche se acquisito da un altro utente)anche se acquisito da un altro utente)

È buona norma inserire un commento ai lock e È buona norma inserire un commento ai lock e ricorrere al lock solo se strettamente necessarioricorrere al lock solo se strettamente necessario

È possibile utilizzare la proprietà È possibile utilizzare la proprietà svn:needs-locksvn:needs-lock per rendere read-only tutti i file che non hanno per rendere read-only tutti i file che non hanno attualmente un lock impostatoattualmente un lock impostato

È possibile impostare script di tipo hook nel È possibile impostare script di tipo hook nel server che avvertono in maniera esplicita, ad server che avvertono in maniera esplicita, ad esempio via mail quando viene effettuato un esempio via mail quando viene effettuato un locklock

Page 27: Tool di sviluppo Source control system Ricci Gian Maria ricci.gm@nablasoft.com 1° Workshop DotNetMarche.Start () Giovedì 12 ottobre 2006 DotNetMarche.Start.

Tortoise svn:needs-lockTortoise svn:needs-lock

Page 28: Tool di sviluppo Source control system Ricci Gian Maria ricci.gm@nablasoft.com 1° Workshop DotNetMarche.Start () Giovedì 12 ottobre 2006 DotNetMarche.Start.

Comandi baseComandi base Check for modification: controlla Check for modification: controlla

quali file sono stati modificatiquali file sono stati modificati Revert: Annulla le ultime Revert: Annulla le ultime

modifiche fattemodifiche fatte Get/Release Lock: Permette di Get/Release Lock: Permette di

lavorare in lock modelavorare in lock mode Add: Aggiunge file al repositoryAdd: Aggiunge file al repository Blame: Mostra per ogni file la lista Blame: Mostra per ogni file la lista

dei cambiamenti con relativo dei cambiamenti con relativo autoreautore

Create Patch: Crea un file in Create Patch: Crea un file in unified diff format delle modifiche unified diff format delle modifiche attualmente fatte su un file.attualmente fatte su un file.

Rename, Delete: Permettono di Rename, Delete: Permettono di cancellare/rinominare i file dalla cancellare/rinominare i file dalla propria copia corrente, marcandoli propria copia corrente, marcandoli come cancellati/rinominaticome cancellati/rinominati

Revision Graph: mostra un grafico Revision Graph: mostra un grafico delle revisioni effettuatedelle revisioni effettuate

Page 29: Tool di sviluppo Source control system Ricci Gian Maria ricci.gm@nablasoft.com 1° Workshop DotNetMarche.Start () Giovedì 12 ottobre 2006 DotNetMarche.Start.

BranchBranch Permette di gestire più versioni Permette di gestire più versioni

contemporaneamente dei filecontemporaneamente dei file Utile quando si ha la necessità di Utile quando si ha la necessità di

mantenere due versioni di uno mantenere due versioni di uno stesso progetto che differiscono in stesso progetto che differiscono in pochi filepochi file

Utile per marcare una milestone Utile per marcare una milestone dei propri progetti (in realtà è dei propri progetti (in realtà è sufficente il numero di versione)sufficente il numero di versione)

Page 30: Tool di sviluppo Source control system Ricci Gian Maria ricci.gm@nablasoft.com 1° Workshop DotNetMarche.Start () Giovedì 12 ottobre 2006 DotNetMarche.Start.

Comandi baseComandi base

Page 31: Tool di sviluppo Source control system Ricci Gian Maria ricci.gm@nablasoft.com 1° Workshop DotNetMarche.Start () Giovedì 12 ottobre 2006 DotNetMarche.Start.

Aggiungere un progetto VS al Aggiungere un progetto VS al repositoryrepository

Creare la cartella nel repository Creare la cartella nel repository dalla finestra dalla finestra Browse RepositoryBrowse Repository

Effettuare il checkout della nuova Effettuare il checkout della nuova cartella nella stessa cartella locale cartella nella stessa cartella locale del progettodel progetto

Effettuare il commit selezionando Effettuare il commit selezionando dalla finestra di commit tutti i file dalla finestra di commit tutti i file tranne quelli delle cartelle bin e objtranne quelli delle cartelle bin e obj

Con il comando Con il comando Add to ignore listAdd to ignore list indicare al tortoise che deve indicare al tortoise che deve escludere le cartelle bin e objescludere le cartelle bin e obj

Page 32: Tool di sviluppo Source control system Ricci Gian Maria ricci.gm@nablasoft.com 1° Workshop DotNetMarche.Start () Giovedì 12 ottobre 2006 DotNetMarche.Start.

Aggiungere un progetto VS al Aggiungere un progetto VS al repositoryrepository

Page 33: Tool di sviluppo Source control system Ricci Gian Maria ricci.gm@nablasoft.com 1° Workshop DotNetMarche.Start () Giovedì 12 ottobre 2006 DotNetMarche.Start.

Buone pratiche da seguireBuone pratiche da seguire Includere se possibile un commento Includere se possibile un commento

ad ogni checkout, in particolare se ad ogni checkout, in particolare se l’aggiornamento è connesso a qualche l’aggiornamento è connesso a qualche modifica sostanziale tipo modifica sostanziale tipo l’implementazione di una nuova l’implementazione di una nuova feature oppure la correzione di un bugfeature oppure la correzione di un bug

Effettuare un commit immediato dopo Effettuare un commit immediato dopo l’aggiunta di un file al progetto per l’aggiunta di un file al progetto per evitare conflitti nel file di progettoevitare conflitti nel file di progetto

Effettuare lock durante la modifica di Effettuare lock durante la modifica di file che non possono essere sottoposti file che non possono essere sottoposti a merge, in generale file binari non a merge, in generale file binari non testo.testo.

Page 34: Tool di sviluppo Source control system Ricci Gian Maria ricci.gm@nablasoft.com 1° Workshop DotNetMarche.Start () Giovedì 12 ottobre 2006 DotNetMarche.Start.

Cosa includere nel repositoryCosa includere nel repository Cartella ToolsCartella Tools

Includere l’installer di ogni tool necessario per lavorare al Includere l’installer di ogni tool necessario per lavorare al progettoprogetto

Includere se necessario una breve spiegazione all’istallazione Includere se necessario una breve spiegazione all’istallazione ed al primo utilizzoed al primo utilizzo

Cartella LibrariesCartella Libraries Includere tutte le librerie di terze parti utilizzate nel Includere tutte le librerie di terze parti utilizzate nel

progetto (nunit, nmock, enterprise-library, Atlas)progetto (nunit, nmock, enterprise-library, Atlas) Cartella DocsCartella Docs

Includere tutti i file di documentazione, da diagrammi uml a Includere tutti i file di documentazione, da diagrammi uml a semplici file testo che contengono informazioni sul progettosemplici file testo che contengono informazioni sul progetto

Cartella ReferencesCartella References Librerie sviluppate internamente che non hanno un installerLibrerie sviluppate internamente che non hanno un installer Versione decompressa delle librerie utilizzate (nunit, …)Versione decompressa delle librerie utilizzate (nunit, …) In generale tutti gli assembly che vengono referenziati dai In generale tutti gli assembly che vengono referenziati dai

propri progettipropri progetti Cartella projectsCartella projects

I file di progetto, le solution, in generale tutto il codice I file di progetto, le solution, in generale tutto il codice sorgente. sorgente.

Page 35: Tool di sviluppo Source control system Ricci Gian Maria ricci.gm@nablasoft.com 1° Workshop DotNetMarche.Start () Giovedì 12 ottobre 2006 DotNetMarche.Start.

Comandi baseComandi base

Page 36: Tool di sviluppo Source control system Ricci Gian Maria ricci.gm@nablasoft.com 1° Workshop DotNetMarche.Start () Giovedì 12 ottobre 2006 DotNetMarche.Start.

Comandi baseComandi base

Page 37: Tool di sviluppo Source control system Ricci Gian Maria ricci.gm@nablasoft.com 1° Workshop DotNetMarche.Start () Giovedì 12 ottobre 2006 DotNetMarche.Start.

Domande?Domande?

Page 38: Tool di sviluppo Source control system Ricci Gian Maria ricci.gm@nablasoft.com 1° Workshop DotNetMarche.Start () Giovedì 12 ottobre 2006 DotNetMarche.Start.

Slide e MaterialeSlide e Materiale

www.dotnetmarche.orgwww.dotnetmarche.org

Grazie!Grazie!