<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>FSpace</title>
	<atom:link href="http://www.fspace.it/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.fspace.it</link>
	<description>Lo spazio web di Federico Scarel</description>
	<lastBuildDate>Fri, 17 Apr 2009 13:46:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Portable Ubuntu for Windows</title>
		<link>http://www.fspace.it/2009/04/16/portable-ubuntu-for-windows/</link>
		<comments>http://www.fspace.it/2009/04/16/portable-ubuntu-for-windows/#comments</comments>
		<pubDate>Thu, 16 Apr 2009 20:30:33 +0000</pubDate>
		<dc:creator>federico</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Portable]]></category>
		<category><![CDATA[Portable Ubuntu for Windows]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.fspace.it/?p=101</guid>
		<description><![CDATA[Sei un testimone di Linux? Al lavoro sei di malumore perché usi Windows? Vuoi usare sudo anche sotto Windows? Hai installato Ubuntu e non puoi fare il gran salto a Windows Vista perché non ci sono videogiochi come GTali? Ora si può con Portable Ubuntu for Windows! Portable Ubuntu for Windows è un sistema Ubuntu completo derivato [...]]]></description>
			<content:encoded><![CDATA[<p>Sei un testimone di Linux? Al lavoro sei di malumore perché usi Windows? Vuoi usare sudo anche sotto Windows? Hai installato Ubuntu e non puoi fare il gran salto a Windows Vista perché non ci sono videogiochi come GTali?</p>
<p>Ora si può con <a href="http://portableubuntu.demonccc.com.ar/">Portable Ubuntu for Windows</a>!</p>
<div id="attachment_100" class="wp-caption alignleft" style="width: 310px"><img class="size-medium wp-image-100" title="Ubuntu for Windows" src="http://www.fspace.it/wp-content/uploads/2009/04/ubuntu_for_windows-300x187.jpg" alt="Ubuntu in esecuzione dentro Windows Vista" width="300" height="187" /><p class="wp-caption-text">Ubuntu in esecuzione dentro Windows Vista</p></div>
<p>Portable Ubuntu for Windows è un sistema Ubuntu completo derivato da Colinux. Potrete trasportare su pendrive USB (di almeno 2GB) la vostra distribuzione Linux preferita ed usarla all&#8217;interno di Windows. Le performance ne risentono un po&#8217;, ma il risultato è comunque notevole.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fspace.it/2009/04/16/portable-ubuntu-for-windows/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Prototipo di un constraint solver &#8211; Struttura</title>
		<link>http://www.fspace.it/2008/11/26/prototipo-di-un-constraint-solver-struttura/</link>
		<comments>http://www.fspace.it/2008/11/26/prototipo-di-un-constraint-solver-struttura/#comments</comments>
		<pubDate>Tue, 25 Nov 2008 23:46:43 +0000</pubDate>
		<dc:creator>federico</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[constraint]]></category>
		<category><![CDATA[constraint satisfaction problem]]></category>
		<category><![CDATA[constraint solver]]></category>

		<guid isPermaLink="false">http://www.fspace.it/?p=66</guid>
		<description><![CDATA[Nel precedente post avevo parlato di cosa è un constraint satisfaction problem, in questo invece descriverò come funziona un solver per tali problemi. Lo pseudocodice di una generica procedura che consente di risolvere un CSP è la seguente: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 [...]]]></description>
			<content:encoded><![CDATA[<p>Nel precedente post avevo parlato di cosa è un constraint satisfaction problem, in questo invece descriverò come funziona un solver per tali problemi. Lo pseudocodice di una generica procedura che consente di risolvere un CSP è la seguente:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #6666cc; font-weight: bold;">void</span> Solve<span style="color: #008000;">&#40;</span>CSP problem<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #6666cc; font-weight: bold;">bool</span> <span style="color: #0600FF; font-weight: bold;">continue</span> <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">true</span><span style="color: #008000;">;</span>
    <span style="color: #0600FF; font-weight: bold;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #0600FF; font-weight: bold;">continue</span> <span style="color: #008000;">&amp;&amp;</span> <span style="color: #008000;">!</span>IsDone<span style="color: #008000;">&#40;</span>problem<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        Preprocess<span style="color: #008000;">&#40;</span>problem<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        Propagate<span style="color: #008000;">&#40;</span>problem<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">!</span>IsDone<span style="color: #008000;">&#40;</span>problem<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>IsAtomic<span style="color: #008000;">&#40;</span>problem<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                <span style="color: #0600FF; font-weight: bold;">continue</span> <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">false</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">&#125;</span>
            <span style="color: #0600FF; font-weight: bold;">else</span>
            <span style="color: #008000;">&#123;</span>
                CSP<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> problems <span style="color: #008000;">=</span> Split<span style="color: #008000;">&#40;</span>problem<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
                ProceedWithSubproblems<span style="color: #008000;">&#40;</span>problems<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<ul>
<li><strong>IsDone</strong> è un procedura capace di indicare se il CSP è stato risolto oppure, al contrario, se non esistono soluzioni al problema (es. X, Y e Z con dominio {1, 2}, X < Y < Z). Questo comporta, a seconda dei casi:
<ul>
<li>Che una soluzione al problema è stata trovata;</li>
<li>Che tutte le soluzioni al problema sono state trovate;</li>
<li>C&#8217;è un&#8217;incoerenza nel problema (es. X appartiene a {1,2}, Y appartiene a {3,4}, X + Y = 9);</li>
<li>Tutti i domini hanno una dimensione inferiore ad un valore prefissato (nel caso di domini reali)</li>
<li>&Egrave; stato trovato l&#8217;ottimo rispetto a qualche funzione obiettivo</li>
</ul>
</li>
<li><strong>Preprocess</strong> consente di trasformare il problema nella forma desiderata prima di partire con la fase di propagazione. &Egrave; particolarmente utile per alcune tipologie di solver, ad esempio quando ci sono solo vincoli di tipo logico (and, not, or, &#8230;) su domini booleani</li>
<li><strong>Propagate</strong> è il cuore del processo di risoluzione di un problema vincolato. Lo scopo della procedura è iterare delle regole di riduzione dei domini fino a quando nessuna ulteriore riduzione è possibile. Si prenda ad esempio il seguente problema: X in [50 ... 200], Y in [0 ... 100] e Z in [0 ... 100], con vincoli X < Y e Y < Z. Usiamo la regola di riduzione per X < Y porta alla seguente riduzione: X.High = Min(X.High, Y.High - 1) e Y.Low = Max(Y.Low, X.Low + 1), dove Low ed High rappresentano il minimo ed il massimo del dominio associato alle variabili. Allora al primo passaggio, usando la regola di riduzione su X < Y, otteniamo X in [50 ... 99], Y in [51 ... 100], Z in [0 ... 100]. Al secondo, usando il vincolo Y < Z, otteniamo X in [50 ... 99], Y in [51 ... 99] e Z in [52 ... 100]. Il terzo passaggio, di nuovo concentrandosi su X < Y, porta a X in [50 ... 98], Y in [51 ... 99], Z in [52 ... 100]. Nessuna altra riduzione è possibile.</li>
<li><strong>IsAtomic</strong> è una procedura che testa se è possibile suddividere ulteriormente il problema oppure no. In genere, un problema non è ulteriormente suddivisibile se tutti i domini sono dei singoletti.</li>
<li><strong>Split</strong> e <strong>ProceedWithSubproblems</strong>, assieme a Propagate, rappresentano la parte più importante del solver. Queste due procedure si occupano di suddividere il problema in sottoproblemi, di selezionare il successivo sottoproblema su cui avviare la procedura di Solve, ed eventualmente di terminare se si è raggiunta una soluzione.
</ul>
<p>Fatta questa introduzione, il constraint solver in C# sarà composto dalle seguenti parti:</p>
<ul>
<li>Una classe <strong>Variable</strong>, che si occupa di gestire le operazioni elementari sul suo dominio. La classe esporrà l&#8217;evento <em>DomainChanged</em> per avvisare dell&#8217;avvenuto cambiamento del dominio.</li>
<li>Un interfaccia <strong>IConstraint</strong>, implementata dalle varie classi che si occupano di applicare le regole di riduzione dei domini.</li>
<li>Un <strong>ConstraintStore</strong>, che gestirà la fase di propagazione.</li>
<li>Un <strong>VariableStore</strong>, che avrà il ruolo di gestire le fasi di splitting e backtracking.</li>
<li>Per finire un <strong>Solver</strong>, che agirà usando il <strong>ConstraintStore</strong> e il <strong>VariableStore</strong> per risolvere il CSP.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.fspace.it/2008/11/26/prototipo-di-un-constraint-solver-struttura/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Prototipo di un constraint solver &#8211; Introduzione</title>
		<link>http://www.fspace.it/2008/11/21/prototipo-di-un-constraint-solver-introduzione/</link>
		<comments>http://www.fspace.it/2008/11/21/prototipo-di-un-constraint-solver-introduzione/#comments</comments>
		<pubDate>Fri, 21 Nov 2008 00:29:51 +0000</pubDate>
		<dc:creator>federico</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[constraint programming]]></category>
		<category><![CDATA[constraint satisfaction problems]]></category>
		<category><![CDATA[libreria]]></category>

		<guid isPermaLink="false">http://www.fspace.it/?p=60</guid>
		<description><![CDATA[In questi giorni mi sto cimentando nella creazione di un semplice constraint solver in C#. Esistono per la risoluzione di CSP (Constraint Satisfaction Problems) per diversi linguaggi, ma non ne ho trovata nessuna di gratuita per C#. Così mi è presa la voglia di creare una semplice libreria per risolvere semplici CSP, e già che [...]]]></description>
			<content:encoded><![CDATA[<p>In questi giorni mi sto cimentando nella creazione di un semplice constraint solver in C#. Esistono per la risoluzione di CSP (Constraint Satisfaction Problems) per diversi linguaggi, ma non ne ho trovata nessuna di gratuita per C#. Così mi è presa la voglia di creare una semplice libreria per risolvere semplici CSP, e già che ci sono pubblicare la mia esperienza con relativo codice sorgente. Poiché non è così frequente, o almeno così mi sembra, sentire parlare di Constraint Programming, penso sia ottimale introdurre l&#8217;argomento nel primo post della serie. </p>
<p>Il Constraint Programming è un paradigma di programmazione dove le relazioni tra le variabili sono espresse sotto forma di vincoli (constraints) che devono essere soddisfatti. Un Constraint Satisfaction Problem è dato da un insieme di variabili (<i>V</i>1, <i>V</i>2, &#8230;, <i>V</i>n), ciascuna con il suo dominio <i>D</i>i di valori che può assumere, e da un insieme di vincoli tra le variabili (<i>C</i>1, <i>C</i>2, &#8230;,<i>C</i>m) che devono essere rispettati. Una soluzione ad un Constraint Satisfaction Problem è un assegnamento delle variabili che rispetti tutti i vincoli esistenti.</p>
<p>Detta così può sembrare difficile, ma basta un esempio per chiarire tutto. Supponiamo di avere:</p>
<ul>
<li>Tre variabili intere: <em>V</em>1, <em>V</em>2 e <em>V</em>3</li>
<li>Sappiamo che <em>V</em>1 è compresa tra 4 e 6, <em>V</em>2 è compreso tra 4 e 7 e <em>V</em>3 può essere 5 o 6 (questi sono i domini delle variabili)</li>
<li>Sappiamo inoltre che <em>V</em>1 < <em>V</em>2 < <em>V</em>3 (cioè i vincoli tra le variabili)</li>
</ul>
<p>Questo è un CSP (Constraint Satisfaction Problem). L&#8217;unica soluzione possibile è data da <i>V</i>1 = 4, <em>V</em>2 = 5 e <em>V</em>3 = 6, ma ci possono tranquillamente essere problemi dotati di più di una soluzione (se ad esempio <em>V</em>3 fosse compreso tra 5 e 7 ci sarebbero due soluzioni al problema). Un altro esempio carino di CSP è il Sudoku: ogni casella della griglia (<em>variabile</em>) può assumere un valore compreso tra 1 e 9 (<em>dominio</em>), e ogni riga, ogni colonna e ogni sottoquadrante della griglia ha il vincolo della diversità dei valori delle variabili.</p>
<p>Ma cosa ha di tanto interessante il constraint programming? Semplice: è un paradigma dichiarativo, cioè con una libreria di constraint programming non devo indicare come risolvere il problema, ma semplicemente indico cosa voglio ottenere e la libreria si occupa di trovare la soluzione (in modo efficiente, of course). Nel caso del Sudoku, ad esempio, indicherei solo le regole del gioco e lo stato iniziale della griglia (ed eventualmente qualche politica da adottare per risolvere il problema).</p>
<p>Ma questa è solo l&#8217;introduzione, nel prossimo articolo scriverò della basi per costruire una libreria capace di risolvere questi problemi (almeno avendo per dominio dei valori interi).</p>
<p>Se si fosse interessati ad approfondire la teoria:</p>
<ul>
<li>Krzysztof Apt &#8211; <em>Principles of Constraint Programming</em> [Cambridge University Press]</li>
<ul>
]]></content:encoded>
			<wfw:commentRss>http://www.fspace.it/2008/11/21/prototipo-di-un-constraint-solver-introduzione/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Enum e attributi</title>
		<link>http://www.fspace.it/2008/10/17/enum-e-attributi/</link>
		<comments>http://www.fspace.it/2008/10/17/enum-e-attributi/#comments</comments>
		<pubDate>Fri, 17 Oct 2008 21:13:19 +0000</pubDate>
		<dc:creator>federico</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Attribute]]></category>
		<category><![CDATA[reflection]]></category>

		<guid isPermaLink="false">http://www.fspace.it/?p=32</guid>
		<description><![CDATA[Recentemente ho avuto l&#8217;esigenza di gestire delle enumerazioni di dimensione considerevole (diverse decine di elementi), dove ad ogni valore dell&#8217;enum doveva essere associata una classe. Supponiamo ad esempio di avere un enum ZooEnum e una gerarchia di classi come segue: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [...]]]></description>
			<content:encoded><![CDATA[<p>Recentemente ho avuto l&#8217;esigenza di gestire delle enumerazioni di dimensione considerevole (diverse decine di elementi), dove ad ogni valore dell&#8217;enum doveva essere associata una classe. Supponiamo ad esempio di avere un enum <em>ZooEnum</em> e una gerarchia di classi come segue:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">enum</span> ZooEnum
<span style="color: #008000;">&#123;</span>
    Dog,
    Cat,
    Tiger,
    Snake,
    Puma,
    <span style="color: #008000;">...</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;">public</span> abstract <span style="color: #6666cc; font-weight: bold;">class</span> Animal
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> Animal<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #008000;">&#125;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> abstract <span style="color: #6666cc; font-weight: bold;">void</span> Eat<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> abstract <span style="color: #6666cc; font-weight: bold;">void</span> Sleep<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> abstract <span style="color: #6666cc; font-weight: bold;">string</span> Verse<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span> 
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> Dog<span style="color: #008000;">:</span> Animal
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> Dog<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">override</span> <span style="color: #6666cc; font-weight: bold;">void</span> Eat<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        DoSomething<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #008000;">...</span>
    <span style="color: #008080; font-style: italic;">// Resto dell'implementazione</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> Cat<span style="color: #008000;">:</span> Animal
<span style="color: #008000;">&#123;</span>
    <span style="color: #008000;">...</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #008000;">...</span></pre></td></tr></table></div>

<p>A questo punto possiamo costruire un metodo <em>AnimalBuilder</em> con input un valore dell&#8217;enumerazione <em>ZooEnum</em> e per output una oggetto con classe derivata da <em>Animal</em>. La forma che potrebbe assumere una metodo del genere potrebbe essere la seguente:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;">Animal AnimalBuilder<span style="color: #008000;">&#40;</span>ZooEnum animalValue<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">switch</span> <span style="color: #008000;">&#40;</span>animalValue<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;">case</span> ZooEnum<span style="color: #008000;">.</span><span style="color: #0000FF;">Dog</span><span style="color: #008000;">:</span>
            <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #008000;">new</span> Dog<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #0600FF; font-weight: bold;">break</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF; font-weight: bold;">case</span> ZooEnum<span style="color: #008000;">.</span><span style="color: #0000FF;">Cat</span><span style="color: #008000;">:</span>
            <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #008000;">new</span> Cat<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #0600FF; font-weight: bold;">break</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">...</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>Se gli elementi dell&#8217;enumerazione cominciano a diventare diverse decine, e magari oltre che ad un metodo si vogliono associare altre informazioni agli elementi dell&#8217;enum (ad esempio, una stringa da usare per funzioni di output), allora le cose si complicano. Il codice basato su switch comincia a diventare di difficile lettura e manutenzione.</p>
<p>Una soluzione pi&ugrave; elegante, a mio avviso, &egrave; quella che utilizza gli attributi e la reflection. Per prima cosa si costruisce una classe derivata da <em>Attribute</em> che per memorizzare il tipo di oggetto da creare:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> ZooAttribute <span style="color: #008000;">:</span> <span style="color: #000000;">System</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Attribute</span>
<span style="color: #008000;">&#123;</span>
    Type p_AnimalType<span style="color: #008000;">;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;">public</span> ZooAttribute<span style="color: #008000;">&#40;</span>Type type<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> p_AnimalType <span style="color: #008000;">=</span> type<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> Type Value
    <span style="color: #008000;">&#123;</span>
        get <span style="color: #008000;">&#123;</span> <span style="color: #0600FF; font-weight: bold;">return</span> p_AnimalType<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>Ora che abbiamo il nostro attributo, possiamo associarlo ai valori dell&#8217;enumerazione, indicando per ciascuno di essi che tipo di oggetto si vuole costruire:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">enum</span> ZooEnum
<span style="color: #008000;">&#123;</span>
    <span style="color: #008000;">&#91;</span>Zoo<span style="color: #008000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #008000;">&#40;</span>Dog<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#93;</span>Dog,
    <span style="color: #008000;">&#91;</span>Zoo<span style="color: #008000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #008000;">&#40;</span>Cat<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#93;</span>Cat,
    <span style="color: #008000;">&#91;</span>Zoo<span style="color: #008000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #008000;">&#40;</span>Tiger<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#93;</span>Tiger,
    <span style="color: #008000;">&#91;</span>Zoo<span style="color: #008000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #008000;">&#40;</span>Snake<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#93;</span>Snake,
    <span style="color: #008000;">&#91;</span>Zoo<span style="color: #008000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #008000;">&#40;</span>Puma<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#93;</span>Puma,
    <span style="color: #008000;">...</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>A questo punto si può riscrivere il metodo <em>AnimalBuilder</em> utilizzando Reflection e il metodo <em>Activator.CreateInstance</em>. Il nuovo codice sarà indipendente dal numero di elementi dell&#8217;enumerazione, e non utilizza né <em>if</em> (non almeno per scegliere quale oggetto costruire) né <em>switch</em>. Il suo funzionamento è abbastanza semplice: recupero eventuali attributi custom di tipo <em>ZooAttribute</em> associati al valore enum in input, ottengo il tipo di oggetto da istanziare, che si ottiene leggendo il campo <em>ZooAttribute.Value</em>, e lo istanzio invocando <em>Activator.CreateInstance</em></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">public</span> Animal AnimalBuilder<span style="color: #008000;">&#40;</span>ZooEnum animalValue<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    Animal result <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">null</span><span style="color: #008000;">;</span>
&nbsp;
    Type type <span style="color: #008000;">=</span> animalValue<span style="color: #008000;">.</span><span style="color: #0000FF;">GetType</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
    FieldInfo fieldInfo <span style="color: #008000;">=</span> type<span style="color: #008000;">.</span><span style="color: #0000FF;">GetField</span><span style="color: #008000;">&#40;</span>animalValue<span style="color: #008000;">.</span><span style="color: #0000FF;">ToString</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    ZooAttribute<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> attributes <span style="color: #008000;">=</span> <span style="color: #008000;">&#40;</span>ZooAttribute<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>fieldInfo<span style="color: #008000;">.</span><span style="color: #0000FF;">GetCustomAttributes</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #008000;">&#40;</span>ZooAttribute<span style="color: #008000;">&#41;</span>, <span style="color: #0600FF; font-weight: bold;">false</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>attributes<span style="color: #008000;">.</span><span style="color: #0000FF;">Length</span> <span style="color: #008000;">&gt;</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        result <span style="color: #008000;">=</span> <span style="color: #008000;">&#40;</span>Animal<span style="color: #008000;">&#41;</span>Activator<span style="color: #008000;">.</span><span style="color: #0000FF;">CreateInstance</span><span style="color: #008000;">&#40;</span>attributes<span style="color: #008000;">&#91;</span><span style="color: #FF0000;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Value</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;">return</span> result<span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>A questo punto è facile estendere l&#8217;attributo custom in modo. Si può, ad esempio, associare una stringa ad uno dei nostri animali nel seguente modo.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
</pre></td><td class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> ZooAttribute <span style="color: #008000;">:</span> <span style="color: #000000;">System</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Attribute</span>
<span style="color: #008000;">&#123;</span>
    Type p_AnimalType<span style="color: #008000;">;</span>
    <span style="color: #6666cc; font-weight: bold;">string</span> p_Description<span style="color: #008000;">;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;">public</span> ZooAttribute<span style="color: #008000;">&#40;</span>Type type, <span style="color: #6666cc; font-weight: bold;">string</span> description<span style="color: #008000;">&#41;</span> 
    <span style="color: #008000;">&#123;</span>
        p_AnimalType <span style="color: #008000;">=</span> type<span style="color: #008000;">;</span> 
        p_Description <span style="color: #008000;">=</span> description<span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;">public</span> Type Value
    <span style="color: #008000;">&#123;</span>
        get <span style="color: #008000;">&#123;</span> <span style="color: #0600FF; font-weight: bold;">return</span> p_AnimalType<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">string</span> Description
    <span style="color: #008000;">&#123;</span>
        get <span style="color: #008000;">&#123;</span> <span style="color: #0600FF; font-weight: bold;">return</span> p_Description<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">enum</span> ZooEnum
<span style="color: #008000;">&#123;</span>
    <span style="color: #008000;">&#91;</span>Zoo<span style="color: #008000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #008000;">&#40;</span>Dog<span style="color: #008000;">&#41;</span>, <span style="color: #666666;">&quot;Cane&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#93;</span>Dog,
    <span style="color: #008000;">&#91;</span>Zoo<span style="color: #008000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #008000;">&#40;</span>Cat<span style="color: #008000;">&#41;</span>, <span style="color: #666666;">&quot;Gatto&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#93;</span>Cat,
    <span style="color: #008000;">&#91;</span>Zoo<span style="color: #008000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #008000;">&#40;</span>Tiger<span style="color: #008000;">&#41;</span>, <span style="color: #666666;">&quot;Tigre&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#93;</span>Tiger,
    <span style="color: #008000;">&#91;</span>Zoo<span style="color: #008000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #008000;">&#40;</span>Snake<span style="color: #008000;">&#41;</span>, <span style="color: #666666;">&quot;Serpente&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#93;</span>Snake,
    <span style="color: #008000;">&#91;</span>Zoo<span style="color: #008000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #008000;">&#40;</span>Puma<span style="color: #008000;">&#41;</span>, <span style="color: #666666;">&quot;Puma&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#93;</span>Puma,
    <span style="color: #008000;">...</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">string</span> AnimalDescription<span style="color: #008000;">&#40;</span>ZooEnum animalValue<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #6666cc; font-weight: bold;">string</span> result <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">null</span><span style="color: #008000;">;</span>
&nbsp;
    Type type <span style="color: #008000;">=</span> animalValue<span style="color: #008000;">.</span><span style="color: #0000FF;">GetType</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
    FieldInfo fieldInfo <span style="color: #008000;">=</span> type<span style="color: #008000;">.</span><span style="color: #0000FF;">GetField</span><span style="color: #008000;">&#40;</span>animalValue<span style="color: #008000;">.</span><span style="color: #0000FF;">ToString</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    ZooAttribute<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> attributes <span style="color: #008000;">=</span> <span style="color: #008000;">&#40;</span>ZooAttribute<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>fieldInfo<span style="color: #008000;">.</span><span style="color: #0000FF;">GetCustomAttributes</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #008000;">&#40;</span>ZooAttribute<span style="color: #008000;">&#41;</span>, <span style="color: #0600FF; font-weight: bold;">false</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>attributes<span style="color: #008000;">.</span><span style="color: #0000FF;">Length</span> <span style="color: #008000;">&gt;</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        result <span style="color: #008000;">=</span> attributes<span style="color: #008000;">&#91;</span><span style="color: #FF0000;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Description</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;">return</span> result<span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">// Il seguente codice darà come output &quot;Cane&quot;</span>
ZooEnum myAnimal <span style="color: #008000;">=</span> ZooEnum<span style="color: #008000;">.</span><span style="color: #0000FF;">Dog</span><span style="color: #008000;">;</span>
Console<span style="color: #008000;">.</span><span style="color: #0000FF;">Writeln</span><span style="color: #008000;">&#40;</span>AnimalDescription<span style="color: #008000;">&#40;</span>myAnimal<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.fspace.it/2008/10/17/enum-e-attributi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Computer Science Unplugged</title>
		<link>http://www.fspace.it/2008/10/14/computer-science-unplugged/</link>
		<comments>http://www.fspace.it/2008/10/14/computer-science-unplugged/#comments</comments>
		<pubDate>Mon, 13 Oct 2008 22:02:36 +0000</pubDate>
		<dc:creator>federico</dc:creator>
				<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[computer science]]></category>
		<category><![CDATA[informatica nelle scuole]]></category>
		<category><![CDATA[insegnamento]]></category>

		<guid isPermaLink="false">http://www.fspace.it/?p=26</guid>
		<description><![CDATA[Insegnare l&#8217;informatica senza computer. &#200; questo il motto di Computer Science Unplugged, un utile libro per l&#8217;insegnamento dell&#8217;informatica nelle scuole secondarie inferiori. Concetti fondamentali della Computer Science (teoria dell&#8217;informazione, algoritmi di ricerca, algoritmi di ordinamento, &#8230; ) vengono insegnati sotto forma di attivit&#224; ludiche. Tutte le attivit&#224; proposte sono indipendenti da qualunque hardware o software, [...]]]></description>
			<content:encoded><![CDATA[<p>Insegnare l&#8217;informatica senza computer. &Egrave; questo il motto di <b><a href="http://csunplugged.org/">Computer Science Unplugged</a></b>, un utile libro per l&#8217;insegnamento dell&#8217;informatica nelle scuole secondarie inferiori. </p>
<p>Concetti fondamentali della Computer Science (teoria dell&#8217;informazione, algoritmi di ricerca, algoritmi di ordinamento, &#8230; ) vengono insegnati sotto forma di attivit&agrave; ludiche. Tutte le attivit&agrave; proposte sono indipendenti da qualunque hardware o software, e possono essere svolte sia al chiuso sia all&#8217;aperto.</p>
<p>Dal sito <a href="http://csunplugged.org/">csunplugged.org</a> &egrave; possibile scaricare gratuitamente l&#8217;intero libro in formato pdf, tradotto in italiano da Giovanni Michele Bianco e Renzo Davoli. Sullo stesso sito sono inoltre presenti tutta una serie di attivit&agrave;, video, idee utili alla didattica.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fspace.it/2008/10/14/computer-science-unplugged/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bejeweled gratis</title>
		<link>http://www.fspace.it/2007/05/12/bejeweled-gratis/</link>
		<comments>http://www.fspace.it/2007/05/12/bejeweled-gratis/#comments</comments>
		<pubDate>Sat, 12 May 2007 12:18:10 +0000</pubDate>
		<dc:creator>federico</dc:creator>
				<category><![CDATA[Giochi]]></category>
		<category><![CDATA[bejeweled]]></category>

		<guid isPermaLink="false">http://www.fspace.it/2007/05/12/bejeweled-gratis/</guid>
		<description><![CDATA[La Popcap regala, per la Festa della Mamma, il suo videogioco Bejeweled a chi si iscrive alla sua newsletter (qui per accedere alla pagina di iscrizione). La promozione è iniziata qualche giorno fa e dovrebbe finire tra una decina di giorni. Quindi se siete amanti dei giochi passatempo Popcap (e non avete paranoie nel dare [...]]]></description>
			<content:encoded><![CDATA[<p><img align="left" alt="Schermata Bejeweled" title="Schermata Bejeweled" src="http://www.fspace.it/wp-content/uploads/2007/05/bejeweled.miniatura.jpg" />La Popcap regala, per la Festa della Mamma, il suo videogioco Bejeweled a chi si iscrive alla sua newsletter (<a title="Iscrizione alla newsletter Popcap" href="http://www.popcap.com/subscribe.php">qui</a> per accedere alla pagina di iscrizione). La promozione è iniziata qualche giorno fa e dovrebbe finire tra una decina di giorni.</p>
<p>Quindi se siete amanti dei giochi passatempo Popcap (e non avete paranoie nel dare in giro i vostri dati personali) vi conviene affrettarvi per recuperare gratuitamente la versione deluxe di questo simpatico gioco.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fspace.it/2007/05/12/bejeweled-gratis/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Tema Redline in italiano</title>
		<link>http://www.fspace.it/2007/05/09/tema-redline-in-italiano/</link>
		<comments>http://www.fspace.it/2007/05/09/tema-redline-in-italiano/#comments</comments>
		<pubDate>Tue, 08 May 2007 22:15:12 +0000</pubDate>
		<dc:creator>federico</dc:creator>
				<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[tema]]></category>

		<guid isPermaLink="false">http://www.fspace.it/2007/05/09/tema-redline-in-italiano/</guid>
		<description><![CDATA[In questi giorni ho scoperto, grazie ad una segnalazione del sito WordPress Italy, un tema per WordPress che ho trovato molto carino, tanto che probabilmente sarà  il prossimo tema di questo sito. Così ho deciso di &#8220;internazionalizzarlo&#8221; e tradurlo. Il tema si chiama Redline, e la versione originale si può trovare sul sito In My [...]]]></description>
			<content:encoded><![CDATA[<p>In questi giorni ho scoperto, grazie ad una segnalazione del sito <a title="Collegamento a WordPress Italia" href="http://www.wordpress-it.it/">WordPress Italy</a>, un tema per WordPress che ho trovato molto carino, tanto che probabilmente sarà  il prossimo tema di questo sito. Così ho deciso di &#8220;internazionalizzarlo&#8221; e tradurlo.</p>
<p>Il tema si chiama Redline, e la versione originale si può trovare sul sito <a title="Collegamento al sito originario del tema Redlina" href="http://www.inmypad.com/2007/03/wordpress-themes-redline">In My Pad</a>. Potete scaricare la versione italiana <a title="Clicca per scaricare il tema Redline in italiano!" href="/wp-content/uploads/2007/05/redline.zip">qui</a> [File zip, 80 kB] (o comunque la potete utilizzare come base di partenza per tradurre il tema in altre lingue con strumenti come <a title="Sito di poEdit" href="http://www.poedit.net/">poEdit</a>).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fspace.it/2007/05/09/tema-redline-in-italiano/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Proteggersi dalla pornografia</title>
		<link>http://www.fspace.it/2007/04/24/proteggersi-dalla-pornografia/</link>
		<comments>http://www.fspace.it/2007/04/24/proteggersi-dalla-pornografia/#comments</comments>
		<pubDate>Tue, 24 Apr 2007 21:59:45 +0000</pubDate>
		<dc:creator>federico</dc:creator>
				<category><![CDATA[Non aprite quella post@]]></category>

		<guid isPermaLink="false">http://www.fspace.it/2007/04/24/proteggersi-dalla-pornografia/</guid>
		<description><![CDATA[In questi giorni mi è venuta la balzana idea di scrivere un breve manuale dedicato a chi vuole scoprire le opportunità offerte dal Web 2.0 e risolvere le più comuni problematiche che si incontrano nella navigazione o nell&#8217;utilizzo di un programma moderno di posta elettronica. Cosa avrà  di diverso dai tanti manuali che ci sono [...]]]></description>
			<content:encoded><![CDATA[<p>In questi giorni mi è venuta la balzana idea di scrivere un breve manuale dedicato a chi vuole scoprire le opportunità offerte dal Web 2.0 e risolvere le più comuni problematiche che si incontrano nella navigazione o nell&#8217;utilizzo di un programma moderno di posta elettronica. Cosa avrà  di diverso dai tanti manuali che ci sono in giro? In una cosa: si concentrerà  sulle problematiche e sulle opportunità , quindi i vari programmi e servizi di Internet saranno visti come strumenti intercambiabili per ottenere uno scopo. Non mi interessa parlare di Thunderbird, di Eudora, di Internet Explorer, di Google o di Yahoo. Se parlerà di loro, anzi, se scriverà di loro, sarà  solo perché sono un mezzo per raggiungere un fine. Potrà  essere che in una parte del testo descriverò come difendersi dallo spam usando filtri come quelli presenti in Thunderbird, mentre in un&#8217;altra parte per parlare della sottoscrizione ai feed RSS invece che Firefox (il fratello marinaio di Thunderbird) utilizzi Internet Explorer. Insomma, per riassumere, le funzionalità  al centro del discorso! Starà  poi al lettore decidere quali sono gli strumenti di cui necessita.<br />
Questo è il primo articolo di questo ipotetico manuale. Chissà  se riuscirò mai a finirlo <img src='http://www.fspace.it/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<h2>Proteggersi dalla pornografia</h2>
<p>Prima o poi a tutti capita di incappare, almeno per sbaglio, in siti a contenuto pornografico. Magari volevate visitare assieme a vostro figlio di otto anni il sito della Casa Bianca e per qualche lettera di differenza vi siete trovati a tappargli gli occhi alla comparsa di una stagista un po&#8217; troppo svestita. Oppure cercavate informazioni sui nani da giardino e siete malauguratamente incappati in un sito per feticisti, decisamente non richiesto. Se anche non vi sentite preoccupati da questi possibili incontri ravvicinati, potreste almeno essere preoccupati pensando che alcune volte i siti a contenuto pornografico, particolarmente quelli &#8220;minori&#8221; che non hanno un marchio da difendere, possono essere fonte di programmi malevoli.</p>
<p>Come ci si può difendere dall&#8217;invasione non richiesta di questi contenuti? Quasi ogni metodo di protezione ricade in una di queste categorie (può anche essere una combinazione di entrambe):</p>
<ul>
<li>Protezione tramite <strong>blacklist</strong>, cioé si può navigare ovunque <em>eccetto</em> che nei siti elencati nella blacklist;</li>
<li>Protezione tramite <strong>whitelist</strong>, cioé si può navigare <em>solo</em> nei siti elencati nella whitelist.</li>
</ul>
<p>La prima soluzione offre maggiore libertà  di navigazione ma rimane una certa percentuale di rischio, perché non è immaginabile che questo indice dei siti proibiti possa coprire tutti i siti pornografici di Internet, anche quelli in aramaico antico, mentre la soluzione con whitelist offre maggiore sicurezza a scapito però di una notevole perdita nella libertà  di navigazione.</p>
<p><span id="more-12"></span></p>
<h3>Server DNS con servizio antipornografia</h3>
<p>Una prima soluzione efficace, gratuita e alla portata della maggior parte delle persone Ã¨ l&#8217;utilizzo di un servizio DNS, come quello offerto da <a title="Collegamento al sito ScrubIt" href="http://www.scrubit.com">ScrubIt</a>, capace di bloccare richieste a siti pornografici o contenenti programmi malevoli come i virus tramite appunto un sistema di blacklist. Cos&#8217;Ã¨ un DNS (Domain Name System)? Potete pensare al DNS come ad una sorta di elenco telefonico di Internet. Dovete sapere che il vostro computer quando dialoga con un sito, facciamo ad esempio www.google.it, ha bisogno del suo â€œnumero di telefonoâ€, o in termini piÃ¹ precisi del suo indirizzo IP. Quando digitate www.google.it sulla barra degli indirizzi del vostro browser e premete il pulsante â€œvaiâ€, il computer contatta il server DNS del vostro fornitore di connettivitÃ  (il cui indirizzo IP viene fornito al vostro computer nell&#8217;istante in cui vi connettete ad Internet), e richiede l&#8217;indirizzo IP corrispondente al sito google.it, che potrebbe essere 72.14.221.104. A questo punto il vostro computer sa qual Ã¨ il &#8220;numero di telefono&#8221; di Google, contatterÃ  il 72.14.221.104 ogni volta che chiederete a Google qualche pagina.</p>
<p>Bene direte voi, e ScrubIt cosa c&#8217;entra? C&#8217;entra, perchÃ© invece che fornire al vostro computer l&#8217;elenco telefonico completo (che poi in Italia tanto completo non Ã¨, in particolare se volete navigare su <a title="Notizia del quotidiano Punto Informatico riguardante il blocco di siti di scommesse" href="http://punto-informatico.it/p.aspx?id=1806241">siti di scommesse non autorizzati dalla AAMS</a>), potete dirgli di usare quello di ScrubIt, che Ã¨ un elenco da dove sono stati eliminati milioni di siti contenenti pornografia o programmi malevoli, con il risultato che se cercate di vistare, ad esempio, il sito www.sesso.it apparirÃ  questa pagina:</p>
<p><img title="Pagina filtrata da ScrubIt" alt="Pagina filtrata da ScrubIt" src="/wp-content/uploads/img_scrubit.jpg" align="middle" /></p>
<p>Se tutto questo vi sembra interessante e avete un sistema operativo Windows XP o 2000, potete affidarvi al loro programma, scaricabile all&#8217;indirizzo <a title="Clicca per scaricare il programma di configurazione ScrubIt" href="http://www.scrubdns.com/scrubit.exe">http://www.scrubdns.com/scrubit.exe</a>, oppure configurare manualmente il server DNS del vostro computer o del vostro router ADSL. La procedura per il sistema operativo Windows Ã¨ piÃ¹ o meno questa (puÃ² variare a seconda di quale versione di Windows usate):</p>
<ol>
<li>Clic sul pulsante <strong>Start</strong>, quindi <strong>Impostazioni</strong> e infine <strong>Pannello di controllo</strong>.</li>
<li>Doppio clic su <strong>Connessioni di rete</strong>.</li>
<li>Clic con il tasto destro sulla connessione che usate per accedere ad Internet, quindi scegliere <strong>ProprietÃ </strong>.</li>
<li>Selezionare dalla lista dei componenti <strong>Protocollo Internet (TCP/IP)</strong>. Cliccare sul pulsante <strong>ProprietÃ </strong>.</li>
<li>Nella scheda <strong>Generale</strong>, cliccare su <strong>Utilizza i seguenti indirizzi server DNS</strong>. Verranno abilitati due maschere dove potrete inserire gli indirizzi dei due server DNS di ScrubIt, ovvero <strong>67.138.54.100</strong> e <strong>207.225.209.66</strong></li>
<li>Cliccate OK per chiudere le finestre. Avete finito, ora non potrete piÃ¹ cadere in tentazione!</li>
</ol>
<p>Se invece dovete configurare un router ADSL o un computer con un altro sistema operativo, come OS X della Apple, vi conviene leggere sul manuale d&#8217;istruzioni o cercare in rete. I parametri da configurare sono sempre gli stessi, cambia solo il modo di farlo.</p>
<p><!--more--></p>
<h3>Programmi di navigazione per minori</h3>
<p>SÃ¬, oltre ai browser per adulti, come Internet Explorer o Mozilla Firefox, esistono anche i browser Chicco per i piÃ¹ piccini, che hanno grosse icone colorate, pochi pulsanti, e soprattutto impediscono ai bambini di fare cattive conoscenze. Un ottimo esempio <em>gratuito</em> e italianissimo di questi programmi Ã¨ ProteggiBimbo. ProteggiBimbo, scaricabile all&#8217;indirizzo <a title="Collegamento al sito di ProteggiBimbo" href="http://www.nicolaottomano.it/proteggibimbo.htm">http://www.nicolaottomano.it/proteggibimbo.htm</a>, Ã¨ un programma di navigazione per i piccini basato sullo stesso motore di visualizzazione di Mozilla Firefox e che utilizza un triplice sistema per proteggere la navigazione dei piÃ¹ piccoli: una whitelist di siti sempre consentiti, una blacklist di siti sempre bloccati, ed un controllo ulteriore sulle parole utilizzate all&#8217;interno della pagina. Grazie a questo triplice controllo risulta molto efficace nel suo lavoro, e se ben configurato si puÃ² essere praticamente sicuri che il vostro figliuolo non vedrÃ  nulla di sconveniente. In particolar modo se navigherete assieme a lui, poichÃ©, Ã¨ giusto saperlo, nessuno di questi programmi puÃ² fare da baby sitter.</p>
<p><img title="Schermata del programma proteggi bimbo" alt="Schermata del programma proteggi bimbo" src="/wp-content/uploads/img_proteggibimbo.jpg" align="middle" /></p>
<p>E se mio figlio scopre dove si impostano le restrizioni? Nessun problema, l&#8217;autore del programma conosce quanto possano essere diabolici i bambini e ha reso le preferenze del programma accessibili solo tramite password. Che all&#8217;inizio Ã¨ <em>password</em>, ma che puÃ² essere modificata in qualunque istante. Possibilmente non nel nome del vostro cane o di vostro figlio.<br />
E se la blacklist fornita con il programma non mi basta, ma sono molto pigro e non ho voglia di aggiungere centinaia di siti a mano? Potete utilizzare quelle fornite dal sito <a title="Collegamento al download della BigBlackList" href="http://urlblacklist.com/?sec=download">urlblacklist.com</a>. Sono liste che vengono comunemente utilizzate per sistemi di filtraggio tramite proxy quali squid + DansGuardian, cioÃ¨ in parole povere filtraggi di tipo centralizzato che vengono applicati in genere a reti di computer (io ad esempio uso tale sistema per salvaguardare, almeno in parte, l&#8217;integritÃ  mentale dei ragazzi). Nel nostro caso tali liste, suddivise per argomento (porno, violenza, erotismo, virus, gioco d&#8217;azzardo, &#8230;) possono essere date in pasto invece che ad un filtro proxy al nostro programma di navigazione per bambini.<br />
<!--more--></p>
]]></content:encoded>
			<wfw:commentRss>http://www.fspace.it/2007/04/24/proteggersi-dalla-pornografia/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>OpenCV e Dev-C++</title>
		<link>http://www.fspace.it/2007/04/04/opencv-e-dev-c/</link>
		<comments>http://www.fspace.it/2007/04/04/opencv-e-dev-c/#comments</comments>
		<pubDate>Wed, 04 Apr 2007 13:32:39 +0000</pubDate>
		<dc:creator>federico</dc:creator>
				<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[computer vision library]]></category>
		<category><![CDATA[configurazione]]></category>
		<category><![CDATA[devcpp]]></category>
		<category><![CDATA[opencv]]></category>

		<guid isPermaLink="false">http://www.fspace.it/2007/04/04/opencv-e-dev-c/</guid>
		<description><![CDATA[Per via della tesi di laurea mi sto interessando alla libreria Intel di visione artificiale Open Computer Vision Library, o più brevemente OpenCV. In rete ho trovato diverso materiale che spiega come utilizzarla assieme a Visual Studio, ma non ho trovato materiale riguardante l&#8217;integrazione di OpenCV nell&#8217;ambiente di sviluppo Dev-C++, così ecco quali sono i [...]]]></description>
			<content:encoded><![CDATA[<p>Per via della tesi di laurea mi sto interessando alla libreria Intel di visione artificiale Open Computer Vision Library, o più brevemente <a title="Collegamento a OpenCV su SourceForge" target="_blank" href="http://sourceforge.net/projects/opencvlibrary/">OpenCV</a>. In rete ho trovato diverso materiale che spiega come utilizzarla assieme a Visual Studio, ma non ho trovato materiale riguardante l&#8217;integrazione di OpenCV nell&#8217;ambiente di sviluppo <a title="Collegamento al sito di Dev-C++" target="_blank" href="http://www.bloodshed.net/dev/devcpp.html">Dev-C++</a>, così ecco quali sono i passi da fare per utilizzarla con tale ambiente di sviluppo (si presuppone che abbiate installato sia OpenCV, sotto C:\Programmi, sia Dev-C++):</p>
<ul>
<li>Aprire Dev-C++</li>
<li>Andare sul menù <em>Strumenti</em>, quindi <em>Opzioni di compilazione</em></li>
<li>Nella scheda &#8220;<em>Compilatore</em>&#8220;, mettere il segno di spunta su &#8220;<em>Aggiungi questi comandi alla linea di comando del linker</em>&#8221; e scrivere nella casella di testo associata <strong>-lhighgui -lcv -lcxcore -lcvaux -lcvcam -lml</strong></li>
<li>Nella scheda &#8220;<em>Cartelle</em>&#8220;, sottoscheda &#8220;<em>Librerie</em>&#8220;, aggiungere <strong>C:\Programmi\OpenCV\lib</strong></li>
<li>Nella scheda &#8220;<em>Cartelle</em>&#8220;, sottoscheda &#8220;<em>File binari</em>&#8221; (attualmente uso la versione inglese, dove la scheda si chiama &#8220;Binaries&#8221;, mi fido di Riccardo per l&#8217;interfaccia italiana), aggiungere <strong>C:\Programmi\OpenCV\bin</strong></li>
<li>Sempre scheda &#8220;<em>Cartelle</em>&#8220;, sottoscheda &#8220;<em>Include C</em>&#8220;, aggiungere le seguenti cartelle:
<ul>
<li><strong>C:\Programmi\OpenCV\cxcore\include</strong></li>
<li><strong>C:\Programmi\OpenCV\cv\include</strong></li>
<li><strong>C:\Programmi\OpenCV\otherlibs\highgui</strong></li>
<li><strong>C:\Programmi\OpenCV\cvaux\include</strong></li>
<li><strong>C:\Programmi\OpenCV\otherlibs\cvcam\include</strong></li>
<li><strong>C:\Programmi\OpenCV\ml\include</strong></li>
</ul>
</li>
<li>Ripetere quanto sopra per la sottoscheda &#8220;<em>Include C++</em>&#8220;</li>
</ul>
<p>Per verificare che tutto funzioni correttamente, si può provare a compilare ed eseguire il seguente codice:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &quot;cv.h&quot;</span>
<span style="color: #339933;">#include &quot;highgui.h&quot;</span>
<span style="color: #339933;">#include &lt;cstdlib&gt;</span>
<span style="color: #339933;">#include &lt;iostream&gt;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>argv<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">char</span> windowName<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;Hello world&quot;</span><span style="color: #339933;">;</span>
    CvPoint startPoint<span style="color: #339933;">;</span>
    CvFont font<span style="color: #339933;">;</span>
    CvSize textSize<span style="color: #339933;">,</span> windowSize<span style="color: #339933;">;</span>
    IplImage <span style="color: #339933;">*</span>image<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Inizializzazione font e allocazione immagine</span>
    windowSize.<span style="color: #202020;">width</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">640</span><span style="color: #339933;">;</span>
    windowSize.<span style="color: #202020;">height</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">480</span><span style="color: #339933;">;</span>
    startPoint.<span style="color: #202020;">x</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">100</span><span style="color: #339933;">;</span>
    startPoint.<span style="color: #202020;">y</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">240</span><span style="color: #339933;">;</span>
    image <span style="color: #339933;">=</span> cvCreateImage<span style="color: #009900;">&#40;</span>windowSize<span style="color: #339933;">,</span> <span style="color: #0000dd;">8</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    cvZero<span style="color: #009900;">&#40;</span>image<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    cvInitFont<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>font<span style="color: #339933;">,</span> CV_FONT_HERSHEY_SIMPLEX<span style="color: #339933;">,</span> <span style="color:#800080;">1.0f</span><span style="color: #339933;">,</span> <span style="color:#800080;">1.0f</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Creazione di una finestra</span>
    cvNamedWindow<span style="color: #009900;">&#40;</span>windowName<span style="color: #339933;">,</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Scrittura del testo &quot;Ciao mondo!&quot; sulla struttura immagine</span>
    cvPutText<span style="color: #009900;">&#40;</span>image<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Ciao mondo!&quot;</span><span style="color: #339933;">,</span> startPoint<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>font<span style="color: #339933;">,</span> CV_RGB<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">255</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Visualizzazione dell'immagine</span>
    cvShowImage<span style="color: #009900;">&#40;</span>windowName<span style="color: #339933;">,</span> image<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Attesa input tastiera, successiva deallocazione memoria</span>
    <span style="color: #666666; font-style: italic;">// e chiusura finestra</span>
    cvWaitKey<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    cvReleaseImage<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>image<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    cvDestroyWindow<span style="color: #009900;">&#40;</span>windowName<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p><em>Nota</em>: Versione corretta. Ringrazio chi mi ha segnalato la dimenticanza (grazie Riccardo). Ho aggiunto anche i riferimenti per l&#8217;uso delle librerie di machine learning (ml). Quanto scritto funzione con le librerie OpenCV 1.0 (a breve usciranno le 1.1)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fspace.it/2007/04/04/opencv-e-dev-c/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Slides su Oz e Mozart</title>
		<link>http://www.fspace.it/2006/10/03/slides-su-oz-e-mozart/</link>
		<comments>http://www.fspace.it/2006/10/03/slides-su-oz-e-mozart/#comments</comments>
		<pubDate>Tue, 03 Oct 2006 12:21:16 +0000</pubDate>
		<dc:creator>federico</dc:creator>
				<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[mozart]]></category>
		<category><![CDATA[oz]]></category>
		<category><![CDATA[presentazione]]></category>

		<guid isPermaLink="false">http://www.fspace.it/2006/10/03/slides-su-oz-e-mozart/</guid>
		<description><![CDATA[Qui di seguito è possibile scaricare le slide sul linguaggio di programmazione Oz e sul relativo ambiente Mozart (qui il sito ufficiale), slide utilizzate nel corso di una talk al LinuxDay 2005 di Gorizia. Presentazione Oz &#8211; Mozart View SlideShare presentation or Upload your own. (tags: linguaggi languages) Diapositive in formato PDF (scaricale qui) Dispositive [...]]]></description>
			<content:encoded><![CDATA[<p><img title="Logo Oz" style="float: left" alt="Logo Oz" src="http://www.fspace.it/icone/ozlogo.png" />Qui di seguito è possibile scaricare le slide sul linguaggio di programmazione Oz e sul relativo ambiente Mozart (<a title="Sito ufficiale del consorzio Mozart" href="http://www.mozart-oz.org" target="_blank">qui il sito ufficiale</a>), slide utilizzate nel corso di una talk al LinuxDay 2005 di Gorizia.</p>
<div style="width:425px;text-align:left" id="__ss_18831"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/fede/presentazione-oz-mozart?type=powerpoint" title="Presentazione Oz - Mozart">Presentazione Oz &#8211; Mozart</a><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=presentazione-oz-mozart-7965&#038;rel=0&#038;stripped_title=presentazione-oz-mozart" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=presentazione-oz-mozart-7965&#038;rel=0&#038;stripped_title=presentazione-oz-mozart" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;">View SlideShare <a style="text-decoration:underline;" href="http://www.slideshare.net/fede/presentazione-oz-mozart?type=powerpoint" title="View Presentazione Oz - Mozart on SlideShare">presentation</a> or <a style="text-decoration:underline;" href="http://www.slideshare.net/upload?type=powerpoint">Upload</a> your own. (tags: <a style="text-decoration:underline;" href="http://slideshare.net/tag/linguaggi">linguaggi</a> <a style="text-decoration:underline;" href="http://slideshare.net/tag/languages">languages</a>)</div>
</div>
<ul>
<li>Diapositive in formato PDF (scaricale <a title="Presentazione Oz Mozart in formato PDF" href="http://www.fspace.it/uploads/presentazione.pdf">qui</a>)</li>
<li>Dispositive in formato OpenOffice 2 (scaricale <a title="Presentazione Oz Mozart in formato OpenOffice" href="http://www.fspace.it/uploads/presentazione.odp">qui</a>)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.fspace.it/2006/10/03/slides-su-oz-e-mozart/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

