The Dark Side of .NET

Il lato oscuro della forza!
Un altro anno da MVP

Anche quest’anno comincia con una bella notizia: sono stato riconfermato MVP nella categoria ASP.NET/IIS. Potete immaginare la mia felicità e anche quest’anno dedico questo traguardo ai ragazzi di DotNetCampania che lo hanno reso possibile.

Un grazie va a tutte le community italiane e ai vari lead con cui ho avuto il piacere di confrontarmi (spesso a tavola). Grazie per i preziosi consigli, le grande abbuffate e lo spirito di community che ci avete trasmesso.

Ringrazio di cuore anche Alessandro Teglia, Lorenzo Barbieri, Pietro Brambati e tutti i componenti del team di Microsoft che si occupano delle community per lo splendido lavoro che fanno (e per le bellissime ore passate insieme ai vari meeting).

Un grazie per i preziosi consigli e le esperienze vissute insieme anche ai fantastici ragazzi di Crionet (in primis Giorgio, Dino, Gaetano e Diego) con cui ho avuto il piacere di collaborare.

Un grazie finale ad Annamaria Criscuolo, titolare della Bc Soft Srl, per essere tra le poche persone che conosco che abbiano riconosciuto il valore di questo premio e ne abbiano fatto motivo di orgoglio per la propria azienda.

--Michele

Installare Orchard su Azure

Come spesso ho detto durante le sessioni su Orchard. questo CMS è installabile, oltre che su IIS di una macchina Windows, anche su server Linux utilizzando Mono o su Azure, utilizzando un apposito package. Proviamo quindi ad installare Orchard proprio su Azure, scaricando dalla pagina codeplex il package Azure:

image

http://orchard.codeplex.com/releases/view/59918

Questo package contiene due file: il Service Package File, contenente l’applicazione, e il Service Configuration File, contenente i parametri di configurazione dell’applicazione. L’unica cosa che dobbiamo fare è specificare in quest’ultimo file la stringa di conessione ad un database di un’istanza Sql Azure opportunamente creata nella nostra sottoscrizione Azure. Procediamo quindi alla configurazione di Azure in modo che possa ospitare la nostra installazione di Orchard. Per chi non conoscesse benissimo come funziona Azure, è possibile far riferimento al tantissimo materiale presente on line o (come me) al fantastico libro di Fabio Cozzolino.

Come possessore di una MSDN Ultimate ho quindi attivato la mia sottoscrizione Azure e non ho fatto altro che accedere al pannello di gestione della mia sottoscrizione:

image

Cliccando sulla voce HostedServices, Storage Accounts & CDN vengono visualizzati i servizi Azure attivi (nel mio caso nessuno), ho quindi selezionato gli account di Storage, selezionato la mia sottoscrizione, tasto destro –> New Storage Account.

image

Una finestra di popup ci chiede i dati con cui vogliamo creare l’account:

image

Dopo qualche minuto ecco il nostro storage account creato:

image

A questo punto creiamo un nuovo Server selezionando dalla ribbon il pulsante Create che compare selezionando la voce Database dal menu laterale:

image

E completiamo il wizard che ci chiede la region, l’account di amministrazione e le regole di accesso del firewall:

image

A questo punto è stato creato il server Sql Azure in cui possiamo creare un nostro database semplicemente selezionando il nome del server e cliccando sul pulsante Create dalla ribbon:

image

Parte il solito wizard che ci chiede i dati necessari alla creazione del database:

image

Una volta creato il database dobbiamo costruire la stringa di connessione da mettere nel file di configurazione del nostro package, stringa che possiamo recuperare cliccando su Connection Strings nel pannello delle proprietà del nostro database. Selezionando quindi il database appena creato (orcharddb nel nostro caso), dal pannello delle proprietà clicchiamo sul pulsante con i tre puntini sospensivi della voce ConnectionStrings. Selezioniamo e copiamo la stringa di tipo ADO.Net. Chiaramente, per motivi di sicurezza, la password non è indicata, va quindi inserita manualmente nella stringa.

image

Apriamo il ServiceConfiguration.cscfg e modifichiamo il value del Setting DataConnectionString con il valore copiato:

image

Salviamo e siamo pronti a deployare il nostro pacchetto! Selezionando di nuovo Hosted Services, Storage Accounts & CDN, clicchiamo su Hosted Services e clicchiamo sul pulsante New Hosted Service presente nella ribbon:

