sabato, 19 Aprile 2025

Civilization VI: Rise and Fall, creare mappa personalizzata

Abbiamo già visto nel precedente articolo come creare una mappa personalizzata in Civilization VI.

Chiunque ci abbia provato avrà notato che la mappa non funziona quando si utilizza l’espansione Rise and Fall

Perché una mappa personalizzata possa funzionare anche nel’espansione è necessario aggiungerla tra le mappe dedicate all’espansione stessa.

Per farlo spostiamoci su: %ProgramFiles%\Steam\steamapps\common\Sid Meier’s Civilization VI\DLC\Expansion1\Config

Ricordo che %ProgramFiles% è la cartella dove installiamo i programmi, se abbiamo spostato Steam su una cartella o partizione diversa dobbiamo sostituire %ProgramFiles% con tale percorso. Sul mio computer, per fare un esempio, il percorso assoluto è: D:\Programmi\Steam\steamapps\common\Sid Meier’s Civilization VI\DLC\Expansion1\Config

Questo perché ho spostato la cartella di Steam su una partizione diversa da quella di avvio C:

A questo punto andiamo a modificare il file Expansion1_StandardMaps.xml 

Nota: A differenza della versione standard, che legge tutti i file XML presenti nella cartella Config, l’espansione non sembrerebbe farlo, quindi dobbiamo modificare uno dei file esistenti e non possiamo aggiungerne uno nuovo nostro.

A questo punto modifichiamo il file nel modo che segue:

Faccio notare che, al file standard, ho aggiunto solamente la riga evidenziata.

Il percorso dove mettiamo il file Mappa Personalizzata.Civ6Map è solo relativamente importante, purché sia leggibile dall’eseguibile del gioco. Suggerisco di metterlo, come ho fatto io, in %ProgramFiles%\Steam\steamapps\common\Sid Meier’s Civilization VI\Base\Assets\Maps\Extra

Fatto tutto possiamo giocare alle nostre mappe anche con la nuova espansione!

Questo è molto realistico in effetti

Intervento su app e privacy a Risorse, su RTV38

Lo scorso martedì 22 maggio sono stato invitato a partecipare alla puntata di Risorse, su RTV38, dedicata ad app ed internet. Argomento trattato in modo leggero, con l’intervento di numerosi esperti. Per chiunque fosse curioso rimando all’episodio integrale su YouTube.

[xamarin] Errore IDE0006 durante compilazione

Problema: quando si tenta di compilare una app per iOS compare l’avviso con codice IDE0006 e la compilazione non va a buon fine

Soluzione: chiudere Visual Studio, aprire, pulire il progetto e ricompilare di nuovo, assicurandosi che sia connesso il Mac sul quale avviene la compilazione

Cercando di compilare una app per iOS da Visual Studio si potrebbe incorrere nel seguente avviso:

IDE0006 Si è verificato un errore durante il caricamento del progetto. Alcune funzionalità del progetto, come l’analisi della soluzione completa per il progetto in errore e i progetti che dipendono da essa, sono state disabilitate.

Per risolvere il problema dovrebbe essere sufficiente (almeno per me ha sempre funzionato) chiudere Visual Studio e riaprirlo, assicurandosi che prima di avviare il progetto sia connesso al Mac che si usa per compilare. 

Una volta riaperto spostarsi su Compilazione > Pulisci …

Una volta eseguita la pulizia ricompilare l’intero progetto da Compilazione > Ricompila… 

[javascript] Disegnare sistema solare con Three.js e WebGL

Three.js è una fantastica libreria javascript per il rendering interattivo in 2D e 3D su HTML5. Qualche giorno fa mi sono trovato a voler riprodurre dei fittizi sistemi stellari ed ho deciso di riportare di seguito un esempio semplificato per chiunque volesse provare da se. Il risultato che vogliamo ottenere è il seguente (zoom con rotellina del mouse, tasto sinistro per ruotare, tasto destro per spostare):


      

Già che c’ero ho inserito anche un paio di esempi per confronto con sistemi stellari realistici: in particolare il nostro sistema solare con i suoi otto pianeti principali in proporzione, una seconda versione con i pianeti ingranditi, ma proporzionati sempre al Sole ed infine il sistema Glise 581 sempre in proporzione corretta.

Inutile dire che si tratti di una semplificazione estrema (le orbite sono circolari, anziché essere ellittiche, e giacciono tutte sul medesimo piano), ma è sufficiente a darci un’idea della vastità dello spazio. 🙂

Detto questo mettiamoci all’opera.

