Pagine

mercoledì 14 dicembre 2011

Servizi per il mondo Twitter

Premessa

Twitter è un social network estremamente dinamico e flessibile.
Per chi volesse delle informazioni su di esso, ho pubblicato qualche tempo fa un articolo introduttivo con il titolo Twitter, di tutto e di più.
Qualche mese fa, inoltre, soprii anche un database di applicazioni e recensii le più interessanti nell'articolo Database di applicazioni Twitter.
Oggi sono a parlarvi di applicazioni più strutturate che fanno parte del mondo e della comunità di twitter.

Mentionapp

Mentionapp è una applicazione simpatica ed utile che permette di tracciare una sorta di mappa mentale con la lista dei contatti e degli #hashtag di un determinato utente..
E' estremamente facile utilizzarla: basta connettersi al proprio account dalla Home Page del servizio e nella casellina di ricerca inserire il nome dell'utente del quale si stanno cercando informazioni.
In pochi secondi viene presentata una figura come quella a destra.
Ovviamente se si clicca su un determinato utente o un #hashtag viene espanso il grafico relativo dandoci una idea del network sviluppato intorno ad esso.
Ogni blocchetto è collegato agli altri con linee di differente spessore che indicano una maggiore o minore affinità all'utente. I blocchetti/linee di colore grigio specificano affinità molto basse o di secondo livello.
L'account è gratuito.

SocialBrio e Twitsprout

SocialBrio è un tool davvero impressionante che permette la gestione della propria comunity twitter in maniera estremamente rapida e compatta; fornisce moltissime informazioni sui propri contatti, follower e followings, liste, la provenienza, le mode, gli #hastag più utilizzati e mille altre informazioni.
E' un programma multipiattaforma che si può scaricare su Windows, Mac, Linux ma anche come plugin di Google Chrome.
Come si può vedere dalla immagine riportata a destra viene utilizzato da molte società quali IBM, TomTom, Smart, Mastercard per analizzare le tendenze e le mode dei propri clienti. Insomma per chi usa twitter per lavoro questo è uno strumento al quale, secondo me, non si può rinunciare. Per tutti coloro che usano twitter per lo svago ed il tempo libero permette una visione più a tutto tondo della comunity che si sta costruendo intorno a sè. Ad ogni buon conto è un tool da provare assolutamente!
L'account gratuito è pienamente utilizzabile ed interessante ma vi è la possibilità di fare un upgrade a pagamento con delle feature aggiuntive.
Un servizio simile e molto gradevole nel look è Twitsprout.

BufferApp

Bufferapp ha essenzialmente due scopi.
Il primo è di creare una sorta di buffer (pensatelo come un cestino dove depositate i post) che viene svuotato ad orari prestabiliti dall'utente. In sostanza quando si vuole condividere una pagina web o qualsiasi contenuto, si aggiunge il post al buffer e questo verrà pubblicato al momento deciso dall'utente. Questa feature è particolarmente utile, a mio avviso, in due casi: utilizzando strumenti come SocialBrio (descritto sopra...) si nota quali siano gli orari di maggiore utilizzo twitter da parte degli utenti. In questo modo l'utente può programmare l'invio dei propri post in modo che siano facilmente leggibili e ricondivisibili. D'altro canto se si lavora in un ufficio è possibile programmare l'invio dei post ad orari non... incriminabili....
Il secondo compito di Bufferapp è conteggiare tutti i click, i mentioning e i reply effettuati dagli altri utenti twitter. In sostanza si può tenere traccia di quanto "successo" o "fallimento" in termini di "audience" raccolgono i nostri post.
Esistono plugin per Chrome, Firefox, cellulari e molti servizi sul web.
L'account gratuito è pienamente utilizzabile ed interessante ma vi è la possibilità di fare un upgrade a pagamento con delle feature aggiuntive.

Storify

Storify è una applicazione interessantissima che permette di creare delle "storie" attraverso links, post in twitter, pubblicazioni. Sostanzialmente permette di raccogliere in una unica pagina l'evoluzione di un discorso che si snoda tra social networks differenti. Un aggregatore insomma ma pubblico.
Ovviamente si possono raccogliere anche clip audio e video per rendere maggiormente incisiva la "storia".
Si tenga conto che un recente studio di bit.ly, uno dei servizi che servono per accorciare gli indirizzi web, ha dichiarato che la vita media di un link non supera le 2.8h prima di passare nell'oblio.
Lo stesso twitter, dopo due settimane, rende i post non più disponibili sul profilo dell'utente se non con ricerche specifiche.
Ecco come in questo scenario, un servizio come Storify può essere estremamente utile. Si veda un esempio qui delle mie pubblicazioni podcast access presso l'Università Popolare di Torino.
L'account gratuito è pienamente utilizzabile ed interessante ma vi è la possibilità di fare un upgrade a pagamento con delle feature aggiuntive.

Form-u-list

Form u list è un servizio che permette di creare delle liste in maniera automatica al verificarsi di un evento...
Alcuni esempi: le persone con le quali scambio più messaggi, quelle che mi menzionano, quelle che fanno il retweet dei miei post e così via...
Questo comportamento ci permette di aggiungere/togliere profili dalle nostre liste donando al nostro profilo estrema dinamicità ma anche inserendo o togliendo le persone in base ad eventi.
L'account gratuito è pienamente utilizzabile. Già nella versione base da un assaggio di cosa possa fare. Purtroppo, però, permette la gestione di sole due liste. Se si vuole creare un numero maggiore di liste sarà necessario passare alla versione Premium.

giovedì 8 dicembre 2011

Python ed i CSV

Premessa


