<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>Raf on Channel9</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2010/02/03/raf-on-channel9.aspx</link>
            <description>&lt;p&gt;Missione conclusa con successo. Ieri sera &lt;a href="http://blogs.msdn.com/pietrobr/" target="_blank"&gt;Pietro&lt;/a&gt; mi ha intervistato in un breve video in cui racconto la costruzione di un sensore per Windows 7 realizzato per il workshop UGIdotNET tenutosi nel pomeriggio nell'auditorium di Microsoft Italia. &lt;a href="http://channel9.msdn.com/posts/PietroBrambati/Windows-7-Sensor-and-Location-Platform-dalle-API-all-UMDF-Sensor-Driver/" target="_blank"&gt;La registrazione del video è su Channel9&lt;/a&gt;.    &lt;br /&gt;Nel video c'è una rapida overview della costruzione del dispositivo, il firmware del microcontrollore, il device driver per Windows ed infine l'applicazione che lo utilizza.&lt;/p&gt;  &lt;p&gt;Tutto parte da ieri durante la mia sessione "&lt;a href="http://www.ugidotnet.org/events/CommunityTourEnvisioning.aspx" target="_blank"&gt;Windows 7: sensori e multitouch cambiano il modo di interagire con il PC&lt;/a&gt;" ho ri-mostrato il &lt;a href="http://www.iamraf.net/Articles/SurfRaf-home-made-surface-for-Windows-7" target="_blank"&gt;SurfRaf&lt;/a&gt; con nuove demo e con gli aggiornamenti di WPF 4.0 beta2.&lt;/p&gt;  &lt;p&gt;Ma la novità era chiaramente il dispositivo USB che ho chiamato RafStorm:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/raffaele/WindowsLiveWriter/RafonChannel9_A3CA/IMG_2672.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="IMG_2672" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/raffaele/WindowsLiveWriter/RafonChannel9_A3CA/IMG_2672_thumb.jpg" width="244" height="184" /&gt;&lt;/a&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/RafonChannel9_A3CA/image_thumb_4.png" width="244" height="184" /&gt;&lt;/p&gt;  &lt;p&gt;Questo dispositivo è un anemometro molto casalingo che legge (vedi cavetto) i buchi in un piattello (preso da un vecchio hard disk) con 16 buchi. Una forcella costituita da un fototransistor e un led legge la presenza/assenza dei buchi. Calcolando il numero di buchi al secondo e sapendo che ci sono 16 buchi per giro, si ricava facilmente il numero di RPM (giri al minuto).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/raffaele/WindowsLiveWriter/RafonChannel9_A3CA/image_10.png"&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/raffaele/WindowsLiveWriter/RafonChannel9_A3CA/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/RafonChannel9_A3CA/image_thumb_7.png" width="244" height="184" /&gt;&lt;/a&gt;&lt;/a&gt; &lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/raffaele/WindowsLiveWriter/RafonChannel9_A3CA/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/RafonChannel9_A3CA/image_thumb_2.png" width="244" height="184" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/raffaele/WindowsLiveWriter/RafonChannel9_A3CA/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/RafonChannel9_A3CA/image_thumb_5.png" width="244" height="184" /&gt;&lt;/a&gt; &lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/raffaele/WindowsLiveWriter/RafonChannel9_A3CA/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/RafonChannel9_A3CA/image_thumb_6.png" width="244" height="184" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;La reale novità di questo dispositivo è che viene visto come "Sensore" da Windows 7 e questo implica diversi vantaggi molto importanti:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Più processi contemporaneamente possono usare il dispositivo senza doversi contendere il canale di comunicazione&lt;/li&gt;    &lt;li&gt;Le applicazioni possono usare i nuovi dispositivi della stessa categoria senza neppure dover essere ricompilati&lt;/li&gt;    &lt;li&gt;Non è ncessario usare alcuna libreria del produttore. Nulla di nulla. Le Sensor API espongono i dati con un certo formato a seconda della categoria di cui il sensore fa parte. È il driver dei sensori costruito dal produttore del sensore a dover esporre i dati in modo coerente con la categoria.&lt;/li&gt;    &lt;li&gt;Security! Dal pannello di controllo gli amministratori del PC possono permettere o negare agli utenti l'uso di ogni singolo sensore. Sempre dal pannello di controllo gli utenti possono scegliere se rendere disponibile o meno i sensori alle applicazioni.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Avevo scritto l'applicazione demo in C# che usa le il &lt;a href="http://code.msdn.microsoft.com/WindowsAPICodePack" target="_blank"&gt;wrapper per API di Windows 7&lt;/a&gt; (tra cui quelle dei sensori) già lo scorso anno. Quando ho finito di costruire il device ed il suo driver, l'applicazione ha visto il mio device automaticamente.&lt;/p&gt;  &lt;p&gt;La chiave di svolta che consente di trasformare un "normale" dispositivo in un "Windows 7 Sensor" è il driver (in modalità User Mode e perciò aprova di bluescreen) che dialoga con il dispositivo ed espone i dati alle Sensor API.&lt;/p&gt;  &lt;p&gt;La semplificazione del modello dei sensori significa poter utilizzare i sensori anche in applicazioni in cui la sensoristica non sia lo scopo primario. Pensate ad esempio al valore aggiunto di cambiare la skin da chiara a scura leggendo la luminosità della stanza. Oppure a leggere l'apertura e chiusura cassetto per un POS.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/97939.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2010/02/03/raf-on-channel9.aspx</guid>
            <pubDate>Wed, 03 Feb 2010 10:38:53 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/97939.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2010/02/03/raf-on-channel9.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/97939.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/97939.aspx</trackback:ping>
        </item>
        <item>
            <title>Domani SurfRaf e ...</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2010/02/01/domani-surfraf-e.aspx</link>
            <description>&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/corrado" target="_blank"&gt;Corrado&lt;/a&gt; non te la prendere con me, tuttalpiù con il &lt;a href="http://blogs.ugidotnet.org/pape/" target="_blank"&gt;Presidente&lt;/a&gt; che per la seconda volta di seguito ci ha messo in track parallele ;-)&lt;/p&gt;  &lt;p&gt;Oltre a tenere vivo lo spirito di &lt;a href="http://www.iamraf.net/Articles/SurfRaf-home-made-surface-for-Windows-7" target="_blank"&gt;SurfRaf&lt;/a&gt; nelle demo del MultiTouch, sono riuscito a terminare in tempo la costruzione di un &lt;u&gt;nuovo&lt;/u&gt; hardware per la demo dei sensori. E se al workshop verranno i *veri* geek, l'hardware è irresistibile! :)&lt;/p&gt;  &lt;p&gt;Prometto che non mi porto il saldatore dietro e che parlerò soprattutto di software (managed) :-p&lt;/p&gt;  &lt;p&gt;See you tomorrow!&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/97930.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2010/02/01/domani-surfraf-e.aspx</guid>
            <pubDate>Mon, 01 Feb 2010 13:01:36 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/97930.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2010/02/01/domani-surfraf-e.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/97930.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/97930.aspx</trackback:ping>
        </item>
        <item>
            <title>Workshop UGIdotNET in arrivo questo martedi</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2010/01/28/workshop-ugidotnet-in-arrivo-questo-martedi.aspx</link>
            <description>&lt;p&gt;Gli incontri delle community in Italia stanno aumentando e il fatto è assolutamente positivo. Però mi mancava un po' il classico Workshop UGIdotNET e la data è supervicina, cioè &lt;a href="http://www.ugidotnet.org/events/CommunityTourEnvisioning.aspx" target="_blank"&gt;martedi prossimo 2 Febbraio&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Da parte mia cercherò di interpretare come stia cambiando il futuro dell'interazione con il PC. Windows 7 ci offre nativamente il supporto a nuovi dispositivi di input che possono certamente fare la differenza dal punto di vista dell'usabilità in qualsiasi applicazione.&lt;/p&gt;  &lt;p&gt;Certamente bisognerà prenderci la mano, analizzare meglio i requisiti dell'utente senza dare per scontato che siano tastiera e mouse le periferiche di riferimento. Non mi riferisco solo al supporto MultiTouch (dove non potrò astenermi da ripresentare il celebre SurfRaf) ma anche il supporto ai sensori che possono fornire preziosi input alle nostre applicazioni.&lt;/p&gt;  &lt;p&gt;Per la mia sessione ho scelto di gettare le basi e vedere architetturalmente da dove iniziare per usare questi nuovi dispositivi e per la parte dei sensori ho creato un device driver che ha visto la sua versione 1 a WPC ma che ho rielaborato per l'occasione.&lt;/p&gt;  &lt;p&gt;Il resto dell'agenda è tostissima per cui non mi resta altro darci appuntamento a Martedi.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/97916.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2010/01/28/workshop-ugidotnet-in-arrivo-questo-martedi.aspx</guid>
            <pubDate>Thu, 28 Jan 2010 20:24:33 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/97916.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2010/01/28/workshop-ugidotnet-in-arrivo-questo-martedi.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/97916.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/97916.aspx</trackback:ping>
        </item>
        <item>
            <title>Buone notizie sui certificati root e trust list</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2010/01/17/buone-notizie-sui-certificati-root-e-trust-list.aspx</link>
            <description>&lt;p&gt;Le buone notizie devono avere pari opportunità di quelle brutte e quindi eccone qui due fresche fresche.&lt;/p&gt;  &lt;p&gt;La prima buona nuova è che dopo il mio post Verisign ha modificato le pagine di download da http ad https per le certificate authorities di Verisign, Thawte e GeoTrust. Ringrazio perciò &lt;a href="http://blogs.ugidotnet.org/raffaele/archive/2009/12/22/certificati-root-e-verisign.-giocare-con-il-fuoco-egrave-nulla.aspx#1679588"&gt;Allen Kelly&lt;/a&gt; per aver mantenuto la promessa.    &lt;br /&gt;Spero che le altre CA interessante dal problema seguano l’esempio di Verisign.&lt;/p&gt;  &lt;p&gt;Nel mio &lt;a href="http://blogs.ugidotnet.org/raffaele/archive/2009/12/23/certificati-root-il-problema-egrave-su-vasta-scala.aspx"&gt;post successivo&lt;/a&gt; &lt;a href="http://blogs.ugidotnet.org/raffaele/archive/2009/12/23/certificati-root-il-problema-egrave-su-vasta-scala.aspx#1713717"&gt;Fabrizio ha lasciato un commento&lt;/a&gt; sollevando un dubbio riguardo al download delle Certificate Trust List eseguito periodicamente da Windows Update. Le CTL vengono usate per validare dei certificati (ad esempio quelli delle Certificate Authorities) per una specifica applicazione (nella fattispecie Windows Update).    &lt;br /&gt;Fabrizio ha osservato che il download delle trust list viene eseguito via http e quindi potenzialmente soggette ad un attacco di tipo Man In The Middle.&lt;/p&gt;  &lt;p&gt;E qui viene la seconda buona notizia. Pur non avendo potuto provare ad eseguire uno sniffiing di persona di ciò che avviene, ho chiesto lumi e mi è stato risposto in modo soddisfacente. In sostanza esiste un ‘agent’ che scarica le Certificate Trust List via http ma anche un hash SHA1 via https per validare il download http. L’hash è protetto da https e funge da ‘firma’ per il cab che contiene le certificate trust list (CTL).   &lt;br /&gt;Questo significa che se il download http venisse compromesso, l’agent vedrebbe un hash differente da quello scaricato via https e di conseguenza invaliderebbe il download.&lt;/p&gt;  &lt;p&gt;Se qualcuno non si fida o semplicemente ha tempo da dedicare per toccare con dito quanto ho scritto può eseguire un log di tutta la sessione e verificare che viene scaricato anche l’hash SHA1. In questo caso mi farebbe piacere che commentasse su questo post per dare notizia dei test eseguiti.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/97880.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2010/01/17/buone-notizie-sui-certificati-root-e-trust-list.aspx</guid>
            <pubDate>Sun, 17 Jan 2010 21:56:02 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/97880.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2010/01/17/buone-notizie-sui-certificati-root-e-trust-list.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/97880.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/97880.aspx</trackback:ping>
        </item>
        <item>
            <title>Garante all'italiana e la privacy diventa solo una faccenda di burocrazia</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2010/01/12/garante-allitaliana-e-la-privacy-diventa-solo-una-faccenda-di.aspx</link>
            <description>&lt;p&gt;Recentemente è divenuto effettivo un provvedimento che obbliga le aziende a nominare esplicitamente gli amministratori del proprio sistema informativo i quali devono provvedere a mantenere un registro di tutti gli accessi che eseguono a scopo amministrativo su tutte le macchine della rete.&lt;/p&gt;  &lt;p&gt;Il provvedimento iniziale è questo: &lt;a title="http://www.garanteprivacy.it/garante/doc.jsp?ID=1577499" href="http://www.garanteprivacy.it/garante/doc.jsp?ID=1577499"&gt;http://www.garanteprivacy.it/garante/doc.jsp?ID=1577499&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;L'amico Edoardo Benussi ha risposto a molte domande sul newsgorup winserver a questo proposito. Per chi è interessato a eventuali soluzioni da adottare, non postate sul mio blog, non sarei d'aiuto, ma &lt;a href="http://groups.google.com/groups/search?hl=en&amp;amp;as_q=privacy&amp;amp;as_epq=&amp;amp;as_oq=&amp;amp;as_eq=&amp;amp;num=10&amp;amp;scoring=&amp;amp;lr=&amp;amp;sitesearch=groups.google.com&amp;amp;as_qdr=&amp;amp;as_mind=1&amp;amp;as_minm=1&amp;amp;as_miny=2010&amp;amp;as_maxd=1&amp;amp;as_maxm=1&amp;amp;as_maxy=2010&amp;amp;as_ugroup=microsoft.public.it.winserver&amp;amp;as_usubject=&amp;amp;as_uauthors=Edoardo+Benussi&amp;amp;safe=off" target="_blank"&gt;leggete i vecchi thread&lt;/a&gt; (e domandate se avete ancora dubbi).&lt;/p&gt;  &lt;p&gt;La prima domanda che mi sono posto è: "qual'è lo scopo del provvedimento?". Posso intuire che sia quello di sorvegliare coloro che hanno il sommo potere di amministratore sui dati, potenzialmente sensibili, custoditi nel sistema informativo.   &lt;br /&gt;Ok, mi dico ancora, utile per redarguire l'amministratore che fa il curioso, ma che valore legale hanno queste informazioni? Assolutamente zero, il nulla assoluto, ed il motivo è prettamente tecnico.&lt;/p&gt;  &lt;p&gt;Per essere chiari &lt;strong&gt;qualsiasi indagine giudiziaria&lt;/strong&gt; &lt;strong&gt;&lt;u&gt;non può e non deve mai&lt;/u&gt;&lt;/strong&gt; basarsi su informazioni prelevate da un sistema in cui l'"accusato" abbia &lt;strong&gt;accesso amministrativo&lt;/strong&gt; sul sistema stesso (cioè qualsiasi PC personale) o che ci sia stata la possibilità che vi sia stato installato del "malware" (e vammi a provare il contrario visto che gli antivirus &lt;strong&gt;non&lt;/strong&gt; possono garantire un bel niente). Il resto sono baggianate all'italiana degne solo di gossip.&lt;/p&gt;  &lt;p&gt;Ma cavoli, c'è ancora bisogno di ripetere che non c'è modo tecnologico per dare alcuna garanzia sull'integrità delle informazioni quando il sistema operativo è accesso da un account di amministratore? Se sono admin, sono parte del TCB (Trusted Computing Base) e questo significa:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Poter far girare software in kernel mode che non è soggetto, per definizione, a nessun controllo di sicurezza&lt;/li&gt;    &lt;li&gt;Alterare qualsiasi informazioni senza che questa venga loggata in alcun modo&lt;/li&gt;    &lt;li&gt;Fare tutto ciò di cui sopra in modo molto agevole semplicemente installando un rootkit che rende la cosa facile e realizzabile anche per mio figlio di 8 anni&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Ovviamente questo non vale solo per Windows ma per tutti i sistemi operativi, e se il provvedimento fosse stato fatto interpellando un tecnico, la cosa sarebbe emersa nei primi 5 minuti di conversazione. &lt;strong&gt;Vergogna&lt;/strong&gt;.    &lt;br /&gt;E attenzione che i log vanno tenuti per tutte le macchine dove c'è un implicazione di privacy, quindi i log degli accessi sui router, dei centralini voip, delle appliance, e se in sala mensa c'è una TV con il DLNA che tiene un log dei film che avete visto .... &lt;strong&gt;Ri-Vergogna!&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Il risultato è tragicamente il solito modo per far perdere tempo e denaro alle aziende che dovrebbero invece preoccuparsi seriamente di gestire la materia della sicurezza in altro modo, eseguendo le update, gestendo correttamente i certificati, applicando le best practice di sicurezza per ITPro e Developer.   &lt;br /&gt;Ma quando il Garante comincerà a garantire il cittadino invece di mettergli i bastoni tra le ruote?&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/97840.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2010/01/12/garante-allitaliana-e-la-privacy-diventa-solo-una-faccenda-di.aspx</guid>
            <pubDate>Tue, 12 Jan 2010 16:51:42 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/97840.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2010/01/12/garante-allitaliana-e-la-privacy-diventa-solo-una-faccenda-di.aspx#feedback</comments>
            <slash:comments>7</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/97840.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/97840.aspx</trackback:ping>
        </item>
        <item>
            <title>Certificati root: il problema &amp;egrave; su vasta scala</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2009/12/23/certificati-root-il-problema-egrave-su-vasta-scala.aspx</link>
            <description>&lt;p&gt;Nel post precedente &lt;a href="http://blogs.ugidotnet.org/raffaele/archive/2009/12/22/certificati-root-e-verisign.-giocare-con-il-fuoco-egrave-nulla.aspx"&gt;ho bloggato su Verisign&lt;/a&gt; e a quanto sembra i rumors del mio blog, passando da Twitter, sono arrivati a destinazione. Grazie alla globalizzazione spero che presto avremo da Verisign solo pagine https. Aspetto fiducioso.&lt;/p&gt;  &lt;p&gt;Il problema però non è un caso isolato. Nei commenti del post precedente, Fabrizio mi ha segnalato che sul &lt;a href="http://manpages.ubuntu.com/manpages/intrepid/man1/mozroots.1.html"&gt;sito di Ubuntu&lt;/a&gt; la faccenda è pure peggio! In quella pagina infatti viene indicato di scaricare le root come file di testo dal link: &lt;a href="http://lxr.mozilla.org/seamonkey/source/security/nss/lib/ckfw/builtins/certdata.txt"&gt;http://lxr.mozilla.org/seamonkey/source/security/nss/lib/ckfw/builtins/certdata.txt&lt;/a&gt; appartenente al dominio mozilla.org.&lt;/p&gt;  &lt;p&gt;In pratica viene detto che quella pagina http e quindi non protetta viene usata in modo automatico per installare 93 certificati root. Con un attacco Man In The Middle estremamente semplice (trattandosi di file di testo basta un filtro di ettercap di poche righe) si può installare una root dentro la macchina Linux che sarà perciò vulnerabile agli attacchi già citati nel mio post precedente. Mentre l’attacco a Verisign richiede un minimo di collaborazione dell’utente, qui l’attacco ha una percentuale di riuscita decisamente superiore.&lt;/p&gt;  &lt;p&gt;Ma non è finita. &lt;strong&gt;La vetrina degli orrori&lt;/strong&gt; vede queste Certificate Authories che forniscono le root sempre in http, quindi attaccabili in modo estremamente semplice:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Cacert:  &lt;a title="http://www.cacert.org/index.php?id=3" href="http://www.cacert.org/index.php?id=3"&gt;http://www.cacert.org/index.php?id=3&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Geotrust:  &lt;a title="http://www.geotrust.com/resources/root-certificates/index.html" href="http://www.geotrust.com/resources/root-certificates/index.html"&gt;http://www.geotrust.com/resources/root-certificates/index.html&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Non è ancora finita. Nelle stesse condizioni di Verisign, cioè pagina http con post in https e quindi vulnerabili, ci sono:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Thawte: &lt;a title="http://www.thawte.com/roots/" href="http://www.thawte.com/roots/"&gt;http://www.thawte.com/roots/&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;Entrust: &lt;a title="http://www.entrust.net/developer/index.cfm" href="http://www.entrust.net/developer/index.cfm"&gt;http://www.entrust.net/developer/index.cfm&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Il problema è più che serio. La sicurezza di un sistema dipende da tutti gli attori del sistema. Anche se gli algoritmi alla base di SSL sono sicuri, questo genere di problemi possono causare il fallimento totale. Voglio ricordare che tra gli attori del sistema c’è anche l’utente finale che deve controllare di essere su una pagina sicura con un certificato valido.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/97754.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2009/12/23/certificati-root-il-problema-egrave-su-vasta-scala.aspx</guid>
            <pubDate>Wed, 23 Dec 2009 21:41:18 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/97754.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2009/12/23/certificati-root-il-problema-egrave-su-vasta-scala.aspx#feedback</comments>
            <slash:comments>9</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/97754.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/97754.aspx</trackback:ping>
        </item>
        <item>
            <title>Certificati Root e Verisign. Giocare con il fuoco &amp;egrave; nulla in confronto</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2009/12/22/certificati-root-e-verisign.-giocare-con-il-fuoco-egrave-nulla.aspx</link>
            <description>&lt;p&gt;Verisign ha sul proprio sito il Graal degli Hacker: il download dei certificati root delle più importanti Certificate Authority.&lt;/p&gt;  &lt;p&gt;Quale &lt;a href="http://en.wikipedia.org/wiki/Black_hat" target="_blank"&gt;Black-Hat&lt;/a&gt; non vorrebbe installare il proprio certificato root sulle macchine degli utenti da attaccare? Avere sulla macchina della vittima un certificato root significa poter generare certificati validi emessi per ebay, paypal, banca di qui, banca di là, etc. etc. Poi hostare un clone di quel sito sul proprio pc, corredato del certificato "autentico" e infine dirottare con un "&lt;a href="http://en.wikipedia.org/wiki/Dns_poisoning" target="_blank"&gt;dns poisoning&lt;/a&gt;" l'utente sul proprio pc.&lt;/p&gt;  &lt;p&gt;Cosa può accadere se l'hacker possiede una root Certificate Authority che è installata sul nostro PC?   &lt;br /&gt;Può accadere che utente navighi sulla propria banca, ma grazie ad un dns poisoning viene dirottato sul sito dell'hacker. Quello che vede è un perfetto clone del sito della banca con tanto di certificato valido e una connessione https assolutamente impeccabile. Non è un attacco "delizioso"?&lt;/p&gt;  &lt;p&gt;Torniamo all'inizio. Il punto di partenza è che l'utente deve in qualche modo essere convinto a scaricarsi le root aggiornate di Verisign e l'hacker deve intercettare il download. Come e quando importa poco, si va da un banale attacco di &lt;a href="http://en.wikipedia.org/wiki/Social_engineering_(security)" target="_blank"&gt;social-engineering&lt;/a&gt; ad una reale esigenza di aggiornare i certificati. &lt;/p&gt;  &lt;p&gt;Dove sbaglia Verisign? La pagina di download delle root è in http .... fantastico tenendo conto che a Verisign i certificati non costano neppure 1 cent &lt;img alt="smile_omg" src="http://spaces.live.com/rte/emoticons/smile_omg.gif" /&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/raffaele/WindowsLiveWriter/Certif.Giocareconilfuoconullainconfronto_CCDC/image_2.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/Certif.Giocareconilfuoconullainconfronto_CCDC/image_thumb.png" width="244" height="138" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;L'utente accorto vedrà subito che il post è verso un sito https ma qui casca l'asino:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;L'hacker esegue l'attacco sulla pagina http e sostituisce il post da https ad http, quindi questo link non sarà mai in https&lt;/li&gt;    &lt;li&gt;Se si usa SSLStrip, quell'https per "magia" torna ad essere http, come ho fatto vedere ai recenti TechDays/WPC.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/raffaele/WindowsLiveWriter/Certif.Giocareconilfuoconullainconfronto_CCDC/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/Certif.Giocareconilfuoconullainconfronto_CCDC/image_thumb_1.png" width="244" height="74" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;L'attacco &lt;a href="http://en.wikipedia.org/wiki/Man-in-the-middle_attack" target="_blank"&gt;Man in The Middle&lt;/a&gt; consiste nell'usare un tool come Ettercap (ma ce ne sono molti altri) per intercettare l'attività tra i client e i server. Per cui anche se non si è fisicamente in mezzo, è possibile intercettare il traffico di rete tra due pc. È comunque necessario essere su una tratta di rete che permetta di porre l'attacco. Non so se la grande lan di Fastweb sia soggetta all'&lt;a href="http://en.wikipedia.org/wiki/Arp_poisoning" target="_blank"&gt;arp poisoning&lt;/a&gt; che ho mostrato nella mia sessione, ma certamente sono più le reti che possono accusare il colpo di quelle protette da questo tipo di attacchi.&lt;/p&gt;  &lt;p&gt;Una volta intercettato il download l'utente riceve uno zip in cui uno o più certificati sono stati creati dalla Certificate Authority dell'hacker.&lt;/p&gt;  &lt;p&gt;Lo zip contiene ben 41 certificati Root!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/raffaele/WindowsLiveWriter/Certif.Giocareconilfuoconullainconfronto_CCDC/image_8.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/Certif.Giocareconilfuoconullainconfronto_CCDC/image_thumb_3.png" width="244" height="147" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Installare una root sul pc della vittima significa che quel pc validerà in modo positivo qualsiasi certificato emesso da quella root. I risultati sono devastanti.&lt;/p&gt;  &lt;p&gt;Una raccomandazione finale. Come dico sempre, fate le prove attaccando delle macchine ma solo in &lt;strong&gt;reti di test&lt;/strong&gt; o in azienda &lt;strong&gt;solo dopo&lt;/strong&gt; aver avvisato amministratori &lt;strong&gt;&lt;u&gt;e&lt;/u&gt;&lt;/strong&gt; utenti. Non ci sono deroghe a queste regole.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/97748.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2009/12/22/certificati-root-e-verisign.-giocare-con-il-fuoco-egrave-nulla.aspx</guid>
            <pubDate>Tue, 22 Dec 2009 13:34:00 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/97748.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2009/12/22/certificati-root-e-verisign.-giocare-con-il-fuoco-egrave-nulla.aspx#feedback</comments>
            <slash:comments>9</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/97748.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/97748.aspx</trackback:ping>
        </item>
        <item>
            <title>Failure by design, e al cliente va bene cos&amp;igrave;</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2009/12/22/failure-by-design-e-al-cliente-va-bene-cosigrave.aspx</link>
            <description>&lt;p&gt;Neve e ghiaccio sono la condizione meteo di parecchie città di questa mattina. Il buon cittadino si tiene informato seguendo i siti web dove può vedere con i propri occhi la situazione reale.&lt;/p&gt;  &lt;p&gt;Così apro il sito &lt;a href="http://www.autostrade.it"&gt;www.autostrade.it&lt;/a&gt; per capire cosa sta succedendo. Il sito non è raggiungibile per (presunti) troppi hit dei buoni cittadini che vogliono informarsi.&lt;/p&gt;  &lt;p&gt;Uhm, qui c'è qualcosa che non torna. Una azienda, le autostrade spa, offre un servizio ai suoi clienti, il sito web e le webcam. L'utilità del sito è proprio nei momenti difficili: situazioni limite del meteo, picchi di traffico, lavori in corso, etc. Se il sito fallisce nel dare le informazioni in questi casi limite, è inutile.   &lt;br /&gt;Il paragone è il sito di un eCommerce nel periodo di Natale. Se per i troppi collegamenti il sito non funziona, perdo i clienti.&lt;/p&gt;  &lt;p&gt;Fino a qui posso già immaginare i commenti a questo post in cui viene sottolineato che autostrade non danno importanza al cliente in quanto monopolisti e con un'eredità di mentalità "pubblica".   &lt;br /&gt;Sono però convinto che l'apparente (?) boriosa mentalità monopolista non basti a giustificare le cattive scelte. Un sito (servizio) che funziona giova anche al monopolista, perlomeno per lucidare un po' l'immagine aziendale.&lt;/p&gt;  &lt;p&gt;Guardiamola quindi dal punto di vista di chi ha realizzato il sito:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;l'architettura del sistema è pensata per essere scalabile? No&lt;/li&gt;    &lt;li&gt;è stato previsto il fallback ad una pagina alternativa, come dice &lt;a href="http://blogs.ugidotnet.org/allePalle_blog" target="_blank"&gt;Alessandro&lt;/a&gt;, con le sole informazioni essenziali? No&lt;/li&gt;    &lt;li&gt;la pagina client è sufficientemente leggera da reggere carichi improvvisi? No&lt;/li&gt;    &lt;li&gt;...&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Il fallimento è quindi il matrimonio tra committente, team di sviluppo e servizio di hosting.&lt;/p&gt;  &lt;p&gt;E ancora peggio è l'utente del sito che considera normale, causa maltempo, che ci sia un disservizio su un sito che serve proprio in caso di maltempo.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/97746.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2009/12/22/failure-by-design-e-al-cliente-va-bene-cosigrave.aspx</guid>
            <pubDate>Tue, 22 Dec 2009 10:03:21 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/97746.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2009/12/22/failure-by-design-e-al-cliente-va-bene-cosigrave.aspx#feedback</comments>
            <slash:comments>11</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/97746.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/97746.aspx</trackback:ping>
        </item>
        <item>
            <title>Persistenza e database</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2009/12/21/persistenza-e-database.aspx</link>
            <description>&lt;p&gt;Un progetto la cui architettura sta emergendo in questi giorni, ha evidenziato una problematica ricorrente che riguarda la necessità o meno di strutturare i dati in modo relazionale nel database.   &lt;br /&gt;Per evitare di farla troppo lunga, partiamo da un esempio. Diciamo quindi di avere un modulo di una applicazione che deve eseguire del logging sulle attività svolte da un utente all'interno di un sito.&lt;/p&gt;  &lt;p&gt;L'attività da loggare è ha un inizio, i dati da loggare cambiano a seconda di come opera l'utente nell'applicazione, termina quando l'utente ha completato un determinato task, il log deve essere cancellato dopo un certo tempo perché lo storico non sia eccessivo e per rispettare la privacy.&lt;/p&gt;  &lt;p&gt;Il database è lo strumento ideale per mantenere questi dati? Se consideriamo il modo "classico" di gestione del database la mia risposta è no.&lt;/p&gt;  &lt;p&gt;Facciamo un passo indietro e domandiamoci perché si sceglie il database. I motivi in cima alla lista sono: gestione "gratis" della concorrenza nell'accesso ai dati, ottime performance nella ricerca dei dati, capacità di relazionare set di dati eterogenei, etc.   &lt;br /&gt;Ma nel nostro esempio cosa ci serve di tutto ciò? Più che altro ci serve la gestione della concorrenza per cui sarebbe da pazzi eseguire la persistenza su un file xml.&lt;/p&gt;  &lt;p&gt;Quale altra tecnologia ci permette di rispondere a quelle domande per lo specifico problema in esempio? Workflow Foundation non solo risponde a questi requisiti ma semplifica di parecchio lo sviluppo della soluzione:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Alla crezione del nuovo log, viene creato una nuova istanza di workflow&lt;/li&gt;    &lt;li&gt;Dalla versione 4.0 possiamo gestire la logica del nostro esempio di logging (e i relativi dati) secondo una Flowchart, cosa particolarmente familiare a qualsiasi developer, quindi meno prona ad errori.&lt;/li&gt;    &lt;li&gt;I workflow possono essere "long-running" e sarà l'engine a gestirne la persistenza sul "media" che il developer ha stabilito. La persistenza può anche finire in un blob così come su un db relazionale. Il tutto è "nascosto" all'applicazione e come ogni disaccoppiamento questo è un grosso beneficio.&lt;/li&gt;    &lt;li&gt;L'avanzamento dell'attività dell'utente si ottiene dall'object model di Workflow, anche da una applicazione esterna di amministrazione. A partire dalla versione 4.0 ci sono anche gli strumenti già pronti come la dashboard di "Dublin".&lt;/li&gt;    &lt;li&gt;Il workflow può avere come ultimo stadio una "Sleep" di 2 mesi e poi decidere di cancellare la persistenza. Quei due mesi non sono altro che un blob posteggiato da qualche parte. In memoria non c'è nulla ma il runtime sa che, tascorso quel tempo, deve riattivare quell'istanza e farla proseguire. Il suo ultimo stadio è quello della cancellazione dello storico.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;In sostanza basta disegnare graficamente il workflow, oops flowchart,  (magari dopo aver sviluppato delle adeguate custom activity) e dirgli che ci serve il servizio di persistenza, e il gioco è fatto.&lt;/p&gt;  &lt;p&gt;Magari abbiamo configurato la persistenza di WF su un db relazionale, o magari abbiamo usato Table o Blob di Windows Azure, ma quel che più importa è che non abbiamo disegnato un db, non abbiamo scritto query o sp, non abbiamo un datalayer per questa specifica parte dell'applicazione.&lt;/p&gt;  &lt;p&gt;Ovviamente il concetto è trasportabile anche a molti altri esempi ma non è generalizzabile anche se ritengo che l'abitudine ad usare il db per tutta la persistenza nasconda soluzioni più brillanti.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/97742.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2009/12/21/persistenza-e-database.aspx</guid>
            <pubDate>Mon, 21 Dec 2009 17:48:45 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/97742.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2009/12/21/persistenza-e-database.aspx#feedback</comments>
            <slash:comments>14</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/97742.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/97742.aspx</trackback:ping>
        </item>
        <item>
            <title>Windows Identity Foundation &amp;egrave; in RTM ma attenzione alla documentazione</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2009/12/02/windows-identity-foundation-egrave-in-rtm-ma-attenzione-alla-documentazione.aspx</link>
            <description>&lt;p&gt;Windows Identity Foundation (WIF) [pronunciato "dab ai ef"] è in RTM. Stiamo parlando del progetto che aveva in alfa il nome "Zermatt" e successivamente in beta 1 e 2 "Geneva".&lt;/p&gt;  &lt;p&gt;Per chi non conoscesse queste tecnologie WIF è:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;il nuovo modello di sicurezza di WCF che rimpiazza totalmente il modello ed i claim della versione 3.0 e 3.5. In questo nuovo modello si può conservare il mapping claim &amp;lt;--&amp;gt; ruoli in modo da rendere facile la migrazione del codice esistente&lt;/li&gt;    &lt;li&gt;un set di tecnologie basate su Claim e sui protocolli standard WS-Trust e WS-Federation, e di conseguenza interoperabile con altre tecnologie di altri sistemi operativi&lt;/li&gt;    &lt;li&gt;un modo per togliere il processo di autenticazione/autorizzazione dalle applicazioni ed esternalizzarle. Questo porta ad una serie di vantaggi tra cui la scalabilità dei servizi che hanno massicci carichi di autenticazione e controllo dei ruoli&lt;/li&gt;    &lt;li&gt;C'è molto altro ma per dirla in parole povere, come sviluppatori, project manager o architetti .... ci tocca :)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Chi inizia oggi non deve preoccuparsi di nulla. Go and use it.&lt;/p&gt;  &lt;p&gt;Una piccola nota per chi come il sottoscritto ha prodotto un bel po' di codice.   &lt;br /&gt;Le modifiche durante tutto il corso delle alfa e beta sono state tante e significative, ma questo è più che ovvio. Fino alla beta 2 le modifiche erano anche ben documentate.    &lt;br /&gt;Poi viene annunciata a PDC 2009 la RTM (o RTW come la chiamano ora) e il team &lt;a href="http://blogs.msdn.com/card/archive/2009/11/18/windows-identity-foundation-wif-rtm-announced.aspx" target="_blank"&gt;blogga i vari documenti&lt;/a&gt;. Tra questi un pdf che dovrebbe colmare il gap tra la beta2 e la RTM. Peccato che la documentazione sia totalmente insufficiente e le differenze sono molte di più e non documentate. Prontamente ho aperto un &lt;a href="https://connect.microsoft.com/feedback/ViewFeedback.aspx?FeedbackID=517467&amp;amp;SiteID=642" target="_blank"&gt;bug di documentazione su connect&lt;/a&gt; se qualcuno fosse interessato a votarlo.&lt;/p&gt;  &lt;p&gt;Per ricapitolare, WIF è un'iniziativa in cui sono coinvolti questi attori:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Il pacchetto di redist che va &lt;strong&gt;solo sul server&lt;/strong&gt;. Viene fornito come .msu (update) per Windows Vista/2008 e Windows 7/2008R2. &lt;strong&gt;Il lato client&lt;/strong&gt; funziona senza dover installare nulla perché WCF è già "federation aware" e non ha bisogno di altri assembly per lavorare con WIF.      &lt;br /&gt;Con gli assembly lato server si possono sviluppare le "Relaying Party" (web app, servizi, etc.) ma anche STS (Secure Token Service) sia di tipo "Identity Provider" che di tipo "Trasformatori di Claim".      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Il pacchetto SDK (che non contiene quello di redist) destinato agli sviluppatori con help ed esempi.     &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Cardspace 2. Tutt'ora in beta 2 non usa il Framework come la versione 1 di Cardspace in modo da rendere super-snello il suo deploy.     &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;ADFS2. È ancora in beta 2 e si chiamava Geneva Server. In pratica è un add-on per Active Directory per far si che AD sia anche un STS per le tecnologie WIF.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Developer Center:   &lt;br /&gt;&lt;a title="http://msdn.microsoft.com/en-us/security/aa570351.aspx" href="http://msdn.microsoft.com/en-us/security/aa570351.aspx"&gt;http://msdn.microsoft.com/en-us/security/aa570351.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Redist:   &lt;br /&gt;&lt;a title="http://www.microsoft.com/downloads/details.aspx?FamilyID=eb9c345f-e830-40b8-a5fe-ae7a864c4d76&amp;amp;displaylang=en" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=eb9c345f-e830-40b8-a5fe-ae7a864c4d76&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=eb9c345f-e830-40b8-a5fe-ae7a864c4d76&amp;amp;displaylang=en&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;SDK:   &lt;br /&gt;&lt;a title="http://www.microsoft.com/downloads/details.aspx?familyid=C148B2DF-C7AF-46BB-9162-2C9422208504&amp;amp;displaylang=en" href="http://www.microsoft.com/downloads/details.aspx?familyid=C148B2DF-C7AF-46BB-9162-2C9422208504&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?familyid=C148B2DF-C7AF-46BB-9162-2C9422208504&amp;amp;displaylang=en&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/97648.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2009/12/02/windows-identity-foundation-egrave-in-rtm-ma-attenzione-alla-documentazione.aspx</guid>
            <pubDate>Wed, 02 Dec 2009 13:42:59 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/97648.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2009/12/02/windows-identity-foundation-egrave-in-rtm-ma-attenzione-alla-documentazione.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/97648.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/97648.aspx</trackback:ping>
        </item>
        <item>
            <title>TechDays/WPC 2009 conclusa</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2009/11/27/techdayswpc-2009-conclusa.aspx</link>
            <description>&lt;p&gt;Il mio recente silenzio sul blog è dipeso anche dal tempo necessario alla preparazione a questo magnifico evento che si è svolto come sempre a Milano Assago.&lt;/p&gt;  &lt;p&gt;Voglio ringraziare i tantissimi presenti per il calorosissimo feedback che ho ricevuto di persona nei corridoi. La hacking session è stata una sfacchinata, ci sono voluti 45 minuti per preparare le macchine sul palco prima della sessione ma la fatica è stata ripagata dalla presenza e dai complimenti dei partecipanti.   &lt;br /&gt;Le mie 4 sessioni erano queste:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Le novità di C# 4.0&lt;/strong&gt;. Tutte novità improntate all'interoperabilità. Sono partito dagli optional e named parameters, passando da co/contravarianza per arrivare al tema centrale: il DLR. La keyword dynamic non apre solo a scenari di interoperabilità più facile per i linguaggi di scripting e per COM ma si presta a molto altro. Prima di tutto per migliorare le performance del codice che oggi usa reflection ma anche per generare dei proxy in modo molto semplice. La demo su ExpandoObject credo che abbia reso l'idea. Ho concluso su noPIA, cioè il type embedding che pur essendo una caratteristica nata per il mondo COM rivoluziona il versioning nel CLR. Ho promesso che avrei bloggato sul type embedding e lo farò a breve.      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Hacking Session&lt;/strong&gt;. La LAN è sconfitta, entrarci è molto più semplice di quanto si creda comunemente e spero che le demo di attacchi pratici abbiano reso l'idea e messo sull'allerta tutti. In particolare mi rivolgo ai developer che credono, sbagliando di grosso, che le applicazioni in deploy sulla LAN non abbiano bisogno di essere messe in sicurezza: è un errore super-clamoroso.      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Windows 7 e Windows 2008 API&lt;/strong&gt;. Ho mostrato i Windows Web Services usati da VB6 per facilitare la migrazione dal vecchio al nuovo mondo. Poi sono passato alle API dei sensori ed in particolare un device driver che ho sviluppato per interfacciare un dispositivo che parla sulla seriale (che sono decisamente i dispositivi più comuni). Così facendo la seriale è gestita dal device driver (in user mode) e perciò un numero arbitrario di applicazioni possono usare contemporaneamente il sensore. Poi sono passato al &lt;a href="http://www.iamraf.net/Articles/SurfRaf-home-made-surface-for-Windows-7" target="_blank"&gt;SurfRaf&lt;/a&gt; e c'è stato modo anche di parlare del MicroFramework 4.0.      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Creazione di documenti xlsx e docx con OpenXML SDK 2.0&lt;/strong&gt;. Generare documenti con questo sdk diventa estremamente semplice visto un tool, DocumentReflector, che permette in un minuto di fare tutto: creo il documento con Office, mi faccio generare il codice C# equivalente dal tool, eseguo "incolla" in Visual Studio e il gioco è fatto. Certamente non ci siamo fermati qui e ho mostrato come generare documenti usando l'object model del nuovo sdk che ha determinate peculiarità. Oggi la generazione di documenti tramite interoperabilità con Office non è certamente più conveniente per motivi di prestazioni e di dipendenze da Office, task da evitare soprattutto sul lato server.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Grazie anche a tutto lo staff di Overnet per l'impeccabile organizzazione.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/97618.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2009/11/27/techdayswpc-2009-conclusa.aspx</guid>
            <pubDate>Fri, 27 Nov 2009 10:02:41 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/97618.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2009/11/27/techdayswpc-2009-conclusa.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/97618.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/97618.aspx</trackback:ping>
        </item>
        <item>
            <title>MicroFramework 4.0 fa il botto</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2009/11/18/microframework-4.0-fa-il-botto.aspx</link>
            <description>&lt;p&gt;Oggi è iniziata la PDC e con rammarico non sono laggiù a godermi le novità.&lt;/p&gt;  &lt;p&gt;Nella keynote si è parlato tantissimo di Azure ma ci sono molte altre cose interessanti da guardare con molta attenzione. Tra queste l'annuncio dell'uscita del MicroFramework 4.0.&lt;/p&gt;  &lt;p&gt;È lo stesso Colin Miller, il boss, ad &lt;a href="http://blogs.msdn.com/netmfteam/archive/2009/11/15/net-micro-framework-version-4-0-ships-open-source-community-development-and-more.aspx" target="_blank"&gt;annunciare le novità di questa versione&lt;/a&gt;:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Rilasciati la quasi totalità dei sorgenti in licenza Apache 2.0&lt;/li&gt;    &lt;li&gt;Supporto ad Http e SSL anche dentro l'emulatore&lt;/li&gt;    &lt;li&gt;Gestione del multitouch&lt;/li&gt;    &lt;li&gt;Supporto al versioning&lt;/li&gt;    &lt;li&gt;Una formula chiamata "&lt;a href="http://www.netmf.com/" target="_blank"&gt;Community Development Model&lt;/a&gt;" che ha lo scopo di fungere da arbitro su ciò che verrà implementato nella versione mainstream in modo da evitare che la diffusione dei sorgenti moltiplichi versioni parallele con conseguente impossibilità della sua gestione.&lt;/li&gt;    &lt;li&gt;Molto altro ancora per quanto riguarda performance e gestione.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Applausi al team. Io sto usando da tempo la versione 3 e già questa è da spettacolo.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/97535.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2009/11/18/microframework-4.0-fa-il-botto.aspx</guid>
            <pubDate>Tue, 17 Nov 2009 23:29:30 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/97535.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2009/11/18/microframework-4.0-fa-il-botto.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/97535.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/97535.aspx</trackback:ping>
        </item>
        <item>
            <title>Windows 7 e le API dei sensori</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2009/11/11/windows-7-e-le-api-dei-sensori.aspx</link>
            <description>&lt;p&gt;L'hardware ha fascino, non c'è dubbio. Chi ha la passione per il software come il sottoscritto, sente un sapore particolare nel programmare un microcontrollore e toccare con mano il proprio operato sul "metallo".&lt;/p&gt;  &lt;p&gt;La porta seriale ha sempre svolto il mestiere di jolly per interfacciare qualsiasi tipo di periferica e anche i programmatori hanno avuto vita piuttosto semplice nell'usare la seriale.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Poi è arrivata la USB&lt;/strong&gt;. Bella, veloce e pratica ma decisamente ostile per un developer. Il perché è semplice. Le categorie di device (e quindi di driver) dipendono dalla funzione svolta. Perciò se il device è un mouse o una tastiera, Windows sa già cosa fare e quindi basta il device generico "HID" (Human Interface Device). Al di fuori di questo è necessario un device driver specifico dal produttore.&lt;/p&gt;  &lt;p&gt;A parte il fatto che con lo scempio di driver che ci sono in giro, tremo tutte le volte che ne devo installare uno, ma qui vado offtopic, il problema è che il device driver non basta ma:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;ho bisogno di &lt;u&gt;documentazione&lt;/u&gt; per sapere come comunicare con il device &lt;/li&gt;    &lt;li&gt;in alcuni casi ho bisogno di un &lt;u&gt;sdk&lt;/u&gt; &lt;/li&gt;    &lt;li&gt;la periferica spesso è in &lt;u&gt;uso esclusivo&lt;/u&gt; per una sola applicazione &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;A semplificare un pochino le cose molti device fanno finta di essere madrelingua USB e si limitano a usare un dispositivo USB to Serial che usa la USB come protocollo fisico ma viene visto come seriale da Windows. Ma questo non risolve tutto in particolare il problema dell'uso esclusivo.&lt;/p&gt;  &lt;p&gt;L'uso esclusivo è un problema grosso, pensiamo ad esempio ad un GPS, tradizionalmente un device seriale (over bluetooth di solito) di cui più applicazioni possono avere bisogno.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Poi arriva Windows 7&lt;/strong&gt; e un nuovo layer di API specifiche per i sensori e la storia cambia radicalmente.&lt;/p&gt;  &lt;p&gt;Il device ed il suo driver non devono cambiare nulla rispetto a prima. Se il device ha bisogno di un driver questo continua ad esistere. Se invece usa la seriale, continuerà a non dover fare nulla.&lt;/p&gt;  &lt;p&gt;Le Sensor API hanno però bisogno di un altro driver, molto più semplice, parliamo di un oggetto COM multithreading in usermode sviluppato con il device driver kit "UMDF" (User Mode Driver Framework). Le funzioni di questo driver sono:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;normalizzare il dialogo tra Windows e il device in modo 'standard'. In questo driver vengono affogata la flowchart di comunicazione con il device: il protocollo di comunicazione. &lt;/li&gt;    &lt;li&gt;normalizzare il contenitore dei dati affiancando un timestamp che indichi quando sono stati campionati &lt;/li&gt;    &lt;li&gt;gestire la "ownership" del device. Quindi il nuove driver funge da proprietario e fa da gateway per tutte le applicazioni che vogliono usare quel device &lt;/li&gt;    &lt;li&gt;garantire la continuità della comunicazione da un altro processo, quello del driver. Se quindi freezo la mia applicazione e poi riprendo dopo qualche secondo, i dati mi arrivano tutti perché il driver sa dove ero arrivato. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Chi realizza il driver? Si spera che il produttore veda un business in questo ma chiunque sappia comunicare con il device al vecchio modo può realizzare questo driver "wrapper". Naturalmente C++ e COM sono necessari ma il codice da scrivere è proprio poco.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Poi arriviamo noi&lt;/strong&gt; che sviluppiamo applicazioni. Scarichiamo il &lt;a href="http://code.msdn.microsoft.com/WindowsAPICodePack" target="_blank"&gt;CodePack&lt;/a&gt;, e con poche righe di C# (o vb.net, o F#, ...) si accede ai dati del sensore. Poi avviamo due, tre, quattro istanze dell'applicazione e tutte possono accedere a questi dati ... cool!&lt;/p&gt;  &lt;p&gt;L'architettura delle Sensor API prevede la categorizzazione dei sensori: accelerometri, sensori di luce, GPS (fisici o virtuali basati su WiFi), ma anche di creare nuove categorie.&lt;/p&gt;  &lt;p&gt;A &lt;a href="http://techdays-wpc.it/" target="_blank"&gt;TechDays/WPC&lt;/a&gt; farò vedere anche i sensori (compresi i device driver UMDF) nella &lt;a href="http://techdays-wpc.it/DettaglioSpeakers.aspx?IDSpeaker=27" target="_blank"&gt;mia sessione&lt;/a&gt; sulle novità delle API in Windows 7/2008 R2.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/97495.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2009/11/11/windows-7-e-le-api-dei-sensori.aspx</guid>
            <pubDate>Wed, 11 Nov 2009 08:56:02 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/97495.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2009/11/11/windows-7-e-le-api-dei-sensori.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/97495.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/97495.aspx</trackback:ping>
        </item>
        <item>
            <title>[OT] SMAU e SPAM</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2009/10/28/ot-smau-e-spam.aspx</link>
            <description>&lt;p&gt;Ho avuto a che fare con l'ente SMAU (come espositore) dal lontano 1991. Sono un muro di gomma.&lt;/p&gt;  &lt;p&gt;Ricordo le file di espositori alle 8:50 davanti all'ingresso di Porta Carlo Magno sotto l'acqua dirotta e naturalmente senza sufficiente spazio per tutti sotto le pensiline. Risultato: una settimana di doccia tutti i giorni perché anche l'ombrello serviva a poco e niente.&lt;/p&gt;  &lt;p&gt;Ricordo le discussioni accese al desk degli organizzatori al palazzo del CISI quando lamentavamo tutti che l'ingresso selvaggio al pubblico avrebbe fatto morire la manifestazione. Puntualmente l'anno dopo c'erano Radio105, e allo stand arrivava gente che acchiappava i nostri mouse e porta mouse come se fossero dei gadget *dovuti*.&lt;/p&gt;  &lt;p&gt;Ricordo i prezzi per metro quadro di uno stand, le code chilometriche ai bar senza corsia preferenziale per gli espositori, e molto altri "bei" ricordi. L'amico SDP con cui ho condiviso quel periodo certamente ne potrebbe aggiungere molte altre a questa lista.&lt;/p&gt;  &lt;p&gt;Da 5 anni a questa parte spediscono SPAM selvaggia a chiunque gli fornisca un'email, il sistema di de-subscribing ovviamente è finto e non funziona, le telefonate finiscono nel cestino, le minacce di passare all'amico avvocato funzionano un pochino di più.&lt;/p&gt;  &lt;p&gt;Quest'anno Microsoft ha fatto l'errore (IMHO) di effettuare la registrazione affidandola a questi spammer di professione, gente che il rapporto con il "cliente" ha dimostrato da un paio di decenni di non sapere neppure cosa sia. E questo è il motivo per cui non mi sono iscritto alla bellissima festa di lancio di Windows 7 che si è tenuta alla fiera di Milano. Ovviamente me ne sono stato zitto fin'ora per non fare il guastafeste, ma mi è dispiaciuto perché incontrare i soliti ignoti mi avrebbe fatto immenso piacere.&lt;/p&gt;  &lt;p&gt;Si, avrei potuto fare una regola di posta, usare il plugin di disintegrazione in Outlook, passare la loro email sulle liste di distribuzione dei BOT che massacrano il server che le spedisce e molto altro ancora, ma una volta tanto l'ho fatto per principio.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/97381.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2009/10/28/ot-smau-e-spam.aspx</guid>
            <pubDate>Wed, 28 Oct 2009 08:03:46 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/97381.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2009/10/28/ot-smau-e-spam.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/97381.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/97381.aspx</trackback:ping>
        </item>
        <item>
            <title>Office OpenXML SDK 2.0 (beta)</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2009/10/22/office-openxml-sdk-2.0-beta.aspx</link>
            <description>&lt;p&gt;Era da un po' che volevo scrivere sull'argomento e la preparazione della sessione che presenterò a &lt;a href="http://techdays-wpc.it/" target="_blank"&gt;TechDays/WPC&lt;/a&gt; tra un mese è stato il trigger di questo post.&lt;/p&gt;  &lt;p&gt;Più di due anni fa ho iniziato a sviluppare delle librerie (oggi felicemente in funzione) per creare file conformi allo standard &lt;a href="http://www.ecma-international.org/publications/standards/Ecma-376.htm" target="_blank"&gt;ECMA-376&lt;/a&gt; che, in quanto membro della commissione ISO JTC1/SC34, spero di upgradare presto alla versione &lt;a href="http://blogs.ugidotnet.org/raffaele/archive/2008/04/02/92000.aspx" target="_blank"&gt;ISO DIS29500&lt;/a&gt; recentemente approvata (ma ancora non utilizzata da alcuna applicazione sul mercato).&lt;/p&gt;  &lt;p&gt;La &lt;a href="http://blogs.msdn.com/dmahugh/archive/2008/03/13/open-xml-sdk-roadmap.aspx" target="_blank"&gt;beta della versione 2.0 dell'SDK&lt;/a&gt; fa un passo significativo in avanti rispetto alla 1.0. Mentre la 1.0 semplificava di fatto la gestione del package OPC dentro cui sono custoditi i file XML che descrivono i dati, la 2.0 aggiunge un aiuto stra-prezioso nella creazione dei dati stessi:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;un elaborato object model per generare il contenuto (non è quindi necessario scrivere XML)&lt;/li&gt;    &lt;li&gt;la validazione degli schemi&lt;/li&gt;    &lt;li&gt;il tool DocumentReflector che esegue legge un documento esistente e genera al volo il codice C# che produce quel documento. 10 e lode a chi ha creato questo tool.&lt;/li&gt;    &lt;li&gt;un tool di comparazione di due documenti ooxml&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Il tool DocumentReflector è &lt;strong&gt;risolutivo&lt;/strong&gt; nella gran parte di piccole applicazioni, soprattutto per la generazione di documenti destinati a Word. Si crea un documento con Word con formattazione, immagini e quant'altro, si carica il documento con questo tool, copia incolla del codice C# in un progetto, si inseriscono le variabili per personalizzare il documento e il gioco è fatto. A questo punto facendo un loop su una anagrafica si creano tutti i docx personalizzati.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/raffaele/WindowsLiveWriter/OfficeOpenXMLSDK2.0beta_A683/image_2.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/OfficeOpenXMLSDK2.0beta_A683/image_thumb.png" width="244" height="205" /&gt;&lt;/a&gt;     &lt;br /&gt;Ovviamente non è adatto a tutti gli scenari e infatti di questo parlerò nella mia sessione.&lt;/p&gt;  &lt;p&gt;Ben diverso è uno spreadsheet che ha molta più variabilità e qui si toccano di più gli aspetti negativi dell'SDK.   &lt;br /&gt;Per esempio nei file XML è necessario sia presente l'attributo Count pari al numero di elementi child:&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;x:fonts&lt;/span&gt; &lt;span style="color: #ff0000"&gt;&lt;strong&gt;&lt;u&gt;count&lt;/u&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="2"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlns:x&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="http://schemas.openxmlformats.org/spreadsheetml/2006/main"&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;x:font&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;x:sz&lt;/span&gt; &lt;span style="color: #ff0000"&gt;val&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="11"&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;   4:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;x:color&lt;/span&gt; &lt;span style="color: #ff0000"&gt;auto&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="1"&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;   5:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;x:name&lt;/span&gt; &lt;span style="color: #ff0000"&gt;val&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Calibri"&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;   6:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;x:family&lt;/span&gt; &lt;span style="color: #ff0000"&gt;val&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="2"&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;   7:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;x:scheme&lt;/span&gt; &lt;span style="color: #ff0000"&gt;val&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="minor"&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;   8:&lt;/span&gt;   &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;x:font&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;   9:&lt;/span&gt;   &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;x:font&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;  10:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;x:sz&lt;/span&gt; &lt;span style="color: #ff0000"&gt;val&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="14"&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;  11:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;x:color&lt;/span&gt; &lt;span style="color: #ff0000"&gt;rgb&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="FF0000"&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;  12:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;x:name&lt;/span&gt; &lt;span style="color: #ff0000"&gt;val&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="Calibri"&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;  13:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;x:family&lt;/span&gt; &lt;span style="color: #ff0000"&gt;val&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="0"&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;  14:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;x:scheme&lt;/span&gt; &lt;span style="color: #ff0000"&gt;val&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="minor"&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;  15:&lt;/span&gt;   &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;x:font&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;  16:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;x:fonts&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;Grazie a C# 3.0 e all'sdk, è possibile creare l'equivalente di quell'XML in questo modo:&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; height: 274px; 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;new&lt;/span&gt; Fonts(&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;new&lt;/span&gt; Font(&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;new&lt;/span&gt; FontSize(){ Val = 11D },&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;new&lt;/span&gt; Color(){ Auto = &lt;span style="color: #0000ff"&gt;true&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;new&lt;/span&gt; FontName(){ Val = &lt;span style="color: #006080"&gt;"Calibri"&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;   6:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; FontFamilyNumbering(){ Val = 2 },&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;span style="color: #0000ff"&gt;new&lt;/span&gt; FontScheme(){ Val = FontSchemeValues.Minor }),&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;new&lt;/span&gt; Font(&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;span style="color: #0000ff"&gt;new&lt;/span&gt; FontSize(){ Val = 14D },&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;         &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Color(){ Rgb = &lt;span style="color: #006080"&gt;"FF0000"&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;  11:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; FontName(){ Val = &lt;span style="color: #006080"&gt;"Calibri"&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;  12:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; FontFamilyNumbering(){ Val = 0 },&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;span style="color: #0000ff"&gt;new&lt;/span&gt; FontScheme(){ Val = FontSchemeValues.Minor })&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;  14:&lt;/span&gt; ){ &lt;strong&gt;&lt;u&gt;Count&lt;/u&gt;&lt;/strong&gt; = (UInt32Value)2U },&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Da notare la proprietà &lt;strong&gt;&lt;u&gt;Count&lt;/u&gt;&lt;/strong&gt; e l'attributo &lt;strong&gt;&lt;u&gt;count&lt;/u&gt;&lt;/strong&gt; nei due riquadri sopra.&lt;/p&gt;

