<?xml version="1.0" encoding="utf-8"?><rss version="2.0"><channel><title>Sviluppo software .NET, WEB e Mobile</title><link>http://www.fulviogabana.it:80/</link><description>Sviluppo software .NET, WEB e Mobile</description><item><title>Novità dal mondo .NET</title><link>http://www.fulviogabana.it:80/blog/2017/09/novita-dal-mondo-.net</link><description>&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/dotNET/dotNetCore.png" alt="_Logo"&gt; Nelle ultime settimane le novità in &lt;a href="https://blogs.msdn.microsoft.com/dotnet/2017/08/15/the-week-in-net-net-core-2-0-asp-net-core-2-0-entity-framework-2-0-visual-studio-2017-update-3-enterprise-entity-framework-core-in-boston-and-links/"&gt;casa .NET&lt;/a&gt; sono state tante, a cominciare dall'importante rilascio delle specifiche &lt;strong&gt;.NET Standard 2.0&lt;/strong&gt; seguite da &lt;strong&gt;.NET Core 2.0&lt;/strong&gt;, &lt;strong&gt;ASP.NET Core 2.0&lt;/strong&gt;, &lt;strong&gt;EF 2.0&lt;/strong&gt; e quindi da &lt;strong&gt;Visual Studio 2017 Version 15.3&lt;/strong&gt; (nonché dell'altrettanto importante ReSharper 2017.2) e C# 7.1. &lt;/p&gt;

&lt;p&gt;Le novità sono importanti perché segnano un punto di consolidamento del nuovo .NET che ora espande notevolmente il supporto alle API della versione &lt;em&gt;classica&lt;/em&gt; nonché il supporto a piattaforme non Windows.
Nel &lt;a href="https://blogs.msdn.microsoft.com/webdev/2017/08/14/announcing-asp-net-core-2-0/"&gt;video di presentazione&lt;/a&gt; Scott Hunter descrive con alcuni collaborati tutte queste novità, disponibili in dettaglio sui vari blog istituzionali di Microsoft:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blogs.msdn.microsoft.com/dotnet/2017/08/14/announcing-net-standard-2-0/"&gt;Announcing .NET Standard 2.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blogs.msdn.microsoft.com/dotnet/2017/08/14/announcing-net-core-2-0/"&gt;Announcing .NET Core 2.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blogs.msdn.microsoft.com/webdev/2017/08/14/announcing-asp-net-core-2-0/"&gt;Announcing ASP.NET Core 2.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blogs.msdn.microsoft.com/dotnet/2017/08/14/announcing-entity-framework-core-2-0/"&gt;Announcing Entity Framework Core 2.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.visualstudio.com/en-us/news/releasenotes/vs2017-relnotes"&gt;Visual Studio 2017 version 15.3 Release Notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.visualstudio.com/en-us/news/releasenotes/vs2017-mac-relnotes"&gt;Visual Studio 2017 for Mac&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E' naturalmente necessario scaricare lo &lt;a href="https://www.microsoft.com/net/core"&gt;SDK&lt;/a&gt; per il Core 2.0, anche se si aggiorna all'ultima versione di Visual Studio 2017:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/dotNET/dotNetCore2.png" alt=".Net Core 2"&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Hunter&lt;/em&gt; si ritiene soddisfatto per i risultati della standardizzazione del .NET e per la svolta open source: il numero di &lt;strong&gt;pull request&lt;/strong&gt; è aumentato di anno in anno e la .NET Foundation è &lt;a href="https://dotnetfoundation.org/blog/google-join-tsg"&gt;supportata&lt;/a&gt; tra gli altri da Samsung, Unity, RedHat, Google e Qualcomm. Interessante il lavoro di &lt;a href="https://news.samsung.com/global/samsung-joins-the-microsoft-net-community-enabling-c-developers-to-build-applications-for-samsung-tizen-devices"&gt;Samsung&lt;/a&gt; per il proprio sistema Tizen, il sistema linux-based utilizzato da tutta la gamma smart dei propri prodotti.&lt;/p&gt;

&lt;p&gt;Il &lt;a href="https://blogs.msdn.microsoft.com/dotnet/2016/09/26/introducing-net-standard/"&gt;.NET Standard&lt;/a&gt; è un insieme standardizzata di API da implementare in grado di omogeneizzare le implementazioni .NET per qualsiasi piattaforma evitando future frammentazioni.&lt;/p&gt;

&lt;p&gt;Una chiara descrizione di che cosa sia .NET Standard è disponibile nel post di &lt;a href="https://www.danielcrabtree.com/blog/303/understanding-net-standard-an-interface-not-an-implementation"&gt;Daniel Crabtree&lt;/a&gt;: con un'analogia si potrebbe sire che è l'interfaccia implementata sia da .NET Core sia da .NET Framework. L'obiettivo è unificare le diverse piattaforme .NET e superare la precedente soluzione delle Portable Class Libraries (che rappresentava un'intersezioen delle API e richiedeva la ricoipilazione per ogni piattaforma). Con la versione 2.0 abbiamo, come accennato, il Compatibility Mode: la possibilitò di richiamare da un progetti .NET Starndard librerie NET Framework, a patto che utilizzimno solo API convogliarte nello stanrdard .NET. &lt;/p&gt;

&lt;p&gt;Come si può notare in Visual Studio è possibie creare librerie .NeT Starndard ma non applicazioni: in questo caso bisogno utilizzare una piattaforma specifica, come .NET Core o .NET Framework. Quindi per l'applicazione si utilizzerà l'ultima ver5sione disponibile mentre per le librerie si potrebber  unsare la versione più vecchia (a patto che esponga tutte le API di cui si ha bisogno).&lt;/p&gt;

&lt;p&gt;Librarie .NET Framework non dovrebbero essere più create a maneno che non richiedano AAPI non sandard, come WPF.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/dotNET/NetStandardApi.png" alt=".Net Standard API"&gt;&lt;/p&gt;

&lt;p&gt;Ecco alcuni appunti relativi alle novità della versione 2 del &lt;strong&gt;.NET Core&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;È la versione del .NET più veloce di sempre (a questo proposito Hunter cita l’esempio di Raygun che passando al .NET Core da Node.js ha potuto gestire 20000 richieste per secondo rispetto alle 1000 gestite in precedenza).&lt;/li&gt;
&lt;li&gt;Quasi il doppio delle API rispetto alla versione classica, tra cui il supporto a XML, Serialization, Networking, IO e Threading. &lt;/li&gt;
&lt;li&gt;Compatibilità con i pacchetti creati con versioni precedenti del .NET se le API utilizzate rientrano nel nuovo .NET Standard 2.0 (si tratta di circa il 70% dei pacchetti NuGet). L’introduzione del cosidetto &lt;em&gt;Compatibility Shim&lt;/em&gt; permette quindi di utilizzare le liberarie .NET Framework, in aggiunta naturalmente alle librerie .NET Standard e PCL.&lt;/li&gt;
&lt;li&gt;Packaging semplificato (per ASP.NET Core è possibile sostituire i pacchetti Microsoft.AspNetCore.* con Microsoft.AspNetCore.All: in fase di pubblicazione saranno inclusi solo i pacchetti effettivamente utilizzati).&lt;/li&gt;
&lt;li&gt;Supporto a più distribuzioni Linux e in particolare partnership con RedHat per la distribuzione [RedHat Enterprise][redhatloves.net]. .NET Core 2.0 treats Linux as a single operating system. There is now a single Linux build (per chip architecture) that works on all Linux distros&lt;/li&gt;
&lt;li&gt;Several important improvements were made to .NET Core support for Docker during the 2.0 project.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ma quali sono i &lt;a href="https://github.com/dotnet/core/blob/master/roadmap.md#net-core-20---supported-os-versions"&gt;sistemi&lt;/a&gt; su cui la nuova versione .NET può girare? Windows Client, Windows Server, Windows IoT, Red Hat Enterprise Linux (Centos and Oracle Linux), Fedora, Debian, Ubuntu, openSUSE, Tizen e Mac OS X. &lt;/p&gt;

&lt;p&gt;L’aggiornamenti di &lt;strong&gt;Visual Studio 2017 Version 15.3&lt;/strong&gt; è dedicato in parte ad aumentare il supporto al .NET Core ed ora è possibile create qualsiasi tipo di progetto Core (naturalmente rimane il supporto ai tool a linea di comando). L’aggiornamento include comunque delle novità anche sulle funzionalità di Visual Studio, con maggiori strumenti dedicati al refactoring (la cui mancanza era sopperita da estensioni esterne come ReSharper).&lt;/p&gt;

&lt;p&gt;Recentemente sono inoltre usciti due service pack per Visual Studio (siamo alla versione 15.3.3) e soprattutto l’aggiornamento di &lt;a href="https://www.jetbrains.com/resharper/whatsnew/#v2017-2"&gt;ReSharper&lt;/a&gt; che finalmente supporta il nuovo .Net Core e le nuove funzionalità del C#.&lt;/p&gt;

&lt;p&gt;Non poteva mancare una versione aggiornata nel &lt;strong&gt;.NET Framework&lt;/strong&gt; classico, che è ora disponibile in versione &lt;a href="https://github.com/Microsoft/dotnet/blob/master/releases/net471/README.md"&gt;4.7.1&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supporto al.NET Standard 2.0.&lt;/li&gt;
&lt;li&gt;Miglioramenti al Visual Tree per le applicazioni WPF.&lt;/li&gt;
&lt;li&gt;Vari miglioramenti alle performance e all’affidabilità.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Per quanto riguarda &lt;strong&gt;ASP.NET Core&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Più veloce: ad esempio le pagine cshtml (e le nuove Razor Page) vengono precompilate per default alla pubblicazione.&lt;/li&gt;
&lt;li&gt;Razor Pages: costruite su MVC ma più pratiche perché concentrano in un’unica struttura le tre componenti del Model View Controller. &lt;/li&gt;
&lt;li&gt;Supporto al C# 7.1 di Razor.&lt;/li&gt;
&lt;li&gt;Vi sono più Template (dedicati a Angular e React per creare selle SPA con il .NET Core come back end e alle nuove Razor Pages).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Abbiamo poi &lt;strong&gt;Entity Framework 2.0&lt;/strong&gt; che, essendo basato sul Core, può essere usato ovunque il .NET Standard sia supportato. Queste alcune delle novità:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Table splitting&lt;/li&gt;
&lt;li&gt;Global query filter&lt;/li&gt;
&lt;li&gt;Scalar database function mapping&lt;/li&gt;
&lt;li&gt;LINQ implementation  improvements (alcuni comandi che venivano eseguiti lato client sono ora tradotti in SQL)&lt;/li&gt;
&lt;li&gt;Performance imporovemtne (DbContext pooling e explicit compiled qeuires)&lt;/li&gt;
&lt;li&gt;Supporto a EF.Functions.Like(xxx, "a%")&lt;/li&gt;
&lt;li&gt;Global query filters: modelBuilder.Entity&lt;post&gt;().HasQueryFilter(p =&gt; !p.IsDeleted);&lt;/post&gt;&lt;/li&gt;
&lt;li&gt;String interpolation in raw SQL methods&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La &lt;a href="https://github.com/aspnet/EntityFrameworkCore/wiki/Roadmap"&gt;roadmap&lt;/a&gt; di EF è comunque lunga: ad esempio il GroupBy viene eseguito in memoria e non sul motore di database (l’alternativa è chiamare un FromSql con una query composta manualmente).&lt;/p&gt;

&lt;p&gt;PS. Non essendoci un logo ufficiale per il .NET Core ho utilizzato quanto creato da un fan e disponibile in &lt;a href="https://github.com/campusMVP/dotnetCoreLogoPack"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
</description><pubDate>Tue, 05 Sep 2017 20:46:00 GMT</pubDate><guid isPermaLink="true">http://www.fulviogabana.it:80/blog/2017/09/novita-dal-mondo-.net</guid></item><item><title>Windows: ripristinare il tipo di una cartella</title><link>http://www.fulviogabana.it:80/blog/2017/09/windows-ripristinare-il-tipo-di-una-cartella</link><description>&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/Microsoft/WinLogo.png" alt="_WinLogo"&gt; Un semplice appunto per configurare/ripristinare il tipo di una cartella, ad esempio dopo che Windows decide che un insieme di file è prevalentemente multimediale e quindi ne cambia il modello in Musica (esponendo le colonne traccia, artista e album). Basta modificarne le proprietà.&lt;/p&gt;

&lt;p&gt;Questo è il tipico aspetto di una cartella con file musicali (non a caso la cartella Musica), con le colonne traccia, album e artista in evidenza rispetto alle classiche Data, Tipo e Dimensione:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/Windows/MusicFolder.png" alt="Cartella Musica"&gt;&lt;/p&gt;

&lt;p&gt;Purtroppo anche una cartella qualsiasi può presentare le stesse colonne se Windows decide, in base al contenuto, che contiene file multimediali. &lt;/p&gt;

&lt;p&gt;Per ripristinare il layout è sufficiente aprire le &lt;strong&gt;Proprietà della cartella&lt;/strong&gt;, andare sulla &lt;strong&gt;scheda Personalizza&lt;/strong&gt; e quindi scegliere il tipo più appropriato: &lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/Windows/ChangeFolderTemplate.png" alt="Modifica modello"&gt;&lt;/p&gt;

&lt;p&gt;Spero sia utile.&lt;/p&gt;
</description><pubDate>Sun, 03 Sep 2017 21:47:00 GMT</pubDate><guid isPermaLink="true">http://www.fulviogabana.it:80/blog/2017/09/windows-ripristinare-il-tipo-di-una-cartella</guid></item><item><title>15 anni di .NET</title><link>http://www.fulviogabana.it:80/blog/2017/02/15-anni-di-.net</link><description>&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/Microsoft/DotNetLogo.png" alt="_Logo"&gt; La prima versione di &lt;strong&gt;.NET&lt;/strong&gt; è stata rilasciata 15 anni fa, proprio come parte di &lt;strong&gt;Visual Studio .NET&lt;/strong&gt;. Due strumenti che hanno rivoluzionato il mondo dello sviluppo, in particolare per chi come me proveniva da VB. Tanta la strada fatta: oggi .NET è un ecosistema che copre ogni ambito dello sviluppo software. Quindi, &lt;a href="https://blogs.msdn.microsoft.com/dotnet/2017/02/13/happy-15th-birthday-net/"&gt;Happy 15th Birthday .NET&lt;/a&gt;!.&lt;/p&gt;

&lt;p&gt;È indubbio che il &lt;a href="https://en.wikipedia.org/wiki/.NET_Framework"&gt;.NET&lt;/a&gt; abbia fatto passi da gigante assieme agli strumenti e ai linguaggi che da quel progetto sono nati, come il C# o a librerie come LINQ, EF, WPF, WCF, WF…. Fino al &lt;strong&gt;.NET Core&lt;/strong&gt; e l’obiettivo di essere cross-platform e open-source.&lt;/p&gt;

&lt;p&gt;Tantissima strada ne ha fatta la piattaforma Visual Studio, approdata nel cloud e diventato uno strumento a 360 gradi con Team Foundation System prima e ora Visual Studio Team Services.&lt;/p&gt;

&lt;p&gt;Non utilizzo più l’ecosistema Java da più di dieci anni e non so quanto il .NET debba a quel progetto e poco importa: l’importante è avere sempre più scelte e poter contare sul loro continuo evolversi. Proprio quest’anno dedicherò del tempo a &lt;strong&gt;F#&lt;/strong&gt;, visto che apprezzo molto le pratiche funzionali che in parte ho adottato in C#.&lt;/p&gt;

&lt;p&gt;Che dire: è passato tanto tempo e tanti sono stati gli scogli incontranti sulla via del .NET, ma alla fine posso sempre contare su ottimi strumenti. Strumenti che permettono di creare soluzioni di tutti i tipi e di scegliere la propria strada, seppur alle volte con qualche imprecazione. &lt;/p&gt;