I CSV sono semplicissimi files di testo e sono un primo esempio di database sebbene con delle limitazioni. L'acronimo significa Comma Separated Value ovvero "Valori Separati da una Virgola". In sostanza un file CSV si può aprire con qualsiasi editor di "testo semplice" in qualsiasi sistema operativo e si presenta come qualcosa del genere:

Essi, come detto prima, sono un primo esempio di database sebbene la struttura non possa essere complessa data la natura del supporto.

 

Vantaggi e svantaggi nell'uso dei CSV


I database ma anche un semplice foglio di calcolo, offrono performance, personalizzazioni, decisamente maggiori rispetto ai CSV.
Per questi motivi molte persone pensano, a torto, che il sistema CSV, data la sua semplicità intrinseca sia ormai obsoleto.
Ma allora chi usa e perchè viene usato questo formato?
I CSV, a mio avviso, hanno due enormi vantaggi.
Da una parte permettono di immagazzinare quantità abnormi di dati: un foglio di Excel, ad esempio, ha un limite numerico di righe e colonne mentre CSV non soffre di questo limite: esso può immagazzinare "virtualmente" infinite colonne ed infinite righe. 
Ovviamente il limite esiste ma dipende dalla memoria RAM e dal file system e non dal supporto in sè.
L'altro vantaggio è la portabilità del formato: la maggior parte dei fogli di calcolo (si pensi MS Excel) e server sql (si pensi ad AS400 o MS SQLServer) sono proprietari e girano su uno o pochi sistemi operativi; i CSV, al contrario, essendo file di testo possono essere letti e scritti da qualsiasi software su qualsiasi sistema operativo: questo fattore li rende degli alleati insostituibili che permettono il dialogo tra sistemi anche estremamente differenti tra loro.
Facciamo, dunque, uno schemino in breve dei vantaggi/svantaggi.
Partiamo ad evidenziarne gli svantaggi:
  • non gestisce le relazioni fra tabelle
  • non permette la creazione di viste, stored procedure e tutte le altre facilitazioni proprie dei server sql
  • non permette la gestione della multiutenza: può accedere solo un programma/persona per volta.
E, successivamente i vantaggi:
  • formato universale: si possono leggere e scrivere file CSV con qualsiasi software su qualsiasi sistema operativo
  • permette di gestire "infinite" quantità di dati senza limiti di colonne (campi) e/o righe (record).

 

Dialetti

