tag:blogger.com,1999:blog-33854722619151162822024-03-16T02:09:35.494+01:00DBTek Technical BlogAzure, ALM, Programmazione, Server e IT Solutions - da un Microsoft MVP in Visual Studio ALMDavidehttp://www.blogger.com/profile/11019920232902260275noreply@blogger.comBlogger109125tag:blogger.com,1999:blog-3385472261915116282.post-64764890745019961162017-03-14T04:26:00.002+01:002017-03-14T04:27:27.846+01:00Build: I minuti sono tornati<div style="text-align: justify;">
Se avete attivato la nuova Home Page dell'account sul vostro Visual Studio Team Services, avrete sicuramente notato che il riepilogo dei minuti di build gratuiti è sparito. Il problema è che non solo è stato tolto dalla pagina iniziale, ma non era stato inserito in nessun'altra schermata.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Finalmente, però, abbiamo di nuovo la possibilità di visualizzare il contatore. Per farlo, bisogna andare sulle impostazioni dell'account, sotto <i><b>Build and Release</b></i>, <i><b>Resource limits</b></i>:</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWEadaSmnfDfIOQHj5lM5hpx93w8iBRTdTPJQ6x8YHcL9_hOaQPD5n0W9hiuByOkIaasshmItf7Dfk0bjd0YywqidqYfey2O8qwazEGtKInVS5DdN43G2Is2cKXf8zzZnAe3mwTkqUEBCy/s1600/Build+Minutes.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="221" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWEadaSmnfDfIOQHj5lM5hpx93w8iBRTdTPJQ6x8YHcL9_hOaQPD5n0W9hiuByOkIaasshmItf7Dfk0bjd0YywqidqYfey2O8qwazEGtKInVS5DdN43G2Is2cKXf8zzZnAe3mwTkqUEBCy/s400/Build+Minutes.png" width="400" /></a></div>
Festeggiamo! I minuti sono tornati :)Davidehttp://www.blogger.com/profile/11019920232902260275noreply@blogger.com0tag:blogger.com,1999:blog-3385472261915116282.post-90930856645076670702017-03-07T06:04:00.004+01:002017-03-07T06:04:32.807+01:00BugGuardian per ASP.NET Core<div style="text-align: justify;">
C'è un nuovo membro nella famiglia BugGuardian.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Un po' di tempo fa ho rilasciato BugGuardian, una libreria che permette di create un work item di tipo Bug o Task sia su Visual Studio Team Services sia su Team Foundation Server, nel caso in cui la nostra applicazione sollevi un'eccezione non gestita. (<a href="http://blog.dbtek.it/2015/08/BugGuardian.html" target="_blank">Maggiori informazioni qui</a>).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Dopo un po', si sono aggiunte altre due librerie: BugGuardian.WebForms e BugGuardian.MVC. Come dice il nome, la prima è pensata per ASP.NET WebForms e l'altra per ASP.NET MVC, e servono per semplificare ulteriormente l'adozione della libreria a chi utilizza quelle piattaforme. Ma hanno un limite: funzionano solamente con ASP.NET tradizionale, su .Net Framework.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Oggi sono felice di annunciare che l'estensione <b>BugGuardian.AspNetCore</b> è finalmente disponibile.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
BugGuardian.AspNetCore è stata sviluppata per supportare specificamente le webapp ASP.NET Core. Aggiunge un middleware all'applicazione che permette di intercettare automaticamente tutte le eccezioni non gestite.</div>
<div style="text-align: justify;">
E la cosa positiva è che supporta sia i progetti ASP.NET Core che utilizzano il full Framework sia quelli scritti con NetCore.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: left;">
Potete trovare il codice sorgente (e tutte le informazioni sulla configurazione della libreria) su GitHub: <a href="https://github.com/n3wt0n/BugGuardian.AspNetCore">https://github.com/n3wt0n/BugGuardian.AspNetCore</a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: left;">
Il pacchetto è anche disponibile su NuGet: <a href="https://www.nuget.org/packages/DBTek.BugGuardian.AspNetCore">https://www.nuget.org/packages/DBTek.BugGuardian.AspNetCore</a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Happy Coding :)</div>
Davidehttp://www.blogger.com/profile/11019920232902260275noreply@blogger.com0tag:blogger.com,1999:blog-3385472261915116282.post-3432269794184987132016-11-28T05:38:00.000+01:002016-11-28T05:38:07.904+01:00WorkItems History: la mia prima estensione per VSTS e TFS<div style="text-align: justify;">
Sono davvero felice ed orgoglioso di condividere la prima versione della mia primissima Estensione per Visual Studio Team Services e Team Foundation Server: <b>WorkItems History</b>.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1Bq7AtXMc1O2cY9V8WMymgDeBSblQX5vFp9yWGax2JpN4fscuDK8cJzfFCqPu0uf89eW8PZdwvnVwbLzr67ZTb09nTjq6zDhyphenhyphente-aiO-qnFzcs_mLQ5S9qmNBa_ualxOJsdomfzQfed4/s1600/WorkItemsHistory.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="273" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1Bq7AtXMc1O2cY9V8WMymgDeBSblQX5vFp9yWGax2JpN4fscuDK8cJzfFCqPu0uf89eW8PZdwvnVwbLzr67ZTb09nTjq6zDhyphenhyphente-aiO-qnFzcs_mLQ5S9qmNBa_ualxOJsdomfzQfed4/s400/WorkItemsHistory.png" width="400" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b><u><i>Cos'è</i></u></b></div>
<div style="text-align: justify;">
WorkItems History è un'estensione che aggiunge un hub "History" alla sezione Work di VSTS/TFS e permette di visualizzare la cronologia dei work item modificati e/o aggiunti al backlog del progetto.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b><i><u>Perchè</u></i></b></div>
<div style="text-align: justify;">
Lavorare in team non è sempre una cos semplice, specialmente quando c'è bisogno di tenere tutte le cose "sotto controllo". Con questa estensione, possiamo avere un po' più di controllo almeno su quello che sta accadendo al nostro lavoro.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b><i><u>Altre info</u></i></b></div>
<div style="text-align: justify;">
Ho deciso di rilasciare questa estensione come Software <b>Open Source</b>.</div>
<div style="text-align: justify;">
Potete dare un'occhiata alla sua pagina di (<a href="https://github.com/n3wt0n/WorkItemsHistory">https://github.com/n3wt0n/WorkItemsHistory</a>) e, se volete, potete contribuire attivamente al progetto. Fate riferimento alle <a href="https://github.com/n3wt0n/WorkItemsHistory/blob/master/.github/CONTRIBUTING.md" target="_blank">Contribution guidelines</a> ed al <a href="https://github.com/n3wt0n/WorkItemsHistory/blob/master/.github/COC.md" target="_blank">Code of Conduct</a> per maggiori dettagli a riguardo.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b><i><u>Utilizzo, supporto e Feedback</u></i></b></div>
<div style="text-align: justify;">
Questa estensione è pubblicamente disponibile attraverso il <b>VS Marketplace</b>, a questo link: <a href="https://marketplace.visualstudio.com/items?itemName=DB.WorkItemsHistory">https://marketplace.visualstudio.com/items?itemName=DB.WorkItemsHistory</a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Potete trovare ulteriori informazioni sull'utilizzo e l'installazione di WorkItems History sul repo <a href="https://github.com/n3wt0n/WorkItemsHistory" target="_blank">GitHub</a>.<br />
<br /></div>
<div style="text-align: justify;">
Nel caso in cui doveste trovare un bug o un comportamento inaspettato dell'estensione, fatemelo sapere attraverso la pagina <a href="https://github.com/n3wt0n/WorkItemsHistory/issues" target="_blank">Issues su GitHub</a> e cercherò di risolverlo prima possibile!</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Attendo i vostri feedback :)</div>
Davidehttp://www.blogger.com/profile/11019920232902260275noreply@blogger.com0tag:blogger.com,1999:blog-3385472261915116282.post-90928615156335931272016-11-17T04:48:00.000+01:002016-11-17T04:48:13.041+01:00Dati e Novità da Connect(); 2016<div style="text-align: justify;">
Mercoledì 16 novembre 2016, Microsoft ha dimostrato all'evento Connect(); 2016 la sua vision sul futuro dello sviluppo software con soluzione che sono indirizzate and ogni sviluppatore, ogni tipo di applicazione ed ogni piattaforma. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Gli speaker hanno anche condiviso diversi dati piuttosto interessanti riguardo l'adozione di prodotti e servizi:</div>
<ul>
<li><div style="text-align: justify;">
Più di 20 milioni di installazioni di Visual Studio 2015 (con la Community edition gratuita che rappresenta oltre 14 milioni sul totale)</div>
</li>
<li><div style="text-align: justify;">
1 milione di utenti mensili attivi (MAU, monthly active users) su Visual Studio Code.</div>
</li>
<li><div style="text-align: justify;">
4.6 milioni di utenti registrati su Visual Studio Team Services</div>
</li>
<li><div style="text-align: justify;">
Più di 25.000 sviluppatori di 1.700 aziende diverse hanno contribuito al .NET Core e altri repository open source relativi, con quasi il 2/3 dei contributi che sono esterni a Microsoft.</div>
</li>
<li><div style="text-align: justify;">
1 milione di membri Visual Studio Dev Essentials</div>
</li>
<li><div style="text-align: justify;">
Gli utenti Xamarin sono aumentati di circa mezzo milione dall'acquisizione, segnando un incremento del 3x rispetto al tasso di crescita precedente</div>
</li>
<li><div style="text-align: justify;">
20.000 registrazioni per la preview privata di SQL Server on Linux, di cui più del 50% sono Fortune 500</div>
</li>
<li><div style="text-align: justify;">
1.6 milioni di account Azure SQL Databases con più di 100 miliardi di query al giorno</div>
</li>
<li><div style="text-align: justify;">
Più di 120.000 nuove sottoscrizioni Azure al mese</div>
</li>
<li><div style="text-align: justify;">
Approssimativamente 1 VM Azure ogni 3 è Linux</div>
</li>
<li><div style="text-align: justify;">
L'utilizzo di Microsoft Graph è cresciuto del 35% mese su mese nello scorso anno</div>
</li>
<li><div style="text-align: justify;">
47.000 third party applications basate su Microsoft Graph e più di 1 miliardo di transazioni API</div>
</li>
<li><div style="text-align: justify;">
Più di 400 milioni di dispositivi hanno installato Windows 10</div>
</li>
</ul>
<div style="text-align: justify;">
Brian Harry ha scritto un blog post molto interessante (<a href="https://blogs.msdn.microsoft.com/bharry/2016/11/16/news-from-connect-2016/" target="_blank">è leggibile qui</a>) con tutti gli annunci relativi alle novità di TFS e VSTS. Dateci un'occhiata!</div>
<div>
<br /></div>
<br />Davidehttp://www.blogger.com/profile/11019920232902260275noreply@blogger.com0tag:blogger.com,1999:blog-3385472261915116282.post-89706850947355503122016-09-05T21:53:00.000+02:002016-09-30T06:54:01.590+02:00A proposito della Build di Xamarin (di nuovo)<div style="text-align: justify;">
In aprile, in uno dei miei post (<a href="http://blog.dbtek.it/2016/04/a-proposito-della-build-di-xamarin-con.html" target="_blank">leggilo qui</a>) avevo spiegato come non fosse più necessario aggiungere lo step "<b>Xamarin License</b>" per effettuare la build di una soluzione Xamarin con gli Hosted Agents.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
A partire da ora, non è più necessario includere quello step su qualsiasi build Xamarin, sia che si tratti di agenti installati on premises sia con gli agenti Hosted.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Infatti, come riportato sulle note di rilascio del nuovo update di Visual Studio Team Service: </div>
<div style="text-align: justify;">
<br /></div>
<blockquote class="tr_bq" style="text-align: justify;">
The Xamarin License step is no longer necessary and has been removed from the build templates shipped with VSTS and TFS 15. As part of this effort we will also deprecate the task. All build definitions that use this task should be updated to remove it in order to prevent any disruption when the task is finally removed.</blockquote>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Buone build a tutti ;)</div>
Davidehttp://www.blogger.com/profile/11019920232902260275noreply@blogger.com0tag:blogger.com,1999:blog-3385472261915116282.post-22898433203130249732016-04-29T05:33:00.000+02:002016-04-29T05:44:31.635+02:00A proposito della Build di Xamarin con gli Hosted Agent di VSTS<div style="text-align: justify;">
Venerdì scorso (<i>22/04/2016)</i> durante un'evento organizzato da <a href="http://www.dotnettoscana.org/" target="_blank">DotNetToscana</a> ho avuto modo di parlare, tra le altre cose, della <b>build di applicazioni sviluppate con Xamarin utilizzando gli Hosted Agent di Visual Studio Team Services</b>. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Per poter far funzionare il tutto, nella build definition ho dovuto inserire due task relativi alla <b>Xamarin License</b>: uno che attivava la licenza ed un altro che, dopo la compilazione, la disattivava. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
E proprio riguardo a questi due task, c'è una piccola grande novità: <b>ora non sono più necessari</b>. </div>
<div style="text-align: justify;">
Con il deploy che hanno fatto qualche giorno fa, infatti, gli Hosted Build Agent hanno già una loro licenza interna che viene attivata automaticamente nel momento in cui devono compilare i progetti Xamarin. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Riepilogando, se avete o dovete fare delle build definition per Xamarin (ed usate gli Hosted Agent) ora non dovete più aggiungere i task di attivazione e disattivazione della licenza. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Buona build a tutti :)</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSt3it2IA8ciPQqgY56QzI9RU13CbovXw-tstRLKVXrfWOb3QLXKUnjOPxoG3cJJsRBeKRDExIJ1lPqYugq6PyZfOPNKSZ959zOiciiCGHiYD4DW-DXSlo_iA6NgIvD3DT2k042quLZ6DT/s1600/IC835090%255B1%255D.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="220" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSt3it2IA8ciPQqgY56QzI9RU13CbovXw-tstRLKVXrfWOb3QLXKUnjOPxoG3cJJsRBeKRDExIJ1lPqYugq6PyZfOPNKSZ959zOiciiCGHiYD4DW-DXSlo_iA6NgIvD3DT2k042quLZ6DT/s400/IC835090%255B1%255D.png" width="400" /></a></div>
<div style="text-align: justify;">
<br /></div>
Davidehttp://www.blogger.com/profile/11019920232902260275noreply@blogger.com10tag:blogger.com,1999:blog-3385472261915116282.post-61478924503220449782016-04-05T05:56:00.000+02:002016-04-05T05:57:23.094+02:00Disponibili BugGuardian.MVC e BugGuardian.WebForms<div style="text-align: justify;">
Oggi sono veramente felice di poter annunciare il rilascio di 2 moduli addizionali per <a href="http://blog-eng.dbtek.it/2015/08/BugGuardian.html" target="_blank">BugGuardian</a>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Per chi non lo conoscesse, BugGuardian è una libreria che permette di creare in modo molto semplice dei work item di tipo Bug su un account <i>Visual Studio Team Services</i> o su un <i>Team Foundation Server 2015</i> on-premises nel caso in cui l'applicazione sollevi un'eccezione non gestita (Unhandled Exception).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Per supportare nel modo migliore l'integrazione di questa libreria con i progetti web, da oggi sono disponibili <i><b>BugGuardian.MVC</b></i> and <i><b>BugGuardian.WebForms</b></i>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b><u>BugGuardian.MVC</u></b> (<a href="https://github.com/n3wt0n/BugGuardian.MVC" target="_blank">GitHub</a>, <a href="https://www.nuget.org/packages/DBTek.BugGuardian.MVC/" target="_blank">NuGet</a>) è un estensione di BugGuardian scritta specificamente per supportare ed integrarsi con le applicazioni Asp.net MVC. </div>
<div style="text-align: justify;">
Aggiunge degli Action Filter alle tue applicazioni in modo da poter intercettare automaticamente tutte le eccezioni non gestite.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b><u>BugGuardian.WebForms</u></b> (<a href="https://github.com/n3wt0n/BugGuardian.WebForms" target="_blank">GitHub</a>, <a href="https://www.nuget.org/packages/DBTek.BugGuardian.WebForms/" target="_blank">NuGet</a>), invece, è un modulo aggiuntivo per BugGuardian scritto specificamente per supportare le applicazioni Asp.net WebForms.</div>
<div style="text-align: justify;">
<br />
Queste due nuove librerie sono entrambe basate sulla nuova versione 1.3.0 di BugGuardian (anch'essa rilasciata da pochissimo) e supportano progetti che utilizzano il .Net Framework v4.0 e superiori.<br />
<br /></div>
<div style="text-align: justify;">
Com'è per BugGuardian, queste due librerie aggiuntive sono Open Source; guardate pure il codice su GitHub.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Se doveste avere dubbi o problemi durante l'utilizzo di queste nuove librerie, fatemelo sapere attraverso le rispettive Issues page di GitHub e cerchero di fixare il problema prima possibile!</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Di nuovo, Voglio ringraziare il mio amico e "collega" MVP Marco Minerva (<a href="https://twitter.com/marcominerva" target="_blank">@marcominerva</a>, <a href="https://github.com/marcominerva" target="_blank">GitHub</a>) per il supporto ed i suggerimenti.</div>
Davidehttp://www.blogger.com/profile/11019920232902260275noreply@blogger.com44tag:blogger.com,1999:blog-3385472261915116282.post-18262314455152139212015-08-20T09:50:00.000+02:002015-08-20T09:50:00.242+02:00Benvenuto BugGuardian<div style="text-align: justify;">
Qualcuno avrà probabilmente notato che negli ultimi mesi ho scritto solo qualche post qui sul blog. Questo per due motivi principali<br />
<br /></div>
<div style="text-align: justify;">
Il primo è che, come alcuni già sanno, qualche mese fa mi sono trasferito in un altro paese, piuttosto lontano, con una cultura ed una lingua piuttosto differenti, dove ho iniziato una nuova avventura. Questo ha inevitabilmente preso molto del mio già risicato tempo libero.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Il secondo motivo per cui non sono stato molto attivo qui, che è anche la ragione di questo post, è che ho lavorato ad un nuovo progetto che ho rilasciato oggi: BugGuardian.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b><u>Cos'è BugGuardian</u></b></div>
<div style="text-align: justify;">
BugGuardian è una libreria Open Source, scritta in C# Shared Project, che permette di creare in modo molto semplice dei work item di tipo Bug su un account <b>Visual Studio Online</b> o su un <b>Team Foundation Server 2015</b> on-premises nel caso in cui l'applicazione sollevi un'eccezione non gestita (Unhandled Exception).<br />
Può essere ovviamente usata anche con delle invocazioni manuali nei blocchi di try/catch per tenere traccia delle eccezioni gestite.<br />
<br /></div>
<div style="text-align: justify;">
Questa libreria supporta applicazioni scritte con il .Net Framework v4.0 e superiori e può essere usata in moltissimi tipi di progetto, tra cui:</div>
<ul>
<li>Asp.net</li>
<li>Asp.net MVC</li>
<li>WPF</li>
<li>Windows 8 / 8.1 Apps</li>
<li>Windows Phone 8 / 8.1 Apps</li>
<li>Universal App</li>
<li>Universal Windows Platform Apps (Windows 10)</li>
<li>ecc
</li>
</ul>
<div style="text-align: justify;">
Come ho detto, si tratta di un <b>OSS</b> quindi potete trovare tutti i sorgenti pubblicati su <b><a href="https://github.com/n3wt0n/BugGuardian" target="_blank">GitHub</a></b>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Per poterla installare ed usare senza necessariamente doverla compilare manualmente, ho pubblicato il pacchetto su <b><a href="https://www.nuget.org/packages/DBTek.BugGuardian" target="_blank">NuGet</a></b>. È sufficiente cercare <i>BugGuardian</i> nella Package Manager GUI o eseguire il seguente comando Package Manager Console:<br />
<i>Install-Package DBTek.BugGuardian</i></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b><u>Utilizzo, supporto e Feedback</u></b></div>
<div style="text-align: justify;">
Per trovare linee guida ed esempi sull'utilizzo della libreria consultate la <a href="https://github.com/n3wt0n/BugGuardian/wiki" target="_blank">documentazione del progetto</a>. Inoltre nella cartella <i>TestApps</i> dei sorgenti ci sono alcuni esempi di utilizzo con i tipi di applicazione più comuni.<br />
<br />
Ad ogni modo, solo per fare un esempio di quanto sia semplice utilizzarla, questo è il codice di cui avrete bisogno per gestire un'eccezione e creare il relativo Bug su VSO / TFS:<br />
<br />
<pre class="brush: csharp">using (var creator = new DBTek.BugGuardian.Creator())
{
creator.AddBug(myException);
}
</pre>
<br /></div>
<div style="text-align: justify;">
Se avete dei dubbi o dei problemi durante l'utilizzo di questa libreria, fatemelo sapere attraverso la <a href="https://github.com/n3wt0n/BugGuardian/issues" target="_blank">Issues page</a> di GitHub e cerrchero di fixare il problema prima possibile!</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Attendo i vostri feedback :)</div>
<br />
<br />
Voglio ringraziare il mio amico e "collega" Marco Minerva (<a href="http://www.twitter.com/marcominerva" target="_blank">@marcominerva</a>) per il supporto, la pazienza e la Code Review.<br />
<br />Davidehttp://www.blogger.com/profile/11019920232902260275noreply@blogger.com0tag:blogger.com,1999:blog-3385472261915116282.post-16330450028217585632015-07-27T06:22:00.001+02:002015-07-27T06:22:25.408+02:00Deployare una Web App su Azure con la nuova Build di Visual Studio Online<div style="text-align: justify;">
In questo post vedremo come fare, iniziando da 0, a deployare una nostra soluzione su una Web App di Azure utilizzando la nuova Build di Visual Studio Online.</div>
<div style="text-align: justify;">
Per farlo, useremo esclusivamente il portale web di VSO.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b><u>Collegare Azure a VSO</u></b></div>
<div style="text-align: justify;">
Innanzitutto bisogna "far sapere" a Visual Studio Online che abbiamo un account Azure che vogliamo utilizzare come endpoint di deploy per la nostra soluzione.</div>
<div style="text-align: justify;">
Per farlo, dobbiamo andare nella parte dei setting del progetto (cliccando sull'apposito bottone presente in alto a destra, dopo essere entrati nella pagina del progetto), cliccare sulla tab "<i>Services</i>", poi su "<i>Add new Service Connection</i>" ed infine su "<i>Azure</i>".</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWN05Gdk7rcwmFHze-yzKoszUKv58eYXClY7Qv6eiZUdZgBhgi0thmzxlYE5roEKkcIApYlRzJkdljlAAXvoXSsKPmgb-j66kNT8PeFoC58hAH6g837kgwWr7xji31mLscfqXuUwcpyYV-/s1600/01+-+New+service+connection.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWN05Gdk7rcwmFHze-yzKoszUKv58eYXClY7Qv6eiZUdZgBhgi0thmzxlYE5roEKkcIApYlRzJkdljlAAXvoXSsKPmgb-j66kNT8PeFoC58hAH6g837kgwWr7xji31mLscfqXuUwcpyYV-/s400/01+-+New+service+connection.png" width="400" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
A questo punto si aprirà un popup dove dovremo inserire l'ID della sottoscrizione Azure che contiene o conterrà la web app da pubblicare, un nome (anche se il campo si chiama "<i>Subscription Name</i>", non è necessario usare il nome della sottoscrizione, si tratta di un campo di testo libero che ci servirà per identificare la sottoscrizione nel caso ne collegassimo più di una a VSO) e le modalità di autenticazione.</div>
<div style="text-align: justify;">
È possibile utilizzare sia un certificato (reperibile tramite il portale di Azure) sia direttamente le credenziali.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Fatto questo, la nostra subscription di Azure e il nostro account Visual Studio Online saranno collegati (almeno su questo team project).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b><u>Creare la build definition</u></b></div>
<div style="text-align: justify;">
Ora che abbiamo impostato la connessione tra VSO ed Azure, spostiamoci nella sezione Build del progetto e creiamo una nuova build definition di tipo deployment.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik1oR2NotUosrv7khb6L7ujDVGxOjzwnfr7FqIp97I6vtkgwSHaWIbpsC8ikXeFa9IEYpAX-YVTSHdlRYE67_zSX9AQW5UNLCyoCbw0letQqeJF4S0-kZoXPmpl9q2J-nNu8jKq4iQOtuG/s1600/02+-+New+Build+Definition.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="263" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik1oR2NotUosrv7khb6L7ujDVGxOjzwnfr7FqIp97I6vtkgwSHaWIbpsC8ikXeFa9IEYpAX-YVTSHdlRYE67_zSX9AQW5UNLCyoCbw0letQqeJF4S0-kZoXPmpl9q2J-nNu8jKq4iQOtuG/s400/02+-+New+Build+Definition.png" width="400" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Siccome vogliamo deployare su Azure, nella sezione "<i>Deployment</i>" scegliere "<i>Azure Website</i>" come indicato nell'immagine.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Verrà create una nuova build definition con alcuni step da configurare.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Vediamo passo passo come procedere.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCo7g5s1_EASTv4yeq8pUey8cbUmK7mRPGnvpLaqUUi9sue6GjfpL-14QDsP2-fugMNYWklawI1LDu4bbLfLrc6j6g0qfhU7BlTsbN_jME6O_xfH3_iGvXYlDy4KL3_2BH164OTz4jHFQI/s1600/03+-+Build.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="238" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCo7g5s1_EASTv4yeq8pUey8cbUmK7mRPGnvpLaqUUi9sue6GjfpL-14QDsP2-fugMNYWklawI1LDu4bbLfLrc6j6g0qfhU7BlTsbN_jME6O_xfH3_iGvXYlDy4KL3_2BH164OTz4jHFQI/s400/03+-+Build.png" width="400" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Il primo step rappresenta il vero e proprio processo di Build. È completamente configurabile, ma la cosa più importante è quella di definire il file di soluzione che dovrà essere utilizzato come source della build. Va selezionato nella casella indicata dalla freccia rossa.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Nel secondo step vanno inseriti i criteri di esecuzione post-build degli Unit Test. Se non abbiamo degli unit test (male...) oppure non vogliamo eseguirli (male anche questo :) ) possiamo eliminare questo step cliccando sulla "X" che compare spostanto il mouse su questo step.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Il terzo step è quello che ci interessa di più in quanto è quello che si occupa di fare il deploy del risultato della Build verso la nostra web app su Azure.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-lUPtwRjBTj6gsYkxh9Ql30oAgH-X3RdEvcmv4lOEBl1AfVJZXmNzOLzU0Ko796sfC0CJbsaITEjpSJOzflqQDZveGfLVYi40G46Xs__NlV-LbZ6_VyZAIz5lPlS-8RnMl3YetO2wwD4H/s1600/04+-+Deploy.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="195" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-lUPtwRjBTj6gsYkxh9Ql30oAgH-X3RdEvcmv4lOEBl1AfVJZXmNzOLzU0Ko796sfC0CJbsaITEjpSJOzflqQDZveGfLVYi40G46Xs__NlV-LbZ6_VyZAIz5lPlS-8RnMl3YetO2wwD4H/s400/04+-+Deploy.png" width="400" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Qui troviamo un menu a discesa in cui, se l'associazione della sottoscrizione Azure è andata a buon fine, troviamo le nostre sottoscrizioni collegate a VSO e possiamo scegliere quella che faà da target per il deploy.</div>
<div style="text-align: justify;">
Nella casella successiva, denominata "<i>Web App Name</i>" dobbiamo inserire manualmente il nome della Web App di destinazione. Come vedete in realtà si tratta anche in questo caso di una Combo Box, ma al momento attuale le Web App già esistenti non vengono caricate automaticamente (non dimentichiamo che questa nuova build è ancora in preview).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Ecco quindi alcuni consigli e note:</div>
<div style="text-align: justify;">
</div>
<ul>
<li>Se inseriamo un nome di una web app che non esiste nella nostra sottoscrizione e che non esiste nella region selezioanta, verrà creata su Azure nella region selezionata</li>
<li>Se inseriamo un nome di una web app che non esiste nella nostra sottoscrizione ma che esiste già in quella region, verrà restituito un errore in fase di deploy</li>
<li>Se inseriamo un nome di una web app che esiste già nella nostra sottoscrizione ma che è in una region diversa, verrà restituito un errore in fase di deploy</li>
<li>Se inseriamo un nome di una web app che esiste già nella nostra sottoscrizione e che si trova nella region selezionata, il deploy utilizzerà quella web app e la aggiornerà</li>
</ul>
<br />
<div style="text-align: justify;">
Quindi attenzione a quello che scriviamo :)</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
I due step rimanenti danno la possibilità di indicizzare e pubblicare i simboli della nostra applicazione (consigliato per poter avere informazioni aggiuntive in caso di eccezioni non gestite) e di pubblicare gli artifact risultati dalla build.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Quando abbiamo impostato tutti i parametri, possiamo salvare la nostra build definition assegnandole un nome.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4BQ4_5QEr9_kBXXj5jmy0i4AvDCgrycOklFF12krH3LSiYJ-KOE0_3aRyy-mY8BOB6SblYRzFt7_H3bShDzJOxctj8oaCuOfzUgVRS8UApTJdW3Jqd4WkYpxtwSeLLIU8fjoTHyqcwXnY/s1600/05+-+Tabs.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="30" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4BQ4_5QEr9_kBXXj5jmy0i4AvDCgrycOklFF12krH3LSiYJ-KOE0_3aRyy-mY8BOB6SblYRzFt7_H3bShDzJOxctj8oaCuOfzUgVRS8UApTJdW3Jqd4WkYpxtwSeLLIU8fjoTHyqcwXnY/s400/05+-+Tabs.png" width="400" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Possiamo anche modificare i vari parametri di default navigando nelle varie tab per personalizzare la build secondo le nostre esigenze.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b><u>Deployamo!</u></b></div>
<div style="text-align: justify;">
Una volta completate le personalizzazioni, è il momento di lanciare la compilazione e di verificare che il processo di deploy vada a buon fine.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Per lanciare la build, utilizziamo il bottone "<i>Queue build</i>" presente nella toolbar della build definition oppure nel menu contestuale della build stessa.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVYiwnVK6byvdxjnDLdKXxsiUc_dHLskVPJpvr_74JSNWNFfbN3f4ul-as3NCRSpb0oiYQ9bt0GTA1qIB2ALUAk9rOJNaAxY1o9O3UmZ5BlsyiHkbf44obClODx92pSYF2kPFZO_elzlQE/s1600/06+-+Queue+build.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVYiwnVK6byvdxjnDLdKXxsiUc_dHLskVPJpvr_74JSNWNFfbN3f4ul-as3NCRSpb0oiYQ9bt0GTA1qIB2ALUAk9rOJNaAxY1o9O3UmZ5BlsyiHkbf44obClODx92pSYF2kPFZO_elzlQE/s400/06+-+Queue+build.png" width="400" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Quando clicchiamo su quel bottone, il sistema accoderà una build su un agente di compilazione presente sui nostri server oppure in un datacente Microsoft (nel caso in cui abbiamo scelgto di utilizzare la build "hosted")</div>
<div style="text-align: justify;">
In ogni caso il progesso sarà visibile nella console real time presente sul web.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Prima verranno eseguiti i task di build e di test:</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxX6G_FM1d5CVOv7kOixXTD-oGrKIYiRpnqJJI1YnCc8zlA3u4bZBh2-uhxNs1S9l1CAT9DpTuaDbKeZx79dr10U2Q011qdb6_XqjmOOIPKR6NqoCSazWK-okcAIOr-WkgDgFW3jLhKdEQ/s1600/07+-+Build+in+progress.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="211" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxX6G_FM1d5CVOv7kOixXTD-oGrKIYiRpnqJJI1YnCc8zlA3u4bZBh2-uhxNs1S9l1CAT9DpTuaDbKeZx79dr10U2Q011qdb6_XqjmOOIPKR6NqoCSazWK-okcAIOr-WkgDgFW3jLhKdEQ/s400/07+-+Build+in+progress.png" width="400" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Poi, al successo di entrambi, il deploy verso azure:</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYlsquqLwCXjhhZgQinStKa3s2jHL_Vem3Dh77rY4XVV76qtZBa_FGEymWyWzQjBE_L_y5QfB8H1a16UAaHVl3VDwuSqLONXIT0JsuKEdeJ71Qif3SPbwJv5nEbB7I4sqrSzN9ssM96pLa/s1600/08+-+Deploy+in+progress.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="283" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYlsquqLwCXjhhZgQinStKa3s2jHL_Vem3Dh77rY4XVV76qtZBa_FGEymWyWzQjBE_L_y5QfB8H1a16UAaHVl3VDwuSqLONXIT0JsuKEdeJ71Qif3SPbwJv5nEbB7I4sqrSzN9ssM96pLa/s400/08+-+Deploy+in+progress.png" width="400" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Quando tutto sarà finito, avremo la nostra applicazione funzionante e deployata su Azure. <i>Facile</i>!</div>
Davidehttp://www.blogger.com/profile/11019920232902260275noreply@blogger.com0tag:blogger.com,1999:blog-3385472261915116282.post-53374094555077548562015-06-16T11:50:00.002+02:002015-06-16T11:52:00.455+02:00Creare un Reader RSS in una Partial View di Umbraco 7Ci sono molti modi di creare ed includere un reader RSS in una pagina di Umbraco: usare un custom controller, usare delle marco XSL, ecc...<br />
<br />
Ma se volessimo usare solamente una Partial View MVC senza sviluppare un controller custom?<br />
<br />
Beh, è veramente semplice raggiungere questo obiettivo con solo pochissime righe di C#<br />
<br />
<pre class="brush: csharp">
@inherits Umbraco.Web.Mvc.UmbracoTemplatePage
@using System.ServiceModel
@using System.ServiceModel.Syndication
@using System.Xml
@{
string url = "http://your_blog_rss_url";
XmlReader reader = XmlReader.Create(url);
SyndicationFeed feed = SyndicationFeed.Load(reader);
reader.Close();
}
@foreach(var feedItem in feed.Items)
{
<div class="col-md-6">
<article>
<div class="date">
<span class="day">@feedItem.PublishDate.Day</span>
<span class="month">@GetMonthName(feedItems[i].PublishDate.Month)</span>
</div>
<h4 class="heading-primary"><a href="@feedItem.Links[4].Uri">@feedItems[i].Title.Text</a></h4>
<p>@(feedItem.Summary.Text + "... ") <a href="@feedItem.Links[4].Uri" class="read-more">read more <i class="fa fa-angle-right"></i></a></p>
</article>
</div>
}
</pre>
<br />
Come potete vedere, sono bastate alcune righe di codice ed abbiamo il nostro Reader RSS. A questo punto è necessario semplicemente includere questa partial view nella pagina che ci interessa per vedere il nostro feed RSS.<br />
Ovviamente è possibile cambiare il layout, quello nell'emepio è solo quello che ho usato io per il mio progetto.<br />
<br />
Solo 2 note:<br />
<ol>
<li>Io ho usato "<i>feedItem.Links[4].Uri</i>" per recuperare l'url del blog post, questo funziona se si usa blogger come hoster. Se invece utilizzate altre piattaforme di blogging, dovrete scorrervi la collection Links per scoprire dov'è l'url che vi serve.</li>
<li>Il <i>"@GetMonthName</i>" è solamente un Helper che converte il "numero" del mese nel suo nome.</li>
</ol>
Davidehttp://www.blogger.com/profile/11019920232902260275noreply@blogger.com0tag:blogger.com,1999:blog-3385472261915116282.post-75876764742041749052015-06-08T09:00:00.000+02:002015-06-08T09:00:04.591+02:00Cloud Load Test con Visual Studio Online - parte 2: Visual Studio<div style="text-align: justify;">
Questo articolo è il secondo di una serie di 3 in cui parlo del Cloud Load Testing con Visual Studio Online.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Nella <a href="http://blog.dbtek.it/2015/01/cloud-load-test-con-visual-studio.html" target="_blank">prima parte</a> abbiamo visto come eseguire dei semplici test di carico usando solamente il portale di VSO.</div>
<div style="text-align: justify;">
In questo articolo invece vedremo un soluzione più complessa (ma più completa), l'integrazione tra Visual Studio e Visual Studio Online.</div>
<br />
<b><u>Remainder</u></b><br />
<div style="text-align: justify;">
Prima di iniziare a parlare nello specifico dell'esecuzione dei Cloud Load Test è importante ricordare alcuni aspetti:</div>
<br />
<ul>
<li style="text-align: justify;">Per poter utilizzare la funzionalità di Cloud Load Test è necessario avere una sottoscrizione MSDN Ultimate</li>
<li style="text-align: justify;">L'applicazione da testare deve essere esposta sul web (visto che i test agent sono nel cloud e devono poter raggiungere l'applicazione)</li>
<li style="text-align: justify;">Gratuitamente si possono utilizzare fino a 20.000 minuti al mese. Si tratta di "virtual user minutes", quindi ad esempio eseguendo 1 test da 2 minuti con un carico costante di 200 virtual user si consumeranno 400 virtual user minutes.</li>
</ul>
<br />
<div style="text-align: justify;">
Inoltre, la funzionalità di Load test è disponibile solamente su Visual Studio Ultimate/Enterprise.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Fatte queste precisazioni, vediamo come si possono creare ed eseguire i test di carico con Visual Studio e Visual Studio Online.</div>
<br />
<br />
<b><u>Introduzione</u></b><br />
<div style="text-align: justify;">
Facendo un Load test con Visual Studio, avremo un sacco di impostazioni che potremo configurare. Si tratta quindi della soluzione più personalizzabile e configurabile per eseguire questo tipo di test.</div>
<div style="text-align: justify;">
Inoltre, dopo l'esecuzione avremo a disposizione molte informazioni, dati e grafici che ci permetterranno di capire come la nostra applicazione si comporta in uno scenario di carico.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Ultimo ma non per importanza, utilizzando VS possiamo fare un test multi step (multi pagina), anche con pagine sottoposte ad autenticazione, e possiamo registrare tutti i passaggi che vogliamo fare nell'applicazione allo stesso modo di come li farebbe l'utente (quindi non è richiesta configurazione manuale!).</div>
<br />
<br />
<b><u>Iniziamo</u></b><br />
<div style="text-align: justify;">
Prima di tutto dobbiamo creare un test project in Visual Studio. Il project template da usare è "Web Performance and Load Test Project".</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyLhxR5pLZ3oWOgoHT60Th_aKeEuIpmoRotoGMEwG3gZRmtqdRnJqEUqKiriBs-e9-t1JaKwk3XAre3pYY_2xCf1L4dsT1M9Wh8OlRnpO-ghhTDCTx2D0IWrdr9oDO5sGuL5JIYTGoOulL/s1600/201+-+New+project.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="186" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyLhxR5pLZ3oWOgoHT60Th_aKeEuIpmoRotoGMEwG3gZRmtqdRnJqEUqKiriBs-e9-t1JaKwk3XAre3pYY_2xCf1L4dsT1M9Wh8OlRnpO-ghhTDCTx2D0IWrdr9oDO5sGuL5JIYTGoOulL/s400/201+-+New+project.png" width="400" /></a></div>
<br />
<div style="text-align: justify;">
Quando clicchiamo sul bottone "Ok", VS crea per noi una soluzione (come sempre) con all'iterno un progetto "WebTest1.webtest". Non si tratta di un progetto di "Cloud Test", bensì di un progetto "Web Performance". Avremo bisogno di questo progetto per "istruire" il load test su cosa e come testare.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
In alto a sinistra della schermata c'è un piccolo bottone con un grosso punto rosso: è il bottone che ci permette di resgistrare tutti gli step che faremo nella nostra applicazione.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguvXTTpVQRdvfQy0KyEAZDDxWIMq656iRaTIV9f4jYE2QnTMCiPsCHzqZkzQESNZeWtPXuOk-33zrlkSYCixmjrtymiZwpwnf1Feu_S2GwyY4d32MunI0d3aBAKX656LyHo2olfRuQZAqC/s1600/202+-+Record+button.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="270" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguvXTTpVQRdvfQy0KyEAZDDxWIMq656iRaTIV9f4jYE2QnTMCiPsCHzqZkzQESNZeWtPXuOk-33zrlkSYCixmjrtymiZwpwnf1Feu_S2GwyY4d32MunI0d3aBAKX656LyHo2olfRuQZAqC/s400/202+-+Record+button.png" width="400" /></a></div>
<br />
<div style="text-align: justify;">
Se clicchiamo su questo bottone, verrà aperto il browser (tipicamente IE) che avrà un piccolo pannello sulla sinistra. Si tratta del pannello che "fa il lavoro per noi"; è generato dal plugin "Web Test Recorder helper" che VS installa sulla nostra macchina.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhddyy100nu2nkvRDwD0_UQ5oY5XUfrzUNkpSQXO7ApsBApGVh8gUYbvEiB75ynWmfhHWCFJTwALhiZJne6JGHUnLT3IFEabPPvx24UWRLEfSleNwkmBF2lspeYzfBf5Bw1czzohg8pCkX0/s1600/203+-+Record+pane.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="170" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhddyy100nu2nkvRDwD0_UQ5oY5XUfrzUNkpSQXO7ApsBApGVh8gUYbvEiB75ynWmfhHWCFJTwALhiZJne6JGHUnLT3IFEabPPvx24UWRLEfSleNwkmBF2lspeYzfBf5Bw1czzohg8pCkX0/s400/203+-+Record+pane.png" width="400" /></a></div>
<br />
<div style="text-align: justify;">
Come nota a margine, ricordate di verificare che quel plugin sia abilitato sul browser altrimenti non verrà visualizzato nulla.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiM2RHTMPfHIraHl8OKwkmkxP5k1pfS6SUZ6ENtCzBpzMmdX09rfVeEjqlTCsAS-GM8J5UUjrTMENUXstj-BelN0QfcyLCsP6J49Ao_JZHJnWts6iOIxHBdb00k52vc5E2PgaWAgbNwhxt-/s1600/204+-+plugin.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="197" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiM2RHTMPfHIraHl8OKwkmkxP5k1pfS6SUZ6ENtCzBpzMmdX09rfVeEjqlTCsAS-GM8J5UUjrTMENUXstj-BelN0QfcyLCsP6J49Ao_JZHJnWts6iOIxHBdb00k52vc5E2PgaWAgbNwhxt-/s400/204+-+plugin.png" width="400" /></a></div>
<br />
<div style="text-align: justify;">
Ok, ora che la registrazione è attiva possiamo visitare ed usare l'applicazione che vogliamo testare esattamente come farebbe un normale utente. Possiamo anche eseguire azioni particolari se vogliamo testare qualche funzionalità o pagina specifica.</div>
<div style="text-align: justify;">
Per far iniziare la registrazione è sufficiente scrivere l'indirizzo dell'applicazione nella barra del browser ed iniziare ad usarla: il web recorder plugin farà tutto il resto.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Quando abbiamo finito, abbiamo cioè effettuato tutti gli step e le navigazioni che vogliamo testare, basta clicare sul bottone "Stop". Abbiamo anche la possibilità di mettere in pausa la registrazione se magari non vogliamo registrare qualche step.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi51WnVYsbFVg9tjgds2adnJCxmkq-bgXWU7MM908z3tBv4GLw3OnelOoDgy3iGUCZeUn1UtoiEx7EYj0ZXgw_iwVgPVaLdaoI4YbYPMkETzzCBhkfK1Z1ChUKuH6I8LKukpIXH4KYETwqM/s1600/205+-+Recording+in+progress.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="133" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi51WnVYsbFVg9tjgds2adnJCxmkq-bgXWU7MM908z3tBv4GLw3OnelOoDgy3iGUCZeUn1UtoiEx7EYj0ZXgw_iwVgPVaLdaoI4YbYPMkETzzCBhkfK1Z1ChUKuH6I8LKukpIXH4KYETwqM/s400/205+-+Recording+in+progress.png" width="400" /></a></div>
<br />
<div style="text-align: justify;">
Mentre navighiamo la nostra applicazione, un sacco di "roba" viene aggiunta nel pannello di registrazione. Si tratta di tutte le richieste che la nostra applicazione fa.</div>
<div style="text-align: justify;">
Se ne selezioniamo una e clicchiamo sul bottone "comment" possiamo aggiungere un commento alla stessa che sarà possibile recuperare in un secondo momento.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Quando clicchiamo sul bottone "Stop", succede "la magia". Dapprima Visual Studio prende tutte le richieste e le informazioni dal web recorder plugin, le elabora e le inserisce nella finestra del webtest. Poi cerca di identificare se ci sono dei "parametri dinamici" nel nostro test.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2cL1F0jNicuT4Fz-0IXaKTbylGUcD3mYPo80MzXqZwyhOLmzTV77yodVJLYDzoeZV3xbVMzJe6xOMMl6cbbiC9bKQ1jwkHf9W6aMXEKrs4l9Es9y2Fjw6xNgJz7Se2JA1lrGOqwk9SyN-/s1600/206+-+Detecting+params.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="397" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2cL1F0jNicuT4Fz-0IXaKTbylGUcD3mYPo80MzXqZwyhOLmzTV77yodVJLYDzoeZV3xbVMzJe6xOMMl6cbbiC9bKQ1jwkHf9W6aMXEKrs4l9Es9y2Fjw6xNgJz7Se2JA1lrGOqwk9SyN-/s400/206+-+Detecting+params.png" width="400" /></a></div>
<br />
<div style="text-align: justify;">
I dynamic parameters sono tutti quei valori che possono cambiare se le richieste vengono fatte in momenti temporali differenti: user token, ricerche, autenticazioni, ecc. Se VS ne rileva qualcuno ci mostrerà una finestra in cui potremo decidere come e se utilizzarli. Possiamo selezionare di utilizzare per ogni iterazione di test esattamente quelli che sono stati registrati oppure se associare quei parametri ad una sorta di dizionario (che andremo a creare) da cui VS sceglierà di volta in volta valori differenti.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQQ7cmda5sQ8I-iro6owYhrIqHOAfVJyREgyUUcLciSHdzNQ0QVU3i2Ozt-yEOW1p5UQz7sWTsYyhih6vob4FrNAoAJX942wsjzZFDeD9b5PPRvkPr7vA45qrCxSfbezBbkaLooBKyOZ7m/s1600/207+-+Request+details.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="185" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQQ7cmda5sQ8I-iro6owYhrIqHOAfVJyREgyUUcLciSHdzNQ0QVU3i2Ozt-yEOW1p5UQz7sWTsYyhih6vob4FrNAoAJX942wsjzZFDeD9b5PPRvkPr7vA45qrCxSfbezBbkaLooBKyOZ7m/s400/207+-+Request+details.png" width="400" /></a></div>
<br />
<div style="text-align: justify;">
Un altro aspetto interessante che possiamo personalizzare riguarda i "Request details". In questa finestra possiamo decidere se inserire dei "think time" tra le richieste (sostanzialmente dei ritardi) e, più importante, qual'è per noi il tempo "target" per le response. Se durante il test quella specifica richiesta avrà una response in un tempo maggiore di quello impostato come soglia, VS considererà il test come fallito.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Ora che abbiamo il webtest con tutti gli step ed i parametri impostati, possiamo finalmente aggiungere il progetto di Load Test alla nostra solution.</div>
<br />
<br />
<b><u>Il progetto di Load Test</u></b><br />
<div style="text-align: justify;">
Per aggiungere il test di carico ad un web performance test è sufficiente cliccare con il testo destro del mouse sul nome del progetto, scegliere "Add" e poi "Load test".</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqN1O-0ExbjYwMUybi-MqhsfwIuKqUi-mE-aVCRoM15T6XYsPsk6B-dpvpq27e2SvIT4y_2TTFNrERcUUAbbh0dEGzirx4rF7D2avUXEHLT7NdAOef47d39q99sKNM3h8fAQNlnDtkneWj/s1600/208+-+Add+load+test.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="287" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqN1O-0ExbjYwMUybi-MqhsfwIuKqUi-mE-aVCRoM15T6XYsPsk6B-dpvpq27e2SvIT4y_2TTFNrERcUUAbbh0dEGzirx4rF7D2avUXEHLT7NdAOef47d39q99sKNM3h8fAQNlnDtkneWj/s400/208+-+Add+load+test.png" width="400" /></a></div>
<br />
<div style="text-align: justify;">
Quest'azione farà comparire il "Load test wizard" che ci guiderà nel setup del test di carico.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Nel primo step dobbiamo scegliere se e come gestire i "think times" (i ritardi tra le request): possiamo usare gli stessi think time acquisiti durante la registrazione (attenzione che se mentre registravamo, tra un click e l'altro abbiamo fatto una pausa di ad esempio 5 minuti, durante il test quei 5 minuti saranno settati come delay tra quelle due richieste), possiamo scegliere "normal distribution" (che fa una sorta di media tra i tempi di delay registrati) oppure proprio di non usarne. Possiamo anche inserire un tempo di attesa tra iterazioni diverse dello stesso test.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Nel secondo step dobbiamo decidere quanto carico vogliamo generare verso la nostra applicazione e le modalità di generazione.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzTZL4MeG7QK-OSMuQI5bx1hNjE_1okP5iq0falp6Qs0zElZUzizlYw3d2TxFEnFLS8LJVPBtASP2_1880lIJA_Ep9xGcyL6l9X9GuJjnjh3RqsLyfXADlfTIK65b14nlyJH5r1JkBWMF1/s1600/209+-+Load+pattern.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="242" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzTZL4MeG7QK-OSMuQI5bx1hNjE_1okP5iq0falp6Qs0zElZUzizlYw3d2TxFEnFLS8LJVPBtASP2_1880lIJA_Ep9xGcyL6l9X9GuJjnjh3RqsLyfXADlfTIK65b14nlyJH5r1JkBWMF1/s400/209+-+Load+pattern.png" width="400" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Possiamo selezionare di avere un carico costante (il test inizierà cioè con N utenti e continuerà con lo stesso numero di utenti fino alla fine) o di effetturare un test con "step load".</div>
<div style="text-align: justify;">
Nell'immagine, ad esempio, ho deciso di utilizzare lo step load e di iniziare il test con 10 utenti aggiungendo ulteriori 10 utenti ogni 10 secondi, fino al raggiungimento di un massimo di 200 utenti.</div>
<div style="text-align: justify;">
Lo step load può essere molto interessante in quanto possiamo scoprire come (e se) la nostra applicazione scala in base all'incremento del carico applicativo.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Nello step successivo dobbiamo istruire il test di carico sul "cosa" fare. Per questa ragione inseriremo in questa schermata il web performance test che abbiamo creato precedentemente.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDN8-ebB0fHxj8W2Bl19VCIl-THOUnpac_tlZwl805gQYiaOCxzACYa3qFVe8Ms_8GoCHHk-VPzJ5fQMWrVHxeEdVhidOM7lDv9ToimEzj31dwBm40ULbQapchC3om6er9LhWwZdW26jbF/s1600/210+-+Add+web+test.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="187" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDN8-ebB0fHxj8W2Bl19VCIl-THOUnpac_tlZwl805gQYiaOCxzACYa3qFVe8Ms_8GoCHHk-VPzJ5fQMWrVHxeEdVhidOM7lDv9ToimEzj31dwBm40ULbQapchC3om6er9LhWwZdW26jbF/s400/210+-+Add+web+test.png" width="400" /></a></div>
<br />
<br />
<div style="text-align: justify;">
Cliccare su "Add", selezionare il performance test che vogliamo, cliccare su "Ok" ed il test sarà aggiunto nella finestra "test mix". Si chiama "Test Mix" perchè è possibile aggiungere quanti test vogliamo e se ne mettiamo più di uno possiamo definire la distribuzione percentuale di ognuno. In questo esempio abbiamo un solo test quindi la distribuzione sarà del 100%.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Possiamo anche decidere, negli step successivi, se e come utilizzare diversi tipi di connettività verso la nostra applicazione (attenzione: nel momento in cui scrivo VSO supporta solamente reti di tipo "LAN") e che tipo di browser engine vogliamo che siano utilizzati dai test agent per effettuare le richieste.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4yD9C5H2EybhpY5e0MfRuTg2zqxr-yp0DvvR-40Ylyc9Q-w6Nq-6l4TJmdPXcl2gtLZGIVHiXpZzy5RzLyJJKCwW7-b2N-dGptxDmYIHWYfhxJDz5TK0ZOoq3CttVkEI3vCnzv2T3wTvP/s1600/211+-+Browser+mix.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="207" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4yD9C5H2EybhpY5e0MfRuTg2zqxr-yp0DvvR-40Ylyc9Q-w6Nq-6l4TJmdPXcl2gtLZGIVHiXpZzy5RzLyJJKCwW7-b2N-dGptxDmYIHWYfhxJDz5TK0ZOoq3CttVkEI3vCnzv2T3wTvP/s400/211+-+Browser+mix.png" width="400" /></a></div>
<br />
<div style="text-align: justify;">
Come potete vedere nell'immagine, possiamo scegliere da un elenco di molti browser ed anche in questo caso possiamo definire la distribuzione percentuale.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Nell'ultimo step possiamo personalizzare la durata dell'esecuzione del test.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilA57tN6noA_W4-0UnT-eAvK7snk5-hXc-3nf0Je7UqHm325ItZdB6cj7Ff1ZZ0qTfClSDc03ehaLgAhVgMLgqDF5JpTpNquNbGzmm61zOoNLyLZnyx9KC96OIFYpU_T3-nADU9TIB_uad/s1600/212+-+Test+duration.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="188" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilA57tN6noA_W4-0UnT-eAvK7snk5-hXc-3nf0Je7UqHm325ItZdB6cj7Ff1ZZ0qTfClSDc03ehaLgAhVgMLgqDF5JpTpNquNbGzmm61zOoNLyLZnyx9KC96OIFYpU_T3-nADU9TIB_uad/s320/212+-+Test+duration.png" width="320" /></a></div>
<br />
<div style="text-align: justify;">
Possiamo scegliere tra un tempo fisso oppure un numero di iterazioni di test. Se selezioniamo un tempo fisso (nel mio esempio 2 minuti), possiamo anche impostare un "Warm-up time" (10 secondi nell'esempio). Durante questo tempo verranno inviate alcune richieste all'applicazione per "risvegliarla" e non saranno collezionati dati. Questo comportamento è estremamente utile se dobbiamo testare applicazioni che necessitano di un cold start (come ad esempio webapp hostate su IIS che magari non sono state usate per un periodo di tempo e per le quali quindi IIS ha "disattivato" l'AppPool) per non avere dei falsi positivi nel risultato del test.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Cliccando su "Finish", Visual Studio genererà il progetto di load test e lo salverà nella nostra soluzione.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqHpBAtnWSRojIZKrXOh7dDwMWgmiFU2fjVfy9GIBRzVRj5JYva2lptSGvqMj5YfVV1fpJrHXtc5Ni9dOYKuVPQTLAlVlclLxOGVwEiC4lZfrO6qysThcr_JeJ7sakfhPoXTiM_rb-YnC7/s1600/213+-+Test+created.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqHpBAtnWSRojIZKrXOh7dDwMWgmiFU2fjVfy9GIBRzVRj5JYva2lptSGvqMj5YfVV1fpJrHXtc5Ni9dOYKuVPQTLAlVlclLxOGVwEiC4lZfrO6qysThcr_JeJ7sakfhPoXTiM_rb-YnC7/s400/213+-+Test+created.png" width="271" /></a></div>
<br />
<br />
<b><u>Esecuzione del test</u></b><br />
<div style="text-align: justify;">
Ora che abbiamo tutto pronto possiamo eseguire il test. Ma prima, ancora un piccola impostazione. Noi vogliamo, infatti, che il test di carico sia eseguito attraverso la funzionalità Visual Studio Online Cloud Load Test ma nessuno l'ha detto al nostro Load Test project locale.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Per farlo bisogna aprire (doppo clic) il file "Local.testsettings" e cambiare il puntamento di "Test run location" su Visual Studio Online.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgV59ehTl7CB24RBmJCH03IdDTHl7BEI-iuuj_u2BBRGKIH6RiUZcAEeQ57t1V6B7UONOyzOSc4VhA_CyICGL0EEGEWrGY7UgF5r3-wZT7-wRvd3V3g0lvgC1D1jQ1WwUdT6OKb6xjLVdO-/s1600/214+-+Execution+on+VSO.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="133" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgV59ehTl7CB24RBmJCH03IdDTHl7BEI-iuuj_u2BBRGKIH6RiUZcAEeQ57t1V6B7UONOyzOSc4VhA_CyICGL0EEGEWrGY7UgF5r3-wZT7-wRvd3V3g0lvgC1D1jQ1WwUdT6OKb6xjLVdO-/s400/214+-+Execution+on+VSO.png" width="400" /></a></div>
<br />
<span style="text-align: justify;">È da notare comunque che se abbiamo effettuato il login in Visual Studio con un account che ha una sottoscrizione a VSO questo step non sarà necessario in quanto VS seleziona direttamente questo valore per noi.</span><br />
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Ok, iniziamo il test cliccando sul bottone di start in alto a sinistra.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiujPGsd6ipmttaXoPL-MCJfL6rYqrFgxbgje4gWpS8xN7h6qAOYZwsujUCjvwQgNPRoKjfkh_828nsh0wj1hUFGXRn9hnk8Y70-BtoZdQSPfx91KSHYSgMootFwm-tjGexWDSQjmeeo5Op/s1600/214B+-+Run+button.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="288" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiujPGsd6ipmttaXoPL-MCJfL6rYqrFgxbgje4gWpS8xN7h6qAOYZwsujUCjvwQgNPRoKjfkh_828nsh0wj1hUFGXRn9hnk8Y70-BtoZdQSPfx91KSHYSgMootFwm-tjGexWDSQjmeeo5Op/s400/214B+-+Run+button.png" width="400" /></a></div>
<br />
<div style="text-align: justify;">
Ma cosa succede quando facciamo partire il test?</div>
<div style="text-align: justify;">
Visual Studio si connette a Visual Studio Online ed accoda il test. VSO poi crea on demand un lab virtual di test da qualche parte in un datacenter di Azure e configura i test agent sulle VM con i parametri settati.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVzaN4pZV8Ihlh_9_wpXSA6yTSe0nsp2NCYqkP0s-dNWT3akRiRpqB6bNA1NHaU-GkJTSHM7tOrHip5qG6Y98WsoFXjZx4XtfDoe1lPYUkyomvc4yziVE795hodix85-ZlylELcB5kjTY0/s1600/215+-+Queue.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="78" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVzaN4pZV8Ihlh_9_wpXSA6yTSe0nsp2NCYqkP0s-dNWT3akRiRpqB6bNA1NHaU-GkJTSHM7tOrHip5qG6Y98WsoFXjZx4XtfDoe1lPYUkyomvc4yziVE795hodix85-ZlylELcB5kjTY0/s400/215+-+Queue.png" width="400" /></a></div>
<br />
<div style="text-align: justify;">
Non appena il lab è pronto e configurato, il test parte. Se abbiamo configurato un periodo di warm up esso inizierà e potete vedere che non vengono collezionati dati.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlSJfN30zUmtt4xcLgUsFYYdaJBIiL-_GtXihPVeUSxegpS4rrOZqYlgpMQn5V6FVk5GKf6-pY2EV4EGDEH1pevm63-RuKnJQIExlTpSI_p2sj4CGmZiEwuFyAHyut9sNb93Lovt8VHBh-/s1600/216+-+Warm+up.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="187" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlSJfN30zUmtt4xcLgUsFYYdaJBIiL-_GtXihPVeUSxegpS4rrOZqYlgpMQn5V6FVk5GKf6-pY2EV4EGDEH1pevm63-RuKnJQIExlTpSI_p2sj4CGmZiEwuFyAHyut9sNb93Lovt8VHBh-/s400/216+-+Warm+up.png" width="400" /></a></div>
<br />
<div style="text-align: justify;">
Poi, finito il warm up, gli agenti iniziano a generare il traffico verso le pagine della nostra applicazione (così come utilizzate nella nostra registrazione) ed i risultati sono mandati al nostro Visual Studio quasi in tempo reale in modo da poter avere una preview del risultato finale del test.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnQ6u8cTuwA29aRPoNgQftHLxMQ4FTodZUJqLIV7ZERiaYaFlR6_NCm0-USDOfWTz6-FSEVCPaVr2kHaBUk626th1nLaqL7yPq6uurH7CmdYJeoXM892fgHh8gbTpMP0rheLyBd7qUU7kW/s1600/217+-+Execution.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="185" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnQ6u8cTuwA29aRPoNgQftHLxMQ4FTodZUJqLIV7ZERiaYaFlR6_NCm0-USDOfWTz6-FSEVCPaVr2kHaBUk626th1nLaqL7yPq6uurH7CmdYJeoXM892fgHh8gbTpMP0rheLyBd7qUU7kW/s400/217+-+Execution.png" width="400" /></a></div>
<br />
<div style="text-align: justify;">
Aspettiamo la fine del test per avere un resultset completo.</div>
<br />
<br />
<b><u>Risultati</u></b><br />
<div style="text-align: justify;">
Quando il test giunge al termine, verranno visualizzati tutti i risultati e le performance raggiunte. Le informazioni disponibili sono veramente moltissime.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguoOmcXxnvyIqIRHtbZntbsVulfS78jYvEJXy9SIzCZ71MUxcOSjVL7xIjt83ZQvx-FmXwjhEi6HmSZxU6Gmrlwdl2Foq06u3OeScqUYjfWWOj2ebYbLZGZt_ZaZqDfY32hbeJfjG4JTa3/s1600/218+-+Results.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="177" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguoOmcXxnvyIqIRHtbZntbsVulfS78jYvEJXy9SIzCZ71MUxcOSjVL7xIjt83ZQvx-FmXwjhEi6HmSZxU6Gmrlwdl2Foq06u3OeScqUYjfWWOj2ebYbLZGZt_ZaZqDfY32hbeJfjG4JTa3/s400/218+-+Results.png" width="400" /></a></div>
<br />
<div style="text-align: justify;">
Abbiamo i tempi di risposta medi, con anche il minimo ed il massimo, assieme ai tempi di test medi, i tempi di pagina medi ed il carico utente.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Possiamo vedere dal grafico e dalle info visualizzate che il numero di utenti virtuali è cresciuto nel tempo da 10 a 120 (avevo impostato un max di 200 ma non ha avuto tempo di raggiungere il massimo in quanto il test era limitato a soli 2 minuti con incrementi ogni 10 secondi) e come l'applicazione ha scalato al crescere del carico.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Anche nella sezione "Throughput" possiamo vedere molte informazioni utili.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjY5QP53eBnQDmc7ySZpV1kkauIaeSpLG8x2h-AQpaEN85J04VlC4S2kIbAiCbESez7-r0L8DRoLe92Jsmjv0Cjk0QWpOMscg9KyWYygGKnt9NO1kY-wvHTvQSKF-63LP3gmzaZRyDubZMg/s1600/219+-+Results+Throughtput.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="176" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjY5QP53eBnQDmc7ySZpV1kkauIaeSpLG8x2h-AQpaEN85J04VlC4S2kIbAiCbESez7-r0L8DRoLe92Jsmjv0Cjk0QWpOMscg9KyWYygGKnt9NO1kY-wvHTvQSKF-63LP3gmzaZRyDubZMg/s400/219+-+Results+Throughtput.png" width="400" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
In questo esempio non abbiamo avuto errori o parametri fuori soglia, ma se ci fossero stati avremmo visto un report degli stessi con le cause ed i messaggi di errore.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Questi sono però solo una piccola parte dei dati che abbiamo a disposizione. Se infatti clicchiamo sul link "download report" in alto, Visual Studio scaricherà l'intero resulset da Visual Studio Online rendendo disponibile, in questo modo, un report con una miriade di dati e grafici su ogni aspetto del test che ci aiuteranno a capire meglio come la nostra applicazione si comporta in uno scenario di carico.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLGkQlV-NHGtjD2chyphenhyphend41ddwa44clU2cvX08pxyFbpP7-xoChzhoEFyuf9dr4qJrM9O6yvBIcPLoYcWzuYFSZ4hfojjQbPOGqtIrIaCvP2iSLEoD3C5bTFkY8KvWfSVakAYQLt1M13cHIs/s1600/220+-+Complete+resultset.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLGkQlV-NHGtjD2chyphenhyphend41ddwa44clU2cvX08pxyFbpP7-xoChzhoEFyuf9dr4qJrM9O6yvBIcPLoYcWzuYFSZ4hfojjQbPOGqtIrIaCvP2iSLEoD3C5bTFkY8KvWfSVakAYQLt1M13cHIs/s400/220+-+Complete+resultset.png" width="400" /></a></div>
<br />
<br />
<b><u>Conclusioni</u></b><br />
<div style="text-align: justify;">
Questo tipo di Load test è il più completo che possiamo fare. Come potete vedere ci restituisce tantissime informazioni, metriche e grafici che ci permettono di analizzare il comportamento della nostra applicazione.</div>
<div style="text-align: justify;">
Inoltre, il setup di questi test è abbastanza semplice ma soprattutto è completamente personalizzabile ed in un poco tempo possiamo ottenere un gran numero di dati da poter consultare.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Il prossimo ed ultimo articolo di questa serie sarà sull'utilizzo delle Load Test APIs. Stay tuned! :)</div>
Davidehttp://www.blogger.com/profile/11019920232902260275noreply@blogger.com0tag:blogger.com,1999:blog-3385472261915116282.post-47256014581245581492015-01-19T12:45:00.000+01:002015-01-19T12:45:26.073+01:00Cloud Load Test con Visual Studio Online - parte 1: Web panel<div style="text-align: justify;">
Questo articolo è il primo di una serie di 3 in cui parlerò di Cloud Load Testing con Visual Studio Online.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
In questa prima parte affronterò l'esecuzione di test di carico semplici su applicazioni web, utilizzando direttamente le funzionalità messe a disposizione dal portale di VSO.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b><u>Introduzione</u></b></div>
<div style="text-align: justify;">
Prima di iniziare a parlare nello specifico dell'esecuzione dei Cloud Load Test è importante soffermarsi su alcuni aspetti.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
</div>
<ul>
<li>Per poter utilizzare la funzionalità di Cloud Load Test è necessario avere una sottoscrizione MSDN Ultimate</li>
<li>L'applicazione da testare deve essere esposta sul web (al tool va indicato l'url da testare)</li>
<li>Gratuitamente si possono utilizzare fino a 15.000 minuti al mese. Si tratta di "virtual user minutes", quindi ad esempio eseguendo 1 test da 2 minuto con un carico costante di 200 virtual user si consumeranno 400 virtual user minutes.</li>
</ul>
<br />
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Fatte queste precisazioni, vediamo come si possono eseguire i test di carico utilizzando l'iterfaccia presente sul portale di Visual Studio Online.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b><u>Iniziamo</u></b></div>
<div style="text-align: justify;">
Innanzitutto è necessario fare login al portale web di VSO e, dalla dashboard iniziale scegliere "Load test".</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1AHavWkQW8qSxekLNzKeAqpVgR8sBHBFB9ysCoQ5ePCxR07YiobdUIg2gL6QqG9JYPGV8IXva7sarwRA8yrGdEh1ZoLL_WU8OkemTaTDv3dq1K_GBd3Jwx3OY_BxqL4m4Src7z01jfkEZ/s1600/101+-+Load+test+feature.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1AHavWkQW8qSxekLNzKeAqpVgR8sBHBFB9ysCoQ5ePCxR07YiobdUIg2gL6QqG9JYPGV8IXva7sarwRA8yrGdEh1ZoLL_WU8OkemTaTDv3dq1K_GBd3Jwx3OY_BxqL4m4Src7z01jfkEZ/s1600/101+-+Load+test+feature.png" height="271" width="400" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Fatto questo viene proposta la finestra di impostazione delle variabili del test. Come vedete si tratta di un unica schermata, quindi le impostazioni possibili sono abbastanza limitate, ma comunque sufficienti a fare un test di carico generico sulla nostra applicazione.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2KhmD50vuvdHhIsRvDv3HTla1rLVgQBo5OLevO32Gv5pQfvbO3XuX_tefvfqSfebOGEuOwMM9EaEEBwwjAZBTPyXI2CyIuaBazyuVx4EgSSF7toPqMaPMJ-Tlnlos98ueXhhADfNA5D0n/s1600/102+-+Settings.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2KhmD50vuvdHhIsRvDv3HTla1rLVgQBo5OLevO32Gv5pQfvbO3XuX_tefvfqSfebOGEuOwMM9EaEEBwwjAZBTPyXI2CyIuaBazyuVx4EgSSF7toPqMaPMJ-Tlnlos98ueXhhADfNA5D0n/s1600/102+-+Settings.png" height="363" width="400" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Come prima cosa viene chiesto l'url su cui eseguire il test di carico: si tratta di un solo url (quindi non è possibile eseguire da qui un test di carico a step consecutivi o a navigazione pseudo-reale) che può corrispondere all'home page del sito o, come nell'esempio, ad una qualsiasi pagina della web application. L'unico vincolo presente è che la pagina deve essere visibile pubblicamente senza necessità di inserire delle credenziali, visto che al momento non è possibile impostarle.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Il secondo parametro da inserire è il nome del test: si tratta di una stringa libera, che servirà a noi solo come reminder.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Sotto questi due parametri ce ne sono altri 4, indicati proprio come "Test settings", che servono per poter meglio definire gli aspetti chiave del carico che si vuole applicare.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
</div>
<ul>
<li><i>User Load</i>: permette di definire il numero di utenti virtuali che contemporaneamente si collegheranno all'url fornito. I valori possibili sono 25, 50, 100 e 200</li>
<li><i>Run duration</i>: è la durata complessiva del test. I valori selezionabili sono da 1 a 5 minuti</li>
<li><i>Think-time</i>: si tratta del tempo di attesa tra una richiesta e l'altra. Serve per evitare che i sistemi di anti-hammering e anti DoS entrino in funzione. È possibile indicare tempi di attesa di 1 secondo (default) o 5 secondi</li>
<li><i>Browser distribution</i>: questa impostazione indica la percentuale di utilizzo di browser che si vuole simulare. Scegliendo ad esempio "IE 80%, Chrome 20%" il test verrà eseguito con agenti useranno gli engine di Internet Explorer e di Chrome nelle percentuali selezionate</li>
</ul>
<br />
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Settate queste impostazioni, cliccando sul bottone "Test now" si da inizio al test.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b><u>Esecuzione del Test</u></b></div>
<div style="text-align: justify;">
Ma cosa avviene, nel concreto quando si avvia il test?</div>
<div style="text-align: justify;">
Visual Studio Online crea per noi on demand un lab virtuale in un datacenter su Azure e configura gli agenti sulle vm con i parametri indicati:</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg68AJa2hj21dX3lcv3eoPHKLjsPwwQecRFzv0lJw47WUoivPN7fgbBsZMuidLopdcuUwm-KpFqSbli-W2p2mfPF2SpdtZkvt_nVJZMVyebfODRx0Pz5RDppN9N4Ql4GsoSlKFsI8er6Yul/s1600/103+-+Agents.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg68AJa2hj21dX3lcv3eoPHKLjsPwwQecRFzv0lJw47WUoivPN7fgbBsZMuidLopdcuUwm-KpFqSbli-W2p2mfPF2SpdtZkvt_nVJZMVyebfODRx0Pz5RDppN9N4Ql4GsoSlKFsI8er6Yul/s1600/103+-+Agents.png" height="127" width="400" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Non appena il lab è pronto e configurato, inizia il vero e proprio test di carico. Gli agenti iniziano a generare traffico verso l'url indicato e i risultati sono inviati, quasi in real time, al nostro browser. In questo modo possiamo avere un'anteprima dell'esito del test.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiz9214W3JYzXMgm1LUgKjCkuuRYubD8o04EMT0v_qbf292EFLotAi8Cp3qJmajiuHQpa2wyBwlUFJA7rLuUM15wep_SkSUdfKBH9HNQWS-19YRVhRgFKbZXOrLwgwBBtl1M5l9cybupdkC/s1600/104+-+Execution.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiz9214W3JYzXMgm1LUgKjCkuuRYubD8o04EMT0v_qbf292EFLotAi8Cp3qJmajiuHQpa2wyBwlUFJA7rLuUM15wep_SkSUdfKBH9HNQWS-19YRVhRgFKbZXOrLwgwBBtl1M5l9cybupdkC/s1600/104+-+Execution.png" height="306" width="400" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
In questa immagine vediamo, ad esempio, che intorno ai 50 secondi si è verificato "un buco" nelle richieste al secondo che il sito è risucito a gestire, testimoniato anche dal notevole incremento del tempo di risposta. Utilizzando questi dati potremmo avviare un'attività di analisi sulla nostra applicazione o sulla nostra infrastruttura per capire come mai si sia verificata un'anomalia del genere.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b><u>Risultati</u></b></div>
<div style="text-align: justify;">
Al completamento del test, ci vengono indicati gli esiti e le performance raggiunte.</div>
<div style="text-align: justify;">
Oltre al grafico che avevamo anche durante l'esecuzione ci vengono date altre informazioni.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_-hM0UJqYH6c7q_Fv-DTiYP-_Ibhow5yaUKpzgU4VkOgA8-gBOlQQ7AOsvOvw302-ce7BiIqsYU1-jlkt6Um2SslrCwzLKhcg2Rsw_8Twhx5d-8Zh4ogeX2JDGiYjIQ84JGTBmnajPXPL/s1600/105+-+Performance.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_-hM0UJqYH6c7q_Fv-DTiYP-_Ibhow5yaUKpzgU4VkOgA8-gBOlQQ7AOsvOvw302-ce7BiIqsYU1-jlkt6Um2SslrCwzLKhcg2Rsw_8Twhx5d-8Zh4ogeX2JDGiYjIQ84JGTBmnajPXPL/s1600/105+-+Performance.png" height="112" width="400" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Innanzitutto ci viene data l'indicazione tel tempo di risposta medio. Un tempo medio inferiore a 0,1 secondi è considerato buono. tra 1 secondo e 0,1 secondi è considerato "non molto buono", sopra il secondo è considerato negativo.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Dopo il tempo di risposta, è indicato il numero di richieste che in totale sono state fatte alla web app.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Infine, c'è l'indicazione delle eventuali richieste che non sono andate a buon fine o che hanno generato un errore sull'applicazione.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Sotto questi valori viene indicato anche quali errori sono stati riscontrati.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTpKyHsVNhIUreEUYz7EX5irwbJOcX0z9Od6BkmqWyhGPu_5aIKFW8Vv83Q5DSh8b5qM7S39f5yROgxDb0-kbS5t5YVttLZNOrTG-raGl__Le2JMOSdaEz2vBmpTG6o7Dr2sAA9EDXeA6Q/s1600/106+-+Errors.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTpKyHsVNhIUreEUYz7EX5irwbJOcX0z9Od6BkmqWyhGPu_5aIKFW8Vv83Q5DSh8b5qM7S39f5yROgxDb0-kbS5t5YVttLZNOrTG-raGl__Le2JMOSdaEz2vBmpTG6o7Dr2sAA9EDXeA6Q/s1600/106+-+Errors.png" height="61" width="400" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
In questo caso non ve ne sono, se si fossero verificati degli errori nella tabella troveremmo la causa generica dell'errore, il suo tipo specifico ed il messaggio di errore.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b><u>Conclusioni</u></b></div>
<div style="text-align: justify;">
Questo tipo di Load test non è sicuramente il più completo che si possa ottenere, ma va comunque bene se ci interessa avere delle indicazioni di massima sulle prestazioni e sul carico supportato dalla nostra applicazione.</div>
<div style="text-align: justify;">
Inoltre il setup di questi test è estremamente semplice e in pochissimi minuti si è in grado di avere un gran numero di informazioni utili.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Se quello di cui avete bisogno, invece, è un test approfondito, eseguibile simulando un flusso reale di navigazione... non perdetevi il mio prossimo articolo di questa serie.</div>
Davidehttp://www.blogger.com/profile/11019920232902260275noreply@blogger.com0tag:blogger.com,1999:blog-3385472261915116282.post-75642378878780455982014-12-19T09:21:00.002+01:002014-12-19T09:22:19.824+01:00Edit dei file di codice sorgente da Web con Visual Studio Online<div style="text-align: justify;">
Brian Harry, <a href="http://blogs.msdn.com/b/bharry/archive/2014/12/17/visual-studio-online-update-dec-17.aspx" target="_blank">sul suo blog</a>, ha annunciato il nuovo rilascio di Visual Studio Online; rilascio che comprende anche l'attesa funzionalità di <strong>editing del codice direttamente dal portale web</strong>.</div>
<div style="text-align: justify;">
Vediamo come funziona.</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
<strong><u>Edit</u></strong></div>
<div style="text-align: justify;">
Dopo essere entrati sulla Dashboard del Team Project che vogliamo gestire, andiamo sulla sezione "<em>Code</em>" e selezioniamo dal menù ad albero di sinistra uno dei file di codice sorgente.</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
Sulla destra si aprirà, come al solito, la schermata in sola lettura che contiene il codice. A differenza di quanto succedeva precedentemente, però, è disponibile un nuovo bottone "<em>Edit</em>".</div>
<div style="text-align: justify;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5DLEUgKv8JUoJm5kWdqGhXX-ncZQrv0Kbz0JD-BbnHpsAlJb5bOUH_r-yqCyYH2QeFygs7MuOzyIiPRNvy24HdNGnoeq1Nz9frxQCllmg1Uoywa4k1pBGatEGOJnwTIfWrQjJG_EVbpAq/s1600/01+-+Edit+button.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5DLEUgKv8JUoJm5kWdqGhXX-ncZQrv0Kbz0JD-BbnHpsAlJb5bOUH_r-yqCyYH2QeFygs7MuOzyIiPRNvy24HdNGnoeq1Nz9frxQCllmg1Uoywa4k1pBGatEGOJnwTIfWrQjJG_EVbpAq/s1600/01+-+Edit+button.png" height="193" width="400" /></a></div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
Cliccando sul bottone, succederanno tre cose:</div>
<ol>
<li>La toolbar cambierà visualizzazione</li>
<li>Nel menu ad albero il file selezionato verrà "marcato" con un <strong>*</strong> ad indicare che è in modifica</li>
<li>Nella schermata sarà possibile apportare modifiche al codice sorgente</li>
</ol>
<div style="text-align: justify;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8HycwKLxHVb6fOld1rL20PaC3yJaAVR9qUJQ4BiWL5AmXMwrl4v22QikqNjl33OR7ksEDwi57Ed3f89gLV5itTNvx6x1XEIme8iKjp-Au7FlZELomyQyP17jucFEDbWylQCJ0YYsYTa5W/s1600/02+-+Edit-enabled+toolbar.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8HycwKLxHVb6fOld1rL20PaC3yJaAVR9qUJQ4BiWL5AmXMwrl4v22QikqNjl33OR7ksEDwi57Ed3f89gLV5itTNvx6x1XEIme8iKjp-Au7FlZELomyQyP17jucFEDbWylQCJ0YYsYTa5W/s1600/02+-+Edit-enabled+toolbar.png" height="141" width="400" /></a></div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
Una volta completata la modifica, è possibile (consigliato, a dire il vero...) inserire un commento nella textbox che verrà associato al checkin e premere sul pulsante di salvataggio (comparso nella toolbar).</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
Cliccato su "<em>Save</em>", la modifiche vengono salvate sul source control, viene creato un changeset e viene visualizzato un tooltip che ci informa dell'esito positivo dell'operazione, con un link alla visualizzazione del changeset stesso.</div>
<div style="text-align: justify;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgD-FKLzra94MLhQEWs4JSuNoP8rfRvDtY9DL5cM-Fsq0LvOzVvxieLefCmr-GDz_YCyeX0hyphenhyphenO8l02Z32ELwq_UuzNE4TIkp62tNEayOgXyWuD83W0RfnZN59LcqOQ1b7SB3VCB24mgWDhL/s1600/03+-+Changes+saved.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgD-FKLzra94MLhQEWs4JSuNoP8rfRvDtY9DL5cM-Fsq0LvOzVvxieLefCmr-GDz_YCyeX0hyphenhyphenO8l02Z32ELwq_UuzNE4TIkp62tNEayOgXyWuD83W0RfnZN59LcqOQ1b7SB3VCB24mgWDhL/s1600/03+-+Changes+saved.png" height="251" width="400" /></a></div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
È anche possibile annullare le modifiche utilizzando il bottone "<em>Discard</em>", sempre nella toolbar.</div>
<div style="text-align: justify;">
Infine, se prima di fare il checkin vogliamo verificare le modifiche apportate, è possibile fare una diff tra il file residente sul source control e la nostra versione, utilizzando il pulsante all'estrema destra della toolbar.</div>
<div style="text-align: justify;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju8gS1Vd-0bit2p00hbK4NOEKILZFdPl-7kVQ5yjnDdgk9wGeApWxr2yvU6KsHl6PmAwCUA3JFtyBng52coap812cAUtqPvzL5rKgeaXmEk5nlE9ggkvK7EdBi2Z5kCdGU17gB_rleWM3h/s1600/04+-+Diff.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju8gS1Vd-0bit2p00hbK4NOEKILZFdPl-7kVQ5yjnDdgk9wGeApWxr2yvU6KsHl6PmAwCUA3JFtyBng52coap812cAUtqPvzL5rKgeaXmEk5nlE9ggkvK7EdBi2Z5kCdGU17gB_rleWM3h/s1600/04+-+Diff.png" height="177" width="400" /></a></div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
<strong><u>Upload, Create, Rename, Delete</u></strong><br />
Oltre a modificare direttamente i sorgenti, è possibile anche rinominare, cancellare e creare file e cartelle e fare l'upload di nuovi file.<br />
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdzXqzIiSrhd6uG3e-FfO5VQRSxyUcakq8jQwsPIeAGvG81SWuPba8HWZe8ivByP_G9bff5f1ymsIbseupGIwyXbWEADj309O24GZBm9CoH9Ztvaki7S8F_M1W0nXGcow-IZq8SWahQo99/s1600/05+-+Upload,+Rename,+Delete.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdzXqzIiSrhd6uG3e-FfO5VQRSxyUcakq8jQwsPIeAGvG81SWuPba8HWZe8ivByP_G9bff5f1ymsIbseupGIwyXbWEADj309O24GZBm9CoH9Ztvaki7S8F_M1W0nXGcow-IZq8SWahQo99/s1600/05+-+Upload,+Rename,+Delete.png" height="320" width="273" /></a></div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
Per creare un nuovo file o farne l'upload basta cliccare con il tasto destro su una cartella e scegliere "<em>Add file(s)</em>".<br />
Si aprirà un popup in cui si può scegliere se creare un file nuovo o se scegliere dei file già esistenti da caricare.<br />
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDnaZp72VcFn0PhY78W6fxZfn1b4kmVu1GPP6dt9gTBk96BU8zM-b-AVdH4L2dt6bGZn3o8RFzv_xrT3cuA6U7zd6IdPmRBDVI5eehH5VYcW5hv6Qnxnm2h-2_uS2RIQaaLdaMy8rNpSJJ/s1600/06+-+Upload+and+Create.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDnaZp72VcFn0PhY78W6fxZfn1b4kmVu1GPP6dt9gTBk96BU8zM-b-AVdH4L2dt6bGZn3o8RFzv_xrT3cuA6U7zd6IdPmRBDVI5eehH5VYcW5hv6Qnxnm2h-2_uS2RIQaaLdaMy8rNpSJJ/s1600/06+-+Upload+and+Create.png" height="381" width="400" /></a></div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
Viceversa, per cancellare un file cliccarci sopra con il tasto destro e scegliere "<em>Delete</em>" (viene chiesta conferma).</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
Per rinominarlo, infine, sempre dal menù contestuale che appare con il tasto destro scegliere "<em>Rename</em>".</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
Tutte queste operazioni genereranno un changeset, quindi le modifiche saranno mappate e storicizzate sul source control.</div>
Davidehttp://www.blogger.com/profile/11019920232902260275noreply@blogger.com0tag:blogger.com,1999:blog-3385472261915116282.post-55265254748045155662014-11-12T13:16:00.002+01:002014-11-12T13:16:15.964+01:00Aggiungere Azure Application Insights ad un Web Site<div style="text-align: justify;">
Sviluppando una Web Application, è possibile usare Visual Studio 2013.3 per aggiungere automaticamente tutte le librerie e le configurazioni di cui "Azure Application Insights" ha bisogno pre funzionare.</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
Ma invece per quanto riguarda i <strong>Web Sites</strong>? Se si crea un Web Site (oppure si vuole modificarne o gestirne uno già esistente) l'opzione per aggiungere l'Application Insights non è presente. Cosa possiamo fare, quindi? Com'è possibile raggiungere lo stesso risultato? Come possiamo integrare Azure Application Insights in un Web Site?</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
È possibile! Basta seguire questi step:</div>
<ol>
<li><div style="text-align: justify;">
Creare un nuovo servizio "Application Insights" usando il nuovo Azure portal (preview)</div>
</li>
<li><div style="text-align: justify;">
Copiare lo snippet di codice JavaScript che viene proposto dal portale ed aggiungerlo a tutte le pagine che si vogliono monitorare (oppure alla master page, se ce n'è una)</div>
</li>
<li><div style="text-align: justify;">
In Visual Studio 2013.3, creare una nuova web application vuota ed aggiungere ad essa Application Insights usando il menu contestuale</div>
</li>
<li><div style="text-align: justify;">
Copiare i seguenti file dalla cartella "bin" della Web App alla cartella "bin" del Web Site:<br />
<pre>Microsoft.ApplicationInsights.dll
Microsoft.ApplicationInsights.Extensibility.RuntimeTelemetry.dll
Microsoft.ApplicationInsights.Extensibility.Web.dll
Microsoft.Diagnostics.Tracing.EventSource.dll
(volendo è possibile anche copiare i relativi file .xml e .pdb)
</pre>
</div>
</li>
<li><div style="text-align: justify;">
Tornare nell'Azure portal (preview), andare nella sezione dell'Application Insights creato precedentemente, cliccare sul bottone "Properties" e copiare il valore della texbox "Instrumentation Key"</div>
</li>
<li><div style="text-align: justify;">
Copiare il file <em>ApplicationInsights.config</em> dalla root della Web App alla root folder del Web Site</div>
</li>
<li><div style="text-align: justify;">
In questo file, sostituire il valore della chiave "<em>InstrumentationKey</em>" con quello copiato al punto 5</div>
</li>
<li><div style="text-align: justify;">
Cambiare il file <em>web.config</em> del website aggiungendo le seguenti righe:<br />
<pre class="brush: xml"><system.web>
[...]
<httpModules>
[...]
<add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Extensibility.Web.RequestTracking.WebRequestTrackingModule, Microsoft.ApplicationInsights.Extensibility.Web" />
[...]
</httpModules>
[...]
</system.web>
<system.webServer>
[...]
<validation validateIntegratedModeConfiguration="false" />
[...]
<modules runAllManagedModulesForAllRequests="true">
[...]
<remove name="ApplicationInsightsWebTracking" />
<add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Extensibility.Web.RequestTracking.WebRequestTrackingModule, Microsoft.ApplicationInsights.Extensibility.Web" preCondition="managedHandler" />
[...]
</modules>
[...]
</system.webServer>
</pre>
</div>
</li>
</ol>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
A questo punto è possibile avviare e testare il Web Site e, dopo qualche secondo, i dati e le statistiche saranno presenti nella blade dell'Application Insights (sempre sul nuovo Azure portal)</div>
Davidehttp://www.blogger.com/profile/11019920232902260275noreply@blogger.com0tag:blogger.com,1999:blog-3385472261915116282.post-18464539420611309072014-11-11T11:32:00.003+01:002014-11-11T11:32:25.043+01:00Gestire i Cloud Load Test con le REST API<div style="text-align: justify;">
Le REST API dei Cloud-based Load Testing (CLT) permettono di automatizzare l'esecuzione dei Load test dal Cloud, in modo da poterli integrare nei processi di Continuous Integration / Deployment e di Test Automation.</div>
<br />
<div>
Ecco una lista (sicuramente in espansione) di quello che si può fare con queste nuove API:</div>
<ul>
<li>Creare / Lanciare / Stoppare un Load Test Run</li>
<li>Recuperare i Load Test Results - un set di gruppi di KPI - Performance, Throughput, Application</li>
<li>Recuperare i Messages del servizio durante l'esecuzione</li>
<li>Recuperare le Exceptions, se ci sono</li>
<li>
Recuperare le Counter instances di un Load Test run</li>
<li>Recuperare gli Application Counters delle App configurate nel load test</li>
<li>Recuperare una lista di tutti i Load test Runs eseguiti - con filtri per requester, date, status ecc..</li>
</ul>
<div style="text-align: justify;">
Queste API lavorano in stretta vicinanza con le Azure API, visto che si leggono i test file da un Azure Blob e salvano i risultati nella stessa drop folder sempre sull'Azure Blob.</div>
<br />
<div>
È importante notare che:</div>
<ul>
<li><div style="text-align: justify;">
Per usare le REST API, è necessario abilitare le alternate credentials su Visual Studio Online e quindi utilizzarle per l'autenticazione</div>
</li>
<li><div style="text-align: justify;">
Aggiungere"vsclt" al nome dell'account VSO per essere rediretti al "Cloud-based Load Test (CLT) service" di visualstudio.com. Ade sempio, se l'account è https://abc.visualstudio.com/, quando si utilizzano le API indicare https://abc.vsclt.visualstudio.com/</div>
</li>
</ul>
<div>
</div>
<div>
Il pattern di base per le API è il seguente:</div>
<div>
VERB https://<em>{account}.</em>vsclt.visualstudio.com/_apis/clt/<em>{resource}</em>[/<em>{options}</em>]</div>
<div>
</div>
<div>
Dove "<em>resource</em>" può essere una delle seguenti e le "<em>options</em>" dipendono dalla resource:</div>
<div>
</div>
<div>
Test<br />
<ul>
<li>Per i "Test Runs": testruns</li>
<li>Per le "Test Drops" (i container dove vengono salvati i dati): testdrops</li>
</ul>
</div>
<div>
</div>
<div>
Dipendenti dai Test Run<br />
<ul>
<li>Per le "Counter Instances": testruns/<em>{testrunid}</em>/counterinstances</li>
<li>Per i "Counter Samples": testruns/<em>{testrunid}</em>/countersamples</li>
</ul>
</div>
<div>
</div>
<div>
Application Performance Management: </div>
<ul>
<li>Per i "APM Plugins": apm/plugins</li>
<li>Per le "APM Applications ": apm/applications</li>
<li>Per i "APM Counters ": apm/counters</li>
</ul>
<br />
<strong>Creare un Test Run</strong><br />
<div style="text-align: justify;">
Per creare un Cloud Load Test Run, è necessario fare una chiamata POST alle API, passando nel body un set di parametri e test settings come in questo esempio.</div>
<br />
<u>Request Url:</u><br />
POST <a href="https://dbtek.vsclt.visualstudio.com/_apis/clt/testruns">https://dbtek.vsclt.visualstudio.com/_apis/clt/testruns</a><br />
<br />
<u>Request Body:</u><br />
<pre class="brush: xml">{
"name": "MyAppToTest.loadtest",
"description": "nightly loadtest",
"testSettings": {
"cleanupCommand": "",
"hostProcessPlatform": "x86",
"setupCommand": ""
},
"testDrop": {
"id": "fe35ed32-eaab-4178-ba7e-ad2577ee187f"
}
}
</pre>
<br />
<br />
<u>Response:</u><br />
<pre class="brush: xml">{
"id": "a5e0d4b9-d387-4b3e-9566-163da9c39b67",
"name": "MyAppToTest.loadtest",
"createdDate": "2014-11-1T08:51:27.0965365Z",
"state": "pending",
"subState": "none",
"testSettings": {
"cleanupCommand": "",
"hostProcessPlatform": "x86",
"setupCommand": ""
},
"testDrop": {
"id": "fe35ed32-eaab-4178-ba7e-ad2577ee187f",
"url": "https://dbtek.vsclt.visualstudio.com/_apis/clt/TestDrops/fe35ed32-eaab-4178-ba7e-ad2577ee187f"
},
"runSpecificDetails": {
"duration": 180,
"virtualUserCount": 250,
"samplingInterval": 15
},
"createdBy": {
"id": "76cabfe4-0e20-4f5b-862e-9693a68232f1",
"displayName": "iamtheuser@dbtek.it"
},
"url": "https://dbtek.vsclt.visualstudio.com/_apis/clt/testruns/a5e0d4b9-d387-4b3e-9566-163da9c39b67"
}
</pre>
<br />
<br />
<div style="text-align: justify;">
Come si può vedere, nella response si trovano tutti i dati che possono servire relativi al test run appena creato.</div>
<br />
<strong>Avviare un Test Run</strong><br />
<div style="text-align: justify;">
Con questi dati possiamo per esempio avviare (o meglio accodare) il test run, chiamando le API usando un verb PATCH:</div>
<br />
<u>Request Url:</u><br />
PATCH <a href="https://dbtek.vsclt.visualstudio.com/_apis/clt/testruns/a5e0d4b9-d387-4b3e-9566-163da9c39b67">https://dbtek.vsclt.visualstudio.com/_apis/clt/testruns/a5e0d4b9-d387-4b3e-9566-163da9c39b67</a><br />
<br />
<u>Request Body:</u><br />
<pre class="brush: xml">{
"state": "queued"
}
</pre>
<br />
<br />
<u>Response:</u><br />
Status code: 202<br />
<br />
<br />
<strong>Recuperare i Test results</strong><br />
Infine, quando il test è finito, possiamo recuperare i risultati con una call in GET.<br />
<br />
<u>Request Url:</u><br />
GET <a href="https://dbtek.vsclt.visualstudio.com/_apis/clt/testruns/a5e0d4b9-d387-4b3e-9566-163da9c39b67/results">https://dbtek.vsclt.visualstudio.com/_apis/clt/testruns/a5e0d4b9-d387-4b3e-9566-163da9c39b67/results</a><br />
<br />
<u>Response:</u><br />
<pre class="brush: xml">{
"resultsUrl": "http://127.0.0.1:10000/devstoreaccount1/ets-containerfor-aeee0697-d734-43d7-956e-e662252c265c/2150fbd4-e71c-42fd-8b90-95222a556d87/TestResult/LoadTest.ltrar.zip?sv=2012-02-12&se=2014-06-03T05%3A05%3A39Z&sr=b&si=sas_tenant_policyaeee0697-d734-43d7-956e-e662252c265c&sig=n1Tj%2BsCtiOqQu9UtcXsl%2Bn3ixP%2FVebHCKDJvfD5Tr%2FE%3D",
"counterGroups": {
"count": 3,
"value": [
{
"groupName": "Performance",
"url": "https://dbtek.vsclt.visualstudio.com/_apis/clt/testruns/a5e0d4b9-d387-4b3e-9566-163da9c39b67/CounterInstances?groupNames=Performance"
},
{
"groupName": "Throughput",
"url": "https://dbtek.vsclt.visualstudio.com/_apis/clt/testruns/a5e0d4b9-d387-4b3e-9566-163da9c39b67/CounterInstances?groupNames=Throughput"
},
{
"groupName": "Application",
"url": "https://dbtek.vsclt.visualstudio.com/_apis/clt/testruns/a5e0d4b9-d387-4b3e-9566-163da9c39b67/CounterInstances?groupNames=Application"
}
]
}
}
</pre>
<br />
<br />
<br />
<strong>Recuperare i Test errors</strong><br />
<div style="text-align: justify;">
È anche possibile recuperare una lista di eventuali errori che si sono verificati durante l'esecuzione del test. Di nuovo, va utilizzata una chiamata in GET.</div>
<br />
<u>Request Url:</u><br />
GET <a href="https://dbtek.vsclt.visualstudio.com/_apis/clt/testRuns/47be20f0-ac4a-40cd-acb7-d9f8c44d0404/Errors">https://dbtek.vsclt.visualstudio.com/_apis/clt/testRuns/47be20f0-ac4a-40cd-acb7-d9f8c44d0404/Errors</a><br />
<br />
<u>Response:</u><br />
<pre class="brush: xml">{
"count": 2,
"value": [
{
"type": "Exception",
"subType": "UriFormatException",
"occurrences": 50,
"testCaseName": "ErrorsAndExceptionsWebTest",
"scenarioName": "LoadTestingScenarioWarmupDuration",
"request": "http://www.bing:123.com/----{GET}",
"stackTrace": " at System.Uri.CreateThis(String uri, Boolean dontEscape, UriKind uriKind)\n at System.Uri..ctor(String uriString, Boolean dontEscape)\n at Microsoft.VisualStudio.TestTools.WebStress.WebTestTransaction..ctor(String requestUrl)\n at Microsoft.VisualStudio.TestTools.WebStress.WebTestInstrumentedTransaction.CreateTransaction()\n at Microsoft.VisualStudio.TestTools.WebStress.WebTestInstrumentedTransaction.Execute(WebTestCaseContext testCaseContext, AsyncCallback completionCallback, Object callerState)",
"messageText": "Invalid URI: Invalid port specified.",
"lastErrorDate": "2014-11-11T09:14:20.363Z"
},
{
"type": "ExtractionRuleError",
"subType": "ExtractText",
"occurrences": 50,
"testCaseName": "ErrorsAndExceptionsWebTest",
"scenarioName": "LoadTestingScenarioWarmupDuration",
"request": "http://www.bing.com/----{GET}",
"stackTrace": "",
"messageText": "StartsWith text was not found in the response",
"lastErrorDate": "2014-11-11T09:14:23.663Z"
}
]
}
</pre>
Davidehttp://www.blogger.com/profile/11019920232902260275noreply@blogger.com0tag:blogger.com,1999:blog-3385472261915116282.post-53530855267277103772014-10-30T11:40:00.000+01:002014-10-30T11:40:00.658+01:00Mettere il Database sotto Source Control - eBook gratuito<div style="text-align: justify;">
Normalmente, un sistema di Source e Version control mostra enormi benefici nel coordinamento del lavoro dei team di sviluppo, garantendo un audit trail completo di tutte le modifiche ai file di codice e permettendo alla squadra di tenere traccia di qualsiasi versione specifica o build.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Anche gli sviluppatori di database possono (e dovrebbero...) trarre beneficio dal audit history e dalle funzionalità di change-tracking, c'è molto di più che salvare qualche script DB in una sottocartella dell'applicazione sul sistema di source control. A differenza di chi sviluppa applicazioni, i database developers non assemblano file e classi in un pacchetto applicativo, ma invece eseguono script che magari si alimentano a vicenda o da altri oggetti esistenti instaurando una stretta interdipendenza tra il codice ed i dati.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Per coprire quello che possiamo chiamare "<i>Database Lifecycle Management</i>", e considerare un ramo dell'ALM, RedGate ha sviluppato un interessante ebook gratuito, dal nome "<b>SQL Server Source Control Basics</b>".</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Purtroppo, gli autori del libro hanno deciso di utilizzare SVN, ma i concetti chiave si possono applicare senza problami anche a Team Foundation Server o Visual Studio Online.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Tra gli argomenti trattati ci sono:</div>
<div style="text-align: justify;">
Concetti fondamentali dei sistemi di source control</div>
<div style="text-align: justify;">
Scegliere un sistema di version control per il database e definirne la struttura</div>
<div style="text-align: justify;">
Strategie di branch e merge</div>
<div style="text-align: justify;">
Automatizzare il versionamento del database ed il suo deployment</div>
<div style="text-align: justify;">
Introduzione al "Database continuous integration"</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
L'eBook offre una guida dettagliata sui concetti di Database source control con esempi chiari e completi.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Può essere scaricatoto, gratis, qui (disponibile solo in lingua inglese):</div>
<div style="text-align: justify;">
<a href="http://www.red-gate.com/products/sql-development/sql-source-control/entrypage/sql-server-source-control-basics">http://www.red-gate.com/products/sql-development/sql-source-control/entrypage/sql-server-source-control-basics</a></div>
Davidehttp://www.blogger.com/profile/11019920232902260275noreply@blogger.com0tag:blogger.com,1999:blog-3385472261915116282.post-40256947249044383362014-10-28T14:41:00.001+01:002014-10-28T14:41:09.891+01:00Visual Studio Online REST API versione 1.0<div style="text-align: justify;">
Oggi è stata rilasciata <b>la prima versione ufficiale delle REST API di Visual Studio Online</b>, la 1.0.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Annunciate in preview in maggio, ora hanno raggiunto una maturità tale da spingere il team di sviluppo a chiudere la prima release. Questo non significa che non ci saranno cambiamenti o che gli sviluppi siano terminati; significa che le funzionalità core sono ora complete e da qui in avanti verranno versionate per mantenere la compatibilità all'indietro, in modo che tutte le applicazioni ed i servizi che le utilizzano rimangano comunque funzionanti a prescindere dagli aggiornamenti futuri.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Congiuntamente all'annuncio, il team ha modificato il "<a href="http://www.visualstudio.com/integrate/reference/reference-vso-overview-vsi" target="_blank">API Reference portal</a>" e la "<a href="http://www.visualstudio.com/integrate/get-started/get-started-rest-basics-vsi" target="_blank">Getting started guide</a>"</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b><span style="color: red;">Importante</span></b></div>
<div style="text-align: justify;">
Se avete delle applicazioni esistenti che utilizzano la versione 1.0 preview delle API, dovreste iniziare la migrazione alla release 1.0 prima possibile; infatti la versione 1.0 preview (e precedenti) <b>smetteranno di funzionare in 12 settimane da oggi</b>. Per sapere di più sul versioning e sulla migrazione è possibile consultare la "<a href="http://www.visualstudio.com/en-us/integrate/get-started/get-started-rest-versions-vsi" target="_blank">versioning and migration page</a>".</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Detto questo, ricordate che a partire da oggi, quindi, le Visual Studio Online REST API seguono questo pattern:</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="background-color: yellow;">VERB https://<i>{account}</i>.VisualStudio.com/DefaultCollection/_apis[/<i>{area}</i>]/<i>{resource}</i>?api-version=1.0</span></div>
Davidehttp://www.blogger.com/profile/11019920232902260275noreply@blogger.com0tag:blogger.com,1999:blog-3385472261915116282.post-45174461363858476802014-10-13T09:04:00.003+02:002014-10-13T09:04:56.248+02:00Integrare un’applicazione o un servizio con Visual Studio Online - Guest Post MSDN<div style="text-align: justify;">
Venerdì scorso è stato pubblicato su <b>MSDN Italia il mio secondo Guest post</b>,<b> </b>in cui parlo di com'è possibile e facile integrare le nostre applicazioni e servizi con <i>Visual Studio Online</i> utilizzando le nuove REST API ed i Service Hooks.</div>
<br />
Per leggere l'articolo completo utilizzare il link sottostante:<br />
<br />
<div style="text-align: center;">
<a href="http://blogs.msdn.com/b/italy/archive/2014/10/10/guest-post-integrare-un-applicazione-o-un-servizio-con-visual-studio-online.aspx" target="_blank">Integrare un’applicazione o un servizio con Visual Studio Online</a><br />
<br />
<br />
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeDvcLV9qT_Dz0YCWahet4-uVUN0wl-O_A1UsWSYY2qlcJztLt3O9ac8rqo5h9VRuRhN0sBesGL1tjYYYFoHTUREy1qbd7YLjYpbqYbTfi-tItQaACNaXlz85U_BZZwctI3QswTSmOkLgx/s1600/msdn-logo%5B1%5D.png" /></div>
Davidehttp://www.blogger.com/profile/11019920232902260275noreply@blogger.com0tag:blogger.com,1999:blog-3385472261915116282.post-60931866725357195762014-10-06T14:47:00.000+02:002014-10-10T11:47:24.310+02:00Migrare facilmente da Team Foundation Server a Visual Studio Online - Guest Post MSDN<div style="text-align: justify;">
Oggi è stato pubblicato su <b>MSDN Italia un mio Guest post </b>in cui spiego come effettuare la migrazione da un <i>Team Foundation Server</i> (quindi normale scenario di installazione on-premises) al suo corrispettivo on-cloud <i>Visual Studio Online</i> e quali sono le motivazioni che potrebbero spingerci a farlo.</div>
<br />
Per leggere il post utilizzare il link sottostante:<br />
<br />
<div style="text-align: center;">
<a href="http://blogs.msdn.com/b/italy/archive/2014/10/06/guest-post-migrare-facilmente-da-team-foundation-server-a-visual-studio-online.aspx" target="_blank">Migrare facilmente da Team Foundation Server a Visual Studio Online</a></div>
Davidehttp://www.blogger.com/profile/11019920232902260275noreply@blogger.com0tag:blogger.com,1999:blog-3385472261915116282.post-28234948813167660632014-09-30T11:36:00.001+02:002014-09-30T11:36:25.461+02:00Creare un Work Item con le REST API - Visual Studio Online<div style="text-align: justify;">
A volte può essere utile aggiungere un nuovo Work Item ad un nostro Team Project in modo automatico, magari in risposta ad un determinato evento.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Le nuove "WIT REST API v1.0 (preview 2)" (rilasciate il 4 settembre) esposte da Visual Studio Online ci permettono di farlo.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Quando creiamo un work item, possiamo indicare i valori per qualsiasi tipo di work item fields.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Per creare un work item, è necessario effettuare una richiesta HTTP PATCH a:</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
https://<i>your_account</i>.visualstudio.com/defaultcollection/<i>team_project_name</i>/_apis/wit/workitems/$<i>work_item_type_name</i>?api-version=1.0-preview.2</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Il body della richiesta deve essere valorizzato in base a questo formato:</div>
<br />
<pre class="brush: xml">[
{
"op": "add",
"path": { string }
"value": { string or int, depending on the field }
},
{
"op": "add",
"path": "/relations/-",
"value":
{
"rel": { string },
"url": { string },
"attributes":
{
{ name/value pairs }
}
}
}
]
</pre>
<br />
Un esempio di richiesta potrebbe essere:<br />
<br />
https://myAccount.visualstudio.com/defaultcollection/myProject/_apis/wit/workitems/$task?api-version=1.0-preview.2
<br />
<br />
<pre class="brush: xml">[
{
"op": "add",
"path": "/fields/System.Title",
"value": "Change blog title height"
}
]
</pre>
<br />
<div style="text-align: justify;">
Questa richiesta produce una response come la seguente, in cui si possono trovare tutte le informazioni relative al work item appena creato:</div>
<br />
<pre class="brush: xml">{
"id": 88,
"rev": 1,
"fields": {
"System.AreaPath": "myProject",
"System.TeamProject": "myProject",
"System.IterationPath": "myProject",
"System.WorkItemType": "Task",
"System.State": "To Do",
"System.Reason": "New task",
"System.CreatedDate": "2014-09-30T10:25:12.943Z",
"System.CreatedBy": "Davide Benvegnu",
"System.ChangedDate": "2014-09-30T10:25:12.943Z",
"System.ChangedBy": "Davide Benvegnu,
"System.Title": "Change blog title height"
},
"_links": {
"self": {
"href": "https://myAccount.visualstudio.com/DefaultCollection/_apis/wit/workItems/88"
},
"workItemUpdates": {
"href": "https://myAccount.visualstudio.com/DefaultCollection/_apis/wit/workItems/88/updates"
},
"workItemRevisions": {
"href": "https://myAccount.visualstudio.com/DefaultCollection/_apis/wit/workItems/88/revisions"
},
"workItemHistory": {
"href": "https://myAccount.visualstudio.com/DefaultCollection/_apis/wit/workItems/88/history"
},
"html": {
"href": "https://myAccount.visualstudio.com/web/wi.aspx?pcguid=0fa87894-6f48-4458-957d-3438b6bb9343&id=88"
},
"workItemType": {
"href": "https://myAccount.visualstudio.com/DefaultCollection/c4637008-2068-4b3f-828d-a214e2ba5210/_apis/wit/workItemTypes/Task"
},
"fields": {
"href": "https://myAccount.visualstudio.com/DefaultCollection/_apis/wit/fields"
}
},
"url": "https://myAccount.visualstudio.com/DefaultCollection/_apis/wit/workItems/88"
}
</pre>
Davidehttp://www.blogger.com/profile/11019920232902260275noreply@blogger.com0tag:blogger.com,1999:blog-3385472261915116282.post-51287245328580722162014-09-12T10:30:00.000+02:002014-09-12T10:30:01.555+02:00A proposito di Azure Websites Extensions<div style="text-align: justify;">
Ogni Azure Website fornisce un end point di management estendibile che permette di sfruttare un potente set di strumenti, deployato come site extensions. Questi strumenti spaziano dagli editor di codice sorgente come Visual Studio Online a strumenti di gestione delle risorse connesse, come un database MySQL collegato ad un sito web. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Le Site Extensions sono, di fatto, delle web app con dei metadati che vengono usati per la registrazione dell'estensione; possono essere create per ogni development stack supportato dalla piattaforma degli Azure Websites.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Le Site Extesions esistenti sono disponibili, per ogni WebSite, all'interno dell'Azure Preview Portal:</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUxbYGcwrHoQwFPZ__n13vSwDrl6w-SG9_E7dyl2r4YAWMla8Ug3TcF1A5ZnCE5Ch2zVCRMjjB-Na7PE4DcG43VWRpWopG4vj9RIq5YINdmrsPuN_4AyxYSnZ_3i3iz838JAPu_4QtxsH0/s1600/1+-+Extensions+on+Portal.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUxbYGcwrHoQwFPZ__n13vSwDrl6w-SG9_E7dyl2r4YAWMla8Ug3TcF1A5ZnCE5Ch2zVCRMjjB-Na7PE4DcG43VWRpWopG4vj9RIq5YINdmrsPuN_4AyxYSnZ_3i3iz838JAPu_4QtxsH0/s1600/1+-+Extensions+on+Portal.png" height="216" width="400" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Per aggiungere una nuova estensione sito basta andare alla sezione Configurazione nella "pagina" del web site, fare clic sul pulsante ADD e selezionare un'estensione dalla lista. Ognuna di queste estensioni è resa disponibile dal publisher riportato sotto il nome dell'extension e con i temini legali che devono essere accettati esplicitamente prima dell'installazione.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj52DQXXZmWhC43d5wAX-Cq9sEdPectxOjvG93XHr7szQFfKWlvDYo15LvW2s9BpogTcIi6a6SPRFtYOsOVfYlgq9b9IK81V5UjwSXNynsq-Z9vnMhwOO42zJmM4AA1IZLzCvyNZN-mQUZa/s1600/2+-+Add+new+extension.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj52DQXXZmWhC43d5wAX-Cq9sEdPectxOjvG93XHr7szQFfKWlvDYo15LvW2s9BpogTcIi6a6SPRFtYOsOVfYlgq9b9IK81V5UjwSXNynsq-Z9vnMhwOO42zJmM4AA1IZLzCvyNZN-mQUZa/s1600/2+-+Add+new+extension.png" height="220" width="400" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Una volta aggiunta, il contenuto della Site Extension viene copiato dentro la cartella <i>%HOME%\SiteExtensions</i> parallela alla website root. Attenzione che l'aggiunta di un'estensione fa riavviare il sito.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
È possibile anche creare delle nuove estensioni.</div>
<div style="text-align: justify;">
Se risultano necessari strumenti che non sono già presenti, è possibile creare nuove Site Extension da utilizzare con i WebSite seguendo le istruzioni a <a href="http://azure.microsoft.com/en-us/documentation/articles/web-sites-transform-extend/" target="_blank">questo link</a>. </div>
<div style="text-align: justify;">
È inoltre possibile pubblicare nuove estensioni in modo che siano disponibili per tutta la piattaforma Azure WebSites attraverso il portale "Site Extension Gallery submission": <a href="http://www.siteextensions.net/">http://www.siteextensions.net</a>.</div>
Davidehttp://www.blogger.com/profile/11019920232902260275noreply@blogger.com0tag:blogger.com,1999:blog-3385472261915116282.post-53107530145832694742014-08-19T14:35:00.001+02:002014-08-19T14:35:25.824+02:00Azure Web Sites Deploy: come funziona?<div style="text-align: justify;">
Gli Azure Web Sites supportano il continuous deployment da strumenti del controllo del codice sorgente e repository com BitBucket, CodePlex, Dropbox, Git, GitHub, Mercurial e TFS/VSO. È possibile infatti utilizzare questi strumenti per manutenere i contenuti ed i sorgenti del sito e poi pubblicare le modifiche in modo semplice e veloce.</div>
<div style="text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOoS4LWlDO83Kx4rYBBPnvJ9SNyi2sQJlVRANGZh5l_i-OjMxNR01rvm6xxIbUhXDoFtEqM1DL2xtkhGZolasvsOqeMRY2o8ND64HMdLRuME9upQyIWN9at8a0nxiDaPl8WjPRBxUcsuBT/s1600/1+-+Supported+Deployment.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOoS4LWlDO83Kx4rYBBPnvJ9SNyi2sQJlVRANGZh5l_i-OjMxNR01rvm6xxIbUhXDoFtEqM1DL2xtkhGZolasvsOqeMRY2o8ND64HMdLRuME9upQyIWN9at8a0nxiDaPl8WjPRBxUcsuBT/s1600/1+-+Supported+Deployment.png" height="216" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Metodi di deploy supportati</td></tr>
</tbody></table>
<div style="text-align: justify;">
Usando un repository Git locale è possibile, ad esempio, fare la "promozione" manuale degli aggiornamenti da un progetto locale ad un Azure Web Site; deployando invece da strumenti come BitBucket, CodePlex, Dropbox, GitHub, TFS/VSO o Mercurial è possibile abilitare un processo di continuous deployment in cui sarà Azure stesso a fare il pull update più recenti del progetto.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Entrambi i metodi permettono di deployare i progetti su un Azure Web Site, ma il continuous deployment è utile quando ci sono più persone che lavorano su un progetto e ci si vuole assicurare che l'ultima versione sia sempre pubblicata indipendentemente da chi ha fatto l'aggiornamento più recente. Il continuous deployment è anche utile se viene utilizzato uno degli strumenti di cui sopra come repository centrale per l'applicazione.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Su internet ci sono un sacco di articoli che spiegano come fare il deploy di un Azure WebSite (ad esempio <a href="http://azure.microsoft.com/en-us/documentation/articles/web-sites-deploy/" target="_blank">http://azure.microsoft.com/en-us/documentation/articles/web-sites-deploy/</a>) o come implementare delle strategia di Continuous Deployment (es. <a href="http://azure.microsoft.com/en-us/documentation/articles/web-sites-publish-source-control/" target="_blank">http://azure.microsoft.com/en-us/documentation/articles/web-sites-publish-source-control/</a>).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Ma come funziona in realtà "dietro le quinte"?</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
La risposta è "<b>Kudu</b>".</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Kudu è il motore che sta dietro il deployments degli Azure Web Sites, ma può anche funzionare al di fuori di Azure.</div>
<div style="text-align: justify;">
Ha un'architettura alquanto insolita, nel senso che è un servizio single-tenant anziché multi-tenant. Questo significa che ogni sito Web Azure ha una propria istanza del servizio Kudu, completamente distinta dalle istanze Kudu utilizzate per altri siti Azure.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Il componente rimane attivo in background e "controlla" se si verificano checkin, commit, nuovi file, build e così via. Quando rileva qualcosa, KuduSync inizia e fare il "lavoro sporco".</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Si tratta di uno strumento piuttosto interessante:</div>
<div style="text-align: justify;">
</div>
<ul>
<li>è un progetto open source disponibile su GitHub (<a href="https://github.com/projectkudu/kudu" target="_blank">https://github.com/projectkudu/kudu</a>)</li>
<li>è installato automaticamente per ogni Azure Web Sites</li>
<li>può utilizzare uno script di distribuzione personalizzato</li>
</ul>
<br />
<div style="text-align: justify;">
Ma la cosa più importante (imho) è questa:</div>
<blockquote class="tr_bq" style="text-align: justify;">
Il deployment viene creato nella struttura delle cartelle del sito web e il nuova deployment viene copiato nella root del sito, lasciando intatti i vecchi deployment. </blockquote>
<div style="text-align: justify;">
Questo significa che è possibile fare il "rollback" a qualsiasi deploy fatto in passato!</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
È anche possibile accedere alla dashboard web di Kudu, utilizzando un url del tipo "<i>https://your_website_name.scm.azurewebsites.net/</i>" e le deployment credentials associate (oppure le credenziali di un amminisistratore del servizio).</div>
<div style="text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJieB3I14qu61CfzZLZTPIhq5JT-gVE2YjpX3aC2JSjVzjwD_DlSTfHrQOzaFIiYSujJ7owXMUdDAAgzvGbkwQ5OQBEWS0_oNde6ID3uFpFAucY7U1vLr__s14g5QL0GLCcDuwMen3mDy4/s1600/2+-+Kudu+Dashboard.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJieB3I14qu61CfzZLZTPIhq5JT-gVE2YjpX3aC2JSjVzjwD_DlSTfHrQOzaFIiYSujJ7owXMUdDAAgzvGbkwQ5OQBEWS0_oNde6ID3uFpFAucY7U1vLr__s14g5QL0GLCcDuwMen3mDy4/s1600/2+-+Kudu+Dashboard.png" height="311" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Dashboard di Kudu</td></tr>
</tbody></table>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Nella dashboard di Kudu è possibile trovare un sacco di informazioni utili sull'ambiente del tuo sito web insieme a una serie di strumenti per gestire il sito e, ultimo ma non meno importante, un set completo di API REST. C'è anche la possibilità di gestire le WebSite extension.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
C'è anche un interessante video (in inglese) in cui David Ebbo e Scott Guthrie spiegano come funziona Kudu: <a href="http://channel9.msdn.com/Shows/Azure-Friday/What-is-Kudu-Azure-Web-Sites-Deployment-with-David-Ebbo" target="_blank">http://channel9.msdn.com/Shows/Azure-Friday/What-is-Kudu-Azure-Web-Sites-Deployment-with-David-Ebbo</a></div>
Davidehttp://www.blogger.com/profile/11019920232902260275noreply@blogger.com1tag:blogger.com,1999:blog-3385472261915116282.post-69735768115488168372014-08-06T10:00:00.000+02:002014-08-06T10:00:03.031+02:00Azure WebSite, Cloud Service e Virtual Machine: quale scegliere?<div style="text-align: justify;">
Capita, a volte, di dover iniziare un nuovo sviluppo o di dover pianificare una pubblicazione sul cloud, su Azure, ma di non sapere nel dettaglio che tipo di servizio è meglio utilizzare: dovrei usare un WebSite, un Cloud Service o una Virtual Machine? Che tipi di vantaggi / svantaggi ho in un caso o nell'altro?</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Vediamo quelle che sono le principali differenze.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b><i>Attenzione</i></b>: questo post è aggiornato con le info disponibili al 5 agosto 2014.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Innanzitutto uno schema, che usa Microsoft nella documentazione ufficiale di Azure, per comparare i 3 servizi:</div>
<div style="text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhzJoKAE2TsXaCowjdCRuPCY0RhQAoxA5L8t8O9gQ0bO8pY9_1Ej0f_W4BLN1w9H1od2b4nR5W56i9gO9X1F15KmZuuFQYu2zenEsk88U33QphLE2ar5YS_56LlUmAllh0aqatTcyE8N3P/s1600/websites_cloudservices_vms_2%5B1%5D.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhzJoKAE2TsXaCowjdCRuPCY0RhQAoxA5L8t8O9gQ0bO8pY9_1Ej0f_W4BLN1w9H1od2b4nR5W56i9gO9X1F15KmZuuFQYu2zenEsk88U33QphLE2ar5YS_56LlUmAllh0aqatTcyE8N3P/s1600/websites_cloudservices_vms_2%5B1%5D.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Courtesy of Microsoft</td></tr>
</tbody></table>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
In questa immagine è abbastanza chiaro il livello di semplicità vs possibilità di controllo che offrono le tre soluzioni. Volendo essere estremamente sintetici:</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
</div>
<ul>
<li><b><u>WebSite:</u></b></li>
<ul>
<li style="text-align: justify;">Soluzione estremamente semplice da utilizzare, che offre comunque un buon set di strumenti a supporto (monitoring, alerts, scale, ecc) ma a discapito del livello di personalizzazione e controllo sulla configurazione.</li>
<li><div style="text-align: justify;">
In applicazioni multi-tier, fornisce il supporto alla solo web tier</div>
</li>
</ul>
<li style="text-align: justify;"><b><u>Cloud Service:</u></b></li>
<ul>
<li style="text-align: justify;">Meno semplice da utilizzare e deployare rispetto ai Websites, fornisce un livello di controllo molto maggiore.</li>
<li style="text-align: justify;">Anche in questo caso ci sono diversi strumenti di monitoraggio e supporto già inclusi</li>
<li style="text-align: justify;">È possibile utilizzare sia i WebRole (che di fatto sono delle VM dedicate con installato IIS) sia i WorkerRole (sempre delle VM dedicate, ma senza IIS. È possibile paragonare un WorkerRole ad un Windows Service)</li>
<li style="text-align: justify;">In scenari multi-tier, è possibile utilizzare una combinazione di WebRole e WorkerRole per implementare sia il web tier che il middle-tier che il backend </li>
<li style="text-align: justify;">In scenari multi-tier, è possibile scalare il frontend ed il backend in modo indipendente</li>
</ul>
<li style="text-align: justify;"><b><u>Virtual Machine:</u></b></li>
<ul>
<li style="text-align: justify;">Lascia la configurazione e la personalizzazione completamente in mano all'utente, quindi è più complicata da gestire ma fornisce il massimo livello di controllo possibile, come con i server on-premises.</li>
<li style="text-align: justify;">Si possono utilizzare per qualsiasi tipo di applicazione ed architettura</li>
<li style="text-align: justify;">È necessario occuparsi manualmente della gestione del sistema, quindi anche di aggiornamenti, policy di sicurezza ecc ecc</li>
<li style="text-align: justify;">È la scelta ideale in scenari particolarmente complessi o quando si ha necessità di hostare servizi o software che non sono supportati nelle altre modalità.</li>
</ul>
</ul>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Questa è la tabella ufficiale con la comparazione dei tre tipi di servizio:<br />
<br /></div>
<div style="text-align: justify;">
<table border="1" cellspacing="0" style="background-color: white; border-collapse: collapse; border-spacing: 0px; border-top-color: rgb(201, 201, 201); border-top-style: solid; border-top-width: 2px; color: #505050; font-family: wf_segoe-ui_normal, 'Segoe UI', 'Segoe WP', Tahoma, Arial, sans-serif; font-size: 12px; line-height: 1.2em; padding: 0px;"><tbody>
<tr style="border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px;"><th align="left" style="font-family: wf_segoe-ui_bold, 'Segoe UI Bold', 'Segoe WP Bold', 'Segoe UI', 'Segoe WP', Tahoma, Arial, sans-serif; font-size: 10px; font-weight: 400; line-height: 1.2em; min-width: 70px; padding: 10px; text-transform: uppercase;" valign="middle">FEATURE</th><th align="left" style="font-family: wf_segoe-ui_bold, 'Segoe UI Bold', 'Segoe WP Bold', 'Segoe UI', 'Segoe WP', Tahoma, Arial, sans-serif; font-size: 10px; font-weight: 400; line-height: 1.2em; min-width: 70px; padding: 10px; text-transform: uppercase;" valign="middle">WEB SITES</th><th align="left" style="font-family: wf_segoe-ui_bold, 'Segoe UI Bold', 'Segoe WP Bold', 'Segoe UI', 'Segoe WP', Tahoma, Arial, sans-serif; font-size: 10px; font-weight: 400; line-height: 1.2em; min-width: 70px; padding: 10px; text-transform: uppercase;" valign="middle">CLOUD SERVICES<br />
(WEB ROLES)</th><th align="left" style="font-family: wf_segoe-ui_bold, 'Segoe UI Bold', 'Segoe WP Bold', 'Segoe UI', 'Segoe WP', Tahoma, Arial, sans-serif; font-size: 10px; font-weight: 400; line-height: 1.2em; min-width: 70px; padding: 10px; text-transform: uppercase;" valign="middle">VIRTUAL MACHINES</th></tr>
<tr style="border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px;"><td style="padding: 10px;" valign="middle"><div style="line-height: 1.5em; margin-bottom: 9px; margin-top: 9px;">
Access to services like Service Bus, Storage, SQL Database</div>
</td><td style="padding: 10px;" valign="middle">X</td><td style="padding: 10px;" valign="middle">X</td><td style="padding: 10px;" valign="middle">X</td></tr>
<tr style="border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px;"><td style="padding: 10px;" valign="middle"><div style="line-height: 1.5em; margin-bottom: 9px; margin-top: 9px;">
Host web or web services tier of a multi-tier architecture</div>
</td><td style="padding: 10px;" valign="middle">X</td><td style="padding: 10px;" valign="middle">X</td><td style="padding: 10px;" valign="middle">X</td></tr>
<tr style="border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px;"><td style="padding: 10px;" valign="middle"><div style="line-height: 1.5em; margin-bottom: 9px; margin-top: 9px;">
Host middle tier of a multi-tier architecture</div>
</td><td style="padding: 10px;" valign="middle"></td><td style="padding: 10px;" valign="middle">X</td><td style="padding: 10px;" valign="middle">X</td></tr>
<tr style="border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px;"><td style="padding: 10px;" valign="middle"><div style="line-height: 1.5em; margin-bottom: 9px; margin-top: 9px;">
Integrated MySQL-as-a-service support</div>
</td><td style="padding: 10px;" valign="middle">X</td><td style="padding: 10px;" valign="middle">X <span style="font-size: 8px; line-height: 0; position: relative; top: -0.5em; vertical-align: baseline;">1</span></td><td style="padding: 10px;" valign="middle">X</td></tr>
<tr style="border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px;"><td style="padding: 10px;" valign="middle"><div style="line-height: 1.5em; margin-bottom: 9px; margin-top: 9px;">
Support for ASP.NET, classic ASP, Node.js, PHP, Python</div>
</td><td style="padding: 10px;" valign="middle">X</td><td style="padding: 10px;" valign="middle">X</td><td style="padding: 10px;" valign="middle">X</td></tr>
<tr style="border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px;"><td style="padding: 10px;" valign="middle"><div style="line-height: 1.5em; margin-bottom: 9px; margin-top: 9px;">
Scale out to multiple instances without redeploy</div>
</td><td style="padding: 10px;" valign="middle">X</td><td style="padding: 10px;" valign="middle">X</td><td style="padding: 10px;" valign="middle">X <span style="font-size: 8px; line-height: 0; position: relative; top: -0.5em; vertical-align: baseline;">2</span></td></tr>
<tr style="border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px;"><td style="padding: 10px;" valign="middle"><div style="line-height: 1.5em; margin-bottom: 9px; margin-top: 9px;">
Support for SSL</div>
</td><td style="padding: 10px;" valign="middle">X <span style="font-size: 8px; line-height: 0; position: relative; top: -0.5em; vertical-align: baseline;">3</span></td><td style="padding: 10px;" valign="middle">X</td><td style="padding: 10px;" valign="middle">X</td></tr>
<tr style="border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px;"><td style="padding: 10px;" valign="middle"><div style="line-height: 1.5em; margin-bottom: 9px; margin-top: 9px;">
Visual Studio integration</div>
</td><td style="padding: 10px;" valign="middle">X</td><td style="padding: 10px;" valign="middle">X</td><td style="padding: 10px;" valign="middle">X</td></tr>
<tr style="border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px;"><td style="padding: 10px;" valign="middle"><div style="line-height: 1.5em; margin-bottom: 9px; margin-top: 9px;">
Remote Debugging</div>
</td><td style="padding: 10px;" valign="middle">X</td><td style="padding: 10px;" valign="middle">X</td><td style="padding: 10px;" valign="middle">X</td></tr>
<tr style="border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px;"><td style="padding: 10px;" valign="middle"><div style="line-height: 1.5em; margin-bottom: 9px; margin-top: 9px;">
Deploy code with TFS</div>
</td><td style="padding: 10px;" valign="middle">X</td><td style="padding: 10px;" valign="middle">X</td><td style="padding: 10px;" valign="middle">X</td></tr>
<tr style="border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px;"><td style="padding: 10px;" valign="middle"><div style="line-height: 1.5em; margin-bottom: 9px; margin-top: 9px;">
Deploy code with GIT, FTP</div>
</td><td style="padding: 10px;" valign="middle">X</td><td style="padding: 10px;" valign="middle"></td><td style="padding: 10px;" valign="middle">X</td></tr>
<tr style="border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px;"><td style="padding: 10px;" valign="middle"><div style="line-height: 1.5em; margin-bottom: 9px; margin-top: 9px;">
Deploy code with Web Deploy</div>
</td><td style="padding: 10px;" valign="middle">X</td><td style="padding: 10px;" valign="middle"><span style="font-size: 8px; line-height: 0; position: relative; top: -0.5em; vertical-align: baseline;">4</span></td><td style="padding: 10px;" valign="middle">X</td></tr>
<tr style="border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px;"><td style="padding: 10px;" valign="middle"><div style="line-height: 1.5em; margin-bottom: 9px; margin-top: 9px;">
WebMatrix support</div>
</td><td style="padding: 10px;" valign="middle">X</td><td style="padding: 10px;" valign="middle"></td><td style="padding: 10px;" valign="middle">X</td></tr>
<tr style="border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px;"><td style="padding: 10px;" valign="middle"><div style="line-height: 1.5em; margin-bottom: 9px; margin-top: 9px;">
Near-instant deployment</div>
</td><td style="padding: 10px;" valign="middle">X</td><td style="padding: 10px;" valign="middle"></td><td style="padding: 10px;" valign="middle"></td></tr>
<tr style="border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px;"><td style="padding: 10px;" valign="middle"><div style="line-height: 1.5em; margin-bottom: 9px; margin-top: 9px;">
Instances share content and configuration</div>
</td><td style="padding: 10px;" valign="middle">X</td><td style="padding: 10px;" valign="middle"></td><td style="padding: 10px;" valign="middle"></td></tr>
<tr style="border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px;"><td style="padding: 10px;" valign="middle"><div style="line-height: 1.5em; margin-bottom: 9px; margin-top: 9px;">
Scale up to larger machines without redeploy</div>
</td><td style="padding: 10px;" valign="middle">X</td><td style="padding: 10px;" valign="middle"></td><td style="padding: 10px;" valign="middle"></td></tr>
<tr style="border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px;"><td style="padding: 10px;" valign="middle"><div style="line-height: 1.5em; margin-bottom: 9px; margin-top: 9px;">
Multiple deployment environments (production and staging)</div>
</td><td style="padding: 10px;" valign="middle">X</td><td style="padding: 10px;" valign="middle">X</td><td style="padding: 10px;" valign="middle"></td></tr>
<tr style="border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px;"><td style="padding: 10px;" valign="middle"><div style="line-height: 1.5em; margin-bottom: 9px; margin-top: 9px;">
Network isolation with Azure Virtual Network</div>
</td><td style="padding: 10px;" valign="middle"></td><td style="padding: 10px;" valign="middle">X</td><td style="padding: 10px;" valign="middle">X</td></tr>
<tr style="border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px;"><td style="padding: 10px;" valign="middle"><div style="line-height: 1.5em; margin-bottom: 9px; margin-top: 9px;">
Support for Azure Traffic Manager</div>
</td><td style="padding: 10px;" valign="middle">X</td><td style="padding: 10px;" valign="middle">X</td><td style="padding: 10px;" valign="middle">X</td></tr>
<tr style="border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px;"><td style="padding: 10px;" valign="middle"><div style="line-height: 1.5em; margin-bottom: 9px; margin-top: 9px;">
Remote desktop access to servers</div>
</td><td style="padding: 10px;" valign="middle"></td><td style="padding: 10px;" valign="middle">X</td><td style="padding: 10px;" valign="middle">X</td></tr>
<tr style="border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px;"><td style="padding: 10px;" valign="middle"><div style="line-height: 1.5em; margin-bottom: 9px; margin-top: 9px;">
Ability to define/execute start-up tasks</div>
</td><td style="padding: 10px;" valign="middle"></td><td style="padding: 10px;" valign="middle">X</td><td style="padding: 10px;" valign="middle">X</td></tr>
<tr style="border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px;"><td style="padding: 10px;" valign="middle"><div style="line-height: 1.5em; margin-bottom: 9px; margin-top: 9px;">
Automatic OS update management</div>
</td><td style="padding: 10px;" valign="middle">X</td><td style="padding: 10px;" valign="middle">X</td><td style="padding: 10px;" valign="middle"></td></tr>
<tr style="border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px;"><td style="padding: 10px;" valign="middle"><div style="line-height: 1.5em; margin-bottom: 9px; margin-top: 9px;">
Integrated Endpoint Monitoring</div>
</td><td style="padding: 10px;" valign="middle">X</td><td style="padding: 10px;" valign="middle">X</td><td style="padding: 10px;" valign="middle">X</td></tr>
<tr style="border-bottom-color: rgb(201, 201, 201); border-bottom-style: solid; border-bottom-width: 2px;"><td style="padding: 10px;" valign="middle"><div style="line-height: 1.5em; margin-bottom: 9px; margin-top: 9px;">
Seamless platform switching (32bit/64bit)</div>
</td><td style="padding: 10px;" valign="middle">X</td><td style="padding: 10px;" valign="middle">X</td><td style="padding: 10px;" valign="middle"></td></tr>
</tbody></table>
<div style="background-color: white; color: #505050; font-family: wf_segoe-ui_normal, 'Segoe UI', 'Segoe WP', Tahoma, Arial, sans-serif; font-size: 14px; line-height: 21px; margin-bottom: 9px; margin-top: 9px; text-align: start;">
<div style="text-align: justify;">
<span style="font-size: 9px; line-height: 0; position: relative; top: -0.5em; vertical-align: baseline;">1</span> Web or worker roles can integrate MySQL-as-a-service through ClearDB's offerings, but not as part of the Management Portal workflow.</div>
</div>
<div style="background-color: white; color: #505050; font-family: wf_segoe-ui_normal, 'Segoe UI', 'Segoe WP', Tahoma, Arial, sans-serif; font-size: 14px; line-height: 21px; margin-bottom: 9px; margin-top: 9px; text-align: start;">
<div style="text-align: justify;">
<span style="font-size: 9px; line-height: 0; position: relative; top: -0.5em; vertical-align: baseline;">2</span> Although Virtual Machines can scale out to multiple instances, the services running on these machines must be written to handle this scale-out. An additional load balancer must be configured to route requests across the machines. Finally, an Affinity Group should be created for all machines participating in the same role to protect them from simultaneous restarts from maintenance or hardware failures.</div>
</div>
<div style="background-color: white; color: #505050; font-family: wf_segoe-ui_normal, 'Segoe UI', 'Segoe WP', Tahoma, Arial, sans-serif; font-size: 14px; line-height: 21px; margin-bottom: 9px; margin-top: 9px; text-align: start;">
<div style="text-align: justify;">
<span style="font-size: 9px; line-height: 0; position: relative; top: -0.5em; vertical-align: baseline;">3</span> For Web Sites, SSL for custom domain names is only supported for standard mode. For more information on using SSL with Web Sites, see <a href="http://www.windowsazure.com/en-us/develop/net/common-tasks/enable-ssl-web-site/" style="-webkit-transition: all 0.1s ease-in-out; color: #00abec; text-decoration: none; transition: all 0.1s ease-in-out;">Configuring an SSL certificate for an Azure Web Site</a>.</div>
</div>
<div style="background-color: white; color: #505050; font-family: wf_segoe-ui_normal, 'Segoe UI', 'Segoe WP', Tahoma, Arial, sans-serif; font-size: 14px; line-height: 21px; margin-top: 9px; text-align: start;">
<div style="text-align: justify;">
<span style="font-size: 9px; line-height: 0; position: relative; top: -0.5em; vertical-align: baseline;">4</span> Web Deploy is supported for cloud services when deploying to single-instance roles. However, production roles require multiple instances to meet the Azure SLA. Therefore, Web Deploy is not a suitable deployment mechanism for cloud services in production.</div>
<br /></div>
</div>
Per vedere la comparazione completa dei tre servizi, costantemente aggiornata, è possibile consultare la <a href="http://azure.microsoft.com/it-it/documentation/articles/choose-web-site-cloud-service-vm/" target="_blank">guida ufficiale sulla documentazione di Azure</a>Davidehttp://www.blogger.com/profile/11019920232902260275noreply@blogger.com0tag:blogger.com,1999:blog-3385472261915116282.post-58740267148919709752014-07-30T11:58:00.001+02:002014-07-30T11:58:48.457+02:00Indirizzo IP dedicato sugli Azure Website<div style="text-align: justify;">
Quando si ha un indirizzo IP condiviso con altri siti / clienti (come accade in un ambiente multi-tenant), si possono avere alcuni problemi come, per esempio, vedersi inserito l'IP in una blacklist a causa del contenuto di altri siti.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
L'unico modo affidabile per risolvere questo ed altri problemi è quello di configurare il website con un IP dedicato. Ciò significa che il sito utilizzerà un proprio IP, che quindi non sarà condiviso con altri siti. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
In Azure, è possibile facilmente ottenere un IP dedicato con l'attivazione dell'IP SSL. Questa opzione è disponibile solo per i siti del tier Standard e se il website utilizza un dominio personalizzato ci sono alcune considerazioni supplementari.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Se si utilizza un dominio personalizzato ed è stato configurato un record CNAME che punta al sito su Azure (ad esempio, mysite.azurewebsites.net), allora è piuttosto semplice - basta cambiare il record con il proprio provider DNS e quindi configurare IP-SSL.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Se, invece, è stato configurato un record A per risolvere l'hostname è necessario seguire questa procedura:</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
</div>
<ol>
<li>Cambiare la mappatura dell'hostname (cioè www.mysite.com) da un record a un CNAME che punta al Website su Azure (cioè mysite.azurewebsites.net). Questa operazione non dovrebbe causare nessun downtime visto che entrambi i record risolveranno lo stesso indirizzo IP. Attendere un po' di tempo per essere sicuri che i DNS si siano replicati correttamente.<br /></li>
<li>Caricare un certificato valido per www.mysite.com sul Website utilizzando la pagina "Domains" nella tab "Configure". Normalmente il certificato va acquistato da un provider abilitato (una certification authority), ma se non si intende utilizzare effettivamente SSL, è possibile utilizzare un certificato auto-firmato che è facile da generare e, soprattutto, è gratis.<br /></li>
<li>Configurare un binding SSL IP Based per www.mysite.com. Questa opzione è disponibile sotto "SSL Binding" nella scheda "Configure". Per maggiori informazioni è possibile consultare la sezione "Configure SSL" nella <a href="http://azure.microsoft.com/en-us/documentation/articles/web-sites-configure-ssl-certificate/" target="_blank">guida per attivare l'SSL su Azure</a>.</li>
</ol>
Davidehttp://www.blogger.com/profile/11019920232902260275noreply@blogger.com0tag:blogger.com,1999:blog-3385472261915116282.post-62479230131799469132014-07-22T09:10:00.000+02:002014-07-22T09:10:05.510+02:00Visual Studio Online ora supporta Azure Active Directory<br />
<div style="text-align: justify;">
Ieri il team vsalm di Microsoft ha iniziato il deploy dello sprint 68.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
La parte più grande ed interessante dell'annuncio è la nuova fase del supporto di <b><u>Azure Active Directory in VS Online</u></b>. Hanno iniziato questo "viaggio" in maggio quando hanno annunciato le prime parti del supporto all'AAD a "Build". Poi hanno aggiunto alcune (poche) altre informazioni durante "TechEd" ma era una cosa passata un po' in sordina visto che, fino a questa settimana, non era possibile convertire o associare un account esistente ad AAD. Con questo deploy, invece, diventa possibile! Ufficialmente è in preview e quindi è necessario richiedere l'accesso alla funzionalità, ma sembra accettino tutte le richieste quindi non dovrebbe essere un grosso problema (anche perchè va fatto una volta sola). </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Con queste modifiche, è possibile:</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
</div>
<ul>
<li>Associare un OrgID (ovvero credenziali AAD/AD) alla sottoscrizione MSDN, se ce n'è una, ed usarla come grant per la licenza VSO</li>
<li>Creare un nuovo account collecato ad AAD</li>
<li>Collegare un account esistente ad AAD</li>
<li>Scollegare un account da AAD</li>
<li>Accedere sia con un Microsoft Account che con un OrgID (solo AAD oppure in sycn con l'Active Directory on premises) creando di fatto un SSO con le credenziali corporate, Office 365, ecc.</li>
</ul>
<br />
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Per vedere tutti i dettagli riguardo il supporto AD e le altre cose incluse nell'update è possibile leggere il post originale di Brian Harry su MSDN.</div>
Davidehttp://www.blogger.com/profile/11019920232902260275noreply@blogger.com0