&lt;p&gt;Ma alla fine tutto si riduce in una manciata di istruzioni e molta disciplina.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/Microsoft/Happy_Birthday_dotNet.jpg" alt="BirthdayCake"&gt;&lt;/p&gt;
</description><pubDate>Tue, 14 Feb 2017 23:26:00 GMT</pubDate><guid isPermaLink="true">http://www.fulviogabana.it:80/blog/2017/02/15-anni-di-.net</guid></item><item><title>“An Exception has been occurred…” in Visual Studio</title><link>http://www.fulviogabana.it:80/blog/2016/12/an-exception-has-been-occurred-in-visual-studio</link><description>&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/VisualStudio/VSLogo.jpg" alt="_Logo"&gt; Di seguito riporto un messaggio di errore che si può verificare in Visual studio semplicemente aprendo il menu contestuale su un progetto UWP. Il problema, all’apparenza inspiegabile, è dovuto ad un errore in una estensione SyncFusion che è sufficiente disabilitare.&lt;/p&gt;

&lt;p&gt;Questo il messaggio un po’ laconico che si ottiene nell’IDE premendo ad esempio il tasto destro &lt;strong&gt;su un progetto Universal Windows Platform&lt;/strong&gt; all’interno del &lt;strong&gt;Solution Explorer&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/VisualStudio/VSExceptionSF.png" alt="VS Exception"&gt;&lt;/p&gt;

&lt;p&gt;Il testo non è molto significativo, “An Exception has been occurred while getting the Visual Studio Framework version of the project”, e viene ripetuto diverse volte.&lt;/p&gt;

&lt;p&gt;Per scovare la causa, grazie a tristi esperienze del passato, ho incominciato a disabilitare le estensioni attivate di recente e tra le prime ho scovato questa estensione della &lt;strong&gt;SyncFusion&lt;/strong&gt;, apparentemente causa del problema:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/VisualStudio/SyncFusionExtension.png" alt="SyncFusion Extension"&gt;&lt;/p&gt;

&lt;p&gt;Ho aperto la segnalazione alla SyncFusion che ricordo distribuisce la sua completa suite di controlli gratuitamente tramite una classica licenza &lt;a href="https://www.syncfusion.com/products/communitylicense"&gt;Free Community License&lt;/a&gt;.&lt;/p&gt;
</description><pubDate>Sat, 10 Dec 2016 10:45:00 GMT</pubDate><guid isPermaLink="true">http://www.fulviogabana.it:80/blog/2016/12/an-exception-has-been-occurred-in-visual-studio</guid></item><item><title>Le basi dell’OOP e i vasi di Pandora</title><link>http://www.fulviogabana.it:80/Coding/le-basi-dell%E2%80%99oop-e-i-vasi-di-pandora</link><description>&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Coding/PandoraBox.png" alt="_Logo"&gt; Alle volte ci si ritrova a perdere molto tempo per implementare una funzionalità all’apparenza banale ma che se inserita in un codice privo di architettura può provocare diversi mal di pancia. È come aprire un vaso di Pandora: tutto e il contrario di tutto rendono ogni modifica instabile come quelle che l’hanno preceduta.&lt;/p&gt;

&lt;p&gt;Se la prima regola è quella di evitare un frettoloso refactoring e dedicarsi all’urgenza, la seconda è quella di non fare la fine del gatto che si morde la coda. &lt;strong&gt;Prevenire è sempre meglio che curare&lt;/strong&gt;. Ma come evitare queste spiacevoli e fin troppo frequenti situazioni?&lt;/p&gt;

&lt;p&gt;Due sono le regole che potrebbero aiutare e che si possono applicare durante la &lt;strong&gt;ristrutturazione del codice&lt;/strong&gt; (parlare di refactoring è alle volte troppo benevolo e ricorda pratiche di miglioramento del codice e non di sopravvivenza):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Evitare il più possibile l’uso di flag (i mitici interruttori che determinano una funzionalità piuttosto che un’altra, cari alla &lt;em&gt;flag oriented programming&lt;/em&gt; e spesso suggeriti dal richiedente con quell’innocua espressione del tipo: “a me basta solo un flag”).&lt;/li&gt;
&lt;li&gt;Evitare il più possibile i cicli e le condizioni: sono difficili da leggere, rendono il codice complesso e sono il luogo perfetto per la proliferazione di bug. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stiamo quindi parlando dei costrutti su cui si basano la maggior parte degli applicativi e gli unici che vengono affrontati a scuola. &lt;em&gt;If, switch, for, while&lt;/em&gt; traboccano anche dei testi più attuali di programmazione, ma in realtà dovrebbero essere usati con cautela perché la &lt;strong&gt;programmazione ad oggetti (OOP)&lt;/strong&gt; offre alternative molto più flessibili e semplici.&lt;/p&gt;

&lt;p&gt;Oltre ai &lt;a href="http://www.fulviogabana.it/coding/solid-i-principi-fondamentali-del-design-object-oriented"&gt;tanti principi&lt;/a&gt; e ai tanti &lt;a href="http://www.fulviogabana.it/coding/i-design-pattern"&gt;pattern&lt;/a&gt; di cui ho in parte discusso in altri articoli, possiamo semplicemente &lt;strong&gt;partite dalla base di tutto: l’oggetto&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Un oggetto è un’entità definita da un tipo e che è in grado di incapsulare dati ed esporre proprietà e metodi. Questi membri lavorano direttamente sui dati dell’oggetto e quindi, rispetto alla programmazione procedurale, i dati sono legati alle operazioni e entrambi hanno un significato particolare proprio perché appartengono ad uno specifico tipo. &lt;/p&gt;

&lt;p&gt;Il definire gli oggetti con i dati e le operazioni che devono viverci dentro è già un compito non banale, anche se il salto di qualità è pensare in modo più astratto e dinamico.&lt;/p&gt;

&lt;p&gt;Comunque, sarebbe già un successo suddividere &lt;em&gt;veramente&lt;/em&gt; in oggetti senza far diventare una classe una mera raccolta di procedure che col tempo diventano mastodontici vasi di Pandora. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ma il vero vantaggio dell’OOP risiede nella possibilità di cambiare a runtime non solo l’oggetto in uso ma anche le sue operazioni: queste non sono staticamente fissate nel tempo ma possono essere determinate a runtime in base alle necessità (grazie al polimorfismo oppure tramite delegati).&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;È soprattutto un lavoro di concetto, di design: non basta avere un insieme di classi, che col tempo ingrassano diventano meri pezzi di codice procedurale, ma bisogna individuare la giusta forma delle entità e dei processi, entrambi rappresentabili da singole parti combinate a runtime. &lt;/p&gt;

&lt;p&gt;Passando ad un esempio pratico e banale, diciamo di un applicativo in grado di avviarsi sia connesso ad un server sia in modalità stand-alone, trovare più volte i seguenti costrutti è sintomo di una lunga storia di smartellate:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;if(session == null) { … } else { … }
if(IsOffline) session.DoThis(); else DoThat();
var appIcon = (session == null) ? Resources.ClientIcon : Resources.OfflineIcon;
if(session != null &amp;amp;&amp;amp; session.IsLogged) { … }
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Molto meglio creare un’astrazione sulla sessione. Una ISession con due implementazioni: una per la modalità client/server e una per la modalità offline. Quindi ISession esporrà l’icona corretta mentre DoThis e DoThat saranno lo stesso metodo ma implementato in modo differente.  Un concetto abbastanza banale che se non affrontato per tempo può creare un pesante &lt;strong&gt;debito nel codice&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Il primo vantaggio dell’astrazione ISession è il non dover mai verificare se &lt;em&gt;session&lt;/em&gt; è nullo. &lt;strong&gt;Un riferimento nullo è il male&lt;/strong&gt;. Il secondo vantaggio è evitare continui blocchi condizionali. Il terzo è una semplificazione del codice e quindi della possibilità di completare un fix prima delle 18 di venerdì. Il quarto è che è semplice creare una nuova implementazione per affrontare nuovi requisiti senza toccare quanto già fatto.&lt;/p&gt;

&lt;p&gt;Quelle condizioni viste poco più sopra possono (e lo fanno regolarmente) sfuggire di mano e moltiplicarsi senza controllo. Ad esempio, nel caricamento dei dati: in un caso tramite chiamata remota nell’altro con accesso ad una cache locale. Moltiplicate il tutto per un applicativo di medie dimensione e otterrete una buona metà di &lt;em&gt;codice spazzatura&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Qualcuno potrebbe obiettare che nell’implementazione della ISession molti membri risulterebbero vuoti. Ma questo non significa che l’idea sia sbagliata: semplicemente la Session ha troppi compiti e deve essere suddivisa. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Si ritorna sempre al principio fondamentale di limitare la responsabilità di ogni oggetto e questo porta a dover utilizzare di volta in volta l’oggetto appropriato.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Con un codice mal strutturato va da sé che molta logica viene scaricata sul consumer e questo provoca delle duplicazioni irritanti. Il client non deve avere alcune responsabilità nell’uso del codice. Le responsabilità vanno nelle nostre classi. &lt;/p&gt;

&lt;p&gt;I consigli sono sempre gli stessi: concentrarsi sugli oggetti, evitare i blocchi condizionali, evitare i cicli, nascondere i dettagli, usare oggetti immutabili. Attuare pratiche di &lt;a href="http://www.fulviogabana.it/Coding/defensive-coding-in-c"&gt;defensive programming&lt;/a&gt;.&lt;/p&gt;
</description><pubDate>Sat, 05 Nov 2016 08:22:49 GMT</pubDate><guid isPermaLink="true">http://www.fulviogabana.it:80/Coding/le-basi-dell%E2%80%99oop-e-i-vasi-di-pandora</guid></item><item><title>Modelli personalizzati in Word 2016</title><link>http://www.fulviogabana.it:80/blog/2016/11/modelli-personalizzati-in-word-2016</link><description>&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/Microsoft/WordLogo.jpg" alt="_Logo"&gt; Word è uno strumento dalle mille funzionalità ma alle volte per usarle bisogna andarle proprio a scovare. Dopo un &lt;a href="http://www.fulviogabana.it/blog/2013/07/applicare-un-nuovo-modello-ad-un-documento-word-esistente"&gt;precedente post&lt;/a&gt; dedicato ai modelli ecco qui un’altra semplice &lt;em&gt;tip&lt;/em&gt;: abilitare i modelli personalizzati in fase di creazione nuovo documento.&lt;/p&gt;

&lt;p&gt;I modelli personalizzati si trovano in un’apposita cartella predefinita, più o meno con questo percorso (da modificare il nome dell’utente):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;C:\Users\fulvio\AppData\Roaming\Microsoft\Templates
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Qui si trovano ad esempio il modello &lt;em&gt;Normal.dotm&lt;/em&gt; e gli altri modelli base per gli applicativi Office.&lt;/p&gt;

&lt;p&gt;Anche copiando in questa posizione i propri modelli questi non verranno visualizzati nella pagina di &lt;em&gt;creazione documento&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;È necessario andare in &lt;strong&gt;Opzioni&lt;/strong&gt;, nella scheda &lt;strong&gt;Salvataggio&lt;/strong&gt; e indicare il &lt;strong&gt;percorso predefinito modelli personali&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/Microsoft/WordOptions_Template.png" alt="Opzioni Word"&gt;&lt;/p&gt;

&lt;p&gt;Consiglio di utilizzare un percorso diverso da quello di default, magari una cartella su OneDrive per mantenere i modelli sincronizzati e al sicuro nel cloud.&lt;/p&gt;

&lt;p&gt;Ecco apparire la scelta del tipo di modello nella pagina di creazione &lt;strong&gt;nuovo documento&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/Microsoft/WordNewFile_Template.png" alt="Nuovo Documento"&gt;&lt;/p&gt;

&lt;p&gt;Buona scrittura!&lt;/p&gt;
</description><pubDate>Fri, 04 Nov 2016 22:04:36 GMT</pubDate><guid isPermaLink="true">http://www.fulviogabana.it:80/blog/2016/11/modelli-personalizzati-in-word-2016</guid></item><item><title>VSO e le autorizzazioni sulle Aree</title><link>http://www.fulviogabana.it:80/blog/2015/11/vso-e-le-autorizzazioni-sulle-aree</link><description>&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/VisualStudio/VSLogo.jpg" alt="_Logo"&gt; &lt;strong&gt;Visual Studio Online&lt;/strong&gt; è uno strumento fantastico per organizzare il proprio lavoro e ad ogni aggiornamento offre piccole e grandi novità. Una di queste l’ho scoperta incontrando un problema banale: non riuscivo a gestire i miei item nel backlog.&lt;/p&gt;

&lt;p&gt;In pratica potevo creare e vedere gli item nelle query, ma alcuni item non apparivano nel backlog e una volta assegnati manualmente ad una feature o epic non potevo riordinarli:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/VisualStudio/VSOBacklogAnotherTeam.png" alt="Backlog"&gt;&lt;/p&gt;

&lt;p&gt;D’altronde il messaggio di VSO tramite tooltip è abbastanza chiaro: &lt;em&gt;“This item cannot be reordered because it is owned by another team”&lt;/em&gt;. Ma quale altro team se ne ho definito solo uno? &lt;/p&gt;

&lt;p&gt;Il problema riguarda l’autorizzazione sulle aree: non avevo abilitato il team corrente ad accedere alle sotto aree, semplicemente spuntandone il nome. Quindi gli item associati ad una certa area risultavano di competenza di qualcun altro (sebbene non definito).&lt;/p&gt;

&lt;p&gt;Un semplice problema che mi ha fatto scoprire come VSO evidenzi graficamente il fatto che un elemento sia gestito da qualche altro team, utile per progetti grandi o articolati.&lt;/p&gt;
</description><pubDate>Tue, 24 Nov 2015 22:18:35 GMT</pubDate><guid isPermaLink="true">http://www.fulviogabana.it:80/blog/2015/11/vso-e-le-autorizzazioni-sulle-aree</guid></item><item><title>Elogio al TDD</title><link>http://www.fulviogabana.it:80/Coding/elogio-al-tdd</link><description>&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Coding/TDD.png" alt="_Logo"&gt; Il &lt;strong&gt;TDD&lt;/strong&gt; è una pratica molto affascinate perché permette agli sviluppatori, propensi più a scrivere codice che a valutarne gli effetti, di fare quello che preferiscono: scrivere codice, appunto. Il TDD coinvolge tanti concetti in un unico e continuo processo di sviluppo... Un'esplosione di creatività, insomma.&lt;/p&gt;

&lt;p&gt;Avere sviluppatori che perdono tempo ad avviare un intero sistema per verificare anche la più piccola modifica ha un costo enorme e non sempre è possibile o sostenibile poter verificare un sistema utilizzando il lavoro dei tester. Inoltre, considerando un test manuale, è assai improbabile che possa coprire tutte le possibilità che un software mediamente complesso ha: di qui la necessità di creare test automatici, ripetibili e indipendenti, necessità che un bel po' di tempo fa ha portato all'idea delle &lt;strong&gt;Unit Test&lt;/strong&gt;: codice ripetibile e automatizzabile per verificare il proprio software.&lt;/p&gt;

&lt;p&gt;L'evoluzione di questa visione ha portato al &lt;strong&gt;Test Driven Development&lt;/strong&gt;, che più che una pratica di testing è una metodologia di sviluppo, una &lt;strong&gt;pratica di design&lt;/strong&gt;. Con design non si intende naturalmente la progettazione a 360° dell'applicazione e della sua architettura. Si intende il design di quella parte di codice necessario per soddisfare un insieme di requisiti, generalmente collegato ad una singola funzionalità ma non necessariamente: è possibile eseguire il design a partire da una visione di più alto livello e scendere via via nei dettagli delle singole classi.&lt;/p&gt;

&lt;p&gt;Uno degli aspetti più interessanti del TDD è la possibilità di intervenire su un sistema &lt;strong&gt;senza aver paura di rompere il suo attuale stato&lt;/strong&gt;. In pratica di avere a disposizione tutto un insieme di &lt;strong&gt;regression test&lt;/strong&gt; che permette di aggiungere una nuova funzionalità senza comprometterne altre… e se i test esistenti falliscono si apre la necessità di un re-disegn di una parte del sistema per accogliere le nuove richieste. Il fatto di scoprirlo durante l’implementazione e non in produzione è notevole....&lt;/p&gt;

&lt;p&gt;I regression test sono particolarmente utili durante il fixing degli errori: non è raro che il fix di un bug ne generi un altro. Situazione paradossale e tragica che il TDD allevia. Tra l’altro creando la UT per tracciare un bug e &lt;em&gt;disegnare&lt;/em&gt; la sua risoluzione, permette di evitare spiacevoli ritorni.&lt;/p&gt;

&lt;p&gt;Comunque, il TDD ha come scopo principale quello di guidare lo sviluppatore nella realizzazione del sistema, cercando di farlo &lt;strong&gt;concentrare su un singolo problema alla volta&lt;/strong&gt;: spesso la smania del creare si protrae oltre al necessario. &lt;/p&gt;

&lt;p&gt;Ciò che si ottiene, fin dalla prima release, è un software di &lt;strong&gt;alta qualità&lt;/strong&gt;. Difficile che non abbia alcun tipo di problema e la perfezione come si dice non è di questo mondo. Ma dover spendere un intero ciclo di sviluppo per correggere la prima release è una procedura che dovrebbe appartenere al passato. La seconda release, come predicano le metodologie agili, dovrebbe portare miglioramenti e nuove funzionalità, inserite nel sistema senza compromettere l'esistente. &lt;/p&gt;

&lt;p&gt;Siccome sono anni che sviluppo software conosco perfettamente la frustrazione di dover andare in produzione con codice abbozzato velocemente e conosco anche la frustrazione di dover correggere un errore già risolto in passato. Proprio per questo posso garantire che le più moderne metodologie di sviluppo possono fare la differenza e permettere agli sviluppatori di dedicarsi al miglioramento dell'applicazione, del processo di sviluppo e di se stessi. &lt;/p&gt;

&lt;p&gt;Dimentichiamo quindi la consuetudine di sopravvivere: alle nuove richieste, agli inspiegabili errori e alla disorganizzazione. Il consiglio è seguire quelle pratiche, come il TDD, che tracciano un solco entro cui muoversi al riparo da consuetudini maligne. &lt;/p&gt;

&lt;p&gt;Sempre dalla mia esperienza so che la documentazione relativa all'analisi, al progetto e all'implementazione sono una chimera e se dovessero mai esistere, nel senso di essere utili in qualche modo, allora è quasi certo che dopo un po' di tempo tale documentazione diventi obsoleta. Le vari forme di automatic testing permettono di creare una documentazione direttamente nei sorgenti: il semplice uso di &lt;strong&gt;nomi parlanti&lt;/strong&gt; per le Unit Testing piuttosto che forme più evolute come il &lt;strong&gt;BDD&lt;/strong&gt; e derivati, permettono di indicare chiaramente cosa ci si aspetti dal software. E siccome il cosa ci si aspetta può cambiare nel tempo, è probabile che la documentazione non cambi ma il codice sì e quindi, in presenza di Unit Test, anche le cosiddette &lt;strong&gt;specifiche integrate&lt;/strong&gt;: si parla di &lt;strong&gt;documentazione viva&lt;/strong&gt;, molto utile anche per metter mano a codice esistente scritto da altri o da passare ad altri. &lt;/p&gt;

&lt;p&gt;Mi è già successo di dover metter mano a del codice difficile da comprendere... magari codice scritto proprio dal sottoscritto qualche anno prima. Il TDD allieva questi tipi di problemi, assieme all’applicazione dei principi SOLID, all’uso dei design pattern e al clean code in generale. In realtà, una delle forze del TDD è che la sua adozione porta necessariamente ad utilizzare tali tecniche, altrimenti risulta totalmente impraticabile: il TDD porta al cosiddetto &lt;strong&gt;well-crafted code&lt;/strong&gt;, perché testare una classe che ha troppi compiti ed fortemente accoppiata con altre classi è improponibile.&lt;/p&gt;

&lt;p&gt;Dimentico sempre di fare una puntualizzazione: nessuno scrive codice perfetto e anche quando si conoscono e si applicano tante utili nozioni bisogna scontrarsi con tanti fattori che possono dar vita a codice migliorabile. Succede. Il &lt;strong&gt;refacotring&lt;/strong&gt; è proprio un processo che ben si sposa con il TDD, perché lo si può affrontare con sicurezza grazie ai regression test e applicando sempre la pratica &lt;em&gt;first test&lt;/em&gt;: scrivo il test, modifico, verifico, miglioro. &lt;/p&gt;

&lt;p&gt;Se poi si hanno la forza e la costanza di affiancare altre due tecniche importanti come le &lt;strong&gt;code review&lt;/strong&gt; e il &lt;strong&gt;pair programming&lt;/strong&gt; i risultati sono garantiti. &lt;/p&gt;
</description><pubDate>Wed, 30 Sep 2015 21:01:20 GMT</pubDate><guid isPermaLink="true">http://www.fulviogabana.it:80/Coding/elogio-al-tdd</guid></item><item><title>Refactoring Essentials: best practice in VS2015</title><link>http://www.fulviogabana.it:80/blog/2015/09/refactoring-essentials-best-practice-in-vs2015</link><description>&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/VisualStudio/RefEssentials/RefactoringEssentials.png" alt="_Logo"&gt; &lt;a href="http://vsrefactoringessentials.com/"&gt;Refactoring Essentials&lt;/a&gt; è un interessante &lt;strong&gt;Analyzer&lt;/strong&gt; e &lt;strong&gt;Code Fixer&lt;/strong&gt; per Visual Studio 2015 disponibile come estensione e, per il processo di build, come pacchetto NuGet. In arrivo la versione 2.0 con nuove regole e best practice.&lt;/p&gt;

&lt;p&gt;Il progetto è nato alla fine del 2014 ma è ufficialmente disponibile dalla metà del 2015. Sviluppato dalla stessa community di &lt;em&gt;SharpDevelop&lt;/em&gt;, &lt;em&gt;NRefactory&lt;/em&gt; e &lt;em&gt;ILSpy&lt;/em&gt;. E’ un ottimo strumento per analizzare e migliorare il proprio codice grazie ai suggerimenti e alle best practice include nell’analizzatore. Viene utilizzato ad esempio dal progetto &lt;a href="https://github.com/xunit/xunit"&gt;xUnit&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;E’ un progetto gratuito, open source e supporta sia il &lt;strong&gt;C#&lt;/strong&gt; e &lt;strong&gt;VB.NET&lt;/strong&gt;, anche se la maggior parte delle &lt;a href="http://vsrefactoringessentials.com/Features/All"&gt;funzionalità&lt;/a&gt; è dedica al primo linguaggio (circa 200 regole). Ecco alcuni esempi di regole, approfonditi sul &lt;a href="http://vsrefactoringessentials.com/"&gt;sito ufficiale&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/VisualStudio/RefEssentials/ArrayCreationCanBeReplacedWithArrayInitializerAnalyzer.png" alt="Immagine"&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/VisualStudio/RefEssentials/ConvertBitwiseFlagComparisonToHasFlagsCodeRefactoring.png" alt="Immagine"&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/VisualStudio/RefEssentials/ConvertConditionalTernaryToNullCoalescingAnalyzer.png" alt="Immagine"&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/VisualStudio/RefEssentials/NameOfSuggestionAnalyzer.png" alt="Immagine"&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/VisualStudio/RefEssentials/ReplaceDirectCastWithSafeCastCodeRefactoring.png" alt="Immagine"&gt;&lt;/p&gt;

&lt;p&gt;L’&lt;a href="https://visualstudiogallery.msdn.microsoft.com/68c1575b-e0bf-420d-a94b-1b0f4bcdcbcc"&gt;estensione per Visual Studio&lt;/a&gt; integra l’analizzatore e le funzionalità di refactoring direttamente nell’IDE, mentre il &lt;a href="https://www.nuget.org/packages/RefactoringEssentials/"&gt;pacchetto NuGet&lt;/a&gt; offre l’integrazione nel processo di build. Da notare che il cuore del progetto &lt;strong&gt;è comunque una PCL che può essere utilizzata su altre piattaforme&lt;/strong&gt; (come avviene in MonoDevelop).&lt;/p&gt;

&lt;p&gt;La &lt;a href="https://github.com/icsharpcode/RefactoringEssentials/wiki/Release-2.0"&gt;versione 2.0&lt;/a&gt; è alle porte con fix e miglioramenti vari, tra cui nuove regole per l’analizzatore C# e VB.NET.&lt;/p&gt;
</description><pubDate>Tue, 08 Sep 2015 21:40:00 GMT</pubDate><guid isPermaLink="true">http://www.fulviogabana.it:80/blog/2015/09/refactoring-essentials-best-practice-in-vs2015</guid></item><item><title>Podcast per sviluppatori</title><link>http://www.fulviogabana.it:80/blog/2015/07/podcast-per-sviluppatori</link><description>&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/Stuff/dotNETpodcast.png" alt="_Logo"&gt; Non sono mai stato un fan dei &lt;strong&gt;podcast&lt;/strong&gt; tecnici ma ultimamente li ascolto spesso per sfruttare &lt;em&gt;anche&lt;/em&gt; il tempo speso per i trasferimenti: sono utili compagni di viaggio per ottenere qualche spunto di riflessione e approfondimento. Tanti e famosi quelli in lingua inglese mentre in italiano possiamo vantare l'ottimo &lt;strong&gt;dotNET{podcast}&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Prima di vedere quelli più famosi a livello internazionale è doveroso citare &lt;a href="http://www.dotnetpodcast.com"&gt;dotNET{podcast}&lt;/a&gt;, l'utilissimo servizio gestito da &lt;em&gt;Roberto Albano&lt;/em&gt;,  &lt;em&gt;Antonio Giglio&lt;/em&gt; e &lt;em&gt;Massimo Bonanni&lt;/em&gt;. Sono arrivati da poco alla puntata numero 50 e gli &lt;a href="http://www.dotnetpodcast.com/feed/RSS"&gt;argomenti&lt;/a&gt; trattati non toccano solo il mondo Microsoft/Windows/.NET ma anche argomenti come Acrhitettura, Startup, Agile, Database, Docker...&lt;/p&gt;

&lt;p&gt;Lasciando l'Italia, ecco una lista dei &lt;strong&gt;Podcast più famosi&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uno dei più famosi è certamente &lt;a href="http://hanselminutes.com"&gt;Hansel Minutes&lt;/a&gt; il cui motto è &lt;em&gt;Fresh Air for Developers&lt;/em&gt;. Tante chiacchierate con ospiti di diverse competenze e gli argomenti spaziano da IoT ad Azure, passando dal mondo .NET. Interessantissima la puntata su Akka.NET.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://feeds.feedburner.com/HallwayConversationsPodcastEpisodes"&gt;Hallway Conversations&lt;/a&gt;: &lt;em&gt;A Podcast by Developers for Developers&lt;/em&gt; recita il motto. Sebbene gli aggiornamenti non siano frequenti, gli argomenti sono interessanti e ben trattati. Per ogni puntata il &lt;a href="http://hallwayconversations.com"&gt;sito&lt;/a&gt; riporta link e dettagli vari.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.fulviogabana.it/www.codingblocks.net/podcast-feed.xml"&gt;{CodingBlocks}.NET&lt;/a&gt;: argomenti di diverso genere dall'interviste di lavoro allo sviluppo web. Gli argomenti sono pratici ma non mancano panoramiche e discussioni generali. Ogni podcast è accompagnato da note e dettagli sul &lt;a href="http://www.codingblocks.net/"&gt;sito ufficiale&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://feeds.feedburner.com/se-radio"&gt;Software Engineering Radio&lt;/a&gt;: molto meno pratico e più teorico, con panoramiche su design e metodologie di sviluppo. Link di supporto direttamente sul &lt;a href="http://www.se-radio.net/"&gt;sito&lt;/a&gt;. Interessante la discussione con lo scopritore del &lt;a href="http://www.fulviogabana.it/Data/il-teorema-cap"&gt;teorema CAP&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.dotnetrocks.com/feed.aspx"&gt;.NET Rocks!&lt;/a&gt;: naturalmente dedicato al mondo .NET è aggiornato settimanalmente ed è uno dei più famosi. Informazioni e dettagli sul &lt;a href="http://www.dotnetrocks.com/"&gt;sito ufficiale&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdevshow.libsyn.com/rss"&gt;MS Dev Show&lt;/a&gt;: podcast dedicato agli sviluppatori Microsoft. Tratta molti argomenti con ospiti famosi: Azure, Windows, Windows Phone, .NET, Visual Studio e framework vari. Anche in questo caso i dettagli degli argomenti trattati sono disponibili sul &lt;a href="http://msdevshow.com/"&gt;sito&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://feeds.feedburner.com/herdingcode"&gt;HerdingCode&lt;/a&gt;: trasmissione che può vantare tra gli ospiti Scott Allen, Kevin Dente,  Scott Koon e Jon Galloway. Sul &lt;a href="http://herdingcode.com/"&gt;sito&lt;/a&gt; il dettaglio delle puntate con la scaletta al minuto degli argomenti trattati (molto comoda).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Una raccolta di questi e altri podcast è disponibile su &lt;a href="http://thesoundof.net/"&gt;The Sound Of .NET&lt;/a&gt;: è quindi possibile sottoscrivere il loro &lt;a href="http://feeds.feedburner.com/TheSoundOfDotNet"&gt;feed&lt;/a&gt; per ricevere in un colpo gli episodi da più fonti. Un altro aggregatore è &lt;a href="https://player.fm/featured/ms-dev"&gt;Player.fm&lt;/a&gt; per la categoria Microsoft. &lt;/p&gt;

&lt;p&gt;Naturalmente di sorgenti c'è sono parecchi e alcuni offrono agli sviluppatori tanti consigli e spunti senza essere troppo tecnici. Ad esempio, un’ottima risorsa per la categoria &lt;strong&gt;soft skills&lt;/strong&gt;, è il podcast &lt;a href="http://simpleprogrammer.com/podcasts/"&gt;Simple Programmer&lt;/a&gt; curato da &lt;em&gt;John Sonmex&lt;/em&gt;. Sempre Hanselman &lt;a href="http://feeds.feedburner.com/thisdeveloperslife"&gt;pubblica&lt;/a&gt; riflessioni generali sul suo &lt;a href="http://thisdeveloperslife.com/"&gt;This Developer’s Life&lt;/a&gt;.&lt;/p&gt;
</description><pubDate>Tue, 14 Jul 2015 23:38:00 GMT</pubDate><guid isPermaLink="true">http://www.fulviogabana.it:80/blog/2015/07/podcast-per-sviluppatori</guid></item><item><title>Abstract Factory Pattern</title><link>http://www.fulviogabana.it:80/coding/abstract-factory-pattern</link><description>&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Coding/CodingLogo.png" alt="_Logo"&gt; Un importante pattern introdotto dalla &lt;a href="https://en.wikipedia.org/wiki/Design_Patterns"&gt;Gang of Four&lt;/a&gt; per affrontare il problema della &lt;strong&gt;creazione degli oggetti&lt;/strong&gt; è l’&lt;strong&gt;Abstract Factory Pattern&lt;/strong&gt;. Il problema obbliga un client a conoscere a priori le classi che andrà a creare limitando l'estendibilità e creando un accoppiamento forte tra classi, soprattutto quando si parla di famiglie di oggetti.&lt;/p&gt;

&lt;p&gt;Un buon esempio è disponibile su &lt;a href="https://en.wikipedia.org/wiki/Abstract_factory_pattern"&gt;Wikipedia&lt;/a&gt; e considera un’applicazione portabile su più piattaforme, in cui verrà utilizzato un insieme di classi dedicate alla UI specifico per ogni sistema. Avrò quindi delle classi pulsante e link per Windows e altrettanti classi per OSX. &lt;/p&gt;

&lt;p&gt;Il client che andrà ad utilizzare tali controlli non dovrebbe gestire la creazione delle classi controllo, altrimenti si legherebbe a &lt;strong&gt;n&lt;/strong&gt; classi: l’insieme dei controlli moltiplicato per le piattaforme disponibili. Inoltre, all’aggiunta di nuove piattaforme sarebbe necessario modificare anche il client e tutti gli altri utilizzatori.&lt;/p&gt;

