<feed xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns="http://www.w3.org/2005/Atom" xml:lang="it-IT">
    <title>UGbLog di Pierre Greborio </title>
    <link rel="self" type="application/xml" href="http://blogs.ugidotnet.org/PierreGreborio/Atom.aspx" />
    <subtitle type="html">Pensieri dal mondo managed...</subtitle>
    <id>http://blogs.ugidotnet.org/PierreGreborio/Default.aspx</id>
    <author>
        <name>Pierre Greborio</name>
        <uri>http://blogs.ugidotnet.org/PierreGreborio/Default.aspx</uri>
    </author>
    <generator uri="http://subtextproject.com" version="Subtext Version 1.9.5.176">Subtext</generator>
    <updated>2008-06-28T00:41:55Z</updated>
    <entry>
        <title>Libri sul debugging</title>
        <link rel="self" type="text/html" href="http://blogs.ugidotnet.org/PierreGreborio/archive/2008/06/28/93205.aspx" />
        <id>http://blogs.ugidotnet.org/PierreGreborio/archive/2008/06/28/93205.aspx</id>
        <published>2008-06-28T00:41:55-07:00:00</published>
        <updated>2008-06-28T00:41:55Z</updated>
        <content type="html">&lt;p&gt;Quanto tempo dedicate durante lo sviluppo al debugging? Quante volte avete la necessita di debuggare un problema su un server di produzione? &lt;/p&gt;
&lt;p&gt;Bene, nel mio caso durante lo sviluppo dedico circa il 40% di tempo al debugging ed ogni volta che vi sono problemi servi (hang, crash, memoria...) sul server di test, staging o produzione, mi debbo analizzare il mini dump.&lt;/p&gt;
&lt;p&gt;Le tecniche di debugging possono essere estremamente sofisticate o piu' semplici, dipende dal contesto, dal codice e dall'accesso alle risorse. Un valido aiuto arriva sicuramente dai libri, i quali possono dare indicazioni chiare su come muoversi in questa difficile arte. &lt;/p&gt;
&lt;p&gt;Cito quindi "&lt;a href="http://www.amazon.com/Advanced-Debugging-Addison-Wesley-Microsoft-Technology/dp/0321374460/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1214638375&amp;amp;sr=8-1"&gt;Advanced Windows Debugging&lt;/a&gt;" per il debugging di codice nativo e "&lt;a href="http://www.amazon.com/Debugging-Microsoft-NET-2-0-Applications/dp/0735622027/ref=pd_sim_b_8"&gt;Debugging Microsoft .NET 2.0 applications&lt;/a&gt;" per il codice managed.&lt;/p&gt;
&lt;p&gt;Ovviamente non deve mancare nel vostro RSS reader il blog della mitica Tess: &lt;font face="Arial"&gt;&lt;a href="http://blogs.msdn.com/tess/"&gt;http://blogs.msdn.com/tess/&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PierreGreborio/aggbug/93205.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blogs.ugidotnet.org/PierreGreborio/comments/93205.aspx</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blogs.ugidotnet.org/PierreGreborio/comments/commentRss/93205.aspx</wfw:commentRss>
        <trackback:ping>http://blogs.ugidotnet.org/PierreGreborio/services/trackbacks/93205.aspx</trackback:ping>
    </entry>
    <entry>
        <title>A volte l'eleganza del linguaggio fa la differenza</title>
        <link rel="self" type="text/html" href="http://blogs.ugidotnet.org/PierreGreborio/archive/2008/05/20/92750.aspx" />
        <id>http://blogs.ugidotnet.org/PierreGreborio/archive/2008/05/20/92750.aspx</id>
        <published>2008-05-20T23:43:03-07:00:00</published>
        <updated>2008-05-20T23:43:03Z</updated>
        <content type="html">&lt;p&gt;Poche ore fa stavo rivedendo una 'vecchia' classe che 'simula' il concetto di map. In pratica e' una sorta di dictionary che permette di avere duplicazioni di chiave. Niente di veramente speciale, di fatto usavo una List di KeyValuePair; si pou' fare di meglio, ma qui l'accorcio :-)&lt;/p&gt;
&lt;p&gt;Per estrarre i valori data una chiave, ho usato il buon vecchio foreach che andava a riempire una lista di stringhe. In altre parole qualcosa del tipo&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;List&amp;lt;string&amp;gt; result = new List&amp;lt;string&amp;gt;();&lt;br /&gt;
foreach(KeyValuePair&amp;lt;string, string&amp;gt; parameter in parameters) {&lt;br /&gt;
  if(parameter.Key.Equals(param))&lt;br /&gt;
    result.Add(parameter.Value);&lt;br /&gt;
}&lt;br /&gt;
return result.ToArray();&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;Dato che il progetto e' migrato a FX 3.5, ho improvvisato una soluzione LINQ:&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;return parameters.FindAll(kv =&amp;gt; kv.Key.Equals(param)).Select(kv =&amp;gt; kv.Value).ToArray();&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;Devo dire che risulta decisamente piu' chiaro e compatto.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PierreGreborio/aggbug/92750.aspx" width="1" height="1" /&gt;</content>
    </entry>
    <entry>
        <title>[ROA] Contratto</title>
        <link rel="self" type="text/html" href="http://blogs.ugidotnet.org/PierreGreborio/archive/2008/05/11/92612.aspx" />
        <id>http://blogs.ugidotnet.org/PierreGreborio/archive/2008/05/11/92612.aspx</id>
        <published>2008-05-11T15:08:47-07:00:00</published>
        <updated>2008-05-11T15:09:33Z</updated>
        <content type="html">Nel precedente &lt;a href="http://blogs.ugidotnet.org/PierreGreborio/archive/2008/05/10/92606.aspx"&gt;post&lt;/a&gt; ho parlato della lacuna della definizione del contratto nel mondo ROA rispetto al mondo SOA. E' bene che faccia qualche precisazione, m&lt;font face="Arial"&gt;a prima di parlare di questo fatemi fare un escursus sul concetto di contratto e come questo si applichi oggi nel mondo SOA (Service Oriented Architecture).&lt;/font&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Se chiediamo ad un avvocato di scrivere un contratto, garantendo un certo introito :-), ci innondera' sicuramente di domande e probabilmente scrivera' 40/50 pagine di documento dove ogni singola parola ha un suo peso specifico. In sostanza la regola e', ogni aspetto non 'normato' o definito rappresenta un &lt;a target="_blank" href="http://en.wikipedia.org/wiki/Threat_model"&gt;threat&lt;/a&gt;.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;In ambito IT si tende ad essere piu' lassisti ed il tempo dedicato a definire il contratto risulta quasi sempre insufficiente. La domanda che ci dobbiamo porre inizialmente e', che cos'e' un service contract? Mi piace molto la definizione data in "&lt;a target="_blank" href="http://www.amazon.com/Principles-Service-Prentice-Service-Oriented-Computing/dp/0132344823"&gt;SOA: Principles of Service Design&lt;/a&gt;" che dice: "A service contract establishes the terms of engagement, providing technical constraints and requirements as well as any semantic information the service owner whishes to make public.".&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;In termini pratici un contratto viene rappresentato attraverso un insieme di documenti, ognuno dei quali rappresenta un aspetto del servizio. I principali sono&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;1. Definitzione  del WSDL&lt;br /&gt;