Anzitutto procuriamoci Three.js e, già che ci siamo, jQuery (non è indispensabile, ma mi divertirò ad unirli insieme).

Adesso creiamo il contenuto della nostra pagina index.htm

Creiamo anche un file main.css per il foglio di stile ed uno main.js per il codice javascript. 

Colleghiamo le librerie jQuery, three.min.jsOrbitControls.jsthree.interaction.js.

Infine inseriamo un div che farà da contenitore per il nostro rendering. 

Potremmo usare anche un canvas, ma Three.js ci permette di aggiungere un rendering anche al comune DOM in HTML.

Fatto tutto questo sistemiamo velocemente il CSS inserendo il seguente codice:

Inutile dire che ci potremmo divertire a personalizzarlo nei modi più disparati, ma per il momento è quanto ci basta per creare un riquadro nero di 800px di lato.

Fatto tutto questo possiamo cominciare a lavorare sullo script. Definiamo anzitutto il minimo indispensabile:

In questo modo abbiamo definito la camera, la scena (è dove aggiungeremo tutti gli oggetti), il renderer che produrrà l’elemento DOM da aggiungere al suddetto div, i controlli che ci permetteranno di muovere la telecamera rispetto alla scena e il sistema di interazione (per sviluppi futuri).

Per far funzionare il tutto creiamo una funzione chiamata init(), il nome è comunque a piacere, che lanciamo all’inizio, ed una funzione animate() che richiamiamo subito dopo.

Grazie a requestAnimationFrame( animate ) animiamo tutto il sistema. Dopo approfondiremo.

Intanto cominciamo disegnando un singolo corpo nello spazio (banalmente una sfera).

Per poter gestire l’oggetto appena creato aggiungiamolo al vettore pianeti che dichiariamo come variabile globale.

Per aggiungere un grosso oggetto al centro ci sarà sufficiente quindi usare, dentro la funzione init() alla riga evidenziata:

Gli oggetto saranno aggiunti su un piano cartesiano tridimensionale, di coordinate x, y e z. La posizione (0,0,0) è quindi all’origine degli assi del piano cartesiano. La telecamera punta direttamente verso questo origine ad una distanza sull’asse z di 10.

Proviamo ad aggiungere una seconda sfera con:

A questo punto vogliamo aggiungere anche il cerchio dell’orbita, che appunto non è altro che una circonferenza (nel nostro caso semplificato eh!):

La nostra funzione accetta come argomento il raggio dell’orbita, che sarà disegnata centrata in (0,0,0).

La circonferenza è composta di 64 segmenti che collegano altrettanti vertici. Creiamo quindi la geometria nella qual inseriamo le coordinate dei vertici, il tutto sarà poi riempito con il materiale di tipo LineBasicMaterial.

Integriamo la funzione in quella per creare i singoli pianeti, utilizzando un argomento apposito per poter decidere se aggiungerla o meno.

Con Math.sqrt(x*x + y*y) calcoliamo il raggio per ciascuna orbita, ossia la distanza del corpo sul piano xy rispetto all’origine degli assi.

Adesso proviamo ad aggiungere i seguenti pianeti:

Dovremmo poter vedere un sistema statico, simile a quello dell’esempio.

Adesso cominciamo ad animarlo, preparando anzitutto la funzione che farà ruotare i pianeti. Per farlo ruotare utilizziamo delle coordinate polari, dove ci sarà sufficiente aumentare l’angolo theta.

La funzione ruota accetta un oggetto m e un valore per la “massa”, che ci permetterà di fare variazioni sulla velocità globale del sistema. Dal momento che la velocità dei pianeti varia con l’inverso della distanza, secondo la seguente formula:

v_{o}\approx {\sqrt {{\frac {GM}{r}}}}

Possiamo approssimare il moto angolare con una variazione di theta come segue:

Quindi applichiamo il movimento per ogni singolo corpo creando una specifica funzione:

In questo modo facciamo due cose. Con:

Facciamo ruotare i corpi attorno a se stessi (rotazione).

Con:

Li facciamo ruotare attorno alla stella (rivoluzione).

Aggiorniamo infine la funzione animate():

Infine aggiungiamo lo sfondo stellato generando dei punti casuali nello spazio tutto intorno con:

Ed impostiamo la telecamera di base:

In questo modo posizioniamo la telecamere con l’inquadratura leggermente inclinata e di lato rispetto al sistema.

L’intero script che utilizziamo è il seguente:

Se abbiamo fatto tutto bene otterremo il risultato di sopra.

