Excel: dieci errori da non fare

Excel è un programma molto utile, che fa risparmiare un sacco di tempo e di fatica a chi lo usa correttamente, ma che può facilmente trasformarsi in un buco nero del nostro tempo se usato male. Siccome mi capita di vedere che certi errori sono frequentissimi e fanno perdere un sacco di tempo inutilmente, elenco qui i più drammatici, a monito de li piccini.

0. Riempire le celle di testo
Questa è la madre di tutti gli errori e quindi non entra nel conto: usare Excel per scrivere cose che non sono elenchi e non contengono nessun calcolo. Cos’ha Word che non va? Excel non è bravo a scrivere. No calcoli, no Excel.

1. Dopo aver modificato una cella, cliccare fuori per uscire
Questa la vedo spessissimo ed è forse la principale fonte di errori e perdita di tempo, soprattutto per chi non conosce il programma ma deve usare fogli di calcolo preparati da altri. Non c’è problema se la cella contiene testo; ma se la cella da modificare contiene una formula, quando clicchi fuori ne modifichi i riferimenti (ma non te ne accorgi). Dalla modifica di una cella si esce con ESC per non modificare nulla, oppure con ENTER o TAB per confermare la modifica.
Ovviamente è responsabilità di chi ha preparato il foglio di accertarsi che il destinatario abbia le capacità necessarie per usarlo al meglio; oppure di proteggere adeguatamente le formule a rischio.

2. Tenere più tabelle sullo stesso foglio
Ti serve aumentare la larghezza di colonna della tabella sopra, e sballano gli allineamenti della tabella sotto. Sposti una riga della tabella di sinistra, ma hai spostato anche la riga della tabella di destra. Una tabella per foglio, e il problema è eliminato alla radice.

3. Inserire righe vuote o colonne vuote all’interno di un elenco
Questa mi provoca crisi di pianto dirotto ogni volta che la vedo (cioè quasi giornalmente). La riga di bellezza inserita subito sotto alla riga dei titoli mi ammazza tutte le selezioni automatiche della tabella e mi costringe ogni volta a selezioni manuali: per i filtri, per gli ordinamenti, per le pivot. Insomma, voglio più spazio? allargo la riga dei titoli. La zona corrente è una religione, e righe e colonne vuote sono anatema.

4. Scrivere i nomi delle colonne di un elenco su più righe
Se la prima colonna è Codice Cliente e la seconda è Nome Cliente, e tu lo scrivi su due celle, Excel guarda solo la riga sopra ai titoli e per lui i due campi si chiamano entrambi Cliente. Questo lo manda in confusione e non capisce più nulla. Se il titolo è lungo, usa l’a capo nella cella.

5. Unire celle in un elenco
Qui ho visto cose che noi umani neanche ci sogniamo. La prima cosa che succede è che non puoi più fare gli ordinamenti: quindi te li fai a mano. Quindi perdi tempo, e fai errori, Quindi devi ricontrollare, e perdere altro tempo, e passano le ore. In generale, unire celle in Excel crea sempre problemi ed è da evitare.

6. Formattare a mano i titoli di una tabella
Invece di spendere le più liete ore con bordi, sfondi e colori, ci sono gli stili già pronti, da applicare con un clic. Hai tempo libero? alzati, fatti una passeggiata, fai due chiacchiere con qualcuno, vai a trollare Gasparri su Twitter. Qualsiasi cosa pur di non passare la tua vita a formattare celle di Excel.

7. Colorare a mano le righe di un elenco
Colori queste righe in giallo per segnalare che sono clienti pericolosi. Poi colori in rosso quelli morosi, poi in verde quelli bravi, poi in viola quelli tristi, e in arancione quelli indecisi, e il tuo foglio diventa tutto un arcobaleno di colori, e adesso ci vuole la legenda, e un cliente bravo è diventato moroso e bisogna cambiare il colore a mano. E passano le ore. Ma il problema principale è che hai inserito delle informazioni importanti in forma di colore, ovvero in forma inutilizzabile da parte di Excel: prova per esempio a fare la somma del fatturato per colore, e poi dimmi quanto ci hai messo.
Se hai bisogno dei colori usa la formattazione condizionale, che è automatica e non porta via tempo.

8. Allineare al centro una colonna di cifre
L’allineamento predefinito di una cella è a destra per i numeri, a sinistra per il testo. Questo viene molto utile quando devi inserire tanti numeri: se non li vedi andare a destra, c’è un errore e te ne accorgi immediatamente. Ma se hai forzato l’allineamento al centro, non te ne accorgi più, e ti tieni l’errore.

