<?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>Totem&#039;s Blog</title>
	<atom:link href="http://www.totemslair.org/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.totemslair.org/blog</link>
	<description>Elegance is the intersection of simplicity and functionality.</description>
	<lastBuildDate>Sat, 10 Sep 2011 15:30:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.5</generator>
		<item>
		<title>Una struttura per i coefficienti binomiali</title>
		<link>http://www.totemslair.org/blog/2011/09/10/una-struttura-per-i-coefficienti-binomiali/</link>
		<comments>http://www.totemslair.org/blog/2011/09/10/una-struttura-per-i-coefficienti-binomiali/#comments</comments>
		<pubDate>Sat, 10 Sep 2011 15:29:04 +0000</pubDate>
		<dc:creator>totem</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Miscellanea]]></category>

		<guid isPermaLink="false">http://www.totemslair.org/blog/?p=39</guid>
		<description><![CDATA[// Recentemente mi sono trovato di fronte alla necessità di fare dei calcoli con coefficienti binomiali, ma la presenza di tutti quei fattoriali non è certo di buon auspicio. Se dovessi calcolare ogni coefficiente binomiale secondo la definizione dovrei calcolare tre fattoriali. Essendo una funzione che diverge in modo estremamente veloce, sarebbe già un'impresa calcolare [...]]]></description>
			<content:encoded><![CDATA[<p><script src="http://totemslair.org/shscripts/shCore.js" type="text/javascript"></script><br />
<script src="http://totemslair.org/shscripts/shBrushCSharp.js" type="text/javascript"></script><br />
<script type="text/javascript">// <![CDATA[
    SyntaxHighlighter.config.clipboardSwf = '../../shscripts/clipboard.swf';
    SyntaxHighlighter.all();
// ]]&gt;</script><br />
Recentemente mi sono trovato di fronte alla necessità di fare dei calcoli con coefficienti binomiali, ma la presenza di tutti quei fattoriali non è certo di buon auspicio. Se dovessi calcolare ogni coefficiente binomiale secondo la definizione dovrei calcolare tre fattoriali. Essendo una funzione che diverge in modo estremamente veloce, sarebbe già un'impresa calcolare qualcosa di irrisorio come 30! Per questo ho scritto una struttura che semplicemente memorizza i fattori moltiplicativi presenti al numeratore e al denominatore della frazione, immaginando di sviluppare tutti i fattoriali. Inoltre, elimina i fattori uguali, ossia semplifica la frazione. Per ottenere il risultato come double, poi, moltiplica e divide alternativamente per i coefficienti presenti al numeratore o al denominatore, per arginare la perdita di precisione dovuta al passaggio di ordine di grandezza (questa parte si può migliorare ulteriormente). Spero che possa essere utile a qualcuno:</p>
<pre class="brush: c#">struct BinomialCoefficient
{
    private List&lt;Int32&gt; numFactors, denFactors;

    public BinomialCoefficient(Int32 n, Int32 k)
    {
        numFactors = Enumerable.Range(1, n).ToList();
        denFactors = Enumerable.Range(1, k).Concat(Enumerable.Range(1, n - k)).ToList();
        this.Simplify();
    }

    public static BinomialCoefficient operator *(BinomialCoefficient binom1, BinomialCoefficient binom2)
    {
        BinomialCoefficient result = new BinomialCoefficient();
        result.InitFields();
        result.numFactors.AddRange(binom1.numFactors.Concat(binom2.numFactors));
        result.denFactors.AddRange(binom1.denFactors.Concat(binom2.denFactors));
        result.Simplify();
        return result;
    }

    public static BinomialCoefficient operator /(BinomialCoefficient binom1, BinomialCoefficient binom2)
    {
        BinomialCoefficient inverse2 = new BinomialCoefficient();
        inverse2.numFactors = binom2.denFactors;
        inverse2.denFactors = binom2.numFactors;
        return binom1 * inverse2;
    }

    public static explicit operator Double(BinomialCoefficient binom)
    {
        binom.numFactors.Sort();
        binom.denFactors.Sort();

        Double result = 1.0;
        Int32 minCount = Math.Min(binom.numFactors.Count, binom.denFactors.Count);

        for (Int32 i = 0; i < minCount; i++)
            result *= (Double)binom.numFactors[i] / binom.denFactors[i];

        if (binom.numFactors.Count > binom.denFactors.Count)
            for (Int32 i = minCount; i < binom.numFactors.Count; i++)
                result *= (Double)binom.numFactors[i];
        else
            for (Int32 i = minCount; i < binom.denFactors.Count; i++)
                result /= (Double)binom.denFactors[i];

        return result;
    }

    private void InitFields()
    {
        numFactors = new List&lt;int&gt;();
        denFactors = new List&lt;int&gt;();
    }

    private void Simplify()
    {
        for(Int32 i = 0; i < this.numFactors.Count; i++)
            for(Int32 j = 0; j < this.denFactors.Count; j++)
                if (this.numFactors[i] == this.denFactors[j])
                {
                    this.numFactors.RemoveAt(i);
                    this.denFactors.RemoveAt(j);
                    i--;
                    break;
                }
    }
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.totemslair.org/blog/2011/09/10/una-struttura-per-i-coefficienti-binomiali/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hamlet: to tree or not to tree?</title>
		<link>http://www.totemslair.org/blog/2011/09/06/hamlet-to-tree-or-not-to-tree/</link>
		<comments>http://www.totemslair.org/blog/2011/09/06/hamlet-to-tree-or-not-to-tree/#comments</comments>
		<pubDate>Tue, 06 Sep 2011 11:56:53 +0000</pubDate>
		<dc:creator>totem</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Grafi]]></category>

		<guid isPermaLink="false">http://www.totemslair.org/blog/?p=37</guid>
		<description><![CDATA[Sto sviluppando una libreria per gestire e analizzare grafi e alberi. Si chiama Hamlet! Proprio come l&#8217;omonima opera di Shakespear. Spero che a qualcuno possa servire&#8230; Per darvi un&#8217;idea approssimativa, su un grafo con 1000 vertici e 33000 connessioni, l&#8217;implementazione dell&#8217;algoritmo di Dijkstra in modalità Release impiega circa 60-70 millisecondi su un Intel i5 a [...]]]></description>
			<content:encoded><![CDATA[<p>Sto sviluppando una libreria per gestire e analizzare grafi e alberi. Si chiama <a href="http://www.pierotofy.it/pages/projects/project.php?id=581">Hamlet</a>! Proprio come l&#8217;omonima opera di Shakespear. Spero che a qualcuno possa servire&#8230; Per darvi un&#8217;idea approssimativa, su un grafo con 1000 vertici e 33000 connessioni, l&#8217;implementazione dell&#8217;algoritmo di Dijkstra <strong>in modalità Release</strong> impiega circa 60-70 <em>millisecondi</em> su un Intel i5 a 3.3GHz.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.totemslair.org/blog/2011/09/06/hamlet-to-tree-or-not-to-tree/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Logger generico</title>
		<link>http://www.totemslair.org/blog/2011/07/07/logger-generico/</link>
		<comments>http://www.totemslair.org/blog/2011/07/07/logger-generico/#comments</comments>
		<pubDate>Thu, 07 Jul 2011 09:47:43 +0000</pubDate>
		<dc:creator>totem</dc:creator>
				<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://www.totemslair.org/blog/?p=32</guid>
		<description><![CDATA[// Qualche settimana fa stavo osservando il progetto di laurea di un mio amico. Si trattava di un'implementazione in Java di un semplice gioco multiplayer client-server a turni. Dato che sarebbe stato valutato di lì a poco, era necessario correggere i bugs e gli errori di stile e di ingegnerizzazione in poco tempo: per far [...]]]></description>
			<content:encoded><![CDATA[<p><script src="http://totemslair.org/shscripts/shCore.js" type="text/javascript"></script><br />
<script src="http://totemslair.org/shscripts/shBrushJScript.js" type="text/javascript"></script><br />
<script type="text/javascript">// <![CDATA[
    SyntaxHighlighter.config.clipboardSwf = '../../shscripts/clipboard.swf';
    SyntaxHighlighter.all();
// ]]&gt;</script><br />
Qualche settimana fa stavo osservando il progetto di laurea di un mio amico. Si trattava di un'implementazione in Java di un semplice gioco multiplayer client-server a turni. Dato che sarebbe stato valutato di lì a poco, era necessario correggere i bugs e gli errori di stile e di ingegnerizzazione in poco tempo: per far questo, in moltissimi metodi sono stati aggiunti dei blocchi try per loggare tutte le eccezioni verificate. Dalla parte del server, sarebbe comunque stato vantaggioso lasciare questa parte dedicata al logging anche dopo il termine del progetto, poiché l'amministratore avrebbe potuto gestire e manutenere il programma grazie a tali reports.<br />
Mi ha colpito il fatto che non sia possibile, in Java, ma soprattutto in C#, implementare un oggetto logger universale. Tuttavia mi è subito venuto in mente che in un linguaggio un po' più permissivo si potrebbe fare. Ho pensato al JavaScript... No! Non è uno scherzo! La flessibilità delle funzioni JavaScript permette di fare questo ed altro. L'idea di base è la seguente.</p>
<p>Vogliamo loggare ogni eccezione che si verifichi nel dominio di un certo oggetto. Per far questo si potrebbe impacchettare ogni funzione (metodo) dell'oggetto in un'ulteriore funzione con l'unico scopo di catturare le eccezioni e notificare i dettagli sulla console. Ma questo è fattibilissimo in JavaScript. Infatti ogni oggetto può essere visto come un hash, ossia un dizionario. Perciò possiamo enumerare tutti i suoi membri con un comunissimo for. Tra questi è possibile vedere quali sono funzioni usando typeof, che restituisce "function" in quel caso. Dopodiché possiamo sfruttare la (eccessiva, dico io) permissività del linguaggio nel passaggio di parametri: anche se una funzione viene definita senza parametri, il chiamante gliene può passare quanti ne vuole e tutti saranno registrati nella variabile <strong>arguments</strong>, che fa parte del contesto di ogni funzione. Ecco, quindi, che cosa ho prodotto:</p>
<pre class="brush: js">// Oggetto di prova
var obj =
    {
        firstName : "Aldo",
        lastName : "Baglio",
        sayHello : function() { alert("Hello! I'm " + this.firstName + " " + this.lastName + "!"); throw "Error";}
    };

function logExceptions(obj)
{
    for(var key in obj)
    {
        if (typeof(obj[key]) == "function")
        {
            var oldFunc = obj[key];
            var newFunc = function()
            {
                try
                {
                    oldFunc.apply(obj, arguments);
                }
                catch(e)
                {
                    if (e.message == null &#038;&#038; e.toString().length <= 0)
                        return;

                    var funcName = obj[key].name;
                    funcName = (funcName != null &#038;&#038; funcName.length > 0) ? "'" + funcName + "'" : "anonymous";
                    var message = (typeof(e) == "object" &#038;&#038; e.message != null) ? e.message : e.toString();
                    var errorName = (e.name != null ? e.name : "Generic Error");

                    console.log(errorName + " occurred in " + funcName + " function:");
                    console.log("Error message: " + message);
                    console.log("Arguments: ");
                    console.log(arguments);
                }
            };
            obj[key] = newFunc;
        }
    }
}

logExceptions(obj);
// Notate che invoco sayHello con un parametro nonostante la sua dichiarazione non ne richieda
obj.sayHello("hello");</pre>
<p>Potete verificare che il codice passa effettivamente tutti i parametri passati alla funzione wrapper anche alla funzione wrappata. Infatti apply, a differenza di call, permette di usare un array come specifica per la lista di parametri.</p>
<p>Et voilà! Basta chiamare logExceptions su un oggetto per loggarne tutti i metodi automaticamente, ed è possibile personalizzare il report modificandone il codice una sola volta. Quando non avete più bisogno del logger, basta cancellare la chiamata a logExceptions. Semplice, no?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.totemslair.org/blog/2011/07/07/logger-generico/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Parsing di un file .ini in un solo statement</title>
		<link>http://www.totemslair.org/blog/2011/03/05/parsing-di-un-file-ini-in-un-solo-statement/</link>
		<comments>http://www.totemslair.org/blog/2011/03/05/parsing-di-un-file-ini-in-un-solo-statement/#comments</comments>
		<pubDate>Sat, 05 Mar 2011 16:49:47 +0000</pubDate>
		<dc:creator>totem</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Funzioni lambda]]></category>
		<category><![CDATA[Generics]]></category>
		<category><![CDATA[LINQ]]></category>

		<guid isPermaLink="false">http://www.totemslair.org/blog/?p=23</guid>
		<description><![CDATA[// Questo post è un po' una prosecuzione del precedente, in cui ho dato una rapida occhiata alla possibilità di approcciarsi al paradigma funzionale con LINQ. Il codice che vi propongo di seguito è in grado di eseguire il parsing completo di un file di configurazione usando solo due variabili di appoggio e condensando tutta [...]]]></description>
			<content:encoded><![CDATA[<p><script src="http://totemslair.org/shscripts/shCore.js" type="text/javascript"></script> <script src="http://totemslair.org/shscripts/shBrushCSharp.js" type="text/javascript"></script></p>
<p><script type="text/javascript">// <![CDATA[
    SyntaxHighlighter.config.clipboardSwf = '../../shscripts/clipboard.swf';
    SyntaxHighlighter.all();
// ]]&gt;</script><br />
Questo post è un po' una prosecuzione del precedente, in cui ho dato una rapida occhiata alla possibilità di approcciarsi al paradigma funzionale con LINQ. Il codice che vi propongo di seguito è in grado di eseguire il parsing completo di un file di configurazione usando solo due variabili di appoggio e condensando tutta l'elaborazione in una cascata di metodi di estensione linq. Ogni funzione lavora sull'output della precedente e fornisce l'input alla successiva. In questi casi l'inferenza di tipo diventa un'alleata preziosa:</p>
<pre class="brush: c#">static void Main(string[] args)
{
    if (args.Length &lt; 2)
        return;

    String fileName = args[1];
    Regex sectionRegex = new Regex(@"\[(?&lt;Section&gt;\w+)\]");
    Regex fieldRegex = new Regex(@"(?&lt;Field&gt;\w+)\s*\=\s*(?&lt;Value&gt;.*)");

    Match match;
    String lastSection = "&lt;No Section&gt;";
    var ini = File.ReadAllLines(fileName)
        .Select (line => line.Contains(';') ?
                         line.Remove(line.IndexOf(';')) :
                         line)
        .Select (line => line.Trim())
        .Where  (line => !String.IsNullOrEmpty(line))
        .GroupBy(line => (match = sectionRegex.Match(line)).Success ?
                         lastSection = match.Groups["Section"].Value :
                         lastSection)
        .Select (group => new
        {
            SectionName = group.Key,
            Fields = group
                  .Select(line => (match = fieldRegex.Match(line)).Success ?
                         new { Name = match.Groups["Field"].Value,
                         Value = match.Groups["Value"].Value } :
                         null)
                  .Where(element => element != null)
        });

    foreach (var section in ini)
    {
        Console.WriteLine("Section: {0}", section.SectionName);
        foreach (var field in section.Fields)
            Console.WriteLine("   Field {0} = {1}", field.Name, field.Value);
    }
}</pre>
<p>Un'altra funzionalità che ho sfruttato pesantemente è una costante di tutti i linguaggi C-like dagli albori della programmazione letterale imperativa: il valore di ritorno dell'operatore di assegnazione. Notate come non sarebbe stato possibile definire la chiave di raggruppamento se l'assegnazione di lastSection non avesse di fatto restituito il nuovo valore della variabile e come sarebbe stato necessario usare dei metodi anonimi anziché delle espressioni lambda se non avessi potuto richiamare la proprietà Success dall'oggetto esposto dall'assegnazione della variabile match.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.totemslair.org/blog/2011/03/05/parsing-di-un-file-ini-in-un-solo-statement/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Metodi di estensione, null-checks e programmazione funzionale</title>
		<link>http://www.totemslair.org/blog/2011/03/03/metodi-di-estensione-null-checks-e-programmazione-funzionale/</link>
		<comments>http://www.totemslair.org/blog/2011/03/03/metodi-di-estensione-null-checks-e-programmazione-funzionale/#comments</comments>
		<pubDate>Thu, 03 Mar 2011 12:11:59 +0000</pubDate>
		<dc:creator>totem</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[LINQ]]></category>
		<category><![CDATA[Programmazione funzionale]]></category>

		<guid isPermaLink="false">http://www.totemslair.org/blog/?p=17</guid>
		<description><![CDATA[// Se vi capita spesso di dover controllare se una certa variabile di tipo reference contiene un valore nullo (null o Nothing), allora questo articolo è quello che fa per voi. Usare i metodi di estensione per evitare di nidificare decine di if, switch e condizioni varie è veramente un'ottima idea. Se ci fate caso, [...]]]></description>
			<content:encoded><![CDATA[<p><script src="http://totemslair.org/shscripts/shCore.js" type="text/javascript"></script> <script src="http://totemslair.org/shscripts/shBrushCSharp.js" type="text/javascript"></script><br /> <br />
<script type="text/javascript">// <![CDATA[
    SyntaxHighlighter.config.clipboardSwf = '../../shscripts/clipboard.swf';
    SyntaxHighlighter.all();
// ]]&gt;</script></p>
<p>Se vi capita spesso di dover controllare se una certa variabile di tipo reference contiene un valore nullo (null o Nothing), allora <a href="http://www.codeproject.com/KB/cs/maybemonads.aspx">questo articolo</a> è quello che fa per voi. Usare i metodi di estensione per evitare di nidificare decine di if, switch e condizioni varie è veramente un'ottima idea. Se ci fate caso, questo approccio è decisamente più funzionale che imperativo, ed il trend degli ultimi anni per quanto riguarda .NET è proprio una tendenza spiccata verso il paradigma funzionale. Pensateci un attimo: già le espressioni lambda del fw3.5 e successivamente i metodi anonimi del fw4.0 sono state delle grandi aggiunte, ma più di tutti LINQ si fa sentire vigorosamente con la mole di estensioni che mette a disposizione. Certe volte non mi sembra nemmeno di scrivere in C# XD.</p>
<p>Ecco un esempio. Qualche settimana fa stavo scrivendo una libreria con metodi di estensione che uso spesso (per stringhe e collezioni generics). Trovandomi a dover scrivere il codice per la funzione ToProperCase, sono venuto fuori con questo:</p>
<pre class="brush: c#">public static String ToProperCase(this String instance)
{
    if (String.IsNullOrEmpty(instance))
        return instance;

    return instance.Trim()
       .Split(' ')
       .Where(word => !String.IsNullOrEmpty(word))
       .Select(word => word.Length > 1 ?
                       Char.ToUpper(word[0]) + word.Substring(1).ToLower() :
                       word.ToUpper())
       .Aggregate("", (accumulator, word) => accumulator + word + ' ')
       .Trim();
}</pre>
<p>Notate come abbia usato LINQ pesantemente. Il proper case è una formattazione delle stringhe in cui ogni parola ha l'iniziale maiuscola. Nel codice sopra, Trim() elimina gli spazi in testa e in coda alla stringa, Split() spezza la stringa in parti separate da uno spazio, Where() filtra i risultati scartando le stringhe vuote, Select() trasforma ogni parola imponendo il carattere iniziale maiuscolo, Aggregate() aggrega ogni parola in una stringa completa, usando come separatore ancora lo spazio e infine Trim() elimina il carattere spazio incluso alla fine della stringa dal passo precedente.</p>
<p>Se volete altri esempi di programmazione funzionale in C# vi consiglio di leggere anche <a href="http://www.c-sharpcorner.com/UploadFile/rmcochran/Curry01122008102239AM/Curry.aspx">questo articolo</a> e le altre due pubblicazioni dello stesso autore sempre su c-sharpcorner.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.totemslair.org/blog/2011/03/03/metodi-di-estensione-null-checks-e-programmazione-funzionale/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ascii Art!</title>
		<link>http://www.totemslair.org/blog/2011/02/25/ascii-art/</link>
		<comments>http://www.totemslair.org/blog/2011/02/25/ascii-art/#comments</comments>
		<pubDate>Fri, 25 Feb 2011 14:41:45 +0000</pubDate>
		<dc:creator>totem</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Grafica]]></category>

		<guid isPermaLink="false">http://www.totemslair.org/blog/?p=13</guid>
		<description><![CDATA[// Oggi ho letto un simpatico articolo su The Code Project e mi sono preso la libertà di renderlo un po' pi&#249; formale ed efficiente. Ho racchiuso la funzionalità di creazione in una classe factory e quella di salvataggio in un'altra classe che ha un costruttore dichiarato come internal, cosicché possa essere usato solo da [...]]]></description>
			<content:encoded><![CDATA[<p><script src="http://totemslair.org/shscripts/shCore.js" type="text/javascript"></script> <script src="http://totemslair.org/shscripts/shBrushCSharp.js" type="text/javascript"></script><br />
<script type="text/javascript">// <![CDATA[
    SyntaxHighlighter.config.clipboardSwf = '../../shscripts/clipboard.swf';
    SyntaxHighlighter.all();
// ]]&gt;</script><br />
Oggi ho letto un simpatico <a href="http://www.codeproject.com/KB/recipes/ASCII_Imager.aspx">articolo</a> su The Code Project e mi sono preso la libertà di renderlo un po' pi&ugrave; formale ed efficiente. Ho racchiuso la funzionalità di creazione in una classe factory e quella di salvataggio in un'altra classe che ha un costruttore dichiarato come internal, cosicché possa essere usato solo da classi dello stesso assembly (nella fattispecie, una volta compilata la libreria, solo dalla classe factory). Ecco il codice:</p>
<pre class="brush: c#">namespace AsciiArt
{
    public class AsciiArtCreator
    {
        // Contiene i caratteri che rappresentano varie tonalit&agrave; di grigio, a seconda di
        // quanto &egrave; "densa" la rappresentazione del carattere
        private static Char[] asciiGreyScale = { '@', '#', '8', '&#038;', 'o', ':', '*', '-', ' ' };

        // Queste due propriet&agrave; indicano a quanti pixel corrisponde un carattere,
        // in larghezza e in lunghezza. Di default un carattere è 6x8 pixel
        public Int32 AsciiUnitX { get; set; }
        public Int32 AsciiUnitY { get; set; }

        public AsciiArtCreator()
        {
            this.AsciiUnitX = 6;
            this.AsciiUnitY = 8;
        }

        public AsciiArtDocument CreateFromImage(String imagePath)
        {
            if (!File.Exists(imagePath))
                throw new FileNotFoundException(imagePath);
            return CreateFromImage(Image.FromFile(imagePath) as Bitmap);
        }

        public AsciiArtDocument CreateFromImage(Bitmap image)
        {
            AsciiArtDocument document = new AsciiArtDocument();
            BitmapData bmData = image.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

            Int32 stride = bmData.Stride;
            IntPtr Scan0 = bmData.Scan0;
            // Usare un'iterazione unsafe tramite puntatori &egrave; molto pi&ugrave; veloce
            // della stessa operazione con il metodo GetPixel(x, y)
            document.AsciiFormat = new Size(AsciiUnitX, AsciiUnitY);
            unsafe
            {
                byte* baseAddress = (byte*)(void*)Scan0;
                byte red, green, blue, grey;

                for (int i = 0; i < image.Height / AsciiUnitY; i++)
                {
                    for (int j = 0; j < image.Width / AsciiUnitX; j++)
                    {
                        int greySum = 0;
                        float greyAverage;
                        for (int x = 0; x < AsciiUnitX; x++)
                            for (int y = 0; y < AsciiUnitY; y++)
                            {
                                // Calcola la posizione in memoria del colore di questo pixel
                                byte* position = (byte*)(baseAddress + stride * (i * AsciiUnitY + y) + (j * AsciiUnitX + x) * 3);
                                blue = position[0];
                                green = position[1];
                                red = position[2];
                                // Ne fa la media per convertirlo in scala di grigi
                                grey = (byte)((float)(red + green + blue) / 3);
                                greySum += grey;
                            }
                        // Quindi ricava la media di tutte le tonalit&agrave; di grigio presenti nell'area
                        // AsciiUnitX x AsciiUnitY che rappresenta un caratere
                        greyAverage = (float)greySum / (AsciiUnitY * AsciiUnitX);
                        // E stampa sul documento il carattere ascii corrispondente alla tonalit&agrave;
                        // di grigio prevalente nel rettangolino considerato
                        document.Append(asciiGreyScale[(Int32)(greyAverage / (256.0f / asciiGreyScale.Length))]);
                    }
                    document.AppendLine();
                }
            }
            image.UnlockBits(bmData);

            return document;
        }
    }

    public class AsciiArtDocument
    {
        private StringBuilder buffer;

        public Size AsciiFormat { get; internal set; }

        internal AsciiArtDocument()
        {
            this.buffer = new StringBuilder();
        }

        internal void Append(Char c)
        {
            this.buffer.Append(c);
        }

        internal void AppendLine()
        {
            this.buffer.AppendLine();
        }

        public void SaveAsPlainText(String fileName)
        {
            File.WriteAllText(fileName, buffer.ToString());
        }

        public void SaveAsHtml(String fileName)
        {
            StringReader reader = new StringReader(buffer.ToString());
            StreamWriter writer = new StreamWriter(fileName);

            writer.WriteLine("<html>");
            writer.WriteLine("   <head>  </head>");
            writer.WriteLine("   <body>
<pre style='font-size: {0}px; line-height: {1}px'>", this.AsciiFormat.Height * 2, this.AsciiFormat.Height * 2 + 2);
            while (reader.Peek() > -1)
            {
                writer.Write(reader.ReadLine());
                writer.WriteLine("");
            }
            writer.WriteLine("   </pre>
<p> </body>");<br />
            writer.WriteLine("</html>");</p>
<p>            writer.Close();<br />
            reader.Close();<br />
        }<br />
    }<br />
}</pre>
<p>Esempi:<br />
<a href="http://fc00.deviantart.net/fs36/i/2008/246/a/3/Hinata_vector_by_vakuvaku.jpg"><img src="http://fc00.deviantart.net/fs36/i/2008/246/a/3/Hinata_vector_by_vakuvaku.jpg" style="width: 120px;"></a><br />
versione ascii (tagliata perché era troppo grande):<br />
<a href="http://totemslair.org/blog/wp-content/asciiArt.png"><img src="http://totemslair.org/blog/wp-content/asciiArt.png" style="width:120px;"></a> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.totemslair.org/blog/2011/02/25/ascii-art/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Funzioni lambda e metodi di estensione</title>
		<link>http://www.totemslair.org/blog/2011/02/24/funzioni-lambda-e-metodi-di-estensione/</link>
		<comments>http://www.totemslair.org/blog/2011/02/24/funzioni-lambda-e-metodi-di-estensione/#comments</comments>
		<pubDate>Thu, 24 Feb 2011 11:25:15 +0000</pubDate>
		<dc:creator>totem</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Funzioni lambda]]></category>
		<category><![CDATA[Generics]]></category>

		<guid isPermaLink="false">http://www.totemslair.org/blog/?p=11</guid>
		<description><![CDATA[// Dalla versione 3.5 del framework, il .NET supporta ufficialmente il lambda calcolo e i metodi di estensione, mentre i generics sono amici affezionati già dalla release 2.0. Negli ultimi tempi l&#8217;impulso a scrivere del codice più elegante, funzionale e generale è stato quindi fortemente favorito. In questo breve e semplice prospetto vorrei mostrare come [...]]]></description>
			<content:encoded><![CDATA[<p><script src="http://totemslair.org/shscripts/shCore.js" type="text/javascript"></script> <script src="http://totemslair.org/shscripts/shBrushCSharp.js" type="text/javascript"></script><br />
<script type="text/javascript">// <![CDATA[
    SyntaxHighlighter.config.clipboardSwf = '../../shscripts/clipboard.swf';
    SyntaxHighlighter.all();
// ]]&gt;</script></p>
<p>Dalla versione 3.5 del framework, il .NET supporta ufficialmente il lambda calcolo e i metodi di estensione, mentre i generics sono amici affezionati già dalla release 2.0. Negli ultimi tempi l&#8217;impulso a scrivere del codice più elegante, funzionale e generale è stato quindi fortemente favorito. In questo breve e semplice prospetto vorrei mostrare come usare queste tecniche per migliorare la riusabilità e l&#8217;utilità del codice.<br />
N.B.: la conoscenza dei generics è data per scontata. </p>
<p><strong>Metodi di estensione</strong><br />
Un metodo di estensione viene dichiarato come un metodo statico, ma viene utilizzato come un metodo d&#8217;istanza. Grazie a questa peculiare caratteristica, è possibile aggiungere ai tipi già esistenti &#8211; ad esempio String, Int32, Point, eccetera&#8230; &#8211; altri metodi, pur non avendo accesso al codice che originariamente ne contiene la definizione. Sfortunatamente non è possibile fare lo stesso con gli operatori, le proprietà o i metodi sottoposti a polimorfismo, mentre in altri linguaggi, come ad esempio in Ruby, è possibile anche fare questo.<br />
Dato che i metodi di estensione si comportano in maniera atipica, anche la loro dichiarazione non segue le normali regole. Poiché agiscono come se fossero metodi d&#8217;istanza, è necessario specificare da qualche parte su quale istanza si debba lavorare. Si fa questo passando un parametro del tipo che si vuole estendere nella dichiarazione della signature, facendolo precedere dal modificator &#8220;this&#8221;. E&#8217; inoltre necessario inserire questa dichiarazione in una classe pubblica e statica, in modo che sia accessibile da ogni parte del codice client, il quale dovrà a usa volta eventualmente importare il namespace in cui essa è scritta. Ecco un esempio:</p>
<pre class="brush: c#">namespace ExtensionMethods
{
    // Classe statica e pubblica
    public static class Methods
    {
        // Il metodo di estensione è pure pubblico e statico
        public static Int32 Double(this Int32 instance)
        {
            return instance * 2;
        }
    }
}

namespace Esempio
{
    // Importa il namespace in cui è definita Double
    using ExtensionMethods;
    class Program
    {
        static void Main(string[] args)
        {
            Int32 a = 32;
            // Richiama Double come se fosse un metodo d'istanza della classe Int32
            Int32 b = a.Double();

            Console.WriteLine(a); // 32
            Console.WriteLine(b); // 64

            Console.ReadKey();
        }
    }
}</pre>
<p><strong>Espressioni lambda</strong><br />
Il lambda calcolo si basa sulla manipolazione di funzioni definite inline. In .NET, esiste un tipo deputato a contenere una funzione lambda. Invece che contenere un valore, variabili di quel tipo contengono invece quelle funzioni che, a seconda dei punti di vista, si possono chiamare inline, anonime o lambda. Tale tipo è Func, ed è dichiarato usando svariati tipi generics collegati. Una funzione lambda si dichiara in questo modo:</p>
<pre>parametri =&gt; valore_restituito</pre>
<p>Se i parametri sono più di uno, vanno specificati tra parentesi e separati da virgole, opzionalmente preceduti dal tipo.<br />
Ad esempio:</p>
<pre class="brush: c#">// Rappresenta una funzione che, dato x, restituisce x al quadrato
x =&gt; Math.Pow(x, 2)[/code]
Detto questo, un semplice codice dimostrativo:
[code]namespace Esempio
{
    class Program
    {
        static void Main(string[] args)
        {
            // Func indica una funzione che accetta un parametro double e
            // restituisce un risultato di tipo double
            Func square = x =&gt; x * x;
            // Analogamente la prossima accetta in input due double e restituisce un altro double
            Func weightedAverage = (x, y) =&gt; Math.Sqrt(x * y);

            // Richiama la funzione contenuta in square
            Console.WriteLine(square(4)); // 2.0
            Console.WriteLine(weightedAverage(2, 8)); // 4.0

            Console.ReadKey();
        }
    }
}</pre>
<p><strong>Mettere tutto insieme</strong><br />
Se l'utilità dei metodi di estensioni può essere lampante, forse lo è di meno quella delle espressioni lambda. Perciò ecco degli esempi pratici.<br />
Nel prossimo codice scriverò una funzione che, data una qualsiasi collezione, applica a tutti gli elementi una certa funzione e restituisce una lista di tutti i risultati. Ad esempio, data una lista di numeri interi, restituisce una lista che ne contiene i quadrati, oppure dato un array di stringhe, restituisce un array che ne contiene le lunghezze. Questi due compiti sembrano molto diversi, ma è possibile implementarli usando lo stesso codice e modificando solo i parametri:</p>
<pre class="brush: c#">using System;
using System.Linq;
using System.Collections.Generic;

namespace ExtensionMethods
{
    public static class Methods
    {
        /* Transform è un metodo di estensione, perciò lo potremo usare su di ogni tipo o derivato di
        IEnumerable, il che equivale a dire che lo potremo usare su ogni collezione di qualsiasi tipo.
        transformation è una funzione che accetta come input un parametro di tipo T e restituisce come output
        un valore di tipo TResult, quindi la collezione da restituire sarà una IEnumerable di TResult. */
        public static IEnumerable
 Transform(this IEnumerable instance, Func transformation)
        {
            // Come vedete il codice è semplice. Crea una lista vuota
            List
 result = new List
();
            // La popola con i risultati della funzione
            foreach (T element in instance)
                result.Add(transformation(element));
            // E la restituisce come IEnumerable
            return result.AsEnumerable();
        }
    }
}

namespace Esempio
{
    using ExtensionMethods;
    class Program
    {
        static void Main(string[] args)
        {
            Int32[] numbers = new Int32[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
            String[] strings = new String[] { "tizio", "caio", "sempronio" };

            // numbers.Transform(x =&gt; x * x) prende la collezione numbers e restituisce una collezione
            // contenente i quadrati dei numeri in numbers
            foreach (Int32 square in numbers.Transform(x =&gt; x * x))
                Console.WriteLine(square);

            // Allo stesso modo questa ottiene l'insieme delle lunghezze delle stringhe in strings
            foreach (Int32 length in strings.Transform(s =&gt; s.Length))
                Console.WriteLine(length);

            Console.ReadKey();
        }
    }
}</pre>
<p>E' talmente utile questa funzione che è implementata di default nel namespace System.Linq e si chiama Select.</p>
<p>Ora, avete presenta la funzione Array.IndexOf? Essa restituisce l'indice del primo elemento dell'array che risulta uguale al parametro specificato. Volendo scrivere una funzione simile, ma che funzioni per tutte le collezioni, potremmo usare un metodo di estensione e qualche vincolo generics:</p>
<pre class="brush: c#">using System;
using System.Linq;
using System.Collections.Generic;

namespace ExtensionMethods
{
    public static class Methods
    {
        /* Notate il vincolo di interfaccia IComparable. Se il tipo di dato degli elementi della collezione non
        rappresenta qualcosa di "comparabile", allora non c'è modo di stabilire se due elementi sono o meno
        uguali, o meglio non c'è modo di farlo con le informazioni che si hanno ora sul tipo. Usando il vincolo
        stiamo imponendo che questa condizione sia verificata. E' come usare le ipotesi di un teorema. */
        public static IEnumerable IndicesOf(this IEnumerable instance, T seed) where T : IComparable
        {
            List indices = new List();
            Int32 i = 0;
            foreach(T element in instance)
            {
                if (element.CompareTo(seed) == 0)
                    indices.Add(i);
                i++;
            }
            return indices.AsEnumerable();
        }
    }
}

namespace Esempio
{
    using ExtensionMethods;
    class Program
    {
        static void Main(string[] args)
        {
            String[] strings = new String[] { "mela", "pera", "banana", "mela", "uva", "arancia", "mela" };

            // Scrive gli indici a cui compare la parola "mela", ossia 0, 3 e 6
            foreach (Int32 index in strings.IndicesOf("mela"))
                Console.WriteLine(index);

            Console.ReadKey();
        }
    }
}</pre>
<p>Come avete visto, usando i metodi di estensione, le espressioni lambda e poco codice è possibile porre le basi per implementare un'enormità di funzionalità differenti. Visto questo trend verso la programmazione funzionale che si sta insinuando in C# tramite linq, consiglio vivamente di studiare linq to objects e linq to entities.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.totemslair.org/blog/2011/02/24/funzioni-lambda-e-metodi-di-estensione/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>L&#8217;arte dell&#8217;eleganza</title>
		<link>http://www.totemslair.org/blog/2011/02/22/larte-delleleganza/</link>
		<comments>http://www.totemslair.org/blog/2011/02/22/larte-delleleganza/#comments</comments>
		<pubDate>Tue, 22 Feb 2011 14:17:08 +0000</pubDate>
		<dc:creator>totem</dc:creator>
				<category><![CDATA[Letture consigliate]]></category>
		<category><![CDATA[Miscellanea]]></category>

		<guid isPermaLink="false">http://www.totemslair.org/blog/?p=7</guid>
		<description><![CDATA[Sono di recente approdato a leggere questa domanda su stackoverflow.com. La prima risposta mi ha francamente lasciato di stucco poiché, a mio modesto parere, non era possibile dare una definizione più concisa e semplice. L&#8217;eleganza è quella qualità che fonde insieme semplicità e funzionalità. A questo proposito, vi consiglio di leggere &#8220;Clean Code: A handbook [...]]]></description>
			<content:encoded><![CDATA[<p>Sono di recente approdato a leggere <a title="What is elegant code?" href="http://stackoverflow.com/questions/563036/what-is-elegant-code">questa domanda</a> su stackoverflow.com. La prima risposta mi ha francamente lasciato di stucco poiché, a mio modesto parere, non era possibile dare una definizione più concisa e semplice. L&#8217;eleganza è quella qualità che fonde insieme semplicità e funzionalità. A questo proposito, vi consiglio di leggere &#8220;Clean Code: A handbook of agile software craftmanship&#8221;, di Robert C. Martin.</p>
<p><a href="http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882"><img style="height: 200px; margin-left: auto; margin-right: auto;" src="http://knowfree.net/wp-content/uploads/2010/10/0132350882.jpeg" alt="Copertina" /></a></p>
<p>Si tratta di un libro che spiega in che modo scrivere codice pulito, chiaro, leggibile, manutenibile, autoesplicativo: in breve, elegante. Ci sono molti consigli su come strutturare le classi aderendo al paradigma SOLID, su come scrivere funzioni e metodi, sul modo di scegliere buoni identificatori per variabili ed altre entità, su cosa scrivere nei commenti (e quando scriverli), e molto altro ancora.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.totemslair.org/blog/2011/02/22/larte-delleleganza/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hello</title>
		<link>http://www.totemslair.org/blog/2011/02/22/hello/</link>
		<comments>http://www.totemslair.org/blog/2011/02/22/hello/#comments</comments>
		<pubDate>Tue, 22 Feb 2011 14:01:11 +0000</pubDate>
		<dc:creator>totem</dc:creator>
				<category><![CDATA[Miscellanea]]></category>

		<guid isPermaLink="false">http://www.totemslair.org/blog/?p=5</guid>
		<description><![CDATA[Primo post per questo nuovo blog. Molto probabilmente non scriverò molto, ma cercherò di esporre le mie idee e i miei work-in-progress. Stay tuned!]]></description>
			<content:encoded><![CDATA[<p>Primo post per questo nuovo blog. Molto probabilmente non scriverò molto, ma cercherò di esporre le mie idee e i miei work-in-progress. Stay tuned!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.totemslair.org/blog/2011/02/22/hello/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

