sabato, 18 Gennaio 2025

Semplice script di backup (copia di file) in bash

Vediamo creare un elementare sistema di backup in BASH. In questo caso supponiamo di avere, nella posizione in cui viene eseguito il codice, una cartella chiamata elementi, dentro la quale abbiamo tutti i file e le cartelle che desideriamo copiare dentro la destinazione di backup. La destinazione di backup è la medesima dello script (non entro ora nel merito sul buon senso di fare qualcosa di simile) dove verranno create n cartelle consecutive per tutti i backup effettuati. Le cartelle saranno quindi chiamate bck0, bck1bckn.

Faccio notare che la prima parte dello script, quella con il ciclo for, serve solo a contare il numero di cartelle di backup attualmente esistenti, per poter creare così la cartella successiva. Se non esiste alcuna cartella il contatore rimane a 0 e crea la prima cartella zeresima, chiamata bck0. Quando si usa la seconda volta le cartelle sono 1, la cartella bck0, e quindi la variabile tot assume valore 1. E così via ad ogni passaggio successivo.

Il backup vero e proprio viene effettuato nell’ultima parte del codice (le ultime due righe), dove creiamo la nuova cartella unendo il nome di dest al numero in tot e poi usiamo il comando cp -a (copia ricorsivamente tutti i file e le cartelle).

Labirinto disegnato in PHP

Per gli appassionati di Pathfinder come me capita di fare il master e voler proporre qualche simpatico labirinto ai propri avventurieri. Online si trovano già moltissimi generatori di dungeon, però ho deciso di svagarmi un po’ questo sabato pomeriggio creando uno tutto mio in PHP.

Questo è il risultato (si rigenera ad ogni refresh della pagina):

Vediamo il codice sufficiente per ottenerlo:

Le impostazioni nell’esempio sono le medesime per ottenere l’immagine di sopra.

Calcolare IRR (Internal Rate of Return o TIR.COST) in VBA

Problema: la funzione TIR.COST (Tasso Interno di Rendimento) restituisce un unico valore per l’IRR anche quando ce ne è più di uno

Senza discutere sull’interpretazione dell’IRR stesso, immaginiamo di avere i seguenti due scenari di flusso di cassa.

I Scenario

Questo produce un grafico VAN-IRR come quello seguente:

In questo caso abbiamo due valori dell’IRR rispettivamente 15,47% e 33,33%; la funzione TIR.COST restituisce solamente il primo valore.

II Scenario

A questa serie di flussi di cassa corrisponde il seguente grafico:

In questo caso abbiamo due valori dell’IRR rispettivamente 1,99% e 19,65%; la funzione TIR.COST restituisce solamente il secondo valore.

Costruiamo quindi in VBA le funzioni necessarie per effettuare questo calcolo; come già mostrato anche qui utilizzeremo una funzione che restituisca un vettore di valori sotto forma di Variant, in modo da poterli valutare singolarmente (per esempio utilizzando le funzioni MIN e MAX, quando i valori sono solo due, quindi =MIN(IRRX(A1:A10)) oppure =MAX(IRRX(A1:A10))).

La funzione finale si chiama IRRX, quella che utilizzeremo dentro il foglio excel.

Le altre funzioni servono rispettivamente a:

  • IRRv1 – calcolare in modo approssimativo tutti gli IRR possibili su uno specifico flusso di cassa, con valore massimo per l’IRR al 30.000% (espresso come max = 300), inutile dire come questo valore possa essere impostato anche a molto meno per velocizzare i calcoli; l’IRR qui viene calcolato per ogni punto percentuale con scarti del 1%
  • IRRv2 – qui calcoliamo, per ogni valore di IRR trovato con la precedente funzione, il valore approssimato mediante iterazione su valori che vanno da IRRv2 ± 1%
  • VAN – questa funziona calcola semplicemente il VAN sul dato IRR

 

Testato su Excel 2016.

Creare una funzione personalizzata in VBA per Excel che restituisca una matrice

Obiettivo: creare una funzione personalizzata in Excel che restituisca come risultato una matrice n x m

Supponiamo di voler realizzare una funzione personalizzata in Excel che effettui la medesima operazione di MATR.PRODOTTO, ma allo stesso tempo consideri sempre la matrice in ingresso A come una matrice n x 1 e la matrice in ingresso B come una matrice 1 x m. Facciamo questa semplificazione a titolo di esempio.

Quindi abbiamo due matrici tipo queste:

A =  \begin{bmatrix}  a_1 \\ a_2 \\ a_3  \end{bmatrix}    B =  \begin{bmatrix}  b_1 & b_2 & b_3  \end{bmatrix}

Il loro prodotto risulterà così:

A \times B=  \begin{bmatrix}  a_1b_1 & a_1b_2 & a_1b_3 \\  a_2b_1 & a_2b_2 & a_2b_3 \\  a_3b_1 & a_3b_2 & a_3b_3  \end{bmatrix}

