<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Web Log di Raffaele Rialdi</title>
        <link>http://blogs.ugidotnet.org/raffaele/Default.aspx</link>
        <description>&amp;nbsp;</description>
        <language>it-IT</language>
        <copyright>Raffaele Rialdi</copyright>
        <generator>Subtext Version 2.1.0.3</generator>
        <image>
            <title>Web Log di Raffaele Rialdi</title>
            <url>http://blogs.ugidotnet.org/images/RSS2Image.gif</url>
            <link>http://blogs.ugidotnet.org/raffaele/Default.aspx</link>
            <width>77</width>
            <height>60</height>
        </image>
        <item>
            <title>Quando l'assistenza Dell ti molla per la strada</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2009/06/18/quando-lassistenza-dell-ti-molla-per-la-strada.aspx</link>
            <description>&lt;p&gt;Questa mattina la batteria del mio portatile (Dell XPS) è defunta. Estraendo la batteria e premendo il pulsante di controllo della carica non si accende nessun led. La diagnostica del bios e quella su chiavetta USB indicano che la batteria è difettosa.&lt;/p&gt;  &lt;p&gt;Avendo una assistenza a copertura totale (Premium Hardware Support), chiamo per avere una sostituzione. La batteria ha una garanzia di solo un anno che naturalmente è appena trascorso (due mesi fuori).&lt;/p&gt;  &lt;p&gt;A questo punto vado sul sito per un acquisto e il tempo di arrivo è di ben 10 giorni.&lt;/p&gt;  &lt;p&gt;Ma l'assistenza "Premium Hardware Support" non dovrebbe garantire un &lt;strong&gt;&lt;u&gt;servizio&lt;/u&gt;&lt;/strong&gt; al cliente per evitargli di doversi comprare un notebook di riserva?    &lt;br /&gt;Batteria fuori garanzia? Mi sta anche bene se te ne &lt;strong&gt;&lt;u&gt;anticipano&lt;/u&gt;&lt;/strong&gt; una e poi la paghi se verifichi che sia effettivamente quella la vera causa del problema.&lt;/p&gt;  &lt;p&gt;Oltre a questo va detto che il guasto è sull'elettronica della batteria e non sulle celle. Quindi si tratta di guasto e non di pezzo esausto (considerato che la garanzia della batteria viene limitata a un anno con la &lt;strong&gt;&lt;u&gt;scusa&lt;/u&gt;&lt;/strong&gt; che si tratti di un 'consumabile').&lt;/p&gt;  &lt;p&gt;Dell invece ha scelto di tirare il pacco al cliente e mollarlo per la strada. Meditate gente, meditate.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/96454.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2009/06/18/quando-lassistenza-dell-ti-molla-per-la-strada.aspx</guid>
            <pubDate>Thu, 18 Jun 2009 09:21:31 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/96454.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2009/06/18/quando-lassistenza-dell-ti-molla-per-la-strada.aspx#feedback</comments>
            <slash:comments>14</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/96454.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/96454.aspx</trackback:ping>
        </item>
        <item>
            <title>SurfRaf dietro le quinte</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2009/06/14/surfraf-dietro-le-quinte.aspx</link>
            <description>&lt;p&gt;Come molti sapranno al recente &lt;a href="http://www.ugidotnet.org/events/35edOltre.aspx"&gt;workshop UGIdotNET&lt;/a&gt; tenutosi a Predappio ha esordito il mio SurfRaf. Per chi vuole subito vederlo all’opera ecco i &lt;a href="http://blogs.ugidotnet.org/corrado/archive/2009/06/10/ugidotnet-predappio.aspx"&gt;video girati da Corrado&lt;/a&gt; a Predappio e dal sottoscritto oggi:&lt;/p&gt;  &lt;p&gt;Video 1: com’è fatto&lt;/p&gt;  &lt;p&gt;   &lt;/p&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:cc0fd94d-91f5-4229-8e79-7bc582123c0a" class="wlWriterEditableSmartContent"&gt;&lt;div id="937ab624-c221-4be6-bc0b-789c23e3b9e8" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=ri4QfCZ3FJA" target="_new"&gt;&lt;img src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/raffaele/WindowsLiveWriter/SurfRafdietrolequinte_F480/video15678a13a109.jpg" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('937ab624-c221-4be6-bc0b-789c23e3b9e8'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/ri4QfCZ3FJA&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/ri4QfCZ3FJA&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Video 2: come funziona parte 1&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:41774c10-03da-4845-b95d-4134f5ab66c0" class="wlWriterEditableSmartContent"&gt;&lt;div id="fe69db87-7208-4d06-91c2-b2706a7f7a60" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=PuoNVaZnn2s" target="_new"&gt;&lt;img src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/raffaele/WindowsLiveWriter/SurfRafdietrolequinte_F480/videob45ac4d8b374.jpg" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('fe69db87-7208-4d06-91c2-b2706a7f7a60'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/PuoNVaZnn2s&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/PuoNVaZnn2s&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Video 3: come funziona parte 2&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:04a7d5cf-40b2-40f8-947d-bad092934a9f" class="wlWriterEditableSmartContent"&gt;&lt;div id="f419497d-a808-44f5-aaa2-203a3f0f18bd" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=w5ExAjRJQXU" target="_new"&gt;&lt;img src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/raffaele/WindowsLiveWriter/SurfRafdietrolequinte_F480/videoc09222620f8b.jpg" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('f419497d-a808-44f5-aaa2-203a3f0f18bd'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/w5ExAjRJQXU&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/w5ExAjRJQXU&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Per chi fosse andato per un annetto in antartide :), &lt;a href="http://www.microsoft.com/surface/"&gt;Microsoft Surface&lt;/a&gt; è un dispositivo (equipaggiato con Vista) che permette di usare diverse applicazioni con le sole “gesture” ossia muovendo con le mani gli oggetti disposti sullo schermo.    &lt;br /&gt;Surface è venduto da Microsoft sotto forma di tavolo a circa 10K$ ed ha avuto successo in alcune catene di alberghi per applicazioni di concierge. Internamente mi è stato detto che ci sono 9 telecamere a infrarosso e diverse altre diavolerie che ne giustificano il prezzo.    &lt;br /&gt;Se volete vederlo all’opera dal vivo venite al &lt;strong&gt;&lt;a href="http://www.microsoft.com/italy/nextweb/remix/index.aspx"&gt;Remix Italia Mercoledi 17 Giugno 2009&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;Dopo l’esperienza e il successo di Surface, Microsoft ha deciso (come sempre) di creare un supporto device-independent e relativo SDK. Tutto ciò è disponibile in Windows 7 con API native e managed grazie a WPF 4.0. A quanto sembra la prossima versione di Surface userà questo supporto e sarà basata su questa nuova piattaforma.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Il multitouch è economico&lt;/strong&gt;. Il primo dispositivo (monitor sensibile al multitouch) che viene visto da Windows 7 è stato presentato a PDC 2008. È HP SmartTouch che da vari siti internet si può comprare intorno ai 1000$. Questo è un dato significativo perché obbliga noi sviluppatori a ripensare completamente &lt;strong&gt;all’&lt;u&gt;ergonomia&lt;/u&gt; delle nostre applicazioni&lt;/strong&gt;. Non c’è dubbio che di questo se ne parlerà molto.&lt;/p&gt;  &lt;p&gt;Il developer che vuole provare a farsi venire qualche idea costruendo un device multitouch a basso prezzo può fare come ha fatto il sottoscritto.   &lt;br /&gt;L’idea di per se non è nuova e come ho precisato in sessione il &lt;strong&gt;lavoro più duro&lt;/strong&gt; è suddiviso in quattro parti:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Il progetto &lt;a href="http://www.nuigroup.com/"&gt;NuiGroup&lt;/a&gt; (progetto Tbeta) che riconosce le immagini dalla webcam, elabora l’immagine con edge-detect e altri filtri estrapolando solo le ombre più nere (quelle dove appoggiamo le dita allo schemo traslucido). Le “ditate” indicano le coordinate di ogni “touch” e vengono trasmesse via socket. Da notare che questo progetto può sfruttare la GPU ma che nonostante questo sovraccarica una CPU in modo molto pesante.&lt;/li&gt;    &lt;li&gt;Il progetto &lt;a href="http://www.codeplex.com/MultiTouchVista"&gt;MultiTouchVista&lt;/a&gt; che installa un driver per Windows 7 e una applicazione helper che riceve dal socket i touch e li passa al driver che emula un device “touch-enabled” di Windows.&lt;/li&gt;    &lt;li&gt;Windows 7 che normalizza gli input e li fornisce alle applicazioni che desiderano supportare questa feature.&lt;/li&gt;    &lt;li&gt;WPF 4.0 che mette a disposizione dello sviluppatore sugli UIElement una serie di eventi (nuovi per WPF 4.0) e una proprietà che permette di decidere le gesture che sono abilitate.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Do-it-yourself!&lt;/strong&gt; Non si ottiene certamente lo stesso risultato (i touch saranno su uno schermo bianco e non sulle ‘vere’ immagini di uno schermo, e questo fa una bella differenza) e il consumo di CPU è notevole, ma è comunque un ottimo modo per provare la propria applicazione. Insomma per noi dev, funziona alla grande!&lt;/p&gt;  &lt;p&gt;Per chi si vuole cimentare:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Webcam. Preferibilmente 640x480 o più. Meglio se consente la regolazione manuale del focus e della luminosità. Le regolazioni automatiche possono cambiare la resa dell’immagine con sopra la mano.&lt;/li&gt;    &lt;li&gt;Scatola profonda. Il cono di ripresa delle webcam tipicamente è stretto per cui la scatola deve essere profonda. L’interno della scatola deve essere scuro. Mettendo la luce all’interno la webcam non potrebbe ‘vedere’ le ombre delle dita.&lt;/li&gt;    &lt;li&gt;Applicare la webcam in fondo alla scatola, centrandola e tenendola molto ferma. La Köllä a Käldö è vostra amica ;-)&lt;/li&gt;    &lt;li&gt;Plexiglass. Il Plexiglass bianco latte si trova nei fai-da-te e ce lo si può far ritagliare della misura giusta al banco del taglio del legno. Per arrotondare gli angoli ho usato il mio trapano da bricolage ma anche un seghetto manuale funziona allo scopo.&lt;/li&gt;    &lt;li&gt;Illuminazione. Le strisce di led si trovano nei negozi di elettronica. L’alimentazione di solito è a 12V per cui basta saldare qualche pezzo di filo e portarlo ad un jack di alimentazione fissato sulla scatola. Un qualsiasi alimentatore dovrebbe essere sufficiente visto che la corrente necessaria ad alimentare i led è veramente minima.     &lt;br /&gt;Per evitare che i fili passino davanti alla webcam dentro la scatola, basta fissarli con la colla alle pareti. Io ho preferito fissare alle pareti dei tubetti dentro cui passano i fili.&lt;/li&gt;    &lt;li&gt;Per fissare le strisce di led ho preso un profilato di alluminio a “U”. Alcuni profilati hanno delle sezioni interne dentro cui la striscia di led può slittare dentro. Ammetto che ci vuole un po’ di fortuna ma con un minimo di manualità si può fare un lavoro che abbia un minimo di estetica.&lt;/li&gt;    &lt;li&gt;Infine installare tutto il software.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Ecco alcuni punti a cui fare molta attenzione:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;l’illuminazione è cruciale per la buona riuscita del device. Le ombre delle mani possono ingannare i filtri e risultare in coordinate imprecise&lt;/li&gt;    &lt;li&gt;L’illuminazione a led bianchi è efficace ma purtroppo i led hanno un cono di illuminazione molto stretto. Il cono stretto non permette una illuminazione diffusa. La soluzione è alta luminosità e controllo dell’angolo di incidenza.     &lt;br /&gt;Tra le tante ho provato a mettere uno schermo davanti ai led, ma la luminosità si abbatte troppo e creando un’ombra centrale decisamente controproducente.&lt;/li&gt;    &lt;li&gt;Lo schermo in plexiglass bianco latte ha un’ottima resa. Basta sceglierlo piuttosto spesso per evitare che fletta durante i ‘touch’.&lt;/li&gt;    &lt;li&gt;Il driver del progetto MultiTouchVista è privo di firma digitale e su Windows 7 a 64 bit non è possibile installarlo. La soluzione è quella di firmare il driver con un certificato self-signed e di fare il boot di Windows 7 abilitando i certificati self-signed.     &lt;br /&gt;Se qualcuno arriva fino a qui e vuole due dritte su come fare, è sufficiente che posti un commento a questo post e mi farò vivo con ulteriori istruzioni.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Cosa manca ancora?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;La parte più divertente :) cioè scrivere una applicazione multitouch enabled con Visual Studio 2010 e WPF 4.0. Beh per questo ci saranno altre occasioni per parlarne. Ad ogni modo, come ho mostrato in sessione, il sorgente della mia demo è realmente molto semplice.&lt;/p&gt;  &lt;p&gt;Enjoy!&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/96423.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2009/06/14/surfraf-dietro-le-quinte.aspx</guid>
            <pubDate>Sat, 13 Jun 2009 22:37:56 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/96423.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2009/06/14/surfraf-dietro-le-quinte.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/96423.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/96423.aspx</trackback:ping>
        </item>
        <item>
            <title>Workshop UGIdotNET!</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2009/06/05/workshop-ugidotnet.aspx</link>
            <description>&lt;p&gt;Ci siamo, Lunedi 8 Giugno è la data del &lt;a href="http://www.ugidotnet.org/events/35edOltre.aspx"&gt;prossimo workshop&lt;/a&gt;. Agenda fantastica, location diversa dal solito (Predappio - Forlì), clima perfetto.&lt;/p&gt;  &lt;p&gt;Da parte mia non posso ancora anticipare nulla perché avrò delle demo che ... (beeeep) ... e chi non c'è ... si perderà qualcosa che non si può raccontare.&lt;/p&gt;  &lt;p&gt;Se siete indecisi rompete gli indugi e venite! Windows 7 rulez.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/96362.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2009/06/05/workshop-ugidotnet.aspx</guid>
            <pubDate>Fri, 05 Jun 2009 18:16:12 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/96362.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2009/06/05/workshop-ugidotnet.aspx#feedback</comments>
            <slash:comments>12</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/96362.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/96362.aspx</trackback:ping>
        </item>
        <item>
            <title>Le Code Dependencies di Visual Studio 2010</title>
            <category>VS2010</category>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2009/05/30/le-code-dependencies-di-visual-studio-2010.aspx</link>
            <description>&lt;p&gt;Tra le mille nuove bellezze in Visual Studio 2010 ho trovato estremamente utile le Code Dependencies.&lt;/p&gt;  &lt;p&gt;L'ho subito voluto provare su un progetto che stiamo realizzando che consiste in una elaborazione a pipeline di due documenti XML. La natura del progetto importa poco, diciamo per semplicità che è una mera blackbox lato server che prende dei dati in entrata e spara il risultato in uscita.&lt;/p&gt;  &lt;p&gt;Dal menu Analyze, "Visualize Code Dependencies", "By Class" si ottiene subito un grafico interessante.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/raffaele/WindowsLiveWriter/LeCodeDependenciesdiVisualStudio2010_D868/image_4.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/raffaele/WindowsLiveWriter/LeCodeDependenciesdiVisualStudio2010_D868/image_thumb_1.png" width="244" height="125" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Appare subito chiaro che il grafico ha alcuni "intrusi" come le dipendenze dagli assembly del Framework ("External"), le interfacce che aumentano inutilemente la complessità nelle dipendenze (vale probabilmente la pena di avere un diagramma separato solo per queste), ed infine le classi del programma di test.&lt;/p&gt;  &lt;p&gt;Per epurarle si seleziona la classe, e dal menu contestuale si sceglie Selection, Hide. Ecco il risultato:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/raffaele/WindowsLiveWriter/LeCodeDependenciesdiVisualStudio2010_D868/image_6.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/raffaele/WindowsLiveWriter/LeCodeDependenciesdiVisualStudio2010_D868/image_thumb_2.png" width="244" height="120" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Una classe che mi ha subito attirato l'attenzione è la classe statica degli extension methods per XElement, la XElementHelper che ha una dipendenza da BindingInfo. Per avere più dettagli espando la classe XElementHelper e seleziono la BindingInfo, cosa che evidenzia subito il metodo che ha la dipendenza sulla BindingInfo. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/raffaele/WindowsLiveWriter/LeCodeDependenciesdiVisualStudio2010_D868/image_10.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/raffaele/WindowsLiveWriter/LeCodeDependenciesdiVisualStudio2010_D868/image_thumb_4.png" width="244" height="101" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Grazie a questa feature ho già eliminato alcune dipendenze dalla GroupInfo (non più visibili in questi screenshot). Devo dire che l'utilità di questi diagrammi è decisamente altissima.&lt;/p&gt;  &lt;p&gt;Ma un'altra cosa che non vorremmo mai vedere in un progetto sono le circular references:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/raffaele/WindowsLiveWriter/LeCodeDependenciesdiVisualStudio2010_D868/image_12.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/raffaele/WindowsLiveWriter/LeCodeDependenciesdiVisualStudio2010_D868/image_thumb_5.png" width="244" height="120" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;La cosa mi ha subito spaventato ma è apparso invece chiaro che si trattava dei factory methods:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/raffaele/WindowsLiveWriter/LeCodeDependenciesdiVisualStudio2010_D868/image_14.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/raffaele/WindowsLiveWriter/LeCodeDependenciesdiVisualStudio2010_D868/image_thumb_6.png" width="244" height="114" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Avrei voluto vedere un'opzione per eliminare le factory dal grafico, e così ho eseguito la submit di un wish su &lt;a href="http://connect.microsoft.com/"&gt;Connect&lt;/a&gt;. Se lo volete votare, &lt;a href="https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=462064"&gt;qui c'è il link&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Un altro grafico interessante è questo:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/raffaele/WindowsLiveWriter/LeCodeDependenciesdiVisualStudio2010_D868/image_16.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/raffaele/WindowsLiveWriter/LeCodeDependenciesdiVisualStudio2010_D868/image_thumb_7.png" width="244" height="244" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Invito tutti a provare questa feature perché sono convinto che possa rendere più evidente alcuni aspetti oscuri del codice. Durante la fase di code review, i diagrammi di Code Depenenciees sono certamente una 'killer feature'.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/96318.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2009/05/30/le-code-dependencies-di-visual-studio-2010.aspx</guid>
            <pubDate>Sat, 30 May 2009 13:23:26 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/96318.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2009/05/30/le-code-dependencies-di-visual-studio-2010.aspx#feedback</comments>
            <slash:comments>7</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/96318.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/96318.aspx</trackback:ping>
        </item>
        <item>
            <title>VS2010 beta 1</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2009/05/18/vs2010-beta-1.aspx</link>
            <description>&lt;p&gt;Tutti lo sanno, tutti lo scaricano ma ancora nessuno lo blogga… a questo punto eccomi qui :)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/somasegar/"&gt;Visual Studio 2010 e il Framework 4.0&lt;/a&gt; (entrambi in beta 1) sono disponibili al download. Per i primi giorni il download è solo per gli abbonati MSDN mentre poco più avanti sarà disponibile per tutti.&lt;/p&gt;  &lt;p&gt;Io ho installato la beta 1 sul mio portatile (Windows 7 Release Candidate 1) e sta convivendo bene con Visual Studio 2008. Ovviamente è troppo presto per dire altro ma se rimane stabile come nelle ultime due ore, dirò addio a VS2008 visto lo splendido editor, la velocità di caricamento e le nuove bellezze del designer WPF, e naturalmente tutte le novità di FX 4.0, VC++, etc. etc.&lt;/p&gt;  &lt;p&gt;Buon download …&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/96223.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2009/05/18/vs2010-beta-1.aspx</guid>
            <pubDate>Mon, 18 May 2009 20:58:54 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/96223.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2009/05/18/vs2010-beta-1.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/96223.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/96223.aspx</trackback:ping>
        </item>
        <item>
            <title>Geneva Beta 2 finalmente disponibile</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2009/05/13/geneva-beta-2-finalmente-disponibile.aspx</link>
            <description>&lt;p&gt;Come da Roadmap annunciata durante PDC 2008, Geneva (AKA &lt;strong&gt;Identity Platform&lt;/strong&gt;) è andata in &lt;a href="http://msdn.microsoft.com/en-us/security/aa570351.aspx"&gt;beta 2&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Per chi non lo sapesse ancora alcuni dati essenziali di Geneva:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;A PDC 2008 è stato detto che Geneva &lt;strong&gt;rimpiazzerà totalmente il modello a Claim attuale di WCF &lt;/strong&gt;che diventa obsoleto e con notevoli breaking changes: i Claim di WCF attuali sono differenti da quelli di Geneva sia per proprietà che concettualmente.      &lt;br /&gt;Dopo un primo sobbalzo quando li vidi in Zermatt (la ‘alpha’ release di Geneva) devo dire che il modello di Geneva vale tutte le breaking changes&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Geneva Framework&lt;/strong&gt; rende semplice sviluppare scenari con Claim ed STS (Secure Token Service) pur conservando tutto ciò che si è fatto con i ruoli. Questo vale sia per applicazioni asp.net che per servizi WCF.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Geneva Framework&lt;/strong&gt; rende facile sviluppare custom STS. Sebbene questo sia un task molto delicato, sono dozzine i casi reali in cui questo è fortemente richiesto e motivato.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Geneva Server&lt;/strong&gt; è un STS che usa Active Directory come provider di identità per generare token in formato SAML.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Geneva Cardspace&lt;/strong&gt; è la versione 2 di Cardspace e introduce molte novità rispetto al suo predecessore.&lt;/li&gt;    &lt;li&gt;A PDC 2008 è stato detto che le future versioni di &lt;strong&gt;SQL Server&lt;/strong&gt; saranno in grado di “parlare” con le applicazioni Geneva-Enabled, quindi &lt;strong&gt;digerire i token SAML&lt;/strong&gt;. Questo avrà un impatto enorme sull’architettura delle applicazioni in quanto il token SAML in scenari di &lt;strong&gt;delegation&lt;/strong&gt; si porta dietro &lt;strong&gt;&lt;u&gt;almeno due&lt;/u&gt;&lt;/strong&gt; identity. Di questo parlerò in un altro post.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Ma torniamo alla beta 2 …&lt;/p&gt;  &lt;p&gt;Nessuna major changes. I miei samples non ricompilano ma a prima vista le modifiche sono minori. Il modello ad oggetti dei claim è definitivo e tutti i concetti e le classi che costituiscono lo scheletro di Identity Platform sono definitive in questo stadio. A meno di grosse sorprese la RTM dovrebbe solo vedere consolidarsi il tutto, RTM che è stata annunciata a PDC per fine anno 2009.&lt;/p&gt;  &lt;p&gt;Come attesi ci sono:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;nuovi wizard per vs.net per una migliore integrazione&lt;/li&gt;    &lt;li&gt;nuove classi per la configurazione che rende possibile integrare Geneva senza modifiche al ServiceHost e permettendo il riutilizzo del self-hosting di vs.net (cosa che non era possibile nella beta 1)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Novità interessanti:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;FedUtil era prima disponibile solo per scenari asp.net adesso è usabile anche in scenari WCF tradizionali&lt;/li&gt;    &lt;li&gt;ClaimsAuthorizationManager dal nome super promettente. Un manager della fase di autenticazione per i Claim.&lt;/li&gt;    &lt;li&gt;Una lunga serie di eventi per il FederatedAuthenticationModule di asp.net che rende più semplice intervenire durante il processo di logon&lt;/li&gt;    &lt;li&gt;Un nuovo behavior che abilita Geneva senza dover scrivere codice nel service host&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Le novità, oltre a leggerle nella documentazione che compara beta 1 e beta 2, sono ben spiegate dal &lt;a href="http://blogs.msdn.com/card/archive/2009/05/12/what-s-new-in-geneva-beta-2.aspx"&gt;blog del team&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Ho già modificato il mio esempio più semplice: una piccola console che crea delle managed card per Cardspace. È semplicissimo ed estremamente pratico in uno scenario WCF + STS in cui Geneva Framework rende tutto più semplice.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/96172.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2009/05/13/geneva-beta-2-finalmente-disponibile.aspx</guid>
            <pubDate>Tue, 12 May 2009 22:44:03 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/96172.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2009/05/13/geneva-beta-2-finalmente-disponibile.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/96172.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/96172.aspx</trackback:ping>
        </item>
        <item>
            <title>Ricavare da codice l'identity di un certificato per WCF</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2009/05/12/ricavare-da-codice-lidentity-di-un-certificato-per-wcf.aspx</link>
            <description>&lt;p&gt;SvcUtil permette di creare automaticamente la configurazione client di un servizio WCF.&lt;/p&gt;  &lt;p&gt;Tra le cose che vengono create c'è l'encoding in Base64 della chiave pubblica del certificato usato dal server&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: consolas, 'Courier New', courier, monospace; max-height: 200px; font-size: 8pt; overflow: auto; border-top: gray 1px solid; cursor: text; border-right: gray 1px solid; padding-top: 4px"&gt;   &lt;div style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;     &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;identity&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;certificate&lt;/span&gt; &lt;span style="color: #ff0000"&gt;encodedValue&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="AwAAAA ...."&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;identity&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Naturalmente SvcUtil ricava questa informazione dai metadati.&lt;/p&gt;

