Archivi categoria: Nerdaccia

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

20150116-221004.jpg

Salvataggio e ripristino di una VM libvirt (parte II)

Torniamo per completare quanto lasciato in sospeso nella precedente puntata.

Cominciamo con la definizione del metodo per eseguire il backup (seguirà quello per il ripristino) di una specifica VM individuata per id di dominio. Collocheremo questo (e quello per il ripristino) in una funzione bash che invocheremo nel programma principale che costruiremo attorno a questo nucleo applicando una qualche interfaccia per avere lista di domini su cui operare e così invocare ciclicamente la funzione.

Per operare il backup di una VM dobbiamo considerare la sua definizione e ogni immagine disco: nel caso più semplice avremo almeno due files: il file di definizione e una immagine disco. Ipotizzando di voler usare tar quale sistema di archiviazione è opportuno costruire un file con elencate tutte queste sorgenti (files) da sottoporre a l’opzione -T. Questo metodo è il più efficiente nell’ipotesi di utilizzo del comando tar, in quanto operazioni di aggiunta successiva di file in archivio su file compresso non sono consentite direttamente e comunque queste operazioni necessitano la rilettura dell’intero archivio per il posizionamento in coda dei nuovi elementi. Intollerabile.

Quindi cominciano con il produrre il file di definizione di un dominio:

virsh dumpxml "$1" > /tmp/${1}.xml

Nell’ipotesi di collocare questo in una funzione, $1 rappresenta l’unico argomento fornito a questa. Adottiamo /tmp come storage per pulizia.

Aggiungiamo questo file al costruendo file-elenco per tar:

echo "/tmp/${1}.xml" >/tmp/backup.files

Sfruttiamo il file di definizione del dominio per ritrovare i percorsi e nomi dei file di immagini disco appartenenti al dominio, e aggiungiamo questi nel file-elenco:

	grep 'source file=' /tmp/${1}.xml | egrep 'img|vdi|vmkd|qcow|qcow2' | cut -d\' -f2 >>/tmp/backup.files

A questo punto non ci resta che procedere ad archiviare il tutto sfruttando il nome del dominio come nome dell’archivio e soprattutto usando il file-elenco preparato prima:

	tar cz -f ${1}.tar.gz -T /tmp/backup.files

Non ci resta che pulire i files temporanei:

	rm /tmp/${1}.xml /tmp/backup.files

Ed il backup è concluso.

Nella prossima parte descriveremo il processo inverso e qualche suggerimento per costruire un buon programma principale per eseguire il tutto nel mondo reale.

20141231-181722.jpg

Salvataggio e ripristino di una VM libvirt (parte I)

Con l’adozione definitiva da parte di Red Hat e altri vendor di kvm/qemu quale piattaforma di virtualizzazione con hypervisor l’evoluzione software a contorno di questa tecnologia ha fatto grandi passi, consentendo ad oggi di ottenere una perfetta architettura di virtualizzazione di livello enterprise anche a casa vostra gratuitamente (mediante distro quali Ubuntu, Fedora, ecc).
La scalabilità dell’architettura viene garantita dalla infrastruttura costruita a partire dalla libvirt: un demone per il controllo anche remoto dell’hypervisor, una interfaccia amministrativa grafica e una testuale e altro a corollario.

20141231-181855.jpg

Da questa complessa architettura risulta ancora assente uno strumento integrato e completo per il salvataggio e ripristino delle VM.

Assenza però non significa impossibilità: con strumenti disponibili e standard si può realizzare un semplice ma efficace e sicuro software per la realizzazione di procedure di salvataggio e ripristino automatico di VM gestite da libvirt.

Questo sarà oggetto di questa serie di articoli.

Gli strumenti disponibili
La console amministrativa virsh ha i comandi dumpxml e define atti a salvare e ripristinare la definizione di una VM (un dominio, nella nomenclatura libvirt). Questo è un buon punto di partenza.
Quello che manca è il salvataggio della componente storage della VM. Questa è descritta nel file XML di definizione, ed in ogni caso è uno o più file collocati nel percorso /var/lib/libvirt/images/.
Questo percorso è accessibile solo da utente amministratore (l’hypervisor che ne gestisce l’accesso è un servizio di sistema), e questo diviene un requisito per una costruenda procedura automatica.

Il salvataggio di una VM è dunque la copia della sua definizione e dei file delle immagini disco.
Per realizzarlo è sufficiente dunque copiare questi files in un archivio (magari compresso) su un supporto esterno.

Vedremo della prossima puntata il codice (script shell) con cui realizzare questo compito.

Defrag_icon

Deframmentare Linux ?

