<?xml version="1.0" encoding="utf-8"?><rss version="2.0"><channel><title>Blog</title><link>http://www.vifani.com:80/</link><description>Blog</description><item><title>Orario Treni si aggiorna alla versione 1.2.2</title><link>http://www.vifani.com:80/orario-treni-si-aggiorna-alla-versione-1.2.2</link><description>&lt;p style="text-align: center;"&gt;&lt;img src="http://www.vifani.com/Media/Default/BlogPost//470394_363889553641977_327321910632075_1237786_1660713669_o.jpg" alt="Orario Treni" width="500" height="400"&gt;&lt;/p&gt;
&lt;p&gt;Vi segnalo che &amp;egrave; stata appena rilasciata la versione 1.2.2 di &lt;a href="http://www.vifani.com/mobileapp/63/orario-treni" title="Orario Treni" target="_blank"&gt;Orario Treni&lt;/a&gt;, l'app di riferimento per chi viaggia in treno, che introduce le seguenti migliorie:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prestazioni: sono state migliorate le prestazioni su tutti gli iPhone 3GS/4/4S&lt;/li&gt;
&lt;li&gt;Grafica: alcuni elementi dell'interfaccia grafica sono stati migliorati&lt;/li&gt;
&lt;li&gt;iOS 5.1: &amp;egrave; stato aggiunto il supporto ufficiale a iOS 5.1&lt;/li&gt;
&lt;li&gt;Bug: una serie di bug che ci sono stati segnalati sono stati risolti&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La versione 2.0 &amp;egrave; in lavorazione e sar&amp;agrave; ricca di tantissime novit&amp;agrave;. Stay tuned!&lt;/p&gt;</description><pubDate>Wed, 16 May 2012 08:18:52 GMT</pubDate><guid isPermaLink="true">http://www.vifani.com:80/orario-treni-si-aggiorna-alla-versione-1.2.2</guid></item><item><title>Community Days 2012 Bari: due giorni da favola</title><link>http://www.vifani.com:80/community-days-2012-bari-due-giorni-da-favola</link><description>&lt;p style="text-align: center;"&gt;&lt;img src="http://www.vifani.com/Media/Default/BlogPost//cdays12ba.jpg" alt="" width="500" height="319"&gt;&lt;/p&gt;
&lt;p&gt;Negli ultimi due giorni ho preso parte all'evento &lt;a href="http://www.communitydays.it/events/communitydaysbari-2012/" title="Community Days 2012 Bari" target="_blank"&gt;Community Days 2012 Bari&lt;/a&gt;, evento che si &amp;egrave; tenuto per la prima volta a Bari e che mi ha colpito notevolmente. Non capita tutti i giorni di vedere nella mia citt&amp;agrave; professionisti nel settore dello sviluppo software di tale caratura ed &amp;egrave; stato un vero piacere conoscere di persona speaker che negli ultimi anni ho potuto solo seguire sul web o al WPC. Noi di &lt;a href="http://dotnetside.org/" target="_blank"&gt;DotNetSide&lt;/a&gt; chiaramente abbiamo dato il nostro contributo e, grazie anche alla sponsorizzazione di &lt;a href="http://www.edilportale.com/" target="_blank"&gt;Edilportale.com&lt;/a&gt;, gli ultimi due giorni li ho trascorsi piacevolmente tra confronti, sessioni tecniche, nuove e vecchie conoscenze, oltre che chiaramente cene, pranzi e coffee break :) Il tutto ha avuto luogo nella fantastica sede di Edilportale.com, una realt&amp;agrave; che si conferma come tra le pi&amp;ugrave; giovani, dinamiche ed interessanti nel panorama pugliese delle aziende in qualche modo legate al web.&lt;/p&gt;
&lt;p&gt;Nel mio piccolo ho contribuito con una sessione sulle Push Notification in Windows Phone, della quale potete trovare slide e demo sul &lt;a href="http://www.communitydays.it/events/communitydaysbari-2012/wp0703/" title="WP0703 - Push Notification: come rendere vive le app su Windows Phone" target="_blank"&gt;sito dell'evento&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 10 May 2012 08:55:04 GMT</pubDate><guid isPermaLink="true">http://www.vifani.com:80/community-days-2012-bari-due-giorni-da-favola</guid></item><item><title>AutomationFactory in Silverlight 5</title><link>http://www.vifani.com:80/automationfactory-in-silverlight-5</link><description>&lt;p style="text-align: center;"&gt;&lt;img src="http://www.vifani.com/Media/Default/BlogPost//silverlight_logo.png" alt="" width="450" height="146"&gt;&lt;/p&gt;
&lt;p&gt;E' da diverse versioni che Silverlight supporta la possibilit&amp;agrave; di richiamare &lt;strong&gt;Automation Server&lt;/strong&gt; mediante l'API &lt;a href="http://msdn.microsoft.com/en-us/library/ff457794(VS.95).aspx" title="AutomationFactory" target="_blank"&gt;AutomationFactory&lt;/a&gt;. In &lt;strong&gt;Silverlight 5&lt;/strong&gt;, tuttavia, la possibilit&amp;agrave; di avere applicazioni in browser di tipo Trusted, consente un pi&amp;ugrave; ampio ventaglio di utilizzi di questa tecnologia. Fino a Silverlight 4, infatti, qualsiasi operazione che richiedesse un aumento dei privilegi poteva essere eseguita solo ed esclusivamente se l'applicazione era di tipo out of browser il che, soprattutto dal punto di vista commerciale/marketing, potrebbe rappresentare un problema. Diciamolo chiaramente: gli addetti al settore sanno benissimo che Silverlight, cos&amp;igrave; come Flash, non possono essere definite tecnologie puramente web. Se si vuole fare un sistema web puro, si deve usare HTML, Javascript e qualche linguaggio server side. Tuttavia, bench&amp;eacute; con HTML 5, CSS 3 e tutto ci&amp;ograve; che gira attorno, tale tendenza sembra essere quella che inevitabilmente da qui a qualche anno si diffonder&amp;agrave;, utilizzare ambienti di sviluppo come Silverlight rappresenta a mio parere, almeno fino ad ora,&amp;nbsp;un notevole vantaggio nei seguenti aspetti:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;linguaggio di programmazione - con tutto il rispetto per javascript, usare C# garantisce una netta superiorit&amp;agrave; dal punto di vista della produttivit&amp;agrave;, degli strumenti di sviluppo/debug, degli strumenti per test automatici e dell'implementazione di design pattern&lt;/li&gt;
&lt;li&gt;accesso a risorse locali - non tutte le applicazioni possono astrarsi dalla macchina su cui lavorano, alcune necessitano si accedere a dispositivi hardware e molto spesso non possibile accedervi usando javascript&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In Silverlight 5 &amp;egrave; possibile, quindi, lavorare con applicazioni Trusted in browser e questa peculiarit&amp;agrave; ci permette di eseguire operazioni come, per esempio, il deploy in locale di un pacchetto Windows Installer che, una volta installato, potrebbe esporci mediante una libreria COM visible, funzionalit&amp;agrave; normalmente non accessibili. Di seguito un esempio di codice che recupera il pacchetto di installazione da risorse dello XAP stesso (ma potreste scaricarlo da un web server o in qualunque altro modo), lo scrive sul disco (la funzione WriteStreamIntoStream non fa altro che travasare gli stream) e poi lo esegue utilizzando l'oggetto COM &lt;strong&gt;WScript.Shell&lt;/strong&gt; e, in particolare, il metodo Run:&lt;/p&gt;
&lt;pre class="brush: csharp;"&gt;StreamResourceInfo srMSI = Application.GetResourceStream(new Uri("Test;component/Packages/Test.msi", UriKind.Relative));
var filePath = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Test.msi");
using (var setupStream = File.Open(filePath, FileMode.OpenOrCreate))
{
	WriteStreamIntoStream(srMSI.Stream, setupStream);
}