&lt;p&gt;Sfortunatamente ci sono casi in cui la configurazione del servizio è complessa e non si riesce in modo semplice ad abilitare l'endpoint dei metadati. Guardacaso mi è capitato e il certificato delle due macchine di sviluppo erano diverse.&lt;/p&gt;

&lt;p&gt;Apparentemente la soluzione è semplice:&lt;/p&gt;

&lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: consolas, 'Courier New', courier, monospace; max-height: 200px; font-size: 8pt; overflow: auto; border-top: gray 1px solid; cursor: text; border-right: gray 1px solid; padding-top: 4px"&gt;
  &lt;div style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;
    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; GetEncoded(X509Certificate2 cert)&lt;/pre&gt;

    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[] export = cert.Export(X509ContentType.SerializedCert);&lt;/pre&gt;

    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; encoded = Convert.ToBase64String(export);&lt;/pre&gt;

    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; encoded;&lt;/pre&gt;

    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt; }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Questo valore è corretto per molti certificati ma ha un side-effect pericolosissimo. Il metodo Export esporta il certificato nella sua interezza, cioè compresa la chiave privata, &lt;strong&gt;&lt;u&gt;se presente&lt;/u&gt;&lt;/strong&gt;. Quando viene fatto il deploy di un certificato nello store si può scegliere se installarlo con o senza chiave privata.&lt;/p&gt;