Non vogliamo tirarla lunga con un articolo accademico sulla frammentazione e sulle tecniche implementate per minimizzarla sui filesystem della famiglia ext*.

Vogliamo solo farvi giocare concretamente con questo concetto/problema che sfugge all’attenzione degli utenti (e sistemisti Linux) per un assunto ben poco esatto ma comunque in concreto valido: “Linux non soffre di problemi di frammentazione”.

In realtà questo, come abbiamo detto, non è “esattamente” vero (e non vogliamo tediarvi con questioni tecniche), ma è altrettanto vero che il filesystem ext2 (e successori) ha dei buoni anticorpi per risolvere l’influenza della deframmentazione.

Il primo giocattolo per poter cominciare a saggiare con mano l’esistenza di questa realtà è il comando filefrag. Questo è disponibile nel pacchetto e2fsprogs (disponibile sia su distribuzioni RedHat like che Debian like).

Questo comando è capace di rilevare la frammentazione di un file indicato, in numero e identità dei blocchi di indirezione (extents).

A partire da questo e considerando che tra gli artifici del filesystem ext2 (e successori) per evitare la framentazione vi è la tecnica di allocare sequenzialmente i blocchi di un file in fase di creazione, possiamo porre le basi per un nuovo giocattolo.

Prendiamo ora il seguente nuovo assunto: “per deframmentare un file basta copiarlo”.
La nuova copia (per via del modo di allocazione blocchi) sarà “probabilmente” deframmentato. Il “probabilmente” è dovuto al fatto che i blocchi contigui devono essere disponibili. Ecco perché nell’implementazione provvediamo a copiare il file su un filesystem di appoggio (di base /tmp), liberiamo spazio sul filesystem sorgente (per aumentare la probabilità di trovare blocchi consecutivi) e ricopiamo nuovamente il file.

Dato che “repetita iuvant”, ripetere questa operazione quando la deframmentazione non è stata pienamente possibile potrà renderla possibile (a patto che il filesystem sia nel frattempo mutato rendendo disponibile nuove sequenze di blocchi contigui).

Ed ecco il nostro defrag per Linux:

#!/bin/bash
#
#
[ "$USER" != "root" ] && echo Must be root && exit 1

TEMPFILE=`mktemp`
trap 'rm -f $TEMPFILE' EXIT 1 15

echo -n "Raccolgo elenco file(s) ... "
find ${1:-.} -type f 2>/dev/null | grep -v $TEMPFILE >$TEMPFILE
echo fatto
NFILES=`cat $TEMPFILE | wc -l`
echo "Trovati $NFILES file(s)"

exec 3<> $TEMPFILE
declare -i i
declare -i defrag

i=0
defrag=0
read <&3
while [ -n "$REPLY" ]
do
EXTENTS=`filefrag "$REPLY" | cut -d: -f2 | awk '{ print $1 }'`
if [ ${EXTENTS:-0} -gt 2 ] 2>/dev/null; then
# Usare mktemp -p /altrodisco (se server più spazio)
TEMP=`mktemp`
cp -dp $REPLY $TEMP
rm -f $REPLY
cp $TEMP $REPLY
rm -f $TEMP
defrag=$(( defrag + 1 ))
fi
i=$((i + 1))
echo -en "\r$i/$NFILES ($(( 100 * i / NFILES ))%)"
read <&3
done
echo
exec 3>&-
echo "Processati $i file(s)"
echo "Deframmentati $defrag file(s)"
trap '' 1 15
exit 0

Ovviamente, in quanto giocattolo, non possiamo chiedervi di provarlo in ambienti di produzione. Pur essendo (crediamo) esente da problemi, non è consigliato soprattutto per il suo tempo di esecuzione, che è legato proporzionalmente alla dimensione e numero dei files da ottimizzare.

Non è il migliore degli approcci, ma è capace di ottenere il suo scopo. Soprattutto è capace di mostrarci il motivo nascosto del perché in Linux abbiamo pochi problemi di frammentazione (la copia dei file che ogni tanto avviene o la creazione degli stessi sono alla base della deframmentazione che avviene fuori dal nostro sguardo)

A noi bastava fornire una fascinazione riguardo il problema.

 

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 !

200px-X11.svg

GDM: Niente panico !

Se la nostra sessione grafica si rifiuta di autenticarci attraverso Gnome Display Manager, e ci ritroviamo di nuovo una bella richiesta di credenziali, niente panico !

Prima di tutto vediamo di accedere in console testo: premiamo la combinazione di tasti “Ctrl+Alt+F1” ed inseriamo le nostre credenziali.