[ubuntu] Scaricare WordPress e scompattarlo nella radice del sito web

Questi comandi si applicano ad un qualsiasi file *.tar.gz che si voglia scaricare e scompattare e poi spostare nella cartella desiderata.

Per scaricare WordPress utilizzerò il link alla versione internazionale

In questo modo scompattiamo il file *.tar.gz nella cartella WordPress e poi spostiamo nella radice tutto il contenuto.

Adesso rimuoviamo il file compresso e la cartella.

Infine ricordiamoci di assegnare i permessi giusti al nostro file, per esempio:

Se stiamo usando Plesk i permessi giusti avranno la forma simile a questa:

Dove al posto dell’UTENTE_SITO_WEB va messo l’utente del dominio.

[mysql] Svuotare un database o eliminare tutte le tabelle da terminale (remove o truncate)

Obiettivo: eliminare oppure svuotare tutte le tabelle di un database con un singolo commando da terminale

Questa soluzione è molto utile specialmente se si devono svuotare numerosi database. Abbiamo due possibilità:

1. Eliminare le tabelle (drop)

2. Svuotare le tabelle senza eliminarle (truncate)

In entrambi i casi al posto di USER va messo l’utente del database, al posto di PASSWORD la password dell’utente sul database e al posto di DATABASE il nome del database sul quale vogliamo lavorare.

 

[xamarin] Pubblicare app iOS in beta su TestFlight da Visual Studio 2017 su Windows

Obiettivo: Pubblicare la beta di una app per iOS, sviluppata con C# e Xamarin su Visual Studio 2017 per Windows

Per molti sarà una banalità, ma ho trovato che la pubblicazione di app iOS da Windows (ok, capisco che me la sto proprio cercando) è una piccola avventura, a differenza di quando si lavora su Android. Anzitutto dobbiamo assicurarci di avere tutti gli ingredienti necessari per poter procedere. Questi comprendono:

Xamarin e Visual Studio 2017 su Windows (nel mio caso specifico Windows 10)

Un Mac con installati Visual Studio 2017 ed Xcode per poter compilare al app.

Application Loader 3.0 (scaricabile da qui) per poter caricare la app online sull’Apple Store.

Un account Apple Developer e uno su iTunes Connect.

Una volta preparata la nostra app e testata sulla macchina virtuale di Xcode, possiamo cominciare a pensare alla sua pubblicazione. Come ho accennato prima tutte le guide online in merito si riferiscono principalmente a Visual Studio 2017 con Xamarin già installati sul Mac, mentre io mi ostino per volerci lavorare da Windows.

Quello che voglio fare è distribuire la app in beta verso alcuni utenti registrati per TestFLight, in modo da poter effettuare un debugging realistico rispetto all’utilizzo degli utenti.

Per poterlo fare anzitutto devo aggiungere degli utenti su iTunes Connect.

Indirizzo: https://itunesconnect.apple.com/

Per farlo mi sposto nell’apposita sezione.

Una volta dentro, da Utenti di iTunes Connect premo sul tasto più e aggiungo un nuovo utente.

A questo punto posso inserire l’indirizzo email col quale ho registrato il mio iPhone sul quale voglio fare le prove, mettendo un nome e cognome come riferimento.

Adesso mi verrà chiesto di selezionare un ruolo per il mio utente.

Scegliendo il ruolo mi verrà detto quali saranno le sue possibilità di accesso, quello che mi interessa è che sia disponibile per TestFlight.

Fatto questo possiamo salvare e spostarci a configurare la parte di Apple Developer.

Indirizzo: https://developer.apple.com/