&lt;p&gt;Questo significa che la funzione GetEncoded ricava la stessa stringa di SvcUtil per i certificati con sola chiave pubblica, ma dal momento in cui ci imbattiamo in un certificato con chiave privata esportiamo anche quella. Dare una chiave privata in giro equivale a dare una copia delle chiavi di casa a tutti quelli che incontriamo. Non è proprio quello che si dice una cosa saggia.&lt;/p&gt;

&lt;p&gt;Così ho cercato di eliminare la chiave privata dal certificato prima di esportarla. Dopo un po' di tentativi andati a vuoto mi sono rivolto al buon amico &lt;a href="http://blogs.msdn.com/mariofontana/"&gt;Mario Fontana&lt;/a&gt; (anche se lo tiene nascosto bene, un po' di codice delle CAPICOM viene dalla sua tastiera) che mi ha fatto notare che il formato DER dei certificati si può ottenere semplicemente esportando con l'opzione "X509ContentType.Cert".&lt;/p&gt;

&lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: consolas, 'Courier New', courier, monospace; max-height: 200px; font-size: 8pt; overflow: auto; border-top: gray 1px solid; cursor: text; border-right: gray 1px solid; padding-top: 4px"&gt;
  &lt;div style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;
    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[] der = certRaf.Export(X509ContentType.Cert); // solo &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; key&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;A noi però interessa la SerializedCert e quindi non ci resta che re-importare il certificato appena esportato con "Cert"&lt;/p&gt;

&lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: consolas, 'Courier New', courier, monospace; max-height: 200px; font-size: 8pt; overflow: auto; border-top: gray 1px solid; cursor: text; border-right: gray 1px solid; padding-top: 4px"&gt;
  &lt;div style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;
    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; X509Certificate2 ImportFromBlob(&lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[] certBlob)&lt;/pre&gt;

    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt;     X509Certificate2Collection certs = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; X509Certificate2Collection();&lt;/pre&gt;

    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt;     certs.Import(certBlob);&lt;/pre&gt;

    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt;     X509Certificate2 imported = certs[0];&lt;/pre&gt;

    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; imported;&lt;/pre&gt;

    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   7:&lt;/span&gt; }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
Ed infine richiamare la GetEncoded per ottenere la magica stringa che viene usata nella configurazione client di WCF.&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/96163.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2009/05/12/ricavare-da-codice-lidentity-di-un-certificato-per-wcf.aspx</guid>
            <pubDate>Tue, 12 May 2009 07:19:01 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/96163.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2009/05/12/ricavare-da-codice-lidentity-di-un-certificato-per-wcf.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/96163.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/96163.aspx</trackback:ping>
        </item>
        <item>
            <title>Windows 7 e le legacy apps che funzioneranno 'per forza'</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2009/04/26/windows-7-e-le-legacy-apps-che-funzioneranno-per-forza.aspx</link>
            <description>&lt;p&gt;A quanto sembra Windows 7 vuole far funzionare 'per forza' tutte le applicazioni legacy che hanno 'tradito' le best practice della application compatibility.&lt;/p&gt;  &lt;p&gt;Sebbene alcuni cambiamenti introdotti in Vista erano delle novità rispetto alle versioni precedenti (leggasi per esempio i cambiamenti nella Session 0 e nei componenti della logon), la maggior parte sono diventate 'obbligatorie' ma già best practice anche per Windows XP (leggasi ad esempio l'interattività dei servizi, l'accesso in scrittura ai folder program files o alle chiavi di registri HKLM).&lt;/p&gt;  &lt;p&gt;Sembra che Windows 7 introdurrà il "&lt;a href="http://www.winsupersite.com/win7/xp_mode_pre_shots.asp"&gt;&lt;strong&gt;Windows XP Mode&lt;/strong&gt;&lt;/a&gt;". Si tratta di un Windows XP virtualizzato all'interno di Windows 7 che rende quasi impossibile non far funzionare le applicazioni legacy. Dico quasi perché dipenderà dall'hardware supportato. Da quello che si &lt;a href="http://community.winsupersite.com/blogs/paul/archive/2009/04/24/secret-no-more-revealing-virtual-windows-xp-for-windows-7.aspx"&gt;legge qui&lt;/a&gt;, questa modalità sarà però solo disponibile solo per PC che supportano la virtualizzazione hardware.&lt;/p&gt;  &lt;p&gt;Io però non sono daccordo sul nome. L'ho già ribattezzato con il nome di "Shame Box" ossia la "modalità vergogna", visto che ritengo una vera vergogna che una applicazione debba avere necessità dello Shame Box per funzionare.&lt;/p&gt;  &lt;p&gt;Non appena uscirà la Release Candidate credo che sarà abbastanza naturale vedere stilate le classifiche delle "Applicazioni da Vergogna".&lt;/p&gt;  &lt;p&gt;Il software non è per sempre.&lt;/p&gt;  &lt;p&gt;No, non scrivo queste cose da 'tifoso Microsoft'. Io voglio vedere quante più novità possibili e se delle vecchie applicazioni dovessero frenare il progresso del software, beh allora le caccio via. BTW l'ho già fatto con diverse apps.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/96048.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2009/04/26/windows-7-e-le-legacy-apps-che-funzioneranno-per-forza.aspx</guid>
            <pubDate>Sun, 26 Apr 2009 17:25:16 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/96048.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2009/04/26/windows-7-e-le-legacy-apps-che-funzioneranno-per-forza.aspx#feedback</comments>
            <slash:comments>11</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/96048.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/96048.aspx</trackback:ping>
        </item>
        <item>
            <title>Oracle, Sun e fanta-IT</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2009/04/21/oracle-sun-e-fanta-it.aspx</link>
            <description>&lt;p&gt;Ieri Oracle ha comprato Sun e questa ormai è già notizia "vecchia". IMHO notizia bomba, ma c'è uno strano silenzio.&lt;/p&gt;  &lt;p&gt;Sun possedeva diverse &lt;a href="http://www.sun.com/software/index.jsp?tab=0"&gt;"cosette" interessanti&lt;/a&gt;: Java, mySQL, NetBeans e OpenOffice solo per citare le più famose e senza citare le partecipazioni con gran soldoni ai progetti Open Source. A parte le &lt;a href="http://www.oracle.com/sun/sun-faq.pdf"&gt;promesse istituzionali&lt;/a&gt;, bisognerà vedere cosa accadrà ai vari prodotti/finanziamenti.&lt;/p&gt;  &lt;p&gt;Per esempio OpenOffice nella FAQ non è neppure citato e il silenzio &lt;a href="http://europa.eu/"&gt;europeo&lt;/a&gt; è piuttosto sospetto. Molti paesi europei hanno adottato OpenOffice e mi risulta che molti uffici della stesso governo europeo usi questo prodotto.&lt;/p&gt;  &lt;p&gt;Adesso immaginate uno scenario fanta-it. Oracle mette a pagamento OpenOffice e la comunità europea che fa? Li multa per trust? Il governo (non una persona ma proprio il governo stesso) sarebbe in un conflitto di interesse come pochi se ne sono visti prima. Fanta-it divertente, stiamo a vedere che succede.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/96006.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2009/04/21/oracle-sun-e-fanta-it.aspx</guid>
            <pubDate>Tue, 21 Apr 2009 07:37:26 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/96006.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2009/04/21/oracle-sun-e-fanta-it.aspx#feedback</comments>
            <slash:comments>8</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/96006.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/96006.aspx</trackback:ping>
        </item>
        <item>
            <title>Un po' di free-style con Linq e gli Expression Tree</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2009/04/17/un-po-di-free-style-con-linq-e-gli-expression-tree.aspx</link>
            <description>&lt;p&gt;Uno dei vantaggi più graditi di Linq sono gli Expression Tree, una vera manna per sistemare i classici problemi di condizioni where non prevedibili durante la progettazione.&lt;/p&gt;  &lt;p&gt;Gli Expression Tree sono &lt;strong&gt;compilati&lt;/strong&gt;, &lt;strong&gt;strong-typed&lt;/strong&gt;, &lt;strong&gt;provider independent&lt;/strong&gt; e &lt;strong&gt;serializzabili&lt;/strong&gt; (anche se con qualche aiutino).&lt;/p&gt;  &lt;p&gt;Prendiamo l'esempio di un semplice accesso ai dati usando Linq2SQL, il mio DAL preferito.&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: consolas, 'Courier New', courier, monospace; max-height: 200px; font-size: 8pt; overflow: auto; border-top: gray 1px solid; cursor: text; border-right: gray 1px solid; padding-top: 4px"&gt;   &lt;div style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;     &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; IEnumerable&amp;lt;Article&amp;gt; GetList(Expression&amp;lt;Func&amp;lt;AnaArt, &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&amp;gt;&amp;gt; Filter)&lt;/pre&gt;

    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt;     var ctx = GetDataContext();&lt;/pre&gt;

    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt;     var items = ctx.AnaArts.Where(Filter).Select(c =&amp;gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Article(c.MGAA_Id, c.MGAA_MBDC_Classe, c.MGAA_Matricola, c.MGAA_Descr));&lt;/pre&gt;

    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; items;&lt;/pre&gt;

    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt; }&lt;/pre&gt;

    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   7:&lt;/span&gt;  &lt;/pre&gt;

    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   8:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; GetListCount(Expression&amp;lt;Func&amp;lt;AnaArt, &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&amp;gt;&amp;gt; Filter)&lt;/pre&gt;

    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   9:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  10:&lt;/span&gt;     var ctx = GetDataContext();&lt;/pre&gt;

    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  11:&lt;/span&gt;     var res = ctx.AnaArts.Count(Filter);&lt;/pre&gt;

    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  12:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; res;&lt;/pre&gt;

    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  13:&lt;/span&gt; }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;La GetList usa un predicate che ha in ingresso l'i-esimo oggetto mappato ad un record e in uscita c'è il boolean che decide se quel record debba essere incluso o meno nel resultset. Func è il delegate, Expression&amp;lt;Func&amp;lt;..&amp;gt;&amp;gt; è l'Expression Tree che usa quel delegate. L'Expression Tree è quello che permette la "magia" di tradurre il predicate in linguaggio SQL a carico del provider.&lt;/p&gt;