9. Usare il grafico a coni o a piramidi
Sono bellissimi e scenografici, specie quelli tridimensionali, ma sono assolutamente incomprensibili. Il grafico deve essere chiaro: se lo guardi a schermo intero da cinque metri di distanza e non si capisce, hai buttato via il tuo tempo.

10. Raccogliere su più fogli i dati che riguardano una singola situazione
Lo scenario è più o meno il seguente: per raccogliere le spese di viaggio dei tuoi commerciali, prepari un foglio per ogni persona e per ogni mese. In questo modo ti viene molto facile, a fine mese, sommare la colonna delle spese e trovare l’ammontare del rimborso mensile. Ma che succede a fine anno? Ti trovi a giostrare con centinaia di fogli. E se devi fare il totale? E se ti serve il totale per linea di prodotto? Ecco che partono i formuloni lunghi due righe (e fai prima a fare i calcoli a mano).
Se invece crei una unica tabella con dentro tutti i viaggiatori e tutte le date, con filtri e pivot ottieni rapidamente e facilmente tutte le risposte che ti servono, senza scrivere neanche una formula e quindi senza possibilità di commettere errori.

(Ecco, mi sono sfogato :-))

Da Arduino a MySQL: ho aggiunto la temperatura esterna

Arduberry_finale

Dato che Yahoo Weather offre il feed della situazione meteo della mia città, ho deciso di aggiungere questi dati al mio database, in modo da avere sia la temperatura interna che quella esterna. Ho quindi modificato il codice in Python aggiungendo queste righe:

from xml.dom.minidom import *
import urllib
import csv
LocationID = '714505'
# Fetch weather XML for Como, Italy
Trier = urllib.urlopen('http://weather.yahooapis.com/forecastrss?w=' + LocationID + '&u=c').read()
# Parse the XML
Trier = parseString(Trier)
# Get date
Date = Trier.getElementsByTagName('lastBuildDate')[0].firstChild.data
# Get today's weather
Today = Trier.getElementsByTagName('yweather:condition')[0]
T = Today.attributes["temp"].value
W = Today.attributes["text"].value
#print(W,T)

Se vuoi divertirti anche tu, ho messo online il nuovo arduinotomysql.py con le relative modifiche.

Tra parentesi, questa sera canto nel coro alla prima della Cavalleria Rusticana che dovrebbe tenersi all’aperto nell’Arena del teatro Sociale. In questo momento splende il sole, ma si prevede nuvolo con occasionali piogge. Incrocio le dita.

Arduino: connessione a MySQL su Raspberry Pi

Ecco il mio Arduberry:

Arduberry

Un Arduino Leonardo con sensore di temperatura e di luce, connesso direttamente via porta USB a un Raspberry Pi su cui gira un server LAMP. I dati del sensore vengono scritti ogni dieci minuti su un database MySql sul Raspberry.

Il vantaggi di questa soluzione rispetto a quella precedente sono che a) non si appoggia a nessun servizio esterno e quindi ne ho il pieno controllo, e b) che mi sono divertito un casino a smanettare tra java, python, sudo nano e crontab. Ho tratto grande giovamento dai vari tutorial in circolazione, in particolare Connect Raspberry Pi and Arduino with Serial USB CableTutorial: store Arduino data with RaspBerry PI to MySql che ringrazio di cuore: ragazzi, non ce l’avrei mai fatta senza di voi.

Prossimo passo: trovare un alimentatore separato per l’Arduino, che la porta USB del Raspberry alimenta ma appena appena. Potrei provare a utilizzare il server Apache del Raspberry per la visualizzazione dei dati. Magari un’altra volta.

Ecco la non semplicissima ricetta, al netto degli innumerevoli prova ed errore:

1)

/*
  Termometro 
  con smoothing dei valori del sensore
  (media di 10 letture)

  vedi
  http://www.arduino.cc/en/Tutorial/Smoothing
  
*/


const int numReadings = 10;     // numero di letture per la media
int readings[numReadings];      // le letture dal sensore analogico
int index = 0;                  // 'indice della lettura corrente
int total = 0;                  // il totale corrente
int average = 0;                // la media
float temp;                       // la temperatura in C°
int light;
int inputPin = A0;              //la connessione al sensore di temperatura
int lightPin = A1;
int x;
int y;
unsigned long temptot;



void setup()
{
  Serial.begin(9600);
  // metto a 0 le letture: 
  for (int thisReading = 0; thisReading < numReadings; thisReading++)
    readings[thisReading] = 0;          
}

