Martedì scorso si è svolto a Torino, presso il MIC, un workshop di UGISS. Con l’evento si è lanciata l’idea di far nascere una nuova community .NET nell’area piemontese.
Potete leggere dal post di Marco Russo di questa “idea”. E’ anche possibile partecipare attivamente a questa fase di start-up. Se siete interessati potete contattare Marco…fatevi avanti.
Di solito faccio un post di recap sull’evento a cui ho partecipato il giorno dopo o la sera stessa, ma a causa dell’alto numero di mail ricevute, questa volta sono andato un po’ lungo e vi scrivo dopo due giorni :-)) Quindi grazie per la numerosa partecipazione.
Le sessioni dovrebbero, (ho usato il condizionale) , essere disponibili sul sito BEIT, nell’attesa quindi vi giro slide ed esempi di codice.
Sessione ASP.NET MVC 1.0
Per chi di voi era tra le persone spaventate dal modello di programmazione di ASP.NET MVC, come detto usi tranquellamente le WebForms. Per chi si trovava tra i contenti e vuole sviluppare con ASP.NET MVC 1.0, può scaricare la RTM dai link seguenti, basta avere una versione di Visual Studio 2008 dalla Express in su.
Sessione Silverlight 3 e .NET RIA Services
Silverlight 3, attualmente in beta, è scaricabile dal sito community di Silverlgiht 3.
.NET RIA Services, seguono un flusso di sviluppo diverso e nelle mie slide trovate la roadmap per il rilascio. Come vi dicevo la prossima CTP che verrà rilasciata avrà delle braking changes rispetto a quanto visto nella sessione.
Sessione ASP.NET 4 e Visual Studio 2010
Sì è così. Mercoledì si inizia. Le iscrizioni sono oltre le attese, tanto che in una delle tracce siamo già oltre il limite da parecchi giorni. Quest’anno ci saranno due tracce per developer ed una per designer.
La traccia Getting Started contiene sessioni sulle tecnologie già rilasciate per lo sviluppo web; è orientata a chi ha sviluppato con tecnolgie Microsoft in passato, ad esempio con ASP o VB 6, ma anche a chi parte da zero, magari perchè fin’ora non ha lavorato con ASP.NET 3.5 o Silverlight 2 e IIS 7; penso sia indicata anche per gli studenti o per chi semplicemente vuole aggiornarsi alle tecnologie che oggi gli consentono di sviluppare per il web.
La traccia What’s new invece è orientata a quelle tecnologie di più recente rilascio o non ancora rilasciate, quindi rivolta a chi ha già competenze di ASP.NET e Silverlight e vuole conoscere le novità delle prossime versioni.
Le mie Sessioni:
- ASP.NET MVC 1.0 (traccia What’s new). La sessione sarà divisa in due parti. Nella prima parte cercherò di rispondere alle seguenti domande: cos’è MVC ? Cos’è ASP.NET MVC 1.0 e come ci si sviluppa ? Che differenza c’è tra ASP.NET MVC e ASP.NET Web Forms e quando è meglio usare uno o l’altro approccio. Nella parte finale, tempo permettendo, vorrei fare qualche semplice esempio di test usando magari un framework di mock.
- Silverlight 3 “business application” (traccia What’s new): in questa sessione si parla di due tecnolgie: i .NET RIA Services, attualmente in preview, che consentono di realizzare in modo semplice applicazioni n-tier e Silverlight 3, attualmente in beta, che verrà usato per realizzare la parte di interfaccia utente. Grazie ad alcuni controlli ed un nuovo “Business Application Template” è possibile realizzare un’applicazione che soddisfi 4 requisiti: aspetto professionale, facile interfaccia verso i dati esposi da servizi, validazione client e server e autenticazione… ok dovrebbe bastare.
- Visual Studio 2010 sviluppo e test(traccia What’s new): questa sessione la faccio a braccetto, ok si fa per dire, con Lorenzo Barbieri. Ho cercato di concentrare più argomenti in poco tempo: WebForm 4.0, ASP.NET Ajax: la parte client, quindi le MS Ajax Library con i nuovi Client Template; dulcis in fundo il nuovo MSDeploy con cui sarà possibile pubblicare un intero sito web, con tanto di dipendenze sulla configurazione di IIS, nonchè il database direttamente da VS 2010: spero di riuscire a farvi vedere questa funzionalità dal vivo… Chissà Lorenzo ?
- Keynote demo: pending…
Durante Remix09 saranno presenti numerosi MVP di “calibro” e molte community .NET. Quale migliore occasione per incontrarli tutti. Spero di riuscire a salutarli tutti, nella “baruffa” che ci sarà.
Chissà se riuscirò ad usare il mio Poken:
A presto. Per chi ci sarà, vi aspetto.
Sono appena tornato dal Delphi Day 2009, il secondo per me, dopo quello del 2007. Marco Cantù è stato così gentile da invitarmi per raccontare un po’ di cose su Windows 7. Scusate se non sono riuscito a portare un numero suffiecente di CD per tutti, potete comunque scaricare la RC di Windows 7 da questo link, con scadenza Giugno 2010.
Ho pubblicato l’ultima versione delle slide: se state leggendo questo post da un feed rss, aprite l’url che punta al post in modo che possiate sfogliarle. Vi ricordo che su BEIT c’è un intero percorso dedicato a Windows 7 per Developer e IT Pro, fatto sulla beta, ma ancora attuale e che potete raggiungere da qui (Percorso Anteprima di Windows 7).
Ecco alcuni puntatori alle domande e argomenti più gettonati :-)
Windows Virtual PC e Windows XP Mode
Potete scaricare il nuovo Windows Virtual PC da questo link e il relativo Windows XP Mode.
Windows Web Service API
Per chi mi ha fatto la domanda sulle WWSAPI, posso suggerire oltre al video di Raffaele Rialdi (Windows 7: Web service API per applicazioni C++) che trovate nella serie prima suggerita, la serire di post di Mario Fontana:
Supporto nativo ai file VHD
Per approfondimenti potete vedere il video (Windows 7: supporto nativo e avvio da VHD) di Giorgio Malusardi.
Inoltre ..
Come vi dicevo il team di Windows Client e Windows Server hanno da poco annunciato che Windows 7 e Windows Server 2008 R2 uscirano in contemporanea; l’RTM è prevista nella seconda metà di luglio, mentre la disponibilità nei negozi è prevista intorno al 22 ottobre 2009. Tenete d’occhio il blog Technet Italia per le ultime news ..
Simone ha condotto nel 2007 una survey sull’utilizzo di Ajax tra gli sviluppatori .NET, di cui potete leggere i risultati a questo link; mi sembra interessante segnalarvi che ha riproposto lo stesso sondaggio a due anni di distanza.
Potete partecipare liberamente da questo link e completarla in meno di 2 minuti e seguire sul suo blog i risultati.
Eccole su SlideShare:
Come promesso ai ragazzi del GrUSP cercherò di tenere aggiornata la wiki :-)
-Pietro
Se come me avete visto tutto Magum P.I. …

