Tutti gli articoli di Nicola Ferraro

Hadoop

A brief history of “Big Data”

Il mondo dei “Big Data” è qualcosa di talmente vasto e complesso da rendere la sua stessa comprensione una “mission impossible” peri nuovi arrivati.

Da dove nasce Hadoop? perché era importante creare HBase? perché MapReduce sta lasciando il posto a Spark? da dove nascono i vari Pig, Hive, Impala, Oozie, Sqoop, Zookeeper, YARN?

Questa presentazione vi guiderà attraverso la storia di questo nuovo fenomeno…

No Aranzulla

Come bloccare Salvatore Aranzulla

Molti lo amano, ma molti di più lo odiano. Stiamo parlando di quel sedicente esperto di informatica.. Quello che le sa tutte. Qualsiasi problema abbiate mai avuto col PC, ce l’ha avuto anche lui, e l’ha risolto per voi. Volete eliminare un virus che vi da fastidio? Cercate su google “come eliminare il virus” e, invece di trovare… che ne so: Kaspersky, Norton… Trovate lui: il mitico Salvatore Aranzulla, che vi spiega passo dopo passo, screenshot dopo screenshot, come diavolo si fa ad eliminare il virus (quale virus? “il virus”, generico). Avete un problema con l’iPhone? Dopo aver speso € 800 vi siete resi conto che non sapete spegnerlo? Non abbiate paura: c’è Salvatore Aranzulla, che con un articolo da premio Nobel vi spiega come si spegne l’iPhone, facendovi risparmiare un sacco di batteria (dopo aver speso tutti quei soldi, bisogna pure iniziare a risparmiare su qualcosa…). Basta cercare su google “come spegnere iphone”, sarà il primo risultato.

Alcuni giorni mi chiedo se ci sia qualcosa che lui non sappia fare. Citando il celebre sito Nonciclopedia, che gli ha dedicato una pagina davvero esilarante:

Se si prova a cercare su Google qualsiasi cosa che riguardi un minimo l’informatica, nel 98% dei casi apparirà il faccione di Aranzulla nei risultati.

E tutti articoli di un certo peso!

Oltre al citato “come spegnere iPhone”, troviamo guide di enorme valore: “come installare Skype”, “come taggare su Facebook”, “come pagare su Amazon”, “come twittare su Twitter”. Mi viene proprio spontaneo pensarlo.. ma che mondo sarebbe senza Aranzulla.

E proprio perché ultimamente ci sto pensando troppo (lo so, in fondo lo invidio, lo vedete anche voi che sto cercando invano di imitare il suo stile), mi è venuta in mente un’idea: perché non eliminarlo dai risultati di Google?

Rifletteteci un attimo. Niente più spiegazioni idiote per bimbominkia cerebrolesi quando stai cercando di risolvere un problema serio. Pensate alla sensazione di non vedere più quella foto… Quella foto dell’amico sfigato a cui ne succedono sempre di tutti i colori, ma riesce sempre a sopravvivere per diffondere il verbo.

Cari amici, ecco a voi una spiegazione in puro stile Aranzulla su come si fa ad eliminare l’omino cocozza (perché lo chiamano così ?) dai risultati Google.

Per eliminare Aranzulla da Google devi installare un’estensione di Chrome. Non usi Chrome ? Scrivi una mail a Salvatore Aranzulla e chiedi a lui come si fa la stessa cosa su Firefox, sicuramente lui ha avuto il tuo stesso problema e l’ha superato. L’estensione si chiama Personal Blocklist (by Google).

“By Google” significa che è proprio stata fatta da Google. Fonti attendibili interne a Google hanno rivelato che l’estensione è nata proprio come workaround per eliminare Aranzulla dalle ricerche, in attesa di una patch all’algoritmo di indicizzazione che dovrebbe riuscire a rimuoverlo definitivamente.

Andate (con Chrome) su: https://chrome.google.com/webstore.

Cercate “Personal Blocklist” e fate click sul nome dell’estensione, come mostrato nel seguente screenshot.

Aranzulla 1

Fatto ? Adesso vi comparirà il dettaglio dell’estensione e da li potrete procedere ad installarla.

Come vedete, Google ha deciso di rilasciare gratuitamente questa estensione per poterla diffondere più rapidamente. Fate click sul pulsante “Gratis”.

