[risolto] UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe9 in position 0: ordinal not in range(128)

Questo genere di errore avviene in Python quando si cercano di convertire le stringhe da Unicode (UTF-8) in ASCII. Questo avviene più spesso di quanto non si creda, dal momento che le stringhe di testo sono tutte gestite come ASCII e il meccanismo che si occupa della conversione, paradossalmente, può gestire unicamente caratteri ASCII.

Per un approfondimento tecnico consiglio la lettura di questo articolo: Overcoming frustration: Correctly using unicode in python2

In questo caso voglio trattare l’esempio di errore che si ha utilizzando il seguente codice:

L’errore restituito è il seguente:

Traceback (most recent call last):
File "C:\Users\utente\Desktop\esempio\errore.py", line 4, in <module>
print ";".join(prova)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 0: ordinal not in range(128)

In particolare il problema si presenta quando si tenta di fare la join sulla lista con un separatore di testo.

Online si trovano numerose soluzioni come per esempio questa (che però non funziona!), ma nessuna che mi abbia davvero soddisfatto:

Il problema di fondo è che le stringhe incriminate, che nel mio esempio ho scritto io, sono lette dal programma da sorgenti esterne sulle quali non ho controllo e fare il debugging di tutti i possibili caratteri (milioni di caratteri come minimo!) è chiaramente alquanto improbabile.

Per aggirare il sistema e poter effettuare comunque la join ho usato quindi una funzione costruita ad hoc nel modo seguente:

A questo punto possiamo testarla nel modo seguente:

Il risultato stampato è il seguente:

é;a;è;;;èòà+;pippo  prova;;ancora

Faccio notare come in questo modo vengano ignorati i caratteri incriminati. Non è una soluzione molto elegante, ma comunque si raggiunge lo scopo di poter “pulire” il testo di origine.

Questo errore potrebbe anche presentarsi in altre forme come:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xc2' in position 0: ordinal not in range(128)

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 20: ordinal not in range(128)

E altri.

[python] File CSV o di testo comincia con  oppure con i byte EF BB BF

Facendo il parsing di un file CSV in python ci si potrebbe accorgere che all’inizio del file rimangono dei “segni strani”, nel mio caso ï»¿ (ma ciò dipende dalla formattazione con cui si visualizza).

Si tratta del Byte Order Mark (BOM), una piccola sequenza di caratteri che serve ad indicare la codifica Unicode del file medesimo.

Aprendo il file con un editor esadecimale, come HexEdit per esempio, vedremmo qualcosa come questo:

Nello specifico questo è un file esportato da WooCommerce e come primi 3 byte i valori EF BB BF che rappresentano l’UTF8.

Di seguito l’elenco, scopiazzato da Wikipedia, delle codifiche possibili:

