domenica, 19 Gennaio 2025

[windows] Programmare spegnimento automatico ad una determinata ora

Obiettivo: Programmare lo spegnimento automatico del computer ad una determinata ora, per esempio alle ore 20 tutti i giorni.

All’interno di Windows è possibile configurare delle attività programmate. Per farlo clicchiamo col destro sul tasto Start e selezioniamo Gestione computer.

Spostiamo su Utilità di pianificazione e poi tra le opzioni a destra scegliamo Crea attività di base.

Seguiamo la procedura guidata e diamo un nome alla nostra pianificazione, per esempio “Spegnimento automatico ore 20”

Scegliamo quando attivare l’attività, per esempio Ogni giorno.

A questo punto ci verrà chiesta la data e l’ora, nonché il numero di ricorrenze.

Scegliamo avvio programma dalla schermata successiva.

A questo punto selezioniamo il programma shutdown.exe e passiamogli il parametro -s

Il parametro -s avvierà lo spegnimento entro 60 secondi dall’esecuzione, altrimenti possiamo impostare lo spegnimento ad un tempo prefissato con il parametro -t, per esempio -t 30 per avviare lo spegnimento entro 30 secondi, o -t 0 per avviarlo immediatamente.

Premiamo avanti e poi fine.

 

[WordPress] Creare un’area widget personalizzata in 6 semplici passaggi

Le aree dei widget in WordPress dipendono sempre dal template utilizzato, quindi per aggiungere un’area widget personalizzata bisogna modificare il template specifico che ci interessa.

Prima di cominciare procuriamoci tutto il necessario:

  1. Avere installato WordPress (lo si può scaricare da qui)
  2. Utilizziamo il template Twenty Sixteen (ricordo che la procedura è valida per qualunque template)

Se abbiamo tutto pronto cominciamo.

1. Apriamo l’editor di WordPress

L’editor si trova in Bacheca > Aspetto > Editor.

2. Andiamo su functions.php

Una volta aperto l’editor andiamo su functions.php, selezionabile dall’elenco a destra.

A questo punto spostiamoci in fondo al file e aggiungiamo il seguente codice:

Faccio notare come il nome della funzione, nuovo_widget(), è assolutamente arbitrario, purché rispetti i parametri di programmazione in PHP.

Dentro eseguiamo il metodo register_sidebar che permette di definire una specifica sidebar.

I parametri passabili tramite array sono:

  • name – il nome della sidebar, un testo descrittivo
  • description – la descrizione della sidebar, che apparirà sotto il suo nome nella bacheca, non è obbligatorio
  • id – identificativo della sidebar, deve essere tutto minuscolo e senza spazi, di predefinito è un valore numerico intero autoincrementale
  • before_widget – codice HTML da anteporre ad ogni widget
  • after_widget – codice HTML da posporre ad ogni widget
  • before_title – codice HTML da anteporre ad ogni titolo di widget
  • after_title – codice HTML da posporre ad ogni titolo di widget

Una volta aggiunto il codice premiamo su Aggiorna file.

3. Andiamo su page.php

Adesso aggiungiamo il widget in tutte le posizioni che desideriamo. Nel nostro caso lo aggiungeremo sul lato sinistro di tutte le pagine, modificabili da file page.php

Andiamo quindi a modificare il file page.php

Individuiamo la riga con get_header(); e posizioniamoci alla riga successiva aggiungendo il seguente codice:

Ricordiamoci che nuova-sidebar è l’ID che abbiamo definito prima per la nostra sidebar, mentre la classe barra-sinistra la dovremo ancora definire.

Individuiamo la riga con:

E modifichiamola nel modo seguente:

In questo modo il contenitore principale sarà modificato in base alla presenza o meno del widget. La situazione di partenza era questa:

Noi vogliamo arrivare ad una nuova situazione simile a questa:

4. Modifichiamo il style.css

Adesso non ci resta che aggiungere gli stili appena utilizzati. Andiamo quindi a modificare il Foglio di stile (style.css)

In fondo al file aggiungiamo le seguenti due righe di CSS (queste sono molto essenziali, per ottenere un risultato migliore bisognerebbe rielaborarle un po’).

Salviamo il file.

5. Andiamo sui Widget