&lt;p&gt;La classe Fonts si comporta come una collection ma:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;la sua proprietà Count è finta, cioè deve essere valorizzata altrimenti vale null (non zero ma proprio null perché è una classe di OOXML SDK). &lt;/li&gt;

  &lt;li&gt;l'omissione di qualsiasi dato mandatario comporta la creazione di un documento non valido (fortunatamente ci vengono in aiuto le classi di validazione)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Il vero difetto è che la libreria è data-oriented, cioè nata per specchiare i dati e quindi l'object model è poco potente e prono all'errore.&lt;/p&gt;

&lt;p&gt;Nella mia libreria sono partito dal punto di vista opposto, cioè l'usabilità per lo sviluppatore e l'estremo strong-typing in modo da evitare "by design" errori che possano invalidare il file xml.&lt;/p&gt;

&lt;p&gt;La creazione di uno di quegli elementi font nella mia libreria si scrive così:&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; XlsFontBase f = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; XlsFont(&lt;span style="color: #006080"&gt;"Courier New"&lt;/span&gt;, 12,&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;     XlsFontFamilyType.NotApplicable, &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;true&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;false&lt;/span&gt;, XlsFontSchemeType.minor);&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Inoltre non devo creare esplicitamente la sezione stili ma questa viene calcolata automaticamente dopo aver formattato lo spreadsheet. Perciò io mi limito a formattare le celle, poi la libreria estrapola il numero minimo di formattazioni necessarie, e quindi scrive lo stile di conseguenza.&lt;/p&gt;

