<?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>Flying memes &#187; Uncategorized</title>
	<atom:link href="http://sandropaganotti.com/categoria/uncategorized/feed/" rel="self" type="application/rss+xml" />
	<link>http://sandropaganotti.com</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Fri, 23 Mar 2012 19:07:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Google FriendConnect</title>
		<link>http://sandropaganotti.com/2009/08/05/google-friendconnect/</link>
		<comments>http://sandropaganotti.com/2009/08/05/google-friendconnect/#comments</comments>
		<pubDate>Tue, 04 Aug 2009 22:51:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://sandropaganotti.com/?p=187</guid>
		<description><![CDATA[Poche righe per annunciarvi che stò sperimentando  Google FriendConnect come alternativa ai classici commenti di WordPress, ho scelto questa strada perchè trovo interessante che le persone che leggono questo blog possano utilizzare un account che già possiedono per esprimere le proprie opinioni; inoltre l&#8217;intera struttura &#8216;zoom&#8217; del blog avrebbe richiesto non pochi interventi per portare [...]]]></description>
			<content:encoded><![CDATA[<p>Poche righe per annunciarvi che stò sperimentando  <a href="http://www.google.com/friendconnect">Google FriendConnect</a> come alternativa ai classici commenti di WordPress, ho scelto questa strada perchè trovo interessante che le persone che leggono questo blog possano utilizzare un account che già possiedono per esprimere le proprie opinioni; inoltre l&#8217;intera struttura &#8216;zoom&#8217; del blog avrebbe richiesto non pochi interventi per portare su AJAX l&#8217;http post propedeutico all&#8217;invio di un commento.</p>
<p><span id="more-187"></span>Per aggiungere un commento basta seguire il link di approfondimento di un post e cliccare su &#8216;Lascia un Commento&#8217; (presente a fondo pagina).</p>
<p>Bhe, che dire? Aspetto i vostri commenti a riguardo di questa struttura di gestione commenti !</p>
]]></content:encoded>
			<wfw:commentRss>http://sandropaganotti.com/2009/08/05/google-friendconnect/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Golf Programming: permutazioni</title>
		<link>http://sandropaganotti.com/2009/06/28/golf-programming-permutazioni/</link>
		<comments>http://sandropaganotti.com/2009/06/28/golf-programming-permutazioni/#comments</comments>
		<pubDate>Sun, 28 Jun 2009 10:27:48 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Erlang]]></category>
		<category><![CDATA[Golf Programming]]></category>
		<category><![CDATA[Permutazioni]]></category>
		<category><![CDATA[Tail Recursion]]></category>

		<guid isPermaLink="false">http://sandropaganotti.com/?p=170</guid>
		<description><![CDATA[Questa volta Eineki ci propone un quiz classico che però presenta sempre interessanti spunti: le permutazioni. Ecco la mia soluzione, sono 100 caratteri: def k(l,n);l==''?n:l.split(//).map{&#124;s&#124;k(l.sub(s,''),n+s)}end;p k((ARGV[0]&#124;&#124;"abcd"),'').flatten.uniq Per questa soluzione mi sono inspirato ad una bellissima funzione scritta in Erlang: permutation([]) -&#62; [[]]; permutation(L) -&#62; [[H&#124;T] &#124;&#124; H &#60;- L, T &#60;- permutation(L--[H])]. Vediamo un pò [...]]]></description>
			<content:encoded><![CDATA[<p>Questa volta <a href="http://eineki.wordpress.com">Eineki</a> ci propone un <a href="http://eineki.wordpress.com/2009/06/16/golf-programming-permutazioni/">quiz classico</a> che però presenta sempre interessanti spunti: le permutazioni.</p>
<p><span id="more-170"></span>Ecco la mia soluzione, sono 100 caratteri:</p>
<pre><code class="ruby">def k(l,n);l==''?n:l.split(//).map{|s|k(l.sub(s,''),n+s)}end;p k((ARGV[0]||"abcd"),'').flatten.uniq</code></pre>
<p>Per questa soluzione mi sono inspirato ad una bellissima funzione scritta in Erlang:</p>
<pre><code>permutation([]) -&gt; [[]];
permutation(L)  -&gt; [[H|T] || H &lt;- L, T &lt;- permutation(L--[H])].</code></pre>
<p>Vediamo un pò di orientarci con questa  particolare sintassi: Erlang utilizza dei pattern per descrivere quale &#8216;versione&#8217; della funzione utilizzare, in questo caso abbiamo due &#8216;permutation&#8217;, una che si attiva quando il parametro è una lista vuota e una quando non lo è.</p>
<p>Concentriamoci quindi sulla seconda riga:  il nome del costrutto che stiamo osservando si chiama &#8216;<a href="http://en.wikipedia.org/wiki/List_comprehension">List Comprehension</a>&#8216; ed il suo funzionamento è tutto basato nell&#8217;eseguire l&#8217;operazione a sinistra del doppio pipe &#8216;||&#8217; utilizzando i valori specificati nella parte destra.</p>
<p>Quindi nel nostro caso stiamo costruendo una lista di liste; notiamo infatti che a sinistra del doppio pipe risiede il costrutto classico di lista in Erlang:  [H|T]  ( H stà per Head e rappresenta il primo elemento della lista, T per tail e indica i rimanenti elementi della lista). Ma come vogliamo che sia costruita ognuna di queste liste ? La risposta è nella parte destra del List Comprehension:</p>
<ul>
<li>In H si alterneranno tutti gli elementi di L</li>
<li>In T, per ogni elemento di L, si alterneranno le liste derivanti dal calcolo delle permutazioni sulla lista L privata dell&#8217;elemento che è in H.</li>
</ul>
<p>In queste sede mi sono limitato ad una veloce overview sul funzionamento della funzione &#8216;permutation&#8217; in Erlang;  per chi intenedesse approfondire la tematica consiglio vivamente <a href="http://blogs.claritycon.com/blogs/peter_miller/archive/2007/10/14/3314.aspx">questo articolo</a> di <a href="http://www.linkedin.com/pub/peter-miller/7/a1/7b1">Peter Miller</a> che riesce a illustrare in modo molto comprensibile quanto io qui ho solo sommariamente spiegato.</p>
]]></content:encoded>
			<wfw:commentRss>http://sandropaganotti.com/2009/06/28/golf-programming-permutazioni/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Rappresentazione di un file Audio con Ruby</title>
		<link>http://sandropaganotti.com/2009/02/15/rappresentazione-di-un-file-audio-con-ruby/</link>
		<comments>http://sandropaganotti.com/2009/02/15/rappresentazione-di-un-file-audio-con-ruby/#comments</comments>
		<pubDate>Mon, 16 Feb 2009 00:21:59 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://sandropaganotti.com/?p=128</guid>
		<description><![CDATA[Nell&#8217;ottica di un progetto un pò più grande che vorrei portare avanti (e del quale spero di poter scrivere qualcosa nel prossimo futuro) ho speso gli ultimi giorni per trovare un modo col quale interfacciarmi con un file audio utilizzando Ruby. La risposta è arrivata da ruby-audio, un wrapper Ruby costruito (nell&#8217;ormai lontano 2005) intorno [...]]]></description>
			<content:encoded><![CDATA[<p>Nell&#8217;ottica di un progetto un pò più grande che vorrei portare avanti (e del quale spero di poter scrivere qualcosa nel prossimo futuro) ho speso gli ultimi giorni per trovare un modo col quale interfacciarmi con un file audio utilizzando Ruby.<br />
La risposta è arrivata da <a href="http://raa.ruby-lang.org/project/ruby-audio/">ruby-audio</a>, un wrapper Ruby costruito (nell&#8217;ormai lontano 2005) intorno a <a href="http://www.mega-nerd.com/libsndfile/">libsndfile</a> del quale ripropone i metodi consentendoci di utilizzare una sintassi come la seguente:</p>
<p><span id="more-128"></span></p>
<pre><code>snd = Audio::Soundfile.open(File.join(RAILS_ROOT,'public','audio','sound.wav'))
frames = snd.readf_float snd.frames
</code></pre>
<p>In queste due righe di codice ho istruito Ruby ad aprire un file audio e ad estrarne i frames; utilizzando poi le <a href="http://code.google.com/apis/chart/">google chart api </a>per stamparli a video con il seguente risultato:</p>
<p><img class="aligncenter size-full wp-image-133" title="Campionamento " src="http://sandropaganotti.com/wp-content/uploads/2009/02/chart.png" alt="Campionamento " width="600" height="300" />I problemi legati a ruby-audio sono tutti di natura tecnica: la libreria è infatti parecchio datata e non è all&#8217;interno delle rubygems, deve essere quindi scaricata ed installata con i seguenti comandi:</p>
<pre><code>rake
rake install
</code></pre>
<p>In più sono richieste alcune dipendenze, nell&#8217;ordine:</p>
<ul>
<li><a href="http://narray.rubyforge.org/">NArray</a>: installabile tramite le rubygems: &#8216;gem install narray&#8217; ;</li>
<li>libsndfile: installabile attraverso l&#8217;appropriato package manager (nel caso di utenti OSX &#8216;sudo port install libsndfile&#8217;);</li>
<li><a href="http://www.swig.org/">SWIG</a>: anche questo installabile tramite il propri package manager (&#8216;sudo port install swig&#8217;);</li>
<li><a href="http://rake.rubyforge.org/">Rake</a>: installabile tramite le rubygems &#8216;gem install rake&#8217;;</li>
</ul>
<p>Prima di poter finalmente compilare questa libreria è necessario un ultimo passaggio: all&#8217;interno del file  &#8216;lib/audio.rb&#8217; è necessario inserire in cima al file:</p>
<pre><code>require 'rubygems'
</code></pre>
<p>in modo da far si che il successivo &#8220;require &#8216;narray&#8217;&#8221; vada a buon fine.</p>
]]></content:encoded>
			<wfw:commentRss>http://sandropaganotti.com/2009/02/15/rappresentazione-di-un-file-audio-con-ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

