Verifica C++ Vettori

Dato un numero intero, fornire la sua rappresentazione in base 2 o in base tre o in base 4 o in base 5 o in base 6 o in base 7 e viceversa.

Per sviluppare il programma si richiede l’uso l’utilizzo del % per il calcolo del modulo di un numero, l’uso di un vettore in cui appoggiare il resto della divisione.

Nel caso in cui si richieda invece il numero nell’opportuna base, appoggiarlo in un opportuno vettore.

Utilizzare la funzione prototipo per la gestione dei vettori.

Sufficienza: gestione del vettore e del ciclo per il cambiamento di base.

Pubblicato in Senza categoria | Lascia un commento

HTML – Codice per la gestione dei cookies

Si cerca la riga </body> e, subito sopra, si incolla :

<!– Codice per accettazione cookie – Inizio –>
<script type=’text/javascript’>
//<![CDATA[
(function(window) {
  if (!!window.cookieChoices) {
    return window.cookieChoices;
  }
  var document = window.document;
  var supportsTextContent = ‘textContent’ in document.body;
  var cookieChoices = (function() {
    var cookieName = ‘displayCookieConsent’;
    var cookieConsentId = ‘cookieChoiceInfo’;
    var dismissLinkId = ‘cookieChoiceDismiss’;
    function _createHeaderElement(cookieText, dismissText, linkText, linkHref) {
      var butterBarStyles = ‘position:absolute;width:100%;background-color:#eee;’ +
          ‘margin:0; left:0; top:0;padding:4px;z-index:1000;text-align:center;’;
      var cookieConsentElement = document.createElement(‘div’);
      cookieConsentElement.id = cookieConsentId;
      cookieConsentElement.style.cssText = butterBarStyles;
      cookieConsentElement.appendChild(_createConsentText(cookieText));
      if (!!linkText && !!linkHref) {
        cookieConsentElement.appendChild(_createInformationLink(linkText, linkHref));
      }
      cookieConsentElement.appendChild(_createDismissLink(dismissText));
      return cookieConsentElement;
    }
    function _createDialogElement(cookieText, dismissText, linkText, linkHref) {
      var glassStyle = ‘position:absolute;width:100%;height:100%;z-index:999;’ +
          ‘top:0;left:0;opacity:0.5;filter:alpha(opacity=50);’ +
          ‘background-color:#ccc;’;
      var dialogStyle = ‘z-index:1000;position:absolute;left:50%;top:50%’;
      var contentStyle = ‘position:relative;left:-50%;margin-top:-25%;’ +
          ‘background-color:#fff;padding:20px;box-shadow:4px 4px 25px #888;’;
      var cookieConsentElement = document.createElement(‘div’);
      cookieConsentElement.id = cookieConsentId;
      var glassPanel = document.createElement(‘div’);
      glassPanel.style.cssText = glassStyle;
      var content = document.createElement(‘div’);
      content.style.cssText = contentStyle;
      var dialog = document.createElement(‘div’);
      dialog.style.cssText = dialogStyle;
      var dismissLink = _createDismissLink(dismissText);
      dismissLink.style.display = ‘block’;
      dismissLink.style.textAlign = ‘right’;
      dismissLink.style.marginTop = ‘8px’;
      content.appendChild(_createConsentText(cookieText));
      if (!!linkText && !!linkHref) {
        content.appendChild(_createInformationLink(linkText, linkHref));
      }
      content.appendChild(dismissLink);
      dialog.appendChild(content);
      cookieConsentElement.appendChild(glassPanel);
      cookieConsentElement.appendChild(dialog);
      return cookieConsentElement;
    }
    function _setElementText(element, text) {
      if (supportsTextContent) {
        element.textContent = text;
      } else {
        element.innerText = text;
      }
    }
    function _createConsentText(cookieText) {
      var consentText = document.createElement(‘span’);
      _setElementText(consentText, cookieText);
      return consentText;
    }
    function _createDismissLink(dismissText) {
      var dismissLink = document.createElement(‘a’);
      _setElementText(dismissLink, dismissText);
      dismissLink.id = dismissLinkId;
      dismissLink.href = ‘#’;
      dismissLink.style.marginLeft = ’24px’;
      return dismissLink;
    }
    function _createInformationLink(linkText, linkHref) {
      var infoLink = document.createElement(‘a’);
      _setElementText(infoLink, linkText);
      infoLink.href = linkHref;
      infoLink.target = ‘_blank’;
      infoLink.style.marginLeft = ‘8px’;
      return infoLink;
    }
    function _dismissLinkClick() {
      _saveUserPreference();
      _removeCookieConsent();
      return false;
    }
    function _showCookieConsent(cookieText, dismissText, linkText, linkHref, isDialog) {
      if (_shouldDisplayConsent()) {
        _removeCookieConsent();
        var consentElement = (isDialog) ?
            _createDialogElement(cookieText, dismissText, linkText, linkHref) :
            _createHeaderElement(cookieText, dismissText, linkText, linkHref);
        var fragment = document.createDocumentFragment();
        fragment.appendChild(consentElement);
        document.body.appendChild(fragment.cloneNode(true));
        document.getElementById(dismissLinkId).onclick = _dismissLinkClick;
      }
    }
    function showCookieConsentBar(cookieText, dismissText, linkText, linkHref) {
      _showCookieConsent(cookieText, dismissText, linkText, linkHref, false);
    }
    function showCookieConsentDialog(cookieText, dismissText, linkText, linkHref) {
      _showCookieConsent(cookieText, dismissText, linkText, linkHref, true);
    }
    function _removeCookieConsent() {
      var cookieChoiceElement = document.getElementById(cookieConsentId);
      if (cookieChoiceElement != null) {
        cookieChoiceElement.parentNode.removeChild(cookieChoiceElement);
      }
    }
    function _saveUserPreference() {
// Durata del cookie di un anno
      var expiryDate = new Date();
      expiryDate.setFullYear(expiryDate.getFullYear() + 1);
      document.cookie = cookieName + ‘=y; expires=’ + expiryDate.toGMTString();
    }
    function _shouldDisplayConsent() {
      // Per mostrare il banner solo in mancanza del cookie
      return !document.cookie.match(new RegExp(cookieName + ‘=([^;]+)’));
    }
    var exports = {};
    exports.showCookieConsentBar = showCookieConsentBar;
    exports.showCookieConsentDialog = showCookieConsentDialog;
    return exports;
  })();
  window.cookieChoices = cookieChoices;
  return cookieChoices;
})(this);
document.addEventListener(‘DOMContentLoaded’, function(event) {
    cookieChoices.showCookieConsentBar(‘Questo sito utilizza i cookie per migliorare servizi ed esperienza dei lettori. Se decidi di continuare la navigazione consideriamo che accetti il loro uso.’,
        ‘OK’, ‘+Info’, ‘http://www.ilmiosito.com/p/politica-dei-cookie.html’);
  });
//]]>
</script>
<!– Codice per accettazione cookie – Fine –>

Pubblicato in Senza categoria | Lascia un commento

HTML – Gestione Privacy e cookies

Jacek Yerka

La normativa di riferimento è presente sul sito del garante ed afferma che:

1. Ambito di applicazione

Resta fermo che i siti che non consentono l´archiviazione delle informazioni nel PC o cellulare dell´utente o l´accesso a informazioni già archiviate, e che quindi non utilizzano cookie, non sono soggetti agli obblighi previsti dalla normativa.

2. Utilizzo di cookie analitici di terze parti

Nell´ottica della semplificazione che l´Autorità sta perseguendo, è stato già chiarito nel provvedimento come i cookie analitici – che servono a monitorare l´uso del sito da parte degli utenti per finalità di ottimizzazione dello stesso – possano essere assimilati ai cookie tecnici laddove siano realizzati e utilizzati direttamente dal sito prima parte (senza, dunque, l´intervento di soggetti terzi).

I cookie tecnici sono quelli utilizzati al solo fine di “effettuare la trasmissione di una comunicazione su una rete di comunicazione elettronica, o nella misura strettamente necessaria al fornitore di un servizio della società dell’informazione esplicitamente richiesto dall’abbonato o dall’utente a erogare tale servizio”.

I cookie di profilazione sono volti a creare profili relativi all’utente e vengono utilizzati al fine di inviare messaggi pubblicitari in linea con le preferenze manifestate dallo stesso nell’ambito della navigazione in rete.

Google Analytics è un caso particolare di cookie tecnico che però va ugualmente considerato come cookie di terze parti. A differenza dei classici software di analisi del traffico interno, come il famoso Piwick, i cookie di Google Analytics vengono installati da Google e quindi sono da considerarsi di terze parti.

Ricordiamo che l’utilizzo del banner con informativa breve non basta per essere a regola con la legge, occorre infatti impedire l’installazione di qualsiasi cookie non tecnico previo consenso da parte dell’utente e disporre di una corretta cookie policy.

3. Soggetti tenuti a realizzare il banner: il ruolo dei siti prima parte

Con riferimento al tema della responsabilità dei gestori dei siti prima parte in merito all´installazione dei cookie di profilazione provenienti da domini “terze parti”, si conferma che tali soggetti rispetto all´installazione di tali cookie svolgono un ruolo di mero intermediario tecnico.

È bene precisare, tuttavia, che per la natura “distribuita” di tale trattamento, che vede il sito prima parte comunque coinvolto nel processo, il consenso all´uso dei cookie terze parti si sostanzia nella composizione di due elementi entrambi necessari: da un lato la presenza del banner, che genera l´evento idoneo a rendere il consenso documentabile (a carico della prima parte) e, dall´altro, la presenza dei link aggiornati ai siti gestiti dalle terze parti in cui l´utente potrà effettuare le proprie scelte in merito alle categorie e ai soggetti da cui ricevere cookie di profilazione.

Si chiarisce inoltre che se sul sito i banner pubblicitari o i collegamenti con i social network sono semplici link a siti terze parti che non installano cookie di profilazione non c´è bisogno di informativa e consenso.

Al riguardo, si coglie l´occasione per ribadire che le richieste di consenso presenti all´interno dell´informativa estesa del sito prima parte ovvero nei siti predisposti dalle terze parti, non dovranno necessariamente fare riferimento ai singoli cookie installati, ma potranno riguardare categorie più ampie o specifici produttori o mediatori con cui il sito prima parte ha stabilito rapporti commerciali.

Preme sottolineare che l´obbligo di rendere l´informativa e acquisire il consenso nasce dalla scelta del sito di ospitare pubblicità mirata basata sulla profilazione degli utenti tramite i cookie, in luogo di quella generalista offerta indistintamente a tutti.

4. Modalità di acquisizione del consenso

Come noto, nel Provvedimento è stato stabilito che “la prosecuzione della navigazione mediante accesso ad altra area del sito o selezione di un elemento dello stesso (ad esempio, di un´immagine o di un link) comporta la prestazione del consenso all´uso dei cookie” (cfr. punto 1, lett. e), del dispositivo).