2. Definizione dello schema XML&lt;br /&gt;
3. Descrizione della WS-Policy&lt;br /&gt;
4. SLA, Service Level Agreement&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Il WSDL definisce quali funzionalita', in termini di operation e metodi, il nostro servizio espone. Lo schema XML definisce la struttura del payload fra consumer e provider. WS-Policy definisce le modalita' di accesso al servizio (es. sicurezza, crittografia, ecc.). Lo SLA definisce il livello del servizio che siamo in grado o vogliamo mantenere (es. 24x7, 99.99%).&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Se noi sviluppassimo un Web Service (con ASP.NET o WCF) seguendo scrupolosamente questa procedura potremmo garantire di avere dei servizi molto solidi e scalabili nel tempo, almeno a livello contrattuale. Purtroppo questo processo oggi non avviene praticamente mai. Il processo che usiamo solitamente e' quello di partire dal codice, applicare gli attributi necessari e fare in modo che il framework esponde i contratti per noi. Il risultato e' che abbiamo contratti molto weak e poco durevoli. I principali motivi sono:&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;1. Si e' concentrati sul codice e non sul contratto, quindi le funzionalita' che il servizio deve veramente erogare&lt;br /&gt;
2. Il contratto e' impreciso in quanto molti frameworks non supportano pienamente le restrizioni degli schemi XML e WSDL&lt;br /&gt;
3. Diventa troppo 'facile' cambiare il contratto, edit and build&lt;br /&gt;
4. In molti frameworks non vi e' alcuna validazione a runtime dello schema &lt;br /&gt;
5. I deserializzatori del payload SOAP sono molto spessi troppo flessibili&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Sebbene abbiamo un certo tipo di supporto dai tool di sviluppo per il mondo dei servizi basati su SOAP, meno evidente e' la definizione dei contratti nel mondo ROA (o REST). Sun ha pubblicato una proposta nel 2006 chiamata &lt;a target="_blank" href="https://wadl.dev.java.net/wadl20061109.pdf"&gt;WADL&lt;/a&gt;, Web Application Description Language. Dopo due anni mi sembra sia rimasta abbastanza lettera morta. L'alternativa consiste in WSDL 2.0, nella quale vi e' una buona apertura al &lt;a target="_blank" href="http://www.w3.org/TR/2006/CR-wsdl20-adjuncts-20060327/#http-binding_/"&gt;binding sul protocollo HTTP&lt;/a&gt;.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Quindi, se andiamo a stilare la stessaa lista usata per SOA in ROA, possiamo scrivere:&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;1. Definitzione  del WSDL 2.0&lt;br /&gt;
2. Definizione dello schema XML&lt;br /&gt;
3. Descrizione della policy su protocollo HTTP&lt;br /&gt;
4. SLA, Service Level Agreement&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Che manca allora? Direi una buona coperyura da parte degli strumenti di sviluppo.&lt;/font&gt;&lt;/p&gt;
 &lt;img src="http://blogs.ugidotnet.org/PierreGreborio/aggbug/92612.aspx" width="1" height="1" /&gt;</content>
    </entry>
    <entry>
        <title>ROA</title>
        <link rel="self" type="text/html" href="http://blogs.ugidotnet.org/PierreGreborio/archive/2008/05/10/92606.aspx" />
        <id>http://blogs.ugidotnet.org/PierreGreborio/archive/2008/05/10/92606.aspx</id>
        <published>2008-05-10T20:11:21-07:00:00</published>
        <updated>2008-05-11T08:26:01Z</updated>
        <content type="html">&lt;p&gt;ROA sta per Resource Oriented Architecture e si contrappone sotto molti punti di vista a SOA, cioe' Service Oriented Architecture.&lt;/p&gt;
&lt;p&gt;In realta' non c'e' un modello migliore dell'altro e so potrebbe tranquillamente affermare che un 'servizio' e' necessario per creare una 'risorsa' ed una 'risorsa' e' necessaria per fornire un 'servizio'. Ciononostante possiamo altresi' affermare che il contesto delle risorse e' decisamente predominante.&lt;/p&gt;
&lt;p&gt;Quali sono le caratteristiche di ROA:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Addressability: intesa come capacita' di identificare una risorsa addraverso uno URI ben definito &lt;/li&gt;
    &lt;li&gt;Statelessness: mancanza di supporto nativo per la gestione dello stato &lt;/li&gt;
    &lt;li&gt;Connectedness: ogni chiamata e' indipendente dalle altre &lt;/li&gt;
    &lt;li&gt;Uniform interface: verbi (GET, HEAD, POST, PUT, ecc.) uniformi per ogni risorsa &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dal mio punto di vista ROA ha molti piu' vantaggi di SOA:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Interfacce piu' chiare e facili da testare &lt;/li&gt;
    &lt;li&gt;Modello decisamente piu' conosciuto rispetto a SOAP e molte specifiche WS-* &lt;/li&gt;
    &lt;li&gt;Non ha bisogno di alcuna tecnologia particolare per consumare un servizio &lt;/li&gt;
    &lt;li&gt;Supportato da molti frameworks, come WCF &lt;/li&gt;
    &lt;li&gt;Piu' facilmente tracciabile attraverso i logs di IIS &lt;/li&gt;
    &lt;li&gt;Payload piu' decisamente leggero &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Lo svantaggio principale sta nella mancanza di strumenti per formalizzare il contratto.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PierreGreborio/aggbug/92606.aspx" width="1" height="1" /&gt;</content>
    </entry>
    <entry>
        <title>Creare un HttpContext al volo</title>
        <link rel="self" type="text/html" href="http://blogs.ugidotnet.org/PierreGreborio/archive/2008/04/30/92457.aspx" />
        <id>http://blogs.ugidotnet.org/PierreGreborio/archive/2008/04/30/92457.aspx</id>
        <published>2008-04-30T01:11:58-07:00:00</published>
        <updated>2008-04-30T01:15:32Z</updated>
        <content type="html">&lt;p&gt;In queste ultime due ore stavo prototipizzando un micro framework per implementare servizi REST based mediante delle Http handlers. Niente di eccezzionale, ma l'idea di avere qualche cosa di simile a WCF, cioe' dei metodi con una firma prolissa e molto OO, mi piace. &lt;/p&gt;
&lt;p&gt;Dopo aver trascorso un'oretta di codifica (refactoring a gogo), ho iniziato a scrivere qualche test. Per testare un Http handler ci vuole un Http context! E come lo creo? Non voglio tirar su tutta la 'baracca' ASP.NET e voglio avere un oggettino dove posso verificare il contenuto della risposta. &lt;/p&gt;
&lt;p&gt;Per creare un HttpContext ci vuole un HttpWorkerRequest. Quest'ultima e' una classe astratta dalla quale deriva SimpleWorkerRequest. Creo la mia FakeWorkerRequest con gli ingredienti minimali per il mio scopo, che ricordo essere:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Avere un HttpContext valido &lt;/li&gt;
    &lt;li&gt;Poter verificare l'output (string based) della risposta &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Con l'amico Reflector identifico in 5 minuti gli ingredienti minimali e implemento la mia classettina&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;public class FakeWorkerRequest : SimpleWorkerRequest  { &lt;br /&gt;
  public FakeWorkerRequest(string relativeUri, StringBuilder output) &lt;br /&gt;
    : base("", "", relativeUri, "", new StringWriter(output)) {  } &lt;br /&gt;
}&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;A questo punto sono pronto ad instanziare l'HttpContext che usero' per testare il mio Http Handler (REST + POX):&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;StringBuilder output = new StringBuilder(); &lt;br /&gt;
HttpContext.Current = new HttpContext(new FakeWorkerRequest("shows/23", output)); &lt;br /&gt;
&lt;br /&gt;
HttpContext.Current.Response.Write("This is a simple test"); &lt;br /&gt;
HttpContext.Current.Response.Flush(); &lt;br /&gt;
&lt;br /&gt;
Console.WriteLine(output);&lt;/font&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PierreGreborio/aggbug/92457.aspx" width="1" height="1" /&gt;</content>
    </entry>
    <entry>
        <title>Dimensione di un oggetto managed</title>
        <link rel="self" type="text/html" href="http://blogs.ugidotnet.org/PierreGreborio/archive/2008/04/22/92333.aspx" />
        <id>http://blogs.ugidotnet.org/PierreGreborio/archive/2008/04/22/92333.aspx</id>
        <published>2008-04-22T23:16:02-07:00:00</published>
        <updated>2008-04-22T23:16:02Z</updated>
        <content type="html">&lt;p&gt;Recentemente stavo lavorando su un servizio che alloca un oggetto di grandi dimensioni. La domanda che mi son posto era, si ma quanto e' grande e dove posso ottimizzare? &lt;/p&gt;
&lt;p&gt;Ho aperto Visual Studio profiler ed ho fatto partire il servizio. Dato che l'applicazione, quando parte, deve deserializzare questo oggettone, ci stava mettendo una vita (ho fatto tempo a pranzare ed era ancora li a macinare). Abbandonato il profiler di Visual Studio ed ho usato CLR profiler, niente da fare, stesso problema!&lt;/p&gt;
&lt;p&gt;L'unica soluzione che mi e' rimasta in canna e' WindDbg con le estensioni SOS. Faccio partire il processo e carico WinDbg agganciandolo al mio processo. Inizio con leggere le statistiche degli oggetti managed nello heap:&lt;/p&gt;
&lt;p&gt;!dumpheap -stat&lt;/p&gt;
&lt;p&gt;Da li vedo il mio oggetto in questione con il numero di instanze (1 per l'occasione) e la dimensione. La dimensione che vedo e' quella dell'oggetto da solo, e non include gli oggetti che contiene. Mi serve quindi ricavare l'indirizzo fisico del mio oggettone, richiamo quindi&lt;/p&gt;
&lt;p&gt;!dumpheap -mt 0x...&lt;/p&gt;
&lt;p&gt;Una volta che ho l'indirizzo fisico del mio oggetto (puntatore), basta chiamare objsize&lt;/p&gt;
&lt;p&gt;!objsize 1dd7a55c&lt;/p&gt;
&lt;p&gt;E voila', ecco la dimensione reale del mio oggetto. Ora che so quanto e' grande, vorrei sapere quale degli oggetti che referenzia consuma piu' memoria. Faccio il dump dell'oggetto:&lt;/p&gt;
&lt;p&gt;!dumpobject 1dd7a55c&lt;/p&gt;
&lt;p&gt;Ok, ho tutti gli elementi per procedere nell'ottimizzazione dell'uso della memoria.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PierreGreborio/aggbug/92333.aspx" width="1" height="1" /&gt;</content>
    </entry>
    <entry>
        <title>Professional IIS 7</title>
        <link rel="self" type="text/html" href="http://blogs.ugidotnet.org/PierreGreborio/archive/2008/04/18/92266.aspx" />
        <id>http://blogs.ugidotnet.org/PierreGreborio/archive/2008/04/18/92266.aspx</id>
        <published>2008-04-18T01:17:48-07:00:00</published>
        <updated>2008-04-18T01:17:48Z</updated>
        <content type="html">&lt;p&gt;E' uscito recentemente un nuovo libro su IIS 7, &lt;a target="_blank" href="http://www.amazon.com/Professional-IIS-7-Ken-Schaefer/dp/0470097825/ref=pd_bbs_sr_2?ie=UTF8&amp;amp;s=books&amp;amp;qid=1208506179&amp;amp;sr=8-2"&gt;Professional IIS 7&lt;/a&gt;, di cui ho fatto da technical editor. Lo considero un libro di buona qualita' (non posso dire eccellente!) che copre molto bene la parte architetturale, di deployment e management. E' un libro che consiglio anche agli sviluppatori in quanto e' sempre necessario conoscere dove va a finire il nostro codice :-)&lt;/p&gt;