&lt;p&gt;La GetListCount fa esattamente lo stesso ma si avvale di Count che, come la where, accetta un predicate.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Creando il predicate al volo con &lt;a href="http://www.albahari.com/nutshell/predicatebuilder.aspx"&gt;PredicateBuilder&lt;/a&gt; di &lt;a href="http://www.albahari.com/"&gt;Joe Albahari&lt;/a&gt; di cui raccomando &lt;a href="http://www.linqpad.net/"&gt;LinqPad&lt;/a&gt;, fantastico tool ora dotato anche di Intellisense da usarsi al posto del classico Query Analyzer e per rendersi conto se la query Linq è scritta bene o rischia di fare disastri in performance sul DB (che è &lt;u&gt;sempre&lt;/u&gt; colpa di una query scritta male).

    &lt;br /&gt;

    &lt;br /&gt;Per dare l'idea di un caso pratico, in una applicazione per un cliente abbiamo creato un designer visuale in WPF di condizioni Where in modo che l'utente potesse decidere il criterio di scelta. Poi abbiamo serializzato i predicate in modo 'custom' e le ricerche possono essere ricaricate e riutilizzate con estrema semplicità.

    &lt;br /&gt;Per chi sia interessato a serializzare, esiste un &lt;a href="http://code.msdn.microsoft.com/exprserialization"&gt;serializzatore di Expression Tree&lt;/a&gt; realizzato da una persona del team di C#

    &lt;br /&gt;&lt;/li&gt;

  &lt;li&gt;In alcuni casi la where la si può prevedere facilmente e quindi basta creare un filtro ad-hoc, per esempio recuperando il record con un certo Id:&lt;/li&gt;
&lt;/ul&gt;

&lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: consolas, 'Courier New', courier, monospace; max-height: 200px; font-size: 8pt; overflow: auto; border-top: gray 1px solid; cursor: text; border-right: gray 1px solid; padding-top: 4px"&gt;
  &lt;div style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;
    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Article GetArticleById(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; Id, &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; IsCount)&lt;/pre&gt;

    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt;     Expression&amp;lt;Func&amp;lt;AnaArt, &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&amp;gt;&amp;gt; Filter = c =&amp;gt; c.MGAA_Id == Id;&lt;/pre&gt;

    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt;     &lt;/pre&gt;

    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; GetArticles(Filter).FirstOrDefault();&lt;/pre&gt;

    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt; }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Bello, vero ma ci sono casi in cui queste where sono solo dei "pezzi" che farebbe comodo riutilizzare in diversi contesti e magari unire, grazie al predicatebuilder, con altri "pezzi" di where.&lt;/p&gt;

&lt;p&gt;In sostanza, tanto per fare un esempio semplice, sarebbe più comodo ed elegante che il metodo usasse la funzione FilterById.&lt;/p&gt;

&lt;p&gt;Attenzione però che non può trattarsi di una normale funzione C#. Il nostro requisito indispensabile è che sia un Expression Tree traducibile in linguaggio SQL a cura del provider. Quindi FilterById &lt;strong&gt;&lt;u&gt;deve&lt;/u&gt;&lt;/strong&gt; essere un Expression&amp;lt;Func&amp;lt;...&amp;gt;&amp;gt;.&lt;/p&gt;

&lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: consolas, 'Courier New', courier, monospace; max-height: 200px; font-size: 8pt; overflow: auto; border-top: gray 1px solid; cursor: text; border-right: gray 1px solid; padding-top: 4px"&gt;
  &lt;div style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;
    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; Article GetArticleById(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; Id, &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; IsCount)&lt;/pre&gt;

    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt;     Expression&amp;lt;Func&amp;lt;AnaArt, &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&amp;gt;&amp;gt; Filter = FilterById(Id);&lt;/pre&gt;

    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt;     &lt;/pre&gt;

    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; GetArticles(Filter).FirstOrDefault();&lt;/pre&gt;

    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt; }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;In pratica mi serve una funzione che:&lt;/p&gt;

&lt;p&gt;- in ingresso prenda un intero (Id)
  &lt;br /&gt;- in uscita mi restituisca un Expression&amp;lt;Func&amp;lt;...&amp;gt;&amp;gt;, cioè quello che la where si aspetta&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Ed ecco il risultato (opzione 3):&lt;/li&gt;
&lt;/ul&gt;

&lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: consolas, 'Courier New', courier, monospace; max-height: 200px; font-size: 8pt; overflow: auto; border-top: gray 1px solid; cursor: text; border-right: gray 1px solid; padding-top: 4px"&gt;
  &lt;div style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;
    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;readonly&lt;/span&gt; Func&amp;lt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;, Expression&amp;lt;Func&amp;lt;AnaArt, &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt; FilterById = Id =&amp;gt; (d =&amp;gt; d.MGAA_Id == Id);&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;FilterById è una lambda dove:&lt;/p&gt;

&lt;p&gt;- Id è il parametro di ingresso (un intero)
  &lt;br /&gt;- (d =&amp;gt; d.MGAA_Id == Id) è una lambda in uscita&lt;/p&gt;

&lt;p&gt;Questa lambda in uscita ha la forma di Expression&amp;lt;Func&amp;lt;AnaArt, bool&amp;gt; cioè:&lt;/p&gt;

&lt;p&gt;- in ingresso prende l'i-esimo id del record che verrà processato e lo compara con l'intero che gli è arrivato come parametro dalla lambda precedente (quindi ormai è noto)
  &lt;br /&gt;- in uscita restituisce un boolean che dice se includere o meno il record nel resultset&lt;/p&gt;