image

Diamo un nome e un url al nostro servizio, scegliamo la solita region, diamo un nome al deploy e selezioniamo il package e il configuration file:

image

Un warning ci avvisa che sarebbe meglio, per la disponibilità del servizio, avere due istanze per ruolo, ma dati gli scopi al momento lasciamo tutto così e andiamo avanti:

image

Dopo qualche minuto il nostro Service è pronto:

image

Possiamo quindi vedere quanto realizzato:

image

Specifichiamo come database Sql Server indicando la stringa di connessione:

image

Ottenendo il risultato sperato:

image

A mio modesto parere: una passeggiata! Azure è semplicissimo, perchè molto intuitivo, da configurare e il package di Orchard è praticamente pronto all’uso. Qualche problemino chiaramente lo incontreremo nell’installazione dei moduli a causa dei permessi sui singoli elementi dell’applicazione, ma nei prossimi post vedremo come risolvere anche quelli.

-- Michele

Posted: 27 dic 2011 18:36 da Michele Aponte | con no comments
Inserito sotto:
Community Days 2012 - Milano, 16 e 17 febbraio 2012

Siete pronti a non perdervi il maggiore evento community italiano organizzato dagli user group e community italiani legati ai temi dello sviluppo basato sul .NET Framework?
Due giorni, 12 track, 4 lab ed i migliori speaker: iscriviti subito ai Community Days 2012!

600x220

http://www.communitydays.it/events/communitydays-2012/

Domani parte WPC

Domani, 22 Novembre 2011, parte WPC2011, a cui ho l’onore di partecipare come speaker. Mi trovate nella Sala Rossa alle 18.45 a parlare di sviluppo di siti web con Orchard, il CMS targato Microsoft. Sarò presente tutti e 3 giorni dell’evento, in giro per sessioni e al CafèTech, l’angolo dove troverete tanti MVP a rispondere alle vostre domande e a scambiare quattro chiacchiere sul futuro delle nostre e vostre tecnologie preferitewpc

Sei track e tantissime sessioni da seguire, gli eventi serali, il CaféTech e tanto altro! Maggiori info sul sito dell’evento: http://www.wpc2011.it/.

Vi aspettiamo!

History Tech Day e DDD Day

Purtroppo il poco tempo a disposizione mi sta un po’ limitando nei post, ma ci tenevo, anche se in ritardo, a ringraziare pubblicamente i partecipanti, gli speaker e gli organizzatori dell’History Tech Day, una delle giornate dell’evento Comunicando, organizzato da Storia Informatica,  tenutosi ad Avellino lo scorso 24 Settembre. Potete trovare il materiale all’indirizzo:

History Day

http://www.storiainformatica.it/index.php?option=com_content&view=article&id=232&Itemid=97&lang=it

Un grazie di cuore agli amici MVP che sono intervenuti: l’ormai napoletano  Roberto Freato, presidente di DotNetLombardia, che ci ha parlato dell’evoluzione dei sistemi mobile, l’amico e roomate di sempre Massimo Bonanni, presidente di DomusDotNet,  che ci ha parlato dell’evoluzione degli ambienti di sviluppo Microsoft (ah, quanti ricordi…) e ultimo, solo in ordine di apparizione, il mitico Fabio Cozzolino, presidente di DotNetSide, che ci regalato uno splendido viaggio nelle soluzioni di cloud computing. Grazie di cuore ragazzi, ancora una volta lo spirito di community che vi contraddistingue ha reso un sabato qualsiasi una giornata da ricordare.

Ma come sempre non ci fermiamo mai e il prossimo appuntamento è domani, 8 Ottobre, a Bologna, dove insieme a DotDotNet, DotNetMarche, UgiDotNet e XPUG Marche, abbiamo organizzato una giornata completamente dedicata al Domain Driven Design: il DDD Day!

DDD Day 2011

L’appuntamento è all'Hotel Sheraton di Bologna, dove vi aspetteranno, per una giornata ricca di contenuti, speaker nazionali e internazionali come Alberto Brandolini, Greg Young, Andrea Saltarello e tanti altri in due track parallele tra cui scegliere le sessioni. Sul sito trovate tutte le informazioni necessarie. I campani che saranno all’evento possono trovarci in giro per le sessioni (chiedete alle ragazze all’accoglienza o al banchetto dello sponsor Novatech Consulting). Un consiglio da chi ha avuto la fortuna di essere nello staff organizzativo ed ha vissuto il dietro le quinte: NON PERDETEVI QUESTO EVENTO!

A domani

--Michele

Sabato prossimo History Tech Day ad Avellino: non mancate!

Sabato prossimo DotNetCampania è ad Avellino insieme a Storia Informativa è un bel po’ di amici MVP per una giornata dedicata all’evoluzione dei sistemi informatici. Questo il link dell’evento:

banner_comunicando_piccolo

Sarà un bella occasione per parlare di tecnologia, del passato, ma anche del futuro e come sempre stare insieme in un paese in cui il buon cibo non manca….

Vi aspettiamo!

--Michele

Orchard: impostare la favicon

Se lavorate con Orchard sapete bene che la modularità è una delle caratteristiche fondamentali di questo CMS. Esiste un modulo per tutte le principali attività di realizzazione di un sito web, e la favicon, l’iconcina associata al sito, non è da meno! Vi basta quindi andare nella gallery dei moduli (Modules –> Gallery), cercare con la parola chiave ‘favicon’ e installare il Vandelay Favicon.

image

Come sempre ricordatevi di attivare il modulo:

image

A questo punto nei settaggi generali (Settings –> General) vi ritroverete un sezione apposita in cui potete specificare la vostra favicon:

image

Creiamo nella cartella Media una cartella Favicon in cui inseriremo le immagini tra cui scegliere la nostra favicon:

image

Le immagini presenti in questa cartella saranno disponibili nella sezione appena aggiunta per la favicon per una più semplice selezione, basta cliccarci su!

image

Ecco il risultato, di cui approfitto per invitarvi il prossimo 8 ottobre a bologna al DDD Day, una giornata completamente gratuita dedicata al Domain Driven Design, di cui DotNetCampania è co-organizzatrice.

image

Il sito, come potete immaginare, è realizzato con Orchard, mentre l’elegantissimo design è frutto del lavoro del nostro Carmine!

-- Michele

Posted: 20 set 2011 23:50 da Michele Aponte | con 1 comment(s)
Inserito sotto:
Creare un modulo per Orchard: preparare l’ambiente di sviluppo

Come già detto più volte Orchard è un CMS che fa della modularità il suo punto di forza, con una gallery ormai già molto nutrita che vi permette di risolvere quasi tutti i casi di sviluppo reale che vi possono capitare. Ma se nella gallery non c’è il modulo che vi serve? Se siete dei DEV .NET, niente paura, anzi: è arrivato il momento di scaricare i sorgenti di Orchard da Codeplex e avviare il vostro fido Visual Studio 2010!

image

Una volta scaricato il pacchetto zip, decomprimetelo in una cartella a vostro piacimento e nella sottocartella src fate doppio click sulla Microsoft Visual Studio Solution chiamata Orchard:

image

Chiudendo un po’ di rami della soluzione, il solution explorer vi presenterà la seguente struttura, con la quale familiarizzeremo nel corso di questi articoli:

image

Come avremo modo di approfondire analizzando l’architettura interna di questo CMS, i principali componenti della soluzione sono la Core Library, che implementa le funzionalità base del sistema, e il Framework di Orchard che, utilizzando le funzionalità della Core Library, offre servizi di base ai moduli che troverete nella cartella Modules. 

Compiliamo e lanciamo la soluzione per assicurarci che tutto funzioni, dopodichè creiamo un sito di test per la realizzazione del nostro modulo, utilizzando come recipe di creazione del sito proprio ilCore, in modo da avere un ambiente con il minimo indispensabile per poter lavorare.

image

Questo template crea un ambiente davvero minimale, che è perfetto per testare i nostri moduli:

image

L’ambiente core così creato installa automaticamente il modulo Code Generation, già usato in passato per generare i temi, e che ci permette anche di generare un modulo vuoto per Orchard in modo da non dover partire proprio da zero. Ci basta avviare la console di Orchard che troviamo nella cartella bin del web project (Orchard.Web) facendo doppio click sull’application di nome Orchard:

image

Il modulo è installato ma non attivato, per attivarlo ci basta digitare il comando

feature enable Orchard.CodeGeneration

se tutto va a buon fine la console ci risponde con il messaggio Code Generation was enabled:

image

Volendo potevamo attivare il modulo anche dalla dashboard, così come tutti gli altri moduli di Orchard. Una volta attivato il modulo di generazione del codice ci basta richiamarlo con il seguente comando:

codegen module CommunityEventManager

dove CommunityEventManager è il nome che vogliamo dare al nostro modulo. Il messaggio Module CommunityEventManager created successfully ci notificherà la corretta esecuzione del comando:

image

Il modulo, oltre ad essere creato, viene automaticamente aggiunto alla nostra solution, infatti passando a Visual Studio l’ambiente ci chiede se vogliamo ricaricare la solution, in quanto è stata modificata al di fuori dell’ambiente:

image

Una volta ricaricata la soluzione, nella cartella Modules troveremo il nostro modulo:

image

Siamo quindi pronti a scrivere il codice necessario a implementare il nostro modulo, ma prima abbiamo bisogno di analizzare un po’ più del dettaglio come Orchard funziona dietro le quinte e quali tecnologie usa, cosa che faremo nei prossimo post.

--Michele

Orchard: categorizzare contenuti con le tassonomie

Rifacendo il sito di DotNetCampania utilizzando Orchard ci siamo scontrati con l’esigenza di categorizzare i contenuti che pubblichiamo, ad esempio gli articoli, per i quali abbiamo creato un apposito Content Type.

image

Il modo più indicato per ottenere questo risultato è sicuramente l’uso del modulo Taxonomies, installabile direttamente dalla gallery di moudli raggiungibile dalla dashboard:

image

Come tutti i moduli di Orchard ricordatevi che va attivato:

image

Come potete leggere sulla pagina codeplex del modulo, una tassonomia è un insieme gerarchico di termini che serve a classificare contenuti. L’installazione del modulo comporterà l’installazione di un nuovo Field, denominato TaxonomyField, da aggiungere ai Content Type che vogliamo classificare, e una widget, chiamata Taxonomy Widget, che ci servirà a mostrare all’utente la gerarchia dei termini che classificano i nostri contenuti.

Dal menu principale della Dashboard possiamo adesso creare le nostre tassonomie cliccando sulla voce Taxonomies e successivamente sul pulsante Add a taxonomy. A questo punto non dobbiamo far altro che dare un nome alla tassonomia:

image

Una volta creata la tassonomia possiamo aggiungere dei termini al suo vocabolario, organizzandoli, volendo, anche gerarchicamente. Nel nostro caso abbiamo creato alcune categorie per gli articoli:

image

Dopo il primo termine del vocabolario, al fine di permettere l’organizzazione gerarchica degli elementi, l’aggiunta di un nuovo termine è preceduta dalla scelta del termine padre, che può chiaramente essere lasciato anche vuoto:

image

A questo punto non ci resta che aggiungere al nostro content type Article un field di tipo TaxonomyField, che chiameremo Categorie.

image

Possiamo indicare quale tassonomia usare tra quelle presenti , se restringere ai nodi figli la selezionalibità dei termini e se permettere un solo elemento del vocaboalario per articolo:

image

Modificando un qualsiasi articolo esistente o creandone uno nuovo possiamo adesso selezionare le categorie a cui associarlo:

image

Automaticamente la tassonomia sarà presente nella lista articoli del fronend:

image

Tornando alla dashboard possiamo aggiungere una widget da cui selezionare le categorie di articoli. Clicchiamo su Widgets, aggiungiamo un layer per gli articoli in modo da aggiungere la widget solo alla pagina con l’url ‘~/articoli’  e clicchiamo sul pulsante Add della sezione AsideFirst per mostrare la widget nella colonna sinistra della nostra pagina:

image

Scegliamo come tipologia di widget la Taxonomy Widget installata con il modulo Taxonomies:

image

E selezioniamo la tassonomia che ci interessa mostrare:

image

Ed ecco il risultato:

image

Peccato che cliccando su una delle categoria dalla widget o anche dai link presenti nella lista degli articoli otteniamo una pagina vuota:

image

Questo perchè di default Orchard non installa i moduli di indicizzazione dei contenuti, nella fattispecie l’implementazione disponibile dalla gallery è Lucene di cui parleremo in un apposito articolo. Ci basta quindi installare e attivare Lucene dalla Gallery e tornare al TaxonomyField creato nel content type Article per includere la tassomonia tra gli indici:

image

Ottenendo il risultato voluto:

image

Vi lascio con un link ad un video di Bertrand Le Roy, PM di Orchard, che mostra proprio come usare le tassonomie: http://www.youtube.com/watch?v=B3jhgTeiEtw&feature=player_embedded

-- Michele

Posted: 26 ago 2011 12:41 da Michele Aponte | con 1 comment(s)
Inserito sotto:
Community Day su MVC3 e Orchard

Ultimo Community Day prima delle vacanze: si parla di Asp.Net MVC3 (mattina) e Orchard (pomeriggio). Questa volta tocca a me fare da speaker ed è sempre un grande piacere poter contribuire a queste giornate.

Il programma della giornata:

10.00 – 11.30: Introduzione ad Asp.Net MVC3 e Razor

11.30 – 11.45: Assaggio di dolci tipici della regione Campania

11.45 - 13.00: Estendibilità di Asp.Net MVC3, Testing e Best Practices

13.00 – 14.00: Alla scoperta della vera pizza napoletana

14.00 – 15.30: Creare siti web con Orchard

15.30 – 15.45: Assaggio di quel che è rimasto dei dolci tipici della regione Campania…

15.45 – 17.00: Creare un modulo per Orchard

L’appuntamento è per Sabato 16 Luglio 2011, ore 10.00, presso la sede dell’azienda QT2000, in via Arno 36 (Parco Alkaid), 80126 Napoli, e sono invitati tutti i soci di DotNetCampania. Non sei ancora socio? Cosa aspetti?

--Michele

Posted: 11 lug 2011 17:33 da Michele Aponte | con no comments
Inserito sotto:
Orchard, stylesheet alternativo

Nella realizzazione di web site può essere necessario selezionare uno stylesheet diverso in base ad alcune condizioni. Prendiamo ad esempio il caso in cui è necessario utilizzare un css diverso in base alla versione di explorer che sta visualizzando il nostro website (come mi è capitato in questi giorni impaginando un sito con Orchard). Possiamo usare i commenti condizionali di IE

<!--[if IE 6]><link rel="stylesheet" href="style.ie6.css" type="text/css" media="screen" /><![endif]-->
<!--[if IE 7]><link rel="stylesheet" href="style.ie7.css" type="text/css" media="screen" /><![endif]-->

In Orchard possiamo ottenere questo risultato in questo modo:

RegisterLink(new LinkEntry 
{ 
    Condition = "lte IE 6", 
    Rel = "stylesheet", 
    Type="text/css", 
    Href = Href("../Styles/style.ie6.css")
}.AddAttribute("media", "screen"));

Ricordandoci però di includere nella pagina cshtml le risorse per la UI di orchard:

@using Orchard.UI.Resources;

--Michele

Aperte le iscrizioni al DDD Day

Ecco il link per registrarvi:

http://d4d-2011.eventbrite.com/

--Michele

Creare un sito con Orchard - 3 parte

E’ disponibile sul sito di DotNetCampania la terza puntata della serie su come creare un sito con Orchard:

http://dotnetcampania.org/wikis/articoli/creazione-di-un-sito-web-con-orchard-terza-parte.aspx

Buona lettura

--Michele

Silverlight everywhere: grazie a tutti!

E anche questa è fatta, ed è andata ancora una volta benissimo! Nonostante qualche inconveniente logistico (incidente in autostrada all’altezza di Vietri sul Mare) e tecnico (il nuovissimo portatile Dell di Antonio non ha nativamente l’uscita vga…) alle ore 14:00 tutti pronti al Novotel Est Arechi di Salerno per le registrazioni all’ultimo evento di questo fiscal year.

DSC_0001 DSC_0002
DSC_0007 DSC_0008

Per essere il primo vero evento a Salerno l’affluenza è stata ottima, sala quasi piena, tra cui un bel po’ di azienda del salernitano, oltre i soliti affezzionati di Napoli, che hanno voluto essere con noi anche in trasferta rispetto alle nostre abituali location. Alle 14.30 si parte con una keynote lampo, che ricorda chi siamo, cosa facciamo, come diventare soci, annuncia il nostro secondo compleanno, presenta l’agenda della giornata e ringrazia gli sponsor per averci permesso di essere li! La parola passa subito ad Antonio che ci presenta Redgate SmartAssembly, del nostro sponsor RedGate:

DSC_0010 DSC_0011
DSC_0014 DSC_0015

Si passa poi alla prima sessione della giornata, che ci ha proposto un confronto tra EF e NH, presentati rispettivamente da Emanuele e Antonio, nella realizzazione dello strato di persistenza di un’applicazione di esempio realizzata per la giornata: la gestione di un sistema di prenotazione online di film in dvd.

DSC_0025 DSC_0026
DSC_0038 DSC_0034

Piccola pausa e poi si riprende con Antonio alle prese con la realizzazione del client desktop e web dell’applicazione di esempio, utilizzando Silvelight 5. Nella seconda foto potete ammirare in prima fila il buon Massimo Bonanni, che da sempre onora la nostra community con la sua costante presenza, testimonianza della bellissima amicizia che ci lega con la community romana DomusDotNet. Ringrazio inoltre Max per il bellissimo regalo, il libro raccolta degli articoli apparsi sul portale DomusDotNet, e che consiglio a tutti di acquistare!

DSC_0025 DSC_0021

Si chiude con la realizzazione, da parte di Emanuele, del client per Windows Phone 7, che non poteva sicuramente mancare e che ha illustrato alcuni dei concetti chiave nello sviluppo di applicazioni Silverlight per questa piattaforma, concetti che potete ritrovare, accuratamente trattati, nel libro di Apress di cui Emanuele è coautore insieme ad un suo collega.

DSC_0039 DSC_0043

Si chiude con una bellisima Q&A in cui si è discusso dell’uso di ORM e del supporto per le stored procedure, seguita dall’assegnazione di alcuni regali messi a disposizione dai nostri sponsor:

DSC_0041 DSC_0044
DSC_0046 DSC_0049

Un grazie di cuore a tutti i presenti, e alle nostre stupende ragazze che come sempre ci hanno aiutato nell’accoglienza degli ospiti: Miriam e Alessandra!

DSC_0031 DSC_0020

La giornata come sempre si è conclusa a tavola, anche se questa volta avevamo una scusa in più per abbandonare qualsiasi dieta o fioretto…. il secondo compleanno della nostra community! Gragnano è stata la nostra meta culinaria e come sempre non ha deluso… peccato per chi non c’era!!!

DSC_0076 DSC_0087
DSC_0093 DSC_0098
DSC_0108 DSC_0111

Grazie di cuore a tutti i partecipanti, con l’augurio di passare delle rilassanti ferie in attesa degli eventi del prossimo fiscal year!!!!

--Michele

Silverlight Everywhere: tutto pronto, non mancate!

Come sempre succede, alla vigilia di un evento fervonoi preparativi e con una mezza giornata di anticipo possiamo dire che il grosso è fatto! C’è molta emozione, nonostante non sia il nostro primo evento. Sarà la città nuova, Salerno, che sta rispondendo alla grande con le iscrizioni! Magari è anche il fatto che si tratta dell’ultimo evento di questo fiscal year!

header

Aggiungiamo anche il secondo compleanno della community, che sarà ampiamente festeggiato domani sera a Gragnano…

compleanno-dotnet-grande

Insomma gli ingredienti per una buona riuscita dell’evento ci sono tutti, direi che non è il caso di perderselo!!!! Appuntamento alle ore 14.00 al

NOVOTEL SALERNO EST ARECHI

Viale G. Clark, 49

84131 - Salerno (SA)

L'hotel si trova all'uscita Mariconda della tangenziale di Salerno SS18, a 7 km dallo svincolo Salerno Est Fratte, sulla litoranea di fronte al lido dei Carabinieri. Per ottenere le indicazioni necessarie da un indirizzo a vostra scelta potete visitare la pagina messa a disposizione dall'albergo:

http://www.novotel.com/it/hotel-6351-novotel-salerno-est-arechi/location.shtml

L'hotel dispone di parcheggi videocustoditi al costo di 1€ all'ora. All'esterno della struttura invece ci sono degli spazi gratuiti non custoditi. Alla reception dell'hotel vi indicheranno la sala dove si terrà l'evento, all'ingresso della sala troverete le nostre ragazze per la registrazione. Per evitare ritardi nell'inizio dei lavori vi preghiamo di arrivare alle 14.00 in punto. Per qualsiasi altra informazione non esitate a contattarci all'indirizzo: team@dotnetcampania.org

VI ASPETTIAMO!!!!

--Michele

Più Post Pagina seguente »