Nel nostro modulo aggiungiamo ora il seguente codice:

Notiamo che in questo modo vengono percorsi tutti i valori del range, indipendentemente dalla loro geometria, come se fossero in una riga o colonna.

Per testare il risultato possiamo fare una verifica su un esempio con la funzione MATR.SOMMA.PRODOTTO. Nel caso specifico creiamo una versione e parametrizzabile del SOMMA.PIÙ.SE.

A1:A7 e B1:B7 sono riempiti con valori da esempio. E2:H2 saranno quattro spazi dove potremo inserire, a nostro piacimento da 0 a 4 nominativi da verificare. In E3 abbiamo la seguente formula di controllo (NB: fatta con MATR.PRODOTTO):

=MATR.SOMMA.PRODOTTO(–(A2:A7=E2:H2);MATR.PRODOTTO(B2:B7;E1:H1))

In E4 aggiungiamo invece la formula con la nostra versione di MATR.PRODOTTO:

=MATR.SOMMA.PRODOTTO(–(A2:A7=E2:H2);MATH_MATRICE(B2:B7;E1:H1))

Scopo raggiunto.

Creare mappa personalizzata in Civilization VI

Creare una mappa personalizzata in Civilization VI è estremamente facile (e anche molto divertente).

Il gioco integra un World Builder a cui si può accedere dai contenuti aggiuntivi.

L’editor non è dei migliori, dal punto di vista grafico e dell’utilizzabilità, però fa il suo sporco dovere. Basterà fare un po’ di prove per capire come funziona. Una caratteristica in particolare, da tenere a mente, è l’inserimento delle città stato, che normalmente dovrebbe avvenire tramite script e che altrimenti dobbiamo mettere a mano.

Per farlo sarà sufficiente impostare il leader desiderato come “caratteristica del terreno“, nel modo seguente:

Clicchiamo sulla casella nella quale vogliamo mettere la città stato e poi impostiamo la Start Position su Leader e nel menu a tendina di sotto il nome della città stato che vogliamo inserire.

Una volta creata la nostra mappa premiamo ESC e salviamo dal menu, come se stessimo salvando il gioco.

Da impostazione predefinita la mappa viene salvata con estensione *.Cvi6Map in:

%UserProfile%\Documents\My Games\Sid Meier’s Civilization VI\Saves\WorldBuilder

A questo punto per aggiungerla alle mappe giocabili nel gioco è sufficiente apportare un paio di modifiche.

Nel mio esempio il gioco è installato su Steam, quindi ci spostiamo su:

%ProgramFiles%\Steam\steamapps\common\Sid Meier’s Civilization VI\Base\Assets\Configuration\Data

Qui dentro si trovano i file XML con tutte le mappe giocabili nel gioco, possiamo aprirne alcuni per capire come funziona la cosa e poi crearne uno nostro personale, da aggiungere a quelli esistenti. Il file si potrebbe chiamare per esempio LeMieMappe.xml (faccio notare come il nome del file è assolutamente irrilevante, purché sia un file XML e probabilmente non contenga caratteri speciali).