&lt;p&gt;L'&lt;strong&gt;Abstract Factory&lt;/strong&gt;, conosciuto anche col nome di &lt;strong&gt;Kit&lt;/strong&gt;, offre una soluzione semplice ed efficiente, naturalmente grazie alle astrazioni.  Stiamo parlando di un &lt;em&gt;pattern creazionale&lt;/em&gt; in cui &lt;strong&gt;un insieme di factory&lt;/strong&gt; viene astratto da un'unica interfaccia dando la possibilità al client di utilizzare la factory più corretta per la creazione di oggetti, nel nostro esempio una factory per ogni piattaforma. Si parla di &lt;strong&gt;famiglie di oggetti&lt;/strong&gt;: ogni factory permette la creazione di oggetti in relazione tra loro.&lt;/p&gt;

&lt;p&gt;Per garantire l’uso di più factory è necessario astrarre anche gli oggetti creati: i pulsanti saranno definiti da un’astrazione e i link da un’altra. Quindi la factory astratta esporrà due metodi per creare tali oggetti. Questo lo schema proposto da &lt;a href="https://en.wikipedia.org/wiki/Abstract_factory_pattern"&gt;Wikipedia&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Coding/GUIFactory.png" alt="GUIFactory"&gt;&lt;/p&gt;

&lt;p&gt;Il risultato è &lt;strong&gt;una netta separazione tra l'uso e la creazione degli oggetti&lt;/strong&gt;. L’applicazione di questo pattern si rivela assai utile quando si vuole rendere un sistema indipendente dalle modalità di creazione, composizione e rappresentazione degli oggetti costituenti, rendendo note unicamente le interfacce e non le implementazioni concrete. &lt;/p&gt;

&lt;p&gt;L'abstract factory viene usato ad esempio nella definizione di librerie: all'utilizzatore interessa una certa interfaccia non quale classe venga effettivamente creata. E la creazione può dipendere da diversi fattori. Nell’esempio precedente anche la creazione della factory può essere vincola da una configurazione o dallo stato dell’applicazione o dalla piattaforma in uso. &lt;/p&gt;

&lt;p&gt;Diventa &lt;em&gt;semplice&lt;/em&gt; creare ed inserire nell’applicazione una GUIFactory dedicata a Linux: il client richiede la factory e in modo del tutto trasparente verrà ritornata quella del sistema in uso. La definizione della GoF è abbasta chiara a proposito:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Fornire un’interfaccia per creare famiglie di oggetti in relazione o
  dipendenti tra loro, senza indicarne la classe concreta&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Lo schema proposto da &lt;a href="https://en.wikipedia.org/wiki/Abstract_factory_pattern"&gt;Wikipedia&lt;/a&gt; è una buona panoramica di questi concetti:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Coding/AbstractFactoryUML.png" alt="UML Schema"&gt;&lt;/p&gt;