Ciascun CSV può differenziarsi per il "dialetto" utilizzato.
Un dialetto viene identificato, prevalentemente da tre parametri:
  1. il separatore tra un campo e l'altro: in America è di default la virgola (,) e da qui il nome "Comma". Nei paese non anglosassoni, Italia inclusa, poichè la virgola è il separatore tra le cifre decimali di un numero, si utilizza il punto e virgola (;) come nell'esempio precedente.
  2. il separatore tra un record e l'altro: solitamente ogni volta che si va a capo, si identifica un nuovo record. Questa scelta generalmente accettata da tutti può, all'occorrenza, essere modificata con un altro carattere. Si ricorda che il carattere a capo è identificato da "\n" su linux/unix e da "\r\n" sui sistemi windows.
  3. il quoting: ci si riferisce alle virgolette singole (') o le virgolette doppie ("); vengono utilizzate per racchiudere un testo. Sono particolarmente utili quando si pensa di voler utilizzare all'interno di un campo anche il separatore.
Una delle prime cose da fare, dunque, quando si lavora con i CSV in python è definire il dialetto che viene utilizzato.
Il modulo CSV ha già un paio di dialetti preimpostati che sono quelli utilizzati da excel ma, all'uopo, se ne può impostare di personalizzati.

 

Script di esempio

Prima di creare questo script devi creare il file dati.csv e dati2.csv con le seguenti righe.
Dati.csv:


Dat2.csv


Ed infine lo script:

giovedì 17 novembre 2011

Database applicazioni Twitter

Database applicazioni Twitter

Qualche tempo fa ho scoperto che esiste un sito che raccoglie le applicazioni che appartengono al mondo di twitter. Si chiama twtbase e si può raggiungere tramite il link seguente: http://www.twtbase.com/


Il sito è ricco di applicazioni orientate a questo socialnetwork che possono essere usate su desktop e mobile e riguardando l'interfacciamento con browser, cellulari e dispositivi di qualsiasi altro genere.
Di seguito vado ad elencare alcune delle applicazioni che ho visto in questo sito e che ritengo interessanti...
  • filetweet e twitdom: sono metodi estremamente veloce per caricare un file e inviarlo ad un utente di twitter o anche ad un indirizzo email. La grandezza massima è di 2Gb. Molto molto onesto! Non richiede iscrizione.
  • textsave: per memorizzare testi ben più lunghi di 140 caratteri messi a disposizione di twitter. Non richiede iscrizione.
  • when did you join twitter?: Se vuoi sapere quando una persona si è iscritta a twitter puoi usare questa applicazione. Non richiede iscrizione.
  • twibes: permette di gestire e creare gruppi su twitter. Richiede iscrizione.
  • twitpic:  permette il caricamento di video e foto anche da cellulare da condividere su twitter. Non richiede iscrizione.
  • morsetweet: genera e traduce codice morse. Non richiede iscrizione.
  • tweetvox: permette di caricare e condividere file audio/podcast. Richiede iscrizione ed eventualmente a pagamento per maggiore richiesta di spazio.
  • twtpoll: per creare sondaggi da condividere. Richiede iscrizione e pagamento.
  • twtvite: per creare eventi e gestire le iscrizioni. Richiede iscrizione e servizio a pagamento.
  • twitter tag project: una lista dei bot disponibili per questo social network. Non richiede iscrizione.
E' da notare, inoltre, che molti di questi servizi hanno anche una app sui dispositivi mobili quali Android e/o iOS e per questo sono estremamente appetibili poichè si possono usare sia quando siamo seduti davanti la nostra scrivania sia con i nostri dispositivi mobili.
Vi invito a segnalarmi eventuali altre interessanti applicazioni per twitter.

lunedì 18 luglio 2011

Python: importare CSV in SQLite

Premessa

Dopo aver:
  1. Introdotto il sistema di database SQLite
  2. Visualizzato alcuni comandi a riga di comando per la gestione di questo sistema
  3. Approfondito la riga di comando
Vediamo come interagire con python, CSV e SQLite

Importazione di un file csv con python in sqlite

Nel seguente esempio ci connettiamo ad un database sqlite (se non esiste viene creato) e creiamo una tabella.
Successivamente andiamo a leggere un file CSV (che abbia come separatore il ";") e lo importiamo nella tabella appena creata.
Per facilità non viene fatto alcun controllo.

import csv
import sqlite3

con = sqlite3.Connection('fileprova.sqlite')
cur = con.cursor()
cur.execute('CREATE TABLE "nominativi" ("Cognome" varchar(20), "Nome" varchar(20));')

f = open('nominativi.csv')
csv_reader = csv.reader(f, delimiter=';')

cur.executemany('INSERT INTO nominativi VALUES (?, ?)', csv_reader)
cur.close()
con.commit()
con.close()
f.close()

giovedì 14 luglio 2011

SQLite da riga di comando (2)

Premessa

Dopo una veloce carrellata dei comandi di SQLite visti nell'articolo precedente denominato SQLite da riga di comando (1), in questo articolo andremo un pochino più nei dettagli sebbene non è scopo di questo articolo, essere una guida al linguaggio SQL..

Creiamo/modifichiamo un database

Dopo aver scaricato e scompattato SQLite, la prima cosa da fare è modificare un database o, se questo non esiste, dobbiamo crearlo:
sqlite3 prova.db

A questo punto ci verrà presentata la shell già vista nel precedente articolo. Per essere sicuri di lavorare sul database sopra citato possiamo digitare il comando .database con relativo output in rosso.
sqlite- .database

seq name file
--- ----- -------------------
0 main j:\sqlite\prova.db

Creiamo una tabella

Come ho già detto, dato che si parla di comandi SQL, rimando ad una guida più esaustiva. In questa sede si vuol solo dare una idea di massima. La prima cosa da fare, però, è proprio la costruzione di una tabella dove immagazzinare i nostri dati. A titolo di esempio, pensiamo ad un elenco di prodotti.
sqlite- CREATE TABLE Prodotti (IDProdotto INTEGER PRIMARY KEY, Colore varchar(25), Prezzo double);

Il programma non ci restituirà alcun output che significa che tutto è andato a buon fine.
Quando un numero intero (integer) è dichiarato chiave primaria come nell'esempio, sqlite lo identifica come autoincrementale.

Viste ed indici

Le viste sono come tabelle virtuali. Permettono di vedere le singole tabelle o più tabelle in join, con criteri differenti tipo "due campi di A, 1 campo di B e 3 di C come se fossero un'unica tabella".
Gli indici, al contrario, sono dei campi privilegiati. Essi, se interrogati, hanno dei tempi di risposta decisamente minori.
In altre parole se chiedete tutti gli abitanti di una città e il campo città è indicizzato, la ricerca su vasta scala sarà decisamente più veloce.
La differenza non si nota con qualche centinaio di record ma con migliaia o milioni di record...
Vediamo un esempio di vista e di indice:
sqlite- CREATE VIEW vistaRosso AS select Colore, Prezzo from Prodotti where Colore="Rosso";

sqlite- CREATE INDEX indiceProva on Prodotti (IDProdotto);

Elenco tabelle, viste, indici, schema

Può essere necessario "ricordarsi" la lista degli oggetti elencati nel sottotitolo. Di seguito i comandi con i relativi output in rosso. Una nota di riguardo allo schema: è il termine con il quale SQLite indica gli schemi di creazione degli oggetti come tabelle, viste.
sqlite- .tables
Prodotti

sqlite- .tables P%
Prodotti

sqlite- .indices
indiceProva

sqlite- .indices Prodotti
indiceProva

sqlite- .schema
CREATE TABLE Prodotti (IDProdotto INTEGER PRIMARY KEY, Colore varchar(25), Prezzo double);
CREATE VIEW vistaRosso AS select Colore, Prezzo from Prodotti where Colore="Rosso";
CREATE INDEX indiceProva on Prodotti (IDProdotto);


Inserimento record

A questo punto è arrivato il momento di inserire un po' di record.
Nel precedente articolo ho già fatto vedere come si fa ed ho anche evidenziato l'opportunità di importare dei files di testo (CSV) creati in Excel o OpenOffice Calc. Rimando quindi all'articolo.

Visualizzare i dati

La parte più affascinante è senza dubbio l'interrogazione del database. Anche qui rimando ad un manuale più esaustivo per la sintassi del comando SELECT nel linguaggio SQL.
sqlite- SELECT * FROM Prodotti;
1|Rosso|44.55
2|Rosso|33.33
3|Giallo|34.33
Eventualmente si può rendere più gradevole l'ouput si possono utilizzare delle opzioni come mode e/o headers. Personlamente, prima del select, consiglio le seguenti opzioni:
sqlite- .headers on
sqlite- .mode column
sqlite- SELECT * FROM Prodotti;

IDProdotto Colore Prezzo
----------- ------ -------
1 Rosso 44.55
2 Rosso 33.33
3 Giallo 34.33

Esportare/Importare i dati

Una possibilità molto interessante è la possibilità di esportare il database o anche solo una tabella in formati differenti.
sqlite- .output fileoutput.sql
sqlite- .dump
sqlite- .output stdout
In questo modo verrà creato un file con le istruzioni SQL per la creazione delle tabelle, inserimento dati.
Tale file può quindi essere un backup a tutti gli effetti, importabile in un secondo momento come segue:
sqlite- .read fileoutput.sql

SQLite da shell di sistema

La feature più interessante di tutte, a mio avviso, è la possibilità di dare i medesimi comandi non da shell interattiva ma da shell di sistema.
Questo ci da modo di creare degli script di sistema (file.bat in windows, script in linux e MacOS) in maniera estremamente agevole e veloce.
Non mi dilungherò troppo ma mi limiterò a fare tre esempi:
1) Selezione: sqlite3 -header -column prova.db 'select * from Prodotti;'
2) Visionare lo schema: sqlite3 prova.db '.schema'
3) Inserire un record: sqlite3 prova.db 'insert into Prodotti values (NULL, "Giallo", 33.55)
4) Fare il backup: sqlite3 prova.db '.dump' > fileoupt.sql

