<?xml version="1.0" encoding="Windows-1252"?><feed version="0.3" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns="http://purl.org/atom/ns#" xml:lang="it-it"><title>AZ - Il blog di Andrea Zani</title><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/az/" /><tagline type="text/html">AZ - Il blog di Andrea Zani</tagline><id>http://blogs.aspitalia.com/az/</id><generator url="http://feed.aspitalia.com/" version="ASPItalia.com">feed.ASPItalia.com 'Weyoh' 4.8.802</generator><author><name>AZ - Il blog di Andrea Zani</name><url>http://blogs.aspitalia.com/az/</url></author><modified>2008-08-08T22:49:59+01:00</modified><entry><title>Come tutto deve ancora iniziare.</title><id>http://blogs.aspitalia.com/az/post2346/Ancora-Iniziare.aspx</id><created>2008-07-26T11:47:36+01:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2346' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;A quale et&#224; hai cominciato a programmare?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;13 su C64&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;em&gt;Come hai cominciato a programmare?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;A scuola in terza media mi avevano insegnato il Basic.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;em&gt;Qual'&#232; stato il tuo primo linguaggio di programmazione? &lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Basic.&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;strong&gt;Qual'&#232; stato il primo programma vero che hai scritto?&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Un programma geometrico.&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;strong&gt;Quali linguaggi hai usato da quando hai cominciato a programmare? &lt;/strong&gt;&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Basic, Pascal, C, linguaggio macchina (6502-6510 68000, 68020), Rexx, php, perl, vbscript, vb.net, c# (il mio sogno &#232; sempre stato il C++ ma non solo sintatticamente: troppa gente si riempe la bocca dicendo di conoscerlo perch&#233; ha studiato le quattro routine scritte sui libri). E visto che fa tanto sborone - queste catene servono a questo - mi sono intrattenuto anche quasi un minuto anche su questi linguaggi (copia/incolla da wiki): ALGOL, B, BCPL, COBOL, Fortran, Forth, Hot, Soup, Processor, PL/I, POP, Ada, Modula-2, Ada95, Attack, BETA, Clarion, CLOS, D, Eiffel, Delphi, Java, Modula-3, Objective-C, OCaml, OpenGenera, Python, PowerBuilder, REALbasic, REBOL, Ruby, Scriptol, Simula, Smalltalk, Clarion, Clean, Haskell, Lisp, Logo, Scheme, Standard-ML, Caml, OCaml, Mercury, Prolog, Occam (non il rasoio)...&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;strong&gt;Quando &#232; stato il tuo primo vero lavoro da programmatore?&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt; &lt;p&gt;2000.&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;strong&gt;Con il senno di poi, rifaresti lo stesso il programmatore? Ricominceresti a programmare?&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt; &lt;p&gt;No. Non mi sarei fatto scrupoli, mi sarei dopato e avrei fatto il ciclista professionista.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;em&gt;Se ci fosse una cosa che hai imparato nella tua carriera e che vorresti dire ai giovani programmatori, cosa diresti?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Se non hai la passione informatica e curiosit&#224;, lascia perdere.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Qual &#232; la cosa pi&#249; divertente che hai programmato?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Crack vari.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;em&gt;Adesso &#232; l'ora di taggare qualcun'altro...&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Li risparmio.&lt;/p&gt; &lt;p&gt;&lt;em&gt;PS per chi ha inventato 'sta catena: &lt;strong&gt;qual &#232;&lt;/strong&gt; SENZA APOSTROFO!&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/Off_Topic/&quot; rel=&quot;tag&quot;&gt;Off Topic&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/az/post2346/Ancora-Iniziare.aspx"/><issued>2008-07-26T11:47:36+01:00</issued><modified>2008-07-26T11:47:36+01:00</modified><slash:comments>2</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2346/Ancora-Iniziare.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2346.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2346</trackback:ping></entry><entry><title>Quale Binding scegliere con WCF</title><id>http://blogs.aspitalia.com/az/post2323/Binding-Scegliere-WCF.aspx</id><created>2008-07-12T20:08:22+01:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2323' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Di questo schema volevo farmi un poster da appendere in camera perch&#233; lo trovo molto chiaro e utile:&lt;/p&gt; &lt;p&gt;&lt;img height=&quot;297&quot; alt=&quot;wcfbindings&quot; src=&quot;http://blogs.aspitalia.com/img/andrewz/qualebindingscegliereconwcf_11b33/wcfbindings_1.jpg&quot; width=&quot;545&quot; border=&quot;0&quot; /&gt; &lt;/p&gt; &lt;p&gt;&lt;em&gt;Rubato&lt;/em&gt; da questo &lt;a title=&quot;link esterno&quot; href=&quot;http://weblogs.asp.net/spano/archive/2007/10/02/choosing-the-right-wcf-binding.aspx&quot;&gt;blog&lt;/a&gt; di Pano dove si trovano moltre altre info.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_3.0/&quot; rel=&quot;tag&quot;&gt;.NET Framework 3.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Windows_Communication_Foundation/&quot; rel=&quot;tag&quot;&gt;Windows Communication Foundation&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/az/post2323/Binding-Scegliere-WCF.aspx"/><issued>2008-07-12T20:08:22+01:00</issued><modified>2008-07-12T20:08:22+01:00</modified><slash:comments>0</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2323/Binding-Scegliere-WCF.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2323.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2323</trackback:ping></entry><entry><title>Mono e Remoting: come scambiare informazioni tra Windows e Linux</title><id>http://blogs.aspitalia.com/az/post2321/Mono-Remoting-Scambiare-Informazioni-Windows-Linux.aspx</id><created>2008-07-11T20:44:31+01:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2321' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;In un blog &lt;a title=&quot;blog precedente per la creazione di servizi con mono&quot; href=&quot;http://blogs.aspitalia.com/az/post2308/servizi-csharp-macchine-linux-mono.aspx&quot;&gt;precedente&lt;/a&gt; avevo spiegato come creare un servizio con C# e Mono per macchine Linux. Oggi voglio &lt;em&gt;complicare&lt;/em&gt; un po' le cose, perch&#233; l'obbiettivo a cui voglio giungere &#232; lo scambio di informazioni tra i &lt;em&gt;due mondi&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;La prima soluzione che potrebbe venire in mente &#232; l'utilizzo dei web services. Subito per&#242; nasce un problema di base: per poterli utilizzare dobbiamo avere un web server che gira sulla macchina, e questo non &#232; sempre una buona soluzione perch&#233; necessit&#224; di installazioni e sistemi operativi che consentono questa operazione. Nel mondo Windows &#232; necessario avere almeno Windows Xp Professional oppure Vista. Con qualsiasi distribuzione Linux dobbiamo &lt;a title=&quot;articolo su mono in apitalia.com&quot; href=&quot;http://www.aspitalia.com/articoli/asp.net/mono.aspx&quot;&gt;installare&lt;/a&gt; Apache e il modulo apposito perch&#233; possano essere elaborate le pagine asp.net. Ne vale la pena? No, perch&#233; il mondo .Net permette un mezzo pi&#249; potente per lo scambio di dati tra ambienti in cui gira il Framework: il &lt;strong&gt;Remoting&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;Quei quattro gatti che mi conoscono, sanno la mia passione per il Remoting fin dalla versione 1.1 del Framework. Questa tecnologia permette lo scambio di oggetti tra applicativi scritti in .Net senza la necessit&#224; di web server, inoltre possiamo utilizzare la serializzazione binaria per la trasmissione di dati molto pi&#249; prestazionale che la tradizionale SOAP via HTTP (anche se con il Remoting possiamo utilizzare sia la serializzazione SOAP, sia il trasferimento con il protocollo HTTP). Dal Framework 3.0 &#232; presente la tecnologia WCF, molto pi&#249; potente, ma il mondo Mono &#232; ancora indietro e l'implementazione di WCF e delle novit&#224; presenti dal Framework 3.0 (nome in codice &lt;a title=&quot;link esterno&quot; href=&quot;http://www.mono-project.com/olive&quot;&gt;Olive&lt;/a&gt; sotto Mono) sono ancora abbastanza indietro.&lt;/p&gt; &lt;p&gt;Un articolo che confrontava i due mondi - Remoting vs web services - lo potete trovare &lt;a title=&quot;mio articolo per aspitalia.com per il remoting e ws&quot; href=&quot;http://www.aspitalia.com/articoli/asp.net/webservices_remoting_wse2.aspx&quot;&gt;qui&lt;/a&gt;. Per spiegare meglio la soluzione proposta in questo blog, ho scritto un banale progetto con MonoDevelop che &#232; possibile scaricare dal link a fondo pagina. Questo piccolo progetto ripropone quanto gi&#224; detto nel blog riguardante la creazione di servizi con Mono. Per questa occasione ho aggiunto al servizio la possibilit&#224; di richiamare una funzione all'interno di una classe direttamente grazie al Remoting.&lt;/p&gt; &lt;p&gt;Innanzitutto, il file allegato presenta tre progetti:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Servizio che attende le chiamate via Remoting.&lt;/li&gt; &lt;li&gt;Client che richiama la funzione via Remoting al servizio.&lt;/li&gt; &lt;li&gt;Classe con l'interfaccia per lo scambio di informazioni.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Il progetto con l'interfaccia &#232; una banale classe con questo codice:&lt;/p&gt; &lt;p&gt;&lt;em&gt;using System;&lt;br /&gt;public interface IRequestInformation&lt;br /&gt;{&lt;br /&gt; string GetNameAndDateTime(string name);&lt;br /&gt;}&lt;/em&gt; &lt;p&gt;Molto banale: &#232; una funzione che accetta come parametro una stringa e ritorna un'altra stringa. Ora nel servizio dobbiamo esporre questa interfaccia con una classe all'interno del servizio. Nulla di complesso: &lt;p&gt;&lt;em&gt;private void _MainLoop ()&lt;br /&gt;{&lt;br /&gt; TcpChannel channel = new TcpChannel(1981);&lt;br /&gt; ChannelServices.RegisterChannel(channel,false);&lt;br /&gt; RemotingConfiguration.RegisterWellKnownServiceType(&lt;br /&gt; typeof(Information),&lt;br /&gt; &quot;RemotingMessage&quot;,WellKnownObjectMode.SingleCall);&lt;br /&gt; MainClass.WriteLog(ServiceName, &quot;Remoting started...&quot;); &lt;br /&gt; while (!stopThread)&lt;br /&gt; Thread.Sleep (2000);&lt;br /&gt;} &lt;/em&gt; &lt;p&gt;_MainLoop &#232; la funzione che &#232; possibile trovare spiegata nel blog &lt;a title=&quot;mio blog precedente per la creazione di un servizio con mono per linux&quot; href=&quot;http://blogs.aspitalia.com/az/post2308/servizi-csharp-macchine-linux-mono.aspx&quot;&gt;precedente&lt;/a&gt;. In quell'esempio era presente solo il ciclo while, ora &#232; stato aggiunto il codice per l'attesa di chiamate dalla porta Tcp 1981 della classe &quot;Information&quot;: &lt;p&gt;&lt;em&gt;namespace service1&lt;br /&gt;{&lt;br /&gt; public class Information:MarshalByRefObject, IRequestInformation&lt;br /&gt; {&lt;br /&gt; public Information()&lt;br /&gt; {&lt;br /&gt; }&lt;br /&gt; public string GetNameAndDateTime (string name)&lt;br /&gt; {&lt;br /&gt; MainClass.WriteLog(&quot;Remoting&quot;, &quot;received: &quot;+name); // scrive log&lt;br /&gt; return string.Format(&quot;{0}: {1}&quot;,name, DateTime.Now);&lt;br /&gt; }&lt;br /&gt; }&lt;br /&gt;}&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Questa classe espone l'interfaccia &lt;em&gt;IRequestInformation&lt;/em&gt; e il metodo &lt;em&gt;GetNameAndDateTime&lt;/em&gt;. Siccome mi manca la fantasia non faccio altro che tornare una stringa contenente il &lt;em&gt;name&lt;/em&gt; passato insieme alla data e ora attuale.&lt;/p&gt; &lt;p&gt;Il progetto client allegato &#232; una console application che richiama via remoting la funzione presente nel servizio:&lt;/p&gt; &lt;p&gt;&lt;em&gt;using System;&lt;br /&gt;using System.Runtime.Remoting;&lt;br /&gt;using System.Runtime.Remoting.Channels;&lt;br /&gt;using System.Runtime.Remoting.Channels.Tcp;&lt;br /&gt;&lt;br /&gt;namespace client&lt;br /&gt;{&lt;br /&gt; class MainClass&lt;br /&gt; {&lt;br /&gt; public static void Main(string[] args)&lt;br /&gt; {&lt;br /&gt; try&lt;br /&gt; {&lt;br /&gt; string name=&quot;io&quot;; // Stringa di default se non vengono passati parametri&lt;br /&gt; if (args.Length&amp;gt;0) name=args[0];&lt;br /&gt; IRequestInformation remot;&lt;br /&gt; string location = &quot;tcp://192.168.0.7:1981/RemotingMessage&quot;;&lt;br /&gt; remot = (IRequestInformation)Activator.GetObject(&lt;br /&gt; typeof(IRequestInformation), location);&lt;br /&gt; Console.WriteLine(remot.GetNameAndDateTime(name));&lt;br /&gt; }&lt;br /&gt; catch (RemotingException)&lt;br /&gt; {&lt;br /&gt; Console.WriteLine(&quot;Impossibile comunicare con il server&quot;);&lt;br /&gt; }&lt;br /&gt; }&lt;br /&gt; }&lt;br /&gt;}&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Anche qui viene usato l'interfaccia per la creazione automatica per l'utilizzo della classe presente nel servizio. Il Framework penser&#224; al posto nostro alla creazione di una classe proxy per la serializzazione binaria e la trasmissione.&lt;/p&gt; &lt;p&gt;Se si &#232; seguito il blog precedente e il servizio gira sulla macchina (sia che si tratti di Windows che Linux), possiamo richiamare il servizio direttamente dall'eseguibile client:&lt;/p&gt; &lt;p&gt;&lt;img alt=&quot;client su macchina windows&quot; src=&quot;http://blogs.aspitalia.com/img/andrewz/immagini/remoting2.png&quot; /&gt; &lt;/p&gt; &lt;p&gt;Questo anche da altre macchine Linux con Mono:&lt;/p&gt; &lt;p&gt;&lt;img alt=&quot;client su macchina linux&quot; src=&quot;http://blogs.aspitalia.com/img/andrewz/immagini/remoting3.png&quot; /&gt;&lt;/p&gt; &lt;p&gt;In entrambi i casi il servizio ha risposta ritornando correttamente la stringa passata con la data e l'ora della richiesta. Inoltre, il nostro servizio &#232; in grado di loggare le richieste. Vediamo che cosa ha memorizzato:&lt;/p&gt; &lt;p&gt;&lt;img alt=&quot;log del servizio&quot; src=&quot;http://blogs.aspitalia.com/img/andrewz/immagini/remoting1.png&quot; /&gt;&lt;/p&gt; &lt;p&gt;Il codice presente nell'allegato ha l'ip e la porta memorizzati direttamente nel codice, per modificarli &#232; necessario ricompilare i progetti. Potevo configurare il Remoting con il file di configurazione del progetto, lo so, ma non ne avevo voglia. Ma se volete provarlo o avete questa strada o fate in modo che il servizio sia memorizzato da una macchina con ip 192.168.0.7.&lt;/p&gt; &lt;p&gt;Una piccola divagazione a margine: come detto nel blog precedente i test sono stati fatti su una macchina con Ubuntu. A parte la versione vecchia di Mono presente nei repository di questa distribuzione, ho scoperto un'altra anomalia. Con l'esempio presente che comunica con porte TCP, mi aspettavo di dover configurare il firewall, proprio come Windows richiede. Con Ubuntu non ho avuto alcun problema. I pacchetti sono passati senza problemi. Dopo una piccola ricerca scopro che Ubuntu ha s&#236; il firewall attivo, &lt;strong&gt;&lt;em&gt;ma permette il passaggio indiscrimanto da qualsiasi porta! &lt;/em&gt;&lt;/strong&gt;La pi&#249; famosa, e forse utilizzata, distribuzione Linux ha un firewall pressocch&#233; inutilizzato! La cosa mi ha sorpreso dato che, per esempio, OpenSuse ha il suo bel firewall attivo... Roba da Windows 2000... per fortuna almeno non ha gli stessi problemi di sicurezza.&lt;/p&gt; &lt;p&gt;Dimenticavo: l'allegato &#232; possibile scaricarlo da questo &lt;a title=&quot;progetto d'esempio per il remoting&quot; href=&quot;http://blogs.aspitalia.com/img/andrewz/upload/service1.zip&quot;&gt;link&lt;/a&gt;. La piadina che ho mangiato a cena ce l'ho ancora sullo stomaco. Questa &#232; un'altra divagazione.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/Mono/&quot; rel=&quot;tag&quot;&gt;Mono&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/az/post2321/Mono-Remoting-Scambiare-Informazioni-Windows-Linux.aspx"/><issued>2008-07-11T20:44:31+01:00</issued><modified>2008-07-11T20:44:31+01:00</modified><slash:comments>0</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2321/Mono-Remoting-Scambiare-Informazioni-Windows-Linux.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2321.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2321</trackback:ping></entry><entry><title>TrueCrypt 6.0</title><id>http://blogs.aspitalia.com/az/post2319/TrueCrypt-6.0.aspx</id><created>2008-07-10T20:19:00+01:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2319' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Utilizzo da parecchio tempo questo software open source per proteggere i miei dati personali sul portatile. Portandolo sempre dietro per lavoro e lasciandolo in posti dove potrebbe essere a rischio di furti, non voglio che miei documenti personali, gli account di accesso a email o server e, non per ultimo, dati di altre societ&#224;, possano finire in mani estranee.&lt;/p&gt;&lt;p&gt;Qualche giorno fa &#232; uscita la nuova versione 6.0 che permette una maggior protezione dei dati. Uno dei punti di forza di TrueCrypt &#232; l'hidden truecrypt volume. Anche se a me non serve un grado di protezione di quel livello, questa opzione permette di creare una partizione nascosta all'interno di un'altra partizione cryptata. In poche parole possiamo fare in modo che ad una stessa partizione criptata vi possiamo accedere con due password differenti, le quali danno accesso a &lt;em&gt;due dischi virtuali differenti con ognuno di essi dati differenti&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;Come viene spiegato sul sito di questo software, questa funzione &#232; utile nel caso si venga constretti a fornire la password dietro minaccia o altro. In questo modo &#232; possibile fornire la password per l'accesso al primo disco fittizio mentre il secondo, con i dati veramente importanti,&#160;rimane invisibile. Da notare che anche se il disco &lt;em&gt;nascosto&lt;/em&gt; all'interno occupa svariati megabytes, questi non vengono detratti dal disco che lo contiene per evitare che la cosa possa essere scoperta. Maggiori info a questa &lt;a title=&quot;Link esterno&quot; href=&quot;http://www.truecrypt.org/docs/?s=hidden-volume&quot;&gt;pagina&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;In ultimo, una partizione create con TrueCrypt pu&#242; essere letta da qualsiasi sistema operativo: Windows, Linux, Mac... Comodo.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/Off_Topic/&quot; rel=&quot;tag&quot;&gt;Off Topic&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/az/post2319/TrueCrypt-6.0.aspx"/><issued>2008-07-10T20:19:00+01:00</issued><modified>2008-07-10T20:19:00+01:00</modified><slash:comments>0</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2319/TrueCrypt-6.0.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2319.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2319</trackback:ping></entry><entry><title>Environment.NewLine</title><id>http://blogs.aspitalia.com/az/post2312/Environment.NewLine.aspx</id><created>2008-07-08T12:57:00+01:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2312' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Si ignora questa propriet&#224;, si preferisce utilizzare i codice escape '\r' e '\n'; in C# basta scrivere &lt;em&gt;&amp;quot;Testo\r\n&amp;quot;&lt;/em&gt; per avere un &lt;em&gt;ritorno a capo&lt;/em&gt;, in VB: &lt;em&gt;&amp;quot;Testo&amp;quot; &amp;amp; vbCrLf&lt;/em&gt; (oppure &lt;em&gt;&amp;quot;Testo&amp;quot; &amp;amp; chr(13) &amp;amp; chr(10)&lt;/em&gt;). Eppure questa property &#232; utile perch&#233; imposta il corretto &lt;em&gt;ritorno a capo&lt;/em&gt; dipendentemente dal sistema operativo su cui gira consentendo una portabilit&#224; del nostro codice.&lt;/p&gt;&lt;p&gt;L'ipotetico codice in C# per scrivere, per esempio, del testo in un file:&lt;/p&gt;&lt;code&gt;string text=&amp;quot;Prima riga&amp;quot; + Environment.NewLine + &amp;quot;Seconda riga&amp;quot;;&lt;/code&gt;&lt;p&gt;Sar&#224; trasformato, nel nostro abituale Framework su Windows, in:&lt;/p&gt;&lt;code&gt;string text=&amp;quot;Prima riga\r\nSeconda riga&amp;quot;;&lt;/code&gt;&lt;p&gt;Ma se il codice qui sopra venisse eseguito da Mono su macchine Linux? Ecco il risultato:&lt;/p&gt;&lt;code&gt;string text=&amp;quot;Prima riga\nSeconda riga&amp;quot;;&lt;/code&gt;&lt;p&gt;Il perch&#233; &#232; molto semplice. Fin dal suo primo vagito Ms Dos utilizzava questo doppio codice per il ritorno a capo, mentre altre altri sistemi operativo come Linux, usano il singolo carattere di &lt;em&gt;line feed&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;Non si prevede la portabilit&#224; di codice fuori Windows? Ognuno fa quello che gli pare.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework/&quot; rel=&quot;tag&quot;&gt;.NET Framework&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Mono/&quot; rel=&quot;tag&quot;&gt;Mono&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/az/post2312/Environment.NewLine.aspx"/><issued>2008-07-08T12:57:00+01:00</issued><modified>2008-07-08T12:57:00+01:00</modified><slash:comments>2</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2312/Environment.NewLine.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2312.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2312</trackback:ping></entry><entry><title>[OT] Scannerizzare lastre e risonanze magnetiche</title><id>http://blogs.aspitalia.com/az/post2311/OT-Scannerizzare-Lastre-Risonanze-Magnetiche.aspx</id><created>2008-07-07T20:03:00+01:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2311' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Visto che pi&#249; di una persona(*) mi ha chiesto come &lt;a title=&quot;Mio blog&quot; href=&quot;http://blogs.aspitalia.com/az/post2307/OT-Problema-Serio-Dischi.aspx&quot;&gt;ho fatto a scannerizzare una risonanza magnetica&lt;/a&gt;, ho deciso di rivelare qui il grande segreto.&lt;/p&gt;&lt;p&gt;Innanzitutto, avevo cercato info su internet su come si potesse trasferire al computer con scanner o altri mezzi questi referti medici, senza mai trovare una tecnica semplice; avevo trovato risposte di persone che consigliavano la richiesta dei risultati direttamente su CD o l'utilizzo di scanner appositi. Siccome io non potevo utilizzare nessuna delle due tecniche, in preda ad astinenza da antidolorifico, mi sono inventato una tecnica molto semplice&#160;che porta buoni risultati.&lt;/p&gt;&lt;p&gt;Dopo vari tentativi con gli unici due scanner che ho&#160; a casa in varie modalit&#224; operativa come &amp;quot;diapositiva&amp;quot;, tenendo il coperchio aperto, fornendo luce supplementare sopra alla lastra e cos&#236; via senza giungere a nulla di buono, sono arrivato alla conclusione che la tenica pi&#249; semplice era utilizzare una macchina fotografica per fotografare direttamente le lastre controluce. I primi tentativi con lampadine, luce del sole, fanali dell'auto non portavano a buoni risultati visto che non permettevano la diffusione della luce in modo omogeneo per tutto il referto medico. Dovevo trovare un modo per avere quella luce bianca e omogenea che hanno a disposizione i radiologi per esaminare le lastre.&lt;/p&gt;&lt;p&gt;La soluzione &#232; stata pi&#249; banale del previsto. Ho utilizzato banalmente il monitor lcd del portatile. E' stato sufficiente visualizzare a pieno schermo un'immagine bianca, appoggiandoci sopra la risonanza magnetica, e dalla distanza di ~15 centimetri, fotografarla con una macchina digitale. Consiglio una fotocamera con almeno 4 mega pixel. Sotto a questa risoluzione, come i tipici 1.3 mega pixel del cellulare - con cui ho fatto delle prove - si ottengono risultati scadenti.&lt;/p&gt;&lt;p&gt;Un ultimo quesito che ho fatto a cinque persone e solo una ha saputo darmi la risposta corretta: come si visualizza una schermata completamente bianca che occupa il monitor? La risposta qui sotto (**).&lt;/p&gt;&lt;p&gt;(*) in due me l'hanno chiesto.&lt;br /&gt;(**) con Paint si&#160; crea un'immagine bianca con la dimensione della risoluzione del monitor e si visualizza a pieno schermo.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/Off_Topic/&quot; rel=&quot;tag&quot;&gt;Off Topic&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/az/post2311/OT-Scannerizzare-Lastre-Risonanze-Magnetiche.aspx"/><issued>2008-07-07T20:03:00+01:00</issued><modified>2008-07-07T20:03:00+01:00</modified><slash:comments>0</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2311/OT-Scannerizzare-Lastre-Risonanze-Magnetiche.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2311.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2311</trackback:ping></entry><entry><title>Servizi in C# su macchine Linux con Mono</title><id>http://blogs.aspitalia.com/az/post2308/Servizi-CSharp-Macchine-Linux-Mono.aspx</id><created>2008-07-06T21:05:00+01:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2308' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Pochi giorni fa ho dovuto rifarmi una macchina su cui girava OpenSuse (la distribuzione che preferisco),&#160;ed ho deciso di installare la nuova versione di Ubuntu 8.04 per curiosit&#224; visto che l'ultima versione provata di Ubuntu era la 7.04 e volevo provare con mano l'evoluzione avvenuta in questi dodici mesi.&lt;/p&gt;&lt;p&gt;La prima delusione l'ho avuta nel constatare che la versione presente nei repository&#160;di Mono &#232; la 1.2.6, mentre l'ultima release &#232; la 1.9.1. Non mi pongo problemi, e visto che dovevo installare un servizio per... ehi, un momento, non sono obbligato a scrivere nel dettaglio i fatti miei! Riprendo: dovendo installare un servizio scritto in C# su questa macchina installo &lt;em&gt;mono&lt;/em&gt; e &lt;em&gt;mono-service2&lt;/em&gt; dai repository di Ubuntu. &lt;em&gt;mono-service2&lt;/em&gt; &#232; un tool che permette la gestione dei servizi scritti per Mono sotto Linux.&lt;/p&gt;&lt;p&gt;Per informazione riporto un pubblico esempio di un servizio scritto in C#&#160;che pu&#242; girare sia sotto Windows che Linux. Il codice seguente &#232; possibile compilarlo&#160;Visual Studio, da linea di comando sotto Linux con Mono o con MonoDevelop, e pu&#242; essere testato anche come &lt;em&gt;console application&lt;/em&gt;:&lt;/p&gt;&lt;p&gt;&lt;code&gt;// Main.cs created with MonoDevelop&lt;br /&gt;// User: az&lt;br /&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Collections;&lt;br /&gt;using System.ComponentModel;&lt;br /&gt;using System.Diagnostics;&lt;br /&gt;using System.ServiceProcess;&lt;br /&gt;using System.IO;&lt;br /&gt;using System.Configuration.Install;&lt;br /&gt;using System.Threading;&lt;br /&gt;&lt;br /&gt;namespace service1&lt;br /&gt;{&lt;br /&gt;&#160;class MainClass&lt;br /&gt;&#160;{&lt;br /&gt;&#160;&#160;private const string LogFile = &amp;quot;TestService.log&amp;quot;;&lt;br /&gt;&lt;br /&gt;&#160;&#160;// The main entry point for the process&lt;br /&gt;&#160;&#160;static void Main()&lt;br /&gt;&#160;&#160;{&lt;br /&gt;&#160;&#160;&#160;Write2Log(null, &amp;quot;Main starting&amp;quot;);&lt;br /&gt;&#160;&#160;&#160;System.ServiceProcess.ServiceBase[] ServicesToRun;&lt;br /&gt;&#160;&#160;&#160;ServicesToRun = new System.ServiceProcess.ServiceBase[] { new TestService(&amp;quot;TestService1&amp;quot;)};&lt;br /&gt;&#160;&#160;&#160;System.ServiceProcess.ServiceBase.Run(ServicesToRun);&lt;br /&gt;&#160;&#160;&#160;Write2Log(null, &amp;quot;Main ended&amp;quot;);&lt;br /&gt;&#160;&#160;}&lt;br /&gt;&lt;br /&gt;&#160;&#160;public static void Write2Log(string category, string message)&lt;br /&gt;&#160;&#160;{&lt;br /&gt;&#160;&#160;&#160;using (StreamWriter w = new StreamWriter(LogFile, true, System.Text.Encoding.UTF8) )&lt;br /&gt;&#160;&#160;&#160;{&lt;br /&gt;&#160;&#160;&#160;&#160;if ( category != null )&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;w.WriteLine(DateTime.Now.ToString() + &amp;quot; &amp;quot; + category + &amp;quot; - &amp;quot; + message);&lt;br /&gt;&#160;&#160;&#160;&#160;else&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;w.WriteLine(DateTime.Now.ToString() + &amp;quot; &amp;quot; + message);&lt;br /&gt;&#160;&#160;&#160;}&lt;br /&gt;&#160;&#160;}&lt;br /&gt;&#160;}&lt;br /&gt;&lt;br /&gt;&#160;public class TestService : System.ServiceProcess.ServiceBase&lt;br /&gt;&#160;{&lt;br /&gt;&#160;&#160;private Thread mainThread = null;&lt;br /&gt;&#160;&#160;private bool stopThread = false;&lt;br /&gt;&lt;br /&gt;&#160;&#160;public TestService(string name)&lt;br /&gt;&#160;&#160;{&lt;br /&gt;&#160;&#160;&#160;this.ServiceName = name;&lt;br /&gt;&#160;&#160;&#160;this.CanPauseAndContinue = true;&lt;br /&gt;&#160;&#160;}&lt;br /&gt;&lt;br /&gt;&#160;&#160;protected override void Dispose( bool disposing )&lt;br /&gt;&#160;&#160;{&lt;br /&gt;&#160;&#160;&#160;MainClass.Write2Log(ServiceName, &amp;quot;Dispose&amp;quot;);&lt;br /&gt;&#160;&#160;&#160;base.Dispose( disposing );&lt;br /&gt;&#160;&#160;}&lt;br /&gt;&lt;br /&gt;&#160;&#160;protected override void OnStart(string[] args)&lt;br /&gt;&#160;&#160;{&lt;br /&gt;&#160;&#160;&#160;MainClass.Write2Log(ServiceName, &amp;quot;Starting Service...&amp;quot;);&#160;&#160;&#160;&lt;br /&gt;&#160;&#160;&#160;mainThread = new Thread (new ThreadStart (_MainLoop));&lt;br /&gt;&#160;&#160;&#160;stopThread = false;&lt;br /&gt;&#160;&#160;&#160;mainThread.Start ();&lt;br /&gt;&#160;&#160;}&lt;br /&gt;&lt;br /&gt;&#160;&#160;protected override void OnStop()&lt;br /&gt;&#160;&#160;{&lt;br /&gt;&#160;&#160;&#160;MainClass.Write2Log(ServiceName, &amp;quot;Stopping Service...&amp;quot;);&lt;br /&gt;&#160;&#160;&#160;if (mainThread != null) {&lt;br /&gt;&#160;&#160;&#160;&#160;stopThread = true;&lt;br /&gt;&#160;&#160;&#160;&#160;mainThread.Join ();&lt;br /&gt;&#160;&#160;&#160;&#160;mainThread = null;&lt;br /&gt;&#160;&#160;&#160;}&lt;br /&gt;&#160;&#160;}&lt;br /&gt;&lt;br /&gt;&#160;&#160;protected override void OnPause()&lt;br /&gt;&#160;&#160;{&lt;br /&gt;&#160;&#160;&#160;MainClass.Write2Log(ServiceName, &amp;quot;Pausing Service...&amp;quot;);&lt;br /&gt;&#160;&#160;}&lt;br /&gt;&lt;br /&gt;&#160;&#160;protected override void OnContinue()&lt;br /&gt;&#160;&#160;{&lt;br /&gt;&#160;&#160;&#160;MainClass.Write2Log(ServiceName, &amp;quot;Continuing Service...&amp;quot;);&lt;br /&gt;&#160;&#160;}&lt;br /&gt;&lt;br /&gt;&#160;&#160;private void _MainLoop ()&lt;br /&gt;&#160;&#160;{&lt;br /&gt;&#160;&#160;&#160;while (!stopThread)&lt;br /&gt;&#160;&#160;&#160;&#160;Thread.Sleep (2000);&lt;br /&gt;&#160;&#160;}&lt;br /&gt;&#160;}&lt;br /&gt;&lt;br /&gt;&#160;/// &lt;summary /&gt;&lt;br /&gt;&#160;/// This class allows easy installation of this service on Windows.&lt;br /&gt;&#160;/// &lt;/summary /&gt;&lt;br /&gt;&#160;[RunInstaller(true)]&lt;br /&gt;&#160;public class ProjectInstaller : System.Configuration.Install.Installer&lt;br /&gt;&#160;{&lt;br /&gt;&#160;&#160;private System.ServiceProcess.ServiceProcessInstaller serviceProcessInstaller1;&lt;br /&gt;&#160;&#160;private System.ServiceProcess.ServiceInstaller serviceInstaller1;&lt;br /&gt;&#160;&#160;private System.ComponentModel.Container components = null;&lt;br /&gt;&lt;br /&gt;&#160;&#160;public ProjectInstaller()&lt;br /&gt;&#160;&#160;{&lt;br /&gt;&#160;&#160;&#160;// This call is required by the Designer.&lt;br /&gt;&#160;&#160;&#160;InitializeComponent();&lt;br /&gt;&#160;&#160;}&lt;br /&gt;&lt;br /&gt;&#160;&#160;/// &lt;summary /&gt;&lt;br /&gt;&#160;&#160;/// Clean up any resources being used.&lt;br /&gt;&#160;&#160;/// &lt;/summary /&gt;&lt;br /&gt;&#160;&#160;protected override void Dispose( bool disposing )&lt;br /&gt;&#160;&#160;{&lt;br /&gt;&#160;&#160;&#160;if( disposing )&lt;br /&gt;&#160;&#160;&#160;{&lt;br /&gt;&#160;&#160;&#160;&#160;if(components != null)&lt;br /&gt;&#160;&#160;&#160;&#160;{&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;components.Dispose();&lt;br /&gt;&#160;&#160;&#160;&#160;}&lt;br /&gt;&#160;&#160;&#160;}&lt;br /&gt;&#160;&#160;&#160;base.Dispose( disposing );&lt;br /&gt;&#160;&#160;}&lt;br /&gt;&lt;br /&gt;&#160;&#160;#region Component Designer generated code&lt;br /&gt;&#160;&#160;/// &lt;summary /&gt;&lt;br /&gt;&#160;&#160;/// Required method for Designer support - do not modify&lt;br /&gt;&#160;&#160;/// the contents of this method with the code editor.&lt;br /&gt;&#160;&#160;/// &lt;/summary /&gt;&lt;br /&gt;&#160;&#160;private void InitializeComponent()&lt;br /&gt;&#160;&#160;{&lt;br /&gt;&#160;&#160;&#160;this.serviceProcessInstaller1 = new System.ServiceProcess.ServiceProcessInstaller();&lt;br /&gt;&#160;&#160;&#160;this.serviceInstaller1 = new System.ServiceProcess.ServiceInstaller();&lt;br /&gt;&#160;&#160;&#160;//this.serviceInstaller2 = new System.ServiceProcess.ServiceInstaller();&lt;br /&gt;&#160;&#160;&#160;// &lt;br /&gt;&#160;&#160;&#160;// serviceProcessInstaller1&lt;br /&gt;&#160;&#160;&#160;// &lt;br /&gt;&#160;&#160;&#160;this.serviceProcessInstaller1.Password = null;&lt;br /&gt;&#160;&#160;&#160;this.serviceProcessInstaller1.Username = null;&lt;br /&gt;&#160;&#160;&#160;// &lt;br /&gt;&#160;&#160;&#160;// serviceInstaller1&lt;br /&gt;&#160;&#160;&#160;// &lt;br /&gt;&#160;&#160;&#160;this.serviceInstaller1.DisplayName = &amp;quot;Test Service 1&amp;quot;;&lt;br /&gt;&#160;&#160;&#160;this.serviceInstaller1.ServiceName = &amp;quot;TestService1&amp;quot;;&lt;br /&gt;&#160;&#160;&#160;// &lt;br /&gt;&#160;&#160;&#160;// ProjectInstaller&lt;br /&gt;&#160;&#160;&#160;// &lt;br /&gt;&#160;&#160;&#160;this.Installers.AddRange(new System.Configuration.Install.Installer[] {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160; this.serviceProcessInstaller1,&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160; this.serviceInstaller1&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;});&lt;br /&gt;&#160;&#160;}&lt;br /&gt;&#160;&#160;#endregion&lt;br /&gt;&#160;}&lt;br /&gt;}&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Questo servizio &#232; solo un test: scrive in un file di testo quando il servizio viene avviato e quando viene fermato. Una volta testato e confermato il suo funzionamento corretto, provo ad installarlo come servizio sotto Ubuntu con &lt;em&gt;mono-service2&lt;/em&gt;. L'help di questo comando &#232; molto chiaro:&lt;/p&gt;&lt;code&gt;az:~$ mono-service2 &lt;br /&gt;You must specify at least the assembly name&lt;br /&gt;&lt;br /&gt;Usage is: /usr/bin/mono-service2 [options] service&lt;br /&gt;&lt;br /&gt;&#160;&#160;&#160; -d:&lt;directory /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Working directory&lt;br /&gt;&#160;&#160;&#160; -l:&lt;lock /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Lock file (default is /tmp/&lt;service /&gt;.lock)&lt;br /&gt;&#160;&#160;&#160; -m:&lt;syslog /&gt;&#160;&#160;&#160;&#160;&#160;&#160; Name to show in syslog&lt;br /&gt;&#160;&#160;&#160; -n:&lt;service /&gt;&#160;&#160;&#160;&#160;&#160; Name of service to start (default is first defined)&lt;br /&gt;&#160;&#160;&#160; --debug&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Do not send to background nor redirect input/output&lt;br /&gt;&#160;&#160;&#160; --no-daemon&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Do not send to background nor redirect input/output&lt;br /&gt;&lt;br /&gt;Controlling the service:&lt;br /&gt;&lt;br /&gt;&#160;&#160;&#160; kill -USR1 `cat &lt;lock /&gt;`&#160;&#160;&#160; Pausing service&lt;br /&gt;&#160;&#160;&#160; kill -USR2 `cat &lt;lock /&gt;`&#160;&#160;&#160; Continuing service&lt;br /&gt;&#160;&#160;&#160; kill `cat &lt;lock /&gt;`&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Ending service&lt;br /&gt;&lt;br /&gt;az:~$ &lt;/code&gt;&lt;p&gt;Ok, vado nella directory dove &#232; presente il codice compilato del servizio e lancio il comando con l'opzione della &lt;em&gt;working directory&lt;/em&gt;:&lt;/p&gt;&lt;code&gt;sudo mono-service2 -d:/home/az/project/service1/service1/bin/Debug/&#160; /home/az/project/service1/service1/bin/Debug/service1.exe&lt;/code&gt;&lt;p&gt;Ma ottengo un non precisato errore: &amp;quot;41: Syntax error: Bad fd number&amp;quot;. Una veloce ricerca e trovo che &#232; un &lt;a title=&quot;Link esterno&quot; href=&quot;https://bugs.launchpad.net/ubuntu/+source/mono/+bug/242925&quot;&gt;bug&lt;/a&gt; noto sotto Ubuntu. Sempre a quel link &#232; presente la correzione da fare, anche se un modo migliore per risolvere ogni problema lo spiegher&#242; dopo.&lt;/p&gt;&lt;p&gt;Finalmente tutto funziona. Ora per fare le cose per bene dobbiamo fare in modo che tale servizio sia avviato in automatico all'avvio della macchina, senza nessuna autenticazione dell'utente. Per ottenere questo &#232; necessario creare uno script apposito in &amp;quot;/etc/init.d/&amp;quot;. Lo script, che chiamer&#242; &amp;quot;azservice&amp;quot; &#232; il seguente:&lt;/p&gt;&lt;code&gt;#!/bin/sh&lt;br /&gt;# Start/stop the az daemon.&lt;br /&gt;#&lt;br /&gt;### BEGIN INIT INFO&lt;br /&gt;# Provides:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; service1&lt;br /&gt;# Short-Description: Test di AZ&lt;br /&gt;# Description:&#160;&#160;&#160;&#160;&#160;&#160; Service write in C# for mono and linux world&lt;br /&gt;### END INIT INFO&lt;br /&gt;&lt;br /&gt;. /lib/lsb/init-functions&lt;br /&gt;&lt;br /&gt;case &amp;quot;$1&amp;quot; in&lt;br /&gt;start)&#160;log_daemon_msg &amp;quot;Starting test service az&amp;quot; &amp;quot;az-service1&amp;quot;&lt;br /&gt;&#160;mono-service2 -d:/home/az/project/service1/service1/bin/Debug/&#160; /home/az/project/service1/service1/bin/Debug/service1.exe&lt;br /&gt;&#160;;;&lt;br /&gt;stop)&#160;log_daemon_msg &amp;quot;Stopping test service az&amp;quot; &amp;quot;az-service1&amp;quot;&lt;br /&gt;&#160;kill `cat /tmp/service1.exe.lock`&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ;;&lt;br /&gt;restart) log_daemon_msg &amp;quot;Restarting test service az&amp;quot; &amp;quot;az-service1&amp;quot;&lt;br /&gt;&#160;kill `cat /tmp/service1.exe.lock`&lt;br /&gt;&#160;mono-service2 -d:/home/az/project/service1/service1/bin/Debug/&#160; /home/az/project/service1/service1/bin/Debug/service1.exe&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ;;&lt;br /&gt;reload|force-reload) log_daemon_msg &amp;quot;Reloading test service az&amp;quot; &amp;quot;az-service1&amp;quot;&lt;br /&gt;&#160;kill `cat /tmp/service1.exe.lock`&lt;br /&gt;&#160;mono-service2 -d:/home/az/project/service1/service1/bin/Debug/&#160; /home/az/project/service1/service1/bin/Debug/service1.exe&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ;;&lt;br /&gt;*)&#160;log_action_msg &amp;quot;Usage: /etc/init.d/azservice {start|stop|restart|reload|force-reload}&amp;quot;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; exit 2&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ;;&lt;br /&gt;esac&lt;br /&gt;exit 0&lt;/code&gt;&lt;p&gt;Dipendentemente dall'opzione passata (start, stop, restart, reload, force-reload), viene invocato in comando &lt;em&gt;mono-service2&lt;/em&gt; con le opzioni necessarie per avviare, fermare o riavviare il servizio:&lt;/p&gt;&lt;code&gt;sudo /etc/init.d/azservice start&lt;br /&gt;sudo /etc/init.d/azservice stop&lt;/code&gt;&lt;p&gt;Per essere richiamato con il precedente modo dobbiamo aggiungere a questo file il flag &amp;quot;avviabile&amp;quot;:&lt;/p&gt;&lt;code&gt;sudo chmod +x&#160; /etc/init.d/azservice&lt;/code&gt;&lt;p&gt;Trovo interessante il modo utilizzato per fermare un servizio. Prendendo la linea di codice utilizzata si pu&#242; notare una strana sintassi per chi non &#232; avvezzo a Linux:&lt;/p&gt;&lt;code&gt;kill `cat /tmp/service1.exe.lock`&lt;/code&gt;&lt;p&gt;&lt;em&gt;cat /tmp/service1.exe.lock&lt;/em&gt; visualizza normalmente a video il contenuto del file (in questo caso il numero di processo del servizio). Racchiuso tra quegli apici, prende l'output del comando e lo invia a &lt;em&gt;kill&lt;/em&gt; che fermer&#224; il processo del servizio.&lt;/p&gt;&lt;p&gt;Per completare il tutto dobbiamo inviare un ultimo comando. Linux ha vari &lt;em&gt;level&lt;/em&gt; di avvio. Ognuno di essi si contraddistingue per l'avvio di &lt;em&gt;n&lt;/em&gt;&#160;servizi.&#160;Maggiori informazioni a riguardo si possono trovare &lt;a title=&quot;Link esterno&quot; href=&quot;http://www.debianadmin.com/debian-and-ubuntu-linux-run-levels.html&quot;&gt;qui&lt;/a&gt;. Per fare in modo che il nostro servizio sia collegato a questi &lt;em&gt;level&lt;/em&gt;, dobbiamo scrivere il comando:&lt;/p&gt;&lt;code&gt;sudo update-rc.d azservice defaults&lt;/code&gt;&lt;p&gt;Dove &lt;em&gt;azservice&lt;/em&gt; &#232; il nome del file che abbiamo creato in &lt;em&gt;/etc/init.d/&lt;/em&gt;. Il nostro lavoro &#232; finito. Ad ogni avvio il servizio verr&#224; richiamato. Un piccolo avvertimento: questo servizio ha normalmente accesso a tutti i file e un'operazione sbagliata pu&#242; creare danni irreversibili sulla macchina (ipottizzando che debba cancellare dei file presenti in una directory, un comando come rm -rf * pu&#242; avere effetti indesiderati se richiamata nella directory root della macchina ;)).&lt;/p&gt;&lt;p&gt;Ubuntu presenta un tool &amp;quot;Servizi&amp;quot; che permette la gestione dei servizi sulla macchina. Si pu&#242; notare come quello appena creato non sia presente nella lista. Non volendo investigare oltre per scoprire il perch&#233;, ho utilizzato di un altro strumento pi&#249; potente, &amp;quot;BUM&amp;quot; (Boot-up manager) installabile dai repository, in grado di gestire anche quello che ho appena creato, come si vede in figura:&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;boot-up manager&quot; hspace=&quot;0&quot; src=&quot;http://blogs.aspitalia.com/img/andrewz/Immagini/bum.png&quot; align=&quot;baseline&quot; border=&quot;0&quot; /&gt;&lt;/p&gt;&lt;p&gt;Nel caso di Ubuntu consiglio anche l'upgrade immediato all'ultima versione 1.9.1 di Mono. Per ottenere questo &#232; sufficiente aggiungere il repository di Mono, come &#232; spiegato &lt;a title=&quot;Link esterno&quot; href=&quot;http://www.mono-project.com/Other_Downloads&quot;&gt;qui&lt;/a&gt;, che risolve anche il bug prima citato di &lt;em&gt;mono-service2&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework/&quot; rel=&quot;tag&quot;&gt;.NET Framework&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Mono/&quot; rel=&quot;tag&quot;&gt;Mono&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/az/post2308/Servizi-CSharp-Macchine-Linux-Mono.aspx"/><issued>2008-07-06T21:05:00+01:00</issued><modified>2008-07-06T21:05:00+01:00</modified><slash:comments>0</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2308/Servizi-CSharp-Macchine-Linux-Mono.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2308.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2308</trackback:ping></entry><entry><title>[OT] Problema serio ai dischi</title><id>http://blogs.aspitalia.com/az/post2307/OT-Problema-Serio-Dischi.aspx</id><created>2008-07-04T18:21:00+01:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2307' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;A&#160;febbraio avevo avuto le prime avvisaglie. Da febbraio un lento degrado del disco ha comportato sempre pi&#249; problemi fino alla rottura dello stesso. Solo un esame approfondito ha evidenziato il problema nel dettaglio:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://blogs.aspitalia.com/img/andrewz/Immagini/risonanza.jpg&quot;&gt;&lt;img alt=&quot;Risonanza magnetica AZ&quot; hspace=&quot;0&quot; src=&quot;http://blogs.aspitalia.com/img/andrewz/Immagini/risonanza.jpg&quot; width=&quot;300&quot; align=&quot;baseline&quot; border=&quot;1&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Dalla seconda settimana di maggio ci&#242; mi ha portato a passare pressocch&#233; tutto il&#160;tempo a letto per una fortissima &lt;a title=&quot;Link esterno&quot; href=&quot;http://it.wikipedia.org/wiki/Sciatalgia&quot;&gt;sciatalgia&lt;/a&gt;, un abuso di antidolorifici e stampelle per camminare. Solo dopo una urgente risonanza magnetica e un urgente operazione chirurgica il problema si &#232; risolto... Per quei pochi che si erano chiesti che fine avessi fatto in tutto questo tempo...&lt;/p&gt;&lt;p&gt;E cos&#236; questa stagione in bici &#232; andata... L'unica cosa positiva &#232; che non ho perso dati! :-D&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/Off_Topic/&quot; rel=&quot;tag&quot;&gt;Off Topic&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/az/post2307/OT-Problema-Serio-Dischi.aspx"/><issued>2008-07-04T18:21:00+01:00</issued><modified>2008-07-04T18:21:00+01:00</modified><slash:comments>5</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2307/OT-Problema-Serio-Dischi.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2307.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2307</trackback:ping></entry><entry><title>UrlRewriting con trabocchetti vari</title><id>http://blogs.aspitalia.com/az/post2181/UrlRewriting-Trabocchetti-Vari.aspx</id><created>2007-12-11T21:05:00+01:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2181' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Mi sono preso un paio di giorni per sistemare il mio &lt;a title=&quot;IL MIO SITO!!!&quot; href=&quot;http://ciclismo.sitiasp.it/&quot;&gt;sito&lt;/a&gt;. A parte la sporcizia di codice che lo ha sempre contraddistinto (all'interno&#160;&#232; codice in VB&#160;del 2002) e che ho in parte&#160;ripulito, ho implementato un url rewriting per migliorare l'indicizzazione da parte dei motori di ricerca.&lt;/p&gt;&lt;p&gt;Visto che &#232; il mio quel sito, e visto che &#232; sempre stata la mia palestra per l'asp.net, ho provato vari modi per la sua implementazione. Inizialmente avevo posto la mia attenzione all'uso degli handler come avevo spiegato &lt;a title=&quot;Usag 621&quot; href=&quot;http://www.aspitalia.com/liste/usag/script.aspx?ID=621&quot;&gt;qui&lt;/a&gt; nel lontano luglio del 2004, tecnica che trovo descritta anche attualmente in molti blog. Ma mi sono dovuto ricredere dopo i primi rilasci in beta per dei rallentamenti iniziali che non mi spiegavo. Dopo aver studiato per bene il funzionamento di tale tecnica con la mia web application, ho dovuto prendere la decisione di rinunciare, perch&#233; s&#236; questa tenica risolve molti problemi, come il cambio di nome per i postback e necessit&#224; simili, ma creava un lavoro al server supplementare del tutto inutile.&lt;/p&gt;&lt;p&gt;L'uso di quel tipo di handler prende in consegna al richiesta e la ricompila con il nome della nuova pagina, e questo creava tanti file compilati nella cache di asp.net, quante erano le pagine elaborate con tale tecnica. Riprendendo l'esempio con quello script, io facevo in modo che un link di questo tipo:&lt;br /&gt;www.nomesito.xxx/articolo.aspx?codice=001&lt;/p&gt;&lt;p&gt;Potesse venire invocato con questo url:&lt;br /&gt;www.nomesito.xxx/articolo001.aspx&lt;/p&gt;&lt;p&gt;Il problema &#232; dato dal fatto che ogni singolo articolo cos&#236; specificato crea nella cache di asp.net una pagina compilata a s&#233;, e per ogni articolo&#160;richiesto c'&#232; un periodo di latenza dovuta alla nuova compilazione. Lo scenario diventa apocalittico se, nel mio caso e per il sito, gli articoli fossero stati un milione e fosse molto trafficato e tutti&#160;sarebbero richiesti. Nella cache di asp.net si sarebbero creati, per assurdo e solo teoricamente, 1.000.000 di file!&lt;/p&gt;&lt;p&gt;Ho deciso cos&#236; di risolvere in un altro modo pi&#249; semplice e prestazionale. In rete sono disponibili gratuitamente due componenti che fanno questo lavoro egregiamente lasciando perdere quello introdotto di asp.net 2.0 che &#232; molto limitato. Io ho preso in considerazione:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;a title=&quot;Link esterno&quot; href=&quot;http://www.urlrewriting.net/en/Default.aspx&quot;&gt;UrlRewritingNet&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a title=&quot;Link esterno&quot; href=&quot;http://www.pluralsight.com/blogs/fritz/archive/2004/07/21/1651.aspx&quot;&gt;Redirect module&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Entrambi hanno funzioni complete, come l'uso del codice http 301 per i trasferimenti di pagina e cos&#236; via. Alla fine la mia decisione &#232; caduta sul primo, ma solo per casualit&#224;.&lt;/p&gt;&lt;p&gt;In ogni caso, attenzione all'handler e al PageParser.GetCompiledPageIstance e a come viene utilizzato. Nel mio caso era un danno.&lt;/p&gt;&lt;p&gt;Tra due giorni &#232; Santa Lucia.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework/&quot; rel=&quot;tag&quot;&gt;.NET Framework&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_2.0/&quot; rel=&quot;tag&quot;&gt;.NET Framework 2.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/ASP.NET/&quot; rel=&quot;tag&quot;&gt;ASP.NET&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/HttpHandler/&quot; rel=&quot;tag&quot;&gt;HttpHandler&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/az/post2181/UrlRewriting-Trabocchetti-Vari.aspx"/><issued>2007-12-11T21:05:00+01:00</issued><modified>2007-12-11T21:05:00+01:00</modified><slash:comments>4</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2181/UrlRewriting-Trabocchetti-Vari.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2181.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2181</trackback:ping></entry><entry><title>[OT] Noi che...</title><id>http://blogs.aspitalia.com/az/post2173/OT-Che.aspx</id><created>2007-11-30T13:53:00+01:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2173' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Anche se io faccio raramente OT nel mio blog, mamma mia che bugiardo sono, ecco dei link &lt;strong&gt;&lt;em&gt;solo&lt;/em&gt;&lt;/strong&gt; per gente nata negli anni '70 e i primi anni '80:&lt;/p&gt;&lt;p&gt;&lt;a title=&quot;Link esterno&quot; href=&quot;http://www.youtube.com/watch?v=BITzJGcFA_I&quot;&gt;http://www.youtube.com/watch?v=BITzJGcFA_I&lt;/a&gt;&lt;br /&gt;&lt;a title=&quot;Link esterno&quot; href=&quot;http://www.youtube.com/watch?v=-jHB1ZsM2-Q&quot;&gt;http://www.youtube.com/watch?v=-jHB1ZsM2-Q&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Per gli emotivi, preparate i fazzoletti! :')&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/Off_Topic/&quot; rel=&quot;tag&quot;&gt;Off Topic&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/az/post2173/OT-Che.aspx"/><issued>2007-11-30T13:53:00+01:00</issued><modified>2007-11-30T13:53:00+01:00</modified><slash:comments>2</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2173/OT-Che.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2173.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2173</trackback:ping></entry><entry><title>Windows Forms - DataGridView e validazione</title><id>http://blogs.aspitalia.com/az/post2132/Windows-Forms-DataGridView-Validazione.aspx</id><created>2007-09-23T20:08:00+01:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2132' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Sto sistemando una piccola applicazione windows forms&#160;che ho scritto in C# per renderla pi&#249; &lt;em&gt;umana&lt;/em&gt;. Ieri sera ho perso pi&#249; di un'ora - due - per risolvere un problema con la validazione dei dati inseriti in un DataGridView. Tutto sembrava semplice all'inizio visto che &#232; sufficiente agganciare all'evento &lt;em&gt;CellValidating&lt;/em&gt; il proprio codice per controllare il contenuto delle celle:&lt;/p&gt;&lt;code&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;...&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (e.ColumnIndex == 2)&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; int numero;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (int.TryParse(e.FormattedValue.ToString(), out numero) == false)&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; dataGridView1.Rows[e.RowIndex].ErrorText = &amp;quot;Inserire un valore numerico!&amp;quot;;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; e.Cancel = true;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;else&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; dataGridView1.Rows[e.RowIndex].ErrorText = null;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }&lt;/code&gt;&lt;p&gt;Avviato l'esempio &#232; tutto ok, nella cella prescelta posso inserire solo un valore numerico intero, altrimenti compare il &lt;em&gt;bollino&lt;/em&gt; rosso e l'errore specificato. Ma da qui inizia il patimento. Se, lasciato il contenuto errato in quella cella, qualsiasi altro webcontrol non risponde, neanche la chiusura della finestra. Penso che sia come per le web application: modifico la propriet&#224; &amp;quot;Validating&amp;quot; dei singolo webcontrol all'infuori del DataGridView, ma nulla. Inizio a fare una ricerca su Internet, e trovo che &#232; un problema comune e scopro qualche trucco per scavalcare il problema, ma non in modo soddisfacente.&lt;/p&gt;&lt;p&gt;Alla fine, testando, mettendo pi&#249; idee insieme e tirando cazzotti alla tastiera ho trovato una buona soluzione. Innanzitutto &#232; necessario disattivare la generazione di &lt;em&gt;exception&lt;/em&gt; in caso di inserimento di un dato errato nella cella. Aggiungiamo questo codice all'avento &lt;em&gt;DataError&lt;/em&gt; del &lt;em&gt;DataGridView&lt;/em&gt;:&lt;/p&gt;&lt;code&gt;private void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e)&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; e.ThrowException = false;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }&lt;/code&gt;&lt;p&gt;Ora aggiungiamo quest'altro codice all'evento &lt;em&gt;Leave&lt;/em&gt;, che ci permette di ripristinare il contenuto della cella che era presente prima della nostra modifica o per inserire un valore di &lt;em&gt;default&lt;/em&gt; dato il tipo:&lt;/p&gt;&lt;code&gt;private void dataGridView1_Leave(object sender, EventArgs e)&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; for (int i = 0; i &amp;lt; dataGridView1.Rows.Count; i++)&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; for (int y = 0; y &amp;lt; dataGridView1.ColumnCount; y++)&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; dataGridView1.Rows[i].Cells[y].Value=&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; dataGridView1.Rows[i].Cells[y].GetEditedFormattedValue(i, DataGridViewDataErrorContexts.Commit);&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }&lt;/code&gt;&lt;p&gt;Infine, per permettere la chiusura della finestra senza comunicazioni alcune, aggiungiamo questo codice all'evento &lt;em&gt;FormClosing&lt;/em&gt; della nostra &lt;em&gt;form&lt;/em&gt;:&lt;/p&gt;&lt;code&gt;private void Principale_FormClosing(object sender, FormClosingEventArgs e)&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; e.Cancel = false;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }&lt;/code&gt;&lt;p&gt;Fine.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework/&quot; rel=&quot;tag&quot;&gt;.NET Framework&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_2.0/&quot; rel=&quot;tag&quot;&gt;.NET Framework 2.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Visual_Studio/&quot; rel=&quot;tag&quot;&gt;Visual Studio&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/az/post2132/Windows-Forms-DataGridView-Validazione.aspx"/><issued>2007-09-23T20:08:00+01:00</issued><modified>2007-09-23T20:08:00+01:00</modified><slash:comments>0</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2132/Windows-Forms-DataGridView-Validazione.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2132.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2132</trackback:ping></entry><entry><title>Contro il caro pertrolio</title><id>http://blogs.aspitalia.com/az/post2131/Caro-Pertrolio.aspx</id><created>2007-09-23T20:06:56+01:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2131' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;In zone extradoganali fare benzina ritorna ad essere un piacere:&lt;/p&gt; &lt;p&gt;&lt;img height=&quot;362&quot; alt=&quot;prezzo benzina&quot; src=&quot;http://blogs.aspitalia.com/img/andrewz/controilcaropertrolio_11a32/image0031.jpg_1.jpg&quot; width=&quot;520&quot; border=&quot;0&quot; /&gt; &lt;/p&gt; &lt;p&gt; Verde a 0.889 e gasolio a 0.750 al litro &#232; un miraggio ormai... Miraggio... incredulit&#224;, come si prova sempre, anche se si conosce, poco lontano al passo Bernina a 2.350 m.s.l.m., dopo essere scesi da un ripido sentiero, nel trovarsi dinanzi una stazione:&lt;/p&gt; &lt;p&gt;&lt;img height=&quot;390&quot; alt=&quot;stazione trenino rosso bernina&quot; src=&quot;http://blogs.aspitalia.com/img/andrewz/controilcaropertrolio_11a32/image0040.jpg_1.jpg&quot; width=&quot;520&quot; border=&quot;0&quot; /&gt;&lt;/p&gt; &lt;p&gt;Va be', &#232; una stazione del famoso &lt;a title=&quot;link esterno&quot; href=&quot;http://www.flaviocapra-bernina.net/viaggiobb.htm&quot;&gt;trenino rosso&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/Off_Topic/&quot; rel=&quot;tag&quot;&gt;Off Topic&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/az/post2131/Caro-Pertrolio.aspx"/><issued>2007-09-23T20:06:56+01:00</issued><modified>2007-09-23T20:06:56+01:00</modified><slash:comments>3</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2131/Caro-Pertrolio.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2131.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2131</trackback:ping></entry><entry><title>Firme nei forum: record!</title><id>http://blogs.aspitalia.com/az/post2128/Firme-Forum-Record.aspx</id><created>2007-09-18T10:30:00+01:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2128' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Un amico di Milano sa il mio astio per i forum che permettono la libera creazione di firme nei post senza limiti. Ricordo che, scherzando con l'amico, gli dissi che mancavano solo i DIVX come firma... ebbene, dopo aver trovato in alcuni forum di community immagini assurde di centinaia di KB - ma a che servono? - finalmente(!?!?) ho trovato un &lt;em&gt;filmato&lt;/em&gt; in una firma!&lt;/p&gt;&lt;p&gt;Senza spiegare perch&#233; sono finito su quel forum, ecco la &lt;a title=&quot;link esterno&quot; href=&quot;http://edrivombrosa.forumer.it/about1242-edrivombrosa.html&quot;&gt;pagina&lt;/a&gt; incriminata dove &#232; possibile vedere la firma di &lt;em&gt;Sissi66&lt;/em&gt;. D'accordo, non &#232; un divx ma &#232; una gif animata, anzi due, che pensano complessivamente &lt;strong&gt;1,9MB!!!&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Sono sempre pi&#249; convinto che un'educazione informatica sarebbe necessaria prima di permettere l'uso di un computer.&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;em&gt;Svestitelo e lui sapr&#224; guarire, &lt;br /&gt;e se non sa guarire uccidetelo! &lt;br /&gt;&#200; solo un medico, solo un medico!&lt;br /&gt;(&lt;a title=&quot;link esterno&quot; href=&quot;http://www.mpa-garching.mpg.de/~maio/metamorfosi.pdf&quot;&gt;Un medico di campagna&lt;/a&gt; - Franz Kafka)&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/Off_Topic/&quot; rel=&quot;tag&quot;&gt;Off Topic&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/az/post2128/Firme-Forum-Record.aspx"/><issued>2007-09-18T10:30:00+01:00</issued><modified>2007-09-18T10:30:00+01:00</modified><slash:comments>6</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2128/Firme-Forum-Record.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2128.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2128</trackback:ping></entry><entry><title>Flashblock - per evitare l'abuso di flash nei siti</title><id>http://blogs.aspitalia.com/az/post2127/Flashblock-Evitare-Abuso-Flash-Siti.aspx</id><created>2007-09-16T22:20:00+01:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2127' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;Se non fosse che &#232; utile per quei siti che &lt;span style=&quot;font-style: italic;&quot;&gt;vivono&lt;/span&gt; grazie alla tecnologia multimediale di Macromedia, lo avrei disabilitato, disinstallato, o mai installato, il player di Flash visto l'abuso che in questi ultimi mesi/anni si &#232; avuto.&lt;br /&gt;Per Firefox c'&#232; una ottima &lt;span style=&quot;font-style: italic;&quot;&gt;extension&lt;/span&gt; che permette di abilitare solo dove si vuole le applet in flash potendo seleziona quali siti abilitarle di &lt;span style=&quot;font-style: italic;&quot;&gt;default&lt;/span&gt; permanentemente.&lt;br /&gt;L'&lt;span style=&quot;font-style: italic;&quot;&gt;extension&lt;/span&gt; si chiama Flashblock e lo si pu&#242; installare da questa &lt;a title=&quot;link esterno&quot; href=&quot;http://flashblock.mozdev.org/&quot;&gt;pagina&lt;/a&gt;. Dopo averlo avviato ecco come appare una schermata di &lt;a title=&quot;link esterno&quot; href=&quot;http://www.youtube.com&quot;&gt;youtube&lt;/a&gt;:&lt;br /&gt;&#160;&lt;br /&gt;&lt;img src=&quot;http://blogs.aspitalia.com/img/andrewz/youtubesenza.jpg&quot; /&gt;&lt;br /&gt;&#160;&lt;br /&gt;Per caricarlo &#232; sufficiente cliccare sul simbolo al centro dell'oggetto. Comodissimo, peccato che una simile &lt;span style=&quot;font-style: italic;&quot;&gt;utility&lt;/span&gt; non esiste per IE7 - almeno io non l'ho mai trovata.&lt;br /&gt;
&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/Off_Topic/&quot; rel=&quot;tag&quot;&gt;Off Topic&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/az/post2127/Flashblock-Evitare-Abuso-Flash-Siti.aspx"/><issued>2007-09-16T22:20:00+01:00</issued><modified>2007-09-16T22:20:00+01:00</modified><slash:comments>8</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2127/Flashblock-Evitare-Abuso-Flash-Siti.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2127.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2127</trackback:ping></entry><entry><title>Critiche tecniche del blog di Beppe Grillo</title><id>http://blogs.aspitalia.com/az/post2123/Critiche-Tecniche-Blog-Beppe-Grillo.aspx</id><created>2007-09-12T15:03:00+01:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2123' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;In questo blog non voglio criticare n&#233; lui, n&#233; le sue idee n&#233; i suoi accoliti n&#233; le sue iniziative. Ma non si possono avere pagine del blog di &lt;strong&gt;7MB&lt;/strong&gt; come &lt;a alt=&quot;link esterno&quot; target=&quot;_parent&quot; href=&quot;http://www.beppegrillo.it/2007/09/aria_fresca_in.html&quot;&gt;questa&lt;/a&gt;. A parte il caricamento lento, il rendering &#232; pesante persino sui computer veloci per non parlare dell'encoding dei caratteri che su alcuni rss aggregator crea problemi. Una decente paginazione dei commenti o la creazione di un forum apposito, non sarebbe l'ideale per una fruizione pi&#249; comoda e veloce?&lt;br /&gt;&lt;br /&gt;Se il buongiorno si vede dal mattino...&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/Off_Topic/&quot; rel=&quot;tag&quot;&gt;Off Topic&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/az/post2123/Critiche-Tecniche-Blog-Beppe-Grillo.aspx"/><issued>2007-09-12T15:03:00+01:00</issued><modified>2007-09-12T15:03:00+01:00</modified><slash:comments>0</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2123/Critiche-Tecniche-Blog-Beppe-Grillo.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2123.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2123</trackback:ping></entry></feed>