&lt;p&gt;Buona lettura a tutti...&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PierreGreborio/aggbug/92266.aspx" width="1" height="1" /&gt;</content>
    </entry>
    <entry>
        <title>Edge caching</title>
        <link rel="self" type="text/html" href="http://blogs.ugidotnet.org/PierreGreborio/archive/2008/04/15/92219.aspx" />
        <id>http://blogs.ugidotnet.org/PierreGreborio/archive/2008/04/15/92219.aspx</id>
        <published>2008-04-15T10:07:36-07:00:00</published>
        <updated>2008-04-15T10:07:36Z</updated>
        <content type="html">&lt;p&gt;&lt;font face="Arial"&gt;Il tema dell'edge caching e' un tema estremamente intrigante e sotto molti punti di vista complesso. Si parte dalla soluzione null cache, dove in pratica non si mette nulla in cache, per proseguire alla cache uniformemente distribuita, in stile ASP.NET per intenderci, fino ad arrivare alle collaborative edge cache networks. &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Qual'e' la soluzione ideale? Tutte e nessuna. Dipende totalmente dal contesto, ed in particolare dalla dinamicita' delle modifiche dei dati, dalla loro dimensione e quantita', dal modo di essere consumati, dal livello di sicurezza, dalla scalabilita', dalla topologia di rete del sistema di distribuzione, dall'uniformita' di distribuzione dei dati sull'edge, consistenza e delays.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;1. Dinamicita' di modifica&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Vi e' una notevole differenza fra dati che variano in tempo reale e dati che cambiano a scadenze prolungate (una volta al giorno o una volta alla settimana). I primi si adattano poco ad essere messi in cache, i secondi decisamente. Mi pare solamente una basilare regola i buon senso :-)&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;2. Dimensione e quantita'&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Immaginiamo di avere un catalogo prodotti. Mettere il catalogo in cache porta sicuramente dei vantaggi, ma dipende dalla dimensione dei catalogo. Immaginate di mettere tutto il catalogo di Amazon in cache su ogni singolo server! Non ha senso ovviamente. Si puo' quindi ragionare in termini di partizionamento dei dati frammentandoli con algoritmi statistici. Ad esempio caricare in memoria solamente i piu' venduti/consultati e leggere on demand i meno venduti/consultati. &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;3. Modalita' di consumo&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Se abbiamo una applicazione ASP.NET sicuramente l'opzione memoria e' difficilmente sostituibile, ma se abbiamo uno smart client perche' non pensare ad un file precompilato? Sicuramente una chiamata HTTP GET su IIS sara' decisamente piu' performante e scalabile di qualsiasi web service.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;4. Livello di sicurezza&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Trattare la lista dei codice fiscale piuttosto che i risultati delle partite di calcio e' molto diverso. Si possobo adottare algoritmi di crittografia e/ firma digitale. Da questo punto di vista l'erogazione attragerso una HTTP GET piuttosto che un web service o la memoria fa poca differenza.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;5. Scalabilita'&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Immaginate di avere il vostro catalogo prodotti che cambia una volta al giorno ed e' salvato nel DB. Avere 1000 o piu' server che richiedono la nuova lista nello stesso momento potrebbe afere un impatto negativo nel DB. Ecco allora che produrre con un agent la cache su file e renderal disponibile ai fari edge via HTTP GET os network share potrebbe risolvere il problema.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;6. Topologia di rete del sistema di distribuzione&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;In alcuni ambienti distribuiti l'edge non ha accesso diretto alla fonte informativa. Ecco allora che si possono introdurre delle cache intermedia, o dei beacon points in stile collaborative edge cache. In pratica si suddivide la rete in rings, all'interno dei quali ci sono dei server privilegiati (beacon points) che fanno da 'ponte'.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;7. Uniformita' di distribuzione dei dati sull'edge&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;Non sempre abbiamo bisogno di tutti gli stessi dati su tutti i server dell'edge. Ecco quindi che dobbiamo razionalizzare i dati e decidere a design time come definire le regole di partizionamento in modo da distribuire partizioni differenti su server differenti. &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;8 Consistenza e delays&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;In sistemi distribuiti e' perfettamente accettabile vi siano dei delay, lo e' meno la mancanza di consistenza. Ad esempio e' accettabile che quando si cambi un prodotto nel catalogo questa modifica arrivi sui server anche con minuti o ore di ritardo, ma e' fondamentale che tutti i server propongano le stesse modifiche in modo consistente. Immaginate due server in NLB che prima propongono 10 euro e al secondo click 11 euro! La soluzione consiste nella collaborazione fra i server e nel versioning dei dati.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;In questa lista ho ovviamente guardato al problema solamente in modo superficiale e ogni singolo aspetto andrebbe analizzato in profondita'. Diciamo che e' uno spunto di pensiero :-)&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PierreGreborio/aggbug/92219.aspx" width="1" height="1" /&gt;</content>
    </entry>
    <entry>
        <title>String replace</title>
        <link rel="self" type="text/html" href="http://blogs.ugidotnet.org/PierreGreborio/archive/2008/04/02/92025.aspx" />
        <id>http://blogs.ugidotnet.org/PierreGreborio/archive/2008/04/02/92025.aspx</id>
        <published>2008-04-02T09:37:56-07:00:00</published>
        <updated>2008-04-02T09:37:56Z</updated>
        <content type="html">&lt;p&gt;Da 4 mesi a questa parte sto scrivendo un nuovo servizio che fa pesante uso di manipolazioni di stringhe. Parlo di replace, wrod braking, stemming, ecc. ecc.&lt;/p&gt;
&lt;p&gt;Questa mattina mi son letto un interessante post sulle prestazioni delle varie funzioni Replace disponibili nel framework: &lt;a target="_blank" href="http://blogs.msdn.com/debuggingtoolbox/archive/2008/04/02/comparing-regex-replace-string-replace-and-stringbuilder-replace-which-has-better-performance.aspx"&gt;Comparing RegEx.Replace, String.Replace and StringBuilder.Replace – Which has better performance?&lt;/a&gt; Il post mi pare un pochetto incompleto in quanto non da riferimenti sull'uso delle risorse, in particolare della memoria. Nell'analisi delle prestazioni e' infatti fondamentale verificare sia il tempo che il consumo della memoria.&lt;/p&gt;
&lt;p&gt;Abbandonato il post torno ai miei compiti quotidiani. Una delle funzioni che maggiormente uso, e' il multi string replace, cioe' devo sostituire piu' stringhe contemporaneamente. Ovviamente mi sono basato sullo strategy pattern in quanto probabilmente un domani trovero' un algoritmo piu' efficiente. La prima strategia di base alla quale mi sono affidato e' di evocare String.Replace per ogni sostituzione. Dato che la soluzione non mi piaceva in quanto prevede di dover fare N scan per ogni stringa da sostituire ho iniziato ad investigare alternative. Una di queste e' sicuramente basata sull'algoritmo di &lt;a target="_blank" href="http://en.wikipedia.org/wiki/Aho-Corasick"&gt;Aho-Corasick&lt;/a&gt; il quale viene solitamente utilizzato per il multi-string matching.&lt;/p&gt;
&lt;p&gt;Non ho ancora fatto misurazioni di performance, ma se avete dei suggerimenti su alternative lasciatemi un messaggio. Molte teste sono meglio di una :-)&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PierreGreborio/aggbug/92025.aspx" width="1" height="1" /&gt;</content>
    </entry>
    <entry>
        <title>Servizio al cliente</title>
        <link rel="self" type="text/html" href="http://blogs.ugidotnet.org/PierreGreborio/archive/2008/03/26/91877.aspx" />
        <id>http://blogs.ugidotnet.org/PierreGreborio/archive/2008/03/26/91877.aspx</id>
        <published>2008-03-26T09:57:24-07:00:00</published>
        <updated>2008-03-26T09:57:24Z</updated>
        <content type="html">&lt;p&gt;Ho sottoscritto l'abbonamento a &lt;a target="_blank" href="http://www.netflix.com"&gt;NetFlix&lt;/a&gt; un annetto fa. Per capirci funziona come un normale video noleggio solo che va tutto per posta. Chiedi un film, te lo mandano (in un giorno ce l'hai a casa), quando hai finito di vederlo lo lasci nella cassetta della posta (con la bandierina alzata) e ritorna indietro. Prosegue lo stesso processo a ciclo continuo.&lt;/p&gt;