Adesso è il momento di testare il nostro nuovo widget, spostiamoci perciò nei widget ed inseriamo nella nuova area, per esempio, il widget per la ricerca.

6. Risultato

A questo punto possiamo aprire il nostro sito e verificare il risultato, che dovrebbe apparire così.

[CCNA] Subnetting di una rete di classe B utilizzando i numeri binari

Proseguendo sulla falsa riga dell’esercizio precedente, dove avevamo calcolato le subnet per una rete di Classe C, supponiamo questa volta di avere l’indirizzo 172.24.0.0/16 e voler creare 10 subnet.

Vediamo quali saranno gli schemi IP dei numeri di broadcast, di rete e del numero di host, nonché la subnet mask.

1. Calcoliamo anzitutto il numero di subnet necessarie

In questo caso abbiamo un indirizzo di Classe B, quindi il suo schema potrebbe essere rappresentato nel modo seguente: NNNNNNNN . NNNNNNNN . HHHHHHHH . HHHHHHHH

A differenza del precedente esercizio, qui abbiamo 16 bit su H da cui possiamo prestare i bit per le nostre subnet. Come al solito il numero di subnet valide sarà dato da 2^N-2

Se prendessimo in prestito 2 H trasformandoli in N (ottenendo quindi il seguente schema NNNNNNNN . NNNNNNNN . NNHHHHHH . HHHHHHHH) potremmo realizzare 2^2-2 = 4 - 2 = 2 subnet

Faccio notare che con 1 H potremmo creare solo 2 subnet non valide.

Siccome vogliamo realizzare almeno 10 subnet, ci serve un numero di subnet tale che 2^N-2 \ge 10 ovvero dobbiamo prendere in prestito 4 H da trasformare in N, nel modo seguente: NNNNNNNN . NNNNNNNN . NNNNHHHH . HHHHHHHH

2. Determiniamo la prima subnet valida

A questo punto lavoriamo sullo schema precedente, dal momento che i primi due ottetti resteranno fissi, prendiamo in considerazione solo gli ultimi due: NNNNHHHH . HHHHHHHH

La prima subnet valida sarà quindi: 0001HHHH . HHHHHHHH

Vi ricordo che la 0000HHHH . HHHHHHHH non è valida dal momento che l’ID della subnet coinciderebbe con l’ID di rete.

Schematizzando il tutto avremo quindi:

ID prima sottorete 00010000 . 00000000 16 . 0 172.24.16.0
Primo host valido 00010000 . 00000001 16 . 1 172.24.16.1
Ultimo host valido 00011111 . 11111110 31 . 254 172.24.31.254
Broadcast prima sottorete 00011111 . 11111111 31 . 255 172.24.31.255

Come è facile notare basta riempire di 0 gli H dell’ID di sottorete, tutti 0 e un ultimo 1 per il primo host e via discorrendo. 

3. Determiniamo l’ultima subnet valida

In maniera analoga al punto precedente, determiniamo ora l’ultima subnet. Prendiamo lo schema e sostituiamo agli N la sequenza 1110 (vi ricordo che la 1111 porterebbe ad un broadcast non valido rispetto alla rete stessa)

L’ultima subnet sarà quindi: 1110HHHH . HHHHHHHH

A questo punto non ci rimane che calcolare il resto, con il medesimo procedimento di poco fa.

Schematizzando il tutto avremo quindi:

ID ultima sottorete 11100000 . 00000000 224 . 0 172.24.224.0
Primo host valido 11100000 . 00000001 224 . 1 172.24.224.1
Ultimo host valido 11101111 . 11111110 239 . 254 172.24.239.254
Broadcast prima sottorete 11101111 . 11111111 239 . 255 172.24.239.255

4. Determiniamo tutte le subnet valide

Come è facile immaginare basta ripetere gli schemi in rosso per tutte le varianti degli N in verde, cioè da 0001 a 1110 (ricordo che la somma binaria procede come 0001, 0010, 0011, 0100, ecc.).

Lo schema che otterremo sarà il seguente:

Subnet ID Rete Primo host Ultimo host Broadcast
0 (non valido) 172.24.0.0 172.24.0.1 172.24.0.254 172.24.15.255
1 172.24.16.0 172.24.16.1 172.24.16.254 172.24.31.255
2 172.24.32.0 172.24.32.1 172.24.32.254 172.24.47.255
3 172.24.48.0 172.24.48.1 172.24.48.254 172.24.63.255
4 172.24.64.0 172.24.64.1 172.24.64.254 172.24.79.255
5 172.24.80.0 172.24.80.1 172.24.80.254 172.24.95.255
6 172.24.96.0 172.24.96.1 172.24.96.254 172.24.111.255
7 172.24.112.0 172.24.112.1 172.24.112.254 172.24.127.255
8 172.24.128.0 172.24.128.1 172.24.128.254 172.24.143.255
9 172.24.144.0 172.24.144.1 172.24.144.254 172.24.159.255
10 172.24.160.0 172.24.160.1 172.24.160.254 172.24.175.255
11 172.24.176.0 172.24.176.1 172.24.176.254 172.24.191.255
12 172.24.192.0 172.24.192.1 172.24.192.254 172.24.207.255
13 172.24.208.0 172.24.208.1 172.24.208.254 172.24.223.255
14 172.24.224.0 172.24.224.1 172.24.224.254 172.24.239.255
15 (non valido) 172.24.240.0 172.24.240.1 172.24.240.254 172.24.255.255

Faccio notare come in questo caso tutti gli ID di rete siano a .0, mentre il terzo ottetto procede con lo stesso schema del quarto ottetto della classe C.

5. Determiniamo la subnet mask

Come nel caso precedente riprendiamo lo schema sul quale abbiamo realizzato le subnetNNNNNNNN . NNNNNNNN . NNNNHHHH . HHHHHHHH

Agli N sostituiamo gli 1 e agli H sostituiamo gli 011111111 . 11111111 . 11110000 . 00000000

Traducendo gli ottetti binari otteniamo quindi: 255.255.240.0

Questa sarà la nostra subnet mask. Ricordiamoci che siccome abbiamo in tutto 20 uni, la subnet è rappresentabile anche con /20

Nello specifico la prima subnet potremmo rappresentarla come 172.24.16.0/20 mentre l’ultima subnet sarebbe 172.24.224.0/20

[CCNA] Creare subnet in meno di un minuto (The Enhaced Bob Maneuver)

Oggi vediamo l’utilizzo di un metodo avanzato di subnetting proposto da Scott Empson. A quanto pare l’ideatore di questo metodo era un certo Bob, da cui il nome, manager/istruttore presso SHL.

Il metodo consiste nell’utilizzo della seguente tabella:

Vediamo come usarla per creare 9 subnet su una rete di Classe C, per esempio sull’indirizzo 192.168.1.0/24 come nel precedente esercizio.

1. Anzitutto individuiamo il numero di subnet che vogliamo creare, per fare questo andiamo sull’ultima riga e cerchiamo il primo numero maggiore o uguale a quello desiderato. Quindi se vogliamo creare 9 subnet dobbiamo selezionare il 14.

2. A questo punto ci spostiamo verso l’alto nella riga Bit Place (Posizione dei bit) e troviamo il 4. La riga nera è detta “riga di ordine superiore”, se attraversate questa riga, dovrete invertire posizione. Quindi dal momento che ci spostavamo da destra a sinistra, adesso ci sposteremo da sinistra a destra.

3. Passiamo a questo punto alla riga Target Number (numero target) e partendo da sinistra contiamo verso destra un numero di colonne pari al numero di bit (4).

Raggiungiamo il numero 16.

4. Questo è il numero target per il quale dobbiamo contare, partendo da zero fino a raggiungere o superare 255. Bisogna fermarsi prima di 256. Quindi contando avremo:

0, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240, 256 (questo no, abbiamo superato 255!)

Questi sono gli ID di rete cercati.

5. Come nell’esercizio precedente, ricordiamoci la seguente regola:

ID Rete Primo Host Ultimo Host Broadcast
n1 n1+1 n2-2 n2-1
n2

Dove n1 è il primo ID di rete, n2 è il secondo e così via. Nel caso del punto 4 il valore di n1 sarebbe 0, di n2 sarebbe 16, di n3 sarebbe 32 e via discorrendo.

Quindi possiamo completare l’intera tabella nel modo seguente:

ID Rete Primo Host Ultimo Host Broadcast
0 (non valida) 1 14 15
16 17 30 31
32 33 46 47
48 49 62 63
64 65 78 79
80 81
     
224 225 238 239
240 (non valida per via del broadcast) 241 254 255

Faccio notare che ci sono 14 (ehi! ma è il numero di prima) subnet valide (16 – 2).

6. Come ultimo passaggio spostiamoci sopra il numero di target per trovare la subnet mask.

Siccome stiamo calcolando le subnet per una rete di Classe C la subnet mask sarà 255.255.255.240

Come al solito scegliamo, delle 14 subnet, le 10 che preferiamo e ne lasciamo 4 per scopi futuri.

Facile no? 🙂

[CCNA] Subnetting di una rete di classe C utilizzando i numeri binari

Immaginiamo di avere l’indirizzo 192.168.1.0/24 e di dover creare 10 nuove subnet.

Vediamo quali saranno gli schemi IP dei numeri di broadcast, di rete e del numero di host, nonché la subnet mask.

Questa parte teorica si rifà al calcolatore IP che potete trovare a questo link.

1. Calcolialiamo anzitutto il numero di subnet necessarie

Dal momento che le subnet vengono realizzate con i bit di coda dell’indirizzo IP non è possibile creare un qualsiasi numero di subnet, ma queste possono essere solamente potenze di 2.

In particolare le tre classi di indirizzi IP più comunemente utilizzate (A, B e C) hanno dei numeri predefiniti di bit dedicati alla rete (network) e i rimanenti ai host. Lo schema è il seguente:

Indirizzi di classe A N H H H
Indirizzi di classe B N N H H
Indirizzi di classe C N N N H

Dove N sono i bit di rete (network) e H i bit di host.

Questo significa che un indirizzo di classe C avrà i primi 3 ottetti di bit dedicati alla rete e l’ultimo ottetto ai host, da cui potremo ricavare le eventuali sottoreti.

Più in particolare l’espressione binaria dell’indirizzo soprastante potrà essere rappresentata così:

N N N H
192 168 1 0
11000000 10101000 00000001 00000000

Un’altra rappresentazione abbastanza comune è la seguente: NNNNNNNN . NNNNNNNNNNNNNNNN . HHHHHHHH

In questo caso mettiamo in evidenza quali sono i bit di host (H) liberi per la creazione di eventuali sottoreti.

Avendo 8 bit a disposizione il numero massimo di sottoreti che potremo creare sarà dato da 2^N-2

Questo perché gli indirizzi iniziale e finale, ovvero 192.168.1.0 e 192.168.0.255 saranno rispettivamente l’id di rete ed il broadcast e quindi non sono validi ai fini della creazione di una sottorete.

Un’eventuale sottorete che partisse da 192.168.1.0 avrebbe infatti lo stesso ID di rete della rete principale!

Appurato questo abbiamo detto che vogliamo creare 10 sottoreti, ma essendo le sottoreti delle potenze di 2 possiamo crearle solo rispettando il seguente schema:

2^7 2^6 2^5 2^4 2^3 2^2 2^1 2^0
128 64 32 16 8 4 2 1

Di predefinito la rete 192.168.1.0/24 dispone di 8 bit liberi per i host, quindi H = 8 e N = 0, per quello che concerne le sottoreti, quindi di predefinito abbiamo 2^0 sottoreti, ovvero una singola sottorete che poi è la rete principale.

Se prendessimo dagli H in prestito 3 bit N potremmo creare 8 sottoreti, che però non ci basterebbero, visto che ne vogliamo fare 10, quindi ne dobbiamo prendere 4. In questo modo avremo 14 sottoreti valide 2^4 - 2 = 16 - 2 = 14

Il prestito avviene per “espansione”, cioè estendiamo la notazione N. Quindi nel nostro schema precedente la situazione diventerebbe la seguente:

NNNNNNNN . NNNNNNNNNNNNNNNN . NNNNHHHH

2. Determiniamo la prima subnet valida

Tenendo a mente lo schema NNNNHHHH adesso dobbiamo anzitutto calcolare il primo numero di sottorete.

