<?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>BrainSpace.it</title>
	<atom:link href="http://www.brainspace.it/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.brainspace.it</link>
	<description>Solo un altro weblog targato WordPress</description>
	<lastBuildDate>Tue, 30 Mar 2010 14:18:23 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Java ed il protocollo HTTP (Terza Parte)</title>
		<link>http://www.brainspace.it/?p=28</link>
		<comments>http://www.brainspace.it/?p=28#comments</comments>
		<pubDate>Tue, 30 Mar 2010 14:16:46 +0000</pubDate>
		<dc:creator>invernomuto</dc:creator>
				<category><![CDATA[Articoli, HowTo, Guide]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[protocollo]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.brainspace.it/?p=28</guid>
		<description><![CDATA[&#160;
Nella&#160;seconda parte della serie &#8220;Java ed il protocollo HTTP&#8221;&#160;abbiamo imparato come scaricare un file da un server HTTP remoto leggendo un flusso sequenziale di dati; in questa terza parte sfrutteremo il capo &#8220;Range&#8221; dell&#8217;header HTTP per scaricare il file remoto dividendolo in pi&#249; segmenti che saranno scaricati in modo parallelo. La figura seguente pu&#242; aiutare [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify; ">&nbsp;</p>
<p style="text-align: justify; "><span class="Apple-style-span" style=" font-family: 'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif; ">Nella&nbsp;<a href="http://www.brainspace.it/?p=23" style="text-decoration: none; font-weight: bold; " target="_blank" title="Leggi la seconda parte della serie di tutorials">seconda parte della serie &ldquo;Java ed il protocollo HTTP&rdquo;</a>&nbsp;abbiamo imparato come scaricare un file da un server HTTP remoto leggendo un flusso sequenziale di dati; in questa terza parte sfrutteremo il capo &ldquo;Range&rdquo; dell&rsquo;header HTTP per scaricare il file remoto dividendolo in pi&ugrave; segmenti che saranno scaricati in modo parallelo. La figura seguente pu&ograve; aiutare a capire il procedimento che, normalmente, &egrave; definito multi-threading download:</span></p>
<p style="text-align: center; "><span class="Apple-style-span" style=" font-family: 'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif; "><img alt="schema_mutlithread_dl.png" src="http://www.brainspace.it/wp-content/gallery/java_http/schema_mutlithread_dl.png" title="schema_mutlithread_dl.png" /></span></p>
<p style="text-align: justify; ">&nbsp;</p>
<p style="text-align: justify; ">E questo &egrave; il risultato finale che otterremo:</p>
<p style="text-align: center; "><a class="thickbox" href="http://www.brainspace.it/wp-content/gallery/java_http/screenshot_1.png" style="text-decoration: none; font-weight: bold; " title="screenshot_1.png"><img alt="L'applicazione in esecuzione - Fare click per vederla a dimensioni reali" border="0" src="http://www.brainspace.it/wp-content/gallery/java_http/thumbs/thumbs_screenshot_1.png" /></a></p>
<p style="text-align: center; ">SimpleMultithreadDownloader in esecuzione (Fai click per vedere l&rsquo;immagine a dimensione reale)</p>
<p style="text-align: justify; ">Ok, ora che abbiamo un idea di massima di cosa vogliamo ottenere cerchiamo di dare un occhiata a come &egrave; organizzato il progetto; i sorgenti ed i file di progetto per l&rsquo;IDE&nbsp;<a href="http://www.netbeans.org/" style="text-decoration: none; font-weight: bold; " target="_blank" title="Sito ufficiale dell'IDE NetBeans ">NetBeans</a>&nbsp;sono disponibili sotto licenza GPL sezione &ldquo;Riferimenti&rdquo;.</p>
<p style="text-align: justify; "><span id="more-28"></span></p>
<h3 style="font-weight: normal; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 24px; text-align: justify; ">Struttura</h3>
<p style="text-align: justify; ">Il progetto chiamato (con scarsissima fantasia)&nbsp;<strong>SimpleMultithreadDownloader&nbsp;</strong>&egrave; costituito da 7 classi:</p>
<ul style="line-height: 2em; list-style-image: url('20il%20protocollo%20HTTP%20(Terza%20Parte)_files/images/bullet.gif'); ">
<li style="text-align: justify; ">Main: crea semplicemente una nuova istanza della finestra principale dell&rsquo;applicazione dopo aver impostato il Look&amp;Feel dell&rsquo;applicazione in base a quello predefinito dell&rsquo;ambiente di esecuzione.</li>
<li style="text-align: justify; ">MainFrame: estende la classe JFrame per implementare la finestra principale dell&rsquo;applicazione.</li>
<li style="text-align: justify; ">TranferProgressPanel: estende la classe JPanel per implementare un pannello informativo sullo stato del trasferimento. E&rsquo; impiegato per monitorare lo stato sia lo stato globale del download e sia per quello di ciascun segmento.</li>
<li style="text-align: justify; ">AddDownloadDialog: estende la classe JDialog ed implementa una semplice finestra per l&rsquo;inserimento e la validazione del URL del file remoto e del percorso del file di destinazione.</li>
<li style="text-align: justify; ">Utils: Definisce alcuni indici e rende disponibili alcune funzioni utili alle altre classi.</li>
<li style="text-align: justify; ">MainTranferThread: Implementa il thread principale che si occupa di inizializzare i segmenti, avviare e monitorare il download riassemblare i segmenti scaricati in un unico file sul percorso di destinazione al termine del trasferimento.</li>
<li style="text-align: justify; ">SegmentTranferThread: singolo thread che si occupa del download di un segmento.</li>
</ul>
<p style="text-align: justify; ">Le classi sono in relazione fra loro secondo lo schema UML seguente (solo Class Diagram):</p>
<p style="text-align: center; "><a class="thickbox" href="http://www.brainspace.it/wp-content/gallery/java_http/uml_class_diag.jpg" style="text-decoration: none; font-weight: bold; " title="uml_class_diag.jpg"><img alt="Fai cliick sulla miniatura per vedere l'immagine a dimensione reale" border="0" height="300" src="http://www.brainspace.it/wp-content/gallery/java_http/thumbs/thumbs_uml_class_diag.jpg" width="400" /></a><br />
	Fai click sulla miniatura per vedere l&rsquo;immagine a dimensione reale</p>
<h3 style="font-weight: normal; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 24px; text-align: justify; ">Funzionamento</h3>
<p style="text-align: justify; ">Come visto dalla struttura il progetto &egrave; composto essenzialmente di alcune classi che costituiscono la GUI dell&rsquo;applicazione, mentre le classi che materialmente eseguono il trasferimento sono MainTranferThread e SegmentTranferThread. Volutamente tralascer&ograve; di illustrare le operazioni compiute dalle classi che costituiscono l&rsquo;interfaccia, piuttosto comprensibili a chi abbia un minimo di esperienza con Swing (grazie anche al codice dettagliatamente commentato ed alla documentazione dell&rsquo;API generata con Javadoc) per concentrarmi sulle classi che eseguono il download multi-thread.</p>
<p style="text-align: justify; ">Una volta che l&rsquo;utente ha inserito l&rsquo;indirizzo URL del file da scaricare ed il percorso di destinazione (notare che se gli appunti contengono un indirizzo URL valido il percorso sorgente e destinazione saranno generati automaticamente a partire da tale indirizzo) la finestra principale si occupa di creare una nuova istanza della classe MainTranferThread e la inizializza con i gli indirizzi di sorgente e destinazione inseriti. Il metodo init(String sourceURL, String destinationPath), fornito dalla classe MainTranferThread, si occupa di leggere le informazioni relative al file roto ed a calcolare il numero e la dimensione di segmenti da utilizzare per il download. La dimensione minima di un segmento &egrave; fissata a 100KB ed il numero massimo di segmenti utilizzabili &egrave; 10:</p>
<pre class="java" name="code" style="overflow-x: auto; overflow-y: auto; padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); text-align: justify; ">// Tenta di stabilire una connessione con l&#39;URL sorgente per leggere
// le informazioni relative al file da scaricare.
URLConnection connection = new URL(sourceURL).openConnection();

// Legge e morizza la dimensione totale del file da scaricare...
this.downloadSize = connection.getContentLength();
// ..ed il suo MIME-Type
this.contentType = connection.getContentType();

// Inizia il ciclo per il calcolo del numero di segmenti e la loro dimensione. Il ciclo
// parte da un numero di segmenti pari ad uno solamente ed aggiunge un segmento ogni
// 100 KB di dati da trasferire fino ad arrivare ad un massimo di 10 segmenti.
for (segmentsCount = 1; segmentsCount &lt; = 10; segmentsCount++) {
// Calcola la dimensione media di un segmento
segmentsAvgSize = downloadSize / segmentsCount;

// Se la dimensione media degli &quot;segmentsCount&quot; segmenti &egrave; inferirore o uguale
// a 100 KB...
if (segmentsAvgSize &lt;= 102400) {
// ... il numero di segmenti calcolati &egrave; sufficiente per eseguire il download ed
// il ciclo pu&ograve; terminare
break;
}
// ..altrimenti aggiunge un ulteriore segmento (se il numero di segmenti &egrave; ancora inferirore a 10)
}</pre>
<p style="text-align: justify; ">Dato che il calcolo della dimensione media di un segmento restituisce un numero intero &egrave; possibile che la dimensione dell&rsquo;ultimo segmento non corrisponda a quella media e quindi deve essere ricalcolata:</p>
<pre class="java" name="code" style="overflow-x: auto; overflow-y: auto; padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); text-align: justify; ">// Ricalcola la dimensione dell&#39;ultimo segmento in quanto la dimensione media non
// considera i numeri decimali, quindi fermo restando la dimensione media del segmento
// e&#39; necessario ricalcolare la dimensione dell&#39;ultimo in modo che sia:
//
// dimensione ultimo segmento = dimensione totale - somma della dimensione di tutti i segmenti tranne l&#39;ultimo
int lastSegmentSize = downloadSize - (segmentsAvgSize * (segmentsCount - 1));</pre>
<p style="text-align: justify; ">Infine vengono create tante istanze della classe SegmentTranferThread quanti sono i segmenti da utilizzare e ciascuna istanza &egrave; inizializzata, oltre che con i percorsi di sorgente e destinazione, anche con l&rsquo;offset del primo byte del segmento all&rsquo;interno del file originale e con la dimensione del segmento stesso:</p>
<pre class="java" name="code" style="overflow-x: auto; overflow-y: auto; padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); text-align: justify; ">// Offset iniziale del primo segmento
int segmentOffset = 0;

// Inizializza l&#39;array dei segmenti di trasferinto al numero di segmenti calcolato.
segmentsThreads = new SegmentTranferThread[segmentsCount];

// Inizia il ciclo di inizializzazione dei singoli segmenti.
for (int segmentIndex = 0; segmentIndex &lt; segmentsCount; segmentIndex++) {
// Crea il nuovo segmento
segmentsThreads[segmentIndex] = new SegmentTranferThread();

boolean result;

// Inizializza il segmento con l&#39;RUL sorgente, il path di destinazione l&#39;offset del primo byte da leggere
// . Controlla se il segmento &egrave; l&#39;ultimo, in questo caso passa
// al metodo init la lunghezza dell&#39;ultimo segmento anzich&egrave; quella media.
if (segmentIndex == (segmentsCount - 1)) {
result = segmentsThreads[segmentIndex].init(sourceURL, destinationPath, segmentOffset, lastSegmentSize);
} else {
result = segmentsThreads[segmentIndex].init(sourceURL, destinationPath, segmentOffset, segmentsAvgSize);
}

// Controlla se il segmento &egrave; stato inizializzato correttamente...
if (result == false) {
// se si &egrave; verificato un errore imposta lo stato del trasferimento ad &quot;Errore&quot; e termina
// l&#39;inizializzazione restituendo false.
tranferStatus = Utils.STATUS_ERROR;
return false;
}

// Sposta l&#39;offset del segmento successivo dolo l&#39;ultimo byte
// che deve essere letto dal segmento attuale.
segmentOffset += segmentsAvgSize;
}</pre>
<p style="text-align: justify; ">Quando un segmento viene inizializzato tramite l&rsquo;invocazione del metodo init(String sourceURL, String destinationPath, int segmentOffset, int segmentsSize) della classe SegmentTranferThread, viene creato un nuovo file tporaneo per la morizzazione dei dati scaricati dal segmento e tale file &egrave; marchiato per essere rimosso automaticamente al termine dell&rsquo;esecuzione dell&rsquo;applicazione:</p>
<pre class="java" name="code" style="overflow-x: auto; overflow-y: auto; padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); text-align: justify; ">// Crea un file tporaneo con il nome basato sul nome del file da prelevare ed estensione .part
// Il file sar&agrave; creato nella cartella tporanea di sista (in linux: /tmp)
File tpFile = File.createTpFile(new File(destinationPath).getName(), &quot;.part&quot;);

// Imposta il file tporaneo perch&egrave; sia cancellato automaticamente alla chiusura dell&#39;applicazione
tpFile.deleteOnExit();</pre>
<p style="text-align: justify; ">Tutti i files tporanei generati dai segmenti saranno utilizzati al termine del trasferimento per generare il fie di destinazione.<br />
	Se l&rsquo;inizializzazione va a buon fine l&rsquo;utente pu&ograve; iniziare il trasferimento. Alla pressione del bottone di avvio del trasferimento sulla toolbar viene eseguito il thread principale che regola il download. L&rsquo;esecuzione del thread implica l&rsquo;invocazione del metodo run() della classe MainTranferThread il quale per prima cosa avvia a sua volta l&rsquo;esecuzione dei threads precedentente inizializzati per il download dei segmenti:</p>
<pre class="java" name="code" style="overflow-x: auto; overflow-y: auto; padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); text-align: justify; ">// Avvia tutti i threads dei segmenti di trasferimento.
for (int segmentIndex = 0; segmentIndex &lt; segmentsCount; segmentIndex++) {
segmentsThreads[segmentIndex].start();
}</pre>
<p style="text-align: justify; ">&nbsp;</p>
<p style="text-align: justify; ">Fatto ci&ograve;, dopo aver inizializzato alcuni contatori utili, inizia il ciclo di monitoraggio del trasferimento; durante tale ciclo il thread principale controlla lo stato di tutti i trasferimenti dei segmenti per rilevare eventuali errori, inoltre calcola il totale dei dati trasferiti. Se viene rilevato un errore in anche solo uno dei segmenti il trasferimento si interrompe. Il ciclo di controllo termina correttamente solamente quando tutti i segmenti sono stati scaricati senza errori:</p>
<pre class="java" name="code" style="overflow-x: auto; overflow-y: auto; padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); text-align: justify; ">// Azera il contatore del totale dei bytes scaricati per poi poterlo ricalcolare in base ai
// bytes trasferiti dai segmenti.
bytesDownloaded = 0;

// Imposta il flag di controllo dello stato dei segmenti.
// la variabile allSegmentFinished assumer&agrave; il valore &quot;true&quot; sono quando il trasferimento
// di tutti i segmenti sar&agrave; completo
boolean allSegmentFinished = false;

// Impsta lo stato del download come &quot;Traferimento&quot;
tranferStatus = Utils.STATUS_RUNNING;

// Controlla ciclicamente lo stato del trasferimento di tutti i segmenti
// fino a quando non sono stati completati tutti o fino al verificarsi
// di un errore.
while (allSegmentFinished == false) {
// Imposta il flag di completamento a &quot;true&quot; per consentire il termine del ciclo
// in caso il trasferimento di tutti i segmenti sia terminato.
allSegmentFinished = true;

// Variabile ausiliaria utilizzata per il calcolo della dimensione totale dei dati
// scaricati.
int segmentsBytesDownloaded = 0;

// Inizia il controllo di ciascun segmento
for (int segmentIndex = 0; segmentIndex &lt; segmentsCount; segmentIndex++) {
// Se si &egrave; verificato un errore durante il download del segmento...
if (segmentsThreads[segmentIndex].getTranferStatus() == Utils.STATUS_ERROR) {
// ...imposta lo stato generale ad &quot;Errore&quot; e termina il controllo.
tranferStatus = Utils.STATUS_ERROR;
return;
}

// Aggiunge al contatore ausiliario dei bytes scaricati il totale dei bytes trasferiti
// dal segmento in esame.
segmentsBytesDownloaded += segmentsThreads[segmentIndex].getBytesDownloaded();

// Aggiorna il flag di completamento tramite moperazione logica AND,
// controllando se il segmento in esame &egrave; termnato
allSegmentFinished = allSegmentFinished &amp;&amp; (segmentsThreads[segmentIndex].getTranferStatus() == Utils.STATUS_COMPLETED);
}

// Aggiorna il totale dei bytes scaricati.
bytesDownloaded = segmentsBytesDownloaded;
}</pre>
<p style="text-align: justify; ">Se il trasferimento di tutti i segmenti &egrave; stato completato senza errori il thread principale si occupa di ricostruire il file di destinazione a partire dai files temporanei creati da ciascun segmento:</p>
<pre class="java" name="code" style="overflow-x: auto; overflow-y: auto; padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); text-align: justify; ">// Se il trasferimento dei singoli segmenti &egrave; terminato correttamente si procede con la ricostruzione
// del file di destinazione a partire dai singoli segmenti. Lo stato del trasferimento &egrave; posto a
// &quot;Ricostruzione&quot;
tranferStatus = Utils.STATUS_REBUILD;

// Utiliziamo la variabile che morizza la dimensione totale dei dati scaricati per monitorare
// lo stato di avanzamento della ricostruzione.
bytesDownloaded = 0;

try {
// Crea una istanza di un oggetto RandomAccessFile per poter scrivere sul file relativo al percorso di destinazione.
RandomAccessFile destinationWriter = new RandomAccessFile(destinationPath, &quot;rw&quot;);

// Inizia il ciclo di lettura dei segmenti
for (int segmentIndex = 0; segmentIndex &lt; segmentsCount; segmentIndex++) {
// Crea una istanza di RandomAccessFile per la lettura del file tporaneo contenente i dati trasferiti
// dal segmento in esame.
RandomAccessFile segmentFileReader = new RandomAccessFile(segmentsThreads[segmentIndex].getDestinationTpPath(), &quot;r&quot;);

// Legge il primo byte dal file tporaneo del segmento.
int byteReaded = segmentFileReader.read();

while (byteReaded != -1) {
// scrive l&#39;ultimo byte letto nel file di destinazione...
destinationWriter.write(byteReaded);
bytesDownloaded++;

// ...quindi legge il byte successivo.
byteReaded = segmentFileReader.read();
}

// Terminata la lettura di tutti i dati del segmento attuale chiude il file
// tporaneo in lettura
segmentFileReader.close();
}

// Terminata la ricotruzione senza errori chiude il file di destinazione.
destinationWriter.close();
} catch (IOException ex) {
// Se si verifica un errore durante la ricostruzione del file di destinazione avvisa l&#39;utente,
// imposta lo statto di errore prima di terminare.
JOptionPane.showMessageDialog(null, &quot;Si &egrave; verificato un errore durante la connessione ricostruzione del file di destinazione.\nIl download non potr&agrave; essere eseguito.\n\nDettagli: &quot; + ex.getLocalizedMessage(), &quot;Errore di ricostruzione della destinazione&quot;, JOptionPane.ERROR_MESSAGE);
tranferStatus = Utils.STATUS_ERROR;
return;
}

// Se il trasferimento e la ricostruzione sono andati entrambi a buon fine imposta lo stato del
// trasferimento a &quot;Completato&quot;
tranferStatus = Utils.STATUS_COMPLETED;</pre>
<p style="text-align: justify; ">Il campo &ldquo;Range&rdquo;</p>
<p style="text-align: justify; ">Ok, fino a qui &egrave; tutto abbastanza semplice, no? Per&ograve; la cosa interessante &egrave;: come facciamo a &ldquo;dire&rdquo; al server HTTP che vogliamo scaricare un segmento di un file che vada dal byte N al byte N+K? Semplice, utilizziamo il campo Range dell&rsquo;header HTTP che ci consente di specificare l&rsquo;intervallo (range, per l&rsquo;appunto) dei dati che vogliamo scaricare all&rsquo;interno del file richiesto. La sintassi da utilizzare &lsquo; la seguente:<br />
	&hellip;<br />
	Range=byte iniziale-byte finale<br />
	&hellip;</p>
<p style="text-align: justify; ">Nel nostro caso ciascun segmento, all&rsquo;avvio del thread e quindi all&rsquo;invocazione del metodo run(), stabilisce una connessione con il server all&rsquo;URL remoto e, prima di aprire uno stream di input per la lettura, aggiunge alla richiesta il campo Range correttamente inizializzato con la posizione del primo byte del segmento e quella dell&rsquo;ultimo calcolata come posizione del primo byte + lunghezza del segmento:</p>
<pre class="java" name="code" style="overflow-x: auto; overflow-y: auto; padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); text-align: justify; ">// Tenta di creare un nuovo oggetto URL dalla stringa passata come indirizzo durante
// l&#39;inizializzazione. Se la creazione va a buon fine apre una connessione con l&#39;indirizzo
URLConnection connection = new URL(sourceURL).openConnection();

// Crea una nuova stringa da passare all&#39;header di richiesta HTTP che sar&agrave; inoltrato al server
// prima di richiedere lo stream per il trasferimento.
// La propriet&agrave; di richiesta nell&#39;header deve avere la forma:
//
// Range: primo byte da leggere-ultimo byte da leggere
//
// che in questo caso sar&agrave;:
//
// Range: segmentOffset-(segmentOffset + segmentsSize)
String bytesRange = &quot;bytes=&quot; + Integer.toString(segmentOffset) + &quot;-&quot; + Integer.toString(segmentOffset + segmentsSize);

// Aggiunge la stringa contente la richiesta del Range da leggere dal file di origine
// all&#39;header HTTP.
connection.addRequestProperty(&quot;Range&quot;, bytesRange);

// Richiede uno stream di lettura per l&#39;intervallo specificato tramite la connessione stabilita
// in precedenza
InputStream connectionInputStream = connection.getInputStream();</pre>
<p style="text-align: justify; ">Il &ldquo;trucco&rdquo; &egrave; tutto qu&igrave;! Infatti una volta aperto lo stream che legga il giusto intervallo si procede come gi&agrave; visto nel secondo articolo della serie &ldquo;Java ed il protocollo HTTP&rdquo;, l&rsquo;unica differenza &egrave; che in questo caso utilizzero un file ad accesso casuale anzich&egrave; un FileWriter:</p>
<pre class="java" name="code" style="overflow-x: auto; overflow-y: auto; padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); text-align: justify; ">// Azzera il contatatori utilizzati durante il trasferimento.
int byteReaded = 0;
bytesDownloaded = 0;

// Imposta lo stato a &quot;Trasferimento&quot;
tranferStatus = Utils.STATUS_RUNNING;

// Legge il primo bayte del segmento corrispondente al byte &quot;segmentOffset&quot; nel file sorgente
byteReaded = connectionInputStream.read();

// Continua a leggere un byte per volta fino a quando non &egrave; stata raggiunta la lunghezza del segmento
// o non c&#39;&egrave; pi&ugrave; niente da leggere (in realt&agrave; non sarebbe necessario, ma evita sovrapposizioni di bytes)
while ((bytesDownloaded &lt; segmentsSize) &amp;&amp; (byteReaded != -1)) {
// Scrive l&#39;ultimo byte letto nel file tporaneo di destinazione...
writer.write(byteReaded);
bytesDownloaded++;

// ...e legge il byte successivo.
byteReaded = connectionInputStream.read();
}

// Se il trasferimento va a buon fine chiude il file tporaneo.
writer.close();
// Chiude lo stream di input.
connectionInputStream.close();
// Imposta lo stato di trasferimento del segmento a &quot;Completato&quot;
tranferStatus = Utils.STATUS_COMPLETED;</pre>
<h3 style="font-weight: normal; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 24px; text-align: justify; ">Conclusioni</h3>
<p style="text-align: justify; ">L&rsquo;esempio proposto, proprio in quanto inteso come esempio didattico, di certo non offre ne le prestazioni ottimali possibili e ne le funzionalit&agrave; solite dei programmi che eseguono download multi-threads. Alcune delle possibilit&agrave; di ottimizzazione ed implementazione di funzionalit&agrave; aggiuntive sono, ad esempio:</p>
<ul style="line-height: 2em; list-style-image: url('http://www.brainspace.it/wp-content/gallery/java_http/images/bullet.gif'); ">
<li style="text-align: justify; ">Solitamente i software di download multi-thread cercano di sfruttare diversi mirrors per il download dei segmenti in modo da distribuire il carico su pi&ugrave; servers.</li>
<li style="text-align: justify; ">Ogni segmento potrebbe scaricare pi&ugrave; di un byte per volta in modo da sfruttare la maggior quantit&agrave; possibile di banda.</li>
<li style="text-align: justify; ">Il file finale, anzich&eacute; essere ricostruito da thread principale di download, potrebbe essere ricostruito dai vari segmenti in modo parallelo.</li>
<li style="text-align: justify; ">Nonostante sia definito uno stato di &ldquo;Pausa&rdquo; questo non &egrave; implementato. Lascio a chi interessato l&rsquo;implementazione (per altro estremamente semplice) della funzionalit&agrave;.</li>
<li style="text-align: justify; ">Sarebbe opportuno poter salvare lo stato di un download per poterlo sospendere e riprendere in un secondo momento.</li>
</ul>
<p style="text-align: justify; ">La lista potrebbe essere ancora lunga. Chiunque volesse provare ad implementare unove funzionalit&agrave; pi&ugrave; farlo tranquillamente partendo dal codice sorgente dell&rsquo;esempio che si pu&ograve; trovare nella sezione seguente.</p>
<h3 style="font-weight: normal; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 24px; text-align: justify; ">Riferimenti</h3>
<p style="text-align: justify; ">Per una migliore comprensione il codice &egrave; ampiamente commentat, inoltre all&rsquo;interno della cartella &ldquo;dist/javadoc&rdquo; &egrave; possibile trovatre la documentazione delle API rese disponibili dalle classi del progetto.</p>
<p style="text-align: justify; ">Come per i precedenti articoli, anche in questo caso il codice sorgente ed i files di progetto per l&rsquo;IDE NetBeans 6.0 sono disponibili per il download coperti da licenza GPL:&nbsp;<code style="color: rgb(119, 153, 0); font-family: Consolas, Verdana, 'Courier New', sans-serif; "><a class="downloadlink" href="http://www.brainspace.it/downloads/SimpleMultithreadDownloader.zip" style="text-decoration: none; font-weight: bold; " title="Version- downloaded 0 times">SimpleMultithreadDownloader (Sorgenti - Files progetto NetBeans 6) (0)</a></code></p>
<p style="text-align: justify; ">Per quanti volessero approfondire l&rdquo; argomento HTTP &egrave; utile consultare questi siti:</p>
<p style="text-align: justify; "><a href="http://it.wikipedia.org/wiki/HTTP" style="text-decoration: none; font-weight: bold; ">Informazioni sull&rdquo;HTTP in Wikipedia:</a>&nbsp;Pagina su&nbsp;<a href="http://it.wikipedia.org/" style="text-decoration: none; font-weight: bold; ">Wikipedia</a>&nbsp;dedicata al protocollo HTTP</p>
<p style="text-align: justify; "><a href="http://www.faqs.org/rfcs/rfc1945.html" style="text-decoration: none; font-weight: bold; ">RFC 1945:</a>&nbsp;Specifiche della versione 1.0 del protocollo HTTP</p>
<p style="text-align: justify; "><a href="http://www.faqs.org/rfcs/rfc2616.html" style="text-decoration: none; font-weight: bold; ">RFC 2616:</a>&nbsp;Specifiche della versione 1.1 del protocollo HTTP</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brainspace.it/?feed=rss2&amp;p=28</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Photoshop Top Secret: non si vive di solo Gimp</title>
		<link>http://www.brainspace.it/?p=35</link>
		<comments>http://www.brainspace.it/?p=35#comments</comments>
		<pubDate>Tue, 30 Mar 2010 14:15:48 +0000</pubDate>
		<dc:creator>invernomuto</dc:creator>
				<category><![CDATA[Articoli, HowTo, Guide]]></category>
		<category><![CDATA[Grafica, Design, Look&Feel]]></category>
		<category><![CDATA[filtri]]></category>
		<category><![CDATA[foto ritocco]]></category>
		<category><![CDATA[photoshop]]></category>
		<category><![CDATA[tutorials]]></category>

		<guid isPermaLink="false">http://www.brainspace.it/?p=35</guid>
		<description><![CDATA[&#160;
Ok, Gimp &#232; un prodotto ottimo, sicuramente adatto anche ad un uso professionale, gratuito, ricco di plug-ins e scripts, e chi pi&#249; ne ha pi&#249; ne metta, ma non per questo chiunque si interessi un po di grafica pu&#242; snobbare completamente il Re, Imperatore, nonch&#233; quasi divinit&#224; del settore: Photoshop&#174;!
	Visto che in ufficio spesso, per [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify; ">&nbsp;</p>
<p style="text-align: justify; "><span class="Apple-style-span" style="color: rgb(85, 85, 85); font-family: 'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif; ">Ok, Gimp &egrave; un prodotto ottimo, sicuramente adatto anche ad un uso professionale, gratuito, ricco di plug-ins e scripts, e chi pi&ugrave; ne ha pi&ugrave; ne metta, ma non per questo chiunque si interessi un po di grafica pu&ograve; snobbare completamente il Re, Imperatore, nonch&eacute; quasi divinit&agrave; del settore: Photoshop&reg;!<br />
	Visto che in ufficio spesso, per forza di cose, mi trovo ad utilizzare Photoshop&reg;, un po di tempo fa abbiamo optato per un acquisto che all&rsquo;inizio pareva pi&ugrave; una follia che qualcosa di utile, ma che si &egrave; in realt&agrave; rivelato un ottimo acquisto. Sto parlando di una raccolta di tutorials in DVD, completata da un book a colori, intitolata:<a href="http://www.photoshoptopsecret.com/" style="text-decoration: none; font-weight: bold; " target="_blank" title="Il sito ufficiale della raccolta di tutorials. ">Photoshop&reg; Top Secret&trade;.</a></span></p>
<p><span class="Apple-style-span" style="color: rgb(85, 85, 85); font-family: 'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif; "><img alt="Immagine elaborata seguendo uno dei tutorial." class="ngg-singlepic ngg-center" src="http://www.brainspace.it/wp-content/gallery/photoshop_secrets/preview.jpg" style="background-color: rgb(255, 255, 255); display: block; padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 4px; margin-left: auto !important; margin-right: auto !important; text-align: justify; " /></span></p>
<p style="text-align: justify; "><span id="more-35"></span></p>
<p style="text-align: justify; "><a href="http://www.photoshoptopsecret.com/" style="text-decoration: none; font-weight: bold; " target="_blank" title="Il sito ufficiale della raccolta di tutorials. ">Photoshop&reg; Top Secret&trade;</a>&nbsp;&egrave; costituito da 4 DVD contenenti&nbsp; dei video tutorials dettagliatissimi e i materiali necessari per seguire i tutorials presentati. Sfortunatamente il commento ai tutorials &egrave; in lingua inglese, ma comunque comprensibilissima, specie perch&egrave; le operazioni svolte sono chiaramente visibili sugli screencast che costituiscono il cuore di ciascun tutorial.<br />
	Gli argomenti trattati variano dalla grafica per il web, al foto ritocco avanzato, all&rsquo;applicazione di effetti al testo, alla creazione di landscapes surreali, alla colorazione di immagini vettoriali, alla produzione di locandine da film, e moltissimo altro.&nbsp; Uno dei tutorial pi&ugrave; divertenti, ad esempio, penso dia quello che tratta l&rsquo;uso del filtro &ldquo;liquidifica&rdquo;, il cui risultato finale &egrave; circa il seguente:</p>
<div><a class="thickbox" href="http://www.brainspace.it/wp-content/gallery/photoshop_secrets/pomo.jpg" style="text-decoration: none; font-weight: bold; " title="Il risultato finale dopo il tutorial relativo al filtro &quot;liquidifica&quot;."><img alt="Una mela al giorno...." border="0" class="ngg-singlepic ngg-center" src="http://www.brainspace.it/wp-content/gallery/photoshop_secrets/thumbs/thumbs_pomo.jpg" style="background-color: rgb(255, 255, 255); display: block; padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 4px; margin-left: auto !important; margin-right: auto !important; text-align: justify; " /></a></div>
<p style="text-align: justify; ">Di seguito riporto una lista degli argomenti trattati da ciascun tutorial:</p>
<table border="0">
<tbody>
<tr valign="top">
<td>
<div id="dvd1">
<h3 class="features" style="font-weight: normal; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 24px; text-align: justify; ">Tutorials DVD 1</h3>
<ul style="line-height: 2em; list-style-image: url(http://www.brainspace.it/wp-content/gallery/photoshop_secrets/thumbsimages/bullet.gif); ">
<li style="text-align: justify; "><strong>Movie Poster Design I</strong><span>&sect;<br />
							Create a popular people montage seen on many movie posters.<br />
							</span></li>
<li style="text-align: justify; "><strong>Movie Poster Design II<br />
							</strong><span>Take an ordinary house and turn it into a Sci-fi Movie Poster.<br />
							</span></li>
<li style="text-align: justify; "><strong>Movie Poster Credits<br />
							</strong><span>Tips and tricks on creating a real &ldquo;Credit Block&rdquo; for movie posters.<br />
							</span></li>
<li style="text-align: justify; "><strong>Dark Faces<br />
							</strong><span>How I created my creepy Image that has been in Magazines and Ads.<br />
							</span></li>
<li style="text-align: justify; "><strong>Breaking Apart<br />
							</strong><span>Create the illusion that a face is falling apart.</span></li>
<li style="text-align: justify; "><strong>Dream Scene Montage</strong><br />
							<span>Create an elephant with wings and place it into a futuristic world.</span></li>
<li style="text-align: justify; "><strong>Stone Portrait<br />
							</strong><span>Create a &ldquo;Stone Bust&rdquo; out of a portrait for a killer special effect.</span></li>
<li style="text-align: justify; "><strong>Surreal Images<br />
							</strong><span>Create a creamy foggy mist over water and rocks.</span></li>
<li style="text-align: justify; "><strong>Dream Skin<br />
							</strong><span>Create a fantasy woman with henna art and dream skin.<br />
							</span></li>
<li style="text-align: justify; "><strong>Special Effects<br />
							</strong><span>Learn how to create orbs, fireballs and jellyfish like creatures.<br />
							</span></li>
</ul></div>
</td>
<td>
<div id="dvd2">
<h3 style="font-weight: normal; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 24px; text-align: justify; ">Tutorials DVD 2</h3>
<ul style="line-height: 2em; list-style-image: url(http://www.brainspace.it/wp-content/gallery/photoshop_secrets/thumbsimages/bullet.gif); ">
<li style="text-align: justify; "><strong>Painting a Portrait</strong><span><br />
							Digitally paint a portrait from a photographic reference.<br />
							</span></li>
<li style="text-align: justify; "><strong>Swapping Faces</strong>&nbsp;<span><br />
							How to take the face from one photo and place it into a completely different one.<br />
							</span></li>
<li style="text-align: justify; "><strong>Pop Art</strong><br />
							<span>Turn a Photograph into artwork that was popular in the mid 1950&rsquo;s.</span></li>
<li style="text-align: justify; "><strong>Applying Tattoos</strong>&nbsp;<span><br />
							How to apply henna and tattoos to skin.</span></li>
<li style="text-align: justify; "><strong>Masking Fur</strong><br />
							<span>Seamlessly remove the background from furry animals.</span></li>
<li style="text-align: justify; "><strong>Vanishing Point</strong><br />
							<span>What Vanishing Point is and how to edit images with perspective.</span></li>
<li style="text-align: justify; "><strong>Web Graphics</strong><br />
							<span>Learn how to create commonly used web graphics and screen shots.</span></li>
<li style="text-align: justify; "><strong>Shattered Type</strong><br />
							<span>Create the illusion that text is being shattered like glass.</span></li>
<li style="text-align: justify; "><strong>Flower Greeting Card</strong><br />
							<span>Use the vector tools in Photoshop to create an elegant looking Greeting Card.</span></li>
<li style="text-align: justify; "><strong>Creating DVD Covers</strong>&nbsp;<span><br />
							Mark shows you exactly how he created the Photoshop Top Secret DVD covers</span></li>
</ul></div>
</td>
</tr>
<tr valign="top">
<td>
<h3 class="features" style="font-weight: normal; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 24px; text-align: justify; ">Tutorials DVD 3</h3>
<div id="dvd3">
<div class="features">
<ul style="line-height: 2em; list-style-image: url(http://www.brainspace.it/wp-content/gallery/photoshop_secrets/thumbsimages/bullet.gif); ">
<li style="text-align: justify; "><strong>Flying out of Bounds&nbsp;</strong><span><br />
								Create the classic &ldquo;out of bounds&rdquo; effect with a very cool masking trick.<br />
								</span></li>
<li style="text-align: justify; "><strong>Reaching out of Bounds<br />
								</strong><span>Creating the illusion of arms and hands reaching out of a picture frame.<br />
								</span></li>
<li style="text-align: justify; "><strong>Chocolate Milk Frog</strong><br />
								<span>How to make a frog covered in chocolate.<br />
								</span></li>
<li style="text-align: justify; "><strong>Covered with Wax<br />
								</strong><span>Choose an object and cover itwith melting wax.</span></li>
<li style="text-align: justify; "><strong>Grunge Look</strong>&nbsp;<span>Create a unique grunge background that can be used for almost anything.</span></li>
<li style="text-align: justify; "><strong>Square Fruit</strong>&nbsp;<span><br />
								Play with mother nature by changing the shape of fruit.</span></li>
<li style="text-align: justify; "><strong>Invisible Man</strong>&nbsp;<span><br />
								How to make a person vanish from their clothing.</span></li>
<li style="text-align: justify; "><strong>Metal Collage</strong>&nbsp;<span>How to create a Robot with pieces of a</span><span>Photo and then place it into another world.</span></li>
<li style="text-align: justify; "><strong>Morphing Creatures</strong><br />
								<span>Morph animals and reptiles together&nbsp;</span><span>to create interesting creatures.</span></li>
<li style="text-align: justify; "><strong>Using Layer Comps</strong><span><br />
								How to create multiple layouts in&nbsp;</span><span>one Photoshop file using Layer Comps.</span></li>
</ul></div>
</p></div>
</td>
<td>
<h3 class="features" style="font-weight: normal; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 24px; text-align: justify; ">Tutorials DVD 4</h3>
<ul style="line-height: 2em; list-style-image: url(http://www.brainspace.it/wp-content/gallery/photoshop_secrets/thumbsimages/bullet.gif); ">
<li style="text-align: justify; "><strong>Vector Art Portrait</strong>&nbsp;<span><br />
						Turn a Photograph into beautiful vector art.</span></li>
<li style="text-align: justify; "><strong>Dreamy Background</strong><br />
						<span>Create Sci-fi looking spiral backgrounds.<br />
						</span></li>
<li style="text-align: justify; "><strong>Liquid Metal</strong><br />
						<span>The ultimate Liquid metal technique that can be applied to text and objects.<br />
						</span></li>
<li style="text-align: justify; "><strong>Smoke</strong>&nbsp;<span><br />
						Create Psychedelic and Natural Smoke to incorporate into your artwork.</span></li>
<li style="text-align: justify; "><strong>Soap Bubbles</strong>&nbsp;<span><br />
						Use soap bubbles to add flair to your projects.</span></li>
<li style="text-align: justify; "><strong>Water Bubbles</strong><br />
						<span>Use these water bubbles to infuse imagination into your projects.</span></li>
<li style="text-align: justify; "><strong>Underwater Scene</strong><br />
						<span>Create an underwater illusion with just the tools in Photoshop.</span></li>
<li style="text-align: justify; "><strong>Swap Animal Skin</strong>&nbsp;<span><br />
						Take skin from one animal and place it over another.</span></li>
<li style="text-align: justify; "><strong>Stylized Character</strong><br />
						<span>Turn a sketch into colorful art.<br />
						</span></li>
<li style="text-align: justify; "><strong>Masking Mastery</strong><br />
						<span>Special video that explains many masking techniques used by the pros.</span></li>
</ul>
</td>
</tr>
</tbody>
</table>
<div>
<p style="text-align: justify; "><a class="thickbox" href="http://www.brainspace.it/wp-content/gallery/photoshop_secrets/prima.jpg" style="text-decoration: none; font-weight: bold; " title="L'immagine di partenza a cui dovranno essere applicati filtri ed effetti speciali."><img alt="Immagine originale prima del tutorial..." border="0" class="ngg-singlepic ngg-center" src="http://www.brainspace.it/wp-content/gallery/photoshop_secrets/thumbs/thumbs_prima.jpg" style="background-color: rgb(255, 255, 255); display: block; padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 4px; margin-left: auto !important; margin-right: auto !important; text-align: justify; " /></a></p>
<p style="text-align: justify; "><a class="thickbox" href="http://www.brainspace.it/wp-content/gallery/photoshop_secrets/dopo.jpg" style="text-decoration: none; font-weight: bold; " title="L'immagine finale dopo aver applicato effetti e filtri come da tutorial."><img alt="Immagine dopo il &quot;trattamento&quot;" border="0" class="ngg-singlepic ngg-center" src="http://www.brainspace.it/wp-content/gallery/photoshop_secrets/thumbs/thumbs_dopo.jpg" style="background-color: rgb(255, 255, 255); display: block; padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 4px; margin-left: auto !important; margin-right: auto !important; text-align: justify; " /></a></p>
</div>
<p style="text-align: justify; ">La raccolta di tutorials &egrave; in&nbsp;<a href="http://www.photoshoptopsecret.com/cart/index012.html" style="text-decoration: none; font-weight: bold; " target="_blank" title="Pagina con le opzioni di acquisto.">vendita sul sito ufficiale</a>&nbsp;per la &ldquo;modica&rdquo; cifra di 179$ + 35$ per le spese di spedizione ad di fuori degli stati uniti. Mi rendo conto che la cifra non &egrave; esattamente bassa, specie per i semplici amatori che non sono intenzionati ad un uso professionale di Photoshop&reg;, per&ograve; per tutti quelli che desiderano addentrarsi nei meandri del principale strumento di foto ritocco in circolazione, &egrave; sicuramente una spesa ben fatta.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brainspace.it/?feed=rss2&amp;p=35</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java ed il protocollo HTTP (Seconda Parte)</title>
		<link>http://www.brainspace.it/?p=23</link>
		<comments>http://www.brainspace.it/?p=23#comments</comments>
		<pubDate>Tue, 30 Mar 2010 13:17:49 +0000</pubDate>
		<dc:creator>invernomuto</dc:creator>
				<category><![CDATA[Articoli, HowTo, Guide]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[protocollo]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.brainspace.it/?p=23</guid>
		<description><![CDATA[in &#8220;Java ed il protocollo HTTP (Prima Parte)&#8221; abbiamo visto come richiedere una connessione ad un server HTTP, cosa interessante, ma anche abbastanza inutile dal punto di vista dell&#8217;utente se non a scopo indicativo.
In questa seconda parte vedremo un semplice classe che si occupa di scaricare un file da un indirizzo URL remoto in un [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify; "><span class="Apple-style-span" style="color: rgb(85, 85, 85); font-family: 'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif; ">in &ldquo;<a href="http://www.brainspace.it/?p=3" style="text-decoration: none; font-weight: bold; " title="Prima parte della serie ">Java ed il protocollo HTTP (Prima Parte)</a>&rdquo; abbiamo visto come richiedere una connessione ad un server HTTP, cosa interessante, ma anche abbastanza inutile dal punto di vista dell&rsquo;utente se non a scopo indicativo.</span></p>
<p style="text-align: justify; "><span class="Apple-style-span" style="color: rgb(85, 85, 85); font-family: 'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif; ">In questa seconda parte vedremo un semplice classe che si occupa di scaricare un file da un indirizzo URL remoto in un file su un percorso locale in modo sequenziale.</span></p>
<p style="text-align: justify; ">Il codice &egrave; ampiamente commentato, quindi dovrebbe essere di facile comprensione per chi ha gi&agrave; seguito il primo articolo della serie o ha un minimo di dimestichezza con le api di rete Java.</p>
<h4 style="font-weight: normal; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 20px; "><span id="more-23"></span></h4>
<h4 style="font-weight: normal; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 20px; text-align: justify; ">Inizializzazione del download</h4>
<p style="text-align: justify; ">Innanzitutto vengono letti i primi due parametri passati come argomenti dalla linea di comando passati al costruttore ella classe SimpleHttpDownloader (anche se non &egrave; molto elegante). Il primo parametro &egrave; l&rsquo;indirizzo URL del file da scaricare tramite HTTP, il secondo parametro &egrave; il percorso locale su cui l&rsquo;utente desidera sia salvato il file scaricato.</p>
<p style="text-align: justify; ">Il costruttore innanzitutto controlla se i parametri passati sono corretti e validi per eseguire il download cio&egrave; se l&rsquo;URL &egrave; malformato o meno, se non lo &egrave; apre una connessione all&rsquo;indirizzo specificato e crea un nuovo oggetto di tipo<a href="file:///usr/lib/jvm/java-6-sun/docs/api/index.html?java/net/URLConnection.html" style="text-decoration: none; font-weight: bold; " title="Refernece Classe URLConnect">URLConnection:</a></p>
<blockquote style="overflow-x: auto; overflow-y: auto; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); ">
<p style="text-align: justify; ">URLConnection connection = null;<br />
		try {</p>
<blockquote style="overflow-x: auto; overflow-y: auto; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); ">
<p style="text-align: justify; ">// Crea un oggetto URL dalla stringa passata come primo parametro&hellip;<br />
			URL sourceURL = new URL(sourceURLString);<br />
			// &hellip;se l&rsquo;URL non &egrave; malformato apre una connessione<br />
			connection = sourceURL.openConnection();</p>
</blockquote>
<p style="text-align: justify; ">} catch (MalformedURLException ex) {</p>
<blockquote style="overflow-x: auto; overflow-y: auto; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); ">
<p style="text-align: justify; ">// &hellip;se l&rsquo;URL &egrave; malformato avvisa l&rsquo;utente ed esce<br />
			System.err.println(&ldquo;L&rsquo;URL \&rdquo;&quot; + sourceURLString + &ldquo;\&rdquo; specificato &egrave; malformato.\nControllare di aver digitato correttamente l&rsquo;URL del documento da scaricare.&rdquo;);<br />
			System.err.println(&ldquo;Descrizione dell&rsquo;errore: &rdquo; + ex.getLocalizedMessage());<br />
			System.exit(-1);</p>
</blockquote>
<p style="text-align: justify; ">} catch (IOException ex) {</p>
<blockquote style="overflow-x: auto; overflow-y: auto; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); ">
<p style="text-align: justify; ">// &hellip;se non &egrave; possibile aprire una connessione all&rsquo;URL, ad esempio perch&egrave; &egrave; inesistente<br />
			// o il server non &egrave; disponibile in quel momento avvisa l&rsquo;utente fornendo anche una<br />
			// descrizione dell&rsquo;errore ed esce.<br />
			System.err.println(&ldquo;Si &egrave; verificato un errore durante la connessione al server.&rdquo;);<br />
			System.err.println(&ldquo;Descrizione dell&rsquo;errore: &rdquo; + ex.getLocalizedMessage());<br />
			System.exit(-1);</p>
</blockquote>
<p style="text-align: justify; ">}</p>
</blockquote>
<p style="text-align: justify; ">Instaurata la connessione controlla se il file corrispondente al secondo parametro passato &egrave; esistente, se non lo &egrave; richiede un handle per la scrittura sul file:</p>
<blockquote style="overflow-x: auto; overflow-y: auto; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); ">
<p style="text-align: justify; ">// Crea un oggetto corrispondente al file di destinazione al percorso<br />
		// indicato come secondo parametro<br />
		File destinationFile = new File(destinationPath);</p>
<p style="text-align: justify; ">// Controlla se il file esiste gi&agrave;&hellip;<br />
		if (destinationFile.exists()) {</p>
<blockquote style="overflow-x: auto; overflow-y: auto; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); ">
<p style="text-align: justify; ">// &hellip;se esite avverte l&rsquo;utente ed esce.<br />
			//<br />
			// NOTA: questa &egrave; solo una precauzione per evitare di sovrascrivere un eventuale<br />
			// file preesistente, ma potrebbe tranquillamente essere omessa ed il file<br />
			// eventualmente gi&agrave; presente sarebbe sovrascritto.<br />
			System.err.println(&ldquo;Il file di destinazione \&rdquo;&quot; + destinationFile + &ldquo;\&rdquo; specificato &egrave; gi&agrave; esistente.\nE&rsquo; necessario che il file di destinazione non esista.&rdquo;);<br />
			System.exit(-1);</p>
</blockquote>
<p style="text-align: justify; ">}</p>
<p style="text-align: justify; ">FileWriter destinationWriter = null;</p>
<p style="text-align: justify; ">try {</p>
<blockquote style="overflow-x: auto; overflow-y: auto; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); ">
<p style="text-align: justify; ">// Apre un handle per la scrittura sul file di destinazione<br />
			destinationWriter = new FileWriter(destinationFile);</p>
</blockquote>
<p style="text-align: justify; ">} catch (IOException ex) {</p>
<blockquote style="overflow-x: auto; overflow-y: auto; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); ">
<p style="text-align: justify; ">// In caso di errore fornisce una breve descrizione all&rsquo;utente ed esce.<br />
			System.err.println(&ldquo;Si &egrave; verificato un errore durante l&rsquo;inizializzazione del file di destinazione per la scrittura.&rdquo;);<br />
			System.err.println(&ldquo;Descrizione dell&rsquo;errore: &rdquo; + ex.getLocalizedMessage());<br />
			System.exit(-1);</p>
</blockquote>
<p style="text-align: justify; ">}</p>
</blockquote>
<p style="text-align: justify; ">I dati sono letti dalla posizione remota attraverso uno stream di input reso disponibile dall&rsquo;oggetto URLConnection:</p>
<blockquote style="overflow-x: auto; overflow-y: auto; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); ">
<p style="text-align: justify; ">InputStream urlInputStream = null;</p>
<p style="text-align: justify; ">try {</p>
<blockquote style="overflow-x: auto; overflow-y: auto; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); ">
<p style="text-align: justify; ">// Apre uno stream di input per la lettura dei dati dalla connessione<br />
			// instaurata precedentemente.<br />
			urlInputStream = connection.getInputStream();</p>
</blockquote>
<p style="text-align: justify; ">} catch (IOException ex) {</p>
<blockquote style="overflow-x: auto; overflow-y: auto; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); ">
<p style="text-align: justify; ">// In caso non sia possibile avverte l&rsquo;utente ed esce.<br />
			System.err.println(&ldquo;Si &egrave; verificato un errore durante la creazione dello stream di lettura.&rdquo;);<br />
			System.err.println(&ldquo;Descrizione dell&rsquo;errore: &rdquo; + ex.getLocalizedMessage());<br />
			System.exit(-1);</p>
</blockquote>
</blockquote>
<blockquote style="overflow-x: auto; overflow-y: auto; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); ">
<p style="text-align: justify; ">}</p>
</blockquote>
<p style="text-align: justify; ">Prima di poter procedere con il trasferimento &egrave; necessario inizializzare alcuni contatori che poi saranno usati per mantenere informato l&rsquo;utente sullo stato del download.<br />
	La variabile&nbsp;<strong>totalDownloadSize</strong>&nbsp;&egrave; inizializzata con la dimensione in bytes del file da scaricare ottenuta tramite invocazione del metodo&nbsp;<strong>getContentLength()</strong>&nbsp;della clase<strong>URLConnection.</strong></p>
<blockquote style="overflow-x: auto; overflow-y: auto; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); ">
<p style="text-align: justify; ">int totalDownloadSize = connection.getContentLength();</p>
</blockquote>
<p style="text-align: justify; "><strong>downloadedSize</strong>&nbsp;&egrave; il contatore dei bytes scaricati durante il ciclo di trasferimento.</p>
<blockquote style="overflow-x: auto; overflow-y: auto; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); ">
<p style="text-align: justify; ">int downloadedSize = 0;</p>
</blockquote>
<p style="text-align: justify; ">La variabile downloadPrecent rappresenta la percentuale di avanzamento dello scaricamento. E&rsquo; utilizzata per scremare l&rsquo;output delle informazioni mostrate per aggiornare l&rsquo;utente sullo stato dello scaricamento.</p>
<blockquote style="overflow-x: auto; overflow-y: auto; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); ">
<p style="text-align: justify; ">int downloadPrecent = 0;</p>
</blockquote>
<p style="text-align: justify; "><strong>byteReaded</strong>&nbsp;contiene l&rsquo;ultimo byte letto dallo stream di input.</p>
<blockquote style="overflow-x: auto; overflow-y: auto; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); ">
<p style="text-align: justify; ">int byteReaded = -1;</p>
</blockquote>
<h4 style="font-weight: normal; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 20px; text-align: justify; ">Trasferimento</h4>
<p style="text-align: justify; ">Terminata l&rsquo;inizializzazione dei contatori si passa al ciclo di trasferimento vero e proprio che inizia con la lettura del primo byte dallo stream di input.</p>
<blockquote style="overflow-x: auto; overflow-y: auto; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); ">
<p style="text-align: justify; ">byteReaded = urlInputStream.read();</p>
</blockquote>
<p style="text-align: justify; ">Il ciclo legge un singolo byte e lo scrive immediatamente sul file di destinazione</p>
<blockquote style="overflow-x: auto; overflow-y: auto; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); ">
<p style="text-align: justify; ">// Il ciclo termina quando tutti i bytes sono stati trasferiti.<br />
		while (byteReaded != -1) {</p>
<blockquote style="overflow-x: auto; overflow-y: auto; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); ">
<p style="text-align: justify; ">// Scrive il byte appena scaricato sul file di destinazione.<br />
			destinationWriter.write(byteReaded);<br />
			// Incrementa il contatore dei bytes scaricati.<br />
			downloadedSize++;</p>
</blockquote>
</blockquote>
<p style="text-align: justify; ">Per mantenere l&rsquo;utente informato vengono stampate delle informazioni relative alla percentuale di trasferimento completato ed ai bytes scaricati; le informazioni per&ograve; vengono stampate solo ed esclusivamente quando varia la percentuale di avanzamento perch&egrave; se si stampasse una stringa informativa per ogni byte scaricato il ciclo rallenterebbe molto rendendo downloads di pochi byte molto lunghi. se si desidera provare &egrave; sufficiente commentare il la stringa di apertura e chiusura del blocco&nbsp;<em><strong>if</strong></em></p>
<blockquote style="overflow-x: auto; overflow-y: auto; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); ">
<blockquote style="overflow-x: auto; overflow-y: auto; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); ">
<p style="text-align: justify; ">// Confronta la percentuale di avanzamento attuale con l&rsquo;ultima memorizzata.<br />
			// Se sono uguali evita di mostrare l&rsquo;output&hellip;<br />
			if (((downloadedSize * 100) / totalDownloadSize) != downloadPrecent) {</p>
<blockquote style="overflow-x: auto; overflow-y: auto; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); ">
<p style="text-align: justify; ">// &hellip;altrimenti memorizza la percentuale attuale&hellip;<br />
				downloadPrecent = ((downloadedSize * 100) / totalDownloadSize);<br />
				// &hellip;ed aggiorna l&rsquo;utente sullo stato del trasferimento.<br />
				System.out.println(&ldquo;[ &quot; + downloadPrecent + &quot;% ] Scaricati &rdquo; + downloadedSize + &rdquo; bytes di &rdquo; + totalDownloadSize);</p>
</blockquote>
<p style="text-align: justify; ">}</p>
<p style="text-align: justify; ">// Legge il byte successivo.<br />
			byteReaded = urlInputStream.read();</p>
</blockquote>
</blockquote>
<p style="text-align: justify; ">}</p>
<p style="text-align: justify; ">Terminato il trasferimento vengono chiusi stream ed handle al file di destinazione.</p>
<blockquote style="overflow-x: auto; overflow-y: auto; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); ">
<p style="text-align: justify; ">// Forza la scrittura di eventuali dati pendenti nel file di destinazione.<br />
		destinationWriter.flush();<br />
		// Chiude l&rsquo;handle al file e lo stream di input.<br />
		destinationWriter.close();<br />
		urlInputStream.close();</p>
</blockquote>
<h4 style="font-weight: normal; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 20px; text-align: justify; ">Conclusione</h4>
<p style="text-align: justify; ">Il codice mostra con quanta facilit&agrave; &egrave; possibile scaricare un file dalla rete, ma indubbiamente non &egrave; esattamente un esempio come portare le prestazioni all&rsquo;estremo. Il codice sarebbe pi&ugrave; adatto, infatti, se stessimo prelevando dati da un server FTP in quanto &egrave; consentita una sola connessione per scaricare un file ed il download deve essere eseguito in modo sequenziale. A contrario il protocollo HTTP &egrave; in grado di accettare richieste multiple per il download di un solo file, in cui ogni richiesta specifica nell&rsquo;header il range di bytes del file che desidera ottenere, ci&ograve; consente di avere pi&ugrave; flussi di trasferimento contemporaneamente (multi thread download), che sar&agrave; l&rsquo;argomento della terza parte di questa serie di tutorials&nbsp;<img alt=":)" class="wp-smiley" src="file:///C:/Users/Tommaso/Desktop/Nuova%20cartella/BrainSpace.it%20%C2%BB%20Blog%20Archive%20%C2%BB%20Java%20ed%20il%20protocollo%20HTTP%20(Seconda%20Parte)_files/face-smile.png" />&nbsp;.</p>
<h4 style="font-weight: normal; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 20px; text-align: justify; ">Riferimenti</h4>
<p style="text-align: justify; ">Come per la prima parte della serie di tutorials su Java ed HTTP, il codice sorgente ed i files di progetto per l&rsquo;IDE NetBeans 6.0 sono disponibili per il download coperti da licenza GPL:&nbsp;<a class="downloadlink" href="http://www.brainspace.it/downloads/SimpleHttpDownloader.zip" style="text-decoration: none; font-weight: bold; " title="Version1.0 downloaded 0 times">SimpleHttpDownloader (Sorgenti &#8211; Files progetto NetBeans 6) (0)</a></p>
<p style="text-align: justify; ">Per quanti volessero approfondire l&rdquo; argomento HTTP &egrave; utile consultare questi siti:</p>
<p style="text-align: justify; "><a href="http://it.wikipedia.org/wiki/HTTP" style="text-decoration: none; font-weight: bold; ">Informazioni sull&rdquo;HTTP in Wikipedia:</a>&nbsp;Pagina su&nbsp;<a href="http://it.wikipedia.org/" style="text-decoration: none; font-weight: bold; ">Wikipedia</a>&nbsp;dedicata al protocollo HTTP</p>
<p style="text-align: justify; "><a href="http://www.faqs.org/rfcs/rfc1945.html" style="text-decoration: none; font-weight: bold; ">RFC 1945:</a>&nbsp;Specifiche della versione 1.0 del protocollo HTTP</p>
<p style="text-align: justify; "><a href="http://www.faqs.org/rfcs/rfc2616.html" style="text-decoration: none; font-weight: bold; ">RFC 2616:</a>&nbsp;Specifiche della versione 1.1 del protocollo HTTP</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brainspace.it/?feed=rss2&amp;p=23</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>I’ve seen things you people wouldn’t believe&#8230;&#185;</title>
		<link>http://www.brainspace.it/?p=18</link>
		<comments>http://www.brainspace.it/?p=18#comments</comments>
		<pubDate>Tue, 30 Mar 2010 13:08:21 +0000</pubDate>
		<dc:creator>invernomuto</dc:creator>
				<category><![CDATA[Articoli, HowTo, Guide]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[gps]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[widget]]></category>

		<guid isPermaLink="false">http://www.brainspace.it/?p=18</guid>
		<description><![CDATA[&#160;

Dopo aver esplorato con calma tutte le funzionalit&#225; ed i possibili usi della&#160;prima applicazione per&#160;Android&#160;;), mi sono cimentato nella scrittura di un altro applicativo di palese inutilit&#225;, ma che, comunque esplora un po&#8217; pi&#38;&#249;acute; a fondo le potenzialit&#225; del nostro androide. L&#8217;applicazione in questione utilizza il primo dispositivo di locazione disponibile per recuperare i dati [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify; ">&nbsp;</p>
<div class="post">
<p style="text-align: justify; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">Dopo aver esplorato con calma tutte le funzionalit&aacute; ed i possibili usi della&nbsp;<a href="http://www.brainspace.it/wp-admin/post.php?action=edit&amp;post=18" style="text-decoration: none; font-weight: bold; " target="_blank" title="I, Android: Un primo tutorial per android">prima applicazione per</a>&nbsp;<a href="http://code.google.it/adroid/" style="text-decoration: none; font-weight: bold; " target="_blank" title="Home page del progetto android">Android</a>&nbsp;;), mi sono cimentato nella scrittura di un altro applicativo di palese inutilit&aacute;, ma che, comunque esplora un po&rsquo; pi&amp;&ugrave;acute; a fondo le potenzialit&aacute; del nostro androide. L&rsquo;applicazione in questione utilizza il primo dispositivo di locazione disponibile per recuperare i dati di posizionamento attuali del dispositivo su cui Android &eacute; in esecuzione ed utilizza tali dati per recuperare un&rsquo;immagine da&nbsp;<a href="http://www.panoramio.com/" style="text-decoration: none; font-weight: bold; " target="_blank" title="Home page di Panoramio">panoramio</a>.</font></p>
<p style="text-align: center; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif"><span class="Apple-style-span" style="color: rgb(85, 85, 85); font-family: 'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif; font-size: 12px; "><a class="thickbox" href="http://www.brainspace.it/wp-content/gallery/android_experiment2/run.png" style="text-decoration: none; font-weight: bold; " title="Applicazione in esecuzione"><img alt="Applicazione in esecuzione" border="1" src="http://www.brainspace.it/wp-content/gallery/android_experiment2/thumbs/thumbs_run.png" /></a></span></font></p>
<p style="text-align: center; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif"><span class="Apple-style-span" style="color: rgb(85, 85, 85); font-family: 'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif; font-size: 12px; "><em>L&rsquo;applicazione in esecuzione.<br />
		(fare click sull&rsquo;immagine per vederla a dimensioni reali)</em></span></font></p>
<p style="text-align: center; "><span id="more-18"></span></p>
<p style="text-align: justify; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif"><span class="Apple-style-span" style="color: rgb(85, 85, 85); font-family: 'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif; font-size: 12px; ">Come per l&rsquo;esempio precedente, naturalmente, anche in questo caso avremmo bisogno dell&rsquo;SDK di Android prelevabile direttamente dalla&nbsp;<a href="http://code.google.com/android/" style="text-decoration: none; font-weight: bold; " target="_blank">pagina principale del progetto</a>, dell&rsquo;<a href="http://www.eclipse.org/" style="text-decoration: none; font-weight: bold; " target="_blank" title="Home page del progetto Eclipse">IDE Eclipse</a>&nbsp;ed il plugin per Eclipse, installabile&nbsp;<a href="http://code.google.com/android/intro/installing.html#installingplugin" style="text-decoration: none; font-weight: bold; " target="_blank">seguendo le apposite istruzioni</a>. Per chi si fosse perso la puntata precedente consiglio un ripassino leggendosi il&nbsp;<a href="http://www.brainspace.it/wp-admin/post.php?action=edit&amp;post=18" style="text-decoration: none; font-weight: bold; " title="I, Android: Un primo tutorial per android">post precedente</a>&nbsp;oppure consultando gli esempi sul sito del progetto. Una breve nota: essendo questa volta il codice sorgente un po&rsquo; pi&amp;&ugrave;acute; complesso della &ldquo;puntata precedente&rdquo; l&rsquo;ho provvisto di commenti che dovrebbero semplificarne la comprensione; chi segue il tutorial &eacute; tenuto a leggere sia la parte di articolo sia tali commenti. Bene, se siamo pronti possiamo cominciare&hellip;</span></font></p>
<p><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif"><br />
		</font></p>
<h3 style="font-weight: normal; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 24px; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">Widgets &amp; Layout</font></h3>
<p><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">Dopo aver creato un nuovo progetto, che nel mio caso ho chiamato &ldquo;Second Android Experiment&rdquo; (a volte mi spavento da solo per la mia sfrenata fantasia&hellip;), come descritto nel tutorial precedente, modifichiamo il file&nbsp;<strong>main.xml&nbsp;</strong><em>(lo trovate in res/layout)</em>&nbsp;per disporre i widgets che andremo ad usare in un layout verticale:</font></p>
<blockquote style="overflow-x: auto; overflow-y: auto; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); ">
<p><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">&lt;?xml version=&rdquo;1.0&Prime; encoding=&rdquo;utf-8&Prime;?&gt;<br />
			&lt;LinearLayout xmlns:android=&rdquo;http://schemas.android.com/apk/res/android&rdquo;<br />
			android:orientation=&rdquo;vertical&rdquo;<br />
			android:layout_width=&rdquo;fill_parent&rdquo;<br />
			android:layout_height=&rdquo;fill_parent&rdquo;<br />
			android:gravity=&rdquo;center_horizontal&rdquo;<br />
			&gt;<br />
			&lt;TextView<br />
			android:layout_width=&rdquo;fill_parent&rdquo;<br />
			android:layout_height=&rdquo;wrap_content&rdquo;<br />
			android:text=&rdquo;Cosa possiamo andare a vedere qu&iacute; vicino?&rdquo;<br />
			/&gt;<br />
			&lt;ListView id=&rdquo;@+id/lstInfo&rdquo;<br />
			android:layout_width=&rdquo;fill_parent&rdquo;<br />
			android:layout_height=&rdquo;wrap_content&rdquo;<br />
			/&gt;<br />
			&lt;WebView id=&rdquo;@+id/webPanoramio&rdquo;<br />
			android:layout_width=&rdquo;fill_parent&rdquo;<br />
			android:layout_height=&rdquo;fill_parent&rdquo;<br />
			/&gt;<br />
			&lt;/LinearLayout&gt;</font></p>
</blockquote>
<p style="text-align: justify; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">I widgets usati sono:</font></p>
<ul style="line-height: 2em; list-style-image: url(http://www.brainspace.it/wp-content/themes/brainspace-winter/images/bullet.gif); ">
<li style="text-align: justify; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">Una TextView: che utilizziamo per mostrare una piccola etichetta.</font></li>
<li style="text-align: justify; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">Una ListView: &eacute; il corrispettivo di una listbox di swing che utilizzeremo per aggiungere le informazioni riguardo la locazione. Alla ListView viene assegnato un identificativo&nbsp;<em>&ldquo;lstInfo&rdquo;</em>&nbsp;per poterla poi utilizzare nel codice sorgente. Avremmo potuto anche utilizzare una normale TextView, ma ci si stanca di usare sempre gli sessi componenti no?&nbsp;<img alt=";)" class="wp-smiley" src="http://www.brainspace.it/wp-includes/images/smilies/face-wink.png" /></font></li>
<li style="text-align: justify; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">Una WebView: questo widget fornisce un contenitore base per la navigazione sul web. Fornisce le funzioni base di un browser (fra cui anche l&rsquo;handling di script e la gestione della cronologia). Nel nostro caso lo utilizzeremo per visualizzare l&rsquo;immagine da Panoramio conoscendone l&rsquo;URL. A questo controllo associamo l&rsquo;ID&nbsp;<em>&ldquo;webPanoramio&rdquo;.</em></font></li>
</ul>
<p style="text-align: justify; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">Naturalmente se non stessimo semplicemente &ldquo;giocando&rdquo; il layout andrebbe studiato in modo pi&amp;&ugrave;acute; accurato, ma per i nostri scopi pu&oacute; gi&aacute; andare bene cos&iacute;. Direi quindi che possiamo passare alla parte divertente.</font></p>
<h3 style="font-weight: normal; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 24px; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif"><br />
		</font></h3>
<h3 style="font-weight: normal; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 24px; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">Sorgente Java</font></h3>
<p><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">Apriamo il file sorgente (nel mio caso&nbsp;<strong>SecondAndroidExperimentActivity.java</strong>&nbsp;nella cartella dei sorgenti) ed iniziamo con gli import delle classi che andremo ad utilizzare:</font></p>
<blockquote style="overflow-x: auto; overflow-y: auto; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); ">
<p><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">import java.io.BufferedReader;<br />
			import java.io.IOException;<br />
			import java.io.InputStreamReader;<br />
			import java.net.MalformedURLException;<br />
			import java.net.URL;<br />
			import java.net.URLConnection;<br />
			import java.util.List;</font></p>
<p><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">import android.app.Activity;<br />
			import android.content.Context;<br />
			import android.location.Location;<br />
			import android.location.LocationManager;<br />
			import android.location.LocationProvider;<br />
			import android.os.Bundle;<br />
			import android.webkit.WebView;<br />
			import android.widget.ArrayAdapter;<br />
			import android.widget.ListView;</font></p>
</blockquote>
<p style="text-align: justify; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">Fin qu&iacute; direi che non c&rsquo;&eacute; un granch&eacute; da dire. Ora dichiariamo una nuova classe<strong>SecondAndroidExperimentActivity&nbsp;</strong>che estenda un&rsquo;<strong>Activity</strong>, ridefinisca il metodo<em><strong>OnCreate</strong></em>&nbsp;ed assegniamole il layout che abbiamo definito precedentemente (in realt&aacute; tutto ci&oacute; &eacute; fatto automaticamente dal plugin Android per Eclipse):</font></p>
<blockquote style="overflow-x: auto; overflow-y: auto; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); ">
<p style="text-align: justify; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">public class SecondAndroidExperimentActivity extends Activity {</font></p>
<p><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">/** Invocato alla creazione dell&rsquo;Activity. */<br />
			public void onCreate(Bundle icicle) {<br />
			super.onCreate(icicle);</font></p>
<p><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">// Imposta il layout dell&rsquo;activity<br />
			setContentView(R.layout.main);</font></p>
</blockquote>
<p style="text-align: justify; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">Bene, ora dobbiamo capire come possiamo interrogare il primo dispositivo di locazione disponibile nel device. Per fare questo innanzitutto dobbiamo procurarci un handle al gestore dei servizi di locazione del sistema. Android, infatti, mette a disposizione diversi servizi di sestema con cui &eacute; possibile interagire tramite i rispettivi gestori. tali servizi sono:</font></p>
<p style="text-align: justify; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif"><br />
		</font></p>
<ul style="line-height: 2em; list-style-image: url(http://www.brainspace.it/wp-content/themes/brainspace-winter/images/bullet.gif); ">
<li style="text-align: justify; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">Window Service: Gestore della finestra top-level su cui poter collocare nuovi widgets. Il gestore restituito &eacute; di tipo&nbsp;<strong><a href="http://code.google.com/android/reference/android/view/ViewManager.html" style="text-decoration: none; font-weight: bold; ">ViewManager</a></strong>.</font></li>
<li style="text-align: justify; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">Inflate Service: Utile per gestire le risorse relative al layout nel Contex attuale. Il gestore restituito &eacute; di tipo&nbsp;<strong><a href="http://code.google.com/android/reference/android/view/ViewInflate.html" style="text-decoration: none; font-weight: bold; ">ViewInflate.</a></strong></font></li>
<li style="text-align: justify; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">Power Service: Servizio di gestione energetica. Il gestore restituito &eacute; di tipo<strong><a href="http://code.google.com/android/reference/android/os/PowerManager.html" style="text-decoration: none; font-weight: bold; ">PowerManager.</a></strong></font></li>
<li style="text-align: justify; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">Alarm Service: consente di gestire la pianificazione delle operazioni (ad esempio eseguire una applicazione ad un tempo prefissato). Il gestore restituito &eacute; di tipo<strong><a href="http://code.google.com/android/reference/android/app/AlarmManager.html" style="text-decoration: none; font-weight: bold; ">&nbsp;AlarmManager.</a></strong></font></li>
<li style="text-align: justify; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">Notification Service: Il servizio che si occupa di informare l&rsquo;utente sulle operazioni in background. Il gestore restituito &eacute; di tipo<strong><a href="http://code.google.com/android/reference/android/app/NotificationManager.html" style="text-decoration: none; font-weight: bold; ">&nbsp;NotificationManager.</a></strong></font></li>
<li style="text-align: justify; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">Keyguard Service: Servizio per il blocco/sblocco della tastiera. Il gestore restituito &eacute; di tipo&nbsp;<strong><a href="http://code.google.com/android/reference/android/app/KeyguardManager.html" style="text-decoration: none; font-weight: bold; ">KeyguardManager.</a></strong></font></li>
<li style="text-align: justify; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif"><em>Location Service: Servizio di gestione della locazione. Il gestore restituito &eacute; di tipo&nbsp;<strong><a href="http://code.google.com/android/reference/android/location/LocationManager.html" style="text-decoration: none; font-weight: bold; ">LocationManager.</a></strong>&nbsp;(&eacute; quello che andremo ad utilizzare noi!)</em></font></li>
</ul>
<p style="text-align: justify; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">Per accedere ad un servizio di sistema utilizziamo il metodo&nbsp;<em><strong>getSystemService</strong></em>fornito dalla classe&nbsp;<strong>Context,&nbsp;</strong>superclasse di<strong>&nbsp;Activity</strong>. Ottenuto l&rsquo;handler al servizio di sistema lo useremo per farci restituire la lista dei&nbsp;<em>Location Providers&nbsp;</em>disponibili. E&rsquo; utile sapere che i location providers sono dotati di diverse caratteristiche dette<strong>Criteria&nbsp;</strong>che li differenziano l&rsquo;uno dall&rsquo;altro in base, ad esempio, all&rsquo;hardware specifico richiesto (come nel caso dei GPS), o di accedere a servizi di locazione a pagamento o ancora in base alle risorse richieste (come, ad esempio, il consumo di carica della batteria).</font></p>
<blockquote style="overflow-x: auto; overflow-y: auto; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); ">
<p><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">// Ottinene l&rsquo;handle al Location Service del sistema<br />
			LocationManager location_manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);</font></p>
<p><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">// Ottiene la lista dei fornitori di servizi di locazione disponibili<br />
			List<locationprovider>&nbsp;providers = location_manager.getProviders();</locationprovider></font></p>
<p><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">// Se non ci sono servizi disponibili termina l&rsquo;esecuzione<br />
			if (providers.size() == 0)<br />
			return;</font></p>
</blockquote>
<p style="text-align: justify; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">Ora che abbiamo ottenuto la lista dei location provider, bisogna che ne selezioniamo uno (nel caso l&rsquo;applicazione sia poi eseguita nell&rsquo;emulatore, non &eacute; che abbiamo poi tutta questa gran scelta, &eacute; disponibile un solo location provider basato su hardware GPS &ldquo;fittizio&rdquo;). Per comodit&aacute; ci limiteremo a scorrere tutta la lista leggendo lo stato di ciascun provider tramite il metodo&nbsp;<em><strong>getProviderStatus</strong>;</em>&nbsp;non appena ne troviamo uno disponibile&nbsp;<em>(<strong>LocationProvide.AVAILABLE</strong></em>) interrompiamo la ricerca. Naturalmente nel caso non ne trovassimo nessuno disponibile, termineremmo l&rsquo;esecuzione.</font></p>
<blockquote style="overflow-x: auto; overflow-y: auto; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); ">
<p style="text-align: justify; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">LocationProvider used_provider = null;</font></p>
<p><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">// Cerca il primo provider di locazione dispobilile<br />
			// (in emulazione &eacute; rilevato solamente il servizio GPS)<br />
			for (LocationProvider provider : providers) {<br />
			if (location_manager.getProviderStatus(provider.getName()) == LocationProvider.AVAILABLE) {<br />
			used_provider = provider;<br />
			break;<br />
			}<br />
			}</font></p>
<p><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">// Se non c&rsquo;&eacute; neppure un provider disponibile termina l&rsquo;esecuzione<br />
			if (used_provider == null)<br />
			return;</font></p>
</blockquote>
<p><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">Ok, ora che abbiamo il nostro provider ci dobbiamo fare restituire le coordinate attuali.</font></p>
<blockquote style="overflow-x: auto; overflow-y: auto; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); ">
<p><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">// Ottiene un oggetto che rappresenta la locazione attuale del<br />
			// sipositivo<br />
			Location loc = location_manager.getCurrentLocation(used_provider<br />
			.getName());</font></p>
</blockquote>
<p style="text-align: justify; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">Una volta ottenute possiamo cominciare a visualizzare, se non altro, qualche informazione come il nome del provider utilizzato e le coordinate attuali. Tali informazioni vogliamo inserirle nel controllo ListView che abbiamo inserito nel layout. Per farlo dobbiamo assegnare un&nbsp;<strong>ListAdapter</strong>&nbsp;(od un adapter da esso derivato) alla lista; un&nbsp;<strong>ListAdapter</strong>&nbsp;non &eacute; altro che una classe che agisce da ponte fra la&nbsp;<strong>ListView</strong>&nbsp;ed i dati in essa rappresentati. Esistono svariati derivati di<strong>ListAdapter</strong>&nbsp;come, ad esempio:&nbsp;<strong>ActivityAdapter,</strong>&nbsp;<strong>CursorAdapter</strong>&nbsp;(uno dei pi&amp;&ugrave;acute; utili),&nbsp;<strong>BaseAdapter</strong>&nbsp;(da derivare per ottenere un adapter &ldquo;personalizzato&rdquo;), etc. Nel nostro caso utilizzeremo un&nbsp;<strong>ArrayAdapter&nbsp;</strong>che ci consente di associare alla&nbsp;<strong>ListView</strong>&nbsp;una collezione arbitraria di oggetti (nel nostro caso stringhe). Nella creazione del&nbsp;<strong>ArrayAdaper</strong>&nbsp;utilizzeremo una delle risorse di sistema messe a disposizione da Android, cio&eacute;&nbsp;<em><strong>android.R.layout.simple_list_item_1</strong></em>che definisce un semplice elemento di testo per la&nbsp;<strong>ListView.</strong></font></p>
<blockquote style="overflow-x: auto; overflow-y: auto; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); ">
<p><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">// Aggiunge alcune informazioni sulla locazione in una list view<br />
			String[] coords = new String[] {<br />
			&ldquo;Location provider: &rdquo; + used_provider.getName(),<br />
			&ldquo;Latitudine: &rdquo; + Double.toString(loc.getLatitude()),<br />
			&ldquo;Longitudine: &rdquo; + Double.toString(loc.getLongitude()) };</font></p>
<p><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">ListView lstInfo = (ListView) findViewById(R.id.lstInfo);<br />
			lstInfo.setAdapter(new ArrayAdapter&lt;String&gt;(this, android.R.layout.simple_list_item_1, coords));</font></p>
</blockquote>
<p style="text-align: justify; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">Ora, giusto perch&eacute; ci piace complicarci un po la vita utilizzeremo l&rsquo;api di Panoramio per recuperare una immagine con geotag il pi&amp;&ugrave;acute; possibile vicino alla posizione attuale del nostro dispositivo mobile. Panoramio, infatti, mette a disposizione una semplicissima API basata su request/response per consentire la ricerca di panorami. Tale sistema si basa su una richiesta tipo:</font></p>
<blockquote style="overflow-x: auto; overflow-y: auto; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); ">
<p style="text-align: justify; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">http://www.panoramio.com/map/get_panoramas.php?order=popularity&amp;set=public&amp;from=0&amp;to=20&amp;minx=-180&amp;miny=-90&amp;maxx=180&amp;maxy=90&amp;size=medium</font></p>
</blockquote>
<p style="text-align: justify; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">dove:</font></p>
<ul style="line-height: 2em; list-style-image: url(http://www.brainspace.it/wp-content/themes/brainspace-winter/images/bullet.gif); ">
<li style="text-align: justify; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif"><strong><em>order:</em></strong>&nbsp;definisce l&rsquo;ordinamento dei dati in risposta e pu&oacute; assumere i valori<em>popularity</em>&nbsp;(popolarit&aacute;) o&nbsp;<em>upload_date&nbsp;</em>(data di caricamento).</font></li>
<li style="text-align: justify; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif"><em><strong>set</strong>:</em>&nbsp;definisce l&rsquo;insieme in cui sar&aacute; eseguita la ricerca. Accetta come valori<em>public</em>&nbsp;(foto popolari) o&nbsp;<em>full</em>&nbsp;(tutte le foto).</font></li>
<li style="text-align: justify; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif"><strong><em>size:</em>&nbsp;dimensione dell&rsquo;immagine restituita. Accetta come valori:&nbsp;</strong><em>original, medium</em>&nbsp;(valore predefinito)<em>, small, thumbnail, square, mini_square.</em></font></li>
<li style="text-align: justify; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif"><em><strong>minx</strong>,&nbsp;<strong>miny</strong>,&nbsp;<strong>maxx</strong>,&nbsp;<strong>maxy:</strong></em>&nbsp;definiscono l&rsquo;area da cui prelevare le foto (longitudine e latitudine rispettivamente minima e massima).</font></li>
<li style="text-align: justify; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif"><strong><em>from, to</em>:</strong>&nbsp;numero di foto restituite. Il valore 0 (zero) rappresenta l&rsquo;ultima foto caricata su Panoramio. Il limite massimo di foto che si possono richiedere &eacute; 100.</font></li>
</ul>
<p style="text-align: justify; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">In base alla richiesta la risposta sar&aacute; un insieme di dati formattati usando&nbsp;<a href="http://www.json.org/" style="text-decoration: none; font-weight: bold; " target="_blank" title="home del progetto JSON">JSON</a>, del tipo:</font></p>
<blockquote style="overflow-x: auto; overflow-y: auto; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); ">
<p><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">{<br />
			&ldquo;count&rdquo;: 773840,&rdquo;photos&rdquo;: [<br />
			{<br />
			&quot;photo_id&quot;: 532693,<br />
			&quot;photo_title&quot;: &quot;Wheatfield in afternoon light&quot;,<br />
			&quot;photo_url&quot;: &quot;http://www.panoramio.com/photo/532693&quot;,<br />
			&quot;photo_file_url&quot;: &quot;http://static2.bareka.com/photos/medium/532693.jpg&quot;,<br />
			&quot;longitude&quot;: 11.280727,<br />
			&quot;latitude&quot;: 59.643198,<br />
			&quot;width&quot;: 500,<br />
			&quot;height&quot;: 333,<br />
			&quot;upload_date&quot;: &quot;22 January 2007&quot;,<br />
			&quot;owner_id&quot;: 39160,<br />
			&quot;owner_name&quot;: &quot;Snemann&quot;,<br />
			&quot;owner_url&quot;: &quot;http://www.panoramio.com/user/39160&quot;,<br />
			},<br />
			{<br />
			&quot;photo_id&quot;: 505229,<br />
			&quot;photo_title&quot;: &quot;Etangs pr&eacute;s de Dijon&quot;,<br />
			&quot;photo_url&quot;: &quot;http://www.panoramio.com/photo/505229&quot;,<br />
			&quot;photo_file_url&quot;: &quot;http://static2.bareka.com/photos/medium/505229.jpg&quot;,<br />
			&quot;longitude&quot;: 5.168552,<br />
			&quot;latitude&quot;: 47.312642,<br />
			&quot;width&quot;: 350,<br />
			&quot;height&quot;: 500,<br />
			&quot;upload_date&quot;: &quot;20 January 2007&quot;,<br />
			&quot;owner_id&quot;: 78506,<br />
			&quot;owner_name&quot;: &quot;Philippe Stoop&quot;,<br />
			&quot;owner_url&quot;: &quot;http://www.panoramio.com/user/78506&quot;<br />
			}, ...<br />
			]<br />
			}</font></p>
</blockquote>
<p style="text-align: justify; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">Il capo che a noi interessa &eacute; &ldquo;photo_file_url&rdquo;. Innanzitutto generiamo l&rsquo;URL di richiesta definendo un area quadrata di 2 gradi di lato con al centro le coordinate restituiteci dal LocationProvider; inoltre vogliamo che Panoramio ci restituisca una sola immagine (from=0,to=1) ridimentionata come thumbnail (size=thumbnail), inviamo una richiesta a Panoramio utilizzando tale URL e, quindi, leggiamo la risposta (chiunque abbai nozioni base della API Java per la gestione di URL trover&aacute; il tutto molto famigliare):</font></p>
<blockquote style="overflow-x: auto; overflow-y: auto; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); ">
<p style="text-align: justify; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">// Invia una richiesta a panoramio per ottenere una sola immagine<br />
			// compresa in un area<br />
			// quadrata di 2&times;2 gradi (di latitudine e longitudine) con al centro le<br />
			// coordinate<br />
			// attuali<br />
			String minx = Double.toString(loc.getLatitude() &ndash; 1.0);<br />
			String miny = Double.toString(loc.getLongitude() &ndash; 1.0);<br />
			String maxx = Double.toString(loc.getLatitude() + 1.0);<br />
			String maxy = Double.toString(loc.getLongitude() + 1.0);</font></p>
<p><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">try {<br />
			// crea un nuovo oggetto URL<br />
			URL panoramio_request_url = new URL(<br />
			&ldquo;http://www.panoramio.com/map/get_panoramas.php?order=popularity&amp;set=public&amp;from=0&amp;to=1&amp;minx=&rdquo;<br />
			+ minx<br />
			+ &ldquo;&amp;miny=&rdquo;<br />
			+ miny<br />
			+ &ldquo;&amp;maxx=&rdquo;<br />
			+ maxx<br />
			+ &ldquo;&amp;maxy=&rdquo; + maxy + &ldquo;&amp;size=thumbnail&rdquo;);</font></p>
<p><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">// Invia una richiesta a tale URL aprendo una connessione<br />
			URLConnection panoramio_connection = panoramio_request_url.openConnection();</font></p>
<p><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">// Crea un reader per leggere i dati di risposta alla richiesta precedente<br />
			BufferedReader reader = new BufferedReader(new InputStreamReader(panoramio_connection.getInputStream()));</font></p>
<p><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">String readed = null;<br />
			String read_line = null;</font></p>
<p><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">// Legge la risposta di panoramio<br />
			while ((read_line = reader.readLine()) != null) {<br />
			readed += read_line;<br />
			}</font></p>
</blockquote>
<p style="text-align: justify; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">Ora dobbiamo cercare la linea di risposta contenente l&rsquo;URL dell&rsquo;immagine (se Panoramio ne ha restituita una) ed estrarre tale indirizzo per poi caricarlo tramite il metodo loadURL nella nostra WebView. In alternativa avremmo dovuto ugualmente estrarre l&rsquo;url, per poi inviare una richiesta di download dell&rsquo;immagine ed, infine, caricarla in una ImageView (magari esiste anche una soluzione pi&amp;&ugrave;acute; comoda al problema, ma dovete essere clementi, sto ancora esplorando Android&nbsp;<img alt=";)" class="wp-smiley" src="http://www.brainspace.it/wp-includes/images/smilies/face-wink.png" />&nbsp;):</font></p>
<blockquote style="overflow-x: auto; overflow-y: auto; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(245, 245, 245); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(224, 224, 224); border-right-color: rgb(224, 224, 224); border-bottom-color: rgb(224, 224, 224); border-left-color: rgb(224, 224, 224); ">
<p style="text-align: justify; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">// Estrae l&rsquo;indirizzo URL dell&rsquo;immagine dalla risposta e la<br />
			// visualizza tramite una WebView<br />
			if (readed != null) {<br />
			int photo_url_start = readed.indexOf(&ldquo;\&rdquo;photo_file_url\&rdquo;: \&rdquo;&quot;);<br />
			int photo_url_end = readed.indexOf(&ldquo;\&rdquo;,&rdquo;, photo_url_start);<br />
			String photo_url = readed.substring(photo_url_start + 19, photo_url_end);</font></p>
<p><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">// Se &eacute; stata restituita almeno una foto viene visualizzata nella WebView<br />
			if (photo_url.length() &gt; 0) {<br />
			WebView webViewPanoramio = (WebView) findViewById(R.id.webPanoramio);<br />
			webViewPanoramio.loadUrl(photo_url);<br />
			}<br />
			}</font></p>
<p><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">} catch (MalformedURLException e) {<br />
			showAlert(&ldquo;Errore (URL Malformato)&rdquo;, e.getMessage(), &ldquo;Chiudi&rdquo;,<br />
			false);<br />
			} catch (IOException e) {<br />
			showAlert(&ldquo;Errore (Errore di I/O)&rdquo;, e.getMessage(), &ldquo;Chiudi&rdquo;, false);<br />
			}<br />
			}<br />
			}</font></p>
</blockquote>
<h3 style="font-weight: normal; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 24px; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">Eseguiamo il tutto</font></h3>
<p style="text-align: justify; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">Ora, come gi&aacute; visto nel tutorial precedente, creaimo un profilo di esecuzione per la nostra applicazione ed avviamola.</font></p>
<p style="text-align: justify; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">A questo punto dovremmo vedere una schermata simile a quella all&rsquo;inizio del tutorial solo che le coordinate saranno lat:0.0 long:0.0. Ogni volta al primo avvio dell&rsquo;applicazione dopo l&rsquo;avvio dell&rsquo;emulatore le coordinate restituite sono queste, ora per ottenre quelle di figura &eacute; necessario eseguire di nuovo l&rsquo;applicazione senza per&oacute; chiudere la finestra dell&rsquo;emultatore. Se qualcuno stesse pensando di chiedermi il perch&eacute; vi preannuncio gi&aacute; che non ne ho neanche la pi&amp;&ugrave;acute; pallida idea&nbsp;<img alt=":P" class="wp-smiley" src="http://www.brainspace.it/wp-includes/images/smilies/face-wink.png" /><br />
		Ad ogni moto se avete fatto tutto in modo corretto dovreste comunque vedere una thumbnail della foto pi&amp;&ugrave;acute; vicina alle coordinate del dispositivo nel controllo WebView.</font></p>
<p style="text-align: justify; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">Come nel primo tutorial anche in questo caso l&rsquo;inutilit&aacute; del&rsquo;applicazione ottenuta &eacute; evidente, per&oacute; io mi sono spinto oltre, rendendo l&rsquo;applicazione un servizio in background che ogni tot. secondi scarica il panorama pi&amp;&ugrave;acute; vicino al device e lo imposta come sfondo del desktop. Sfortunatamente finch&eacute; non disporr&oacute; di un vero device equipaggiato con android non avr&oacute; modo di provare il reale funzionamento, ma, se qualcuno fosse interessato, posso dare qualche &ldquo;dritta&rdquo; su come ottenre lo stesso risultato (o, se le richieste sono molte creare un terzo tutorial).</font></p>
<p><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif"><br />
		</font></p>
<h3 style="font-weight: normal; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 24px; "><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">Riferimenti</font></h3>
<ul style="line-height: 2em; list-style-image: url(http://www.brainspace.it/wp-content/themes/brainspace-winter/images/bullet.gif); ">
<li><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">Sono disponibili per il download i&nbsp;<a class="downloadlink" href="http://www.brainspace.it/downloads/second-android-experiment.tar.bz2" style="text-decoration: none; font-weight: bold; " title="Version - downloaded 0 times">Sorgenti Second Android Experiment (File progetto per Eclipse)</a></font></li>
</ul>
<p><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">I riferimenti per i materiali necessari per la realizzazione del progetto sono:</font></p>
<ul style="line-height: 2em; list-style-image: url(http://www.brainspace.it/wp-content/themes/brainspace-winter/images/bullet.gif); ">
<li><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">L&rsquo;SDK, il plugin per Eclipse e tutta al documentazione su Androi sono reperibili nella&nbsp;<a href="http://code.google.com/android/" style="text-decoration: none; font-weight: bold; " target="_blank" title="Pagina del progetto Android">pagina principale del progetto</a></font></li>
<li><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">L&rsquo;ambiente di sviluppo Eclipse &eacute; disponibile sul&nbsp;<a href="http://www.eclipse.org/" style="text-decoration: none; font-weight: bold; " target="_blank">sito del progetto</a></font></li>
<li><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif">Informazioni sulle API di Panoramio sono disponibili nell&rsquo;<a href="http://www.panoramio.com/api/" style="text-decoration: none; font-weight: bold; " target="_blank">apposita sezione del sito Panoramio.com</a></font></li>
</ul>
<p><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif"><br />
		</font></p>
<blockquote style="overflow-x: auto; overflow-y: auto; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; margin-top: 20px; margin-right: 30px; margin-bottom: 20px; margin-left: 30px; line-height: 1.8em; background-color: rgb(240, 240, 240); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(208, 208, 208); border-right-color: rgb(208, 208, 208); border-bottom-color: rgb(208, 208, 208); border-left-color: rgb(208, 208, 208); ">
<p><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif"><a name="cit1" title="cit1"></a>[&sup1;]&nbsp;<em>I&rsquo;ve seen things you people wouldn&rsquo;t believe. Attack ships on fire off the shoulder of Orion. I watched C-beams glitter in the dark near the Tannhauser gate. All those moments will be lost in time, like tears in rain. Time to die.</em><br />
			(Ho visto cose che voi persone non non potreste immaginarvi. Navi da combattimento in fiamme al largo dei bastioni di Orione&hellip; e ho visto i raggi C balenare nel buio vicino alle porte di Tannh&auml;user. E tutti quei momenti andranno perduti nel tempo come lacrime nella pioggia. &eacute; tempo di morire.)</font></p>
<p><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif"><em>Balde Runner, 1982</em></font></p>
<div><font class="Apple-style-span" color="#555555" face="'Trebuchet MS', 'Lucida Grande', Verdana, Georgia, sans-serif"><em><br />
			</em></font></div>
</blockquote>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.brainspace.it/?feed=rss2&amp;p=18</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>I, Android</title>
		<link>http://www.brainspace.it/?p=17</link>
		<comments>http://www.brainspace.it/?p=17#comments</comments>
		<pubDate>Fri, 16 Nov 2007 15:55:29 +0000</pubDate>
		<dc:creator>invernomuto</dc:creator>
				<category><![CDATA[Articoli, HowTo, Guide]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Progetti]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mobile]]></category>

		<guid isPermaLink="false">http://www.brainspace.it/?p=17</guid>
		<description><![CDATA[Google Android: In questi giorni non si parla d&#8217;altro! Ne parlano siti e blog che si occupano di IT, di telefonia, di programmazione, di linux; ne parlano i telegiornali, i giornali, gli anziani al parco, le massaie al mercato&#8230; (ok, ok, ho decisamente esagerato ;-))

Essendo me stesso la persona più curiosa che conosco (almeno fin [...]]]></description>
			<content:encoded><![CDATA[<p align="justify"><strong>Google Android: </strong>In questi giorni non si parla d&#8217;altro! Ne parlano siti e blog che si occupano di IT, di telefonia, di programmazione, di linux; ne parlano i telegiornali, i giornali, gli anziani al parco, le massaie al mercato&#8230; (ok, ok, ho decisamente esagerato ;-))</p>
<p align="center"><a href="http://www.brainspace.it/wp-content/gallery/i_android/run.png" class="thickbox" title="run.png"><img src="http://www.brainspace.it/wp-content/gallery/i_android/thumbs/thumbs_run.png" alt="run.png" border="1" /></a></p>
<p align="justify">Essendo me stesso la persona più curiosa che conosco (almeno fin da quando ero piccolo) potevo forse non provarlo?  Naturalmente la risposta è NO (anche perché sennò non sarei qui a scrivere); mi sono armato di SDK prelevato dalla <a href="http://code.google.com/android/" target="_blank">pagina del progetto android</a>, ho installato il plugin per Eclipse <a href="http://code.google.com/android/intro/installing.html#installingplugin" target="_blank">seguendo le apposite istruzioni</a>, mi sono armato di caffè a volontà ed ho cominciato a fare conoscenza con questo misterioso androide&#8230;<a href="http://code.google.com/android/intro/installing.html#installingplugin" target="_blank"><br />
</a></p>
<p align="justify"><a href="http://code.google.com/android/intro/installing.html#installingplugin" target="_blank"> </a></p>
<p><span id="more-17"></span></p>
<h3>Creazione di un progetto Android</h3>
<p align="justify">Se c&#8217;è una cosa per cui i ragazzi di Google sono famosi, si sa, è quella di fare le cose fatte bene. Il rilascio di un plugin (già di buona fattura) per Eclipse in concomitanza al rilascio della prima versione del Software Development Kit, consente di ridurre al minimo il tempo perso nella preparazione dell&#8217;ambiente di sviluppo, concentrandosi fin da subito sullo studio del framework e la scrittura di codice. Infatti, dopo aver seguito la <a href="http://code.google.com/android/intro/installing.html">guida per l&#8217;installazione dell&#8217;SDK e del plugin Eclipse</a>, è sufficiente creare un nuovo progetto, nella finestra di selezione della procedura guidata selezionare &#8220;Android Project&#8221; e compilare il semplice form:</p>
<p align="center"><img src="http://www.brainspace.it/wp-content/gallery/i_android/new_project.png" alt="new_project .png" title="new_project .png" /></p>
<p align="justify"> Un progetto Android è diviso sostanzialmente in due parti: i sorgenti (contenuti nella cartella <em>src</em>) che contengono il codice Java dell&#8217;applicazione e le risorse (cartella res) che sono, ad esempio: il file xml che descrive il layout dei widget nello schermo, le icone ed immagini utilizzate, ed altro.<br />
Il nuovo progetto per Android contene l&#8217;Activity principale che non è altro che un oggetto rappresentante una singola schermata di una applicazione e contenente uno o più View (i controlli o widgets derivano tutti da una classe View) e i files di risorse necessari per una applicazione di base.</p>
<p align="center"><img src="http://www.brainspace.it/wp-content/gallery/i_android/project_structure.png" alt="project_structure.png" title="project_structure.png" /></p>
<p align="center">&nbsp;</p>
<h3>Armatura dell&#8217;androide: Disegnare il Layout</h3>
<p align="justify">Come detto in precedenza il layout dello schermo dell&#8217;applicazione è descritto da un documento XML contenuto nella cartella &#8220;layout&#8221;  contenuta in &#8220;res&#8221;. Nel caso della nostra applicazione il file di layout si chiama &#8220;main.xml&#8221; e contiene il codice seguente:</p>
<blockquote><p> &lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;utf-8&#8243;?&gt;<br />
&lt;LinearLayout xmlns:android=&#8221;http://schemas.android.com/apk/res/android&#8221;<br />
android:orientation=&#8221;vertical&#8221;<br />
android:layout_width=&#8221;fill_parent&#8221;<br />
android:layout_height=&#8221;fill_parent&#8221;<br />
android:gravity=&#8221;center_horizontal&#8221;<br />
&gt;<br />
&lt;TextView id=&#8221;@+id/txtHello&#8221;<br />
android:layout_width=&#8221;fill_parent&#8221;<br />
android:layout_height=&#8221;wrap_content&#8221;<br />
android:text=&#8221;"<br />
/&gt;</p>
<p>&lt;AnalogClock<br />
android:layout_width=&#8221;fill_parent&#8221;<br />
android:layout_height=&#8221;wrap_content&#8221;<br />
/&gt;</p>
<p>&lt;Button id=&#8221;@+id/btnHello&#8221;<br />
android:layout_width=&#8221;wrap_content&#8221;<br />
android:layout_height=&#8221;wrap_content&#8221;<br />
android:text=&#8221;Hello me!&#8221;<br />
/&gt;</p>
<p>&lt;/LinearLayout&gt;</p></blockquote>
<p align="justify">Innanzitutto è creato un oggetto &#8220;LinearLayout&#8221; che definisce una disposizione lineare in orizzontale o in verticale per i widget contenuti (una sorta di corrispettivo di un JPanel swing a cui è applicato un box Layout con orientazione verticale):</p>
<blockquote><p>&lt;LinearLayout xmlns:android=&#8221;http://schemas.android.com/apk/res/android&#8221;<br />
android:orientation=&#8221;vertical&#8221;<br />
android:layout_width=&#8221;fill_parent&#8221;<br />
android:layout_height=&#8221;fill_parent&#8221;<br />
android:gravity=&#8221;center_horizontal&#8221;<br />
&gt;</p></blockquote>
<p align="justify">In questo caso è creato un layout orizzontale  definito dall&#8217;attributo <strong>orientation=&#8221;vertical&#8221;</strong>, inoltre si specifica che il layout occuperà l&#8217;intero schermo definendo le proprieta della larghezza: <strong>layout_width=&#8221;fill_parent&#8221;</strong> ed altezza: <strong>layout_height</strong><strong>=&#8221;fill_parent&#8221;</strong> perché occupino tutto lo spazio disponibile nel componente che li ospita (in questo caso lo schermo intero). L&#8217;ultimo attributo <strong>gravity=&#8221;center_horizzontal&#8221; </strong>definisce l&#8217;allineamento al centro per i controlli contenuti nel layout.</p>
<p align="justify">In seguito alcuni widget sono aggiunti al layout, in particolare:</p>
<blockquote><p>&lt;TextView id=&#8221;@+id/txtHello&#8221;<br />
android:layout_width=&#8221;fill_parent&#8221;<br />
android:layout_height=&#8221;wrap_content&#8221;<br />
android:text=&#8221;"<br />
/&gt;</p></blockquote>
<p align="justify">Aggiunge come primo elemento una label di testo larga come tutto il layout che la ospita e con una altezza che si adatta automaticamente al contenuto della label. Inoltre viene inizializzata con un testo vuoto. Il secondo componente è un orologio analogico (so benissimo che in una applicazione &#8220;Hello World&#8221; solitamente l&#8217;orologio non ci andrebbe&#8230;però mi piaceva troppo!):</p>
<blockquote>
<p align="justify">&lt;AnalogClock<br />
android:layout_width=&#8221;fill_parent&#8221;<br />
android:layout_height=&#8221;wrap_content&#8221;<br />
/&gt;</p></blockquote>
<p align="justify">anche in questo caso largo come tutto il layout che lo ospita e con una altezza che si adatta automaticamente al contenuto. Infine un bottone che, guarda caso, servirà per visualizzare una stringa di saluto sulla TextView precedentemente aggiunta:</p>
<blockquote>
<p align="justify">&lt;Button id=&#8221;@+id/btnHello&#8221;<br />
android:layout_width=&#8221;wrap_content&#8221;<br />
android:layout_height=&#8221;wrap_content&#8221;<br />
android:text=&#8221;Hello me !&#8221;<br />
/&gt;</p></blockquote>
<p align="justify">Entrambe le dimensioni del bottone sono adattate al contenuto, cioè la scritta &#8220;Hello Me !&#8221; e, per l&#8217;attributo <strong>gravity </strong>definito nel layout, sarà allineato al centro dello schermo.<br />
E&#8217; interessante notare il fatto che sia per TextView che per Button è definito l&#8217;attributo <strong>id</strong>, questo serve per assegnare un nome identificativo al controllo (nel nostro caso la TextView è chiamata <em>txtHello</em> ed il bottone <em>btnHello</em>&#8230;fantasioso eh!?); tale attributo sarà utilizzato nel sorgente Java per riconoscere i componenti ed interagirvi.<br />
Terminata la definizione del layout ci possiamo concentrare sulla scrittura del codice.</p>
<p align="justify">&nbsp;</p>
<h3>Intelligenza artificale: Il Codice Sorgente</h3>
<p align="justify">Il codice sorgente è costituito principalmente da una classe <strong>AndroidExperimentActivity</strong> che estende una <strong>Activity</strong> (quindi una singola schermata). Una <strong>Activity</strong> implementa diversi metodi corrispondenti ad eventi cui è soggetta; fra i più interessanti ci sono sicuramente:</p>
<p align="justify">&nbsp;</p>
<ul>
<li><strong>onCreate:</strong> invocato al momento della creazione dell&#8217;activity e che viene utilizzato per la sua inizializzazione come vedremo in seguito.</li>
<li><strong>onPause:</strong> è invocato quando l&#8217;utente abbandona l&#8217;activity senza però uscirne. E&#8217; utile allo scopo di salvare le informazioni si stato dell&#8217;activity per garantirne la persistenza.</li>
<li><strong>onDestroy:</strong> è invocato prima della distruzione dell&#8217;activity edè utile per la pulizia dei dati e della memoria.</li>
</ul>
<p align="justify">Ci sono moltissimi altri metodi come onStart, onStop, onFreeze, etc&#8230;, per la cui spiegazione rimando al <a href="http://code.google.com/android/reference/android/app/Activity.html" title="Android API Reference" target="_blank">referenece di android per le activity.</a></p>
<p align="justify">Nel nostro caso reimplementiamo il metodo <strong>onCreate </strong>all&#8217;interno del quale inizializziamo i componenti. Il codice sorgente è:</p>
<blockquote><p>package org.brainspace.android;</p>
<p>import android.app.Activity;<br />
import android.os.Bundle;<br />
import android.view.View;<br />
import android.widget.Button;<br />
import android.widget.TextView;</p>
<p>public class AndroidExperimentActivity extends Activity {<br />
/** Called when the activity is first created. */<br />
@Override<br />
public void onCreate(Bundle icicle) {<br />
super.onCreate(icicle);<br />
setContentView(R.layout.main);</p>
<p>final TextView txtHello = (TextView) findViewById(R.id.txtHello);<br />
final Button btnHello = (Button) findViewById(R.id.btnHello);</p>
<p>btnHello.setOnClickListener(new Button.OnClickListener() {<br />
public void onClick(View v) {<br />
txtHello.setText(&#8220;hello World, I&#8217;m Android!&#8221;);<br />
}<br />
});</p>
<p>}<br />
}</p></blockquote>
<p align="justify">Innanzitutto, dopo la definizione del package, sono importate le classi che andremo ad usare in seguito, poi, la dichiarazione della classe <strong>AndroidExperimentActivity</strong> e quindi l&#8217;overriding del metodo <strong>onCreate. </strong>Dopo aver invocato il metodo onCreate della classe genitore siamo passati ad applicare il layout creato precedentemente, tramite l&#8217;invocazione del metodo:</p>
<blockquote>
<p align="justify"> setContentView(R.layout.main);</p>
</blockquote>
<p align="justify">La classe R è creata dal plugin Eclipse per indicizzare il contenuto della cartella delle risorse. Ogni volta che modifichiamo una o più risorse la classe R.java viene aggiornata automaticamente dal plugin Eclipse. Nel nostro caso il contenuto di R.java è:</p>
<blockquote><p>/* AUTO-GENERATED FILE.  DO NOT MODIFY.<br />
*<br />
* This class was automatically generated by the<br />
* aapt tool from the resource data it found.  It<br />
* should not be modified by hand.<br />
*/</p>
<p>package org.brainspace.android;</p>
<p>public final class R {<br />
public static final class attr {<br />
}<br />
public static final class drawable {<br />
public static final int icon=0&#215;7f020000;<br />
}<br />
public static final class id {<br />
public static final int btnHello=0&#215;7f050001;<br />
public static final int txtHello=0&#215;7f050000;<br />
}<br />
public static final class layout {<br />
public static final int main=0&#215;7f030000;<br />
}<br />
public static final class string {<br />
public static final int app_name=0&#215;7f040000;<br />
}<br />
}</p></blockquote>
<p align="justify">&nbsp;</p>
<p align="justify"> In questo caso restituisce l&#8217;id del layout definito nel file main.xml, layout che viene caricato come contenuto principale dell&#8217;activity.<br />
In seguito vengono create due istanze di oggetti TextView e Button ed inizializzate con le informazioni contenute sempre nel file main.xml recuperate grazie all&#8217;id che gli abbiamo assegnato:</p>
<blockquote>
<p align="justify">final TextView txtHello = (TextView) findViewById(R.id.txtHello);<br />
final Button btnHello = (Button) findViewById(R.id.btnHello);</p></blockquote>
<p align="justify">A questo punto è necessario assegnare un click listener al bottone in modo che alla pressione del bottone la label visualizzi il messaggio di saluto. Similmente a <em>swing </em>è necessario creare una istanza di oggetto <strong>OnClickListener() </strong>che implementi il metodo <strong>onClick()</strong> facendogli impostrare la proprietà <strong>text</strong> dell&#8217;oggetto <strong>txtHello</strong>:</p>
<blockquote>
<p align="justify">        btnHello.setOnClickListener(new Button.OnClickListener() {<br />
public void onClick(View v) {<br />
txtHello.setText(&#8220;hello World, I&#8217;m Android!&#8221;);<br />
}<br />
});<strong> </strong></p></blockquote>
<p align="justify">&nbsp;</p>
<h3>Energia: Eseguire il progetto</h3>
<p align="justify">Ora non ci resta altro da fare se non testare la nostra Utilissima (proprio con la U maiuscola&#8230; <img src='http://www.brainspace.it/wp-includes/images/smilies/face-wink.png' alt=';-)' class='wp-smiley' /> )applicazione, perciò apriamo la finestra di esecuzione (<em>Esegui-&gt;Esegui&#8230;</em>) e creiamo una nuova configurazione per Android (Click con il tasto destro su <em>Android Application-&gt;Nuovo</em>) e riempiamo i campi come in figura:</p>
<p align="justify">Fatto ciò clickiamo su <em>Esegui </em>e godiamoci il nostro fantastico software (se non altro il fatto che ci sia l&#8217;orologio non lo rende proprio completamente inutile&#8230;no? <img src='http://www.brainspace.it/wp-includes/images/smilies/face-wink.png' alt=';-)' class='wp-smiley' /> ).</p>
<h3>Riferimenti</h3>
<ul>
<li>Sono disponibili per il download i [Download not found]</li>
</ul>
<p>I riferimenti per i materiali necessari per la realizzazione del progetto sono:</p>
<ul>
<li>L&#8217;SDK, il plugin per Eclipse e tutta al documentazione su Androi sono reperibili nella <a href="http://code.google.com/android/" title="Pagina del progetto Android" target="_blank">pagina principale del progetto</a></li>
<li>L&#8217;ambiente di sviluppo Eclipse è disponibile sul <a href="http://www.eclipse.org/" target="_blank">sito del progetto</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.brainspace.it/?feed=rss2&amp;p=17</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Il mia prima settimana da Gnomo Umano</title>
		<link>http://www.brainspace.it/?p=16</link>
		<comments>http://www.brainspace.it/?p=16#comments</comments>
		<pubDate>Fri, 16 Nov 2007 09:41:12 +0000</pubDate>
		<dc:creator>invernomuto</dc:creator>
				<category><![CDATA[Articoli, HowTo, Guide]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[compiz]]></category>
		<category><![CDATA[gnome]]></category>
		<category><![CDATA[kde]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.brainspace.it/?p=16</guid>
		<description><![CDATA[&#160;
 Eccoci qua: dopo anni di assoluta fedeltà al  draghetto Konqui, in preda al più nero sconforto (e probabilmente anche  all’alcool…sinceramente nonricordo…che sia un sintomo ;)) mi sono trasformato  in un Gnomo (per la precisione uno gnomo 2.20.1) Umano (umano al 7.10).
 
Vuoi  un po&#8217; perchè mi piace tantissimo lo stile [...]]]></description>
			<content:encoded><![CDATA[<p align="justify">&nbsp;</p>
<p> Eccoci qua: dopo anni di assoluta fedeltà al  draghetto Konqui, in preda al più nero sconforto (e probabilmente anche  all’alcool…sinceramente nonricordo…che sia un sintomo ;)) mi sono trasformato  in un <em>Gnomo</em> (per la precisione uno gnomo 2.20.1) <em>Umano</em> (umano al 7.10).</p>
<p align="center"><a href="http://www.brainspace.it/wp-content/gallery/gnome/desktop.png" class="thickbox" title="desktop.png"><img src="http://www.brainspace.it/wp-content/gallery/gnome/thumbs/thumbs_desktop.png" alt="Click per vadere l'immagine ingrandita" border="1" /></a><a href="http://www.brainspace.it/wp-content/gallery/gnome/desktop.png" class="thickbox" title="desktop.png"> </a></p>
<p align="justify">Vuoi  un po&#8217; perchè mi piace tantissimo lo stile “gommoso” ed estremamente pulito di clearlooks unito alle tango icons<em>, </em>vuoi perchè, dopo anni di fedeltà incondizionata  ad Arch Linux, quest’ultima ha cominciato a perdere colpi sui miei PC (mi è capitato più di una vota ultimamente di avere un sistema “inusabile” dopo un  aggiornamento, oppure altre piccole sciocchezze che “minano” la mia  tranquillità quotidiana), molto più probabilmente per ingannare la spasmodica attesa di KDE 4 (anche se devo dire che sono piuttosto deluso da come procede il lavoro “estetico” appunto su KDE 4: è vero che, poi, come sempre uno potrà cambiare: stile, decorazioni delle finestre, colori, icone, etc…, ma è altrettanto vero che nutritivo grandi aspettative per oxigen, sia per lo stile che per le icone, ed entrambi mi stanno deludendo molto).</p>
<p align="justify"><span id="more-16"></span>Sta di fatto che lo scorso lunedì quando, nonostante la mia Arch sapesse benissimo  che avevo delle scadenze al lavoro, ha deciso di andare prematuramente in ferie, ho colto l&#8217;occasione per portare una ventata di aria nuova nel mio hard disk. Il primo passo è stato famigliarizzare con gli strumenti per amministrare Ubuntu e per personalizzare il dekstop; il secondo cercare i corrispettivi per Gnome delle applicazioni che ero solito usare sotto KDE.</p>
<p align="justify">&nbsp;</p>
<h3>Gestione e personalizzazione</h3>
<p align="justify">Grazie ad una ampissima raccolta di strumenti grafici, l&#8217;amministrazione di Ubuntu risulta estremamente semplice come, del resto, anche la personalizzazione di Gnome. Sono rimasto particolarmente sorpreso da alcune &#8220;chicche, come, ad esempio, il fatto di essere stato avvisato che il server grafico era cambiato quando ho installato il pacchetto Xgl (indispensabile per avere compiz funzionante sulla orrenda scheda video che ho a disposizione su questo PC, una Ati Radeon X1650, oppure del rilevamento e dell&#8217;installazione degli opportuni codecs video/audio alla prima apertura di Totem.</p>
<p align="center"><a href="http://www.brainspace.it/wp-content/gallery/gnome/compiz2.png" class="thickbox" title="compiz2.png"><img src="http://www.brainspace.it/wp-content/gallery/gnome/thumbs/thumbs_compiz2.png" alt="Click per vedere l'immagine ingrandita" border="1" /></a></p>
<p align="center"> <a href="http://www.brainspace.it/wp-content/gallery/gnome/compiz2.png" class="thickbox" title="compiz2.png"> </a></p>
<p align="justify">Una semplice finestrella denominata &#8220;Aspetto&#8221; la personalizzazione del desktop e l&#8217;abilitazione (estremamente semplice ed immediata) di Compiz fusion, il quale trova il suo compagno ideale in Avant Window Navigator (dopo averlo provato ho finalmente capito perché <a href="http://pollycoke.wordpress.com/" title="Non conosci Felipe??">Felipe</a> lo ha definito addirittura &#8220;<a href="http://pollycoke.wordpress.com/2007/06/19/avant-window-navigator-a-nuovi-livelli-di-fanta-porno/" title="Perchè pornografia..." target="_blank">pornografico</a>&#8220;).</p>
<p align="center"> <a href="http://www.brainspace.it/wp-content/gallery/gnome/compiz1.png" class="thickbox" title="compiz1.png"><img src="http://www.brainspace.it/wp-content/gallery/gnome/thumbs/thumbs_compiz1.png" alt="Click per vedere l'immagine ingrandita" border="1" /></a></p>
<p align="center">&nbsp;</p>
<h3></h3>
<h3>Applicazioni</h3>
<p align="justify">La scelta di applicazioni per GNU/Linux, si sa, può diventare un&#8217;impresa epica, specie poi utilizzando Ubuntu la quale offre una scelta di pacchetti enorme, perciò mi sono concentrato da subito su <em>nomi noti </em>nel mondo Gnome. Naturalmente, essendo abituato a KDE, no cercato applicazioni che in qualche modo mi ricordassero quelle che sono solito usare con il draghetto; questa ricerca ha volte ho avuto piacevoli sorprese altre delle mezze delusioni. Dopo ore passate a scaricare ed installare un mezzo trilione di pacchetti, nel mio hard disk hanno trovato riparlo questi software.</p>
<p align="justify">&nbsp;</p>
<h5>Strumenti di sviluppo</h5>
<p align="justify">E&#8217; strano iniziare la panoramica delle applicazioni con cui mi sono trovato subito a mio agio proprio dagli strumenti di sviluppo, però, essendo un programmatore, se dopo l&#8217;installazione di una distro non mi concentro immediatamente sugli strumenti di sviluppo rischio grafi manifestazioni psicosomatiche associate ad un senso profondo di depressione. Innanzitutto non potevo non installare l&#8217;SDK Java 6 ufficiale di Sun completo di documentazione, installato comodamente con <em>synaptic</em>, subito seguito da Netbeans (anche se di quest&#8217;ultimo, anziché installare la versione 5.5 presente nei repo di Ubuntu, ho preferito la versione 6.0 beta 2 direttamente scaricata dal sito) ed Eclipse. Fin qui, però, nulla di nuovo, ora dovevo cercare un sostituto</p>
<p align="center"> <a href="http://www.brainspace.it/wp-content/gallery/gnome/sviluppo.png" class="thickbox" title="Strumenti di sviluppo"><img src="http://www.brainspace.it/wp-content/gallery/gnome/thumbs/thumbs_sviluppo.png" alt="Click per vedere l'immagine ingrandita" border="1" /></a><a href="http://www.brainspace.it/wp-content/gallery/gnome/sviluppo.png" class="thickbox" title="Strumenti di sviluppo"> </a></p>
<p align="justify">valido per KDevelop, impresa più facile a dirsi che a farsi! Naturalemte sono andato diretto su Anjuta, sapendo che dalla versione 2 era stato integrato il supporto Glade ed erano fatti grossi passi avanti. Bhe,  la prima sopresa è stata la velocità: rispetto alla versione precedente che avevo provato (la 1.8 o la 1.9, non ricordo bene) è decisamente più veloce nelle varie operazioni ed è ben fatta la pagina di creazione di un nuovo progetto (anche se fa tanto Visual Studio 6), in compenso l&#8217;ho trovato un po povero di funzionalità e, inoltre, ogni volta che tento di aprire un file glade con il designer integrato, Anjuta va inspiegabilmente in crash. Ho porvato anche a giocicchiare un po con Glade , che avevo già avuto occasione di usare per lavoro e, come la volta precedente, non mi ha particolarmente esaltato, non tanto per le funzioni di disegno del layout ma per la creazione del codice.</p>
<p align="justify">&nbsp;</p>
<h5>Audio</h5>
<p align="justify">Niente di meglio di un po&#8217; di musica davanti al PC, ed in questo caso sono stato fortunato: Rhythmbox. Un ottimo player audio con gestione della collezione personale e con tanti plugins che lo rendono molto completo , sia per l&#8217;utilizzo di servizi on-line (Last.fm, Podcast, Radio, Jamendo, etc&#8230;, sia per la gestione di lettori mp3 portatili (siano essi iPod o di altro genere).</p>
<p align="center"><a href="http://www.brainspace.it/wp-content/gallery/gnome/audio.png" class="thickbox" title="audio.png"><img src="http://www.brainspace.it/wp-content/gallery/gnome/thumbs/thumbs_audio.png" alt="Click per vedere l'immagine ingrandita" border="1" /></a><a href="http://www.brainspace.it/wp-content/gallery/gnome/audio.png" class="thickbox" title="audio.png"> </a></p>
<p align="justify">Una cosa che mi ha mandato in visibilio è la notifica dei cambiamenti al volume dell&#8217;audio tramite i tasti multimediali sulla tastiera, che avviene tramite un box in semitrasparenza sulla parte bassa dello schermo con una barra ed un&#8217;icona che indicano lo stato del volume.</p>
<p align="justify">&nbsp;</p>
<h4>Internet</h4>
<p align="justify">Bhe, per quanto riguarda navigazione web e posta elettronica c&#8217;è poco da dire: Firefox &amp; Thunderbird. Per sfizio però ho provato anche: Epiphany, un buon browser abbastanza simile a firefox e Evolution, che ho trovato eccessivamente &#8220;pesante&#8221; rispetto a thunderbird. Per quanto riguarda il messaggistica istantanea sono andato sul buon aMSN, mentre pidgin non l&#8217;ho neppure provato tanto mi disgusta ancora dai tempi in cui si chiamava Gaim e, comunque, il buon vecchio Kopete non lo batte nessuno! Per quanto riguarda il P2P, oltre ad aMule (quasi una scelto obbligata visto i concorrenti come xMule o lMule), sono stato sorpreso da Deluge: ottimo client BitTorrent, leggero, stabile e con una interfaccia semplice ed immediata (tutte caratteristiche che mancano a KTorrent). Per il VoIP non mi sono complicato più di tanto la vita ed ho installato Skype.</p>
<p align="justify">&nbsp;</p>
<h4>Ripping e Masterizzazione</h4>
<p align="justify">Fermo restando che non credo esista per GNU/Linux un software migliore di K3B per la masterizzazione dei CD/DVD, il ripping audio e chi più ne ha più ne metta, ho comunque trovato Brasero un buon prodotto, con una interfaccia minimale ma comunque utile a svolgere i compiti più comuni (creare dischi dati e audio, copiare dischi o masterizzare immagini). Per quanto riguarda il rippring di dischi audio mi sono trovato molto bene sia con Serpentine che Sound Juicer.</p>
<p align="center"><a href="http://www.brainspace.it/wp-content/gallery/gnome/cdburning.png" class="thickbox" title="cdburning.png"><img src="http://www.brainspace.it/wp-content/gallery/gnome/thumbs/thumbs_cdburning.png" alt="Click per vedere l'immagine ingrandita" border="1" /></a></p>
<p align="center">&nbsp;</p>
<h4>Grafica</h4>
<p align="justify">Gimp, Inkscape e Blender! Gimp, Inkscape e Blender! Gimp, Inkscape e Blender! Gimp, Inkscape e Blender! Gimp, Inkscape e Blender! Gimp, Inkscape e Blender! Onestamente non c&#8217;è molto altro da aggiungere, se non una menzione particolare al visualizzatore di immagini F-Spot che ho trovato un po lentino in apertura (considerando l&#8217;interfaccia minimale) ma poi veloce e comodo durante la navigazione delle immagini.</p>
<p align="justify">&nbsp;</p>
<h3>Conclusioni</h3>
<p align="justify"><em>Di tempo a &#8220;giochicchiare&#8221; ne ho speso parecchio e molto altro avrei da scrivere sull&#8217;editing video, sugli strumenti per l&#8217;ufficio, sui giochi, sugli strumenti di monitoraggio del sistema, su&#8230;, però preferisco chiudere qui per dedicarmi ancora all&#8217;esplorazione della distro e di gnome. Nel complesso ho trovato Ububntu un buon prodotto con repository ricchissimi di pacchetti in grado di soddisfare quasi tutte le esigenze sia in ambito professionale, sia per l&#8217;uso &#8220;da casa&#8221;, anche se non sono mancate le delusioni, come, ad esempio, il fatto che tracker, nonostante le abbia provate tutte (seguendo howto sulla configurazione e tentando soluzioni proposte nei più svariati forums sul web) non ne voglia sapere assolutamente di indicizzarmi alcunché. Altra nota dolente è la velocità di avvio che, nonostante abbia disattivato i demoni che non desideravo fossero caricati all&#8217;avvio, rimane comunque piuttosto lento. Gnome è decisamente cresciuto molto e molto bene rispetto alle ultime volte in cui mi ero preso la briga di installarlo e provarlo, è esteticamente molto appagante (anche se un po troppo Mac in alcuni aspetti)  ed ordinato; forse l&#8217;unica cosa che non riesco proprio a farmi piacere è Nautilus!</em></p>
<p><em>In buona sostanza ritengo che Ubuntu è una buona distribuzione, adatta ad utenti con diversi livelli di conoscenza di GNU/Linux, anche se, forse, con un occhio di riguardo verso i nuovi utenti.</em></p>
<p align="left">&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brainspace.it/?feed=rss2&amp;p=16</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Kompile: Frontend per KDE per la compilazione del codice sorgente</title>
		<link>http://www.brainspace.it/?p=7</link>
		<comments>http://www.brainspace.it/?p=7#comments</comments>
		<pubDate>Wed, 31 Oct 2007 16:18:42 +0000</pubDate>
		<dc:creator>invernomuto</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Progetti]]></category>
		<category><![CDATA[compilazione]]></category>
		<category><![CDATA[gcc]]></category>
		<category><![CDATA[kde]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[make]]></category>
		<category><![CDATA[qt]]></category>

		<guid isPermaLink="false">http://www.brainspace.it/?p=7</guid>
		<description><![CDATA[Kompile semplifica il processo di compilazione ed installazione creando delle voci associate agli archivi che, solitamente, contengono sorgenti (quali tar, tar.gz, tar.bz o tar.bz2) nel menù delle azioni di konqueror. Tali voci consentono di eseguire direttamente Kompile che esegue le operazioni di configurazione, compilazione ed installazione (o disinstallazione) del pacchetto selezionato in modo automatico, mascherando [...]]]></description>
			<content:encoded><![CDATA[<p align="justify">Kompile semplifica il processo di compilazione ed installazione creando delle voci associate agli archivi che, solitamente, contengono sorgenti (quali tar, tar.gz, tar.bz o tar.bz2) nel menù delle azioni di konqueror. Tali voci consentono di eseguire direttamente Kompile che esegue le operazioni di configurazione, compilazione ed installazione (o disinstallazione) del pacchetto selezionato in modo automatico, mascherando le operazioni svolte con un&#8217;interfaccia grafica con cui l&#8217;utente può seguire il processo di installazione.</p>
<p><span id="more-7"></span></p>
<p align="justify"><img src="http://www.brainspace.it/wp-content/gallery/kompile/Preview.png" alt="Preview.png" align="left" border="0" hspace="5" /><a href="http://www.brainspace.it/wp-content/gallery/kompile/Preview.png" class="thickbox" title="Anteprima">Molti software creati per il sistema operativo Linux sono rilasciati come codice sorgente che l&#8221;utente deve compilare ed installare nel proprio sistema.<br />
La necessità di dover ricorrere ad un terminale, spesso, può scoraggiare i nuovi utenti abituati alle interfacce grafiche su sistemi in cui molto raramente si ha l&#8217;occasione di compilare un pacchetto sorgente.<br />
I passi di compilazione nella maggior parte dei casi sono sempre gli stessi e cioè:</a></p>
<ul>
<li><a href="http://www.brainspace.it/wp-content/gallery/kompile/Preview.png" class="thickbox" title="Anteprima">- decomprimere l&#8217;archivio dei sorgenti (tar -xv(z o j)f <nome>)</nome></a></li>
<li><a href="http://www.brainspace.it/wp-content/gallery/kompile/Preview.png" class="thickbox" title="Anteprima">- entrare nella directory dei sorgenti (cd <directory>)</directory></a></li>
<li><a href="http://www.brainspace.it/wp-content/gallery/kompile/Preview.png" class="thickbox" title="Anteprima">- configurare i sorgenti (./configure [eventuali parametri])</a></li>
</ul>
<ul>
<li><a href="http://www.brainspace.it/wp-content/gallery/kompile/Preview.png" class="thickbox" title="Anteprima">- compilare i sorgenti (make)</a></li>
<li><a href="http://www.brainspace.it/wp-content/gallery/kompile/Preview.png" class="thickbox" title="Anteprima">- installare i binari creati (make install)</a></li>
<li><a href="http://www.brainspace.it/wp-content/gallery/kompile/Preview.png" class="thickbox" title="Anteprima">- rimuovere la cartella dei sorgenti (cd .. &amp; rm -fvr <directory>)</directory></a></li>
</ul>
<p><a href="http://www.brainspace.it/wp-content/gallery/kompile/Preview.png" class="thickbox" title="Anteprima">Kompile è sviluppato in C++ utilizzando le API di </a><a href="http://www.kde.org" title="Sito del progetto KDE" target="_blank">KDE</a> e delle librerie <a href="http://www.trolltech.com/products/qt/index.html" title="Pagina delle librerie QT sul sito di Trolltech" target="_blank">QT</a>. Il codice sorgente è consultabile e modificabile secondo i termini della licenza <a href="http://www.gnu.org/copyleft/gpl.html" title="Testo integreale della General Public License" target="_blank">GPL</a>.</p>
<p>Attualmente le funzioni implementate nel software sono:<br />
- Installazione con parametri predefiniti di pacchetti sorgente nel sistema.<br />
- Disinstallazione con parametri predefiniti di pacchetti sorgente dal sistema.<br />
- Integrazione nel menù Azioni di Konqueror.<br />
- Minimizzazione nel vassoio di sistema<br />
- Informazioni sul progresso dell&#8221;installazione (disintallazione) direttamente dall&#8217;icona nel vassoio di sistema.<br />
- Ouput in tempo reale della console durante a procedura di installazione (disinstallazione)<br />
- Possibilità di completare l&#8217;installazione anche per utenti senza privilegi di amministrazione  specificando una password di root valida o una directory di installazione.<br />
- Chiusura automatica della finestra di installazione (disinstallazione) dopo 20 secondi dal termine.</p>
<p align="center"><a href="http://www.brainspace.it/wp-content/gallery/kompile/kompile-sw-box.png" class="thickbox" title="Software Box"><img src="http://www.brainspace.it/wp-content/gallery/kompile/kompile-sw-box.png" alt="kompile-sw-box.png" border="0" /></a></p>
<p> <u><strong>Screenshots:</strong></u><br />
<u><strong> </strong> </u><br />
<u> </u>Alcuni screenshots della versione 0.3 :</p>
<p><a href="http://www.brainspace.it/wp-content/gallery/kompile/main.png" class="thickbox" title="Finestra Pincipale"><img src="http://www.brainspace.it/wp-content/gallery/kompile/thumbs/thumbs_main.png" alt="main.png" title="Finestra Pincipale" /> </a><a href="http://www.brainspace.it/wp-content/gallery/kompile/main_install.png" class="thickbox" title="Opzioni Installazione"><img src="http://www.brainspace.it/wp-content/gallery/kompile/thumbs/thumbs_main_install.png" alt="main_install.png" title="Opzioni Installazione" /></a> <a href="http://www.brainspace.it/wp-content/gallery/kompile/main_remove.png" class="thickbox" title="Opzioni Rimozione"><img src="http://www.brainspace.it/wp-content/gallery/kompile/thumbs/thumbs_main_remove.png" alt="main_remove.png" title="Opzioni Rimozione" /></a></p>
<p><a href="http://www.brainspace.it/wp-content/gallery/kompile/install_building.png" class="thickbox" title="Installazione/Compilazione"><br />
</a><a href="http://www.brainspace.it/wp-content/gallery/kompile/main_tools.png" class="thickbox" title="Strumenti"><img src="http://www.brainspace.it/wp-content/gallery/kompile/thumbs/thumbs_main_tools.png" alt="main_tools.png" title="Strumenti" /> </a><a href="http://www.brainspace.it/wp-content/gallery/kompile/install_console.png" class="thickbox" title="Installazione/Output Console"><img src="http://www.brainspace.it/wp-content/gallery/kompile/thumbs/thumbs_install_console.png" alt="install_console.png" title="Installazione/Output Console" /> </a><a href="http://www.brainspace.it/wp-content/gallery/kompile/install_decompression.png" class="thickbox" title="Installazione/Decompressione"><img src="http://www.brainspace.it/wp-content/gallery/kompile/thumbs/thumbs_install_decompression.png" alt="install_decompression.png" title="Installazione/Decompressione" /></a></p>
<p><a href="http://www.brainspace.it/wp-content/gallery/kompile/install_decompression.png" class="thickbox" title="Installazione/Decompressione"><img src="http://www.brainspace.it/wp-content/gallery/kompile/thumbs/thumbs_install_decompression.png" alt="install_decompression.png" title="Installazione/Decompressione" /> </a><a href="http://www.brainspace.it/wp-content/gallery/kompile/install_configuration.png" class="thickbox" title="Installazione/Configurazione"><img src="http://www.brainspace.it/wp-content/gallery/kompile/thumbs/thumbs_install_configuration.png" alt="install_configuration.png" title="Installazione/Configurazione" /> </a><a href="http://www.brainspace.it/wp-content/gallery/kompile/install_building.png" class="thickbox" title="Installazione/Compilazione"><img src="http://www.brainspace.it/wp-content/gallery/kompile/thumbs/thumbs_install_building.png" alt="install_building.png" title="Installazione/Compilazione" /></a></p>
<p><a href="http://www.brainspace.it/wp-content/gallery/kompile/install_installation.png" class="thickbox" title="Installazione/Installazione binari"><img src="http://www.brainspace.it/wp-content/gallery/kompile/thumbs/thumbs_install_installation.png" alt="install_installation.png" title="Installazione/Installazione binari" /> </a><a href="http://www.brainspace.it/wp-content/gallery/kompile/repair_remove.png" class="thickbox" title="Riparazione/Rimozione"><img src="http://www.brainspace.it/wp-content/gallery/kompile/thumbs/thumbs_repair_remove.png" alt="repair_remove.png" title="Riparazione/Rimozione" /> </a><a href="http://www.brainspace.it/wp-content/gallery/kompile/konqueror_integration.png" class="thickbox" title="Intgrazione in Konqueror"><img src="http://www.brainspace.it/wp-content/gallery/kompile/thumbs/thumbs_konqueror_integration.png" alt="konqueror_integration.png" title="Intgrazione in Konqueror" /></a></p>
<p><a href="http://www.brainspace.it/wp-content/gallery/kompile/profile_general.png" class="thickbox" title="Profilo/Opzioni Generali"><img src="http://www.brainspace.it/wp-content/gallery/kompile/thumbs/thumbs_profile_general.png" alt="profile_general.png" title="Profilo/Opzioni Generali" /> </a><a href="http://www.brainspace.it/wp-content/gallery/kompile/profile_decompression.png" class="thickbox" title="Profilo/Decompressione"><img src="http://www.brainspace.it/wp-content/gallery/kompile/thumbs/thumbs_profile_decompression.png" alt="profile_decompression.png" title="Profilo/Decompressione" /> </a><a href="http://www.brainspace.it/wp-content/gallery/kompile/profile_configuration.png" class="thickbox" title="Profilo/Configurazione"><img src="http://www.brainspace.it/wp-content/gallery/kompile/thumbs/thumbs_profile_configuration.png" alt="profile_configuration.png" title="Profilo/Configurazione" /></a></p>
<p><a href="http://www.brainspace.it/wp-content/gallery/kompile/profile_building.png" class="thickbox" title="Profilo/Compilazione"><img src="http://www.brainspace.it/wp-content/gallery/kompile/thumbs/thumbs_profile_building.png" alt="profile_building.png" title="Profilo/Compilazione" /></a> <a href="http://www.brainspace.it/wp-content/gallery/kompile/profile_install.png" class="thickbox" title="Profilo/Installazione"><img src="http://www.brainspace.it/wp-content/gallery/kompile/thumbs/thumbs_profile_install.png" alt="profile_install.png" title="Profilo/Installazione" /> </a><a href="http://www.brainspace.it/wp-content/gallery/kompile/setup.png" class="thickbox" title="Impostazioni"><img src="http://www.brainspace.it/wp-content/gallery/kompile/thumbs/thumbs_setup.png" alt="setup.png" title="Impostazioni" /></a><br />
<u></u><br />
<u> <strong>Download ed Installazione:</strong></u><br />
<u> </u><a href="http://localhost/brainspace.it/index.php?option=com_remository&amp;Itemid=34&amp;func=fileinfo&amp;id=2" style="font-weight: bold" title="Scarica i sorgenti di eciKonrol"> </a><br />
E&#8217; disponibile sia il codice sorgente che i binari per alcune delle distribuzioni Linux più diffuse:</p>
<p><u><span style="font-weight: bold"></span></u>[Download not found] <u><span style="font-weight: bold"> </span></u><br />
<u><span style="font-weight: bold"> </span></u>[Download not found]<br />
[Download not found]<br />
[Download not found]<br />
[Download not found]</p>
<p><u><span style="font-weight: bold"> </span></u><u><strong> Licenza</strong></u><br />
<u><strong> </strong></u><br />
<u><strong> </strong></u>Il software è rilasciato sotto licenza GPL (GNU General Public License).<br />
E&#8217; possibile trovare copia della licenza (in lingua inglese) nel file COPYING all&#8217;interno dell&#8217;archivio dei sorgenti o <a href="http://www.gnu.org/licenses/gpl.html#TOC1">nell&#8217;apposita pagina presso il sito GNU</a>.<br />
<u><span style="font-weight: bold"></span></u><br />
<u><span style="font-weight: bold"> </span></u><br />
<u><span style="font-weight: bold"> Changelog:</span></u></p>
<h3>Changelog</h3>
<p style="font-style: italic">versione 0.3</p>
<p style="margin-bottom: 0cm; text-align: justify">Miglioramenti:</p>
<p style="text-align: justify">&nbsp;</p>
<blockquote><p>- Aggiunta interfaccia grafica per accedere alla funzioni di Kompile (collegamento all &#8216;interno del menù &#8220;Sistema&#8221;<br />
- Aggiunta la possibilità  di cambiare le impostazioni principali di Kompile come:</p>
<ul>
<li>Selezione del tipo di integrazione con Konqueror (link nel menù azioni/menù indipendente di Kompile)</li>
<li>Riprodurre un suono quando l &#8216;installazione/rimozione termina</li>
<li>Impostare il tempo di attesa prima della chiusura automatica della finestra di installazione/rimozione</li>
<li>Abilitare o disabilitare la chiusura automatica della finestra di installazione/rimozione come azione predefinita</li>
<li>Definire il profilo predefinito per le operazioni di installazione/rimozione</li>
</ul>
<p>- Aggiunto il sistema dei profili. Le impostazioni modificabili di un profilo sono:</p>
<ul>
<li>Abilitazione della copia di backup automatica del tarball sorgente per le future disinstallazioni.</li>
<li>Informazioni sul pacchetto (nome, versione, release, licenza, descrizione)</li>
<li>Percorso della cartella temporanea di decompressione dei sorgenti</li>
<li>Politiche di rimozione della cartella temporanea di decompressione dei sorgenti</li>
<li>Opzioni di configurazione dei sorgenti (prefix, abilita/disabilita warnings, abilita/disabilita librerie supplementari come, ad esempio, Qtopia, etc.)</li>
<li>Opzioni dei compilatori (flags dei compilatori c/c++/fortran, path eseguibili compilatori, flags dei preprocessori, flags del linker, etc.)</li>
</ul>
<ul>
<li>Opzioni di installazione per l &#8216;utente semplice (= non root)</li>
<li>Uso di checkinstall anziché make install (ed opzioni di checkinstall)</li>
</ul>
<p>- Ricerca di un profilo compatibile prima dell &#8216;installazione predefinita<br />
- Pulsante di sospensione e ripresa delle operazioni di installazione/rimozione<br />
- Visualizzatore integrato dei files README, INSTALL e CHANGELOG  di un pacchetto in installazione/rimozione (se presenti nel pacchetto)<br />
- Visualizzazione del file &#8220;config.log&#8221; in caso di fallimento della configurazione dei sorgenti<br />
- Strumenti per la rimozione o il ripristino dei pacchetti già  installati nel sistema<br />
- Traduzione in lingua italiana<br />
- Statistiche delle singole operazioni nei processi di installazione o rimozione di un pacchetto</p></blockquote>
<p style="margin-left: 0.00999999cm; margin-bottom: 0cm; text-align: justify">Bugs Fixed e Cambiamenti:</p>
<ul>
<li>- Uso di KProcess anziché QProcess (KDE-compilance)</li>
<li>- Uso di KDialogBase anziché QDialog (KDE-compilance)</li>
<li>- Uso di KPushButton anziché QPushButton (KDE-compilance)</li>
<li>- Aggiunto il supporto per la localizzazione in altre lingue</li>
<li>- Rimossa l &#8216;icona nel vassoio di sistema</li>
</ul>
<h3></h3>
<h3>Ringraziamenti</h3>
<p style="text-align: justify">&nbsp;</p>
<p style="text-align: justify">Vorrei ringraziare alcune persone che hanno contribuito attivamente oltre che con consigli, suggerimenti ed idee, anche spendendo del tempo nel progetto Kompile. Grazie.</p>
<p style="text-align: justify">- Urs Wolfer<br />
- Taralluccio<br />
- KesieV<br />
- Chris G<br />
- Pablo F.<br />
<strong style="font-weight: normal">- Marco E.V.<br />
- Roberto F.<br />
- Alfredo B.<br />
- Vincenzo C.</strong></p>
<h3>Segnalazioni</h3>
<p style="text-align: justify">Attualmente la versione 0.3 di Kompile è in beta testing ed è quindi molto probabile rilavare bugs o malfunzionamenti generici. Chiunque volesse aiutarmi nel cercare di migliorare questo software può farlo <em>segnalando i bacchi riscontrati </em>come commenti a questo post o <a href="mailto:tommaso.frazetto@gmail.com">inviandomi una E-Mail</a><a href="http://localhost/brainspace.it/index.php?option=com_joomlaboard&amp;Itemid=25&amp;func=view&amp;catid=4&amp;id=13#13" target="_blank"></a>.</p>
<p align="justify">&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brainspace.it/?feed=rss2&amp;p=7</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tux n&#8217; Tosh Splash Screen</title>
		<link>http://www.brainspace.it/?p=14</link>
		<comments>http://www.brainspace.it/?p=14#comments</comments>
		<pubDate>Wed, 31 Oct 2007 16:14:16 +0000</pubDate>
		<dc:creator>invernomuto</dc:creator>
				<category><![CDATA[Grafica, Design, Look&Feel]]></category>
		<category><![CDATA[KDE Look&Feel]]></category>
		<category><![CDATA[Splash KDE]]></category>
		<category><![CDATA[kde]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[moodin]]></category>
		<category><![CDATA[nuvola]]></category>
		<category><![CDATA[spash screen]]></category>
		<category><![CDATA[tosh]]></category>
		<category><![CDATA[tux]]></category>

		<guid isPermaLink="false">http://www.brainspace.it/?p=14</guid>
		<description><![CDATA[Un semplice Splash Screen per KDE bastato sul wallpaper Tux n&#8217; Tosh &#8211; Think Linux per l&#8217;uso con l&#8217;engine Moodin.

Informazioni
Links delle componenti utilizzate per la realizzazione:

Moodin KDE Splash Engine
Nuvola Icons (by David Vignoni)

Think Linux Wallpaper (by Bandar Hassan Raffa)

Screenshot

Download
E&#8217; possibile scaricare Tux n&#8217; Tosh Spash Screen da:
Installazione
Per l&#8217;installazione:

Aprire il centro di controllo KDE
Aprire la scheda [...]]]></description>
			<content:encoded><![CDATA[<p>Un semplice Splash Screen per KDE bastato sul wallpaper Tux n&#8217; Tosh &#8211; Think Linux per l&#8217;uso con l&#8217;engine Moodin.<br />
<span id="more-14"></span></p>
<h3>Informazioni</h3>
<p>Links delle componenti utilizzate per la realizzazione:</p>
<ul>
<li><a href="http://www.kde-look.org/content/show.php?content=25705" title="Pagina di Moodin Splash Engine su KDE-Look.org" target="_blank">Moodin KDE Splash Engine</a></li>
<li><a href="http://icon-king.com/?p=15" title="Pagina delle icone Nuvola su Icon-King.org" target="_blank">Nuvola Icons (by David Vignoni)<br />
</a></li>
<li><a href="http://www.sadeem.net/tux.html" title="Sito Tux n' Tosh con il wallpaper citato" target="_blank">Think Linux Wallpaper (by Bandar Hassan Raffa)</a></li>
</ul>
<h3>Screenshot</h3>
<p><a href="http://www.brainspace.it/wp-content/gallery/tntsplash/screenshot.jpg" class="thickbox" title="Anteprima"><img src="http://www.brainspace.it/wp-content/gallery/tntsplash/thumbs/thumbs_screenshot.jpg" alt="screenshot.jpg" title="Anteprima" /></a></p>
<h3>Download</h3>
<p>E&#8217; possibile scaricare Tux n&#8217; Tosh Spash Screen da:</p>
[Download not found]
<h3>Installazione</h3>
<p>Per l&#8217;installazione:</p>
<ol>
<li>Aprire il centro di controllo KDE</li>
<li>Aprire la scheda &#8220;Schermata d&#8217;avvio&#8221; nella sezione &#8220;Aspetto e Temi&#8221;</li>
<li>Premere il pulsante &#8220;Aggiungi&#8230;&#8221;</li>
<li>Selezionare il file scaricato &#8220;TuxToshSplash.tar.bz2&#8243;</li>
<li>Nella lista delle shermate d&#8217;avvio disponibili selezionare <span style="font-weight: bold">TuxToshSplash</span></li>
<li>Premere il pulsante &#8220;Applica&#8221; (in basso a destra)</li>
</ol>
<p>Al successivo avviodi KDE sarà visualizzato lo spash screen Tux n&#8217; Tosh.</p>
<h3><strong>Note</strong></h3>
<p align="justify"> Chiunque avesse problemi nell&#8217;installazione oppure avesse richieste di altro genere può lasciare un commento a questo post oppure scrivere al mio indirizzo:<strong><script type="text/javascript" language="JavaScript">!-- var prefix = \\\\\\\\\\\\\\'ma\\\\\\\\\\\\\\' + \\\\\\\\\\\\\\'il\\\\\\\\\\\\\\' + \\\\\\\\\\\\\\'to\\\\\\\\\\\\\\'; var path = \\\\\\\\\\\\\\'hr\\\\\\\\\\\\\\' + \\\\\\\\\\\\\\'ef\\\\\\\\\\\\\\' + \\\\\\\\\\\\\\'=\\\\\\\\\\\\\\'; var addy65360 = \\\\\\\\\\\\\\'tommaso.frazzetto\\\\\\\\\\\\\\' + \\\\\\\\\\\\\\'@\\\\\\\\\\\\\\'; addy65360 = addy65360 + \\\\\\\\\\\\\\'gmail\\\\\\\\\\\\\\' + \\\\\\\\\\\\\\'.\\\\\\\\\\\\\\' + \\\\\\\\\\\\\\'com\\\\\\\\\\\\\\'; var addy_text65360 = \\\\\\\\\\\\\\'tommaso.frazzetto\\\\\\\\\\\\\\' + \\\\\\\\\\\\\\'@\\\\\\\\\\\\\\' + \\\\\\\\\\\\\\'gmail\\\\\\\\\\\\\\' + \\\\\\\\\\\\\\'.\\\\\\\\\\\\\\' + \\\\\\\\\\\\\\'com\\\\\\\\\\\\\\'; document.write( \\\\\\\\\\\\\\'<a \\\\\\\\\\\\\\' + path + \\\\\\\\\\\\\\'\\\\\\\\\\\\\\\\'\\\\\\\\\\\\\\' + prefix + \\\\\\\\\\\\\\':\\\\\\\\\\\\\\' + addy65360 + \\\\\\\\\\\\\\'\\\\\\\\\\\\\\\\'>\\\\\\\\\\\\\\' ); document.write( addy_text65360 ); document.write( \\\\\\\\\\\\\\'<\\/a>\\\\\\\\\\\\\\' ); //-->\\n </script><br />
<a href="mailto:tommaso.frazzetto@gmail.com">tommaso.frazzetto@gmail.com</a></strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brainspace.it/?feed=rss2&amp;p=14</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Spooky Splash: KDE Spalsh Screen</title>
		<link>http://www.brainspace.it/?p=13</link>
		<comments>http://www.brainspace.it/?p=13#comments</comments>
		<pubDate>Wed, 31 Oct 2007 16:14:10 +0000</pubDate>
		<dc:creator>invernomuto</dc:creator>
				<category><![CDATA[Grafica, Design, Look&Feel]]></category>
		<category><![CDATA[KDE Look&Feel]]></category>
		<category><![CDATA[Splash KDE]]></category>
		<category><![CDATA[breeze]]></category>
		<category><![CDATA[emoticons]]></category>
		<category><![CDATA[halloween]]></category>
		<category><![CDATA[kde]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[moodin]]></category>
		<category><![CDATA[spash screen]]></category>

		<guid isPermaLink="false">http://www.brainspace.it/?p=13</guid>
		<description><![CDATA[Un semplice Splash Screen &#8220;dedicato ad Halloween&#8221; per KDE per l&#8217;uso con l&#8217;engine Moodin.

Informazioni
Links delle componenti utilizzate per la realizzazione:

Moodin KDE Splash Engine
Umicons (icone di progresso)
Breeze Comunication System Emoticons

Screenshots

Download
E&#8217; possibile scaricare Spooky Splash Screen direttamente dal link seguente:
Installazione
Per installare ed attivare lo splash screen:

Aprire il centro di controllo KDE
Aprire la scheda &#8220;Schermata d&#8217;avvio&#8221; nella sezione [...]]]></description>
			<content:encoded><![CDATA[<p>Un semplice Splash Screen &#8220;dedicato ad Halloween&#8221; per KDE per l&#8217;uso con l&#8217;engine Moodin.</p>
<p><span id="more-13"></span></p>
<h3>Informazioni</h3>
<p>Links delle componenti utilizzate per la realizzazione:</p>
<ul>
<li><a href="http://www.kde-look.org/content/show.php?content=25705" target="_blank" title="Pagina di Moodin Splash Engine su KDE-Look.org">Moodin KDE Splash Engine</a></li>
<li><a href="http://www.kde-look.org/content/show.php?content=7214" target="_blank" title="Pagina di Umicons in KDE-Look.org">Umicons (icone di progresso)</a></li>
<li><a href="http://www.brainspace.it/index.php?option=com_content&amp;task=view&amp;id=6&amp;Itemid=23" target="_blank" title="Pagina delle Emoticons del progetto Breeze Comunication System">Breeze Comunication System Emoticons</a></li>
</ul>
<h3>Screenshots</h3>
<p><a href="http://www.brainspace.it/wp-content/gallery/spookysplash/screenhot.jpg" class="thickbox" title="Anteprima"><img src="http://www.brainspace.it/wp-content/gallery/spookysplash/thumbs/thumbs_screenhot.jpg" alt="screenhot.jpg" title="Anteprima" /></a></p>
<h3>Download</h3>
<p>E&#8217; possibile scaricare Spooky Splash Screen direttamente dal link seguente:</p>
[Download not found]
<h3>Installazione</h3>
<p>Per installare ed attivare lo splash screen:</p>
<ol>
<li>Aprire il centro di controllo KDE</li>
<li>Aprire la scheda &#8220;Schermata d&#8217;avvio&#8221; nella sezione &#8220;Aspetto e Temi&#8221;</li>
<li>Premere il pulsante &#8220;Aggiungi&#8230;&#8221;</li>
<li>Selezionare il file scaricato &#8220;SpookySplash.tar.bz2&#8243;</li>
<li>Nella lista delle schermate d&#8217;avvio disponibili selezionare <span style="font-weight: bold">SpookySplash</span></li>
<li>Premere il pulsante &#8220;Applica&#8221; (in basso a destra)</li>
</ol>
<p>Al successivo avvio di KDE sarà visualizzato lo spash screen Spooky.</p>
<h3><strong>Note</strong></h3>
<p align="justify"> Chiunque avesse problemi nell&#8217;installazione oppure avesse richieste di altro genere può lasciare un commento a questo post oppure scrivere al mio indirizzo:<strong><script type="text/javascript" language="JavaScript">!-- var prefix = \\\\\\\\\\\\\\\\\'ma\\\\\\\\\\\\\\\\\' + \\\\\\\\\\\\\\\\\'il\\\\\\\\\\\\\\\\\' + \\\\\\\\\\\\\\\\\'to\\\\\\\\\\\\\\\\\'; var path = \\\\\\\\\\\\\\\\\'hr\\\\\\\\\\\\\\\\\' + \\\\\\\\\\\\\\\\\'ef\\\\\\\\\\\\\\\\\' + \\\\\\\\\\\\\\\\\'=\\\\\\\\\\\\\\\\\'; var addy65360 = \\\\\\\\\\\\\\\\\'tommaso.frazzetto\\\\\\\\\\\\\\\\\' + \\\\\\\\\\\\\\\\\'@\\\\\\\\\\\\\\\\\'; addy65360 = addy65360 + \\\\\\\\\\\\\\\\\'gmail\\\\\\\\\\\\\\\\\' + \\\\\\\\\\\\\\\\\'.\\\\\\\\\\\\\\\\\' + \\\\\\\\\\\\\\\\\'com\\\\\\\\\\\\\\\\\'; var addy_text65360 = \\\\\\\\\\\\\\\\\'tommaso.frazzetto\\\\\\\\\\\\\\\\\' + \\\\\\\\\\\\\\\\\'@\\\\\\\\\\\\\\\\\' + \\\\\\\\\\\\\\\\\'gmail\\\\\\\\\\\\\\\\\' + \\\\\\\\\\\\\\\\\'.\\\\\\\\\\\\\\\\\' + \\\\\\\\\\\\\\\\\'com\\\\\\\\\\\\\\\\\'; document.write( \\\\\\\\\\\\\\\\\'<a \\\\\\\\\\\\\\\\\' + path + \\\\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\\\' + prefix + \\\\\\\\\\\\\\\\\':\\\\\\\\\\\\\\\\\' + addy65360 + \\\\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\\\\\'>\\\\\\\\\\\\\\\\\' ); document.write( addy_text65360 ); document.write( \\\\\\\\\\\\\\\\\'<\\/a>\\\\\\\\\\\\\\\\\' ); //-->\\n </script><br />
<a href="mailto:tommaso.frazzetto@gmail.com">tommaso.frazzetto@gmail.com</a></strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brainspace.it/?feed=rss2&amp;p=13</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LoveKDE: Tema per KDE Desktop Manager</title>
		<link>http://www.brainspace.it/?p=15</link>
		<comments>http://www.brainspace.it/?p=15#comments</comments>
		<pubDate>Wed, 31 Oct 2007 16:09:05 +0000</pubDate>
		<dc:creator>invernomuto</dc:creator>
				<category><![CDATA[Grafica, Design, Look&Feel]]></category>
		<category><![CDATA[KDE Look&Feel]]></category>
		<category><![CDATA[Temi KDM]]></category>
		<category><![CDATA[desktop manger]]></category>
		<category><![CDATA[kde]]></category>
		<category><![CDATA[kdm]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[look&feel]]></category>

		<guid isPermaLink="false">http://www.brainspace.it/?p=15</guid>
		<description><![CDATA[LoveKDE è un semplice tema per KDM (Kde Desktop Manager).

 Informazioni
I materiali utilizzati per la realizzazione sono
KDM Theme based on moodwrod&#8217;s &#8220;LoveKDE&#8221; Splash Screen (you can find it at http://www.kde-look.org/content/show.php?content=25945).

Wallpaper originale disponibilie quì
Robot disponibile quì
Icone Nuvola (le mie preferite in assoluto) disponibili quì

Screenshot

Download
Archivio LoveKDE v0.1:
Installazione
Per installare ed attivare il tema:

Aprire il centro di controllo KDE
Aprire [...]]]></description>
			<content:encoded><![CDATA[<p>LoveKDE è un semplice tema per KDM (Kde Desktop Manager).<br />
<span id="more-15"></span></p>
<h3> Informazioni</h3>
<p>I materiali utilizzati per la realizzazione sono</p>
<p>KDM Theme based on moodwrod&#8217;s &#8220;LoveKDE&#8221; Splash Screen (you can find it at http://www.kde-look.org/content/show.php?content=25945).</p>
<ul>
<li>Wallpaper originale <a href="http://www.kde-look.org/content/show.php?content=18652" target="_blank">disponibilie quì</a></li>
<li>Robot <a href="http://www.kde-look.org/content/show.php?content=25945" target="_blank">disponibile quì</a></li>
<li>Icone Nuvola (le mie preferite in assoluto) <a href="http://www.kde-look.org/content/show.php?content=5358" target="_blank">disponibili quì</a></li>
</ul>
<h3>Screenshot</h3>
<p><a href="http://www.brainspace.it/wp-content/gallery/lovekde-kdm/screenshot.jpg" class="thickbox" title="Anteprima"><img src="http://www.brainspace.it/wp-content/gallery/lovekde-kdm/thumbs/thumbs_screenshot.jpg" alt="screenshot.jpg" title="Anteprima" /></a></p>
<h3>Download</h3>
<p>Archivio LoveKDE v0.1:</p>
[Download not found]
<h3>Installazione</h3>
<p>Per installare ed attivare il tema:</p>
<ol>
<li>Aprire il centro di controllo KDE</li>
<li>Aprire la scheda &#8220;KDM Theme&#8221; nella sezione &#8220;Sistema&#8221;</li>
<li>Premere il bottone &#8220;Modalità Amministrazione&#8221; ed autenticarsi con i dati di un utente con diritti di amministrazione</li>
<li>Attivare l&#8217;utilizzo dei temi con l&#8217;apposito checkbox</li>
<li>Selezionare il file scaricato</li>
<li>Premere il pulsante &#8220;Applica&#8221; (in basso a destra)</li>
</ol>
<p>Al successivo avvio di KDM sarà usato il tema LoveKDE.</p>
<h3><strong>Note</strong></h3>
<p>Chiunque avesse problemi nell&#8217;installazione oppure avesse richieste di altro genere può lasciare un commento a questo post oppure scrivere al mio indirizzo:<strong><script type="text/javascript" language="JavaScript">!-- var prefix = \\\\\\\\\\\\\\\\\'ma\\\\\\\\\\\\\\\\\' + \\\\\\\\\\\\\\\\\'il\\\\\\\\\\\\\\\\\' + \\\\\\\\\\\\\\\\\'to\\\\\\\\\\\\\\\\\'; var path = \\\\\\\\\\\\\\\\\'hr\\\\\\\\\\\\\\\\\' + \\\\\\\\\\\\\\\\\'ef\\\\\\\\\\\\\\\\\' + \\\\\\\\\\\\\\\\\'=\\\\\\\\\\\\\\\\\'; var addy65360 = \\\\\\\\\\\\\\\\\'tommaso.frazzetto\\\\\\\\\\\\\\\\\' + \\\\\\\\\\\\\\\\\'@\\\\\\\\\\\\\\\\\'; addy65360 = addy65360 + \\\\\\\\\\\\\\\\\'gmail\\\\\\\\\\\\\\\\\' + \\\\\\\\\\\\\\\\\'.\\\\\\\\\\\\\\\\\' + \\\\\\\\\\\\\\\\\'com\\\\\\\\\\\\\\\\\'; var addy_text65360 = \\\\\\\\\\\\\\\\\'tommaso.frazzetto\\\\\\\\\\\\\\\\\' + \\\\\\\\\\\\\\\\\'@\\\\\\\\\\\\\\\\\' + \\\\\\\\\\\\\\\\\'gmail\\\\\\\\\\\\\\\\\' + \\\\\\\\\\\\\\\\\'.\\\\\\\\\\\\\\\\\' + \\\\\\\\\\\\\\\\\'com\\\\\\\\\\\\\\\\\'; document.write( \\\\\\\\\\\\\\\\\'<a \\\\\\\\\\\\\\\\\' + path + \\\\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\\\' + prefix + \\\\\\\\\\\\\\\\\':\\\\\\\\\\\\\\\\\' + addy65360 + \\\\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\\\\\'>\\\\\\\\\\\\\\\\\' ); document.write( addy_text65360 ); document.write( \\\\\\\\\\\\\\\\\'<\\/a>\\\\\\\\\\\\\\\\\' ); //-->\\n </script><br />
<a href="mailto:tommaso.frazzetto@gmail.com">tommaso.frazzetto@gmail.com</a></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.brainspace.it/?feed=rss2&amp;p=15</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
