Pagine

giovedì 30 dicembre 2010

SQLite, libreria SQL in 200kb

Premessa

Qualche tempo fa, sempre su questo blog, ho scritto un articolo sui sistemi di database.
Tra i software citati, nel paragrafo denominato "librerie di database" ho fatto riferimento a sqlite.
L'articolo di oggi vuole approfondire la conoscenza di questo eccellente sistema ed in particolare fare una veloce panoramica che possa far venir voglia di utilizzarlo.

Cosa è sqlite e quando usarlo

SQLite è una libreria che permette di gestire dei database anche molto corposi (fino a 2Tb circa!!!) con molti accessi contemporanei in lettura in maniera rapida.
Esso non necessita di alcuna installazione (basta scaricarlo e si può iniziare ad usarlo!!) e non avvia alcun servizio.
Nonostante questo, può essere utilizzato sia in ambiente Linux, Windows e Mac, gestisce le transazioni, l'utilizzo del linguaggio SQL, delle viste e dei triggers.

Nella prima pagina del sito di riferimento, la cosa che colpisce subito sono gli sponsor che spingono all'uso di questo sistema. Sono aziende del calibro di Oracle, Symbian, Mozilla, Bloomberg e Adobe!

La licenza è decisamente molto aperta e permette la libera copia, modifica, pubblicazione, utilizzo e rivendita sia del codice sia della compilazione per qualsiasi utilizzo commerciale o meno.

SQLite crea un file dal quale legge e scrive direttamente i dati senza creare thread separati gestendo le code in maniera estremamente efficiente.
Questo permette di creare un database su un singolo file, portarlo in giro con una chiavetta o spedirlo via posta ad un amico in spazi estremamente contenuti.
Le dimensioni della libreria, infatti, variano dai 100kb ai 300kb (a seconda del sistema) e la memorizzazione dei dati è davvero contenuta.

Per questi motivi SQLite è particolarmente utile nell'utilizzo all'interno di cellulari, lettori MP3 e sistemi embedded in generale. Si presta ad immagazzinare i dati per siti web, analisi di dati e gestione di demo o piccoli database personali o aziendali.
Al contrario non può essere utilizzato per database che richiedono alti carichi di lettura/scrittura, basi di dati superiori ai 2Tb (!!) o applicazioni che necessitano della tecnologia client/server.

Interfaccia per l'uso di SQLite

SQLite non è dotato nativamente di interfaccia grafica per la gestione dei dati.
Esso fornisce una shell interattiva stile prompt di MSDOS dove è possibile inserire i comandi SQL come in questo esempio o dei comandi propri per l'impaginazione dei dati.
Intorno a questo sistema, però, sono sorte moltissime interfacce di terze parti, alcune opensource, altre proprietarie.
In una pagina del sito di riferimento c'è una lista completa di software tra i quali si può scegliere.
Personalmente utilizzo SQLiteAdministrator e SQLiteManager anche se il mio preferito è un plugin per Firefox SQLite Manager AddOn.
Tutti questi software permettono di gestire i dati di sqlite in maniera grafica se proprio non ci si vuole cimentare con la shell ed il linguaggio SQL.

Api e linguaggi di programmazione

La cosa più impressionante di sqlite è la quantità di linguaggi di programmazione che mettono a disposizione la possibilità di gestire un database con questo sistema.
Python, C++, Java, php, perl, .NET sono solo alcuni di questi.
Si può trovare l'elenco completo in questa pagina: SQLite Wrappers.
Come se non bastasse, sqlite mette a disposizione una shell non interattiva.
Tramite il proprio eseguibile, ifnatti, è possibile lanciare dei comandi anche dal prompt di MSDOS o dalla shell di Linux che creano tabelle, database, inseriscono dati e quant'altro: tutto ciò rendeo questo sistema estremamente utile anche in piccoli script di sistema per il logging.

Conclusioni

Grazie alla sua estrema duttilità, alle sue dimensioni contenute, alla sua licenza permissiva ed ai linguaggi che ne permettono l'utilizzo, SQLite è il candidato ideale per lo sviluppo di molteplici progetti siano essi personali sia professionali.
Nei prossimi articoli copriremo diversi aspetti di questo software.
Per il momento non rimane che scaricarlo ed iniziare ad utilizzarlo!

Emozioni informatiche e Duke Nukem 3D

Quando ero giovine, alla tenera età di 16 anni anelavo senza limiti al motorino.
I miei genitori, come tutti i genitori che non hanno avuto esperienze con le due ruote, in risposta alle mie spasmodiche preghiere... mi regalarono il mio primo computer...

Iniziò allora la mia avventura nel mondo dell'informatica e a 17 anni fui iniziato da alcuni compagni di classe ai giochi per computer grazie a Duke Nukem 3D.
Era uno sparatutto emozionante ed all'avanguardia per l'epoca che mi incollò per ore ed ore davanti allo schermo sia di giorno sia di notte.

All'epoca non esistevano le console.
Non si parlava ancora della guerra tra Wii, PS, XBOX e non esistevano le portatili PSP e DS...
Era l'epoca dei PC ed io ero alle prese con il mio primo computer, un vecchio i386SX (senza coprocessore matematico) con un monitor da 14'' che emetteva più radiazioni di una centrale nucleare a pieno regime ed un modem esterno da 14.4Kb/s che si connetteva solo alle BBS ed era costato più dell'autoradio di mio padre.
Il sistema operativo era il DOS con la sua suddivisione della memoria RAM in memoria bassa ed alta e si affacciava il windows 3.0 con le sue icone allegramente scopiazzate dall'Amiga.

Su questo computer passai molte ore liete in compagnia di Duke Nukem 3D che mi permise, inconsapevolmente, di conoscere meglio il computer.
Duke Nukem girava in memoria bassa ma, tipicamente, il DOS utilizzava questo spazio per caricare una serie di programmi residenti in memoria utili alla gestione del PC.
Per questo motivo iniziai a studiare il sistema operativo, a conoscere i file di configurazione, a smanettare con l'help in linea e tutto per liberare la memoria bassa al fine di giocare...
In questo modo conobbi l'autoexec.bat ed il config.sys e tutto ciò mi incuriosì non poco.
Il passaggio successivo furono i primi passi verso il basic e gli script di configurazione automatica che mi permettevano il caricamento in fase di boot dei programmi a seconda dell'uso che dovevo fare del computer.

Successivamente insieme a due amici decidemmo di usare Duke Nukem per giocare in rete.
I computer non erano portatili e quindi si partiva da casa caricandosi a spalle il case, il monitor formato padellone e cavi ovunque.
Si organizzavano le serate/weekend a casa di uno o dell'altro partendo il sabato sera, tirando fino a tardi, e a volte si dormiva nella stessa casa per ripartire con la domenica ludica...

