Sfruttare le Google Picasa API per generare una galleria di immagini

Postato da ROb | nella categoria Java, Linux, Sviluppo web | giovedì, 22 aprile 2010

0

Chi non conosce il bellissimo e potentissimo software Picasa?
E’ sempre più facile vederlo installato nei desktop degli utenti come rimpiazzo dell’applicazione di default di visualizzazione immagini. Anche io che uso Linux, nonostante la scelta di software di gestione e visualizzazione immagini sia molto ricca e il fatto che non è un’applicazione nativa Linux ma emulata tramite Wine, ho eletto Picasa come il “mio” software di gestione immagini.

Google Picasa API

Non voglio però dilungarmi molto in merito ai pregi di questo gestore di immagini. L’oggetto di questo post è la possibilità di sfruttare il servizio web ad esso associato (ma anche utilizzabile in modo indipendente) chiamato Picasa Web Albums.

Picasa Web Albums è un servizio web che ci permette di caricare, organizzare i nostri album di foto e di condividerli con chi vogliamo. Migliorato di mese e mese, si è arricchito ultimamente anche della capacità di riconoscere i volti delle persone nelle foto in modo automatico.

Questo servizio Google, come molti altri dell’azienda di Mountain View, espone delle API, cioè delle librerie utilizzabili dagli sviluppatori, che, dopo un’opportuna autenticazione, permettono di leggere e manipolare i dati del servizio stesso.
Nel caso ad esempio delle API di Picasa Web Albums possiamo richiedere la lista dei nostri album oppure ricevere la lista delle immagini contenuto in uno specifico album oppure caricare una foto nell’album e così via.

Oggi voglio parlarvi di una piccola applicazione scritta in Java, che sfrutta l’API del servizio per questo linguaggio, in grado di generare una porzione di codice html partendo da una lista di immagini di uno specifico album caricato in Picasa Web Albums.

Per poter eseguire l’applicazione dovete avere opportunamente scaricato e configurato il pacchetto delle API di Google, impostando correttamente le dipendenze verso i file jar dei servizi che utilizzate.
Per comodità comunque allego in fondo all’articolo l’intero progetto Eclipse zippato.

Il programma deve essere eseguito in due passaggi.
Nel primo passaggio, dopo aver opportunamente modificato l’utente e password, bisogna attendere che il programma stampi a video la lista degli album caricati e i relativi id. Scegliamo a questo punto l’id del nostro album e impostiamolo come valore della variabile albumId.

Rieseguiamo quindi il programma (secondo passaggio) e a questo punto potremmo vedere un output decisamente più ricco che contiene un html generato partendo dai dati e dalle immagini contenuti nell’album specificato.
L’html viene generato utilizzando il motore di templating Velocity a cui è stato passato l’oggetto feed contenente tutti i dati del nostro album. Il file del template è album.vm che si trova all’interno della cartella del progetto di nome templates.
Ovviamente potete modificare a vostro piacimento tale template utilizzando a pieno il modello dei dati messo a disposizione da Google.

Di seguito propongo il codice Java del programma, ovviamente con delle credenziali fasulle:

import java.io.StringWriter;
import java.net.URL;
import java.util.Properties;

import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;

import com.google.gdata.client.photos.PicasawebService;
import com.google.gdata.data.photos.AlbumEntry;
import com.google.gdata.data.photos.AlbumFeed;
import com.google.gdata.data.photos.UserFeed;

public class Main {
	public static void main(String[] args) {
		try {
			String username = "<username>";
			String domain = "@gmail.com";
			String password = "<password>";
			String albumId = "<empy>";

			PicasawebService myService = new PicasawebService(username);
			myService.setUserCredentials(username + domain, password);

			URL feedUrl = new URL("http://picasaweb.google.com/data/feed/api/user/" + username + "?kind=album");

			UserFeed myUserFeed = myService.getFeed(feedUrl, UserFeed.class);
			for (AlbumEntry myAlbum : myUserFeed.getAlbumEntries()) {
			    System.out.println(myAlbum.getTitle().getPlainText() + " - " + myAlbum.getId());
			}

			URL feedAlbumUrl = new URL("http://picasaweb.google.com/data/feed/api/user/" + username + "/albumid/" + albumId);

			AlbumFeed feed = null;
			try {
				feed = myService.getFeed(feedAlbumUrl, AlbumFeed.class);
			}
			catch (com.google.gdata.util.ResourceNotFoundException rnfe) {
				System.out.println("\nalbum non trovato, controlla l'id");
			}

			if (feed != null) {
				Properties velProps = new Properties();
				velProps.load(Main.class.getResourceAsStream("velocity.properties"));
				Velocity.init(velProps);

				VelocityContext context = new VelocityContext();

				context.put("feed", feed);

				Template template = null;

				try {
				   template = Velocity.getTemplate("templates/album.vm");
				}
				catch( Exception e ) {
					e.printStackTrace();
				}

				StringWriter sw = new StringWriter();

				template.merge( context, sw );

				System.out.println();
				System.out.println(sw);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

Questo è invece il codice del template album.vm :

		<h4>$!feed.title.plainText</h4>
		<ul class="gallery clearfix">
#foreach($photo in $feed.getPhotoEntries())
		    <li>
		       <a rel='prettyPhoto[$feed.id]' title="$photo.getDescription().getPlainText()" href='$photo.getMediaContents().get(0).getUrl()' >
		          <img src='$photo.getMediaThumbnails().get(0).getUrl()' width='100' class='thumb' border='0' />
		       </a>
		    </li>
#end
		</ul>

Ecco infine il file compresso contenente il progetto completo in formato Eclipse.

Appunti Linux, l’enciclopedia di informatica libera

Postato da ROb | nella categoria Informatica in generale, Linux | giovedì, 18 febbraio 2010

0

Definire “Appunti Linux” un tutorial su Linux è assolutamente riduttivo.

Appunti Linux” nasce infatti con questo nome ma negli anni si trasforma in “Appunti di informatica libera“.
In effetti per il numero di argomenti trattati, la proprietà di linguaggio, i numerosi esempi e le immagini presenti, potrebbe essere definita in tutti i sensi la più grande enciclopedia di informatica in italiano mai scritta.

Appunti Linux - Daniele Giacomini

L’opera è divisa attualmente in 39 volumi.
I primi trattano di argomenti generali e concetti basilari sull’hardware dei sistemi, successivamente l’attenzione del lettore viene spostata su temi più specifici del mondo Linux: kernel, shell, file system.
Il volume 10 inizia la trattazione di reti, affrontando le basi del networking (stack ISO/OSI e TCP/IP) fino ad arrivare a parlare dei protocolli di livelllo applicativo più diffusi. Non vengono tralasciati neanche gli aspetti di firewalling e protezione antivirus.

I volumi successivi spaziano anche su temi meno vicini a Linux ma comunque di elevato interesse: programmazione, sistemi operativi alternativi, linguaggi di markup, editoria, multimedialità, openoffice.

Insomma un volume da avere sempre a portata di click.
Nonostante ormai i motori di ricerca, Wikipedia e Internet in generale siano diventati la principale fonte di informazione, soprattutto per gli informatici, il mio consiglio è quello di provare comunque a cercare nell’indice analitico di “Appunti Linux” specialmente se state cercando informazioni su software non troppo recenti o su concetti basilari dell’informatica.

Per concludere, giusto una piccola curiosità.
Per valutare appieno la mole di lavoro dell’autore… in questo link è disponibile il file pdf aggiornato al 23/12/2009.
La dimensione di tale pdf è 160Mb, le pagine sono 11.921 !!!

Buona lettura.

Utilizzare più profili Firefox in Linux

Postato da ROb | nella categoria Utilità | domenica, 14 febbraio 2010

3

Chi ha bisogno di avere a disposizione più sessioni Firefox contemporaneamente o vuole semplicemente costruire un profilo Firefox più leggero, con meno estensioni o con un tema diverso può sfruttare la comodissima funzione multiprofilo di Firefox.

Mouse black Gnome

Nel caso di una postazione Linux, per avviare in tale modalità ho dovuto costruire un piccolo script per modificare la variabile di ambiente MOZ_NO_REMOTE.

Ecco qua il mini script:

#!/bin/bash

export MOZ_NO_REMOTE=" firefox -Profilemanager"

firefox -Profilemanager

oppure è possibile usare quest’altro script (grazie Matteo per il commento integrativo!) dove $1 è il nome del profilo già creato da utilizzare.
Nel caso non venga passato nessun parametro allora viene avviato il ProfileManager.

#!/bin/bash

exec firefox --no-remote -P $1

Nel mio caso ho costruito il profilo di default con tutti i miei migliori bookmark e le mie estensioni mentre ho un altro profilo chiamato “dev” (più veloce all’avvio e nel rendering della pagina) in cui ho installato solamente le estensioni indispensabili per lo sviluppo e il debug di applicazioni web.

Schermata avvio Firefox multiprofilo