Al riguardo, si rappresenta che soluzioni per l´acquisizione del consenso basate su “scroll”, ovvero sulla prosecuzione della navigazione all´interno della medesima pagina web, da molti prospettate e in effetti particolarmente rilevanti nel caso di dispositivi mobili, sono considerate in linea con i requisiti di legge, qualora queste siano chiaramente indicate nell´informativa e siano in grado di generare un evento, registrabile e documentabile presso il server del gestore del sito (prima parte), che possa essere qualificato come azione positiva dell´utente.

5. Applicazione della normativa italiana anche a siti che hanno sede in Paesi extra EU

In merito ai chiarimenti richiesti sull´ambito di applicazione della normativa in materia di cookie, si evidenzia che la stessa riguarda tutti i siti che, a prescindere dalla presenza di una sede nel territorio dello Stato, installano cookie sui terminali degli utenti, utilizzando quindi per il trattamento “strumenti situati sul territorio dello Stato” (cfr. art. 5, comma 2, del Codice privacy).

6. Notificazione in caso di realizzazione di più siti web

Si ritiene condivisibile la richiesta presentata da alcuni editori titolari in merito alla possibilità di effettuare una sola notificazione per tutti i diversi siti web che gli stessi gestiscono, in linea con le previsioni normative. In tal caso nella notificazione del trattamento andranno indicati tutti i domini nei quali il trattamento effettuato attraverso i cookie si realizza mantenendone aggiornato – attraverso eventuali modifiche della notificazione – il relativo elenco.

IN PARTICOLARE EVIDENZA

• I siti che non utilizzano cookie non sono soggetti ad alcun obbligo

• Per l´utilizzo di cookie tecnici è richiesta la sola informativa (ad esempio nella privacy policy del sito). Non è necessario realizzare specifici banner.

• I cookie analitici sono assimilati a quelli tecnici solo quando realizzati e utilizzati direttamente dal sito prima parte per migliorarne la fruibilità.

• Se i cookie analitici sono messi a disposizione da terze parti i titolari non sono soggetti ad obblighi (notificazione al Garante in primis) qualora:

A) siano adottati strumenti che riducono il potere identificativo dei cookie (ad esempio tramite il mascheramento di porzioni significative dell´IP);

B) la terza parte si impegna a non incrociare  le informazioni contenute nei cookies con altre di cui già dispone.

• Se sul sito ci sono link a siti terze parti (es. banner pubblicitari; collegamenti a social network) che non richiedono l´installazione di cookie di profilazione non c´è bisogno di informativa e consenso.

• Nell´informativa estesa il consenso all´uso di cookie di profilazione potrà essere richiesto per categorie (es. viaggi, sport).

• È possibile effettuare una sola notificazione per tutti i diversi siti web che vengono gestiti nell´ambito dello stesso dominio.