var shell = AutomationFactory.CreateObject("WScript.Shell");
var result = shell.Run(filePath, 1, true);
return result == 0;&lt;/pre&gt;
&lt;p&gt;Chiaramente se il pacchetto di installazione richiede privilegi di amministratore, in ambienti come Windows Vista o Windows 7 con UAC attivo, verr&amp;agrave; richiesta l'elevazione dei privilegi e, a tal proposito, vi consiglio caldamente di firmare con un certificato digitale il pacchetto MSI in modo che il cliente abbia ben chiara l'origine dell'operazione.&lt;/p&gt;</description><pubDate>Mon, 23 Apr 2012 07:32:18 GMT</pubDate><guid isPermaLink="true">http://www.vifani.com:80/automationfactory-in-silverlight-5</guid></item><item><title>Microsoft .NET Framework 4.0.3</title><link>http://www.vifani.com:80/microsoft-.net-framework-4.0.3</link><description>&lt;p style="text-align: center;"&gt;&lt;img src="http://www.vifani.com/Media/Default/BlogPost//Netframework-version-4.png" alt="" width="450" height="429"&gt;&lt;/p&gt;
&lt;p&gt;In attesa che esca il nuovo .NET Framework 4.5 in versione definitiva, Microsoft ha rilasciato un aggiornamento del .NET Framework 4 alla &lt;strong&gt;versione 4.0.3&lt;/strong&gt;. Analogamente ai precedenti aggiornamenti (4.0.1 e 4.0.2), questo introduce alcune novit&amp;agrave; ed una serie di migliorie, oltre chiaramente a risolve bug pi&amp;ugrave; o meno gravi. Tra le novit&amp;agrave; principali segnalo la possibilit&amp;agrave; di utilizzare l'engine di &lt;strong&gt;Workflow Foundation 4&lt;/strong&gt; anche in ambienti medium trust, il che amplia significativamente gli ambiti d'uso di questa libreria. Workflow Foundation 4 &amp;egrave; una libreria probabilmente poco conosciuta, ma in termini di workflow engine, rappresenta un significativo passo in avanti rispetto all'ormai obsoleta versione introdotta con il framework 3.0: nel caso in cui sia a voi sconosciuta, consiglio caldamente di dargli un'opportunit&amp;agrave;.&lt;/p&gt;
&lt;p&gt;Altri miglioramenti riguardano la gestione di ADO.NET con configurazioni di SQL Server particolarmente care a chi utilizza &lt;strong&gt;SQL Azure&lt;/strong&gt;, per le quali sono stati risolti una serie di antipatici bug.&lt;/p&gt;
&lt;p&gt;Maggiori informazioni sull'aggiornamento potete trovarle &lt;a href="http://support.microsoft.com/kb/2600211" title="KB2600211" target="_blank"&gt;qui&lt;/a&gt;. Potete invece scaricare l'aggiornamento che include anche un'update di Visual Studio 2010 SP1 &lt;a href="http://support.microsoft.com/kb/2600214" target="_blank"&gt;qui&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 13 Apr 2012 18:51:21 GMT</pubDate><guid isPermaLink="true">http://www.vifani.com:80/microsoft-.net-framework-4.0.3</guid></item><item><title>Visual Studio 2010 SP1 loading toolbox...</title><link>http://www.vifani.com:80/visual-studio-2010-sp1-loading-toolbox</link><description>&lt;p style="text-align: center;"&gt;&lt;img src="http://www.vifani.com/Media/Default/BlogPost/VisualStudio2010Ultimate.png" alt="" width="450" height="322"&gt;&lt;/p&gt;
&lt;p&gt;Se avete installato i &lt;strong&gt;Silverlight 5 Tools&lt;/strong&gt; per Visual Studio 2010 SP1 &amp;egrave; molto probabile che al primo accesso alla toolbox, Visual Studio si blocchi per 50-60 secondi con il seguente messaggio nella status bar:&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;em&gt;Loading toolbox content from package Microsoft.VisualStudio.IDE.Toolbox.ControlInstaller.ToolboxInstallerPackage&amp;nbsp;'{2C98B35-07DA-45F1-96A3-BE55D91C8D7A}'&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Il problema sembra essere causato dall'installazione dei Silverlight 5 Tools e, in particolare, dal toolkit dei &lt;strong&gt;WCF RIA Services&lt;/strong&gt; e di Silverlight 5 stesso. Per risolvere questo problema potete trovare online una serie di workaround, ma quello che a mio parere &amp;egrave; il pi&amp;ugrave; valido &amp;egrave; il seguente&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Disinstallate WCF RIA Services V1.0 SP2&lt;/li&gt;
&lt;li&gt;Disinstallate WCF RIA Services Toolkit&lt;/li&gt;
&lt;li&gt;Disinstallate Silverlight 5 Toolkit&lt;/li&gt;
&lt;li&gt;Avviate Visual Studio 2010 -&amp;gt; Pulsante Destro sulla Toolbox -&amp;gt; Reset Toolbox&lt;/li&gt;
&lt;li&gt;Chiudete Visual Studio 2010&lt;/li&gt;
&lt;li&gt;Andate in %USERPROFILE%\Local Settings\Application Data\Microsoft\VisualStudio\10.0 ed eliminate tutti i file .TBD&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Dopo aver eseguito questa procedura, il primo avvio di Visual Studio sicuramente sar&amp;agrave; pi&amp;ugrave; lento del solito, in particolare per caricare la toolbox, ma tutti i successivi avvii non vi riproporranno pi&amp;ugrave; l'antipatico problema. Se avete necessit&amp;agrave; di utilizzare i vari toolkit disinstallati, vi consiglio caldamente di abbracciare l'approccio NuGet e di smetterla di installarvi sull'ambiente di sviluppo e in GAC tutte le librerie che usate.&lt;/p&gt;</description><pubDate>Wed, 04 Apr 2012 18:45:00 GMT</pubDate><guid isPermaLink="true">http://www.vifani.com:80/visual-studio-2010-sp1-loading-toolbox</guid></item><item><title>Banding su Windows Phone</title><link>http://www.vifani.com:80/banding-su-windows-phone</link><description>&lt;p&gt;Anche se non sono un grafico, aver lavorato per diversi anni come redattore per Hardware Upgrade e, in particolare, fare recensioni di schede video, mi ha reso particolarmente sensibile ad alcuni artefatti grafici tipici delle schede di un tempo. Dovete sapere, infatti, che fino a quando il monopolio delle schede video acceleratrici 3D era in mano a &lt;strong&gt;3dfx Interactive&lt;/strong&gt; (e qui una lacrima riga il mio viso), buona parte delle elaborazioni grafiche veniva eseguita a 16 bit. Per chi non lo sapesse, questo significa che il numero massimo di colori visualizzabili sullo schermo era pari a&amp;nbsp;65536, tanti potreste pensare voi, ma in realt&amp;agrave; pochissimi in molte circostanze.&lt;/p&gt;
&lt;p&gt;Il problema si pone in particolare quando &amp;egrave; necessario sfruttare un'ampio spettro di sfumature di uno stesso colore. In questo specifico ambito i 16 bit mostrano tutti i loro limiti e gli oltre 16 milioni di colori che oggi ammiriamo grazie ai 32 bit diventano indispensabili. L'effetto pi&amp;ugrave; evidente che si nota quando il numero di colori diventa insufficiente &amp;egrave; il cosiddetto &lt;strong&gt;banding&lt;/strong&gt;.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img src="http://www.vifani.com/Media/Default/BlogPost/Blog/gradient32bit3ze.png" alt="" width="550" height="263"&gt;&lt;/p&gt;
&lt;p&gt;L'immagine sopra esposta ben evidenzia la problematica. A questo punto alcuni si staranno chiedendo: cosa c'entra il banding con i Windows Phone? Purtroppo molto perch&amp;eacute; Microsoft ha deciso di impostare &lt;strong&gt;16 bit&lt;/strong&gt; come profondit&amp;agrave; di colore predefinita delle applicazioni Windows Phone sviluppate in Silverlight. La motivazione &amp;egrave; presto detta: 16 bit richiedono molta meno potenza di calcolo, molta meno memoria video e di sistema, oltre a rappresentare il minimo comune denominatore dei colori supportati dagli schermi sui Windows Phone.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img alt="" src="http://www.vifani.com/Media/Default/BlogPost/Blog/banding.JPG" width="474" height="50"&gt;&lt;/p&gt;
&lt;p&gt;Ecco quindi che, esattamente come alla fine degli anni 90 abbiamo dovuto lottare per conquistare i 32 bit nella grafica tridimensionale dei videogiochi, oggi ci tocca fare altrettanto con i Windows Phone. Fortunatamente, contrariamente all'epoca, la scelta di Microsoft non &amp;egrave; dettata da limiti hardware, ma da una scelta votata all'ottimizzazione delle risorse di un telefono, il che significa che per abilitare i 32 bit nelle vostre app per Windows Phone non dovrete fare altro che aprire il file&amp;nbsp;&lt;strong&gt;WMAppManifest.xml&lt;/strong&gt; ed impostare l'attributo &lt;strong&gt;BitsPerPixel&lt;/strong&gt; a 32.&lt;/p&gt;
&lt;p&gt;Controindicazioni? In teoria vi macchierete del crimine di non risparmiare le risorse hardware del Windows Phone sul quale gira la vostra app, ma onestamente a mio parere &amp;egrave; pi&amp;ugrave; alto il rischio di fare brutta figura con il banding, che non quello di perdere qualche decimale di batteria in pi&amp;ugrave;. Detto questo, valutate su uno smartphone (e non sull'emulatore) l'entit&amp;agrave; della problematica e, eventualmente, prendete le dovute contromisure.&lt;/p&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: white; background-position: initial initial; background-repeat: initial initial;"&gt;&lt;/pre&gt;</description><pubDate>Tue, 03 Apr 2012 06:46:21 GMT</pubDate><guid isPermaLink="true">http://www.vifani.com:80/banding-su-windows-phone</guid></item><item><title>Font custom in Windows Phone</title><link>http://www.vifani.com:80/font-custom-in-windows-phone</link><description>&lt;p style="text-align: center;"&gt;&lt;img src="http://www.vifani.com/Media/Default/BlogPost/Blog/font-custom-in-windows-phone/fontcustom1.JPG" alt="" width="250" height="195"&gt;&amp;nbsp;&amp;nbsp;&lt;img src="http://www.vifani.com/Media/Default/BlogPost/Blog/font-custom-in-windows-phone/fontcustom2.JPG" alt="" width="250" height="197"&gt;&lt;/p&gt;
&lt;p&gt;Mi &amp;egrave; capitato di dover far uso in un'applicazione Windows Phone di &lt;strong&gt;font custom&lt;/strong&gt;, che vanno quindi oltre i classici disponibili nel piccolo OS di casa Microsoft dedicato agli smartphone. Implementare questa funzionalit&amp;agrave; &amp;egrave; abbastanza banale, ma ve lo riporto perch&amp;eacute; non sempre le cose semplici vengono in mente facilmente. Innanzitutto &amp;egrave; necessario aggiungere al progetto il font in questione ed assicurarsi che la Build Action sia impostata su &lt;strong&gt;Resource&lt;/strong&gt;. A questo punto il font vi comparir&amp;agrave; magicamente nell'elenco dei font disponibili, per esempio, per il testo di una TextBox.&lt;/p&gt;</description><pubDate>Tue, 20 Mar 2012 06:17:12 GMT</pubDate><guid isPermaLink="true">http://www.vifani.com:80/font-custom-in-windows-phone</guid></item><item><title>Info Uovo: le uova non hanno più segreti</title><link>http://www.vifani.com:80/info-uovo-le-uova-non-hanno-piu-segreti</link><description>&lt;p style="text-align: center;"&gt;&lt;img src="http://www.vifani.com/Media/Default/InfoUovo/screen1.jpg" alt="" width="250" height="417"&gt;&amp;nbsp;&amp;nbsp;&lt;img src="http://www.vifani.com/Media/Default/InfoUovo/screen2.jpg" alt="" width="250" height="417"&gt;&lt;/p&gt;
&lt;p&gt;Oggi vi propongo una piccola e simpatica app sviluppata nel tempo libero che vi consente di identificare l'origine delle vostre uova. Forse non tutti sapete, infatti, che secondo una normativa europea le uova che acquistiamo&amp;nbsp;devono avere un codice identificativo attraverso il quale &amp;egrave; possibile risalire a tipo, nazione, provincia e comune dell'allevamento in cui &amp;egrave; stata allevata la gallina che lo ha deposto.&lt;/p&gt;
&lt;p&gt;L'aspetto che ho trovato pi&amp;ugrave; interessante &amp;egrave; quello relativo alle &lt;strong&gt;tipologie di allevamenti&lt;/strong&gt;. Infatti, la prima cifra del codice va da 0 a 3 e vi dice il tipo di allevamento: consiglio caldamente di non acquistare uova con tipologia 2 o 3 in quanto le condizioni di vita della gallina sono assurde (ad esempio, vivono in un box delle dimensioni di una scatola di scarpe fino alla fine dei loro giorni), il che indipendentemente dal fatto di essere pi&amp;ugrave; o meno amanti degli animali, secondo una serie di studi influenza negativamente la &lt;strong&gt;qualit&amp;agrave; delle uova&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.vifani.com/mobileapp/info-uovo" title="Info Uovo" target="_blank"&gt;Info Uovo&lt;/a&gt; vi illustra queste informazioni e si integra anche con &lt;strong&gt;Bing Maps&lt;/strong&gt; per mostrarvi direttamente il comune di origine dell'uovo identificato. L'app &amp;egrave; disponibile gratuitamente per Windows Phone sul &lt;a href="http://windowsphone.com/s?appid=82bcb213-d577-4fdb-817d-3ecf64b474c4" title="Info Uovo sul Marketplace" target="_blank"&gt;Marketplace&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Sun, 18 Mar 2012 12:33:01 GMT</pubDate><guid isPermaLink="true">http://www.vifani.com:80/info-uovo-le-uova-non-hanno-piu-segreti</guid></item><item><title>Orario Treni 1.1 per Windows Phone</title><link>http://www.vifani.com:80/orario-treni</link><description>&lt;p style="text-align: center;"&gt;&lt;img src="http://www.vifani.com/Media/Default/BlogPost/Blog/orario-treni/trial_wp7.jpg" alt="" width="250" height="417"&gt;&amp;nbsp;&amp;nbsp;&lt;img src="http://www.vifani.com/Media/Default/BlogPost/Blog/orario-treni/info_wp7.jpg" alt="" width="250" height="417"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.vifani.com/mobileapp/63/orario-treni" title="Orario Treni per Windows Phone" target="_blank"&gt;Orario Treni per Windows Phone&lt;/a&gt; giunge alla &lt;strong&gt;versione 1.1&lt;/strong&gt; che introduce una serie di novit&amp;agrave;. Innanzitutto &amp;egrave; ora disponibile la &lt;strong&gt;trial mode&lt;/strong&gt;, cio&amp;egrave; &amp;egrave; possibile provare l'applicazione in versione di valutazione in cui non sono disponibili le seguenti funzionalit&amp;agrave;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Scioperi&lt;/li&gt;
&lt;li&gt;Preferiti&lt;/li&gt;
&lt;li&gt;Dettaglio di un treno&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;Maggiori informazioni su come implementare la trial mode saranno disponibili in un prossimo post di questo blog. Sono state inoltre risolte alcune problematiche nella &lt;strong&gt;ricerca delle soluzioni di viaggio&lt;/strong&gt; al fine di migliorarne l'usabilit&amp;agrave; quando per una determinata fascia oraria non sono disponibili soluzioni. Bene, in attesa delle prossime novit&amp;agrave; che non tarderanno ad arrivare, che altro dire se non &lt;a href="http://windowsphone.com/s?appid=b4be1f14-07cd-4493-ae93-a0e02be47dc3" title="Orario Treni per Windows Phone" target="_blank"&gt;BUON DOWNLOAD&lt;/a&gt;!&lt;/div&gt;
&lt;p&gt;
&lt;p style="text-align: center;"&gt;&lt;a title="Orario Treni per Windows Phone" href="http://windowsphone.com/s?appid=b4be1f14-07cd-4493-ae93-a0e02be47dc3" target="_blank" alt="Orario Treni per Windows Phone"&gt;&lt;img style="border-width: 0px;" src="http://www.vifani.com/Media/Default/OrarioTreni/Download-IT-Med.png"&gt;&lt;/a&gt;&lt;/p&gt;</description><pubDate>Tue, 13 Mar 2012 18:14:43 GMT</pubDate><guid isPermaLink="true">http://www.vifani.com:80/orario-treni</guid></item><item><title>Command Query Responsibility Segregation</title><link>http://www.vifani.com:80/command-query-responsibility-segregation</link><description>&lt;p style="text-align: justify;"&gt;Nel precedente post vi ho proposto una rapida &lt;a href="http://www.vifani.com/sql-azure-vs-azure-table-storage" title="SQL Azure vs Azure Table Storage" target="_blank"&gt;comparativa tra SQL Azure e l'Azure Table Storage&lt;/a&gt;, tentando di analizzare punti di forza e di debolezza di entrambe queste tecnologie destinate prevalentemente a cui sviluppa sistemi cloud based su Windows Azure.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;Quest'oggi vi parler&amp;ograve; di un design pattern denominato&amp;nbsp;&lt;strong&gt;Command Query Responsibility Segregation&lt;/strong&gt; che si sposa ottimamente con le caratteristiche del cloud, in particolare per lo sviluppo di sistemi che richiedano una scalabilit&amp;agrave; orizzontale elevatissima (diciamo potenzialmente infinita). Per analizzare questo design pattern partiamo da un esempio di classica architettura client-server.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img src="http://www.vifani.com/Media/Default/BlogPost/Blog/cqrs1.png" alt="CQRS" align="middle" width="500" height="350"&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;Si tratta della classica architettura che abbiamo spesso di fronte ai nostri occhi quando lavoriamo ad un gestionale. Il tutto si traduce nei seguenti passaggi: il client richiede al server un DTO, cio&amp;egrave; in sostanza dati, li manipola e li reinvia al server il quale non dovr&amp;agrave; far altro che identificare le modifiche fatte al DTO originario e tradurle in aggiornamenti nella base dati. I domain object, con l'avvento degli ORM, possono essere solitamente&amp;nbsp;identificati negli EntityObject, nelle Tracking Instances, nei POCO o una qualsiasi altra forma supportata dall'ORM stesso. I DTO vengono spesso mappati 1-1 sul modello sottostante.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;Questa architettura &amp;egrave; stata fortemente incentivata da Microsoft con tecnologie come l'Entity Framework ed i WCF RIA Services/ADO.NET Data Services e, contrariamente a quanto si possa pensare, non ha nulla a che fare con un &lt;strong&gt;design di tipo Domain Driven&lt;/strong&gt;.&amp;nbsp;Qualcuno potrebbe obiettare che il modello dei dati &amp;egrave; fortemente basato sul dominio applicativo, ma questo non &amp;egrave; esatto per almeno due ragioni. Innanzitutto modellare le entit&amp;agrave; e lo schema del database sulla base del dominio applicativo &amp;egrave; una conseguenza della semplicit&amp;agrave; nell'eseguire questo tipo di operazione messa a disposizione dagli ORM e non una conseguenza del voler adottare un design Domain Driven. In secondo luogo, un'architettura Domain Driven non ha nulla a che fare con le classiche operazioni di CRUD gestite dall'architettura che vi ho proposto, ma piuttosto &amp;egrave; di tipo Task Driven, cio&amp;egrave; espone nella UI le operazioni logiche del dominio applicativo e non quelle fisiche di persistenza sul database.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;Chiaramente &amp;egrave; possibile che Create, Update e Delete corrispondano anche ad operazioni logiche del dominio applicativo, ma di fatto normalmente quello che ci si limita a fare &amp;egrave; recuperare i dati lato client, modificarli e lanciare una SaveChanges. Questo approccio non &amp;egrave; un design di tipo Domain Driven ed &amp;egrave; fatto per semplificare la vita dello sviluppatore, non per semplificare la vita dell'utente finale dell'applicazione. Volete un esempio? Pensate che, in un rubrica, recuperare dal database la riga di un contatto, esporre tutti i campi in una form, cambiare il campo "Indirizzo" e cliccare su "Salva" sia un'operazione intuitiva per chi non sa che significhi fare una INSERT, UPDATE e DELETE? E' comodo per noi sviluppatori, ma per l'utente forse sarebbe pi&amp;ugrave; comodo avere un pulsante denominato "Cambia indirizzo", una maschera che mostra solo l'indirizzo e un pulsante "Ok".&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;Al di l&amp;agrave; del voler adottare o meno un design di tipo Domain Driven, scelta pi&amp;ugrave; che lecita in molteplici ambiti applicativi, il problema pi&amp;ugrave; grande dell'architettura sopra esposta &amp;egrave; la assoluta &lt;strong&gt;centralit&amp;agrave; del database&lt;/strong&gt; nel corso della normale operativit&amp;agrave;. In tutti i casi &amp;egrave; necessario tradurre i dati che vogliamo recuperare in una query SQL, dobbiamo quindi risolvere il problema dell'&lt;strong&gt;Impedance Mismatch&lt;/strong&gt; (lo fanno per noi gli ORM, ma ha comunque un costo), tradurre il tutto in DTO, tracciare le modifiche effettuate e ritradurle un query SQL per aggiornare la base di dati. In tutto questo giro gli RDBMS devono rispettare le ACID (Atomicity, Consistency, Isolation, e Durability)&amp;nbsp;e questo rappresenta un collo di bottiglia non indifferente. Sappiate, infatti, che potete anche avere due processori da 4 core l'uno e 64 GB di RAM sul vostro server, ma se vengono lanciate in parallelo &amp;nbsp;tante operazioni sui medesimi dati, entreranno in gioco i meccanismi di ROW LOCK, RANGE LOCK o, peggio, TABLE LOCK, che metteranno tutte le operazioni in fila rendendo vano il vostro sforzo economico per la &lt;a href="http://www.vifani.com/sql-azure-vs-azure-table-storage" title="Scalabilit&amp;agrave; verticale" target="_blank"&gt;scalabilit&amp;agrave; verticale&lt;/a&gt;.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img src="http://www.vifani.com/Media/Default/BlogPost/Blog/cqrs2.png" alt="CQRS" align="middle" width="500" height="382"&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;Come se ne esce dunque? Beh la &lt;strong&gt;Command Query Responsibility Segregation&lt;/strong&gt; propone un diverso approccio all'architettura di un sistema al fine di risolvere questi problemi. Il concetto fondamentale &amp;egrave; quello della &lt;strong&gt;separazione delle operazioni di lettura da quelle di scrittura&lt;/strong&gt;. Questa separazione ci permette di separare anche i rispettivi modelli: se in lettura nella UI ho bisogno di denormalizzare i miei dati, cio&amp;egrave; di unire due informazioni che nel database sono normalizzate, ma che in visualizzazione mostro insieme, per quale ragione devo forzare il sistema ogni volta che ho bisogno di questi dati in lettura ad eseguire LOCK e JOIN? La soluzione, quindi, &amp;egrave; di separare le letture dalle scritture sia dal punto di vista del modello, che della persistenza. Ecco, quindi, che il modello concettuale, che nell'architettura classica &amp;egrave; mappato il pi&amp;ugrave; possibile sul database (o, se preferite, il contrario con un approccio Code First), si scinde in due distinti modelli: il command model ed il query model. Il primo &amp;egrave; utilizzato per invocare da parte della UI operazioni sui dati, mentre il secondo ha il solo scopo di modellare i dati nel modo pi&amp;ugrave; vicino possibile ai DTO richiesti dalla UI.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;Non mi dilungher&amp;ograve; eccessivamente nelle modalit&amp;agrave; operative con le quali &amp;egrave; possibile implementare questo approccio, ma vi faccio un esempio di come adottarlo sulla piattaforma Azure: potremmo utilizzare SQL Azure come database sul quale lanciare i comandi di scrittura definiti nei vari command model inviati dal client, mentre l'Azure Table Storage &amp;egrave; un eccellente candidato per persistere le informazioni opportunamente denormalizzate. In base all'analisi del software, potrebbe essere necessario replicare un dato presente una volta su SQL Azure, pi&amp;ugrave; volte nell'Azure Table Storage. Per esempio, si potrebbe voler avere uno stesso dato replicato N volte, una per ogni forma denormalizzata (o, se vogliamo, vista) richiesta dal client per accedere in lettura a quel dato. A tal proposito vi invito a non preoccuparvi eccessivamente dei costi di storage: il costo di 5 GB su SQL Azure corrisponde a 175 GB sul Table Storage.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;Come qualcuno avr&amp;agrave; certamente intuito l'implementazione di quest'architettura richiede la risoluzione di un problema: mantenere opportunamente &lt;strong&gt;sincronizzati&lt;/strong&gt; i dati su SQL Azure e sull'Azure Table Storage, ma la criticit&amp;agrave; di questa problematica dipende fortemente dall'ambito applicativo. Anche se aggiornare entrambe le basi di dati (indipendentemente dalla tecnica utilizzata) &amp;egrave; sicuramente pi&amp;ugrave; oneroso rispetto ad aggiornarne solo una, se per ogni scrittura di un dato, vengono effettuate pi&amp;ugrave; letture, ecco che il costo pagato in fase di aggiornamento sar&amp;agrave; ampiamente controbilanciato dalla scalabilit&amp;agrave; in lettura offerta dall'Azure Table Storage.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;In sostanza, maggiore &amp;egrave; il rapporto tra le letture e le scritture, maggiore sar&amp;agrave; il vantaggio in scalabilit&amp;agrave; potenzialmente perseguibile. Questo &amp;egrave; sicuramente il caso dei portali web e dei social network: il numero di letture &amp;egrave; certamente superiore, e non di poco, a quello delle scritture.&amp;nbsp;Va, inoltre, considerato che non sempre &amp;egrave; necessario un aggiornamento del dato in tempo reale. Pertanto, se &amp;egrave; tollerabile un piccolo lasso di tempo nel quale le informazioni tra le due basi di dati non sono sincronizzate, la fase di sincronizzazione potrebbe anche essere eseguita asincronamente rispetto all'aggiornamento, rendendo quest'ultimo pi&amp;ugrave; rapido e non bloccante.&lt;/p&gt;</description><pubDate>Sun, 26 Feb 2012 16:17:27 GMT</pubDate><guid isPermaLink="true">http://www.vifani.com:80/command-query-responsibility-segregation</guid></item><item><title>SQL Azure vs Azure Table Storage</title><link>http://www.vifani.com:80/sql-azure-vs-azure-table-storage</link><description>&lt;p style="text-align: justify;"&gt;Una delle diatribe pi&amp;ugrave; interessanti alle quali si assiste nel momento in cui ci si approccia alle tecnologie per il cloud messe a disposizione da Microsoft &amp;egrave; quella che mette in contrapposizione &lt;strong&gt;SQL Azure&lt;/strong&gt; e l'&lt;strong&gt;Azure Table Storage&lt;/strong&gt;.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;SQL Azure &amp;egrave; il database relazionale marchiato Microsoft per il cloud ed essenzialmente &amp;egrave; una versione di SQL Server che gira nei datacenter in maniera analoga alle compute instance di Windows Azure.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img src="http://www.vifani.com/Media/Default/BlogPost/Blog/sql-azure-vs-azure-table-storage/sqlazure_rgb_2.png" alt="SQL Azure" align="middle" width="438" height="135"&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;Trattandosi di un database relazionale, le applicazioni che si basano su SQL Server non avranno, teoricamente, grandi difficolt&amp;agrave; nell'utilizzare SQL Azure come database. Esistono ad oggi alcune limitazioni in questa piattaforma rispetto ad un'installazione Standard o Enterprise di SQL Server, ma nel tempo molte di queste limitazioni sono state risolte. Per esempio in SQL Azure non &amp;egrave; disponibile la ricerca fulltext, gli Analysis Services, cos&amp;igrave; come le reference cross-database (cio&amp;egrave; la possibilit&amp;agrave; di coinvolgere in una query tabelle appartenenti a database distinti), tuttavia altre deficienze presenti nel passato sono state implementate ed un esempio &amp;egrave; rappresentato dai Reporting Services. Per maggior informazioni in merito alle funzionalit&amp;agrave; che ci piacerebbe vedere in SQL Azure vi consiglio di fare riferimento al &lt;a href="http://www.mygreatwindowsazureidea.com/forums/34685-sql-azure-feature-voting" title="SQL Azure Feature Voting" target="_blank"&gt;sito dedicato&lt;/a&gt;.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;L'Azure Table Storage, invece, fa parte, insieme ai Blob e Queue Storage, dei Windows Azure Storage Services, cio&amp;egrave; di servizi di immagazinamento dei dati messi a disposizione da Microsoft nell'ambito della piattaforma cloud Windows Azure. Il Table Storage pu&amp;ograve; essere considerato un database NoSQL. Cosa contraddistingue questo tipo di database? Beh contrariamente ai RDBMS che si basano sull'ormai robusto e collaudato modello relazionale e sul rispetto delle ACID (Atomicity, Consistency, Isolation, e Durability), i database NoSQL nascono per risolvere problematiche differenti e, in particolare, il loro focus &amp;egrave; spesso la scalabilit&amp;agrave; orizzontale.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;Supponiamo di avere un server con un'istanza di database e di renderci conto che &amp;egrave; arrivato al suo limite massimo di prestazioni a causa del carico di lavoro. &lt;strong&gt;Scalare verticalmente&lt;/strong&gt; significa aumentare la potenza di calcolo del server attraverso un aggiornamento di CPU, RAM e quant'altro contribuisca a migliorarne le prestazioni. Quest'ultimo &amp;egrave; il classico approccio che si adotta, ma non &amp;egrave; di certo il migliore per svariante ragioni:&lt;/p&gt;
&lt;ul style="text-align: justify;"&gt;
&lt;li&gt;Limiti: per quanto si possano aggiornare le componenti di un server, prima o poi si raggiunger&amp;agrave; il limite massimo della piattaforma hardware&lt;/li&gt;
&lt;li&gt;Costi: il prezzo dell'hardware non scala linearmente alla sua potenza, ma spesso le componenti migliori costano svarianti ordini di grandezza pi&amp;ugrave; delle controparti meno prestanti&lt;/li&gt;
&lt;li&gt;Scarso equilibrio: aggiornando l'hardware del proprio server si rischia di dimensionarlo sulla base di carichi di lavoro che possono rappresentare semplicemente dei picchi rispetto al carico standard. Chiaramente questa considerazione &amp;egrave; fortemente dipendente del dominio applicativo, ma in linea di principio &amp;egrave; pur sempre valida&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="text-align: justify;"&gt;&lt;strong&gt;Scalare orizzontalmente&lt;/strong&gt; significa poter affiancare all'istanza applicativa in difficolt&amp;agrave;, una seconda, magari su un server virtuale o fisico diverso, e vederne raddoppiare il carico di lavoro sostenibile.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;I database relazionali storicamente non hanno una enorme capacit&amp;agrave; di scalare orizzontalmente, soprattutto se i dati sottoposti maggiormente agli accessi sono concentrati in alcune specifiche tabelle relazionate tra loro. Il dover sottostare al rispetto delle ACID, comporta il lock dei dati alla loro modifica al fine di conservare la consistenza del dato. La problematica diventa ancor pi&amp;ugrave; stringente nel momento in cui si fanno uso di transazioni che coinvolgono parecchie righe e tabelle.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;SQL Azure mette a disposizione alcune funzionalit&amp;agrave; per migliorare la scalabilit&amp;agrave;:&lt;/p&gt;
&lt;ul style="text-align: justify;"&gt;
&lt;li&gt;Distribuire i dati su pi&amp;ugrave; database ne garantisce la scalabilit&amp;agrave; orizzonale perch&amp;eacute; database SQL Azure distinti possono essere distribuiti su server differenti. Chiaramente ci&amp;ograve; limita la possibilit&amp;agrave; di fare&lt;/li&gt;
&lt;li&gt;&lt;a href="http://social.technet.microsoft.com/wiki/contents/articles/how-to-shard-with-sql-azure.aspx" title="SQL Azure Sharding" target="_blank"&gt;Database Sharding&lt;/a&gt;: &amp;egrave; una tecnica che consente in sostanza di partizionare i propri dati in base ad una serie di criteri (ID, Range di ID, ecc...) al fine di distribuirli automaticamente su pi&amp;ugrave; database e, quindi, ottenere la scalabilit&amp;agrave; orizzonale nel caso in cui le query siano distribuite pi&amp;ugrave; o meno equamente su tutti i database&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="text-align: justify;"&gt;Con queste tecniche si pu&amp;ograve; ottenere la scalabilit&amp;agrave; anche su un database relazionale on the cloud come SQL Azure, ma &amp;egrave; possibile che ci&amp;ograve; non sia sufficiente. Supponiamo di avere a che fare con un ambito applicativo nel quale abbiamo tantissimi dati in tabelle per le quali non &amp;egrave; possibile effettuare lo sharding, cio&amp;egrave; distribuirle su pi&amp;ugrave; database in base ad una chiave o ad una range di chiavi o che comunque, anche se possibile, non trarrebbe alcun beneficio da questa soluzione perch&amp;eacute; magari a livello di SELECT si deve accedere quasi sempre ai dati in maniera globale.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;Un altra situazione nel quale la scalabilit&amp;agrave; orizzontale di SQL Azure pu&amp;ograve; comunque non essere sufficiente &amp;egrave; rappresentata dai costi:&amp;nbsp;&lt;strong&gt;5 GB su SQL Azure costano circa &amp;euro; 35&lt;/strong&gt;, mentre con la medesima cifra &amp;egrave; possibile ottenere &lt;strong&gt;325 GB su Table Storage con 4 milioni di transazioni&lt;/strong&gt; al mese.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img src="http://www.vifani.com/Media/Default/BlogPost/Blog/sql-azure-vs-azure-table-storage/Table-Storage.png" alt="Table Storage" align="middle" width="497" height="290"&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;Esistono svariati tipi di database NoSQL e il Table Storage di Windows Azure pu&amp;ograve; essere considerato di tipo "Key-Value". In pratica &amp;egrave; possibile definire tabelle in ognuna delle quali ogni riga &amp;egrave; univocamente identificata da una &lt;strong&gt;RowKey&lt;/strong&gt; ed una &lt;strong&gt;PartitionKey&lt;/strong&gt;, la cui coppia essenzialmente &amp;egrave; la chiave primaria. Ogni riga pu&amp;ograve; avere fino a 255 propriet&amp;agrave; o colonne e non pu&amp;ograve; contenere complessivamente pi&amp;ugrave; di 1 MB di dati.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;Nel processo di ingegnerizzazione di un software destinato ad usare il Table Storage &amp;egrave; fondamentale scegliere accuratamente la RowKey e la PartitionKey. Quest'ultima in particolare rappresenta il partizionamento dei dati: tutti i dati di una partizione si trovano sul medesimo server e, quindi, sarebbe opportuno sceglierla in maniera che le interrogazioni del software siano uniformemente distribuite su tutte le partition key per massimizzarne le performance.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;Un altro aspetto interessante &amp;egrave; la replicazione automatica dai dati in tre copie nel medesimo datacenter e in due datacenter del medesimo continente. Questa caratteristica garantisce sia una maggiore fault tolerance, sia maggiori performance di accesso in lettura ai dati stessi.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;Non &amp;egrave; obiettivo di questo post fornire un HOW-TO delle operazioni di interrogazione su Table Storage, ma vi posso anticipare che &amp;egrave; possibile sia farlo mediante banali richieste &lt;strong&gt;HTTP REST&lt;/strong&gt;, che attraverso le comodissime API &lt;a href="http://msdn.microsoft.com/en-us/library/dd179445.aspx" target="_blank"&gt;WCF Data Services&lt;/a&gt; che consentono di eseguire query anche mediante &lt;strong&gt;LINQ&lt;/strong&gt;.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;Chiaramente non sono tutte rose e fiori: il servizio di Table Storage, infatti, non &amp;egrave; un database relazionale e, pertanto, non vi consente di eseguire query mettendo in join pi&amp;ugrave; tabelle. Questa operazione &amp;egrave; possibile eseguirla solo client side, cio&amp;egrave; scaricando sul client i contenuti di entrambe le tabelle e mettendole in join con LINQ to Objects, ma chiaramente questa non &amp;egrave; una soluzione ottimale da nessun punto di vista. La realt&amp;agrave; &amp;egrave; che se si intende far lavorare questo tipo di servizio come se fosse un database relazionale, si otterranno risultati molto poco soddisfacenti.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;Le interrogazioni su Table Storage sono molto efficienti a patto che il filtro coinvolga prevalentemente la RowKey e la PartitionKey. Qualsiasi altro uso comporter&amp;agrave; quello che in ambito RDBMS chiameremmo un FULL SCAN e cio&amp;egrave; qualcosa da evitare assolutamente.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;Limitazioni esistono anche nell'uso delle &lt;strong&gt;transazioni&lt;/strong&gt;: queste sono supportate solo se coinvolgono non solo righe appartenenti da una sola tabella, ma devono far riferimento ad una stessa partizione di quella tabella.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;E' chiaro, quindi, che non &amp;egrave; possibile pensare di migrare un sistema da SQL Server al Table Storage senza dover riprogettare interamente lo strato di accesso ai dati. E' necessario progettare l'architettura del software con l'obiettivo di sfruttare tutti i punti di forza del Table Storage, chiaramente laddove l'ambito applicativo lo consenta e, soprattutto, ne tragga beneficio.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;I pi&amp;ugrave; scettici e i pi&amp;ugrave; grandi sostenitori del modello relazionale sicuramente avranno gi&amp;agrave; cestinato l'idea di utilizzare il servizio di Table Storage, ma vi posso assicurare che &amp;egrave; possibile sfruttare un database non relazionale con successo e grandi soddisfazioni e social network come Facebook e Twitter sono esempi evidenti dell'uso di database NoSQL in ambiti applicativi dove la scalabilit&amp;agrave; ha la priorit&amp;agrave; su tutto, scalabilit&amp;agrave; che non si sarebbe mai raggiunta affidandosi solo ai cari vecchi database relazionali.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;Il prossimo post vi parler&amp;ograve; di un'architettura ideata proprio con l'obiettivo di trarre il massimo beneficio da database come il Table Storage.&lt;/p&gt;</description><pubDate>Sun, 12 Feb 2012 15:40:39 GMT</pubDate><guid isPermaLink="true">http://www.vifani.com:80/sql-azure-vs-azure-table-storage</guid></item><item><title>Orario Treni per Windows Phone è qui</title><link>http://www.vifani.com:80/orario-treni-per-windows-phone-e-qui</link><description>&lt;p style="text-align: center;"&gt;&lt;img src="http://www.vifani.com/Media/Default/OrarioTreni/soluzioni_wp7.jpg" alt="" width="200" height="333"&gt;&amp;nbsp;&lt;img src="http://www.vifani.com/Media/Default/OrarioTreni/treno_wp7.jpg" alt="" width="200" height="333"&gt;&amp;nbsp;&lt;img src="http://www.vifani.com/Media/Default/OrarioTreni/scioperi_wp7.jpg" alt="" width="200" height="333"&gt;&lt;/p&gt;
&lt;p&gt;Infine &amp;egrave; arrivato, &lt;a href="http://windowsphone.com/s?appid=b4be1f14-07cd-4493-ae93-a0e02be47dc3" title="Orario Treni per Windows Phone" target="_blank"&gt;Orario Treni per Windows Phone&lt;/a&gt; fa la sua comparsa nel Marketplace di Microsoft. Tutte le funzionalit&amp;agrave; disponibili per la versione Apple iOS, sono ora a fruibili da coloro che hanno scelto il sistema operativo mobile di Redmond per il proprio smartphone.&lt;/p&gt;
&lt;p&gt;Dal punto di vista dello sviluppo, Orario Treni pu&amp;ograve; vantare le seguenti chicche:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;design pattern Model View ViewModel per la separazione della logica applicativa dalla definizione dell'interfaccia grafica&lt;/li&gt;
&lt;li&gt;uso di SQL Server CE 4, per lo storage dei dati sul telefono&lt;/li&gt;
&lt;li&gt;chiamate WCF a servizi SOAP per il download di tutti i dati consultabili sui treni&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Per coloro che non conoscessero l'applicazione, riassumo brevemente le funzionalit&amp;agrave; salienti:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Soluzioni di viaggio&amp;nbsp;&lt;/strong&gt;dirette e con cambi, indicando una stazione di partenza e di arrivo&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Treni in arrivo ed in partenza&lt;/strong&gt;&amp;nbsp;data una stazione, completo di segnalazione dell'eventuale ritardo&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dettaglio di un treno&lt;/strong&gt;&amp;nbsp;a partire dal suo numero o dalle funzionalit&amp;agrave; precedenti, che consente di monitorare il percorso del treno, completo di numero di binario e minuti di ritardo&amp;nbsp;per ogni sua fermata&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consultazione degli scioperi&lt;/strong&gt; in atto e previsti su tutto il territorio nazionale nel settore dei trasporti (treni, aerei, trasporto pubblico locale, ecc...)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Maggiori informazioni sono disponibili nella &lt;a href="http://www.vifani.com/mobileapp/63/orario-treni" title="Orario Treni" target="_blank"&gt;pagina dedicata del sito&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Orario Treni richiede necessariamente che il proprio Windows Phone sia stato aggiornato alla versione Mango. Buon diverimento e mi raccomando, se avete consigli e/o critiche costruttive, io sono qua :)&lt;/p&gt;
&lt;p&gt;</description><pubDate>Tue, 24 Jan 2012 08:41:56 GMT</pubDate><guid isPermaLink="true">http://www.vifani.com:80/orario-treni-per-windows-phone-e-qui</guid></item><item><title>DateTime.Kind e ADO.NET</title><link>http://www.vifani.com:80/datetime.kind-e-ado.net</link><description>&lt;p&gt;Nell'ambito della realizzazione di un sistema cloud based &amp;egrave; necessario prestare particolare attenzione alla gestione dei DateTime. Se, infatti, nel deployment di soluzioni on premise &amp;egrave; possibile controllare (non sempre, ma spesso si) le impostazioni relative al timezone del server e del client, quando un'applicazione gira dei datacenter di Microsoft, tale controllo non c'&amp;egrave;. Potete chiaramente ben intuire quale problema si ponga nel momento in cui il timezone del client sia diverso da quello del server: poich&amp;eacute; ADO.NET, quando recupera un DateTime dal database, di default gli imposta la &lt;a href="http://msdn.microsoft.com/en-us/library/system.datetime.kind.aspx" target="_blank" title="MSDN DateTime.Kind"&gt;propriet&amp;agrave; Kind&lt;/a&gt; su Unspecified che, in sostanza, viene trattato lato client come se si trattasse di un valore locale, supponendo che il valore sia stato generato lato server con la chiamata DateTime.Now, capite bene che il rischio di ritrovarsi sul client date locali del server &amp;egrave; molto elevato. Per risolvere questo problema esistono vari approcci, ma quello che preferisco &amp;egrave; il seguente:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lato server &amp;egrave; necessario bandire la chiamata DateTime.Now ed utilizzare piuttosto &lt;a href="http://msdn.microsoft.com/en-us/library/system.datetime.utcnow.aspx" title="MSDN: DateTime.UtcNow property" target="_blank"&gt;DateTime.UtcNow&lt;/a&gt;&lt;/li&gt;
&lt;li style="text-align: left;"&gt;Lato server, nel momento in cui si recuperano i dati, &amp;egrave; necessario assicurarsi che le date siano DateTime con la propriet&amp;agrave; Kind impostata su DateTimeKind.Utc. Se si utilizzano le care vecchie DataTable, vi renderete conto che queste vi restituiscono sempre DateTime con Kind impostato un Unspecified. Per risolvere questo problema &amp;egrave; necessario impostare la propriet&amp;agrave; &lt;a href="http://msdn.microsoft.com/en-us/library/system.data.datacolumn.datetimemode.aspx" target="_blank"&gt;DataColumn.DateTimeMode&lt;/a&gt; su DataSetDataTime.Utc&lt;/li&gt;
&lt;li style="text-align: left;"&gt;Lato client, prima di visualizzare o inserire i dati, sar&amp;agrave; necessario convertirli da e verso il formato Utc nel formato locale. Il tutto pu&amp;ograve; essere fatto mediante converter in WPF/Silverlight e con apposite formattazioni in ASP.NET&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;</description><pubDate>Tue, 10 Jan 2012 12:08:17 GMT</pubDate><guid isPermaLink="true">http://www.vifani.com:80/datetime.kind-e-ado.net</guid></item><item><title>Windows Azure Table Storage InsertOrUpdate</title><link>http://www.vifani.com:80/windows-azure-table-storage-insert-or-update</link><description>&lt;p style="text-align: justify;"&gt;E' ormai da diverse settimane che mi cimento nello sviluppo di un sistema destinato a girare nell'infrastruttura Cloud di Microsoft e, in particolare, le tecnologie che sto impiegando sono Windows Azure, SQL Azure, Windows Azure Table Storage, Windows Azure Blob Storage e AppFabric Cache. Una delle pi&amp;ugrave; grandi sfide quando si utilizza lo storage di Windows Azure &amp;egrave; l'abbattimento del numero di accessi ad esso. Come probabilmente saprete, accedere agli storage di Windows Azure ha un costo calcolato sia sulla base della quantit&amp;agrave; di spazio occupata, sia sul numero di transazioni, cio&amp;egrave; di operazioni di lettura/scrittura.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img alt="" src="http://upload.wikimedia.org/wikipedia/it/thumb/3/3a/Windows_azure.png/320px-Windows_azure.png" width="320" height="60"&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;Supponiamo di dover eseguire la classica Insert Or Update di un dato all'interno del Table Storage. Avendo sempre ben in mente che stiamo parlando di un database NoSQL nel quale, quindi, il concetto di transazione non esiste, per implementare questo tipo di operazione &amp;egrave; necessario scrivere qualcosa del genere:&lt;/p&gt;
&lt;pre class="brush: csharp;"&gt;CloudTableClient tableClient = GetTableClient();
TableServiceContext context = tableClient.GetDataServiceContext();
context.IgnoreResourceNotFoundException = true;
var item = context.CreateQuery&amp;lt;cacheentity&amp;gt;(tableName)
           .Where(p =&amp;gt; p.PartitionKey == partitionName &amp;amp;&amp;amp; p.RowKey == storageKey)
           .FirstOrDefault();