Conclusioni

SQLite è, senza dubbio, un sistema di database molto interessante; per degli approfondimenti rimando ad un mio precedente articolo: sqlite, libreria sql in 200kb.
Personalmente lo reputo un alleato estremamente potente ed utile nella vita "informatica" di tutti i giorni come memorizzatore di log ma anche come aiuto nella operatività giornaliera.
Ovviamente non va bene se si intende utilizzarlo come sistema multiutente ma saprà donare moltissime soddisfazioni in tutti quei contesti monoutente dove è richiesta rapidità, semplicità d'uso e poco ingombro.

lunedì 11 luglio 2011

bikeComputer con Arduino

Premessa

Finalmente è arrivata l’estate e con essa il caldo; la voglia di uscire e stare all’aria aperta si fa sentire ogni giorno con maggiore forza e, talvolta, nei pigri pomeriggi cittadini, nelle assolate domeniche fuori porta o sulla passeggiata del lungo mare decidiamo di abbandonare la tanto amata automobile per tornare a mezzi di locomozione più tradizionali: le nostre gambe ma, soprattutto, la bicicletta.


I più curiosi, in queste occasioni, vorrebbero sapere quanti chilometri riescono a percorrere, quale sia la velocità di punta toccata e quante pedalate riescono a fare in un minuto; magari per vantarsi con gli amici :-). E’ per far fronte a queste esigenze che io ed Enkel abbiamo pensato di progettare il bikeComputer con Arduino. In questo articolo vi racconterò come abbiamo fatto.

L'immagine che vedete qui sopra è il prototipo funzionante che abbiamo avvolto nello scotch sul manubrio della bici di Enkel per fare il test "su strada" :-)
Potete trovare tutte le immagini del progetto in questa pagina.


L'idea

L’idea è semplice: tramite arduino si visualizza la velocità di punta e la velocità media su un display 16X2.
Per contare i giri della ruota abbiamo utilizzato un reed switch. Questo sensore si comporta come un interruttore: esso rimane normalmente aperto (e quindi non passa corrente); arduino lo vede come un segnale digitale LOW.
Quando passa un magnete vicino (posizionato sui raggi della ruota), il sensore si chiude facendo passare corrente; in questo modo restituisce un HIGH digitale ad arduino riconosce il passaggio del magnete; il tempo trascorso tra un passaggio e l’altro ci permette di calcolare la velocità istantanea (e successivamente quella media) e, conoscendo il raggio della ruota, si può calcolare il numero di metri percorsi.
Analogo discorso si può fare per contare le pedalate piazzando il magnete sulla corona della bicicletta ed un secondo reed switch sul telaio della bicicletta.
Per ragioni di compattezza abbiamo utilizzato uno schermo LCD 16x2 ma abbiamo meditato l’uso di un 20x4 in modo da vedere tutte le informazioni contemporaneamente.
Ciò che ci interessava molto, però, era anche la possibilità di poter fruire dei dati dopo aver terminato la scampagnata (si pensi ad una gita: vado in un luogo in bici, mangio, gioco a freesbie e riprendo la bici fino a casa dove voglio analizzare le mie performance); per questo motivo abbiamo usato uno shield microSD con memoria da 1Gb.
La memoria ha un duplice scopo: l'utente dovrà inserire un file da denominare config.txt (qualsiasi operativo può creare un file di testo semplice) dove inserisce un numero di 4 cifre che esprime il diametro della ruota della propria bicicletta in mm (serve per il calcolo della distanza percorsa); dal canto suo arduino aggiorna il file log.txt.
Tale file sarà creato ed alimentato da arduino con tante righe quanti sono i passaggi del magnete; ogni riga contiene il numero di millisecondi passati dall’accensione di arduino (tramite la funzione millis()) nel momento in cui si rileva il passaggio del magnete vicino al reed (da questi è poi semplice ricavarsi tutto il resto magari effettuando un grafico con Processing).
L’alimentazione del sistema è stata affidata ad un pacco batterie composto da 4 pile in serie. Conteggiando circa 1.2-1.5V per ciascuna si arriva ad una tensione di alimentazione di 4.8-6V che abbiamo inserito direttamente nel pin Vin per evitare inutili dispersioni di energia.
Per quanto riguarda il “case” ci siamo appoggiati al FabLab di Torino (nelle immagini non è ancora presente ma è "coming soon") grazie all’aiuto di Davide G. ed Enrico C. che ci hanno aiutato con il laser-cutter a progettare un adeguato alloggiamento per il sistema.
Una esigenza con la quale ci siamo scontrati, inoltre, era il desiderio di rendere indipendente il reed sensor e il “case” con arduino dentro: l’idea è quella di arrivare a destinazione (magari davanti un supermarket per fare la spesa) e poter staccare tutto il sistema (per non lasciarlo in balia di occhi indiscreti e mani disoneste); a questo proposito è stata ingegnosa l’intuizione di Enkel che ha pensato di riutilizzare delle vecchie cuffie stereo per walkman: abbiamo tagliato gli auricolari dai quali prelevare due fili (massa e segnale); dall’altra estremità il jack da 3.5mm era già pronto per essere inserito durante l’utilizzo ed estratto a destinazione.