&lt;p&gt;Se ancora servisse, questo testimonia ancora una volta che sviluppare a partire dai dati può portare ad una complessità con cui bisogna fare i conti. Gli object model pensati fin dall'inizio secondo i paradigmi oop portano ad una semplificazione di tutta la logica e ad una maggiore usabilità (quindi meno bug!).&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;L'ultima considerazione sull'SDK 2.0 è che al momento non è chiaro come entrerà in gioco il neonato standard ISO e come verrà supportata la transizione tra i due standard. Tutto questo considerato che, dal punto di vista dello sviluppatore, lo standar de-facto è quello che conta, perciò dovremo vedere come avverrà la transizione ECMA -&amp;gt; ISO in Office 2010.
  &lt;br /&gt;&lt;em&gt;Per chi non conoscesse i dettagli, le differenze tra i due standard ci sono per motivi ovvi. ECMA ha presentato ad ISO il proprio standard e ISO ha chiesto delle (giuste e motivate) modifiche. Le differenze non sono qualitativamente rivoluzionarie ma sono pur sempre delle differenze che implicano un cambio di formato.&lt;/em&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/97330.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2009/10/22/office-openxml-sdk-2.0-beta.aspx</guid>
            <pubDate>Thu, 22 Oct 2009 10:34:48 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/97330.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2009/10/22/office-openxml-sdk-2.0-beta.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/97330.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/97330.aspx</trackback:ping>
        </item>
        <item>
            <title>Nuovi sample/snippet su IAmRaf</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2009/10/22/nuovi-samplesnippet-su-iamraf.aspx</link>
            <description>&lt;p&gt;Negli ultimi giorni ho pubblicato su &lt;a href="http://www.iamraf.net/"&gt;http://www.iamraf.net&lt;/a&gt; alcune cose che avevo in coda da tempo.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.iamraf.net/Samples/Aligning-decimal-numbers-to-the-separator"&gt;Aligning decimal numbers to the separator&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.iamraf.net/Samples/Read-shell-file-properties"&gt;Read shell file properties&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.iamraf.net/Samples/Converting-Excel-cell-row-and-column-to-string-(and-vice-versa)"&gt;Converting Excel cell row and column to string (and vice versa)&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Enjoy!&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/97329.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2009/10/22/nuovi-samplesnippet-su-iamraf.aspx</guid>
            <pubDate>Thu, 22 Oct 2009 09:43:13 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/97329.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2009/10/22/nuovi-samplesnippet-su-iamraf.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/97329.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/97329.aspx</trackback:ping>
        </item>
        <item>
            <title>MVP Award, anno settimo!</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2009/10/01/mvp-award-anno-settimo.aspx</link>
            <description>&lt;p&gt;Ho appena saputo via email di aver ricevuto l'Award MVP. Nonostante questo sia il settimo award di seguito che ricevo, credo che il termine "rinnovato" non sia appropriato per questo premio. Ogni anno Microsoft valuta ex-novo tutte le attività svolte dai candidati al premio e decide di conseguenza. Probabilmente è proprio questo che rende così importante, almeno ai miei occhi, questo riconoscimento.&lt;/p&gt;  &lt;p&gt;Ancora una volta sarò della partita cercando di mantenere strettissimi i già ottimi rapporti con i team di Redmond, partecipando ai numerosi incontri virtuali e a quattrocchi, e possibilmente all'annuale MVP Summit del prossimo anno.&lt;/p&gt;  &lt;p&gt;Un grosso grazie a tutto lo &lt;a href="http://blogs.msdn.com/mvpawardprogram" target="_blank"&gt;staff MVP&lt;/a&gt;, e naturalmente ad &lt;a href="http://blogs.technet.com/alead_msft/" target="_blank"&gt;Alessandro&lt;/a&gt; e Tomas.&lt;/p&gt;  &lt;p&gt;L'augurio di quest'anno è: ancora più spirito di community!&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/97149.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2009/10/01/mvp-award-anno-settimo.aspx</guid>
            <pubDate>Thu, 01 Oct 2009 15:24:37 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/97149.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2009/10/01/mvp-award-anno-settimo.aspx#feedback</comments>
            <slash:comments>10</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/97149.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/97149.aspx</trackback:ping>
        </item>
        <item>
            <title>Codice managed e nativo: documentazione, usabilit&amp;agrave; e obfuscation</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2009/09/25/codice-managed-e-nativo-documentazione-usabilitagrave-e-obfuscation.aspx</link>
            <description>&lt;p&gt;Ecco un titolo che frulla insieme argomenti da riempire un paio di libri.&lt;/p&gt;  &lt;p&gt;Periodicamente mi trovo a rimettere le mani su codice C++. È normale perché ogni linguaggio+runtime (anche C++ necessita di un runtime) ha un suo campo di applicazione che dipende dai requisiti del progetto... nulla di nuovo.&lt;/p&gt;  &lt;p&gt;E infatti C++ nativo (non CLI) è tutt'ora lo strumento preferibile per l'estendibilità della shell, IE, WMI, DirectX, mmc e molto altro ancora.&lt;/p&gt;  &lt;p&gt;Cari programmatori managed, una documentazione come quella che avete a disposizione oggi sarebbe stata il paradiso terrestre per chi ha lavorato / lavora con ATL, MFC, Win32, C++ e tutto quello che ci sta intorno. Questi sono strumenti potenti, estremamente efficaci, collaudati e robusti ma anche semplici da abusare e perciò tramutare un progetto in un disastro.&lt;/p&gt;  &lt;p&gt;Se guardo alla complessità dei sistemi che ho realizzato in 9 anni di programmazione managed, sono assolutamente certo che con linguaggi+runtime nativi non avrei potuto costruire sistemi altrettanto complessi dal punto di vista architetturale.&lt;/p&gt;  &lt;p&gt;C'è invece un enorme, gigantesco, pantagruelico gap tra i tecnicismi del mondo managed e quelli del mondo nativo: nel mondo nativo tutto si giocava sulla comprensione e l'applicazione del tecnicismo, sull'hack, sull'algoritmo che eseguiva dei tweak nei meccanismi standard; nel mondo managed il tecnicismo è quasi sempre poca cosa, l'architettura è regina, il numero di layer cresce a dismisura (entro certi limiti è buona cosa), le ambiguità su una tecnologia sono estremamente più basse.&lt;/p&gt;  &lt;p&gt;Ed è qui che si gioca la partita dell'obfuscation, cioè della protezione del software.   &lt;br /&gt;Nell'era nativa la protezione degli hack e dei tweak erano il maggior valore del software. Ricordo ancora che debuggando i primi viewer di immagini per SuperVGA sotto DOS ho capito come superavano il limite dei 64K per caricare su più banchi le immagini ad alta risoluzione. (Non si scandalizzino i più giovani, ma nell'era pre-80386 la memoria era segmentata e la memoria grafica era "solo" 64K, quindi come caricare immagini più grosse?)&lt;/p&gt;  &lt;p&gt;Nell'era managed, guardi come funziona un software e l'architettura è "in chiaro" non perché puoi usare reflector ma perché è evidente come funziona già da come vengono installati gli assembly o guardando una traccia di rete. Buona parte del codice managed che scriviamo "traspare" ad un utente esperto o al power user equipaggiato di ProcMon e vari altri tool. Se poi si passa a Reflector tutto è più chiaro ma non sono daccordo che sia solo il sorgente a rendere tutto così palese.&lt;/p&gt;  &lt;p&gt;La complessità del codice managed ha come side effect il fatto di essere tanto e di doverlo conoscere bene per poter essere usato. Se ti do un milione di righe di sorgente è come non averlo. Il tempo che ci metto a capirlo forse non vale neppure il gioco. E questo è il motivo per cui spesso dico che il sorgente non è il valore del progetto.&lt;/p&gt;  &lt;p&gt;È chiaro che non si può generalizzare e se scrivo una applicazione di calcolo ingegneristico che in mille righe risolve problemi mai visti prima, ecco che la sua protezione diventa strategica. Ma chi pensa che il codice C++ sia protetto by design si sbaglia di grosso. Ho letto e debuggato kilometri di codice assembler, i compilatori sono abbastanza "stupidi" da scrivere codice assembler con dei pattern, che una volta riconosciuti permettono di capire molto di più di quanto si creda (Esempio: ECX è il registro usato per il this di una classe C++). Ci sono poi applicazioni come DASM (un disassemblatore), il famoso debugger IDA pro che fa veri miracoli, o ancora gli analizzatori di codice PE (il formato di exe e dll) che permette di fare un guessing della marca e della versione del compilatore usato.&lt;/p&gt;  &lt;p&gt;La transizione dai tecnicismi di C++ alla complessità "verticale" delle applicazioni managed spiega anche il calo di interesse nel proteggere il codice compilato. L'obfuscation del codice può essere una necessità ma non ritengo che sia più largamente sentita come un tempo.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/97114.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2009/09/25/codice-managed-e-nativo-documentazione-usabilitagrave-e-obfuscation.aspx</guid>
            <pubDate>Fri, 25 Sep 2009 14:42:25 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/97114.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2009/09/25/codice-managed-e-nativo-documentazione-usabilitagrave-e-obfuscation.aspx#feedback</comments>
            <slash:comments>7</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/97114.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/97114.aspx</trackback:ping>
        </item>
        <item>
            <title>Materiale sessione Windows 7 disponibile</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2009/09/23/materiale-sessione-windows-7-disponibile.aspx</link>
            <description>&lt;p&gt;Ho pubblicato il materiale che ho usato nella sessione "Windows 7 for developers" al workshop UGIdotNET di Predappio (tanto per intenderci quello di &lt;a href="http://www.iamraf.net/Articles/SurfRaf-home-made-surface-for-Windows-7" target="_blank"&gt;SurfRaf&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;Nella sezione Samples del &lt;a href="http://www.iamraf.net/" target="_blank"&gt;mio sito&lt;/a&gt;, trovate sia le slides che gli esempi usati nelle demo. Per quanto riguarda le demo, nel frattempo è uscita la versione RTM del CodePack quindi date una letta alle note pubblicate insieme ai file per non perdere tempo.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/97091.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2009/09/23/materiale-sessione-windows-7-disponibile.aspx</guid>
            <pubDate>Wed, 23 Sep 2009 07:27:24 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/97091.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2009/09/23/materiale-sessione-windows-7-disponibile.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/97091.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/97091.aspx</trackback:ping>
        </item>
        <item>
            <title>Specchio delle mie brame, qual'&amp;egrave; la UI pi&amp;ugrave; brutta del reame?</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2009/09/14/specchio-delle-mie-brame-qualegrave-la-ui-piugrave-brutta-del.aspx</link>
            <description>&lt;p&gt;Ne abbiamo parlato tante volte, con WPF si abbattono i muri delle UI tradizionali e possiamo finalmente realizzare bottoni di qualsiasi forma, &lt;a href="http://bea.stollnitz.com/blog/?p=40" target="_blank"&gt;rappresentare il sistema solare con una banale Listbox&lt;/a&gt;, ma anche creare autentici mostri con batterie di controlli o abusare delle maledette grid (che sono un po' come il prezzemolo dello sviluppatore).&lt;/p&gt;  &lt;p&gt;Agli albori del computing, IBM aveva stabilito le regole di design di una UI (devo ancora avere il librone da qualche parte). Nell'epoca Windows la stessa Microsoft aveva pubblicato le design guidelines fornendo indicazioni importanti agli sviluppatori.&lt;/p&gt;  &lt;p&gt;Tanto per intenderci la violazione di queste regole è estremamente negativa perché impedisce all'utente di usare una nuova applicazione senza dover studiare. Ci sono brutte violazioni di applicazioni famose come Orcad e Eagle (per par condicio entrambi cad di elettronica) che farebbero diventare matto qualsiasi utente, ma anche il celeberrimo CorelDraw nell'uso dei tasti ctrl e shift.&lt;/p&gt;  &lt;p&gt;Nell'epoca WPF il timore di tutti è quello di creare mostri e non c'è dubbio che i designer &lt;strong&gt;&lt;u&gt;siano parte integrante&lt;/u&gt;&lt;/strong&gt; del gioco per rendere più appetibile la nostra applicazione.&lt;/p&gt;  &lt;p&gt;E così ecco apparire le nuove &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=E49820CB-954D-45AE-9CB3-1B9E8EA7FE8C&amp;amp;displaylang=en" target="_blank"&gt;Windows User Experience Interaction Guidelines&lt;/a&gt; (fresche del 31 Agosto) con le nuove guidelines.&lt;/p&gt;  &lt;p&gt;Attenzione, non è un papiro per adeguare la propria applicazione a quelle Microsoft. È un papiro con indicazioni studiate da parte di esperti che ci dicono cosa fare e non fare per i nostri utenti. Parliamo di &lt;strong&gt;&lt;u&gt;usabilità&lt;/u&gt;&lt;/strong&gt; ed &lt;strong&gt;&lt;u&gt;ergonomia&lt;/u&gt;&lt;/strong&gt;, non di noccioline o regole decise per follia di qualcuno.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/97046.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2009/09/14/specchio-delle-mie-brame-qualegrave-la-ui-piugrave-brutta-del.aspx</guid>
            <pubDate>Mon, 14 Sep 2009 19:08:37 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/97046.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2009/09/14/specchio-delle-mie-brame-qualegrave-la-ui-piugrave-brutta-del.aspx#feedback</comments>
            <slash:comments>6</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/97046.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/97046.aspx</trackback:ping>
        </item>
    </channel>
</rss>