void loop() {
  // tolgo l'ultima lettura:
  total= total - readings[index];         
  // leggo più volte dal sensore
  // e faccio la media per stabilità: 
  temptot = 0;
  for(x = 0; x < 64; x++) {
    temptot += analogRead(inputPin);
  }
  y = temptot >> 6;
  readings[index] = y;
 
  //readings[index] = analogRead(inputPin); 
  // aggiungo la lettura al totale:
  total= total + readings[index];       
  // avanzo alla posizione seguente nell'array:  
  index = index + 1;                    

  // se siamo alla fine dell'array...
  if (index >= numReadings) {              
    // ...ricomincio da capo: 
    index = 0;                           
  }
  // calcolo la media:
  average = total / numReadings;
  
  // converto voltaggio sensore in °C
  temp = ( 5.0 * average * 100.0) / 1024.0;  
  // leggo l'output per debug:
  // Serial.println(temp); 
  light = analogRead(lightPin);
  

  // scrivo sulla porta seriale:
  Serial.print(temp);
  //Serial.print(average);
  Serial.print(" ");
  Serial.print(light);
  Serial.println();

  delay(2000);        // ritardo tra le letture per stabilità 
  
}

2)

Codice in python (il file è questo) che legge la USB del Raspberry , preleva i valori dei sensori e li scrive nel database MySQL:

arduinotomysql1

 

3)

La riga aggiunta in Raspberry con il comando crontab -e che esegue la lettura della porta seriale ogni dieci minuti (l’ultima parte serve a evitare le mail di alert):

*/10 * * * * /usr/bin/arduinotomysql.py >/dev/null 2>&1

 4)

Enjoy!

Arduino: il grafico delle temperature

ArduTemp

Per cucinare il grafico della temperatura della mia camera da letto, ho impiegato i seguenti ingredienti:

  • Un Arduino 2009 con Internet Shield
  • Un sensore analogico di temperatura LM35
  • Un database MySQL su Amazon Web Services (gratis) su cui registrare i dati ogni 10 minuti
  • MySQL Workbench (gratis) per creare e gestire il database e la tabella
  • Un account su Temboo (gratis fino a 1000 calls/mese)) per trasferire i dati da Arduino a MySQL
  • MySQL for Excel (gratis) per riversare i dati raccolti in un foglio di Excel
  • Excel 2013 per trasformare i dati del sensore in gradi centigradi e creare la media oraria con relativo grafico.

La ricetta ha molti passaggi ma non è complicatissima. Richiede qualche conoscenza di programmazione, di SQL e di Excel, oppure richiede il tempo di fare numerosi errori, consultare gli innumerevoli manuali presenti in rete, riprovare con maggiore fortuna.

E’ un buon inizio e sono soddisfatto, ma c’è molto da migliorare.

Il fatto è che avevo già in casa un server MySQL sul Raspberry Pi, e il Raspberry ha i suoi bei pin di input/output. Ma ho scoperto che i PIO del Rasberry sono digitali, mentre il mio sensore è analogico. Morale: comprerò un sensore di temperatura digitale (tipo questo) e riproverò con una soluzione più diretta e più elegante.

Nel frattempo: come spiegare il picco delle ore sei?

AGGIORNAMENTO:

MySQL for Excel è fantastico e funziona perfettamente; inoltre importa automaticamente le connessioni create con MySQL Workbench; ma alla terza volta che riscaricavo i dati per aggiornare il grafico mi sono stufato.

Ho invece installato il driver ODBC per MySQL, e adesso la pivot si aggiorna direttamente dal database, senza passaggi intermedi e senza dove ogni volta rifare il lavoro. Molto meglio.

Da Spark a Google Spreadsheets: una storia d’amore con finale tragico

Temp/light sensor

Una delle cose interessanti dello Spark (il simil-Arduino con WiFi integrato) è che pubblica automaticamente nel cloud il suo stato.

Una delle cose interessanti di Google Spreadsheets è che è programmabile, e gli puoi chiedere di prendere i dati da una url:
Gdocscript

Metti insieme le due cose, e questo è il risultato:

gdocsresult

Ero molto contento della scoperta, che mi apriva nuovi e mirabolanti orizzonti. Poi sono andato ad automatizzare il tutto, creando un trigger che mi eseguisse automaticamente lo script ogni 15 minuti:

Gdocstrigger

E qui il bel sogno è svanito. Il trigger di Google Drive non funziona, oppure funziona quando vuole lui. Una veloce ricerca mi ha confermato che è un problema comune a tutti quelli che ci hanno provato.

Morale: bisogna cercare altre strade. Per esempio, alimentare direttamente un database MySQL tramite Temboo.