Aranzulla 2

Adesso vi comparirà questo avvertimento. Si tratta di un avviso standard. Fate click su “Aggiungi”.

Aranzulla 3

Ed ecco la conferma dell’installazione.

Aranzulla 4

Fatto ? Adesso manca solo un passaggio: bisogna dire all’estensione chi vogliamo bloccare. Per ragioni legali, gli sviluppatori Google non hanno potuto impostare il blog di Aranzulla nella lista dei siti bloccati per default (anche se dal codice sorgente risulta che basterebbe eliminare un commento per poter evitare il passaggio successivo).

Cerchiamo su Google qualsiasi cosa abbia a che fare con l’informatica, come mostrato nella figura seguente: Salvatore Aranzulla apparirà come primo risultato.

Aranzulla 5

 

Fate click sul link all’articolo e poi cliccate sull’icona dell’estensione in alto a destra.

Aranzulla 6

 

L’estensione vi chiederà se bloccare il blog di Aranzulla. Sì, certo che vogliamo bloccarlo !!

Aranzulla 7

E a questo punto il gioco è fatto, potete ignorare il messaggio che indica quali siti sono bloccati su Google.

Adesso proviamo di nuovo a cercare qualcosa relativo all’informatica.

Aranzulla 8

Ce l’abbiamo fatta ! Aranzulla non c’è più !!

Non che il primo articolo sia meglio di quello dell’omino cocozza, però Google ha tutto un altro aspetto senza di lui…

Spark

Spark-HBase Connector

Torno a scrivere su Nerdammer, dopo una lunga assenza, per parlare delle nuove tendenze del mondo Big Data. L’ultimo articolo su Hadoop pubblicato su questo blog risale forse a un anno fa, quando la parola Big Data cominciava a essere più presente su Twitter, e quel famoso framework (MapReduce) veniva proposto come soluzione universale per l’elaborazione di quantità enormi di dati, con potenzialità teoricamente infinite.

Continua a leggere

Home Automation

Domotica a basso costo

Creare una casa “domotica”, ovvero installare nella propria abitazione degli apparecchi di home automation, per controllare, ad esempio, luci, caldaia, condizionatore, sistemi di allarme da remoto col proprio cellulare o in maniera del tutto automatica, è una cosa molto divertente ma, se non controllata, rischia di compromettere seriamente il vostro portafogli.

È per questo motivo che mi sono deciso a scrivere il primo articolo sulla home automation low cost. È ovvio che, per rendere qualsiasi cosa divertente, il buon nerd deve limitarsi ad acquistare il minimo indispensabile per poter far funzionare tutto e creare tutto quello che manca seguendo la propria creatività.. Sennò, il divertimento dov’è ?

Cominciamo con una cosa semplice: la lampada vocale.

Il video mostra una normale lampada Ikea a cui è stata apportata qualche piccola modifica per renderla comandabile con la voce. La lampada è collegata direttamente alla presa elettrica e possiede anche un interruttore di accensione e spegnimento meccanico, ma, tra la lampada e la voce si trovano i seguenti dispositivi…

Dispositivi Hardware

Uno smartphone Android

Nexus 5Il mio è un nexus 5, ma va bene un qualsiasi telefono Android Froyo+ (se volete, potete provare a fare tutto con il vostro amato Windows Phone..).

Il telefono si occupa di convertire la voce in testo (sfruttando i servizi di riconoscimento vocale offerti da Google), testo che verrà usato per riconoscere i comandi e attivare il segnale di accensione e spegnimento della lampada. Ovviamente, quando parlavo di domotica low cost, lo smartphone non era incluso  😆

Il router di casa e la Raspberry PI

Raspberry PI Model BLa Raspberry PI è un pezzo fondamentale di tutti gli impianti di domotica fai da te. Io ho comprato una model B, ma anche la model A può essere usata per lo scopo. Per chi vivesse fuori da questo universo nerd, si tratta di un mini computer con SO Linux (raspbian) che verrà usato per lanciare il software server che si occupa di recepire le richieste provenienti dallo smartphone e tradurle in comandi per la lampada. Sulla raspberry ho caricato anche un semplice sito web mobile responsive con un tasto per accendere spegnere la lampada anche da browser. Per far funzionare i comandi sia dall’esterno che dall’interno occorre fare un po’ di lavoro con il DNS del router: configurare un nome DNS dinamico è il primo passo, poi bisogna fare in modo che lo smartphone e gli altri dispositivi accedano alla Raspberry PI tramite l’IP della LAN quando sono collegati in wireless, mentre devono usare l’IP pubblico quando sono collegati a reti esterne (trovatevi una bella guida BIND9 per configurare un server DNS sulla raspberry, impostate una DMZ sulla Raspberry se sapete usare iptables, oppure girate solo la porta 80 del router, per poter usare i dispositivi domotici dall’esterno).