&lt;p&gt;Lunedi' dovevano partire i nuovi DVD che avevo richiesto e per un disguito non sono partiti. Ecco quindi che trovo un'email:&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;table cellspacing="0" cellpadding="0" border="0"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td style="BORDER-RIGHT: #f0f0f0; PADDING-RIGHT: 0in; BORDER-TOP: #f0f0f0; PADDING-LEFT: 0in; PADDING-BOTTOM: 0in; BORDER-LEFT: #f0f0f0; PADDING-TOP: 0in; BORDER-BOTTOM: #f0f0f0; BACKGROUND-COLOR: transparent"&gt;
            &lt;div style="MARGIN: 0in 0in 0pt"&gt;&lt;strong&gt;&lt;span style="FONT-SIZE: 13.5pt; COLOR: black"&gt;We're Sorry Your DVD Was Delayed&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="BORDER-RIGHT: #f0f0f0; PADDING-RIGHT: 0in; BORDER-TOP: #f0f0f0; PADDING-LEFT: 0in; PADDING-BOTTOM: 0in; BORDER-LEFT: #f0f0f0; PADDING-TOP: 0in; BORDER-BOTTOM: #f0f0f0; BACKGROUND-COLOR: transparent"&gt;
            &lt;div style="MARGIN: 0in 0in 0pt"&gt;&lt;img id="_x0000_i1025" height="12" width="1" alt="" src="http://cdn.nflximg.com/us/email/1px_transparent.gif" /&gt;&lt;/div&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td style="BORDER-RIGHT: #f0f0f0; PADDING-RIGHT: 0in; BORDER-TOP: #f0f0f0; PADDING-LEFT: 0in; PADDING-BOTTOM: 0in; BORDER-LEFT: #f0f0f0; PADDING-TOP: 0in; BORDER-BOTTOM: #f0f0f0; BACKGROUND-COLOR: transparent"&gt;
            &lt;div style="MARGIN: 0in 0in 12pt"&gt;&lt;span style="FONT-SIZE: 10pt"&gt;Dear Pierre,&lt;br /&gt;
            &lt;br /&gt;
            As you may have heard, our shipping system was unexpectedly down for most of Monday. We should have shipped your DVDs but were unable to. Your DVDs were shipped today, Tuesday, March 25th, instead. &lt;br /&gt;
            &lt;br /&gt;
            We are sorry for any inconvenience this has caused. We will issue a 5% credit to your account in the next few days. You don't need to do anything. The credit will be automatically applied to your next billing statement.&lt;br /&gt;
            &lt;br /&gt;
            Again, we apologize for the delay and thank you for your understanding. If you need further assistance, please call us at 1 (888) 638-3549.&lt;br /&gt;
            &lt;br /&gt;
            -The Netflix Team&lt;br /&gt;
            &lt;br /&gt;
            &lt;img id="_x0000_i1026" height="1" width="400" alt="" src="http://cdn.nflximg.com/us/email/1px_transparent.gif" /&gt;&lt;/span&gt;&lt;/div&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Non avevo chiesto nulla!! Chiedono scusa, mi rimborsano il 5% e mi inviano il DVD. Molte aziende dovrebbero imparare...&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PierreGreborio/aggbug/91877.aspx" width="1" height="1" /&gt;</content>
    </entry>
</feed>