Router, cavi di rete, switch? All'epoca non ne conoscevamo l'esistenza o forse proprio non esistevano o probabilmente costavano troppo perchè potessimo prenderli in considerazione ed allora via di cavo seriale per connettere due PC tra di loro.
Ma solo due per volta ed il terzo, a rotazione, stava a guardare :-)
Ecco la nostra "rete".
La connessione, però, nonostante i computer fossero solo due per volta era lentissima e dopo nottate a cercar di capire quale potesse essere il problema (internet non c'era e noi avevamo 17 anni!!), scoprimmo che la seriale è intrinsecamente lenta per questo genere di giochi che necessitano lo scambio di molte informazioni al secondo.

Decidemmo quindi di passare alla porta parallela ed anche qui le serate passate insieme per far dialogare i computer non si contano...
Tra coca cola, riavvii, perplessità varie riuscimmo anche in questa impresa: e si parla di windows 3.0!!
L'emozione provata quando i due PC iniziarono a parlarsi è ancora viva dentro di me.

Uno dei due miei amici, però, aveva un 486DX (con coprocessore matematico), un mostro di un altro pianeta rispetto al mio povero i386SX che soffriva di potenza di calcolo quando doveva elaborare oltre alla grafica anche la connessione.
Un altro computer costava troppo (soprattutto all'epoca e dato il fatto che i soldi erano dei genitori e non miei...) ma ero intenzionato a giocare ad armi pari.
Per questo motivo iniziai a comprendere cosa fosse una scheda madre, un coprocessore matematico, la RAM e tutte ste cosette...
Ipotecando (presso i miei genitori) la paghetta dei successivi 6 mesi comprai, infine, un coprocessore e lo saldai sulla scheda madre insieme ad un amico perito (tra fioretti e preghiere rivolte a San Circuito che non mi facesse bruciare nulla....) e cambiai la memoria RAM aggiungendo un banco da 2Mb (!!!) duplicando la precedente RAM.

Finalmente ero operativo e le serate si fecero molto più animate tra urla di gioia quando si vinceva e i fischi quando si perdeva, tra appostamenti virtuali e battaglie all'ultimo sangue con pugnali, bazooka, mitragliette e armi speciali!

Se siete arrivati fino a qui a leggere, probabilmente vi starete chiedendo il motivo di questo post...
Tutti questi ricordi sono venuti fuori quando ho letto, in questi giorni del porting del gioco denominato Duke Nukem 3D su Linux...
Mi son tornate alla mente le ore passare a fare i miei primi abbozzi di hacking, le ore di gioco davanti al monitor, i giorni insieme agli amici a fare le scoperte nel mondo dell'informatica che mi hanno condotto a utilizzare questi strumenti nella vita di tutti i giorni e nel mio lavoro.

Insomma.... leggendo questo articolo mi sono tornate vecchie emozioni alla mente... emozioni informatiche incomprensibili e forse deprecabili da chi non ha vissuto le medesime esperienze ma pur sempre emozioni!

mercoledì 13 ottobre 2010

Sistemi di Database

Premessa

I Database sono da sempre la mia passione.

Un database è, citando wikipedia, "un archivio strutturato in modo tale da consentire l'accesso e la gestione dei dati stessi (l'inserimento, la ricerca, la cancellazione ed il loro aggiornamento) da parte di particolari applicazioni software ad essi dedicate. Il database è un insieme di informazioni, di dati che vengono suddivisi per argomenti in ordine logico (tabelle) e poi tali argomenti vengono suddivisi per categorie (campi)".

In poche parole si identifica con questo termine una serie di dati immagazzinati in un computer: per fare degli esempi, è un database dalla semplice rubrica telefonica alla gestione di un magazzino, l'elenco delle fatture, l'elenco dei clienti di un hotel, le informazioni sui passaggi di un automobilista sotto le barriere telepass.... e così via dicendo.
Si può dire che il nostro mondo ormai non può più fare a meno dei sistemi di database!

Negli anni il concetto di database è stato ampliato e sviluppato in categorie di sistemi software che consentono la creazione, la modifica e la gestione in genere di database. Questi sistemi vengono chiamati Database Management System (DBMS).

Storia della organizzazione dei dati

Come risulta ovvio dalla premessa, le tecnologie che si sono sviluppate con gli anni dietro il concetto di database sono davvero molte.
Il primo problema fu trovare un sistema per organizzare le informazioni.

Inizialmente le applicazioni erano piuttosto semplici ed accedevano direttamente ai dati immagazzinati sul disco fisso secondo una logica pensata dal programmatore. Ovviamente ogni programmatore era libero di organizzare le informazioni come meglio credeva e questo creava molta etereogeneità e confusione nella gestione per la mancanza di standard.

Ben presto nacquero i primi sistemi di database semplici. Il primo in assoluto fu dbm creato dalla AT&T che supportava una struttura molto semplice sebbene altrettanto funzionale..

Tali strutture, però, crebbero in complessità in modo esponenziale e con essa il numero di persone che vi accedevano.
L'accesso diretto ai dati si rivelò presto carente e nacquero i DBMS "Database Managment System" ovvero sistemi che vennerò adibiti alla scrittura/lettura/modifica dei dati sul disco su richiesta di una o più applicazioni esterne.

Le strutture nell'organizzazione dei dati utilizzate furono diverse e si sono evolute nel tempo [fonte wikipedia]:
  1. gerarchica (rappresentabile tramite un albero e risalente agli anni sessanta),
  2. reticolare (rappresentabile tramite un grafo e risalente agli anni 70),
  3. relazionale (attualmente il più diffuso, rappresentabile mediante tabelle e relazioni tra esse e risalente agli anni settanta),
  4. ad oggetti (estensione alle basi di dati del paradigma "Object Oriented", tipico della programmazione a oggetti e risalente agli anni ottanta),
  5. semantica (rappresentabile con un grafo relazionale all'inizio del 2000).
Insieme alle strutture nacquero anche i linguaggi adibiti alla gestione delle stesse.
Senza dubbio uno dei linguaggi più conosciuti e noti è lo "Struttured Query Language" SQL.

Server di database, applicazioni database, librerie database

I sistemi di database ad oggi sono veramente molti.
La scelta della tipologia da adottare si basa sullo studio delle caratteristiche del sistema:
  • numero di utenti che deve supportare in lettura/scrittura,
  • numero di interrogazioni che avvengono contemporaneamente,
  • licenza utilizzata dal fornitore del sistema,
  • prezzo del sistema (nel caso di licenze proprietarie),
  • linguaggi che supportano il sistema,
  • richiesta o meno di personale specializzato,
  • esistenza o meno di applicazioni che sfruttano il sistema.
Queste caratteristiche devono esser prese in considerazione nel momento in cui si sceglie un sistema anzichè un altro. L'errore che spesso si commette, infatti è di comprare o comunque utilizzare un sistema sovradimensionato rispetto le proprie esigenze.

Tipicamente le tipologie di database ad oggi si dividono in tre grandi categorie:
  1. librerie di database: sono singole librerie supportate da pochi o tanti linguaggi ed applicazioni. Di solito si possono scaricare gratuitamente da internet oppure le si può trovare nativamente in alcune applicazioni.
    Nella maggior parte dei casi richiedono un carico in scrittura bassissimo (uno o due accessi contemporanei) sebbene possano spesso sopportare molte letture contemporanee. Estremamente agili e veloci, sono però carenti dal punto di vista della sicurezza e delle funzionalità.
    Esempi:
    • sqlite: un progetto davvero interessante, integrato in centinaia di applicazioni ed utilizzato da "grandi nomi" quali Mozilla, Symbian ed Adobe. E' un progetto opensource.
    • dbm: una delle prime tecnologie pre-relazionali
  2. applicazioni personali/ufficio: sono applicazioni che includono, oltre la gestione dei dati, anche un sistema di interfaccia, reportistica ed interrogazione molto variegato. Solitamente vengono utilizzati per piccoli database (qualche milione di righe al massimo) e piccoli carichi in lettura (10 o 20 al massimo) e scrittura (5 o 10 contemporanei). Hanno il vantaggio di integrare molti strumenti in un unico software sebbene la gestione dei dati lasci solitamente a desiderare. Questo permette, a fronte di un piccolo investimento, la possibilità di gestire piccoli basi dati in maniera estremamente efficiente.
    Esempi:
    • MS Access: senza dubbio è l'applicazione più interessante in questo campo. Estremamente completa, integra un sistema di gestione dei dati che, sebbene sia poco efficente, viene affiancata da strumenti di creazione di maschere e report.
      Tutto ciò da la possibilità di progettare un'applicazione indipendente e un sistema di reportistica estremamente interessante.
    • OpenOffice Base: software opensource molto interessante. Sebbene sia nato per competere con MS Access, ad oggi sembra essere ancora molto lontano dal suo antangonista. E' comunque un progetto da tenere sotto occhio perchè promette bene.
  3. server database: sono applicazioni solitamente più articolare che integrano funzionalità avanzate (come i trigger o le stored procedure) e consentono l'accesso di centinaia se non milioni di accessi in lettura/scrittura contemporanei.
    Esempi:
    • Fascia alta: Oracle Db ed IBM AS400 sono tra i sistemi più performanti, completi, professionali che ci siano sul mercato. Sfortunatamente sono anche complessi (richiedono amministratori competenti e specializzati) e piuttosto costosi.
    • Fascia medio/bassa: MS SQL Server, Postgres SQL, MySQL sono tre ottimi sistemi. Il primo proprietario mentre gli altri due open source. Tipicamente più semplici da utilizzare (sebbene una certa competenza sia auspicabile) sono l'ideale per la piccola/media impresa ma anche per il privato che vuole sviluppare una applicazione sicura con sistemi di backup efficienti.

Conclusioni

Da questo articolo si evince che la scelta disponibile nell'utilizzo di un sistema di database è veramente ampia.
Ci sono sistemi per ogni esigenza.
Se si vuole creare una piccola rubrica o la gestione di un magazzino o della fatturazione di un piccolo ufficio è possibile utilizzare MS Access.
Se si desidera creare un negozio online dove una o due persone aggiungono i prodotti e decine di persone li visionano quotidianamente si può scegliere sqlite o Mysql.
Per applicazioni aziendali in società medio/grandi (400-2000 dipendenti) è auspicabile scegliere Postgres o SQLserver.
Se al contrario si desidera supportare operativamente una grande struttura, una banca o una grossa fabbrica, la scelta obbligata ricadrà su Oracle o As400.

Nei prossimi articoli scenderò un po' nel particolare nel favoloso mondo dei database ed in particolare mi dilungerò sulla mia ultima passione: sqlite!

giovedì 7 ottobre 2010

twit4followers e accresci i tuoi followers Twitter

Premessa

Ho già parlato di Twitter questo anno in un articolo piuttosto articolato.
Successivamente ho anche raccontato come fare a collegarsi ad un account twitter tramite python.
In generale sono tantissimi i servizi e le API che si interfacciano con Twitter ma ieri, cercando informazioni sul web, mi sono imbattuto su qualcosa di davvero inaspettato....

twit4followers

Una delle preoccupazioni maggiori di alcuni utilizzatori di Twitter è quella di avere un elevato numero di "followers" ovvero di persone che seguono il proprio account.
Solitamente questo è sinonimo di "popolarità".
Ovviamente più i contenuti della tua pagina twitter sono interessanti maggiore sarà il numero dei tuoi followers...
Ma cosa succede se pubblichi materiale interessante e le persone sembrano rimanere impassibili e quindi non ti seguono?
E cosa dire, ancora, se la tua mania di popolarità sembra essere irriducibile nonostante i contenuti non ne siano all'altezza?
Ebbene, ci ha pensato twit4followers: un servizio che, a pagamento, ti assicura da un minimo di 100 followers (a $5) fino ad un massimo di 10.000 followers (a $450!!).
Non c'è che dire... internet offre davvero tante possibilità di guadagno :-)
Quello che mi chiedo è se esiste davvero qualcuno che sia disposto a sborsare anche solo 50$ per avere più followers.
Nel frattempo, se non sapete cosa fare, abbonatevi al mio tweet :-D

lunedì 4 ottobre 2010

Xmarks addio

Nell'agosto del 2009, l'anno scorso, pubblicai un articolo dove parlavo dei plugin di Firefox e, al primo posto, citavo xmarks.
Oggi, facendo l'aggiornamento periodico del mio browser preferito, mi appare una pagina nella quale si viene avvertiti che xmarks è un progetto che verrà abbandonato anche se continuerà a funzionare fino a metà gennaio 2011.
Nella medesima pagina si legge che in sua vece si può usare Firefox Sync, un servizio che sincronizza i bookmarks, le password e la cronologia.
Se si desidera avere un qualcosa in più, viene consigliato il servizio EverNote.
Non resta che disinstallare l'utilissimo Xmarks e provare uno dei due se non entrambi i servizi.

martedì 27 luglio 2010

Barcode QR 2D

Barcode o Codici a barre

I codici a barre nascono nel 1948 all'università di Drexel con lo scopo di automatizzare le operazioni di cassa in una catena di prodotti alimentari.
Oggi sono adottati in tutti i supermercati, nelle edicole, nei negozi di elettronica ed in generale in qualsiasi attività che necessiti della catalogazione di oggetti, della gestione di un magazzino, carico/scarico merci e quant'altro.

Questi codici hanno goduto di una enorme diffusione grazie soprattutto alla intrinseca duttilità, alla facilità di lettura da parte dei lettori ottici e quindi da parte di un computer e alla capacità di essere stampati in spazi molto ristretti.
Essi, però, hanno un limite piuttosto importante: la quantità di dati che può immagazzinare è alquanto limitata.
Un codice a barre, infatti, può rappresentare una parola o un numero ma non un intera frase o un indirizzo web o, ancora, un testo.

Esistono diversi "standard" in commercio. In Italia tra i più diffusi ci sono l'EAN ed il Farmacode.


Codici a barre 2D QR

Nel 1994 la società giapponese Denso-Wave ha inventato un codice a barre a matrice e quindi in due dimensioni come la figura qui a fianco. Questo tipo di codici possono contenere molte più informazioni rispetto i codici a barre tradizionali.
Nel 2000 la società rilasciò con licenza libera il codice QR e questo permise a questo standard di diventare sempre più diffuso.
Con il proliferare di cellulari smartphone e di palmari dotati di telecamere sono nate molte applicazioni per la lettura dei codici QR su tali apparecchi.
In questo modo si possono memorizzare informazioni sul proprio cellulare in modo molto veloce ed agevole quali, ad esempio, ad una VCARD (lo standard per i contatti nella rubrica), ad un indirizzo internet, ad un testo e molto altro ancora: basta puntare il codice a barre e il cellulare lo riconosce automaticamente e propone il salvataggio della lettura nella applicazione corretta.


Applicazioni

Esistono molte applicazioni utili a generare e leggere codici a barre QR.
In particolare, dato che adoro i cellulari Nokia serie N, voglio proporvi alcune informazioni che gravitano intorno a questo mondo.
Crea un codice QR con il sito mobilcodes di Nokia. In questa pagina puoi scegliere se generare un link, un testo o una VCARD e il sito, oltre a generare il codice richiesto fornisce anche un URL da collegare sul proprio sito o blog come l'immagine riportata sopra da me.
Scarica una applicazione seguendo uno dei link dal sito mobilcodes di Nokia. Personalmente mi trovo molto bene con I-nigma Reader ma ho sentito parlare bene anche degli altri software.


Conclusioni

Negli ultimi anni questi codici stanno davvero spopolando. Alcuni cartelloni pubblicitari su strada o sui mezzi di trasporto e campagne di marketing espongono codici 2D.
Allo SMAU 2010 erano un ingrediente fisso in quasi tutti gli stand e mi è anche capitato di vederli sulle tovagliette personalizzate di alcuni bar della mia città.
Penso che nei prossimi anni avranno una diffusione sempre maggiore ad oggi limitata solo dalla gioventù di questo standard che decreta ancora poca conoscenza da parte della maggior parte degli utenti.

mercoledì 21 luglio 2010

Twitter e python

Premessa

Twitter è un servizio di social network e microblogging del quale ho parlato in un mio precedente post. Un aspetto molto interessante di questo servizio è la possibilità di poter aggiornare il proprio profilo in diversi modi: si può utilizzare direttamente il sito web oppure il proprio cellulare tramite SMS.
Twitter però mette a disposizione delle API ("applications programming interface" ovvero "interfaccia alla programmazione di applicazioni" Ndr.) che permettono di sviluppare applicazioni con la capacità di accedere al proprio profilo o di integrare questa funzionalità all'interno di programmi già esistenti.
Io, ad esempio per aggiornare il mio profilo su twitter utilizzo un AddOn di Firefox chiamato Power Twitter.
In questo articolo vi parlerò di come sia possibile accedere a twitter tramite il linguaggio di programmazione python.

Python e Twitter

Esiste un modulo Python che permette il collegamento ad un profilo su Twitter. Questo modulo ci permette di leggere i post di un qualsiasi account e, se si dispone di un proprio profilo, anche l'aggiornamento in maniera automatica.

Per poter utilizzare questo modulo, prima di tutto è necessario scaricarlo ed installarlo. La pagina di riferimento è: http://code.google.com/p/python-twitter/.
Personalmente ho trovato molti problemi con la versione 2.4 e 2.5 di python perchè viene richiesto un modulo supplementare per il parsing XML...
Per questo motivo consiglio vivamente una versione 2.6 o successiva di python.
Fatta questa premessa si può direttamente importare il modulo ed utilizzarlo (non mi dilungo sulla installazione che è pari a qualsiasi modulo per questo linguaggio di programmazione).

Leggere dei post da un profilo

import twitter

client = twitter.Api()
latest_posts = client.GetUserTimeline("yourusername")

print [s.text for s in latest_posts]

Aggiornare il proprio profilo

import twitter

c=twitter.Api(username='yourusername', password='yourpassword')
update=c.PostUpdate('Primo messaggio su twitter da script python')

Conclusione

Tramite gli spezzoni di codice sopra citati si può vedere quanto sia semplice leggere o aggiornare un profilo.
I possibili usi sono davvero infiniti... Si potrebbe sviluppare una applicazione che ogni volta che si verifica un evento (accensione del PC, backup effettuato, connessioni ad internet, mancanza di spazio su disco...) invii l'informazione su Twitter; oppure si potrebbe far scattare una foto ad un panorama ogni 2 ore e postarle su twitter; o ancora collegare il PC ad Arduino e postare l'utilizzo di questa scheda...
Insomma gli utilizzi possibili dipendono solo dalla immaginazione del programmatore...
E tu per cosa lo userai?

martedì 20 luglio 2010

Twitter; di tutto e di più...


Premessa

Talvolta mi capita di sentire alcune persone, i giornali o qualche radio citare la parola twitter.
Alcuni ne parlano come un sistema di istant messaging, altri come una piattaforma di blog ma twitter non è nè l'una nè l'altra cosa o forse entrambe.
Scopo di questo post è raccontare cosa sia twitter, come ha fatto a raccogliere più di un milione di utenti in tutto il mondo ed i possibili utilizzi dello stesso.


Twitter in breve

Il nome "Twitter", rispecchia una usanza molto anglosassone di dare nomi onomatopeici. Questo termine, infatti, ricorda il verbo inglese to tweet che significa "cinguettare".

Twitter è stato creato nel marzo 2006 dalla Obvious Corporation di San Francisco ed è un servizio di social network e microblogging che fornisce agli utenti una pagina personale, chiamato anche profilo personale, aggiornabile tramite messaggi di testo lunghi al massimo 140 caratteri.
Gli aggiornamenti possono essere effettuati direttamente tramite il sito, via SMS, con programmi di messaggistica istantanea, e-mail, oppure tramite varie applicazioni basate sulle API di Twitter. Gli aggiornamenti sono mostrati istantaneamente nella pagina di profilo dell'utente (che apparirà, dunque, come una sorta di diario) e comunicati agli utenti che si sono registrati per riceverli.
Ovviamente posso anche decidere di rendere uno o più messaggi privati.


Terminologia: Social network, blog, post, followers

Sebbene questa sia una piattaforma estremamente semplice da usare, risente della dominanza di molti termini inglesi.
Mi è sembrato importante, dunque, chiarire alcune parole a beneficio di coloro che non le hanno mai sentite o che non ne conoscono il significato:
  • Social network: significa letterlamente rete sociale. Qualsiasi legame tra persone sia esso di tipo sociale, conoscitivo, lavorativo o hobbistico che si manifesta sotto forma di sito web, mailing list, forum o qualsiasi altra forma di comunicazione, rappresenta un social network.
  • Blog: Il termine blog rappresentava, originariamente, una sorta di "diario di bordo" ovvero un insieme di articoli dove l'autore pubblicava argomenti di varia natura o specifici; si spaziava dalle opinioni personali ad articoli giornalistici, da argomenti informatici al giardinaggio...
  • Post: un post è, genericamente, un messaggio. Quando un utente spedisce una mail ad una mailing list, o su un forum, manda un "post". Un blog, ad esempio, è un insieme di posts.
  • Followers: letterelamente significa "coloro che seguono". In un social network una o più persone seguono i post di uno o più autori.
    In questo modo costoro sono definiti followers.
    Tutte le volte che un post viene pubblicato da un autore seguito, il sistema avvisa il follower dell'accaduto secondo i mezzi da lui scelti (email, sms....).
    Ogni utente decide chi seguire creando un network [rete ndr.] personale.
    La maggior parte di utenti hanno tra i 10 e 100 followers ma possono esserci i twitters di radio o servizi che possono contare anche migliaia di followers.

  • Blocking: è l'azione che si effettua nei confronti di quei followers troppo invadenti che scrivono di continuo e contenuti poco interessanti.
    Non è interessante sapere che pippo è andato in bagno, pippo sta facendo bollire l'acqua per la pasta e così via... In tal caso basta bloccare l'utente per non vedere più i suoi post.
  • Pubblico o direct message: sono le due modalità di comunicazione su tweeter. Se rispondo pubblicamente ad un twit allora questo apparirà come twit sul mio profilo e chiunque potrà leggerlo creandosi, a volte, anche un dibattito.
    Se mando un direct message, invece, solo l'utente interessato leggerà quello che ho da dire e a sua volta potrà rispondermi in via privata.


Per cosa posso usare Twitter?

A questo punto ti starai chiedendo... twitter può essermi utile? Vediamo alcuni dei modi in cui può essere utilizzato questo servizio.

  1. Servizio news: Vuoi tenere aggiornati amici, parenti, clienti di nuovi incontri, promozioni, eventi in tempo reale? Crea un profilo twitter! Tutti coloro che vi si abbonano riceveranno le informazioni al volo...
  2. Sistema di informazione: sei un viaggiatore che ha a che fare con il traffico di tutta Italia o Europa? Postale su twitter. Sei esperto in informatica o di elettronica o di.... ? Crea un canale su twitter e rispondi agli utenti che vi si abbonano!
    Se il tuo canale inizia ad essere molto seguito potresti anche farti un nome nel social network e poi... chissà?
  3. Aggregatore di informazioni: hai un accont su flickr dove metti le tue foto... un blog dove inserisci articoli... un account ebay dove vendi oggetti.... Aggrega tutto sul tuo profilo twitter!
    I tuoi amici così come le persone che non conosci personalmente saranno aggiornate e fruire dei tuoi contenuti.
  4. Servizio per viaggiatori o conferenze: Alcuni twits estremamente interessanti che ho visto in rete sono quelli che raccontano dei viaggi.
    Informazioni su monumenti visti, sul tipo di aeroporto nel quale si è stato visto da parte degli utenti e non dei tour operator.
    Un altro uso analogo anche se in ambito diverso è espresso dai partecipanti di una conferenza che inseriscono le proprie impressioni in tempo reale!
  5. Twitter per parlare: puoi anche usare questo servizio semplicemente per fare una chat uno a molti. Scambiare battute, impressioni..... cazzeggiare :-)


Alcuni consigli

Di seguito alcuni consigli....

  1. Prima di tutto consiglio di iscriversi a questo servizio tramite questo link premendo su "Registrati Ora". Prima però pensa che tipo di twits vuoi mettere sul tuo profilo? Personali, riflessioni, materiale informatico. Più il tuo profilo sarà a "tema" più sarà seguito. Eventualmente puoi crearti più di un profilo su twiteer da associare a tipologie differenti di post.
  2. Puoi linkare il tuo profilo twitter sul tuo sito web, sul tuo blog, la firma nella tua mail. Per fare questo puoi usare i Feed Rss, una tecnologia di cui ho parlato in questo articolo alcuni mesi fa. Per esempio puoi usare il feed del mio twitter.
  3. Usa il tuo profilo per pubblicare link a siti interessanti ma... i link sono lunghi... Puoi quindi abbreviarli usando servizi come TinyUrl o SnipUrl.
  4. Invia i tuoi tweet tramite il sito ma... impara a farlo anche con il tuo cellulare, il palmare o tramite la posta elettronica; esistono svariati metodi per aggiornare il proprio profilo!
    Io ad esempio uso un AddOn di Firefox: Power tweeter.


Per finire

Se sei arrivato fino a qui... ecco il mio profilo Twitter!
In questo profilo parlo delle mie scoperte informatiche e tecnologiche, di programmazione con python, della scheda elettronica Arduino, di Linux e di internet... Insomma tutto ciò che quotidianamente utilizzo e che fa parte del mondo informatico o elettronico.

martedì 22 giugno 2010

Windows API

API e Windows

API è un acronimo che sta per "applications programming interface" ovvero "interfaccia alla programmazione di applicazioni".
Le Windows Api chiamate anche WinAPI o Win32API sono quindi delle librerie che forniscono, al programmatore, un'interfaccia verso il sistema operativo.
In questo modo sarà facile copiare un file, aprire una finestra di dialogo o spegnere il computer perchè basterà connettersi alla funzione della giusta libreria per ottenere il risultato voluto.

Le Windows API

Le funzionalità offerte dalle API di Windows possono essere racchiuse in otto categorie:
  • Servizi di base: sono gestiti dal kernel.exe o librerie affini nelle varie versioni di windows (come kernel32.dll). Sono le funzionalità di base come la gestione degli errori, l'accesso ai dischi o al file system, la gestione dei processi e/o dei thread.
  • Servizi avanzati: sono gestiti da advapi32.dll. Sono funzionalità avanzate come la gestione degli utenti, l'accensione o spegnimento del PC, l'accesso al registro del sistema.
  • Interfaccia al device grafico: è gestita da gdi32.dll. Funzionalità su monitor, stampanti e affini.
  • Interfaccia utente: è gestita da user32.dll. Gestisce funzionalità di interazione con l'utente come l'input da tastiera o mouse, interazione con la interfaccia grafica
  • Libreria delle finestre di dialogo: gestita da commdlg32.dll. Gestisce le finestre di dialogo di comune utilizzo come quella di salvataggio o apertura di un file, scelta di un colore o di un font.
  • Libreria dei controlli: gestita da comctl32.dll. Fornisce l'accesso a controlli avanzati da parte del sistema operativo come la barra di stato, le schede nelle finestre di dialogo, le progress bar...
  • Windows shell: gestita da shell32.dll. Fornisce l'accesso a funzionalità offerte dalla shell di windows.
  • Servizi di rete: fornisce l'accesso a diversi controlli di rete.

Oltre a queste otto categorie esistono altre librerie che corrispondono ad altrettante API.
Esistono funzionalità legate al web o per il multimediale ed ognuna di esse è gestita da una libreria specifica.
Le windows API, quindi, rappresentano un ottimo strumento per ottenere il massimo dalle proprie applicazioni senza dover "reinventare" di continuo la ruota.
Si pensi, infatti, al salvataggio di un file.
Se si crea una applicazione e si vuole salvare il file prodotto da essa non sarà necessario "creare" la finestra di salvataggio del file ma basterà interfacciarsi alla libreria apposita con notevole risparmio di tempo.

Le API di windows sono fornite dal Platform SDK ovvero una serie di strumenti per lo sviluppo del software e di documentazione molto corposo.

Termino questo articolo dicendo che innumerevoli linguaggi di programmazione hanno la possibilità di interfacciarsi alle API di windows.
Oltre, ovviamente, ai linguaggi proprietari come Visual Basic e .NET anche linguaggi open source come perl, e python hanno questa possibilità.
E' mia intenzione, nel prossimo futuro, approfondire questo tema.

lunedì 21 giugno 2010

feed parser e leggere gmail in python

Feed RSS

Questa tecnologia raccontata in breve, permette di avere un elenco cronologico dei post o articoli pubblicati su un determinato sito (ad esempio il feed rss di questo blog) o delle mail mandate ad un determinato account sottoforma di lista.
Il vantaggio di questa tecnologia è che se si "da in pasto" il feed rss ad un programma specifico come Thunderbird o Outlook, questi articoli appaiono come se fossero mail.
Questo comporta che l'utente non è più costretto a consultare il sito per vedere se ci sono stati aggiornamenti ma riceve un messaggio simile ad una mail.
La filosofia che governa questa tecnologia, dunque, è che sono gli aggiornamenti ad arrivare dall'utente e non il viceversa.
Tempo fa ho già parlato della tecnologia denominata feed RSS e se qualcuno fosse interessato ad approfondire può leggere questo articolo.
Molti sono i software che riescono a leggere agevolmente i feed: tra questi ho già citato Thunderbird ma esistono anche molti linguaggi di programmazioni che hanno dei moduli o delle librerie atte a questo scopo.
Oggi vi propongo feedparser, una libreria per python che serve proprio a leggere agilmente un feed rss.

Feedparser per python

Feedparser è un modulo python che può essere scaricato da questa pagina.
L'installazione non avviene tramite binari ma con il classico setup.py install.
La home page del progetto è piena di esempi pratici e vale la pena seguirli per comprendere la potenza di questo modulo in pochissimo tempo...
In questo esempio vi propongo una soluzione per vedere se sono arrivate nuove mail nel nostro account di posta elettronica gmail.
Il programma di seguito, dunque, una volta specificato il nome utente e password del nostro account gmail, è capace di leggere la lista delle ultime 20 mail e stampare a video il mittente e l'oggetto.
Ovviamente questo codice può essere la base per lo sviluppo di ulteriori funzionalità.

import feedparser

username="username@gmail.com" # modifica username con tuo user
password="password" # modifica la password con quella gmail
protocol="https://"
server="mail.google.com"

path="/gmail/feed/atom"
feedmail = feedparser.parse(protocol + username + ":" + password + "@" + server + path)


for i in xrange(len(feedmail.entries)):
print ""
print feedmail.entries[i].author_detail.email
print feedmail.entries[i].title

giovedì 17 giugno 2010

Python: inserire numeri formattati

Premessa

Ho deciso che alcuni "algoritmi" utilizzati in fase di programmazione per risolvere singoli problemi sono da salvare....
E quale miglior posto se non il proprio blog?

Problema e soluzione

  • Input: numero con decimali segnati con un punto es 1333.434
  • Output: numero in cui il punto indica il separatore delle migliaia e senza decimali
  • Codice:

#Il codice commentato seguente serve nel momento in cui si trova
# un numero con un punto.
#In questo momento prende il numero, lo divide in tre cifre per volta,
# mette un punto e cancella i decimali.
# Quindi: 1333444.22 ==> 1.333.444
# Si suppone il numero sia nella variabile "stringa" sottoforma,
#appunto di stringa.

s=string.find(stringa,'.')
if s >= 0:
j=len(stringa)
stringa=stringa[0:s]
b=''
k=0
for k in range(len(stringa)-3,0,-3):
b='.'+stringa[k:j]+b
j=k
b=stringa[:k]+b
stringa=b

martedì 15 giugno 2010

Tabelle LaTeX su più pagine

Premessa

Lavorando con LaTeX, può capitare di dover trattare tabelle molto lunghe.
Queste tabelle, se gestite come visto in un mio precedente articolo, non possono essere ripartite su più pagine e questo porta dei problemi di impaginazione:
  • LaTeX porterà la tabella sempre su una pagina nuova nella speranza che, avendo maggiore spazio, la tabella sia interamente visualizzabile.
  • La tabella, se eccede la lunghezza fisica della pagina, non riuscirà ad essere comunque visualizzata.
Il risultato con tabelle molto lunghe e frequenti (si pensi ad esempio ad un report sulla produzione regione per regione di una azienda) è quindi molto scadente.
A fronte di questa premessa, oggi vi parlerò del modulo LaTeX denominato longtable.

Longtable

Questo modulo serve per inserire tabelle molto lunghe nei propri documenti generati con LaTeX. Queste tabelle verranno ripartizionate su più pagine in maniera molto pratica e funzionale.
La caratteristica che ho gradito maggiormente è che in questo modo l'oggetto rimane li dove tu lo vuoi e non risulta flottante.
Se desideri una tabella sotto un titolo o un determinato paragrafo, dopo la compilazione la ritrovi proprio li... Questo è un lusso che se si trattano le tabelle in maniera tradizionale, raramente si può gustare.
Il documento di riferimento, in inglese di questo modulo è questo.
Personalmente, però, ho trovato estremamente utile un pdf in italiano di Lorenzo Pantieri: L'Arte di ripartire una tabella su più pagine con LaTeX.
Questo documento, oltre ad essere nella nostra lingua ci dona alcuni esempi pratici dai quali prendere spunto e, a parer mio, è da tenere sempre presente se si lavora con LaTeX.
Un ringraziamento quindi a Lorenzo per i suoi contributi su questo tema sempre preziosi.

Doxygen, sistema di documentazione codice


Premessa

Finalmente ci siamo... dopo settimane se non mesi passati a programmare ecco che il software che avevi pensato tempo fa e al quale hai dato forma nel tempo pronto per il suo debutto...
Lo fai girare, lo osservi mentre legge la configurazione e... tutto sembra funzionare.
A quel punto, dopo la soddisfazione iniziale arriva l'incubo del programmatore: documentare il proprio codice per fare in modo che se qualcun altro o tu stesso fra due anni devi modificare il programma, sappia cosa faceva quella specifica funzione...
A questo scopo sono a presentarvi Doxygen, un sistema di documentazione del codice molto semplice e potente.

Doxygen

Doxygen è un software che legge uno o più file contenenti del codice di programmazione.
Analizza i commenti presenti e, se formattati adeguatamente, genera della documentazione fruibile.
Detto in altre parole, basta inserire commenti nel proprio codice che spieghino in modo dettagliato le funzioni, le variabili, le classi (pratica di solito sempre auspicabile) e Doxygen farà il resto...
Questo software multipiattaforma (gira su Linux, Windows e Mac) è nato per la documentazione del codice in C ma oggi riconosce codice in Java, python, perl, php e molti altri.
La cosa più interessante di questo software è la semplicità d'uso: dopo aver aperto una utility grafica che aiuta nella creazione di un file di configurazione, basta lanciare l'eseguibile doxygen e, come per magia, vedrete apparire la documentazione nella cartella specificata.
Una caratteristica affasciante sono gli output disponibili in questo software: la documentazione, infatti, può essere generata in un gradevole formato HTML (estremamente configurabile con CSS) pronto da pubblicare su un sito web o una intranet, in formato RTF o LaTeX (e quindi PDF).
Insomma, per chi sta cercando un modo semplice e veloce per documentare il proprio codice, Doxygen è un ottimo punto di partenza, semplice, veloce, estremamente configurabile, multipiattaforma e multilinguaggio. In poche parole è solo da provare!

lunedì 14 giugno 2010

Graphviz, grafi automatici professionali

Premessa

In alcuni ambiti lavorativi, i grafi possono essere estremamente utili.
Si pensi al mondo della programmazione, quando si vuole visualizzare la relazione tra gli oggetti creati in un programma.
Un altro esempio è rappresentato da un organigramma aziendale quando si desidera vedere la gerarchia organizzativa che parte dal consiglio di amministrazione e scende diramandosi fra direzioni, servizi e così via.
Copiando la definizione da wikipedia del termine Grafo: "I grafi sono strutture matematiche discrete che rivestono interesse sia per la matematica che per un'ampia gamma di campi applicativi. In ambito matematico il loro studio, la teoria dei grafi, costituisce un'importante parte della combinatoria; i grafi inoltre sono utilizzati in aree come topologia, teoria degli automi, funzioni speciali, geometria dei poliedri, algebre di Lie. I grafi si incontrano in vari capitoli dell'informatica (ad esempio per schematizzare programmi, circuiti, reti di computer, mappe di siti). Essi inoltre sono alla base di modelli di sistemi e processi studiati nell'ingegneria, nella chimica, nella biologia molecolare, nella ricerca operativa, nella organizzazione aziendale, nella geografia (sistemi fluviali, reti stradali, trasporti), nella linguistica strutturale, nella storia (alberi genealogici, filologia dei testi)."
Esistono decine se non centinaia di software che permettono di creare grafi. Alcuni semplici, altri complessi; alcuni automatici e a riga di comando, altri visuali.
Oggi vorrei presentarvi un software che mi ha rapito per la flessibilità e la capacità di generare grafi di ottima qualità. Sto parlando di Graphviz.

Graphviz

Graphviz è un software coperto dalla Common Public License Ver 1.0.
Questo significa che è possibile scaricarlo ed installarlo liberamente.
Come quasi tutti i software da me trattati è multipiattaforma: esso, infatti, gira su Linux, Windows e Mac.
Il software è utilizzabile a riga di comando e usufruisce di un semplice linguaggio di programmazione che "spiega" le relazioni fra i blocchi all'interprete: basta scrivere un semplice file di testo con le relazioni, darlo in pasto all'interprete e questo genererà il grafo.
Questa è la parte più interessante perchè il grafo creato con Graphviz è estremamente personalizzabile; si può infatti definire la forma di ciascun blocco, il colore di sfondo, il tipo di freccia e la sua consistenza.
Il sito web è pieno di molti esempi e la documentazione specifica non manca.
I formati di output del grafo sono molteplici: Graphviz, infatti, può generare immagini jpg, gif, png utili per presentazioni o documenti in generale ma anche il prezioso formato eps per essere importato in LaTeX.
Diversi sono i linguaggi di programmazione che si interfacciano nativamente a questo software. Personalmente ho utilizzato con soddisfazione pydot, l'interfaccia python a graphviz ma la risorse collegate a questo programma sono molteplici.
In definitiva, per tutti coloro che hanno bisogno di generare grafi in modo più o meno automatico, consiglio vivamente l'utilizzo di Graphviz. I risultati saranno sicuramente all'altezza delle aspettative!

mercoledì 24 marzo 2010

Arduino e seriale python

Premessa

Quando si effettua uno sketch con arduino che invia/riceve dati verso/dalla seriale è necessario un programma che recepisca o mi permetta di scrivere dati sulla porta seriale.
Per effettuare i test solitamente si utilizza il monitor dell'IDE ma se si vuole automatizzare qualche passaggio o se si vuole rendere indipendente lo sketch è necessario "captare" le informazioni che transitano sulla seriale ed eventualmente rispondere.
Molti programmi hanno una libreria che permette di dialogare con la seriale.
In questo articolo vi parlerò con pyserial la libreria per python che comunica con la seriale.

pyserial

Si presuppone che sulla vostra macchina sia installato python.
Personalmente mi trovo bene con la versione 2.5
La pagina principale del progetto è http://pyserial.sourceforge.net/
Potete scaricare la libreria da questa pagina: http://sourceforge.net/projects/pyserial/files/ e diversi esempi qui http://pyserial.sourceforge.net/shortintro.html

Pyserial e Arduino

A questo punto vi voglio presentare una piccola parte di uno programma che ho fatto ultimamente in python.
L'idea è quella di recepire delle stringhe inviate da Arduino e in base a ciò che c'è scritto agire in diversi modi con il sistema operativo.
A questo scopo, dopo aver importato la libreria:
import serial

dopo aver inizializzato la seriale con una velocità di 9600 baud:
s=serial.Serial(1)
Su windows sarebbe COM1 mentre su Linux la /dev/ttyUSB1
Si può passare ad un ciclo che legge dalla seriale:
line=s.readline()


A questo punto il programma completo anche se depurato delle parti necessarie a me per interagire con il sistema operativo risulta molto semplicemente come segue:
import serial
s=serial.Serial(1)

while(1):

line=s.readline()
# interazioni con la variabile s

Ne consegue che è molto semplice fa interagire il PC con Arduino e questo rende questa tecnologia ancora più affascinante ai miei occhi...
Che ne pensate?

giovedì 11 febbraio 2010

Controllo desktop remoto Win-Linux

Premessa

Oggi mio cugino mi ha scritto una mail nella quale mi chiedeva se conoscessi un modo per connettersi da Windows a Linux tramite desktop remoto.
Dato che son riuscito da poco tempo a convincerlo ad installare Linux e poichè sempre più persone, ultimamente, si stanno avvicinando a questo sistema operativo, in questo articolo parlerò proprio di come sia possibile accedere da Windows (o Mac,FreeBSD,Linux) ad un sistema Linux.

Client e Server

Per riuscire nel nostro scopo dobbiamo sfruttare la tecnologia client/server di un programma che si chiama VNC.
In pratica dovremmo installare sulla macchina Linux il server VNC e sulla macchina che usiamo per connetterci a Linux (che chiameremo host) un client VNC.
L'host potrà essere un computer con Windows ma nessuno ci vieta di usare un Machintosh o un FreeBSD o un altro Linux.

Lato server

Sulla nostra postazione Linux dovrò installare il server VNC. Per fare questo propongo vino, un server molto leggero e trasparente per gli utenti che usano Gnome come ad esempio su Ubuntu.
Si vada quindi su

Sistema->Amministrazione->Gestione pacchetti

Da qui si ricerchi "vino" e si installi il software. Se trovate anche il pacchetto vino-preferences separato dal precedente, installate anche quello.
A questo punto aprite un terminale (per esempio premendo ALT+F2 e nella finestra che appare srivendo gnome-terminal e premendo invio) e digitate vino-preferences.
Dovrebbe apparire una finestra come la seguente:

Qui sarà necessario cliccare sulle due opzioni:
  • Consentire agli altri utenti di visualizzare il proprio desktop
  • Consentire agli altri utenti di controllare il proprio desktop
e segnarvi il numerino dopo il due punti nella scritta "vncviever nome:0"

Lato client

A questo punto passiamo al sistema client.
Gli utenti Windows possono installare, ad esempio "TightVNC": bisogna installarlo e avviarlo (in questo articolo non mi dilungo a spiegare i passaggi data la semplicità del software).
Quando vi chiede a quale PC volete collegarvi scrivete:
indirizzo_ip_macchina_linux:numero_indicato_precedentemente
ad esempio:
192.168.1.1:0

Se tutto va bene vi troverete sul desktop remoto e potrete controllare la vostra macchina Linux in remoto.
Con qualche accorgimento sul router casalingo si può accedere anche quando siete in ufficio o da amici alla vostra macchina casalinga ma... questo discorso non verrà sviluppato in questa sede.

martedì 9 febbraio 2010

Arduino e programmare stati finiti

Premessa

Dopo aver visto come simulare il multitasking con Arduino grazie alla funzione millis() nella prima e seconda parte dell'articolo, andiamo a vedere la programmazione a stati finiti.
Il problema fondamentale che iniziava a presentarsi nella seconda parte è che il programma tende a diventare piuttosto mastodontico mano a mano che si aggiungono nuovi elementi che ineragiscono tra loro.
Dopo poco tempo l'utente inizia a sentire l'esigenza di dividere il codice in funzioni: si tende, quindi, a raccogliere le istruzioni in "gruppi" organizzati per rendere lo sketch più facile da leggere e gestire --i romani dicevano "Divide et impera"--.
Non è scopo di questo articolo vedere cosa sia una funzione e come si passino argomenti ad essa; l'autore presuppone che il lettore sappia creare una funzione sull'IDE di Arduino.
Fatta questa doverosa premessa andiamo a vedere come iniziare la programmazione a stati finiti su Arduino ed alleggerire la lettura del codice dei nostri sketch.

La programmazione a stati finiti

La programmazione a stati finiti consiste nel dividere il codice in blocchi diversi.
Tali blocchi sono racchiusi in una funzione che rappresenta un singolo evento e raccoglie porzioni di codice appartenenti al medesimo "livello logico" e nel quale si aggiorna, alla fine, la variabile-tempo (rif. prima parte e seconda parte dell'articolo) associata riassegnandogli il millis().
Si riprenda l'esempio visto in precedenza (rif. fondo pagina della seconda parte) e vediamo nella pratica in cosa consista.
Lo riporto qui di seguito per comodità del lettore.
#include <Servo.h>
#define SENSORELUCE1 0
#define SENSORELUCE2 5
int letturaluce1=0;
int letturaluce2=0;
int luce1;
int luce2;
int luce1temp;
int luce2temp;
Servo servo1;
Servo servo2;
int posservo1;
int posservo2;

int k;

unsigned long time;
unsigned long servotime1;
unsigned long servotime2;
unsigned long letturadati;
unsigned long letturaluce_time;

void setup(){
pinMode (SENSORELUCE1, INPUT);
pinMode (SENSORELUCE2, INPUT);
servo1.attach(9);
servo2.attach(10);
Serial.begin(9600);

time=millis();
servotime1=millis();
servotime2=millis();
letturadati=millis();
letturaluce_time=millis();

k=0;
luce1=0;
luce2=0;
luce1temp=0;
luce2temp=0;
}

void loop(){
time=millis();

if(time>letturaluce_time+5){
luce1=analogRead(SENSORELUCE1);
luce2=analogRead(SENSORELUCE2);
k=k+1;
luce1temp=luce1temp+luce1;
luce2temp=luce2temp+luce2;
}
if(k=20){
k=0;
letturaluce1=luce1temp/20;
letturaluce2=luce2temp/20;
luce1temp=0;
luce2temp=0;
}

if(time>servotime1+15){
posservo1= analogRead(letturaluce1);
posservo1=map(posservo1,0,1023,0,179);
servo1.write(posservo1);
servotime1=millis();
}

if(time>servotime2+15){
posservo2= analogRead(letturaluce2);
posservo2=map(posservo2,0,1023,0,179);
servo2.write(posservo2);
servotime2=millis();
}

if(time>letturadati+3000){
Serial.print("Sensore 1 : ");
Serial.print(letturaluce1,DEC);
Serial.print(" Posizione motore 1 : ");
Serial.println(posservo1,DEC);
Serial.print("Sensore 2 : ");
Serial.print(letturaluce2,DEC);
Serial.print(" Posizione motore 2 : ");
Serial.println(posservo2,DEC);
Serial.print(" Differenza : ");
Serial.println(letturaluce1-letturaluce2);
letturadati=millis();
}
}
Il codice già ampiamente spiegato permette di far muovere due servo motori al variare dell'intensità di luce che insiste su due sensori di luce perpendicolari fra loro.
Questo codice si "divide" in porzioni ben definite:
  • La sezione in cui si leggono i sensori
  • La sezione in cui si fanno muovere i motori
  • La sezione nella quale si invia alla seriale un output.
Queste sezioni si possono raccogliere in apposite funzioni e si sfrutta una peculiarità dell'IDE di arduino: i tab.
Ogni funzione infatti si aggiunge ad un tab differente: per fare questo si clicchi la freccina verso destra nell'angolo in alto a destra dell'IDE e poi su "New Tab".
Si dia un nome alla tab che DEVE essere uguale al nome della funzione che si scriverà all'interno.
Come si vede in figura quindi, si aggiungeranno tre Tab; una per ciascuna funzione:
  • leggiLuce
  • muoviServoMotori
  • scriviSuOutput
Riporto di seguito ciò che si scriverà nei tre tab.

Leggi Luce

Questa funzione racchiude le istruzioni che arduino deve svolgere per leggere i sensori di luce.
In particolare si notino le 20 letture necessarie per "ammortizzare" gli sbalzi del sensore analogico e il reset della variabile tempo alla fine della funzione.
void leggiLuce(){
if(time>letturaluce_time+5){
luce1=analogRead(SENSORELUCE1);
luce2=analogRead(SENSORELUCE2);
k=k+1;
luce1temp=luce1temp+luce1;
luce2temp=luce2temp+luce2;
}
if(k=20){
k=0;
letturaluce1=luce1temp/20;
letturaluce2=luce2temp/20;
luce1temp=0;
luce2temp=0;
}
letturaluce_time=millis();
}

Muovi servo motori

Questa funzione, come si intuisce, raccoglie le istruzioni sul movimento dei Servi.
Anche in questo caso si noti l'azzeramento della variabile-tempo al fondo della funzione.

/* Muove i SERVI*/

void muoviServoMotori(){
if(time>servotime1+15){
posservo1= analogRead(letturaluce1);
posservo1=map(posservo1,0,1023,0,179);
servo1.write(posservo1);
servotime1=millis();
}

if(time>servotime2+15){
posservo2= analogRead(letturaluce2);
posservo2=map(posservo2,0,1023,0,179);
servo2.write(posservo2);
servotime2=millis();
}
}

Scrivi su Outout

Infine lo scrivi output si comporta "a livello logico" come le funzioni viste in precedenza. Esso scrive sulla seriale le informazioni da visualizzare all'utente ogni 3 secondi.
void scriviSuOutput(){
if(time>letturadati+3000){
Serial.print("Sensore 1: ");
Serial.println(letturaluce1,DEC);
Serial.print("Posizione motore 1: ");
Serial.println(posservo1,DEC);
Serial.print("Sensore 2: ");
Serial.println(letturaluce2,DEC);
Serial.print("Posizione motore 2: ");
Serial.println(posservo2,DEC);
Serial.print("Differenza : ");
Serial.println(letturaluce1-letturaluce2);
letturadati=millis();
}
}

Sketch principale

A questo punto lo sketck principale si riduce sensibilmente.
Ogni tab racchiude le porzioni di codice e ci possiamo soffermare sulla dinamica del programma.
#include <Servo.h>
#define SENSORELUCE1 0
#define SENSORELUCE2 5
int letturaluce1=0;
int letturaluce2=0;
int luce1;
int luce2;
int luce1temp;
int luce2temp;
Servo servo1;
Servo servo2;
int posservo1;
int posservo2;

int k;


unsigned long time;
unsigned long servotime1;
unsigned long servotime2;
unsigned long letturadati;
unsigned long letturaluce_time;

void setup(){
pinMode (SENSORELUCE1, INPUT);
pinMode (SENSORELUCE2, INPUT);
servo1.attach(9);
servo2.attach(10);
Serial.begin(9600);

time=millis();
servotime1=millis();
servotime2=millis();
letturadati=millis();
letturaluce_time=millis();
k=0;
luce1=0;
luce2=0;
luce1temp=0;
luce2temp=0;
}

void loop(){
time=millis();

leggiLuce();
muoviServoMotori();
scriviSuOutput();

}

Come si può vedere la funzione loop() viene ridotta veramente all'osso.
Questo sketck si riduce ad un banale programmino.
Nel loop non è stata aggiunta alcuna "logica" ma è facile immaginare degli if che determinano l'attivazione di una o più funzioni a seconda di determinati eventi...

Conclusione

Frequentando il forum di Arduino, noto che le persone spesso entrano in crisi nel momento in cui gli sketch aumentano di dimensioni.
Spesso si tende a desistere nei propri progetti per questo motivo.
Trovo che l'applicazione dei consigli dati in questi tre articoli (multitasking + programmazione a stati finiti) risolva la maggior parte delle problematiche a livello di programmazione dovuta all'aggiunta di più componenti all'arduino.
Personalmente incontro maggiori difficoltà nelle saldature ma questo è un problema della mia mancanza di manualità :-)

Argomento precedente: "Multitasking Arduino: millis() -- PARTE 2"