[Update 20 Giugno 2009]
Il 15- 16 Maggio a Verona si svolgerà il phpDay 2009, evento dedicato a chi sviluppa applicazioni web per PHP, vi potete registrare tramite l’apposito link sul portale. Questa è la mia terza edizione, come speaker: i ragazzi del Gr.U.S.P mi concedono ancora questa possibilità! Quindi per chi c’è ci vediamo là.
In preparazione al phpday, quindi, spero di fare cosa gradita nel raccogliere del materiale tecnico per chi lavora con PHP e con Windows, diciamo così dallo sviluppo al deploy: ho cercato di raccogliere i link alle ultime novità.
Se volete, lasciate pure un commento con qualche altro riferimento ad altri link che ritenete interessanti segnalare su questo argomento alla community.
Tutti i materiali indicati sono fruibili gratuitamente.
Web Platform Installer (WPI)
WPI 2.0 beta è un tool gratuito che consente d’ installare e tenere aggiorante le componenti Microsoft per la piattaforma web anche per PHP, configurando FastCGI, Url Rewriter, il runtime di PHP, SQL Sever 2008 etc..

Nell’imagine vedete una delle maschere del tool da cui potete scegliere cosa installare: ad esempio il modulo di UrlRewriter, il runtime di php 5.2.9 e Acquia Drupal. La nuova versione, attualmente in beta, si integra infatti con quella che viene chiamata Web Application Gallery, vedi dopo.
Download Web Platform Installer
Web Application Gallery
Da questa pagina, potete scaricare le più note applicazioni open source per PHP e ASP.NET: Drupal, Wordpress, Umbraco, etc.
Il WPI 2.0 integra la possibilità di installarle sulla propria macchina tutto dallo stesso tool, con un wizard che guida nella configurazione su IIS per SQL Server e MySQL, installando le applicazioni già configurate in pochi minuti.
Vai alla Web App Gallery
Video e articoli: IIS, PHP, SQL Server, Editor
PHP e IIS
IIS 7 Deep Dive video (italiano)
SQL Server Driver per PHP
MySQL
Editor
PHP on Windows Training Kit
Potete scaricare gratuitamente questo kit che contiene presentazioni tecniche su IIS 7 e SQL Server 2008, che tratta di:
PHP & SQL Server Demos
- Integrazioni di dati geo-spaziali di SQL Server 2008 in PHP
- SQL Server Reporting Services e PHP
PHP & SQL Server Hands On Labs - Introduzione all’uso di SQL Server con PHP
- Usare Full Text Search su documenti documenti Office in PHP
PHP on Windows Hands On Labs - IIS Access Control Features per PHP
- Usare IIS 7.0 Media Features in un’applicazione PHP
- Troubleshooting PHP
- Migrare applicazioni PHP a IIS 7.0
Azure: Cloud Computing e PHP [nuovo]
Siti utili
Forum
Questo post conclude il piccolo esempio con cui è possibile sperimentare l’uso di Silverlight 3 insieme ai .NET RIA Services, trovate le precedenti parti qui:
Validazione
Usiamo il file creato in automatico da Visual Studio per aggiungere delle semplici regole di validazione. Nel mio caso il file si chiama CustomersModel.metadata.cs. Se esplorate il file troverete delle classi che si mappano su quelle del vostro modello dei dati, che espongono delle proprietà sulle quali possiamo intervenire usando opportuni attributi, ad esempio trovate commentati nello stesso file: Required, RegularExpression etc diciamo più o meno intuitivi sul loro significato.
Nel mio caso voglio impostare una semplice regola: il campo CompanyName non può essere nullo ed il relativo messaggio d’errore: “Devi inserire il nome della company”; ok, ecco come si presenta il codice, dove la parte in verde è quella da aggiungere:

