<?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; api</title>
	<atom:link href="http://sandropaganotti.com/tag/api/feed/" rel="self" type="application/rss+xml" />
	<link>http://sandropaganotti.com</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Sun, 08 Jan 2012 16:00:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Isocrono e Google Map API</title>
		<link>http://sandropaganotti.com/2010/01/18/isocrono-e-google-map-api/</link>
		<comments>http://sandropaganotti.com/2010/01/18/isocrono-e-google-map-api/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 22:23:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Algoritmi]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[Google Map]]></category>
		<category><![CDATA[isocrono]]></category>

		<guid isPermaLink="false">http://sandropaganotti.com/?p=287</guid>
		<description><![CDATA[Un isocrono non è nient&#8217;altro che una curva che unisce su di una mappai punti che distano uno stesso intervallo temporale (a piedi, o con un mezzo di trasporto) da un punto dato. In questo articolo, che funge da approfondimento della homepage del progetto, vorrei entrare un pò nel merito del piccolo script da utilizzare [...]]]></description>
			<content:encoded><![CDATA[<p>Un <a href="http://it.wikipedia.org/wiki/Isoclina#Scienze_Sociali" target="_blank">isocrono</a> non è nient&#8217;altro che una curva che unisce su di una mappai punti che distano uno stesso intervallo temporale (a piedi, o con un mezzo di trasporto) da un punto dato. In questo articolo, che funge da approfondimento <a href="http://sandropaganotti.com/generate-an-isochrone-map-using-google-maps-api/" target="_blank">della homepage del progetto</a>, vorrei entrare un pò nel merito del piccolo script da utilizzare per calcolare un&#8217;approssimazione di isocrono usando le API di Google Maps.</p>
<p><span id="more-287"></span>Lo script si compone di tre parti, una (classica) funzione di inizializzazione,  una funzione che effettua il <a href="http://code.google.com/intl/it/apis/maps/documentation/services.html#Geocoding" target="_blank">GeoCoding</a> della località della quale si vuole calcolare l&#8217;isocrono e la funzione chiave, che cicla su ognuno dei raggi (il numero di raggi è impostabile, di default 10) della circonferenza costruita intorno a tale località e per ogni raggio si muove verso l&#8217;esterno misurando la distanza in minuti dal centro, quando trova un punto che sorpassa il tempo limite dato lo script mette un marker.</p>
<p>Lo script passa al raggio successivo quando rileva una misurazione che supera del 50% il tempo limite dato.</p>
<pre><code class="javascript">
    function crawlpoint(px,py,mins){
        var point      = new GPoint(px,py);
        var destpoint  = new GPoint(px + x,py + y);   

        directions.loadFromWaypoints(new Array(point.y + "," + point.x ,destpoint.y + "," + destpoint.x),{preserveViewport:true});
        x = x + (inc_x * Math.sin(start_s));
        y = y + (inc_y * Math.cos(start_s));
        m = m + 1;

        if (directions.getNumRoutes() &gt; 0){
            document.getElementById('txt1').value = 'y' + document.getElementById('txt1').value
            var curr_meas = directions.getDuration().seconds/60;
            if (prev_meas &lt;= mins &amp;&amp; curr_meas &gt; mins ){
                map.addOverlay(new GMarker(prev_dest,{title:'Distance: ' + directions.getDuration().html}));
                found     = 1;
            }else{
                prev_dest = destpoint;
                prev_meas = curr_meas;
            }

            if(curr_meas &gt; (mins + (mins * 0.4)) || (m &gt; 20 &amp;&amp; found ==1) || m &gt; 50){
                points.push(new GLatLng(prev_dest.y, prev_dest.x));
                start_s = start_s + slice;
                x = inc_x;
                y = inc_y;
                m = 0;
                found = 0;
                prev_meas = 0;
                curr_meas = 0;
                prev_dest = point;
                directions.clear();

                if(start_s &gt;= (2*Math.PI)){
                    start_s = 0;
                    $('#loader').hide();
                    clearInterval(intval);
                }
            }

        }else{
            document.getElementById('txt1').value = 'n' + document.getElementById('txt1').value
        }
    }
</code></pre>
<p>Possiamo spezzare la funzione in tre punti distinti, la prima parte invoca le <a href="http://code.google.com/intl/it/apis/maps/documentation/services.html#Directions" target="_blank">Directions API</a>, per calcolare la distanza tra il centro e un punto (destpoint) posizionato sul raggio attivo (il cui angolo è memorizzato in start_s, inizialmente a 0) ad una distanza espressa da due variabili x e y. Una volta calcolato il percorso x e y vengono incrementate in modo che al prossimo giro puntino ad un punto sullo stesso raggio un poco più avanti.</p>
<p>La seconda parte aggiunge un marker se tra la durata del percorso attuale supera per la prima volta il limite di tempo inserito.</p>
<p>La terza parte resetta tutti i contatori e avanza al raggio successivo se la misurazione temporale corrente eccede del 50% il tempo limite inserito o se sono state effettuate più di venti misurazioni con l&#8217;identificazione di un marker o più di 50 misurazioni.</p>
<p>Trovate il codice nella sua interezza sul mio account di <a href="http://github.com/sandropaganotti/isochrone-with-google-map" target="_blank">github</a>, potete inoltre testare il tutto su di una <a href="http://sandropaganotti.com/wp-content/goodies/demos/isochrone/index.html" target="_blank">pagina di demo</a>.</p>
<p>PS: credo che l&#8217;algoritmo sia altamente perfezionabile, ad esempio introducendo alcuni concetti di reinforcement learning per la ricerca degli zeri della funzione T(R(p1,p2)) &#8211; t dove T(R(p1,p2)) è il tempo di percorrenza del percorso tra p1 e p2 e t è il tempo limite dell&#8217;isocrono.</p>
]]></content:encoded>
			<wfw:commentRss>http://sandropaganotti.com/2010/01/18/isocrono-e-google-map-api/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nabaztag e Playlist.com</title>
		<link>http://sandropaganotti.com/2008/12/21/nabaztag-e-playlistcom/</link>
		<comments>http://sandropaganotti.com/2008/12/21/nabaztag-e-playlistcom/#comments</comments>
		<pubDate>Sun, 21 Dec 2008 23:26:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Librerie]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[Nabaztag]]></category>
		<category><![CDATA[playlist.com]]></category>
		<category><![CDATA[scrubyt]]></category>

		<guid isPermaLink="false">http://sandropaganotti.com/?p=80</guid>
		<description><![CDATA[Per chi ancora non conoscesse i due termini che compongono il titolo di questo articolo ecco una breve introduzione: Playlist.com Questo sito utilizza un motore di ricerca interno per indicizzare i file mp3 che trova nella rete, tali file vengono poi categorizzati utilizzando le informazioni disponibili (tag mp3, ecc..). Utilizzando una form di ricerca è [...]]]></description>
			<content:encoded><![CDATA[<p>Per chi ancora non conoscesse i due termini che compongono il titolo di questo articolo ecco una breve introduzione:</p>
<p><span id="more-80"></span></p>
<p><strong><a href="http://www.playlist.com" target="_blank">Playlist.com<br />
</a></strong>Questo sito utilizza un motore di ricerca interno per indicizzare i file mp3 che trova nella rete, tali file vengono poi categorizzati utilizzando le informazioni disponibili (tag mp3, ecc..). Utilizzando una form di ricerca è possibile ricercare tra i file indicizzati, ascoltarli e costruirsi una propria playlist che si può poi condividere con altre persone.</p>
<p><strong><a href="http://www.nabaztag.com" target="_blank">NabazTag</a></strong><br />
Il nabaztag è un gadget elettronico, dalla forma di un coniglio, capace di connettersi alla rete wireless domestica di intrattenere ospiti e residenti con tutta una serie di servizi vocali (text-to-speech, podcast, lettura di messaggi, email ed RSS, ecc.. ). Violet, la casa produttrice, ha ben pensato di mettere a disposizione di eventuali sviluppatori interessati <a href="http://doc.nabaztag.com/api/home.html" target="_blank">delle API con le quali interagire col coniglio</a>.</p>
<p><strong><a href="http://github.com/sandropaganotti/nabaztag-command-line-tool/tree/master">Nabaztag Command Line Tool</a><br />
</strong>Ho creato (<a href="http://github.com/sandropaganotti/nabaztag-command-line-tool/tree/master">e caricato su github</a>) uno script in Ruby che, dato l&#8217;identificativo di una playlist di playlist.com, si interfaccia con le API del nabaztag e, utilizzando apposite funzioni, fa in modo che il coniglio esegua l&#8217;intera playlist selezionata.</p>
<p>Fulcro di questo piccolissimo programma è una bellissima libreria di cui ho sentito parlare poco tempo fa: <a href="http://www.scrubyt.org">Scrubyt</a>. Scrubyt serve essenzialmente ad interagire con il web, questo comprende parsing di pagine HTML ma anche compilazione di form e click su link.</p>
<p>Per darvi un assaggio delle potenzialità di questa libreria vi allego il codice che ho usato per recupeare le informazioni sull&#8217;url dei vari file mp3, questi sono i passi:</p>
<ol>
<li>recuperare il file xml dall&#8217;indirizzo view.playlist.com/[id_playlist]/asx</li>
<li>estrarre per ogni nodo &#8216;entry&#8217; l&#8217;attributo href del tag ref</li>
</ol>
<pre><code class="ruby">
      playlist = Scrubyt::Extractor.define do
          fetch "http://view.playlist.com/#{params[0]}/asx"
          ele "//entry//ref" do
            mp3 "href", :type=&gt;:attribute
          end
      end
</code></pre>
<p>A questo punto nella variabile &#8216;playlist&#8217; avrò un elenco di hash ognuno di essi nella forma :mp3 =&gt; &#8216;url&#8217;.</p>
]]></content:encoded>
			<wfw:commentRss>http://sandropaganotti.com/2008/12/21/nabaztag-e-playlistcom/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

