<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://dotnetlombardia.org/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US"><title type="html">Antonio Esposito</title><subtitle type="html">è come mischiare la lana con la pecora</subtitle><id>http://dotnetlombardia.org/b/tonyexpo/atom.aspx</id><link rel="alternate" type="text/html" href="http://dotnetlombardia.org/b/tonyexpo/default.aspx" /><link rel="self" type="application/atom+xml" href="http://dotnetlombardia.org/b/tonyexpo/atom.aspx" /><generator uri="http://telligent.com" version="5.6.582.12810">Community Server</generator><updated>2012-11-21T13:21:00Z</updated><entry><title>Thin client... ci siamo quasi</title><link rel="alternate" type="text/html" href="/b/tonyexpo/archive/2013/04/09/thin-client-ci-siamo-quasi.aspx" /><id>/b/tonyexpo/archive/2013/04/09/thin-client-ci-siamo-quasi.aspx</id><published>2013-04-09T13:52:22Z</published><updated>2013-04-09T13:52:22Z</updated><content type="html">&lt;p&gt;Ciao a tutti&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Lo so, sono anni che si &amp;egrave; abbandonato lo scenario client-server in ottica di un mondo distribuito (non parlo di programmazione)&lt;br /&gt;Una volta i main-frame, oggi i PC, ad ognuno il suo... che peccato per&amp;ograve;! CPU a 4, 6 e 8 core, 24GB di ram, per una persona sola che magari ci va sul web....&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Abbiamo la virtualizzazione (IaaS)&lt;/p&gt;
&lt;p&gt;Abbiamo Terminal Services accessibile da RDP (remote desktop)&lt;/p&gt;
&lt;p&gt;Abbiamo l&amp;#39;hardware (cloud?!?!)&lt;/p&gt;
&lt;p&gt;Abbiamo i dongle con sopra Android (&lt;a href="http://android.hdblog.it/2013/03/08/cloudnetgo-cr9-mini-pc-android-quad-core-in-formato-chiavetta/"&gt;http://android.hdblog.it/2013/03/08/cloudnetgo-cr9-mini-pc-android-quad-core-in-formato-chiavetta/&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Quindi manca solo la volont&amp;agrave; :)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Se mettiamo sul dongle un accesso password-free (tanto non serve sul client) per andare in RDP usando una wifi o una ethernet (negli uffici, aziende formazione, etc), connettiamo monitor HD in HDMI, con audio, tastiera e mouse USB, abbiamo il nostro &amp;quot;VERO&amp;quot;, per la prima volta nella storia, thin-client, per connetterci al nostro Terminal Server di gruppo&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Immaginiamo un&amp;#39;aula di formazione per un corso di programmazione, tiro su una VM sul cloud (privato o pubblico), 2CPU, 6GB RAM, poi una dozzina di dongle con le postazioni in aula, una fibra ottica da 10Mbit, e ho fatto tutto il mio lavoro!&lt;/p&gt;
&lt;p&gt;E&amp;#39; solo una questione di volont&amp;agrave;, spero che tra poco qualche produttore di dongle ne dia la possibilit&amp;agrave; di personalizzarle per questo scopo!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;a presto&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetlombardia.org/aggbug.aspx?PostID=846" width="1" height="1"&gt;</content><author><name>tonyexpo</name><uri>http://dotnetlombardia.org/members/tonyexpo/default.aspx</uri></author><category term="android" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/android/default.aspx" /><category term="client" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/client/default.aspx" /><category term="desktop" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/desktop/default.aspx" /><category term="dongle" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/dongle/default.aspx" /><category term="rdp" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/rdp/default.aspx" /><category term="remote" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/remote/default.aspx" /><category term="services" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/services/default.aspx" /><category term="smart" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/smart/default.aspx" /><category term="terminal" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/terminal/default.aspx" /><category term="thin" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/thin/default.aspx" /></entry><entry><title>[Legacy] 1994, Iomega Zip 100, 1997 Iomega Zip 250USB</title><link rel="alternate" type="text/html" href="/b/tonyexpo/archive/2013/03/18/legacy-1994-iomega-zip-100-1997-iomega-zip-250usb.aspx" /><id>/b/tonyexpo/archive/2013/03/18/legacy-1994-iomega-zip-100-1997-iomega-zip-250usb.aspx</id><published>2013-03-18T10:58:00Z</published><updated>2013-03-18T10:58:00Z</updated><content type="html">&lt;p&gt;ciao a tutti&lt;/p&gt;  &lt;p&gt;oggi sono di umore giusto per fare un nuovo post sul mondo Legacy &lt;img class="wlEmoticon wlEmoticon-smile" style="border-top-style:none;border-left-style:none;border-bottom-style:none;border-right-style:none;" alt="Sorriso" src="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/4863.wlEmoticon_2D00_smile_5F00_4B060BD8.png" /&gt;&lt;/p&gt;  &lt;p&gt;in pratica, quello relativo alle cose vecchiarelle, che per alcuni come me significa ricordare qualcosa, per altri significa nuovamente scoprire qualcosa di (non)nuovo&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;nello scorso post sui &lt;a href="http://dotnetlombardia.org/b/tonyexpo/archive/2013/03/03/legacy-come-usare-un-floppy-disk-da-1-44mb-da-ms-dos.aspx"&gt;Floppy Disk&lt;/a&gt; ho appunto parlato di come si usavano e come funzionano ancora oggi; ricordiamo che fino a Windows 2000 erano necessari per avviare il sistema perché il CD non faceva boot (almeno nelle prime versioni)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;oggi invece vi mostro come funziona lo Iomega Zip, storico drive da 100MB introdotto nella prima metà degli anni 90, che molti professionisti (si vede ancora in molti vecchi film) usavano per portarsi documenti a casa&lt;/p&gt;  &lt;p&gt;era/è un drive magnetico, quindi come i Floppy e come gli HD, a rotazione, esterno, con dischetto di plastica&lt;/p&gt;  &lt;p&gt;capacità iniziale 100MB; qualche anno dopo fu introdotta la versione USB (1996/1997), che portava anche il nuovo drive a nuove capacità: 250MB&lt;/p&gt;  &lt;p&gt;ricordiamo che il 1995 era anche l’anno dell’introduzione in massa dei CD-ROM, ovviamente con il conseguente uso dei CD-R/RW, che però avevano il problema di essere ottici, e quindi o write-once (CR-R), o altamente scomodi per un utente medio da usare al posto di un floppy (CD-RW)&lt;/p&gt;  &lt;p&gt;mancavano oltre 5 anni alle prime Pen-Drive USB, e quindi gli Zip (e un concorrente &lt;a href="http://en.wikipedia.org/wiki/SuperDisk"&gt;LS120&lt;/a&gt;) la facevano da padrone&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;ho rimediato su e-bay un drive Zip funzionante di tipo USB1.0 &lt;img class="wlEmoticon wlEmoticon-smile" style="border-top-style:none;border-left-style:none;border-bottom-style:none;border-right-style:none;" alt="Sorriso" src="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/4863.wlEmoticon_2D00_smile_5F00_4B060BD8.png" /&gt; ve lo mostro:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/1738.2013_2D00_03_2D00_18_2D00_12.57.04_5F00_62BD433E.jpg"&gt;&lt;img title="2013-03-18 12.57.04" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="2013-03-18 12.57.04" src="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/6683.2013_2D00_03_2D00_18_2D00_12.57.04_5F00_thumb_5F00_55E2ED20.jpg" width="644" height="484" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;il drive è anche carino, supporta dischi da 100MB&lt;/p&gt;  &lt;p&gt;&lt;a href="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/1362.2013_2D00_03_2D00_18_2D00_12.57.24_5F00_1FFDF806.jpg"&gt;&lt;img title="2013-03-18 12.57.24" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="2013-03-18 12.57.24" src="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/8875.2013_2D00_03_2D00_18_2D00_12.57.24_5F00_thumb_5F00_3A5DEB1D.jpg" width="644" height="484" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;e il nuovi (per l’epoca) 250MB&lt;/p&gt;  &lt;p&gt;&lt;a href="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/3051.2013_2D00_03_2D00_18_2D00_12.57.45_5F00_78E338C3.jpg"&gt;&lt;img title="2013-03-18 12.57.45" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="2013-03-18 12.57.45" src="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/0728.2013_2D00_03_2D00_18_2D00_12.57.45_5F00_thumb_5F00_49451A37.jpg" width="644" height="484" /&gt;&lt;/a&gt;&lt;/p&gt;      &lt;p&gt;una volta connesso all’USB (il mio è 3.0, ma retrocede volentieri all’1.0) funziona come un normale floppy:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/3527.2013_2D00_03_2D00_18_2D00_12.57.54_5F00_1608E0CE.jpg"&gt;&lt;img title="2013-03-18 12.57.54" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="2013-03-18 12.57.54" src="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/4670.2013_2D00_03_2D00_18_2D00_12.57.54_5F00_thumb_5F00_743D083C.jpg" width="644" height="484" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/0535.image_5F00_3E581322.png"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="image" src="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/6470.image_5F00_thumb_5F00_2B36E676.png" width="644" height="432" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;ovviamente formattato in FAT(16)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/6378.image_5F00_4A0D5A54.png"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="image" src="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/5367.image_5F00_thumb_5F00_6230C4AF.png" width="375" height="484" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;con eccezionali tempi di copia (per l’epoca)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/2318.image_5F00_5A39224D.png"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="image" src="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/5430.image_5F00_thumb_5F00_4064EC1E.png" width="644" height="410" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;spero vi siate divertiti &lt;img class="wlEmoticon wlEmoticon-smile" style="border-top-style:none;border-left-style:none;border-bottom-style:none;border-right-style:none;" alt="Sorriso" src="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/4863.wlEmoticon_2D00_smile_5F00_4B060BD8.png" /&gt;&lt;/p&gt;  &lt;p&gt;a presto&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetlombardia.org/aggbug.aspx?PostID=842" width="1" height="1"&gt;</content><author><name>tonyexpo</name><uri>http://dotnetlombardia.org/members/tonyexpo/default.aspx</uri></author><category term=" floppy" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+floppy/default.aspx" /><category term=" 100" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+100/default.aspx" /><category term=" 250" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+250/default.aspx" /><category term=" disk" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+disk/default.aspx" /><category term=" iomega" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+iomega/default.aspx" /><category term=" zip" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+zip/default.aspx" /><category term="legacy" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/legacy/default.aspx" /></entry><entry><title>WinRT &amp; Html Manipulation + HtmlAgilityPack</title><link rel="alternate" type="text/html" href="/b/tonyexpo/archive/2013/03/18/winrt-amp-html-manipulation-htmlagilitypack.aspx" /><id>/b/tonyexpo/archive/2013/03/18/winrt-amp-html-manipulation-htmlagilitypack.aspx</id><published>2013-03-18T10:01:00Z</published><updated>2013-03-18T10:01:00Z</updated><content type="html">&lt;p&gt;Ciao a tutti&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;una grande categoria di applicazioni ha bisogno di manipolare l’HTML come ad esempio gli RSS reader&lt;/p&gt;  &lt;p&gt;le operazioni principali da fare sono in genere mostrare l’HTML come testo all’interno delle proprie applicazioni, possibilmente in maniera formattata&lt;/p&gt;  &lt;p&gt;in questo caso WinRT ci da a disposizione una classe molto comoda che è Windows.Data.Html.HtmlUtilities&lt;/p&gt;  &lt;p&gt;in questa classe il metodo statico ConvertToText fa il grosso del lavoro per noi, convertendo l’HTML in testo formattato ad esempio con i ritorni a capo, senza importare elementi multimediali come immagini e simili&lt;/p&gt;  &lt;p&gt;&lt;a href="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/4428.image_5F00_2133067C.png"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="image" src="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/7230.image_5F00_thumb_5F00_465050E8.png" width="604" height="212" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;altra classe utile per manipolare l’HTML è la System.Net.WebUtility che copre il ruolo della HttpUtility (non WinRT), dandoci la possibilità di fare l’encoding ed il decoding dell’HTML per poterlo ad esempio storare all’interno di un file o di un DB senza incorrere in pericolose injection di vario tipo (script, sql, etc)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/4503.image_5F00_59FD3A7C.png"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="image" src="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/7612.image_5F00_thumb_5F00_0B1C751D.png" width="604" height="212" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/4643.image_5F00_512D3230.png"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="image" src="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/3580.image_5F00_thumb_5F00_024C6CD1.png" width="704" height="261" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;ultimo consiglio, l’uso delle librerie HtmlAgilityPack, disponibili da un po anche per WinRT&lt;/p&gt;  &lt;p&gt;come la grande maggioranza delle librerie, è disponibile su &lt;a href="http://nuget.org/"&gt;NuGet&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/5040.image_5F00_6158FA29.png"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="image" src="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/7652.image_5F00_thumb_5F00_555709F5.png" width="604" height="404" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;        &lt;p&gt;con HtmlAgilityPack è possibile fare il parse dell’HTML anche quando questo è poco ben strutturato, come ad esempio per i vecchi HTML 4.0&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;con questo codice è possibile ad esempio prendere la prima immagine (tag IMG) per usarla magari in binding da un ViewModel per connetterla ad un controllo image&lt;/p&gt;  &lt;p&gt;XAML: &lt;/p&gt;  &lt;p&gt;&amp;lt;Image Source=”{Binding Image}” /&amp;gt;&lt;/p&gt;  &lt;p&gt;C#:&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;&lt;strong&gt;public string Image       &lt;br /&gt;{        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; get        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //il proprio HTML magari preso dal tag description di un RSS        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string myHTML=&amp;quot;&amp;quot;;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var doc = new HtmlDocument();        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; doc.LoadHtml(myHTML);        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var images = doc.DocumentNode.Descendants(&amp;quot;img&amp;quot;).Select(i =&amp;gt; i.Attributes[&amp;quot;src&amp;quot;].Value);        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return images.FirstOrDefault();        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }        &lt;br /&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;a presto&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetlombardia.org/aggbug.aspx?PostID=841" width="1" height="1"&gt;</content><author><name>tonyexpo</name><uri>http://dotnetlombardia.org/members/tonyexpo/default.aspx</uri></author><category term=" windows 8" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+windows+8/default.aspx" /><category term=" html" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+html/default.aspx" /><category term=" htmlagilitypack" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+htmlagilitypack/default.aspx" /><category term=" htmldecode" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+htmldecode/default.aspx" /><category term=" htmlencode" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+htmlencode/default.aspx" /><category term=" manipolazione" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+manipolazione/default.aspx" /><category term=" manipulation" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+manipulation/default.aspx" /><category term="winrt" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/winrt/default.aspx" /></entry><entry><title>[LEGACY] Come usare un floppy-disk da 1.44MB da MS-DOS</title><link rel="alternate" type="text/html" href="/b/tonyexpo/archive/2013/03/03/legacy-come-usare-un-floppy-disk-da-1-44mb-da-ms-dos.aspx" /><id>/b/tonyexpo/archive/2013/03/03/legacy-come-usare-un-floppy-disk-da-1-44mb-da-ms-dos.aspx</id><published>2013-03-03T18:26:00Z</published><updated>2013-03-03T18:26:00Z</updated><content type="html">&lt;p&gt;Ciao a tutti&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;scrivo questo articolo per le nuove generazioni, ed anche per i non più ragazzini che come me il floppy l’hanno usato… per installare win3.11, per installare win95… etc….&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Un floppy disk è un disco flessibile rivestito da una custodia di plastica rigida con apertura sul lato superiore protetta da clip metallica&lt;/p&gt;  &lt;p&gt;Le capacità sono variabili, ma nell’ultima e più diffusa versione è di 1.44MB, formattato in FAT per sistemi DOS e Windows&lt;/p&gt;  &lt;p&gt;Questa la faccia di un lettore floppy USB 1&lt;/p&gt;  &lt;p&gt;&lt;a href="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/8103.2013_2D00_03_2D00_03_2D00_20.25.34_5F00_1109DBBC.jpg"&gt;&lt;img title="2013-03-03 20.25.34" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="2013-03-03 20.25.34" src="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/3364.2013_2D00_03_2D00_03_2D00_20.25.34_5F00_thumb_5F00_60272450.jpg" width="604" height="454" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;il disco si può inserire al suo interno semplicemente immettendolo dal d’avanti come per un CD in un lettore tray-less&lt;/p&gt;  &lt;p&gt;&lt;a href="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/7558.2013_2D00_03_2D00_03_2D00_20.25.47_5F00_5EE28B71.jpg"&gt;&lt;img title="2013-03-03 20.25.47" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="2013-03-03 20.25.47" src="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/7450.2013_2D00_03_2D00_03_2D00_20.25.47_5F00_thumb_5F00_43C9BC63.jpg" width="604" height="454" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;una volta inserito il floppy, questo si va a posizionare del tutto al suo interno, facendo fuoriuscire una levetta (in questo caso) sulla dx da ripremere per una espulsione meccanica del supporto&lt;/p&gt;  &lt;p&gt;in genere, durante l’utilizzo un LED si illumina per informare l’utente che la testina magnetica sta eseguendo operazioni di IO sul disco&lt;/p&gt;  &lt;p&gt;&lt;a href="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/3731.2013_2D00_03_2D00_03_2D00_20.33.40_5F00_226A16C7.jpg"&gt;&lt;img title="2013-03-03 20.33.40" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="2013-03-03 20.33.40" src="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/8640.2013_2D00_03_2D00_03_2D00_20.33.40_5F00_thumb_5F00_47876133.jpg" width="604" height="454" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;questo un esempio di utilizzo di un floppy da una shell DOS&lt;/p&gt;  &lt;p&gt;&lt;a href="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/7651.image_5F00_6BCC45B5.png"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;background-image:none;border-bottom:0px;padding-top:0px;padding-left:0px;border-left:0px;display:inline;padding-right:0px;" border="0" alt="image" src="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/3426.image_5F00_thumb_5F00_5CB566DB.png" width="604" height="309" /&gt;&lt;/a&gt;&lt;/p&gt;        &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;spero vi sia piaciuto questo tuffo nel passato &lt;img class="wlEmoticon wlEmoticon-smile" style="border-top-style:none;border-left-style:none;border-bottom-style:none;border-right-style:none;" alt="Sorriso" src="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/3482.wlEmoticon_2D00_smile_5F00_694313F7.png" /&gt;&lt;/p&gt;  &lt;p&gt;a presto&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetlombardia.org/aggbug.aspx?PostID=836" width="1" height="1"&gt;</content><author><name>tonyexpo</name><uri>http://dotnetlombardia.org/members/tonyexpo/default.aspx</uri></author><category term=" file" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+file/default.aspx" /><category term=" floppy" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+floppy/default.aspx" /><category term=" test" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+test/default.aspx" /><category term="usb" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/usb/default.aspx" /></entry><entry><title>CLR Memory Management</title><link rel="alternate" type="text/html" href="/b/tonyexpo/archive/2013/02/25/clr-memory-management.aspx" /><id>/b/tonyexpo/archive/2013/02/25/clr-memory-management.aspx</id><published>2013-02-25T18:54:00Z</published><updated>2013-02-25T18:54:00Z</updated><content type="html">&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;ciao a tutti&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;nel .NET esistono due categorie di tipi (TYPE in originale): Value Type e Reference Type&lt;/p&gt;  &lt;p&gt;questa la loro suddivisione:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;VALUE TYPES&lt;/li&gt;    &lt;/ul&gt;&lt;ul&gt;     &lt;li&gt;INT (short, long, uint, ushort, byte, sbyte, decimal, etc)&lt;/li&gt;      &lt;li&gt;FLOAT (double, float)&lt;/li&gt;      &lt;li&gt;BOOL&lt;/li&gt;      &lt;li&gt;ENUM (enumerazioni)&lt;/li&gt;      &lt;li&gt;STRUCT (strutture)&lt;/li&gt;   &lt;/ul&gt;    &lt;ul&gt;&lt;li&gt;REFERENCE TYPE&lt;/li&gt;    &lt;/ul&gt;&lt;ul&gt;     &lt;li&gt;Object (e ogni derivato)&lt;/li&gt;      &lt;li&gt;STRING&lt;/li&gt;   &lt;/ul&gt;   &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Nel .NET framework esistono due principali aree di memoria in cui vengono conservati gli oggetti durante l’esecuzione (run-time), Heap e Stack&lt;/p&gt;  &lt;p&gt;Come in molti libri è enunciato lo Stack è l’area che conserva i value-type, mentre lo Heap è l’area che conserva i reference-type (le istanze delle classi nostre o del framework stesso)&lt;/p&gt;  &lt;p&gt;Ovviamente, questa è una “barzelletta”…. nel senso che non è esattamente così – benché possa sembrare&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Nel CLR (common-language-runtime) del .NET framework, implementato da Microsoft (in pratica la virtual machine in cui il codice .NET si converte da IL – il precompilato – a binario), esistono 3 aree di memoria in cui le nostre variabili di vario tipo vengono memorizzate durante l’esecuzione (heap, stack &amp;amp; registers). L’unico vero discriminante nella scelta della memoria da utilizzare, è lo scope (la prevista durata come compresa dal compilatore o dal Runtime) della nostra variabile&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Questo già mette in luce che esiste un’area di memoria di solito dimenticata (Registers), così come mette in luce il fatto che in realtà &lt;a href="http://www.mono-project.com/Main_Page"&gt;MONO&lt;/a&gt; (il CLR per Linux e non solo) potrebbe avere una architettura della gestione della memoria completamente diversa (non so se mono si comporti diversamente o egualmente al clr Ms)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Ulteriore appunto alla definizione usuale è il fatto che in realtà non è il tipo di variabile a caratterizzarne l’allocazione in memoria, ma la sua dichiarazione, e più precisamente il suo presunto ciclo di vita (life-time in originale)&lt;/p&gt;  &lt;p&gt;Un esempio tipico è il fatto che gli INT dentro una variabile di tipo Reference, non sono sullo Stack ma sullo Heap&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;La spiegazione sul perché avviene tutto questo è la seguente:&lt;/p&gt;  &lt;p&gt;Se dichiariamo una variabile di tipo primitivo, e la utilizziamo in maniera procedurale, il CLR sa esattamente quando verrà dichiarata, e quando verrà abbandonata, quindi la può caricare nello Stack o nel Register&lt;/p&gt;  &lt;p&gt;Mentre se è una istanza di classe, che appunto è un Reference Type, questo rende più difficile al CLR capire quando esattamente potrebbe essere abbandonato l’uso della variabile (cosa che infatti impatta in seguito il GC), e quindi il CLR adottando un approccio conservativo, mette il Reference (il riferimento della variabile – diciamo pure il puntatore) nello Stack, e il contenuto della variabile puntata nello Heap, proprio perché considera long-lived l’oggetto…. in pratica dice: io non riesco a predire se sarà ad uso breve o lungo, quindi lo metto nell’area di memoria degli oggetti a vita lunga, se poi sarà breve, il GC lo rimuoverà&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Ulteriore esempi di oggetti nello Heap (long-lived memory area) sono le variabili cross-utilizzate nelle lambda, queste appunto essendo dei Delegate, ed essendo soggetti all’Azione a Distanza per flusso di esecuzione ed anche per distanza temporale, vanno automaticamente nello Heap anche se normalmente di tipo short-lived, ad esempio un INT che viene passato come parametro non diretto all’interno di una lambda (in pratica quelli fuori alla Action/Func, ma che vengono visualizzati anche dal codice anonimo della funzione, perché nello stesso scope della lambda stessa).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;BOXING/UNBOXING:&lt;/p&gt;  &lt;p&gt;Ovviamente l’operazione di boxing (inserimento di un valore primitivo in un oggetto contenitore – in genere Object) rende il tipo un Reference type, e quindi automaticamente soggetto al problema già detto del passaggio dell’istanza da short-lived a long-lived, e quindi al passaggio da Stack/Register all’Heap, con conseguente perdita di performance dovuta alla copia del valore tra 1 area di memoria ad 1 altra.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Simile il comportamento che avviene quando utilizziamo una lambda: come già detto questa rende tutte le variabili dello stesso scope automaticamente long-lived, quindi al pari di un’operazione di boxing&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;CONCLUSIONI:&lt;/p&gt;  &lt;p&gt;Attenzione a quello che si scrive… molte applicazioni legacy, vedi i gestionali Client-Server, sono molto poco ottimizzati nell’uso delle variabili, lasciando spesso al CLR il compito di “arrangiarsi”. Anche se nel tempo ci si è basati sul fatto che tanto ogni utente avrà il proprio PC e che difficilmente il rallentamento sarà generale e quindi problematico, questo cambia con il cambiare delle architetture software che vanno sempre più verso N-Tier, Servizi/SOA e Cloud Computing.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Inoltre va detto che, realizzando applicazioni che vanno spesso sul Cloud, dove la bassa ottimizzazione la paghiamo noi in bolletta, è meglio fare attenzione a quello che facciamo ed a come lo facciamo.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;spero di essere stato chiaro, almeno un po &lt;img class="wlEmoticon wlEmoticon-smile" style="border-top-style:none;border-left-style:none;border-bottom-style:none;border-right-style:none;" alt="Sorriso" src="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/5040.wlEmoticon_2D00_smile_5F00_08C09E43.png" /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;RIFERIMENTI:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about-value-types.aspx"&gt;Eric Lippert’s Blobg&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetlombardia.org/aggbug.aspx?PostID=834" width="1" height="1"&gt;</content><author><name>tonyexpo</name><uri>http://dotnetlombardia.org/members/tonyexpo/default.aspx</uri></author><category term=".net" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/-net/default.aspx" /><category term=" clr" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+clr/default.aspx" /><category term=" heap" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+heap/default.aspx" /><category term=" memory" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+memory/default.aspx" /><category term=" performance" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+performance/default.aspx" /><category term=" stack" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+stack/default.aspx" /></entry><entry><title>[TIP] ASP.NET Custom Handler + Session</title><link rel="alternate" type="text/html" href="/b/tonyexpo/archive/2013/02/25/tip-asp-net-custom-handler-session.aspx" /><id>/b/tonyexpo/archive/2013/02/25/tip-asp-net-custom-handler-session.aspx</id><published>2013-02-25T11:50:00Z</published><updated>2013-02-25T11:50:00Z</updated><content type="html">&lt;p&gt;Ciao a tutti&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;sappiamo che con ASP.NET è possibile registrare degli handler custom per generare a Runtime dei files (più precisamente delle response) che non siano statici (presenti) sul web-server, e che non puntino a pagine (aspx) o controller mvc&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Per creare un custom handler in ASP.NET è sufficiente creare una classe che implementi l’interfaccia IHttpHandler&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;&lt;strong&gt;namespace WebApplication1        &lt;br /&gt;{         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public class MyHandler : IHttpHandler         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public bool IsReusable         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Return false in case your Managed Handler cannot be reused for another request.         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Usually this would be false in case you have some state information preserved per request.         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get { return true; }         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void ProcessRequest(HttpContext context)        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; context.Response.Write(&amp;quot;ciao!&amp;quot;);         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; context.Response.Flush();         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;}         &lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;per l’utilizzo, questo handler va poi registrato nel web.config, nella sezione system.webserver per IIS o IIS-express (o nella vecchia sezione system.web se usiamo il web-server demo di VS il Cassini)&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;&lt;strong&gt;&amp;lt;system.webServer&amp;gt;        &lt;br /&gt;&amp;#160; &amp;lt;handlers&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;add name=&amp;quot;myhandler&amp;quot;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; path=&amp;quot;myhandler.axd&amp;quot;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; verb=&amp;quot;GET&amp;quot;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; type=&amp;quot;WebApplication1.MyHandler,WebApplication1&amp;quot;/&amp;gt;         &lt;br /&gt;&amp;#160; &amp;lt;/handlers&amp;gt;         &lt;br /&gt;&amp;lt;/system.webServer&amp;gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/6560.image_5F00_5683A835.png"&gt;&lt;img title="image" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="image" src="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/2742.image_5F00_thumb_5F00_1508F5DC.png" width="525" height="310" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;in alternativa, è possibile registrare l’handler in un route di asp.net (come per i controller mvc) implementando in una qualunque altra classe l’interfaccia IRouteHandler per poi tornare il corretto Handler da fare route:&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;&lt;strong&gt;public class MyHandler : IHttpHandler, IRouteHandler        &lt;br /&gt;{         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public bool IsReusable { get { return true; } }&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160; public void ProcessRequest(HttpContext context)        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; context.Response.Write(&amp;quot;ciao!&amp;quot;);         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; context.Response.Flush();         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160; public IHttpHandler GetHttpHandler(RequestContext requestContext)        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return this;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;regitriamo il route nell’application start del file Global.asax (nel caso da aggiungere tramite il tool add-new item)&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;&lt;strong&gt;protected void Application_Start(object sender, EventArgs e)        &lt;br /&gt;{         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; RouteTable.Routes.Add(new Route(&amp;quot;handler/my&amp;quot;, new MyHandler()));         &lt;br /&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;se però nel nostro handler abbiamo bisogno di avere accesso alla sessione utente, eventualmente per usarla come scambio temporaneo di un parametro ID o simili – si sconsiglia di metterci dentro valori di grande dimensioni come elaborazioni e dati DB – alternativamente a passare parametri in query-string ovviamente visibili all’utente, dobbiamo implementare anche una ulteriore interfaccia: IRequiresSessionState&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;&lt;strong&gt;public class MyHandler : IHttpHandler, IRouteHandler, IRequiresSessionState        &lt;br /&gt;{         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public bool IsReusable { get { return true; } }&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160; public void ProcessRequest(HttpContext context)        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; context.Response.Write(context.Session[&amp;quot;SESSION START TIME&amp;quot;]);         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;&lt;strong&gt;&amp;#160;&amp;#160;&amp;#160; public IHttpHandler GetHttpHandler(RequestContext requestContext)        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return this;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;e aggiornare – ad esempio – il global.asax per aggiungere un parametro in sessione&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;&lt;strong&gt;protected void Session_Start(object sender, EventArgs e)        &lt;br /&gt;{         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Session[&amp;quot;SESSION START TIME&amp;quot;] = DateTime.UtcNow;         &lt;br /&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="2" face="Courier New"&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;avendo questo risultato:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/3302.image_5F00_260D23BF.png"&gt;&lt;img title="image" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="image" src="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/7103.image_5F00_thumb_5F00_5DDF67E2.png" width="542" height="352" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;a presto&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetlombardia.org/aggbug.aspx?PostID=833" width="1" height="1"&gt;</content><author><name>tonyexpo</name><uri>http://dotnetlombardia.org/members/tonyexpo/default.aspx</uri></author><category term="asp.net" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/asp-net/default.aspx" /><category term=" tip" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+tip/default.aspx" /><category term=" handler" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+handler/default.aspx" /><category term=" session" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+session/default.aspx" /></entry><entry><title>The session has been terminated because of excessive transaction log space usage. Try modifying fewer rows in a single transaction.</title><link rel="alternate" type="text/html" href="/b/tonyexpo/archive/2013/02/18/the-session-has-been-terminated-because-of-excessive-transaction-log-space-usage-try-modifying-fewer-rows-in-a-single-transaction.aspx" /><id>/b/tonyexpo/archive/2013/02/18/the-session-has-been-terminated-because-of-excessive-transaction-log-space-usage-try-modifying-fewer-rows-in-a-single-transaction.aspx</id><published>2013-02-18T13:01:00Z</published><updated>2013-02-18T13:01:00Z</updated><content type="html">&lt;p&gt;Ciao a tutti&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;a quanto pare la migrazione su SQL Azure di un DB di produzione di vari milioni di righe mi provoca più di un problema serio&lt;/p&gt;  &lt;p&gt;SQL Azure ha un limite di 2GB (&lt;a title="http://social.technet.microsoft.com/wiki/contents/articles/1541.windows-azure-sql-database-connection-management.aspx" href="http://social.technet.microsoft.com/wiki/contents/articles/1541.windows-azure-sql-database-connection-management.aspx"&gt;http://social.technet.microsoft.com/wiki/contents/articles/1541.windows-azure-sql-database-connection-management.aspx&lt;/a&gt;) per commit sul transaction-log… e questo vale anche per le create-index&lt;/p&gt;  &lt;p&gt;Questo il testo dell’articolo completo:&lt;/p&gt;  &lt;h6&gt;&lt;strong&gt;Long Transaction Limits&lt;/strong&gt;&lt;/h6&gt;  &lt;p&gt;&lt;font size="1"&gt;&lt;strong&gt;Log Bytes Used       &lt;br /&gt;Current mechanism        &lt;br /&gt;&lt;/strong&gt;SQL Database supports transactions generating log of up to 2 GB in size. Example operations that can consume log space in this volume:      &lt;br /&gt;insert, update, delete, merge, create index      &lt;br /&gt;&lt;/font&gt;&lt;strong&gt;&lt;font size="1"&gt;Error returned       &lt;br /&gt;&lt;/font&gt;&lt;/strong&gt;&lt;em&gt;&lt;font size="1"&gt;40552 : The session has been terminated because of excessive transaction log space usage. Try modifying fewer rows in a single transaction.       &lt;br /&gt;&lt;/font&gt;&lt;/em&gt;&lt;font size="1"&gt;&lt;strong&gt;Limit       &lt;br /&gt;&lt;/strong&gt;Logspace per transaction&amp;#160; : 2 GB      &lt;br /&gt;&lt;/font&gt;&lt;font size="1"&gt;&lt;strong&gt;Type of requests throttled       &lt;br /&gt;&lt;/strong&gt;DDL (Create, Drop, …)      &lt;br /&gt;DML (Insert, Update, Delete, Merge, Select)      &lt;br /&gt;&lt;/font&gt;&lt;font size="1"&gt;&lt;strong&gt;Recommendations       &lt;br /&gt;&lt;/strong&gt;To avoid getting throttled for row operations, reduce the size of data in your transaction, for example by reducing the number of rows or splitting the operation into multiple transactions. To avoid getting throttled for table/index operations that require a single transaction, ensure that the following formula is adhered to:&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;font size="1"&gt;number of rows affected in table * (avg size of field being updated in bytes + 80) &amp;lt; 2 GB&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="1"&gt;(In case of index rebuild, avg size of field being updated should be substituted by avg index size)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;In pratica: non si possono eseguire operazioni che nel transaction-log superino i 2GB di dimensione…. si ma io ho una tabella di 12GB solo di dati più indici, come faccio a aggiungere un indice se questo ovviamente pesa più di 2GB?!?!&lt;/p&gt;  &lt;p&gt;boh… attualmente non ho risposta…. mi sa ke per fare questa demo farò un cluster SQL sullo IaaS mettendo il fido 2012 che funziona davvero benino…..&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;se dovessi trovare il modo x farlo andare su sql azure, vi scriverò!&lt;/p&gt;  &lt;p&gt;a presto&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetlombardia.org/aggbug.aspx?PostID=832" width="1" height="1"&gt;</content><author><name>tonyexpo</name><uri>http://dotnetlombardia.org/members/tonyexpo/default.aspx</uri></author><category term="azure" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/azure/default.aspx" /><category term=" sql" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+sql/default.aspx" /><category term=" create index" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+create+index/default.aspx" /><category term=" log" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+log/default.aspx" /><category term=" sql azure" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+sql+azure/default.aspx" /><category term=" transaction log" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+transaction+log/default.aspx" /></entry><entry><title>SQL Export Data Tier Application su Azure (CI RISIAMO!), valori mancanti…</title><link rel="alternate" type="text/html" href="/b/tonyexpo/archive/2013/02/18/sql-export-data-tier-application-su-azure-ci-risiamo-valori-mancanti.aspx" /><id>/b/tonyexpo/archive/2013/02/18/sql-export-data-tier-application-su-azure-ci-risiamo-valori-mancanti.aspx</id><published>2013-02-18T11:50:00Z</published><updated>2013-02-18T11:50:00Z</updated><content type="html">&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Ciao a tutti&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;la scorsa volta ho scritto del fatto che alcuni blob salvati su SQL Server 2012 in locale, una volta esportati su SQL Azure tramite l’Export come bacpac (Export DataTier Application), avevano valori sbagliati, immagini sovrascritte l’una con l’altra, etc…&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Ieri sera invece ho rifatto export di un altro DB senza blob dentro, ma con quasi 100 milioni di righe con dati GIS al suo interno (in realtà i dati non usano alcuna colonna GIS di SQL)&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Ho eseguito questa query sul SQL locale (2012 developer)&lt;/p&gt;  &lt;p&gt;SELECT sys.objects.object_id, convert(int, SUM(reserved_page_count) * 8.0 / 1024) as [KB SIZE]   &lt;br /&gt;FROM sys.dm_db_partition_stats, sys.objects     &lt;br /&gt;WHERE type_desc = &amp;#39;USER_TABLE&amp;#39; and sys.dm_db_partition_stats.object_id = sys.objects.object_id     &lt;br /&gt;GROUP BY sys.objects.object_id    &lt;br /&gt;order by sys.objects.object_id;&lt;/p&gt;  &lt;p&gt;sulla sx l’ID della tabella (il nome l’ho nascosto per una questione di privacy del cliente), sulla dx la dimensione della tabella in KB&lt;/p&gt;  &lt;p&gt;RISULTATO LOCALE:&lt;/p&gt;  &lt;p&gt;78623323&amp;#160;&amp;#160;&amp;#160; 26   &lt;br /&gt;82099333&amp;#160;&amp;#160;&amp;#160; 1    &lt;br /&gt;146099561&amp;#160;&amp;#160;&amp;#160; 0    &lt;br /&gt;526624919&amp;#160;&amp;#160;&amp;#160; 12    &lt;br /&gt;590625147&amp;#160;&amp;#160;&amp;#160; 0    &lt;br /&gt;741577680&amp;#160;&amp;#160;&amp;#160; 22065    &lt;br /&gt;942626401&amp;#160;&amp;#160;&amp;#160; 139    &lt;br /&gt;1269579561&amp;#160;&amp;#160;&amp;#160; 1565    &lt;br /&gt;1461580245&amp;#160;&amp;#160;&amp;#160; 0    &lt;br /&gt;1490104349&amp;#160;&amp;#160;&amp;#160; 108    &lt;br /&gt;1762105318&amp;#160;&amp;#160;&amp;#160; 0    &lt;br /&gt;1781581385&amp;#160;&amp;#160;&amp;#160; 0    &lt;br /&gt;1877581727&amp;#160;&amp;#160;&amp;#160; 0&lt;/p&gt;  &lt;p&gt;RISULTATO DELL’EXPORT BACPAC su SQL Azure:&lt;/p&gt;  &lt;p&gt;501576825&amp;#160;&amp;#160;&amp;#160; 0   &lt;br /&gt;533576939&amp;#160;&amp;#160;&amp;#160; 0    &lt;br /&gt;565577053&amp;#160;&amp;#160;&amp;#160; 1902    &lt;br /&gt;597577167&amp;#160;&amp;#160;&amp;#160; 0    &lt;br /&gt;629577281&amp;#160;&amp;#160;&amp;#160; 18888    &lt;br /&gt;661577395&amp;#160;&amp;#160;&amp;#160; 0    &lt;br /&gt;693577509&amp;#160;&amp;#160;&amp;#160; 0    &lt;br /&gt;725577623&amp;#160;&amp;#160;&amp;#160; 0    &lt;br /&gt;757577737&amp;#160;&amp;#160;&amp;#160; 0    &lt;br /&gt;789577851&amp;#160;&amp;#160;&amp;#160; 0    &lt;br /&gt;821577965&amp;#160;&amp;#160;&amp;#160; 0    &lt;br /&gt;853578079&amp;#160;&amp;#160;&amp;#160; 0    &lt;br /&gt;1397580017&amp;#160;&amp;#160;&amp;#160; 0&lt;/p&gt;  &lt;p&gt;sono ovviamente cambiati gli ID, ma anche solo con tutti quegli “0”, qualcosa già non torna……&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Ragazzi non ci siamo proprio x niente! il tool va assolutamente aggiornato/aggiustato!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;a presto&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetlombardia.org/aggbug.aspx?PostID=831" width="1" height="1"&gt;</content><author><name>tonyexpo</name><uri>http://dotnetlombardia.org/members/tonyexpo/default.aspx</uri></author><category term="sql server" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/sql+server/default.aspx" /><category term=" data tier" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+data+tier/default.aspx" /><category term=" export" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+export/default.aspx" /><category term="sql azure" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/sql+azure/default.aspx" /></entry><entry><title>SQL Export Data Tier Application su Azure, Varbinary duplicati….</title><link rel="alternate" type="text/html" href="/b/tonyexpo/archive/2013/02/10/sql-export-data-tier-application-su-azure-varbinary-duplicati.aspx" /><id>/b/tonyexpo/archive/2013/02/10/sql-export-data-tier-application-su-azure-varbinary-duplicati.aspx</id><published>2013-02-10T15:40:00Z</published><updated>2013-02-10T15:40:00Z</updated><content type="html">&lt;p&gt;Ciao a tutti&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;ebbene si, ho perso 4 ore per capire dove fosse il problema nella mia applicazione che stranamente mostrava la stessa foto per immagini diverse, alla fine ho capito che il problema era che davvero c’erano le stesse foto nel DB…&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Analizzato il DB su Azure, ho scoperto che questo era SBAGLIATO!&lt;/p&gt;  &lt;p&gt;A questo punto non posso che dedurre che l’errore è generato dalla combinazione “Export DataTier Application” + “Import DataTier Application” tra SQL 2012 e SQL Azure… assurdo&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Per fare il test ho lanciato questo script: &lt;/p&gt;  &lt;p&gt;select PhotoID, FileName, DATALENGTH(Picture)   &lt;br /&gt;from photos&amp;quot;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Risultato in locale:&lt;/p&gt;  &lt;p&gt;3&amp;#160;&amp;#160;&amp;#160; be04af21-4d45-4908-a0e0-85f59a828240.jpg&amp;#160;&amp;#160;&amp;#160; 1347211   &lt;br /&gt;5&amp;#160;&amp;#160;&amp;#160; 729dc91a-ed65-4752-bcd1-cbab163fe3ff.jpg&amp;#160;&amp;#160;&amp;#160; 2893370    &lt;br /&gt;14&amp;#160;&amp;#160;&amp;#160; f5ef2254-9d90-4fac-92b7-315410c652cc.jpg&amp;#160;&amp;#160;&amp;#160; 2415767    &lt;br /&gt;38&amp;#160;&amp;#160;&amp;#160; ca4bd437-bd9a-47bf-bba5-aa996111426d..jpg&amp;#160;&amp;#160;&amp;#160; 4960505    &lt;br /&gt;40&amp;#160;&amp;#160;&amp;#160; e14597b2-6f3c-4e06-9473-960ae6d39744..jpg&amp;#160;&amp;#160;&amp;#160; 4395986    &lt;br /&gt;41&amp;#160;&amp;#160;&amp;#160; d2d2ca93-cd3e-4e7a-a8aa-5af05606db15..jpg&amp;#160;&amp;#160;&amp;#160; 3521621    &lt;br /&gt;42&amp;#160;&amp;#160;&amp;#160; 190228e8-e1b6-493e-b4be-fb39b4f7490f..jpg&amp;#160;&amp;#160;&amp;#160; 6301710    &lt;br /&gt;43&amp;#160;&amp;#160;&amp;#160; 7d277199-4e90-44ae-819e-228d46aede3c..jpg&amp;#160;&amp;#160;&amp;#160; 5312837    &lt;br /&gt;44&amp;#160;&amp;#160;&amp;#160; d35849b2-8de7-43fa-80a4-1a2053b37ad6..jpg&amp;#160;&amp;#160;&amp;#160; 2738910    &lt;br /&gt;45&amp;#160;&amp;#160;&amp;#160; da553259-70ce-41ec-bc9a-cea7907c1ffb..jpg&amp;#160;&amp;#160;&amp;#160; 17016593    &lt;br /&gt;46&amp;#160;&amp;#160;&amp;#160; 657bd0b1-ff15-4065-ae5c-3afe3609ef78..jpg&amp;#160;&amp;#160;&amp;#160; 8823802    &lt;br /&gt;47&amp;#160;&amp;#160;&amp;#160; abe6794a-394c-47df-8e26-ec7e8163b912..jpg&amp;#160;&amp;#160;&amp;#160; 3174525    &lt;br /&gt;49&amp;#160;&amp;#160;&amp;#160; 283e0124-9bd6-466d-bf2b-6af4a564b307.jpg&amp;#160;&amp;#160;&amp;#160; 2749057    &lt;br /&gt;…&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Risultato su SQL Azure:&lt;/p&gt;  &lt;p&gt;3&amp;#160;&amp;#160;&amp;#160; be04af21-4d45-4908-a0e0-85f59a828240.jpg&amp;#160;&amp;#160;&amp;#160; 1347211   &lt;br /&gt;5&amp;#160;&amp;#160;&amp;#160; 729dc91a-ed65-4752-bcd1-cbab163fe3ff.jpg&amp;#160;&amp;#160;&amp;#160; 2893370    &lt;br /&gt;14&amp;#160;&amp;#160;&amp;#160; f5ef2254-9d90-4fac-92b7-315410c652cc.jpg&amp;#160;&amp;#160;&amp;#160; 2415767    &lt;br /&gt;38&amp;#160;&amp;#160;&amp;#160; ca4bd437-bd9a-47bf-bba5-aa996111426d..jpg&amp;#160;&amp;#160;&amp;#160; 4960505    &lt;br /&gt;40&amp;#160;&amp;#160;&amp;#160; e14597b2-6f3c-4e06-9473-960ae6d39744..jpg&amp;#160;&amp;#160;&amp;#160; &lt;font style="background-color:#ffff00;"&gt;4960505&lt;/font&gt;    &lt;br /&gt;41&amp;#160;&amp;#160;&amp;#160; d2d2ca93-cd3e-4e7a-a8aa-5af05606db15..jpg&amp;#160;&amp;#160;&amp;#160; 3521621    &lt;br /&gt;42&amp;#160;&amp;#160;&amp;#160; 190228e8-e1b6-493e-b4be-fb39b4f7490f..jpg&amp;#160;&amp;#160;&amp;#160; &lt;font style="background-color:#ffff00;"&gt;4960505&lt;/font&gt;    &lt;br /&gt;43&amp;#160;&amp;#160;&amp;#160; 7d277199-4e90-44ae-819e-228d46aede3c..jpg&amp;#160;&amp;#160;&amp;#160; &lt;font style="background-color:#ffff00;"&gt;4960505&lt;/font&gt;    &lt;br /&gt;44&amp;#160;&amp;#160;&amp;#160; d35849b2-8de7-43fa-80a4-1a2053b37ad6..jpg&amp;#160;&amp;#160;&amp;#160; 2738910    &lt;br /&gt;45&amp;#160;&amp;#160;&amp;#160; da553259-70ce-41ec-bc9a-cea7907c1ffb..jpg&amp;#160;&amp;#160;&amp;#160; &lt;font style="background-color:#ffff00;"&gt;4960505&lt;/font&gt;    &lt;br /&gt;46&amp;#160;&amp;#160;&amp;#160; 657bd0b1-ff15-4065-ae5c-3afe3609ef78..jpg&amp;#160;&amp;#160;&amp;#160; &lt;font style="background-color:#ffff00;"&gt;4960505&lt;/font&gt;    &lt;br /&gt;47&amp;#160;&amp;#160;&amp;#160; abe6794a-394c-47df-8e26-ec7e8163b912..jpg&amp;#160;&amp;#160;&amp;#160; 3174525    &lt;br /&gt;49&amp;#160;&amp;#160;&amp;#160; 283e0124-9bd6-466d-bf2b-6af4a564b307.jpg&amp;#160;&amp;#160;&amp;#160; 2749057&lt;/p&gt;  &lt;p&gt;…&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;dell’ultimo resultset, l’unica len corretta era quella dell’ID 38….&lt;/p&gt;  &lt;p&gt;che assurdo comportamento!&lt;/p&gt;  &lt;p&gt;non mi resta che sincronizzare i due DB a mano….&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;a presto&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetlombardia.org/aggbug.aspx?PostID=827" width="1" height="1"&gt;</content><author><name>tonyexpo</name><uri>http://dotnetlombardia.org/members/tonyexpo/default.aspx</uri></author><category term=" sql server" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+sql+server/default.aspx" /><category term=" data tier" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+data+tier/default.aspx" /><category term=" export" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+export/default.aspx" /><category term="sql azure" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/sql+azure/default.aspx" /></entry><entry><title>WPReborn–Integrazione con il sistema operativo! Launchers &amp; Choosers</title><link rel="alternate" type="text/html" href="/b/tonyexpo/archive/2013/01/28/wpreborn-integrazione-con-il-sistema-operativo-launchers-amp-choosers.aspx" /><id>/b/tonyexpo/archive/2013/01/28/wpreborn-integrazione-con-il-sistema-operativo-launchers-amp-choosers.aspx</id><published>2013-01-28T20:45:00Z</published><updated>2013-01-28T20:45:00Z</updated><content type="html">&lt;p&gt;ciao a tutti&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;ringrazio tutti coloro che mi hanno seguito oggi con la sessione introduttiva allo sviluppo per Windows Phone 8&lt;/p&gt;  &lt;p&gt;abbiamo parlato di Launchers e di Choosers&lt;/p&gt;  &lt;p&gt;ma anche della filosofia dietro il look&amp;amp;feel delle app per WP8 &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;subito sotto relativi esempi&lt;/p&gt;  &lt;p&gt;&lt;a href="https://skydrive.live.com/redir?resid=CA88DE3FE96690E4!695"&gt;DOWNLOAD (SLIDE + DEMO)&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;a presto&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetlombardia.org/aggbug.aspx?PostID=822" width="1" height="1"&gt;</content><author><name>tonyexpo</name><uri>http://dotnetlombardia.org/members/tonyexpo/default.aspx</uri></author><category term=" choosers" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+choosers/default.aspx" /><category term=" dnl" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+dnl/default.aspx" /><category term=" launchers" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+launchers/default.aspx" /><category term=" windows phone" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+windows+phone/default.aspx" /><category term="wpreborn" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/wpreborn/default.aspx" /></entry><entry><title>Intel dual-core vs Intel quad-core</title><link rel="alternate" type="text/html" href="/b/tonyexpo/archive/2013/01/19/intel-dual-core-vs-intel-quad-core.aspx" /><id>/b/tonyexpo/archive/2013/01/19/intel-dual-core-vs-intel-quad-core.aspx</id><published>2013-01-19T11:57:00Z</published><updated>2013-01-19T11:57:00Z</updated><content type="html">&lt;p align="left"&gt;Ciao a tutti&lt;/p&gt;  &lt;p align="right"&gt;&lt;img alt="Intel 3720QM" src="http://www.notebookcheck.net/typo3temp/pics/3cda67f065.jpg" /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Le cpu Intel di ultima generazione (&lt;a href="http://en.wikipedia.org/wiki/Ivy_Bridge_(microarchitecture)"&gt;Ivy-Bridge&lt;/a&gt;) nascondono un piccolo dilemma&lt;/p&gt;  &lt;p&gt;Ovviamente si fa per dire.. &lt;img class="wlEmoticon wlEmoticon-smile" style="border-top-style:none;border-left-style:none;border-bottom-style:none;border-right-style:none;" alt="Sorriso" src="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/8880.wlEmoticon_2D00_smile_5F00_1D999AFC.png" /&gt;&lt;/p&gt;  &lt;p&gt;Credo che tutti noi si sia chiesti ad un certo punto nel voler acquistare un notebook “compro un dual-core?” “o un quad-core?”&lt;/p&gt;  &lt;p&gt;La risposta spesso è nel nostro animo… compro il quad perché è più grosso….&lt;/p&gt;  &lt;p&gt;Perché, dobbiamo dirlo, che senso ha acquistare un quad-core su un portatile business per poi scriverci una lettera in word, e andare su facebook?!?!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Ma rimaniamo sul piano tecnico: questi i benchmark di &lt;a title="http://www.notebookcheck.net/" href="http://www.notebookcheck.net/"&gt;http://www.notebookcheck.net/&lt;/a&gt; dei grandi nel settore dei portatili, hanno ottime recensioni di notebook CPU, GPU, etc…&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Mettiamo a confronto &lt;a href="http://www.notebookcheck.net/Intel-Core-i7-3720QM-Notebook-Processor.73455.0.html"&gt;l’i7-3520m&lt;/a&gt; (il più potente dual core), con &lt;a href="http://www.notebookcheck.net/Intel-Core-i7-3720QM-Notebook-Processor.73455.0.html"&gt;l’i7-3720qm&lt;/a&gt; (un quad di fascia medio-alta) con questi benchmark:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Super PI-1M (calcola il pi-greco in maniera lineare, quindi senza multi-threading, perfetto per far andare la nostra CPU in Turbo)&lt;/li&gt;    &lt;li&gt;3DMark 06 (tipico benchmark multithreading e multipurpose)&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Risultati (benefit-velocità):&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="518" border="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="92"&gt;&amp;nbsp;&lt;/td&gt;        &lt;td valign="top" width="201"&gt;Mono-Thread (Turbo)&lt;/td&gt;        &lt;td valign="top" width="223"&gt;Multi-Thread&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="92"&gt;3520m&lt;/td&gt;        &lt;td valign="top" width="201"&gt;         &lt;p align="right"&gt;10.4&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="223"&gt;         &lt;p align="right"&gt;4081.6&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="92"&gt;         &lt;p align="left"&gt;3720qm&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="201"&gt;         &lt;p align="right"&gt;(+1 %) 10.3&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="223"&gt;         &lt;p align="right"&gt;(+ 38%) 6581.0&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Quindi, si può affermare che a meno di usare tutti i cores, ed i thread (hyper-thread) delle CPU, il quad-core è identico al dual-core…&lt;/p&gt;  &lt;p&gt;Mentre se abbiamo veramente modo di usare tutti i core della nostra CPU, allora, avremo un +38% di potenza in più&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;a presto&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetlombardia.org/aggbug.aspx?PostID=821" width="1" height="1"&gt;</content><author><name>tonyexpo</name><uri>http://dotnetlombardia.org/members/tonyexpo/default.aspx</uri></author><category term=" bridge" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+bridge/default.aspx" /><category term=" core" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+core/default.aspx" /><category term=" dual" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+dual/default.aspx" /><category term=" haswell" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+haswell/default.aspx" /><category term=" inte" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+inte/default.aspx" /><category term=" ivy" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+ivy/default.aspx" /><category term=" quad" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+quad/default.aspx" /><category term=" sandy" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+sandy/default.aspx" /><category term="cpu" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/cpu/default.aspx" /></entry><entry><title>WCF WebApi! Come creare un framework in standard WebApi con WCF, completamente da zero!</title><link rel="alternate" type="text/html" href="/b/tonyexpo/archive/2012/12/23/wcf-webapi-come-creare-un-framework-in-standard-webapi-con-wcf-completamente-da-zero.aspx" /><id>/b/tonyexpo/archive/2012/12/23/wcf-webapi-come-creare-un-framework-in-standard-webapi-con-wcf-completamente-da-zero.aspx</id><published>2012-12-23T20:54:00Z</published><updated>2012-12-23T20:54:00Z</updated><content type="html">&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;ciao a tutti&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;ringrazio tutti coloro che mi hanno seguito nella sessione WCF, ASP.NET &amp;amp; NancyFX WebApi all’evento API for Mobile Code Cage&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;le Web Api sono uno standard, attualmente poco formalizzato, di programmazione distribuita basata su protocollo REST&lt;/p&gt;  &lt;p&gt;vengono messi a confronto con un’implementazione parallela (le soluzioni hanno identiche api) tre diverse tecnologie&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Questi gli esempi completi di come WCF se l’è cavata! e devo dire, anche molto bene&lt;/p&gt;  &lt;p&gt;benché per far funzionare il tutto in ottica MVC (si, ho fatto funzionare WCF in MVC, senza usare asp.net mcv), mi abbia richiesto di riscrivere alcuni componenti essenziali di WCF stesso…..&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;per scaricare slides ed esempi, clicca &lt;a href="https://skydrive.live.com/redir?resid=CA88DE3FE96690E4!698"&gt;QUI&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;a presto&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetlombardia.org/aggbug.aspx?PostID=823" width="1" height="1"&gt;</content><author><name>tonyexpo</name><uri>http://dotnetlombardia.org/members/tonyexpo/default.aspx</uri></author><category term="wcf" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/wcf/default.aspx" /><category term=" azure" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+azure/default.aspx" /><category term=" binding" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+binding/default.aspx" /><category term=" webapi" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+webapi/default.aspx" /><category term=" api" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+api/default.aspx" /><category term=" custom" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+custom/default.aspx" /><category term=" encoder" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+encoder/default.aspx" /><category term=" web" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+web/default.aspx" /></entry><entry><title>Transazioni, ACID, SOA &amp; WS-AT…. comuni incomprensioni… una chiara spiegazione</title><link rel="alternate" type="text/html" href="/b/tonyexpo/archive/2012/11/28/transazioni-acid-soa-amp-ws-at-comuni-incomprensioni-una-chiara-spiegazione.aspx" /><id>/b/tonyexpo/archive/2012/11/28/transazioni-acid-soa-amp-ws-at-comuni-incomprensioni-una-chiara-spiegazione.aspx</id><published>2012-11-28T22:19:00Z</published><updated>2012-11-28T22:19:00Z</updated><content type="html">&lt;p&gt;Ciao a tuti&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;approfitto di questa occasione per fare una delle mie solite digressioni, questa volta sulle transazioni&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Inizio con il dire che &amp;ldquo;transazione&amp;rdquo; &amp;egrave; un modo di dire generico, quasi un diminutivo, di una frase ben pi&amp;ugrave; completa che &amp;egrave; &amp;ldquo;transazione atomica&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Le due parole significano quindi &amp;ldquo;un insieme di comandi&amp;rdquo; (transazione), eseguiti in maniera &amp;ldquo;imprescindibile&amp;rdquo; (atomica) &lt;/p&gt;
&lt;p&gt;Degli esempi tipici sono: ho una fattura composta da dettaglio (intestazioni, etc) e corpo (le voci)&amp;hellip; se devo persistere su uno storage (un DB) questo insieme di cose, quasi certamente dovr&amp;ograve; farlo in maniera transazionale, perch&amp;eacute; &amp;egrave; assurdo pensare di persistere una fattura con qualche riga in meno del dovuto, per gli ovvi motivi&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Una transazione &amp;egrave; quindi un contenitore di comandi, che ha il compito di garantirne l&amp;rsquo;esecuzione atomica, e per farlo esegue pi&amp;ugrave; compiti (che quindi hanno dei costi in termini di infrastruttura e di risorse), che in genere possono essere riassunte in:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;le singole operazioni vengono eseguite &lt;/li&gt;
&lt;li&gt;viene analizzato il risultato delle singole operazioni &lt;/li&gt;
&lt;li&gt;se tutte danno esito positivo un comando di persistenza (in genere detto &amp;ldquo;commit&amp;rdquo;) della transazione viene eseguito per dare il verde a tutte le operazioni &lt;/li&gt;
&lt;li&gt;altrimenti, se una qualunque operazione ha dato esito negativo, tutte le operazioni vengono annullate (in gergo detto &amp;ldquo;rollback&amp;rdquo;) &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;ACID&lt;/h3&gt;
&lt;p&gt;Lo standard di definizione di una transazione &amp;egrave; dato dall&amp;rsquo;acronimo &lt;a href="http://en.wikipedia.org/wiki/ACID"&gt;ACID&lt;/a&gt;, che sta per:&lt;/p&gt;
&lt;p&gt;Atomic: le operazioni contenute nella transazione sono imprescindibili, o tutte vanno a buon fine, o tutte vengono annullate al fallimento di una qualunque di esse&lt;/p&gt;
&lt;p&gt;Consistent: le operazioni delle transazioni sottostanno al modello dati su cui vengono persistite (es sui DB referenziali, vengono rispettate tutte le constraint), se una qualunque operazione della transazione non &amp;egrave; valida nei confronti del modello dati, tutta la transazione viene annullata&lt;/p&gt;
&lt;p&gt;Isolated: ogni transazione, se eseguita in contesto concorrente con altre transazioni, deve essere isolata dalle altre in modo da garantire una esecuzione congrua dall&amp;rsquo;inizio fino alla fine dei comandi contenuti nella stessa transazione; &amp;egrave; anche garantito che il fallimento di una transazione non influisca su altre transazioni in corso di esecuzione&lt;/p&gt;
&lt;p&gt;Durable: l&amp;rsquo;engine che esegue la transazione si impegna a garantire il salvataggio dei dati (che viene dato quindi per certo) una volta richiesto il comando di persistenza di tutte le operazioni contenute nella transazione&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;All&amp;rsquo;interno di una transazione, va detto che esiste in gergo un &amp;ldquo;isolation level&amp;rdquo;, un livello di isolamento che configura il come la transazione interagisce con altre transazioni, come se e quanto vengano viste le modifiche in corso in una transazione da un&amp;rsquo;altra transazione, etc.. &lt;a href="http://en.wikipedia.org/wiki/Isolation_(database_systems)"&gt;QUI&lt;/a&gt; &amp;egrave; possibile averne una spiegazione. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Le transazioni in genere si eseguono nei confronti di un singolo motore di persistenza di dati (in genere un DB), ma anche una coda (queue, es. MSMQ), o altri sistemi&lt;/p&gt;
&lt;p&gt;Le transazioni possono essere innestate (transazioni di transazioni), ed infine esistono anche transazioni distribuite, quelle che eseguono transazioni innestate nei confronti di pi&amp;ugrave; sistemi (es. 2 diversi database).&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Nelle transazioni singole (verso un unico DBMS), esistono 2 approcci per implementare la transazione:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Write_ahead_logging"&gt;Write-ahead logging&lt;/a&gt;: le operazioni di modifica (e)[in base al DBMS] i dati originali (in caso di update) vengono scritte su un file di log e non sul file primario del database. Questo garantisce il commit se tutto va bene, il rollback in caso di errore, il &amp;ldquo;redo&amp;rdquo; (secondo tentativo) in caso di &lt;a href="http://en.wikipedia.org/wiki/Blue_Screen_of_Death"&gt;BSOD&lt;/a&gt; del sistema o crash del DBMS. La pulizia del file di log &amp;egrave; impostata sempre dal DBMS. &lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Shadow_paging"&gt;Shadow-paging&lt;/a&gt;: i dati del DB vengono suddivisi in pagine. eventuali modifiche da persistere vengono scritte su una pagina a parte, e solo alla commit della transazione, la pagina viene accodata (in caso di insert), o sovrascritta (in caso di update), o rimossa (in caso di delete) dal file primario del DBMS &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Per eseguire queste operazioni, i DBMS utilizzano dei &lt;a href="http://en.wikipedia.org/wiki/Isolation_(database_systems)#Isolation_Levels_vs_Locks"&gt;LOCK&lt;/a&gt;, dei blocchi a vari livelli, impostati per sincronizzare l&amp;rsquo;accesso alle risorse&lt;/p&gt;
&lt;p&gt;Se pi&amp;ugrave; connessioni al DB eseguono transazioni sulle stesse tabelle, il DB utilizzando i lock sulla tabella intera, su un gruppo di righe, o sulla singola riga, riesce a coordinare l&amp;rsquo;accesso a queste informazioni. Quale di questi lock usare, se usarli, etc, &amp;egrave; scelto dal DBMS anche in base al livello di isolamento utilizzato&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Transazioni distribuite&lt;/h3&gt;
&lt;p&gt;Differente &amp;egrave; l&amp;rsquo;approccio utilizzato quando si utilizzano transazioni &amp;ldquo;distribuite&amp;rdquo;, che quindi agiscono su pi&amp;ugrave; sistemi (es. un software deve chiamare in contemporanea 2 diversi WebServices, o un WS ed un DB, o 2 diversi DB):&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;In questo caso l&amp;rsquo;approccio utilizzato principalmente &amp;egrave; quello della cosidetta 2PC (&lt;a href="http://en.wikipedia.org/wiki/Two-phase_commit_protocol"&gt;two phase commit&lt;/a&gt;). Questa &amp;egrave; in pratica l&amp;rsquo;ACID in ottica distribuita. La differenza &amp;egrave; il fatto che tutte le operazioni vengono fatte nei confronti di sistemi, che poi in autonomia implementano la loro transazionalit&amp;agrave;, quindi ad esempio sql server fa il suo dentro di se, oracle il suo, e la transazione distribuita serve per coordinare i due nodi.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;La 2PC &amp;egrave; suddivisa in 2 fasi (dal nome si evinceva&amp;hellip;)&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Voting phase: il coordinatore chiede a tutti i partecipanti la transazione (i sistemi) di fare il loro compito tornandone lo stato (successo, fallimento) &lt;/li&gt;
&lt;li&gt;Completion phase: il coordinatore analizza i risultati dei partecipanti (detti anche i Voti) e decide se mandare un messaggio di conferma a tutti i partecipanti, o di annullamento, se uno qualunque vota NO, o non vota (e va in timeout) &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Nel realizzare WebServices transazionali, che utilizzino il protocollo SOAP, il supporto alla 2PC &amp;egrave; dato dai protocolli &lt;a href="http://en.wikipedia.org/wiki/WS-Atomic_Transaction"&gt;WS-AT&lt;/a&gt; (AtomicTransaction) e &lt;a href="http://en.wikipedia.org/wiki/WS-Coordination"&gt;WS-Coordination&lt;/a&gt;, dove il secondo &amp;egrave; il protocollo della gestione del contesto distribuito (in pratica l&amp;rsquo;attivatore della transazione), ed il primo &amp;egrave; un protocollo che virtualizza l&amp;rsquo;ACID tramite il contesto di coordinamento.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Infine va detto che la quasi totalit&amp;agrave; dei sistemi nel mondo Microsoft utilizza il Microsoft il DTC (&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms681205(v=vs.85).aspx"&gt;distributed transaction coordinator&lt;/a&gt;) per eseguire RPC (remote procedure call) in maniera distribuita e transazionale tra i vari sistemi (es. SQL Server, WS SOAP, etc).&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;SOA &amp;amp; Transazioni&lt;/h3&gt;
&lt;p&gt;Non si pu&amp;ograve; avere enterprise senza transazioni, e difficilmente lo si pu&amp;ograve; avere senza SOA, quindi pensare che questi due pilastri dell&amp;rsquo;enterprise non possano coesistere &amp;egrave; assurdo. Una transazione in un contesto SOA ha i seguenti risultati:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Irrobustisce l&amp;rsquo;ambiente &lt;/li&gt;
&lt;li&gt;Rende l&amp;rsquo;ambiente a servizi pi&amp;ugrave; coeso (pi&amp;ugrave; fiducia in service-composition) &lt;/li&gt;
&lt;li&gt;Aumenta l&amp;rsquo;integrabilit&amp;agrave; di sistemi eterogenei facenti parte dello stesso ambiente a servizi &lt;/li&gt;
&lt;li&gt;Aumenta i costi di infrastruttura per il maggior numero di messaggi interscambiati &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ma, anche se il punto 4 &amp;egrave; un &amp;ldquo;contro&amp;rdquo;, va ricordato uno dei principi (diciamo pure capisaldi) del SOA: &amp;ldquo;Service Composability&amp;rdquo;, che enuncia: &amp;quot;Services are effective composition participants, regardless of the size and complexity of the composition.&amp;quot;&lt;/p&gt;
&lt;p&gt;Il significato, secondo &lt;a href="http://en.wikipedia.org/wiki/Thomas_Erl"&gt;Thomas Erl&lt;/a&gt;, non &amp;egrave; solo che i servizi devono poter essere in grado di essere composti tra di loro, essere richiamabili a cascata, etc, ma anche essere in grado di farlo, senza perdite in latenza, numero di messaggi processati, etc&amp;hellip; quindi, pensare di poter fare SOA, senza la potenza e la capacit&amp;agrave; di gestire migliaia o milioni di messaggi &amp;egrave; impossibile, e quindi si pu&amp;ograve; dire che l&amp;rsquo;unico contro &amp;egrave; in realt&amp;agrave; incluso per definizione nelle specifiche del SOA stesso.&lt;/p&gt;
&lt;p&gt;Comunque, riguardo ai principi, usare transazioni nel SOA apporta, secondo la mappatura dei principi del SOA di Erl, benefici ai seguenti principi:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Service Composability &lt;/li&gt;
&lt;li&gt;Service Interoperability &lt;/li&gt;
&lt;li&gt;Quality of service &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pi&amp;ugrave; precisamente: se una operazione di business &amp;egrave; in (contiene una) transazione, questa definisce un contesto di coordinamento, e questi garantiscono funzionalit&amp;agrave; transazionali ai WebServices&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Citando sempre Thomas Erl nel suo famoso libro &amp;ldquo;SOA Priciples of Service design&amp;rdquo;, al punto 6.4.5 leggiamo:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;ldquo;Much of the transactional funciontality implemented in service-oriented solutions is done so among the components that execute an activity on behalf of a single service. However, as more services emerge within an organization and as service compositions become more commonplace, &lt;span style="text-decoration:underline;"&gt;the need to move transaction boundaries into cross-service interaction scenarios increases&lt;/span&gt;. &lt;span style="text-decoration:underline;"&gt;Being able to guarantee an outcome of an activity is a key part of enterprise-level computing, and atomic transactions therefore play an important role in ensuring quality of service&lt;/span&gt;.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;E continua:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;ldquo;&lt;span style="text-decoration:underline;"&gt;Not only do atomic transactional capabilities lead to a robust execution environment for SOA activities, they promote interoperability when extented into integrated environments&lt;/span&gt;. This allows the scope of an activity to span different solutions built with different vendor platforms, while still being assured a guaranteed all-or-nothing outcome.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Assuming, of course, that WS-AtomicTransaction is supported by the affected applications, this option broadens the application of the two-phase commit protocol beyond traditional application boundaries (thus, supporting service interoperability).&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Transazioni &amp;amp; REST&lt;/h3&gt;
&lt;p&gt;Mi spiace, ma REST non supporta niente di quanto detto finora&amp;hellip;&lt;/p&gt;
&lt;p&gt;REST &amp;egrave; un WebService puro, in pratica si rif&amp;agrave; alla sicurezza del webserver, al caching del webserver&amp;hellip; in pratica il protocollo non supporta quasi niente di suo visto che per quasi ogni cosa si poggia sul webserver (IIS nel mondo Microsoft), e visto che non possiamo richiamare pagine Html tramite HTTP in maniera transazionale, non possiamo nemmeno chiamarne API (WebApi, o chiamate REST che siano)&lt;/p&gt;
&lt;p&gt;Infatti nelle specifiche di questo tipo di servizi &amp;egrave; specificato di non usare transazioni, non usare sessioni, non usare stati&amp;hellip; e per quel tipo di servizi &amp;egrave; pi&amp;ugrave; che corretto! oltre che comunque una buona practice, sempre per quel tipo di servizi (quelli REST)&amp;hellip;..&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Saluto tutti i lettori che hanno avuto la voglia di leggere fin qui &lt;img src="http://dotnetlombardia.org/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-00-13-metablogapi/4718.wlEmoticon_2D00_smile_5F00_00987418.png" alt="Sorriso" style="border-style:none;" class="wlEmoticon wlEmoticon-smile" /&gt;&lt;/p&gt;
&lt;p&gt;A presto&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetlombardia.org/aggbug.aspx?PostID=815" width="1" height="1"&gt;</content><author><name>tonyexpo</name><uri>http://dotnetlombardia.org/members/tonyexpo/default.aspx</uri></author><category term="soa" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/soa/default.aspx" /><category term="transazione" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/transazione/default.aspx" /><category term="acid" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/acid/default.aspx" /><category term="atomic" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/atomic/default.aspx" /><category term="rest" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/rest/default.aspx" /><category term="soap" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/soap/default.aspx" /><category term="transazioni" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/transazioni/default.aspx" /><category term="ws-at" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/ws_2D00_at/default.aspx" /><category term="ws-atomictransaction" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/ws_2D00_atomictransaction/default.aspx" /><category term="ws-coordination" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/ws_2D00_coordination/default.aspx" /></entry><entry><title>WPC 2012 – Grazie 1000 – DEMO &amp; SLIDES</title><link rel="alternate" type="text/html" href="/b/tonyexpo/archive/2012/11/27/wpc-2012-grazie-1000-demo-amp-slides.aspx" /><id>/b/tonyexpo/archive/2012/11/27/wpc-2012-grazie-1000-demo-amp-slides.aspx</id><published>2012-11-27T08:39:00Z</published><updated>2012-11-27T08:39:00Z</updated><content type="html">&lt;p&gt;Ciao a tutti&lt;/p&gt;  &lt;p&gt;Inizio subito col dire “Grazie” a tutti i partecipanti che mi hanno ascoltato (o sorbito), ed a tutti gli organizzatori che mi hanno accolto nuovamente quest’anno al mitico WPC&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Mi dispiace non aver potuto assaporare tutte le giornate di WPC quest’anno per motivi di lavoro (ovviamente), ma posso sicuramente dire che la giornata trascorsa in vostra compagnia è stata una giornata felice!&lt;/p&gt;  &lt;p&gt;Si è respirato aria di famiglia… e questo è il più bel complimento che io possa mai fare! &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Qui di seguito &lt;a href="https://skydrive.live.com/redir?resid=CA88DE3FE96690E4!683"&gt;SLIDES E DEMO&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;A presto&lt;/p&gt;  &lt;p&gt;Anto&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetlombardia.org/aggbug.aspx?PostID=814" width="1" height="1"&gt;</content><author><name>tonyexpo</name><uri>http://dotnetlombardia.org/members/tonyexpo/default.aspx</uri></author><category term="wpc" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/wpc/default.aspx" /><category term=" wcf" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+wcf/default.aspx" /><category term=" soa" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+soa/default.aspx" /><category term=" demo" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+demo/default.aspx" /><category term=" slide" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+slide/default.aspx" /><category term=" 2012" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+2012/default.aspx" /></entry><entry><title>Real world SOA for .NET 4.5–SLIDES &amp; DEMO</title><link rel="alternate" type="text/html" href="/b/tonyexpo/archive/2012/11/21/real-world-soa-for-net-4-5-slides-amp-demo.aspx" /><id>/b/tonyexpo/archive/2012/11/21/real-world-soa-for-net-4-5-slides-amp-demo.aspx</id><published>2012-11-21T13:21:00Z</published><updated>2012-11-21T13:21:00Z</updated><content type="html">&lt;p&gt;Ciao a tutti&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Ringrazio il Codemotion Venezia 2012 per aver ospitato la mia sessione dedicata allo sviluppo di servizi&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;qui di seguito i link per scaricare &lt;a href="https://skydrive.live.com/redir?resid=CA88DE3FE96690E4!676"&gt;SLIDES e DEMO&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;a presto&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetlombardia.org/aggbug.aspx?PostID=812" width="1" height="1"&gt;</content><author><name>tonyexpo</name><uri>http://dotnetlombardia.org/members/tonyexpo/default.aspx</uri></author><category term=" wcf" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+wcf/default.aspx" /><category term=" soa" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+soa/default.aspx" /><category term=" rest" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+rest/default.aspx" /><category term=" websockets" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+websockets/default.aspx" /><category term=" soap" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+soap/default.aspx" /><category term=" venezia" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+venezia/default.aspx" /><category term=" webapi" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/+webapi/default.aspx" /><category term="codemotion" scheme="http://dotnetlombardia.org/b/tonyexpo/archive/tags/codemotion/default.aspx" /></entry></feed>