<?xml version="1.0" encoding="Windows-1252"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>AZ - Il blog di Andrea Zani</title><link>http://blogs.aspitalia.com/az/</link><description>AZ - Il blog di Andrea Zani</description><language>it-it</language><managingEditor>noreply(at)aspitalia.com(AZ - Il blog di Andrea Zani)</managingEditor><webMaster>daniele(at)aspitalia.com(Daniele Bochicchio)</webMaster><copyright>1998-2008 ASPItalia.com/AZ - Il blog di Andrea Zani</copyright><generator>Generated by feed.ASPItalia.com 'Weyoh' 4.8.818</generator><sy:updatePeriod>hourly</sy:updatePeriod><sy:updateFrequency>1</sy:updateFrequency><sy:updateBase>1998-01-01T12:00+00:00</sy:updateBase><image><title>AZ - Il blog di Andrea Zani</title><url>http://blogs.aspitalia.com/blogs.gif</url><link>http://blogs.aspitalia.com/az/</link></image><item><title>Entity Framework e il namespace EntityClient</title><link>http://blogs.aspitalia.com/az/post2363/Entity-Framework-Namespace-EntityClient.aspx</link><pubDate>Sat, 16 Aug 2008 14:01:17 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2363' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Sabato pomeriggio. L'entity framework permette, grazie alle classi contenuti nel namespace &lt;em&gt;EntityClient&lt;/em&gt;, la connessione e l'esecuzione di query direttamente sulle &lt;em&gt;entity&lt;/em&gt;, come se si trattasse di un database. Riferendomi sempre a grandi linee agli esempi esposti &lt;a href="http://blogs.aspitalia.com/az/post2359/lentity-framework-framework-3.5-sp.aspx"&gt;qui&lt;/a&gt; e &lt;a href="http://blogs.aspitalia.com/az/post2361/entity-framework-sql-generato.aspx"&gt;qui&lt;/a&gt;, ecco un banale esempio di utilizzo delle classi di questo namespace:&lt;/p&gt; &lt;p&gt;&lt;em&gt;using (System.Data.EntityClient.EntityConnection conn = new System.Data.EntityClient.EntityConnection("name=TestEntitiesCode"))&lt;br /&gt; {&lt;br /&gt; conn.Open(); &lt;/em&gt; &lt;p&gt;&lt;em&gt; System.Data.EntityClient.EntityCommand comm= conn.CreateCommand();&lt;br /&gt; comm.CommandText = "select na.Id, na.Names1, na.Books from TestEntitiesCode.Names as na";&lt;br /&gt; System.Data.EntityClient.EntityDataReader re = comm.ExecuteReader(System.Data.CommandBehavior.SequentialAccess);&lt;br /&gt; while (re.Read())&lt;br /&gt; {&lt;br /&gt; Response.Write(string.Format("{0}, {1} = ",&lt;br /&gt; re["Id"], re["Names1"]));&lt;br /&gt; ShowChildren(re["Books"] as System.Data.Common.DbDataReader);&lt;br /&gt; Response.Write("&amp;lt;br /&amp;gt;");&lt;br /&gt; }&lt;br /&gt; re.Close();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;private void ShowChildren(System.Data.Common.DbDataReader children)&lt;br /&gt;{&lt;br /&gt; while (children.Read())&lt;br /&gt; {&lt;br /&gt; Response.Write("[[");&lt;br /&gt; System.Data.IExtendedDataRecord columns = children as System.Data.IExtendedDataRecord;&lt;br /&gt; for (int i = 0; i &amp;lt; columns.FieldCount; i++)&lt;br /&gt; Response.Write(columns[i].ToString() + ", ");&lt;br /&gt; Response.Write("]]");&lt;br /&gt; }&lt;br /&gt;} &lt;/em&gt; &lt;p&gt;Due parole sulla sintassi. In &lt;em&gt;EntityConnection&lt;/em&gt; dobbiamo specificare il nome della classe del nostro model creato con VS2008 (nel dettaglio, aperto il model in VS2008 è sufficiente leggere la proprietà "Entity Container" nelle properties. Nell'esempio viene usata il &lt;em&gt;datareader&lt;/em&gt;. Per le proprietà dirette come l'&lt;em&gt;id&lt;/em&gt; e il name dell'entità &lt;em&gt;Names&lt;/em&gt;, possiamo accedere direttamente con il nome stesso, ma in caso volessimo accedere, come nell'esempio, a una collection di entity come la lista dalla tabella &lt;em&gt;Books&lt;/em&gt;, dobbiamo complicare un po' le cose. L'oggetto presente in &lt;em&gt;re["Books"]&lt;/em&gt; è &lt;em&gt;System.Data.Query.ResultAssembly.BridgeDataReader&lt;/em&gt; ma possiamo passarlo come un DbDataReader come nell'esempio. &lt;p&gt;In ShowChildren possiamo anche andare oltre, leggendo il tipo per ogni column e agire di conseguenza. Ma non ho approfondito oltre ed è sabato anche per me. Comunque, il risultato del codice è il seguente: &lt;p&gt;&lt;em&gt;1, Andrea = [[1, Book 1, ]]&lt;br /&gt;2, Andrea2 = [[2, Book 2, ]][[3, Book 3, ]]&lt;br /&gt;3, Andrea3 = [[4, Book 2, ]][[5, Book 3, ]]&lt;/em&gt; &lt;p&gt;Andando a vedere con il Profiler se ci fossero ancora sorprese, troviamo la query già spiegata &lt;a href="http://blogs.aspitalia.com/az/post2361/entity-framework-sql-generato.aspx"&gt;precedentemente&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2363/Entity-Framework-Namespace-EntityClient.aspx</guid><slash:comments>0</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2363/Entity-Framework-Namespace-EntityClient.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2363.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2363</trackback:ping></item><item><title>Entity Framework e l'sql generato</title><link>http://blogs.aspitalia.com/az/post2361/Entity-Framework-Sql-Generato.aspx</link><pubDate>Fri, 15 Aug 2008 10:22:15 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2361' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Una torna a casa per qualche giorno di ferie e si becca il maltempo. Qualcuno crede alla sfortuna, altri al destino... non me ne importa niente: il problema è che c'è brutto tempo!&lt;/p&gt; &lt;p&gt;Allora per ammazzare un po' il tempo prima di pranzo cosa c'è di meglio che giocare con leggerezza ancora con l'Entity Framework?&lt;/p&gt; &lt;p&gt;Dopo che nel &lt;a href="http://blogs.aspitalia.com/az/post2358/sql-server-2008-visual-studio-2008-sp1.aspx"&gt;post precedente&lt;/a&gt; ho fatto vedere un banale inserimento, ecco come visualizzare i dati inseriti:&lt;/p&gt; &lt;p&gt;&lt;em&gt;using (TestEntitiesModel.TestEntitiesCode context = new TestEntitiesModel.TestEntitiesCode())&lt;br /&gt;{&lt;br /&gt; var coll = from t in context.Names.Include("Books")&lt;br /&gt; select t;&lt;br /&gt; gw1.DataSource = coll;&lt;br /&gt; gw1.DataBind();&lt;br /&gt;} &lt;/em&gt; &lt;p&gt;Sempre con la sintassi Linq, faccio una select del contenuto della Entity &lt;em&gt;Names&lt;/em&gt; e con l'include, voglio anche che sia popolata la collection dei &lt;em&gt;Books&lt;/em&gt;. Il &lt;em&gt;GridView&lt;/em&gt; nel codice html è il seguente: &lt;p&gt;&lt;em&gt;&amp;lt;asp:GridView ID="gw1" EnableViewState="false" runat="server" AutoGenerateColumns="false"&amp;gt;&lt;br /&gt; &amp;lt;Columns&amp;gt;&lt;br /&gt; &amp;lt;asp:BoundField DataField="Id" /&amp;gt;&lt;br /&gt; &amp;lt;asp:BoundField DataField="Names1" /&amp;gt;&lt;br /&gt; &amp;lt;asp:TemplateField&amp;gt;&lt;br /&gt; &amp;lt;ItemTemplate&amp;gt;&lt;br /&gt; &amp;lt;asp:GridView ID="gw_book" runat="server" DataSource='&amp;lt;%# Eval("Books") %&amp;gt;'&amp;gt;&lt;br /&gt; &amp;lt;/asp:GridView&amp;gt;&lt;br /&gt; &amp;lt;/ItemTemplate&amp;gt;&lt;br /&gt; &amp;lt;/asp:TemplateField&amp;gt;&lt;br /&gt; &amp;lt;/Columns&amp;gt;&lt;br /&gt;&amp;lt;/asp:GridView&amp;gt;&lt;/em&gt; &lt;p&gt;Il risultato è il seguente: &lt;p&gt;&lt;img height="270" alt="result" src="http://blogs.aspitalia.com/img/andrewz/entityframeworkelsqlgenerato_adf2/image_1.png" width="176" border="0" /&gt; &lt;p&gt;Ma la mia grande curiosità è che comando sql è stato inviato a Sql Server. Armato di Profiler vado a curiosare e scopro una query alquanto bizzarra, almeno per me: &lt;p&gt;&lt;em&gt;SELECT &lt;br /&gt;[Project2].[Id] AS [Id], &lt;br /&gt;[Project2].[Names] AS [Names], &lt;br /&gt;[Project2].[C1] AS [C1], &lt;br /&gt;[Project2].[C2] AS [C2], &lt;br /&gt;[Project2].[Id1] AS [Id1], &lt;br /&gt;[Project2].[Title] AS [Title]&lt;br /&gt;FROM ( SELECT &lt;br /&gt; [Extent1].[Id] AS [Id], &lt;br /&gt; [Extent1].[Names] AS [Names], &lt;br /&gt; 1 AS [C1], &lt;br /&gt; [Project1].[Id] AS [Id1], &lt;br /&gt; [Project1].[Title] AS [Title], &lt;br /&gt; [Project1].[C1] AS [C2]&lt;br /&gt; FROM [dbo].[Names] AS [Extent1]&lt;br /&gt; LEFT OUTER JOIN (SELECT &lt;br /&gt; [Extent2].[NamesId] AS [NamesId], &lt;br /&gt; [Extent3].[Id] AS [Id], &lt;br /&gt; [Extent3].[Title] AS [Title], &lt;br /&gt; 1 AS [C1]&lt;br /&gt; FROM [dbo].[NamesBooks] AS [Extent2]&lt;br /&gt; INNER JOIN [dbo].[Books] AS [Extent3] ON [Extent3].[Id] = [Extent2].[BooksId] ) AS [Project1] ON [Extent1].[Id] = [Project1].[NamesId]&lt;br /&gt;) AS [Project2]&lt;br /&gt;ORDER BY [Project2].[Id] ASC, [Project2].[C2] ASC&lt;/em&gt; &lt;p&gt;Ancora una volta avevo pensato male. Avevo immaginato che facesse una prima query e quindi &lt;em&gt;n&lt;/em&gt; eventuali per la tebella figlia, e invece ha creato un unico comando con sotto query in modo molto furbo. &lt;p&gt;Il risultato della query lanciata così come appare è il seguente: &lt;p&gt;&lt;img height="152" alt="query result" src="http://blogs.aspitalia.com/img/andrewz/entityframeworkelsqlgenerato_adf2/image_3.png" width="256" border="0" /&gt;&lt;/p&gt; &lt;p&gt;E' lui da codice poi a fare il distict per la collection Names e con le colonne virtuali create, &lt;em&gt;C1&lt;/em&gt; e &lt;em&gt;C2&lt;/em&gt; utilizzate in caso di più tabelle figlie.&lt;/p&gt; &lt;p&gt;Mi piace l'Entity Framework. Ne so ben poco, ma mi piace!&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2361/Entity-Framework-Sql-Generato.aspx</guid><slash:comments>4</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2361/Entity-Framework-Sql-Generato.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2361.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2361</trackback:ping></item><item><title>L'entity framework, e il Framework 3.5 senza SP 1</title><link>http://blogs.aspitalia.com/az/post2359/Lentity-Framework-Framework-3.5-SP.aspx</link><pubDate>Thu, 14 Aug 2008 12:09:36 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2359' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Come ho detto ieri ciò che mi piace è l'entity framework. Ma se creo un progetto web con VS2008 e SP1 che utilizza questi nuovi oggetti, e lo eseguo su un server con il Framework 3.5 senza SP1, funziona? Ne discutevo ieri con &lt;a title="link esterno" href="http://blogs.dotnethell.it/david/"&gt;David&lt;/a&gt;. Sinceramente pensavo di sì, perché credevo che fosse tutta opera di VS2008 che, come il DataContext e Linq, crea in automatico le classi di supporto e il tutto che consente di lavorare con le entity.&lt;/p&gt; &lt;p&gt;Mi sbagliavo: faccio delle prove e il progetto non parte nemmeno perché non trova delle dll. Ecco le nuove inserite nel web.config della web application:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&amp;lt;add assembly="System.Data.Entity, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" /&amp;gt; &lt;li&gt;&amp;lt;add assembly="System.Data.Entity.Design, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" /&amp;gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt; Andando ancora più in dettaglio, si può vedere la nuova stringa di connessione in caso di utilizzo dell'entity framework:&lt;/p&gt; &lt;p&gt;&lt;em&gt;&amp;lt;connectionStrings&amp;gt;&lt;br /&gt; &amp;lt;add name="TestEntities" connectionString="metadata=res://*; provider=System.Data.SqlClient; provider connection string=&amp;amp;quot;Data Source=.\SQLSERVER2008;Initial Catalog=Test;Persist Security Info=True;User ID=yyy; Password=xxx; MultipleActiveResultSets=True&amp;amp;quot;" providerName="System.Data.EntityClient" /&amp;gt;&lt;br /&gt; &amp;lt;/connectionStrings&amp;gt;&lt;/em&gt; &lt;p&gt;E il provider &lt;em&gt;EntityClient&lt;/em&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2359/Lentity-Framework-Framework-3.5-SP.aspx</guid><slash:comments>6</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2359/Lentity-Framework-Framework-3.5-SP.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2359.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2359</trackback:ping></item><item><title>[OT] Un anno fa...</title><link>http://blogs.aspitalia.com/az/post2360/OT-Anno-Fa.aspx</link><pubDate>Thu, 14 Aug 2008 11:53:31 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2360' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;... rimanevo allibito nel vedere questa offerta di connessione a Internet a 15 Lev, circa 7 euro al mese per una 2MBit! All'epoca pagavo quasi 20 euro con la Telecom!&lt;/p&gt; &lt;p&gt;&lt;img height="640" alt="sofia connessione internet" src="http://blogs.aspitalia.com/img/andrewz/otunannofa_c35a/immag064_1.jpg" width="480" border="0" /&gt;&lt;/p&gt; &lt;p&gt; Mi è piaciuta Sofia, e al cirillico ci si doveva solo abituare...&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/Off_Topic/" rel="tag"&gt;Off Topic&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>Imho, Off Topic</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2360/OT-Anno-Fa.aspx</guid><slash:comments>6</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2360/OT-Anno-Fa.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2360.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2360</trackback:ping></item><item><title>Sql Server 2008 e Visual Studio 2008 SP1</title><link>http://blogs.aspitalia.com/az/post2358/Sql-Server-2008-Visual-Studio-2008-SP1.aspx</link><pubDate>Wed, 13 Aug 2008 17:18:22 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2358' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Mentre c'&amp;#232; gente che come bistecche ai ferri si rosola al sole - mentre io sono rimasto in citt&amp;#224; e sono pi&amp;#249; bianco di Casper e non ho nemmeno vicino Christina Ricci - ecco che questi due prodotti li ho finalmente installati. Fa una certa impressione vedere l'intellisense e il debug con il Managment Studio di Sql (solo, purtroppo, per db su 2008):&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.aspitalia.com/img/andrewz/sqlserver2008evisualstudio2008sp1_10f47/image_2.png"&gt;&lt;img height="233" alt="image" src="http://blogs.aspitalia.com/img/andrewz/sqlserver2008evisualstudio2008sp1_10f47/image_thumb.png" width="517" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;E trovare, finalmente, l'Entity Framework. E piacevole vedere che, con questa banalissima struttura, i vantaggi che si avranno poi con il codice:&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.aspitalia.com/img/andrewz/sqlserver2008evisualstudio2008sp1_10f47/image_4.png"&gt;&lt;img height="477" alt="image" src="http://blogs.aspitalia.com/img/andrewz/sqlserver2008evisualstudio2008sp1_10f47/image_thumb_1.png" width="403" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Importato tutto in VS2008 nell'oggetto &amp;quot;ADO.Net Entity Data Model&amp;quot; ho il risultato:&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.aspitalia.com/img/andrewz/sqlserver2008evisualstudio2008sp1_10f47/image_6.png"&gt;&lt;img height="439" alt="image" src="http://blogs.aspitalia.com/img/andrewz/sqlserver2008evisualstudio2008sp1_10f47/image_thumb_2.png" width="276" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Da solo VS2008 &amp;#232; stato in grado di creare le entit&amp;#224; con il corretto mapping. Vediamo che cosa posso scrivere ora:&lt;/p&gt; &lt;p&gt;&lt;em&gt;TestModel.TestEntities context = new TestModel.TestEntities(); &lt;br /&gt;TestModel.names n = new TestModel.names(); &lt;br /&gt;n.name = &amp;quot;AZ&amp;quot;; &lt;br /&gt;TestModel.books b = new TestModel.books(); &lt;br /&gt;b.title = &amp;quot;Book 1&amp;quot;; &lt;br /&gt;n.books.Add(b); &lt;br /&gt;context.AddTonames(n); &lt;br /&gt;context.SaveChanges();&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Avviato, mi sono trovato il tutto mappato correttamente nelle tabelle:&lt;/p&gt; &lt;p&gt;&lt;em&gt;SELECT *&amp;#160; FROM [names] &lt;br /&gt;SELECT *&amp;#160; FROM [books] &lt;br /&gt;SELECT *&amp;#160; FROM [names_books]&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;id&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; name &lt;br /&gt;----------- -------------------------------------------------- &lt;br /&gt;5&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; AZ &lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;(Righe interessate: 1) &lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;id&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; title &lt;br /&gt;----------- -------------------------------------------------- &lt;br /&gt;4&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Book 1 &lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;(Righe interessate: 1) &lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;id_name&amp;#160;&amp;#160;&amp;#160;&amp;#160; id_book &lt;br /&gt;----------- ----------- &lt;br /&gt;5&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 4 &lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;(Righe interessate: 1)&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Ma che ci si va a fare in ferie quando si hanno queste belle sorprese dai programmatori Microsoft? Ma chi desidera ora acque cristalline o montagne? Perch&amp;#233; dovrei desiderare di poter andare con la mia bici? Perch&amp;#233; dovrei stare ad alta quota che c'&amp;#232; pure fresco quando invece posso divertirmi con l'entity framework? Il debug di Sql 2008 mi far&amp;#224; compagnia in questi giorni, alla faccia vostra!&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>Software</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2358/Sql-Server-2008-Visual-Studio-2008-SP1.aspx</guid><slash:comments>4</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2358/Sql-Server-2008-Visual-Studio-2008-SP1.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2358.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2358</trackback:ping></item><item><title>[OT] Dove non sono andato in vacanza quest'anno</title><link>http://blogs.aspitalia.com/az/post2357/OT-Andato-Vacanza-Questanno.aspx</link><pubDate>Mon, 11 Aug 2008 17:33:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2357' border="0" style="width:1px; height:1px;" /&gt;Se ne parlava come al solito con gli amici dall'anno scorso. Si doveva decidere solo tra due paesi: l'&lt;a title="Link esterno" href="http://www.viaggiaresicuri.it/index.php?id=322&amp;amp;tx_ttnews[tt_news]=3125&amp;amp;tx_ttnews[backPid]=3054&amp;amp;no_cahce=1&amp;amp;mese=&amp;amp;lim=10&amp;amp;country=431"&gt;Armenia&lt;/a&gt; o la &lt;a href="http://www.viaggiaresicuri.it/index.php?id=322&amp;amp;tx_ttnews[tt_news]=3254&amp;amp;tx_ttnews[backPid]=3054&amp;amp;no_cahce=1&amp;amp;mese=&amp;amp;lim=10&amp;amp;country=435" title="Link esterno"&gt;Georgia&lt;/a&gt;. Fino a febbraio di quest'anno ne parlavamo, ma poi problemi &lt;a title="Mio blog precedente" href="http://blogs.aspitalia.com/az/post2307/OT-Problema-Serio-Dischi.aspx"&gt;miei&lt;/a&gt; e di altre persone del gruppo ci hanno fatto desistere da questo viaggio.&lt;br /&gt;&lt;br /&gt;Come si dice, non tutto il male viene per nuocere sapendo che saremmo stati in uno di quegli Stati proprio questa settimana.&lt;br /&gt;
&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/Off_Topic/" rel="tag"&gt;Off Topic&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>Imho, Off Topic</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2357/OT-Andato-Vacanza-Questanno.aspx</guid><slash:comments>5</slash:comments><wfw:comments>http://blogs.aspitalia.com/az/post2357/OT-Andato-Vacanza-Questanno.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2357.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2357</trackback:ping></item><item><title>Come tutto deve ancora iniziare.</title><link>http://blogs.aspitalia.com/az/post2346/Ancora-Iniziare.aspx</link><pubDate>Sat, 26 Jul 2008 09:47:36 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2346' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;A quale età 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'è 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'è 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 è sempre stato il C++ ma non solo sintatticamente: troppa gente si riempe la bocca dicendo di conoscerlo perché 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 è 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à, lascia perdere.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Qual è la cosa più 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 è 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 è&lt;/strong&gt; SENZA APOSTROFO!&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/Off_Topic/" rel="tag"&gt;Off Topic&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>Imho, Off Topic</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2346/Ancora-Iniziare.aspx</guid><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></item><item><title>Quale Binding scegliere con WCF</title><link>http://blogs.aspitalia.com/az/post2323/Binding-Scegliere-WCF.aspx</link><pubDate>Sat, 12 Jul 2008 18:08:22 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2323' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Di questo schema volevo farmi un poster da appendere in camera perché lo trovo molto chiaro e utile:&lt;/p&gt; &lt;p&gt;&lt;img height="297" alt="wcfbindings" src="http://blogs.aspitalia.com/img/andrewz/qualebindingscegliereconwcf_11b33/wcfbindings_1.jpg" width="545" border="0" /&gt; &lt;/p&gt; &lt;p&gt;&lt;em&gt;Rubato&lt;/em&gt; da questo &lt;a title="link esterno" href="http://weblogs.asp.net/spano/archive/2007/10/02/choosing-the-right-wcf-binding.aspx"&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="http://tags.aspitalia.com/.NET_Framework_3.0/" rel="tag"&gt;.NET Framework 3.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Windows_Communication_Foundation/" rel="tag"&gt;Windows Communication Foundation&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>Memo, .NET Framework 3.0, Windows Communication Foundation</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2323/Binding-Scegliere-WCF.aspx</guid><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></item><item><title>Mono e Remoting: come scambiare informazioni tra Windows e Linux</title><link>http://blogs.aspitalia.com/az/post2321/Mono-Remoting-Scambiare-Informazioni-Windows-Linux.aspx</link><pubDate>Fri, 11 Jul 2008 18:44:31 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2321' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;In un blog &lt;a title="blog precedente per la creazione di servizi con mono" href="http://blogs.aspitalia.com/az/post2308/servizi-csharp-macchine-linux-mono.aspx"&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é l'obbiettivo a cui voglio giungere è 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 è l'utilizzo dei web services. Subito però nasce un problema di base: per poterli utilizzare dobbiamo avere un web server che gira sulla macchina, e questo non è sempre una buona soluzione perché necessità di installazioni e sistemi operativi che consentono questa operazione. Nel mondo Windows è necessario avere almeno Windows Xp Professional oppure Vista. Con qualsiasi distribuzione Linux dobbiamo &lt;a title="articolo su mono in apitalia.com" href="http://www.aspitalia.com/articoli/asp.net/mono.aspx"&gt;installare&lt;/a&gt; Apache e il modulo apposito perché possano essere elaborate le pagine asp.net. Ne vale la pena? No, perché il mondo .Net permette un mezzo più 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à di web server, inoltre possiamo utilizzare la serializzazione binaria per la trasmissione di dati molto più 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 è presente la tecnologia WCF, molto più potente, ma il mondo Mono è ancora indietro e l'implementazione di WCF e delle novità presenti dal Framework 3.0 (nome in codice &lt;a title="link esterno" href="http://www.mono-project.com/olive"&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="mio articolo per aspitalia.com per il remoting e ws" href="http://www.aspitalia.com/articoli/asp.net/webservices_remoting_wse2.aspx"&gt;qui&lt;/a&gt;. Per spiegare meglio la soluzione proposta in questo blog, ho scritto un banale progetto con MonoDevelop che è possibile scaricare dal link a fondo pagina. Questo piccolo progetto ripropone quanto già detto nel blog riguardante la creazione di servizi con Mono. Per questa occasione ho aggiunto al servizio la possibilità 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 è 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: è 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; "RemotingMessage",WellKnownObjectMode.SingleCall);&lt;br /&gt; MainClass.WriteLog(ServiceName, "Remoting started..."); &lt;br /&gt; while (!stopThread)&lt;br /&gt; Thread.Sleep (2000);&lt;br /&gt;} &lt;/em&gt; &lt;p&gt;_MainLoop è la funzione che è possibile trovare spiegata nel blog &lt;a title="mio blog precedente per la creazione di un servizio con mono per linux" href="http://blogs.aspitalia.com/az/post2308/servizi-csharp-macchine-linux-mono.aspx"&gt;precedente&lt;/a&gt;. In quell'esempio era presente solo il ciclo while, ora è stato aggiunto il codice per l'attesa di chiamate dalla porta Tcp 1981 della classe "Information": &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("Remoting", "received: "+name); // scrive log&lt;br /&gt; return string.Format("{0}: {1}",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 è 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="io"; // 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 = "tcp://192.168.0.7:1981/RemotingMessage";&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("Impossibile comunicare con il server");&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à al posto nostro alla creazione di una classe proxy per la serializzazione binaria e la trasmissione.&lt;/p&gt; &lt;p&gt;Se si è 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="client su macchina windows" src="http://blogs.aspitalia.com/img/andrewz/immagini/remoting2.png" /&gt; &lt;/p&gt; &lt;p&gt;Questo anche da altre macchine Linux con Mono:&lt;/p&gt; &lt;p&gt;&lt;img alt="client su macchina linux" src="http://blogs.aspitalia.com/img/andrewz/immagini/remoting3.png" /&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 è in grado di loggare le richieste. Vediamo che cosa ha memorizzato:&lt;/p&gt; &lt;p&gt;&lt;img alt="log del servizio" src="http://blogs.aspitalia.com/img/andrewz/immagini/remoting1.png" /&gt;&lt;/p&gt; &lt;p&gt;Il codice presente nell'allegato ha l'ip e la porta memorizzati direttamente nel codice, per modificarli è 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ì 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ù famosa, e forse utilizzata, distribuzione Linux ha un firewall pressocché 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 è possibile scaricarlo da questo &lt;a title="progetto d'esempio per il remoting" href="http://blogs.aspitalia.com/img/andrewz/upload/service1.zip"&gt;link&lt;/a&gt;. La piadina che ho mangiato a cena ce l'ho ancora sullo stomaco. Questa è un'altra divagazione.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/Mono/" rel="tag"&gt;Mono&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>Mono</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2321/Mono-Remoting-Scambiare-Informazioni-Windows-Linux.aspx</guid><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></item><item><title>TrueCrypt 6.0</title><link>http://blogs.aspitalia.com/az/post2319/TrueCrypt-6.0.aspx</link><pubDate>Thu, 10 Jul 2008 18:19:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2319' border="0" style="width:1px; height:1px;" /&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à, possano finire in mani estranee.&lt;/p&gt;&lt;p&gt;Qualche giorno fa è uscita la nuova versione 6.0 che permette una maggior protezione dei dati. Uno dei punti di forza di TrueCrypt è 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 è utile nel caso si venga constretti a fornire la password dietro minaccia o altro. In questo modo è possibile fornire la password per l'accesso al primo disco fittizio mentre il secondo, con i dati veramente importanti, 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="Link esterno" href="http://www.truecrypt.org/docs/?s=hidden-volume"&gt;pagina&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;In ultimo, una partizione create con TrueCrypt può 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="http://tags.aspitalia.com/Off_Topic/" rel="tag"&gt;Off Topic&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>Software, Off Topic</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2319/TrueCrypt-6.0.aspx</guid><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></item><item><title>Environment.NewLine</title><link>http://blogs.aspitalia.com/az/post2312/Environment.NewLine.aspx</link><pubDate>Tue, 08 Jul 2008 10:57:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2312' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Si ignora questa proprietà, 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 è utile perché imposta il corretto &lt;em&gt;ritorno a capo&lt;/em&gt; dipendentemente dal sistema operativo su cui gira consentendo una portabilità 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à 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é è 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à 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="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Mono/" rel="tag"&gt;Mono&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET, .NET Framework, Mono</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2312/Environment.NewLine.aspx</guid><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></item><item><title>[OT] Scannerizzare lastre e risonanze magnetiche</title><link>http://blogs.aspitalia.com/az/post2311/OT-Scannerizzare-Lastre-Risonanze-Magnetiche.aspx</link><pubDate>Mon, 07 Jul 2008 18:03:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2311' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Visto che più di una persona(*) mi ha chiesto come &lt;a title="Mio blog" href="http://blogs.aspitalia.com/az/post2307/OT-Problema-Serio-Dischi.aspx"&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 che porta buoni risultati.&lt;/p&gt;&lt;p&gt;Dopo vari tentativi con gli unici due scanner che ho  a casa in varie modalità operativa come &amp;quot;diapositiva&amp;quot;, tenendo il coperchio aperto, fornendo luce supplementare sopra alla lastra e così via senza giungere a nulla di buono, sono arrivato alla conclusione che la tenica più 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 è stata più 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  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="http://tags.aspitalia.com/Off_Topic/" rel="tag"&gt;Off Topic&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>Memo, Off Topic</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2311/OT-Scannerizzare-Lastre-Risonanze-Magnetiche.aspx</guid><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></item><item><title>Servizi in C# su macchine Linux con Mono</title><link>http://blogs.aspitalia.com/az/post2308/Servizi-CSharp-Macchine-Linux-Mono.aspx</link><pubDate>Sun, 06 Jul 2008 19:05:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2308' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Pochi giorni fa ho dovuto rifarmi una macchina su cui girava OpenSuse (la distribuzione che preferisco), ed ho deciso di installare la nuova versione di Ubuntu 8.04 per curiosità 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 di Mono è la 1.2.6, mentre l'ultima release è 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; è 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# che può girare sia sotto Windows che Linux. Il codice seguente è possibile compilarlo Visual Studio, da linea di comando sotto Linux con Mono o con MonoDevelop, e può 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; class MainClass&lt;br /&gt; {&lt;br /&gt;  private const string LogFile = &amp;quot;TestService.log&amp;quot;;&lt;br /&gt;&lt;br /&gt;  // The main entry point for the process&lt;br /&gt;  static void Main()&lt;br /&gt;  {&lt;br /&gt;   Write2Log(null, &amp;quot;Main starting&amp;quot;);&lt;br /&gt;   System.ServiceProcess.ServiceBase[] ServicesToRun;&lt;br /&gt;   ServicesToRun = new System.ServiceProcess.ServiceBase[] { new TestService(&amp;quot;TestService1&amp;quot;)};&lt;br /&gt;   System.ServiceProcess.ServiceBase.Run(ServicesToRun);&lt;br /&gt;   Write2Log(null, &amp;quot;Main ended&amp;quot;);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public static void Write2Log(string category, string message)&lt;br /&gt;  {&lt;br /&gt;   using (StreamWriter w = new StreamWriter(LogFile, true, System.Text.Encoding.UTF8) )&lt;br /&gt;   {&lt;br /&gt;    if ( category != null )&lt;br /&gt;     w.WriteLine(DateTime.Now.ToString() + &amp;quot; &amp;quot; + category + &amp;quot; - &amp;quot; + message);&lt;br /&gt;    else&lt;br /&gt;     w.WriteLine(DateTime.Now.ToString() + &amp;quot; &amp;quot; + message);&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public class TestService : System.ServiceProcess.ServiceBase&lt;br /&gt; {&lt;br /&gt;  private Thread mainThread = null;&lt;br /&gt;  private bool stopThread = false;&lt;br /&gt;&lt;br /&gt;  public TestService(string name)&lt;br /&gt;  {&lt;br /&gt;   this.ServiceName = name;&lt;br /&gt;   this.CanPauseAndContinue = true;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  protected override void Dispose( bool disposing )&lt;br /&gt;  {&lt;br /&gt;   MainClass.Write2Log(ServiceName, &amp;quot;Dispose&amp;quot;);&lt;br /&gt;   base.Dispose( disposing );&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  protected override void OnStart(string[] args)&lt;br /&gt;  {&lt;br /&gt;   MainClass.Write2Log(ServiceName, &amp;quot;Starting Service...&amp;quot;);   &lt;br /&gt;   mainThread = new Thread (new ThreadStart (_MainLoop));&lt;br /&gt;   stopThread = false;&lt;br /&gt;   mainThread.Start ();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  protected override void OnStop()&lt;br /&gt;  {&lt;br /&gt;   MainClass.Write2Log(ServiceName, &amp;quot;Stopping Service...&amp;quot;);&lt;br /&gt;   if (mainThread != null) {&lt;br /&gt;    stopThread = true;&lt;br /&gt;    mainThread.Join ();&lt;br /&gt;    mainThread = null;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  protected override void OnPause()&lt;br /&gt;  {&lt;br /&gt;   MainClass.Write2Log(ServiceName, &amp;quot;Pausing Service...&amp;quot;);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  protected override void OnContinue()&lt;br /&gt;  {&lt;br /&gt;   MainClass.Write2Log(ServiceName, &amp;quot;Continuing Service...&amp;quot;);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private void _MainLoop ()&lt;br /&gt;  {&lt;br /&gt;   while (!stopThread)&lt;br /&gt;    Thread.Sleep (2000);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /// &lt;summary /&gt;&lt;br /&gt; /// This class allows easy installation of this service on Windows.&lt;br /&gt; /// &lt;/summary /&gt;&lt;br /&gt; [RunInstaller(true)]&lt;br /&gt; public class ProjectInstaller : System.Configuration.Install.Installer&lt;br /&gt; {&lt;br /&gt;  private System.ServiceProcess.ServiceProcessInstaller serviceProcessInstaller1;&lt;br /&gt;  private System.ServiceProcess.ServiceInstaller serviceInstaller1;&lt;br /&gt;  private System.ComponentModel.Container components = null;&lt;br /&gt;&lt;br /&gt;  public ProjectInstaller()&lt;br /&gt;  {&lt;br /&gt;   // This call is required by the Designer.&lt;br /&gt;   InitializeComponent();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  /// &lt;summary /&gt;&lt;br /&gt;  /// Clean up any resources being used.&lt;br /&gt;  /// &lt;/summary /&gt;&lt;br /&gt;  protected override void Dispose( bool disposing )&lt;br /&gt;  {&lt;br /&gt;   if( disposing )&lt;br /&gt;   {&lt;br /&gt;    if(components != null)&lt;br /&gt;    {&lt;br /&gt;     components.Dispose();&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;   base.Dispose( disposing );&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  #region Component Designer generated code&lt;br /&gt;  /// &lt;summary /&gt;&lt;br /&gt;  /// Required method for Designer support - do not modify&lt;br /&gt;  /// the contents of this method with the code editor.&lt;br /&gt;  /// &lt;/summary /&gt;&lt;br /&gt;  private void InitializeComponent()&lt;br /&gt;  {&lt;br /&gt;   this.serviceProcessInstaller1 = new System.ServiceProcess.ServiceProcessInstaller();&lt;br /&gt;   this.serviceInstaller1 = new System.ServiceProcess.ServiceInstaller();&lt;br /&gt;   //this.serviceInstaller2 = new System.ServiceProcess.ServiceInstaller();&lt;br /&gt;   // &lt;br /&gt;   // serviceProcessInstaller1&lt;br /&gt;   // &lt;br /&gt;   this.serviceProcessInstaller1.Password = null;&lt;br /&gt;   this.serviceProcessInstaller1.Username = null;&lt;br /&gt;   // &lt;br /&gt;   // serviceInstaller1&lt;br /&gt;   // &lt;br /&gt;   this.serviceInstaller1.DisplayName = &amp;quot;Test Service 1&amp;quot;;&lt;br /&gt;   this.serviceInstaller1.ServiceName = &amp;quot;TestService1&amp;quot;;&lt;br /&gt;   // &lt;br /&gt;   // ProjectInstaller&lt;br /&gt;   // &lt;br /&gt;   this.Installers.AddRange(new System.Configuration.Install.Installer[] {&lt;br /&gt;       this.serviceProcessInstaller1,&lt;br /&gt;       this.serviceInstaller1&lt;br /&gt;     });&lt;br /&gt;  }&lt;br /&gt;  #endregion&lt;br /&gt; }&lt;br /&gt;}&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Questo servizio è 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 è 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;    -d:&lt;directory /&gt;         Working directory&lt;br /&gt;    -l:&lt;lock /&gt;         Lock file (default is /tmp/&lt;service /&gt;.lock)&lt;br /&gt;    -m:&lt;syslog /&gt;       Name to show in syslog&lt;br /&gt;    -n:&lt;service /&gt;      Name of service to start (default is first defined)&lt;br /&gt;    --debug                Do not send to background nor redirect input/output&lt;br /&gt;    --no-daemon            Do not send to background nor redirect input/output&lt;br /&gt;&lt;br /&gt;Controlling the service:&lt;br /&gt;&lt;br /&gt;    kill -USR1 `cat &lt;lock /&gt;`    Pausing service&lt;br /&gt;    kill -USR2 `cat &lt;lock /&gt;`    Continuing service&lt;br /&gt;    kill `cat &lt;lock /&gt;`          Ending service&lt;br /&gt;&lt;br /&gt;az:~$ &lt;/code&gt;&lt;p&gt;Ok, vado nella directory dove è 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/  /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 è un &lt;a title="Link esterno" href="https://bugs.launchpad.net/ubuntu/+source/mono/+bug/242925"&gt;bug&lt;/a&gt; noto sotto Ubuntu. Sempre a quel link è presente la correzione da fare, anche se un modo migliore per risolvere ogni problema lo spiegherò 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 è necessario creare uno script apposito in &amp;quot;/etc/init.d/&amp;quot;. Lo script, che chiamerò &amp;quot;azservice&amp;quot; è 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:          service1&lt;br /&gt;# Short-Description: Test di AZ&lt;br /&gt;# Description:       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) log_daemon_msg &amp;quot;Starting test service az&amp;quot; &amp;quot;az-service1&amp;quot;&lt;br /&gt; mono-service2 -d:/home/az/project/service1/service1/bin/Debug/  /home/az/project/service1/service1/bin/Debug/service1.exe&lt;br /&gt; ;;&lt;br /&gt;stop) log_daemon_msg &amp;quot;Stopping test service az&amp;quot; &amp;quot;az-service1&amp;quot;&lt;br /&gt; kill `cat /tmp/service1.exe.lock`&lt;br /&gt;        ;;&lt;br /&gt;restart) log_daemon_msg &amp;quot;Restarting test service az&amp;quot; &amp;quot;az-service1&amp;quot;&lt;br /&gt; kill `cat /tmp/service1.exe.lock`&lt;br /&gt; mono-service2 -d:/home/az/project/service1/service1/bin/Debug/  /home/az/project/service1/service1/bin/Debug/service1.exe&lt;br /&gt;        ;;&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; kill `cat /tmp/service1.exe.lock`&lt;br /&gt; mono-service2 -d:/home/az/project/service1/service1/bin/Debug/  /home/az/project/service1/service1/bin/Debug/service1.exe&lt;br /&gt;        ;;&lt;br /&gt;*) log_action_msg &amp;quot;Usage: /etc/init.d/azservice {start|stop|restart|reload|force-reload}&amp;quot;&lt;br /&gt;        exit 2&lt;br /&gt;        ;;&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  /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ò notare una strana sintassi per chi non è 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à 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; servizi. Maggiori informazioni a riguardo si possono trovare &lt;a title="Link esterno" href="http://www.debianadmin.com/debian-and-ubuntu-linux-run-levels.html"&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; è il nome del file che abbiamo creato in &lt;em&gt;/etc/init.d/&lt;/em&gt;. Il nostro lavoro è finito. Ad ogni avvio il servizio verrà richiamato. Un piccolo avvertimento: questo servizio ha normalmente accesso a tutti i file e un'operazione sbagliata può creare danni irreversibili sulla macchina (ipottizzando che debba cancellare dei file presenti in una directory, un comando come rm -rf * può 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ò notare come quello appena creato non sia presente nella lista. Non volendo investigare oltre per scoprire il perché, ho utilizzato di un altro strumento più 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="boot-up manager" hspace="0" src="http://blogs.aspitalia.com/img/andrewz/Immagini/bum.png" align="baseline" border="0" /&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 è sufficiente aggiungere il repository di Mono, come è spiegato &lt;a title="Link esterno" href="http://www.mono-project.com/Other_Downloads"&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="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Mono/" rel="tag"&gt;Mono&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>Mono, .NET Framework</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2308/Servizi-CSharp-Macchine-Linux-Mono.aspx</guid><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></item><item><title>[OT] Problema serio ai dischi</title><link>http://blogs.aspitalia.com/az/post2307/OT-Problema-Serio-Dischi.aspx</link><pubDate>Fri, 04 Jul 2008 16:21:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2307' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;A febbraio avevo avuto le prime avvisaglie. Da febbraio un lento degrado del disco ha comportato sempre più 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="http://blogs.aspitalia.com/img/andrewz/Immagini/risonanza.jpg"&gt;&lt;img alt="Risonanza magnetica AZ" hspace="0" src="http://blogs.aspitalia.com/img/andrewz/Immagini/risonanza.jpg" width="300" align="baseline" border="1" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Dalla seconda settimana di maggio ciò mi ha portato a passare pressocché tutto il tempo a letto per una fortissima &lt;a title="Link esterno" href="http://it.wikipedia.org/wiki/Sciatalgia"&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 è risolto... Per quei pochi che si erano chiesti che fine avessi fatto in tutto questo tempo...&lt;/p&gt;&lt;p&gt;E così questa stagione in bici è andata... L'unica cosa positiva è che non ho perso dati! :-D&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/Off_Topic/" rel="tag"&gt;Off Topic&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>Imho, Off Topic</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2307/OT-Problema-Serio-Dischi.aspx</guid><slash:comments>6</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></item><item><title>UrlRewriting con trabocchetti vari</title><link>http://blogs.aspitalia.com/az/post2181/UrlRewriting-Trabocchetti-Vari.aspx</link><pubDate>Tue, 11 Dec 2007 20:05:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2181' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Mi sono preso un paio di giorni per sistemare il mio &lt;a title="IL MIO SITO!!!" href="http://ciclismo.sitiasp.it/"&gt;sito&lt;/a&gt;. A parte la sporcizia di codice che lo ha sempre contraddistinto (all'interno è codice in VB del 2002) e che ho in parte ripulito, ho implementato un url rewriting per migliorare l'indicizzazione da parte dei motori di ricerca.&lt;/p&gt;&lt;p&gt;Visto che è il mio quel sito, e visto che è 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="Usag 621" href="http://www.aspitalia.com/liste/usag/script.aspx?ID=621"&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é sì questa tenica risolve molti problemi, come il cambio di nome per i postback e necessità 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 è dato dal fatto che ogni singolo articolo così specificato crea nella cache di asp.net una pagina compilata a sé, e per ogni articolo richiesto c'è 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 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ì di risolvere in un altro modo più 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 è molto limitato. Io ho preso in considerazione:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;a title="Link esterno" href="http://www.urlrewriting.net/en/Default.aspx"&gt;UrlRewritingNet&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a title="Link esterno" href="http://www.pluralsight.com/blogs/fritz/archive/2004/07/21/1651.aspx"&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ì via. Alla fine la mia decisione è caduta sul primo, ma solo per casualità.&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 è Santa Lucia.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_2.0/" rel="tag"&gt;.NET Framework 2.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET/" rel="tag"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/HttpHandler/" rel="tag"&gt;HttpHandler&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET2, .NET Framework, .NET Framework 2.0, ASP.NET, HttpHandler</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2181/UrlRewriting-Trabocchetti-Vari.aspx</guid><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></item></channel></rss>