&lt;p&gt;Niente di nuovo, e chi ha già giocato con Linq avrà sicuramente esplorato queste belle cose, ma ripeterle non fa mai male.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/95981.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2009/04/17/un-po-di-free-style-con-linq-e-gli-expression-tree.aspx</guid>
            <pubDate>Fri, 17 Apr 2009 08:22:45 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/95981.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2009/04/17/un-po-di-free-style-con-linq-e-gli-expression-tree.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/95981.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/95981.aspx</trackback:ping>
        </item>
        <item>
            <title>Basta! Italia wrap up</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2009/03/20/basta-italia-wrap-up.aspx</link>
            <description>&lt;p&gt;Sono molto soddisfatto della conferenza appena conclusa a Roma. Ottima organizzazione, agenda succulenta, un clima molto piacevole con tutti i presenti, nessuno escluso.&lt;/p&gt;  &lt;p&gt;Solo un peccato per aver visto una affluenza minima dal centro-sud della penisola. Sarebbe stata una buona occasione per richiamare l'attenzione sugli organizzatori di eventi a dare più spazio a eventi in questa zona.&lt;/p&gt;  &lt;p&gt;Parlando con alcuni partecipanti, erano dispiaciuti per la contemporaneità delle track. Devo rassicurarli che questo è un denominatore comune a qualsiasi conferenza e che la sovrapposizione a Basta! Italia è stata molto inferiore di quello che avviene nell'edizione tedesca o anche al TechEd. Ovviamente i pianificatori dell'agenda, &lt;a href="http://www.bastaitalia.it/conferenza/adboard/"&gt;Sebastian e Dino&lt;/a&gt;, sono sempre interessati ad avere feedback per le prossime edizioni.&lt;/p&gt;  &lt;p&gt;I feedback positivi continuano ad arrivarmi via email da alcuni partecipanti che voglio ringraziare di cuore.&lt;/p&gt;  &lt;p&gt;Ho avuto il piacere di far esordire in una conference italiana l'argomento "Geneva Framework" arrivato alla beta 1 e destinato a far parlare moltissimo di se. Parliamo della sicurezza a claim che &lt;strong&gt;&lt;u&gt;sostituirà integralmente&lt;/u&gt;&lt;/strong&gt; l'attuale modello a claim di WCF, quindi certamente un argomento molto popolare.    &lt;br /&gt;Ho collezionato in questi mesi quantità gigantesche di appunti, tweaks, prodotto slides in quantità industriale e mi sono sviluppato tantissimi esempi.&lt;/p&gt;  &lt;p&gt;L'altro argomento che avevo in agenda è stato sul modello di sicurezza usando WCF e WF insieme. Purtroppo su sicurezza e Workflow Foundation non c'è quasi nulla in giro e persino un articolo di MSDN con errori che mi sono stati confermati dal team di sviluppo. In sessione ho stressato sulla necessità di rendere il progetto WCF+WF agnosta sulle scelte nel modello di sicurezza di WCF o del modello di threading. Sono problematiche che possono essere molto tricky. Insomma una sessione in linea con la filosofia di Basta!, cioè le best practices.&lt;/p&gt;  &lt;p&gt;Infine, ma non per importanza, il technical after-hour di UGIdotNET dove una dozzina di coraggiosi mi hanno seguito nella sessione sui "Windows Web Services" di Windows 7 (da poco online in beta anche per gli OS precedenti) in codice nativo. Dico coraggiosi perché la sessione era dalle 20:15 alle 21:00 e la fame si faceva sentire :)&lt;/p&gt;  &lt;p&gt;Alla prossima!&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/95755.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2009/03/20/basta-italia-wrap-up.aspx</guid>
            <pubDate>Fri, 20 Mar 2009 09:55:44 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/95755.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2009/03/20/basta-italia-wrap-up.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/95755.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/95755.aspx</trackback:ping>
        </item>
        <item>
            <title>Windows 7 Installation Fest</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2009/03/12/windows-7-installation-fest.aspx</link>
            <description>&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/raffaele/WindowsLiveWriter/Windows7InstallationFest_101AF/Landing-700x250_2.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="90" alt="Landing-700x250" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/raffaele/WindowsLiveWriter/Windows7InstallationFest_101AF/Landing-700x250_thumb.jpg" width="244" border="0" /&gt;&lt;/a&gt;   &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Finalmente un evento un po' diverso dal solito. L'occasione è quella di incontrare le community e installare al volo Windows 7 beta 1 che ha già dimostrato di essere decisamente molto stabile.    &lt;br /&gt;D'altra parte il grosso dei cambiamenti era apparso con Vista (come ho ampiamente stressato &lt;a href="http://blogs.ugidotnet.org/raffaele/archive/2008/11/27/94770.aspx"&gt;qui&lt;/a&gt; e post successivi sugli integrity levels &lt;a href="http://blogs.ugidotnet.org/raffaele/archive/2009/01/27/windows-vista-integrity-levels-parte-1.aspx"&gt;qui&lt;/a&gt;, &lt;a href="http://blogs.ugidotnet.org/raffaele/archive/2009/01/29/windows-vista-integrity-levels-parte-2.aspx"&gt;qui&lt;/a&gt;  e &lt;a href="http://blogs.ugidotnet.org/raffaele/archive/2009/02/03/windows-vista-integrity-levels-parte-3.aspx"&gt;qui&lt;/a&gt; e poi ancora &lt;a href="http://blogs.ugidotnet.org/raffaele/archive/2009/02/09/windows-vista-uipi-parte-4.aspx"&gt;UIPI&lt;/a&gt;) ma attenzione che Windows 7 non è affatto una release di minore importanza, &lt;a href="http://www.microsoft.com/windows/windows-7/whats-new.aspx"&gt;anzi ...&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Performance globalmente migliorate &lt;/li&gt;    &lt;li&gt;Minori requisiti di memoria &lt;/li&gt;    &lt;li&gt;Minore consumo di batteria sui notebook &lt;/li&gt;    &lt;li&gt;Auto-diagnosi sui problemi applicativi &lt;/li&gt;    &lt;li&gt;Rimozione di un paio di lock globali nel kernel per migliorare le performance nelle macchine multicore (da qui in avanti praticamente tutti i pc) &lt;/li&gt;    &lt;li&gt;Trigger sullo start/stop dei servizi. Esempio: se pluggo un device USB il servizio parte, se lo stacco si ferma. Questo diminuisce la memoria usata dai servizi e naturalmente le performance per lo start del servizio al boot. &lt;/li&gt;    &lt;li&gt;Boot da VHD &lt;/li&gt;    &lt;li&gt;Miglioramenti nel riconoscimento di scrittura e voce &lt;/li&gt;    &lt;li&gt;Gadget usabili senza Sidebar &lt;/li&gt;    &lt;li&gt;Taskbar ridisegnata completamente e decisamente più usabile &lt;/li&gt;    &lt;li&gt;Naturalmente Internet Explorer 8 &lt;/li&gt;    &lt;li&gt;... &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Questo per non parlare delle &lt;a href="http://msdn.microsoft.com/en-us/windows/default.aspx"&gt;feature più developer oriented&lt;/a&gt; come:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Supporto ai sensori &lt;/li&gt;    &lt;li&gt;API dei Windows Web Services &lt;/li&gt;    &lt;li&gt;API per i Package (usati per XPS e i nuovi formati ISO Office OpenXML) &lt;/li&gt;    &lt;li&gt;MultiTouch API &lt;/li&gt;    &lt;li&gt;Powershell 2.0 preinstallata &lt;/li&gt;    &lt;li&gt;... &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Per chi vuole maggiori dettagli sull'evento, li trova qui: &lt;a href="http://www.microsoft.it/installation/"&gt;http://www.microsoft.it/installation/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I link diretti agli eventi locali sono invece questi:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;font face="Courier New"&gt;Pisa     &lt;/font&gt;&lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032407969&amp;amp;Culture=it-IT"&gt;&lt;font face="Courier New"&gt;http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032407969&amp;amp;Culture=it-IT&lt;/font&gt;&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;font face="Courier New"&gt;Firenze  &lt;/font&gt;&lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032407971&amp;amp;Culture=it-IT"&gt;&lt;font face="Courier New"&gt;http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032407971&amp;amp;Culture=it-IT&lt;/font&gt;&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;font face="Courier New"&gt;Bologna  &lt;/font&gt;&lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032407973&amp;amp;Culture=it-IT"&gt;&lt;font face="Courier New"&gt;http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032407973&amp;amp;Culture=it-IT&lt;/font&gt;&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;font face="Courier New"&gt;Bari     &lt;/font&gt;&lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032408091&amp;amp;Culture=it-IT"&gt;&lt;font face="Courier New"&gt;http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032408091&amp;amp;Culture=it-IT&lt;/font&gt;&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;font face="Courier New"&gt;Padova   &lt;/font&gt;&lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032408092&amp;amp;Culture=it-IT"&gt;&lt;font face="Courier New"&gt;http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032408092&amp;amp;Culture=it-IT&lt;/font&gt;&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;font face="Courier New"&gt;Roma     &lt;/font&gt;&lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032408093&amp;amp;Culture=it-IT"&gt;&lt;font face="Courier New"&gt;http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032408093&amp;amp;Culture=it-IT&lt;/font&gt;&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;font face="Courier New"&gt;Milano   &lt;/font&gt;&lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032407593&amp;amp;Culture=it-IT"&gt;&lt;font face="Courier New"&gt;http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032407593&amp;amp;Culture=it-IT&lt;/font&gt;&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;font face="Courier New"&gt;Perugia  &lt;/font&gt;&lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032408156&amp;amp;Culture=it-IT"&gt;&lt;font face="Courier New"&gt;http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032408156&amp;amp;Culture=it-IT&lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New"&gt; &lt;/font&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Non so bene a quale evento potrei partecipare visto che sfortunatamente non ce n'è uno nella mia città. Percherò a caso da una ampolla di vetro ... &lt;img alt="smile_regular" src="http://spaces.live.com/rte/emoticons/smile_regular.gif" /&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/95681.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2009/03/12/windows-7-installation-fest.aspx</guid>
            <pubDate>Thu, 12 Mar 2009 17:14:34 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/95681.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2009/03/12/windows-7-installation-fest.aspx#feedback</comments>
            <slash:comments>18</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/95681.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/95681.aspx</trackback:ping>
        </item>
        <item>
            <title>MVP Summit 2009</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2009/03/09/mvp-summit-2009.aspx</link>
            <description>&lt;p&gt;È sempre una fantastica esperienza andare al Summit. Negli anni ho conosciuto tante persone e, anno dopo anno, è sempre più difficile trovare il tempo per reincontrare tutti in mezzo alle sessioni ufficiali.&lt;/p&gt;  &lt;p&gt;I contenuti sono stati molto proficui, meglio di altre passate edizioni. Le novità che ci aspettano sono tantissime ed entusiasmanti, ma sotto NDA quindi non ne posso parlare per il momento. Ci vuole solo un po' di pazienza, tempo che arrivi la beta 1 di Visual Studio 2010 e poi saranno sotto gli occhi di tutti.&lt;/p&gt;  &lt;p&gt;In diversi mi pingano in questi giorni chiedendomi del Summit, per cui ecco cosa ho fatto giorno per giorno in quel di Seattle/Redmond.&lt;/p&gt;  &lt;p&gt;Venerdi pomeriggio l'arrivo a Seattle; compagni di viaggio &lt;a href="http://community.visual-basic.it/Alessandro"&gt;Alessandro&lt;/a&gt; e &lt;a href="http://www.theregion.com/profile.aspx?rd=1128"&gt;Giuseppe&lt;/a&gt;. Ho avuto il piacere di conoscere Enzo, un illustre italiano developer in quel di Redmond con cui abbiamo trascorso il pomeriggio e che ringrazio ancora per lo 'strappo' a Downtown dall'areporto.&lt;/p&gt;  &lt;p&gt;Sabato di svago a Vancouver (Canada). Il buon &lt;a href="http://blogs.msdn.com/giorgio/"&gt;Giorgio&lt;/a&gt;, da poco indigeno di Seattle, ci ospita sulla sua nuova Mustang con un motore che fa musica. Il resto del gruppo ci segue con una macchina affittata.    &lt;br /&gt;Vancouver è una grossa città, all'apparenza semi-deserta per poi scoprire che la vita è negli enormi centri commerciali sotterranei sviluppati a gallerie. Il freddo lo impone.    &lt;br /&gt;La comunità asiatica (almeno per l'aspetto, probabilmente Canadesi da generazioni) la fa da padrona. La cortesia della west-coast regna anche laggiù.    &lt;br /&gt;In serata cena al mitico Crab Pot di Bellevue che ci ha fatto conoscere &lt;a href="http://blogs.ugidotnet.org/aldod"&gt;Aldo&lt;/a&gt;. Veramente peccato non ci fosse, sarà per la prossima.&lt;/p&gt;  &lt;p&gt;Domenica. Di mattina immancabile gita al tempio dell'elettronica, Fry's, dove abbiamo dato sfogo al geek-shopping più sfrenato (ci siamo trattenuti). Poi a pranzo in un simpativo localino di Bellevue.   &lt;br /&gt;Nel pomeriggio il Summit prende il via con le prime keynote. Interessanti probabilmente più per i neo-awarded che per i rinnovati.&lt;/p&gt;  &lt;p&gt;Lunedi sveglia alle 5:30, colazione e poi via al Campus. Per me mattinata a base di Oslo e pomeriggio di WPF. Ottima occasione per ascoltare e fare domande a Don Box, Chris Anderson, Martin Gaudgin ed altri meno noti ma non meno tosti.   &lt;br /&gt;Nel pomeriggio sessione di security con &lt;a href="http://blogs.msdn.com/sdl/pages/about-us.aspx#adam"&gt;Adam Shostack&lt;/a&gt; e la superstar &lt;a href="http://blogs.msdn.com/larryosterman/"&gt;Larry Osterman&lt;/a&gt; a parlare di Threat Modeling in Windows 7. Tra i pochi presenti anche un nome noto, &lt;a href="http://msinfluentials.com/blogs/jesper/"&gt;Jesper&lt;/a&gt;. Nei corridoi incontriamo di sfuggita anche &lt;a href="http://blogs.technet.com/markrussinovich/"&gt;Mark&lt;/a&gt;.    &lt;br /&gt;Non è finita, dopo peripezie io, &lt;a href="http://www.massimilianoluciani.it/home.html"&gt;Max&lt;/a&gt; e &lt;a href="http://blogs.technet.com/alead_msft/archive/2008/03/24/intervista-ai-microsoft-mvp-leone-randazzo.aspx"&gt;Leone&lt;/a&gt; raggiungiamo per cena un meeting in caffetteria su Windows 7.    &lt;br /&gt;Giornata finita al campus. Giorgio ci passa a prendere e via in un bizzarro localino di Seattle per uno spuntino. All'ingresso mi chiedono il passaporto per entrare ... non ho smesso di ringraziarli per avermi fatto intendere di dimostrare meno di 21 anni :)&lt;/p&gt;  &lt;p&gt;Martedi sveglia alle 5:30 e via di nuovo al Campus. Giornata Visual C++ reincontrando tanti amici nel team: Ayman, Tareq, Ronald, Ale, Marian, per scrivere i primi che mi sono venuti in mente. Tantissimi argomenti, molti dei quali sul parallel computing a cui interviene il carissimo amico &lt;a href="http://blogs.msdn.com/texblog/"&gt;Steve&lt;/a&gt; e anche &lt;a href="http://www.danielmoth.com/Blog/"&gt;Daniel Moth&lt;/a&gt;, celebre ex-MVP. Giornata fantastica con tantissimi contenuti validi anche per lo sviluppo managed con C#/VB.    &lt;br /&gt;In serata veloce ritorno in albergo e poi via alla festa all'Experience Music Project sotto lo Space Needle.&lt;/p&gt;  &lt;p&gt;Mercoledi è giorno di chiusura con le keynote di Mike Nash, Steve Ballmer e Somasegard che porta sul palco 4 illustri Technical Fellows.   &lt;br /&gt;Nel pomeriggio un fuori programma e torniamo al Campus con &lt;a href="http://blogs.ugidotnet.org/corrado"&gt;Corrado&lt;/a&gt;, &lt;a href="http://blogs.ugidotnet.org/topics/"&gt;Mauro&lt;/a&gt; e &lt;a href="http://blogs.aspitalia.com/ricciolo/"&gt;Cristian&lt;/a&gt;. &lt;a href="http://blogs.msdn.com/shawnfa/"&gt;Shawn&lt;/a&gt; mi ha infatti organizzato un meeting di recap sulle novità del CLR 4.0 in presenza di alcuni suoi illustri colleghi e tester. Wow, spettacolare, thanks Shawn.    &lt;br /&gt;Poi &lt;a href="http://blogs.ugidotnet.org/corrado"&gt;Corrado&lt;/a&gt;, ormai nota superstar Redmondiana, va a Channel9 mentre noi altri al building di Windows per un altro meeting.    &lt;br /&gt;Mi aspettava infatti l'amico &lt;a href="http://blogs.msdn.com/nikolad/"&gt;Nikola&lt;/a&gt; che faceva parte del team di VC++ e ora si occupa di un tema ultra interessante su cui ho già fatto un webcast per il pre-evento di Windows 7: i Windows Web Services, le API native "C" per creare web services e quindi disaccoppiare codice managed da nativo ... ma di questo parlerò in altri post.    &lt;br /&gt;Nikola ci presenta tutto il team del networking, ufficio per ufficio. Chi si occupa del service layer, chi del channel layer, i tester, e l'utility di generazione del proxy... spettacolare. È lo stesso piano in cui c'è il team di RPC :)    &lt;br /&gt;Finito il meeting andiamo a trovare Enzo nel suo building e poi via a Seattle per cena in un ristorante giapponese dove &lt;a href="http://channel9.msdn.com/shows/Going+Deep/Ale-Contenti-VC-Safe-Libraries-and-More/"&gt;Ale&lt;/a&gt; ci consiglia su sushi e sake. Devo dire tutto molto buono. La tavolata è tutta di noi italiani MVP e italiani di Redmond. Proprio una bella compagnia.&lt;/p&gt;  &lt;p&gt;Giovedi è il rientro. Volo via Cincinnati e Parigi per me ed &lt;a href="http://community.visual-basic.it/Alessandro"&gt;Alessandro&lt;/a&gt; e dopo tante, troppe ore finalmente tra le braccia dei nostri cari.&lt;/p&gt;  &lt;p&gt;Bilancio super positivo. Grazie a tutti coloro che ci hanno accolti, abbiamo avuto un trattamento da re.   &lt;br /&gt;A passarci una settimana di più l'avrei speso certamente bene ma il tempo è sempre tiranno. Non c'è che dire, stanno lavorando a ritmi serrati e quello che ho visto è stato extra-positivo.    &lt;br /&gt;Se la beta 1 di VS2010 sarà stabile e avrà tutto quello che ho visto, sarà certamente la migliore versione di VS che abbia usato. Non ci resta che aspettare ...&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/95637.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2009/03/09/mvp-summit-2009.aspx</guid>
            <pubDate>Mon, 09 Mar 2009 09:44:27 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/95637.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2009/03/09/mvp-summit-2009.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/95637.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/95637.aspx</trackback:ping>
        </item>
        <item>
            <title>MVP Summit 2009 al via</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2009/03/02/mvp-summit-2009-al-via.aspx</link>
            <description>&lt;p&gt;Siamo a 20 minuti dalla keynote nel conference center di Seattle e il Summit sta per partire. Domani e Martedi al Campus in Redmond.&lt;/p&gt;  &lt;p&gt;Dopo la mattinata di pellegrinaggio da Fry’s ci vuole adesso un buon caffè americano :)&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/95579.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2009/03/02/mvp-summit-2009-al-via.aspx</guid>
            <pubDate>Sun, 01 Mar 2009 23:36:52 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/95579.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2009/03/02/mvp-summit-2009-al-via.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/95579.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/95579.aspx</trackback:ping>
        </item>
        <item>
            <title>Basta! Conference in arrivo</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2009/02/26/basta-conference-in-arrivo.aspx</link>
            <description>&lt;p&gt;Sbarca in Italia la Basta! conference dal 16 al 19 Marzo a Roma: &lt;a title="http://www.bastaitalia.it/" href="http://www.bastaitalia.it/"&gt;http://www.bastaitalia.it/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;È una conferenza di grande successo in Germania che esordisce per la prima volta in Italia e tra l'altro a Roma, location purtroppo insolita per conferenze sullo sviluppo con tecnologie di casa Microsoft. &lt;br /&gt;