Un trasmettitore X10: Marmitek CM15PRO

Marmitek CM15PROX10 è una tecnologia vecchia che ha avuto un grande successo in ambito di automazione industriale. Il fatto che sia vecchia, per noi, significa due cose: 1) È stabile ! 2) Costa poco ! Tutte le tecnologie moderne di home automation (Z-Wave, ZigBee) hanno delle potenzialità decisamente maggiori rispetto a X10, ma: costano tantissimo ! Una cosa è fare un esperimento con una lampada, un’altra cosa è controllare tutte le lampade della casa.

Il trasmettitore CM15PRO si collega alla Raspberry PI tramite la porta USB integrata e si può utilizzare con il software/driver Mochad. Una volta installato Mochad, è possibile collegare il dispositivo ed utilizzarlo direttamente per mandare segnali sulla rete elettrica.

I creatori di Mochad hanno reso molto semplice l’invio di comandi X10 su linea elettrica (ma anche in radiofrequenza, per chi volesse sperimentare):

[codesyntax lang=”bash” title=”Script per eseguire comandi X10″]

echo "pl A1 on" | nc localhost 1099
echo "pl A1 off" | nc localhost 1099

[/codesyntax]

 

Mochad ascolta sulla porta 1099 e, con i due comandi di cui sopra, si controlla il trasmettitore per inviare sulla linea elettrica il segnale di accensione o spegnimento del dispositivo A1 (per chi volesse approfondire, i dispositivi X10 sono identificati da una lettera che dovrebbe indicare un gruppo di dispositivi, come quelli di una intera casa/appartamento/stanza, e da un numero che identifica il dispositivo nel gruppo).

Questi comandi verranno eseguiti da uno script python installato sulla Raspberry, come vedremo dopo.

Il ricevitore dimmer X10: Taiyito TDXE4401

Tayito TDXE4401Questo dispositivo si occupa di ricevere i segnali X10 e di tradurli in corrente elettrica per la lampadina Ikea.

L’oggetto è difficile da reperire in europa e, dalle ricerche che ho fatto, gli equivalenti europei costano minimo il triplo. Considerando l’intenzione (folle ?) di inserire questi dispositivi per ogni lampada di casa, meglio risparmiare. Il costo dell’oggetto (esclusa dogana, se sapete come evitarla) varia tra i € 8 e i € 16 per pezzo.

Tenete conto che questo dispositivo non funge da interruttore di corrente ma da dimmer, ovvero, fa un gradevole effetto di sfumatura nell’accendere e spegnere la luce, consente di regolare la luminosità, ma la sfumatura non può essere evitata e questo può diventare un problema (vedi dopo..). Esistono dei dispositivi parenti del TDXE4401 che invece fanno da semplici interruttori di corrente, esempio, il TDXE4403 (solo switch). Una caratteristica di entrambi i dispositivi, a differenza di molti prodotti europei che costano il triplo, è che rispondono anche ai comandi di status (esempio, se accendo o spengo la luce manualmente, tramite l’interruttore manuale, posso interrogare il dispositivo per sapere se è acceso o spento in qualsiasi momento).

Lo switch TDXE4401 può essere anche utilizzato per dispositivi diversi da lampadine, purché non si superi il limite di consumo di 300 W (non ci potete attaccare la lavatrice o il forno direttamente… ma, usando un semplice relé…).

La lampada

Lampada IkeaLa lampada è il pezzo più economico di tutto il sistema… forse…

Il forse è dovuto al fatto che, mentre le vecchie lampade ad incandescenza andavano tutte bene per un dimmer come il TDXE4401, le lampade a neon non possono essere “dimmerate” nella maniera più assoluta, mentre le lampade a led devono essere scelte tra quelle “dimmerabili”. È ovvio che quelle dimmerabili costano di più.. Quindi prendete un semplice switch X10 (TDXE4403) se non volete spendere troppo.