Se contassimo in numeri decimali il primo numero sarebbero 0, ovvero 0000 in binario. Ricordiamoci che però questo non è valido (perché con N = 0000 e H = 0000 avremmo l’ID di sottorete uguale a quello della rete). Quindi partiamo da 1 e dunque 0001.

Sostituiamo allo schema precedente ed otteniamo 0001HHHH 

Adesso vogliamo calcolare l’ID di rete, ogni ID di sottorete comincia con 0, ovvero con 0000 nel nostro caso. In poche parole comincia con tutti gli H a zero.

Quindi avremo una situazione simile a 00010000

Il broadcast lo avremo sempre con tutti gli H a 1, quindi nel nostro caso a 1111

Il numero di broadcast sarà dunque 00011111

Il primo host valido della sottorete sarà il valore dell’ID di rete + 1, quindi 0000 + 0001 = 0001, mentre l’ultimo host sarà il valore di broadcast – 1, ovvero 1111 – 0001 = 1110 

Schematizzando il tutto quello che avremo sarà quanto segue:

ID prima sottorete 00010000 16 192.168.1.16
Primo host valido 00010001 17 192.168.1.17
Ultimo host valido 00011110 30 192.168.1.30
Broadcast prima sottorete 00011111 31 192.168.1.31

TRUCCO: L’ID di rete è sempre pari, il primo host è sempre dispari, l’ultimo host è sempre pari, il broadcast è sempre dispari!

3. Determiniamo l’ultima subnet valida

Avendo a mente lo schema NNNNHHHH, sappiamo che abbiamo 4 N per determinare la sottorete. L’ultima sottorete sarebbe quindi con N = 1111, ma questa non sarebbe valida, perché il suo broadcast, con tutti gli H a 1, coinciderebbe con quello della rete principale. Quindi l’ultima rete sarà con N = 1110.

A questo punto non ci rimane che ripetere il passaggio precedente, con l’unica differenza che la parte in verde anziché essere su 0001 sarà su 1110. Prendendo la tabella di prima il risultato sarà il seguente:

ID prima sottorete 11100000 224 192.168.1.224
Primo host valido 11100001 225 192.168.1.225
Ultimo host valido 11101110 238 192.168.1.238
Broadcast prima sottorete 11101111 239 192.168.1.239

4. Determiniamo l’elenco di tutte le subnet possibili

A questo punto non ci rimane che ripetere la procedura in modo automatizzato. Se siete degli sfaticati totali come il sottoscritto potete utilizzare un foglio excel per aiutarvi.

Da qui è possibile scaricarlo: Subnetting Classe C

Se lo preferite costruire da voi è sufficiente seguire la seguente procedura:

A1: IP

B1: 192.168.1.

A3: Subnet

B3: Subnet binario

C3: ID Rete

D3: Primo host

E3: Ultimo host

F3: Broadcast

A4: 0

B4: =DECIMALE.BINARIO(A4;4)

C4: =$B$1&BINARIO.DECIMALE(B4&”0000″)

D4: =$B$1&BINARIO.DECIMALE(B4&”0001″)

E4: =$B$1&BINARIO.DECIMALE(B4&”1110″)

F4: =$B$1&BINARIO.DECIMALE(B4&”1111″)

A5: =A4+1

Infine trascinate A5 fino a A19 e la riga B4:F4 fino a B19:F19.

Il risultato dovrebbe venire così:

Subnet Subnet binario ID Rete Primo host Ultimo host Broadcast
0 (non valido) 0000 192.168.1.0 192.168.1.1 192.168.1.14 192.168.1.15
1 0001 192.168.1.16 192.168.1.17 192.168.1.30 192.168.1.31
2 0010 192.168.1.32 192.168.1.33 192.168.1.46 192.168.1.47
3 0011 192.168.1.48 192.168.1.49 192.168.1.62 192.168.1.63
4 0100 192.168.1.64 192.168.1.65 192.168.1.78 192.168.1.79
5 0101 192.168.1.80 192.168.1.81 192.168.1.94 192.168.1.95
6 0110 192.168.1.96 192.168.1.97 192.168.1.110 192.168.1.111
7 0111 192.168.1.112 192.168.1.113 192.168.1.126 192.168.1.127
8 1000 192.168.1.128 192.168.1.129 192.168.1.142 192.168.1.143
9 1001 192.168.1.144 192.168.1.145 192.168.1.158 192.168.1.159
10 1010 192.168.1.160 192.168.1.161 192.168.1.174 192.168.1.175
11 1011 192.168.1.176 192.168.1.177 192.168.1.190 192.168.1.191
12 1100 192.168.1.192 192.168.1.193 192.168.1.206 192.168.1.207
13 1101 192.168.1.208 192.168.1.209 192.168.1.222 192.168.1.223
14 1110 192.168.1.224 192.168.1.225 192.168.1.238 192.168.1.239
15 (non valido) 1111 192.168.1.240 192.168.1.241 192.168.1.254 192.168.1.255

TRUCCO: Fate caso che vanno di 16 in 16? Questo perché abbiamo fatto subnetting con 2^4 = 16

5. Determiniamo la subnet mask

A questo punto non ci rimane che determinare la subnet mask, la cosa più facile in assoluto in questo caso.

Ricordiamo che il nostro schema è: NNNNNNNN . NNNNNNNNNNNNNNNN . NNNNHHHH

Di predefinito la subnet mask per un indirizzo di Classe C è 255.255.255.0, ovvero 11111111.11111111.11111111.00000000

Nel nostro caso abbiamo preso in prestito 4 bit dai bit di host (H) e la subnet diventa: 11111111.11111111.11111111.11110000

Quindi 255.255.255.240 

Oppure /28, perché gli 1 sono 28 di 32. 

6. Conclusione

In principio noi volevamo creare 10 subnet diverse, a partire dalla rete 192.168.1.0/24

Abbiamo visto come possiamo creare 14 subnet, di cui ne sceglieremo 10 a piacere, 4 possono avanzarci per scopi futuri.

Il gruppo di subnet è rappresentabile da 192.168.1.0/28 e le subnet valide vanno dalla 192.168.1.16/28 alla 192.168.1.224/28.

In ognuna delle 14 subnet create (16 – 2) abbiamo  2^H-2 = 2^4 - 2 = 14 host validi.

[linux] Aggiungere file manualmente ad una condivisione su ownCloud (sotto Plesk)

Obiettivo: aggiungere un file manualmente nella partizione utente su ownCloud, senza utilizzare l’interfaccia di gestione

Questa è una soluzione molto interessante qualora si preferisca caricare il file, per svariati motivi, con altri meccanismi, diversi dall’interfaccia utente offerta dalla piattaforma ownCloud. Per esempio avevo bisogno di condividere un file zip di 600MB che però prima andava modificato. In tal caso, scaricarlo sul mio computer e caricarlo di nuovo online, con la connessione a 20 Mega, rischiava di risultare eccessivamente lento e macchinoso, quando potevo invece scaricarlo direttamente sul server e modificarlo da terminale.

Come fare allora per metterlo in condivisione?

L’operazione è semplice: anzitutto dobbiamo collocarci nella partizione dati di ownCloud e trovare la cartella, sotto files, dell’utente al quale vogliamo mettere a disposizione il file.

Una volta nella cartella digitiamo:

In questo modo visualizzeremo il dettaglio dei permessi sui file. Annotiamo utente e gruppo che accedono alla partizione.

Spostiamoci nella cartella di installazione di ownCloud, per esempio con:

Quello che ci interessa è la cartella, di ownCloud, contenente l’eseguibile occ.

A questo punto digitiamo il comando per ricostruire tutta la partizione dell’utente all’interno di ownCloud. Attenzione, questo comando reimposterà tutte le configurazioni delle cartelle su ownCloud gestite dall’utente.

Faccio notare che il nome_utente è l’utente proprietario dei file nella partizione linux, per esempio www-data se siamo sotto apache (lo vediamo con il comando precedente).

utente_owncloud è invece l’utente registrato in ownCloud, ovvero lo username dell’utente a cui appartiene la partizione.

In questo caso verrà utilizzato il PHP predefinito configurato all’interno di Linux, qualora voleste (o doveste) utilizzare un’altra versione, sarà sufficiente digitare il percorso per intero; ad esempio sotto Plesk i file binari del PHP7.0 si possono recuperare in questo modo:

Per maggiori informazioni e dettagli consiglio la pagina della documentazione ufficiale di ownCloud.

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.