• Gli obblighi si applicano a tutti i siti che installano cookie sui terminali degli utenti, a prescindere dalla presenza di una sede in Italia.

Pubblicato in Senza categoria | Lascia un commento

TPSIT – Flashare firmware su Android

Il firmware è un programma, in pratica il sistema operativo presente sui cellulari. In realtà il firmware è un programma non proprio un vero sistema operativo ma ormai è consuetudine chiamare in tale maniera il software caricato sui vari tablet o cellulari.

Flashare significa caricare il firmware sui cellulari. Il termine deriva dall’uso dei chip EEPROM chiamate flash memory da cui il termine flashare.

Nel caso di un Tablet SAMSUNG Tab2 10.1 per caricare nuovamente il sistema operativo si deve:

  • scaricarsi il software Odin sul proprio PC e metterlo nella stessa cartella in cui si caricherà il sistema operativo (odin).
  • scaricarsi il sistema operativo, che normalmente è di estensione .rar
  • scaricarsi i driver per comunicare tramite la porta USB con il tablet
  • fare il boot del tablet schiacciando il pulsante di ON/OFF e volume –
  • far partire il sofware Odin, flag su AP e caricamento del sistema operativo (firmware)
  • collegare il tablet
  • comparirà una schermata con la richiesta del download, pulsante volume +, a questo punto comparirà la presenza della comunicazione tra USB e porta del tablet (COM1)
  • selezionare start
  • aspettare che si carichi il sistema operativo
  • a questo punto il tablet è pronto.
Pubblicato in Senza categoria | Lascia un commento

Python – Liste dinamiche

Jacek Yerka

La gestione di una lista richiede in primis la sua definizione, come sempre deve avvenire:

lista[0]=b

quindi si usa il semplice comando:

lista.append(b)

L’usa delle liste dinamiche è utile se non si conoscono le dimensioni della lista che si vuole gestire ma ha lo svantaggio che se non usata in maniera oculata essa potrebbe portare al riempimento della memoria.

E’ una struttura dati da sconsigliare oppure da usare mettendo sempre e comunque un limite.

Con il seguente comando conosco la lunghezza della lista:

n=len(lista)

Per vedere a video la lista posso usare questo semplice metodo:

print(lista)

oppure posso stampare in orizzontale i suoi elementi:

for i in range(0,n):
print(lista[i],” “,end=’ ‘)

Con il seguente comando verifico che si siano immessi dei valori numerici:

if(g>47 and g<58):

b=int(b)
lista[0]=b

da notare che controllo il tipo di dato nella sua rappresentazione interna.

Con il comando:

b=b.upper()

faccio diventare maiuscolo la lettera immessa.

Il seguente programma effettua la somma dei numeri immessi in una lista dinamica finchè l’utente non inserisce la lettera S maiuscola.

#

Python 3.6.2

#Autore: Francesco Bragadin

#Data creazione: 28/12/2018

#Ultima modifica: 28/12/2018

#

#Nome file: listadinamica.py

#

#Commenti:

#lista di dimensione infinita e somma dei suoi elementi

#solo in python ho liste dinamiche con allocazione infinita

#da sconsigliare in quanto occupa dimensione infinita di memoria

#

#definisco l’oggetto lista

lista=[0]
b=0

g=0

#inserisco il primo valore della lista

b=input(“Inserisco il valore finchè non scrivi S: “)

#controllo che il valore sia un intero per effettuarbi la somma

g=ord(b)
if(g>47 and g<58):

#quindi posso fare la conversione da stringa ad intero senza mai sbagliare

b=int(b)
lista[0]=b

else:
b=b.upper()

#uso del ciclo while finisco il ciclo finchè non inserisco il valore S

while b!=’S’:
b=input(“Inserisco il valore finchè non scrivi S: “)
g=ord(b)
if(g>47 and g<58):

#quindi posso fare la conversione da stringa ad intero senza mai sbagliare

    b=int(b)
    lista.append(b)

#il comando append inserisce un elemento in fondo alla lista

else:
    b=b.upper()

#voglio sapere quanti sono i valori che ho inserito

n=len(lista)
print(“Lunghezza della lista: “, n)

print(“Lista primo metodo”)
print(lista)

#oppure la stampo elemento per elemento in orizzontale – terzo metodo –

print(“Terzo metodo di stampa della lista”)
for i in range(0,n):
print(lista[i],” “,end=’ ‘)

#mi serve solo per andare a capo

print(‘ ‘)

s=0

#Sommo gli elementi della lista

#Da notare che la prima volta del ciclo s=0

#le volte successiva s memorizza il valore precedente e lo somma al nuovo

#valore del vettore

for i in range(0,n):
s=s+lista[i]

#la somma dei suoi elementi

print(“La somma degli elementi risulta: “,s)

b=int(b)
lista[0]=b

Pubblicato in Senza categoria | Lascia un commento

Maturità 2019

Giorgio De Chirico

6 commissari di cui 3 interni e 3 esterni.

Sono presenti tutte le materie d’indirizzo

Ecco le materie per l’indirizzo Informatica e Telecomunicazioni:

Prima prova scritta affidata al commissario esterno
Italiano
Seconda prova scritta affidata al commissario interno
Informatica – Sistemi e reti
Orale – Commissari esterni
Inglese
Tecnologie e Progettazione Sistemi Informatici e Telecomunicazioni


Pubblicato in Senza categoria | Lascia un commento

TPSIT – Crittografia – Esercizi con Fermat ed Eulero

Kandiskij

Risolvere:

2^{75}\;mod\;5

5^{89}\;mod\;7

4^{90}\;mod\;11

16^{96}\;mod\;13

56681^{123432}\;mod\;13

14^{54}\;mod\;10

26^{32}\;mod\;12

7^{19}\;mod\;15

9^{9}\;mod\;6

Pubblicato in Senza categoria | Lascia un commento

TPSIT – Crittografia – Teorema d Eulero


Una conseguenza del piccolo teorema di Fermat è la seguente:

Sia m ed n positivi e p primo e m\;mod\;(p-1)=n\;mod\;(p-1) allora:

a^{m}\;mod\;p=a^{n}\;mod\;p

relazione molto utile per la cifratura a chiave asimmetrica RSA.

Il teorema di Fermat è generalizzato dal teorema di Eulero:

per ogni n ed ogni a che è coprimo (nessun divisore comune) di n vale la relazione

a^{\varphi (n)}\;mod\;n=1\;mod\;n

La funzione \varphi (n) è la funzione di Eulero che conta il numero di interi tra 1 ed n coprimi rispetto ad n.

Ad esempio:

\varphi (8)=4 infatti i numeri coprimi di 8 sono 1, 3, 5 e 7.

Ma come si calcola \varphi(p)?

Prima proposizione

Se p è un numero primo allora

\varphi (p^{k})=p^{k}-p^{k-1}

Seconda proposizione

se n=a\cdot b con a e b che non hanno alcun MCD se non l’1 allora

\varphi (a\cdot b)=\varphi(a)\varphi(b)

Corollario

se n=p_{1}^{k_{1}}\cdot p_{2}^{k_{2}}\cdot\cdot\cdot p_{k}^{k_{k}} con p_{1} e p_{k} numeri primi distinti allora:

\varphi(n)=(p_{1}^{k_{1}}-p_{1}^{k_{1}-1})\cdot\cdot\cdot (p_{r}^{k_{r}}-p_{r}^{k_{r}-1})

Pubblicato in Senza categoria | Lascia un commento

TPSIT – Crittografia – Piccolo teorema di Fermat

Se p è un numero primo allora

a^{p}\equiv a\;mod\;p

equivalente a:

a^{p}\;mod\;p=a\;mod\;p

una sua conseguenza

a^{p-1}\;mod\;p=1\;mod\;p

equivalente a:

a^{p-1}\equiv 1\;mod\;p

fondamentale che p sia un numero primo!

Esempi di sua applicazione

Tabella dei numeri primi

2^{3}\;mod\;3=2\;mod\3=2

10^{29}\;mod\;29=10\;mod\;29=10

15^{28}\;mod\;29=1\;mod\;29=1

Pubblicato in Senza categoria | Lascia un commento

TPSIT Crittografia – La macchina Enigma

La macchina enigma nasce nel 1918 e venne pesantemente usata durante la seconda guerra mondiale dalle Potenze dell’Asse (Germania – Italia – Giappone).

A differenza di ciò che viene comunemente detto, la progettazione aveva reso il sistema di crittograzione pressochè inattaccabile dal punto di vista tecnico. Uno dei fattori che hanno contribuito alla sua vulnerabilità sono state le alcune disattenzioni quotidiane, infatti, permisero ai crittoanalisti di Blet-chley Park di raccogliere degli indizi (cribs) su quale fosse la chiave utilizzatata.

Eccone alcuni:

  • I messaggi spesso presentavano lo stesso testo di apertura, molti comincia-vano con la parolaSpruchnummer(messaggio numero) e molti messaggidell’aeronautica con la fraseAn die Gruppe(al gruppo)
  • I messaggi spesso terminavano con Heil Hitler!
  • messaggi spesso contenevano frasi di routine comeKienebesondere Erei-gnisse(niente da segnalare)

Il funzionamento si basa sul disco usato dall’italiano Alberti del 1500 e la sua versione elettrica è stata implementata nel 1918.

La macchina era formata da tre rotori nei quali vi erano incise le 26 lettere dell’alfabeto e un altro che codificava le stesse lettere. Dopo la prima codifica se ne effettuava un’altra con un secondo rotore e poi un altra ancora con un terzo rotore quindi alla fine si avevano 26 x 26 x 26 possibili: una disposizione con ripetizione ossia 17576 differenti disposizioni.

Inoltre i rotori possono essre scambiati ossia si hanno 3! permutazioni semplici (abbiamo un tavolo con tre posti a disposizione e voglio sapere tutti i possibili midi in cui posso far sedere le tre persone). Inoltre si erano creati ulteriori fattori per aumentare la complessità fino ad arrivare a quasi dieci milioni di miliardi di combinazioni diverse!


I rotori erano colegati con dei collegamenti elettrici: osservando con attenzione lo schema precedente si può capire il suo funzionamento.

Questa è la situazione di partenza.

Si vuole spedire la lettera A.

Si collega al primo rotore in cui sulla stessa riga vi è,a destra, la lettera A.

Il rotore D è collegato alla lettera A nella parte sinistra, alla stessa riga della lettera A, a sinistra, del rotore D, corrisponde la lettera Q del rotore C.

Il rotore C è collegato alla lettera Q nella parte sinistra. Alla corrispondente riga si collega il rotore S con la lettera G.

Il rotore S nella parte sinistra alla lettera Q si collega alla stessa riga del riflettore alla lettera K. La lettera K a sinistra si collega alla lettrera Q ed il segnale torna indietro collegandosi alla parte sinistra e la rispettiva lettera a destra e così via fino a tornare al pannello.

La lettera A è dventata D.

Dopo aver trasmesso la prima lettera il rotore D ruota di un posto e se volessimo trasmettere nuovamente la lettera A adesso troverebbe la lettera S del rotore D e poi si procede come prima.

Dopo che il primo rotore ha compiuto un giro intero, gira di una posizione il rotore C. Dopo che il rotore C ha compiuto un giro intero, il rotore S si sposta di una posizione.

All’inizio della trasmissione quindi si dovevano mandare le tre lettere di partenza dei rotori.

Una latro fattore che rende critica la trasmissione è che con la stessa chiave si decritta il messaggio.

Una simulazione del suo funzionamento si ha nel sito:

http://www.crittologia.eu/critto/enigma_mat.html

Un video con i dettagli della macchina enigma è l seguente:

Pubblicato in Senza categoria | Lascia un commento