Questa operazione “impostata sul server” al momento della compilazione viene “trasportata” anche nel codice proxy generato lato client.
Se ora faccio partire l’applicazione e cerco di togliere dalla Grid, che ha l’edit mode abilitato, il nome della company ottengo una “bellissima” segnalazione dell’errore di validazione. Per il test di questa situazione fate partire l’applicazione senza il debugger collegato (CTRL-F5)
La regola di validazione sta lavorando client-side, quindi senza fare round-trip con il server.
Aggiungiamo un DataForm
OK, aggiungiamo ora un nuovo controllo che può essere utile per visualizzare e fare l’edit di singoli item; nel nostro caso è poco utile perchè la mia grid ha già tutte le proprietà visibili ed è in edit mode, ma insomma …
Aggiungiamo il controllo in XAML e colleghiamolo alla griglia, in modo che quando l’utente cambi focalizzazione i contenuti siano tra loro collegati.
Ecco il codice:
Ed ecco il risultato a video:
Il form permette di abilitare la fase di Editing premendo il bottone a forma di matita in alto a destra, inoltre supporta già, senza ulteriori modifiche al codice, la regola di validazione che ho impostato in precedenza; in più notate anche un error-summary nella parte finale della schermata. Se abilitate l’editing sono in oltre presenti i due bottoni di Save e Cancel con cui è possibile cancellare la modifica fatta o aggiornare lo stato –in memoria- della nostra entità, cioè fino ad ora non è stata propagata nessuna modifica sul database.
Inviamo le modifiche ai .NET RIA Services
Aggiungiamo un semplice bottone ed il relativo handle per il click del mouse.
CustomersDataSource è il nostro DomainContext
Provate … e questo conclude il mio esempio …
Link utili :
Download esempio di codice
Potete scaricare l’esempio di codice da qui, per usarlo dovete modificare la stringa di connessione in modo che punti ad una istanza di SQL Server su cui è installato il db northwind. Nella prima parte di questa serie di post trovate i link a dove installare Silvelight 3 beta ed i .NET RIA Services.
Preferite i bottoni a destra …
o a sinistra …
Ecco come:
Per tutto il resto: Customization in IE8
Nel primo post di questa serie avete visto un piccolo esempio di come costruire uno strato di mid-tier che usi i .NET RIA Services, attualmente in preview. Nella parte finale ho collegato in binding una datagrid di Silverlight per visualizzare i dati, istanziando da codice il DomainContext che, in automatico con la compilazione, viene prodotto lato client. Il nostro DomainContext contiene la collezione delle entità su cui stiamo lavorando, Customers etc, i metodi per le operazioni di lettura, modifica, inserimento e cancellazione sugli stessi.
Facciamolo in modo dichiarativo
Ora rimuoviamo il codice C# , nella MainPage e per proseguire aggiungiamo l’assembly System.Windows.Ria.Controls.dll che si trova nella directory di installazione dei .NET RIA Services: “C:\Program Files\Microsoft SDKs\RIA Services\v1.0\Libraries\Silverlight” e una serie di namespace alla pagina XAML che ci serviranno più avanti:

