[vba] Utilizzare il dizionario nelle macro di Excel per calcolare la media dei voti, in diverse materie per diversi studenti

Propongo un veloce esercizio in VBA sull’utilizzo dei dizionari.

Immaginiamo di avere un elenco di studenti e voti in diverse materie come nell’esempio seguente:

Vogliamo calcolare la media dei voti per ciascun studente in ciascuna materia, mettendo tutto in una tabella tipo pivot nel modo seguente:

La cella gialla è in L10

A tale scopo realizziamo la seguente macro in VBA utilizzando i dizionari. Per usare il dizionario anzitutto aggiungiamo il relativo riferimento da Strumenti > Riferimenti…

Il riferimento che ci interessa è il Microsoft Scripting Runtime, libreria dalla quale andremo a prelevare Scripting.Dictionary

Fatto tutto questo vediamo il codice:

Faccio notare che nel mio esempio la tabella di scrittura parte dalla posizione L10 nel foglio di calcolo attivo.

Quello che abbiamo realizzato è un dizionario di dizionari. Per realizzarlo utilizziamo:

 

Come riempire la soluzione diserbante nel laboratorio in Resident Evil 2 Remake

Resident Evil 2 è pieno di questi squisiti rompicapi e questo in particolare fa eco al cosiddetto enigma delle taniche d’acqua, reso famoso dal film Die Hard. Per chi ancora non lo avesse capito stiamo parlando del macchinario per la soluzione diserbante nel Drug Testing Lab, all’interno del laboratorio sotterraneo dell’Umbrella.

Questo qui insomma. La soluzione all’enigma è semplicissima, esattamente come quella del suddetto indovinello. In pratica bisogna fare nel modo seguente:

Alla partenza siamo in questa situazione. Vediamo che la differenza che c’è tra la soluzione verde e la linea rossa nel primo contenitore è la medesima che c’è tra l’intero primo contenitore ed il secondo. Essendo il liquido sufficiente a riempire tutto il primo contenitore se lo svuotassimo nel secondo contenitore, all’interno del primo resterebbe la quantità che cerchiamo. Notiamo subito che la metà del primo contenitore, piena di liquido per altro, è identica al terzo contenitore. Appurato tutto ciò scambiamo il primo con il secondo e premiamo il tasto verde. Dovremmo ottenere questo:

A questo punto nel secondo contenitore avanza giusto il liquido che c’è tra la linea rossa e la cima. Adesso disponiamo i contenitori nel modo seguente:

E riempiamo il primo contenitore in modo da ottenere questo:

Adesso non ci rimane che spostare al primo posto il terzo contenitore, ed il primo contenitore al secondo posto e poi procedere. La situazione prima di concludere dovrebbe essere questa:

Una volta riversato il liquido dal secondo nel primo avremo finito.

Ordine degli spinotti nella stanza di monitoraggio, Resident Evil 2 Remake

Una volta recuperati gli sei spinotti con le figure degli scacchi, ci si dovrà recare nella Stanza di monitoraggio per azionare il circuito elettrico e aprire la porta.

Sulla parete centrale c’è una bacheca con degli appunti, dove si troveranno gli indizi su come posizionare gli spinotti.

L’appunto recita “Se non sbaglio la torre e il cavallo sono sullo stesso muro, e l’alfiere e la regina non sono l’uno accanto all’altro. La regina e la torre, invece, sono ai lati opposti.

Questo indizio ci porta ad un’unica scelta possibile (bisognerà estrarre il cavallo dalla posizione attuale e spostarlo), che è la seguente, sulle due pareti:

Sulla parete alla nostra sinistra, guardando frontalmente quella centrale, vanno messi alfiere, torre e cavallo. Sulla parete alla nostra destra vanno invece pedone, regina e re.

[linux] Rinominare i file da terminale con bash sostituendo uno o più caratteri nel nome

Immaginiamo di voler sostituire un particolare carattere nel nome dei file dentro ad una cartella. Nel mio caso in tutti i nomi è presente una @ che voglio trasformare in uno _.

Utilizzando semplici comandi di bash è possibile fare questa operazione da terminale nel modo seguente:

 

[linux] Cercare file con caratteri speciali nel nome del file

Oggi mi è capitato un curioso problema: elaborando programmaticamente un lungo elenco di file ho notato che alcuni file avevano degli insidiosi spazi bianchi tra le lettere ed i numeri. Indagando più a fondo ho notato che non si trattava di comuni spazi bianchi, bensì di caratteri speciali che venivano visualizzati come spazi bianchi.

Per trovare file con caratteri speciali quali i caratteri di controllo si può usare il seguente comando:

Con il seguente comando invece è possibile recuperare sia i caratteri non-ascii che i caratteri di controllo, sia in file che cartelle:

 

[wordpress] Aggiungere foglio di stile in ultima posizione nel head (intestazione)

Una cosa molto seccante in WordPress, quando si va a modificare il foglio di stile di un tema (specialmente se un tema child), è dover forzare le proprietà con l’istruzione !important, perché altrimenti prevalgono gli stili di plugin o altri elementi che sono stati aggiunti in precedenza al tema.

Una soluzione che adotto spesso è quella di aggiungere un mio foglio di stile supplementare e farlo apparire in ultima posizione rispetto ai fogli di stile richiamati nell’intestazione. In questo modo le proprietà ivi inserite potranno sovrascrivere senza difficoltà quelle dei precedenti fogli.

Per farlo anzitutto posizioniamoci nella cartella del nostro tema e aggiungiamo un foglio di stile, per esempio stile-finale.css

Do per scontato che le modifiche vengano fatte ad un tema child, ma vale lo stesso con un tema genitore.

A questo punto andiamo dentro functions.php e aggiungiamo il seguente codice in fondo:

Il 9999 sta a rappresentare l’ordine in cui verrà inserito il foglio di stile e si suppone che non ci siano altri 9.999 fogli già esistenti.

Fatto! 🙂

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