[magento] Errore SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry ‘0009032’ for key ‘UNQ_SALES_FLAT_ORDER_INCREMENT_ID’

Soluzione1: Questo errore si presenta quando si effettua un ordine su Magento, si viene indirizzati al pagamento, ma il pagamento non va a buon fine e si viene rimandati indietro sul negozio. Per risolvere questo problema è sufficiente modificare il file app/code/core/Mage/Sales/Model/Resource/Quote.php come indicato di seguito

Per risolvere il problema posizioniamoci nella cartella principale del negozio in Magento. Dopodiché andiamo a modificare il file app/code/core/Mage/Sales/Model/Resource/Quote.php

Apriamolo e cerchiamo la seguente parte di codice

Alla linea quattro modifichiamo

In modo che diventi:

Salviamo il tutto.

Soluzione2: Questo errore si presenta quando per qualche ragione sono stati inseriti ordini sopra l’ultimo incrementale registrato in eav_entity_type. Per risolvere il problema è sufficiente incrementare sopra l’ultimo valore registrato il valore dell’incrementale. 

Di seguito discutiamo il problema e la soluzione nel dettaglio.

Anzitutto l’errore che si presenta è simile a questo:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '0009032' for key 'UNQ_SALES_FLAT_ORDER_INCREMENT_ID', query was: INSERT INTO sales_flat_order (coupon_code, protect_code, shipping_description, is_virtual, store_id, customer_id, base_discount_amount, base_grand_total, base_shipping_amount, base_shipping_tax_amount, base_subtotal, base_tax_amount, base_to_global_rate, base_to_order_rate, discount_amount, grand_total, shipping_amount, shipping_tax_amount, store_to_base_rate, store_to_order_rate, subtotal, tax_amount, total_qty_ordered, customer_is_guest, customer_note_notify, customer_group_id, quote_id, base_shipping_discount_amount, base_subtotal_incl_tax, shipping_discount_amount, subtotal_incl_tax, weight, customer_dob, increment_id, applied_rule_ids, base_currency_code, customer_email, customer_firstname, customer_lastname, customer_middlename, customer_prefix, customer_suffix, customer_taxvat, discount_description, global_currency_code, order_currency_code, remote_ip, shipping_method, store_currency_code, store_name, x_forwarded_for, customer_note, created_at, updated_at, total_item_count, customer_gender, hidden_tax_amount, base_hidden_tax_amount, shipping_hidden_tax_amount, base_shipping_hidden_tax_amnt, shipping_incl_tax, base_shipping_incl_tax, gift_message_id, payment_fee_amount, base_payment_fee_amount, payment_installment_fee_amount, base_payment_installment_fee_amount, payment_tax_amount, base_payment_tax_amount, referral_code, ebizmarts_abandonedcart_flag, payment_fee_tax, base_payment_fee_tax, payment_percentage_fee, base_payment_percentage_fee) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, '1975-10-01 00:00:00', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, '2018-11-28 11:14:46', '2018-11-28 11:14:46', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

Questo errore si presenta perché si sta cercando di inserire una chiave duplicata in sales_flat_order. Prima di tutto verifichiamo la cosa spostandoci in sales_flat_order ed effettuando la seguente query:

Nel mio caso il risultato della query era 10.009. Adesso spostiamoci su eav_entity_store. Qui dovremmo vedere una tabella con tutti gli incrementali. Cerchiamo quello che ci interessa. Per trovarlo guardiamo i campi entity_type_id e store_id. Gli entity_type_id hanno come riferimento la tabella eav_entity_type.

Per esempio il codice 5 corrisponde agli ordini, mentre il codice 6 alle fatture/ordini.

Nel mio caso mi accorgo che increment_last_id è su 9033, mentre il massimo valore inserito in sales_flat_order è di 10.009. Quindi mi è sufficiente portare questo valore al di sopra di quello attuale, per esempio impostandolo su 10.010.

Una volta fatto il problema è risolto.

[mysql] Creare una funzione che converta un codice hex RGB di CSS in valori HSV

Oggi propongo una piccola soluzione in SQL al problema dell’ordinamento dei colori. Una cosa apparentemente elementare si rivela in realtà estremamente complessa. Per un approfondimento generale sul tema consiglio questo interessantissimo articolo: The incredibly challenging task of sorting colours

Per quello che mi interessa voglio proporre oggi la soluzione dell’utilizzo dello spazio HSV per poterli ordinare.

Supponiamo di avere un database di colori in RGB formato esadecimale del CSS (per intendersi il rosso sarebbe #ff0000). Nell’esempio riportato suppongo che il codice di colore sia sempre a 6 caratteri.

Detto tutto questo andiamo alla nostra funzione in SQL:

Per utilizzarla possiamo fare così:

[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: