<?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>Rainbowbreeze &#187; Mobile</title>
	<atom:link href="http://www.rainbowbreeze.it/category/tech/mobile/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.rainbowbreeze.it</link>
	<description>Alfredo Morresi personal website</description>
	<lastBuildDate>Sat, 28 Jan 2012 10:56:33 +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>Tethering dallo smartphone, ecco come gli operatori telefonici possono scoprirlo</title>
		<link>http://www.rainbowbreeze.it/tethering-dallo-smartphone-ecco-come-gli-operatori-telefonici-possono-scoprirlo/</link>
		<comments>http://www.rainbowbreeze.it/tethering-dallo-smartphone-ecco-come-gli-operatori-telefonici-possono-scoprirlo/#comments</comments>
		<pubDate>Tue, 03 Jan 2012 08:07:16 +0000</pubDate>
		<dc:creator>Alfredo</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Tethering]]></category>

		<guid isPermaLink="false">http://www.rainbowbreeze.it/?p=1355</guid>
		<description><![CDATA[Molte delle promozioni per la navigazione web dal proporio smartphone precisano che l&#8217;accesso ad Internet e&#8217; consentito *solo dal device*, e non attaccando il device ad un computer attraverso il tethering (wifi o usb). Mi sono sempre chiesto come facessero i carrier a capire quando stavo navigando nell&#8217;uno o nell&#8217;altro modo, e grazie a questo [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.rainbowbreeze.it/wordpress/wp-content/uploads/2012/01/android_tethering2.jpg"><img class="alignleft size-full wp-image-1357" style="margin-top: 2px; margin-bottom: 2px; margin-left: 4px; margin-right: 4px;" title="android_tethering2" src="http://www.rainbowbreeze.it/wordpress/wp-content/uploads/2012/01/android_tethering2.jpg" alt="" width="240" height="155" /></a>Molte delle promozioni per la navigazione web dal proporio smartphone precisano che l&#8217;accesso ad Internet e&#8217; consentito <strong>*solo dal device*</strong>, e non attaccando il device ad un computer attraverso il tethering (wifi o usb). Mi sono sempre chiesto come facessero i carrier a capire quando stavo navigando nell&#8217;uno o nell&#8217;altro modo, e grazie a <a title="New ClockworkMod app offers free tethering to Android phones, sans root" href="http://www.theverge.com/2012/1/2/2677391/clockworkmod-tether-non-rooted-android-free-tethering#87381046" target="_blank">questo commento</a> a <a title="New ClockworkMod app offers free tethering to Android phones, sans root" href="http://www.theverge.com/2012/1/2/2677391/clockworkmod-tether-non-rooted-android-free-tethering" target="_blank">questo post</a> ho avuto la risposta, almeno per Android:</p>
<p><em>The built-in tether support acts as a WiFi hotspot and router. This does a USB tether, and acts as a network proxy. Very different.</em></p>
<p><em>The biggest difference, from the carrier’s end, is that routing is pretty easy to detect; each packet that goes through the router, the time-to-live (TTL) field in the IPv4 header is decremented. In addition, there is NAT going on, and there are heuristics to detect that. There are ways around this using Linux’s iptables that can masquerade the routing/NAT, but I’m unaware of any mainstream implementations of this on Android, and it would require root. This app doesn’t; I’m like 90% sure it’s all done over ADB (Android Debug Bridge), which every Android device supports.</em></p>
<p><em>With the USB tether acting as a network proxy, there is simply no routing/NAT going on, so there is no way for the carrier to detect what’s going on. It just appears to be data coming from the phone.</em></p>
<p>Ottimo, penso anche che il meccanismo sia estendibile anche ad altre piattaforme, non si finisce mai di imparare dai commenti! Prossima mossa, vedere se veramente il tethering USB non viene scoperto dai carrier.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rainbowbreeze.it/tethering-dallo-smartphone-ecco-come-gli-operatori-telefonici-possono-scoprirlo/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Performance test con Appcelerator Titanium</title>
		<link>http://www.rainbowbreeze.it/performance-test-con-appcelerator-titanium/</link>
		<comments>http://www.rainbowbreeze.it/performance-test-con-appcelerator-titanium/#comments</comments>
		<pubDate>Mon, 30 May 2011 16:17:47 +0000</pubDate>
		<dc:creator>Alfredo</dc:creator>
				<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Appcelerator]]></category>
		<category><![CDATA[Appcelerator Titanim]]></category>

		<guid isPermaLink="false">http://www.rainbowbreeze.it/?p=1241</guid>
		<description><![CDATA[Ci sono tante scelte che possono portare o non portare all&#8217;uso di un framework mobile come Appcelerator Titanium. Tra queste, sicuramente, le performance delle applicazioni realizzate. Per fare alcuni test ho usato il progetto KitchenSink, fornito da Titanium stessa come &#8220;banco di prova&#8221; per dimostrare quello di cui e&#8217; capace. Effettivamente la meraviglia c&#8217;e&#8217; stata, [...]]]></description>
			<content:encoded><![CDATA[<p>Ci sono tante scelte che possono portare o non portare all&#8217;uso di un framework mobile come <a title="Appcelerator Titanium" href="http://www.appcelerator.com/" target="_blank">Appcelerator Titanium</a>. Tra queste, sicuramente, le performance delle applicazioni realizzate.</p>
<p>Per fare alcuni test ho usato il progetto <a title="Kitchen Sink" href="http://developer.appcelerator.com/doc/kitchensink" target="_blank">KitchenSink</a>, fornito da Titanium stessa come &#8220;banco di prova&#8221; per dimostrare quello di cui e&#8217; capace. Effettivamente la meraviglia c&#8217;e&#8217; stata, vedere la stessa identica app (a livello di sorgente JavaScript) girare su un Android e su un iPhone riprendendo aspetto e comportamenti tipici del sistema applicativo.</p>
<p>Titanium infatti crea un progetto in codice nativo (Android o iPhone) dal file Javascript di origine e quel progetto viene poi compilato per il dispositivo. Non ci sono quindi librerie grafiche intermedie di supporto e, a meno di personalizzazioni grafiche, il look&#8217;nd feel dell&#8217;applicazione realizzata e&#8217; quello del particolare dispositivo dove si andra&#8217; ad eseguire. Quindi conta molto la bonta&#8217; del codice generato nella valutazione delle performance. Ovvio che nessun codice generato automaticamente per uno scenario medio-complesso puo&#8217; essere allo stesso livello di un codice scritto a manina e ottimizzato per quella specifica esigenza, ma a volte le differenze sono trascurabili.</p>
<p>Purtroppo non e&#8217; successo cosi&#8217; per una delle viste di Titanium, composta da una ListView per Android o da una UITableView per iPhone un po&#8217; complessa. Come si puo&#8217; vedere dal video, le performance sono bassine su Android, sotto l&#8217;usabile, mentre rimangono soddisfacenti su iPhone.</p>
<p style="text-align: center;">
<p><a href="http://www.youtube.com/watch?v=X2KVO3H7u7Q">http://www.youtube.com/watch?v=X2KVO3H7u7Q</a></p>
</p>
<p><span id="more-1241"></span>Per fare le prove, ho usato l&#8217;ultima versione di KitchenSink trovata su GitHub, ho compilato l&#8217;applicazione Titanium con il mobile SDK 1.6.2 e i device sono un Samsung Galaxy Tab e un iPhone 4G. Ho ripetuto la prova su un Nexus One per sicurezza, ma il risultato e&#8217; lo stesso.</p>
<p>Peccato, magari riprovo tra qualche mese per vedere se le cose sono migliorate.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rainbowbreeze.it/performance-test-con-appcelerator-titanium/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Che editor usare per Appcelerator Titanium?</title>
		<link>http://www.rainbowbreeze.it/che-editor-usare-per-appcelerator-titanium/</link>
		<comments>http://www.rainbowbreeze.it/che-editor-usare-per-appcelerator-titanium/#comments</comments>
		<pubDate>Tue, 15 Feb 2011 23:21:43 +0000</pubDate>
		<dc:creator>Alfredo</dc:creator>
				<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Appcelerator]]></category>
		<category><![CDATA[Appcelerator Titanim]]></category>
		<category><![CDATA[development]]></category>

		<guid isPermaLink="false">http://www.rainbowbreeze.it/?p=1216</guid>
		<description><![CDATA[Configurato l&#8217;ambiente di sviluppo, e&#8217; ora di scrivere la prima applicazione con Appcelerator Titanium. Una volta creato il progetto, ci si accorge pero&#8217; che non c&#8217;e&#8217; modo di editarlo. Quindi niente autocompletamento del codice, niente reference dei metodi e documentazione inline mentre si scrive, niente refactoring e facilitazioni varie. A meno di qualche trucchetto. In [...]]]></description>
			<content:encoded><![CDATA[<p>Configurato <a title="Appcelerator Titanium su Ubuntu 10.10 64bit" href="http://www.rainbowbreeze.it/appcelerator-titanium-su-ubuntu-10-10-64bit/">l&#8217;ambiente di sviluppo</a>, e&#8217; ora di scrivere la prima applicazione con <strong>Appcelerator Titanium</strong>. Una volta creato il progetto, ci si accorge pero&#8217; che non c&#8217;e&#8217; modo di editarlo. Quindi niente autocompletamento del codice, niente reference dei metodi e documentazione inline mentre si scrive, niente refactoring e facilitazioni varie. A meno di qualche trucchetto.</p>
<p>In primis, si puo&#8217; usare <strong>Notepad++</strong> con <a href="https://docs.google.com/View?id=dfrprrw7_19cvmjqkck#StartNotepad++" target="_blank">un&#8217;apposito plugin</a> che permettera&#8217; l&#8217;autocompletamento del codice.</p>
<p>Se invece si cerca qualcosa di piu&#8217; integrato, si puo&#8217; passare ad Eclipse, utilizzando <a href="http://www.aptana.com/" target="_blank">Aptana Studio</a> ed alcune configurazioni aggiuntive. Aptana perche&#8217; mette a disposizione un editor per file Javascript sia in versione standalone, sia come plugin per Eclipse, e perche&#8217; di recente e&#8217; stata acquistata proprio da Appcelerator, una mossa che fa presagire una futura forte integrazione tra i due.</p>
<p>Scaricato ed installato il plugin di Aptana per Eclipse, l&#8217;autocompletamento del codice piu&#8217; essere ottenuto grazie a <a href="http://jameslow.com/2010/05/31/titanium-autocomplete-eclipse/" target="_blank">questo utile post</a> in cui c&#8217;e&#8217; un programma php per convertire le API doc di Appcelerator Titanium nell&#8217;header JavaScript. Per generare quello relativo al Mobile SDK 1.5.1 ecco cosa ho fatto:</p>
<pre class="brush:bash">wget http://jamesdlow.googlecode.com/svn/trunk/Eclipse/Aptana/Titanium/titanium.php
wget http://developer.appcelerator.com/apidoc/mobile/1.5.1/api.json
sudo apt-get install php-cli
php titanium.php &gt; timobile.js
</pre>
<p>Il seguente video mostra invece come configurare Eclipse ed abilitare quindi l&#8217;autocompletamento:</p>
<p><a href="http://www.youtube.com/watch?v=d10j2-tEgVY">http://www.youtube.com/watch?v=d10j2-tEgVY</a></p>
<p><span id="more-1216"></span></p>
<p>Si puo&#8217; inoltre configurare Eclipse per compilare il progetto, senza ricorrere al Titanium Developer. <a href="http://metadict.petergeil.name/2010/02/building-titanium-projects-from-eclipse/" target="_blank">Questo post</a> spiega in dettaglio come fare spiega usando un&#8217;<a href="http://help.eclipse.org/helios/index.jsp?topic=/org.eclipse.platform.doc.user/concepts/concepts-exttools.htm" target="_blank">external tool configuration</a> dell&#8217;IDE e riprendendo lo script in Phyton che viene usato da Titanium per fare la build. Anche <a href="http://amitkothari.com/blog/2010/08/30/setting-up-eclipse-for-iphone-development-using-titanium/" target="_blank">questo post</a> puo&#8217; dare una mano. Peccato che i comandi trovati non funzionino, almeno sulla mia installazione e per le build Android.</p>
<p>Per vedere quali sono gli script lanciati per la compilazione, ho eseguito Titanium Developer da una shell, ho lanciato il progetto e sono andato a controllare l&#8217;output sulla shell, ottenendo questa riga di comando per fare il build e il deploy sull&#8217;emulatore:<br />
<em>&#8220;/opt/titanium/mobilesdk/linux/1.5.1/android/builder.py&#8221; &#8220;simulator&#8221; &#8220;AskAQuestion&#8221; &#8220;/opt/android/android-sdk-linux_x86&#8243; &#8220;/media/data/titanium/askaquestion&#8221; &#8220;it.rainbowbreeze.askaquestion&#8221; &#8220;7&#8243; &#8220;HVGA&#8221;<br />
</em>Per capire il valore dei parametri, occorre sapere che ho installato Appcelerator Titanium sotto <em>/opt/titanium</em>, ho il <em>mobile sdk 1.5.1</em>, il mio progetto si chiama <em>AskAQuestion</em>, si trova nella cartella <em>/media/data/titanium/askaquestion</em> ed ha come application id <em>it.rainbowbreeze.askaquestion</em>. L&#8217;Android SDK e&#8217; installato sotto <em>/opt/android/android-sdk-linux_x86</em> e gli ultimi 2 parametri sono il livello di API del progetto (7) e risoluzione dell&#8217;emulatore (HVGA 320&#215;480).</p>
<p>Con questi dati, da Eclipse:</p>
<p>Run -&gt; External Tools -&gt; Exernals Tools Configurations<br />
Selezionare Program dall&#8217;albero a sinistra e poi il bottone &#8220;New launch configuration&#8221;<br />
Name: <em>Titanium Android Build</em><br />
Location: <em>/usr/bin/python</em><br />
Working Directory: <em>/opt/titanium/sdk/linux/1.0.0</em><br />
Arguments: <em>&#8220;/opt/titanium/mobilesdk/linux/1.5.1/android/builder.py&#8221; &#8220;simulator&#8221; &#8220;AskAQuestion&#8221; &#8220;/opt/android/android-sdk-linux_x86&#8243; &#8220;/media/data/titanium/askaquestion&#8221; &#8220;it.rainbowbreeze.askaquestion&#8221; &#8220;7&#8243; &#8220;HVGA&#8221;</em></p>
<p>Con l&#8217;emulatore avviato, basta lanciare l&#8217;external tool per avere la compilazione del programma per Android e il lancio automatico.</p>
<p>Buono sviluppo!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rainbowbreeze.it/che-editor-usare-per-appcelerator-titanium/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nokia e Microsoft: il terzo polo del mondo mobile</title>
		<link>http://www.rainbowbreeze.it/nokia-e-microsoft-il-terzo-polo-del-mondo-mobile/</link>
		<comments>http://www.rainbowbreeze.it/nokia-e-microsoft-il-terzo-polo-del-mondo-mobile/#comments</comments>
		<pubDate>Sun, 13 Feb 2011 18:18:05 +0000</pubDate>
		<dc:creator>Alfredo</dc:creator>
				<category><![CDATA[Mobile]]></category>
		<category><![CDATA[MeeGo]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Nokia]]></category>
		<category><![CDATA[QT]]></category>
		<category><![CDATA[Windows Phone 7]]></category>

		<guid isPermaLink="false">http://www.rainbowbreeze.it/?p=1213</guid>
		<description><![CDATA[L&#8217;unione tra Nokia e Microsoft in una partnership dove la l&#8217;azienda finlandese produrra&#8217; &#8220;cellulari&#8221; equipaggiati con Windows Phone 7 mi ha toccato abbastanza profondamente per una serie di motivi. Innanzitutto l&#8217;importanza strategica di una decisione del genere: dal mio punto di vista Nokia negli ultimi anni avra&#8217; anche prodotto nuovi telefoni, ma non e&#8217; riuscita [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-1214" style="margin: 2px 4px;" title="Nokia-Microsoft" src="http://www.rainbowbreeze.it/wordpress/wp-content/uploads/2011/02/Nokia-Microsoft.jpg" alt="" width="212" height="250" />L&#8217;<a href="http://www.microsoft.com/presspass/press/2011/feb11/02-11partnership.mspx" target="_blank">unione tra Nokia e Microsoft</a> in una partnership dove la l&#8217;azienda finlandese produrra&#8217; &#8220;cellulari&#8221; equipaggiati con Windows Phone 7 mi ha toccato abbastanza profondamente per una serie di motivi.</p>
<p>Innanzitutto l&#8217;<strong>importanza strategica</strong> di una decisione del genere: dal mio punto di vista Nokia negli ultimi anni avra&#8217; anche prodotto nuovi telefoni, ma non e&#8217; riuscita ad innovare sul software. Esattamente un anno fa annuncio&#8217; al Mobile World Congress del 2010 l&#8217;alleanza con Intel per creare la piattaforma Meego, ma dopo 363 giorni esatti non si e&#8217; visto un solo prototipo pronto per il mercato. Microsoft, dal canto suo, dopo aver lanciato Windows Phone 7, sta cercando con il massimo interesse sviluppatori che realizzino applicazioni per il suo nuovo sistema operativo, ma la diffusione sul mercato di quest&#8217;ultimo e&#8217; ancora bassissima, quindi e&#8217; poco appetibile. Entrambe hanno qualcosa che all&#8217;altra interessa, e sono interessate all&#8217;altra per qualcosa che gli manca: Nokia possiede device e utenti fidelizzati, Microsoft software e strumenti per lo sviluppo. Una collaborazione cosi&#8217; perfettamente incastrata e simbiotica tra i due giganti e&#8217; capace di grandi cose, se poi <a href="http://www.huffingtonpost.com/2011/02/13/nokia-microsoft-news_n_822574.html" target="_blank">Nokia viene pure pagata da Microsoft</a> per la partnership&#8230;</p>
<p>Stiamo parlando di due aziende che hanno una <strong>poderosa batteria di cannoni a disposizione dei reparti marketing e commerciale</strong>: con un&#8217;intelligente mossa che e&#8217; andata oltre la visione a breve periodo che le vedeva concorrenti per le molliche del mobile (Symbian-MeeGo vs WP7),  qualcuno ha capito che nel medio-lungo periodo l&#8217;unione fa la forza, e che e&#8217; inutile sprecare munizione una contro l&#8217;altra per prendersi gli avanzi, ma e&#8217; molto piu&#8217; profiquo impiegarle assieme per fiaccare la concorrenza (Apple e Android) e tentare di mordere la torta intera. Utenti, sviluppatori e partner commerciali si trovera&#8217; il modo per convincerli, pubblicita&#8217; dopo pubblicita&#8217;, iniziativa dopo iniziativa, mossa dopo mossa.</p>
<p>Dopo questo annuncio e a meno di strani cambiamenti, sono abbastanza convinto che <strong>Windows Phone 7 ora abbia tutte le carte giuste per diventare il terzo polo nel mondo dello sviluppo per mobile</strong>.</p>
<p>Poi certo, ogni grande allenza, se fatta nel mezzo di una battaglia, porta con se&#8217; morti e feriti. Alcuni di questi potrebbero essere:</p>
<p><span id="more-1213"></span></p>
<ul>
<li><strong>Symbian</strong>: definitivamente relegato al mercato dei paesi emergenti. Non mi sembra una sconfitta, anzi, il consolidamento in una nicchia neanche tanto piccola. Certo, chi ha investito gli ultimi anni della sua formazione in questo sistema operativo potrebbe non essere felice, ma l&#8217;informatica e&#8217; l&#8217;informatica, se non ti aggiorni pian piano ti estingui, purtroppo&#8230;</li>
<li><strong>QT, MeeGo e il l&#8217;open source</strong> in generale: anche se <a href="http://blogs.forum.nokia.com/blog/nokia-developer-news/2011/02/11/letter-to-developers" target="_blank">Nokia ha dichiarato</a> che rimarranno come tecnologie di R&amp;D, non ci vedo niente di buono, perche&#8217; temo che quest&#8217;area possa essere a rischio non appena ci sara&#8217; da chiudere qualche rubinetto o fare un po&#8217; di refactoring aziendale. Tante promesse, tanti sforzi, tanto entusiasmo da parte di molti <strong>sviluppatori</strong> che fanno questo lavoro anche spinti da un&#8217;ideologia, e invece ora tutto e&#8217; sprofondato in un oscuro tunnel senza luce al fondo. Uno strappo che non potra&#8217; mai piu&#8217; essere ricucito.</li>
<li><strong>Ovi Store</strong>: suppongo rimarra&#8217; per i device Symbian, mentre tutto il nuovo verra&#8217; veicolato dal Marketplace Microsoft, che subira&#8217; forse qualche modifica, qualche integrazione, ma non perdera&#8217; la sua identita&#8217;.</li>
<li><strong>Bing e Ovi Maps, Ovi Music Store e Zune Markeplace</strong>: cosa succedera&#8217; a questi servizi ora duplicati? Si riuscira&#8217; a  trovare una profiqua integrazione oppure &#8220;ne rimarra&#8217; solo uno&#8221;? A questa domanda proprio non so  rispondere.</li>
<li><strong>Nokia</strong>: dopo anni di leadership indiscussa sul mercato hardware e software, dopo avre impiegato molte risorse per capire la strada da prendere, dopo abbondanti promesse e altrettanti ritardi, ha infine dovuto fare un umile passo indietro. Un doloroso cambio di rotta che ha portato ad un brusco calo del valore delle azioni. Solo il tempo decretera&#8217; se questa mossa e&#8217; stata vincente. Ora, per lo meno, la direzione e&#8217; chiara e il colosso finlandese potra&#8217; dedicarsi anima e corpo al consolidamento della propria posizione in due settori: produzione dei dispositivi e (multi)media company.</li>
<li><strong>Intel</strong>: un anno fa ha tentato di abbracciare anche il mondo del software, ma e&#8217; tornata a casa fallendo nell&#8217;impresa.</li>
<li><strong>Samsung Bada</strong>: ormai non ha piu&#8217; speranze, almeno per il mercato globale. La terza posizione sul podio della leadership per il mobile e&#8217; stata conquistata, i posti sono finiti. Ma dopotutto qualcuno avrebbe dovuto dirle che nel 2010 l&#8217;idea di lanciare sul mercato un nuovo sistema operativo per mobile non era poi cosi&#8217; acuta, in relazione al preciso periodo storico.</li>
</ul>
<p>In definitiva, <strong>solo QT, il free software e </strong><strong>tutto uno strascico di sviluppatori al seguito</strong><strong> ci hanno veramente perso</strong>, senza averne una vera colpa a priori. Questo mi dispiace molto dato che sono sempre stato un sostenitore di quest&#8217;ottima tecnologia crossplatform per desktop e mobile da ormai diversi anni. Non credo ad un porting di QT per Windows Phone 7, quindi non vedo nuove, appetibili, prospettive di sviluppo. Ma la <a href="http://blog.qt.nokia.com/2011/02/12/nokia-new-strategic-direction-what-is-the-future-for-qt/" target="_blank">speranza e&#8217; sempre l&#8217;ultima a morire</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rainbowbreeze.it/nokia-e-microsoft-il-terzo-polo-del-mondo-mobile/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Appcelerator Titanium su Ubuntu 10.10 64bit</title>
		<link>http://www.rainbowbreeze.it/appcelerator-titanium-su-ubuntu-10-10-64bit/</link>
		<comments>http://www.rainbowbreeze.it/appcelerator-titanium-su-ubuntu-10-10-64bit/#comments</comments>
		<pubDate>Tue, 08 Feb 2011 20:35:26 +0000</pubDate>
		<dc:creator>Alfredo</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Appcelerator]]></category>
		<category><![CDATA[Appcelerator Titanim]]></category>
		<category><![CDATA[Developmen]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.rainbowbreeze.it/?p=1211</guid>
		<description><![CDATA[Incuriosito dalla possibilita&#8217; di sviluppare applicazioni multipiattaforma per Android e iPhone, ho provato ad installare Appcelerator Titanium sulla mia Linuxbox, una Ubunto 10.10 a 64 bit. Di seguito i passi seguiti. Ho scaricato il runtime di Titanium Developer per Linux 64 bit. La versione corrente e&#8217; la 1.2.2. L&#8217;ho scompattato e l&#8217;ho lanciato. Alla richiesta [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-1212" title="appcelerator_logo" src="http://www.rainbowbreeze.it/wordpress/wp-content/uploads/2011/02/appcelerator_logo.png" alt="" width="220" height="220" />Incuriosito dalla possibilita&#8217; di sviluppare applicazioni multipiattaforma per Android e iPhone, ho provato ad installare <a href="http://www.appcelerator.com/" target="_blank">Appcelerator Titanium</a> sulla mia Linuxbox, una Ubunto 10.10 a 64 bit. Di seguito i passi seguiti.</p>
<p>Ho <a href="http://www.appcelerator.com/products/download" target="_blank">scaricato il runtime di Titanium Developer per Linux 64 bit</a>. La versione corrente e&#8217; la 1.2.2. L&#8217;ho scompattato e l&#8217;ho lanciato. Alla richiesta del percorso di installazione, sotto la mia home oppure in /opt/titanium, ho scelto la seconda opzione, e il programma si e&#8217; chiuso senza altri segni di vita. Per farlo funzionare, sono stato costretto a far partire l&#8217;installer con<br />
<em>sudo ./Titanium\ Developer</em><br />
eseguendo poi a fine installazione un cambio di permessi delle cartelle create con il comando<br />
<em>sudo chown -R rainbowbreeze:rainbowbreeze /opt/titanium</em></p>
<p>Scaricati i due pacchetti necessari, l&#8217;installer si chiude di nuovo con l&#8217;errore<br />
<strong>symbol lookup error: /usr/lib/libgdk-x11-2.0.so.0: undefined symbol: g_malloc_n</strong><br />
che sembra essere <a href="http://developer.appcelerator.com/question/14471/symbol-lookup-error-usrliblibgdk-x11-20so0-undefined-symbol-gmallocn-solved" target="_blank">ben documentato e risolto</a>:<br />
<em>cd /opt/titanium</em> (oppure <em>cd ~/.titanium</em> se l&#8217;avete installato nella vostra home)<em><br />
rm runtime/linux/1.0.0/libgobject-2.0.*<br />
rm runtime/linux/1.0.0/libglib-2.0.*<br />
rm runtime/linux/1.0.0/libgio-2.0.*<br />
rm runtime/linux/1.0.0/libgthread-2.0.*</em></p>
<p>Superato anche questo ostacolo, ho rilanciato l&#8217;installazione, accettato le condizioni di contratto e mi trovo davanti un nuovo errore:<br />
<strong>icedteanp plugin error: Failed to run /etc/alternatives/../../bin/java.  For more detail rerun &#8220;firefox -g&#8221; in a terminal window.</strong><br />
anche questo errore e&#8217; <a href="http://developer.appcelerator.com/question/48691/ubuntu-lucid---icedteanp-plugin-error" target="_blank">documentato e risolto</a>:<em><br />
sudo aptitude remove openjdk-6-jre icedtea6-plugin<br />
sudo aptitude install sun-java6-jre sun-java6-plugin sun-java6-fonts</em></p>
<p><span id="more-1211"></span>Fatta la registrazione, l&#8217;applicazione e&#8217; finalmente partita. Sono andato nella &#8220;Profile Perspective&#8221; per settare il path dell&#8217;SDK Android e non mi e&#8217; stato riconosciuto correttamente dato che dalla versione 9 di questi ultimi il comando <em>adb</em> e&#8217; stato spostato dalla cartella <em>tools</em> alla cartella <em>platform-tools</em>. Anche questo problema <a href="http://guides.appcelerator.com/en/getting_started.html#preparing_for_android_development" target="_blank">documentato e risolto della Getting Started</a>, utile da seguire anche per fare altri settaggi al proprio sistema. Basta creare un link simbolico al file:<br />
<em>cd [SDK HOME]/tools<br />
ln -s ../platform-tools/adb</em></p>
<p>Finalmente, ho scaricato il progetto di prova <a href="http://guides.appcelerator.com/en/kitchensink.html" target="_blank">Kitchen Sync</a>, l&#8217;ho lanciato selezionando come SDK &#8220;APIs 2.2&#8243; (quello con le API Google, e non 2.2) e come Screen HVGA e ho iniziato a giocare un po&#8217; con questo strumento di sviluppo. Un eventuale errore in fase di lancio dell&#8217;applicazione potrebbe essere causato dalla scelta di un livello di SDK &#8220;2.2&#8243;, &#8220;2.1&#8243; o altri: dato che il progetto utilizza le API Android di Google, occorre avere installato un SDK che le supporti e lanciare il progetto usandolo al posto del pulito emulatore 2.2, 2.1 o precedenti. Qui <a href="http://developer.appcelerator.com/question/51051/failed-installing-comappceleratorkitchensink-pkg-datalocaltmpappapk" target="_blank">un post sull&#8217;argomento</a>.</p>
<p>Trovare invece tra i log della console di Titanium Developer la scritta<br />
<strong>[ERROR] /opt/android/android-sdk-linux_x86/tools/apkbuilder</strong><br />
<a href="http://developer.appcelerator.com/question/81941/error-candroid-sdktoolsapkbuilderbat" target="_blank">non dovrebbe dar problemi o spaventare</a>.</p>
<p>﻿Impressione finale dopo aver visto gli esempio di Kitchen Sync? <strong>FIGATA!!!!!</strong> Qual&#8217;e&#8217; la prossima mossa per codarci un po&#8217; sopra?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rainbowbreeze.it/appcelerator-titanium-su-ubuntu-10-10-64bit/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Forzare l&#8217;uso della connessione mobile (3G o GPRS) con il WiFi in Android</title>
		<link>http://www.rainbowbreeze.it/forzare-luso-della-connessione-mobile-3g-o-gprs-con-il-wifi-in-android/</link>
		<comments>http://www.rainbowbreeze.it/forzare-luso-della-connessione-mobile-3g-o-gprs-con-il-wifi-in-android/#comments</comments>
		<pubDate>Fri, 21 Jan 2011 07:00:53 +0000</pubDate>
		<dc:creator>Alfredo</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[3g]]></category>
		<category><![CDATA[develope]]></category>
		<category><![CDATA[gprs]]></category>
		<category><![CDATA[requestRouteToHost]]></category>
		<category><![CDATA[startUsingNetworkFeature]]></category>
		<category><![CDATA[wifi]]></category>

		<guid isPermaLink="false">http://www.rainbowbreeze.it/?p=1205</guid>
		<description><![CDATA[In Android, l&#8217;attivazione della connessione WiFi porta immediatamente alla disattivazione delle altre connessioni, compresa quella mobile, e tutto il traffico dati viene instradato su di essa. Assieme ad una serie di vantaggi, come l&#8217;indubbio risparmio per connessioni dati a consumo e il guadagno di velocita&#8217;, questo comportampo porta ad alcuni problemi, principalmente: La sospensione senza [...]]]></description>
			<content:encoded><![CDATA[<p>In Android, l&#8217;attivazione della connessione WiFi porta immediatamente alla disattivazione delle altre connessioni, compresa quella mobile, e tutto il traffico dati viene instradato su di essa. Assieme ad una serie di vantaggi, come l&#8217;indubbio risparmio per connessioni dati a consumo e il guadagno di velocita&#8217;, questo comportampo porta ad alcuni problemi, principalmente:</p>
<ul>
<li>La sospensione senza preavviso di connessioni gia&#8217; in piedi sulla rete dati mobile</li>
<li>L&#8217;impossibilita&#8217; di accedere a quei servizi legati alla SIM. Ad esempio, un operatori telefonico potrebbe effettuano un accredito direttamente all&#8217;utente basandosi sulla SIM che genera il traffico. Con il Wifi, non si puo&#8217; ottenere questa informazione.</li>
</ul>
<p>Quindi, per quanto l&#8217;utilita&#8217; di forzare l&#8217;uso della connessione dati mobile per raggiungere un certo indirizzo all&#8217;interno della proprio applicazione possa sembrare scontata, purtroppo Android non mette a disposizione nessuna API documentata e sicura per farlo, ma occorre passare per una serie di workaround che funzionano solo dalla versione 2.2.</p>
<pre class="brush:java">
/**
 * Enable mobile connection for a specific address
 * @param context a Context (application or activity)
 * @param address the address to enable
 * @return true for success, else false
 */
private boolean forceMobileConnectionForAddress(Context context, String address) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (null == connectivityManager) {
        Log.debug(TAG_LOG, "ConnectivityManager is null, cannot try to force a mobile connection");
        return false;
    }

    //check if mobile connection is available and connected
    State state = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE_HIPRI).getState();
    Log.debug(TAG_LOG, "TYPE_MOBILE_HIPRI network state: " + state);
    if (0 == state.compareTo(State.CONNECTED) || 0 == state.compareTo(State.CONNECTING)) {
        return true;
    }

    //activate mobile connection in addition to other connection already activated
    int resultInt = connectivityManager.startUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE, "enableHIPRI");
    Log.debug(TAG_LOG, "startUsingNetworkFeature for enableHIPRI result: " + resultInt);

    //-1 means errors
    // 0 means already enabled
    // 1 means enabled
    // other values can be returned, because this method is vendor specific
    if (-1 == resultInt) {
        Log.error(TAG_LOG, "Wrong result of startUsingNetworkFeature, maybe problems");
        return false;
    }
    if (0 == resultInt) {
        Log.debug(TAG_LOG, "No need to perform additional network settings");
        return true;
    }

    //find the host name to route
    String hostName = StringUtil.extractAddressFromUrl(address);
    Log.debug(TAG_LOG, "Source address: " + address);
    Log.debug(TAG_LOG, "Destination host address to route: " + hostName);
    if (TextUtils.isEmpty(hostName)) hostName = address;

    //create a route for the specified address
    int hostAddress = lookupHost(hostName);
    if (-1 == hostAddress) {
        Log.error(TAG_LOG, "Wrong host address transformation, result was -1");
        return false;
    }
    //wait some time needed to connection manager for waking up
    try {
        for (int counter=0; counter<10; counter++) {
            State checkState = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE_HIPRI).getState();
            if (0 == checkState.compareTo(State.CONNECTED))
                break;
            Thread.sleep(1000);
        }
    } catch (InterruptedException e) {
        //nothing to do
    }
    boolean resultBool = connectivityManager.requestRouteToHost(ConnectivityManager.TYPE_MOBILE_HIPRI, hostAddress);
    Log.debug(TAG_LOG, "requestRouteToHost result: " + resultBool);
    if (!resultBool)
        Log.error(TAG_LOG, "Wrong requestRouteToHost result: expected true, but was false");

    return resultBool;
}
</pre>
<p>In pratica, se non lo e' gia', viene attivata la connessione mobile grazie alla chiamata<br />
<em>startUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE, "enableHIPRI")</em><br />
per poi creare una route all'indirizzo da raggiungere che forza il passaggio sulla connessione mobile<br />
<em>requestRouteToHost(ConnectivityManager.TYPE_MOBILE_HIPRI, hostAddress)</em></p>
<p><span id="more-1205"></span><br />
E qui c'e' la funzione che permette di calcolare l'intero che corrisponde all'indirizzo da contattare </p>
<pre class="brush:java">
/**
 * This method extracts from address the hostname
 * @param url eg. http://some.where.com:8080/sync
 * @return some.where.com
 */
public static String extractAddressFromUrl(String url) {
    String urlToProcess = null;

    //find protocol
    int protocolEndIndex = url.indexOf("://");
    if(protocolEndIndex>0) {
        urlToProcess = url.substring(protocolEndIndex + 3);
    } else {
        urlToProcess = url;
    }

    // If we have port number in the address we strip everything
    // after the port number
    int pos = urlToProcess.indexOf(':');
    if (pos >= 0) {
        urlToProcess = urlToProcess.substring(0, pos);
    }

    // If we have resource location in the address then we strip
    // everything after the '/'
    pos = urlToProcess.indexOf('/');
    if (pos >= 0) {
        urlToProcess = urlToProcess.substring(0, pos);
    }

    // If we have ? in the address then we strip
    // everything after the '?'
    pos = urlToProcess.indexOf('?');
    if (pos >= 0) {
        urlToProcess = urlToProcess.substring(0, pos);
    }
    return urlToProcess;
}

/**
 * Transform host name in int value used by {@link ConnectivityManager.requestRouteToHost}
 * method
 *
 * @param hostname
 * @return -1 if the host doesn't exists, elsewhere its translation
 * to an integer
 */
private static int lookupHost(String hostname) {
    InetAddress inetAddress;
    try {
        inetAddress = InetAddress.getByName(hostname);
    } catch (UnknownHostException e) {
        return -1;
    }
    byte[] addrBytes;
    int addr;
    addrBytes = inetAddress.getAddress();
    addr = ((addrBytes[3] &#038; 0xff) << 24)
            | ((addrBytes[2] &#038; 0xff) << 16)
            | ((addrBytes[1] &#038; 0xff) << 8)
            |  (addrBytes[0] &#038; 0xff);
    return addr;
}
</pre>
<p>In ultimo, occorre aggiungere questi permessi all'AndroidManifest.xml</p>
<pre class="brush:xml">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission>
</pre>
<p>Con questo trucchetto si riesce ad indirizzare tutto il traffico verso uno o piu' indirizzi specifici. Ho notato che dopo 15-20 secondi di inattivita', la connessione mobile viene disattivata di nuovo.</p>
<p>Il codice e' testato su un Nexus One e su un LG Optimus ma, dato che le implementazioni sono specifiche dei vendor, non garantisco che funzioni su tutti gli altri device con Android, dalla 2.2 in su.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rainbowbreeze.it/forzare-luso-della-connessione-mobile-3g-o-gprs-con-il-wifi-in-android/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Pinch zoom in Android</title>
		<link>http://www.rainbowbreeze.it/pinch-zoom-in-android/</link>
		<comments>http://www.rainbowbreeze.it/pinch-zoom-in-android/#comments</comments>
		<pubDate>Mon, 17 Jan 2011 06:30:42 +0000</pubDate>
		<dc:creator>Alfredo</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[pinch-zoom]]></category>
		<category><![CDATA[Rainbowlibs]]></category>

		<guid isPermaLink="false">http://www.rainbowbreeze.it/?p=1200</guid>
		<description><![CDATA[La possibilita&#8217; di zoomare e muovere le immagini usando gesture delle dita, il cosiddetto pinch-zoom, era una particolarita&#8217; introdotta e supportata agli inizi solo dall&#8217;iPhone. Nel tempo, anche Android ha incluso questa feature, purtroppo pero&#8217; senza api semplificate per implementarla nel proprio codice. Per fortuna, Luke Hutchison ha creato android-multitouch-controller, una libreria che permette di [...]]]></description>
			<content:encoded><![CDATA[<p>La possibilita&#8217; di zoomare e muovere le immagini usando gesture delle dita, il cosiddetto pinch-zoom, era una particolarita&#8217; introdotta e supportata agli inizi solo dall&#8217;iPhone. Nel tempo, anche Android ha incluso questa feature, purtroppo pero&#8217; senza api semplificate per implementarla nel proprio codice. Per fortuna, <a href="http://lukehutch.wordpress.com/2010/01/06/my-multi-touch-code-ported-to-eclair" target="_blank">Luke Hutchison</a> ha creato <a href="http://code.google.com/p/android-multitouch-controller/">android-multitouch-controller</a>, una libreria che permette di gestire la cosa abbastanza agevolmente, con supporto sia allo zoom, che al rotate. Licenziata sia sotto i termini dell&#8217;Apache License v2 e della GPL v2, puo&#8217; essere usata in ogni progetto.</p>
<p>Personalmente ho fatto mio questo pezzo di codice, inglobandolo nelle <a href="http://code.google.com/p/rainbowlibs" target="_blank">Rainbowlibs</a> e creando un controllo da usare bello che pronto nelle proprie applicazioni, la <a href="http://code.google.com/p/rainbowlibs/source/browse/android/trunk/rainbowlibs/src/it/rainbowbreeze/libs/ui/RainbowZoomableImageView.java">RainbowZoomableImageView</a>, una specie di <em>ImageView</em> meno potente, che pero&#8217; supporta il pitch-zoom out of the box, senza configurazioni aggiuntive.</p>
<p>Seguendo gli esempi proposti dalla libreria di Luke, ho creato la classe <em>RainbowZoomableImageView.Img</em> e la <em>RainbowZoomableImageView</em> che la utilizza, a cui ho aggiunto alcuni metodi di comodo, tra cui quelli per impostare l&#8217;immagine da visualizzare e per settare lo zoom manualmente, fondamentale per quei rari dispositivi che non hanno uno schermo o una versione di Android con il multitouch. Questi metodi sono <em>assignImage(&#8230;)</em> e <em>incrementScale(&#8230;)</em>.</p>
<p>Come esempio di utilizzo di si puo&#8217; buttare un occhio sull&#8217;activity <a href="http://code.google.com/p/webcamholmes/source/browse/android/trunk/webcamholmes_core/src/it/rainbowbreeze/webcamholmes/ui/ActImageFullscreen.java" target="_blank">ActImageFullScreen,java</a> e sul relativo layout <a href="http://code.google.com/p/webcamholmes/source/browse/android/trunk/webcamholmes_core/res/layout/actimagefullscreen.xml" target="_blank">actimagefullscreen.xml</a> di <a href="http://code.google.com/p/webcamholmes" target="_blank">WebcamHolmes</a>, un&#8217;altro progetto opensource che sto sviluppando.</p>
<p>La dichiarazione del layout e&#8217; molto semplice, ed include solo il controllo personalizzato e quello per fare lo zoom</p>
<pre class="brush:xml">
﻿﻿<RelativeLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="vertical"
>

<it.rainbowbreeze.libs.ui.RainbowZoomableImageView
  android:id="@+id/actimagefullscreen_imgMain"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:layout_gravity="center_horizontal|center_vertical"
>
</it.rainbowbreeze.libs.ui.RainbowZoomableImageView>

<ZoomControls
  android:id="@+id/actimagefullscreen_zoomcontrols"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_alignParentBottom="true"
  android:layout_centerHorizontal="true"
>
</ZoomControls>

</RelativeLayout>
</pre>
<p>﻿﻿Mentre nell&#8217;activity, queste sono le parti salienti per gestire il tutto:</p>
<pre class="brush:java">
public class ActImageFullscreen extends Activity {

  private final static float ZOOM_INCREMENT = 0.1f;
  private static final int DIALOG_PROGRESS = 10;
  private static final int OPTIONMENU_SHOWHIDE_ZOOM = 10;
  private RainbowZoomableImageView mImage;
  private ActivityHelper mActivityHelper;
  private ZoomControls mZoomControls;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //make the view fullscreen
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.actimagefullscreen);

    //load the image
    mImage = (RainbowZoomableImageView) findViewById(R.id.actimagefullscreen_imgMain);
    mImage.setBackgroundColor(Color.BLACK);
    //choose how to obtain the bitmap with the image
    Bitmap bitmap = ... //BitmapFactory.decodeStream(fis);
    mImage.assignImage(getResources(), bitmap);

    //link zoom press with image in/out zoom
    mZoomControls = (ZoomControls) findViewById(R.id.actimagefullscreen_zoomcontrols);
    mZoomControls.setOnZoomInClickListener(mOnZoomInClickListener);
    mZoomControls.setOnZoomOutClickListener(mOnZoomOutClickListener);
  }

  @Override
  protected void onPause() {
    mImage.onPause();
    super.onPause();
  }

  @Override
  protected void onResume() {
    super.onResume();
    mImage.onResume(getResources());
  }

  private OnClickListener mOnZoomInClickListener = new OnClickListener() {
    public void onClick(View v) {
      mImage.incrementScale(ZOOM_INCREMENT);
    }
  };

  private OnClickListener mOnZoomOutClickListener = new OnClickListener() {
    public void onClick(View v) {
      mImage.incrementScale(-ZOOM_INCREMENT);
    }
  };
}
</pre>
<p>Facile, no? ;)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rainbowbreeze.it/pinch-zoom-in-android/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>android.app.Application, static singleton per variabili globali e NullPointerException</title>
		<link>http://www.rainbowbreeze.it/android-app-application-static-singleton-per-variabili-globali-e-nullpointerexception/</link>
		<comments>http://www.rainbowbreeze.it/android-app-application-static-singleton-per-variabili-globali-e-nullpointerexception/#comments</comments>
		<pubDate>Sat, 15 Jan 2011 08:02:10 +0000</pubDate>
		<dc:creator>Alfredo</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[development]]></category>

		<guid isPermaLink="false">http://www.rainbowbreeze.it/?p=1199</guid>
		<description><![CDATA[Leggendo l&#8217;Android reference guide a proposito di android.app.Application, troviamo scritto: Base class for those who need to maintain global application state. You can provide your own implementation by specifying its name in your AndroidManifest.xml&#8217;s &#60;application&#62; tag, which will cause that class to be instantiated for you when the process for your application/package is created. There [...]]]></description>
			<content:encoded><![CDATA[<p>Leggendo l&#8217;Android reference guide a proposito di <a href="http://developer.android.com/reference/android/app/Application.html" target="_blank">android.app.Application</a>, troviamo scritto:</p>
<p><em>Base class for those who need to maintain global application state. You can provide your own implementation by specifying its name in your AndroidManifest.xml&#8217;s &lt;application&gt; tag, which will cause that class to be instantiated for you when the process for your application/package is created.<br />
There is normally no need to subclass Application. In most situation, static singletons can provide the same functionality in a more modular way.</em></p>
<p>Sembra quindi il posto giusto, e piu&#8217; elegante di un singleton, per mettere le nostre variabili globali quando non occorre fare cose troppo complicate e per inizializzarle al primo avvio dell&#8217;applicazione, mediante override del metodo <em>OnCreate()</em> della classe base. Qualcosa del genere:</p>
<p>La classe App.java</p>
<pre class="brush:java">
package it.rainbowbreeze.singleton;

public class App extends Application {
public static int myGlobalStaticValue;
public int myGlobalValue;

  @Override
  public void onCreate() {
    super.onCreate();
    myGlobalStaticValue = 10;
    myGlobalValue = 20;
  }
}
</pre>
<p>La modifica all&#8217;AndroidManifest.xml</p>
<pre class="brush:xml">
<application
  android:icon="@drawable/icon"
  android:label="@string/app_name"
  android:name="it.rainbowbreeze.singleton.App"
  ...
/>
</pre>
<p>E la chiamata da fare in un metodo qualunque di un&#8217;Activity, ad esempio:</p>
<pre class="brush:java">
//access to static field
int value = App.myGlobalStaticValue;
//access to non static fields
int value = ((App)context.getApplication()).myGlobalValue;
</pre>
<p>Da principio tutto funzionava, poi pero&#8217; mi sono accorto di un problema non banale: che di tanto in tanto le variabili persistite in questo modo non mantengono il loro valore, soprattutto dopo che l&#8217;applicazione rimane in background per parecchio tempo o si fanno nel frattempo diverse altre cose col dispositivo.</p>
<p>Basito da questo comportamento, mi sono messo a cercare in giro, ed ecco che <a href="http://stackoverflow.com/questions/708012/android-how-to-declare-global-variables/4642069#4642069" target="_blank">escono</a> <a href="http://groups.google.com/group/android-developers/browse_thread/thread/91c976904c2ee60a" target="_blank">fuori</a> le <a href="http://stackoverflow.com/questions/4208886/using-the-android-application-class-to-persist-data/4209391#4209391" target="_blank">prime</a> <a href="http://stackoverflow.com/questions/1203434/is-the-static-safe-in-android" target="_blank">conferme</a>, di cui riporto un estratto:</p>
<p><em>Consider a case &#8211; your app goes into the background because somebody is calling you (Phone app is in the foreground now). In this case &amp;&amp; under some other conditions (check the above link for what they could be) the OS may kill your application process, including the Application subclass instance. As a result the state is lost. When you later return to the application, then the OS will restore its activity stack and Application subclass instance, however the myState field will be null.</em></p>
<p><em>This was an unplesant surprise for us in production. Believe me Android kills processes, it just depends on RAM state and other factors described in the documentation. It was a nightmare for us so I just share my real experience. Well we did not have this on emulators, but in real world some devices are &#8216;overloaded&#8217; with apps, so killing a background process is a normal situation. Yes, if user then decides to get the app up into foreground &#8211; the OS restores its stack including the Application instance, however there will not be your static data you count on unless you persisted it.</em></p>
<p>In pratica, <strong>anche il contenuto dell&#8217;Application, come quello di ogni altro static singleton, puo&#8217; venire ripulito dal sistema operativo</strong>. Come fare quindi per ovviare a questo problema?</p>
<p><span id="more-1199"></span>Le soluzioni, ovviamente, possono essere le piu&#8217; disparate: se si tratta di dati che non cambiano, occorre controllare ogni volta che non siano nulli e inizializzarli di nuovo all&#8217;occorrenza, mentre se si tratta di dati che possono cambiare nel ciclo di vita dell&#8217;applicazione, ci sono le <a href="http://developer.android.com/guide/topics/data/data-storage.html" target="_blank">SharedPreferences o altri meccanismi</a> utili per persisterli e ricaricarli quando necessario.</p>
<p>Per farlo in maniera elegante e abbastanza generalizzata, mi e&#8217; piaciuto <a href="http://groups.google.com/group/android-developers/browse_thread/thread/fe9d1af322808269/1ead4bc750a41802#msg_1ead4bc750a41802" target="_blank">il consiglio Dianne Hackborn</a> di usare dei <strong>lazy-loading singleton</strong>, buoni per entrambe le situazioni. Ecco un veloce esempio</p>
<pre class="brush:java">
class Singleton {
  static final Object mLock = new Object();
  static final Singleton mInstance;

  private Singleton(Context context) {
    //init or reload your data here
  }

  static getInstance(Context context) {
    synchronized (mLock) {
      if (mInstance == null) {
        mInstance = new Singleton(context);
      }
      return sInstance;
    }
  }

  private int mMyValue;
  public int getMyValue() {
    return mMyValue;
  }
  public void setMyValue(int newValue) {
    mMyValue = newValue;
    //or choose another way to persist the data, via a Shared Preference, for example
  }
}
</pre>
<p>Se non e&#8217; necessaria, si puo&#8217; anche togliere la referenza al Context nel getInstance().</p>
<p>Altri vantaggi dei singleton: la loro modularita&#8217;, l&#8217;inizializzazione che viene fatta solo quando serve, mentre nel caso dell&#8217;Application viene fatta all&#8217;avvio dell&#8217;applicazione, rallentandone i tempi di caricamento. Poi certo, l&#8217;Application.onCreate() rimane un punto di importanza cruciale per tutta una serie di compiti da fare solo e solamente all&#8217;avvio dell&#8217;applicazione, prima di caricare ogni altra cosa. A voi la scelta di come suddividere il codice nel migliore dei modi.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rainbowbreeze.it/android-app-application-static-singleton-per-variabili-globali-e-nullpointerexception/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Augmented reality e dizionari, ecco cos’e’ possibile fare</title>
		<link>http://www.rainbowbreeze.it/augmented-reality-e-dizionari-ecco-cose-possibile-fare/</link>
		<comments>http://www.rainbowbreeze.it/augmented-reality-e-dizionari-ecco-cose-possibile-fare/#comments</comments>
		<pubDate>Sat, 15 Jan 2011 07:00:00 +0000</pubDate>
		<dc:creator>Alfredo</dc:creator>
				<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Quest Visual]]></category>
		<category><![CDATA[Word Lens]]></category>

		<guid isPermaLink="false">http://www.rainbowbreeze.it/?p=1197</guid>
		<description><![CDATA[World Lens e&#8217; un prodotto di Quest Visual che traduce a volo quello che viene inquadrato dalla videocamera dell&#8217;iPhone, dall&#8217;inglese allo spagnolo e viceversa. Un&#8217;ottimo esempio di augmented reality basata sul riconoscimento di oggetti, e non sulla &#8220;semplice&#8221; sovrapposizione di informazione per mezzo della posizione GPS. C&#8217;e&#8217; qualche feedback di chi l&#8217;ha usato? E&#8217; davvero [...]]]></description>
			<content:encoded><![CDATA[<p>World Lens e&#8217; un prodotto di <a href="http://questvisual.com/" target="_blank">Quest Visual</a> che traduce a volo quello che viene inquadrato dalla videocamera dell&#8217;iPhone, dall&#8217;inglese allo spagnolo e viceversa. Un&#8217;ottimo esempio di augmented reality basata sul riconoscimento di oggetti, e non sulla &#8220;semplice&#8221; sovrapposizione di informazione per mezzo della posizione GPS.</p>
<p><object width="640" height="390"><param name="movie" value="http://www.youtube.com/v/h2OfQdYrHRs&#038;hl=en_US&#038;feature=player_embedded&#038;version=3"></param><param name="allowFullScreen" value="true"></param><param name="allowScriptAccess" value="always"></param><embed src="http://www.youtube.com/v/h2OfQdYrHRs&#038;hl=en_US&#038;feature=player_embedded&#038;version=3" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="640" height="390"></embed></object></p>
<p>C&#8217;e&#8217; qualche feedback di chi l&#8217;ha usato? E&#8217; davvero cosi&#8217; efficiente come mostrato nel video?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rainbowbreeze.it/augmented-reality-e-dizionari-ecco-cose-possibile-fare/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>adb devices, ???????? no permissions e come risolverlo</title>
		<link>http://www.rainbowbreeze.it/adb-devices-no-permissions-e-come-risolverlo/</link>
		<comments>http://www.rainbowbreeze.it/adb-devices-no-permissions-e-come-risolverlo/#comments</comments>
		<pubDate>Thu, 13 Jan 2011 01:35:59 +0000</pubDate>
		<dc:creator>Alfredo</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[adb]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.rainbowbreeze.it/?p=1194</guid>
		<description><![CDATA[Come nel caso del Nexus One, puo&#8217; capitare che sotto Linux l&#8217;ADB non riesca a collegarsi correttamente ad un nuovo smartphone Android, mostrando un malinconico messaggio quando viene lanciato il comando adb devices. List of devices attached ????????????     no permissions Esiste un modo per risolvere completamente il problema, che permette di capire qual&#8217;e&#8217; il giusto [...]]]></description>
			<content:encoded><![CDATA[<p>Come nel <a title="Collegare G1 e Nexus One per il debug con Linux" href="http://www.rainbowbreeze.it/collegare-g1-e-nexus-one-per-il-debug-con-linux/">caso del Nexus One</a>, puo&#8217; capitare che sotto Linux l&#8217;ADB non riesca a collegarsi correttamente ad un nuovo smartphone Android, mostrando un malinconico messaggio quando viene lanciato il comando <strong>adb devices</strong>.<br />
<em>List of devices attached<br />
<strong>????????????     no permissions</strong></em></p>
<p>Esiste un modo per risolvere completamente il problema, che permette di capire qual&#8217;e&#8217; il giusto <strong>idVendor</strong> da aggiundere al file .rules di udev, indipendentemente dal device in uso.</p>
<p>per prima cosa, occorre lanciare il comando<br />
<em>lsusb -v | grep idVendor</em></p>
<p>l&#8217;output restituito potrebbe essere il seguente:<br />
<em>idVendor           0x1d6b Linux Foundation<br />
idVendor           0x045e Microsoft Corp.<br />
idVendor           0x1d6b Linux Foundation<br />
idVendor           0x1d6b Linux Foundation<br />
idVendor           0x05c6 Qualcomm, Inc.<br />
idVendor           0&#215;5986 Acer, Inc<br />
</em></p>
<p>Ora, staccando il device e rilanciando il comando, ho visto che la riga che cambia e&#8217; la seguente<br />
<em>idVendor           0x05c6 Qualcomm, Inc.</em><br />
che contiene quindi l&#8217;idVendor che mi serve per configurare udev.</p>
<p><span id="more-1194"></span>Ho quindi aggiunto al file<br />
<em>/etc/udev/rules.d/51-android.rules</em><br />
la seguente riga<em><br />
SUBSYSTEM==&#8221;usb&#8221;, SYSFS{idVendor}==&#8221;05c6&#8243;, MODE=&#8221;0666&#8243;</em><br />
e adb visse felice e contento!</p>
<p>Il procedimento, assieme ad una trattazione molto piu&#8217; ampia sull&#8217;argomento, e&#8217; spiegato in <a href="http://www.google.com/support/forum/p/android/thread?tid=08945730bbd7b22b" target="_blank">questo post</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rainbowbreeze.it/adb-devices-no-permissions-e-come-risolverlo/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WhyMCA HappyHour a Milano, qualche considerazione</title>
		<link>http://www.rainbowbreeze.it/whymca-happyhour-a-milano-qualche-considerazione/</link>
		<comments>http://www.rainbowbreeze.it/whymca-happyhour-a-milano-qualche-considerazione/#comments</comments>
		<pubDate>Mon, 20 Dec 2010 11:50:59 +0000</pubDate>
		<dc:creator>Alfredo</dc:creator>
				<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Internet of Things]]></category>
		<category><![CDATA[IoT]]></category>
		<category><![CDATA[self-tracking]]></category>
		<category><![CDATA[whymca]]></category>

		<guid isPermaLink="false">http://www.rainbowbreeze.it/?p=1182</guid>
		<description><![CDATA[Il 21 Ottobre a Milano, assieme a Ric, Andrea e Paolo, abbiamo tentato un nuovo passo del WhyMCA: la formula HappyHour, un aperitivo informale dove presentare prima qualche intervento legato al mondo dello sviluppo mobile e poi dopo rilassarci con 4 chiacchiere davanti a stuzzicherie varie.  Obiettivo principale di questa iniziativa e&#8217; quello di catalizzare [...]]]></description>
			<content:encoded><![CDATA[<p>Il 21 Ottobre a Milano, assieme a Ric, Andrea e Paolo, abbiamo tentato un nuovo passo del <a href="http://www.whymca.org/" target="_blank">WhyMCA</a>: la formula HappyHour, un aperitivo informale dove presentare prima qualche intervento legato al mondo dello sviluppo mobile e poi dopo rilassarci con 4 chiacchiere davanti a stuzzicherie varie.  Obiettivo principale di questa iniziativa e&#8217; quello di catalizzare la community di sviluppatori mobili e interagire tra di noi con un po&#8217; di sano networking.</p>
<p>Per questa prima edizione milanese (l&#8217;idea e&#8217; di replicare a Roma, poi forse Bologna e Torino) l&#8217;idea che avevo era quella di parlare ai developer un po&#8217; del futuro del mobile, perche&#8217; avere a che fare con una tecnologia no sempre significa avere anche una visione su di essa. Tra i relatori ho quindi chiamato <a href="http://www.leeander.com/" target="_blank">Leandro Agro&#8217;</a> e <a href="http://www.lucamascaro.info/blog/business-strategy/less-is-more.html" target="_blank">Luca Mascaro</a>: il primo ci ha fornito prospettive su qualche caldo tema emergente: self-traking, Internet of Things, spime e massive data collection. Il secondo ha mostrato esempi di applicazione del paradigma &#8220;less is more&#8221; e del leonardiano &#8220;La semplicita&#8217; e&#8217; l&#8217;estrema perfezione&#8221; nel mondo del mobile.</p>
<p>Abbiamo chiuso io e <a href="http://qmatteoq.tostring.it/blog/post/whymca-spring-2010-the-day-after" target="_blank">Matteo</a>, con un intervento sulle principali caratteristiche delle piattaforme di sviluppo per mobile, giusto per capire in quali campi le une sono meglio delle altre e un accenno a quali tool permettono di realizzare applicazioni cross-platform e in che dominio.</p>
<p>Che dire, sono stato molto soddisfatto dell&#8217;evento, se non altro  perche&#8217;  ho ricevuto feedback positivi sul format. Sicuramente ci siamo  dovuti  tarare &#8220;in corsa&#8221; con i tempi dettati dagli orari milanesi (e  dalla  difficolta&#8217; di spostamento, pur avendo scelto un posto vicino  alla  fermata della metro)</p>
<p>Prossima tappa, <strong>27 Gennaio a Roma, OppioCaffe&#8217;</strong>. Non mancate se siete in zona!</p>
<p><span id="more-1182"></span>Qui potete trovare la <a href="http://www.ustream.tv/recorded/10333535" target="_blank">registrazione dell&#8217;evento</a>.</p>
<p>Questa e&#8217; una presentazione fatta da Leandro che riassume abbastanza bene gli argomenti trattati durante il workshop:</p>
<div style="width:425px" id="__ss_3765634"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/leeander/surfing-the-thirdwave" title="Surfing the third_wave">Surfing the third_wave</a></strong><object id="__sse3765634" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=surfingthethirdwave-100418082834-phpapp01&#038;stripped_title=surfing-the-thirdwave&#038;userName=leeander" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse3765634" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=surfingthethirdwave-100418082834-phpapp01&#038;stripped_title=surfing-the-thirdwave&#038;userName=leeander" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="padding:5px 0 12px">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/leeander">LEANDRO AGRO&rsquo;</a>.</div>
</div>
<p>Quella di Luca:</p>
<div style="width:425px" id="__ss_5524931"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/lucamascaro/less-is-more-5524931" title="Less is more  ">Less is more  </a></strong><object id="__sse5524931" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=lessismore-whymca2010-101022034010-phpapp01&#038;stripped_title=less-is-more-5524931&#038;userName=lucamascaro" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse5524931" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=lessismore-whymca2010-101022034010-phpapp01&#038;stripped_title=less-is-more-5524931&#038;userName=lucamascaro" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="padding:5px 0 12px">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/lucamascaro">Luca Mascaro</a>.</div>
</div>
<p>E quella di Matteo e mia:</p>
<div style="width:425px" id="__ss_6256756"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/rainbowbreeze/whymca-mobile-platforms-overview" title="WhyMCA - Mobile platforms overview">WhyMCA &#8211; Mobile platforms overview</a></strong><object id="__sse6256756" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=whymca-mobileplatformsoverview-101220054740-phpapp02&#038;stripped_title=whymca-mobile-platforms-overview&#038;userName=rainbowbreeze" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse6256756" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=whymca-mobileplatformsoverview-101220054740-phpapp02&#038;stripped_title=whymca-mobile-platforms-overview&#038;userName=rainbowbreeze" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="padding:5px 0 12px">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/rainbowbreeze">Alfredo Morresi</a>.</div>
</div>
<p>Infine, da parte di Leandro, qualche link per approfondire gli argomenti da lui trattati:<br />
-<a href="http://www.slideshare.net/leeander/surfing-the-thirdwave" target="_blank">http://www.slideshare.net/leeander/surfing-the-thirdwave</a><br />
-<a href="http://www.slideshare.net/leeander/massive-data-collection-1238180" target="_blank">http://www.slideshare.net/leeander/massive-data-collection-1238180</a><br />
-<a href="http://www.slideshare.net/folletto/the-widenoise-project" target="_blank">http://www.slideshare.net/folletto/the-widenoise-project</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rainbowbreeze.it/whymca-happyhour-a-milano-qualche-considerazione/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Statistiche sulla diffusione di Android e sulla risoluzione dei display</title>
		<link>http://www.rainbowbreeze.it/statistiche-sulla-diffusione-di-android-e-sulla-risoluzione-dei-display/</link>
		<comments>http://www.rainbowbreeze.it/statistiche-sulla-diffusione-di-android-e-sulla-risoluzione-dei-display/#comments</comments>
		<pubDate>Fri, 15 Oct 2010 11:26:36 +0000</pubDate>
		<dc:creator>Alfredo</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[fragmentation]]></category>
		<category><![CDATA[statistiche]]></category>

		<guid isPermaLink="false">http://www.rainbowbreeze.it/?p=1176</guid>
		<description><![CDATA[Uno dei principali problemi della piattaforma Android e&#8217; la sua frammentarieta&#8217;: ci sono diverse versioni di sistema operativo in circolazione, ognuna con feature specifiche e anche la risoluzione del display tende a cambiare da una classe di dispositivi all&#8217;altra. Di seguito riporto alcune statistiche dei programmi che ho sviluppato, ora che hanno superato le 10mila [...]]]></description>
			<content:encoded><![CDATA[<p>Uno dei principali problemi della piattaforma Android e&#8217; la sua frammentarieta&#8217;: ci sono diverse versioni di sistema operativo in circolazione, ognuna con feature specifiche e anche la risoluzione del display tende a cambiare da una classe di dispositivi all&#8217;altra. Di seguito riporto alcune statistiche dei programmi che ho sviluppato, ora che hanno superato le 10mila installazioni e quindi iniziano a diventare un campione significativo.</p>
<p>Una precisazione. <strong>Non vengono consiredate tutte le versioni di Android inferiori alla 1.6</strong> (quindi dalla 1.5 in giu&#8217;), dato che i miei programmi non la supportano e quindi non ho statistiche di questo tipo.</p>
<p>Innanzitutto iniziamo con la <strong>diffusione del sistema operativo</strong>:</p>
<p><img class="aligncenter size-full wp-image-1177" title="chart_android_api" src="http://www.rainbowbreeze.it/wordpress/wp-content/uploads/2010/10/chart_android_api.png" alt="" width="604" height="280" />Come si puo&#8217; vedere, <strong>la versione attualmente piu&#8217; diffusa e&#8217; la 2.1</strong>, ma anche la 1.6 si difende bene, con conseguente disperazione di noi programmatori. Questo principalmente a causa dei produttori di device che non rilasciano aggiornamenti alla piattaforma, ma piuttosto forzano all&#8217;acquisto di un nuovo dispositivo dopo neanche un paio d&#8217;anni di utilizzo del vecchio, se si vuole restare al passo con i tempi.</p>
<p>Passiamo poi alla <strong>risoluzione dello schermo</strong>:</p>
<p><span id="more-1176"></span><img class="aligncenter size-full wp-image-1178" title="chart_android_resolution" src="http://www.rainbowbreeze.it/wordpress/wp-content/uploads/2010/10/chart_android_resolution.png" alt="" width="559" height="299" />Tranne una lieve predominanza della risoluzione 480&#215;800 (quella del Nexus One e dall&#8217;HTC Desire, ad esempio), il resto del panorama si fa molto variegato, con le prime, timide apparizioni anche di risolulzioni piu&#8217; adatte ad un display di un tablet che di uno smartphone (1024&#215;600 e 640&#215;480).</p>
<p>Insomma, dati alla mano, e&#8217; proprio vero che programmare per Android deve tenere conto di <a href="http://android-developers.blogspot.com/2009/10/support-for-additional-screen.html" target="_blank">tante</a> <a href="http://android-developers.blogspot.com/2010/10/five-steps-to-future-hardware-happiness.html" target="_blank">variabili</a>, troppe a volte!</p>
<p><strong>Update</strong>: Come <a href="http://twitter.com/genio_del_male/status/27442341332" target="_blank">segnalato</a> da Lorenzo, anche <a href="http://blog.tweetdeck.com/android-ecosystem" target="_blank">Tweetdeck ha fatto un&#8217;analisi</a> simile alla mia&#8230; Con risultati altrettanto incasinati :(</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rainbowbreeze.it/statistiche-sulla-diffusione-di-android-e-sulla-risoluzione-dei-display/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TextView con link ad URL</title>
		<link>http://www.rainbowbreeze.it/textview-con-link-ad-url/</link>
		<comments>http://www.rainbowbreeze.it/textview-con-link-ad-url/#comments</comments>
		<pubDate>Thu, 14 Oct 2010 07:00:52 +0000</pubDate>
		<dc:creator>Alfredo</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[TextView]]></category>

		<guid isPermaLink="false">http://www.rainbowbreeze.it/?p=1174</guid>
		<description><![CDATA[Ci sono diversi modi per creare una TextView contente una URL cliccabile in Android. Vediamone alcuni. Aggiungere alla TextView l&#8217;attributo android:autoLink=&#8221;web&#8221;. Se il testo contenuto al suo interno e&#8217; riconducibile ad un indirizzo web, questo verra&#8217; automaticamente mostrato in blu con la sottolineatura tipica di un hyperlink e se ci si clicca sopra verr&#8217;a aperta [...]]]></description>
			<content:encoded><![CDATA[<p>Ci sono diversi modi per creare una TextView contente una URL cliccabile in Android. Vediamone alcuni.</p>
<p>Aggiungere alla TextView l&#8217;attributo <strong>android:autoLink=&#8221;web&#8221;</strong>. Se il testo contenuto al suo interno e&#8217; riconducibile ad un indirizzo web, questo verra&#8217; automaticamente mostrato in blu con la sottolineatura tipica di un hyperlink e se ci si clicca sopra verr&#8217;a aperta la URL corrispondende nel browser. Seguono alcuni esempi.</p>
<pre class="brush:xml">
&lt;TextView
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="www.rainbowbreeze.it"
  android:autoLink="web"
/&gt;
&lt;TextView
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="http://www.rainbowbreeze.it"
  android:autoLink="web"
/&gt;
</pre>
<p>Se invece si vuole ottenere un effetto piu&#8217; complesso, tipo una parola all&#8217;intero di una frase che, se cliccata, conduce ad un sito web, allora occorre inserire un po&#8217; di codice, oltre all&#8217;xml. Partiamo definendo la TextView</p>
<p><span id="more-1174"></span></p>
<pre class="brush:xml">
&lt;TextView
  android:id="@+id/lblClickable"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
/&gt;
</pre>
<p>E poi all&#8217;interno del codice</p>
<pre class="brush:java">
TextView lblClickable = (TextView) findViewById(R.id.lblClickable);
String htmlText = "Link to my &lt;A HREF='http://www.rainbowbreeze.it'&gt;site&lt;/A&gt;";
lblClickable.setText(Html.fromHtml(htmlText));
//needed to enable click on the link
lblClickable.setMovementMethod(LinkMovementMethod.getInstance());
</pre>
<p>L&#8217;effetto che si ottiene e&#8217; il seguente.</p>
<p><img class="size-medium wp-image-1175 alignnone" title="LinkedTextView" src="http://www.rainbowbreeze.it/wordpress/wp-content/uploads/2010/10/LinkedTextView-200x300.png" alt=""/></p>
<p>Fonte : <a href="http://stackoverflow.com/questions/2734270/how-do-i-make-links-in-a-textview-clickable" target="_blank">StackOverflow</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rainbowbreeze.it/textview-con-link-ad-url/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Street Fighter IV e il mobile gaming</title>
		<link>http://www.rainbowbreeze.it/street-fighter-iv-e-il-mobile-gaming/</link>
		<comments>http://www.rainbowbreeze.it/street-fighter-iv-e-il-mobile-gaming/#comments</comments>
		<pubDate>Sun, 03 Oct 2010 07:00:17 +0000</pubDate>
		<dc:creator>Alfredo</dc:creator>
				<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Mobile gaming]]></category>
		<category><![CDATA[Nintendo 3DS]]></category>

		<guid isPermaLink="false">http://www.rainbowbreeze.it/?p=1171</guid>
		<description><![CDATA[Se le console portatili (Nintendo DS, PSP e molte altre) erano nate per giocare in mobilita&#8217; ma in solitaria, ad eccezione delle partire wireless, ora l&#8217;orientamento si sta evolvendo verso il gioco in socialita&#8217;. Lo dimostra un&#8217;anteprima del nuovo Street Fighter IV per Nintendo 3Ds http://www.youtube.com/watch?v=l_l1q37VLWo Modalita&#8217; discovery automatica di altri giocatori presenti, collezionare trofei [...]]]></description>
			<content:encoded><![CDATA[<p>Se le console portatili (Nintendo DS, PSP e molte altre) erano nate per <strong>giocare in mobilita&#8217;</strong> ma in solitaria, ad eccezione delle partire wireless, ora l&#8217;orientamento si sta evolvendo verso il <strong>gioco in socialita&#8217;</strong>. Lo dimostra un&#8217;anteprima del nuovo Street Fighter IV per Nintendo 3Ds</p>
<p><a href="http://www.youtube.com/watch?v=l_l1q37VLWo">http://www.youtube.com/watch?v=l_l1q37VLWo</a></p>
<p>Modalita&#8217; <strong>discovery automatica</strong> di altri giocatori presenti, <strong>collezionare trofei che fanno aumentare la propria reputazione</strong> da mostrare e da giocarsi contro gli avversari&#8230; Fantastico, se prima la scusa di un ritardo ingiustificato poteva essere: &#8220;<em>Scusa, sono venuto a piedi e per strada ho incontrato un amico che non vedevo da tanto tempo e siamo rimasti a parlare un po&#8217;</em>&#8220;, domani potrebbe diventare qualcosa tipo &#8220;<em>Scusa, mentre venivo qui ho dovuto difendere la cintura del campione del quartiere da un tipo che mi ha sfidato, non potevo non suonargliele quattro!</em>&#8220;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rainbowbreeze.it/street-fighter-iv-e-il-mobile-gaming/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Collegare G1 e Nexus One per il debug con Linux</title>
		<link>http://www.rainbowbreeze.it/collegare-g1-e-nexus-one-per-il-debug-con-linux/</link>
		<comments>http://www.rainbowbreeze.it/collegare-g1-e-nexus-one-per-il-debug-con-linux/#comments</comments>
		<pubDate>Sat, 02 Oct 2010 07:00:47 +0000</pubDate>
		<dc:creator>Alfredo</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[G1]]></category>
		<category><![CDATA[Nexus One]]></category>

		<guid isPermaLink="false">http://www.rainbowbreeze.it/?p=1170</guid>
		<description><![CDATA[Il test delle proprie applicazioni Android su un device reale e&#8217; sempre un passo importante per lo sviluppo. Fortunatamente si puo&#8217; affrontare abbastanza semplicemente questa situazione grazie al supporto dell&#8217;SDK e del sistema operativo del telefono. Nel sito di Google questa operazione e&#8217; descritta molto bene, ma manca di alcuni particolari. Ad esempio, l&#8217;USB VendorID [...]]]></description>
			<content:encoded><![CDATA[<p>Il test delle proprie applicazioni Android su un device reale e&#8217; sempre un passo importante per lo sviluppo. Fortunatamente si puo&#8217; affrontare abbastanza semplicemente questa situazione grazie al supporto dell&#8217;SDK e del sistema operativo del telefono. Nel sito di Google questa operazione <a href="http://developer.android.com/guide/developing/device.html" target="_blank">e&#8217; descritta molto bene</a>, ma manca di alcuni particolari.</p>
<p>Ad esempio, l&#8217;<strong>USB VendorID</strong> da usare con un <strong>Nexus One</strong>, dato che non e&#8217; quello HTC di default, ma bensi&#8217; 18d1. Occorrera&#8217; quindi aggiungere, nel file <em>/etc/udev/rules.d/51-android.rules</em> questa riga</p>
<pre class="brush:bash">
SUBSYSTEM=="usb", SYSFS{idVendor}=="18d1", MODE="0666"
</pre>
<p>Aggiungendo i vari device supportati otteniamo:</p>
<pre class="brush:bash">
#Acer
SUBSYSTEM=="usb", SYSFS{idVendor}=="0502", MODE="0666"
#Dell
SUBSYSTEM=="usb", SYSFS{idVendor}=="413c", MODE="0666"
#Foxconn
SUBSYSTEM=="usb", SYSFS{idVendor}=="0489", MODE="0666"
#Garmin-Asus
SUBSYSTEM=="usb", SYSFS{idVendor}=="091E", MODE="0666"
#HTC G1 and others
SUBSYSTEM=="usb", SYSFS{idVendor}=="0bb4", MODE="0666"
#HTC Nexus One
SUBSYSTEM=="usb", SYSFS{idVendor}=="18d1", MODE="0666"
#Huawei
SUBSYSTEM=="usb", SYSFS{idVendor}=="12d1", MODE="0666"
#Kyocera
SUBSYSTEM=="usb", SYSFS{idVendor}=="0482", MODE="0666"
#LG
SUBSYSTEM=="usb", SYSFS{idVendor}=="1004", MODE="0666"
#Motorola
SUBSYSTEM=="usb", SYSFS{idVendor}=="22b8", MODE="0666"
#Nvidia
SUBSYSTEM=="usb", SYSFS{idVendor}=="0955", MODE="0666"
#Pantech
SUBSYSTEM=="usb", SYSFS{idVendor}=="10A9", MODE="0666"
#Samsung
SUBSYSTEM=="usb", SYSFS{idVendor}=="04e8", MODE="0666"
#Sharp
SUBSYSTEM=="usb", SYSFS{idVendor}=="04dd", MODE="0666"
#Sony Ericsson
SUBSYSTEM=="usb", SYSFS{idVendor}=="0fce", MODE="0666"
#Sony Ericsson
SUBSYSTEM=="ZTE", SYSFS{idVendor}=="19D2", MODE="0666"
</pre>
<p>Un po&#8217; accortezze varie che potrebbero far comodo in caso di problemi:</p>
<ul>
<li>Ricordardi di abilitare il debug mode sul dispositivo come descritto nella guida</li>
<li>Rilanciare UDEV per rendere attive le modifiche: <em>sudo restart udev</em></li>
<li>Rilanciare l&#8217;adb per prendere il carico il nuovo device: <em>adb kill-server</em> seguito da <em>adb start-server</em></li>
</ul>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;"><code>/etc/udev/rules.d/51-android.rules</code>.</div>
]]></content:encoded>
			<wfw:commentRss>http://www.rainbowbreeze.it/collegare-g1-e-nexus-one-per-il-debug-con-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