Se la registrazione delle nostre credenziali va a buon fine e accediamo alla nostra sessione testo, allora il panico deve rimanere un lontano ricordo. Siamo ad un passo dalla soluzione.

Una rapida occhiata al log potrebbe rilevare il seguente messaggio:

lightdm: pam_succeed_if(lightdm:auth): requirement "user ingroup nopasswdlogin" not met by user "mioutente"

Ottimo!

Nel 99.99% dei casi il problema è dovuto alla corruzione del file ~/.Xauthority.

I motivi possono essere diversi, ma nella maggioranza dei casi è una interruzione di alimentazione del sistema durante una sessione grafica in corso (avete ritrovato il vostro sistema spento?).

Il file ~/.Xauthority è parte del metodo di autorizzazione “cookie-based” utilizzato dal server X; dei diversi schemi di autorizzazione supportati dal server X il GDM supporta solo lo schema MIT-MAGIC-COOKIE-1.

Il “biscotto magico” (magic cookie) è un arbitrario insieme di dati definiti (dal comando xauth) per un server X che ciascun programma client deve dimostrare di conoscere (inviandone una copia).

Per una configurazione workstation, in cui il server X è disponibile per una singola sessione utente, il cookie viene generato all’avvio del server X dedicato alla sessione del singolo utente, pertanto copia del cookie viene posta nella home directory dell’utente nel file .Xauthority.

utente@ubuntu01:~$ od -c .Xauthority
0000000 001  \0  \0  \b   u   b   u   n   t   u   0   1  \0 001   1  \0
0000020 022   M   I   T   -   M   A   G   I   C   -   C   O   O   K   I
0000040   E   -   1  \0 020 340 224 367 025   F   8 034   z 343 205 177
0000060 311   m   s   _ 225 001  \0  \0  \b   u   b   u   n   t   u   0
0000100   1  \0 001   0  \0 022   M   I   T   -   M   A   G   I   C   -
0000120   C   O   O   K   I   E   -   1  \0 020   3 341 203 317 206 207
0000140 212   }   }   {   s 331   : 355 262 343
0000152

E se non si riesce ad entrare in sessione testo?

Allora PANICO ! …  😯

no, si scherza! 😆

Questo lo vedremo in un prossimo post.

cilindro2

crypt-à-porter

Tutti usano SSL nella vita digitale quotidiana: nell’utilizzo della posta elettronica, nell’accesso ai siti web, nei propri certificati digitali e, perfino a nostra insaputa, in mille altre appliances del nascente campo “internet-of-things”, quindi facilmente recuperabile onboard sui diversi sistemi embedded (O_o).

Se hai bisogno di crittografare velocemente un file on-the-fly in maniera simmetrica, non è necessario ricorrere a complesse architetture o a programmi addizionali, o impazzire con le migliaia di salse in cui è possibile interagire con openssl. Basta digitare da semplice riga di comando:

$ openssl enc -in <fileA> -out <fileB> -e -aes256 -k <mypass>

e, altrettanto semplicemente, decrittografare con:

$ openssl enc -in <fileB> -out <fileA> -d -aes256 -k <mypass>

Ovviamente, funziona anche sul tuo Mac  😉

tux-banner

BASH: il problema del costrutto while e OpenSSH

Capita spesso in BASH di realizzare un costrutto che iteri il comando OpenSSH; capita spesso che questo avvenga a partire da una WHILE READ in quanto questo non è altrimenti sostituibile con un FOR o con un parallel-ssh (es. il file di forma tabellare fornisce più di un parametro a OpenSSH).

Esempio

while read HOST USER CMD; do ssh $USER@$HOST "$CMD"; done < lista

Ebbene, quello che otteniamo è l’esecuzione dell’OpenSSH solo in corrispondenza della prima riga del file senza alcun tipo di evidenza di errore. Nella magiorparte dei casi viene data la colpa al costrutto WHILE o al comando READ.
Nulla di più falso!

Cosa accade in realtà?

Nella realtà accade che il comando OpenSSH legge da STDIN, e il corpo istruzioni del costrutto WHILE READ non maschera lo standard input del costrutto, pertanto i comandi all’interno del corpo istruzioni possono attingere al medesimo STDIN. Quindi alla prima esecuzione di OpenSSH, questo consuma l’intero STDIN, lasciando la successiva iterazione priva di altri dati, portandola conseguentemente a corretta conclusione.

Soluzione 1
Utilizzare l’opzione -n del comando OpenSSH

while read HOST USER CMD
do
ssh -n $USER@$HOST "$CMD"
done < lista

Soluzione 2 (valida per somandi anche differenti da OpenSSH)

while read HOST USER CMD
do
ssh $USER@$HOST "$CMD" < /dev/null
done < lista