Il collegamento col dispositivo (nella foto si vede l’obbrobrio…) è un po’ brutto, ma si trattava di un prototipo…

Tenete conto che, nel collegamento con il dispositivo, è stato necessario collegare il vecchio interruttore della lampada Ikea ad un circuito a corrente continua (prodotta dal dispositivo stesso) ad un voltaggio molto basso (non l’ho misurato). Non pensate di collegarci degli interruttori elettrici che si aspettano una tensione di 220V con corrente AC, esempio, quelli con la lucetta per vedere dove sono anche di notte. Va bene, invece, se avete dei semplici interruttori meccanici.

Software

Veniamo ora alla parte più bella, perché collegare l’hardware è interessante, ma è sul software che si può mettere in pratica la fantasia. Io parlerò di come è configurato un semplice riconoscitore vocale che arriva ad attuare un comando ma, con questa base si possono realizzare molte cose simpatiche.

Parte Server

La parte server viene eseguita sulla Raspberry PI e, come detto, ha il compito di ricevere tramite chiamata REST HTTP una istruzione e tradurla in un comando per Mochad che, a sua volta, invierà un segnale powerline al ricevitore X10 che, a sua volta, accenderà la lampadina.

Per la parte server, ho usato Python 2.7 con server WSGI di default su micro framework Flask.

Parte di inizializzazione:

[codesyntax lang=”python” title=”File x10/__init__.py”]

from flask import Flask

app = Flask(__name__)
app.config.from_object('settings')

from x10.lights import mod as lights_mod 
app.register_blueprint(lights_mod, url_prefix='/lights')

[/codesyntax]

 

File di definizione dei servizi REST esposti:

[codesyntax lang=”python” title=”File x10/lights.py”]

from flask import Blueprint, jsonify, request
from x10.commands import X10Manager

mod = Blueprint('lights', __name__)

@mod.route('', methods = ['GET'])
def list():
	X10Manager.listLights()
	return jsonify({'devices': X10Manager.listLights()})

@mod.route('/<lightid>', methods = ['POST'])
def changeLight(lightid):
	json = request.get_json();
	status = json["on"]
	if status==True:
		success = X10Manager.lightOn(lightid)
	else:
		success = X10Manager.lightOff(lightid)

	return jsonify({
		'success': success
	})

@mod.route('/<lightid>/brightness', methods = ['PUT'])
def bright(lightid):

	success = X10Manager.lightBright(lightid)

	return jsonify({
		'success': success
	})

@mod.route('/<lightid>/darkness', methods = ['PUT'])
def dark(lightid):

	success = X10Manager.lightDim(lightid)

	return jsonify({
		'success': success
	})

[/codesyntax]

 

Classe che implementa le funzioni X10, tramite comunicazione con Mochad sulla porta 1099. Ho usato una Queue per serializzare i comandi ricevuti ed evitare i problemi di sincronizzazione di Mochad.

[codesyntax lang=”python” title=”File commands.py”]

from subprocess import Popen, PIPE
import time
import settings
import Queue
from threading import Thread
import logging