Schema

Seguono lo schema di connessione sulla breadboard e lo schema elettrico. Entrambi realizzati con fritzing.
Schema sulla breadboard:
Schema elettrico:

Codice

Di seguito il codice utilizzato
/*
////////////////////////////////////////////////

[ Arduino Cycle Computer ] Version A0.2

>> Original written by Adam O'Hern
>> Modified by Alexdlp for Instructables 2011
>> Modified by Enkel Bici
>> and Vittorio Zuccala' for Wired.it 2011

////////////////////////////////////////////////
*/

#include <LiquidCrystal.h>
//#include <LcdBarGraph.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd( 7,6, 5, 4, 3, 2);

#include <SD.h>
File myFile;


//byte lcdNumCols = 15; // -- number of columns in the LCD
//LcdBarGraph lbg(&lcd, lcdNumCols); // -- creating

int LED = 13; //pin for the LED
int SensorPin = 15; //input for REED SensorPin (analog 0 as digital)
int rim = 2035; //circumference of wheel in mm (28" rim)

int val = 0; // used to store input value
int previousVal = 0; // lets not be too repetitious

int debounce = 10; // the debounce time, increase if the output flickers
int cycles = 1; // total number of revolutions
float currentSpeed = 0; // current speed in MPH
float averageSpeed = 0; // average speed since "newRide" was true

unsigned long revTimer; // create a timer that tells us how long we go between pulses,
unsigned long serialTimer; // and one for how long it's been since we sent anything over serial
unsigned long rideTimer; // total time since "newRide" was true

boolean activeRiding = false; // is the bike moving?
boolean activityChange = true; // just a way of keeping track of how long we're inactive
long inactivityTimer; // millis() on which we began inactivity
long activeRidingOffset = 0; // time subtracted from total riding time when calculating average speed
boolean newRide = true; // true if we haven't moved in half an hour or more
float rideDistance = 0; // total distance traveled since "newRide" was true

void setup() {
lcd.begin(16, 2);
pinMode(LED, OUTPUT); // tell arduino LED port is an output,
pinMode(SensorPin, INPUT); // and SensorPin port is input

lcd.setCursor(0,0);
lcd.print("Init SD...");
lcd.setCursor(0,1);
if (!SD.begin(8)) {
lcd.print("Init failed!");
delay(20000);
return;
}
else{
delay(2000);
lcd.print("Init OK!!");
delay(10000);
lcd.clear();
myFile = SD.open("setup.txt");
if (myFile) {
lcd.setCursor(0,0);
lcd.print("wheel:");
lcd.setCursor(0,1);
char c[5];
int count=0;
// read from the file until there's nothing else in it:
while (myFile.available()) {
c[count]=myFile.read();
count++;
}
// close the file:
myFile.close();
delay(2000);
rim=0; //reset the wheel diameter
for(count=0;count<4;count++){ //it supposes the diameter is expressed in mm and composed of 4 characters written in a text file on the sd card
rim=rim+(c[count]-48)*pow(10,(3-count)); //each character reappresents a number. 0 is equal 48 in ascii code. From then on you add 1 to get the next numbers.
}
rim=rim+1; //magic number
lcd.print(rim);
delay(2000);
}
else {
// if the file didn't open, print an error:
lcd.print("error reading...");
delay(20000);
}
}

Serial.begin(9600); // start a serial session
revTimer = millis(); // start pulse timer
serialTimer = millis(); // start serial timer
rideTimer = millis(); // start ride timer
}

void loop(){

if(!activeRiding) {
if(activityChange) {
inactivityTimer = millis();
activityChange = false;
}
}
else {
if(activityChange) {
activeRidingOffset += millis() - inactivityTimer;
activityChange = false;
}
}


val = digitalRead(SensorPin);
if (val==LOW) { // check whether input is LOW (magnet is NOT in range of reed SensorPin)
digitalWrite(LED, LOW); // turn LED off
previousVal = LOW; // allow the next "pulse" to be counted
}
else{
digitalWrite(LED, HIGH); // turn LED off
lcd.setCursor(1, 0); // Set cursor to the top right of LCD
lcd.print("*"); // Print a blank character or 'space'
//delay(100); // debounce timer
lcd.setCursor(1, 0); // Set cursor to the top right of LCD
lcd.print(" "); // Print a blank character or 'space'
if (previousVal != HIGH && millis() - revTimer > debounce) { // we've got a pulse!
pulse();
}
previousVal = HIGH; // (in case the magnet is in range of the SensorPin while sitting still)
}

// if it's been too long since the last pulse, assume we're not moving.
if(millis()-revTimer > 2000) {
currentSpeed = 0;
sendStats();
if(activeRiding) {
activityChange = true;
activeRiding = false;
}
}

// if it's been more than fifteen minutes...
if (millis() - revTimer > 15*60*1000) {
// we'll assume it's a new riding session & zero everything out at next pulse.
newRide = true;
}
}


