Safer Internet Day 2012

Iniziano i preparativi per il Safer Internet Day 2012, l’iniziativa nata dall’Unione Europea con lo scopo di insegnare un uso sicuro di internet.
L’evento, per quest’anno, è programmato per il 7 Febbraio.
Il titolo dell’evento di quest’anno sarà “Scoprire il mondo digitale insieme…. in modo sicuro!” e sarà centrato sulla co-educazione adulti-ragazzi, anche i giovani ‘nativi digitali’ possono insegnare ai propri genitori come navigare in maniera sicura.
Sono previste incontri e manifestazioni organizzati spontaneamente in tutto il territorio dell’Unione Europea.
Di seguito, il video promozionale dell’iniziativa.


Node.js: qualche considerazione

In un precedente post mi ero divertito a giocare un po’ con node.js. Si giocare è il termine giusto, ho provato a leggere qualche tutorial, installarlo e scriverci 10 righe di codice.
node.js logoL’idea che sta alla base del progetto è sicuramente interessante, creare un server performante e totalmente adattabile sulle esigenze del software che stiamo scrivendo. Bello anche il fatto che il server non venga appesantito da moduli che potrebbero essere solo potenzialmente usati: se il codice non utilizza primitive di un modulo, questo non viene caricato. Come dire, rispettiamo al massimo il concetto che “quello che non c’è non si rompe”.

Ma alla base del progetto c’è qualcosa che non mi convince. Partiamo dal presupposto che il server web è il software più esposto ai vari attacchi: è quello che sta proprio in frontiera, tutte le chiamate vengono in prima istanza gestite dal questo software. Se oggi usiamo Apache nella maggior parte delle installazioni, lo facciamo perché il software è sopravvissuto ai vari attacchi e alle varie traversie che, la storia insegna, hanno colpito questa categoria di software. Apache è stato creato a forza di “pezze” (‘a patchy’) messe su NCSA httpd.

Ma in generale tutta l’architettura LAMP ha una storia di successi ed insuccessi, che l’hanno portata ad essere quella che conosciamo tutti. Una della caratteristiche principali di questa architettura è che i vari compiti sono svolti da pezzi diversi di software. Pensiamo al semplice interprete PHP, la storia delle pagine dinamiche è vecchia come l’informatica. Abbiamo iniziato con i CGI e poi con la tecnologia SSI (Server Side Include), e alla fine la tecnologia che si è affermata è quella delle pagine dinamiche
I linguaggi più utilizzati per scrivere pagine dinamiche, oggi, sono: VBScript, Java, PHP e JavaScript.

In tutti questi casi la separazione fra il server web e l’interprete dei comandi è netta. Le ottimizzazioni di performance e di sicurezza sono in carico ad almeno due software diversi. Software scritti da gruppi di lavoro diversi.

In Node.js tutte queste cose sono fuse in un solo software che serve pagine statiche, elabora script… forse gli stiamo dando un po’ troppa responsabilità!

Qual’è il vero guadagno nel mettere in campo questa nuova tecnologia? La scalabilità? Penso che Apache e PHP abbiano dato prova più volte di essere scalabili senza grossi problemi. Le performance? Se Apache vi sembra troppo pesante provate a dare un’occhiata a lightttpd Pensate che il vostro sito web debba servire 10.000 client contemporaneamente (il problema del C10K)? Provate a dare un’occhiata a nginx che serve pagine per sitarelli dalle dimensioni di GitHub, WordPress.com, SourceForge.
L’idea di creare un server web ‘event driven‘ è vincente: nginx ne è la prova. Node.js aggiunge il fatto di implementare in maniera asincrona i meccanismi di lettura e scrittura (Asynchronous I/O).

In definitiva, mi piace Node.js come progetto. Bella l’idea di dare a JavScript un posto un po’ più importante rispetto a quello di abbellire qualche pagina HTML. L’architettura di Node.js è ben pensata e in fatto di scalabilità promette bene. Mi spaventa un po’ la sicurezza intrinseca del prodotto e il fatto che lo studio e l’introduzione di questa nuova tecnologia in ambiente di produzione, non porta nessuna grossa novità.