Adesso vediamo un esempio di configurazione base (nel mio esempio ho spostato la mappa dalla posizione di salvataggio in

%ProgramFiles%\Steam\steamapps\common\Sid Meier’s Civilization VI\Base\Assets\Maps\Extra (ma questo cambiamento non è obbligatorio)

Faccio notare alcune caratteristiche interessanti:

Maps: definisce il percorso della mappa, il nome e la descrizione che appariranno a video, oltre che un indice per l’ordinamento, ovvero la posizione in cui farla apparire assieme a tutte le altre mappe

MapSizes: definisce i parametri entro i quali può essere configurato il gioco, oltre che la dimensione predefinita, il numero minimo e massimo di giocatori ecc.

In questo unico file potremmo aggiungere n mappe, specificando i dettagli in entrambi i tag.

concurrent.futures.process.BrokenProcessPool eseguendo QuantumProgram di qiskit-sdk

Soluzione: il codice eseguito in Python deve essere protetto, o meglio “guarded”, ciò significa che il QuantumProgram deve essere eseguito dentro ad un’istruzione if __name__ == “__main__”

Compilando il programma nell’esempio nel qiskit-sdk-py si incorre nel seguente errore durante l’esecuzione:

Questo accade perché si tentano di avviare delle biforcazioni del processo originale senza aver utilizzato un idioma appropriato per il modulo. Per correggere il problema è sufficiente reimpostare il codice eseguibile in questo modo:

Ambiente di prova:

  • Version used: Python 3.6.3 (v3.6.3:2c5fed8, Oct 3 2017, 18:11:49) [MSC v.1900 64 bit (AMD64)] on win32
  • Environment name and version (e.g. Python 3.6.1): Python 3.6.3
  • Operating System and version: Microsoft Windows 10 Pro 10.0.16299 build 16299

 

Pubblicato originariamente su Github.

Usando la rotellina su Google Maps lo zoom è troppo veloce

Problema: scorrendo la rotellina su Google Maps per lo zoom, la mappa si rimpicciolisce o ingrandisce troppo rapidamente e senza possibilità di calibrare l’ingrandimento

Soluzione: probabilmente dipende dal software/driver del mouse, nel mio caso dal software Logitech Options (modello mouse M310)

Continua l’epopea del mouse con la rotellina che fa male.

Dopo aver scaricato Logitech Options mi accorgo che, su Google Maps, quando si utilizza la rotellina per ingrandire, la mappa letteralmente fugge via, ingrandendosi o rimpicciolendosi a dismisura.

Si passa da:

A qualcosa tipo:

E viceversa, con una sola rotazione del mouse.

Disinstallando il programma, che tra l’altro riceveva continui aggiornamenti, il tutto è tornato regolare.

Extreme Injector v3.7.3 (funzionante su Windows 10)

L’altro giorno cercavo di installare Cinematic Tools per Assassin’s Creed Unity, ma ho scoperto che nel download del sito ufficiale era incluso uno Extreme Injector non compatibile con Windows 10. Dopo un po’ di ricerca ho trovato la versione funzionante scaricabile dalla pagina ufficiale del forum MPGH.net.

Questa è l’interfaccia che dovrebbe apparire se va tutto bene.

HASH SHA256 del file (controllato con antivirus Kaspersky IS2017): 93DDA8B91586ACF53C70DFD3F512FCFF5793A9AF69E174D7E3AD67190361BCE8

Per farlo funzionare è necessario avere installato il Microsoft Visual C++.

In teoria basterebbe la versione 2017, ma per precauzione ho installato anche la 2015.

Scaricare Visual C++ Redistributable per Visual Studio 2015

Download ufficiale

Scaricare Microsoft Visual C++ Redistributable per Visual Studio 2017

https://www.visualstudio.com/it/downloads

Una volta entrati nella pagina scendere in fondo e cliccare su Altri strumenti e framework

Calcolare indirizzo IP e rete in PHP

In rete si trovano già numerosi calcolatori di indirizzi IP e rete, come per esempio questo oppure questo.

Prendendo spunto da essi ecco una classe in PHP per ottenere i medesimi risultati. Lo scopo principale in questo caso è utilizzare le operazioni binarie in PHP per calcolare i vari valori di ID Rete, Subnet mask, ecc.

Ecco di seguito un esempio di utilizzo:

 

Installare macOS 10.13 High con VirtualBox su Windows

Cercando un modo di installare il Mac su una macchina virtuale su Windows ho trovato questa fantastica guida online:

Steps to Install macOS 10.13 High Sierra on VirtualBox on Windows

Gli unici unici problemi che mi si sono presentati riguardavano la fase di avvio, quando la macchina virtuale partiva con schermo nero senza fare altro apparentemente.

Nel mio caso il problema è stato risolto modificando nella maniera seguente le impostazioni suggerite:

Versione: Mac OS X (64–bit) e non quelle suggerite in automatico

Chipset: PIIX3 (la dimensione della RAM invece è a piacere e non inficia il funzionamento della macchina, a parte la velocità ovviamente)

Cambiando questi due parametri la macchina virtuale si è avviata senza problemi.

Piccola curiosità:

Le istruzioni al passaggio 5 possono essere seguite da CMD oppure da PowerShell. Nel caso della PowerShell basta anteporre il i caratteri ./ all’eseguibile, ottenendo la seguente serie di comandi:

./VBoxManage.exe modifyvm “macOS 10.13 High Sierra” –cpuidset 00000001 000106e5 00100800 0098e3fd bfebfbff
./VBoxManage setextradata “macOS 10.13 High Sierra” “VBoxInternal/Devices/efi/0/Config/DmiSystemProduct” “iMac11,3”
./VBoxManage setextradata “macOS 10.13 High Sierra” “VBoxInternal/Devices/efi/0/Config/DmiSystemVersion” “1.0”
./VBoxManage setextradata “macOS 10.13 High Sierra” “VBoxInternal/Devices/efi/0/Config/DmiBoardProduct” “Iloveapple”
./VBoxManage setextradata “macOS 10.13 High Sierra” “VBoxInternal/Devices/smc/0/Config/DeviceKey” “ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc”
./VBoxManage setextradata “macOS 10.13 High Sierra” “VBoxInternal/Devices/smc/0/Config/GetKeyFromRealSMC” 1

Queste istruzioni vanno a modificare un file macOS 10.13 High Sierra.vbox (dipende come avete chiamato la macchina) che si trova nella sua cartella in VirtualBox VMs.

Si tratta di un file XML dove appariranno istruzioni del tipo: