UGbLog di Pierre Greborio Pensieri dal mondo managed... http://blogs.ugidotnet.org/PierreGreborio/Default.aspx Pierre Greborio http://blogs.ugidotnet.org/PierreGreborio/Default.aspx Subtext 2020-05-16T13:43:02Z Windows Phone SDK RTM is here http://blogs.ugidotnet.org/PierreGreborio/archive/2010/09/16/windows-phone-sdk-rtm-is-here.aspx 2010-09-16T06:27:01Z 2010-09-16T06:27:28Z <p>E' ufficiale, Windows Phone SDK RTM e' disponibile a tutti gratuitamente, <font face=""><a href="http://windowsteamblog.com/windows_phone/b/wpdev/archive/2010/09/16/windows-phone-developer-tools-are-final.aspx">http://windowsteamblog.com/windows_phone/b/wpdev/archive/2010/09/16/windows-phone-developer-tools-are-final.aspx</a>. </font></p> <p>Insieme all'SDK, tovrerete delle aggiunte come:</p> <ul> <li>Mobile Advertising SDK, <font face=""><a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=b0f00afc-9709-4cc2-ba2c-57728db6cbd6">http://www.microsoft.com/downloads/en/details.aspx?FamilyID=b0f00afc-9709-4cc2-ba2c-57728db6cbd6</a></font></li> <li>Controlli addizionali a complemento di quelli ufficiali dell'SDK, <font face=""><a href="http://silverlight.codeplex.com/">http://silverlight.codeplex.com/</a></font></li> </ul> <p>Buona programmazione a tutti.</p><img src="/PierreGreborio/aggbug/99216.aspx" width="1" height="1" /> Keyboard http://blogs.ugidotnet.org/PierreGreborio/archive/2010/09/13/keyboard.aspx 2010-09-13T21:31:53Z 2010-09-13T21:31:53Z <p><font face="">La tastiera e' lo strumento di input principe che ha caratterizzato il PC sin da suo esordio sul mercato. E' quella componente del PC che difficilmente riusciamo a fare a meno. Con l'avvento dell'iPhone molti bloggers e giornalisti hanno iniziato ad immaginare che forse era venuto il momento di fare a meno della tastiera classica, quella fisica con i tasti da premere. </font></p> <p><font face="">Sebbene una tale valutazione sia criticabile, un fondo di verita' c'e'. Per anni la tastiera ha subito pochissimi miglioramenti, a parte qualche evoluzione ergonomica e di colori. In contrapposizione alla tastiera fisica e' arrivata la tastiera virtuale, la quale puo' essere categorizzata in on-screen oppure proiettata. Ricordo che la tastiera su schermo non e' stata inventata da Apple, ma dall'AT&amp;T nei primi anni 90 (Patent <a href="http://v3.espacenet.com/publicationDetails/biblio?CC=EP&amp;NR=546704&amp;KC=&amp;FT=E">546704</a>). Il merito di Apple e' stato quello di renderla mainstream! Sebbene Steve Jobs, in una delle sue innumerevoli sortite marketing, decreto' la fine della tastiera fisica, cio' non successe. Il motivo fondamentale e' che la tastiera fisica ha delle caratteristiche che la tastiera virtuale non riesce a soddisfare.</font></p> <p><font face="">Le piu' importanti sono:</font></p> <p><font face="">1. Tatto. La mano 'sente' i tasti fisicamente e questo permette di digitare senza guardare i tasti, con un incremento di battiture per minuto decisamente notevole...credo che il Guinness dei primati sia 150 wpm!</font></p> <p><font face="">2. Ergonomicita'. Le testiere moderne sono decisamente ergonomiche e riducono notevolmente problemi fisici parecchio comuni in passato.</font></p> <p><font face="">Di contro, il problema principale della tastiera fisica e' la sua staticita'. I simboli sono definiti a priori e cambiarli non e' praticabile. Non e' solo un problema di layout internazionale, ma anche di adattabilita' al contesto applicativo. Questa limitazione e' decisamente uno degli elementi fondamentali a favore della tastiera virtuale, oltre allo spazio.</font></p> <p><font face="">La soluzione e' quindi passare alla tastiera virtuale? No! La tastiera virtuale e' in un certo senso l'opposto di quella fisica, risolve il problema dei simboli ma crea il problema di ergonomicita' e tatto, rendendola inefficace per la digitazione massiva del testo (30 wpm). </font></p> <p><font face="">Sebbene questi due mondi sembrino contrapposti, in realta' si stanno ricongiungendo. Da una lato la tastiera sta superando il problema dei simboli, con l'introduzione della <a href="http://www.engadget.com/2010/08/12/microsoft-adaptive-keyboard-prototype-debuts-at-center-of-uist-s/">tastiera adattiva</a>, dall'altro si trovano <a href="http://www.swypeinc.com/product.html">gestures</a> che rendono piu' efficiente la digitazione su tastiera virtuale.</font></p> <p><font face="">In conclusione, il ruolo della tastiera fisica rimane sempre fondamentale per la sua incredibile usabilita' nel contesto della scrivania. Ad accompagnarla, c'e' la testiera virtuale, sempre piu' efficiente e applicabile al contesto fuori dalla scrivania.</font></p><img src="/PierreGreborio/aggbug/99203.aspx" width="1" height="1" /> CAPTCHA http://blogs.ugidotnet.org/PierreGreborio/archive/2010/09/13/captcha.aspx 2010-09-13T00:54:11Z 2010-09-13T00:54:43Z <p>CAPTCHA (Completely Automated Public Turing test to tell Computers and Humans Apart) e' una tecnica sviluppata qualche anno fa per evitare che un automa possa fare le veci di un umano per compiere operazioni in modo massivo. Viene molto usato nei sistemi di registrazione per evitare che qualche automa si metta a creare milioni di accounts.</p> <p>Come tutte le storie di guardie e ladri, a seguito di queste tecniche si sono sviluppate tecnologie basate sul riconoscimento dei caratteri (OCR) per cercare di superare questo limite. La risposta e' stata quindi quella di distorcere ulteriormente i caratteri in modo da rendere molto piu' difficile il riconoscimento. Peccato che cosi' facendo anche  l'umano sia sia trovato in grande difficolta'. </p> <p>Come soluzione (o se preferite pezza), alcuni siti hanno aggiunto un pulsante che permette di sentire l'audio del testo da inserire. Sebbene questo aiuti, in realta' presenta diverse limitazioni, fra cui l'internazionalizzazione.</p> <p>Recentemente ho trovato una soluzione interessante, risolvere un'operazione algebrica. Ad esempio si chiede all'utente quale e' il risultato di 1 + 2. Se estendiamo il concetto a soluzioni di problemi di matematica o logica, possiamo intravedere un ampissimo spettro di solutioni. Vedo diversi vantaggi immediati in una soluzione di questo tipo:</p> <ol> <li>La lettura, anche con TTS (Text To Speech), e' immediata</li> <li>Non ci sono problemi di localizzazione</li> <li>La complessita' del problema puo' variare nel tempo</li> <li>E' formativo! Un po' di matematica e logica non fa mai male</li> </ol><img src="/PierreGreborio/aggbug/99196.aspx" width="1" height="1" /> Natural user Interfaces http://blogs.ugidotnet.org/PierreGreborio/archive/2010/08/16/natural-user-interfaces.aspx 2010-08-16T08:30:29Z 2010-08-16T08:30:29Z <font face="">Natural user Interfaces, NUI (<a target="_blank" href="http://en.wikipedia.org/wiki/Natural_User_Interface">http://en.wikipedia.org/wiki/Natural_User_Interface</a>), e' un argomento che attrae attenzione di ricercatori, designer e programmatori da quando <p>e' nato il computer. Molto lavoro e' stato fatto e possiamo dire che gia' oggi si intravedono grandi risultati, ma siamo ancora molto lontano dall'obiettivo finale. </p> <p>Uno dei principi fondamentali delle NUI consiste nello sfruttare tutte le capacita' umane in base al contesto. Per capacita' umane intendo quelle capaci di interagire con </p> <p>un dispositivo, qualunque esso sia. Ad esempio:</p> <p>1. Tastiera<br /> 2. Mouse<br /> 3. Penna<br /> 4. Multi touch<br /> 5. Voce<br /> 6. Movimenti spaziali<br /> 7. Pensiero</p> <p>Avere a disposizione dispositivi capaci di sfruttare le suddette capacita', in una scala da 1 a 10 direi che siamo a livello 2 nella commercializzazione ed a livello 6 </p> <p>nella ricerca. La ricerca pero' non si sofferma solamente ai dispositivi, va oltre definendo l'iterazione dei suddetti dispositivi con l'uomo nei vari contesti sociali e </p> <p>storici. Ad esempio la psicologia cognitiva gioca un grande ruolo in questa ricerca.</p> <p>Per dare una assaggio di quello di cui sto parlando, rimando a questo video, <a href="mms://msvcatalog-1.wmod.llnwd.net/a2249/e1/ft/share3/dd69/0/Productivity_Future_Vision.wmv">mms://msvcatalog-1.wmod.llnwd.net/a2249/e1/ft/share3/dd69/0/Productivity_Future_Vision.wmv</a>. </p> </font><img src="/PierreGreborio/aggbug/99072.aspx" width="1" height="1" /> Si volta pagina http://blogs.ugidotnet.org/PierreGreborio/archive/2010/08/03/si-volta-pagina.aspx 2010-08-03T14:39:59Z 2010-08-03T14:40:12Z Questo sarebbe il primo post del 2010 e dato che nel 2009 ne ho scritti ben 8, devo darmi da fare prima di abbassare il mio record negativo :-)<br /> <br /> L'inizio del 2009 e' stato parecchio pesante, a maggio abbiamo shippato KIN (http://www.facebook.com/KIN). La parte sulla quale ho lavorato io non aveva nulla a che fare con il cellulare, io mi occupavo del sito Silverlight chiamato KIN Studio (http://studio.vz.kin.com). Dopo aver lavorato in media 12 ore al giorno per 1 anno e mezzo, inclusi parecchi week-end, a giugno mi sono preso un mese di vacanza nella bellissima Calabria :-)<br /> <br /> Durante il mio soggiorno vengo a sapere che KIN e' dato per defunto, da un lato perche' le vendite erano basse e dall'altro per focalizzarsi su Windows Phone 7 (http://www.windowsphone7.com/). Quando ho letto la notizia ho lanciato qualche imprecazione, ma poi ho dimenticato tutto con un bel bagno al mare. Non c'e' momento migliore per essere in vacanza!!<br /> <br /> Che si fa ora? Il nostro nuovo charter e' sviluppare applicazioni per Windows Phone 7. La buona notizia e' che continuero' a sviluppare con Silverlight, la brutta e' che mi dovro' dimenticare di avere un giga di memoria a disposizione ed uno schermo da 24 pollici. <br /> <br /> Sinceramente mi sento molto ottimista con Windows Phone 7. C'e' molto lavoro e la competizione, aka iPhone, Android, Nokia e RIM e' ferocissima, ma stiamo veramente lavorando sodo per cambiare le cose. Sono pronto as commettere che in 2 anni ci riprendiamo il 20% del mercato :-)<img src="/PierreGreborio/aggbug/99034.aspx" width="1" height="1" /> Sistemi di logging http://blogs.ugidotnet.org/PierreGreborio/archive/2009/12/14/sistemi-di-logging.aspx 2009-12-14T07:45:12Z 2009-12-14T07:45:20Z <p>La mia carriera e' iniziato con lo sviluppo client side, dopo pochi anni sono passato al server side e da circa 1 anno e mezzo sono nei cloud services. E' incredibile vedere quante differenti problematiche si debbano affrontare.</p> <p>Recentemente abbiamo discusso del sistema di logging. Non tanto in termini di quale tecnologia quali .NET logging, NLog, ETW, o altro, quanto le problematiche da superare nel cloud. Uno dei probemi maggiori e la quantita'. Pensate a Facebook (<font face=""><a href="http://idleprocess.wordpress.com/2009/11/24/presentation-summary-high-performance-at-massive-scale-lessons-learned-at-facebook/">http://idleprocess.wordpress.com/2009/11/24/presentation-summary-high-performance-at-massive-scale-lessons-learned-at-facebook/</a></font>) il quale processa 25TB di messaggi al giorno. Solo nel nostro ambiente di test, con circa 300 utenti, generiamo circa 25MB di messaggi al minuto. </p> <p>Nella discussione abbiamo caratterizzato la problematica in quasti termini:</p> <ul> <li>Minimizzare l'impatto sui server di produzione, bufferizzaddo i messaggi di log in memoria e scrivedoli su disco a blocchi</li> <li>Minimizzare l'impatto sui dischi usando un sistema di rotazione dei files</li> <li>Minimizzare l'impatto sulla rete spostando log files non troppo grossi per una successiva processazione</li> <li>Non filtrare per severita' a priori. Il logging serve a capire che cosa e' successo port-mortem, se si filtra si perdono informazioni preziose</li> <li>Arricchire i protocolli di comunicazione fra componenti in modo da permettere la tracciabilita' (correlazione)</li> <li>Accettare perdite di dati (logs)</li> </ul> <p>Nel nostro team usaimo un sistema proprietario (MS) consolidato da altri servizi. Detto cio', credo che siamo ancora abbastanza lontano da una soluzione generalizzata per i cloud services.</p> <p> </p> <p> </p> <p> </p><img src="/PierreGreborio/aggbug/97719.aspx" width="1" height="1" /> Nuovo attacco alla logica di rinegoziazione TLS http://blogs.ugidotnet.org/PierreGreborio/archive/2009/11/04/nuovo-attacco-alla-logica-di-rinegoziazione-tls.aspx 2009-11-04T22:55:10Z 2009-11-04T22:55:10Z <p>E' notizia di oggi, <font face=""><a href="http://extendedsubset.com/?p=8">http://extendedsubset.com/?p=8</a>, che sia stata trovata una falla nella rinegoziazione TLS.</font></p> <p>Per sommi capi, l'hacker puo' avviare una negoziazione TLS con il server and successivamente fare da proxy alla negoziazione del client attraverso lo 'stesso' canale. Questo permette all'hacker di iniettare del contenuto arbitrario all'inizio dei dati spediti dal client TLS al server TLS. I server trattera' questi dati come se provenissero dal client. Una volta che l'handshake si e' concluso, l'hacker non puo' fare piu' nulla di utile.</p> <p>L'hacker non sara' in grado di vedere il contenuto (plaintext) scambiato con il server, ma puo' comunque:</p> <ul> <li>Mandare comandi che vengono rispediti al client, ad esempio comandi di autenticazione (incluso quello basato su certificati)</li> <li>Potenzialmente accedere ai dati spediti dal client usando i comandi spediti al punto precedente che implicano l'invio di questi ad un server terzo</li> </ul> <p>La cosa sembra parecchio seria e riproducibile. Non ci sono al momento fix disponibili.<span style="FONT-FAMILY: &quot;Times New Roman&quot;, &quot;serif&quot;; FONT-SIZE: 11.5pt; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA" /></p> <p><br style="mso-special-character: line-break" /> </p><img src="/PierreGreborio/aggbug/97448.aspx" width="1" height="1" /> Storage nel cloud: Partizionamento http://blogs.ugidotnet.org/PierreGreborio/archive/2009/06/01/storage-nel-cloud-partizionamento.aspx 2009-06-01T15:18:10Z 2009-06-01T15:20:34Z <p>Mi sono assentato per in certo periodo in quanto aspettavo un buon momento per poter parlare di SDS (SQL Data Services). Purtroppo, non ne posso ancora parlare e quindi mi invento un'altro argomento, comunque fondamentale.</p> <p>Una delle caratteristiche peculiari dello storage nel cloud e' quella di poter scalare, potenzialmente scalare indefinitivamente. Fino a qualche anno fa, scalare il database significava aggiungere dischi, e se la potenza di calcolo non era sufficiente, aggiungere nodi al cluster. Non vi e' dubbio che scalare con un cluster, oltre ad incrementare i costi esponenzialmente, presenta comunque un limite fisico oltre al quale non si puo' crescere.</p> <p>Google, sin dalla sua prima comparsa, ha introdotto il concetto di scalabilita' usando un hardware di basso costo. SDS, cosi' come altre soluzioni, stanno cavalcando la stessa idea. Ma come fanno a scalare un database linearmente mantenendo i costi accettabili. </p> <p>La soluzione si basa su due aspetti importanti:</p> <ul> <li>Partizionamento dei dati</li> <li>Replica</li> </ul> <p>Immaginiamo che un singolo data server (SQL Server) sia in grado di gestire 10GB di dati. Bene, se dovete gestire 25GB di dati vi serviranno 3 data server e farete in modo di spalmare i dati fra i tre server, possibilmente in modo uniforme.</p> <p>Avere un singolo server, nodo, ci espone di fronte ad un singolo punto di fallimento. Ecco che quindi entra in gioco la replica. In altre parole i dati potranno essere replicati su altri server in modo che se uno di questi fallisce, l'altro compensa.</p> <p>Questa semplice tecnica permette servizi come Microsoft SDS, Amazon Simple DB ed altri, di poter fornire il servizio del database a basso costo e con grande livello di affidabilita'. Nel caso particolare di SDS, Microsoft garantisce 3 copie dei dati per ogni partizione.</p> <p>Per ora mi fermo qui, in un prossimo futuro entrero' meglio nei dettagli del partizionamento in quanto ha un impatto diretto su come si scrivono le applicazioni.</p><img src="/PierreGreborio/aggbug/96327.aspx" width="1" height="1" /> Storage nel cloud: latenza, BEB http://blogs.ugidotnet.org/PierreGreborio/archive/2009/03/12/storage-nel-cloud-latenza-beb.aspx 2009-03-12T15:11:59Z 2009-03-12T15:11:59Z <p>Nel <a href="http://blogs.ugidotnet.org/PierreGreborio/archive/2009/03/09/storage-nel-cloud-latenza.aspx">post </a>dedicato alla latenza, ho illustrato una delle tecniche per mitigare il piu' possibile i problemi legati al timeout. La tecnica si basa sostanzialmente sul riprovare. </p> <p>L'algoritmo che ho implementato, NRetryPolicy, e' molto primitivo e presenta parecchie imperfezioni, oltre a non risolvere il problema e potenzialmente peggiorarlo. Il lettore attento infatti si sara' accorto che se riproviamo ad intervalli fissi potremmo avere un effetto a valanga generando, involontariamente, un attacco di DOS (Denial Of Service) al servizio stesso. Come?</p> <p>Immaginiamo di avere un carico costante di chiamate di 100 RPS. Ad un certo punto il 20% di queste vanno in timeout. Queste riproveranno dopo un certo ammontare, che avete definito voi, di tempo. Scattato questo intervallo il servizio dovra' supportare il 20% in piu' di richieste, quindi 120 RPS. La probabilita' che queste vadano ancora in timeout aumenta, e quindi si ripropone il problema al prossimo intervallo. Immaginiamo ora che 40 di queste richieste siano andate in timeout. Al prossimo giro 140 RPS. Avento un limite di tentativi, diciamo 3, non dovremmo superare 160 RPS considerando un errore (timeout) costante del 20%. </p> <p>Come risolvere il problema? Cambiando il pattern dei tentativi, passando da un sistema costante e statico ad un sistema casuale. Essendo un problema molto comune, anche nelle telecomunicazioni e nelle reti, ci appoggeremo ad un algoritmo ben conosciuto, denominato Binary Exponential Backoff.</p> <p>L'algoritmo e' semplice, riprova randomicamente sulla base di un intervallo esponenziale (2<sup>n</sup> - 1). Immaginando che l'unita' di intervallo (delta backoff) sia 1 secondo, al primo fallimento riprova subito, al secondo un tempo random incluso fra 0 e 1 secondo, la seconda volta un tempo random fra 0 e 3 secondi, la terza volta un tempo rando fra 0 e 7 secondi e cosi' via.</p> <p>L'implementazione e' abbastanza triviale:</p> <p> </p> <p><font face="Courier New">public class ExponentialNRetryPolicy : RetryPolicy<br /> {<br />     int numberOfRetries;<br />     TimeSpan minBackoff;<br />     TimeSpan maxBackoff;<br />     TimeSpan deltaBackoff;<br />     private readonly Random Random = new Random();</font></p> <p><font face="Courier New">    /// &lt;summary&gt;<br />     /// Policy that retries a specified number of times with a randomized exponential backoff scheme<br />     /// &lt;/summary&gt;<br />     /// &lt;param name="numberOfRetries"&gt;The number of times to retry. Should be a non-negative number.&lt;/param&gt;<br />     /// &lt;param name="deltaBackoff"&gt;The multiplier in the exponential backoff scheme&lt;/param&gt;<br />     /// &lt;returns&gt;&lt;/returns&gt;<br />     /// &lt;remarks&gt;For this retry policy, the minimum amount of milliseconds between retries is given by the <br />     /// StandardMinBackoff constant, and the maximum backoff is predefined by the StandardMaxBackoff constant. <br />     /// Otherwise, the backoff is calculated as random(2^currentRetry) * deltaBackoff.&lt;/remarks&gt;<br />     public ExponentialNRetryPolicy(int numberOfRetries, TimeSpan deltaBackoff)<br />         : this (numberOfRetries, TimeSpan.FromMilliseconds(100), TimeSpan.FromSeconds(30), deltaBackoff)<br />     {            <br />     }</font></p> <p><font face="Courier New">    /// &lt;summary&gt;<br />     /// Policy that retries a specified number of times with a randomized exponential backoff scheme<br />     /// &lt;/summary&gt;<br />     /// &lt;param name="numberOfRetries"&gt;The number of times to retry. Should be a non-negative number&lt;/param&gt;<br />     /// &lt;param name="deltaBackoff"&gt;The multiplier in the exponential backoff scheme&lt;/param&gt;<br />     /// &lt;param name="minBackoff"&gt;The minimum backoff interval&lt;/param&gt;<br />     /// &lt;param name="maxBackoff"&gt;The maximum backoff interval&lt;/param&gt;<br />     /// &lt;returns&gt;&lt;/returns&gt;<br />     /// &lt;remarks&gt;For this retry policy, the minimum amount of milliseconds between retries is given by the <br />     /// minBackoff parameter, and the maximum backoff is predefined by the maxBackoff parameter. <br />     /// Otherwise, the backoff is calculated as random(2^currentRetry) * deltaBackoff.&lt;/remarks&gt;<br />     public ExponentialNRetryPolicy(int numberOfRetries, TimeSpan minBackoff, TimeSpan maxBackoff, TimeSpan deltaBackoff)<br />     {<br />         if (minBackoff &gt; maxBackoff)<br />         {<br />             throw new ArgumentException("The minimum backoff must not be larger than the maximum backoff period.");<br />         }<br />         if (minBackoff &lt; TimeSpan.Zero)<br />         {<br />             throw new ArgumentException("The minimum backoff period must not be negative.");<br />         }</font></p> <p><font face="Courier New">        this.numberOfRetries = numberOfRetries;<br />         this.minBackoff = minBackoff;<br />         this.maxBackoff = maxBackoff;<br />         this.deltaBackoff = deltaBackoff;<br />     }</font></p> <p><font face="Courier New">    public override void Retry(Action action)<br />     {<br />         int totalNumberOfRetries = numberOfRetries;<br />         int retryCount = numberOfRetries;<br />         TimeSpan backoff;</font></p> <p><font face="Courier New">        do<br />         {<br />             try<br />             {<br />                 action();<br />                 break;<br />             }<br />             catch (RetryException e)<br />             {<br />                 if (retryCount == 0)<br />                 {<br />                     throw e.InnerException;<br />                 }<br />                 backoff = CalculateCurrentBackoff(minBackoff, maxBackoff, deltaBackoff, totalNumberOfRetries - retryCount);<br />                 if (backoff &gt; TimeSpan.Zero)<br />                 {<br />                     Thread.Sleep(backoff);<br />                 }<br />             }<br />         }<br />         while (retryCount-- &gt; 0);<br />     }</font></p> <p><font face="Courier New">    private TimeSpan CalculateCurrentBackoff(TimeSpan minBackoff, TimeSpan maxBackoff, TimeSpan deltaBackoff, int curRetry)<br />     {<br />         long backoff;</font></p> <p><font face="Courier New">        if (curRetry &gt; 30)<br />         {<br />             backoff = maxBackoff.Ticks;<br />         }<br />         else<br />         {<br />             try<br />             {<br />                 checked<br />                 {<br />                     // only randomize the multiplier here <br />                     // it would be as correct to randomize the whole backoff result<br />                     backoff = Random.Next((1 &lt;&lt; curRetry) + 1);<br />                     backoff *= deltaBackoff.Ticks;<br />                     backoff += minBackoff.Ticks;<br />                 }<br />             }<br />             catch (OverflowException)<br />             {<br />                 backoff = maxBackoff.Ticks;<br />             }<br />             if (backoff &gt; maxBackoff.Ticks)<br />             {<br />                 backoff = maxBackoff.Ticks;<br />             }<br />         }<br />         return TimeSpan.FromTicks(backoff);<br />     }<br /> }</font></p> <p> </p> <p> </p> <p>E con questo credo che abbiamo concluso l'argomento di come limitare gli effetti indesiderati della latenza.</p><img src="/PierreGreborio/aggbug/95688.aspx" width="1" height="1" /> Storage nel cloud: le soluzioni in casa Microsoft http://blogs.ugidotnet.org/PierreGreborio/archive/2009/03/10/storage-nel-cloud-le-soluzioni-in-casa-microsoft.aspx 2009-03-10T16:48:15Z 2009-03-10T16:48:15Z <p>Nel primo <a href="http://blogs.ugidotnet.org/PierreGreborio/archive/2009/03/08/storage-nel-cloud.aspx">post</a> dedicato all'argomento, ho elencato due servizi che verranno forniti da Microsoft nei prossimi mesi. Si tratta di Windows Azure Storage e SQL Server Data services (SSDS).</p> <p>Che differenza c'e' fra questi servizi? Detto che saranno tutti in hosting presso i datacenter di Microsoft, possiamo dire che Windowas Azure Storage fornira' lo storage per blobs, queue e tables (non relazionali), mentre SSDS un database relazionale.</p> <p>Chi ha avuto modo di guardare a SSDS in passato, si sara' reso conto che di relazionale ha ben poco a che fare, se non il legame fra authority, container ed entity. Bene, quella versione (comunque una CTP) di SSDS sparisce per fare spazio al database relazionale. E' infatti di ieri l'<a href="http://blogs.msdn.com/ssds/archive/2009/03/10/9469228.aspx">annuncio</a> ufficiale sul blog di <a href="http://blogs.msdn.com/ssds/">SSDS</a>.</p> <p>I dettagli mancano ancora, io comunque darei un acch'io al prossimo MIX (sessione MIX09-T06F) ;)</p><img src="/PierreGreborio/aggbug/95663.aspx" width="1" height="1" /> System.Web.HttpWriter