Inoltre aggiungiamo il namespace al progetto locale che contiene il DomainContext generato dai RIA Services, nel mio caso si tratta di quello dell’applicazione web. Aggiungo anche questo namespace perchè voglio istanziare in XAML, in modo dichiarativo, l’oggetto CustomersContext che prima istanziavo in C#, quindi:

Ora, il controllo DomainDataSource, che conterrà l’istanza del nostro CustomersModel nome del metodo Loadcustomers:
Ora, uso la proprietà ItemsSource della DataGrid per collegare la proprietà Data, dell’elemento appenda dichiarato che si chiama (x:Name) customersDataSource.
Il risultato fino a qui raggiunto è lo stesso di quello ottenuto alla fine del post fatto in precedenza, ma mi dà l’occasione di continuare l’esempio…
Ordinamento
Se ora voglio aggiungere l’ordinamento di default alla DataGrid, usando sempre l’oggetto DomainDataSource, scrivo il codice nell’immagine dove PropertyPath identifica in questo caso il nome della proprietà di cui voglio ottenere l’ordinamento dell’entità Customer.

Filtraggio
Ora aggiungo un semplice TextBox dove l’utente può inserire l’iniziale della città per eseguire il filtraggio dei miei Customers, poi come nel caso seguente modifico il mio DomainDataSource per dare supporto al filtraggio via TextBox.

Paginazione
Aggiungiamo ora il controllo DataPager, impostiamo il numero di dati per pagina uguale a 5 e colleghiamo la sorgente per la paginazione sempre al nostro customersDataSource
Il risultato è quello che vedete nell’immagine sottostante:
Se ricordate all’inizio, il numero di Customers che venivano recuperati dalla query era pari a 20 e la paginazione avviene per pagine di 5 elementi. Questo vuol dire che dopo il primo roundtrip con il server che recupera i 20 clienti, la paginazione nel mio caso avviene, per quegli elementi, sul client, quindi senza andare a chiamare il server quando non è necessario.
Nella prossima parte useremo il nuovo controllo DataForm, aggiungeremo la validazione ed il supporto per le operazioni di update sul database.
I .NET RIA Services (attualmente in Preview rilasciata dopo il MIX09) sono molto interessanti per chi scrive applicazioni e vuole esporre entità tramite servizi e poi consumarle da Silverlight 3. Pensiamo ad esempio ad una piccola applicazione, costruiamo lo strato di accesso ai dati con Entity Framework, vogliamo poi costruire uno strato di servizi per esporre gli stessi dati ad un’applicazione silverlight 3.
Requisiti
Per seguire il mio esempio dovete avere installato:
Attenzione: se sulla vostra macchina sviluppate anche con Silverlight 2, usate una macchina virtuale per Silverlight 3 beta, perchè dopo l’installazione dei tool la macchina sarà configurata per questa versione di Silverlight, la 3 appunto e non vi sarà supporto per creare progetti Silverlight 2.
Esempio
Creiamo un nuovo progetto Silverlight 3, potete anche usare il nuovo template Silverlight Navigation …
Nella maschera successiva, lasciate impostato il flag “Link to ASP.NET server project”. Questo creerà un legame tra il nostro servizio e l’applicazione client (Silverlight) generando ad ogni compilazione delle classi per Silverlight ed il relativo modello che permetteranno l’interazione con la corrispondente parte lato server.
Creiamo uno strato di accesso ai dati
Ora al nostro progetto aggiungiamo un semplice strato di accesso ai dati fatto con Entity Framework, usando northwind e prendendo la tabella Customers, che creerà la corrispettiva classe, immagino fino a qui sia più o meno tutto noto e le immagini seguenti siano esplicative:
Nel disegno futuro potrete usare qualunque tecnologia per lo strato di accesso ai dati usata insieme ai .NET RIA Services: LINQ to SQL, vari ORM, semplici oggetti .NET etc, etc.
Creiamo ora il mid-Tier usando i RIA Service
Ora, sempre sul progetto web, che contiene ora il nostro file.edmx, possiamo aggiungere un DomainDataService. Questo nuovo template per VS 2008:
- crea un servizio REST-based, rendendo possibili operazioni CRUD sulla nostra sorgente dati.
- ci permette di esporre i metadati relativi alle nostre entità. Questi possono essere molto utili in caso volessi aggiungere delle regole di validazione sul modello stesso dei dati (vedete dopo).
Quindi, Add New Item, selezionare Domain Service Class, chiamiamo il nostro servizio ad esempio CustomersService, ad esempio
Ora nella schermata seguente abbiamo la possibilità di selezionare le Entità e se abilitare la modifica su queste, questo creerà dei metodi di Update, Insert e Delete. Inoltre selezionate il flag per creare la classe dei metadati, che ci servirà dopo per la validazione.