Personalmente credo che sia una grande occasione per chi solitamente non riesce a raggiungere le solite location di Milano.&lt;/p&gt;
&lt;p&gt;Basta! è una conferenza dal taglio molto pratico e fa delle "Best Practice" la sua parola chiave. L'&lt;a href="http://www.bastaitalia.it/conferenza/sessions/"&gt;agenda&lt;/a&gt; è curata da &lt;a href="http://blogs.ugidotnet.org/"&gt;Dino Esposito&lt;/a&gt; e Sebastian Meyen e per gli speaker c'è l'imbarazzo della scelta.&lt;/p&gt;
&lt;p&gt;Personalmente ho il grande piacere ed onore di essere &lt;a href="http://www.bastaitalia.it/konferenzen/bastaitalia/speaker/#3566"&gt;speaker di due sessioni&lt;/a&gt; su temi di sicurezza e 'scottanti':&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Autenticazione e autorizzazione secondo Microsoft Identity Framework&lt;/li&gt;
    &lt;li&gt;WCF e WF: Sicurezza e integrazione&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/raffaele/WindowsLiveWriter/BastaConferenceinarrivo_1363A/basta_italia_speakerbutton_en_2.gif"&gt;&lt;img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" border="0" alt="basta_italia_speakerbutton_en" width="154" height="104" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/raffaele/WindowsLiveWriter/BastaConferenceinarrivo_1363A/basta_italia_speakerbutton_en_2.gif" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Dulcis in fundo, &lt;a href="http://www.ugidotnet.org"&gt;UGIdotNET&lt;/a&gt; organizza un &lt;a href="http://www.ugidotnet.org/Meeting/Detail/a7858b02-a91d-408f-b915-01456ea2bd81"&gt;technical after hour&lt;/a&gt; &lt;strong&gt;gratuito&lt;/strong&gt; costituito da due sessioni i cui temi &lt;a href="http://www.ugidotnet.org/Forum/ViewThread/10154#42677"&gt;saranno decisi&lt;/a&gt; dai soci UGIdotNET. Ricordo che per essere soci è sufficiente essere iscritti ad UGIdotNET. Al momento il sito è in rinnovamento e non c'è una form di iscrizione ma si può chiedere direttamente a "&lt;a href="http://blogs.ugidotnet.org/pape"&gt;il presidente&lt;/a&gt;"!&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/95552.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2009/02/26/basta-conference-in-arrivo.aspx</guid>
            <pubDate>Thu, 26 Feb 2009 20:57:01 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/95552.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2009/02/26/basta-conference-in-arrivo.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/95552.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/95552.aspx</trackback:ping>
        </item>
        <item>
            <title>Anteprima di Windows 7: giovedi 26 pomeriggio sono in chat</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2009/02/25/anteprima-di-windows-7-giovedi-26-pomeriggio-sono-in-chat.aspx</link>
            <description>&lt;p&gt;Oggi si è aperto l'evento "Anteprima di Windows 7": &lt;a title="http://www.microsoft.com/italy/beit/eventi/windows7/" href="http://www.microsoft.com/italy/beit/eventi/windows7/"&gt;http://www.microsoft.com/italy/beit/eventi/windows7/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Per questa occasione le sessioni sono pre-registrate e ho avuto il piacere di preparare tre argomenti:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Le nuove API native per scrivere Web Services in C/C++ nativo:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.microsoft.com/italy/beit/eventi/windows7/win7_api.aspx" href="http://www.microsoft.com/italy/beit/eventi/windows7/win7_api.aspx"&gt;http://www.microsoft.com/italy/beit/eventi/windows7/win7_api.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;A partire da Windows 7 sono disponibili delle nuove API C per scrivere web services basati sugli standard SOAP e quindi compatibili con WCF. Le API verranno rese disponibili anche da XP/2003 in su e costituiranno un ottimo modo per disaccoppiare le porzioni di codice nativo C++ con quello managed.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Le novità in Windows 7 per lo sviluppo multicore:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.microsoft.com/italy/beit/eventi/windows7/win7_multicore.aspx" href="http://www.microsoft.com/italy/beit/eventi/windows7/win7_multicore.aspx"&gt;http://www.microsoft.com/italy/beit/eventi/windows7/win7_multicore.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Windows 7 si sta adeguando alle novità hardware in termini di multicore. Nel webcast si analizzano le novità e come queste diano, in aggiunta a nuove librerie presenti nella prossima versione di Visual Studio, un concreto aiuto per sfruttare al massimo la capacìtà elaborativa delle nuove CPU.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Le best practices per la creazione di applicazioni per Vista e Windows 7:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.microsoft.com/italy/beit/eventi/windows7/win7_compatibilita.aspx" href="http://www.microsoft.com/italy/beit/eventi/windows7/win7_compatibilita.aspx"&gt;http://www.microsoft.com/italy/beit/eventi/windows7/win7_compatibilita.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Gli sviluppatori hanno dimostrato di fare fatica ad adeguare le applicazioni a Vista e Windows 7. Eppure ci sono best practices già note all'epoca di Windows XP che avrebbero reso indolore questo passaggio.   &lt;br /&gt;Nel webcast si analizzano queste best practices e come sfruttare al meglio le novità introdotte in Windows Vista e Windows 7.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Giovedi 26 Febbraio pomeriggio sarò disponibile online per domande su queste ed altri argomenti inerenti l'evento su Windows 7.&lt;/p&gt;  &lt;li&gt;   &lt;p&gt;&lt;b&gt;Giovedì 26 febbraio&lt;/b&gt;, ore 14.00 – 15.00 &lt;/p&gt; &lt;/li&gt;  &lt;li&gt;   &lt;p&gt;&lt;b&gt;Giovedì 26 febbraio&lt;/b&gt;, ore 17.00 – 18.00 &lt;/p&gt; &lt;/li&gt;  &lt;p&gt;Mi sarebbe piaciuto essere online anche i giorni seguenti ma Venerdi io e molti altri MVP arriveremo a Seattle per partecipare in quel di Redmond al "MVP Summit 2009", e gli impegni non ci permettono fare diversamente.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/95549.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2009/02/25/anteprima-di-windows-7-giovedi-26-pomeriggio-sono-in-chat.aspx</guid>
            <pubDate>Wed, 25 Feb 2009 20:25:01 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/95549.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2009/02/25/anteprima-di-windows-7-giovedi-26-pomeriggio-sono-in-chat.aspx#feedback</comments>
            <slash:comments>7</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/95549.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/95549.aspx</trackback:ping>
        </item>
        <item>
            <title>WPF, elaborazioni lunghe e presunti memory leak</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2009/02/20/wpf-elaborazioni-lunghe-e-presunti-memory-leak.aspx</link>
            <description>&lt;p&gt;Quando una elaborazione “pesante” viene eseguita in un contesto di una interfaccia utente, sia essa Winform, MFC o WPF, è necessario che questa venga “alimentata” servendo il thread sottostante:&lt;/p&gt;  &lt;p&gt;- Windows Forms ed MFC, come anche altre librerie basate sulle Win32, hanno bisogno di alimentare la message pump. Si tratta di una coda associata ad uno specifico thread che accumula messaggi e li smista verso i controlli contenuti.&lt;/p&gt;  &lt;p&gt;- WPF non ha message pump perché ha un meccanismo di rendering completamente differente. Nonostante questo esiste un meccanismo analogo alla message pump, basasto sul Dispatcher di WPF.&lt;/p&gt;  &lt;p&gt;Fin qui tutto chiaro. Il developer attento conosce questi aspetti ma ci sono almeno due casi in cui queste precauzioni vengono tipicamente ignorate:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Quando l’elaborazione viene eseguita in un thread differente, il developer è “tranquillo” di lasciare libero il dispatcher del thread principale e perciò di eseguire tutto nel rispetto delle regole &lt;/li&gt;    &lt;li&gt;Quando non esiste neppure una finestra di presentazione perché WPF viene usato per eseguire delle elaborazioni non visuali: creazione di XPS, rendering per la creazione di bitmap, etc.      &lt;br /&gt;Questi casi sono tipici per elaborazioni dentro servizi WCF o applicazioni asp.net &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Da un punto di vista di elaborazione grafica tutto questo non fa una grinza &lt;b&gt;eppure c’è un problema&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;Tutto nasce&lt;/font&gt;&lt;/u&gt;&lt;/strong&gt; da un test per verificare una procedura complessa per la creazione di documenti XPS. Ad ogni loop viene creato un documento e salvato su file. Una volta eseguito il giro, tutti gli oggetti grafici che sono serviti per la creazione del documento vengono buttati via. Eppure &lt;b&gt;la memoria (working set) continua a crescere&lt;/b&gt; ad ogni giro fino a dare una OutOfMemoryException.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;Il primo pensiero&lt;/font&gt;&lt;/u&gt;&lt;/b&gt; va giustamente ad un classico &lt;b&gt;memory leak&lt;/b&gt; e qui parte un intreccio di &lt;i&gt;code review&lt;/i&gt; e &lt;i&gt;misurazioni sull’uso della memoria&lt;/i&gt; eseguite con il profiler di Visual Studio. Quando si incontra un managed memory leak i maggiori sospetti sono tipicamente per:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Collection/hashtable/oggetti statici che accumulano un grosso numero di children senza rimuoverli &lt;/li&gt;    &lt;li&gt;Oggetti singleton che fungono da “root” per interi tree di oggetti &lt;/li&gt;    &lt;li&gt;Allocazioni native non rilasciate &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Eppure non era nulla di tutto questo. Inoltre la traccia del profiler è decisamente poco generosa di informazioni utili. Si vede &lt;b&gt;un esagerato numero di oggetti WPF&lt;/b&gt; referenziati internamente nelle classi di WPF e nulla di riconducibile al codice utente.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;Il secondo tentativo&lt;/font&gt;&lt;/u&gt;&lt;/b&gt; è quello di forzare ad ogni ciclo una garbage collection con il classico pattern:&lt;/p&gt;  &lt;p&gt;GC.Collect();    &lt;br /&gt;GC.Collect();     &lt;br /&gt;GC.WaitForPendingFinalizers();     &lt;br /&gt;GC.Collect();     &lt;br /&gt;&lt;b&gt;Disclaimer: questo è solo codice per eseguire dei test e non dovrebbe mai essere usato in produzione.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;I primi due Collect sono necessary per garantire che siano soggetti alla collection anche gli oggetti che hanno un finalizzatore. La WaitForPendingFinalizers serve ad attendere che la coda di finalizzazione sia vuota. L’ultima Collect garantisce che anche gli oggetti ormai finalizzati siano soggetti a collection.&lt;/p&gt;  &lt;p&gt;Anche questo test non dà alcun esito, cioè la memoria non scende. A questo punto è sostanzialmente certa la presenza di un memory leak, cioè la presenza di un reference “da qualche parte” che non permetta al garbage collector di liberare la memoria.&lt;/p&gt;  &lt;p&gt;Limitando il numero di cicli e forzando il garbage collector dopo un paio di secondi (tramite un pulsante) la memoria veniva liberata. Ma che razza di memory leak è questo?&lt;/p&gt;  &lt;p&gt;E arriviamo al &lt;b&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;terzo tentativo&lt;/font&gt;&lt;/u&gt;&lt;/b&gt;. Mi dico: “come fa WPF a gestire oggetti grafici (i.e. risorse unmanaged di directx) senza aver mai bisogno di Dispose?”. Mi rispondo: “dovessi farlo io, implementerei un gestore di oggetti che li libera non appena non vengono più usati”.     &lt;br /&gt;Visto che l’apartment dei thread di WPF deve essere di tipo STA (Single Threading Apartment), se non permetto al dispatcher (che suppongo sia basato su una message pump di un oggetto COM di tipo STA) di svuotare la coda dei suoi messaggi, questo non potrà eseguire il metodo che presuppongo sia preposto al rilascio delle risorse e a ruota dei reference agli oggetti.&lt;/p&gt;  &lt;p&gt;Per verificare la mia ipotesi, ad ogni ciclo faccio eseguire:&lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 83.95%; padding-right: 4px; font-family: consolas, 'Courier New', courier, monospace; height: 64px; max-height: 200px; font-size: 8pt; overflow: auto; border-top: gray 1px solid; cursor: text; border-right: gray 1px solid; padding-top: 4px"&gt;   &lt;div style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;     &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, 'Courier New', courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; ThreadStart(&lt;span style="color: #0000ff"&gt;delegate&lt;/span&gt; { }));&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;La priorità di tipo Background è fondamentale perché, come dice MSDN, il delegate vuoto verrà eseguito ... “Operations are processed after all other non-idle operations are completed”. In pratica il codice del delegate “{}” è una scusa per assicurarsi che il dispatcher svuoti prima la coda dei messaggi.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;Bingo, funziona!&lt;/font&gt;&lt;/u&gt;&lt;/b&gt; Adesso ad ogni ciclo la memoria viene liberata senza alcuna necessità di invocare manualmente la collection.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Considerazioni finali.&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;1. Le motivazioni appena descritte sono solo una mia deduzione. Non ho trovato alcuna documentazione in merito sul funzionamento interno di WPF per quello che riguarda la disallocazione di oggetti e risorse.&lt;/p&gt;