&lt;p&gt;Abbiamo quindi i seguenti partecipanti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;L'&lt;strong&gt;AbstractFactory&lt;/strong&gt; definisce una classe in grado di creare degli oggetti definiti tramite astrazione (&lt;strong&gt;AbstractProduct&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;L'astrazione può essere implementata in varie classi concrete (&lt;strong&gt;ConcreteFactory&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;Il client utilizza AbstracFactory per ottenere degli &lt;strong&gt;AbstractProduct&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;La factory crea su richiesta un &lt;strong&gt;ConcreteProduct&lt;/strong&gt; per soddisfare il client.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dallo schema si nota che il client utilizza solo due gruppi di interfacce: AbstractFactory e AbstractProduct. Ad ogni AbstractProduct corrisponde di solito un metodo della classe factory, anche se è possibile applicare altri pattern per rendere ancor più estendibile la creazione.&lt;/p&gt;

&lt;p&gt;Anche per questo pattern vengono applicati i principi OO di base: l'incapsulamento e il principio di programmazione verso l'interfaccia e non verso l'implementazione (perché per creare altri tipi di oggetti basta cambiare la factory, che generalmente è una &lt;strong&gt;singleton&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;Un ulteriore vantaggio è quello di creare un insieme di oggetti in relazione e coerenti tra loro: se un insieme di oggetti forma una famiglia significa che sono stati studiati per lavorare tra loro, quindi una factory dovrebbe ritornare oggetti della stessa famiglia. Inoltre si centralizza la creazione di oggetti omogenei in un unico punto.&lt;/p&gt;

&lt;p&gt;Lo svantaggio principale di questo approccio riguarda la modifica della factory: se devo aggiungere una nuova tipologia di Product allora dovrò modificare l’astrazione e tutte le classi derivate. L’insieme delle tipologie è infatti fisso e corrisponde generalmente ai metodi esposti dalla factory.&lt;/p&gt;

&lt;p&gt;Ricapitolando vi sono diversi scenari tipici per l’utilizzo di tale pattern: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Il sistema necessità di essere indipendente dalle modalità di creazione degli oggetti che utilizza.&lt;/li&gt;
&lt;li&gt;Il sistema lavora con più famiglie di prodotti.&lt;/li&gt;
&lt;li&gt;I prodotto di una famiglia sono progettata per lavorare esclusivamente assieme.&lt;/li&gt;
&lt;li&gt;E’ richiesta la creazione di un libraria di prodotti per la quale è rilevante solo l’interfaccia. Quindi l’implementazione è incapsulata.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Generalmente &lt;strong&gt;una factory viene creata come singleton per poter essere riutilizzata&lt;/strong&gt; e, come visto nell’esempio precedente, la creazione potrebbe considerare la configurazione dell’applicazione o lo stato del sistema.&lt;/p&gt;

&lt;p&gt;In fase di &lt;strong&gt;refactoring&lt;/strong&gt; il pattern risulta utile per concentrare in un unico posto la creazione degli oggetti: si cerca quindi la presenza di &lt;strong&gt;new&lt;/strong&gt; nelle varie classi per passare poi come dipendenza l’astrazione della factory e centralizzare la creazione degli oggetti. Tra l'altro questo è il tipico lavoro svolto da un &lt;em&gt;Inversion Of Control Container (IoC)&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Alcuni riferimenti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Abstract_factory_pattern"&gt;Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sourcemaking.com/design_patterns/abstract_factory"&gt;Source Making&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://msdn.microsoft.com/it-it/library/cc185067.aspx#ID0END"&gt;MSDN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://c2.com/cgi/wiki?AbstractFactory"&gt;Cunningham &amp;amp; Cunningham&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.oodesign.com/abstract-factory-pattern.html"&gt;OODesign&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Sat, 27 Jun 2015 12:12:15 GMT</pubDate><guid isPermaLink="true">http://www.fulviogabana.it:80/coding/abstract-factory-pattern</guid></item><item><title>Liberare spazio in Windows</title><link>http://www.fulviogabana.it:80/blog/2015/06/liberare-spazio-in-windows</link><description>&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/Windows/MsFixIt_90.png" alt="_Logo"&gt; Seppur nel loro insieme risultino ottimi prodotti, molti tablet di fascia medio-bassa sono dotati di dischi di piccole dimensioni e dopo poco tempo lo spazio inesorabilmente finisce. Tra i vari accorgimenti per risparmiare qualche megabyte vi è la pulizia della cartella degli aggiornamenti di Windows.&lt;/p&gt;

&lt;p&gt;Il piccolo ma versatile &lt;strong&gt;Asus T-100TA&lt;/strong&gt; in mio possesso ha sulla carta 32 GB di disco ma in realtà la partizione di rispristino è una ROM non cancellabile, il che fa scendere di ben 8 GB lo spazio realmente disponibile. &lt;/p&gt;

&lt;p&gt;Poi ci sono il sistema operativo e Office, entrambi non particolarmente leggeri e basta installare qualche App particolarmente pesante e ci si ritrova con pochi megabyte a disposizione. E’ possibile espandere il disco con una memory card, ma non vi è un modo semplice e sicuro per installarvi le applicazioni se non quelle desktop. &lt;/p&gt;

&lt;p&gt;In rete si trovano molti consigli per liberare spazio, ma in generale si tratta di piccoli accorgimenti: per provare a liberare molto spazio è possibile agire sulle cartelle utilizzate da Windows per l’installazione degli aggiornamenti. &lt;/p&gt;

&lt;p&gt;Dopo alcuni mesi di utilizzo ho liberato circa 7 GB, ma la dimensione dipende dallo stato del proprio sistema e se si è eseguito l’aggiornamento da Windows 8 a Windows 8.1. La cartella da svuotare è:&lt;/p&gt;

&lt;script src="https://gist.github.com/fulviogabana/04460cc58d04c20faa9b.js"&gt;&lt;/script&gt;

&lt;p&gt;Una nota importante: gli aggiornamenti sono fondamentali per garantire la stabilità e la sicurezza del sistema. Vanno quindi installati regolarmente e la procedura descritta non ne influenza l’installazione ma piuttosto ne impedisce il rollback (la possibilità di disinstallare un aggiornamento).&lt;/p&gt;

&lt;p&gt;Un'altra cartella che occupa un po’ di spazio è la &lt;strong&gt;WinSxS&lt;/strong&gt;: si trova direttamente sotto &lt;em&gt;C:\Windows&lt;/em&gt; e non è da cancellare. E' possibile ripulirla tramite appositi comandi, come descritto nella guida presente su &lt;a href="https://technet.microsoft.com/en-us/library/dn251565.aspx"&gt;Technet&lt;/a&gt;. Ecco due utili comandi da avviare da una console amministrativa: &lt;/p&gt;

&lt;script src="https://gist.github.com/fulviogabana/60ec464bb760d5fb1816.js"&gt;&lt;/script&gt;

&lt;p&gt;Il primo analizza la cartella e verifica la sua dimensione effettiva e indica se è possibile eseguirne la pulizia. Il secondo esegue effettivamente la pulizia. Ciò che si guadagna dipende molto dal proprio sistema, ma in situazioni di emergenza ogni byte...&lt;/p&gt;

&lt;p&gt;Lanciare i tool di pulizia di Windows è anche un’altra utile pratica: basta andare in &lt;em&gt;Impostazioni PC&lt;/em&gt; e quindi &lt;em&gt;Spazio su disco&lt;/em&gt;. Per il desktop è possibile lanciare &lt;em&gt;Liberare spazio su disco eliminando i file non necessari&lt;/em&gt; (cioè il vecchio &lt;em&gt;Pulizia disco&lt;/em&gt;). Naturalmente è possibile installare tool più evoluti come &lt;a href="https://www.piriform.com/ccleaner/download"&gt;CCleaner&lt;/a&gt; o &lt;a href="http://www.iolo.com/products/system-mechanic/"&gt;System Mechanic&lt;/a&gt; per raffinare la pulizia e ottenere qualche funzionalità in più.&lt;/p&gt;
</description><pubDate>Tue, 23 Jun 2015 21:25:00 GMT</pubDate><guid isPermaLink="true">http://www.fulviogabana.it:80/blog/2015/06/liberare-spazio-in-windows</guid></item><item><title>Quale interfaccia usare per ritornare un insieme?</title><link>http://www.fulviogabana.it:80/blog/2015/06/quale-interfaccia-usare-per-ritornare-un-insieme</link><description>&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/Programming/CSharpTip.jpg" alt="_Logo"&gt; Una buona pratica quando si ritorna un insieme da una funzione è quella di limitarsi alle interfacce base offerte dal .NET: &lt;strong&gt;IList&lt;/strong&gt;, &lt;strong&gt;ICollection&lt;/strong&gt;, &lt;strong&gt;IQueryable&lt;/strong&gt;, &lt;strong&gt;IEnumerable&lt;/strong&gt; o &lt;strong&gt;IReadOnlyList&lt;/strong&gt;. In realtà la regola “accettare il minimo che si può, ma restituire il massimo” pone alcuni vincoli. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://msdn.microsoft.com/en-us/library/system.collections.ienumerable%28v=vs.110%29.aspx"&gt;IEnumerable&lt;/a&gt; e &lt;a href="https://msdn.microsoft.com/en-us/library/hh192385%28v=vs.110%29.aspx"&gt;IReadOnlyList&lt;/a&gt; sono in generale le interfacce utilizzate in questi contesti. E' interessante notare che &lt;em&gt;IReadOnlyList&lt;/em&gt; non è molto diversa da &lt;em&gt;IEnumerable&lt;/em&gt; ma permette di essere più espliciti nella dichiarazione della propria funzione. In realtà &lt;em&gt;IReadOnlyList&lt;/em&gt; deriva sia da IEnumerable sia da IReadOnlyCollection ed espone sia &lt;em&gt;Count&lt;/em&gt; sia &lt;em&gt;Item(int index)&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Ritornare un &lt;em&gt;IEnumerable&lt;/em&gt; permette di utilizzare &lt;strong&gt;yield&lt;/strong&gt; in fase di creazione, inoltre espone un insieme non modificabile. In realtà, se l’enumerazione deriva direttamente dal sorgente dati, è possibile fare un cast dell’oggetto. Inoltre, se si ritorna direttamente il sorgente dati, bisogna fare attenzione agli eventuali aggiornamenti che invalidano l’enumerazione. Di alternative non ve ne sono molte: o si crea un nuovo insieme (magari con un semplice &lt;em&gt;ToArray()&lt;/em&gt;) oppure si utilizzano dei lock. &lt;/p&gt;

&lt;p&gt;Comunque, utilizzare &lt;strong&gt;IEnumerable&lt;/strong&gt; sul sorgente effettivo permette di evitare duplicazione dei dati, tipico delle liste e degli array, e al chiamate di richiedere solo i dati che gli servono interrompendo la richiesta appena possibile. Questa valutazione lazy funziona in particolare con yield:&lt;/p&gt;

&lt;script src="https://gist.github.com/fulviogabana/d8044c6094a9a8867207.js"&gt;&lt;/script&gt;

&lt;p&gt;Vale poi la pena di sottolineare la differenza tra &lt;strong&gt;ICollection&lt;/strong&gt; e &lt;strong&gt;IList&lt;/strong&gt;: la prima permettere di azzerare l'insieme, aggiungere un elemento in coda oppure di eliminarne uno specifico. L'altra permette inserimenti e cancellazioni anche indicando la posizione dell'elemento. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AddRange&lt;/strong&gt; non è invece implementato in nessuna delle due interfacce anche se alle volte risulta comodo, ma un'interfaccia deve essere la più semplice possibile ed è facile creare un’estensione:&lt;/p&gt;

&lt;script src="https://gist.github.com/fulviogabana/47343cf99ab67ce444ad.js"&gt;&lt;/script&gt;

&lt;p&gt;In tutti i casi parlo delle versioni generiche, perché è sempre il caso di ritornare collezioni tipizzate e con il tipo più alto possibile, liberando il client dalle verifiche sul risultato.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://msdn.microsoft.com/en-us/library/System.Linq.IQueryable.aspx"&gt;IQueryable&lt;/a&gt; è l'interfaccia fondamentale per l'uso di LINQ e permette ad un query provider di eseguire lato server il cosiddetto &lt;em&gt;albero delle espressioni&lt;/em&gt;. Questo non è un vincolo dell’interfaccia ma la tipica implementazione per i sorgenti dati, come quelli &lt;em&gt;esposti&lt;/em&gt; tramite Entity Framework che traduce la query LINQ in comandi specifici per l’effettivo data storage utilizzato. &lt;/p&gt;

&lt;p&gt;Su &lt;a href="https://msdn.microsoft.com/en-us/library/dn169389.aspx"&gt;MSDN&lt;/a&gt; è presente una pagina dedicata alle linee guide per le collection: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ritornare collection tipizzate, possibilmente con il tipo più forte possibile (quindi non uno dei tipi base).&lt;/li&gt;
&lt;li&gt;Non ritornare &lt;em&gt;ArrayList&lt;/em&gt; o &lt;em&gt;List&lt;t&gt;&lt;/t&gt;&lt;/em&gt; nelle API perché sono ottimizzate e pensate per un uso interno.&lt;/li&gt;
&lt;li&gt;Non ritornare &lt;em&gt;Hashtable&lt;/em&gt; o &lt;em&gt;Dictionary&lt;tkey,tvalue&gt;&lt;/tkey,tvalue&gt;&lt;/em&gt;, ma eventualmente IDictionary&lt;tkey, tvalue=""&gt;.&lt;/tkey,&gt;&lt;/li&gt;
&lt;li&gt;Sullo stesso tipo non implementare sia &lt;em&gt;IEnumerator&lt;/em&gt; sia &lt;em&gt;IEnumerable&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Per insiemi read/write, preferire &lt;em&gt;Collection&lt;t&gt;&lt;/t&gt;&lt;/em&gt; o derivate per i valori di ritorno.&lt;/li&gt;
&lt;li&gt;Per insiemi read-only preferire &lt;em&gt;ReadOnlyCollection&lt;t&gt;&lt;/t&gt;&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Considerare di creare collezioni personalizzate per una maggiore estendibilità (da derivare dai tipi base) o per poterne cambiare l’implementazione in futuro.&lt;/li&gt;
&lt;li&gt;Considerare &lt;em&gt;KeyedCollection&lt;tk, ti=""&gt;&lt;/tk,&gt;&lt;/em&gt; per insiemi con chiave univoca.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La regola generale è quella di richiedere, come parametri, il tipo più debole che si ha bisogno e di ritornare il tipo più forte che si ha. Ad esempio, si dovrebbe accettare un &lt;em&gt;IEnumerable&lt;/em&gt; e ritornare una &lt;em&gt;Collection&lt;t&gt;&lt;/t&gt;&lt;/em&gt;.  Si dice: &lt;strong&gt;permissivi in entrata, specifici in uscita&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Infine, è buona norma non ritornare null ma piuttosto un insieme vuoto. Il chiamante deve poi usare &lt;em&gt;Any()&lt;/em&gt; per verificare se vi sono elementi e non il più costoso &lt;em&gt;Count() == 0&lt;/em&gt;.&lt;/p&gt;
</description><pubDate>Fri, 19 Jun 2015 20:44:00 GMT</pubDate><guid isPermaLink="true">http://www.fulviogabana.it:80/blog/2015/06/quale-interfaccia-usare-per-ritornare-un-insieme</guid></item><item><title>Introduzione a MongoDB</title><link>http://www.fulviogabana.it:80/Data/introduzione-a-mongodb</link><description>&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Data/MongoLogo.png" alt="_Logo"&gt; &lt;strong&gt;MongoDB&lt;/strong&gt; è un database &lt;strong&gt;document oriented&lt;/strong&gt;. Nelle prime posizioni per &lt;a href="http://db-engines.com/en/ranking"&gt;popolarità&lt;/a&gt; in compagnia di tanti database relazionali, offre i tipici vantaggi della famiglia &lt;a href="http://www.fulviogabana.it/data/i-database-nosql"&gt;noSQL&lt;/a&gt;. La sua alta flessibilità e robustezza ne fanno un ottimo candidato per molte tipologie di applicazioni, non solo nell’ambito dei grandi volumi tipici del &lt;em&gt;cloud&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Possiamo sintetizzare &lt;a href="https://www.mongodb.org/"&gt;MongoDB&lt;/a&gt; dicendo che permette la memorizzazione di documenti in insiemi (detti &lt;em&gt;collection&lt;/em&gt;) in cui &lt;strong&gt;non è necessario mantenere lo stesso schema&lt;/strong&gt; per ogni elemento. Ogni documento ha un proprio id univoco che ne permette il rapido recupero. &lt;/p&gt;

&lt;p&gt;Per documento non si intende un file nel senso comune del termine, ma una struttura dati simile ad un dizionario in cui le coppie nome/valore, detti &lt;em&gt;field&lt;/em&gt;, definiscono un’entità. Nella stessa collezione, come detto, ogni documento può avere il suo insieme di &lt;em&gt;field&lt;/em&gt; e un field con un certo nome può essere, in documenti diversi, di tipo diverso. Molto importante è il fatto che &lt;strong&gt;ogni documento può contenere altri documenti&lt;/strong&gt; e, oltre ai tipi di dati primitivi, è possibile definire un campo come &lt;strong&gt;array&lt;/strong&gt;. Gli array possono contenere qualsiasi altro tipo, compresi altri array e documenti. Questo offre una struttura dati molto completa e flessibile che in parte compensa le funzionalità dei database tradizionali che Mongo non può offrire.&lt;/p&gt;

&lt;p&gt;Come per gli altri database noSQL &lt;strong&gt;non esiste il concetto di relazione e di transazione&lt;/strong&gt; tipica dei database tradizionali, perché non vi sono relazioni tra i documenti che normalmente porterebbero a creare lock di scrittura che si propagano su più tabelle e righe. In MongoDB &lt;strong&gt;l’atomicità delle scritture è solo sul documento in modifica&lt;/strong&gt;. In particolare non vi è un lock tra collezioni diverse. Ad esempio, non è possibile forzare l’eliminazione di documenti presenti in una collezione alla cancellazione di documenti presenti in un altro insieme: sarà compito dell’applicazione garantire la consistenza dei dati.&lt;/p&gt;

&lt;p&gt;Altra importante caratteristica riguarda il fatto che &lt;strong&gt;il modello di coerenza non è rigido&lt;/strong&gt;. Come discusso nell’ambito del &lt;a href="http://www.fulviogabana.it/data/il-teorema-cap"&gt;teorema CAP&lt;/a&gt; un database distribuito deve sacrificare la consistenza per offrire disponibilità o viceversa. Il team di MongoDB ha cercato di offrire un compromesso davvero interessante tra la possibilità di gestire enormi quantità di dati e la loro coerenza: per comprendere la complessità di tale architettura si pensi ad un database suddiviso in centinaia di server che concorrono contemporaneamente a rispondere il più velocemente possibile ad un’altrettanta enorme mole di richieste.&lt;/p&gt;

&lt;p&gt;Come è possibile gestire questa mole di dati e richieste? Offrendo un’incredibile supporto alla scalabilità orizzontale e alla robustezza: sia duplicando i database tramite repliche sia suddividendo le collezioni in parti (dette &lt;strong&gt;sharding&lt;/strong&gt;). Le repliche garantiscono la disponibilità dei dati anche in caso di crash di un server, mentre i sharding permettono l’esecuzione di query in parallelo anche su server diversi. Non c’è limite al numero di server utilizzabili.&lt;/p&gt;

&lt;p&gt;In un sistema noSQL, nato soprattutto nell’ambito distribuito come il web/cloud, si sacrifica coerenza a favore della disponibilità. Quindi in generale un client può aggiornare i dati ma vi è un certo periodo in cui il dato non risulta sincronizzato su tutte le repliche. Le modifiche vengono infatti accettate solo dal database primario e poi propagate sui database replica. Durante questa diffusione i dati risultano non coerenti: un client che accede ad una replica potrebbe ottenere una copia non aggiornata del documento. Si parla di &lt;strong&gt;eventual consistence&lt;/strong&gt;, quindi di coerenza non immediata.&lt;/p&gt;

&lt;p&gt;In MongoDB questo processo è ampiamente configurabile specificando il livello di &lt;strong&gt;Write Concern&lt;/strong&gt;. Se un client richiede la modifica di un documento, tale operazione verrà eseguita in modo atomico sul server. Ma il flusso di una richiesta di modifica comporta diversi passi e MongoDB può essere configurato per indicare in quale punto si ha il ritorno del risultato al client:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In modalità &lt;em&gt;fire and forget&lt;/em&gt;, detta anche &lt;em&gt;relax&lt;/em&gt;, il client invia la richiesta e il server la prende in carico liberando subito il chiamante. In questo caso la modifica si trova nella cache del server che viene poi elaborata periodicamente. Quindi, in caso di errore, il dato potrebbe non essere nemmeno stato salvato sul server primario.&lt;/li&gt;
&lt;li&gt;In base alla configurazione il client potrebbe attendere almeno la conferma del salvataggio effettivo del dato nello storage fisico, ma verrebbe liberato dall’attesa della replicazione sui nodi secondari.&lt;/li&gt;
&lt;li&gt;L’ultima possibilità è quella di attendere sia la ricezione della richiesta, sia la persistenza sia la replicazione. In questi casi è possibile indicare il livello di replicazione, ad esempio indicando di attendere l’aggiornamento della maggioranza dei nodi. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si parla di &lt;strong&gt;consistency&lt;/strong&gt; e &lt;strong&gt;durability&lt;/strong&gt;: la prima riguarda la coerenza dei dati tra nodo primario e secondari ed è un coerenza non immediata (&lt;strong&gt;Eventual Consistency&lt;/strong&gt;), la seconda riguarda l’effettiva persistenza dei dati su dischi del nodo primario. Infatti un particolare sistema di cache, necessario per garantire elevati prestazioni, razionalizza l’accesso al disco.&lt;/p&gt;

&lt;p&gt;Questi sono solo alcuni appunti relativi a MongoDB e l’intenzione è quello di introdurre alcuni concetti base. I vantaggi di &lt;strong&gt;MongoDB&lt;/strong&gt; riguardano:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;La &lt;strong&gt;scalabilità&lt;/strong&gt;, quindi la distribuzione dei carichi di lavoro su più server.&lt;/li&gt;
&lt;li&gt;La &lt;strong&gt;velocità&lt;/strong&gt;, in particolare là dove è possibile accedere tramite chiave primaria.&lt;/li&gt;
&lt;li&gt;L’integrazione diretta con il proprio &lt;strong&gt;modello Object Oriented&lt;/strong&gt;, quindi &lt;strong&gt;nessun impendance mismatch&lt;/strong&gt; e una maggiore velocità di sviluppo.&lt;/li&gt;
&lt;li&gt;La possibilità di configurare il livello di coerenza, sia a livello di database, sia di collezione e sia di singola operazione.&lt;/li&gt;
&lt;li&gt;La &lt;strong&gt;semplificazione della migrazione&lt;/strong&gt; dei dati in caso di aggiornamento del modello dati.&lt;/li&gt;
&lt;li&gt;La semplificazione della collaborazione nel team: è più semplice "visualizzare" un database MongoDB che un classico database relazionale.&lt;/li&gt;
&lt;li&gt;La possibilità di estendere il proprio modello in modo più semplice grazie al polimorfismo dei dati e alla mancanza di schemi (un partner potrebbe salvare dati aggiuntivi nei documenti senza dover metter mano al database).&lt;/li&gt;
&lt;li&gt;Il supporto ai dati di grandi dimensioni (tramite GridFS).&lt;/li&gt;
&lt;li&gt;E’ un progetto in continua evoluzione: con la versione 3.0 è stato introdotto un nuovo motore che permette prestazioni e compressione dati notevolmente superiori rispetto alla precedente versione.&lt;/li&gt;
&lt;li&gt;Tale le risorse a disposizione tra libri, presentazioni, meetup, webinar… Fondamentali l’&lt;a href="https://university.mongodb.com/"&gt;Univerità MongoDB&lt;/a&gt; e la &lt;a href="http://docs.mongodb.org/manual/"&gt;documentazione ufficiale&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;MongoDB è un progetto Open Source scritto in prevalenza in C++. E’ distribuito come release stabile oppure in versione beta con compilazioni notturne. E’ disponibile per Windows, Linux, Mac OS X e Solaris. Il sito ufficiale è &lt;a href="https://www.mongodb.org/"&gt;MongoDB.org&lt;/a&gt; mentre esistono molti servizi business per il supporto o l’hosting, in particolare &lt;a href="https://mongolab.com"&gt;MongoLab&lt;/a&gt; e &lt;a href="https://mms.mongodb.com/"&gt;MMS&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Infine, è interessante notare come MongoDB sia il database noSQL più &lt;strong&gt;richiesto nelle offerte di lavoro&lt;/strong&gt; ed è, attualmente, &lt;strong&gt;il quinto database più popolare&lt;/strong&gt; nella classifica di &lt;a href="http://db-engines.com/en/ranking"&gt;db.engines.com&lt;/a&gt;.&lt;/p&gt;
</description><pubDate>Tue, 16 Jun 2015 21:23:58 GMT</pubDate><guid isPermaLink="true">http://www.fulviogabana.it:80/Data/introduzione-a-mongodb</guid></item><item><title>Build Tour Milano 2015</title><link>http://www.fulviogabana.it:80/blog/2015/06/build-tour-milano-2015</link><description>&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/BuildMilan/BuildLogo.gif" alt="_Logo"&gt; Oggi ho partecipato (dal vivo) all’evento &lt;strong&gt;//build/tour&lt;/strong&gt; organizzato a &lt;a href="https://milan.build15.com/"&gt;Milano&lt;/a&gt; da Microsoft. Ottima l’accoglienza e l’organizzazione, per un evento gratuito condotto da speaker brillanti che hanno ben introdotto le tante novità legate a &lt;strong&gt;Windows 10&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;E’ stata una bella esperienza e se all’inizio ero scettico sulla possibilità di partecipare dal vivo e abbandonare lo streaming, devo dire ora che la partecipazione di persona è di gran lunga più bella, grazie anche alla simpatia degli speaker e alla gentilezza e disponibilità di tutti.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/BuildMilan/BuildMilan1.jpg" alt="BuildMilan1"&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/BuildMilan/BuildMilan2.jpg" alt="BuildMilan2"&gt;&lt;/p&gt;

&lt;p&gt;Tanti gli argomenti a partire proprio dalla piattaforma &lt;strong&gt;Windows 10&lt;/strong&gt; in grado di rendere unica l’esperienza utente su dispositivi molto diversi tra loro e che vede nelle &lt;strong&gt;Universal Windows App&lt;/strong&gt; il punto di arrivo di un percorso iniziato con gli aggiornamenti di Windows 8.1 e Windows Phone 8.1.&lt;/p&gt;

&lt;p&gt;Si è parlato di &lt;strong&gt;Continuum&lt;/strong&gt;, con la possibilità ad esempio di estendere il proprio smartphone con monitor, tastiera e mouse esterni sfruttando così la sua potenza in una postazione di lavoro vera e propria (sebbene non in modalità full desktop). &lt;/p&gt;

&lt;p&gt;Si è parlato tanto di &lt;strong&gt;Cortana&lt;/strong&gt; e di come sia semplice integrarlo nelle proprie applicazioni e di come sono migliorati i servizi di riconoscimento e sintetizzazione vocale. &lt;/p&gt;

&lt;p&gt;Di come il nuovo browser &lt;strong&gt;Microsoft Edge&lt;/strong&gt;, disponibile solo per Windows 10, offra prestazioni ed esperienze all’avanguardia (sarà possibile tra l’altro creare estensioni in Javascript e HTML, come succede per Chorme e Firefox). &lt;/p&gt;

&lt;p&gt;Si è visto poi come sia possibile creare &lt;strong&gt;Web App&lt;/strong&gt; in modo rapido a partire da un sito web e di come utilizzare da Javascript le potenzialità delle Windows API. &lt;/p&gt;

&lt;p&gt;Si è quindi parlato dell’unificazione dello &lt;strong&gt;Store&lt;/strong&gt; e delle tante funzionalità aggiuntive che offrirà: come la gestione dell’advertising, degli strumenti di analytics, delle sottoscrizioni IaP e delle campagne pubblicitarie. &lt;/p&gt;

&lt;p&gt;Di come &lt;strong&gt;Microsoft Hello&lt;/strong&gt; permetterà di abbandonare le vecchie password in favore del riconoscimento visivo e di come i servizi cloud di ultima generazione permettano proprio elaborazioni di immagini avanzate (si veda ad esempio &lt;a href="http://how-old.net/"&gt;How-Old&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Si è parlato anche del nuovo &lt;strong&gt;Azure&lt;/strong&gt;, dei tanti strumenti disponibili e di come sia completamente aperto a tecnologie fino a poco tempo fa estranee se non nemiche (il mondo Linux, Apache, noSQL…). In particolare nel cloud sono disponibili i nuovi &lt;strong&gt;Azure App Service&lt;/strong&gt; in cui confluiscono i servizi Web, Mobile, Logic e API. &lt;/p&gt;

&lt;p&gt;Si è parlato delle tante innovazioni di &lt;strong&gt;Visual Studio 2015&lt;/strong&gt; e dell’arrivo di &lt;strong&gt;Visual Studio Code&lt;/strong&gt;, il tool multipiattaforma per chi si dedica soprattutto alla scrittura del codice (con il linguaggio che preferisce). Si è parlato di &lt;strong&gt;.NET Native&lt;/strong&gt; che permette di ottenere, con un flag, grandi prestazioni dalle proprie applicazioni .Net.&lt;/p&gt;

&lt;p&gt;E poi ancora di &lt;strong&gt;Beacons&lt;/strong&gt;, di &lt;strong&gt;Http2&lt;/strong&gt;, di &lt;strong&gt;SVG&lt;/strong&gt;, di &lt;strong&gt;Design&lt;/strong&gt;, &lt;strong&gt;Web Audio API&lt;/strong&gt;, &lt;strong&gt;TypeScript&lt;/strong&gt;... e tanto altro.  &lt;/p&gt;

&lt;p&gt;Molto bella la closing note da parte di &lt;strong&gt;Fabio Santini&lt;/strong&gt; di Microsoft Italia, che in pochi minuti ha parlato in modo molto chiaro dei cambiamenti avvenuti in Microsoft nell’ultimo anno e mezzo. Cambiamenti decisamente vistosi iniziati grazie all’avvento di Satya Nadella che, contrariamente a Balmer, è cresciuto in Microsoft come figura &lt;em&gt;tecnica&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;La visione di Nadella è ben espressa da una sua frase diventata il motto di questo processo di innovazione:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Our industry does not respect tradition, it only respects innovation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Puoi quindi aver creato i software più utilizzati del mondo ma se non riesci ad innovare cogliendo le opportunità che il mondo IT crea e richiede, allora sei destinato a rimanere indietro. Come è successo a Microsoft nel campo del Web e del Mobile.&lt;/p&gt;

&lt;p&gt;Microsoft è passata da un core business basato principalmente sull’accoppiata Windows/Office ai servizi Enterprise e quindi al Cloud, accogliendo e sfruttando i tanti strumenti non Microsoft disponibili, per offrire allo sviluppatore un’esperienza completa. &lt;/p&gt;

&lt;p&gt;L’innovazione è quello che chiede il mercato ed è alla base di quella rivoluzione tecnologia che, pare, Nadella abbia sintetizzato in questo disegno:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/BuildMilan/NadellaWorld.jpg" alt="Nadella World"&gt;&lt;/p&gt;

&lt;p&gt;Un mondo in cui i software sono ovunque, dai grandi data center del Cloud ai piccoli sensori dell’IoT… Miliardi e miliardi di dispositivi che raccolgono o consumano un’enorme quantità di dati che hanno portato allo sviluppo delle tecnologie Big Data e la cui elaborazione è una delle sfide del presente. Tanti strumenti e tante opportunità che rendono questo lavoro ancor più entusiasmante. &lt;/p&gt;

&lt;p&gt;Un grazie quindi a tutti per l’ottimo evento, in particolare ai tre speaker (Andrew Wigley, Nikola Metulev e David Rousset) che grazie alla loro simpatia hanno donato all’evento un po’ della leggerezza necessaria per reggere una così lunga giornata ricca di informazioni. Naturalmente un grazie a tutto il team di Microsoft Italia e a tutti coloro che hanno lavorato all’organizzazione.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/BuildMilan/BuildMilan3.jpg" alt="BuildMilan3"&gt;&lt;/p&gt;

&lt;p&gt;Rimando per un'ulteriore panoramica all’articolo di &lt;a href="http://www.webnews.it/2015/06/10/microsoft-build-2015-milano/"&gt;WebNews&lt;/a&gt;.&lt;/p&gt;
</description><pubDate>Wed, 10 Jun 2015 21:50:00 GMT</pubDate><guid isPermaLink="true">http://www.fulviogabana.it:80/blog/2015/06/build-tour-milano-2015</guid></item><item><title>Lunga vita alla linea di comando</title><link>http://www.fulviogabana.it:80/blog/2015/05/lunga-vita-alla-linea-di-comando</link><description>&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/Cmder/CmderLogo.png" alt="_Logo"&gt; Gli strumenti &lt;em&gt;grafici&lt;/em&gt; a disposizione degli sviluppatori sono molti e sempre più evoluti. Alcune attività risultano comunque più efficienti se eseguite tramite &lt;strong&gt;linea di comando&lt;/strong&gt;, modalità che Windows supportava malamente fino all'avvento di potenti strumenti come &lt;a href="http://www.fulviogabana.it/blog/"&gt;PowerShell&lt;/a&gt; e tool come &lt;a href="http://gooseberrycreative.com/cmder/"&gt;cmder&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In questo post parlerò di &lt;a href="http://gooseberrycreative.com/cmder/"&gt;cmder&lt;/a&gt;, un tool che rivitalizza la linea di comando di Windows, mentre affronterò il potentissimo PowerShell in un altro &lt;a href="http://www.fulviogabana.it/blog/"&gt;articolo&lt;/a&gt;. In entrambi i casi si tratta di strumenti spesso sottovalutati dagli sviluppatori (e purtroppo non solo da loro), ma che permettono di aumentare la propria produttività, di automatizzare task ripetitivi e alle volte di trovare soluzioni altrimenti non disponibili tramite i normali tool di amministrazione e sviluppo.&lt;/p&gt;

&lt;p&gt;La linea di comando diventa importante nel momento in cui si utilizza Git, che esprime le sue massime potenzialità tramite shell (inoltre la maggior parte delle guide e degli esempi disponibili usa questo metodo). Anche le nuove generazioni di ASP.NET offrono alcuni utili strumenti via linea di comando, quindi facilmente automatizzabili. Vi sono poi tool come &lt;em&gt;Chocolatey&lt;/em&gt; o il prossimo &lt;em&gt;OneGet&lt;/em&gt; che permettono di automatizzare l’installazione e l’aggiornamento dei pacchetti presenti sulle proprie macchine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Automatizzare&lt;/strong&gt;, &lt;strong&gt;schedulare&lt;/strong&gt;, &lt;strong&gt;concatenare&lt;/strong&gt; e &lt;strong&gt;ripetere&lt;/strong&gt; comandi rappresentano le vere potenzialità della linea di comando.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://gooseberrycreative.com/cmder/"&gt;Cmder&lt;/a&gt; è un emulatore della console di Windows che unisce molti strumenti nati nella comunità e disponibili come progetti open source. E’ disponibile come &lt;strong&gt;applicativo portabile&lt;/strong&gt;, sia in versione ridotta (circa 7 mb) sia in versione completa (circa 250 mb): quest’ultima include i tool di supporto a Git. &lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/Cmder/CmderConsole.png" alt="Cmder Console"&gt;&lt;/p&gt;

&lt;p&gt;Se l’avvio fallisce con un messaggio del tipo “&lt;em&gt;The program can't start because api-ms-win-crt-runtime-l1-1-0.dll is missing from your computer&lt;/em&gt;" allora è necessario installare &lt;a href="http://www.microsoft.com/en-us/download/details.aspx?id=46881"&gt;Visual C++ Redistributable for Visual Studio 2015 (64-bit)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cmder è tecnicamente un terminale che permette l'avvio di più shell&lt;/strong&gt;, generalmente interpreti a linea di comando come Powershell e cmd.exe. Nulla vieta di avviare altri applicativi: è disponibile ad esempio la guida per integrare &lt;a href="https://github.com/bliker/cmder/wiki/Seamless-Sublime-Text-3-Integration"&gt;Sublime Text&lt;/a&gt;. Per chi vuole invece &lt;em&gt;creare&lt;/em&gt; un ambiente linux-like è possibile configurare &lt;a href="https://cygwin.com/install.html"&gt;Cygwin&lt;/a&gt;, un vasto insieme di strumenti GNU per portare alcune funzionalità di Linux in ambiente Windows. Qui la &lt;a href="https://github.com/bliker/cmder/wiki/%5BWindows%5D-Integrating-Cygwin"&gt;guida&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;All'avvio di una console &lt;strong&gt;PowerShell&lt;/strong&gt; verrà eseguito, per attivare alcune utili configurazioni, lo script &lt;em&gt;profile.ps1&lt;/em&gt; presente nella cartella &lt;em&gt;Vendor&lt;/em&gt;. Se l'esecuzione dovesse fallire con l'errore &lt;em&gt;about_Execution_Policies&lt;/em&gt; allora dovrete cambiare le policy di esecuzione degli script. La policy di default è permettere l'esecuzione di comandi ma non di script (il comando &lt;em&gt;Get-ExecutionPolicy&lt;/em&gt; dovrebbe infatti ritornare &lt;em&gt;Restricted&lt;/em&gt;). Per modificare usare &lt;em&gt;set-ExecutionPolicy Unrestricted&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;Dietro le quinte Cmeder utilizza una cmd.exe nascosta e le funzionalità di tre progetti completamente integrati: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://conemu.github.io/"&gt;ConEmu&lt;/a&gt;: è una console multi scheda con tante funzionalità per rendere la shell più user friendly.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mridgers.github.io/clink/"&gt;Clink&lt;/a&gt;: che offre le funzionalità di modifica della linea di comando disponibili in nella shell Bash tipica dei sistemai *nix.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://msysgit.github.io/"&gt;Msysgit&lt;/a&gt;: che offre in ambiente Windows tutti i comandi del più diffuso sistema di Source Control Management.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;L'applicativo è altamente configurabile e permette di definire i task associati all’apertura delle schede. Predefiniti sono i task per cmd.exe e Powershell, che possono essere duplicati e avviati con specifici argomenti. Per PoSH è possibile indicare un proprio script di avvio, come visto con &lt;em&gt;profile.ps1&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/Cmder/CmderSettings.png" alt="Cmder Settings"&gt;&lt;/p&gt;

&lt;p&gt;E’ inoltre possibile definire degli alias tramite il comando &lt;strong&gt;alias&lt;/strong&gt;. Quelli predefiniti si trovano nel file &lt;em&gt;config/alias&lt;/em&gt;. Ad esempio:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ls=ls --show-control-chars -F --color $*
clear=cls
e.=explorer .
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Nell’ultimo caso basta quindi scrivere &lt;strong&gt;e.&lt;/strong&gt; per far partire il file explorer posizionato sulla cartella corrente. &lt;/p&gt;

&lt;p&gt;E’ possibile definire molti shortcut, nonché l’aspetto delle finestre. Nella sezione &lt;em&gt;App Distinct&lt;/em&gt; è anche possibile associare ad ogni applicativo specifiche caratteristiche come il colore di sfondo della shell.&lt;/p&gt;

&lt;p&gt;Sono supportate le tipiche combinazioni veloci: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Ctrl + n&lt;/em&gt;: per passare alla scheda in posizione n.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Ctrl + Tab&lt;/em&gt;: per &lt;em&gt;ciclare&lt;/em&gt; tra le tab.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Ctrl + w&lt;/em&gt;: per chiudere il tab corrente.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Ctrl + t&lt;/em&gt;: per arpire un nuovo tab.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Shift + Alt + n&lt;/em&gt;: per aprire rapidamente cmd (1) o PowerShell (2).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Alt + Enter&lt;/em&gt;: per la modalità a tutto schermo.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Right Click&lt;/em&gt;: copia il testo presente nella cliboard.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Ctrl + r&lt;/em&gt;: ricerca nell’history dei comandi.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La selezione con il mouse, una volta completata, copia direttamente negli appunti: una finezza molto utile. &lt;/p&gt;

&lt;p&gt;Altre caratteristiche:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supporto al &lt;strong&gt;copia e incolla da tastiera&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Sono disponibili comandi unix del tipo ls, mv, cp, grep, cat (&lt;a href="http://mally.stanford.edu/~sr/computing/basic-unix.html"&gt;comandi&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;L'utilizzo di segnali acustici nel testo permettere di ottenere delle notifiche nell'output.&lt;/li&gt;
&lt;li&gt;E’ possibile avviare una task (ad esempio la shell di PS) con privilegi di amministratore senza uscire da cmder.&lt;/li&gt;
&lt;li&gt;La configurazione dell’applicazione, sia nell’aspetto sia nelle funzionalità, è facilmente modificabile e condivisibile essendo salvata nelle cartelle dell’applicazione.&lt;/li&gt;
&lt;li&gt;E' possibile avviare cmder con alcune opzioni, tra cui -k "command", che permettere di avviare il tool, eseguire il comando indicato e lasciare aperta la console.&lt;/li&gt;
&lt;li&gt;E' possibile cambiare il Code Page (di default è ANSI)&lt;/li&gt;
&lt;li&gt;E’ possibile includere nel menu di contesto del file explorer la voce “&lt;strong&gt;Cmder here&lt;/strong&gt;” semplicemente eseguendo come amministratore il comando &lt;em&gt;cmder.exe /REGISTER ALL&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Perché preoccuparsi della linea di comando? Naturalmente &lt;a href="http://www.fulviogabana.it/blog/"&gt;PowerShell&lt;/a&gt; ha migliorato decisamente l'approccio a linea di comandi in Windows, ma &lt;em&gt;cmder&lt;/em&gt; permette di combinare un insieme di strumenti in un'unica console e di utilizzare comandi tipici di altri sistemi come quelle presenti nei sistemi unix like. &lt;/p&gt;
</description><pubDate>Sat, 30 May 2015 21:55:00 GMT</pubDate><guid isPermaLink="true">http://www.fulviogabana.it:80/blog/2015/05/lunga-vita-alla-linea-di-comando</guid></item><item><title>I database noSQL</title><link>http://www.fulviogabana.it:80/data/i-database-nosql</link><description>&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Data/DataLogo.png" alt="_Logo"&gt; I database &lt;strong&gt;noSQL&lt;/strong&gt; sono una famiglia di database che comprende sistemi molto diversi tra loro. Ciò che definisce queste diverse tipologie una famiglia è in generale l’&lt;strong&gt;assenza di schemi rigidi e di relazioni&lt;/strong&gt;. Sono nati per coprire le mancanze dei database classici in un’ottica in cui la scalabilità è un requisito fondamentale.&lt;/p&gt;

&lt;p&gt;In realtà i database noSQL si sono poi evoluti per affrontare molte altre sfide e adesso ne esistono decine con molte caratteristiche e una vasta gamma di opzioni che ne aumentano l'appetibilità. &lt;/p&gt;

&lt;p&gt;Scrivere applicazioni web e cloud implica dover affrontare i problemi legati alla rete e ad un volume dati/richieste molto elevato. Da qui la necessità di &lt;strong&gt;scalare orizzontalmente&lt;/strong&gt; e, come discusso nell’articolo dedicato al &lt;a href="http://www.fulviogabana.it/data/il-teorema-cap"&gt;teorema CAP&lt;/a&gt;, la scalabilità implica scegliere tra coerenza dei dati e disponibilità del sistema. Questo ha portato le soluzioni noSQL ad abbondonare concetti come transazioni e relazioni: garantire entrambe in un database distribuito è improponibile se si vuole offrire la massima risposta.&lt;/p&gt;

&lt;p&gt;Un altro problema affrontato dal movimento noSQL riguarda la &lt;strong&gt;rigidità degli schemi dati&lt;/strong&gt; dei database tradizionali. Ad esempio, le entità cosiddette &lt;em&gt;social&lt;/em&gt;, come &lt;em&gt;friends&lt;/em&gt;, &lt;em&gt;follower&lt;/em&gt; e &lt;em&gt;comment&lt;/em&gt; sono tipici esempi di &lt;strong&gt;polimorfismo delle entità&lt;/strong&gt;. Tale problematica è affrontabile anche con database relazionali, si pensi ad esempio alle colonne XML, ma essendo &lt;em&gt;by design&lt;/em&gt; nei database noSQL la flessibilità e l’efficienza risultano migliori. &lt;/p&gt;

&lt;p&gt;La &lt;strong&gt;mancanza di schemi&lt;/strong&gt; permettere di &lt;strong&gt;velocizzare lo sviluppo&lt;/strong&gt; e questo ben si adatta alle moderne &lt;strong&gt;metodologie agili&lt;/strong&gt;. Infatti, da un punto di vista &lt;strong&gt;object oriented&lt;/strong&gt;, c'è una sfasatura tra le strutture del linguaggio e quelle del database (il cosiddetto &lt;strong&gt;impedance mismatch&lt;/strong&gt;), mentre in noSQL è possibile una mappatura diretta. Certamente gli ORM semplificano l’utilizzo dei database relazionali, ma si è sempre vincolati dalla classica struttura tabelle/relazioni.&lt;/p&gt;

&lt;p&gt;Fondamentalmente l'architettura dei database noSQL è un'architettura &lt;strong&gt;key/value&lt;/strong&gt;: ad una chiave si associa un valore. Una struttura semplice che però diventa molto flessibile e efficiente: il recupero tramite chiave è rapidissimo e la chiave e i valori possono essere di tipi diversi come primitivi, documenti, array e hash. &lt;/p&gt;

&lt;p&gt;Questo è una rappresentazione valida di un &lt;strong&gt;documento&lt;/strong&gt; memorizzabile con un singolo comando in &lt;a href="http://www.fulviogabana.it/data"&gt;MongoDB&lt;/a&gt;:&lt;/p&gt;

&lt;script src="https://gist.github.com/fulviogabana/28c0f834ce1771da0fb7.js"&gt;&lt;/script&gt;

&lt;p&gt;Ecco cosa si intende per schema non rigido: in un insieme (un contenitore di dati) possono coesistere dati con strutture diverse. &lt;strong&gt;Non c'è una rappresentazione rigida come quella tipica basata sulle righe e colonne&lt;/strong&gt;. Ecco quindi che nello stesso insieme in cui è presente la scheda di John Doe possiamo memorizzare il suo omonimo italiano:&lt;/p&gt;

&lt;script src="https://gist.github.com/fulviogabana/fe516d913e7f8463c3e0.js"&gt;&lt;/script&gt;    

&lt;p&gt;I database noSQL possono essere di tipologie molto diverse in relazione ai casi d'uso che devono affrontare: si va da database super scalabili per la gestione di volumi enormi di dati a database specializzati alla gestione dei dati in memoria. Tante sono le &lt;a href="http://www.fulviogabana.it/data"&gt;caratteristiche dei database&lt;/a&gt; e ogni database offre molte opzioni per adeguarsi alle esigenze dell’applicazione.&lt;/p&gt;

&lt;p&gt;In vari casi un database noSQL permette di evitare la gestione delle relazioni, la cancellazione a cascata e pesanti lock. In un database &lt;em&gt;document-ordiented&lt;/em&gt; è possibile ad esempio includere in un documento eventuali sotto documenti (come &lt;em&gt;Address&lt;/em&gt; negli esempi precedenti). E' possibile ma non è sempre opportuno: dipende dal ciclo di vita di questi sotto oggetti (in pratica bisogna chiedersi quando vengono caricati e salvati: se sono entità indipendenti).&lt;/p&gt;

&lt;p&gt;I tipici &lt;em&gt;documenti&lt;/em&gt; gestibili efficientemente da database noSQL, oltre alle entità social, sono le configurazioni, gli indirizzi, le note, le schede prodotto. Perché? Perché se la struttura di questi oggetti cambia non è necessario migrare i dati esistenti e l’impatto sul codice è relativamente basso.&lt;/p&gt;

&lt;p&gt;La struttura che si ottiene è più flessibile e permette di arricchire il proprio data model con funzionalità aggiuntive che altrimenti richiederebbero più passaggi. Se un &lt;em&gt;ordine&lt;/em&gt; include già le righe dei prodotti allora l'ordine può esporre una proprietà per il calcolo del totale.&lt;/p&gt;

&lt;p&gt;C'è un altro aspetto interessante delle tecnologie noSQL: una diversa prospettiva nel design dell’applicativo. Non è detto che un database noSQL sia la scelta più giusta per il proprio progetto, ma spesso permette di svincolarsi dalla rigidità dei database tradizionali che limitano il design. Ancora oggi molti sviluppatori sono troppo &lt;strong&gt;data-centric&lt;/strong&gt;: definiscono l'applicazione partendo dal design delle tabelle e delle relazioni. &lt;/p&gt;

&lt;p&gt;Un aspetto importante delle tecnologie noSQL riguarda proprio il fatto che è &lt;strong&gt;lo storage ad adeguarsi alle nostre strutture dati e non viceversa&lt;/strong&gt;. Con i database noSQL lo storage diventa uno strumento al servizio dello sviluppatore e non un vincolo. &lt;/p&gt;

&lt;p&gt;La mancanza di relazioni significa niente normalizzazione delle tabelle, niente chiavi esterne, niente Join. E i dati sono spesso trattati in task &lt;strong&gt;non transazionali&lt;/strong&gt;: la modifica è atomica per singoli elementi/documenti, ma non è garantita l’atomicità di un processo che coinvolge più elementi/documenti. Se per un catalogo di prodotti non vi sono particolari problemi, per un processo di vendita non è possibile non garantire l’aggiornamento complessivo del conto cliente e del magazzino.&lt;/p&gt;

&lt;p&gt;Tanti sono gli aspetti del mondo noSQL. Ad esempio, il cosiddetto &lt;strong&gt;Eventual consistency&lt;/strong&gt;, indica come vengono gestite le azioni di modifica richieste da un client. Per poter offrire disponibilità e scalabilità  un database noSQL potrebbe richiedere un attesa sull'esecuzione delle modifiche sul cluster corrente (si parla di &lt;strong&gt;durabilità&lt;/strong&gt;) e tra cluster secondari (si parla di &lt;strong&gt;replicazione&lt;/strong&gt;). In pratica si dice al server voglio salvare questo oggetto e non si aspetta alcun processo completo: non solo che il data sia replicato ma alle volte anche che sia stato effettivamente salvato su disco.&lt;/p&gt;

&lt;p&gt;Cambiano anche i metodi di interrogazione: non a caso si parla di "no SQL". Le query non sono dichiarative ma si scrivono come codice procedurale, tramite un paradigma imperativo. Il chiamate dice esattamente come devono essere trattati i dati e non solo cosa vuole ottenere. Ma questo, come tanti altri aspetti, dipende dal database in uso. Nella &lt;a href="http://www.fulviogabana.it/data"&gt;sezione Data&lt;/a&gt; sono disponibili le panoramiche ai database noSQL più diffusi e interessanti.&lt;/p&gt;
</description><pubDate>Wed, 27 May 2015 22:00:46 GMT</pubDate><guid isPermaLink="true">http://www.fulviogabana.it:80/data/i-database-nosql</guid></item><item><title>DigitalOcean: VPS e Linux a portata di mano</title><link>http://www.fulviogabana.it:80/blog/2015/05/digitalocean-vps-e-linux-a-portata-di-mano</link><description>&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/DigitalOcean/DigitalOceanLogo.png" alt="_Logo"&gt; Grazie alle molte piattaforme cloud nate negli ultimi anni gli sviluppatori hanno a disposizione tanti strumenti per il test e la prototipazione. &lt;a href="https://www.digitalocean.com/?refcode=1877404f971b"&gt;DigitalOcean&lt;/a&gt; è un provider di &lt;strong&gt;Virtual Private Server&lt;/strong&gt; con sede a New York che offre a prezzi contenuti server con sistemi &lt;em&gt;Linux&lt;/em&gt;, attivabili in meno di un minuto.&lt;/p&gt;

&lt;p&gt;Il processo di &lt;a href="https://www.digitalocean.com/?refcode=1877404f971b"&gt;registrazione&lt;/a&gt; è semplice e veloce, ma &lt;strong&gt;è necessario fornire una carta di credito o versare 5$ tramite PayPal&lt;/strong&gt;. Con una breve ricerca in Internet è anche possibile trovare un coupon per ottenere un credito di almeno 10$ (personalmente ho usato il codice &lt;em&gt;ALLSSD10&lt;/em&gt;) o farsi referenziare da qualcuno per ottenere un credito di benvenuto sempre di 10$ (se avete bisogno inviatemi una &lt;a href="http://www.fulviogabana.it/modulo-mail"&gt;mail&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In pochi minuti si può creare un server virtuale&lt;/strong&gt; con sistema operativo &lt;em&gt;Ubuntu&lt;/em&gt;, utile per lo sviluppo e la prototipazione di applicazioni che richiedono servizi installabili solo su piattaforme &lt;em&gt;*nix&lt;/em&gt; o che è meglio testare anche sul sistema del pinguino. Per un paio di ore il costo non arriva nemmeno ad un euro. Interessante è anche la possibilità di provare applicativi .NET tramite Mono, senza dover installare nulla in casa.&lt;/p&gt;

&lt;p&gt;Tra le distribuzioni disponibili: &lt;strong&gt;Ubuntu, Debian, Fedora, CoreOS, FreeBSD, CentOS&lt;/strong&gt;. Tutti i piani includono dischi &lt;strong&gt;SSD&lt;/strong&gt;. Il pagamento è orario e i prezzi relativamente bassi: il &lt;strong&gt;profilo più economico costa 5$ al mese&lt;/strong&gt; offre un server con 512 MB di RAM, 20 GB SSD, 1 CPU e una banda di trasferimento di 1 TB. Il costo è comunque orario e &lt;strong&gt;un'ora costa effettivamente $0.0074&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Per fare un semplice paragone, l’offerta più bassa disponibile in Azure costa più del doppio. Certamente Azure è ben altra cosa con la sua molteplicità di servizi, ma la &lt;strong&gt;specializzazione di DigitalOcean ha prodotto un servizio molto professionale&lt;/strong&gt;: lo si può notare consultando la knowledgebase, ricca di guide e tutorial, con tanto materiale anche per chi è alle prime armi con sistemi linux e server virtuali.&lt;/p&gt;

&lt;p&gt;Il piano tariffario è chiaro e scalabile in base alle proprie esigenze. Le prestazioni buone e il pannello di controllo semplice ed intuitivo. Qui i server virtuali sono definiti &lt;strong&gt;droplet&lt;/strong&gt;. E’ disponibile un backup manuale tramite snapshot oppure un backup automatico tramite una procedura che viene avviata ogni due giorni. Entrambi i backup possono essere riutilizzati per creare nuovi droplet. &lt;/p&gt;

&lt;p&gt;Altri importanti aspetti: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;E’ possibile configurare il DNS della macchine come indicato da questa semplice &lt;a href="https://www.digitalocean.com/community/tutorials/how-to-set-up-a-host-name-with-digitalocean"&gt;guida&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;E’ disponibile un’API pubblica che mette a disposizione le stese funzionalità del pannello di controllo.&lt;/li&gt;
&lt;li&gt;Per la sicurezza è possibile abilitare una chiave SSH.&lt;/li&gt;
&lt;li&gt;Attenzione al fatto che spegnere un server non significa non spendere: bisogna creare uno snapshot e quindi distruggere il droplet.&lt;/li&gt;
&lt;li&gt;Di default non è attivo alcun firewall che è consigliato configurare nel proprio server.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Creare un Droplet con MongoDB&lt;/h2&gt;

&lt;p&gt;Vediamo come creare un macchina Ubuntu per attivare un server &lt;a href="http://www.fulviogabana.it/data/introduzione-a-mongodb"&gt;MongoDB&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/DigitalOcean/DigitalOceanSizes.png" alt="Create a Droplet"&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dopo la registrazione avviare la procedura di creazione Droplet.&lt;/li&gt;
&lt;li&gt;Indicare il nome del server e quindi selezionare una delle grandezze.&lt;/li&gt;
&lt;li&gt;Selezionare la regione (tra cui Amsterdam, Francoforte e Londra)&lt;/li&gt;
&lt;li&gt;Attivare varie opzioni (provate networking, IPv6 e Backups)&lt;/li&gt;
&lt;li&gt;Selezionare l’immagine del sistema da installare (e la versione specifica: nel mio caso Ubuntu 14.04 x64).&lt;/li&gt;
&lt;li&gt;Selezionare le applicazioni da installare (nel nostro esempio MongoDB, ma ve ne sono 24 tra cui Cassandra, Ruby on Rails, WordPress, Docker).&lt;/li&gt;
&lt;li&gt;Avviare la creazione: in 90 secondi la macchina è pronta.&lt;/li&gt;
&lt;li&gt;Per questa demo non utilizzerò una chiave &lt;a href="https://cloud.digitalocean.com/droplets/new#add-key"&gt;SSH&lt;/a&gt; ma per altri usi è consigliata.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/DigitalOcean/DigitalOceanServer.png" alt="Droplet Created"&gt;&lt;/p&gt;

&lt;p&gt;Sempre da pannello di controllo è possibile avviare la console tramite VNC: l’IP e l’account per accedere arriveranno via e-mail in un paio di minuti. In Windows è meglio utilizzare &lt;a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html"&gt;PuTTY&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/DigitalOcean/PuTTY.png" alt="PuTTY"&gt;&lt;/p&gt;

&lt;p&gt;E’ naturalmente consigliato creare un nuovo utente e non utilizzare l’utente root,: questo obbliga a inserire &lt;em&gt;sudo&lt;/em&gt; prima di ogni comando amministrativo. Qui la &lt;a href="https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-12-04"&gt;guida&lt;/a&gt; per creare un nuovo utente, assegnargli diritti root e abilitare SSH.&lt;/p&gt;

&lt;p&gt;Avendo scelto l’installazione di &lt;em&gt;MongoDB&lt;/em&gt; in fase di creazione non è necessario fare nulla di particolare: il servizio di MongoDB è già attivo. Infatti, è sufficiente avviare la shell &lt;em&gt;mongo&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/DigitalOcean/MongoShell.png" alt="Mongo Shell"&gt;    &lt;/p&gt;

&lt;p&gt;Per &lt;strong&gt;accedere in remoto&lt;/strong&gt;, ad esempio dalla propria macchina dove presumibilmente vi è un po’ di codice per utilizzare Mongo, è necessario abilitare l’accesso tramite internet nella configurazione di MongoDB, memorizzata nel file &lt;em&gt;/etc/mongod.conf&lt;/em&gt;. Con l’editor di testo predefinito modificare tale file:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;vi /etc/mongod.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Cercare il valore di &lt;em&gt;bind_ip&lt;/em&gt; e sostituire all’indirizzo locale predefinito (127.0.0.1) l’indirizzo del server:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/DigitalOcean/MongoConf.png" alt="Mongo Conf"&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Usare vi&lt;/strong&gt;: dopo aver avviato &lt;strong&gt;vi&lt;/strong&gt; attivare l’inserimento del testo premendo il tasto &lt;em&gt;Ins&lt;/em&gt;. Sostituire l’ip locale (per incollare da clipboard premere il tasto destro del mouse), quindi uscire dalla modalità inserimento premendo ESC, infine digitare “:wq” (modalità comando a cui si passa write e quit). Se si vuole uscire senza salvare le modifiche usare q!.&lt;/p&gt;

&lt;p&gt;Per rendere effettive le modifiche è necessario riavviare il daemon:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo service mongod stop
sudo service mongod start
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Per arrestare il server e poter creare uno snapshot scrivere:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo shutdown -h now
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Non dimenticate di distruggere la macchina se non la utilizzate! A proposito, ecco qui il costo del server utilizzato per più di un'ora:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/DigitalOcean/DigitalOceanInvoice.png" alt="Real Cost"&gt;&lt;/p&gt;

&lt;h2&gt;Conclusione&lt;/h2&gt;

&lt;p&gt;Naturalmente avviare una macchina Linux per installare un database non è un'operazione così difficile e non è nemmeno richiesto ad uno sviluppatore di diventare un sistemista, ma poter utilizzare strumenti semplici e veloci come quelli offerti da &lt;a href="https://www.digitalocean.com/?refcode=1877404f971b"&gt;DigitalOcean&lt;/a&gt; può essere di grande aiuto. &lt;/p&gt;

&lt;p&gt;Per i progetti reali bisogno poi affidarsi ad un team più ampio e multiforme, proprio per poter meglio sfruttare le caratteristiche che la tali strumenti offrono: tra l’altro le offerte disponibili sono molto flessibili e scalabili.&lt;/p&gt;
</description><pubDate>Thu, 14 May 2015 21:39:00 GMT</pubDate><guid isPermaLink="true">http://www.fulviogabana.it:80/blog/2015/05/digitalocean-vps-e-linux-a-portata-di-mano</guid></item><item><title>Il teorema CAP</title><link>http://www.fulviogabana.it:80/Data/il-teorema-cap</link><description>&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Data/CAPLogo.png" alt="_Logo"&gt; Il &lt;a href="http://en.wikipedia.org/wiki/CAP_theorem"&gt;teorema CAP&lt;/a&gt; afferma che un sistema informatico distribuito, quindi anche un &lt;strong&gt;database distribuito&lt;/strong&gt;, non può soddisfare contemporaneamente le tre garanzie &lt;strong&gt;coerenza&lt;/strong&gt;, &lt;strong&gt;disponibilità&lt;/strong&gt; e &lt;strong&gt;tolleranza al partizionamento&lt;/strong&gt;. Il problema riguarda l’&lt;strong&gt;instabilità della rete&lt;/strong&gt; che collega i diversi &lt;strong&gt;nodi del sistema&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Per sistema distribuito si intende &lt;strong&gt;un sistema suddiviso in più nodi&lt;/strong&gt; (server) in una rete di grandi dimensioni, eventualmente globale. Tale distribuzione consente di non affidare ad un unico server la stabilità del sistema e consente di suddividere i carichi di lavoro. &lt;/p&gt;

&lt;p&gt;E’ una &lt;strong&gt;configurazione tipica del cloud&lt;/strong&gt;: più server soddisfano le tante richieste e la &lt;em&gt;rottura&lt;/em&gt; di un server non implica la caduta dell’intero sistema. Inoltre, nel contesto di reti di grandi dimensioni, avere più nodi consente di avvinarsi ai client riducendo i tempi di risposta.   &lt;/p&gt;

&lt;p&gt;Nel &lt;a href="http://www.fulviogabana.it/data/il-mondo-dei-database"&gt;mondo dei database&lt;/a&gt; si ha un partizionamento per suddividere i carichi di lavoro, per avvicinare la fonte dati ai client e per mantenere più copie dei dati. In generale una replica viene definita come primaria e ogni scrittura su quel nodo viene propagata alle altre partizioni.&lt;/p&gt;

&lt;p&gt;Per coerenza (&lt;strong&gt;consistency&lt;/strong&gt;) di intende la capacità del sistema di poter rendere disponibili i dati più aggiornati a qualsiasi client che ne faccia richiesta, indipendentemente dal nodo a cui la richiesta è stata fatta. In pratica un’operazione di modifica è completa quando ogni nodo è stato aggiornato e durante questa operazione la lettura è sospesa.&lt;/p&gt;

&lt;p&gt;La disponibilità (&lt;strong&gt;availablility&lt;/strong&gt;) garantisce che il sistema sia in grado di rispondere ad una chiamata, in particolare un client potrà aggiornare i dati senza ritardi, anche in presenza di errori di comunicazione tra le repliche. Il client invia la sua richiesta di aggiornamento senza attesa e quindi successive letture potrebbero ritornare dati non coerenti per la lentezza della propagazione o per errori nel sistema o per ritardi nell’effettivo salvataggio dei dati.&lt;/p&gt;

&lt;p&gt;La tolleranza di partizione (&lt;strong&gt;tollerance partion&lt;/strong&gt;) garantisce che il sistema rimanga funzionante nonostante la perdita di messaggi: in questi casi alcuni nodi possono rimanere isolati dagli altri e non avere più informazioni aggiornate (sono partizionati). &lt;/p&gt;

&lt;p&gt;Il teorema afferma che non è possibile soddisfare contemporaneamente le tre garanzie, ma bisogna sceglierne due a discapito di quella esclusa. La regola è tanto più importante quanto la rete diventa meno affidabile e la comunicazione tra le partizioni del sistema diventano un problema. &lt;strong&gt;La questione è: offrire il più alto grado di disponibilità oppure di coerenza dei dati?&lt;/strong&gt; Dipende dal tipo di applicazione.  &lt;/p&gt;

&lt;p&gt;Coerenza significa che una scrittura viene accettata se replicata ovunque senza errori, quindi una modifica può essere rifiutata perché la propagazione è fallita anche su un singolo nodo. Disponibilità significa accettare una scrittura ancor prima che venga propagata, quindi è possibile che quella modifica non sia (immediatamente) disponibile e addirittura che non sia mai disponibile. Comunque, la maggior parte dei database permette di configurare il grado di garanzia offerto. &lt;/p&gt;

&lt;p&gt;Ad esempio, in &lt;a href="http://www.fulviogabana.it/data/introduzione-a-mongodb"&gt;MongoDB&lt;/a&gt;, questa configurazione può essere fatta per l’intero sistema, per un certo database, per una certa collezione di dati o per una singola operazione. &lt;/p&gt;

&lt;p&gt;E’ comunque importante capire che non è possibile ottenere contemporaneamente massima disponibilità e massima coerenza. Sebbene questo valga in un sistema distribuito, i concetti descritti sono comunque utili in diversi contesti. Bisonga inoltre dire che l’affidabilità delle reti è sempre maggiore, così come la disponibilità di strumenti la cui combinazione permette di gestire opportunamente gli errori (ad esempio utilizzando le code di messaggi).&lt;/p&gt;

&lt;p&gt;E’ certamente un discorso che riguarda la scalabilità: se voglio garantire la massima consistenza e la massima disponibilità allora un singolo processore è la scelta da considerare e la &lt;strong&gt;scalabilità sarà verticale&lt;/strong&gt; (le capacità del singolo server vengono aumentate). Se la scalabilità verticale non è possibile o non adeguata al sistema, allora la &lt;strong&gt;scalabilità orizzontale&lt;/strong&gt; (con l’aggiunta di più server al sistema) deve fare i conti con il teorema CAP.&lt;/p&gt;

&lt;p&gt;In generale, abbiamo da una parte i sistemi di database relazionali (&lt;strong&gt;RDBMS&lt;/strong&gt;) che garantiscono disponibilità e coerenza, e dall’altra le diverse tipologie di database &lt;strong&gt;noSQL&lt;/strong&gt; che &lt;em&gt;coprono&lt;/em&gt; le altre due casistiche. In realtà i database noSQL possono essere configurati in base alle esigenze e database come CouchDB, Neo4j e MongoDB possono garantire coerenza dei dati (ovviamente a scapito delle altre caratteristiche).&lt;/p&gt;

&lt;p&gt;La combinazione di queste garanzie nell’ambito dei database è ben esprimibile da questo schema:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Data/CAP.png" alt="CAP Schema"&gt;&lt;/p&gt;

&lt;p&gt;Abbiamo quindi le seguenti combinazioni:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CP: coerenza e tolleranza di partizione, come in MongoDB, HBase, BigTable.&lt;/li&gt;
&lt;li&gt;AP: disponibilità e tolleranza di partizione come in CouchDB, Riak, Cassandra.&lt;/li&gt;
&lt;li&gt;CA: coerenza e disponibilità, come nei RDBMS in cui il sistema non è distribuito.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Considerando un sistema distribuito rimane quindi da &lt;strong&gt;scegliere cosa sacrificare&lt;/strong&gt;: la consistenza o la disponibilità. Sostanzialmente se devo garantire la consistenza è possibile che in un dato momento un'informazione non sia disponibile perché è in aggiornamento e tale aggiornamento implica l'aggiornamento di tutti i nodi del sistema. All'inverso, se devo garantire una rapida risposta non posso bloccare il sistema in caso di scrittura: quindi parte dei dati messi a disposizione dei client potrebbero non essere coerenti. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Il cosa sacrificare dipende dal tipo di applicazione&lt;/strong&gt;: se devo gestire i commenti in un sito di social network, il fatto che alcuni utenti non visualizzino i commenti più recenti non ha molta importanza. Se invece devo gestire il magazzino di un e-commerce è fondamentale che lo stato dei prodotti sia sempre aggiornato.&lt;/p&gt;

&lt;p&gt;Come detto se si vuole la massima consistenza allora la disponibilità viene meno, ma se si vuole la massima disponibilità la consistenza non è garantita. Si parla di &lt;strong&gt;eventual consistency&lt;/strong&gt; (nel senso di non immediata): ogni nodo del mio sistema è disponibile a rispondere ad una richiesta ma i dati che espone non è detto che sia aggiornati, perché la propagazione dei dati è lenta. D’altra parte la scrittura dei nuovi dati non ha bloccato l'intero sistema che può reagire alle richieste velocemente.&lt;/p&gt;

&lt;p&gt;Un classico esempio di sistema distribuito è il DNS che mappa gli indirizzi IP con i domini: la propagazione di una modifica può impiegare diverso tempo, ma sostanzialmente il sistema risponde comunque ai client e ad ogni istante le informazioni sono sempre più coerenti tra loro.&lt;/p&gt;
</description><pubDate>Wed, 13 May 2015 19:31:41 GMT</pubDate><guid isPermaLink="true">http://www.fulviogabana.it:80/Data/il-teorema-cap</guid></item><item><title>Stack Overflow Developer Survey 2015</title><link>http://www.fulviogabana.it:80/blog/2015/05/stack-overflow-developer-survey-2015</link><description>&lt;p&gt;&lt;img src="http://www.fulviogabana.it/Media/FulvioGabana/Blog/Stuff/StackOverflow.png" alt="_Logo"&gt; I risultati del sondaggio proposto da &lt;a href="http://stackoverflow.com/research/developer-survey-2015"&gt;Stack Overflow&lt;/a&gt; offrono diversi spunti per alcune considerazioni sullo sviluppo software e sulle molte comunità che permettono un continuo, prolifico e utile scambio di informazioni e opinioni. In questo post riepilogo i risultati che mi sono parsi più interessanti.&lt;/p&gt;

&lt;p&gt;Partiamo dalla fonte: più di &lt;strong&gt;26.000 persone&lt;/strong&gt; da &lt;strong&gt;157 paesi&lt;/strong&gt;, con un’età media di &lt;strong&gt;28,9 anni&lt;/strong&gt;. &lt;strong&gt;92% maschi&lt;/strong&gt;. Ma i numeri di &lt;a href="http://stackoverflow.com"&gt;StackOverflow&lt;/a&gt; sono ben maggiori: più di &lt;strong&gt;30 milioni di visitatori ogni mese&lt;/strong&gt;, di cui 25 milioni di ritorno. La media di visite per ogni visitatore è di circa 6 volte al mese: confesso che avrei giurato per una media giornaliera… e infatti due terzi visitano il sito più volte al giorno.&lt;/p&gt;

&lt;p&gt;Mi sorprende che &lt;strong&gt;solo il 25% degli sviluppatori abbia una esperienza di più di 10 anni&lt;/strong&gt;. Forse molti sviluppatori si occupano di tecnologie non attive nelle comunità… oppure il numero di sviluppatori è aumentato esponenzialmente negli ultimi anni. &lt;/p&gt;

&lt;p&gt;Comunque, è più interessante notare che &lt;strong&gt;quasi la metà dei miei colleghi non è laureata&lt;/strong&gt;. Parte della formazione viene fatta al lavoro e come auto didatta… in quest’ultimo caso penso sia fondamentale la &lt;strong&gt;passione per il lavoro che si fa&lt;/strong&gt;: non a casa circa il 70% degli intervistati spende (o investe…) almeno 2 ore alla settimana per progetti open source o per hobby. La media è di &lt;strong&gt;un impegno di circa 7 ore extra-lavorative settimanali&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Naturalmente &lt;strong&gt;il linguaggio più popolare è Javascript&lt;/strong&gt;, mentre &lt;strong&gt;la parte server è dominio di Java&lt;/strong&gt; (il C# ha una popolarità del 30%). &lt;/p&gt;

&lt;p&gt;Sempre considerando gli intervistati, &lt;strong&gt;Windows è il sistema operativo più diffuso&lt;/strong&gt; e iOS sembra aver superato Linux: immagino per il grande contributo dato dallo sviluppo App per iPhone e iPad.&lt;/p&gt;

&lt;p&gt;I cosiddetti &lt;a href="http://www.fulviogabana.it/coding"&gt;full-stack developers&lt;/a&gt; utilizzano come editor testuali &lt;strong&gt;Notepad++&lt;/strong&gt; e &lt;strong&gt;Sublime Text&lt;/strong&gt;, che invece vengono usati singolarmente e rispettivamente da sviluppatori desktop e sviluppatori web front-end. &lt;strong&gt;Vim&lt;/strong&gt; domina tra i DevOps e i Sys admins.&lt;/p&gt;

&lt;p&gt;Gli strumenti di &lt;strong&gt;Source Control&lt;/strong&gt; sono ormai uno standard ma ben il 10% degli intervistati non ne fa uso. Cosa alquanto strana considerando i tanti vantaggi e la facilità d’uso che i moderni strumenti offrono, anche online e gratuitamente. Comunque, &lt;strong&gt;Git copre il 70%&lt;/strong&gt;, seguito da &lt;strong&gt;SVN con il 37% (!)&lt;/strong&gt; e &lt;strong&gt;TFS con il 12%&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;La lunga e sanguinosa diatriba sull’&lt;strong&gt;uso degli spazi o delle tabulazioni&lt;/strong&gt; vede vincere questi ultimi. Ma non è un caso che all’aumentare dell’esperienza e della reputazione (su &lt;em&gt;StackOverflow&lt;/em&gt;), gli utenti preferiscono gli spazi 3 volte su 1.&lt;/p&gt;

&lt;p&gt;Poco meno del 10% di chi ha indicato l’area di attività si è definito &lt;strong&gt;sviluppatore mobile&lt;/strong&gt;. La maggior parte per Android e quindi alternativamente per iOS, mentre un 20% non ha un’unica piattaforma di riferimento. Windows Phone è al 2%.&lt;/p&gt;

&lt;p&gt;Per quanto riguarda gli &lt;strong&gt;stipendi medi si assiste a un dimezzamento progressivo&lt;/strong&gt; dagli Stati Uniti all’Europa Occidentale e quindi all’Europa Orientale. Ad aumentare di molto lo stipendio sono le &lt;strong&gt;tecnologie emergenti e di nicchia&lt;/strong&gt;, oppure il &lt;strong&gt;cloud computing e i big data&lt;/strong&gt;. Pare quindi che essere specializzati in certe tecnologie porti notevoli vantaggi: sarà per la minor concorrenza, sarà per le particolari doti necessarie per approfondire certe tematiche, sempre e comunque mantenendo competenze necessariamente ampie. Tra le tecnologie più pagate: Cassandra, Spark, F#, Scala, Rust, Hadoop, Cloud, Redis, Go e Clojure.&lt;/p&gt;

&lt;p&gt;Ecco quindi la cosa più interessante, che in parte giustifica, soprattutto dall’altra parte dell’atlantico, l’impegno di molti sviluppatori nelle comunità e in particolare su StackOverflow: pare che &lt;strong&gt;all’aumentare della reputazione, per i punteggi ricevuti in base alle domande e alle risposte, aumenti anche lo stipendio in modo progressivo fino a un 135% rispetto al salario medio&lt;/strong&gt;. Non so dire se ciò valga anche per l’Italia…&lt;/p&gt;

&lt;p&gt;Si è inoltre assistito ad &lt;strong&gt;un aumento del lavoro remoto&lt;/strong&gt;: dal 21% dell’anno scorso al 29% di quest’anno. Inoltre, gli sviluppatori con reputazioni oltre i 5.000 punti indicano, con percentuali doppie rispetto agli altri sviluppatori, che il lavoro remoto non è negoziabile.&lt;/p&gt;

&lt;p&gt;In generale gli utenti di StackOverflow sono soddisfatti degli aiuti ricevuti dagli altri utenti: l’&lt;strong&gt;86% hanno trovato la piattaforma utile&lt;/strong&gt;. Aggiungerei anche indispensabile.&lt;/p&gt;
</description><pubDate>Tue, 12 May 2015 23:21:00 GMT</pubDate><guid isPermaLink="true">http://www.fulviogabana.it:80/blog/2015/05/stack-overflow-developer-survey-2015</guid></item></channel></rss>