void pulse() {
if(newRide) {
lcd.clear();
cycles = 0;
averageSpeed = 0;
rideTimer = millis();
rideDistance = 0;

//log data to file
// open the file. note that only one file can be open at a time,
// so you have to close this one before opening another.
File dataFile = SD.open("log.txt", FILE_WRITE);

// if the file is available, write to it:
if (dataFile) {
dataFile.print("newride");
dataFile.println(",");
dataFile.close();
// print to the serial port too:
//Serial.println("newride");
}
// if the file isn't open, pop up an error:
else {
lcd.setCursor(1, 0);
lcd.println("can't write");
}
}

cycles++; // The wheel has obviously turned another revolution

rideDistance = (float) rim*cycles/1000; // distance in meters,
//rideDistance = rideDistance * 0.000621371192; // converted to miles

currentSpeed = (float) (millis() - revTimer)*0.001; // Convert time elapsed to milliseconds to seconds
currentSpeed = rim/currentSpeed; // S = d/t: Rim circumference divided by time elapsed
//currentSpeed = currentSpeed*0.002237; // MPH Conversion: 1 mm/s = 0.001 m/s * 3600 s/hr * 1 mile / 1609 m = 0.002237
i/hr
currentSpeed = currentSpeed*0.0036; // 1Km/hr Conversion: 1 mm/s = 0.001 m/s * 3600 s/hr * 1Km/1000m = 0,0036 Km/hr

// time ridden since "newRide", in hours, not including inactive time
unsigned long activeRidingMillis = millis() - rideTimer - activeRidingOffset;
//float activeRidingHours = (float) activeRidingMillis/1000/60/60; // convert to hours
float activeRidingSeconds = (float) activeRidingMillis*0.001; // convert to hours
averageSpeed = rideDistance / activeRidingSeconds;
averageSpeed = averageSpeed*3,6;

revTimer = millis(); // remember the current moment for speed calculations next time around
sendStats(); // Tell Processing what's going on
newRide = false;



if(!activeRiding) { //if you start from standin still
activityChange = true;
activeRiding = true;
}

//log data to file
// open the file. note that only one file can be open at a time,
// so you have to close this one before opening another.
File dataFile = SD.open("log.txt", FILE_WRITE);

// if the file is available, write to it:
if (dataFile) {
dataFile.print(revTimer);
dataFile.println(",");
dataFile.close();
// print to the serial port too:
Serial.println(revTimer);
}
// if the file isn't open, pop up an error:
else {
lcd.setCursor(1, 0);
lcd.println("can't write");
}
}

void sendStats() {
/*
Serial.print("rideDistance=");
Serial.print(rideDistance,2);
Serial.print("&currentSpeed=");
Serial.print(currentSpeed,1);
*/
lcd.setCursor(0, 1);
lcd.print("Speed = ");
lcd.setCursor(9, 1);
lcd.print(currentSpeed,1);
lcd.setCursor(13, 1);
lcd.print("kmh");

//lbg.drawValue(currentSpeed, 35);
/*
Serial.print("&averageSpeed=");
Serial.print(averageSpeed,2);

// send a linefeed character, telling Processing that we're done transmitting.
Serial.print(10,BYTE);
*/
serialTimer = millis();
}

lunedì 13 giugno 2011

Webcam su Skype Linux

Premessa

Ieri sera sono andato da un amico per aiutarlo ad installare ed usare la webcam su skype sul suo computer Linux.
Il PC utilizza una Ubuntu 11.04 e la webcam è una Creative Live! Cam.

Utilizzo

Salto i passaggi sul riconoscimento della webcam.
Nel nostro caso erano necessari i driver gspca riconosciuti al volo senza problemi.
A tal proposito, per testare la webcam, vi consiglio l'installazione da synaptic di "Camorama": è un ottimo programmino che vi permette di testare al volo se l'apparecchio funziona o meno.

A questo punto vediamo l'utilizzo con skype.
  1. Aprire una shell
  2. Andare nella directory con l'eseguibile di skype: /usr/bin o /usr/local/bin. Io ipotizzerò il primo!
  3. Cambiare il nome skype in skype.real
  4. Creare uno script denominato skype
  5. Inserire le istruzioni per avviare skype.real
Vediamo in pratica i passaggi dopo aver aperto la shell:
cd /usr/bin
sudo mv skype skype.real
sudo touch skype
sudo chmod 755 skype
sudo gedit skype

In questo modo entriamo nell'editor e aggiungiamo le seguenti righe:
#!/bin/bash
export XLIB_SKIP_ARGB_VISUALS=1
LD_PRELOAD=/usr/lib32/libv4l/v4l1compat.so skype
skype
exit

A questo punto si potrebbero avere problemi di luminosità.
E' possibile risolverli come segue:
  1. Modificare le opzioni della colorazione RGB
  2. Fare un reboot della macchina
Vediamo nella pratica questi passaggi. Sempre dalla console:
sudo gedit /etc/modprobe.d/options

Aggiungiamo le seguenti righe:
options gspca gamma=4
options gspca GRed=350
options gspca GGreen=350
options gspca GBlue=350

Riavviamo:
reboot

giovedì 19 maggio 2011

LIBRO: recensione In viaggio con l'asino


TITOLO: In viaggio con l'asino

SOTTOTITOLO: nessuno

GENERE: Racconto

PAGINE: 173 non troppo fitte

AUTORE: Andrea Bocconi e Claudio Visentin

EDITORE: Guanda



E' il racconto di un quartetto di persone (due professori ed i rispettivi figli) che decidono di prendersi una vacanza dalla vita di tutti i giorni e conoscersi meglio.
Non scelgono le solite spiagge al mare in agosto e nemmeno mete esotiche che fanno chic.
Decidono di passare una settimana in compagnia di un animale straordinario per assaporarne le abitudini e, anche se per poco tempo, tornare alle origini.