class X10ManagerType(object):

	def __init__(self):
		self.logger = logging.getLogger("X10ManagerType")

		self.logger.info("Initializing X10Manager")

		self.workqueue = Queue.Queue()

		self.laststatusupdate=0
		self.lights = []

		light = {}
		light["id"] = "abatjour"
		light["on"] = False
		light["x10house"] = "A"
		light["x10number"] = "1"
		light["x10code"] = light["x10house"] + light["x10number"]
		light["description"] = "Abat-jour"
		self.lights.append(light);

		self.logger.info("X10Manager initialized: " + str(len(self.lights)) + " light(s)")

		self.logger.info("Creating worker thread")
		w = Thread(target=self.__worker__)
		w.daemon = True
		w.start()

		self.logger.info("Worker thread created")

	def listLights(self):
		self.__checkupdatestatus__()
		return self.lights

	def lightOn(self, lightid):
		light = self.__findlight__(lightid)
		if light:
			self.__command__("pl " + light["x10code"] + " on")
			return True
		return False

	def lightOff(self, lightid):
		light = self.__findlight__(lightid)
		if light:
			self.__command__("pl " + light["x10code"] + " off")
			return True
		return False

	def lightBright(self, lightid):
		light = self.__findlight__(lightid)
		if light:
			self.__command__("pl " + light["x10code"] + " bright")
			return True
		return False

	def lightDim(self, lightid):
		light = self.__findlight__(lightid)
		if light:
			self.__command__("pl " + light["x10code"] + " dim")
			return True
		return False

	def __checkupdatestatus__(self):
		#timenow = int(round(time.time() * 1000))
		#update = True
		#if timenow-self.laststatusupdate<15000:
		#	update = False

		#if update:
		#	self.laststatusupdate = timenow
		#	self.__updatestatus__()
		self.__updatestatus__()

	def __updatestatus__(self):
		status = self.__direct_command__("st")
		for line in status:
			for light in self.lights:
				if "House " + light["x10house"] + ":" in line:
					if light["x10number"] + "=" in line:
						onoffpos = line.find(light["x10number"] + "=")+2
						onoff = line[onoffpos]
						if(onoff=='1'):
							light["on"] = True
						else:
							light["on"] = False

	def __findlight__(self, lightid):
		for light in self.lights:
			if light["id"]==lightid:
				return light
		return

	def __command__(self, command):
		self.workqueue.put(command)

	def __worker__(self):
		while True:
			command = self.workqueue.get()
			self.__direct_command__(command)
			time.sleep(0.01)

	def __direct_command__(self, command):
		self.logger.info("Executing command '" + command + "'")

		echoout = Popen(["echo", command], stdout=PIPE).stdout
		ncout = Popen(["nc", settings.MOCHAD_HOST_NAME, str(settings.MOCHAD_PORT)], stdin=echoout, stdout=PIPE).stdout

		finalout = ncout
		result = []
		while True:
			line = finalout.readline()
			if line != '':
				result.append(line.rstrip())
			else:
				break

		return result

X10Manager = X10ManagerType()

[/codesyntax]

Il codice prevede la presenza di una sola lampada in casa con codice identificativo “abatjour”. La lampada è installata sulla posizione X10 A1 (il manuale del TDXE4401 vi spiegherà come configurare la posizione di ascolto).

Il server è molto semplice, ma può essere migliorato a piacere. Oltre alla funzione di accendi e spegni, potete notare la funzione di aumento e diminuzione di luminosità. Mancano la gestione (DB) delle luci controllate della casa, e le funzioni di controllo e scoperta di nuovi dispositivi, oltre a tutto quello che ci si può inventare…

Per far partire tutto, si può far girare il server web su porta 80 direttamente, oppure su una porta alta (di solito, 5555) con un reverse proxy davanti.

[codesyntax lang=”python” title=”Script di avvio”]

#!/usr/bin/env python

from x10 import app
app.run(host='127.0.0.1', port=80)

[/codesyntax]

 

Parte Android

Veniamo ora alla parte Android. Qui i file sono di più, quindi mi limiterò a sottolineare le parti rilevanti.

L’oggetto di riconoscimento vocale, da attivare alla pressione di un tasto sull’interfaccia viene creato nel seguente modo.

[codesyntax lang=”java5″ title=”SpeechRecognizer”]

SpeechRecognizer speechRecognizer = SpeechRecognizer.createSpeechRecognizer(MainActivity.this);
speechRecognizer.setRecognitionListener(new HomeAutomationSpeechRecognitionListener(this,this);

// Alla pressione del tasto "Ascolta"
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);        
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES, "it-IT");
intent.putExtra( RecognizerIntent.EXTRA_PROMPT, "Cosa vuoi fare ?");

speechRecognizer.startListening(intent);

[/codesyntax]

 

La classe HomeAutomationSpeechRecognitionListener si occupa di prendere il testo letto e tradurlo in comandi al server. Ne ho realizzato una versione molto semplice che evito di includere nell’articolo… Includo invece il comando di accensione luce.

[codesyntax lang=”java5″ title=”Comando di accensione luce”]

int TIMEOUT_MILLIS = 15000;  // = 15 seconds
HttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams, TIMEOUT_MILLIS);
HttpConnectionParams.setSoTimeout(httpParams, TIMEOUT_MILLIS);
HttpClient client = new DefaultHttpClient(httpParams);

HttpPost request = new HttpPost("http://mioindirizzoip/lights/abatjour");
request.setHeader("Content-Type", "application/json;charset=UTF-8");
request.setHeader("Authorization", "Basic [user:password di autenticazione, se presente, in b64]");

JSONObject json = new JSONObject();
json.put("on", true);

request.setEntity( new ByteArrayEntity(json.toString().getBytes("UTF-8")));
HttpResponse response = client.execute(request);

[/codesyntax]

E con questo, è tutto. Potete iniziare a fare cose divertenti !

Firebase

Architetture web two-tier

Esiste un approccio standard per realizzare applicazioni web,  che tutti noi, nerd programmatori, abbiamo imparato ad utilizzare negli anni senza discutere. Si tratta dell’architettura three-tier, che consiste in: una parte di presentazione, che gira sul client ed è solitamente realizzata in html/css con qualche spruzzata di javascript; una parte di business logic, che gira sul server e viene realizzata nella gran parte dei casi in Java EE, ma anche in Python, Node.js e, perché no, il caro vecchio PHP; una parte di storage, ovvero un database relazionale MySQL, Oracle (se il cliente ha soldi da spendere), Postgres, fino ai più recenti database NoSQL (Not only SQL).

La tecnologia avanza, le mode cambiano ma, spesso, a cambiare sono soltanto i linguaggi o i prodotti utilizzati in ognuna delle tre parti dell’applicazione. Suddividere logicamente un’applicazione in livelli distinti, anche più di 3 livelli, è qualcosa di naturale e utile. Suddividere fisicamente un’applicazione in 3 componenti sviluppate separatamente con linguaggi e tecnologie diverse… dipende !

È possibile fare a meno di tutta questa complessità e realizzare un’applicazione web a singolo strato ? La risposta, ovviamente, si chiama html, css, javascript e Web Storage oppure Indexed DB. Le ultime due tecnologie servono a colmare il gap, sempre esistito, tra applicazione desktop e applicazione web, permettendo il salvataggio di dati su un’area di storage privata del proprio browser. L’applicazione, così, non ha proprio bisogno di server, ovvero, potrebbe essere distribuita attraverso un web server che si occupa di fornire i soli asset statici, ma il server non conterrebbe alcuna logica applicativa. Altro metodo di distribuzione di applicazioni web singolo strato è l’app mobile: sono sempre più diffuse le app Android che constano solamente di una WebView che visualizza il contenuto html5 fornito in bundle con l’app.

Il problema è che questo tipo di approccio non consente di realizzare applicazioni web che possano essere universalmente ritenute tali. Si tratta, più che altro, di un ottimo metodo per realizzare applicazioni cross-platform, spesso mobile, con delle tecnologie standard. In applicazioni del genere, la condivisione delle informazioni con il resto del mondo (comprese postazioni di lavoro diverse dello stesso utente) è quasi impossibile. Ma se sostituissimo il Web Storage, o l’Indexed DB con uno storage esterno ?

Dopo mille parole di premessa, arrivo al punto: Firebase, uno strumento (gratuito, per piccole applicazioni) che nasce come servizio utile a semplificare di almeno 10 volte lo sviluppo di applicazioni web. Ed è davvero così !

Si tratta di nient’altro che un database cloud NoSQL utilizzabile da molti linguaggi diversi, compreso, ovviamente javascript. Sul sito ufficiale parlano di Node.js ma, utilizzandolo così, torniamo all’architettura a 3 strati classica. Dopo la procedura di registrazione e la creazione di un database privato sul sito di Firebase, l’integrazione prevede qualche semplice passaggio.

Importare lo script di integrazione al servizio:

<script src="https://cdn.firebase.com/js/client/1.0.6/firebase.js"></script>

A questo punto, basta creare un oggetto che consenta il collegamento al servizio remoto di Firebase.


var firebaseStorage = new Firebase('https://il-mio-db.firebaseio.com/');

Il database è un tipico NoSQL document oriented, senza schemi, né vincoli, che può essere utilizzato con oggetti JSON come file di interscambio. Le funzioni per operazioni CRUD sui dati sono molto semplici da imparare, una volta capita la struttura.


// Modificare un documento esistente (creandolo, se non esiste)
firebaseStorage.child("percorso/al/documento").set({name: "Ciccio", type="Human"});

// Inserimento di un documento con un id creato da Firebase
var obj = {text: "Hello world"};
var location = firebaseStorage.child("home/documents");
var id = location.push().name();
obj.id = id; // salvo l'id all'interno del contenuto del documento stesso (tipico in contesti NoSQL)
location.child(id).set(obj); // Inserisco

// Cancellazione di un documento
firebaseStorage.child("home/documents/ilmioiddeldocumento123").remove();

// Recupero di un documento (sempre asincrono)
firebaseStorage.child("home/documents/doc123").once("value", function(documentRef) {
var document = documentRef.val();
alert(document);
});

// Recupero di un insieme di documenti (sempre asincrono)
firebaseStorage.child("home/documents").once("value", function(documentsRef) {
documents = documentsRef.val();
});
// Ovvero uguale a prima, ma nella posizione home/documents ci sono più figli

// Ricevere (in real time) una notifica quando qualche altro utente modifica un dato
firebaseStorage.child("home/documents/xxx123").on("value", function(documentChangedRef) {
//...
});
// Ovviamente, si spegne con off(...)

// Query .. si può ..

Il numero di funzioni è sufficiente per sostituire in toto un server di backend di tipo CRUD e non solo. Firebase supporta anche, come visto, la comunicazione real-time dei cambiamenti sui dati ai browser collegati e le transazioni (al contrario di molti altri prodotti NoSQL).

Veniamo al nodo cruciale: sicurezza. Dovendo semplificare al massimo lo sviluppo dell’applicazione web, firebase ha al suo interno dei moduli di sicurezza oAuth configurabili (es. Facebook login, twitter) e supporta anche la registrazione mediante username e password con verifica tramite email. Una volta configurato un sistema di autenticazione, e integrato questo all’interno dell’applicazione web, si possono impostare dei criteri di sicurezza per l’accesso ai dati, direttamente nella console di amministrazione.

{
"rules": {
"home": {
"$user": {
".read": "$user == auth.uid",
".write": "$user == auth.uid"
}
}
}
}

Con la configurazione precedente, ho indicato che solo l’utente con un un certo UID (unique identifier, fornito dal sistema di autenticazione di firebase, può accedere al percorso “home/{uid-utente}” in lettura o scrittura. Ho creato così, una cartella privata. Al momento della creazione, il database viene configurato perché chiunque possa scrivere e leggere i dati in qualsiasi posizione, anche gli utenti senza autenticazione.

Si può configurare il servizio in modo da creare delle posizioni condivise tra utenti specifici. La configurazione non è complessa ma richiede un po’ di lavoro aggiuntivo.

Conclusioni

Creare un’architettura web a due strati, eliminando completamente il livello di logica applicativa lato server è possibile e, per alcune tipologie di applicazioni, anche auspicabile.

Spesso realizziamo diversi moduli Java EJB, con livelli di persistenza per il mapping ORM, con una serie infinita di classi e interfacce per… fare semplici operazioni CRUD sui dati. In queste occasioni, un pensiero alla possibilità di eliminare completamente il server è d’obbligo.

In particolare, per quel tipo di applicazioni di tipo SaaS, in cui l’utente ottiene un servizio dall’applicazione e, per nessun motivo al mondo, cercherebbe di fare un “tamper” dell’applicazione al fine di corrompere i dati, va assolutamente bene.

Se, invece, l’integrità dei dati è fondamentale per l’applicazione, un approccio del genere sarebbe sicuramente dannoso per la buona riuscita del progetto.

logo11w

Google to Acquire Nest

Abbiamo sentito parlare di Nest nei mesi scorsi, soprattutto per le mirabolanti novità che caratterizzano il loro famosissimo termostato intelligente, un pezzo di domotica che ogni buon Nerd vorrebbe avere in casa propria (e confesso che sto per ordinarne uno perché è troppo figo).

Oggi la notizia che Google ha acquisito la società per la modica cifra di 3.8 miliardi di euro in contanti. Avevo qualche dubbio sul funzionamento dell’aggeggio ma, visti gli esborsi dell’ultim’ora, tutti i dubbi sono svaniti…

 

MOUNTAIN VIEW, CA – JANUARY 13, 2014 — Google Inc. NASDAQ: GOOG announced today that it has entered into an agreement to buy Nest Labs, Inc. for $3.2 billion in cash.

Nest’s mission is to reinvent unloved but important devices in the home such as thermostats and smoke alarms. Since its launch in 2011, the Nest Learning Thermostat has been a consistent best seller–and the recently launched Protect Smoke + CO Alarm has had rave reviews.

Larry Page, CEO of Google, said: “Nest’s founders, Tony Fadell and Matt Rogers, have built a tremendous team that we are excited to welcome into the Google family. They’re already delivering amazing products you can buy right now–thermostats that save energy and smoke/CO alarms that can help keep your family safe. We are excited to bring great experiences to more homes in more countries and fulfill their dreams!”

Tony Fadell, CEO of Nest, said: “We’re thrilled to join Google. With their support, Nest will be even better placed to build simple, thoughtful devices that make life easier at home, and that have a positive impact on the world.”

Nest will continue to operate under the leadership of Tony Fadell and with its own distinct brand identity. The transaction is subject to customary closing conditions, including the receipt of regulatory approvals in the US. It is expected to close in the next few months.

viaGoogle to Acquire Nest – Investor Relations – Google.

tunnel-data

Hadoop e “Big Data”

Si dice che il 2014 sarà l’anno del Big Data… qualunque cosa questo significhi…

HadoopBig Data è una parola che va molto di moda, anche se ognuno di noi ha un’idea diversa sul suo significato. Analizzare “big data” significa estrarre conoscenza da grandi moli di dati, come possono essere i dati generati dal crawling di una gran quantità di siti internet, dai post nei social network di un gruppo cospicuo di persone, dalle variazioni di valore delle azioni in borsa nel corso degli anni per un numero consistente di titoli.

Il problema nasce proprio da qui… quanto grande ? che significa cospicuo ? 1 terabyte può essere considerato “big data” ? e 10 terabyte ?

Continua a leggere

Larry

Twitter Bootstrap Now Powering 1% of The Web

I segnali c’erano tutti. Moltissimi siti web di nuova generazione sono basati su questo fantastico template.

 

Love it or hate it but Twitter Bootstrap is quickly taking over the web. The team at meanpath recently pulled a random selection of 100 million websites from our source code search engine and found clear Twitter Bootstrap signatures on 981,608 of them. What started as an internal project championed by Twitter developers Mark Otto now a designer at Github and Jacob Thornton who left to work at Obvious Corporation has enabled millions of website owners to quickly launch a clean and responsive website without having to reinvent the wheel. At meanpath we a bunch of undesigners were able to deploy our site in under a day using a $10.00 theme.Version 3 of Bootstrap is currently at RC1 stage. Bootstrap is still the most popular project on Github with 53,916 Stargazers and 18,119 forks.August marks the second birthday for Twitter Bootstrap so the team at meanpath would like to extend an early happy birthday!Discuss this post on Hacker News.Have a play with the beta meanpath index.Follow us on Twitter.Image courtesy of Pink Cake Box.

via Twitter Bootstrap Now Powering 1% of The Web | meanpath.

Java

oAuthentication – Java

OAuth2oAuthentication è un plugin Java EE 6 per integrare in un’applicazione web i meccanismi di autenticazione oAuth 2 di Facebook o Google.

ll plugin richiede una configurazione molto semplice, da effettuare nel file web.xml dell’applicazione. Il modulo JAR include la maggior parte dei parametri di configurazione all’interno di un web-fragment.

Sono richiesti un container Java EE 6 o Java EE 6 Web Profile.

E’ possibile ottenere la libreria tramite Maven nel seguente modo:

</p>
<p style="text-align: justify;">it.nerdammer
oauthentication
1.0.5</p>
<p style="text-align: justify;">

Il file web.xml va configurato nel seguente modo:

</p>
<p style="text-align: justify;">oAuthenticationFilter
it.nerdammer.oauthentication.web.AuthenticationFilter</p>
<p style="text-align: justify;">DEFAULT_PROVIDER google
LOGIN_ERROR_PAGE /myErrorPage
FACEBOOK_APP_ID --get an app id from facebook--
FACEBOOK_APP_SECRET --the app secret from facebook--
GOOGLE_CLIENT_ID --get a client id from google app--
GOOGLE_CLIENT_SECRET --the client secret from google app--
oAuthenticationFilter
/web/private/*</p>
<p style="text-align: justify;">

Per informazioni sull’utilizzo si rimanda a Google Code.