Anzitutto aggiungiamo il dispositivo sul quale vogliamo far agire l’utente. Spostiamoci su Devices > All (indirizzo: https://developer.apple.com/account/ios/device/) e clicchiamo sul tasto più per aggiungere un dispositivo. Ci verranno chiesti un nome descrittivo e un UDID. Per trovare l’UDID suggerisco la seguente guida.

A questo punto registriamo un identificatore per la nostra app, andando su Identifiers > App IDs (indirizzo: https://developer.apple.com/account/ios/identifier/bundle/create).

Il Bundle ID è quello che abbiamo stabilito nel file Info.plist alla seguente chiave:

Dove com.miodominio.NomeApp è il formato di dominio inverso, un po’ come succede anche su Android.

Una volta aggiunta la app, con le opportune configurazioni, aggiungiamo i certificati per la distribuzione.

Andiamo su Certificates > All e premiamo sul tasto più per aggiungerne uno.

Selezioniamo App Store and Ad Hoc e seguiamo la procedura guidata. Alla fine della procedura ci sarà dato un file di certificato da installare sul Mac dove abbiamo Xcode ed il resto.

NOTA: La medesima cosa si può fare anche da Xcode, andando su Preferenze > Account > Gestisci certificati e cliccando sul tasto aggiungi.

Ora spostiamoci a creare un Provisioning Profiles di distribuzione.

Per farlo andiamo su Provisioning Profiles > Distribution (indirizzo: https://developer.apple.com/account/ios/profile/production)

Clicchiamo sul tasto più per aggiungere un profilo e selezioniamo un profilo di distribuzione Ad Hoc.

Seguiamo le istruzioni. Alla fine ci verrà dato un file con estensione *.mobileprovision che dobbiamo mettere sul nostro Mac e cliccarci due volta sopra per installarlo. Apparentemente non succederà nulla, ma il profilo sarà stato installato.

Fatte tutte queste belle cose arriva l’avventura finale. Compilare la app da Visual Studio 2017 che gira su Windows.

Per poterlo fare correttamente è necessario apportare alcune modifiche.

Anzitutto apriamo Info.plist e assicuriamoci di aver impostato correttamente i parametri di compatibilità.

Assicuriamoci di aver impostato correttamente la lingua:

Ma soprattutto di aver inserito il parametro per il beta testing:

Adesso apriamo Entitlements.plist e assicuriamoci di inserire anche qui il medesimo parametro:

Spostiamoci sulle proprietà della nostra app e configuriamola nel modo seguente:

In questo modo l’esportazione avverrà nella cartella bin\iPhone\Ad-Hoc dentro la radice del progetto, dove verrà creato un file con estensione *.ipa.

Assicuriamoci anche che sia visibile l’identità giusta della firma ed il corretto profilo di provisioning. A tale proposito, qualora non fosse possibile vederli, consiglio di aprire e chiudere Visual Studio o lanciare una compilazione sul Mac collegato in rete.

Assicuriamoci anche di aver configurato la giusta impostazione di compilazione, che nel mio caso risulta così:

Se abbiamo fatto tutto come si deve troveremo nella suddetta cartella, bin\iPhone\Ad-Hoc, il nostro file *.ipa.

Spostiamolo sul nostro Mac e apriamo Application Loader.

Clicchiamo su Delivery Your App e poi su Choose. Scegliamo il file *.ipa da caricare e attendiamo la fine del caricamento.

Se tutto è andato bene la nostra app diventerà disponibile per il test agli utenti che abbiamo selezionato precedentemente.

Errori comuni

Di seguito riporto alcuni errori comuni che sono stati generati da Application Loader o inviati via email al momento dell’invio della app in testing:

  1. Missing beta entitlement – Your app does not include the beta-reports-active entitlement. If you intend to distribute this build via TestFlight for beta testing, please re-build this app with an App Store Distribution provisioning profile. Do not use ad-hoc profiles.
    SOLUZIONE: inserire <key>beta-reports-active</key> nei file Info.plist e Entitlement.plist come descritto precedentemente
  2. the bundle contains a key that is not included in the provisioning profile beta-reports-active
    SOLUZIONE: c’è un errore nel profilo di compilazione, assicurarsi che sia di Distribuzione, come detto prima; maggiori informazioni si trovano qui
  3. Your app does not include the beta-reports-active entitlement
    SOLUZIONE: vedere punto 1, stesso problema
  4. Errore Invalid architecture: ARMv7. 32-bit architectures are not supported when deployment target is 11 or later
    SOLUZIONE: questo è un errore di Visual Studio, per risolverlo è necessario configurare correttamente la Compilazione iOS nelle impostazioni del Progetto, come illustrato in precedenza, inoltre bisogna inserire UIRequiredDeviceCapabilities in Info.plist
  5. ipa file too large
    SOLUZIONE: in questo caso non dipende assolutamente dal file, ma può dipendere dai certificati (vedi all’inizio) oppure dalla velocità della connessione da cui facciamo l’upload; assicuriamoci che il profilo di Provisioning e i certificati siano installati sulla macchina con Xcode.

[windows] Ripristinare password di account locale su Windows 7/8

Problema: Ripristinare la password di un account locale, per esempio Administrator oppure un altro account, su un computer con Windows 7 oppure Windows 8

Questo esempio vale anche per Windows 8 (non ho ancora provato su Windows 10), mentre mi avvarrò di un Windows 7 per illustrare la procedura. Anzitutto procuriamoci un disco di installazione di Windows 7, con il quale poter avviare il ripristino del computer. Nel caso non si disponga di tale disco lo si può anche scaricare online, per esempio da qualche torrent, perché quello che ci interessa non è installare un nuovo sistema operativo, ma solo ripristinare quello corrente, quindi non è indispensabile disporre di una copia originale o di codici di licenza.

In secondo luogo assicuriamoci che sia possibile avviare il disco dal BIOS, tipicamente cambiando l’ordine di boot dalla configurazione del BIOS (nella maggior parte dei PC si accede al BIOS premendo F2 oppure CANC/DEL) oppure accedendo al menu di boot (tipicamente premendo F12 all’avvio).

Una volta inserito il disco premiamo INVIO per accedere al disco, anziché avviare il sistema operativo:

A questo punto sarà avviato il sistema di ripristino, selezioniamo la lingua:

Premiamo avanti, a questo punto selezioniamo dalla voce in basso l’opzione per il ripristino del computer.

Verranno cercati i sistemi operativi ripristinabili. Selezioniamo a questo punto il sistema operativo che ci interessa (tipicamente ce ne sarà uno solo) e procediamo:

Premiamo avanti. A questo punto si apriranno le opzioni di ripristino:

Clicchiamo su Prompt dei comandi

A questo punto notiamo che ci troviamo nell’unità X:, il sistema operativo è stato probabilmente montato sull’unità D: (attenzione! tipicamente non si tratta di C:, anche se sul computer originale Windows era montato su C:). Per visualizzare tutte le unità montate basta digitare:

Ci verrà mostrato qualcosa di simile a questo:

Possiamo entrare in D: digitando semplicemente D: e premendo INVIO. Utilizzando il comando dir possiamo accertarci di essere nel volume giusto.

A questo punto vogliamo sostituire Sticky Keys con il Prompt dei comandi sul nostro PC originale. Sticky Keys si avvia premendo ripetutamente il tasto SHIFT, in questo modo senza dover accedere al PC avvieremo il prompt dei comandi. Per maggiori informazioni su Sticky Keys suggerisco la pagina di Wikipedia.

Per fare la sostituzione digitiamo sul prompt dei comandi:

In questo modo faremo una copia di backup del file sethc.exe nella radice del sistema e poi lo sostituiremo con cmd.exe.

Il risultato dovrebbe apparire così se tutto è andato bene:

Usciamo dal prompt dei comandi digitando exit, dopodiché premiamo il tasto riavvio.

Una volta riavviato il sistema premiamo per 5 volte rapidamente il tasti SHIFT finché non compare il prompt, di fronte alla schermata di login.

Adesso digitiamo:

In questo modo verranno visualizzati gli account registrati sul PC.

Nel mio caso sono disponibili gli utenti Administrator, Guest, Mario e SVEN. Immaginiamo di voler cambiare la password per l’utente Mario. Quindi digitiamo:

Al posto di USERNAME e PASSWORD digitiamo il nome utente e la nuova password.

Nel mio caso ho digitato Mario e come password Pappapero4321.

Se tutto è andato bene possiamo accedere con il nostro utente e la nuova password.

A questo punto è importante ripristinare sethc.exe per motivi di sicurezza. Se si prova a farlo dal sistema operativo avviato si otterrà un errore.

Per fare il ripristino è necessario ripetere i primi passaggi e accedere al sistema di ripristino. A quel punto digitiamo:

Così ripristineremo la copia che abbiamo salvato sulla radice nella posizione originale.

[windows] Copiare cartelle e file preservando i permessi e le condivisioni sulla destinazione

Problema: Copiare dati e cartelle di un profilo, come per esempio AppData, su un altro profilo senza copiare anche i relativi permessi e preservando i permessi e le condivisioni del profilo di destinazione

Senza entrare nel merito del perché si potrebbe voler fare qualcosa del genere (molto utile in realtà quando si fa la migrazione dei profili) è sufficiente utilizzare robocopy.

Nello specifico il seguente comando:

/E serve a copiare tutto il contenuto, comprese le sottocartelle vuote

/R:0 serve per saltare eventuali errori, dovuti magari a mancanza di permessi

Potremmo aggiungere anche il /COPY:flag[s] per copiare solo determinate caratteristiche (di predefinito è su /COPY:DAT, D=Data, A=Attributi, T=Timestamps, eventualmente S=Informazioni di sicurezza dei NFTS ACLs, O=Informazioni sul proprietario, U=Auditing info)