&lt;p&gt;2. Anche eseguendo il ciclo in un thread separato il problema &lt;b&gt;si verifica comunque&lt;/b&gt;. 

  &lt;br /&gt;Il thread secondario deve essere aperto con apartment STA e come tale necessita comunque di alimentare il dispatcher in quel thread.&lt;/p&gt;

&lt;p&gt;3. Se è effettivamente come ho descritto, si spiega il fatto che le chiamate alla GC.Collect non abbiano effetto. 
  &lt;br /&gt;Quello che posso dedurre è che WPF si comporti come un runtime che, in modo analogo a quanto viene fatto dal garbage collector, si accorge quando un reference non viene più usato. A quel punto, alla passata successiva, il dispatcher può rilasciare le risorse unmanaged sottostanti e finalmente rilasciare l’oggetto al GC che eseguirà il rilascio reale della memoria occupata. 

  &lt;br /&gt;Perciò fin tanto che WPF non ha processato questi oggetti, anche se il codice utente non ha più reference attivi, è WPF ad averli perché questi oggetti devono ancora essere soggetti al rilascio di risorse interno di WPF. 

  &lt;br /&gt;Ripeto: sono solo mie deduzioni e non ho alcuna conferma a sostegno del mio ragionamento, se non i test che ho eseguito.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Morale.&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Il garbage collector funziona, e funziona molto bene.&lt;/p&gt;

&lt;p&gt;WPF fa il suo dovere e se il funzionamento è quello che ho intuito osservando questo test, i vantaggi sono superiori al problema che ho incontrato. L’assenza di Dispose in tutto WPF è un vantaggio non da poco e da qualche parte le risorse unmanaged ci devono essere per forza visto che si tratta di oggetti grafici.&lt;/p&gt;