if (item != null) 
{ 
   context.DeleteObject(item); 
} 
context.AddObject(tableName, newItem); 
context.SaveChangesWithRetries(); 
&lt;/pre&gt;
&lt;p style="text-align: justify;"&gt;Il problema di questo approccio &amp;egrave; che il&amp;nbsp;numero di operazioni effettuate &amp;egrave;, nel caso peggiore, pari a tre (in realt&amp;agrave; si potrebbe fare la delete e la insert in batch, ma non &amp;egrave; importante), mentre nel caso migliore &amp;egrave; pari a due.&lt;/p&gt;
&lt;p&gt;Grazie all'Insert-Or-Update Entity introdotto da qualche mese &amp;egrave; possibile ridurre il numero di accessi nel modo seguente:&lt;/p&gt;
&lt;pre class="brush: csharp;"&gt;CloudTableClient tableClient = GetTableClient();
TableServiceContext context = tableClient.GetDataServiceContext();
context.AttachTo(tableName, newItem);
context.UpdateObject(tableName, newItem);
context.SaveChangesWithRetries(SaveChangesOptions.ReplaceOnUpdate); 
&lt;/pre&gt;
&lt;p style="text-align: justify;"&gt;Questo codice esegue la Insert o, eventualmente, l'update dell'elemento in tabella grazie all'uso dell'opzione ReplaceOnUpdate. Naturalmente non poteva essere tutto cos&amp;igrave; semplice: se provate quest'ultimo codice in locale vi renderete conto che non funziona. Il problema &amp;egrave; che la Insert-Or-Update Entity non &amp;egrave; disponibile per il local storage, compreso quindi il vostro storage emulato. Per risolvere questo problema potete affidavi alla propria booleana statica RoleEnvironment.IsEmulated ed implementare, quindi, nel caso in cui sia true la soluzione meno efficiente che per&amp;ograve; verr&amp;agrave; eseguita solo in ambiente di sviluppo, il che &amp;egrave; assolutamente accettabile.&lt;/p&gt;</description><pubDate>Wed, 14 Dec 2011 15:02:57 GMT</pubDate><guid isPermaLink="true">http://www.vifani.com:80/windows-azure-table-storage-insert-or-update</guid></item><item><title>WPC 2011: WinRT e Cloud</title><link>http://www.vifani.com:80/wpc-2011-winrt-e-cloud</link><description>&lt;p style="text-align: justify;"&gt;E' ormai il terzo anno di fila che frequento il WPC 2011: da quando il mio ex responsabile me lo fece conoscere nell'apparentemente vicino, ma incredibilmente lontano 2008, ho fatto di tutto per convincere, dapprima i miei datori di lavoro, ed oggi i miei soci, che partecipare a quest'evento &amp;egrave; importante.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;Non &amp;egrave; importante perch&amp;eacute; ci&amp;ograve; di cui si parla al WPC &amp;egrave; impossibile apprendere in altro modo, anzi mi &amp;egrave; capitato pi&amp;ugrave; di una volta di seguire sessioni i cui contenuti mi erano gi&amp;agrave; noti anche al 90%, ma &amp;egrave; importante perch&amp;eacute; si tratta di un full immersion formativo e di confronto con altri professionisti del settore che, sia per mancanza di tempo, che di opportunit&amp;agrave;, &amp;egrave; a dir poco impossibile replicare. Insomma, pensateci bene: quante volte vi &amp;egrave; capitato di ascoltare per tre giorni di fila sessioni tecniche dalla mattina alla sera? Se escludiamo i pochi di voi che hanno avuto la fortuna di fare qualche corso di formazione, probabilmente la risposta &amp;egrave; mai.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;Volendo fare un sunto degli argomenti trattati in questo WPC, posso dire che il 2012 &amp;egrave; sicuramente l'anno del &lt;strong&gt;cloud&lt;/strong&gt; e di &lt;strong&gt;Windows 8&lt;/strong&gt;, un anno ricco di novit&amp;agrave; quindi, sia per quanto concerne lo sviluppo lato server, che lato client.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;Lato server sono ormai parecchi mesi che gli addetti al settore avvertono che la direzione intrapresa &amp;egrave; quella del cloud e ne &amp;egrave; una prova anche la nascita di diversi provider di servizi di cloud computing, non necessariamente legate al mondo Microsoft. E' chiaro che per chi, come il sottoscritto, si &amp;egrave; specializzato nelle tecnologie Microsoft, &lt;strong&gt;Windows Azure&lt;/strong&gt; rappresenta la naturale piattaforma di riferimento ed &amp;egrave; curioso vedere come le cose stiano evolvendo rapidamente: un anno fa Windows Azure era quasi un'entit&amp;agrave; astratta, oggi c'&amp;egrave; un SDK maturo ed un'integrazione con Visual Studio 2010 davvero notevole.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;Oltre a Windows Azure, ho seguito alcune sessioni anche sullo sviluppo lato client e, in particolare, su HTML5 e WinRT. Pu&amp;ograve; sembrare curioso che io, che ho tenuto una sessione su HTML5 al&amp;nbsp;&lt;a href="http://www.vifani.com/68/dotnetside-workshop--future-development-" target="_blank"&gt;Workshop&amp;nbsp;Future Development&lt;/a&gt;, ne vada a seguire altre, ma nel campo dell'informatica, al di l&amp;agrave; degli appellativi attribuiti e/o guadagnati (junion, senior, technical lead, ecc....), non bisogna mai perdere l'umilt&amp;agrave; e la voglia di apprendere e confrontarsi. Ed &amp;egrave; proprio a tal proposito che vi racconto l'impressione che ho avuto seguendo le sessioni su WinRT e HTML5.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;Osservando le reazioni delle persone e discutendo con alcuni miei collegi ed amici, penso che si sia creata parecchia confusione in merito a questi due argomenti. Alcuni pensano che .NET sia destinato al macero e che HTML5 rappresenti il futuro dello sviluppo per Windows 8, beh non &amp;egrave; cos&amp;igrave; e vi invito a leggere con attenzione la seguente frase.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;&lt;em&gt;&lt;strong&gt;WinRT &amp;egrave; un'API nativa implementata in Windows 8 attraverso la quale &amp;egrave; possibile sviluppare applicazioni Metro Style utilizzando come linguaggio di programmazione C++, C#, VB.NET e javascript e come linguaggio per la definizione della UI HTML5 e XAML.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;Ho evidenziato la frase precedente perch&amp;eacute; mettere in risalto l'errore che commettono coloro che accostano WinRT a HTML5 come modello di programmazione primario. In particolare mi permetto di sottolineare&amp;nbsp;i seguenti aspetti&lt;/p&gt;
&lt;ul style="text-align: justify;"&gt;
&lt;li&gt;WinRT nasce per lo sviluppo di applicazioni Metro Style, quelle che, quindi, saranno accessibili dall'interfaccia Metro introdotta da Windows Phone e che sar&amp;agrave; adottata anche in Windows 8. Quest'ultimo, tuttavia, consente di utilizzare anche la classica interfaccia di Explorer il che significa che si possono continuare a sviluppare applicazioni "vecchia maniera" senza problemi&lt;/li&gt;
&lt;li&gt;Le applicazioni Metro Style sono simili alle App dei dispositivi mobile: sono installabili solo mediante il Market Place, funzionano in una sandbox e nascono con l'obiettivo di facilitare l'uso di Windows specie su dispositivi touch come i tablet&lt;/li&gt;
&lt;li&gt;Programmare usando HTML5 e Javascript con le API WinRT, cio&amp;egrave; per sviluppare applicazioni Metro Style, non consente nel modo pi&amp;ugrave; assoluto di poter riutilizzare lo stesso codice sia di markup, che javascript per fare un'applicazione web. Nel momento in cui si accede alle librerie WinRT (e lo si deve fare per forza perch&amp;eacute; altrimenti non si sta sviluppando un'applicazione Metro Style) l'applicazione risultante resta confinata al mondo WinRT&lt;/li&gt;
&lt;li&gt;Analogamente all'accoppiata HTML5/javascript, programmare usando C++/C#/VB.NET e XAML non significa avere la medesima applicazione disponibile, sia in versione Metro Style, che classica perch&amp;eacute; cambia il target di compilazione e cambiano i namespace di moltissime classi (ad esempio quelle della UI&amp;nbsp;rispetto a WPF), oltre al fatto che WinRT espone un subset del .NET Framework e non il framework completo&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="text-align: justify;"&gt;.NET &amp;egrave;, quindi, vivo e vegeto e nel 2012 uscir&amp;agrave; la versione 4.5 che, tra le altre cose, porter&amp;agrave; miglioramenti significativi proprio nello sviluppo di applicazioni WPF, oltre a tante altre novit&amp;agrave; che ne aumenteranno notevolmente la produttivit&amp;agrave; (ad esempio la nuova gestione dei task asincroni).&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;A mio parere con WinRT Microsoft ha semplicemente voluto mettere a disposizione del pi&amp;ugrave; ampio parco di programmatori possibile (C++, .NET e Javascript) uno strumento per lo sviluppo delle applicazioni Metro Style probabilmente con la speranza che in ambito desktop/notebook/tablet accada ci&amp;ograve; a cui assistiamo ormai da qualche anno in ambito mobile: un market place, specie quello di Apple, con migliaia di applicazioni disponibili e migliaia di acquisti effettuati grazie ai bassi costi che mediante queste anno.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;Insomma, come avrete intuito, il tutto non ha la finalit&amp;agrave; di ottenere la pace nel mondo, ma le aspettative probabilmente sono quelle lecite di sempre: abbattimento della pirateria ed incremento dei profitti. E per noi programmatori cosa cambia? Fondamentalmente abbiamo l'occasione di sviluppare questo nuovo tipo di applicazioni, affrontando le sfide che esse ci porranno senza rinunciare al nostro linguaggio di programmazione preferito. Cosa possiamo chiedere di pi&amp;ugrave;? :-)&lt;/p&gt;</description><pubDate>Tue, 29 Nov 2011 00:30:00 GMT</pubDate><guid isPermaLink="true">http://www.vifani.com:80/wpc-2011-winrt-e-cloud</guid></item><item><title>Vifani 3.0: si passa ad Orchard</title><link>http://www.vifani.com:80/vifani-3.0-si-passa-ad-orchard</link><description>&lt;p style="text-align: justify;"&gt;&lt;img alt="" align="left" src="http://www.vifani.com/Media/Default/BlogPost/Blog/vifani-3.0-si-passa-ad-orchard/OrchardLogo1.png" width="224" height="225"&gt;Prima o poi doveva accadere, era solo una questione di tempo. Chi mi conosce lo sa, ho un incontenibile passione per il mio lavoro, lo sviluppatore software, ma&amp;nbsp;poich&amp;eacute; in linea di principio&amp;nbsp;&amp;egrave; sempre bene allargare i propri orizzonti e non fossilizzarsi sempre sugli stessi aspetti, ho deciso di far evolvere il mio sito che, per la prima volta, invece di essere&amp;nbsp;realizzato in toto dal sottoscritto, &amp;egrave; basato su &lt;strong&gt;Orchard&lt;/strong&gt;.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;Per chi non lo conoscesse &lt;a href="http://orchardproject.net/" target="_blank"&gt;Orchard&lt;/a&gt; &amp;egrave; un CMS opensource basato su &lt;strong&gt;ASP.NET MVC 3&lt;/strong&gt; che sta riscutendo un discreto successo, sia perch&amp;eacute; &amp;egrave; uno dei pochissimi CMS opensource basato su tecnologie .NET all'avanguardia, sia perch&amp;eacute; rispetto ad altri CMS analoghi (vedi DotNetNuke), non risulta essere legato ad un pesante passato fatto di plugin e moduli pi&amp;ugrave; o meno pesanti e basati su ASP.NET Web Form, ma utilizza le pi&amp;ugrave; recenti ed efficienti tecnologie web Microsoft. A dirla tutta mi risulta che DotNetNuke recentemente con la versione 6 si sia anch'esso svecchiato, ma, come spesso faccio, al faticosamente evoluto&amp;nbsp;ho preferito&amp;nbsp;scegliere il&amp;nbsp;totalmente nuovo.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;Non posso chiaramente sottrarmi al classico confronto CMS vs "sito fatto a mano". Personalmente trovo che Orchard sia un CMS molto ordinato e preciso, ma &amp;egrave; bene subito chiarire che l'idea secondo la quale affidarsi ad un CMS consenta di concentrarsi esclusivamente sui contenuti &amp;egrave; una balla spaziale. Ho dedicato non poco tempo alla configurazione di Orchard, specie per quanto concerne l'aspetto grafico. Chiaramente esistono una serie di temi gi&amp;agrave; preconfezionati, ma se uno ha un'idea ben precisa e vuole realizzarla, allora deve inevitabilmente mettere mano alle sue doti di programmatore o, se vogliamo, web designer per realizzare layout, stili CSS e quant'altro serva per dare corpo ad un tema di Orchard in maniera non molto dissimile da quanto ho gi&amp;agrave; fatto con i miei siti web.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;In particolare la mia idea era quella di migrare ad Orchard conservando il tema precedente non perch&amp;eacute; mi faccia particolarmente impazzire, ma perch&amp;eacute; rappresentava per me una sfida. Nel complesso penso di esserci riuscito e di essere andato oltre: non solo ho fatto in modo di ottenere un tema il pi&amp;ugrave; possibile simile al prevedente sito, ma ho inoltre&amp;nbsp;utilizzato alcune funzionalit&amp;agrave; tipiche&amp;nbsp;del nuovo &lt;strong&gt;standard HTML5&lt;/strong&gt;: i tag semantici e il border radius. Il tutto dovrebbe&amp;nbsp;sia migliorare l'indicizzazione sui motori di ricerca&amp;nbsp;(sperando che Google e company utilizzino effettivamente i tag semantici per meglio comprendere la struttura dei contenuti di un sito web), che ridurre la quantit&amp;agrave; di codice HTML presente nella pagina e, in particolare, tutta la sfilza di div e micro div necessari per realizzare bordi arrotondati alla&amp;nbsp;vecchia maniera. Lo scotto da pagare &amp;egrave; di aver definitivamente buttato nel cesso la retrocompatibilit&amp;agrave; con i browser pi&amp;ugrave; datati: Internet Explorer 6 e 7 potrebbero avere qualche problema nella visualizzazione della barra di navigazione e di ricerca, mentre tutti i browser che non supportano semplicemente il border radius dello standard CSS 3, vedranno le varie sezioni squadrate.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;Esistono chiaramente soluzioni per non imporsi tali limitazioni, ma innovare spesso significa anche tagliare i ponti col passato e questa &amp;egrave; stata la mia scelta. Tra le nuove funzionalit&amp;agrave; del sito troverete il supporto all'&lt;strong&gt;open authentication&lt;/strong&gt; e questo vi consentir&amp;agrave; di accedere al mio sito ed utilizzare i vostri account di Facebook, Tweeter, ecc..., per autenticarvi e commentare il blog.&lt;/p&gt;</description><pubDate>Thu, 10 Nov 2011 08:48:52 GMT</pubDate><guid isPermaLink="true">http://www.vifani.com:80/vifani-3.0-si-passa-ad-orchard</guid></item><item><title>DotNetSide Workshop "Future Development"</title><link>http://www.vifani.com:80/68/dotnetside-workshop--future-development-</link><description>&lt;p&gt;
	&lt;img alt="" src="http://www.vifani.com/public/image/HTML5_Logo_256.png" style="float: left; width: 256px; height: 256px; "&gt;&lt;/p&gt;
&lt;p&gt;
	L&amp;#39;estate ormai &amp;egrave; alle spalle, bench&amp;eacute; il meteo fino a qualche giorno fa poteva far pensare il contrario (almeno qui in Puglia), ed ecco che anche la comminity di &lt;strong&gt;DotNetSide &lt;/strong&gt;si &amp;egrave; risvegliata proponendovi il nuovo workshop &amp;quot;&lt;strong&gt;Future Development&lt;/strong&gt;&amp;quot;.&lt;/p&gt;
&lt;p&gt;
	E&amp;#39; stata un&amp;#39;occasione molto interessante per toccare con mano alcune delle tecnologie che saranno alla base dello sviluppo software web e non, nei prossimi anni. In particolare il sottoscritto vi ha proposto una sessione su &lt;strong&gt;HTML5&lt;/strong&gt;, il nuovo standard in via di definizione, spinto molto da Microsoft non solo attraverso le nuove versioni di Internet Explorer, ma anche come piattaforma di sviluppo per le applicazioni Metro Style di Windows 8.&lt;/p&gt;
&lt;p&gt;
	Estremamente piacevoli ed interessanti sono state anche le sessioni tenute da Vito Arconzo, Giuseppe Dimauro e Stefano Fio. Il primo ha mostrato uno sviluppo diverso dal solito, basato sul &lt;strong&gt;SDK di Kinect&lt;/strong&gt;, mentre gli altri due ci hanno deliziato con le ultimissime tecnologie Microsoft in termini di sistemi operativi server, desktop e relativi strumenti di sviluppo.&lt;/p&gt;
&lt;p&gt;
	Al seguente link potete scaricare il file contenente sia le slide che la demo mostrata nel corso della mia sessione.&lt;/p&gt;
&lt;p&gt;
	&lt;a href="http://www.vifani.com/public/Downloads/HTML5.zip"&gt;Download Slide e Demo&lt;/a&gt;&lt;/p&gt;
</description><pubDate>Sat, 15 Oct 2011 10:24:23 GMT</pubDate><guid isPermaLink="true">http://www.vifani.com:80/68/dotnetside-workshop--future-development-</guid></item><item><title>Orario Treni 1.2 per iOS e beta per WP7 Mango</title><link>http://www.vifani.com:80/67/orario-treni-1-2-per-ios-e-beta-per-wp7-mango</link><description>&lt;p style="text-align: center"&gt;
	&lt;img alt="" src="http://www.vifani.com/public/image/Screenshot_15.jpg" style="width: 200px; height: 288px"&gt;&lt;img alt="" src="http://www.vifani.com/public/image/Screenshot_16.jpg" style="width: 200px; height: 288px; margin-left: 10px"&gt;&lt;/p&gt;
&lt;p&gt;
	Ieri &amp;egrave; stata pubblicata sull&amp;#39;Apple Store la nuova versione di &lt;a href="http://www.vifani.com/MobileApp/63/orario-treni" target="_blank"&gt;Orario Treni&lt;/a&gt; che introduce le seguenti novit&amp;agrave;:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		E&amp;#39; stata aggiunta nella maschera di ricerca delle soluzioni di viaggio la visualizzazione degli s&lt;strong&gt;cioperi &lt;/strong&gt;nazionali nel settore dei trasporti, utile per evitare spiacevoli sorprese. La nuova funzionalit&amp;agrave; &amp;egrave; accessibile attraverso il tasto&amp;nbsp;&amp;quot;i&amp;quot; presente in alto a destra&lt;/li&gt;
	&lt;li&gt;
		Luca ha lavorato molto per migliorare il &lt;strong&gt;supporto allo Screen Reader Voice Over di iOS&lt;/strong&gt;, grazie al quale Orario Treni &amp;egrave; diventato un&amp;#39;applicazione meglio accessibile da coloro che hanno difficolt&amp;agrave; e che per questo motivo si affidano a tale tecnologia per utilizzare un iPhone&lt;/li&gt;
	&lt;li&gt;
		In generale sono stati adottati una serie di trucchi per &lt;strong&gt;migliorare le performance &lt;/strong&gt;nella ricerca e nella visualizzazione dei risultati&lt;/li&gt;
	&lt;li&gt;
		Abbiamo risolto, inoltre, una serie di bug segnalati dagli attuali utilizzatori dell&amp;#39;app&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	Vi mostro, inoltre, un work in progress della versione per Windows Phone 7&lt;/p&gt;
&lt;p style="text-align: center"&gt;
	&lt;img alt="" src="http://www.vifani.com/public/image/orariotreniwp7.jpg" style="width: 200px; height: 333px"&gt;&lt;img alt="" src="http://www.vifani.com/public/image/orariotreniwp72.jpg" style="width: 200px; height: 333px; margin-left: 10px"&gt;&lt;/p&gt;
&lt;p&gt;
	Devo ammettere di trovare la programmazione su Windows Phone 7 molto pi&amp;ugrave; semplice e rapida rispetto a quanto accade con iOS, nonostante l&amp;#39;uso di Monotouch. In ogni caso immagino che queste sensazioni siano normali: grazie al mio lavoro, .NET e Silverlight li conosco in maniera molto approfondita, mentre Monotouch (e le API&amp;nbsp;delle quali fa il&amp;nbsp;binding)&amp;nbsp;&amp;egrave; stato tutto da scoprire.&lt;/p&gt;
&lt;p&gt;
	Se dovessi fare un paragone tra le API messe a disposizione da Microsoft e Apple, ritengo lampante la differenza: lavorare con iOS equivale a lavorare a pi&amp;ugrave; basso livello, dove concetti come il data binding sono molto lontani. Questo non significa che non ci sia spazio per l&amp;#39;applicazione di pattern e, anzi, l&amp;#39;infrastruttura di iOS &amp;egrave; stata per me un ottimo esempio di implementazione del &lt;strong&gt;pattern MVC&lt;/strong&gt; su una piattaforma non managed. Tuttavia &amp;egrave; evidente che con linguaggi come lo XAML ed il portentoso motore di binding messo in piedi con WPF e Silverlight, la piattaforma Microsoft risulta essere molto pi&amp;ugrave; evoluta, oltre a permettere l&amp;#39;applicazione di pattern come il &lt;strong&gt;MVVM &lt;/strong&gt;del quale sono diventato uno scrupoloso adepto.&lt;/p&gt;
</description><pubDate>Wed, 21 Sep 2011 10:16:35 GMT</pubDate><guid isPermaLink="true">http://www.vifani.com:80/67/orario-treni-1-2-per-ios-e-beta-per-wp7-mango</guid></item><item><title>Microsoft .NET Framework 4 Platform Update 1</title><link>http://www.vifani.com:80/66/microsoft--net-framework-4-platform-update-1</link><description>&lt;p&gt;
	Forse non tutti sanno che nel mese di Aprile di quest&amp;#39;anno Microsoft ha rilasciato un aggiornamento del .NET Framework 4 particolarmente importante e che a mio avviso avrebbe dovuto ricevere maggiore attenzione dalla community online di sviluppatori .NET, ma che per ragioni poco comprensibili &amp;egrave; passato quasi inosservato.&lt;/p&gt;
&lt;p&gt;
	Sto parlando del &lt;a href="http://blogs.msdn.com/b/endpoint/archive/2011/04/18/microsoft-net-framework-4-platform-update-1.aspx" target="_blank"&gt;&lt;strong&gt;Platform Update 1&lt;/strong&gt;&lt;/a&gt;, un aggiornamento che si compone di tre diversi pacchetti:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		Microsoft .NET Framework 4 Platform Update 1 (KB2478063)&lt;/li&gt;
	&lt;li&gt;
		Multi-Targeting Pack for Microsoft .NET Framework 4 Platform Update 1 (KB2495638)&lt;/li&gt;
	&lt;li&gt;
		Microsoft .NET Framework 4 Platform Update 1 &amp;ndash; Design-time Package for Visual Studio 2010 SP1 (KB2495593)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	Il Platform Update 1 porta una interessantissima novit&amp;agrave; in &lt;strong&gt;Windows Workflow Foundation 4&lt;/strong&gt;: &lt;strong&gt;le macchine a stati&lt;/strong&gt;. Chi di voi ha seguito questa API, sa bene che una delle sue deficienze, anzi probabilmente l&amp;#39;unica sua pecca, &amp;egrave; rappresentata dall&amp;#39;impossibit&amp;agrave; di realizzare workflow a stati in maniera esplicita.&lt;/p&gt;
&lt;p&gt;
	Il Platform Update 1 colma questa lacuna e l&amp;#39;importanza di questo aggiornamento &amp;egrave; tale da farlo quasi sembrare una sorta di Service Pack 1 del .NET Framework 4 in quanto per utilizzare le nuove funzionalit&amp;agrave; &amp;egrave; necessario installare il runtime (il primo dei tre pacchetti che vi ho citato), aggiungere il supporto al multi-targeting (secondo pacchetto) ed aggiungere un pacchetto dedicato al designer dei workflow di Visual Studio 2010 SP1.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;
	&amp;nbsp;&lt;img alt="" src="http://www.vifani.com/public/image/NET-Framework-4-Platform-Update-1.jpg" style="width: 550px; height: 302px;"&gt;&lt;/p&gt;
&lt;p&gt;
	Installati tutti e tre i pacchetti &amp;egrave; necessario cambiare il target del progetto .NET impostandolo esplicitamente a &amp;quot;.NET Framework 4 Platform Update 1 (KB2478063)&amp;quot;. Senza effettuare questa operazione non &amp;egrave; possibile&amp;nbsp;utilizzare i nuovi workflow a stati.&lt;/p&gt;
&lt;p&gt;
	Ho gi&amp;agrave; testato questi nuovi workflow e non ho riscontrato particolari problemi, anzi consentono di modellare in maniera abbastanza esauriente un flusso a stati. Consiglio a chi fosse interessato ad approfondirli, di dare un&amp;#39;occhiata ad un &lt;a href="http://blogs.msdn.com/b/endpoint/archive/2011/04/20/wf4-state-machine-user-experience.aspx" target="_blank"&gt;articolo pubblicato nei blog MSDN&lt;/a&gt; che effettua una panoramica sulle novit&amp;agrave; introdotte.&lt;/p&gt;
&lt;p&gt;
	L&amp;#39;unico elemento negativo che mi sento di sottoporre alla vostra attenzione &amp;egrave; la modalit&amp;agrave; con cui Microsoft ha rilasciato tale aggiornamento. Chi credeva che con il .NET Framework 4 fossero finite le incongruenze nelle modalit&amp;agrave; con il quale il framework &amp;egrave; stato versionato in passato (3.0, 3.5, 3.5 SP1, ecc...), dovr&amp;agrave; ricredersi visto che, invece di chiamare questo aggiornamento 4.1 (come saggiamente fatto dal team dell&amp;#39;Entity Framework), hanno deciso di adottare il termine Platform Update 1 che vi ritrovare addirittura nel menu a tendina del target completo di numero della knowledge base. Una scelta che certamente non va nella direzione della massima&amp;nbsp;chiarezza.&lt;/p&gt;
</description><pubDate>Fri, 15 Jul 2011 23:46:22 GMT</pubDate><guid isPermaLink="true">http://www.vifani.com:80/66/microsoft--net-framework-4-platform-update-1</guid></item><item><title>Orario Treni si aggiorna alla versione 1.1.1</title><link>http://www.vifani.com:80/65/orario-treni-si-aggiorna-alla-versione-1-1-1</link><description>&lt;p style="text-align: center"&gt;
	&lt;img alt="" src="http://www.vifani.com/public/image/stazioni.png" style="width: 176px; height: 400px"&gt;&lt;/p&gt;
&lt;p&gt;
	Quest&amp;#39;oggi vi segnalo che &lt;a href="http://www.vifani.com/MobileApp/63/orario-treni" target="_blank"&gt;Orario Treni&lt;/a&gt; &amp;egrave; stata aggiornata alla versione 1.1.1 che introduce molteplici novit&amp;agrave;:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;
		&lt;strong&gt;Ferrovie locali&lt;/strong&gt;: &amp;egrave; stato aggiunto il supporto alle ferrovie locali Trenord (ex Lenord), integrate in Trenitalia, e alle Ferrovie Sud Est, supporto che fa di Orario Treni l&amp;#39;unica applicazione nel suo genere a proporre soluzioni di viaggio che vanno oltre le classiche tratte di Trenitalia&lt;/li&gt;
	&lt;li&gt;
		Orario Treni &amp;egrave; gi&amp;agrave; pronto per le &lt;strong&gt;CPU dual core &lt;/strong&gt;alla base dei prossimi iPhone: una serie di operazioni, tra cui la ricerca contemporanea su pi&amp;ugrave; linee ferroviarie, &amp;egrave; stata parallelizzata in modo da sfruttare al meglio la prossima generazione di processori&lt;/li&gt;
	&lt;li&gt;
		&lt;strong&gt;Accessibilit&amp;agrave;&lt;/strong&gt;: &amp;egrave; stato migliorato notevolmente il supporto alla tecnologia Screen Reader Voice Over di iOS per consentire la massima fruibilit&amp;agrave; anche a persone con difficolt&amp;agrave; nell&amp;#39;uso dei dispositivi touchscreen&lt;/li&gt;
	&lt;li&gt;
		&lt;strong&gt;Performance&lt;/strong&gt;: oltre alle migliori performance dovute alla parallelizzazione di alcune operazioni, anche sulle attuali generazioni di iPhone &amp;egrave; stata ottimizzata la visualizzazione dei risultati delle ricerche&lt;/li&gt;
	&lt;li&gt;
		&lt;strong&gt;Bug&lt;/strong&gt;: una serie di bug che ci sono stati segnalati sono stati risolti&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
	Ma le novit&amp;agrave; non finiscono qui. Ben presto presenter&amp;ograve; un nuovo progetto sempre per iPhone/iPad e nel frattempo ho intenzione di preparare un&amp;nbsp;post sull&amp;#39;Entity Framework. Stay tuned!&lt;/p&gt;
</description><pubDate>Sat, 11 Jun 2011 03:34:34 GMT</pubDate><guid isPermaLink="true">http://www.vifani.com:80/65/orario-treni-si-aggiorna-alla-versione-1-1-1</guid></item></channel></rss>