Encoding Representation (hexadecimal) Representation (decimal) Bytes as CP1252 characters
UTF-8 EF BB BF 239 187 191 
UTF-16 (BE) FE FF 254 255 þÿ
UTF-16 (LE) FF FE 255 254 ÿþ
UTF-32 (BE) 00 00 FE FF 0 0 254 255 ^@^@þÿ (^@ is the null character)
UTF-32 (LE) FF FE 00 00 255 254 0 0 ÿþ^@^@ (^@ is the null character)
UTF-7 2B 2F 76 38
2B 2F 76 39
2B 2F 76 2B
2B 2F 76 2F
2B 2F 76 38 2D
43 47 118 56
43 47 118 57
43 47 118 43
43 47 118 47
43 47 118 56 45
+/v8
+/v9
+/v+
+/v/
+/v8-
UTF-1 F7 64 4C 247 100 76 ÷dL
UTF-EBCDIC DD 73 66 73 221 115 102 115 Ýsfs
SCSU 0E FE FF 14 254 255 ^Nþÿ (^N is the “shift out” character)
BOCU-1 FB EE 28 251 238 40 ûî(
GB-18030 84 31 95 33 132 49 149 51 „1•3

Per interpretare correttamente il contenuto del file è sufficiente decodificarlo nella codifica corretta, nel mio caso con:

[moodle] Cambiare icona (favicon) del sito

A volte le operazioni più banali risultano le più ostiche. Per cambiare la favicon di un sito fatto con Moodle è inutile arrovellarsi sul panello di controllo. Bisogna intervenire direttamente sul FTP.

Per farlo troviamo dove è posizionato il nostro tema e cerchiamo la cartella pix, per esempio:

/httpdocs/theme/nome_tema/pix

Una volta dentro sostituiamo il file favicon.ico con la nostra nuova icona.

Adesso torniamo nel panello di controllo di Moodle e andiamo su:

Dashboard > Amministrazione del sito > Aspetto > Temi > Impostazioni tema

Qui selezioniamo, qualora non sia già selezionata, la modalità Modalità Theme designer (themedesignermode) e salviamo. Aggiorniamo il sito e verifichiamo che sia comparsa la nuova icona. Eventualmente per aggiornare il sito premiamo SHIFT+F5 (se stiamo usando Chrome)

Fatto ciò dovremmo vedere la nuova icona, disattiviamo la Modalità Theme designer e salviamo di nuovo.

L’icona è stata modificata.

[risolto] Google Chrome con tutti i caratteri in corsivo

Problema: I caratteri predefiniti in Google Chrome appaiono tutti in corsivo, sia nelle impostazioni che in tutti i servizi di Google come Google Calendar, Google Drive, Google Keep ecc.

Soluzione: Installare tutti i caratteri predefiniti che utilizza Chrome, nel mio caso il carattere Roboto

Dopo l’ultimo aggiornamento improvvisamente Chrome ha iniziato a mostrare ovunque dei fastidiosissimi caratteri in corsivo come in questa pagina:

Per risolvere il problema è sufficiente cliccare col destro sopra una qualunque delle parti di testo e scegliere ispeziona.

A questo punto si aprirà di fianco (oppure in basso) una finestra simile a questa:

Individuato un pezzo di testo [1] cerca nella finestra sottostante il punto dove è definito il carattere utilizzato, tipicamente per il tag html [2]. Nel mio caso il primo font utilizzato è Roboto.

In Windows andando su Pannello di controllo > Aspetto e personalizzazione > Caratteri trovare il font utilizzato. Probabilmente potrai notare che manca la versione normale, chiamata spesso anche Regular o Normal. Nel caso di Roboto a me mancava la versione Roboto-Regular.

Per risolvere il problema è stato sufficiente scaricarla da qui: https://github.com/google/roboto

Una volta scaricato il file ti basterà scompattarlo e raggiungere la cartella con tutti i file *.ttf [1] del carattere, selezionarli, cliccarci sopra col destro e scegliere installa [2].

Se hai fatto tutto correttamente puoi riavviare Chrome e dovresti vedere tornato tutto normale.

[virtualbox] Errore E_FAIL (0x80004005)

Problema: Risulta impossibile avviare qualunque macchina virtuale e viene mostrato un errore del tipo Errore E_FAIL (0x80004005)

Soluzione: Disinstallare VirtualBox e reinstallarlo da capo

A qualcuno potrà far sorridere che la soluzione sia così drammatica, ma non sembra esserci altro modo. Anche cercando online pare che nessuno abbia trovato un’altra soluzione soddisfacente. Ho anche provato a “riparare” VirtualBox, utilizzando il suo stesso installer, ma la situazione è addirittura peggiorata, dal momento che sono spariti tutti i collegamenti dal menu Start.

A quel punto ho deciso di reinstallare da zero il programma. Per farlo è sufficiente avviare una nuova installazione e scegliere l’opzione Rimuovi.

Dopodiché la rilanciamo per l’installazione pulita. Niente timore per le configurazioni fino a quel momento.

Se disinstalliamo VirtualBox in questo modo, senza fare ulteriori pulizie, e lo reinstalliamo nella medesima posizione, tutte le configurazioni personalizzate dovrebbero essersi salvate.

L’errore si era presentato a seguito di un’interruzione improvvisa di VirtualBox, causata da un fantastico aggiornamento forzato di Windows 10!

[apps script] Aggiungere un nuovo foglio a Spreadsheet controllando quelli esistenti

Vediamo come costruire una funzione che ci permetta di creare da apps script un nuovo foglio su spreadsheet ed aggiungerlo a quelli esistenti.

Notiamo che per prendere il riferimento alla cartella esistente utilizziamo:

Il nome del foglio lo vogliamo gestire nel modo seguente: se il nome che stiamo cercando di aggiungere esiste già, allora posponiamo al nome un contatore numerico scritto come (1), (2)… (n). In pratica se esiste già un foglio chiamato Primo Foglio, allora il foglio aggiunto sarà Primo Foglio (1), se esistono entrambi sarà Primo Foglio (2) ecc.

Infine restituiamo il riferimento al foglio appena creato con:

 

[apps script] Creiamo una funzione personalizzata che esegua la somma sull’intervallo di uno Spreadsheet

Oggi vediamo come creare una funzione per Spreadsheet con Google Apps Script che permetta di sommare tutti gli elementi di un intervallo passato per argomento, al pari della funzione SUM().

Faccio notare che abbiamo usato parseFloat() su tutti i valori, in modo che se venissero passati valori non numeri la funzione restituirebbe #NUM!.

Una volta inserita la funzione nello script possiamo testarla nel modo seguente:

[apps script] Inviare tramite Gmail un’email ad un elenco di contatti in Spreadsheet

Immaginiamo di avere in Spreadsheet un elenco di indirizzi email a cui vogliamo inviare un messaggio personalizzato.

A tale scopo creiamo un nuovo file con un foglio contenente degli indirizzi nel modo seguente:

Adesso creiamo un bottone al quale collegare lo script che andremo a comporre successivamente. Per aggiungere un pulsante nel foglio di calcolo dobbiamo usare un’immagine, a differenza di quanto accadeva in Excel dove si possono inserire pulsanti da interfaccia. All’immagine assoceremo poi uno script.

Per aggiungere un’immagine andiamo su Inserisci > Immagine…

Prendiamo un’immagine dal nostro computer oppure cerchiamola su Google. Dovremmo arrivare ad una situazione come questa:

A questo punto andiamo su Strumenti > Editor di script e aggiungiamo il nostro script.

Con GmailApp.sendEmail() invieremo l’email utilizzando la nostra casella di posta, mentre con Browser.msgBox() lanceremo un messaggio di conferma delle email inviate.

Fatto questo torniamo nello spreadsheet e clicchiamo col destro sull’immagine. Vedremo comparire in alto a destra dei puntini, clicchiamoci sopra per aprire il menù contestuale.

Scegliamo Assegna script… e nella finestra inseriamo il nome della nostra funzione, ovvero InviaEmailAllaLista

Fatto questo possiamo cliccare sul nostro pulsante e testare il nostro nuovo script.

Se abbiamo fatto tutto bene riceveremo un messaggio di conferma.

[javascript] Scrivere righe, colonne e formule su Google Spreadsheet utilizzando Google Apps Script (per esordienti totali)

Oggi voglio proporre un esercizio facile facile su Google Spreadsheet, l’equivalente (si fa per dire!) G Suite a Microsoft Excel.

In Excel è possibile aggiungere macro (o script) ai fogli di calcolo utilizzando VBA, mentre Google ha implementato per il medesimo risultato gli script tramite JavaScript.

Prima di cominciare vediamo il risultato che intendiamo ottenere: creare uno script che generi tre colonne di dati, contenenti rispettivamente una sequenza di ID, un elenco di prodotti pescati casualmente da un vettore, delle quantità casuali; in fondo alla tabella vogliamo scrivere il TOTALE utilizzando una funzione di somma.

Quello di sopra è ciò che vogliamo arrivare a vedere alla fine.

Cominciamo allora subito creando un nuovo foglio, che io ho chiamato test script, poi aggiungiamo uno script andando su Strumenti > Editor di script.

A questo punto si aprirà la schermata degli script dove verrà proposta una funzione base. Cancelliamola e creiamo la nostra funzione in questo modo:

Anzitutto creiamo un oggetto collegato al foglio corrente:

Con getActiveSpreadsheet() prendiamo il riferimento alla cartella di lavoro aperta in questo momento (l’equivalente di Workbook in Excel), mentre con getSheets() prendiamo il vettore di tutti i fogli nella cartella di lavoro.

Puliamo anzitutto il foglio da precedenti contenuti con:

Adesso cambiamo il nome del foglio con:

A questo punto possiamo costruire la nostra funzione per popolare il foglio con i dati come da esempio iniziale. Integrando il tutto dovremmo ottenere qualcosa di simile a questo:

Faccio notare che la somma totale dei prodotti la facciamo con =SUM(C2:C100) che impostiamo nella cella alla riga 101 e colonna 3.

Quando abbiamo fatto tutto premiamo il tasto ESEGUI (play). Se è la prima volta che eseguiamo lo script ci verrà chiesto di autorizzarlo per accedere al foglio di lavoro dal quale siamo partiti. Concediamogli l’autorizzazione.

ATTENZIONE! Comparirà una schermata di avviso come se la connessione non fosse sicura, che ci allerterà che stiamo per eseguire uno script non sicuro, dal momento che è uno script personalizzato da noi e non verificato da Google. Clicchiamo su Avanzate e procediamo.

Se tutto è andato bene avremo eseguito il nostro primo script delle Google Apps Script. 🙂