&lt;p&gt;Perciò come al solito prima di pensare a malfunzionamenti e bug bisogna cercare di capire come funziona e mettersi nei panni di chi ha dovuto risolvere il problema del rilascio delle risorse.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/95519.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2009/02/20/wpf-elaborazioni-lunghe-e-presunti-memory-leak.aspx</guid>
            <pubDate>Fri, 20 Feb 2009 21:15:26 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/95519.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2009/02/20/wpf-elaborazioni-lunghe-e-presunti-memory-leak.aspx#feedback</comments>
            <slash:comments>7</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/95519.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/95519.aspx</trackback:ping>
        </item>
        <item>
            <title>Windows Vista UIPI (parte 4)</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2009/02/09/windows-vista-uipi-parte-4.aspx</link>
            <description>&lt;p&gt;Parte 1: &lt;a title="http://blogs.ugidotnet.org/raffaele/archive/2009/01/27/windows-vista-integrity-levels-parte-1.aspx" href="http://blogs.ugidotnet.org/raffaele/archive/2009/01/27/windows-vista-integrity-levels-parte-1.aspx"&gt;http://blogs.ugidotnet.org/raffaele/archive/2009/01/27/windows-vista-integrity-levels-parte-1.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Parte 2: &lt;a title="http://blogs.ugidotnet.org/raffaele/archive/2009/01/29/windows-vista-integrity-levels-parte-2.aspx" href="http://blogs.ugidotnet.org/raffaele/archive/2009/01/29/windows-vista-integrity-levels-parte-2.aspx"&gt;http://blogs.ugidotnet.org/raffaele/archive/2009/01/29/windows-vista-integrity-levels-parte-2.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Parte 3: &lt;a title="http://blogs.ugidotnet.org/raffaele/archive/2009/02/03/windows-vista-integrity-levels-parte-3.aspx" href="http://blogs.ugidotnet.org/raffaele/archive/2009/02/03/windows-vista-integrity-levels-parte-3.aspx"&gt;http://blogs.ugidotnet.org/raffaele/archive/2009/02/03/windows-vista-integrity-levels-parte-3.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;Lo Shatter Attack&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Nel 2005 &lt;a href="http://blogs.msdn.com/fabiosantini/"&gt;Fabio Santini&lt;/a&gt; ed io abbiamo tenuto il Security Roadshow in giro per l'Italia. Una delle demo di Fabio consisteva nello &lt;a href="http://en.wikipedia.org/wiki/Shatter_attack"&gt;Shatter Attack&lt;/a&gt;, un tipo di &lt;a href="http://alt.pluralsight.com/wiki/default.aspx/Keith.GuideBook/WhatIsALuringAttack.html"&gt;Luring Attack&lt;/a&gt; che più generalmente sono attacchi di tipo "Elevation of Privilege". Questo attacco mostrava quanto fosse pericoloso girare come administrator in Windows XP.     &lt;br /&gt;Fabio avviava un "malware" di sua creazione &lt;strong&gt;con credenziali di normale utente&lt;/strong&gt; allo scopo di limitare i danni che il malware avrebbe potuto fare.&lt;/p&gt;  &lt;p&gt;Il malware in questione mandava una serie di "click" del mouse da codice verso Explorer.exe (la shell di Windows) lanciando così un comando "distruttivo" come potrebbe essere format: "Start, run, format " .... Ok format è solo un esempio di 'effetto' ma se ci pensiamo un attimo non si fa fatica a disastrare una macchina quando si hanno i privilegi di administrator.&lt;/p&gt;  &lt;p&gt;Il processo malware, avendo ricevuto un token da normale utente grazie a &lt;strong&gt;runas&lt;/strong&gt;,  non avrebbe mai avuto i privilegi per eseguire un format e avrebbe ricevuto un "access denied".&lt;/p&gt;  &lt;p&gt;Il processo malware però poteva mandare una serie di WM_LBUTTONDOWN verso il processo Explorer.exe che aveva il token di administrator in quanto l'utente (Fabio nella demo, non nella vita reale) si loggava con privilegi di amministratore. La command che lanciava l'operazione di Format ereditava il token da Explorer.exe e di conseguenza riceveva il token di administrator.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Il gateway all'elevazione di privilegi&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Il motivo per cui è possibile realizzare uno Shatter Attack è che gli oggetti di windowing (USER) e grafici (GDI) non sono soggetti a security per ovvi problemi di performance. Pensate cosa significherebbe eseguire un controllo di security per ogni Pen, Brush, CreateWindow, SetWindowText, LineTo, Draw, ... eseguita nel sistema. A distanza di diciotto anni, considero giusta questa scelta che Microsoft fece con Windows NT.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;L'introduzione di UIPI in Vista&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Il meccanismo di User Interface Privilege Isolation (UIPI) è strettamente legato agli Integrity Levels. UIPI ha il compito di impedire ad un processo di comunicare con un altro che abbia Integrity Level più elevato.&lt;/p&gt;  &lt;p&gt;Per esempio un processo con &lt;strong&gt;Integrity Level Medium&lt;/strong&gt; (normale user) non riuscirà a fare una serie di cose verso un altro processo con &lt;strong&gt;Integrity Level High&lt;/strong&gt; (Administrator) o &lt;strong&gt;System&lt;/strong&gt; (servizi e web application):&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Usare SendMessage / PostMessage di messaggi considerati potenzialmente pericolosi.      &lt;br /&gt;Windows mantiene una blacklist di messaggi tra cui tutti quelli superiori a WM_USER, tipicamente usati dalle applicazioni come meccanismo di comunicazione privato. Questi messaggi vengono &lt;strong&gt;filtrati&lt;/strong&gt; da Windows. &lt;/li&gt;    &lt;li&gt;Eseguire un thread hook &lt;/li&gt;    &lt;li&gt;Monitorare con i journal hook &lt;/li&gt;    &lt;li&gt;Iniettare dll &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;In pratica UIPI impedisce, grazie agli Integrity Level, gli Shatter Attack che erano fatali in Windows XP. Aggiungerei che UIPI è un meccanismo indispensabile, senza il quale sarebbe facile bypassare il blocco agli oggetti offerto dal meccanismo degli Integrity Levels visto nei precedenti post.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Application Compatibility&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Parlando di Application Compatibility, UIPI è certamente un fattore di primo piano in quanto molte applicazioni eseguono una comunicazione tra processi utilizzando l'API RegisterWindowMessage e comunicando con messaggi custom (WM_USER+...).&lt;/p&gt;  &lt;p&gt;Per permettere alle applicazioni di modificare il filtro esiste l'API ChangeWindowMessageFilter:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;MSGFLT_ADD. Permette al processo che invoca la API di ricevere il messaggio &lt;/li&gt;    &lt;li&gt;MSGFLT_REMOVE. Nega al processo che invoca la API la ricezione del messaggio &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I processi con Integrity Level &amp;lt;= Low non possono usare questa API.    &lt;br /&gt;Con una semplice call a questa API i problemi di comunicazione tra processi via WM_xxx sono risolti.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Accessibility&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Sembra tutto risolto e invece c'è un problema di primaria importanza: le applicazioni per l'accessibilità. In Windows esiste per esempio la "On-Screen Keyboard" che permette di simulare la tastiera usando solo il mouse. Molte altre applicazioni esistono per i portatori di handicap che permettono di facilitare il canale di I/O tra computer e persona.&lt;/p&gt;  &lt;p&gt;Non è perciò improbabile avere la on-screen keyboard che gira come normale user (Integrity Level Low) che devono pilotare applicazioni ad Integrity Level superiore, magari una command prompt amministrativa. Purtroppo UIPI impedisce tutto questo e rende impossibile l'uso di queste applicazioni.&lt;/p&gt;  &lt;p&gt;Microsoft non si è affatto dimenticata di questo problema e ha introdotto il flag &lt;strong&gt;UIAccess&lt;/strong&gt; che bypassa UIPI. Questo flag viene letto dal manifest dell'eseguibile e conservato nel token associato al processo.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/raffaele/WindowsLiveWriter/5be3eb22f971_1096D/image_2.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="92" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/raffaele/WindowsLiveWriter/5be3eb22f971_1096D/image_thumb.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Visto che questo flag può essere usato per bypassare il meccanismo di protezione da parte di un malware, esiste una policy (abilitata per default) per cui il flag ha effetto solo se l'exe è stato installato in una di queste cartelle:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;in una sottocartella di "Program Files" o "Program Files (x86)" &lt;/li&gt;    &lt;li&gt;in una sottocartella di Windows\System32 &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Poiché la scrittura in queste cartelle è possibile solo ad un adminstrator, solo una applicazione installata da un token elevato può usare UIAccess.&lt;/p&gt;  &lt;p&gt;Per sapere se un token di processo ha abilitato o meno il flag UIAccess, si usa GetTokenInformation passando TokenUIAccess. Il valore di ritorno è 0 (disabilitato) o 1 (abilitato).&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Integrity Levels e UIPI sono quindi in primo piano per quello che riguarda i problemi di "Application Compatibility" nei sistemi operativi dalla 6.0 in su (cioè da Vista/2008 in avanti).&lt;/p&gt;  &lt;p&gt;Valeva la pena di introdurre queste novità a scapito della piena compatibilità delle vecchie applicazioni? A mio avviso si, senza alcun dubbio perché sottolineo che presto gli antivirus non serviranno più a nulla.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/95425.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2009/02/09/windows-vista-uipi-parte-4.aspx</guid>
            <pubDate>Mon, 09 Feb 2009 11:48:38 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/95425.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2009/02/09/windows-vista-uipi-parte-4.aspx#feedback</comments>
            <slash:comments>7</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/95425.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/95425.aspx</trackback:ping>
        </item>
        <item>
            <title>Windows Vista Integrity Levels (parte 3)</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2009/02/03/windows-vista-integrity-levels-parte-3.aspx</link>
            <description>&lt;p&gt;Parte 1: &lt;a title="http://blogs.ugidotnet.org/raffaele/archive/2009/01/27/windows-vista-integrity-levels-parte-1.aspx" href="http://blogs.ugidotnet.org/raffaele/archive/2009/01/27/windows-vista-integrity-levels-parte-1.aspx"&gt;http://blogs.ugidotnet.org/raffaele/archive/2009/01/27/windows-vista-integrity-levels-parte-1.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Parte 2: &lt;a title="http://blogs.ugidotnet.org/raffaele/archive/2009/01/29/windows-vista-integrity-levels-parte-2.aspx" href="http://blogs.ugidotnet.org/raffaele/archive/2009/01/29/windows-vista-integrity-levels-parte-2.aspx"&gt;http://blogs.ugidotnet.org/raffaele/archive/2009/01/29/windows-vista-integrity-levels-parte-2.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;La parte divertente è quella di scrivere codice, vediamo quindi le API per usare gli Integrity Levels.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;Creazione di un processo via API con integrity level impostato a low&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Prendere l'handle del token del processo corrente (che di default è "medium") &lt;/li&gt;    &lt;li&gt;Duplicare l'handle (API DuplicateHandle) &lt;/li&gt;    &lt;li&gt;Impostare l'Integrity Level a "Low" grazie a SetTokenInformation &lt;/li&gt;    &lt;li&gt;Creare il processo con CreateProcessAsUser usando il nuovo token modificato &lt;/li&gt; &lt;/ol&gt;  &lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4"&gt;   &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;     &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; #include &amp;lt;windows.h&amp;gt;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt; #include &amp;lt;Sddl.h&amp;gt;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt;  &lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt; #include &amp;lt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&amp;gt;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; &lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt; std;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt;  &lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   7:&lt;/span&gt;  &lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; f