l’opzione Enable Client Access è importante: questa crea il legame tra il mid-tier, il nostro progetto web che espone dati, ed il progetto Silverlight 3. Ogni volta che compilo l’applicazioni vengono create delle classi proxy, che si mappano sul modello.
Le classi lato server
Sul server ora vengono create due classi, la prima customerModel, contiene i metoti per ottenere/inserire/modificare e cancellare i nostri customers, le entità del nostro modello:
la classe CustomersModel.metadata.cs contiene i metadati relativi
Le classi lato client: Silverlight
Se compiliamo il progetto, vengono prodotte in automatico delle classi proxy, per vederle in Visual Studio, possiamo usare il bottone per visualizzare tutti i file:
Scriviamo il codice dell’applicazione Silverlight 3
Ora, per renderci conto di come usare i RIA Services (un primo modo per la verità), inseriamo una semplice DataGrid nel progetto Silverlight e poi scriviamo il codice seguente nel file di code-behind:
Se lancio l’applicazione ho i dati visualizzati nelle griglia:
il metodo LoadCustomers è il corrispondente metodo associato al metodo GetCustomers definito a livello di servizio. I RIA Services usano questa convenzione nella nomenclatura, che comunque può essere personalizzata e/o modificata usando l’attributo [Query] sul metodo del Servizio.
Nella prossima parte ci occuperemo di:
- filtraggio, ordinamento, paginazione
- nuovi controlli RIA
- validazione
- operazioni CRUD
Direi che una buona pagina da cui partire è questo documento su MSDN :Performance Considerations for Entity Framework Applications, che punta ad una serie di risorse che ho trovato interessanti.
Cosa influisce sulle performance?
Beh, forse è la prima domanda che ci si pone. Cosa succede al momento della creazione dell’ObjectContext, il punto di accesso con cui usiamo EF ? In un bel post del team viene evidenziato il dettaglio delle operazioni fatte ed il relativo costo:
Da una rapida occhiata si vede come tra le operazioni che hanno più costo, in particolare allo start-up, ci sono:
- View Generation: è il momento in cui vengono create delle viste per le operazioni di query ed update relative allo specifico store utilizzato. Questa operazione può essere evitata: usando il tool EdmGen per generare le view, in un file .cs o .vb e compilarle il tutto assieme, come documentato qui. Nella documentazione MSDN questa operazione(View Generation) è considerata la più costosa (high).
- Materializzazione: cioè il processo di creazione degli oggetti del dominio dal valore ritornato dall’ oggetto DBDataReader. Se gli oggetti già esistono nell’ ObjectContext, usando AppendOnly e PreserveChanges come merge option, questo costo può essere trascurato.
- Anche l’Inizializzazione ed il Loading dei metadati ha un costo (moderato rispetto al primo): è il momento comunque in cui avviene l’apertura della connessione vera e propria.
Nell’ 1% c’è il tempo di esecuzione vero e proprio della query. Nello stesso post c’è anche il grafico del dettaglio di questo costo, con la spiegazione delle singole voci, tolto il tempo di start-up quindi. Vi riporto qui per comodità di lettura:
Quando ho questi costi ?
Ci potremmo chiedere. Ogni volta che creo un ObjectContext, per i tempi di start-up? O quando eseguo una query ?
Nella documentazione MSDN vediamo che alcuni di questi costi sono legati (quindi in qualche modo vivono in una cache) all’ Application Domain e non alla creazione della singola istanza di ObjectContext. Guardate la tabella seguente:
Nell’immagine vedete che i costi più alti ci sono una sola volta per ogni Application Domain.
Infatti se in una Console Application eseguite una query con due istanze dello stesso object Context, che esegue la tessa query 4 volte con il primo e altre 4 volte con il secondo, vedete il costo molto alto solo nel primissimo run:
Inoltre come detto, potrei ridurre il costo della fase di generazione delle view, come documentato qui, nel caso il mio application domain venisse creato e distrutto più volte.
Query: preparazione ed esecuzione
Sempre dalla tabella vista in precedenza, si vedono i costi del tempo di preparazione ed esecuzione delle query sono distinti. EF fa in modo che il tempo di preparazione di ogni singola query sia speso una sola volta per query e quindi poi parte del lavoro riutilizzato. Ad ogni modo è abbastanza intuitivo pensare che all’aumentare della complessità della query i tempi di preparazione ed esecuzione aumenteranno inevitabilmente.
Per ottimizzare il tempo complessivo speso per una query è possibile utilizzare delle query compilate (Documentazione MSDN qui). Una query compilata viene creata una volta sola e puoi può essere riutilizzata con diversi parametri.
Trovate un esempio d’utilizzo in questo post del team di prodotto.
Tracking degli oggetti
Un altro aspetto che nella tabella sopra è contraddistinto come low, ma che è proporzionale al numero di oggetti ritornati e quello relativo al tracking, questa funzionalità dell’ ObjectStateManager che tiene traccia della “vita” delle nostre entità: aggiunta, cancellazione, modifica e l’Entity Key viene usata per identificare le istanze degli stessi.
Quando usate come mergeoptions NoTracking, le operazioni di aggiornamento e risoluzione dell’identità della cache dell’ObjectStateManager non vengono eseguite. Questa opzione ha senso se non dobbiamo tracciare operazioni di modifica/cancellazione e inserimento dei nostri oggetti, ne è tipico l’uso in applicazioni ASP.NET in cui si fa il recupero di dati e non si è interessati ad altro.
Entity Data Model per database con tante tabelle
Da quanto visto in precedenza appare anche un altro aspetto che può essere utile investigare : all’aumentare del numero di tabelle del db che fanno parte di uno stesso Entity Data Model (EDM) le performance decrescono. Da questi due post del team (primo e secondo) i suggerimenti sono di pensare di dividere l’EDM in più parti quando il numero di tabelle è elevato, quando cioè si raggiungono le 50-100 tabelle.
La divisione dell EDM in parti con il riutilizzo parziale di tipi tra EDM diversi non è una cosa banale, poichè il designer di Visual Studio non c’aiuta e quindi bisogna operare a mano sul file CSDL. Trovate degli esempi con diverse strategie proprio nei due post che vi segnalo.
Conclusione
L’ottimizzazione delle performance di EF può tenere conto di diversi aspetti, che ho cercato di ricollegare con un po’ di documentazione, direi che può essere utile almeno tenere presente di:
- generare view pre-compilate per ottimizzare lo start-up
- usare compiled query
- usare NoTracking se possibile
- partizionare l’EDM se molto grosso
- …
Link utili:
Il 16 Giugno a Torino si terrà il workshop di UGISS (User Group Italiano SQL Server).
L’aspetto interessante di questa segnalazione però è il “Call for Paper”, ovvero potete anche voi proporre delle sessioni tecniche su SQL Sever.
Quindi anche se non avete mai fatto una sessione in pubblico, ma conoscete bene l’argomento, può essere una buona occassione.
Concludo con le parole di Davide Mauri : “la community ha bisogno di voi!” e “Fatevi avanti!”