Non usate iCloud in situazioni “strane”

Come i più sapranno, con l’arrivo di iOS5 e di iCloud, Apple ha inserito la funzione di PhotoStream nei propri “igiocattoli”.

Attraverso l’attivazione di questa funzione è possibile fare in modo che le proprie fotografie finiscano in maniera automatica nel cloud non appena vengono scattate. Da li possono essere copiate, sempre in maniera totalmente automatica sugli altri “igiocattoli” configurati.

Fin qui tutto bene, la parte sana della tecnologia.

Adesso la parte insana: dopo che una fotografia è finita in quesito giro di nuvole e di idevice, non può più essere cancellata. Scatti una foto, la mandi su iCloud e la puoi solo cancellare dal tuo device e non da quelli sulla quale la foto si è copiata attraverso il photostream!!!

Ora provate a pensare a cosa succede se, durante una serata, qualcuno vi fa una foto diciamo…. compromettente??

L’unico modo che avete per cancellarla e quello di fare l’upload di altre 1.000 fotografie. iCloude gestisce, infatti, una coda circolare di 1.000 slot.

State attenti a non usare PhotoStream quando….. siete ubriachi…. non ubriacatevi è meglio!! :-)

Google Street View

Anche la mitica Google, quando entra nelle città per fotografarle, deve chiedere il permesso alle Amministrazioni Comunali.

Ed ecco la mitica macchina di Google parcheggiata ed in attesa di ricevere il permesso per entrare nella zona a traffico limitato di Cremona.

node.js: un’introduzione

node.js logo
Per chi ancora non ne avesse sentito parlare, Node.js è un framework per l’utilizzo server-side di JavaScript, implementato su un motore JavaScrpit (il V8) scritto da Google.

Secondo gli sviluppatori del progetto, il linguaggio scelto è particolarmente adatto per gestire un web server, perché basato sugli eventi. Christopher Roach, in un suo articolo, sottolinea ad esempio come un server web trascorra la maggior parte del tempo ad aspettare l’esito di operazioni di I/O, quindi la possibilità di lavorare in modo asincrono tramite le funzioni di callback è una grande opportunità per aumentarne l’efficienza.

L’architettura di Node.js è modulare. Vi sono diversi moduli per compiere le funzioni più comuni di un server web. Questi possono essere utilizzati previa inclusione nel codice con il comando require:

1
2
var http = require("http"),  
    sys = require("sys");

Queste due istruzioni includono due moduli: il primo che implementa le funzioni per la comunicazione via HTTP mentre, il secondo, implementa il modulo per la comunicazione via terminale.

A questo punto possiamo creare il server con il metodo createServer, al quale possiamo passare delle funzioni anonime, che si attiveranno ogni qualvolta esso riceverà una richiesta dalla porta passata al metodo listen:

1
2
3
4
5
http.createServer(function(request, response) {  
    response.sendHeader(200, {"Content-Type": "text/html"});  
    response.write("fizban was here!");  
    response.close();  
}).listen(8080);

In questo brevissimo esempio, tratto da un tutorial di Devon Govett, viene creato un server in ascolto sulla porta 8080, che manda una risposta via HTTP con un header e codice HTTP 200.

Come è ormai tradizione consolidata, nei nostri progetti non utilizzeremo direttamente le API di Node.js. L’ecosistema che sta attorno al progetto ha creato una serie di framework che semplificano e velocizzano la scrittura di codice.

express.js è una conoscenza che dovrà fare chi è interessato a scrivere applicazioni webbased. Dalla filosofia molto simile a quella di Rails, express è un framework in sviluppo attivo molto utilizzato.
Fra le caratteristiche principali:

  • Supporto delle route (alla Rails)
  • Basato sulla logica MVC
  • Sviluppato per alte performance
  • Le configurazioni sono basate su ambienti (sviluppo, produzione, test….)
  • E’ dotato di eseguibili per la generazione delle applicazioni in modo veloce

Ecco l’esempio di prima, riscritto utilizzando express:

1
2
3
4
5
6
7
8
var express = require ('express');
var app = express.createServer();

app.get('/', function(req, res){
    res.send('Fizban was here');
});

app.listen(8080);

Express non è l’unico framework attivamente sviluppato, la lista è lunga. Guardando sul wiki di node.js c’è veramente da stupirsi vedendo quanta gente ha già implementato moduli. L’ecosistema che sta attorno al progetto è molto attivo.
Una chicca, vi piace la logica di Ruby on Rails ma non vi piace Ruby? Railswaysjs è modulo che fa per voi

Dove reperire informazioni:

  • Sul sito ufficiale di node.js
  • HowToNode blog con vari howto per realizzare progetti con Node.js

iPhone, macchina fotografica compatta?

camera+ icon
Usare l’iPhone come macchina fotografica? In tanti dicono che si possa fare. Sempre più blog e podcast tematici ne consigliano l’uso come macchina fotografica.


Dalle statistiche, risulta che il telefono con la mela è lo strumento più utilizzato dagli utenti di Flickr.


Mi sono incuriosito e ci ho provato anch’io. L’ottica del telefono, tutto sommato, è buona. I 5 megapixel a disposizione possono bastare. Il problema sono le dimensioni: il telefono è piccolo, il tasto di scatto sullo schermo è estremamente scomodo.

La prossima versione di iOS dovrebbe correggere questo problema, permettendo di configurare uno dei tasti della regolazione del volume affiché si comporti come pulsante di scatto.

Girando qua e la ho trovato un po’ di applicazioni interessanti, che rendono più gradevole l’uso del telefono come macchina fotografica.

Camera+ aggiunge tantissime funzioni utili all’applicazione fotocamera come lo stabilizzatore, uno zoom di maggior qualità, la possibilità di scattare foto multiple e tutti i settaggi utili per catturare la luce in maniera adeguata, evitando foto troppo luminose o troppo scure.


L’applicazione sviluppata dalla tap tap tap contiene anche alcuni strumenti utili per il fotoritocco, quali la possibilità di tagliare le foto, aggiungere bordi e cornici e tantissimi altri effetti speciali.

Instagram nome complicato per identificare un’applicazione che permette di creare un flusso di fotografie prese dal proprio iPhone. Carina, permette di applicare effetti non troppo invasivi alle foto.
Una volta scattate le fotografie possono essere condivise facilmente su molti social network, fra i quali:

  • Flickr
  • Twitter
  • Facebook
  • foursquare


ios-static-libraries: librerie crittografiche pronte all’uso

Stanchi di cercare online le versioni di:

per i vostri progetti sugli iDevices per poi doverveli compilare? ios-static-libraries è il progetto che fa per voi. O meglio questo è il progetto che ha fatto per me :-)

Il progetto fornisce:

  • uno script per la compilazione delle librerie citate
  • i binari delle stesse librerie pronti per essere utilizzati nei propri progetti

Cremona…. vista da un cremonese

Come usare un sensore di prossimità con Arduino

Collegare un sensore di prossimità ad Arduino per calcolare la distanza da un oggetto.
Esistono diversi circuiti integrati che assolvono questo compito.
Le tecnologie utilizzate sono sostanzialmente due: infrarossi ed ultrasuoni. La mia scelta è caduta sul Sonic SRF05 che impiega la seconda tecnologia: dal datasheet e dai vari post che ho visto in giro, sembrava quello più affidabile, più economico e più semplice da impiegare.
Ho acquistato l’integrato in Italia su Robot-Italy
Il circuito si presenta così:




Il funzionamento è semplice, avviene inviando un impulso ad ultrasuoni (frequenza attorno ai 40Khz), attendendo che l’impulso ritorni dopo aver colpito un oggetto. Misurando il tempo impiegato fra il momento in cui l’impulso è stato emesso e quello in cui questo ritorna, viene calcolata la distanza fra il sensore e l’oggetto. Le distanze misurabili vanno dai 3 cm ai 4 metri.