Ed è così che quattro umani e quattro ciucci si mettono in moto partendo da Tagliacozzo ed arrivando a Celano (entrambe città in Abruzzo) ma lentamente.... molto lentamente.
Il passo lo impongono gli asini con la loro andatura sempre decisa ma pacata, con le loro abitudini ignote ai più ed il loro carattere docile, curioso e un po' dispettoso.

E' un libro interessante, raccontato in prima persona con spunti di riflessione sulla società moderna, sul correre quotidiano, sulla qualità della vita. Tra i passaggi che mi hanno colpito maggiormente è ciò che l'autore descrive all'arrivo da una tappa: “La televisione è naturalmente spenta e Pietro e Martina ascoltano tranquilli i discorsi dei grandi si chiacchiera fino a tardi......[]... Non abbiamo parlato molto eppure ci conosciamo di più e siamo più vicini di prima.

Sull'asino invece dice: “Non c'è dubbio infatti che l'asino sia una besta intelligente. Per esempio ricorda molto bene i percorsi(qualcuno dice anche i torti subiti) e ritrova sempre la via di casa. E' astuto d ingegnoso: al bisogno è abilissimo nel procurarsi quel che desidera, magari rubandolo, e diabolico nel liberarsi, anche se deve aprire una sbarra con i denti, o sollevare un chiavistello. E' piuttosto determinato e non cambia facilmente idea. E' coraggioso (ha meno timore del fuoco rispetto ad un cavallo) ma non temerario. E' curioso, ama condividere col padrone quel che fa, e spesso metterà il muso (alla lettera) nelle vostre faccende, per esempio quando si preparano i bagagli. E' molto affettuoso col padrone che lo tratta bene, dal quale ama ricevere attenzioni e complimenti

Personalmente ho molto apprezzato l'argomento di questo libro.
Tuttavia ho trovato noioso e tedioso il continuo ricorrere a riferimenti letterari ad altri autori che hanno raccontato esperienze analoghe.
Trovo tipico della mentalità italiana in generale e di quella umanistica in particolare ritenere che facendo riferimenti a opere del passato si aumenti il valore delle proprie idee.
L'autore non riesce a scrivere più di tre pagine senza far riferimento ad opere francesi, inglesi o italiane del secolo scorso con un appesantimento della lettura.
Personalmente ritengo che se leggo il tuo libro non voglio sapere cosa c'è scritto in altre opere ma desidero sapere cosa hai provato lavorando con gli asini.
Qualche accenno va bene ma... il troppo storpia.

Consiglio questo libro? In generale si: dona una prospettiva diversa di viaggio, mette in luce un animale ormai sconosciuto e fa riflettere sull'importanza di riappropiarci del nostro territorio pieno di bellezze natuali. Peccato per la pesantezza nell'esposizione anche se, lo ribadisco, è un mio parere personale e conosco almeno un paio di persone che la pensano molto diversamente.

