<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://dotnetumbria.org/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"><channel><title>dotNet Umbria</title><link>http://dotnetumbria.org/blogs/</link><description>Il primo User Group in Umbria sul mondo .Net</description><dc:language>en-US</dc:language><generator>CommunityServer 2008 (Build: 30417.1769)</generator><item><title>Segnalazione libro su Asp.Net MVC</title><link>http://dotnetumbria.org/blogs/cruciani/archive/2008/09/04/segnalazione-libro-su-asp-net-mvc.aspx</link><pubDate>Thu, 04 Sep 2008 10:22:00 GMT</pubDate><guid isPermaLink="false">7c6ab959-8411-4d1b-a449-1796eac035b7:530</guid><dc:creator>Andrea Cruciani</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;L&amp;#39;amico &lt;a href="http://blogs.ugidotnet.org/piyo/Default.aspx"&gt;Simone Chiaretta&lt;/a&gt;, che speriamo di ospitare al pi&amp;ugrave; presto ad un nostro evento di DotNetUmbria, sta pubblicando un libro per chi si vuole approcciare ad &lt;a href="http://www.asp.net/mvc/"&gt;Asp.Net MVC&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Vai Simone, in bocca al lupo!&lt;/p&gt;
&lt;p&gt;&lt;a title="Link al libro su Amazon" href="http://www.amazon.co.uk/Beginning-ASP-NET-MVC-Simone-Chiaretta/dp/047043399X"&gt;Link al libro su Amazon&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetumbria.org/aggbug.aspx?PostID=530" width="1" height="1"&gt;</description></item><item><title>Un bell'evento su Asp.Net Ajax in Umbria</title><link>http://dotnetumbria.org/blogs/cruciani/archive/2008/09/03/un-bell-evento-su-asp-net-ajax-in-umbria.aspx</link><pubDate>Wed, 03 Sep 2008 16:27:00 GMT</pubDate><guid isPermaLink="false">7c6ab959-8411-4d1b-a449-1796eac035b7:528</guid><dc:creator>Andrea Cruciani</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;Ricevo e con piacere vi giro l&amp;#39;invito da parte di PcsNet Umbria per partecipare ad un evento gratuito.&lt;/p&gt;
&lt;p&gt;L&amp;#39;evento vedr&amp;agrave; come speaker Dino Esposito, famoso autore Ms Press, e Maurizio Mammuccini ( il &amp;quot;prof&amp;quot; di molte generazioni di programmatori umbri).&lt;/p&gt;
&lt;p&gt;A &lt;a target="_blank" href="http://www.pcsnetumbria.it/pcsnetumbria.php?article71"&gt;questo link&lt;/a&gt; trovate il programma.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetumbria.org/aggbug.aspx?PostID=528" width="1" height="1"&gt;</description></item><item><title>Book Review: Beginning Web Development, Silverlight, and ASP.NET Ajax</title><link>http://dotnetumbria.org/blogs/possanzini/archive/2008/08/22/book-review-beginning-web-development-silverlight-and-asp-net-ajax.aspx</link><pubDate>Fri, 22 Aug 2008 09:57:00 GMT</pubDate><guid isPermaLink="false">7c6ab959-8411-4d1b-a449-1796eac035b7:525</guid><dc:creator>Paolo Possanzini</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Il libro &amp;ldquo;Beginning Web Development, Silverlight, and ASP.NET Ajax&amp;rdquo;, scritto da Laurance Moroney, &amp;egrave; una introduzione alla programmazione Web, adatto in modo particolare per chi inizia ad affacciarsi a questo mondo. E&amp;rsquo; diviso in 3 parti principali di cui la prima, dopo un capitolo di storia sul mondo web, introduce ai principi dello sviluppo ASP.Net 2.0. Guida passo-passo il principiante a creare la prima applicazione Web, spiegando anche il funzionamento di base di Visual Studio e affrontando progressivamente gli argomenti fondamentali come WebForms, DataBing, WebServices. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://dotnetumbria.org/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/possanzini/1590599594_5F00_2.gif"&gt;&lt;img style="border-right:0px;border-top:0px;margin:0px 20px 0px 0px;border-left:0px;border-bottom:0px;" alt="Book Review:  Beginning Web Development, Silverlight, and ASP.NET Ajax" src="http://dotnetumbria.org/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/possanzini/1590599594_5F00_thumb.gif" width="253" align="left" border="0" height="330" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Nella seconda parte viene fatta una carrellata delle nuove tecnologie introdotte con la versione 3.0 di Microsoft .Net Framework: Windows Communication Foundation, Windows Presentation Foundation, Windows Workflow Foundation. &lt;br /&gt;Nell&amp;rsquo;ultima parte viene ripreso l&amp;rsquo;argomento Web, dove viene illustrata l&amp;rsquo;evoluzione che ha portato ad Ajax per affrontare infine Silverlight.  &lt;/p&gt;
&lt;p&gt;Il libro &amp;egrave; decisamente introduttivo e getta le basi per ulteriori approfondimenti. Di facile lettura &amp;egrave; pienamente comprensibile anche da un programmatore inesperto. Non approfondisce troppo nessun argomento lasciando al lettore la giusta dose di curiosit&amp;agrave; per ulteriori letture. Una cosa molto importante da sottolineare &amp;egrave; la visione di insieme che si ottiene dalla lettura di questo libro dove tutte le tecnologie affrontate trovano il loro giusto posto.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetumbria.org/aggbug.aspx?PostID=525" width="1" height="1"&gt;</description></item><item><title>Book review: Head First Javascript</title><link>http://dotnetumbria.org/blogs/cruciani/archive/2008/08/18/book-review-head-first-javascript.aspx</link><pubDate>Mon, 18 Aug 2008 17:19:00 GMT</pubDate><guid isPermaLink="false">7c6ab959-8411-4d1b-a449-1796eac035b7:519</guid><dc:creator>Andrea Cruciani</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Tempo di ferie e anche tempo di letture &amp;quot;rilassanti&amp;quot;: Ho scelto un libro della collana &lt;a href="http://headfirstlabs.com/books.php"&gt;Head First della O&amp;#39;Really&lt;/a&gt;. Avevo gi&amp;agrave; avuto un buonissimo impatto un paio di anni fa con il libro &lt;a href="http://headfirstlabs.com/books/hfdp/"&gt;Head first Design Patterns&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Per chi non conoscesse la collana si tratta di libri &amp;quot;strani&amp;quot;, votati a facilitare l&amp;#39;apprendimento tramite diversi espedienti (grafica, linguaggio, evidenziazione di informazioni). Tutto questo partendo dal concetto che il nostro cervello apprende di pi&amp;ugrave; se l&amp;#39;informazione viene ritenuta vitale, ovvero se veniamo coinvolti anche emotivamente nel ciclo di apprendimento.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://dotnetumbria.org/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/cruciani.Images/head-first-javascript.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Il libro, scritto da Michael Morrison, parte da problemi molto semplici, se non banali, probabilmente le parti pi&amp;ugrave; interessanti sono a partire dal sesto capitolo in poi: riuso degli script, validazione lato client, navigazione del DOM fino a parlare un po&amp;#39; di Ajax nell&amp;#39;ultimo capitolo. Molto interessante, e spesso sottovalutato come argomento, &amp;egrave; quello del debugging degli scripts (con vari tips &amp;amp; tricks). A dire i lvero con le nuove funzionalit&amp;agrave; di VS 2008 siamo molto avvantaggiati in questo, e forse tra un po&amp;#39; ci scorderemo le &amp;quot;7 camicie&amp;quot; passare a cercare gli errori negli script..&amp;nbsp; Ho preso il libro con l&amp;#39;intenzione di proporlo ai ragazzi in ufficio che freschi di laurea si approcciano al web e mi convinco sempre pi&amp;ugrave; che un approccio come quello proposto da questa collana sarebbe prezioso se utilizzato nei corsi universitari (e anche delle superiori), chiss&amp;agrave; che qualche professore temerario non decida di provarli!&lt;/p&gt;
&lt;p&gt;Un programmatore gi&amp;agrave; abituato ad utilizzare Js pu&amp;ograve; tranquillamente leggere solo i capitoli che pi&amp;ugrave; gli interessano, questo tuttavia non &amp;egrave; un libro da &amp;quot;consultazione&amp;quot; &amp;egrave; pi&amp;ugrave; un percorso che andrebbe fatto dall&amp;#39;inizio alla fine (esercizi compresi).&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetumbria.org/aggbug.aspx?PostID=519" width="1" height="1"&gt;</description><category domain="http://dotnetumbria.org/blogs/cruciani/archive/tags/books/default.aspx">books</category><category domain="http://dotnetumbria.org/blogs/cruciani/archive/tags/web/default.aspx">web</category></item><item><title>Localizzazione lato client con ASP.NET Ajax</title><link>http://dotnetumbria.org/blogs/bernabei/archive/2008/08/06/localizzazione-lato-client-con-asp-net-ajax.aspx</link><pubDate>Wed, 06 Aug 2008 15:30:00 GMT</pubDate><guid isPermaLink="false">7c6ab959-8411-4d1b-a449-1796eac035b7:508</guid><dc:creator>Fabrizio Bernabei</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Il framework ASP.NET Ajax implementa un sistema per la localizzazione delle applicazioni &amp;quot;lato client&amp;quot;. Se abbiamo uno ScriptManager in una pagina, impostando l&amp;#39;attributo&amp;nbsp; EnableScriptLocalization a &amp;quot;true&amp;quot; abilitiamo questa funzionalit&amp;agrave; che in sostanza &amp;quot;serve&amp;quot; dei file javascript in base alla cultura corrente. Prendiamo ad esempio il codice seguente e supponiamo che venga eseguita su un PC con impostata la localizzazione in lingua inglese (&lt;a href="http://it.wikipedia.org/wiki/Internazionalizzazione_e_localizzazione" target="_blank"&gt;en-US&lt;/a&gt; ad esempio):&lt;/p&gt;
&lt;div&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;asp:ScriptManager&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ID&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;TheScriptManager&amp;quot;&lt;/span&gt; &lt;br /&gt;&lt;span style="color:#ff0000;"&gt;                         EnableScriptLocalization&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Scripts&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;asp:ScriptReference&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Path&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;~/js/Risorse.js&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Scripts&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;asp:ScriptManager&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;Viene referenziato nello script manager il file Risorse.js, questo significa che il file in questione verr&amp;agrave; inviato (o meglio la direttiva script..ecc verr&amp;agrave; inserita nell&amp;#39;html prodotto dalla pagina) al client ql momento della richiesta della pagina. La particolarit&amp;agrave; &amp;egrave; che, avendo abilitato l&amp;#39;apposita opzione dello ScriptManager (che per default &amp;egrave; impostata a false) per la localizzazione, se nella posizione dove si trova il file js ne esiste una versione con nome Risorse.en-US.js, verr&amp;agrave; servita questa in quanto corrisponde alla cultura correntemente impostata.&lt;/p&gt;
&lt;p&gt;In questo modo &amp;egrave; possibile creare dei file js contenenti le risorse necessarie alla localizzazione in diverse lingue e ASP.NET Ajax provveder&amp;agrave; in automatico ad inviarci quello corretto per la lingua in uso. Un esempio di utilizzo potrebbe essere il seguente, un file di risorse fatto in questo modo:&lt;/p&gt;
&lt;div&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; Risorse = {&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt;     &lt;span style="color:#006080;"&gt;&amp;quot;Lingua&amp;quot;&lt;/span&gt; : &lt;span style="color:#006080;"&gt;&amp;quot;it-IT&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;     &lt;span style="color:#006080;"&gt;&amp;quot;testoBtnAnnulla&amp;quot;&lt;/span&gt; : &lt;span style="color:#006080;"&gt;&amp;quot;Annulla&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt; };&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;oppure in questo nella sua versione per la lingua inglese (con estensione .en-US.js)&lt;/p&gt;
&lt;div&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; Risorse = {&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt;     &lt;span style="color:#006080;"&gt;&amp;quot;Lingua&amp;quot;&lt;/span&gt; : &lt;span style="color:#006080;"&gt;&amp;quot;en-US&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;     &lt;span style="color:#006080;"&gt;&amp;quot;testoBtnAnnulla&amp;quot;&lt;/span&gt; : &lt;span style="color:#006080;"&gt;&amp;quot;Cancel&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt; };&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Nel codice javascript del client ci baster&amp;agrave; scrivere qualcosa tipo:&lt;/p&gt;
&lt;div&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; alert(&amp;quot;La lingua corrente è: &amp;quot; + Risorse.Lingua);&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Per ottenere un alert contenente un messaggio che cambier&amp;agrave; in base alla lingua correntemente selezionata.&lt;/p&gt;
&lt;p&gt;Fin qui tutto ok; qualche perplessit&amp;agrave; potrerbbe per&amp;ograve; nascere nel momento in cui la nostra applicazione debba gestire/memorizzare la cultura da utilizzare sul server. Gi&amp;agrave; perche il sistema appena illustrato tiene conto in realt&amp;agrave; della cultura corrente del client (dove gira il browser per intenderci) e non quella del server. Nella nostra applicazione invece potrebbe servire la cosa opposta perch&amp;egrave; ad esempio la lingua impostata da utilizzare pu&amp;ograve; essere impostata manualmente dall&amp;#39;utente attraverso l&amp;#39;interfaccia dell&amp;#39;applicazione e poi salvata nel profilo personale o in un cookie, e magari ci serve che sia lato server per localizzare altre parti/pagine dell&amp;#39;applicazione che &amp;quot;girano&amp;quot; soltanto sul server.&lt;/p&gt;
&lt;p&gt;In questi casi si pu&amp;ograve; comunque continuare ad utilizzare la tecnica appena descritta, con pochi accorgimenti. Prima di tutto possiamo in questo caso non abilitare la localizzazione automatica degli script, semplicemente impostando a false l&amp;#39;attributo EnableScriptLocalization dello ScriptManager o non impostandolo affatto in quanto come detto per default non &amp;egrave; abilitato.&lt;br /&gt;Ora possiamo sfruttare un&amp;#39;altra possibilit&amp;agrave; della localizzazione che consiste nel poter forzare per mezzo di un attributo la cultura con cui deve essere servito un particolare script dallo ScriptManager, semplicemente impostandola sul singolo riferimento per mezzo della propriet&amp;agrave; ResourceUICultures come nell&amp;#39;esempio seguente:&lt;/p&gt;
&lt;div&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;asp:ScriptManager&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ID&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;TheScriptManager&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Scripts&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;asp:ScriptReference&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Path&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;~/js/Risorse.js&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;&lt;br /&gt;                                   ResourceUICultures&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;it-IT&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Scripts&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;asp:ScriptManager&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;In questo modo lo ScriptManager cercher&amp;agrave; di utilizzare sempre e comunque un file scritto per la cultura italiana, indipendentemente da quella impostata sul client. Il prossimo passo per sfruttare questo meccanismo per il nostro scopo, &amp;egrave; quello di fare in modo che il file di risorse javascript venga effettivamente inviato specificandone la cultura, ma quest&amp;#39;ultima sia impostata dal server prima della renderizzazione della pagina. Quello che serve quindi &amp;egrave; semplicemente specificare il riferimento al file di risorse nello ScriptManager da codice a runtime impostandone di volta in volta la cultura da utilizzare (che ovviamente pu&amp;ograve; cambiare anche da un postback all&amp;#39;altro.. l&amp;#39;importante &amp;egrave; che per la cultura che si imposta ci sia un file js corrispondente, altrimenti le risorse non saranno inviate al client). Per farlo basta togliere dallo ScriptManager il riferimento al file Risorse.js dell&amp;#39;esempio ed aggiungerlo a runtime nel codice eseguito lato server, ad esempio nell&amp;#39;evento PageLoad della pagina in questo modo:&lt;/p&gt;
&lt;div&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Page_Load(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// Riferimento al file di risorse da utilizzare&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;     ScriptReference jsRisorse = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ScriptReference(&lt;span style="color:#006080;"&gt;&amp;quot;~/js/Risorse.js&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;  &lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// la cultura viene impostata leggendola dal thread corrente,&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// potrebbe essere diversa da quella del client&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// e anche da quella di altri processi che girano sul server web&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt;     jsRisorse.ResourceUICultures = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;[1] &lt;br /&gt;              { System.Threading.Thread.CurrentThread.CurrentUICulture.ToString() };&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt;  &lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  11:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// il riferimento con la cultura specificata viene aggiunto allo&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  12:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// ScriptManager. Se ad esempio la cultura impostata fosse en-US &lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  13:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// è necessario che sia presente il file ~/js/Risorse.en-US.js&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  14:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// perchè questo verrà effettivamente referenziato nell&amp;#39;HTML&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  15:&lt;/span&gt;     TheScriptManager.Scripts.Add(jsRisorse);&lt;/pre&gt;
&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#606060;"&gt;  16:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;E con questo abbiamo raggiunto il nostro scopo, cio&amp;egrave; sul client verra servito il file js di risorse localizzato in base alle impostazioni memorizzate sul server, magari n el profilo dell&amp;#39;utente, e queste ultime possono essere diverse da quelle del PC client dove gira l&amp;#39;applicazione all&amp;#39;interno del browser.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:4ac4c524-3eb4-4d88-9c64-7fa5ef5c826e" style="padding-right:0px;display:inline;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;Technorati tags: &lt;a href="http://technorati.com/tags/ASP.NET" rel="tag"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://technorati.com/tags/Ajax" rel="tag"&gt;Ajax&lt;/a&gt;, &lt;a href="http://technorati.com/tags/Localization" rel="tag"&gt;Localization&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetumbria.org/aggbug.aspx?PostID=508" width="1" height="1"&gt;</description><category domain="http://dotnetumbria.org/blogs/bernabei/archive/tags/Ajax/default.aspx">Ajax</category><category domain="http://dotnetumbria.org/blogs/bernabei/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item><item><title>Prova il microframework e vinci!!!</title><link>http://dotnetumbria.org/blogs/bernabei/archive/2008/07/29/prova-il-microframework-e-vinci.aspx</link><pubDate>Tue, 29 Jul 2008 07:16:00 GMT</pubDate><guid isPermaLink="false">7c6ab959-8411-4d1b-a449-1796eac035b7:479</guid><dc:creator>Fabrizio Bernabei</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;Il titolo di questo post non &amp;egrave; solo uno slogan da cartellone pubblicitario (anche se l&amp;#39;obiettivo &amp;egrave; quello &lt;img alt="Smile" src="http://messenger.msn.com/MMM2006-04-19_17.00/Resource/emoticons/regular_smile.gif" /&gt;) ma un&amp;#39;iniziativa &amp;quot;lanciata&amp;quot; dal team del Microsoft MF per incoraggiare gli sviluppatori a prendere parte al programma di beta della nuova versione 3.0.&lt;br /&gt;In sostanza, registrandosi al programma beta e scaricando l&amp;#39;SDK dal sito &lt;a title="http://connect.microsoft.com/netmf" href="http://connect.microsoft.com/netmf"&gt;http://connect.microsoft.com/netmf&lt;/a&gt; entro il 31 Agosto, si riceve un &amp;quot;biglietto elettronico&amp;quot; ed il 15 Settembre verr&amp;agrave; &amp;quot;estratto&amp;quot; il fortunato vincitore di un &lt;a title="RicaVision Universal Remote Control" href="http://www.amazon.com/Ricavision-VAVE100-SideShow-Universal-Control/dp/B00169YM9O" target="_blank"&gt;RicaVision Universal Remote Control&lt;/a&gt; (non so quanto utile, ma sicuramente un bell&amp;#39;oggettino)...&lt;/p&gt;
&lt;p&gt;&lt;img src="http://connect.microsoft.com/siteimages/6558f529-b337-4e13-a9bc-03b85c665d6d.jpg" align="left" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;Per i &lt;a href="http://dotnetumbria.org/blogs/articoli/archive/2008/06/25/primi-passi-con-il-net-microframework.aspx" target="_blank"&gt;numerosi&lt;/a&gt; &lt;a href="http://dotnetumbria.org/blogs/cruciani/archive/2008/05/31/book-review-expert-net-micro-framework.aspx" target="_blank"&gt;appassionati&lt;/a&gt; di Micro Framework che ci sono da queste parti, una buona scusa per studiarsi le novit&amp;agrave; della nuova versione di questo framework che, a prescindere dalle trovate marketing, promette veramente molto bene. Ecco una sintesi delle novit&amp;agrave; che saranno introdotte (tratte dal sito ufficiale):&lt;/p&gt;
&lt;p&gt;&amp;bull; Interop and native code linking&lt;br /&gt;&amp;bull; Touch screen and inking/gesturing support&lt;br /&gt;&amp;bull; USB device&lt;br /&gt;&amp;bull; SSL (secure sockets) for the TCP/IP stack&lt;br /&gt;&amp;bull; Visual Studio 2008 support&lt;br /&gt;&amp;bull; DPWS (Devices Profile for Web Services), including new codegen tools&lt;br /&gt;&amp;bull; 4bpp font support&lt;br /&gt;&amp;bull; Enhanced and more compatible serial/UART model&lt;br /&gt;&amp;bull; &lt;i&gt;File system*&lt;/i&gt;&lt;br /&gt;&amp;bull; &lt;i&gt;802.11 Wi-Fi infrastructure*&lt;/i&gt;&lt;br /&gt;&amp;bull; &lt;i&gt;Support for more cores and processor architectures*&lt;/i&gt;&lt;br /&gt;&amp;bull; &lt;i&gt;Publicly available Porting Kit for purchase* (separate product not included with the SDK)&lt;/i&gt;&lt;br /&gt;(Features noted with &lt;b&gt;*&lt;/b&gt; will not be available in the first public beta)&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;A questo punto non resta altro che provare...&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetumbria.org/aggbug.aspx?PostID=479" width="1" height="1"&gt;</description><category domain="http://dotnetumbria.org/blogs/bernabei/archive/tags/microframework/default.aspx">microframework</category></item><item><title>[OT] TS: MS .NET Framework 3.5, ADO .NET Application Development --&gt; Passed</title><link>http://dotnetumbria.org/blogs/possanzini/archive/2008/07/23/ot-ts-ms-net-framework-3-5-ado-net-application-development-gt-passed.aspx</link><pubDate>Wed, 23 Jul 2008 20:31:00 GMT</pubDate><guid isPermaLink="false">7c6ab959-8411-4d1b-a449-1796eac035b7:469</guid><dc:creator>Paolo Possanzini</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;&amp;nbsp;Anche io mi sto dilettando con gli esami in Beta. E proprio questa sera ho saputo di aver passato il 70-561 : TS: MS .NET Framework 3.5, ADO .NET Application Development&lt;/p&gt;
&lt;p&gt;&lt;img src="http://dotnetumbria.org/emoticons/emotion-15.gif" alt="Geeked" /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetumbria.org/aggbug.aspx?PostID=469" width="1" height="1"&gt;</description></item><item><title>[OT] 70-562: Mcts Asp.Net 3.5 !</title><link>http://dotnetumbria.org/blogs/cruciani/archive/2008/07/16/ot-70-562-mcts-asp-net-3-5.aspx</link><pubDate>Wed, 16 Jul 2008 14:54:00 GMT</pubDate><guid isPermaLink="false">7c6ab959-8411-4d1b-a449-1796eac035b7:466</guid><dc:creator>Andrea Cruciani</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;E&amp;#39; un periodo &amp;quot;prolifico&amp;quot; per le certificazioni, ho appena saputo di aver passato la beta dell&amp;#39;&lt;a href="http://www.microsoft.com/learning/en/us/exams/70-562.mspx" class="null"&gt;esame 70-562&lt;/a&gt;: &amp;quot;Microsoft .NET Framework 3.5, ASP.NET Application Development&amp;quot;.&lt;/p&gt;
&lt;p&gt;[update] anche il 70-561 (Ado.Net 3.5) &amp;egrave; andato. Questo esame m&amp;#39;&amp;egrave; sembrato proprio tosto, non credevo di averlo passato, ed invece ieri la sopresa.&lt;/p&gt;
&lt;p&gt;Entro dicembre&amp;nbsp;&amp;egrave; prevista l&amp;#39;uscita dell&amp;#39;upgrade per l&amp;#39;MCPD, per chi fosse interessato alle certificazioni .Net e pu&amp;ograve; aspettare qualche mese forse vale la pena di partire direttamente con le &lt;a href="http://www.microsoft.com/learning/mcp/mcts/vstudio/2008/default.mspx" class="null"&gt;nuove certificazioni per Visual Studio 2008&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetumbria.org/aggbug.aspx?PostID=466" width="1" height="1"&gt;</description><category domain="http://dotnetumbria.org/blogs/cruciani/archive/tags/Asp.Net/default.aspx">Asp.Net</category><category domain="http://dotnetumbria.org/blogs/cruciani/archive/tags/certificazioni/default.aspx">certificazioni</category></item><item><title>Di ritorno dal Workshop di DotNetMarche</title><link>http://dotnetumbria.org/blogs/cruciani/archive/2008/06/30/di-ritorno-dal-workshop-di-dotnetmarche.aspx</link><pubDate>Mon, 30 Jun 2008 07:03:00 GMT</pubDate><guid isPermaLink="false">7c6ab959-8411-4d1b-a449-1796eac035b7:461</guid><dc:creator>Andrea Cruciani</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;&amp;nbsp;Venerd&amp;igrave; un piccola rappresentanza di dotnetUmbria &amp;egrave; andata al &lt;a href="http://dotnetmarche.org/eventi/Default.aspx?IDevento=21" class="null"&gt;workshop&lt;/a&gt; dei nostri amici delle Marche. &lt;/p&gt;
&lt;p&gt;Si parlava di test delle applicazioni ed del prossimo framework MVC di Asp.Net, argomenti interessantissimi e molte volte indebitamente snobbati. E&amp;#39; stata l&amp;#39;occasione per fare la conoscenza di &lt;a href="http://blogs.ugidotnet.org/rgm/Default.aspx" class="null"&gt;Gian maria&lt;/a&gt;, &lt;a href="http://blogs.ugidotnet.org/piyo/Default.aspx" class="null"&gt;Simone&lt;/a&gt; (i due speakers dell&amp;#39;occasione, anche se alla fine con Simone non c&amp;#39;e&amp;#39; stata occasione di presentarci, sar&amp;agrave; per la prossima) e &lt;a href="http://dotnetmarche.org/members/D_5F00_Guidi.aspx" class="null"&gt;Diego&lt;/a&gt;. E&amp;#39; proprio bello ritrovarsi cosi&amp;#39; in sintonia con persone che avevi conosciuto solo per mezzo dei loro blog, sono sicuro che d&amp;#39;ora in poi non mancheranno le occasioni per altri incontri (soprattutto se culinari :D) &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Quindi un Bravi agli amici marchigiani, e un grazie di cuore!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetumbria.org/aggbug.aspx?PostID=461" width="1" height="1"&gt;</description></item><item><title>Aperitivo DotNetUmbria lunedi 30 giugno  ore 19:00 - Alla Posta dei Donini</title><link>http://dotnetumbria.org/blogs/eventi/archive/2008/06/26/aperitivo-dotnetumbria-lunedi-30-giugno-ore-19-00-alla-posta-dei-donini.aspx</link><pubDate>Thu, 26 Jun 2008 17:50:00 GMT</pubDate><guid isPermaLink="false">7c6ab959-8411-4d1b-a449-1796eac035b7:453</guid><dc:creator>Roberto Palazzetti</dc:creator><slash:comments>2</slash:comments><description>&lt;p&gt;Posto : Posta dei Donini&lt;/p&gt;
&lt;p&gt;Orario 19:00 alle 20:00&lt;/p&gt;
&lt;p&gt;Aperitivo (Bevande+Stuzzichini) 9/10 euro a persona&amp;nbsp;&lt;/p&gt;
&lt;p&gt;rispondete con un commento a questo post.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetumbria.org/aggbug.aspx?PostID=453" width="1" height="1"&gt;</description></item><item><title>Development Board per Microframework</title><link>http://dotnetumbria.org/blogs/cruciani/archive/2008/06/25/development-board-per-microframework.aspx</link><pubDate>Wed, 25 Jun 2008 09:52:00 GMT</pubDate><guid isPermaLink="false">7c6ab959-8411-4d1b-a449-1796eac035b7:449</guid><dc:creator>Andrea Cruciani</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;&amp;nbsp;Riposto una notizia letta sul blog di &lt;a href="http://blogs.ugidotnet.org/lbarbieri/archive/2008/06/24/93157.aspx" class="null"&gt;Lorenzo Barbieri&lt;/a&gt; su un nuvo kit a basso costo per fare test sul micro framework... quasi quasi gli tocca &lt;img src="http://dotnetumbria.org/emoticons/emotion-1.gif" alt="Smile" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.ghielectronics.com/details.php?id=113" class="null"&gt;&lt;img width="239" src="http://www.ghielectronics.com/images/products/usbizi-devsys.jpg" alt="Dev Board" height="240" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Sembra che il prodotto sar&amp;agrave; disponibile a 99$&lt;/p&gt;
&lt;p&gt;Qui un &lt;a href="http://www.ghielectronics.com/details.php?id=113" class="null"&gt;link&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#ff0000;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetumbria.org/aggbug.aspx?PostID=449" width="1" height="1"&gt;</description><category domain="http://dotnetumbria.org/blogs/cruciani/archive/tags/MicroFramework/default.aspx">MicroFramework</category></item><item><title>Progetto NHooligans – Parte 2 – Finalmente un po’ di codice…</title><link>http://dotnetumbria.org/blogs/nhooligans/archive/2008/06/15/progetto-nhooligans-parte-2-finalmente-un-po-di-codice.aspx</link><pubDate>Sun, 15 Jun 2008 14:42:28 GMT</pubDate><guid isPermaLink="false">7c6ab959-8411-4d1b-a449-1796eac035b7:432</guid><dc:creator>maiorfi</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Resistere per ben due post all’inserimento di snippet di codice non è stato facile e proprio per questo motivo iniziamo oggi ad addentrarci in qualche esempio di utilizzo delle API del sistema che gestisce la nostra simulazione. Come giustamente mi è stato fatto notare da Paolo, l’uso del framework NSteer (oggetto dei post precedenti) potrebbe vincolare troppo la libertà in eventuali future evoluzioni del sistema di simulazione. Per questo motivo cercheremo di astrarre, laddove possibile, la concreta implementazione di NSteer degli “attori” che partecipano alla simulazione, mantenendo focalizzata la nostra attenzione soprattutto sulle interazioni tra gli oggetti descritti dalle interfacce introdotte nel post precedente. In altri termini, quando parleremo ad esempio di “Scena” faremo sì riferimento agli aspetti peculiari di un oggetto che implementa l’interfaccia &lt;em&gt;IScene&lt;/em&gt; definita all’interno di NSteer, ma non necessariamente all’implementazione dell’unico tipo di scena definito in NSteer, ossia la &lt;em&gt;GdiScene&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;Già da una prima frettolosa analisi del sistema che realizzeremo appare evidente che, in un verso o nell’altro, dovremo “allestire” un’istanza di simulazione per ciascuna &amp;quot;sfida” giocata all’interno di NHooligans. E’ facile immaginare inoltre che il servizio (in senso generico, non in senso Windows Service o WebService) che costituirà l’host per la simulazione in questione dovrà costruire le condizioni sulle quali la simulazione costruirà il proprio contesto di esecuzione, condizioni quali la definizione dei partecipanti (ossia degli agenti), le caratteristiche fisiche e cinematiche di ciascun oggetto definito all’interno del “mondo” della simulazione (massa, accelerazione e velocità massime, ecc.) nonché ovviamente ciò che dà effettivamente un senso alla simulazione: il “programma” seguito da ciascun agente per muoversi e, soprattutto, gonfiare di botte i propri simili della squadra avversaria.&lt;/p&gt;  &lt;p&gt;Quale che sia la conformazione del servizio “host”, la simulazione da allestire seguirà inevitabilmente i passi illustrati di seguito, che fanno riferimento ad una situazione facilmente riscontrabile anche nel demo di NSteer incluso nei sorgenti allegati nel primo post di questa sezione.&lt;/p&gt;  &lt;p&gt;La composizione degli oggetti che partecipano alla realizzazione di una simulazione è illustrata nel diagramma che segue, in cui l’host è rappresentato da un Form Winforms denominato con grande fantasia “Form1”:&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://dotnetumbria.org/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/nhooligans/CD_5F00_NSteerDemo_5F00_2.png"&gt;&lt;img title="CD_NSteerDemo" style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="196" alt="CD_NSteerDemo" src="http://dotnetumbria.org/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/nhooligans/CD_5F00_NSteerDemo_5F00_thumb.png" width="244" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I primi servizi da inizializzare sono quelli che descrivono il “mondo” in cui la simulazione ha luogo e la “scena” che ne darà una rappresentazione (presumibilmente ma non necessariamente grafica), attraverso il retrieving di un riferimento alle interfacce &lt;em&gt;IWorldService e IScene&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;Qualora, come avviene tipicamente, si voglia confinare il raggio di azione degli agenti ad una regione limitata, dovremo creare un’istanza di comportamento che, applicata a ciascun agente, ne limiterà il movimento. Il tipo di comportamento in questione è già definito in NSteer e prende il nome di &lt;em&gt;RectangleWorldGlobalBehavior. &lt;/em&gt;Per inizializzarlo è sufficiente impostare punto di partenza (di tipo &lt;em&gt;PointF&lt;/em&gt;, ossia punto 2D con coordinate di tipo &lt;em&gt;float&lt;/em&gt;) e dimensione (di tipo &lt;em&gt;SizeF&lt;/em&gt;) della sua proprietà “Region”, come illustrato nel seguente snippet:&lt;/p&gt;  &lt;div&gt;   &lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;     &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;RectangleWorldGlobalBehavior region = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; RectangleWorldGlobalBehavior(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.simulationComponents);&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;region.Region = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; RectangleF(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; PointF(0, 0), worldService.World.WorldSize);&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Per inizializzare il servizio di gestione della “vicinanza&amp;quot;&amp;#160; tra agenti, rappresentato dall’interfaccia &lt;em&gt;INeighborhoodService&lt;/em&gt;, è necessario creare un’istanza del contenitore utilizzato dal sistema per accedere alla informazioni posizionali relative degli agenti. All’interno di NSteer sono definiti due diversi contenitori (che implementano l’interfaccia &lt;em&gt;INeighborhood&lt;/em&gt;, di cui il più performante è il &lt;em&gt;BinLatticeNeihborhood&lt;/em&gt;, basato su una struttura bidimensionale di “Bins”, ossia di caselle caratterizzate da una coppia di indici che ne descrive la posizione all’interno del contenitore (in termini di riga e colonna) e da una lista di agenti presenti in quella casella. Un’inizializzazione tipica del &lt;em&gt;BinLatticeNeihborhood è la seguente:&lt;/em&gt;&lt;/p&gt;

&lt;div&gt;
  &lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;
    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;INeighborhoodService neighborhood = &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.simulationComponents.NeighborhoodService;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;BinLatticeNeihborhood bins = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; BinLatticeNeihborhood(&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.simulationComponents,&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    16, 16,&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.sceneControl.Width,&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.sceneControl.Height);&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;neighborhood.Neighborhood = bins;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Gli ostacoli presenti all’interno della simulazione possono essere facilmente creati ed inseriti nel servizio che li gestisce attraverso uno snippet di questo tipo, in cui vengono definiti due ostacoli circolari in posizioni diverse e di raggio rispettivamente 50 e 15:&lt;/p&gt;

&lt;div&gt;
  &lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;
    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;IObstacleService obstacleService = &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.simulationComponents.ObstacleService;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;CircleObstacle obstacle = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; CircleObstacle(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; PointF(100, 100), 50);&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;obstacleService.ObstacleManager.AddObstacle(obstacle);&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;CircleObstacle obstacle2 = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; CircleObstacle(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; PointF(200, 200), 15);&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;obstacleService.ObstacleManager.AddObstacle(obstacle2);&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Arriviamo finalmente alla creazione di un agente, caratterizzato nello snippet che segue dai seguenti aspetti salienti:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Corpo con comportamento assimilabile ad un punto dotato di massa&lt;/li&gt;

  &lt;li&gt;Area visiva “conica” (o meglio, in 2D, angolare)&lt;/li&gt;

  &lt;li&gt;Comportamento composito di tipo “prioritario”, in cui viene assunto come comportamento dell’agente il primo, all’interno dei comportamenti “componenti”, per il quale la norma dell’accelerazione sia maggiore di una certa soglia&lt;/li&gt;

  &lt;li&gt;Comportamento componente di tipo “comportamento composito pesato”, in cui i vari comportamenti componenti vengono sommati ciascuno con un proprio “peso”. In altri termini tale comportamento farà sì che vengano contemporaneamente tenuti in considerazione criteri diversi di movimento facendo sì che la “somma” di tutti i criteri propenda in favore dei criteri ritenuti più importanti&lt;/li&gt;

  &lt;li&gt;Comportamento componente (del composito pesato) di tipo &lt;em&gt;ObstacleAvoidance&lt;/em&gt; (per evitare gli ostacoli) con peso 10&lt;/li&gt;

  &lt;li&gt;Comportamento componente (sempre del composito pesato) di tipo &lt;em&gt;LocalBehavior &lt;/em&gt;(per rimanere nell’area di confine) con peso 5&lt;/li&gt;

  &lt;li&gt;Comportamento componente (del composito prioritario) di tipo &lt;em&gt;FlockBehavior&lt;/em&gt; che permette all’agente di rimanere accanto ai propri “simili”. Poiché il comportamento composito prioritario prevede un ordine di priorità (decrescente) dato dall’ordine di inserimento, il FlockBehavior apporterà il proprio contributo solo se l’agente non si trova a ridosso di un ostacolo o del confine dell’area permessa&lt;/li&gt;

  &lt;li&gt;Comportamento componente (del composito prioritario) di tipo &lt;em&gt;SeekBehavior&lt;/em&gt; che spinge l’agente verso il “target” assegnato (nel nostro esempio la posizione del cursore del mouse)&lt;/li&gt;

  &lt;li&gt;Velocità massima pari a 3 (non chiediamoci l’unità di misura)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;div&gt;
  &lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;
    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;Agent agent = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Agent(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.simulationComponents);&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;agent.Body = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; PointMassBody();&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;agent.Vision = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ConeVision();&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;// Comportamento composito &amp;quot;prioritario&amp;quot;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;PriorityBehavior behavior = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; PriorityBehavior();&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;agent.Behavior = behavior;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;// Comportamento componente del prioritario e composito &amp;quot;pesato&amp;quot;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;WeightedSumBehavior wo = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; WeightedSumBehavior();&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;behavior.Behaviors.Add(wo);&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;// Comportamento componente del pesato di tipo &amp;quot;confine&amp;quot;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;LocalBehavior region = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; LocalBehavior(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.region);&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;wo.AddBehavior(region,5);&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;// Comportamento componente del pesato di tipo &amp;quot;evita gli ostacoli&amp;quot;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;ObstacleAvoidanceBehavior obstacleAvoidance = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ObstacleAvoidanceBehavior();&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;obstacleAvoidance.Probe = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; TridentObstacleProbe();&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;wo.AddBehavior(obstacleAvoidance,10);&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;// Comportamento componente del prioritario di tipo &amp;quot;stormo&amp;quot;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;FlockBehavior flock = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; FlockBehavior();&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;behavior.Behaviors.Add(flock);&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;// Comportamento componente del prioritario di tipo &amp;quot;insegui&amp;quot;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;MouseTargetPredictor mouse = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; MouseTargetPredictor();&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;mouse.Style = MouseTargetPredictorStyle.Move;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;mouse.OwnerControl = &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.sceneControl;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;SeekBehavior seek = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; SeekBehavior();&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;seek.TargetPredictor = mouse;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;seek.TargetTracker = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ArrivalTargetTracker();&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;behavior.Behaviors.Add(seek);&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;// Accelerazione, Velocità e Posizione iniziali&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;agent.Body.Update(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; PointF(), &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; PointF(0, 0), &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; PointF(sceneControl.Width / 2, sceneControl.Height / 2));&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#008000;"&gt;// Velocità massima&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;UniformPointSaturator velsat = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; UniformPointSaturator();&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;velsat.MaxNorm = 3f;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;agent.Body.VelocitySaturator = velsat;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;A questo punto uno step della simulazione può essere calcolato utilizzando il metodo &lt;em&gt;SimulateTurn()&lt;/em&gt; dell’oggetto &lt;em&gt;Simulator. &lt;/em&gt;Nell’esempio allegato a NSteer tale metodo viene chiamato ogni qual volta il controllo contenuto all’interno del Form che costituisce l’interfaccia utente dell’applicazione necessita di essere ridisegnato. Tale necessità viene inoltre “forzata” in corrispondenza del gestore di evento dell’evento &lt;em&gt;Idle&lt;/em&gt; dell’oggetto &lt;em&gt;Application&lt;/em&gt; di Winforms, come illustrato nello snippet seguente, in cui la simulazione viene rispettivamente avviata e bloccata da due pulsanti denominati (guarda caso) “startButton” e “stopButton”:&lt;/p&gt;

&lt;div&gt;
  &lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;
    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; startButton_Click(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;{&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;   &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.stopButton.Enabled = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;   &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.startButton.Enabled = &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;   Application.Idle+=&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; EventHandler(Application_Idle);&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;}&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; stopButton_Click(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;{&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;   Application.Idle -= &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; EventHandler(Application_Idle);&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;   &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.stopButton.Enabled = &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;   &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.startButton.Enabled = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;}&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Application_Idle(Object sender, EventArgs e)&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;{&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;   &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.sceneControl.Invalidate();&lt;/pre&gt;

    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;}&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Per oggi ci fermiamo qui, ma per mantenere viva l’attenzione su quanto ci aspetta propongo non uno, ma addirittura due “approfondimenti” pratici di quanto abbiamo visto.&lt;/p&gt;

&lt;p&gt;Il primo è la realizzazione di un ostacolo di tipo rettangolare da integrare in NSteer, al quale potrebbe seguire, per i più solerti, l&amp;#39;implementazione di un ostacolo di tipo &amp;quot;polirettangolare&amp;quot;, ossia definito da un insieme di rettangoli adiacenti.&lt;/p&gt;

&lt;p&gt;Il secondo spunto, probabilmente più divertente, prevede la realizzazione di una semplice applicazione Winforms che, utilizzando NSteer, definisca un&amp;#39;area rettangolare di dimensioni 100x100 unità logiche con al centro un ostacolo circolare di raggio 30. In questo ambiente, 10 agenti con posizione iniziale (0,0), velocità e accelerazione nulla e velocità massima 3 devono arrivare nel più breve numero di step di simulazione possibili all&amp;#39;angolo opposto, dove per tempo più breve si intende quello dell&amp;#39;ultimo arrivato.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Come premio (o come penitenza?) i primi (o i soli) che posteranno del materiale interessante in merito ai due approfondimenti proposti avranno la facoltà di scegliere per primi i componenti dello sviluppo di NHoolingans da realizzare tra quelli che verranno resi a breve disponibili.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetumbria.org/aggbug.aspx?PostID=432" width="1" height="1"&gt;</description></item><item><title>Progetto NHooligans - Parte 1 - Concetti, entità e interfacce del sistema di simulazione</title><link>http://dotnetumbria.org/blogs/nhooligans/archive/2008/06/11/progetto-nhooligans-parte-1-concetti-entit-224-e-interfacce-del-sistema-di-simulazione.aspx</link><pubDate>Wed, 11 Jun 2008 05:53:00 GMT</pubDate><guid isPermaLink="false">7c6ab959-8411-4d1b-a449-1796eac035b7:427</guid><dc:creator>maiorfi</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;In considerazione della straordinaria risposta al mio post nella sezione &amp;quot;futuri appuntamenti&amp;quot; (intendo straordinariamente scarsa), provo ad addentrarmi un po&amp;#39; pi&amp;ugrave; nel concreto del sistema di simulazione che costituir&amp;agrave; l&amp;#39;ambiente all&amp;#39;interno del quale interagiranno i vari agenti (denominati &amp;quot;hooligan&amp;quot;) comandati dai programmi &amp;quot;contendenti&amp;quot;.&lt;/p&gt;
&lt;p&gt;Facendo riferimento alla terminologia utilizzata nel framework &lt;b&gt;NSteer&lt;/b&gt;, intorno al quale verr&amp;agrave; sviluppato il sistema di simulazione, si individuano i seguenti &amp;quot;attori&amp;quot;, ciascuno con le proprie peculiarit&amp;agrave; (o, in altri termini, ciascuno caratterizzato dall&amp;#39;implementazione di una o pi&amp;ugrave; delle interfacce definite dal framework:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un oggetto di tipo &amp;quot;agente&amp;quot; (&lt;i&gt;Agent&lt;/i&gt;, in NSteer), descrive un&amp;#39;entit&amp;agrave; che vive all&amp;#39;interno del &amp;quot;mondo&amp;quot; (&lt;i&gt;World&lt;/i&gt;, in NSteer). Un agente ha un &amp;quot;corpo&amp;quot; (&lt;i&gt;Body&lt;/i&gt;, in NSteer), un sistema di &amp;quot;visione&amp;quot; (&lt;i&gt;Vision&lt;/i&gt;, in NSteer) e un &amp;quot;comportamento&amp;quot; (&lt;i&gt;Behavior&lt;/i&gt;, in NSteer).&lt;/li&gt;
&lt;li&gt;Il &amp;quot;corpo&amp;quot; di un agente definisce le propriet&amp;agrave; cinematiche dell&amp;#39;agente (posizione, velocit&amp;agrave; e accelerazione).&lt;/li&gt;
&lt;li&gt;Un sistema di &amp;quot;visione&amp;quot; definisce la regione in cui un agente pu&amp;ograve; &amp;quot;vedere&amp;quot; gli altri agenti o gli ostacoli presenti, tipicamente, nelle sue vicinanze.&lt;/li&gt;
&lt;li&gt;Il &amp;quot;comportamento&amp;quot; di un agente determina, ad ogni passo della simulazione, la forza (in senso vettoriale) cui sar&amp;agrave; sottoposto il suo &amp;quot;corpo&amp;quot;.&lt;/li&gt;
&lt;li&gt;Gli agenti sono confinati all&amp;#39;interno del &amp;quot;mondo&amp;quot;.&lt;/li&gt;
&lt;li&gt;Il &amp;quot;simulatore&amp;quot; (&lt;i&gt;Simulator&lt;/i&gt;, in NSteer) determina, ad ogni passo della simulazione, la situazione cinematica (posizione, velocit&amp;agrave; e accelerazione) di tutti gli agenti presenti nel sistema.&lt;/li&gt;
&lt;li&gt;Il sistema di simulazione implementato in NSteer definisce quattro servizi per gestire gli agenti, il mondo, gli ostacoli e la &amp;quot;prossimit&amp;agrave;&amp;quot; di un agente nei confronti degli altri rispettivamente mediante i servizi &lt;i&gt;AgentService&lt;/i&gt;, &lt;i&gt;WorldService&lt;/i&gt;, &lt;i&gt;ObstacleService &lt;/i&gt;e &lt;i&gt;NeighborhoodService&lt;/i&gt;.&lt;/li&gt;
&lt;li&gt;Per quanto concerne la visualizzazione della simulazione NSteer definisce il concetto di &lt;i&gt;Sprite&lt;/i&gt;, un oggetto 2D caratterizzato da attributi quali colori, visibilit&amp;agrave;, forma, ecc. e il concetto di &amp;quot;Scena&amp;quot; (&lt;i&gt;Scene&lt;/i&gt;, in NSteer), che astrae gli aspetti legati al rendering della simulazione.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Prima che vi sloghiate la mandibola per gli sbadigli, vi incollo un&amp;#39;immagine relativa ad uno step della simulazione realizzata all&amp;#39;interno del demo che accompagna il framework NSteer.&lt;/p&gt;
&lt;p align="center"&gt;&lt;a href="http://dotnetumbria.org/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/nhooligans/NSteerDemo_5F00_2.png"&gt;&lt;img title="NSteerDemo" style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" alt="NSteerDemo" src="http://dotnetumbria.org/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/nhooligans/NSteerDemo_5F00_thumb.png" border="0" height="198" width="244" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Nello screenshot &amp;egrave; possibile individuare una decina di agenti (i punti contornati dal cerchietto rosa, che rappresenta lo spazio occupato dall&amp;#39;agente) ciascuno dei quali ha un proprio &amp;quot;orientamento&amp;quot; ed un proprio &amp;quot;cono visivo&amp;quot; (rappresentato dai 3 segmenti terminati da pallini che escono dal centro dell&amp;#39;agente). I comportamenti di ciascun agente sono descritti dall&amp;#39;etichetta che compare accanto a ciascun cerchietto rosa. I comportamenti definiti all&amp;#39;interno del framework NSteer sono gi&amp;agrave; parecchi, ma &amp;egrave; possibile definirne di nuovi o scrivendoli da zero o utilizzando uno dei comportamenti &amp;quot;contenitore&amp;quot; gi&amp;agrave; definiti in NSteer. I 3 cerchi viola rappresentano degli ostacoli circolari. Nell&amp;#39;immagine gli agenti al centro della finestra hanno attivato il comportamento &amp;quot;Seek&amp;quot; (ossia insegui) nei confronti del pallino verde in alto (comandato dal movimento del cursore del mouse nell&amp;#39;applicazione di esempio). Gli altri hanno attivato invece un comportamento composito caratterizzato dalla somma del comportamento &amp;quot;Confine&amp;quot; (ossia confina, argina) e del comportamento &amp;quot;Avoid&amp;quot; (ossia evita), rispettivamente per rimanere all&amp;#39;interno della regione permessa (rappresentata dal riquadro interno) e per evitare l&amp;#39;ostacolo che hanno accanto.&lt;/p&gt;
&lt;p&gt;Anche se nello step di simulazione immortalato da questo screenshot non &amp;egrave; evidente (perch&amp;eacute; in questo screenshot altri comportamenti avevano priorit&amp;agrave;), gli agenti tendono a rimanere uniti ma a non sovrapporsi grazie ad un altro comportamento: il FlockBehavior (dove flock significa &amp;quot;stormo&amp;quot;).Questo comportamento ha una valenza &amp;quot;storica&amp;quot; particolare perch&amp;eacute; &amp;egrave; proprio dalla scomposizione delle regole che guidano il comportamento di uno stormo di uccelli che Reynolds ha tratto lo spunto per il proprio lavoro. Per rendervi conto meglio di quello che Reynolds ha inventato (o forse dovrei dire &amp;quot;scoperto&amp;quot;) vi consiglio di dare un&amp;#39;occhiata ai demo allegati, ed in particolare (premento Tab si passa da un demo al successivo) al demo &amp;quot;Boids&amp;quot;.&lt;/p&gt;
&lt;p&gt;Nel prossimo post inizieremo a dare un&amp;#39;occhiata a qualche snippet di codice, per poi fare chiarezza sui &amp;quot;lotti&amp;quot; di progetto disponibili per l&amp;#39;assegnazione a chi vorr&amp;agrave; partecipare attivamente allo sviluppo di NHooligans.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetumbria.org/aggbug.aspx?PostID=427" width="1" height="1"&gt;</description><enclosure url="http://dotnetumbria.org/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.00.04.27/OpenSteerDemo_5F00_0_5F00_8_5F00_2_5F00_win32.zip" length="159049" type="application/binary" /><category domain="http://dotnetumbria.org/blogs/nhooligans/archive/tags/NHooligans/default.aspx">NHooligans</category></item><item><title>Sì, va bene, sviluppiamo un software insieme…ma quale?</title><link>http://dotnetumbria.org/blogs/nhooligans/archive/2008/06/11/s-236-va-bene-sviluppiamo-un-software-insieme-ma-quale.aspx</link><pubDate>Wed, 11 Jun 2008 05:47:54 GMT</pubDate><guid isPermaLink="false">7c6ab959-8411-4d1b-a449-1796eac035b7:426</guid><dc:creator>maiorfi</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Ciao a tutti. Riprendo il primo post in cui si è parlato di NHooligans dalla sezione Eventi del Forum per mettere subito qualcosa qui dentro prima che Paolo si arrabbi e chiuda il Blog…&lt;/p&gt;  &lt;p&gt;Premetto di nuovo (ed è la terza volta…basta!) che lo scopo del progetto in questione non dovrebbe essere, almeno a mio avviso, quello del software da realizzare in se&amp;#39;, quanto piuttosto un&amp;#39;opportunità per sperimentare metodologie, architetture e tecnologie che favoriscano lo sviluppo collaborativo anche all&amp;#39;interno di un gruppo di sviluppatori che non condividono un luogo di lavoro &amp;quot;fisico&amp;quot;, bensì uno spazio virtuale (termine che sembra uscito dalla bocca di uno di quegli informatici degli anni 60 che stavano davanti ai calcolatori con il camice) rappresentato da un misto di sistemi informativi quali email, forum, blog, controllo sorgenti, ecc.&lt;/p&gt;  &lt;p&gt;In breve, l&amp;#39;idea per il soggetto dello sviluppo è quella di un gioco on-line ispirato al celeberrimo (e antichissimo) &amp;quot;&lt;a href="http://en.wikipedia.org/wiki/Core_War"&gt;core wars&lt;/a&gt;&amp;quot; (la guerra dei nuclei, nella traduzione italiana di &amp;quot;Le Scienze&amp;quot;), ossia di un gioco in cui i concorrenti sono rappresentati da agenti autonomi il cui comportamento è stabilito da programmi realizzati da giocatori &amp;quot;umani&amp;quot; che (indirettamente) concorrono al raggiungimento di un obiettivo. Anche se molti sono i giochi che si sono ispirati a core wars negli anni a venire (p-robots, c-robots e ants per citarne alcuni), il capostipite resta ancora l&amp;#39;unico caso in cui i programmi che si sfidano sono al contempo avatar e software di controllo degli avatar stessi: un&amp;#39;idea a mio parere di rara genialità (anche se, a quanto dice wikipedia, pare che Dewdney, l&amp;#39;autore del gioco, si sia in realtà ispirato ad un altro gioco chiamato Darwin, ideato nei laboratori della Bell negli anni 60, ma a noi che ce frega?).&lt;/p&gt;  &lt;p&gt;Ovviamente, essendo qui tutti appassionati di sviluppo .NET (qualcuno anche perché non ha una ragazza), l&amp;#39;idea è quella di realizzare un sistema in cui degli oggetti .NET, compilati ed ospitati in un assembly, comandino degli agenti autonomi che si sfidano in una sorta di &amp;quot;arena&amp;quot; a suon di...&amp;quot;mazzate&amp;quot;. Mi spiego meglio: l&amp;#39;ambientazione di riferimento sarebbe quella, sicuramente italiana almeno quanto la pizza ma anche un po&amp;#39;inglese, di due tifoserie avversarie che si gonfiano come zampogne nel tentativo di raggiungere una meta (che nel caso reale manca, ma questo dimostra ancora una volta che l&amp;#39;informatica è un mondo estremamente più concreto di quello reale) rappresentata da una bandiera (della tifoseria avversaria, si intende), da conquistare e, presumibilmente, in seguito bruciare sghignazzando. Proprio per questo non mi dispiacerebbe se il progetto si chiamasse &amp;quot;NHooligans&amp;quot;, anche se è un nome un po&amp;#39; lassativo. In alternativa potremmo usare, come fa mamma Microsoft, il nome di qualche frazione locale, tipo &amp;quot;Ramazzano&amp;quot;, ma forse è meglio NHooligans...&lt;/p&gt;  &lt;p&gt;Lo schema del gioco dovrebbe essere questo: si sfidano due tifoserie, ognuna rappresentata da N agenti autonomi, detti &amp;quot;hooligan&amp;quot; (ironicamente al contempo tifosi e agenti, ah ah), ciascuno dei quali viene &amp;quot;pilotato&amp;quot; da uno di M programmi, con la possibilità di attribuire teoricamente anche un programma differente per cisacun hooligan. Ciascun hooligan è rappresentato nell&amp;#39;arena di gioco da un&amp;#39;area circolare che ne rappresenta, per così dire, l&amp;#39;ingombro. Gli hooligan, amici o nemici, non possono &amp;quot;compenetrarsi&amp;quot;, ossia i loro &amp;quot;cerchi&amp;quot; non possono sovrapporsi. Ogni hooligan viene dotato inizialmente di una riserva di energia (ad es. 100 unità), che viene decrementata sia per effetto del muoversi (per più tempo e più forte corre, più si affatica) sia, soprattutto, per effetto delle botte che prende. Inoltre, l&amp;#39;energia residua di un hooligan determina la velocità massima con cui può muoversi e i danni che fa quando picchia un avversario. Ogni qualvolta due hooligan avversari si trovano a distanza minima (la somma dei due raggi, ossia quando si toccano) essi si sottraggono punti energia in ragione dei loro rispettivi stati di salute (uno sano picchia di più di uno già malconcio). Quando l&amp;#39;energia di un hooligan arriva a zero, questi viene ovviamente &amp;quot;rimosso&amp;quot; dall&amp;#39;arena. Se un hooligan si trova a contatto con più avversari, questo subirà un danno maggiore della somma dei danni dei singoli avversari, per effetto di una &amp;quot;sinergia&amp;quot; che spesso manca nei film tipo quelli con Bruce Lee in cui , anche se sono 100 contro 1, i cattivi sfidano il protagonista uno per volta, per onestà. Se un hooligan riesce a raggiungere il punto dell&amp;#39;arena che contiene la bandiera avversaria, la sua squadra vince e totalizza i punti corrispondenti alla somma dei punti energia degli hooligan ancora in gioco.&lt;/p&gt;  &lt;p&gt;Anche se seguiranno altri dettagli nei prossimi post, una prima idea che vorrei proporre è quella di utilizzare nei programmi di controllo degli hooligan delle &amp;quot;primitive&amp;quot; complesse del tipo &amp;quot;segui quell&amp;#39;holigan&amp;quot;, oppure &amp;quot;voi 4 rimanete vicini&amp;quot;, oppure &amp;quot;evita quell&amp;#39;ostacolo&amp;quot;, oppure &amp;quot;vigila in questa zona&amp;quot;, oppure (e più spesso) &amp;quot;scappa&amp;quot;. Per far questo potremmo utilizzare il framework NSteer, sviluppato da &lt;a href="http://www.projectdistributor.net/Users/User.aspx?userId=111"&gt; Jonathan de Halleux&lt;/a&gt; a partire dal lavoro originale di Craig W. Reynolds della Sony, che per primo ha ideato e sviluppato gli algoritmi &amp;quot;comportamentali&amp;quot; di cui sopra, senz&amp;#39;altro motivato dalla partecipazione a diversi progetti di sviluppo per software playstation.&lt;/p&gt;  &lt;p&gt;Se ne avete voglia, potete intanto dare un&amp;#39;occhiata al progetto &lt;a href="http://www.projectdistributor.net/Releases/Release.aspx?releaseId=217"&gt;NSteer&lt;/a&gt; (dalla solution togliete il progetto di test e lanciate il demo winform per farvi un&amp;#39;idea) e, perché no, anche alla &lt;a href="http://www.red3d.com/cwr/steer/gdc99/"&gt;pubblicazione originale&lt;/a&gt; (del 1999) di Craig W. Reynolds e ai relativi &lt;a href="http://www.red3d.com/cwr/steer/"&gt;demo animati&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetumbria.org/aggbug.aspx?PostID=426" width="1" height="1"&gt;</description><category domain="http://dotnetumbria.org/blogs/nhooligans/archive/tags/NHooligans/default.aspx">NHooligans</category></item><item><title>Book review: Essential Silverlight 2 - UpToDate !</title><link>http://dotnetumbria.org/blogs/cruciani/archive/2008/06/10/book-review-essential-silverlight-2-uptodate.aspx</link><pubDate>Tue, 10 Jun 2008 13:00:00 GMT</pubDate><guid isPermaLink="false">7c6ab959-8411-4d1b-a449-1796eac035b7:420</guid><dc:creator>Andrea Cruciani</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;&amp;nbsp;Periodo di molte letture questo :-).&lt;/p&gt;
&lt;p&gt;In questi giorni, volendo approfondire Silverlight, ho letto il libro di &lt;a href="http://www.hauser-wenz.de/s9y/index.php?frontpage" class="null"&gt;Christian Wenz&lt;/a&gt; (da notare che nel suo bog si parla di Asp.Net e Php, nel blog spazia proprio su tutto! ) mi sono trovato alle prese con un nuovo genere di libro... un libro molto Web 2.0!&lt;/p&gt;
&lt;p&gt;Il libro &amp;egrave; interessante e propone gli argomenti base di Silverlight 2 in modo abbastanza conciso, forse troppo... arrivati a met&amp;agrave; libro, sorpresa! La restante met&amp;agrave; del libro &amp;egrave; composta da pagine bianche, un po&amp;#39; troppe per essere pagine per gli appunti...&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img width="500" src="http://dotnetumbria.org/cfs-filesystemfile.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/cruciani.Images/Essential-Silverlight-2-Up_2D00_to_2D00_Date.jpg" height="651" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Essendo Silverlight 2 una tecnologia drasticamente in movimento Christian ha capito che non poteva scrivere subito un libro compiuto, ha cos&amp;igrave; reso il libro dinamico, oltre agli esempi sul sito &lt;a href="http://oreilly.com/catalog/9780596519988/" class="null"&gt;O&amp;#39;Reilly&lt;/a&gt;&amp;nbsp;ne usciranno continui aggiornamenti mano a mano che la tecnologia si evolver&amp;agrave;. Ciascuno potr&amp;agrave; scegliere se scaricarsi i pdf degli aggiornamenti e stamparseli oppure se ordinare le nuove pagine gi&amp;agrave; stampate (per circa 4$). E&amp;#39; gi&amp;agrave; stato pubblicato un nuovo aggiornamento a Maggio 2008,&amp;nbsp;la cosa&amp;nbsp;intrigante &amp;egrave; che gli stessi lettori possono partecipare al &lt;a href="http://forums.oreilly.com/category/23/Essential-Silverlight-2-Up-to-Date/" class="null"&gt;forum&lt;/a&gt; e chiedere&amp;nbsp;di approfondire&amp;nbsp;un argomento (per esempio &amp;egrave; stato chiesto un approfondimento sulla Sicurezza).&lt;/p&gt;
&lt;p&gt;E&amp;#39; sicuramente un format interessante, forse non sar&amp;agrave; troppo popolare perch&amp;egrave; in questo mondo dove si v&amp;agrave; troppo veloci pochi si prenderanno cura di aggiornare un &amp;quot;vecchio&amp;quot; libro cartaceo&amp;nbsp; e si terranno i pdf in una cartella... ma, almeno per me, il fascino della carta stampata rimane sempre. Cmq compliementi a Christian ed alla O&amp;#39;Reilly per il coraggio!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetumbria.org/aggbug.aspx?PostID=420" width="1" height="1"&gt;</description><category domain="http://dotnetumbria.org/blogs/cruciani/archive/tags/books/default.aspx">books</category><category domain="http://dotnetumbria.org/blogs/cruciani/archive/tags/Silverlight/default.aspx">Silverlight</category></item><item><title>Rilasciato Silverlight 2 beta 2</title><link>http://dotnetumbria.org/blogs/cruciani/archive/2008/06/10/rilasciato-silverlight-2-beta-2.aspx</link><pubDate>Tue, 10 Jun 2008 07:11:00 GMT</pubDate><guid isPermaLink="false">7c6ab959-8411-4d1b-a449-1796eac035b7:421</guid><dc:creator>Andrea Cruciani</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;&amp;nbsp;E&amp;#39; notizia &amp;quot;vecchia&amp;quot; di qualche giorno ma non posso evitare di riproporla: &amp;egrave; stata &lt;a href="http://silverlight.net/GetStarted/" class="null"&gt;rilasciata la versione beta 2&lt;/a&gt; di Silverlight 2.&lt;/p&gt;
&lt;p&gt;Tra le novit&amp;agrave; una di quelle pi&amp;ugrave; interessanti per capire la direzione che sta prendendo Silverlight 2 &amp;egrave; che lo Xaml sta diventanto sempre pi&amp;ugrave; conforme a quello utilizzato in Wpf, per chi avesse seguito la mia &lt;a href="http://dotnetumbria.org/blogs/cruciani/archive/2008/05/16/applicazione-silverlight-2-vs-2008-community-launch.aspx" class="null"&gt;sessione all&amp;#39;ultimo evento&lt;/a&gt; capisce quale possa essere l&amp;#39;importanza strategica di questa notizia. &lt;/p&gt;
&lt;p&gt;In attesa del &lt;a href="http://blogs.msdn.com/silverlight_sdk/archive/2008/06/03/silverlight-2-beta-2-releasing-soon.aspx" class="null"&gt;rilascio dell&amp;#39;SDK &lt;/a&gt;altre novit&amp;agrave; potete trovarle riassunte in questo &lt;a href="http://blogs.msdn.com/italy/archive/2008/06/07/silverlight-2-beta-2-released.aspx" class="null"&gt;post&lt;/a&gt; di Pietro Brambati, che rimanda anche ad alcune breaking changes con la beta 1.&lt;/p&gt;
&lt;p&gt;Immancabile il &amp;quot;solito&amp;quot; &lt;a href="http://weblogs.asp.net/scottgu/archive/2008/06/06/silverlight-2-beta2-released.aspx" class="null"&gt;post &lt;/a&gt;di Scott Guthrie sull&amp;#39;argomento&lt;/p&gt;
&lt;p&gt;Una nota sulla licenza di rilascio. SL 2 beta 2 &amp;egrave; rilasciato in Go-Live che permette l&amp;#39;utilizzo a fini commerciali del prodotti.&lt;/p&gt;
&lt;p&gt;Happy SL !&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetumbria.org/aggbug.aspx?PostID=421" width="1" height="1"&gt;</description><category domain="http://dotnetumbria.org/blogs/cruciani/archive/tags/Silverlight/default.aspx">Silverlight</category></item><item><title>Book review: Expert .Net Micro Framework</title><link>http://dotnetumbria.org/blogs/cruciani/archive/2008/05/31/book-review-expert-net-micro-framework.aspx</link><pubDate>Sat, 31 May 2008 15:31:00 GMT</pubDate><guid isPermaLink="false">7c6ab959-8411-4d1b-a449-1796eac035b7:386</guid><dc:creator>Andrea Cruciani</dc:creator><slash:comments>3</slash:comments><description>&lt;p&gt;Era da un po&amp;#39; che volevo dedicare del tempo a capire meglio il &lt;a href="http://msdn.microsoft.com/it-it/library/cc185077.aspx"&gt;MicroFramework&lt;/a&gt; e il libro&amp;nbsp; di &lt;span style="color:#000000;"&gt;&lt;a href="http://bloggingabout.net/blogs/jens/default.aspx" class="null"&gt;Jens K&amp;uuml;hner&lt;/a&gt;&lt;/span&gt; &amp;egrave; stata la scusa per iniziare a dargli uno sguardo. Il MicroFramework mi permette di unire i miei vecchi (ed impolverati) studi di elettronica al mio &amp;quot;pane quotidiano&amp;quot;, la programmazione con .Net. Leggendo il libro (adatto anche a chi conosce il .Net framework &amp;quot;standard&amp;quot; non approfonditamente) si scopre un mondo di microcontrollori gi&amp;agrave; predisposti per l&amp;#39;utilizo del Microframework, uno tra tutti un dispositivo costituito da una porta di rete &amp;quot;intelligente&amp;quot; che trovate &lt;a href="http://www.digi.com/products/embeddedsolutions/digiconnectme.jsp"&gt;qui&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://dotnetumbria.org/blogs/cruciani/expert_netmf_thumb.jpg"&gt;&lt;img border="0" src="http://dotnetumbria.org/blogs/cruciani/expert_netmf_thumb.jpg" alt="" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Oltre al controllo delle porte hardware&amp;nbsp;(GPIO: Genera Purpose Input/Output), al threading, alla crittografia (!!) &amp;egrave; possibile pilotare diplay lcd per visualizzare dettagli (anche grazie ad un SDK aggiuntivo SideShow, creato ad hoc per il Micro Framework) nonch&amp;egrave; gestire le comunicazioni via socket TCP ed UDP. Proprio nel capitolo del networking ho scopeto l&amp;#39;esistenza delle specifiche &lt;a href="http://en.wikipedia.org/wiki/Devices_Profile_for_Web_Services"&gt;DPWS&lt;/a&gt; (Device Profile for Web Service) un subset delle specifiche dei Web Services che permettono di offrire le capacit&amp;agrave; del dispositivo tramite un web service hostato dal device stesso!! Ovviamente tale funionalit&amp;agrave; e&amp;#39; rivolta ai dispositivi che possiedono un&amp;#39;interfaccia di rete. Immaginate una serie di dispositivi che fanno monitoraggio ambientale e la possibilit&amp;agrave; di visualizzare lo stato di un ambiente (temperatura, umidit&amp;agrave;, ...) in un mesh up che riassume tutti i dati dai vari dispositivi, il tutto utilizzando le normali tecniche di interrogazione dei web services... Sinceramente questo framework mi ha intrigato tantissimo. Spero di poter iniziare presto a fare qualche esperimento, poi vi dir&amp;ograve; come procede. Per chi fosse interessato all&amp;#39;argomento credo che il libro aiuti, in modo veloce e puntuale, a capire quale sia la situazione attuale del prodotto e la panoramica delle funzionalit&amp;agrave; che offre.&lt;/p&gt;
&lt;p&gt;Se volete iniziare a guardare l&amp;#39;argomento vi segnalo alcuni links:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=EB0EF2A6-03E2-402C-89A4-A636BD0080C5&amp;amp;displaylang=en"&gt;MicroFramework SDK 2.5&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=B877C01D-E80E-4F30-9DF9-3A46EC519704&amp;amp;displaylang=en"&gt;Windows SideShow Device SDK for .NET Micro Framework&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/embedded/bb267253.aspx"&gt;.Net Microframework&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetumbria.org/aggbug.aspx?PostID=386" width="1" height="1"&gt;</description><category domain="http://dotnetumbria.org/blogs/cruciani/archive/tags/MicroFramework/default.aspx">MicroFramework</category></item><item><title>Uno snippet per le DependencyProperty su WPF</title><link>http://dotnetumbria.org/blogs/possanzini/archive/2008/05/27/uno-snippet-per-le-dependencyproperty-su-wpf.aspx</link><pubDate>Tue, 27 May 2008 07:59:00 GMT</pubDate><guid isPermaLink="false">7c6ab959-8411-4d1b-a449-1796eac035b7:376</guid><dc:creator>Paolo Possanzini</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Mi capita molto spesso di creare DependencyProperty per i miei oggetti da utilizzare con WPF.&lt;br /&gt;&lt;font color="#000000"&gt;Nello snippet base devo sostituire continuamente &lt;/font&gt;&lt;font size="2"&gt;&lt;font color="#000000" size="2"&gt;&lt;font color="#0000ff"&gt;UIPropertyMetadata&lt;/font&gt; con &lt;font color="#0000ff"&gt;FrameworkElementMetadata&lt;/font&gt;, quindi ho deciso di farmi uno snippet gia modificato. &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font size="2"&gt;&lt;br /&gt;&lt;font color="#000000"&gt;Ve lo allego. &lt;br /&gt;Potete richiamarlo con propdpf&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#000000"&gt;Per installarlo è sufficiente copiare il file nella cartella &lt;br /&gt;C:\Program Files\Microsoft Visual Studio 9.0\VC#\Snippets\1033\NetFX30\&lt;/font&gt;&lt;/p&gt;&lt;/font&gt;&lt;/font&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetumbria.org/aggbug.aspx?PostID=376" width="1" height="1"&gt;</description><enclosure url="http://dotnetumbria.org/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.00.03.76/propdpf.snippet" length="2166" type="text/xml" /></item><item><title>Applicazione Silverlight 2 - VS 2008 {Community} Launch</title><link>http://dotnetumbria.org/blogs/cruciani/archive/2008/05/16/applicazione-silverlight-2-vs-2008-community-launch.aspx</link><pubDate>Fri, 16 May 2008 17:07:00 GMT</pubDate><guid isPermaLink="false">7c6ab959-8411-4d1b-a449-1796eac035b7:364</guid><dc:creator>Andrea Cruciani</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Un mese di attesa per pubblicare la demo fa sicuramente molto poco &amp;quot;web 2.0&amp;quot; ma spero che mi perdonerete.&lt;/p&gt;
&lt;p&gt;Trovate in allegato due demo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;Silverlight 2&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Conversione &amp;quot;brutale&amp;quot; in WPF&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Mentre la parte WPF non ha requisiti particolari per SL è necessario installare un ambiente che abbia i seguenti requisiti:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="" href="http://www.microsoft.com/silverlight/resources/installationFiles.aspx?v=2.0"&gt;&lt;font color="#000000"&gt;Silverlight 2.0 Beta 1&lt;/font&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="" href="http://www.microsoft.com/downloads/details.aspx?FamilyId=E0BAE58E-9C0B-4090-A1DB-F134D9F095FD&amp;amp;displaylang=en"&gt;&lt;font color="#000000"&gt;Microsoft Silverlight Tools Beta 1 for Visual Studio 2008&lt;/font&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Per l&amp;#39;editor consiglio di installare Expression Blend:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="" href="http://www.microsoft.com/expression/products/download.aspx?key=blend2dot5"&gt;&lt;font color="#000000"&gt;Microsoft Expression Blend 2.5 March 2008 Preview&lt;/font&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;La parte SL funziona nell&amp;#39;inserimento dei dati e nella consultazione. La conversione in Wpf è solo parziale (non e&amp;#39; stato sviluppata la parte di persistenza), l&amp;#39;obiettivo era quello di verificare come fosse possibile utilizzare uno Xaml pressocchè uguale in entrambe le situazioni.&lt;/p&gt;
&lt;p&gt;Nei prossimi post vorrei analizzare alcune parti di questa demo in profondità e magari sfruttarla per introdurre qualche concetto architetturale.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Demo SL: &lt;font color="#000000"&gt;&lt;a class="" href="http://dotnetumbria.org/blogs/cruciani/attachment/364.ashx"&gt;Demo SL.rar&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;Demo Wpf: &lt;a href="http://dotnetumbria.org/blogs/cruciani/Wpf%20Version.rar"&gt;Wpf Version.rar&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetumbria.org/aggbug.aspx?PostID=364" width="1" height="1"&gt;</description><enclosure url="http://dotnetumbria.org/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.00.03.64/Demo-SL.rar" length="765080" type="application/octet-stream" /><category domain="http://dotnetumbria.org/blogs/cruciani/archive/tags/Wpf/default.aspx">Wpf</category><category domain="http://dotnetumbria.org/blogs/cruciani/archive/tags/Silverlight/default.aspx">Silverlight</category></item><item><title>WPF - VS 2008 {Community} Launch - Il Codice della demo</title><link>http://dotnetumbria.org/blogs/possanzini/archive/2008/05/12/wpf-vs-2008-community-launch-il-codice-della-demo.aspx</link><pubDate>Mon, 12 May 2008 00:24:00 GMT</pubDate><guid isPermaLink="false">7c6ab959-8411-4d1b-a449-1796eac035b7:354</guid><dc:creator>Paolo Possanzini</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;In allegato a questo Post trovate il codice della demo della sessione su WPF utilizzata durante l&amp;#39;evento dell&amp;#39;8 Aprile. &lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnetumbria.org/aggbug.aspx?PostID=354" width="1" height="1"&gt;</description><enclosure url="http://dotnetumbria.org/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.00.00.03.54/WpfPresentation_5F00_Media4.rar" length="153910" type="application/octet-stream" /><category domain="http://dotnetumbria.org/blogs/possanzini/archive/tags/WPF/default.aspx">WPF</category><category domain="http://dotnetumbria.org/blogs/possanzini/archive/tags/XAML/default.aspx">XAML</category></item><item><title>WPF: Costruiamo un RSS Reader passo 4 (ListView)</title><link>http://dotnetumbria.org/blogs/possanzini/archive/2008/05/11/wpf-costruiamo-un-rss-reader-passo-4-listview.aspx</link><pubDate>Sun, 11 May 2008 21:24:00 GMT</pubDate><guid isPermaLink="false">7c6ab959-8411-4d1b-a449-1796eac035b7:353</guid><dc:creator>Paolo Possanzini</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Riprendiamo la nostra serie di articoli per la costruzione dell&amp;#39;RSS Reader in WPF. Questa è la volta della definizione della ListView. &lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Iniziamo a creare 2 wrapper che nascondono gli oggetti COM a WPF. &lt;br /&gt;Incorriamo in questo modo in meno problematiche di Binding. &lt;/p&gt;
&lt;p&gt;Ecco i due Wrapper &lt;/