Interfacciare il sensore ad Arduino è veramente molto semplice, ci sono solo 4 connettori di cui preoccuparsi: alimentazione, massa, trigger ed echo. L’alimentazione richiesta è pari a 5V, esattamente la tensione emessa da Arduino, per cui per alimentarlo è sufficiente collegarlo al controllore senza l’ausilio di alimentazioni esterne.

Schema di collegamento

Colleghiamo il connettore ‘echo’ al Pin 2 del controllore, quello trigger al Pin 3 e, in fine, i due Pin di alimentazione (+5V e GND).
Fatti i dovuti collegamenti hardware passiamo alla parte software, useremo questo algoritmo per la lettura della misura: dopo aver inizializzato le variabili e i PIN del controllore, eseguiamo 10 letture consecutive, ne calcoliamo le media e prendiamo quella come valore della distanza in cm.

Di seguito il codice sorgente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/*
 * Autore: Corrado Ignoti
 *
 * Descrizione: Interfaccia un SFR05 con Arduino
 *
 * Maggiori informazioni su: http://www.corradoignoti.it
 */


const int numOfReadings = 10;                   // numero di letture
int readings[numOfReadings];                    
int arrayIndex = 0;                             // contatore per ciclare nell'array
int total = 0;                                  
int averageDistance = 0;                        // distanza media

// inizializzo i PIN per collegare la scheda SFR05
int echoPin = 2;                                // echo (digital 2)

int initPin = 3;                                // trigger  (digital 3)
unsigned long pulseTime = 0;                    
unsigned long distance = 0;                     // distanza in cm

//setup
void setup() {
  pinMode(initPin, OUTPUT);                    
  pinMode(echoPin, INPUT);    
 
  // inizializza un array delle letture
  for (int thisReading = 0; thisReading < numOfReadings; thisReading++) {
    readings[thisReading] = 0;
  }
     Serial.begin(9600);  //inizializza la seriale
}

// loop principale
void loop() {
  //manda un impulso di ampiezza 10 us
  digitalWrite(initPin, HIGH);                    
  delayMicroseconds(10);                          
  digitalWrite(initPin, LOW);                    
  pulseTime = pulseIn(echoPin, HIGH);             // Aspetta l'eco di risposta
  distance = pulseTime/58;                        // Distance = tempo impulso / 58 per calcolare i [cm] di distanza.
 
 //Per diminuire l'errore crea un array con le letture e calcola la media
  total= total - readings[arrayIndex];            
  readings[arrayIndex] = distance;              
  total= total + readings[arrayIndex];            
  arrayIndex = arrayIndex + 1;                    
 
  if (arrayIndex >= numOfReadings)  {
      arrayIndex = 0;
  }
  averageDistance = total / numOfReadings;      //Media dei valori delle distanze acquisite
 
  //Scrive il valore della distanza media sulla seriale
  Serial.print ("Distanza (media): ");
  Serial.println(averageDistance, DEC);        
  delay(100);                                  
}

All’inizio del ciclo loop() questa porzione di codice:

1
2
3
4
5
  digitalWrite(initPin, HIGH);                    
  delayMicroseconds(10);                          
  digitalWrite(initPin, LOW);                    
  pulseTime = pulseIn(echoPin, HIGH);            
  distance = pulseTime/58;

manda un impulso per 10us aspetta e si mette in ascolto aspettando l’eco di risposta. Attraverso la primitiva pulseIn(), calcola il tempo fra l’emissione del segnale e la ricezione dell’impulso di risposta. La distanza in cm si ottiene dividendo per 58 questo valore.
La seconda parte del codice, esegue 10 letture consecutive, le mette in un array. Calcola la media delle letture e stampa questo valore sulla seriale.

Chi ha paura di facebook?



A giudicare da quello che ho visto…. i genitori e non i bambini. Ma la mia opinione è che anche i più piccoli devono sapere che navigare su internet è bello ma nasconde dei pericoli.
Pubblico le slide di un intervento che ho tenuto alle quinte della Scuola Elementare Marconi di Casalmaggiore (CR), su questo argomento.
E’ possibile scaricare le slide dell’intervento in formato PDF