Una curiosità: l'organizzazione che ha affittato gli asini all'autore si chiama la Boscaglia. Facendo una ricerca su internet risulta ormai chiusa (sito di riferimento: http://www.boscaglia.it/)
Vengono però proposti diversi siti molto interessanti di "vacanze alternative" con persone qualificate che propongono camminate in mezzo alla natura ed attività in generale orientate a riscoprire il nostro straordinario territorio nazionale.

mercoledì 11 maggio 2011

LIBRO: recensione Abbaiare Stanca


TITOLO: Abbaiare stanca

SOTTOTITOLO: Nessuno

GENERE: Racconto

PAGINE: 190 scritte con caratteri media

AUTORE: Daniel Pennac

EDITORE: Salani

Se avessi un figlio, gli leggerei questa storia tutti gli anni a partire dal sesto anno di età.

Il protagonista di "Abbaiare stanca" è "Il Cane", un piccolo quadrupede che nella sua vita, lunga 190 pagine, ha modo di conoscere la vita nei suoi lati più brutti e in quelli più belli. Il Cane nasce in una discarica e presto impara a vivere di espedienti fino ad arrivare in città. Qui trova una ragazzina di nome Mela, la sua futura e giovane padroncina, con cui creerà un rapporto bellissimo.
Certo, la strada per ottenere questo obiettivo sarà lunga e travagliata.
Gli umani sono "imprevedibili" dirà "Il Cane" più volte... ed a ragione!

La piccola, ma speciale Mela, nonostante i genitori non amino quel quadrupede per casa, lotterà per tenerlo con sé e il Cane la "ammaestrerà" come ogni animale fa con il proprio proprietario.

Un'amicizia unica, una strada tortuosa verso l'amore e il calore di una casa, un percorso di conoscenza dell'uomo attraverso gli occhi di chi lo guarda senza condizionamenti e con affetto disinteressato, ma che bisonga sapersi guadagnare.

Se leggerai questo libro ti occuperà un paio di giornate ma ti donerà, senza dubbio, una bella sensazione e se hai un cane non potrai che guardare con occhi diversi questa splendida creatura.

lunedì 9 maggio 2011

Asus EA800 (eeenote)

Premessa

Da alcuni mesi, ormai, stavo valutando l'acquisto di un ebook-reader (per chi non sapesse di cosa stiamo parlando rimando ad una esaustiva spiegazione su wikipedia cliccando su questa pagina). Il mercato offre moltissime alternative ed ogni produttore di hardware è dichiarato "non al passo con i tempi" se non si lancia al galoppo verso la produzione di almeno un dispositivo con funzioni da ebook-reader.
Con un sistema di feedback positivo l'ebook e, di conseguenza l'ebook-reader, stanno iniziando ad affacciarsi sempre più prepotentemente sui siti di notizie informatiche e non solo.
Lentamente ma inesorabilmente stanno emergendo modelli sempre più funzionali ed interessanti....
In questa ottica dopo molteplici ricerche, il mese scorso, ho deciso di acquistare il mio primo dispositivo ebook-reader in occasione del mio compleanno (è sempre bello avere una scusa per farsi un regalo): l'ASUS EEENote EA800. Ultimo nato della fortunata famiglia EEE, si colloca sul mercato come dispositivo per leggere ma anche e soprattutto per prendere appunti... E' stato inserito negli istituti scolastici di alcuni paesi orientali come supporto didattico. E mentre in Italia la associazione librai si ribella alla vendita di ebook scolastici, in Inghilterra, Giappone ed America prendono ogni giorno sempre maggiore risalto (si veda, come esempio, questo articolo su Punto Informatico)

Asus eeenote EA800

Personalmente lo ritengo un dispositivo eccellente.
La prima impressione che si prova nel vederlo è di eleganza: la sua custodia in pelle nera gli dona questo aspetto fin dalla prima occhiata.
Il pennino wavcom posto sul "tetto" del dispositivo conferma l'eleganza del reader conferendogli un'aria molto professionale anche in ambito lavorativo.

Hardware: Il dispositivo nasce con una memoria di 4Gb interna e la possibilità di equipaggiarlo con una scheda SD.
Ovviamente la parte più importante del dispositivo è lo schermo. La dimensione da 8'' permette una buona visibilità dei contenuti sia in formato epub sia pdf.
Avvalendosi della tecnologia touch screen, è possibile interagire con il dispositivo tramite il pennino e la sensibilità di questo strumento è davvero impressionante.
La risoluzione di 2.450 DPI lo rende molto preciso ed i tempi di risposta sono incredibilmente brevi tanto che si ha quasi l'impressione di scrivere con una matita su un foglio di carta. Questo lo rende uno strumento ideale per prendere appunti (magari durante una riunione aziendale o una conferenza importante) senza avere mille fogli intorno... ma anche per scrivere annotazioni su files pdf!
Nonostante gli innegabili pregi, lo schermo presenta anche un piccolo difetto: oltre a non essere anti-riflesso, spesso è necessario cercare una giusta angolazione per leggere agevolmente perchè lo sfondo, al contrario di un foglio di carta che è bianco, assume tonalità di grigio. Personalmente è l'unico difetto che mi sento di attribuire a questo prodotto.
Esso inoltre, come tutti gli ebook-reader che si rispettino, non è retro-illuminato (retro-illuminati sono gli schermi dei cellulari o dei PC che quando si attivano si accedono e si possono leggere anche in una stanza buia) e quindi non si possono leggere di notte

Per quanto riguarda il peso posso affermare che si tratta di un dispositivo estremamente leggero.
Completa la dotazione un cavo per connetterlo al PC.

Software: Dal punto di vista software, il dispositivo è equipaggiato con sistema operativo Linux (che ben si presta ad hacking --ho già trovato in rete qualche sito interessante--).
Come abbiamo detto, oltre alla applicazione per leggere ebooks, è possibile prendere appunti in maniera davvero impressionante.
Il dispositivo, inoltre, è dotato di lettore mp3/ogg, di programma per scattare foto (tramite una fotocamera da 2Mpixel che, sebbene non sia eccezionale, permette di scattare foto da commentare), di una calcolatrice, di un dizionario, di Evernote per sincronizzare le note/appunti sull'omonimo sito e di un browser per navigare (ad esempio sui siti di rivendita libri).

Connessioni: è possibile connettere il dispositivo al PC grazie ad un cavo miniUSB ma dispone anche di una scheda WiFi che si può attivare all'uopo per navigare o per sincronizzare le note su Evernote. Essa si disattiva automaticamente al fine di risparmiare batterie nel momento in cui viene chiusa l'applicazione che la stava sfruttando.
Per quanto riguarda la connessione al PC, il dispositivo si rivela a sorpresa trasformarsi in una tavolozza grafica.
Forte della sua "alta risoluzione", dispone di una applicazione che una volta collegato al PC traspone i nostri movimenti sullo schermo del EA800 sul computer!
Devo dire che anche questo utilizzo mi ha favorevolmente colpito sebbene la vena artistica non mi sia mai stata donata :-)

Autonomia: personalmente l'ho usato per una settimana di fila (ovviamente non di continuo) per leggere e prendere appunti durante le riunioni. Tra standby ed utilizzo puro ritengo che l'autonomia non sia davvero un problema.

Conclusioni

Per concludere consiglio vivamente, ad un eventuale lettore curioso che stia cercando informazioni su internet, l'acquisto di questo dispositivo.
L'EA800 prosegue il successo della fortunata famiglia EEE di Asus e rappresenta un ottimo strumento per la scuola, il lavoro ma anche tempo libero (io lo uso ogni giorno in treno e in bus per leggere e durante le riunioni per prendere appunti).
Unico difetto, lo ripeto, lo schermo non leggibilissimo in condizioni di luce particolari ma... in fin dei conti... chi si porta un ebook-reader in spiaggia?
Infine mi preme specificare che non bisogna fare l'errore di paragonare questo prodotto con un iPad o prodotti simili. Esso serve per leggere e scrivere, non altro. Punto.
Se lo si intende in tal senso saprà darvi soddisfazione altrimenti potrebbe rappresentare una delusione.
Di seguito riporto alcuni links che mi sono serviti a valutarlo: