<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="it">
	<id>http://wikis.primomiglio.it/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lorenzo.amorosa</id>
	<title>Wikis - Contributi utente [it]</title>
	<link rel="self" type="application/atom+xml" href="http://wikis.primomiglio.it/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lorenzo.amorosa"/>
	<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Speciale:Contributi/Lorenzo.amorosa"/>
	<updated>2026-04-05T15:05:15Z</updated>
	<subtitle>Contributi utente</subtitle>
	<generator>MediaWiki 1.32.1</generator>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Note&amp;diff=213</id>
		<title>Note</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Note&amp;diff=213"/>
		<updated>2020-08-13T10:35:34Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: /* Note */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Note ==&lt;br /&gt;
&lt;br /&gt;
'''Ultimare suddivisione'''&lt;br /&gt;
&lt;br /&gt;
===Linee guida sviluppo===&lt;br /&gt;
* File .txt di prontuario per la creazione del personaggio (stile akinator).Nel csv personaggi saranno salvati coppie &amp;lt;proprieta&amp;gt;=&amp;lt;valore&amp;gt;. Esempio: id=infernape,x=1,y=1, etc. Si potra fare template di altri personaggi con template=infernape, template=blastoise (se ovveride vale il più recente), spazi non ammessi nel csv per essere meno error prone.&lt;br /&gt;
* statistiche sono funzioni: sia valori costanti, sia dipendenti da altre statistiche (variabili).&lt;br /&gt;
* le caselle della mappa sono come un foglio di carta: tutto viene realizzato con oggetti. 9 caselle per i rilievi: 4 lati, 4 angoli, 1 completo (tipo torre che sale). per specificare una mappa: elementi su una stessa cella separati da ',' ed ';' come divisore tra celle. &lt;br /&gt;
* Oggetto sarà solo descrittivo, non dice come influenza le statistiche, la dipendenza tra le statistiche e l'oggetto espresse solo nel personaggo per semplicità (dependency inversion).&lt;br /&gt;
&lt;br /&gt;
===Inspirational Concepts===&lt;br /&gt;
* Gioco Lotta (Pokémon, Pokkén)&lt;br /&gt;
* no caselle esplicite&lt;br /&gt;
* Descrizione rispetto a: ambiente, nemico, oggetti&lt;br /&gt;
* pokémon, DnD, Call of Duty, Super Smash Brawl, corse pazze&lt;br /&gt;
* concentrarsi su: fluidi, telecinesi, razze, bonus/malus, gradi di libertà (fisicamente parlando) &lt;br /&gt;
* scacchi (es. crea casella), shaolin showdown&lt;br /&gt;
* prevedere = creatività&lt;br /&gt;
* acqua, aria, fuoco, terra&lt;br /&gt;
* gravità (newton), verso alto, basso, destra, sinistra, circolare, tutti i versi&lt;br /&gt;
* jumanji, savana, animali, zoologia&lt;br /&gt;
* tempo/spazio&lt;br /&gt;
* BF4, pirati, roma (imperium civitas)&lt;br /&gt;
* musica come arma (rap)&lt;br /&gt;
* magia, prestigiatori&lt;br /&gt;
* dinosauri (documentario, libro, zoologia)&lt;br /&gt;
* draghi = dinosauri + ali + fuoco&lt;br /&gt;
* avengers, supereroi (libro)&lt;br /&gt;
* death note, nutrizionista&lt;br /&gt;
* yugioh (carta coperta)&lt;br /&gt;
* fortnite: costruire&lt;br /&gt;
* pacman, colash royale&lt;br /&gt;
* clash of clans, guitar hero&lt;br /&gt;
* sport (generico), (nome, cose, città -&amp;gt; geografia!, fiori)&lt;br /&gt;
* naruto, digimon&lt;br /&gt;
* no man's sky: procedurale, random (non setti un param? lasci al caso? setti tutto? te li sballo). Astronave, tuta spaziale, esplorazione, missione, indie&lt;br /&gt;
* animali e dinosauri dell'oceano&lt;br /&gt;
* rap devi fare freestyle e fare danni all'avversario&lt;br /&gt;
* super mario bros e mario kart&lt;br /&gt;
* elettronica: microcontrollori e arduino, codice&lt;br /&gt;
* Dragon Ball - Budokai Tenchaichi 3&lt;br /&gt;
* Harry potter&lt;br /&gt;
* [NO] minimappe (tieni a mano per ora, meno onere implementativo)&lt;br /&gt;
* Spore, labirinto&lt;br /&gt;
* Atomo, numero elettroni e densità circa sempre costanti; forza (Newton)&lt;br /&gt;
* obbligo, verità, giudizio, salvataggio&lt;br /&gt;
* Ben Ten =&amp;gt; orologio, crea PG e oggetto&lt;br /&gt;
* Kingdom Hearts, Super Smash Brawl&lt;br /&gt;
* Rambo, Rocky Balboa&lt;br /&gt;
* Tigri, coccodrillo (5-8m), animali, ippopotamo (ribalta barche)&lt;br /&gt;
* divinita egitto&lt;br /&gt;
* Battle bot:ribaltano, scintille, elementi (Oggetti) che danneggiano. &lt;br /&gt;
* One piece: I frutti del diavolo (悪魔の実 Akuma no mi?) sono frutti misteriosi che donano poteri soprannaturali a chi li mangia, rendendoli però incapaci di nuotare. Di conseguenza il contatto con l'acqua di mare o con una speciale sostanza conosciuta come agalmatolite indebolisce gli utilizzatori di frutti del diavolo e li priva dei loro poteri. Alcune persone sono inoltre in grado di ricorrere all'Ambizione (覇気 Haki?), una forza spirituale che permette di avvertire la presenza di altri esseri viventi e di predirne i movimenti, di irrobustire parti del corpo e di intimidire o fare svenire le creature con una debole forza di volontà. &lt;br /&gt;
* Wrestling per ispirarsi nella lotta libera: calci pugni ginocchiate prese lanci salti testate gomitate ecc. &lt;br /&gt;
* Imperium civitas. &lt;br /&gt;
* Attacco dei giganti. &lt;br /&gt;
* Jump force. Game dev tycoon. &lt;br /&gt;
* Piovra gigante. &lt;br /&gt;
&lt;br /&gt;
* Looney toons&lt;br /&gt;
* pokemon mystery dungeon (da googlare, escono vari siti con pdf e stats)&lt;br /&gt;
* question tool-for-combat-management: https://rpg.stackexchange.com/questions/171188/tool-for-combat-management&lt;br /&gt;
&lt;br /&gt;
===Personaggi (con statistiche e stati)===&lt;br /&gt;
* creabile runtime&lt;br /&gt;
* combattenti (con statistiche e stati)&lt;br /&gt;
* immagine rappresentativa per rappresentare meglio&lt;br /&gt;
* HP: colore rosso su immagine personaggio, dove sei debole/già colpito (idea scartata)&lt;br /&gt;
* penitenza: il malus può essere inteso come ciò che c'è nell'inserimento successivo, malus cumulativo&lt;br /&gt;
* essere ipocrita, finzione (schermo)&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (personaggi)&lt;br /&gt;
* metamorfosi&lt;br /&gt;
* alchimisti&lt;br /&gt;
* Parametri vitali: non respirare, arresto cardiaco, grasso (+/- caldo/freddo)&lt;br /&gt;
* Ossa, muscoli -&amp;gt; parti del corpo&lt;br /&gt;
* Organi (altri organi): apparato digerente (cibo, acqua (in vena, Fabri Fibra), espletamenti), sangue&lt;br /&gt;
* Da wikipedia: pressione arteriosa, frequenza cardiaca (polso), frequenza respiratoria, temperatura corporea, ossigenazione sanguigna, colorito della cute, dolore.&lt;br /&gt;
* Stato di coscienza: coma, non cosciente, sonnambulo, sonnolento, confuso, vigile, orientato, consapevole&lt;br /&gt;
* Morte = game_over&lt;br /&gt;
* Stats personaggi senza bound, ma consigliati dei range (0-100 / 1.000 / 10.000)&lt;br /&gt;
* (?) il personaggio non è necessariamente nella mappa, anche fuori indistintamente lontano, non si rappresenta ma compie azioni e puo' essere attaccato (no mosse fuori da mappa)&lt;br /&gt;
* possibilità giù in terra/ giù in acqua, con reachable e unreachable Boolean. Fuori da mappa anche reachable e unreachable.&lt;br /&gt;
* Personaggi composti di parti[] es. testa, busto, gambe, braccia, coda, pinna, ali. Distinzione per arto di movimento e/o spostamento boolean.&lt;br /&gt;
* Arti possono provocare danno, bruciatura , paralisi a contatto (Boolean) . Percentuale di probabilità accompagna ogni Boolean.&lt;br /&gt;
* Ogni parte del corpo punti vita + se inutilizzabile + amputata + stato (es paralisi).&lt;br /&gt;
* Per fare battaglie tra molto grandi =&amp;gt; 1 m lo si intende come 10m.  (rivalutato, aumentare livello scaling)&lt;br /&gt;
* Personaggio fusionabile Boolean + string nomi con cui si fonde.&lt;br /&gt;
* Distinzione tra infernape e infernape1/2/3 ect tra “specie” e “nome”.&lt;br /&gt;
* variabile Boolean respawnable.&lt;br /&gt;
* Raccogliere a piene mani da: https://spore.fandom.com/wiki/Creature_Editor&lt;br /&gt;
* Ad esempio weapons come elemento di Corpo (zanne, corna) e possibilità di muoversi/attaccare furtivamente.&lt;br /&gt;
* Divisibile e unibile come boolean e array di stringe associate per indicare i nomi con cui si unisce il Personaggio o in cui si divide, meglio come mossa.&lt;br /&gt;
* Variabili posizione nome: from_x/y ; to_x/y.&lt;br /&gt;
* Classe Stato, Personaggio contiene Array di stato, stato contiene moltiplicatori per statistica es attacco velocità precisione elusione ect.&lt;br /&gt;
* Personaggio deve avere una stat tipo sanità mentale, intelligenza, quanto è confuso e quanto è impaurito (2).&lt;br /&gt;
* le statistiche possono variare leggermente in un turno con una certa media e varianza (se media 0 oscillano randomicamente)&lt;br /&gt;
* Personaggio ha funzione baricentro_x, baricentro_y calcolate come (from_x+to_x)/2 sul quale si basa la funzione di libreria getDistance(Personaggio A, Personaggio B, float success); tale funzione serve per calcolare per i PNG e per i PG se ha senso usare una mossa. &lt;br /&gt;
* Non-onniscienza: delle volte non si può sapere distanza avversario e fallisce la mossa per la distanza -&amp;gt; “float success” rappresenta la probabilità di successo (Personaggio ha parametro “osservare”). &lt;br /&gt;
* PNG di due categorie: offensivi o neutrali (no priorità a mosse di attacco, ma tutto casuale). &lt;br /&gt;
* Mosse e oggetti per chiamare Personaggi, magari non necessariamente alleati (2 mosse e 2 oggetti quindi necessari), richiamo di un personaggio preciso o di uno a caso. &lt;br /&gt;
* Possono attivare una metamorfosi / Unione per cambiare stats personaggio. &lt;br /&gt;
* Possibilità di morire se colpiti in un unico punto (tallone d Achille) implementabile come variabile boolean. &lt;br /&gt;
* Variabile int per attacco cumulativo di gruppo: es calciatori che più si passano la palla più l’attacco è forte. &lt;br /&gt;
* Funzione esci/entra in classe Personaggio per simulare scambio pokemon 6vs6. &lt;br /&gt;
* Personaggio si può svestire e lasciare strumenti, modificano statistiche di attacco, difesa , agilità, ect.&lt;br /&gt;
* Possibilità di vomito, dissenteria, problemi cardiaci, respiratori, muscolari. &lt;br /&gt;
&lt;br /&gt;
* Per personaggi molto piccoli (meno di 1m x 1m x 1m) possibilità di essere in (x,y,z) tra 0 e 1.000.000 (ordine del micrometro, 1*10^-6 == 0,000001) e avere (lenX, lenY, lenZ). In questo modo sono definite dimensioni inferiori ad 1 m^3.&lt;br /&gt;
* personaggi max 20x20 (rivaluato, meno limitata)&lt;br /&gt;
* Personaggi e oggetti Devono avere tag, utili per iniziare partite (ad es. esercito di npg a caso tra quelli con tag &amp;lt;zombie&amp;gt;)&lt;br /&gt;
* Variabile float per fame, sete, sonno, caldo-freddo (parte da 0.5). &lt;br /&gt;
&lt;br /&gt;
===Mosse===&lt;br /&gt;
* mossa ha parametri fissi e modificabili (ad es. mossa &amp;quot;fusione&amp;quot; specifica o meno con chi o caratteristiche minime per soddisfare, es. ha orecchino come vegeku)&lt;br /&gt;
* &amp;quot;combattimento prescinde da combattente&amp;quot;&lt;br /&gt;
* mosse hanno: direzione, azione, attacco (mosse pokémon)&lt;br /&gt;
* Parametri interi per mossa (direzione, consumabili) con lower e upper bound&lt;br /&gt;
* camuffarsi =&amp;gt; DnD manuale&lt;br /&gt;
* wrestling (libro) per le mosse/prese&lt;br /&gt;
* Mosse che trasformano l’avversario: attenzione è una mossa devastante. Altera statistiche/stato. Trasformazione totale o parziale. &lt;br /&gt;
* Si devono poter aggiungere mosse, strumenti dinamicamente. &lt;br /&gt;
* Ogni mossa/azione deve avere un tempo di attesa espresso in turni (alla meglio 0) per poter ripetere la mossa/azione. &lt;br /&gt;
* Rischio=danno*probabilita.&lt;br /&gt;
* Mossa su strumento e con strumento?&lt;br /&gt;
* Mosse fisiche per arrampicarsi su avversario(se e solo se sei la metà di dimensioni(?)), atterrarlo, lanciarlo, accecarlo, immobilizzarlo. Se sei in gruppo/ orda bonus ad attacchi combinati. Variabile &amp;quot;posizione&amp;quot; di chi si è arrampicato ora è dipendente (bind) da variabile dell'altro.&lt;br /&gt;
* Tipo della mossa con moltiplicatore tra 0 (immune) e 2 (float): acqua, fuoco, magia, terra: da ispirarsi ai pokemon ma non da copiare, penso. &lt;br /&gt;
* In difesa puoi parare, schivare, deviare: tre variabili? &lt;br /&gt;
* X fa una mossa contro Y: Z potrebbe reagire (Es. ricevendo il colpo al posto di Y). Può essere realizzato sia come se &amp;quot;Y chiede soccorso Z&amp;quot; o come reazione di alleati adiacenti &amp;quot;Z soccorre Y&amp;quot;&lt;br /&gt;
* Mossa prende come parametro di ingresso Corpo, ossia la parte del corpo coinvolta nella mossa (es arto , tutto corpo ect). &lt;br /&gt;
* algoritmo per simulare percezione: per ogni punto oggetto da vedere, si calcola diff_x, diff_y, e diff_z con punto sensibilita di colui che percepisce. Si avanza per far ridurre le diff a 0: se (diff_x, diff_y, e diff_z) = (30,20,10) allora ci si muove 3 volte su asse x, 2 su y, 1 su z.&lt;br /&gt;
&lt;br /&gt;
===Oggetto (con statistiche e stati)===&lt;br /&gt;
* creabile runtime&lt;br /&gt;
* armi: lacci (stati), lame (potenze), sassi, reti, pistole (munizioni), razzi, bombe (potenze), fuoco (d'artificio?) =&amp;gt; manuale DnD&lt;br /&gt;
* veleno n modi =&amp;gt; DnD manuale&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (oggetti)&lt;br /&gt;
* automezzi con cannoni, variabile 'hasEntrata', 'tempoRiutilizzo'&lt;br /&gt;
* violino come arma (tutti strumenti musicali): a fiato, a corda, a percussione&lt;br /&gt;
* veleni, ampolle e flaconi magici, insieme di 'oggetti dentro' un oggetto&lt;br /&gt;
* cassaforti (senza/con) chiave, isSigillato, oggetti aprono&lt;br /&gt;
* oggetto riparo, crea&lt;br /&gt;
* Strumenti anche mezzi di trasporto di aria, di terra, di acqua (o lava/palude). &lt;br /&gt;
* Veicoli con armi o riparo. &lt;br /&gt;
* Gli strumenti da trattare come gli oggetti. Classe unica. &lt;br /&gt;
* Acqua diventa tsunami. &lt;br /&gt;
* Armi: fruste e scheggie, corni che si suonano per chiamare altri. &lt;br /&gt;
* Armi da campo: cannoni e catapulte.&lt;br /&gt;
* Veicoli d’acqua: moto acqua, canoe, barche a motore a remi.&lt;br /&gt;
* Nei veicoli malus su attenzione (variabile int in personaggio, indica attenzione in combattimento e non in altro) perché si è impegnato alla guida. &lt;br /&gt;
* Classe oggetto: es albero, roccia, casa: forza necessaria per sradicare + forza per lanciare + destrezza / agilità per appendersi + nascondersi in proporzione alle dimensioni di chi si nasconde. &lt;br /&gt;
* Altri es. pali. Sotto terra o sotto acqua/lava/melma o simili. &lt;br /&gt;
* Acqua rallenta se non hai pinne boolean.&lt;br /&gt;
* Classe strumento per oggetti che si tengono in mano, es reti , pistole, spade, pugnali, scudi, elmi, lancia, arco , frecce, lanciarazzi, fucili cecchino, fucile assalto, corde.&lt;br /&gt;
* Strumenti e mosse: danno ad area, perforante, contundente (vedi dnd armi). Mosse possono creare/modificare/distruggere oggetti e strumenti.&lt;br /&gt;
* Oggetti del campo di gioco incidono su elusione (parametro di personaggio).&lt;br /&gt;
* Buco/abisso (boolean) per dire se c’è o meno il suolo (Suolo come classe?). &lt;br /&gt;
* Radiazioni. &lt;br /&gt;
* se ci si lancia da oggetti , dopo essersi arrampicati, possono esserci danni da caduta&lt;br /&gt;
* strumenti come paracaduti o mosse magiche possono evitare i danni.&lt;br /&gt;
* Pozione del vento, soffi e deviazione attacchi. &lt;br /&gt;
* Monti sono Oggetti (cfr sezione Mappa).&lt;br /&gt;
* Rocce volanti, nuvole sospese: oggetto può essere sospeso e può fare periodicamente una mossa, ad es tuono, può spostarsi, può fare entra/esci, oggetto albero e oggetto foresta, si possono prendere, nascondersi, arrampicarsi, lanciarli, ostacolano velocità ma se si ha abbastanza forza si spezzano alberi. &lt;br /&gt;
* Per edifici più oggetti che rappresentano le mura e il tetto, variabile boolean per oggetto per entrare nell’oggetto.&lt;br /&gt;
* Edifici possono essere spazzati via: danni da crollo, si può combattere all'interno, contengono strumenti come tavoli sedie mobili letto ect.&lt;br /&gt;
* Se uno viene schiantato contro uno strumento prende danno(es danno da schianto). &lt;br /&gt;
* Ci possono essere scale, si può non avere contatti visivo sull’avversario. &lt;br /&gt;
* Oggetto mura, oggetto torre, oggetto casa interno sono cose distinte: possono dare malus/bonus su visibilità. &lt;br /&gt;
* Lava come acqua, ogni oggetto può essere sorgenti di liquido: monte sorgente acqua, vulcano sorgente lava. Può esserci variabile probabilità eruzione, se settata a 1 c’è una continua eruzione. &lt;br /&gt;
* Oggetti sospesi: case sospese su albero, ad es. Fiamme in mezzo al suolo. &lt;br /&gt;
* Oggetti: porto, aereoporto, grattacieli, dighe, impianti a fune, ospedali per curarsi e prendere oggetti per curarsi dopo, scuole contenenti libri per apprendere una mossa, luoghi di ingegneria per creare oggetti, ad esempio veicoli o armi, soldi nel gioco per comprare da eventuali venditori. Ogni oggetto avra' un prezzo (valutabile circa in euro per semplicità). &lt;br /&gt;
&lt;br /&gt;
===Modalità gioco===&lt;br /&gt;
* turnazione&lt;br /&gt;
* 1 v 1 v 1 etc., ma anche squadre casuali&lt;br /&gt;
* punteggio: chi fa più punti, più uccisioni, definizione di 'punto', gioco per perdere&lt;br /&gt;
* inserisci personaggio total random&lt;br /&gt;
* I match/partite (immagino Classe Partita) devono avere variabile boolean “respawn”, per distinguere death match a punti con death match con una vita.&lt;br /&gt;
* Condizione vittoria (oltre a morte, punti, o numero mosse, cioè tempo) morte di un singolo Personaggio, che potrebbe rappresentare un edificio, cassaforte o simili. &lt;br /&gt;
&lt;br /&gt;
* Modalità battaglia con interazione stile battaglia navale (non si vede mossa dell'avversario)&lt;br /&gt;
* Modalità di gioco: tutti contro tutti (battle royale), death match, vs CPU mode zombie(attaccano solo, se non possono vanno verso nemico): serve introdurre un punteggio, di sicuro per mode zombie , ma anche per death match e tutti contro tutti&lt;br /&gt;
* ingressi: ne entra un altro?&lt;br /&gt;
* Per punti si vince a un limite o dopo un tot di mosse , oppure al primo dei due raggiunti (max_punti e max_mosse parametri di Partita).&lt;br /&gt;
* I punti si guadagnano alla kill (un Punteggio per squadra, int punteggio salvato localmente dentro ogni Personaggio che ha la variabile int squadra). &lt;br /&gt;
* Si guadagnano tanti punti quanti sono i punti della variabile “valore” del personaggio ucciso, tale variabile è calcolata come somma dei valori di tutte le mosse/stats ect del Personaggio. &lt;br /&gt;
&lt;br /&gt;
===Mappa===&lt;br /&gt;
* arene NxN metri, 1.000mX1.000m, arena creata casella per casella (NxN aree in un arena)&lt;br /&gt;
* Area: montagnE (agilità, arrampicarsi, appendersi), collina, montagnA, mare (campo 'isLiquido'), lago, spiaggia, deserto, lava, grotta, labirinto (cava, percorso in roccia), metropoli, città, campagna, foresta, fiume, stadio, isola, ghiacciaio, vulcano, cascata.&lt;br /&gt;
* immagine arena a mano, poi inserita nel gioco &lt;br /&gt;
* minimappa (pixelata ?), legenda oggetti base, devono esserci caselle implicite&lt;br /&gt;
* mappa 100x100 (rivalutato, meno limitata)&lt;br /&gt;
* Cannoni fissi in mezzo al campo (strumento).&lt;br /&gt;
* serve che la fisica il 90% sia guidata da regole vere&lt;br /&gt;
* i pianeti sono sempre sferici, per forza di gravità, atmosfera, se piccoli e irregolari =&amp;gt; no atmosfera&lt;br /&gt;
* temperatura: vicinanza dal sole. &lt;br /&gt;
* manca ossigeno? =&amp;gt; campo &amp;quot;respirabile&amp;quot;, le condizioni che consentono la vita possono cambiare, anche per via del fuoco&lt;br /&gt;
* Mappe dinamiche: il pianeta si scalda e diventa una stella, si raffredda e diventa impossibile muoversi&lt;br /&gt;
* Suolo magico: non tutti i personaggi possono accedervi, array di string elenca i nomi di chi può accedervi. &lt;br /&gt;
* Variabile luce o non luce, che peggiora/migliora a seconda della specie la visibilità, quindi la precisione, specie in attacchi a distanza: Scurovisione evita i malus.&lt;br /&gt;
* Ambiente: colline e pianure uguali, Monti sono Oggetti, picco ossia un unico monte oggetto, idem alberi e foreste (cfr Oggetto).&lt;br /&gt;
* Acqua poco profonda, profonda, molto profonda (anche in metri): variabile boolean in Personaggio “alto” per toccare in acqua profonda, con acqua si generano fiumi laghi e mari. &lt;br /&gt;
* Ambiente si deve poter evolvere: ad esempio oggetto diga può fare metamorfosi e diventare oggetto cascata/torrente in piena. &lt;br /&gt;
* Ambiente: pozzi e grotte, da gestire come interno casa. &lt;br /&gt;
* Strade di vario tipo, sovrapposta a altri suoli, migliorano velocità di alcuni strumenti, variabile boolean “ha le ruote” in classe strumenti.&lt;br /&gt;
* Nella mappa ci deve essere per ogni punto la temperatura. &lt;br /&gt;
&lt;br /&gt;
===Funzionalità generali===&lt;br /&gt;
* Stato partita: battaglia in corso, creazione in corso (forse questa esterna al gioco?), etc.&lt;br /&gt;
* ciclo interazione: evento input, lettura input, aggiornamento stato, stampa su board in append (non si nasconde nulla), attesa evento input&lt;br /&gt;
* [NO] Chiave: non una flat input box per i comandi; ma dinamica: si suppone il soggetto &amp;quot;io&amp;quot; (le azioni le fanno in prima persona i personaggi), ogni mossa deve prevedere dei complementi (&amp;quot;verso&amp;quot;, &amp;quot;tra quanto&amp;quot;, &amp;quot;cosa&amp;quot;, &amp;quot;a favore di chi&amp;quot;, &amp;quot;contro chi&amp;quot;). Ogni complemento collegato con box stile in pop up =&amp;gt; bootstrap (la grafica sara unica). &lt;br /&gt;
* [SI] Prevedere anche modalita flat con input del tipo &amp;quot;azione a=pippo verso=termoli&amp;quot; (regex check)&lt;br /&gt;
* menu' interazione per scelta regole battaglia e scelta personaggi&lt;br /&gt;
* &amp;quot;meno tabelle&amp;quot;, &amp;quot;no bottoni&amp;quot; e solo foto che si alternano, &amp;quot;la grafica serve&amp;quot;: text box unica interazione, text area (history), immagine personaggio e immagine mappa&lt;br /&gt;
* niente minimappa, meno problemi, interrogazione per info percezione sensoriale e orientamento (N-S-E-O), schema a mano&lt;br /&gt;
* &amp;quot;persistenza anche da interfaccia grafica&amp;quot;, diritti di scrittura sui file?&lt;br /&gt;
* Segnalazione (comando per fare nota)&lt;br /&gt;
* Modellare statistiche con funzioni probabilistiche (Gaussiane, esponenziali, uniformi, etc.) con relativa media e varianza piuttosto che individuare fasce/scaglionamenti (meno realistici e meno belli)&lt;br /&gt;
* comando 'clear' aggiunge tanti new line alla textarea quante sono le righe renderizzate.&lt;br /&gt;
* comando 'remember/help &amp;lt;mossa&amp;gt;' per stampare i complementi, obbligatori e opzionali, richiesti da una mossa&lt;br /&gt;
&lt;br /&gt;
===Deploy===&lt;br /&gt;
* &amp;quot;commenta il codice&amp;quot;, &amp;quot;dividi et impera&amp;quot;&lt;br /&gt;
* Server web (Apache) ospita partite (+ localmente ha i file di funzionamento), in LAN client giocano o da remoto con IP pubblico. Interfaccia HTML5 + Javascript per giocare. Studiare engine grafici Javascript&lt;br /&gt;
* bootstrap! (specie per input box)&lt;br /&gt;
* https://bit.dev/ per molti componenti web&lt;br /&gt;
* React, React Native .. forse meglio di Vue per diffusione&lt;br /&gt;
* Unity, WebGL (vedi SDK dedicata, built per Android/iOS/etc.)&lt;br /&gt;
* Modelli 3D videogiochi: https://www.models-resource.com/ , meglio se disaccoppiati da Unity (e.g. in cartelle independenti), aggiunta modelli online&lt;br /&gt;
* creare modelli: blender. creare disegni: krita&lt;br /&gt;
* Tutorial tank Unity: https://learn.unity.com/project/tanks-tutorial ; modelli: https://opengameart.org/&lt;br /&gt;
* WebSocket per gestire client asincroni (NodeJS ?)&lt;br /&gt;
* Su YT in “guarda più tardi” video per interagire unity con JS (“unity.sendMessage()” o simili)&lt;br /&gt;
* Due client: uno con WebGL e uno JS base con solo input (per test, per mancanza di supporto browser a WebGL). Eventualmente 3 client: 1 base (JS puro con qualche immagine al più), 1 WebGL+Unity 2D (grafica pixelata), 1 WebGL+Unity 3D (informazioni di input per mirare, ad es., in base a dove punto nello schermo. Qualcosa di simile anche per 2D). Tutti i client stessi JSON per comunicare al server!&lt;br /&gt;
* photogrammetry, https://medium.com/realities-io/getting-started-with-photogrammetry-d0a6ee40cb72&lt;br /&gt;
* roll20.net .. c'è '''davvero''' molto&lt;br /&gt;
* readthedocs.org&lt;br /&gt;
* css dinamici: sass, https://zurb.com/playground/motion-ui (zurb)&lt;br /&gt;
* progressive web apps: offline with server works. https://it.wikipedia.org/wiki/Progressive_Web_App ; responsive web design&lt;br /&gt;
* https://www.youtube.com/watch?v=CGz-h-DzJDU e relativi link, https://essentialsdocs.fandom.com/wiki/Attack_animations , (google: pokemon move animation editor/sprite)&lt;br /&gt;
&lt;br /&gt;
==== Altro (scartato)====&lt;br /&gt;
* rpgmaker, godot, aseprite, pixelart (in generale), ma anche phaser, piskel&lt;br /&gt;
* joomla! Per far prima con html&lt;br /&gt;
* libreria pygame&lt;br /&gt;
* Vuegg: https://github.com/marketplace/vuegg  &lt;br /&gt;
* Material Design&lt;br /&gt;
* eclipse IDE&lt;br /&gt;
* JAVA: Class.forName(&amp;lt;name&amp;gt;.class).newInstance();&lt;br /&gt;
&lt;br /&gt;
===Copia&amp;amp;incolla generale, da smistare in sotto capitoli. Contiene anche '''tutte''' note del telefono (al 22/02/2020)===&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 2:'''&lt;br /&gt;
&lt;br /&gt;
Armi: balestra, mani nude, sasso, tirapugni, torcia accesa. Armature: intralciano o favoriscono agilità, attacco, poteri magici, rumorosa (elusione), è uno strumento/oggetto. Attacchi possono essere prolungati per turni, mosse variabile boolean prolungabile: può aumentare o diminuire intensità, c’è un max espresso in turni di prolungabilita, inoltre può essere leggermente alterato con una variabile casuale. Equipaggiamento (strumento/oggetto): pietra focaia, attrezzi da scalata, boccale di birra, cavallo, moto, chiodi, martello da fabbro, corda, corazza, dardo, faretra/zaino/sacca (oggetti che contengono una lista di oggetti, stringhe) con un numero per la quantità) e capacità massima zaino e ogni oggetto può avere un valore intero per dimensione (es martello 3, ascia grande 7), mantello, olio, variabile boolean prende fuoco/conduce elettricità, amplifica magnetismo, aumenta esplosioni nucleari, aumenta forza di gravità (?), pala, piccone, rampino, specchio, per osservare quando si è nascosti e si ha malus su visibilità. Strumenti da scasso per aprire porte: variabile boolean per oggetti: entrata con scasso. Personaggio: string razza per swag, immunità a veleni e malattie, elusione, agilità, precisione, abilità magiche(?), difesa fisica. In ultima torcia: agilità, coraggio, forza, intelligenza, magia, manualità, percezione, socialità. Bestiario: aracnoide di varie dimensioni, talpe giganti, vermi giganti di terra di mare e di lava ect, bulbo trascinatore che ha tentacoli per tirare a se e mangiare, lui è immobile, calabrone gigante, serpenti giganti, cinghiali, draghi, elfi, goblin e re goblin, sciamani (goblin), totem di guerra come strumento/oggetti per alterare statistiche nella loro area di influenza, lupo, mastino bruciante, nani, non morti/zombie/mummia/scheletro variabile boolean vivo a false ma ha ancora hp su parti del corpo: variabile boolean “zombizabile”. Orchi, pesci da terra (anfibi) tritone dell abisso, troll e trollin (orchi più deformi), umani. Abilità dei personaggi in ultima torcia: artificiale (robot) immunità a soffocamento, veleni, malattie ect immune a manipolazioni psichiche, visione oscurità; danno da attacco in carica; fiammegiante ossia la creatura può incendiarsi e elettrizzante ossia può diventare elettrica caricamente; modalità furia/mailmen ossia ottiene bonus su alcune/tutte le statistiche; gigantesco o molto piccolo due boolean (?forse non serve); immunità a magie mentali, al fuoco; linguaggi (?); non morto; danno da attacco in presa; pungiglioni velenosi; sa muoversi su ragnatele o è rallentato, resistenza a perforazione, respirare sott’acqua o sotto lava o nei liquidi in genere; rigenerazione; riceve danni dalla luce solare o da assenza di luce; è terrorizzato/impaurito/intimidito o se è imperturbabile boolean. Danno da trascinamento; paralizzante; può diventare più veloce (?non serve); visione a infrarossi attraverso oggetti; volare o andare sotto terra. Imperium editor, cose che penso di non aver ancora scritto: stagioni, suolo erboso o terriccio, sabbia con erba e terra e da sola, strade e stagioni, altitudine, alberi e arbusti, vari tipi a foglia larga, conifere, alberi secchi, palme, arbusti verdi e secchi, cactus, alghe marine, rocce e pietre, scheletri per terra, legna tagliata (alberi tagliati), carri e carretti, grotte e rovine per accessi sotterranei, locande, templi, accampamenti, fortini, monoliti, fontana, tombe e cimiteri, borse per terra, pozzo, troni, croci(del teschio), pozzo, capanne, lapidi, ponti, recinzioni, falò, tende, torri, panoplia, fessure come abissi, statue, rovine (deserto) come case distrutte, colonne per costruire templi, piramidi, sfingi, bandiere, rovine in Europa, campi coltivati che contengono cibo, fiamma (in altre), roccia in altre per montagne, altre-&amp;gt;rovine per monumenti non egiziani ma europei.&lt;br /&gt;
Ci sono paludi. Tende da campo. Forti, porti. Edifici delle fortezze, edifici dei villaggi. Naufragi e scogli.&lt;br /&gt;
Parametri voglia/impegno float per descrivere voglia di combattere Personaggio. Ricevi danno uscendo dalla mappa tra 1-5% tra 6-10% tra 11-15% della vita totale di ogni parte del corpo per ogni turno di gioco. Danno da precipitazione diverso da carica, uno verticale uno orizzontale, se precipiti da molto in alto hai bonus, oltre che danni da schianto lol. Baionette, formazione a blocchi, a quadrato (difensiva) sparano su quattro lati, a schiera vanno avanti. Usano un colpo poi lunga ricarica. Variabile boolean per attivare o meno fuoco amico. Azione per cambiare posizione: in piedi, in ginocchio(inteso come via di mezzo), sdraiato: per permettere migliore visibilità a chi è dietro (nella formazione).&lt;br /&gt;
Altruismo, coraggio, spingere oltre il limite, difendere al posto di un altro, migliorare posizione per avere bonus. Mosse da usare in condizioni psicologiche idonee: mosse estreme per disperazione, bonus unici. Condizioni per situazioni: blocco, spalle al muro, stritolato, confuso, semi parassiti addosso, azzoppato, bagnato d’acqua, lame affilate, corazza indurita, tante copie di me stesso attive, preveggente. Per ambiente:pioggia (torrenziale), barriera a cupola, punte metalliche a terra, blocco di fumo nero. Far volare un avversario/alleato. Tutti possono fare tutto sotto effetti magici o fisici. Un cavallo può volare se viene preso da un uccello e portato in alto.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 3, 4:'''&lt;br /&gt;
&lt;br /&gt;
Gioco1,2,3,4: tutto caricato su wikis.&lt;br /&gt;
&lt;br /&gt;
Gioco3: Mosse con caricamento + spostamento (es. kameamea con teletrasporto). Ciclo di interazione principale:crea o combatti. Modalità campagna, che chiede in input da che battaglia iniziare, ma implica tipi battaglie prefissati. Alla morte/sconfitta di un personaggio si possono alterare statistiche (es personaggio può cambiare fazione). Alcune mosse possono lasciare oggetti sul terreno: (ad es, radici di Groth). Ogni oggetto può alterare le statistiche al passaggio sopra, nelle vicinanze. Boolean invisibile per personaggio, diverso da elusione infinita. Se personaggio va in un altro dimensione -&amp;gt; unreachable. Attacco coordinato, se non lo fanno tutti vale lo stesso ma depotenziato opportunamente . Personaggio in modalità maniac (2 mosse per turno) e in modalità depressive (1 mossa ogni due turni); personaggio Flash può fare 10 mosse in un turno. Chiudi con lucchetto oggetto da dentro o da fuori, oggetto ingresso in oggetto casa , più ingressi per un singolo oggetto.nicole aniston. Rimbalzo se ci si schianta contro oggetto da calcolare con parametro. Ryuk e Darkrai.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gioco 4 23/07/2019:&lt;br /&gt;
Pula fiction, aracnidi, oggetto: due superfici rettangolari di forma diversa, anche inclinate , collegate. Più pezzi collegati tra loro per forme cilindriche cave, ad esempio, tipo vulcano. Mappa con sprite personaggi, canvas: anche mouseClick? Statistiche con nome gerarchico, es pokemon_attacco. Modalità survival, stile isola di jurassic park gdr; sia in coop che contro; possibilità di fare N turni di fila se non ci sono altri player giocanti nelle vicinanze (ciò però comporterebbe , in modalità contro , di capire quando c’è qualcuno nelle vicinanze perché si andrebbe di 1 turno alla volta, soluzioni: in mod contro 1 turno per volta oppure meccanismo di sincronizzazione turni quando uno vede l’altro (anche furtivo) come c’è attacco 1 turno a testa) .. analogo a Battle royale(?); inizio con starter kit random. Modalità assedio al castello. Inoltre se posso fare N turni di fila si può pensare a più pc , uno per persona , coordinati per fare comandi in parallelo, ma va ben congegnato meccanismo di sincronizzazione. Parti DelCorpo -&amp;gt; Componente/i oppure Parte. La mappa deve essere (x,y); l’altezza viene indicata onMouseOver certi pixel dove è posto il Personaggio; se personaggio dentro edificio/grotta cambio img (es sfocato/tratteggiato). Mosse: astrarre per target; molte mosse sono simili tra loro, somiglianza va sfruttata, hanno magari dei target in comune, o variano solo per un parametro. Creare mappa anche con drag and drop immagini ?(un po’ difficile). Più layout per interfaccia grafica (esempio uno che mostra errori input su text area, uno con alert, uno su box text area separato). Input comandi consumato pezzo per pezzo, alcune parole se prevedono parametri quando riconosciute fanno fetch anche di parola (numero) successiva. Face toon foto? Import parziali di personaggi (tutto tranne/solo questi campi specificati). Texture mappa complete o ripetibili (es per suolo). Anteprima battaglia stile battaglia pokemon (magari per 1/2/3 vs 1/2/3) per rappresentare scontro. Conviene usare xslx (excel) per dati, considerare che può non servire la libreria Java per leggere stringhe per operazioni. Mossa “again” , ripeti la precedenza(opportuna modifica parametri, es mossa spostamento). Possibile gestione contromosse: si usano marker (tag): ogni mossa ha elenco tag del tipo di contromosse che può subire (con probabilità annessa, che può dipendere da pg che subisce mossa congiuntamente a mossa stessa). Ogni mossa inoltre deve essere taggata come possibile contromossa che il pg può usare (per schivare può fare in più modi). A seconda del lancio del dado il pg che effettua La contromossa può anche scegliere tipologia di contromossa o solo la mossa della tipologia che ha beccato (entrano in gioco riflessi ect.). I parametri che fanno attivare unq o un’altra contromossa sono dinamici, posso dipendere ad esempio dalla posizione tra i due pg o altre statistiche. Tag contromosse a fasce (es. coprirsi è sempre più facile che schivare che e più facile di schivare e contrattaccare (?); all’interno dello stesso schivare e contrattaccare ci sono più sotto categorie). Per aggiunta personaggio può essere utili interfaccia dedicata, non linea di comando (o altre operazioni, specie se ci sono tabelle). Mossa “premonizione”: predire il futuro a breve termine, dici che mossa vorresti fare e ti dice esito (o più esiti se uno chiede più mosse). Funziona solo sulla prossima mossa. Contromossa delle contromossa gestione?? Eventualmente nell’esito si prevede ancore contro-contromossa. Ma si innesca reazione a catena, inoltre da gestire scelta contromossa in questo caso. Applicazione tag conoscenza(universo di appartenenza): “Termoli”, “pokemon”, “liceo classico Termoli”, anche gerarchici, per filtrare sui personaggi.target componibili , fattorizzato creazione mosse, hanno un costo magari per indicare quantovoccupano dicuna mossa, relativo maybe a un parametro o più del target stesso. In particolare, non saranno salvate le mosse per un personaggio (o solo alcune “preferite”) ma il suo insieme di target i quali devono dire:statistica che influenzano, “costo del turno” che richiedono al variare dell’intensità del target (che aumenta linearmente, esponenzialmente, generica f(x)) quindi corsa blanda costo 1 , Max corsa costo 5 (max), elenco (string) target incompatibili con tale target (se serve), nota relative ad es per quando uno vuole creare una mossa durante la battaglia (“target corsa, max sforzo dedicabile 4 ect” metti “50 metri corsa” “ok/troppo! Vuoi sforzati di più rischiando effetti collaterali?”). Si può autoscrivere la voce narrante del gioco come “la tua coscienza” mentre che giochi, d’altronde si interagisce con essa. Considerare che un target può appartenere a più personaggi, magari sotto nomi di mosse diversi.&lt;br /&gt;
Definire gerarchia di personaggi per template (tipo classe e super classe) e template importabili (tipo usa fuoco). Es umanoide non umanoide, tra umanoide maschio- femmina etc. Classe che estende System.out per creare funzioni che aggiungono Header “DEBUG:” etc; due programmi Java , due main: uno delegato a calcoli + gestione Excel; altro legge stdout dell altro per interfaccia grafica. Per allenare PG creare dei PG fantocci con label per fare Q-learning iniziale, più avanti far allenare pg tra loro; creare vari fantocci: tank terrestre fisico, healer volante etc. Excel: si usa css che si può rendere tabellare, più facile da trattare nel codice rispetto a .xslx. Ogni “utente” ed Lostefra ha il suo personale dizionario con sue personali short cut da usare in partita, eventuale login con password (opzionale) x accesso. Vedere license show down. Mappa unica stile giochi di ruolo, si vede tutto da sopra: click o simili su edifici/caverne per mappe interne a tale posto, così ok sprite e per rappresentare “pg in volo” sprite dedicato. Densità aria per dire quando anche un uomo per es può volare. Ipotesi più efficiente per dare un valore stima al pg: AI base che gioca a manetta contro altre AI base e dalle vittorie si fa l’euristica, più vittoria facile/veloce/stracciante più punti, contro vari pg, contro pg standard bench mark.&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Note&amp;diff=212</id>
		<title>Note</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Note&amp;diff=212"/>
		<updated>2020-08-12T16:59:09Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: /* Personaggi (con statistiche e stati) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Note ==&lt;br /&gt;
&lt;br /&gt;
'''Ultimare suddivisione'''&lt;br /&gt;
&lt;br /&gt;
===Linee guida sviluppo===&lt;br /&gt;
* File .txt di prontuario per la creazione del personaggio (stile akinator).Nel csv personaggi saranno salvati coppie &amp;lt;proprieta&amp;gt;=&amp;lt;valore&amp;gt;. Esempio: id=infernape,x=1,y=1, etc. Si potra fare template di altri personaggi con template=infernape, template=blastoise (se ovveride vale il più recente), spazi non ammessi nel csv per essere meno error prone.&lt;br /&gt;
* statistiche sono funzioni: sia valori costanti, sia dipendenti da altre statistiche (variabili).&lt;br /&gt;
&lt;br /&gt;
===Inspirational Concepts===&lt;br /&gt;
* Gioco Lotta (Pokémon, Pokkén)&lt;br /&gt;
* no caselle esplicite&lt;br /&gt;
* Descrizione rispetto a: ambiente, nemico, oggetti&lt;br /&gt;
* pokémon, DnD, Call of Duty, Super Smash Brawl, corse pazze&lt;br /&gt;
* concentrarsi su: fluidi, telecinesi, razze, bonus/malus, gradi di libertà (fisicamente parlando) &lt;br /&gt;
* scacchi (es. crea casella), shaolin showdown&lt;br /&gt;
* prevedere = creatività&lt;br /&gt;
* acqua, aria, fuoco, terra&lt;br /&gt;
* gravità (newton), verso alto, basso, destra, sinistra, circolare, tutti i versi&lt;br /&gt;
* jumanji, savana, animali, zoologia&lt;br /&gt;
* tempo/spazio&lt;br /&gt;
* BF4, pirati, roma (imperium civitas)&lt;br /&gt;
* musica come arma (rap)&lt;br /&gt;
* magia, prestigiatori&lt;br /&gt;
* dinosauri (documentario, libro, zoologia)&lt;br /&gt;
* draghi = dinosauri + ali + fuoco&lt;br /&gt;
* avengers, supereroi (libro)&lt;br /&gt;
* death note, nutrizionista&lt;br /&gt;
* yugioh (carta coperta)&lt;br /&gt;
* fortnite: costruire&lt;br /&gt;
* pacman, colash royale&lt;br /&gt;
* clash of clans, guitar hero&lt;br /&gt;
* sport (generico), (nome, cose, città -&amp;gt; geografia!, fiori)&lt;br /&gt;
* naruto, digimon&lt;br /&gt;
* no man's sky: procedurale, random (non setti un param? lasci al caso? setti tutto? te li sballo). Astronave, tuta spaziale, esplorazione, missione, indie&lt;br /&gt;
* animali e dinosauri dell'oceano&lt;br /&gt;
* rap devi fare freestyle e fare danni all'avversario&lt;br /&gt;
* super mario bros e mario kart&lt;br /&gt;
* elettronica: microcontrollori e arduino, codice&lt;br /&gt;
* Dragon Ball - Budokai Tenchaichi 3&lt;br /&gt;
* Harry potter&lt;br /&gt;
* [NO] minimappe (tieni a mano per ora, meno onere implementativo)&lt;br /&gt;
* Spore, labirinto&lt;br /&gt;
* Atomo, numero elettroni e densità circa sempre costanti; forza (Newton)&lt;br /&gt;
* obbligo, verità, giudizio, salvataggio&lt;br /&gt;
* Ben Ten =&amp;gt; orologio, crea PG e oggetto&lt;br /&gt;
* Kingdom Hearts, Super Smash Brawl&lt;br /&gt;
* Rambo, Rocky Balboa&lt;br /&gt;
* Tigri, coccodrillo (5-8m), animali, ippopotamo (ribalta barche)&lt;br /&gt;
* divinita egitto&lt;br /&gt;
* Battle bot:ribaltano, scintille, elementi (Oggetti) che danneggiano. &lt;br /&gt;
* One piece: I frutti del diavolo (悪魔の実 Akuma no mi?) sono frutti misteriosi che donano poteri soprannaturali a chi li mangia, rendendoli però incapaci di nuotare. Di conseguenza il contatto con l'acqua di mare o con una speciale sostanza conosciuta come agalmatolite indebolisce gli utilizzatori di frutti del diavolo e li priva dei loro poteri. Alcune persone sono inoltre in grado di ricorrere all'Ambizione (覇気 Haki?), una forza spirituale che permette di avvertire la presenza di altri esseri viventi e di predirne i movimenti, di irrobustire parti del corpo e di intimidire o fare svenire le creature con una debole forza di volontà. &lt;br /&gt;
* Wrestling per ispirarsi nella lotta libera: calci pugni ginocchiate prese lanci salti testate gomitate ecc. &lt;br /&gt;
* Imperium civitas. &lt;br /&gt;
* Attacco dei giganti. &lt;br /&gt;
* Jump force. Game dev tycoon. &lt;br /&gt;
* Piovra gigante. &lt;br /&gt;
&lt;br /&gt;
* Looney toons&lt;br /&gt;
* pokemon mystery dungeon (da googlare, escono vari siti con pdf e stats)&lt;br /&gt;
* question tool-for-combat-management: https://rpg.stackexchange.com/questions/171188/tool-for-combat-management&lt;br /&gt;
&lt;br /&gt;
===Personaggi (con statistiche e stati)===&lt;br /&gt;
* creabile runtime&lt;br /&gt;
* combattenti (con statistiche e stati)&lt;br /&gt;
* immagine rappresentativa per rappresentare meglio&lt;br /&gt;
* HP: colore rosso su immagine personaggio, dove sei debole/già colpito (idea scartata)&lt;br /&gt;
* penitenza: il malus può essere inteso come ciò che c'è nell'inserimento successivo, malus cumulativo&lt;br /&gt;
* essere ipocrita, finzione (schermo)&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (personaggi)&lt;br /&gt;
* metamorfosi&lt;br /&gt;
* alchimisti&lt;br /&gt;
* Parametri vitali: non respirare, arresto cardiaco, grasso (+/- caldo/freddo)&lt;br /&gt;
* Ossa, muscoli -&amp;gt; parti del corpo&lt;br /&gt;
* Organi (altri organi): apparato digerente (cibo, acqua (in vena, Fabri Fibra), espletamenti), sangue&lt;br /&gt;
* Da wikipedia: pressione arteriosa, frequenza cardiaca (polso), frequenza respiratoria, temperatura corporea, ossigenazione sanguigna, colorito della cute, dolore.&lt;br /&gt;
* Stato di coscienza: coma, non cosciente, sonnambulo, sonnolento, confuso, vigile, orientato, consapevole&lt;br /&gt;
* Morte = game_over&lt;br /&gt;
* Stats personaggi senza bound, ma consigliati dei range (0-100 / 1.000 / 10.000)&lt;br /&gt;
* (?) il personaggio non è necessariamente nella mappa, anche fuori indistintamente lontano, non si rappresenta ma compie azioni e puo' essere attaccato (no mosse fuori da mappa)&lt;br /&gt;
* possibilità giù in terra/ giù in acqua, con reachable e unreachable Boolean. Fuori da mappa anche reachable e unreachable.&lt;br /&gt;
* Personaggi composti di parti[] es. testa, busto, gambe, braccia, coda, pinna, ali. Distinzione per arto di movimento e/o spostamento boolean.&lt;br /&gt;
* Arti possono provocare danno, bruciatura , paralisi a contatto (Boolean) . Percentuale di probabilità accompagna ogni Boolean.&lt;br /&gt;
* Ogni parte del corpo punti vita + se inutilizzabile + amputata + stato (es paralisi).&lt;br /&gt;
* Per fare battaglie tra molto grandi =&amp;gt; 1 m lo si intende come 10m.  (rivalutato, aumentare livello scaling)&lt;br /&gt;
* Personaggio fusionabile Boolean + string nomi con cui si fonde.&lt;br /&gt;
* Distinzione tra infernape e infernape1/2/3 ect tra “specie” e “nome”.&lt;br /&gt;
* variabile Boolean respawnable.&lt;br /&gt;
* Raccogliere a piene mani da: https://spore.fandom.com/wiki/Creature_Editor&lt;br /&gt;
* Ad esempio weapons come elemento di Corpo (zanne, corna) e possibilità di muoversi/attaccare furtivamente.&lt;br /&gt;
* Divisibile e unibile come boolean e array di stringe associate per indicare i nomi con cui si unisce il Personaggio o in cui si divide, meglio come mossa.&lt;br /&gt;
* Variabili posizione nome: from_x/y ; to_x/y.&lt;br /&gt;
* Classe Stato, Personaggio contiene Array di stato, stato contiene moltiplicatori per statistica es attacco velocità precisione elusione ect.&lt;br /&gt;
* Personaggio deve avere una stat tipo sanità mentale, intelligenza, quanto è confuso e quanto è impaurito (2).&lt;br /&gt;
* le statistiche possono variare leggermente in un turno con una certa media e varianza (se media 0 oscillano randomicamente)&lt;br /&gt;
* Personaggio ha funzione baricentro_x, baricentro_y calcolate come (from_x+to_x)/2 sul quale si basa la funzione di libreria getDistance(Personaggio A, Personaggio B, float success); tale funzione serve per calcolare per i PNG e per i PG se ha senso usare una mossa. &lt;br /&gt;
* Non-onniscienza: delle volte non si può sapere distanza avversario e fallisce la mossa per la distanza -&amp;gt; “float success” rappresenta la probabilità di successo (Personaggio ha parametro “osservare”). &lt;br /&gt;
* PNG di due categorie: offensivi o neutrali (no priorità a mosse di attacco, ma tutto casuale). &lt;br /&gt;
* Mosse e oggetti per chiamare Personaggi, magari non necessariamente alleati (2 mosse e 2 oggetti quindi necessari), richiamo di un personaggio preciso o di uno a caso. &lt;br /&gt;
* Possono attivare una metamorfosi / Unione per cambiare stats personaggio. &lt;br /&gt;
* Possibilità di morire se colpiti in un unico punto (tallone d Achille) implementabile come variabile boolean. &lt;br /&gt;
* Variabile int per attacco cumulativo di gruppo: es calciatori che più si passano la palla più l’attacco è forte. &lt;br /&gt;
* Funzione esci/entra in classe Personaggio per simulare scambio pokemon 6vs6. &lt;br /&gt;
* Personaggio si può svestire e lasciare strumenti, modificano statistiche di attacco, difesa , agilità, ect.&lt;br /&gt;
&lt;br /&gt;
* Per personaggi molto piccoli (meno di 1m x 1m x 1m) possibilità di essere in (x,y,z) tra 0 e 1.000.000 (ordine del micrometro, 1*10^-6 == 0,000001) e avere (lenX, lenY, lenZ). In questo modo sono definite dimensioni inferiori ad 1 m^3.&lt;br /&gt;
* personaggi max 20x20 (rivaluato, meno limitata)&lt;br /&gt;
* Personaggi e oggetti Devono avere tag, utili per iniziare partite (ad es. esercito di npg a caso tra quelli con tag &amp;lt;zombie&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
===Mosse===&lt;br /&gt;
* mossa ha parametri fissi e modificabili (ad es. mossa &amp;quot;fusione&amp;quot; specifica o meno con chi o caratteristiche minime per soddisfare, es. ha orecchino come vegeku)&lt;br /&gt;
* &amp;quot;combattimento prescinde da combattente&amp;quot;&lt;br /&gt;
* mosse hanno: direzione, azione, attacco (mosse pokémon)&lt;br /&gt;
* Parametri interi per mossa (direzione, consumabili) con lower e upper bound&lt;br /&gt;
* camuffarsi =&amp;gt; DnD manuale&lt;br /&gt;
* wrestling (libro) per le mosse/prese&lt;br /&gt;
* Mosse che trasformano l’avversario: attenzione è una mossa devastante. Altera statistiche/stato. Trasformazione totale o parziale. &lt;br /&gt;
* Si devono poter aggiungere mosse, strumenti dinamicamente. &lt;br /&gt;
* Ogni mossa/azione deve avere un tempo di attesa espresso in turni (alla meglio 0) per poter ripetere la mossa/azione. &lt;br /&gt;
* Rischio=danno*probabilita.&lt;br /&gt;
* Mossa su strumento e con strumento?&lt;br /&gt;
* Mosse fisiche per arrampicarsi su avversario(se e solo se sei la metà di dimensioni(?)), atterrarlo, lanciarlo, accecarlo, immobilizzarlo. Se sei in gruppo/ orda bonus ad attacchi combinati. Variabile &amp;quot;posizione&amp;quot; di chi si è arrampicato ora è dipendente (bind) da variabile dell'altro.&lt;br /&gt;
* Tipo della mossa con moltiplicatore tra 0 (immune) e 2 (float): acqua, fuoco, magia, terra: da ispirarsi ai pokemon ma non da copiare, penso. &lt;br /&gt;
&lt;br /&gt;
* X fa una mossa contro Y: Z potrebbe reagire (Es. ricevendo il colpo al posto di Y). Può essere realizzato sia come se &amp;quot;Y chiede soccorso Z&amp;quot; o come reazione di alleati adiacenti &amp;quot;Z soccorre Y&amp;quot;&lt;br /&gt;
* Mossa prende come parametro di ingresso Corpo, ossia la parte del corpo coinvolta nella mossa (es arto , tutto corpo ect). &lt;br /&gt;
* algoritmo per simulare percezione: per ogni punto oggetto da vedere, si calcola diff_x, diff_y, e diff_z con punto sensibilita di colui che percepisce. Si avanza per far ridurre le diff a 0: se (diff_x, diff_y, e diff_z) = (30,20,10) allora ci si muove 3 volte su asse x, 2 su y, 1 su z.&lt;br /&gt;
&lt;br /&gt;
===Oggetto (con statistiche e stati)===&lt;br /&gt;
* creabile runtime&lt;br /&gt;
* armi: lacci (stati), lame (potenze), sassi, reti, pistole (munizioni), razzi, bombe (potenze), fuoco (d'artificio?) =&amp;gt; manuale DnD&lt;br /&gt;
* veleno n modi =&amp;gt; DnD manuale&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (oggetti)&lt;br /&gt;
* automezzi con cannoni, variabile 'hasEntrata', 'tempoRiutilizzo'&lt;br /&gt;
* violino come arma (tutti strumenti musicali): a fiato, a corda, a percussione&lt;br /&gt;
* veleni, ampolle e flaconi magici, insieme di 'oggetti dentro' un oggetto&lt;br /&gt;
* cassaforti (senza/con) chiave, isSigillato, oggetti aprono&lt;br /&gt;
* oggetto riparo, crea&lt;br /&gt;
* Strumenti anche mezzi di trasporto di aria, di terra, di acqua (o lava/palude). &lt;br /&gt;
* Veicoli con armi o riparo. &lt;br /&gt;
* Gli strumenti da trattare come gli oggetti. Classe unica. &lt;br /&gt;
* Acqua diventa tsunami. &lt;br /&gt;
* Armi: fruste e scheggie, corni che si suonano per chiamare altri. &lt;br /&gt;
* Armi da campo: cannoni e catapulte.&lt;br /&gt;
* Veicoli d’acqua: moto acqua, canoe, barche a motore a remi.&lt;br /&gt;
* Nei veicoli malus su attenzione (variabile int in personaggio, indica attenzione in combattimento e non in altro) perché si è impegnato alla guida. &lt;br /&gt;
* Classe oggetto: es albero, roccia, casa: forza necessaria per sradicare + forza per lanciare + destrezza / agilità per appendersi + nascondersi in proporzione alle dimensioni di chi si nasconde. &lt;br /&gt;
* Altri es. pali. Sotto terra o sotto acqua/lava/melma o simili. &lt;br /&gt;
* Acqua rallenta se non hai pinne boolean.&lt;br /&gt;
* Classe strumento per oggetti che si tengono in mano, es reti , pistole, spade, pugnali, scudi, elmi, lancia, arco , frecce, lanciarazzi, fucili cecchino, fucile assalto, corde.&lt;br /&gt;
* Strumenti e mosse: danno ad area, perforante, contundente (vedi dnd armi). Mosse possono creare/modificare/distruggere oggetti e strumenti.&lt;br /&gt;
* Oggetti del campo di gioco incidono su elusione (parametro di personaggio).&lt;br /&gt;
* Buco/abisso (boolean) per dire se c’è o meno il suolo (Suolo come classe?). &lt;br /&gt;
* Radiazioni. &lt;br /&gt;
&lt;br /&gt;
===Modalità gioco===&lt;br /&gt;
* turnazione&lt;br /&gt;
* 1 v 1 v 1 etc., ma anche squadre casuali&lt;br /&gt;
* punteggio: chi fa più punti, più uccisioni, definizione di 'punto', gioco per perdere&lt;br /&gt;
* inserisci personaggio total random&lt;br /&gt;
* I match/partite (immagino Classe Partita) devono avere variabile boolean “respawn”, per distinguere death match a punti con death match con una vita.&lt;br /&gt;
* Condizione vittoria (oltre a morte, punti, o numero mosse, cioè tempo) morte di un singolo Personaggio, che potrebbe rappresentare un edificio, cassaforte o simili. &lt;br /&gt;
&lt;br /&gt;
* Modalità battaglia con interazione stile battaglia navale (non si vede mossa dell'avversario)&lt;br /&gt;
* Modalità di gioco: tutti contro tutti (battle royale), death match, vs CPU mode zombie(attaccano solo, se non possono vanno verso nemico): serve introdurre un punteggio, di sicuro per mode zombie , ma anche per death match e tutti contro tutti&lt;br /&gt;
* ingressi: ne entra un altro?&lt;br /&gt;
* Per punti si vince a un limite o dopo un tot di mosse , oppure al primo dei due raggiunti (max_punti e max_mosse parametri di Partita).&lt;br /&gt;
* I punti si guadagnano alla kill (un Punteggio per squadra, int punteggio salvato localmente dentro ogni Personaggio che ha la variabile int squadra). &lt;br /&gt;
* Si guadagnano tanti punti quanti sono i punti della variabile “valore” del personaggio ucciso, tale variabile è calcolata come somma dei valori di tutte le mosse/stats ect del Personaggio. &lt;br /&gt;
&lt;br /&gt;
===Mappa===&lt;br /&gt;
* arene NxN metri, 1.000mX1.000m, arena creata casella per casella (NxN aree in un arena)&lt;br /&gt;
* Area: montagnE (agilità, arrampicarsi, appendersi), collina, montagnA, mare (campo 'isLiquido'), lago, spiaggia, deserto, lava, grotta, labirinto (cava, percorso in roccia), metropoli, città, campagna, foresta, fiume, stadio, isola, ghiacciaio, vulcano, cascata.&lt;br /&gt;
* immagine arena a mano, poi inserita nel gioco &lt;br /&gt;
* minimappa (pixelata ?), legenda oggetti base, devono esserci caselle implicite&lt;br /&gt;
* mappa 100x100 (rivalutato, meno limitata)&lt;br /&gt;
* Cannoni fissi in mezzo al campo (strumento).&lt;br /&gt;
* serve che la fisica il 90% sia guidata da regole vere&lt;br /&gt;
* i pianeti sono sempre sferici, per forza di gravità, atmosfera, se piccoli e irregolari =&amp;gt; no atmosfera&lt;br /&gt;
* temperatura: vicinanza dal sole. &lt;br /&gt;
* manca ossigeno? =&amp;gt; campo &amp;quot;respirabile&amp;quot;, le condizioni che consentono la vita possono cambiare, anche per via del fuoco&lt;br /&gt;
* Mappe dinamiche: il pianeta si scalda e diventa una stella, si raffredda e diventa impossibile muoversi&lt;br /&gt;
* Suolo magico: non tutti i personaggi possono accedervi, array di string elenca i nomi di chi può accedervi. &lt;br /&gt;
* Variabile luce o non luce, che peggiora/migliora a seconda della specie la visibilità, quindi la precisione, specie in attacchi a distanza: Scurovisione evita i malus.&lt;br /&gt;
&lt;br /&gt;
===Funzionalità generali===&lt;br /&gt;
* Stato partita: battaglia in corso, creazione in corso (forse questa esterna al gioco?), etc.&lt;br /&gt;
* ciclo interazione: evento input, lettura input, aggiornamento stato, stampa su board in append (non si nasconde nulla), attesa evento input&lt;br /&gt;
* [NO] Chiave: non una flat input box per i comandi; ma dinamica: si suppone il soggetto &amp;quot;io&amp;quot; (le azioni le fanno in prima persona i personaggi), ogni mossa deve prevedere dei complementi (&amp;quot;verso&amp;quot;, &amp;quot;tra quanto&amp;quot;, &amp;quot;cosa&amp;quot;, &amp;quot;a favore di chi&amp;quot;, &amp;quot;contro chi&amp;quot;). Ogni complemento collegato con box stile in pop up =&amp;gt; bootstrap (la grafica sara unica). &lt;br /&gt;
* [SI] Prevedere anche modalita flat con input del tipo &amp;quot;azione a=pippo verso=termoli&amp;quot; (regex check)&lt;br /&gt;
* menu' interazione per scelta regole battaglia e scelta personaggi&lt;br /&gt;
* &amp;quot;meno tabelle&amp;quot;, &amp;quot;no bottoni&amp;quot; e solo foto che si alternano, &amp;quot;la grafica serve&amp;quot;: text box unica interazione, text area (history), immagine personaggio e immagine mappa&lt;br /&gt;
* niente minimappa, meno problemi, interrogazione per info percezione sensoriale e orientamento (N-S-E-O), schema a mano&lt;br /&gt;
* &amp;quot;persistenza anche da interfaccia grafica&amp;quot;, diritti di scrittura sui file?&lt;br /&gt;
* Segnalazione (comando per fare nota)&lt;br /&gt;
* Modellare statistiche con funzioni probabilistiche (Gaussiane, esponenziali, uniformi, etc.) con relativa media e varianza piuttosto che individuare fasce/scaglionamenti (meno realistici e meno belli)&lt;br /&gt;
* comando 'clear' aggiunge tanti new line alla textarea quante sono le righe renderizzate.&lt;br /&gt;
* comando 'remember/help &amp;lt;mossa&amp;gt;' per stampare i complementi, obbligatori e opzionali, richiesti da una mossa&lt;br /&gt;
&lt;br /&gt;
===Deploy===&lt;br /&gt;
* &amp;quot;commenta il codice&amp;quot;, &amp;quot;dividi et impera&amp;quot;&lt;br /&gt;
* Server web (Apache) ospita partite (+ localmente ha i file di funzionamento), in LAN client giocano o da remoto con IP pubblico. Interfaccia HTML5 + Javascript per giocare. Studiare engine grafici Javascript&lt;br /&gt;
* bootstrap! (specie per input box)&lt;br /&gt;
* https://bit.dev/ per molti componenti web&lt;br /&gt;
* React, React Native .. forse meglio di Vue per diffusione&lt;br /&gt;
* Unity, WebGL (vedi SDK dedicata, built per Android/iOS/etc.)&lt;br /&gt;
* Modelli 3D videogiochi: https://www.models-resource.com/ , meglio se disaccoppiati da Unity (e.g. in cartelle independenti), aggiunta modelli online&lt;br /&gt;
* creare modelli: blender. creare disegni: krita&lt;br /&gt;
* Tutorial tank Unity: https://learn.unity.com/project/tanks-tutorial ; modelli: https://opengameart.org/&lt;br /&gt;
* WebSocket per gestire client asincroni (NodeJS ?)&lt;br /&gt;
* Su YT in “guarda più tardi” video per interagire unity con JS (“unity.sendMessage()” o simili)&lt;br /&gt;
* Due client: uno con WebGL e uno JS base con solo input (per test, per mancanza di supporto browser a WebGL). Eventualmente 3 client: 1 base (JS puro con qualche immagine al più), 1 WebGL+Unity 2D (grafica pixelata), 1 WebGL+Unity 3D (informazioni di input per mirare, ad es., in base a dove punto nello schermo. Qualcosa di simile anche per 2D). Tutti i client stessi JSON per comunicare al server!&lt;br /&gt;
* photogrammetry, https://medium.com/realities-io/getting-started-with-photogrammetry-d0a6ee40cb72&lt;br /&gt;
* roll20.net .. c'è '''davvero''' molto&lt;br /&gt;
* readthedocs.org&lt;br /&gt;
* css dinamici: sass, https://zurb.com/playground/motion-ui (zurb)&lt;br /&gt;
* progressive web apps: offline with server works. https://it.wikipedia.org/wiki/Progressive_Web_App ; responsive web design&lt;br /&gt;
* https://www.youtube.com/watch?v=CGz-h-DzJDU e relativi link, https://essentialsdocs.fandom.com/wiki/Attack_animations , (google: pokemon move animation editor/sprite)&lt;br /&gt;
&lt;br /&gt;
==== Altro (scartato)====&lt;br /&gt;
* rpgmaker, godot, aseprite, pixelart (in generale), ma anche phaser, piskel&lt;br /&gt;
* joomla! Per far prima con html&lt;br /&gt;
* libreria pygame&lt;br /&gt;
* Vuegg: https://github.com/marketplace/vuegg  &lt;br /&gt;
* Material Design&lt;br /&gt;
* eclipse IDE&lt;br /&gt;
* JAVA: Class.forName(&amp;lt;name&amp;gt;.class).newInstance();&lt;br /&gt;
&lt;br /&gt;
===Copia&amp;amp;incolla generale, da smistare in sotto capitoli. Contiene anche '''tutte''' note del telefono (al 22/02/2020)===&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 2:'''&lt;br /&gt;
&lt;br /&gt;
Gioco2: se ci si lancia da oggetti , dopo essersi arrampicati, possono esserci danni da caduta; strumenti come paracaduti o mosse magiche possono evitare i danni. Pozione del vento, soffi e devi attacchi. In difesa puoi parare, schivare, deviare: tre variabili? Ambiente: colline e pianure uguali, Monti sono Oggetti, picco ossia un unico monte oggetto. Rocce volanti, nuvole sospese: oggetto può essere sospeso e può fare periodicamente una mossa, ad es tuono, può spostarsi, può fare entra/esci, oggetto albero e oggetto foresta, si possono prendere, nascondersi, arrampicarsi, lanciarli, ostacolano velocità ma se si ha abbastanza forza si spezzano alberi. Acqua poco profonda, profonda, molto profonda: variabile boolean in Personaggio “alto” per toccare in acqua profonda, con acqua si generano fiumi laghi e mari. Ambiente si deve poter evolvere: ad esempio oggetto diga può fare metamorfosi e diventare oggetto cascata/torrente in piena. Per edifici più oggetti che rappresentano le mura e il tetto, variabile boolean per oggetto per entrare nell’oggetto. Possono essere spazzati via: danni da crollo, si può combattere all interni, contengono strumenti come tavoli sedie mobili letto ect. Se uno viene schiantato contro uno strumento prende danno(es danno da schianto). Ci possono essere scale, si può non avere contatti visivo sull’avversario. Oggetto mura, oggetto torre, oggetto casa interno sono cose distinte: possono dare malus/bonus su visibilità. Ambiente: pozzi e grotte, da gestire come interno casa. Lava come acqua, ogni oggetto può essere sorgenti di liquido: monte sorgente acqua, vulcano sorgente lava. Può esserci variabile probabilità eruzione, se settata a 1 c’è una continua eruzione. Strade di vario tipo, sovrapposta a altri suoli, migliorano velocità di alcuni strumenti, variabile boolean “ha le ruote” in classe strumenti. Unificare classe strumento e classe oggetto. Oggetti sospesi: case sospese su albero, ad es. Fiamme in mezzo al suolo. Oggetti: porto, aereoporto, grattacieli, dighe, impianti a fune, ospedali per curarsi e prendere oggetti per curarsi dopo, scuole contenenti libri per apprendere una mossa, luoghi di ingegneria per creare oggetti, ad esempio veicoli o armi, soldi nel gioco per comprare da eventuali venditori. Ogni oggetto avra un prezzo (valutabile circa in euro per semplicità). Variabile float per fame, sete, sonno, caldo-freddo (parte da 0.5). Nella mappa ci deve essere per ogni punto la temperatura. Possibilità di vomito, dissenteria, problemi cardiaci, respiratori, muscolari. Armi: balestra, mani nude, sasso, tirapugni, torcia accesa. Armature: intralciano o favoriscono agilità, attacco, poteri magici, rumorosa (elusione), è uno strumento/oggetto. Attacchi possono essere prolungati per turni, mosse variabile boolean prolungabile: può aumentare o diminuire intensità, c’è un max espresso in turni di prolungabilita, inoltre può essere leggermente alterato con una variabile casuale. Equipaggiamento (strumento/oggetto): pietra focaia, attrezzi da scalata, boccale di birra, cavallo, moto, chiodi, martello da fabbro, corda, corazza, dardo, faretra/zaino/sacca (oggetti che contengono una lista di oggetti, stringhe) con un numero per la quantità) e capacità massima zaino e ogni oggetto può avere un valore intero per dimensione (es martello 3, ascia grande 7), mantello, olio, variabile boolean prende fuoco/conduce elettricità, amplifica magnetismo, aumenta esplosioni nucleari, aumenta forza di gravità (?), pala, piccone, rampino, specchio, per osservare quando si è nascosti e si ha malus su visibilità. Strumenti da scasso per aprire porte: variabile boolean per oggetti: entrata con scasso. Personaggio: string razza per swag, immunità a veleni e malattie, elusione, agilità, precisione, abilità magiche(?), difesa fisica. In ultima torcia: agilità, coraggio, forza, intelligenza, magia, manualità, percezione, socialità. Bestiario: aracnoide di varie dimensioni, talpe giganti, vermi giganti di terra di mare e di lava ect, bulbo trascinatore che ha tentacoli per tirare a se e mangiare, lui è immobile, calabrone gigante, serpenti giganti, cinghiali, draghi, elfi, goblin e re goblin, sciamani (goblin), totem di guerra come strumento/oggetti per alterare statistiche nella loro area di influenza, lupo, mastino bruciante, nani, non morti/zombie/mummia/scheletro variabile boolean vivo a false ma ha ancora hp su parti del corpo: variabile boolean “zombizabile”. Orchi, pesci da terra (anfibi) tritone dell abisso, troll e trollin (orchi più deformi), umani. Abilità dei personaggi in ultima torcia: artificiale (robot) immunità a soffocamento, veleni, malattie ect immune a manipolazioni psichiche, visione oscurità; danno da attacco in carica; fiammegiante ossia la creatura può incendiarsi e elettrizzante ossia può diventare elettrica caricamente; modalità furia/mailmen ossia ottiene bonus su alcune/tutte le statistiche; gigantesco o molto piccolo due boolean (?forse non serve); immunità a magie mentali, al fuoco; linguaggi (?); non morto; danno da attacco in presa; pungiglioni velenosi; sa muoversi su ragnatele o è rallentato, resistenza a perforazione, respirare sott’acqua o sotto lava o nei liquidi in genere; rigenerazione; riceve danni dalla luce solare o da assenza di luce; è terrorizzato/impaurito/intimidito o se è imperturbabile boolean. Danno da trascinamento; paralizzante; può diventare più veloce (?non serve); visione a infrarossi attraverso oggetti; volare o andare sotto terra. Imperium editor, cose che penso di non aver ancora scritto: stagioni, suolo erboso o terriccio, sabbia con erba e terra e da sola, strade e stagioni, altitudine, alberi e arbusti, vari tipi a foglia larga, conifere, alberi secchi, palme, arbusti verdi e secchi, cactus, alghe marine, rocce e pietre, scheletri per terra, legna tagliata (alberi tagliati), carri e carretti, grotte e rovine per accessi sotterranei, locande, templi, accampamenti, fortini, monoliti, fontana, tombe e cimiteri, borse per terra, pozzo, troni, croci(del teschio), pozzo, capanne, lapidi, ponti, recinzioni, falò, tende, torri, panoplia, fessure come abissi, statue, rovine (deserto) come case distrutte, colonne per costruire templi, piramidi, sfingi, bandiere, rovine in Europa, campi coltivati che contengono cibo, fiamma (in altre), roccia in altre per montagne, altre-&amp;gt;rovine per monumenti non egiziani ma europei.&lt;br /&gt;
Ci sono paludi. Tende da campo. Forti, porti. Edifici delle fortezze, edifici dei villaggi. Naufragi e scogli.&lt;br /&gt;
Parametri voglia/impegno float per descrivere voglia di combattere Personaggio. Ricevi danno uscendo dalla mappa tra 1-5% tra 6-10% tra 11-15% della vita totale di ogni parte del corpo per ogni turno di gioco. Danno da precipitazione diverso da carica, uno verticale uno orizzontale, se precipiti da molto in alto hai bonus, oltre che danni da schianto lol. Baionette, formazione a blocchi, a quadrato (difensiva) sparano su quattro lati, a schiera vanno avanti. Usano un colpo poi lunga ricarica. Variabile boolean per attivare o meno fuoco amico. Azione per cambiare posizione: in piedi, in ginocchio(inteso come via di mezzo), sdraiato: per permettere migliore visibilità a chi è dietro (nella formazione).&lt;br /&gt;
Altruismo, coraggio, spingere oltre il limite, difendere al posto di un altro, migliorare posizione per avere bonus. Mosse da usare in condizioni psicologiche idonee: mosse estreme per disperazione, bonus unici. Condizioni per situazioni: blocco, spalle al muro, stritolato, confuso, semi parassiti addosso, azzoppato, bagnato d’acqua, lame affilate, corazza indurita, tante copie di me stesso attive, preveggente. Per ambiente:pioggia (torrenziale), barriera a cupola, punte metalliche a terra, blocco di fumo nero. Far volare un avversario/alleato. Tutti possono fare tutto sotto effetti magici o fisici. Un cavallo può volare se viene preso da un uccello e portato in alto.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 3, 4:'''&lt;br /&gt;
&lt;br /&gt;
Gioco1,2,3,4: tutto caricato su wikis.&lt;br /&gt;
&lt;br /&gt;
Gioco3: Mosse con caricamento + spostamento (es. kameamea con teletrasporto). Ciclo di interazione principale:crea o combatti. Modalità campagna, che chiede in input da che battaglia iniziare, ma implica tipi battaglie prefissati. Alla morte/sconfitta di un personaggio si possono alterare statistiche (es personaggio può cambiare fazione). Alcune mosse possono lasciare oggetti sul terreno: (ad es, radici di Groth). Ogni oggetto può alterare le statistiche al passaggio sopra, nelle vicinanze. Boolean invisibile per personaggio, diverso da elusione infinita. Se personaggio va in un altro dimensione -&amp;gt; unreachable. Attacco coordinato, se non lo fanno tutti vale lo stesso ma depotenziato opportunamente . Personaggio in modalità maniac (2 mosse per turno) e in modalità depressive (1 mossa ogni due turni); personaggio Flash può fare 10 mosse in un turno. Chiudi con lucchetto oggetto da dentro o da fuori, oggetto ingresso in oggetto casa , più ingressi per un singolo oggetto.nicole aniston. Rimbalzo se ci si schianta contro oggetto da calcolare con parametro. Ryuk e Darkrai.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gioco 4 23/07/2019:&lt;br /&gt;
Pula fiction, aracnidi, oggetto: due superfici rettangolari di forma diversa, anche inclinate , collegate. Più pezzi collegati tra loro per forme cilindriche cave, ad esempio, tipo vulcano. Mappa con sprite personaggi, canvas: anche mouseClick? Statistiche con nome gerarchico, es pokemon_attacco. Modalità survival, stile isola di jurassic park gdr; sia in coop che contro; possibilità di fare N turni di fila se non ci sono altri player giocanti nelle vicinanze (ciò però comporterebbe , in modalità contro , di capire quando c’è qualcuno nelle vicinanze perché si andrebbe di 1 turno alla volta, soluzioni: in mod contro 1 turno per volta oppure meccanismo di sincronizzazione turni quando uno vede l’altro (anche furtivo) come c’è attacco 1 turno a testa) .. analogo a Battle royale(?); inizio con starter kit random. Modalità assedio al castello. Inoltre se posso fare N turni di fila si può pensare a più pc , uno per persona , coordinati per fare comandi in parallelo, ma va ben congegnato meccanismo di sincronizzazione. Parti DelCorpo -&amp;gt; Componente/i oppure Parte. La mappa deve essere (x,y); l’altezza viene indicata onMouseOver certi pixel dove è posto il Personaggio; se personaggio dentro edificio/grotta cambio img (es sfocato/tratteggiato). Mosse: astrarre per target; molte mosse sono simili tra loro, somiglianza va sfruttata, hanno magari dei target in comune, o variano solo per un parametro. Creare mappa anche con drag and drop immagini ?(un po’ difficile). Più layout per interfaccia grafica (esempio uno che mostra errori input su text area, uno con alert, uno su box text area separato). Input comandi consumato pezzo per pezzo, alcune parole se prevedono parametri quando riconosciute fanno fetch anche di parola (numero) successiva. Face toon foto? Import parziali di personaggi (tutto tranne/solo questi campi specificati). Texture mappa complete o ripetibili (es per suolo). Anteprima battaglia stile battaglia pokemon (magari per 1/2/3 vs 1/2/3) per rappresentare scontro. Conviene usare xslx (excel) per dati, considerare che può non servire la libreria Java per leggere stringhe per operazioni. Mossa “again” , ripeti la precedenza(opportuna modifica parametri, es mossa spostamento). Possibile gestione contromosse: si usano marker (tag): ogni mossa ha elenco tag del tipo di contromosse che può subire (con probabilità annessa, che può dipendere da pg che subisce mossa congiuntamente a mossa stessa). Ogni mossa inoltre deve essere taggata come possibile contromossa che il pg può usare (per schivare può fare in più modi). A seconda del lancio del dado il pg che effettua La contromossa può anche scegliere tipologia di contromossa o solo la mossa della tipologia che ha beccato (entrano in gioco riflessi ect.). I parametri che fanno attivare unq o un’altra contromossa sono dinamici, posso dipendere ad esempio dalla posizione tra i due pg o altre statistiche. Tag contromosse a fasce (es. coprirsi è sempre più facile che schivare che e più facile di schivare e contrattaccare (?); all’interno dello stesso schivare e contrattaccare ci sono più sotto categorie). Per aggiunta personaggio può essere utili interfaccia dedicata, non linea di comando (o altre operazioni, specie se ci sono tabelle). Mossa “premonizione”: predire il futuro a breve termine, dici che mossa vorresti fare e ti dice esito (o più esiti se uno chiede più mosse). Funziona solo sulla prossima mossa. Contromossa delle contromossa gestione?? Eventualmente nell’esito si prevede ancore contro-contromossa. Ma si innesca reazione a catena, inoltre da gestire scelta contromossa in questo caso. Applicazione tag conoscenza(universo di appartenenza): “Termoli”, “pokemon”, “liceo classico Termoli”, anche gerarchici, per filtrare sui personaggi.target componibili , fattorizzato creazione mosse, hanno un costo magari per indicare quantovoccupano dicuna mossa, relativo maybe a un parametro o più del target stesso. In particolare, non saranno salvate le mosse per un personaggio (o solo alcune “preferite”) ma il suo insieme di target i quali devono dire:statistica che influenzano, “costo del turno” che richiedono al variare dell’intensità del target (che aumenta linearmente, esponenzialmente, generica f(x)) quindi corsa blanda costo 1 , Max corsa costo 5 (max), elenco (string) target incompatibili con tale target (se serve), nota relative ad es per quando uno vuole creare una mossa durante la battaglia (“target corsa, max sforzo dedicabile 4 ect” metti “50 metri corsa” “ok/troppo! Vuoi sforzati di più rischiando effetti collaterali?”). Si può autoscrivere la voce narrante del gioco come “la tua coscienza” mentre che giochi, d’altronde si interagisce con essa. Considerare che un target può appartenere a più personaggi, magari sotto nomi di mosse diversi.&lt;br /&gt;
Definire gerarchia di personaggi per template (tipo classe e super classe) e template importabili (tipo usa fuoco). Es umanoide non umanoide, tra umanoide maschio- femmina etc. Classe che estende System.out per creare funzioni che aggiungono Header “DEBUG:” etc; due programmi Java , due main: uno delegato a calcoli + gestione Excel; altro legge stdout dell altro per interfaccia grafica. Per allenare PG creare dei PG fantocci con label per fare Q-learning iniziale, più avanti far allenare pg tra loro; creare vari fantocci: tank terrestre fisico, healer volante etc. Excel: si usa css che si può rendere tabellare, più facile da trattare nel codice rispetto a .xslx. Ogni “utente” ed Lostefra ha il suo personale dizionario con sue personali short cut da usare in partita, eventuale login con password (opzionale) x accesso. Vedere license show down. Mappa unica stile giochi di ruolo, si vede tutto da sopra: click o simili su edifici/caverne per mappe interne a tale posto, così ok sprite e per rappresentare “pg in volo” sprite dedicato. Densità aria per dire quando anche un uomo per es può volare. Ipotesi più efficiente per dare un valore stima al pg: AI base che gioca a manetta contro altre AI base e dalle vittorie si fa l’euristica, più vittoria facile/veloce/stracciante più punti, contro vari pg, contro pg standard bench mark.&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Note&amp;diff=211</id>
		<title>Note</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Note&amp;diff=211"/>
		<updated>2020-08-12T12:12:17Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: gioco 1 finito&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Note ==&lt;br /&gt;
&lt;br /&gt;
'''Ultimare suddivisione'''&lt;br /&gt;
&lt;br /&gt;
===Linee guida sviluppo===&lt;br /&gt;
* File .txt di prontuario per la creazione del personaggio (stile akinator).Nel csv personaggi saranno salvati coppie &amp;lt;proprieta&amp;gt;=&amp;lt;valore&amp;gt;. Esempio: id=infernape,x=1,y=1, etc. Si potra fare template di altri personaggi con template=infernape, template=blastoise (se ovveride vale il più recente), spazi non ammessi nel csv per essere meno error prone.&lt;br /&gt;
* statistiche sono funzioni: sia valori costanti, sia dipendenti da altre statistiche (variabili).&lt;br /&gt;
&lt;br /&gt;
===Inspirational Concepts===&lt;br /&gt;
* Gioco Lotta (Pokémon, Pokkén)&lt;br /&gt;
* no caselle esplicite&lt;br /&gt;
* Descrizione rispetto a: ambiente, nemico, oggetti&lt;br /&gt;
* pokémon, DnD, Call of Duty, Super Smash Brawl, corse pazze&lt;br /&gt;
* concentrarsi su: fluidi, telecinesi, razze, bonus/malus, gradi di libertà (fisicamente parlando) &lt;br /&gt;
* scacchi (es. crea casella), shaolin showdown&lt;br /&gt;
* prevedere = creatività&lt;br /&gt;
* acqua, aria, fuoco, terra&lt;br /&gt;
* gravità (newton), verso alto, basso, destra, sinistra, circolare, tutti i versi&lt;br /&gt;
* jumanji, savana, animali, zoologia&lt;br /&gt;
* tempo/spazio&lt;br /&gt;
* BF4, pirati, roma (imperium civitas)&lt;br /&gt;
* musica come arma (rap)&lt;br /&gt;
* magia, prestigiatori&lt;br /&gt;
* dinosauri (documentario, libro, zoologia)&lt;br /&gt;
* draghi = dinosauri + ali + fuoco&lt;br /&gt;
* avengers, supereroi (libro)&lt;br /&gt;
* death note, nutrizionista&lt;br /&gt;
* yugioh (carta coperta)&lt;br /&gt;
* fortnite: costruire&lt;br /&gt;
* pacman, colash royale&lt;br /&gt;
* clash of clans, guitar hero&lt;br /&gt;
* sport (generico), (nome, cose, città -&amp;gt; geografia!, fiori)&lt;br /&gt;
* naruto, digimon&lt;br /&gt;
* no man's sky: procedurale, random (non setti un param? lasci al caso? setti tutto? te li sballo). Astronave, tuta spaziale, esplorazione, missione, indie&lt;br /&gt;
* animali e dinosauri dell'oceano&lt;br /&gt;
* rap devi fare freestyle e fare danni all'avversario&lt;br /&gt;
* super mario bros e mario kart&lt;br /&gt;
* elettronica: microcontrollori e arduino, codice&lt;br /&gt;
* Dragon Ball - Budokai Tenchaichi 3&lt;br /&gt;
* Harry potter&lt;br /&gt;
* [NO] minimappe (tieni a mano per ora, meno onere implementativo)&lt;br /&gt;
* Spore, labirinto&lt;br /&gt;
* Atomo, numero elettroni e densità circa sempre costanti; forza (Newton)&lt;br /&gt;
* obbligo, verità, giudizio, salvataggio&lt;br /&gt;
* Ben Ten =&amp;gt; orologio, crea PG e oggetto&lt;br /&gt;
* Kingdom Hearts, Super Smash Brawl&lt;br /&gt;
* Rambo, Rocky Balboa&lt;br /&gt;
* Tigri, coccodrillo (5-8m), animali, ippopotamo (ribalta barche)&lt;br /&gt;
* divinita egitto&lt;br /&gt;
* Battle bot:ribaltano, scintille, elementi (Oggetti) che danneggiano. &lt;br /&gt;
* One piece: I frutti del diavolo (悪魔の実 Akuma no mi?) sono frutti misteriosi che donano poteri soprannaturali a chi li mangia, rendendoli però incapaci di nuotare. Di conseguenza il contatto con l'acqua di mare o con una speciale sostanza conosciuta come agalmatolite indebolisce gli utilizzatori di frutti del diavolo e li priva dei loro poteri. Alcune persone sono inoltre in grado di ricorrere all'Ambizione (覇気 Haki?), una forza spirituale che permette di avvertire la presenza di altri esseri viventi e di predirne i movimenti, di irrobustire parti del corpo e di intimidire o fare svenire le creature con una debole forza di volontà. &lt;br /&gt;
* Wrestling per ispirarsi nella lotta libera: calci pugni ginocchiate prese lanci salti testate gomitate ecc. &lt;br /&gt;
* Imperium civitas. &lt;br /&gt;
* Attacco dei giganti. &lt;br /&gt;
* Jump force. Game dev tycoon. &lt;br /&gt;
* Piovra gigante. &lt;br /&gt;
&lt;br /&gt;
* Looney toons&lt;br /&gt;
* pokemon mystery dungeon (da googlare, escono vari siti con pdf e stats)&lt;br /&gt;
* question tool-for-combat-management: https://rpg.stackexchange.com/questions/171188/tool-for-combat-management&lt;br /&gt;
&lt;br /&gt;
===Personaggi (con statistiche e stati)===&lt;br /&gt;
* creabile runtime&lt;br /&gt;
* combattenti (con statistiche e stati)&lt;br /&gt;
* immagine rappresentativa per rappresentare meglio&lt;br /&gt;
* HP: colore rosso su immagine personaggio, dove sei debole/già colpito (idea scartata)&lt;br /&gt;
* penitenza: il malus può essere inteso come ciò che c'è nell'inserimento successivo, malus cumulativo&lt;br /&gt;
* essere ipocrita, finzione (schermo)&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (personaggi)&lt;br /&gt;
* metamorfosi&lt;br /&gt;
* alchimisti&lt;br /&gt;
* Parametri vitali: non respirare, arresto cardiaco, grasso (+/- caldo/freddo)&lt;br /&gt;
* Ossa, muscoli -&amp;gt; parti del corpo&lt;br /&gt;
* Organi (altri organi): apparato digerente (cibo, acqua (in vena, Fabri Fibra), espletamenti), sangue&lt;br /&gt;
* Da wikipedia: pressione arteriosa, frequenza cardiaca (polso), frequenza respiratoria, temperatura corporea, ossigenazione sanguigna, colorito della cute, dolore.&lt;br /&gt;
* Stato di coscienza: coma, non cosciente, sonnambulo, sonnolento, confuso, vigile, orientato, consapevole&lt;br /&gt;
* Morte = game_over&lt;br /&gt;
* Stats personaggi senza bound, ma consigliati dei range (0-100 / 1.000 / 10.000)&lt;br /&gt;
* (?) il personaggio non è necessariamente nella mappa, anche fuori indistintamente lontano, non si rappresenta ma compie azioni e puo' essere attaccato (no mosse fuori da mappa)&lt;br /&gt;
* possibilità giù in terra/ giù in acqua, con reachable e unreachable Boolean. Fuori da mappa anche reachable e unreachable.&lt;br /&gt;
* Personaggi composti di parti[] es. testa, busto, gambe, braccia, coda, pinna, ali. Distinzione per arto di movimento e/o spostamento boolean.&lt;br /&gt;
* Arti possono provocare danno, bruciatura , paralisi a contatto (Boolean) . Percentuale di probabilità accompagna ogni Boolean.&lt;br /&gt;
* Ogni parte del corpo punti vita + se inutilizzabile + amputata + stato (es paralisi).&lt;br /&gt;
* Per fare battaglie tra molto grandi =&amp;gt; 1 m lo si intende come 10m.  (rivalutato, aumentare livello scaling)&lt;br /&gt;
* Personaggio fusionabile Boolean + string nomi con cui si fonde.&lt;br /&gt;
* Distinzione tra infernape e infernape1/2/3 ect tra “specie” e “nome”.&lt;br /&gt;
* variabile Boolean respawnable.&lt;br /&gt;
* Raccogliere a piene mani da: https://spore.fandom.com/wiki/Creature_Editor&lt;br /&gt;
* Ad esempio weapons come elemento di Corpo (zanne, corna) e possibilità di muoversi/attaccare furtivamente.&lt;br /&gt;
* Divisibile e unibile come boolean e array di stringe associate per indicare i nomi con cui si unisce il Personaggio o in cui si divide, meglio come mossa.&lt;br /&gt;
* Variabili posizione nome: from_x/y ; to_x/y.&lt;br /&gt;
* Classe Stato, Personaggio contiene Array di stato, stato contiene moltiplicatori per statistica es attacco velocità precisione elusione ect.&lt;br /&gt;
* Personaggio deve avere una stat tipo sanità mentale, intelligenza, quanto è confuso e quanto è impaurito (2).&lt;br /&gt;
* le statistiche possono variare leggermente in un turno con una certa media e varianza (se media 0 oscillano randomicamente)&lt;br /&gt;
* Personaggio ha funzione baricentro_x, baricentro_y calcolate come (from_x+to_x)/2 sul quale si basa la funzione di libreria getDistance(Personaggio A, Personaggio B, float success); tale funzione serve per calcolare per i PNG e per i PG se ha senso usare una mossa. &lt;br /&gt;
* Non-onniscienza: delle volte non si può sapere distanza avversario e fallisce la mossa per la distanza -&amp;gt; “float success” rappresenta la probabilità di successo (Personaggio ha parametro “osservare”). &lt;br /&gt;
* PNG di due categorie: offensivi o neutrali (no priorità a mosse di attacco, ma tutto casuale). &lt;br /&gt;
* Mosse e oggetti per chiamare Personaggi, magari non necessariamente alleati (2 mosse e 2 oggetti quindi necessari), richiamo di un personaggio preciso o di uno a caso. &lt;br /&gt;
* Possono attivare una metamorfosi / Unione per cambiare stats personaggio. &lt;br /&gt;
* Possibilità di morire se colpiti in un unico punto (tallone d Achille) implementabile come variabile boolean. &lt;br /&gt;
* Variabile int per attacco cumulativo di gruppo: es calciatori che più si passano la palla più l’attacco è forte. &lt;br /&gt;
* Funzione esci/entra in classe Personaggio per simulare scambio pokemon 6vs6. &lt;br /&gt;
* Personaggio si può svestire e lasciare strumenti, modificano statistiche di attacco, difesa , agilità, ect.&lt;br /&gt;
&lt;br /&gt;
* Per personaggi molto piccoli (meno di 1m x 1m x 1m) possibilità di essere in (x,y,z) tra 0 e 1.000.000 (ordine del micrometro, 1*10^-6 == 0,000001) e avere (lenX, lenY, lenZ). In questo modo sono definite dimensioni inferiori ad 1 m^3.&lt;br /&gt;
* personaggi max 20x20 (rivaluato, meno limitata)&lt;br /&gt;
&lt;br /&gt;
===Mosse===&lt;br /&gt;
* mossa ha parametri fissi e modificabili (ad es. mossa &amp;quot;fusione&amp;quot; specifica o meno con chi o caratteristiche minime per soddisfare, es. ha orecchino come vegeku)&lt;br /&gt;
* &amp;quot;combattimento prescinde da combattente&amp;quot;&lt;br /&gt;
* mosse hanno: direzione, azione, attacco (mosse pokémon)&lt;br /&gt;
* Parametri interi per mossa (direzione, consumabili) con lower e upper bound&lt;br /&gt;
* camuffarsi =&amp;gt; DnD manuale&lt;br /&gt;
* wrestling (libro) per le mosse/prese&lt;br /&gt;
* Mosse che trasformano l’avversario: attenzione è una mossa devastante. Altera statistiche/stato. Trasformazione totale o parziale. &lt;br /&gt;
* Si devono poter aggiungere mosse, strumenti dinamicamente. &lt;br /&gt;
* Ogni mossa/azione deve avere un tempo di attesa espresso in turni (alla meglio 0) per poter ripetere la mossa/azione. &lt;br /&gt;
* Rischio=danno*probabilita.&lt;br /&gt;
* Mossa su strumento e con strumento?&lt;br /&gt;
* Mosse fisiche per arrampicarsi su avversario(se e solo se sei la metà di dimensioni(?)), atterrarlo, lanciarlo, accecarlo, immobilizzarlo. Se sei in gruppo/ orda bonus ad attacchi combinati. Variabile &amp;quot;posizione&amp;quot; di chi si è arrampicato ora è dipendente (bind) da variabile dell'altro.&lt;br /&gt;
* Tipo della mossa con moltiplicatore tra 0 (immune) e 2 (float): acqua, fuoco, magia, terra: da ispirarsi ai pokemon ma non da copiare, penso. &lt;br /&gt;
&lt;br /&gt;
* X fa una mossa contro Y: Z potrebbe reagire (Es. ricevendo il colpo al posto di Y). Può essere realizzato sia come se &amp;quot;Y chiede soccorso Z&amp;quot; o come reazione di alleati adiacenti &amp;quot;Z soccorre Y&amp;quot;&lt;br /&gt;
* Mossa prende come parametro di ingresso Corpo, ossia la parte del corpo coinvolta nella mossa (es arto , tutto corpo ect). &lt;br /&gt;
* algoritmo per simulare percezione: per ogni punto oggetto da vedere, si calcola diff_x, diff_y, e diff_z con punto sensibilita di colui che percepisce. Si avanza per far ridurre le diff a 0: se (diff_x, diff_y, e diff_z) = (30,20,10) allora ci si muove 3 volte su asse x, 2 su y, 1 su z.&lt;br /&gt;
&lt;br /&gt;
===Oggetto (con statistiche e stati)===&lt;br /&gt;
* creabile runtime&lt;br /&gt;
* armi: lacci (stati), lame (potenze), sassi, reti, pistole (munizioni), razzi, bombe (potenze), fuoco (d'artificio?) =&amp;gt; manuale DnD&lt;br /&gt;
* veleno n modi =&amp;gt; DnD manuale&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (oggetti)&lt;br /&gt;
* automezzi con cannoni, variabile 'hasEntrata', 'tempoRiutilizzo'&lt;br /&gt;
* violino come arma (tutti strumenti musicali): a fiato, a corda, a percussione&lt;br /&gt;
* veleni, ampolle e flaconi magici, insieme di 'oggetti dentro' un oggetto&lt;br /&gt;
* cassaforti (senza/con) chiave, isSigillato, oggetti aprono&lt;br /&gt;
* oggetto riparo, crea&lt;br /&gt;
* Strumenti anche mezzi di trasporto di aria, di terra, di acqua (o lava/palude). &lt;br /&gt;
* Veicoli con armi o riparo. &lt;br /&gt;
* Gli strumenti da trattare come gli oggetti. Classe unica. &lt;br /&gt;
* Acqua diventa tsunami. &lt;br /&gt;
* Armi: fruste e scheggie, corni che si suonano per chiamare altri. &lt;br /&gt;
* Armi da campo: cannoni e catapulte.&lt;br /&gt;
* Veicoli d’acqua: moto acqua, canoe, barche a motore a remi.&lt;br /&gt;
* Nei veicoli malus su attenzione (variabile int in personaggio, indica attenzione in combattimento e non in altro) perché si è impegnato alla guida. &lt;br /&gt;
* Classe oggetto: es albero, roccia, casa: forza necessaria per sradicare + forza per lanciare + destrezza / agilità per appendersi + nascondersi in proporzione alle dimensioni di chi si nasconde. &lt;br /&gt;
* Altri es. pali. Sotto terra o sotto acqua/lava/melma o simili. &lt;br /&gt;
* Acqua rallenta se non hai pinne boolean.&lt;br /&gt;
* Classe strumento per oggetti che si tengono in mano, es reti , pistole, spade, pugnali, scudi, elmi, lancia, arco , frecce, lanciarazzi, fucili cecchino, fucile assalto, corde.&lt;br /&gt;
* Strumenti e mosse: danno ad area, perforante, contundente (vedi dnd armi). Mosse possono creare/modificare/distruggere oggetti e strumenti.&lt;br /&gt;
* Oggetti del campo di gioco incidono su elusione (parametro di personaggio).&lt;br /&gt;
* Buco/abisso (boolean) per dire se c’è o meno il suolo (Suolo come classe?). &lt;br /&gt;
* Radiazioni. &lt;br /&gt;
&lt;br /&gt;
===Modalità gioco===&lt;br /&gt;
* turnazione&lt;br /&gt;
* 1 v 1 v 1 etc., ma anche squadre casuali&lt;br /&gt;
* punteggio: chi fa più punti, più uccisioni, definizione di 'punto', gioco per perdere&lt;br /&gt;
* inserisci personaggio total random&lt;br /&gt;
* I match/partite (immagino Classe Partita) devono avere variabile boolean “respawn”, per distinguere death match a punti con death match con una vita.&lt;br /&gt;
* Condizione vittoria (oltre a morte, punti, o numero mosse, cioè tempo) morte di un singolo Personaggio, che potrebbe rappresentare un edificio, cassaforte o simili. &lt;br /&gt;
&lt;br /&gt;
* Modalità battaglia con interazione stile battaglia navale (non si vede mossa dell'avversario)&lt;br /&gt;
* Modalità di gioco: tutti contro tutti (battle royale), death match, vs CPU mode zombie(attaccano solo, se non possono vanno verso nemico): serve introdurre un punteggio, di sicuro per mode zombie , ma anche per death match e tutti contro tutti&lt;br /&gt;
* ingressi: ne entra un altro?&lt;br /&gt;
* Per punti si vince a un limite o dopo un tot di mosse , oppure al primo dei due raggiunti (max_punti e max_mosse parametri di Partita).&lt;br /&gt;
* I punti si guadagnano alla kill (un Punteggio per squadra, int punteggio salvato localmente dentro ogni Personaggio che ha la variabile int squadra). &lt;br /&gt;
* Si guadagnano tanti punti quanti sono i punti della variabile “valore” del personaggio ucciso, tale variabile è calcolata come somma dei valori di tutte le mosse/stats ect del Personaggio. &lt;br /&gt;
&lt;br /&gt;
===Mappa===&lt;br /&gt;
* arene NxN metri, 1.000mX1.000m, arena creata casella per casella (NxN aree in un arena)&lt;br /&gt;
* Area: montagnE (agilità, arrampicarsi, appendersi), collina, montagnA, mare (campo 'isLiquido'), lago, spiaggia, deserto, lava, grotta, labirinto (cava, percorso in roccia), metropoli, città, campagna, foresta, fiume, stadio, isola, ghiacciaio, vulcano, cascata.&lt;br /&gt;
* immagine arena a mano, poi inserita nel gioco &lt;br /&gt;
* minimappa (pixelata ?), legenda oggetti base, devono esserci caselle implicite&lt;br /&gt;
* mappa 100x100 (rivalutato, meno limitata)&lt;br /&gt;
* Cannoni fissi in mezzo al campo (strumento).&lt;br /&gt;
* serve che la fisica il 90% sia guidata da regole vere&lt;br /&gt;
* i pianeti sono sempre sferici, per forza di gravità, atmosfera, se piccoli e irregolari =&amp;gt; no atmosfera&lt;br /&gt;
* temperatura: vicinanza dal sole. &lt;br /&gt;
* manca ossigeno? =&amp;gt; campo &amp;quot;respirabile&amp;quot;, le condizioni che consentono la vita possono cambiare, anche per via del fuoco&lt;br /&gt;
* Mappe dinamiche: il pianeta si scalda e diventa una stella, si raffredda e diventa impossibile muoversi&lt;br /&gt;
* Suolo magico: non tutti i personaggi possono accedervi, array di string elenca i nomi di chi può accedervi. &lt;br /&gt;
* Variabile luce o non luce, che peggiora/migliora a seconda della specie la visibilità, quindi la precisione, specie in attacchi a distanza: Scurovisione evita i malus.&lt;br /&gt;
&lt;br /&gt;
===Funzionalità generali===&lt;br /&gt;
* Stato partita: battaglia in corso, creazione in corso (forse questa esterna al gioco?), etc.&lt;br /&gt;
* ciclo interazione: evento input, lettura input, aggiornamento stato, stampa su board in append (non si nasconde nulla), attesa evento input&lt;br /&gt;
* [NO] Chiave: non una flat input box per i comandi; ma dinamica: si suppone il soggetto &amp;quot;io&amp;quot; (le azioni le fanno in prima persona i personaggi), ogni mossa deve prevedere dei complementi (&amp;quot;verso&amp;quot;, &amp;quot;tra quanto&amp;quot;, &amp;quot;cosa&amp;quot;, &amp;quot;a favore di chi&amp;quot;, &amp;quot;contro chi&amp;quot;). Ogni complemento collegato con box stile in pop up =&amp;gt; bootstrap (la grafica sara unica). &lt;br /&gt;
* [SI] Prevedere anche modalita flat con input del tipo &amp;quot;azione a=pippo verso=termoli&amp;quot; (regex check)&lt;br /&gt;
* menu' interazione per scelta regole battaglia e scelta personaggi&lt;br /&gt;
* &amp;quot;meno tabelle&amp;quot;, &amp;quot;no bottoni&amp;quot; e solo foto che si alternano, &amp;quot;la grafica serve&amp;quot;: text box unica interazione, text area (history), immagine personaggio e immagine mappa&lt;br /&gt;
* niente minimappa, meno problemi, interrogazione per info percezione sensoriale e orientamento (N-S-E-O), schema a mano&lt;br /&gt;
* &amp;quot;persistenza anche da interfaccia grafica&amp;quot;, diritti di scrittura sui file?&lt;br /&gt;
* Segnalazione (comando per fare nota)&lt;br /&gt;
* Modellare statistiche con funzioni probabilistiche (Gaussiane, esponenziali, uniformi, etc.) con relativa media e varianza piuttosto che individuare fasce/scaglionamenti (meno realistici e meno belli)&lt;br /&gt;
* comando 'clear' aggiunge tanti new line alla textarea quante sono le righe renderizzate.&lt;br /&gt;
* comando 'remember/help &amp;lt;mossa&amp;gt;' per stampare i complementi, obbligatori e opzionali, richiesti da una mossa&lt;br /&gt;
&lt;br /&gt;
===Deploy===&lt;br /&gt;
* &amp;quot;commenta il codice&amp;quot;, &amp;quot;dividi et impera&amp;quot;&lt;br /&gt;
* Server web (Apache) ospita partite (+ localmente ha i file di funzionamento), in LAN client giocano o da remoto con IP pubblico. Interfaccia HTML5 + Javascript per giocare. Studiare engine grafici Javascript&lt;br /&gt;
* bootstrap! (specie per input box)&lt;br /&gt;
* https://bit.dev/ per molti componenti web&lt;br /&gt;
* React, React Native .. forse meglio di Vue per diffusione&lt;br /&gt;
* Unity, WebGL (vedi SDK dedicata, built per Android/iOS/etc.)&lt;br /&gt;
* Modelli 3D videogiochi: https://www.models-resource.com/ , meglio se disaccoppiati da Unity (e.g. in cartelle independenti), aggiunta modelli online&lt;br /&gt;
* creare modelli: blender. creare disegni: krita&lt;br /&gt;
* Tutorial tank Unity: https://learn.unity.com/project/tanks-tutorial ; modelli: https://opengameart.org/&lt;br /&gt;
* WebSocket per gestire client asincroni (NodeJS ?)&lt;br /&gt;
* Su YT in “guarda più tardi” video per interagire unity con JS (“unity.sendMessage()” o simili)&lt;br /&gt;
* Due client: uno con WebGL e uno JS base con solo input (per test, per mancanza di supporto browser a WebGL). Eventualmente 3 client: 1 base (JS puro con qualche immagine al più), 1 WebGL+Unity 2D (grafica pixelata), 1 WebGL+Unity 3D (informazioni di input per mirare, ad es., in base a dove punto nello schermo. Qualcosa di simile anche per 2D). Tutti i client stessi JSON per comunicare al server!&lt;br /&gt;
* photogrammetry, https://medium.com/realities-io/getting-started-with-photogrammetry-d0a6ee40cb72&lt;br /&gt;
* roll20.net .. c'è '''davvero''' molto&lt;br /&gt;
* readthedocs.org&lt;br /&gt;
* css dinamici: sass, https://zurb.com/playground/motion-ui (zurb)&lt;br /&gt;
* progressive web apps: offline with server works. https://it.wikipedia.org/wiki/Progressive_Web_App ; responsive web design&lt;br /&gt;
* https://www.youtube.com/watch?v=CGz-h-DzJDU e relativi link, https://essentialsdocs.fandom.com/wiki/Attack_animations , (google: pokemon move animation editor/sprite)&lt;br /&gt;
&lt;br /&gt;
==== Altro (scartato)====&lt;br /&gt;
* rpgmaker, godot, aseprite, pixelart (in generale), ma anche phaser, piskel&lt;br /&gt;
* joomla! Per far prima con html&lt;br /&gt;
* libreria pygame&lt;br /&gt;
* Vuegg: https://github.com/marketplace/vuegg  &lt;br /&gt;
* Material Design&lt;br /&gt;
* eclipse IDE&lt;br /&gt;
* JAVA: Class.forName(&amp;lt;name&amp;gt;.class).newInstance();&lt;br /&gt;
&lt;br /&gt;
===Copia&amp;amp;incolla generale, da smistare in sotto capitoli. Contiene anche '''tutte''' note del telefono (al 22/02/2020)===&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 2:'''&lt;br /&gt;
&lt;br /&gt;
Gioco2: se ci si lancia da oggetti , dopo essersi arrampicati, possono esserci danni da caduta; strumenti come paracaduti o mosse magiche possono evitare i danni. Pozione del vento, soffi e devi attacchi. In difesa puoi parare, schivare, deviare: tre variabili? Ambiente: colline e pianure uguali, Monti sono Oggetti, picco ossia un unico monte oggetto. Rocce volanti, nuvole sospese: oggetto può essere sospeso e può fare periodicamente una mossa, ad es tuono, può spostarsi, può fare entra/esci, oggetto albero e oggetto foresta, si possono prendere, nascondersi, arrampicarsi, lanciarli, ostacolano velocità ma se si ha abbastanza forza si spezzano alberi. Acqua poco profonda, profonda, molto profonda: variabile boolean in Personaggio “alto” per toccare in acqua profonda, con acqua si generano fiumi laghi e mari. Ambiente si deve poter evolvere: ad esempio oggetto diga può fare metamorfosi e diventare oggetto cascata/torrente in piena. Per edifici più oggetti che rappresentano le mura e il tetto, variabile boolean per oggetto per entrare nell’oggetto. Possono essere spazzati via: danni da crollo, si può combattere all interni, contengono strumenti come tavoli sedie mobili letto ect. Se uno viene schiantato contro uno strumento prende danno(es danno da schianto). Ci possono essere scale, si può non avere contatti visivo sull’avversario. Oggetto mura, oggetto torre, oggetto casa interno sono cose distinte: possono dare malus/bonus su visibilità. Ambiente: pozzi e grotte, da gestire come interno casa. Lava come acqua, ogni oggetto può essere sorgenti di liquido: monte sorgente acqua, vulcano sorgente lava. Può esserci variabile probabilità eruzione, se settata a 1 c’è una continua eruzione. Strade di vario tipo, sovrapposta a altri suoli, migliorano velocità di alcuni strumenti, variabile boolean “ha le ruote” in classe strumenti. Unificare classe strumento e classe oggetto. Oggetti sospesi: case sospese su albero, ad es. Fiamme in mezzo al suolo. Oggetti: porto, aereoporto, grattacieli, dighe, impianti a fune, ospedali per curarsi e prendere oggetti per curarsi dopo, scuole contenenti libri per apprendere una mossa, luoghi di ingegneria per creare oggetti, ad esempio veicoli o armi, soldi nel gioco per comprare da eventuali venditori. Ogni oggetto avra un prezzo (valutabile circa in euro per semplicità). Variabile float per fame, sete, sonno, caldo-freddo (parte da 0.5). Nella mappa ci deve essere per ogni punto la temperatura. Possibilità di vomito, dissenteria, problemi cardiaci, respiratori, muscolari. Armi: balestra, mani nude, sasso, tirapugni, torcia accesa. Armature: intralciano o favoriscono agilità, attacco, poteri magici, rumorosa (elusione), è uno strumento/oggetto. Attacchi possono essere prolungati per turni, mosse variabile boolean prolungabile: può aumentare o diminuire intensità, c’è un max espresso in turni di prolungabilita, inoltre può essere leggermente alterato con una variabile casuale. Equipaggiamento (strumento/oggetto): pietra focaia, attrezzi da scalata, boccale di birra, cavallo, moto, chiodi, martello da fabbro, corda, corazza, dardo, faretra/zaino/sacca (oggetti che contengono una lista di oggetti, stringhe) con un numero per la quantità) e capacità massima zaino e ogni oggetto può avere un valore intero per dimensione (es martello 3, ascia grande 7), mantello, olio, variabile boolean prende fuoco/conduce elettricità, amplifica magnetismo, aumenta esplosioni nucleari, aumenta forza di gravità (?), pala, piccone, rampino, specchio, per osservare quando si è nascosti e si ha malus su visibilità. Strumenti da scasso per aprire porte: variabile boolean per oggetti: entrata con scasso. Personaggio: string razza per swag, immunità a veleni e malattie, elusione, agilità, precisione, abilità magiche(?), difesa fisica. In ultima torcia: agilità, coraggio, forza, intelligenza, magia, manualità, percezione, socialità. Bestiario: aracnoide di varie dimensioni, talpe giganti, vermi giganti di terra di mare e di lava ect, bulbo trascinatore che ha tentacoli per tirare a se e mangiare, lui è immobile, calabrone gigante, serpenti giganti, cinghiali, draghi, elfi, goblin e re goblin, sciamani (goblin), totem di guerra come strumento/oggetti per alterare statistiche nella loro area di influenza, lupo, mastino bruciante, nani, non morti/zombie/mummia/scheletro variabile boolean vivo a false ma ha ancora hp su parti del corpo: variabile boolean “zombizabile”. Orchi, pesci da terra (anfibi) tritone dell abisso, troll e trollin (orchi più deformi), umani. Abilità dei personaggi in ultima torcia: artificiale (robot) immunità a soffocamento, veleni, malattie ect immune a manipolazioni psichiche, visione oscurità; danno da attacco in carica; fiammegiante ossia la creatura può incendiarsi e elettrizzante ossia può diventare elettrica caricamente; modalità furia/mailmen ossia ottiene bonus su alcune/tutte le statistiche; gigantesco o molto piccolo due boolean (?forse non serve); immunità a magie mentali, al fuoco; linguaggi (?); non morto; danno da attacco in presa; pungiglioni velenosi; sa muoversi su ragnatele o è rallentato, resistenza a perforazione, respirare sott’acqua o sotto lava o nei liquidi in genere; rigenerazione; riceve danni dalla luce solare o da assenza di luce; è terrorizzato/impaurito/intimidito o se è imperturbabile boolean. Danno da trascinamento; paralizzante; può diventare più veloce (?non serve); visione a infrarossi attraverso oggetti; volare o andare sotto terra. Imperium editor, cose che penso di non aver ancora scritto: stagioni, suolo erboso o terriccio, sabbia con erba e terra e da sola, strade e stagioni, altitudine, alberi e arbusti, vari tipi a foglia larga, conifere, alberi secchi, palme, arbusti verdi e secchi, cactus, alghe marine, rocce e pietre, scheletri per terra, legna tagliata (alberi tagliati), carri e carretti, grotte e rovine per accessi sotterranei, locande, templi, accampamenti, fortini, monoliti, fontana, tombe e cimiteri, borse per terra, pozzo, troni, croci(del teschio), pozzo, capanne, lapidi, ponti, recinzioni, falò, tende, torri, panoplia, fessure come abissi, statue, rovine (deserto) come case distrutte, colonne per costruire templi, piramidi, sfingi, bandiere, rovine in Europa, campi coltivati che contengono cibo, fiamma (in altre), roccia in altre per montagne, altre-&amp;gt;rovine per monumenti non egiziani ma europei.&lt;br /&gt;
Ci sono paludi. Tende da campo. Forti, porti. Edifici delle fortezze, edifici dei villaggi. Naufragi e scogli.&lt;br /&gt;
Parametri voglia/impegno float per descrivere voglia di combattere Personaggio. Ricevi danno uscendo dalla mappa tra 1-5% tra 6-10% tra 11-15% della vita totale di ogni parte del corpo per ogni turno di gioco. Danno da precipitazione diverso da carica, uno verticale uno orizzontale, se precipiti da molto in alto hai bonus, oltre che danni da schianto lol. Baionette, formazione a blocchi, a quadrato (difensiva) sparano su quattro lati, a schiera vanno avanti. Usano un colpo poi lunga ricarica. Variabile boolean per attivare o meno fuoco amico. Azione per cambiare posizione: in piedi, in ginocchio(inteso come via di mezzo), sdraiato: per permettere migliore visibilità a chi è dietro (nella formazione).&lt;br /&gt;
Altruismo, coraggio, spingere oltre il limite, difendere al posto di un altro, migliorare posizione per avere bonus. Mosse da usare in condizioni psicologiche idonee: mosse estreme per disperazione, bonus unici. Condizioni per situazioni: blocco, spalle al muro, stritolato, confuso, semi parassiti addosso, azzoppato, bagnato d’acqua, lame affilate, corazza indurita, tante copie di me stesso attive, preveggente. Per ambiente:pioggia (torrenziale), barriera a cupola, punte metalliche a terra, blocco di fumo nero. Far volare un avversario/alleato. Tutti possono fare tutto sotto effetti magici o fisici. Un cavallo può volare se viene preso da un uccello e portato in alto.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 3, 4:'''&lt;br /&gt;
&lt;br /&gt;
Gioco1,2,3,4: tutto caricato su wikis.&lt;br /&gt;
&lt;br /&gt;
Gioco3: Mosse con caricamento + spostamento (es. kameamea con teletrasporto). Ciclo di interazione principale:crea o combatti. Modalità campagna, che chiede in input da che battaglia iniziare, ma implica tipi battaglie prefissati. Alla morte/sconfitta di un personaggio si possono alterare statistiche (es personaggio può cambiare fazione). Alcune mosse possono lasciare oggetti sul terreno: (ad es, radici di Groth). Ogni oggetto può alterare le statistiche al passaggio sopra, nelle vicinanze. Boolean invisibile per personaggio, diverso da elusione infinita. Se personaggio va in un altro dimensione -&amp;gt; unreachable. Attacco coordinato, se non lo fanno tutti vale lo stesso ma depotenziato opportunamente . Personaggio in modalità maniac (2 mosse per turno) e in modalità depressive (1 mossa ogni due turni); personaggio Flash può fare 10 mosse in un turno. Chiudi con lucchetto oggetto da dentro o da fuori, oggetto ingresso in oggetto casa , più ingressi per un singolo oggetto.nicole aniston. Rimbalzo se ci si schianta contro oggetto da calcolare con parametro. Ryuk e Darkrai.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gioco 4 23/07/2019:&lt;br /&gt;
Pula fiction, aracnidi, oggetto: due superfici rettangolari di forma diversa, anche inclinate , collegate. Più pezzi collegati tra loro per forme cilindriche cave, ad esempio, tipo vulcano. Mappa con sprite personaggi, canvas: anche mouseClick? Statistiche con nome gerarchico, es pokemon_attacco. Modalità survival, stile isola di jurassic park gdr; sia in coop che contro; possibilità di fare N turni di fila se non ci sono altri player giocanti nelle vicinanze (ciò però comporterebbe , in modalità contro , di capire quando c’è qualcuno nelle vicinanze perché si andrebbe di 1 turno alla volta, soluzioni: in mod contro 1 turno per volta oppure meccanismo di sincronizzazione turni quando uno vede l’altro (anche furtivo) come c’è attacco 1 turno a testa) .. analogo a Battle royale(?); inizio con starter kit random. Modalità assedio al castello. Inoltre se posso fare N turni di fila si può pensare a più pc , uno per persona , coordinati per fare comandi in parallelo, ma va ben congegnato meccanismo di sincronizzazione. Parti DelCorpo -&amp;gt; Componente/i oppure Parte. La mappa deve essere (x,y); l’altezza viene indicata onMouseOver certi pixel dove è posto il Personaggio; se personaggio dentro edificio/grotta cambio img (es sfocato/tratteggiato). Mosse: astrarre per target; molte mosse sono simili tra loro, somiglianza va sfruttata, hanno magari dei target in comune, o variano solo per un parametro. Creare mappa anche con drag and drop immagini ?(un po’ difficile). Più layout per interfaccia grafica (esempio uno che mostra errori input su text area, uno con alert, uno su box text area separato). Input comandi consumato pezzo per pezzo, alcune parole se prevedono parametri quando riconosciute fanno fetch anche di parola (numero) successiva. Face toon foto? Import parziali di personaggi (tutto tranne/solo questi campi specificati). Texture mappa complete o ripetibili (es per suolo). Anteprima battaglia stile battaglia pokemon (magari per 1/2/3 vs 1/2/3) per rappresentare scontro. Conviene usare xslx (excel) per dati, considerare che può non servire la libreria Java per leggere stringhe per operazioni. Mossa “again” , ripeti la precedenza(opportuna modifica parametri, es mossa spostamento). Possibile gestione contromosse: si usano marker (tag): ogni mossa ha elenco tag del tipo di contromosse che può subire (con probabilità annessa, che può dipendere da pg che subisce mossa congiuntamente a mossa stessa). Ogni mossa inoltre deve essere taggata come possibile contromossa che il pg può usare (per schivare può fare in più modi). A seconda del lancio del dado il pg che effettua La contromossa può anche scegliere tipologia di contromossa o solo la mossa della tipologia che ha beccato (entrano in gioco riflessi ect.). I parametri che fanno attivare unq o un’altra contromossa sono dinamici, posso dipendere ad esempio dalla posizione tra i due pg o altre statistiche. Tag contromosse a fasce (es. coprirsi è sempre più facile che schivare che e più facile di schivare e contrattaccare (?); all’interno dello stesso schivare e contrattaccare ci sono più sotto categorie). Per aggiunta personaggio può essere utili interfaccia dedicata, non linea di comando (o altre operazioni, specie se ci sono tabelle). Mossa “premonizione”: predire il futuro a breve termine, dici che mossa vorresti fare e ti dice esito (o più esiti se uno chiede più mosse). Funziona solo sulla prossima mossa. Contromossa delle contromossa gestione?? Eventualmente nell’esito si prevede ancore contro-contromossa. Ma si innesca reazione a catena, inoltre da gestire scelta contromossa in questo caso. Applicazione tag conoscenza(universo di appartenenza): “Termoli”, “pokemon”, “liceo classico Termoli”, anche gerarchici, per filtrare sui personaggi.target componibili , fattorizzato creazione mosse, hanno un costo magari per indicare quantovoccupano dicuna mossa, relativo maybe a un parametro o più del target stesso. In particolare, non saranno salvate le mosse per un personaggio (o solo alcune “preferite”) ma il suo insieme di target i quali devono dire:statistica che influenzano, “costo del turno” che richiedono al variare dell’intensità del target (che aumenta linearmente, esponenzialmente, generica f(x)) quindi corsa blanda costo 1 , Max corsa costo 5 (max), elenco (string) target incompatibili con tale target (se serve), nota relative ad es per quando uno vuole creare una mossa durante la battaglia (“target corsa, max sforzo dedicabile 4 ect” metti “50 metri corsa” “ok/troppo! Vuoi sforzati di più rischiando effetti collaterali?”). Si può autoscrivere la voce narrante del gioco come “la tua coscienza” mentre che giochi, d’altronde si interagisce con essa. Considerare che un target può appartenere a più personaggi, magari sotto nomi di mosse diversi.&lt;br /&gt;
Definire gerarchia di personaggi per template (tipo classe e super classe) e template importabili (tipo usa fuoco). Es umanoide non umanoide, tra umanoide maschio- femmina etc. Classe che estende System.out per creare funzioni che aggiungono Header “DEBUG:” etc; due programmi Java , due main: uno delegato a calcoli + gestione Excel; altro legge stdout dell altro per interfaccia grafica. Per allenare PG creare dei PG fantocci con label per fare Q-learning iniziale, più avanti far allenare pg tra loro; creare vari fantocci: tank terrestre fisico, healer volante etc. Excel: si usa css che si può rendere tabellare, più facile da trattare nel codice rispetto a .xslx. Ogni “utente” ed Lostefra ha il suo personale dizionario con sue personali short cut da usare in partita, eventuale login con password (opzionale) x accesso. Vedere license show down. Mappa unica stile giochi di ruolo, si vede tutto da sopra: click o simili su edifici/caverne per mappe interne a tale posto, così ok sprite e per rappresentare “pg in volo” sprite dedicato. Densità aria per dire quando anche un uomo per es può volare. Ipotesi più efficiente per dare un valore stima al pg: AI base che gioca a manetta contro altre AI base e dalle vittorie si fa l’euristica, più vittoria facile/veloce/stracciante più punti, contro vari pg, contro pg standard bench mark.&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Note&amp;diff=210</id>
		<title>Note</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Note&amp;diff=210"/>
		<updated>2020-08-11T23:06:39Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: copia incolla parte 1 continue&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Note ==&lt;br /&gt;
&lt;br /&gt;
'''Ultimare suddivisione'''&lt;br /&gt;
&lt;br /&gt;
===Linee guida sviluppo===&lt;br /&gt;
* File .txt di prontuario per la creazione del personaggio (stile akinator).Nel csv personaggi saranno salvati coppie &amp;lt;proprieta&amp;gt;=&amp;lt;valore&amp;gt;. Esempio: id=infernape,x=1,y=1, etc. Si potra fare template di altri personaggi con template=infernape, template=blastoise (se ovveride vale il più recente), spazi non ammessi nel csv per essere meno error prone.&lt;br /&gt;
&lt;br /&gt;
===Inspirational Concepts===&lt;br /&gt;
* Gioco Lotta (Pokémon, Pokkén)&lt;br /&gt;
* no caselle esplicite&lt;br /&gt;
* Descrizione rispetto a: ambiente, nemico, oggetti&lt;br /&gt;
* pokémon, DnD, Call of Duty, Super Smash Brawl, corse pazze&lt;br /&gt;
* concentrarsi su: fluidi, telecinesi, razze, bonus/malus, gradi di libertà (fisicamente parlando) &lt;br /&gt;
* scacchi (es. crea casella), shaolin showdown&lt;br /&gt;
* prevedere = creatività&lt;br /&gt;
* acqua, aria, fuoco, terra&lt;br /&gt;
* gravità (newton), verso alto, basso, destra, sinistra, circolare, tutti i versi&lt;br /&gt;
* jumanji, savana, animali, zoologia&lt;br /&gt;
* tempo/spazio&lt;br /&gt;
* BF4, pirati, roma (imperium civitas)&lt;br /&gt;
* musica come arma (rap)&lt;br /&gt;
* magia, prestigiatori&lt;br /&gt;
* dinosauri (documentario, libro, zoologia)&lt;br /&gt;
* draghi = dinosauri + ali + fuoco&lt;br /&gt;
* avengers, supereroi (libro)&lt;br /&gt;
* death note, nutrizionista&lt;br /&gt;
* yugioh (carta coperta)&lt;br /&gt;
* fortnite: costruire&lt;br /&gt;
* pacman, colash royale&lt;br /&gt;
* clash of clans, guitar hero&lt;br /&gt;
* sport (generico), (nome, cose, città -&amp;gt; geografia!, fiori)&lt;br /&gt;
* naruto, digimon&lt;br /&gt;
* no man's sky: procedurale, random (non setti un param? lasci al caso? setti tutto? te li sballo). Astronave, tuta spaziale, esplorazione, missione, indie&lt;br /&gt;
* animali e dinosauri dell'oceano&lt;br /&gt;
* rap devi fare freestyle e fare danni all'avversario&lt;br /&gt;
* super mario bros e mario kart&lt;br /&gt;
* elettronica: microcontrollori e arduino, codice&lt;br /&gt;
* Dragon Ball - Budokai Tenchaichi 3&lt;br /&gt;
* Harry potter&lt;br /&gt;
* [NO] minimappe (tieni a mano per ora, meno onere implementativo)&lt;br /&gt;
* Spore, labirinto&lt;br /&gt;
* Atomo, numero elettroni e densità circa sempre costanti; forza (Newton)&lt;br /&gt;
* obbligo, verità, giudizio, salvataggio&lt;br /&gt;
* Ben Ten =&amp;gt; orologio, crea PG e oggetto&lt;br /&gt;
* Kingdom Hearts, Super Smash Brawl&lt;br /&gt;
* Rambo, Rocky Balboa&lt;br /&gt;
* Tigri, coccodrillo (5-8m), animali, ippopotamo (ribalta barche)&lt;br /&gt;
* divinita egitto&lt;br /&gt;
* Battle bot:ribaltano, scintille, elementi (Oggetti) che danneggiano. &lt;br /&gt;
* One piece: I frutti del diavolo (悪魔の実 Akuma no mi?) sono frutti misteriosi che donano poteri soprannaturali a chi li mangia, rendendoli però incapaci di nuotare. Di conseguenza il contatto con l'acqua di mare o con una speciale sostanza conosciuta come agalmatolite indebolisce gli utilizzatori di frutti del diavolo e li priva dei loro poteri. Alcune persone sono inoltre in grado di ricorrere all'Ambizione (覇気 Haki?), una forza spirituale che permette di avvertire la presenza di altri esseri viventi e di predirne i movimenti, di irrobustire parti del corpo e di intimidire o fare svenire le creature con una debole forza di volontà. &lt;br /&gt;
* Wrestling per ispirarsi nella lotta libera: calci pugni ginocchiate prese lanci salti testate gomitate ecc. &lt;br /&gt;
&lt;br /&gt;
* Looney toons&lt;br /&gt;
* pokemon mystery dungeon (da googlare, escono vari siti con pdf e stats)&lt;br /&gt;
* question tool-for-combat-management: https://rpg.stackexchange.com/questions/171188/tool-for-combat-management&lt;br /&gt;
&lt;br /&gt;
===Personaggi (con statistiche e stati)===&lt;br /&gt;
* creabile runtime&lt;br /&gt;
* combattenti (con statistiche e stati)&lt;br /&gt;
* immagine rappresentativa per rappresentare meglio&lt;br /&gt;
* HP: colore rosso su immagine personaggio, dove sei debole/già colpito (idea scartata)&lt;br /&gt;
* penitenza: il malus può essere inteso come ciò che c'è nell'inserimento successivo, malus cumulativo&lt;br /&gt;
* essere ipocrita, finzione (schermo)&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (personaggi)&lt;br /&gt;
* metamorfosi&lt;br /&gt;
* alchimisti&lt;br /&gt;
* Parametri vitali: non respirare, arresto cardiaco, grasso (+/- caldo/freddo)&lt;br /&gt;
* Ossa, muscoli -&amp;gt; parti del corpo&lt;br /&gt;
* Organi (altri organi): apparato digerente (cibo, acqua (in vena, Fabri Fibra), espletamenti), sangue&lt;br /&gt;
* Da wikipedia: pressione arteriosa, frequenza cardiaca (polso), frequenza respiratoria, temperatura corporea, ossigenazione sanguigna, colorito della cute, dolore.&lt;br /&gt;
* Stato di coscienza: coma, non cosciente, sonnambulo, sonnolento, confuso, vigile, orientato, consapevole&lt;br /&gt;
* Morte = game_over&lt;br /&gt;
* Stats personaggi senza bound, ma consigliati dei range (0-100 / 1.000 / 10.000)&lt;br /&gt;
* (?) il personaggio non è necessariamente nella mappa, anche fuori indistintamente lontano, non si rappresenta ma compie azioni e puo' essere attaccato (no mosse fuori da mappa)&lt;br /&gt;
* possibilità giù in terra/ giù in acqua, con reachable e unreachable Boolean. Fuori da mappa anche reachable e unreachable.&lt;br /&gt;
* Personaggi composti di parti[] es. testa, busto, gambe, braccia, coda, pinna, ali. Distinzione per arto di movimento e/o spostamento boolean.&lt;br /&gt;
* Arti possono provocare danno, bruciatura , paralisi a contatto (Boolean) . Percentuale di probabilità accompagna ogni Boolean.&lt;br /&gt;
* Ogni parte del corpo punti vita + se inutilizzabile + amputata + stato (es paralisi).&lt;br /&gt;
* Per fare battaglie tra molto grandi =&amp;gt; 1 m lo si intende come 10m.  (rivalutato, aumentare livello scaling)&lt;br /&gt;
* Personaggio fusionabile Boolean + string nomi con cui si fonde.&lt;br /&gt;
* Distinzione tra infernape e infernape1/2/3 ect tra “specie” e “nome”.&lt;br /&gt;
* variabile Boolean respawnable.&lt;br /&gt;
* Raccogliere a piene mani da: https://spore.fandom.com/wiki/Creature_Editor&lt;br /&gt;
* Ad esempio weapons come elemento di Corpo (zanne, corna) e possibilità di muoversi/attaccare furtivamente.&lt;br /&gt;
* Divisibile e unibile come boolean e array di stringe associate per indicare i nomi con cui si unisce il Personaggio o in cui si divide, meglio come mossa.&lt;br /&gt;
* Variabili posizione nome: from_x/y ; to_x/y.&lt;br /&gt;
* Classe Stato, Personaggio contiene Array di stato, stato contiene moltiplicatori per statistica es attacco velocità precisione elusione ect.&lt;br /&gt;
* Personaggio deve avere una stat tipo sanità mentale, intelligenza, quanto è confuso e quanto è impaurito (2).&lt;br /&gt;
* le statistiche possono variare leggermente in un turno con una certa media e varianza (se media 0 oscillano randomicamente)&lt;br /&gt;
* Personaggio ha funzione baricentro_x, baricentro_y calcolate come (from_x+to_x)/2 sul quale si basa la funzione di libreria getDistance(Personaggio A, Personaggio B, float success); tale funzione serve per calcolare per i PNG e per i PG se ha senso usare una mossa. &lt;br /&gt;
* Non-onniscienza: delle volte non si può sapere distanza avversario e fallisce la mossa per la distanza -&amp;gt; “float success” rappresenta la probabilità di successo (Personaggio ha parametro “osservare”). &lt;br /&gt;
* PNG di due categorie: offensivi o neutrali (no priorità a mosse di attacco, ma tutto casuale). &lt;br /&gt;
* Mosse e oggetti per chiamare Personaggi, magari non necessariamente alleati (2 mosse e 2 oggetti quindi necessari), richiamo di un personaggio preciso o di uno a caso. &lt;br /&gt;
* Possono attivare una metamorfosi / Unione per cambiare stats personaggio. &lt;br /&gt;
&lt;br /&gt;
* Per personaggi molto piccoli (meno di 1m x 1m x 1m) possibilità di essere in (x,y,z) tra 0 e 1.000.000 (ordine del micrometro, 1*10^-6 == 0,000001) e avere (lenX, lenY, lenZ). In questo modo sono definite dimensioni inferiori ad 1 m^3.&lt;br /&gt;
* personaggi max 20x20 (rivaluato, meno limitata)&lt;br /&gt;
&lt;br /&gt;
===Mosse===&lt;br /&gt;
* mossa ha parametri fissi e modificabili (ad es. mossa &amp;quot;fusione&amp;quot; specifica o meno con chi o caratteristiche minime per soddisfare, es. ha orecchino come vegeku)&lt;br /&gt;
* &amp;quot;combattimento prescinde da combattente&amp;quot;&lt;br /&gt;
* mosse hanno: direzione, azione, attacco (mosse pokémon)&lt;br /&gt;
* Parametri interi per mossa (direzione, consumabili) con lower e upper bound&lt;br /&gt;
* camuffarsi =&amp;gt; DnD manuale&lt;br /&gt;
* wrestling (libro) per le mosse/prese&lt;br /&gt;
* Mosse che trasformano l’avversario: attenzione è una mossa devastante. Altera statistiche/stato. Trasformazione totale o parziale. &lt;br /&gt;
* Si devono poter aggiungere mosse, strumenti dinamicamente. &lt;br /&gt;
* Ogni mossa/azione deve avere un tempo di attesa espresso in turni (alla meglio 0) per poter ripetere la mossa/azione. &lt;br /&gt;
&lt;br /&gt;
* X fa una mossa contro Y: Z potrebbe reagire (Es. ricevendo il colpo al posto di Y). Può essere realizzato sia come se &amp;quot;Y chiede soccorso Z&amp;quot; o come reazione di alleati adiacenti &amp;quot;Z soccorre Y&amp;quot;&lt;br /&gt;
* Mossa prende come parametro di ingresso Corpo, ossia la parte del corpo coinvolta nella mossa (es arto , tutto corpo ect). &lt;br /&gt;
* algoritmo per simulare percezione: per ogni punto oggetto da vedere, si calcola diff_x, diff_y, e diff_z con punto sensibilita di colui che percepisce. Si avanza per far ridurre le diff a 0: se (diff_x, diff_y, e diff_z) = (30,20,10) allora ci si muove 3 volte su asse x, 2 su y, 1 su z.&lt;br /&gt;
&lt;br /&gt;
===Oggetto (con statistiche e stati)===&lt;br /&gt;
* creabile runtime&lt;br /&gt;
* armi: lacci (stati), lame (potenze), sassi, reti, pistole (munizioni), razzi, bombe (potenze), fuoco (d'artificio?) =&amp;gt; manuale DnD&lt;br /&gt;
* veleno n modi =&amp;gt; DnD manuale&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (oggetti)&lt;br /&gt;
* automezzi con cannoni, variabile 'hasEntrata', 'tempoRiutilizzo'&lt;br /&gt;
* violino come arma (tutti strumenti musicali): a fiato, a corda, a percussione&lt;br /&gt;
* veleni, ampolle e flaconi magici, insieme di 'oggetti dentro' un oggetto&lt;br /&gt;
* cassaforti (senza/con) chiave, isSigillato, oggetti aprono&lt;br /&gt;
* oggetto riparo, crea&lt;br /&gt;
* Strumenti anche mezzi di trasporto di aria, di terra, di acqua (o lava/palude). &lt;br /&gt;
* Veicoli con armi o riparo. &lt;br /&gt;
* Gli strumenti da trattare come gli oggetti. Classe unica. &lt;br /&gt;
&lt;br /&gt;
* Classe oggetto: es albero, roccia, casa: forza necessaria per sradicare + forza per lanciare + destrezza / agilità per appendersi + nascondersi in proporzione alle dimensioni di chi si nasconde. &lt;br /&gt;
* Altri es. pali. Sotto terra o sotto acqua/lava/melma o simili. &lt;br /&gt;
* Acqua rallenta se non hai pinne boolean.&lt;br /&gt;
* Classe strumento per oggetti che si tengono in mano, es reti , pistole, spade, pugnali, scudi, elmi, lancia, arco , frecce, lanciarazzi, fucili cecchino, fucile assalto, corde.&lt;br /&gt;
* Strumenti e mosse: danno ad area, perforante, contundente (vedi dnd armi). Mosse possono creare/modificare/distruggere oggetti e strumenti.&lt;br /&gt;
* Oggetti del campo di gioco incidono su elusione (parametro di personaggio).&lt;br /&gt;
* Buco/abisso (boolean) per dire se c’è o meno il suolo (Suolo come classe?). &lt;br /&gt;
* Radiazioni. &lt;br /&gt;
&lt;br /&gt;
===Modalità gioco===&lt;br /&gt;
* turnazione&lt;br /&gt;
* 1 v 1 v 1 etc., ma anche squadre casuali&lt;br /&gt;
* punteggio: chi fa più punti, più uccisioni, definizione di 'punto', gioco per perdere&lt;br /&gt;
* inserisci personaggio total random&lt;br /&gt;
* I match/partite (immagino Classe Partita) devono avere variabile boolean “respawn”, per distinguere death match a punti con death match con una vita.&lt;br /&gt;
&lt;br /&gt;
* Modalità battaglia con interazione stile battaglia navale (non si vede mossa dell'avversario)&lt;br /&gt;
* Modalità di gioco: tutti contro tutti (battle royale), death match, vs CPU mode zombie(attaccano solo, se non possono vanno verso nemico): serve introdurre un punteggio, di sicuro per mode zombie , ma anche per death match e tutti contro tutti&lt;br /&gt;
* ingressi: ne entra un altro?&lt;br /&gt;
&lt;br /&gt;
===Mappa===&lt;br /&gt;
* arene NxN metri, 1.000mX1.000m, arena creata casella per casella (NxN aree in un arena)&lt;br /&gt;
* Area: montagnE (agilità, arrampicarsi, appendersi), collina, montagnA, mare (campo 'isLiquido'), lago, spiaggia, deserto, lava, grotta, labirinto (cava, percorso in roccia), metropoli, città, campagna, foresta, fiume, stadio, isola, ghiacciaio, vulcano, cascata.&lt;br /&gt;
* immagine arena a mano, poi inserita nel gioco &lt;br /&gt;
* minimappa (pixelata ?), legenda oggetti base, devono esserci caselle implicite&lt;br /&gt;
* mappa 100x100 (rivalutato, meno limitata)&lt;br /&gt;
* Cannoni fissi in mezzo al campo (strumento).&lt;br /&gt;
* serve che la fisica il 90% sia guidata da regole vere&lt;br /&gt;
* i pianeti sono sempre sferici, per forza di gravità, atmosfera, se piccoli e irregolari =&amp;gt; no atmosfera&lt;br /&gt;
* temperatura: vicinanza dal sole. &lt;br /&gt;
* manca ossigeno? =&amp;gt; campo &amp;quot;respirabile&amp;quot;, le condizioni che consentono la vita possono cambiare, anche per via del fuoco&lt;br /&gt;
* Mappe dinamiche: il pianeta si scalda e diventa una stella, si raffredda e diventa impossibile muoversi&lt;br /&gt;
&lt;br /&gt;
===Funzionalità generali===&lt;br /&gt;
* Stato partita: battaglia in corso, creazione in corso (forse questa esterna al gioco?), etc.&lt;br /&gt;
* ciclo interazione: evento input, lettura input, aggiornamento stato, stampa su board in append (non si nasconde nulla), attesa evento input&lt;br /&gt;
* [NO] Chiave: non una flat input box per i comandi; ma dinamica: si suppone il soggetto &amp;quot;io&amp;quot; (le azioni le fanno in prima persona i personaggi), ogni mossa deve prevedere dei complementi (&amp;quot;verso&amp;quot;, &amp;quot;tra quanto&amp;quot;, &amp;quot;cosa&amp;quot;, &amp;quot;a favore di chi&amp;quot;, &amp;quot;contro chi&amp;quot;). Ogni complemento collegato con box stile in pop up =&amp;gt; bootstrap (la grafica sara unica). &lt;br /&gt;
* [SI] Prevedere anche modalita flat con input del tipo &amp;quot;azione a=pippo verso=termoli&amp;quot; (regex check)&lt;br /&gt;
* menu' interazione per scelta regole battaglia e scelta personaggi&lt;br /&gt;
* &amp;quot;meno tabelle&amp;quot;, &amp;quot;no bottoni&amp;quot; e solo foto che si alternano, &amp;quot;la grafica serve&amp;quot;: text box unica interazione, text area (history), immagine personaggio e immagine mappa&lt;br /&gt;
* niente minimappa, meno problemi, interrogazione per info percezione sensoriale e orientamento (N-S-E-O), schema a mano&lt;br /&gt;
* &amp;quot;persistenza anche da interfaccia grafica&amp;quot;, diritti di scrittura sui file?&lt;br /&gt;
* Segnalazione (comando per fare nota)&lt;br /&gt;
* Modellare statistiche con funzioni probabilistiche (Gaussiane, esponenziali, uniformi, etc.) con relativa media e varianza piuttosto che individuare fasce/scaglionamenti (meno realistici e meno belli)&lt;br /&gt;
* comando 'clear' aggiunge tanti new line alla textarea quante sono le righe renderizzate.&lt;br /&gt;
* comando 'remember/help &amp;lt;mossa&amp;gt;' per stampare i complementi, obbligatori e opzionali, richiesti da una mossa&lt;br /&gt;
&lt;br /&gt;
===Deploy===&lt;br /&gt;
* &amp;quot;commenta il codice&amp;quot;, &amp;quot;dividi et impera&amp;quot;&lt;br /&gt;
* Server web (Apache) ospita partite (+ localmente ha i file di funzionamento), in LAN client giocano o da remoto con IP pubblico. Interfaccia HTML5 + Javascript per giocare. Studiare engine grafici Javascript&lt;br /&gt;
* bootstrap! (specie per input box)&lt;br /&gt;
* https://bit.dev/ per molti componenti web&lt;br /&gt;
* React, React Native .. forse meglio di Vue per diffusione&lt;br /&gt;
* Unity, WebGL (vedi SDK dedicata, built per Android/iOS/etc.)&lt;br /&gt;
* Modelli 3D videogiochi: https://www.models-resource.com/ , meglio se disaccoppiati da Unity (e.g. in cartelle independenti), aggiunta modelli online&lt;br /&gt;
* creare modelli: blender. creare disegni: krita&lt;br /&gt;
* Tutorial tank Unity: https://learn.unity.com/project/tanks-tutorial ; modelli: https://opengameart.org/&lt;br /&gt;
* WebSocket per gestire client asincroni (NodeJS ?)&lt;br /&gt;
* Su YT in “guarda più tardi” video per interagire unity con JS (“unity.sendMessage()” o simili)&lt;br /&gt;
* Due client: uno con WebGL e uno JS base con solo input (per test, per mancanza di supporto browser a WebGL). Eventualmente 3 client: 1 base (JS puro con qualche immagine al più), 1 WebGL+Unity 2D (grafica pixelata), 1 WebGL+Unity 3D (informazioni di input per mirare, ad es., in base a dove punto nello schermo. Qualcosa di simile anche per 2D). Tutti i client stessi JSON per comunicare al server!&lt;br /&gt;
* photogrammetry, https://medium.com/realities-io/getting-started-with-photogrammetry-d0a6ee40cb72&lt;br /&gt;
* roll20.net .. c'è '''davvero''' molto&lt;br /&gt;
* readthedocs.org&lt;br /&gt;
* css dinamici: sass, https://zurb.com/playground/motion-ui (zurb)&lt;br /&gt;
* progressive web apps: offline with server works. https://it.wikipedia.org/wiki/Progressive_Web_App ; responsive web design&lt;br /&gt;
* https://www.youtube.com/watch?v=CGz-h-DzJDU e relativi link, https://essentialsdocs.fandom.com/wiki/Attack_animations , (google: pokemon move animation editor/sprite)&lt;br /&gt;
&lt;br /&gt;
==== Altro (scartato)====&lt;br /&gt;
* rpgmaker, godot, aseprite, pixelart (in generale), ma anche phaser, piskel&lt;br /&gt;
* joomla! Per far prima con html&lt;br /&gt;
* libreria pygame&lt;br /&gt;
* Vuegg: https://github.com/marketplace/vuegg  &lt;br /&gt;
* Material Design&lt;br /&gt;
* eclipse IDE&lt;br /&gt;
* JAVA: Class.forName(&amp;lt;name&amp;gt;.class).newInstance();&lt;br /&gt;
&lt;br /&gt;
===Copia&amp;amp;incolla generale, da smistare in sotto capitoli. Contiene anche '''tutte''' note del telefono (al 22/02/2020)===&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 1:'''&lt;br /&gt;
&lt;br /&gt;
Per punti si vince a un limite o dopo un tot di mosse , oppure al primo dei due raggiunti (max_punti e max_mosse parametri di Partita). I punti si guadagnano alla kill (un Punteggio per squadra, int punteggio salvato localmente dentro ogni Personaggio che ha la variabile int squadra). Si guadagnano tanti punti quanti sono i punti della variabile “valore” del personaggio ucciso, tale variabile è calcolata come somma dei valori di tutte le mosse/stats ect del Personaggio. Imperium civitas. Attacco dei giganti. Possibilità di morire se colpiti in un unico punto (tallone d Achille) implementabile come variabile boolean. Jump force. Game dev tycoon. Acqua diventa tsunami. Variabile int per attacco cumulativo di gruppo: es calciatori che più si passano la palla più l’attacco è forte. Suolo magico: non tutti i personaggi possono accedervi, array di string elenca i nomi di chi può accedervi. Funzione esci/entra in classe Personaggio per simulare scambio pokemon 6vs6. Piovra gigante. Rischio=danno*probabilita. Mossa su strumento e con strumento?&lt;br /&gt;
Mosse fisiche per arrampicarsi su avversario(se e solo se sei la metà di dimensioni(?)), atterrarlo, lanciarlo, accecarlo, immobilizzarlo. Se sei in gruppo/ orda bonus ad attacchi combinati. Armi: fruste e scheggie, corni che si suonano per chiamare altri. Tipo della mossa con moltiplicatore tra 0 (immune) e 2 (float): acqua, fuoco, magia, terra: da ispirarsi ai pokemon ma non da copiare, penso. Armi da campo: cannoni e catapulte. Veicoli d’acqua: moto acqua, canoe, barche a motore a remi. Nei veicoli malus su attenzione (variabile int in personaggio, indica attenzione in combattimento e non in altro) perché si è impegnato alla guida . All’inizio in image view “the hero” e “the map”. Condizione vittoria (oltre a morte, punti, o numero mosse, cioè tempo) morte di un singolo Personaggio, che potrebbe rappresentare un edificio, cassaforte o simili. Personaggio si può svestire e lasciare strumenti, modificano statistiche di attacco, difesa , agilità, ect. Variabile luce o non luce, che peggiora/migliora a seconda della specie la visibilità, quindi la precisione , specie in attacchi a distanza: Scurovisione evita i malus.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 2:'''&lt;br /&gt;
&lt;br /&gt;
Gioco2: se ci si lancia da oggetti , dopo essersi arrampicati, possono esserci danni da caduta; strumenti come paracaduti o mosse magiche possono evitare i danni. Pozione del vento, soffi e devi attacchi. In difesa puoi parare, schivare, deviare: tre variabili? Ambiente: colline e pianure uguali, Monti sono Oggetti, picco ossia un unico monte oggetto. Rocce volanti, nuvole sospese: oggetto può essere sospeso e può fare periodicamente una mossa, ad es tuono, può spostarsi, può fare entra/esci, oggetto albero e oggetto foresta, si possono prendere, nascondersi, arrampicarsi, lanciarli, ostacolano velocità ma se si ha abbastanza forza si spezzano alberi. Acqua poco profonda, profonda, molto profonda: variabile boolean in Personaggio “alto” per toccare in acqua profonda, con acqua si generano fiumi laghi e mari. Ambiente si deve poter evolvere: ad esempio oggetto diga può fare metamorfosi e diventare oggetto cascata/torrente in piena. Per edifici più oggetti che rappresentano le mura e il tetto, variabile boolean per oggetto per entrare nell’oggetto. Possono essere spazzati via: danni da crollo, si può combattere all interni, contengono strumenti come tavoli sedie mobili letto ect. Se uno viene schiantato contro uno strumento prende danno(es danno da schianto). Ci possono essere scale, si può non avere contatti visivo sull’avversario. Oggetto mura, oggetto torre, oggetto casa interno sono cose distinte: possono dare malus/bonus su visibilità. Ambiente: pozzi e grotte, da gestire come interno casa. Lava come acqua, ogni oggetto può essere sorgenti di liquido: monte sorgente acqua, vulcano sorgente lava. Può esserci variabile probabilità eruzione, se settata a 1 c’è una continua eruzione. Strade di vario tipo, sovrapposta a altri suoli, migliorano velocità di alcuni strumenti, variabile boolean “ha le ruote” in classe strumenti. Unificare classe strumento e classe oggetto. Oggetti sospesi: case sospese su albero, ad es. Fiamme in mezzo al suolo. Oggetti: porto, aereoporto, grattacieli, dighe, impianti a fune, ospedali per curarsi e prendere oggetti per curarsi dopo, scuole contenenti libri per apprendere una mossa, luoghi di ingegneria per creare oggetti, ad esempio veicoli o armi, soldi nel gioco per comprare da eventuali venditori. Ogni oggetto avra un prezzo (valutabile circa in euro per semplicità). Variabile float per fame, sete, sonno, caldo-freddo (parte da 0.5). Nella mappa ci deve essere per ogni punto la temperatura. Possibilità di vomito, dissenteria, problemi cardiaci, respiratori, muscolari. Armi: balestra, mani nude, sasso, tirapugni, torcia accesa. Armature: intralciano o favoriscono agilità, attacco, poteri magici, rumorosa (elusione), è uno strumento/oggetto. Attacchi possono essere prolungati per turni, mosse variabile boolean prolungabile: può aumentare o diminuire intensità, c’è un max espresso in turni di prolungabilita, inoltre può essere leggermente alterato con una variabile casuale. Equipaggiamento (strumento/oggetto): pietra focaia, attrezzi da scalata, boccale di birra, cavallo, moto, chiodi, martello da fabbro, corda, corazza, dardo, faretra/zaino/sacca (oggetti che contengono una lista di oggetti, stringhe) con un numero per la quantità) e capacità massima zaino e ogni oggetto può avere un valore intero per dimensione (es martello 3, ascia grande 7), mantello, olio, variabile boolean prende fuoco/conduce elettricità, amplifica magnetismo, aumenta esplosioni nucleari, aumenta forza di gravità (?), pala, piccone, rampino, specchio, per osservare quando si è nascosti e si ha malus su visibilità. Strumenti da scasso per aprire porte: variabile boolean per oggetti: entrata con scasso. Personaggio: string razza per swag, immunità a veleni e malattie, elusione, agilità, precisione, abilità magiche(?), difesa fisica. In ultima torcia: agilità, coraggio, forza, intelligenza, magia, manualità, percezione, socialità. Bestiario: aracnoide di varie dimensioni, talpe giganti, vermi giganti di terra di mare e di lava ect, bulbo trascinatore che ha tentacoli per tirare a se e mangiare, lui è immobile, calabrone gigante, serpenti giganti, cinghiali, draghi, elfi, goblin e re goblin, sciamani (goblin), totem di guerra come strumento/oggetti per alterare statistiche nella loro area di influenza, lupo, mastino bruciante, nani, non morti/zombie/mummia/scheletro variabile boolean vivo a false ma ha ancora hp su parti del corpo: variabile boolean “zombizabile”. Orchi, pesci da terra (anfibi) tritone dell abisso, troll e trollin (orchi più deformi), umani. Abilità dei personaggi in ultima torcia: artificiale (robot) immunità a soffocamento, veleni, malattie ect immune a manipolazioni psichiche, visione oscurità; danno da attacco in carica; fiammegiante ossia la creatura può incendiarsi e elettrizzante ossia può diventare elettrica caricamente; modalità furia/mailmen ossia ottiene bonus su alcune/tutte le statistiche; gigantesco o molto piccolo due boolean (?forse non serve); immunità a magie mentali, al fuoco; linguaggi (?); non morto; danno da attacco in presa; pungiglioni velenosi; sa muoversi su ragnatele o è rallentato, resistenza a perforazione, respirare sott’acqua o sotto lava o nei liquidi in genere; rigenerazione; riceve danni dalla luce solare o da assenza di luce; è terrorizzato/impaurito/intimidito o se è imperturbabile boolean. Danno da trascinamento; paralizzante; può diventare più veloce (?non serve); visione a infrarossi attraverso oggetti; volare o andare sotto terra. Imperium editor, cose che penso di non aver ancora scritto: stagioni, suolo erboso o terriccio, sabbia con erba e terra e da sola, strade e stagioni, altitudine, alberi e arbusti, vari tipi a foglia larga, conifere, alberi secchi, palme, arbusti verdi e secchi, cactus, alghe marine, rocce e pietre, scheletri per terra, legna tagliata (alberi tagliati), carri e carretti, grotte e rovine per accessi sotterranei, locande, templi, accampamenti, fortini, monoliti, fontana, tombe e cimiteri, borse per terra, pozzo, troni, croci(del teschio), pozzo, capanne, lapidi, ponti, recinzioni, falò, tende, torri, panoplia, fessure come abissi, statue, rovine (deserto) come case distrutte, colonne per costruire templi, piramidi, sfingi, bandiere, rovine in Europa, campi coltivati che contengono cibo, fiamma (in altre), roccia in altre per montagne, altre-&amp;gt;rovine per monumenti non egiziani ma europei.&lt;br /&gt;
Ci sono paludi. Tende da campo. Forti, porti. Edifici delle fortezze, edifici dei villaggi. Naufragi e scogli.&lt;br /&gt;
Parametri voglia/impegno float per descrivere voglia di combattere Personaggio. Ricevi danno uscendo dalla mappa tra 1-5% tra 6-10% tra 11-15% della vita totale di ogni parte del corpo per ogni turno di gioco. Danno da precipitazione diverso da carica, uno verticale uno orizzontale, se precipiti da molto in alto hai bonus, oltre che danni da schianto lol. Baionette, formazione a blocchi, a quadrato (difensiva) sparano su quattro lati, a schiera vanno avanti. Usano un colpo poi lunga ricarica. Variabile boolean per attivare o meno fuoco amico. Azione per cambiare posizione: in piedi, in ginocchio(inteso come via di mezzo), sdraiato: per permettere migliore visibilità a chi è dietro (nella formazione).&lt;br /&gt;
Altruismo, coraggio, spingere oltre il limite, difendere al posto di un altro, migliorare posizione per avere bonus. Mosse da usare in condizioni psicologiche idonee: mosse estreme per disperazione, bonus unici. Condizioni per situazioni: blocco, spalle al muro, stritolato, confuso, semi parassiti addosso, azzoppato, bagnato d’acqua, lame affilate, corazza indurita, tante copie di me stesso attive, preveggente. Per ambiente:pioggia (torrenziale), barriera a cupola, punte metalliche a terra, blocco di fumo nero. Far volare un avversario/alleato. Tutti possono fare tutto sotto effetti magici o fisici. Un cavallo può volare se viene preso da un uccello e portato in alto.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 3, 4:'''&lt;br /&gt;
&lt;br /&gt;
Gioco1,2,3,4: tutto caricato su wikis.&lt;br /&gt;
&lt;br /&gt;
Gioco3: Mosse con caricamento + spostamento (es. kameamea con teletrasporto). Ciclo di interazione principale:crea o combatti. Modalità campagna, che chiede in input da che battaglia iniziare, ma implica tipi battaglie prefissati. Alla morte/sconfitta di un personaggio si possono alterare statistiche (es personaggio può cambiare fazione). Alcune mosse possono lasciare oggetti sul terreno: (ad es, radici di Groth). Ogni oggetto può alterare le statistiche al passaggio sopra, nelle vicinanze. Boolean invisibile per personaggio, diverso da elusione infinita. Se personaggio va in un altro dimensione -&amp;gt; unreachable. Attacco coordinato, se non lo fanno tutti vale lo stesso ma depotenziato opportunamente . Personaggio in modalità maniac (2 mosse per turno) e in modalità depressive (1 mossa ogni due turni); personaggio Flash può fare 10 mosse in un turno. Chiudi con lucchetto oggetto da dentro o da fuori, oggetto ingresso in oggetto casa , più ingressi per un singolo oggetto.nicole aniston. Rimbalzo se ci si schianta contro oggetto da calcolare con parametro. Ryuk e Darkrai.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gioco 4 23/07/2019:&lt;br /&gt;
Pula fiction, aracnidi, oggetto: due superfici rettangolari di forma diversa, anche inclinate , collegate. Più pezzi collegati tra loro per forme cilindriche cave, ad esempio, tipo vulcano. Mappa con sprite personaggi, canvas: anche mouseClick? Statistiche con nome gerarchico, es pokemon_attacco. Modalità survival, stile isola di jurassic park gdr; sia in coop che contro; possibilità di fare N turni di fila se non ci sono altri player giocanti nelle vicinanze (ciò però comporterebbe , in modalità contro , di capire quando c’è qualcuno nelle vicinanze perché si andrebbe di 1 turno alla volta, soluzioni: in mod contro 1 turno per volta oppure meccanismo di sincronizzazione turni quando uno vede l’altro (anche furtivo) come c’è attacco 1 turno a testa) .. analogo a Battle royale(?); inizio con starter kit random. Modalità assedio al castello. Inoltre se posso fare N turni di fila si può pensare a più pc , uno per persona , coordinati per fare comandi in parallelo, ma va ben congegnato meccanismo di sincronizzazione. Parti DelCorpo -&amp;gt; Componente/i oppure Parte. La mappa deve essere (x,y); l’altezza viene indicata onMouseOver certi pixel dove è posto il Personaggio; se personaggio dentro edificio/grotta cambio img (es sfocato/tratteggiato). Mosse: astrarre per target; molte mosse sono simili tra loro, somiglianza va sfruttata, hanno magari dei target in comune, o variano solo per un parametro. Creare mappa anche con drag and drop immagini ?(un po’ difficile). Più layout per interfaccia grafica (esempio uno che mostra errori input su text area, uno con alert, uno su box text area separato). Input comandi consumato pezzo per pezzo, alcune parole se prevedono parametri quando riconosciute fanno fetch anche di parola (numero) successiva. Face toon foto? Import parziali di personaggi (tutto tranne/solo questi campi specificati). Texture mappa complete o ripetibili (es per suolo). Anteprima battaglia stile battaglia pokemon (magari per 1/2/3 vs 1/2/3) per rappresentare scontro. Conviene usare xslx (excel) per dati, considerare che può non servire la libreria Java per leggere stringhe per operazioni. Mossa “again” , ripeti la precedenza(opportuna modifica parametri, es mossa spostamento). Possibile gestione contromosse: si usano marker (tag): ogni mossa ha elenco tag del tipo di contromosse che può subire (con probabilità annessa, che può dipendere da pg che subisce mossa congiuntamente a mossa stessa). Ogni mossa inoltre deve essere taggata come possibile contromossa che il pg può usare (per schivare può fare in più modi). A seconda del lancio del dado il pg che effettua La contromossa può anche scegliere tipologia di contromossa o solo la mossa della tipologia che ha beccato (entrano in gioco riflessi ect.). I parametri che fanno attivare unq o un’altra contromossa sono dinamici, posso dipendere ad esempio dalla posizione tra i due pg o altre statistiche. Tag contromosse a fasce (es. coprirsi è sempre più facile che schivare che e più facile di schivare e contrattaccare (?); all’interno dello stesso schivare e contrattaccare ci sono più sotto categorie). Per aggiunta personaggio può essere utili interfaccia dedicata, non linea di comando (o altre operazioni, specie se ci sono tabelle). Mossa “premonizione”: predire il futuro a breve termine, dici che mossa vorresti fare e ti dice esito (o più esiti se uno chiede più mosse). Funziona solo sulla prossima mossa. Contromossa delle contromossa gestione?? Eventualmente nell’esito si prevede ancore contro-contromossa. Ma si innesca reazione a catena, inoltre da gestire scelta contromossa in questo caso. Applicazione tag conoscenza(universo di appartenenza): “Termoli”, “pokemon”, “liceo classico Termoli”, anche gerarchici, per filtrare sui personaggi.target componibili , fattorizzato creazione mosse, hanno un costo magari per indicare quantovoccupano dicuna mossa, relativo maybe a un parametro o più del target stesso. In particolare, non saranno salvate le mosse per un personaggio (o solo alcune “preferite”) ma il suo insieme di target i quali devono dire:statistica che influenzano, “costo del turno” che richiedono al variare dell’intensità del target (che aumenta linearmente, esponenzialmente, generica f(x)) quindi corsa blanda costo 1 , Max corsa costo 5 (max), elenco (string) target incompatibili con tale target (se serve), nota relative ad es per quando uno vuole creare una mossa durante la battaglia (“target corsa, max sforzo dedicabile 4 ect” metti “50 metri corsa” “ok/troppo! Vuoi sforzati di più rischiando effetti collaterali?”). Si può autoscrivere la voce narrante del gioco come “la tua coscienza” mentre che giochi, d’altronde si interagisce con essa. Considerare che un target può appartenere a più personaggi, magari sotto nomi di mosse diversi.&lt;br /&gt;
Definire gerarchia di personaggi per template (tipo classe e super classe) e template importabili (tipo usa fuoco). Es umanoide non umanoide, tra umanoide maschio- femmina etc. Classe che estende System.out per creare funzioni che aggiungono Header “DEBUG:” etc; due programmi Java , due main: uno delegato a calcoli + gestione Excel; altro legge stdout dell altro per interfaccia grafica. Per allenare PG creare dei PG fantocci con label per fare Q-learning iniziale, più avanti far allenare pg tra loro; creare vari fantocci: tank terrestre fisico, healer volante etc. Excel: si usa css che si può rendere tabellare, più facile da trattare nel codice rispetto a .xslx. Ogni “utente” ed Lostefra ha il suo personale dizionario con sue personali short cut da usare in partita, eventuale login con password (opzionale) x accesso. Vedere license show down. Mappa unica stile giochi di ruolo, si vede tutto da sopra: click o simili su edifici/caverne per mappe interne a tale posto, così ok sprite e per rappresentare “pg in volo” sprite dedicato. Densità aria per dire quando anche un uomo per es può volare. Ipotesi più efficiente per dare un valore stima al pg: AI base che gioca a manetta contro altre AI base e dalle vittorie si fa l’euristica, più vittoria facile/veloce/stracciante più punti, contro vari pg, contro pg standard bench mark.&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Note&amp;diff=209</id>
		<title>Note</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Note&amp;diff=209"/>
		<updated>2020-08-11T14:27:26Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: da fogli di carta&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Note ==&lt;br /&gt;
&lt;br /&gt;
'''Ultimare suddivisione'''&lt;br /&gt;
&lt;br /&gt;
===Linee guida sviluppo===&lt;br /&gt;
* File .txt di prontuario per la creazione del personaggio (stile akinator).Nel csv personaggi saranno salvati coppie &amp;lt;proprieta&amp;gt;=&amp;lt;valore&amp;gt;. Esempio: id=infernape,x=1,y=1, etc. Si potra fare template di altri personaggi con template=infernape, template=blastoise (se ovveride vale il più recente), spazi non ammessi nel csv per essere meno error prone.&lt;br /&gt;
&lt;br /&gt;
===Inspirational Concepts===&lt;br /&gt;
* Gioco Lotta (Pokémon, Pokkén)&lt;br /&gt;
* no caselle esplicite&lt;br /&gt;
* Descrizione rispetto a: ambiente, nemico, oggetti&lt;br /&gt;
* pokémon, DnD, Call of Duty, Super Smash Brawl, corse pazze&lt;br /&gt;
* concentrarsi su: fluidi, telecinesi, razze, bonus/malus, gradi di libertà (fisicamente parlando) &lt;br /&gt;
* scacchi (es. crea casella), shaolin showdown&lt;br /&gt;
* prevedere = creatività&lt;br /&gt;
* acqua, aria, fuoco, terra&lt;br /&gt;
* gravità (newton), verso alto, basso, destra, sinistra, circolare, tutti i versi&lt;br /&gt;
* jumanji, savana, animali, zoologia&lt;br /&gt;
* tempo/spazio&lt;br /&gt;
* BF4, pirati, roma (imperium civitas)&lt;br /&gt;
* musica come arma (rap)&lt;br /&gt;
* magia, prestigiatori&lt;br /&gt;
* dinosauri (documentario, libro, zoologia)&lt;br /&gt;
* draghi = dinosauri + ali + fuoco&lt;br /&gt;
* avengers, supereroi (libro)&lt;br /&gt;
* death note, nutrizionista&lt;br /&gt;
* yugioh (carta coperta)&lt;br /&gt;
* fortnite: costruire&lt;br /&gt;
* pacman, colash royale&lt;br /&gt;
* clash of clans, guitar hero&lt;br /&gt;
* sport (generico), (nome, cose, città -&amp;gt; geografia!, fiori)&lt;br /&gt;
* naruto, digimon&lt;br /&gt;
* no man's sky: procedurale, random (non setti un param? lasci al caso? setti tutto? te li sballo). Astronave, tuta spaziale, esplorazione, missione, indie&lt;br /&gt;
* animali e dinosauri dell'oceano&lt;br /&gt;
* rap devi fare freestyle e fare danni all'avversario&lt;br /&gt;
* super mario bros e mario kart&lt;br /&gt;
* elettronica: microcontrollori e arduino, codice&lt;br /&gt;
* Dragon Ball - Budokai Tenchaichi 3&lt;br /&gt;
* Harry potter&lt;br /&gt;
* [NO] minimappe (tieni a mano per ora, meno onere implementativo)&lt;br /&gt;
* Spore, labirinto&lt;br /&gt;
* Atomo, numero elettroni e densità circa sempre costanti; forza (Newton)&lt;br /&gt;
* obbligo, verità, giudizio, salvataggio&lt;br /&gt;
* Ben Ten =&amp;gt; orologio, crea PG e oggetto&lt;br /&gt;
* Kingdom Hearts, Super Smash Brawl&lt;br /&gt;
* Rambo, Rocky Balboa&lt;br /&gt;
* Tigri, coccodrillo (5-8m), animali, ippopotamo (ribalta barche)&lt;br /&gt;
* divinita egitto&lt;br /&gt;
&lt;br /&gt;
* Looney toons&lt;br /&gt;
* pokemon mystery dungeon (da googlare, escono vari siti con pdf e stats)&lt;br /&gt;
* question tool-for-combat-management: https://rpg.stackexchange.com/questions/171188/tool-for-combat-management&lt;br /&gt;
&lt;br /&gt;
===Personaggi (con statistiche e stati)===&lt;br /&gt;
* creabile runtime&lt;br /&gt;
* combattenti (con statistiche e stati)&lt;br /&gt;
* immagine rappresentativa per rappresentare meglio&lt;br /&gt;
* HP: colore rosso su immagine personaggio, dove sei debole/già colpito (idea scartata)&lt;br /&gt;
* penitenza: il malus può essere inteso come ciò che c'è nell'inserimento successivo, malus cumulativo&lt;br /&gt;
* essere ipocrita, finzione (schermo)&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (personaggi)&lt;br /&gt;
* metamorfosi&lt;br /&gt;
* alchimisti&lt;br /&gt;
* Parametri vitali: non respirare, arresto cardiaco, grasso (+/- caldo/freddo)&lt;br /&gt;
* Ossa, muscoli -&amp;gt; parti del corpo&lt;br /&gt;
* Organi (altri organi): apparato digerente (cibo, acqua (in vena, Fabri Fibra), espletamenti), sangue&lt;br /&gt;
* Da wikipedia: pressione arteriosa, frequenza cardiaca (polso), frequenza respiratoria, temperatura corporea, ossigenazione sanguigna, colorito della cute, dolore.&lt;br /&gt;
* Stato di coscienza: coma, non cosciente, sonnambulo, sonnolento, confuso, vigile, orientato, consapevole&lt;br /&gt;
* Morte = game_over&lt;br /&gt;
* Stats personaggi senza bound, ma consigliati dei range (0-100 / 1.000 / 10.000)&lt;br /&gt;
* (?) il personaggio non è necessariamente nella mappa, anche fuori indistintamente lontano, non si rappresenta ma compie azioni e puo' essere attaccato (no mosse fuori da mappa)&lt;br /&gt;
* possibilità giù in terra/ giù in acqua, con reachable e unreachable Boolean. Fuori da mappa anche reachable e unreachable.&lt;br /&gt;
* Personaggi composti di parti[] es. testa, busto, gambe, braccia, coda, pinna, ali. Distinzione per arto di movimento e/o spostamento boolean.&lt;br /&gt;
* Arti possono provocare danno, bruciatura , paralisi a contatto (Boolean) . Percentuale di probabilità accompagna ogni Boolean.&lt;br /&gt;
* Ogni parte del corpo punti vita + se inutilizzabile + amputata + stato (es paralisi).&lt;br /&gt;
* Per fare battaglie tra molto grandi =&amp;gt; 1 m lo si intende come 10m.  (rivalutato, aumentare livello scaling)&lt;br /&gt;
* Personaggio fusionabile Boolean + string nomi con cui si fonde.&lt;br /&gt;
* Distinzione tra infernape e infernape1/2/3 ect tra “specie” e “nome”.&lt;br /&gt;
* variabile Boolean respawnable.&lt;br /&gt;
* Raccogliere a piene mani da: https://spore.fandom.com/wiki/Creature_Editor&lt;br /&gt;
* Ad esempio weapons come elemento di Corpo (zanne, corna) e possibilità di muoversi/attaccare furtivamente.&lt;br /&gt;
* Divisibile e unibile come boolean e array di stringe associate per indicare i nomi con cui si unisce il Personaggio o in cui si divide.&lt;br /&gt;
* Variabili posizione nome: from_x/y ; to_x/y.&lt;br /&gt;
* Classe Stato, Personaggio contiene Array di stato, stato contiene moltiplicatori per statistica es attacco velocità precisione elusione ect.&lt;br /&gt;
* Personaggio deve avere una stat tipo sanità mentale, intelligenza, quanto è confuso e quanto è impaurito (2).&lt;br /&gt;
* le statistiche possono variare leggermente in un turno con una certa media e varianza (se media 0 oscillano randomicamente)&lt;br /&gt;
&lt;br /&gt;
* Per personaggi molto piccoli (meno di 1m x 1m x 1m) possibilità di essere in (x,y,z) tra 0 e 1.000.000 (ordine del micrometro, 1*10^-6 == 0,000001) e avere (lenX, lenY, lenZ). In questo modo sono definite dimensioni inferiori ad 1 m^3.&lt;br /&gt;
* personaggi max 20x20 (rivaluato, meno limitata)&lt;br /&gt;
&lt;br /&gt;
===Mosse===&lt;br /&gt;
* &amp;quot;combattimento prescinde da combattente&amp;quot;&lt;br /&gt;
* mosse hanno: direzione, azione, attacco (mosse pokémon)&lt;br /&gt;
* Parametri interi per mossa (direzione, consumabili) con lower e upper bound&lt;br /&gt;
* camuffarsi =&amp;gt; DnD manuale&lt;br /&gt;
* wrestling (libro) per le mosse/prese&lt;br /&gt;
&lt;br /&gt;
* X fa una mossa contro Y: Z potrebbe reagire (Es. ricevendo il colpo al posto di Y). Può essere realizzato sia come se &amp;quot;Y chiede soccorso Z&amp;quot; o come reazione di alleati adiacenti &amp;quot;Z soccorre Y&amp;quot;&lt;br /&gt;
* Mossa prende come parametro di ingresso Corpo, ossia la parte del corpo coinvolta nella mossa (es arto , tutto corpo ect). &lt;br /&gt;
* algoritmo per simulare percezione: per ogni punto oggetto da vedere, si calcola diff_x, diff_y, e diff_z con punto sensibilita di colui che percepisce. Si avanza per far ridurre le diff a 0: se (diff_x, diff_y, e diff_z) = (30,20,10) allora ci si muove 3 volte su asse x, 2 su y, 1 su z.&lt;br /&gt;
&lt;br /&gt;
===Oggetto (con statistiche e stati)===&lt;br /&gt;
* creabile runtime&lt;br /&gt;
* armi: lacci (stati), lame (potenze), sassi, reti, pistole (munizioni), razzi, bombe (potenze), fuoco (d'artificio?) =&amp;gt; manuale DnD&lt;br /&gt;
* veleno n modi =&amp;gt; DnD manuale&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (oggetti)&lt;br /&gt;
* automezzi con cannoni, variabile 'hasEntrata', 'tempoRiutilizzo'&lt;br /&gt;
* violino come arma (tutti strumenti musicali): a fiato, a corda, a percussione&lt;br /&gt;
* veleni, ampolle e flaconi magici, insieme di 'oggetti dentro' un oggetto&lt;br /&gt;
* cassaforti (senza/con) chiave, isSigillato, oggetti aprono&lt;br /&gt;
* oggetto riparo, crea&lt;br /&gt;
&lt;br /&gt;
* Classe oggetto: es albero, roccia, casa: forza necessaria per sradicare + forza per lanciare + destrezza / agilità per appendersi + nascondersi in proporzione alle dimensioni di chi si nasconde. &lt;br /&gt;
* Altri es. pali. Sotto terra o sotto acqua/lava/melma o simili. &lt;br /&gt;
* Acqua rallenta se non hai pinne boolean.&lt;br /&gt;
* Classe strumento per oggetti che si tengono in mano, es reti , pistole, spade, pugnali, scudi, elmi, lancia, arco , frecce, lanciarazzi, fucili cecchino, fucile assalto, corde.&lt;br /&gt;
* Strumenti e mosse: danno ad area, perforante, contundente (vedi dnd armi). Mosse possono creare/modificare/distruggere oggetti e strumenti.&lt;br /&gt;
* Oggetti del campo di gioco incidono su elusione (parametro di personaggio).&lt;br /&gt;
* Buco/abisso (boolean) per dire se c’è o meno il suolo (Suolo come classe?). &lt;br /&gt;
* Radiazioni. &lt;br /&gt;
&lt;br /&gt;
===Modalità gioco===&lt;br /&gt;
* turnazione&lt;br /&gt;
* 1 v 1 v 1 etc., ma anche squadre casuali&lt;br /&gt;
* punteggio: chi fa più punti, più uccisioni, definizione di 'punto', gioco per perdere&lt;br /&gt;
* inserisci personaggio total random&lt;br /&gt;
&lt;br /&gt;
* Modalità battaglia con interazione stile battaglia navale (non si vede mossa dell'avversario)&lt;br /&gt;
* Modalità di gioco: tutti contro tutti (battle royale), death match, vs CPU mode zombie(attaccano solo, se non possono vanno verso nemico): serve introdurre un punteggio, di sicuro per mode zombie , ma anche per death match e tutti contro tutti&lt;br /&gt;
* ingressi: ne entra un altro?&lt;br /&gt;
&lt;br /&gt;
===Mappa===&lt;br /&gt;
* arene NxN metri, 1.000mX1.000m, arena creata casella per casella (NxN aree in un arena)&lt;br /&gt;
* Area: montagnE (agilità, arrampicarsi, appendersi), collina, montagnA, mare (campo 'isLiquido'), lago, spiaggia, deserto, lava, grotta, labirinto (cava, percorso in roccia), metropoli, città, campagna, foresta, fiume, stadio, isola, ghiacciaio, vulcano, cascata.&lt;br /&gt;
* immagine arena a mano, poi inserita nel gioco &lt;br /&gt;
* minimappa (pixelata ?), legenda oggetti base, devono esserci caselle implicite&lt;br /&gt;
* mappa 100x100 (rivalutato, meno limitata)&lt;br /&gt;
* Cannoni fissi in mezzo al campo (strumento).&lt;br /&gt;
* serve che la fisica il 90% sia guidata da regole vere&lt;br /&gt;
* i pianeti sono sempre sferici, per forza di gravità, atmosfera, se piccoli e irregolari =&amp;gt; no atmosfera&lt;br /&gt;
* temperatura: vicinanza dal sole. &lt;br /&gt;
* manca ossigeno? =&amp;gt; campo &amp;quot;respirabile&amp;quot;, le condizioni che consentono la vita possono cambiare, anche per via del fuoco&lt;br /&gt;
* Mappe dinamiche: il pianeta si scalda e diventa una stella, si raffredda e diventa impossibile muoversi&lt;br /&gt;
&lt;br /&gt;
===Funzionalità generali===&lt;br /&gt;
* Stato partita: battaglia in corso, creazione in corso (forse questa esterna al gioco?), etc.&lt;br /&gt;
* ciclo interazione: evento input, lettura input, aggiornamento stato, stampa su board in append (non si nasconde nulla), attesa evento input&lt;br /&gt;
* [NO] Chiave: non una flat input box per i comandi; ma dinamica: si suppone il soggetto &amp;quot;io&amp;quot; (le azioni le fanno in prima persona i personaggi), ogni mossa deve prevedere dei complementi (&amp;quot;verso&amp;quot;, &amp;quot;tra quanto&amp;quot;, &amp;quot;cosa&amp;quot;, &amp;quot;a favore di chi&amp;quot;, &amp;quot;contro chi&amp;quot;). Ogni complemento collegato con box stile in pop up =&amp;gt; bootstrap (la grafica sara unica). &lt;br /&gt;
* [SI] Prevedere anche modalita flat con input del tipo &amp;quot;azione a=pippo verso=termoli&amp;quot; (regex check)&lt;br /&gt;
* menu' interazione per scelta regole battaglia e scelta personaggi&lt;br /&gt;
* &amp;quot;meno tabelle&amp;quot;, &amp;quot;no bottoni&amp;quot; e solo foto che si alternano, &amp;quot;la grafica serve&amp;quot;: text box unica interazione, text area (history), immagine personaggio e immagine mappa&lt;br /&gt;
* niente minimappa, meno problemi, interrogazione per info percezione sensoriale e orientamento (N-S-E-O), schema a mano&lt;br /&gt;
* &amp;quot;persistenza anche da interfaccia grafica&amp;quot;, diritti di scrittura sui file?&lt;br /&gt;
* Segnalazione (comando per fare nota)&lt;br /&gt;
* Modellare statistiche con funzioni probabilistiche (Gaussiane, esponenziali, uniformi, etc.) con relativa media e varianza piuttosto che individuare fasce/scaglionamenti (meno realistici e meno belli)&lt;br /&gt;
* comando 'clear' aggiunge tanti new line alla textarea quante sono le righe renderizzate.&lt;br /&gt;
* comando 'remember/help &amp;lt;mossa&amp;gt;' per stampare i complementi, obbligatori e opzionali, richiesti da una mossa&lt;br /&gt;
&lt;br /&gt;
===Deploy===&lt;br /&gt;
* &amp;quot;commenta il codice&amp;quot;, &amp;quot;dividi et impera&amp;quot;&lt;br /&gt;
* Server web (Apache) ospita partite (+ localmente ha i file di funzionamento), in LAN client giocano o da remoto con IP pubblico. Interfaccia HTML5 + Javascript per giocare. Studiare engine grafici Javascript&lt;br /&gt;
* bootstrap! (specie per input box)&lt;br /&gt;
* https://bit.dev/ per molti componenti web&lt;br /&gt;
* React, React Native .. forse meglio di Vue per diffusione&lt;br /&gt;
* Unity, WebGL (vedi SDK dedicata, built per Android/iOS/etc.)&lt;br /&gt;
* Modelli 3D videogiochi: https://www.models-resource.com/ , meglio se disaccoppiati da Unity (e.g. in cartelle independenti), aggiunta modelli online&lt;br /&gt;
* creare modelli: blender. creare disegni: krita&lt;br /&gt;
* Tutorial tank Unity: https://learn.unity.com/project/tanks-tutorial ; modelli: https://opengameart.org/&lt;br /&gt;
* WebSocket per gestire client asincroni (NodeJS ?)&lt;br /&gt;
* Su YT in “guarda più tardi” video per interagire unity con JS (“unity.sendMessage()” o simili)&lt;br /&gt;
* Due client: uno con WebGL e uno JS base con solo input (per test, per mancanza di supporto browser a WebGL). Eventualmente 3 client: 1 base (JS puro con qualche immagine al più), 1 WebGL+Unity 2D (grafica pixelata), 1 WebGL+Unity 3D (informazioni di input per mirare, ad es., in base a dove punto nello schermo. Qualcosa di simile anche per 2D). Tutti i client stessi JSON per comunicare al server!&lt;br /&gt;
* photogrammetry, https://medium.com/realities-io/getting-started-with-photogrammetry-d0a6ee40cb72&lt;br /&gt;
* roll20.net .. c'è '''davvero''' molto&lt;br /&gt;
* readthedocs.org&lt;br /&gt;
* css dinamici: sass, https://zurb.com/playground/motion-ui (zurb)&lt;br /&gt;
* progressive web apps: offline with server works. https://it.wikipedia.org/wiki/Progressive_Web_App ; responsive web design&lt;br /&gt;
* https://www.youtube.com/watch?v=CGz-h-DzJDU e relativi link, https://essentialsdocs.fandom.com/wiki/Attack_animations , (google: pokemon move animation editor/sprite)&lt;br /&gt;
&lt;br /&gt;
==== Altro (scartato)====&lt;br /&gt;
* rpgmaker, godot, aseprite, pixelart (in generale), ma anche phaser, piskel&lt;br /&gt;
* joomla! Per far prima con html&lt;br /&gt;
* libreria pygame&lt;br /&gt;
* Vuegg: https://github.com/marketplace/vuegg  &lt;br /&gt;
* Material Design&lt;br /&gt;
* eclipse IDE&lt;br /&gt;
* JAVA: Class.forName(&amp;lt;name&amp;gt;.class).newInstance();&lt;br /&gt;
&lt;br /&gt;
===Copia&amp;amp;incolla generale, da smistare in sotto capitoli. Contiene anche '''tutte''' note del telefono (al 22/02/2020)===&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 1:'''&lt;br /&gt;
&lt;br /&gt;
Mosse che trasformano l’avversario: attenzione è una mossa devastante. Trasformazione totale o parziale. Si devono poter aggiungere mosse, strumenti dinamicamente. Battle bot:ribaltano, scintille, elementi (Oggetti) che danneggiano. One piece: I frutti del diavolo (悪魔の実 Akuma no mi?) sono frutti misteriosi che donano poteri soprannaturali a chi li mangia, rendendoli però incapaci di nuotare. Di conseguenza il contatto con l'acqua di mare o con una speciale sostanza conosciuta come agalmatolite indebolisce gli utilizzatori di frutti del diavolo e li priva dei loro poteri. Alcune persone sono inoltre in grado di ricorrere all'Ambizione (覇気 Haki?), una forza spirituale che permette di avvertire la presenza di altri esseri viventi e di predirne i movimenti, di irrobustire parti del corpo e di intimidire o fare svenire le creature con una debole forza di volontà. Personaggio ha funzione baricentro_x, baricentro_y calcolate come (from_x+to_x)/2 sul quale si basa la funzione di libreria getDistance(Personaggio A, Personaggio B, float success); tale funzione serve per calcolare per i PNG e per i PG se ha senso usare una mossa. Non-onniscienza: delle volte non si può sapere distanza avversario e fallisce la mossa per la distanza -&amp;gt; “float success” rappresenta la probabilità di successo (Personaggio ha parametro “osservare”). PNG di due categorie: offensivi o neutrali (no priorità a mosse di attacco, ma tutto casuale). Mosse e oggetti per chiamare Personaggi, magari non necessariamente alleati (2 mosse e 2 oggetti quindi necessari), richiamo di un personaggio preciso o di uno a caso. Ogni mossa/azione deve avere un tempo di attesa espresso in turni (alla meglio 0) per poter ripetere la mossa/azione. Strumenti anche mezzi di trasporto di aria, di terra, di acqua (o lava/palude). Possono attivare una metamorfosi / Unione per cambiare stats personaggio. Veicoli con armi o riparo. Gli strumenti da trattare come gli oggetti. Classe unica? I match/partite (immagino Classe Partita) devono avere variabile boolean “respawn”, per distinguere death match a punti con death match con una vita. Wrestling per ispirarsi nella lotta libera: calci pugni ginocchiate prese lanci salti testate gomitate ecc. Per punti si vince a un limite o dopo un tot di mosse , oppure al primo dei due raggiunti (max_punti e max_mosse parametri di Partita). I punti si guadagnano alla kill (un Punteggio per squadra, int punteggio salvato localmente dentro ogni Personaggio che ha la variabile int squadra). Si guadagnano tanti punti quanti sono i punti della variabile “valore” del personaggio ucciso, tale variabile è calcolata come somma dei valori di tutte le mosse/stats ect del Personaggio. Imperium civitas. Attacco dei giganti. Possibilità di morire se colpiti in un unico punto (tallone d Achille) implementabile come variabile boolean. Jump force. Game dev tycoon. Acqua diventa tsunami. Variabile int per attacco cumulativo di gruppo: es calciatori che più si passano la palla più l’attacco è forte. Suolo magico: non tutti i personaggi possono accedervi, array di string elenca i nomi di chi può accedervi. Funzione esci/entra in classe Personaggio per simulare scambio pokemon 6vs6. Piovra gigante. Rischio=danno*probabilita. Mossa su strumento e con strumento?&lt;br /&gt;
Mosse fisiche per arrampicarsi su avversario(se e solo se sei la metà di dimensioni(?)), atterrarlo, lanciarlo, accecarlo, immobilizzarlo. Se sei in gruppo/ orda bonus ad attacchi combinati. Armi: fruste e scheggie, corni che si suonano per chiamare altri. Tipo della mossa con moltiplicatore tra 0 (immune) e 2 (float): acqua, fuoco, magia, terra: da ispirarsi ai pokemon ma non da copiare, penso. Armi da campo: cannoni e catapulte. Veicoli d’acqua: moto acqua, canoe, barche a motore a remi. Nei veicoli malus su attenzione (variabile int in personaggio, indica attenzione in combattimento e non in altro) perché si è impegnato alla guida . All’inizio in image view “the hero” e “the map”. Condizione vittoria (oltre a morte, punti, o numero mosse, cioè tempo) morte di un singolo Personaggio, che potrebbe rappresentare un edificio, cassaforte o simili. Personaggio si può svestire e lasciare strumenti, modificano statistiche di attacco, difesa , agilità, ect. Variabile luce o non luce, che peggiora/migliora a seconda della specie la visibilità, quindi la precisione , specie in attacchi a distanza: Scurovisione evita i malus.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 2:'''&lt;br /&gt;
&lt;br /&gt;
Gioco2: se ci si lancia da oggetti , dopo essersi arrampicati, possono esserci danni da caduta; strumenti come paracaduti o mosse magiche possono evitare i danni. Pozione del vento, soffi e devi attacchi. In difesa puoi parare, schivare, deviare: tre variabili? Ambiente: colline e pianure uguali, Monti sono Oggetti, picco ossia un unico monte oggetto. Rocce volanti, nuvole sospese: oggetto può essere sospeso e può fare periodicamente una mossa, ad es tuono, può spostarsi, può fare entra/esci, oggetto albero e oggetto foresta, si possono prendere, nascondersi, arrampicarsi, lanciarli, ostacolano velocità ma se si ha abbastanza forza si spezzano alberi. Acqua poco profonda, profonda, molto profonda: variabile boolean in Personaggio “alto” per toccare in acqua profonda, con acqua si generano fiumi laghi e mari. Ambiente si deve poter evolvere: ad esempio oggetto diga può fare metamorfosi e diventare oggetto cascata/torrente in piena. Per edifici più oggetti che rappresentano le mura e il tetto, variabile boolean per oggetto per entrare nell’oggetto. Possono essere spazzati via: danni da crollo, si può combattere all interni, contengono strumenti come tavoli sedie mobili letto ect. Se uno viene schiantato contro uno strumento prende danno(es danno da schianto). Ci possono essere scale, si può non avere contatti visivo sull’avversario. Oggetto mura, oggetto torre, oggetto casa interno sono cose distinte: possono dare malus/bonus su visibilità. Ambiente: pozzi e grotte, da gestire come interno casa. Lava come acqua, ogni oggetto può essere sorgenti di liquido: monte sorgente acqua, vulcano sorgente lava. Può esserci variabile probabilità eruzione, se settata a 1 c’è una continua eruzione. Strade di vario tipo, sovrapposta a altri suoli, migliorano velocità di alcuni strumenti, variabile boolean “ha le ruote” in classe strumenti. Unificare classe strumento e classe oggetto. Oggetti sospesi: case sospese su albero, ad es. Fiamme in mezzo al suolo. Oggetti: porto, aereoporto, grattacieli, dighe, impianti a fune, ospedali per curarsi e prendere oggetti per curarsi dopo, scuole contenenti libri per apprendere una mossa, luoghi di ingegneria per creare oggetti, ad esempio veicoli o armi, soldi nel gioco per comprare da eventuali venditori. Ogni oggetto avra un prezzo (valutabile circa in euro per semplicità). Variabile float per fame, sete, sonno, caldo-freddo (parte da 0.5). Nella mappa ci deve essere per ogni punto la temperatura. Possibilità di vomito, dissenteria, problemi cardiaci, respiratori, muscolari. Armi: balestra, mani nude, sasso, tirapugni, torcia accesa. Armature: intralciano o favoriscono agilità, attacco, poteri magici, rumorosa (elusione), è uno strumento/oggetto. Attacchi possono essere prolungati per turni, mosse variabile boolean prolungabile: può aumentare o diminuire intensità, c’è un max espresso in turni di prolungabilita, inoltre può essere leggermente alterato con una variabile casuale. Equipaggiamento (strumento/oggetto): pietra focaia, attrezzi da scalata, boccale di birra, cavallo, moto, chiodi, martello da fabbro, corda, corazza, dardo, faretra/zaino/sacca (oggetti che contengono una lista di oggetti, stringhe) con un numero per la quantità) e capacità massima zaino e ogni oggetto può avere un valore intero per dimensione (es martello 3, ascia grande 7), mantello, olio, variabile boolean prende fuoco/conduce elettricità, amplifica magnetismo, aumenta esplosioni nucleari, aumenta forza di gravità (?), pala, piccone, rampino, specchio, per osservare quando si è nascosti e si ha malus su visibilità. Strumenti da scasso per aprire porte: variabile boolean per oggetti: entrata con scasso. Personaggio: string razza per swag, immunità a veleni e malattie, elusione, agilità, precisione, abilità magiche(?), difesa fisica. In ultima torcia: agilità, coraggio, forza, intelligenza, magia, manualità, percezione, socialità. Bestiario: aracnoide di varie dimensioni, talpe giganti, vermi giganti di terra di mare e di lava ect, bulbo trascinatore che ha tentacoli per tirare a se e mangiare, lui è immobile, calabrone gigante, serpenti giganti, cinghiali, draghi, elfi, goblin e re goblin, sciamani (goblin), totem di guerra come strumento/oggetti per alterare statistiche nella loro area di influenza, lupo, mastino bruciante, nani, non morti/zombie/mummia/scheletro variabile boolean vivo a false ma ha ancora hp su parti del corpo: variabile boolean “zombizabile”. Orchi, pesci da terra (anfibi) tritone dell abisso, troll e trollin (orchi più deformi), umani. Abilità dei personaggi in ultima torcia: artificiale (robot) immunità a soffocamento, veleni, malattie ect immune a manipolazioni psichiche, visione oscurità; danno da attacco in carica; fiammegiante ossia la creatura può incendiarsi e elettrizzante ossia può diventare elettrica caricamente; modalità furia/mailmen ossia ottiene bonus su alcune/tutte le statistiche; gigantesco o molto piccolo due boolean (?forse non serve); immunità a magie mentali, al fuoco; linguaggi (?); non morto; danno da attacco in presa; pungiglioni velenosi; sa muoversi su ragnatele o è rallentato, resistenza a perforazione, respirare sott’acqua o sotto lava o nei liquidi in genere; rigenerazione; riceve danni dalla luce solare o da assenza di luce; è terrorizzato/impaurito/intimidito o se è imperturbabile boolean. Danno da trascinamento; paralizzante; può diventare più veloce (?non serve); visione a infrarossi attraverso oggetti; volare o andare sotto terra. Imperium editor, cose che penso di non aver ancora scritto: stagioni, suolo erboso o terriccio, sabbia con erba e terra e da sola, strade e stagioni, altitudine, alberi e arbusti, vari tipi a foglia larga, conifere, alberi secchi, palme, arbusti verdi e secchi, cactus, alghe marine, rocce e pietre, scheletri per terra, legna tagliata (alberi tagliati), carri e carretti, grotte e rovine per accessi sotterranei, locande, templi, accampamenti, fortini, monoliti, fontana, tombe e cimiteri, borse per terra, pozzo, troni, croci(del teschio), pozzo, capanne, lapidi, ponti, recinzioni, falò, tende, torri, panoplia, fessure come abissi, statue, rovine (deserto) come case distrutte, colonne per costruire templi, piramidi, sfingi, bandiere, rovine in Europa, campi coltivati che contengono cibo, fiamma (in altre), roccia in altre per montagne, altre-&amp;gt;rovine per monumenti non egiziani ma europei.&lt;br /&gt;
Ci sono paludi. Tende da campo. Forti, porti. Edifici delle fortezze, edifici dei villaggi. Naufragi e scogli.&lt;br /&gt;
Parametri voglia/impegno float per descrivere voglia di combattere Personaggio. Ricevi danno uscendo dalla mappa tra 1-5% tra 6-10% tra 11-15% della vita totale di ogni parte del corpo per ogni turno di gioco. Danno da precipitazione diverso da carica, uno verticale uno orizzontale, se precipiti da molto in alto hai bonus, oltre che danni da schianto lol. Baionette, formazione a blocchi, a quadrato (difensiva) sparano su quattro lati, a schiera vanno avanti. Usano un colpo poi lunga ricarica. Variabile boolean per attivare o meno fuoco amico. Azione per cambiare posizione: in piedi, in ginocchio(inteso come via di mezzo), sdraiato: per permettere migliore visibilità a chi è dietro (nella formazione).&lt;br /&gt;
Altruismo, coraggio, spingere oltre il limite, difendere al posto di un altro, migliorare posizione per avere bonus. Mosse da usare in condizioni psicologiche idonee: mosse estreme per disperazione, bonus unici. Condizioni per situazioni: blocco, spalle al muro, stritolato, confuso, semi parassiti addosso, azzoppato, bagnato d’acqua, lame affilate, corazza indurita, tante copie di me stesso attive, preveggente. Per ambiente:pioggia (torrenziale), barriera a cupola, punte metalliche a terra, blocco di fumo nero. Far volare un avversario/alleato. Tutti possono fare tutto sotto effetti magici o fisici. Un cavallo può volare se viene preso da un uccello e portato in alto.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 3, 4:'''&lt;br /&gt;
&lt;br /&gt;
Gioco1,2,3,4: tutto caricato su wikis.&lt;br /&gt;
&lt;br /&gt;
Gioco3: Mosse con caricamento + spostamento (es. kameamea con teletrasporto). Ciclo di interazione principale:crea o combatti. Modalità campagna, che chiede in input da che battaglia iniziare, ma implica tipi battaglie prefissati. Alla morte/sconfitta di un personaggio si possono alterare statistiche (es personaggio può cambiare fazione). Alcune mosse possono lasciare oggetti sul terreno: (ad es, radici di Groth). Ogni oggetto può alterare le statistiche al passaggio sopra, nelle vicinanze. Boolean invisibile per personaggio, diverso da elusione infinita. Se personaggio va in un altro dimensione -&amp;gt; unreachable. Attacco coordinato, se non lo fanno tutti vale lo stesso ma depotenziato opportunamente . Personaggio in modalità maniac (2 mosse per turno) e in modalità depressive (1 mossa ogni due turni); personaggio Flash può fare 10 mosse in un turno. Chiudi con lucchetto oggetto da dentro o da fuori, oggetto ingresso in oggetto casa , più ingressi per un singolo oggetto.nicole aniston. Rimbalzo se ci si schianta contro oggetto da calcolare con parametro. Ryuk e Darkrai.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gioco 4 23/07/2019:&lt;br /&gt;
Pula fiction, aracnidi, oggetto: due superfici rettangolari di forma diversa, anche inclinate , collegate. Più pezzi collegati tra loro per forme cilindriche cave, ad esempio, tipo vulcano. Mappa con sprite personaggi, canvas: anche mouseClick? Statistiche con nome gerarchico, es pokemon_attacco. Modalità survival, stile isola di jurassic park gdr; sia in coop che contro; possibilità di fare N turni di fila se non ci sono altri player giocanti nelle vicinanze (ciò però comporterebbe , in modalità contro , di capire quando c’è qualcuno nelle vicinanze perché si andrebbe di 1 turno alla volta, soluzioni: in mod contro 1 turno per volta oppure meccanismo di sincronizzazione turni quando uno vede l’altro (anche furtivo) come c’è attacco 1 turno a testa) .. analogo a Battle royale(?); inizio con starter kit random. Modalità assedio al castello. Inoltre se posso fare N turni di fila si può pensare a più pc , uno per persona , coordinati per fare comandi in parallelo, ma va ben congegnato meccanismo di sincronizzazione. Parti DelCorpo -&amp;gt; Componente/i oppure Parte. La mappa deve essere (x,y); l’altezza viene indicata onMouseOver certi pixel dove è posto il Personaggio; se personaggio dentro edificio/grotta cambio img (es sfocato/tratteggiato). Mosse: astrarre per target; molte mosse sono simili tra loro, somiglianza va sfruttata, hanno magari dei target in comune, o variano solo per un parametro. Creare mappa anche con drag and drop immagini ?(un po’ difficile). Più layout per interfaccia grafica (esempio uno che mostra errori input su text area, uno con alert, uno su box text area separato). Input comandi consumato pezzo per pezzo, alcune parole se prevedono parametri quando riconosciute fanno fetch anche di parola (numero) successiva. Face toon foto? Import parziali di personaggi (tutto tranne/solo questi campi specificati). Texture mappa complete o ripetibili (es per suolo). Anteprima battaglia stile battaglia pokemon (magari per 1/2/3 vs 1/2/3) per rappresentare scontro. Conviene usare xslx (excel) per dati, considerare che può non servire la libreria Java per leggere stringhe per operazioni. Mossa “again” , ripeti la precedenza(opportuna modifica parametri, es mossa spostamento). Possibile gestione contromosse: si usano marker (tag): ogni mossa ha elenco tag del tipo di contromosse che può subire (con probabilità annessa, che può dipendere da pg che subisce mossa congiuntamente a mossa stessa). Ogni mossa inoltre deve essere taggata come possibile contromossa che il pg può usare (per schivare può fare in più modi). A seconda del lancio del dado il pg che effettua La contromossa può anche scegliere tipologia di contromossa o solo la mossa della tipologia che ha beccato (entrano in gioco riflessi ect.). I parametri che fanno attivare unq o un’altra contromossa sono dinamici, posso dipendere ad esempio dalla posizione tra i due pg o altre statistiche. Tag contromosse a fasce (es. coprirsi è sempre più facile che schivare che e più facile di schivare e contrattaccare (?); all’interno dello stesso schivare e contrattaccare ci sono più sotto categorie). Per aggiunta personaggio può essere utili interfaccia dedicata, non linea di comando (o altre operazioni, specie se ci sono tabelle). Mossa “premonizione”: predire il futuro a breve termine, dici che mossa vorresti fare e ti dice esito (o più esiti se uno chiede più mosse). Funziona solo sulla prossima mossa. Contromossa delle contromossa gestione?? Eventualmente nell’esito si prevede ancore contro-contromossa. Ma si innesca reazione a catena, inoltre da gestire scelta contromossa in questo caso. Applicazione tag conoscenza(universo di appartenenza): “Termoli”, “pokemon”, “liceo classico Termoli”, anche gerarchici, per filtrare sui personaggi.target componibili , fattorizzato creazione mosse, hanno un costo magari per indicare quantovoccupano dicuna mossa, relativo maybe a un parametro o più del target stesso. In particolare, non saranno salvate le mosse per un personaggio (o solo alcune “preferite”) ma il suo insieme di target i quali devono dire:statistica che influenzano, “costo del turno” che richiedono al variare dell’intensità del target (che aumenta linearmente, esponenzialmente, generica f(x)) quindi corsa blanda costo 1 , Max corsa costo 5 (max), elenco (string) target incompatibili con tale target (se serve), nota relative ad es per quando uno vuole creare una mossa durante la battaglia (“target corsa, max sforzo dedicabile 4 ect” metti “50 metri corsa” “ok/troppo! Vuoi sforzati di più rischiando effetti collaterali?”). Si può autoscrivere la voce narrante del gioco come “la tua coscienza” mentre che giochi, d’altronde si interagisce con essa. Considerare che un target può appartenere a più personaggi, magari sotto nomi di mosse diversi.&lt;br /&gt;
Definire gerarchia di personaggi per template (tipo classe e super classe) e template importabili (tipo usa fuoco). Es umanoide non umanoide, tra umanoide maschio- femmina etc. Classe che estende System.out per creare funzioni che aggiungono Header “DEBUG:” etc; due programmi Java , due main: uno delegato a calcoli + gestione Excel; altro legge stdout dell altro per interfaccia grafica. Per allenare PG creare dei PG fantocci con label per fare Q-learning iniziale, più avanti far allenare pg tra loro; creare vari fantocci: tank terrestre fisico, healer volante etc. Excel: si usa css che si può rendere tabellare, più facile da trattare nel codice rispetto a .xslx. Ogni “utente” ed Lostefra ha il suo personale dizionario con sue personali short cut da usare in partita, eventuale login con password (opzionale) x accesso. Vedere license show down. Mappa unica stile giochi di ruolo, si vede tutto da sopra: click o simili su edifici/caverne per mappe interne a tale posto, così ok sprite e per rappresentare “pg in volo” sprite dedicato. Densità aria per dire quando anche un uomo per es può volare. Ipotesi più efficiente per dare un valore stima al pg: AI base che gioca a manetta contro altre AI base e dalle vittorie si fa l’euristica, più vittoria facile/veloce/stracciante più punti, contro vari pg, contro pg standard bench mark.&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Note&amp;diff=208</id>
		<title>Note</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Note&amp;diff=208"/>
		<updated>2020-07-13T21:08:07Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: /* Deploy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Note ==&lt;br /&gt;
&lt;br /&gt;
'''Vedere altre note su fogli di carta e promemoria del telefono. Ce ne sono molte.'''&lt;br /&gt;
'''La copiatura dai fogli di carta dei continuare da pagina 4 (&amp;quot;alterare param..&amp;quot;).'''&lt;br /&gt;
&lt;br /&gt;
===Inspirational Concepts===&lt;br /&gt;
* Gioco Lotta (Pokémon, Pokkén)&lt;br /&gt;
* no caselle esplicite&lt;br /&gt;
* Descrizione rispetto a: ambiente, nemico, oggetti&lt;br /&gt;
* pokémon, DnD, Call of Duty, Super Smash Brawl, corse pazze&lt;br /&gt;
* concentrarsi su: fluidi, telecinesi, razze, bonus/malus, gradi di libertà (fisicamente parlando) &lt;br /&gt;
* scacchi (es. crea casella), shaolin showdown&lt;br /&gt;
* prevedere = creatività&lt;br /&gt;
* acqua, aria, fuoco, terra&lt;br /&gt;
* gravità (newton), verso alto, basso, destra, sinistra, circolare, tutti i versi&lt;br /&gt;
* jumanji, savana, animali, zoologia&lt;br /&gt;
* tempo/spazio&lt;br /&gt;
* BF4, pirati, roma (imperium civitas)&lt;br /&gt;
* musica come arma (rap)&lt;br /&gt;
* magia, prestigiatori&lt;br /&gt;
* dinosauri (documentario, libro, zoologia)&lt;br /&gt;
* avengers, supereroi (libro)&lt;br /&gt;
&lt;br /&gt;
* Looney toons&lt;br /&gt;
* pokemon mystery dungeon (da googlare, escono vari siti con pdf e stats)&lt;br /&gt;
* question tool-for-combat-management: https://rpg.stackexchange.com/questions/171188/tool-for-combat-management&lt;br /&gt;
&lt;br /&gt;
===Personaggi (con statistiche e stati)===&lt;br /&gt;
* combattenti (con statistiche e stati)&lt;br /&gt;
* immagine rappresentativa per rappresentare meglio&lt;br /&gt;
* HP: colore rosso su immagine personaggio, dove sei debole/già colpito (idea scartata)&lt;br /&gt;
* penitenza: il malus può essere inteso come ciò che c'è nell'inserimento successivo, malus cumulativo&lt;br /&gt;
* essere ipocrita, finzione (schermo)&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (personaggi)&lt;br /&gt;
* metamorfosi&lt;br /&gt;
* alchimisti&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* possibilità giù in terra/ giù in acqua, con reachable e unreachable Boolean. Fuori da mappa anche reachable e unreachable.&lt;br /&gt;
* Personaggi composti di parti[] es. testa, busto, gambe, braccia, coda, pinna, ali. Distinzione per arto di movimento e/o spostamento boolean.&lt;br /&gt;
* Arti possono provocare danno, bruciatura , paralisi a contatto (Boolean) . Percentuale di probabilità accompagna ogni Boolean.&lt;br /&gt;
* Ogni parte del corpo punti vita + se inutilizzabile + amputata + stato (es paralisi).&lt;br /&gt;
* Per fare battaglie tra molto grandi =&amp;gt; 1 m lo si intende come 10m.  (rivalutato, aumentare livello scaling)&lt;br /&gt;
* Personaggio fusionabile Boolean + string nomi con cui si fonde.&lt;br /&gt;
* Distinzione tra infernape e infernape1/2/3 ect tra “specie” e “nome”.&lt;br /&gt;
* variabile Boolean respawnable.&lt;br /&gt;
* Raccogliere a piene mani da: https://spore.fandom.com/wiki/Creature_Editor&lt;br /&gt;
* Ad esempio weapons come elemento di Corpo (zanne, corna) e possibilità di muoversi/attaccare furtivamente.&lt;br /&gt;
* Divisibile e unibile come boolean e array di stringe associate per indicare i nomi con cui si unisce il Personaggio o in cui si divide.&lt;br /&gt;
* Variabili posizione nome: from_x/y ; to_x/y.&lt;br /&gt;
* Classe Stato, Personaggio contiene Array di stato, stato contiene moltiplicatori per statistica es attacco velocità precisione elusione ect.&lt;br /&gt;
* Personaggio deve avere una stat tipo sanità mentale, intelligenza, quanto è confuso e quanto è impaurito (2).&lt;br /&gt;
&lt;br /&gt;
* Per personaggi molto piccoli (meno di 1m x 1m x 1m) possibilità di essere in (x,y,z) tra 0 e 1.000.000 (ordine del micrometro, 1*10^-6 == 0,000001) e avere (lenX, lenY, lenZ). In questo modo sono definite dimensioni inferiori ad 1 m^3.&lt;br /&gt;
* personaggi max 20x20 (rivaluato, meno limitata)&lt;br /&gt;
&lt;br /&gt;
===Mosse===&lt;br /&gt;
* &amp;quot;combattimento prescinde da combattente&amp;quot;&lt;br /&gt;
* mosse hanno: direzione, azione, attacco (mosse pokémon)&lt;br /&gt;
* Parametri interi per mossa (direzione, consumabili) con lower e upper bound&lt;br /&gt;
* camuffarsi =&amp;gt; DnD manuale&lt;br /&gt;
* wrestling (libro) per le mosse/prese&lt;br /&gt;
&lt;br /&gt;
* X fa una mossa contro Y: Z potrebbe reagire (Es. ricevendo il colpo al posto di Y). Può essere realizzato sia come se &amp;quot;Y chiede soccorso Z&amp;quot; o come reazione di alleati adiacenti &amp;quot;Z soccorre Y&amp;quot;&lt;br /&gt;
* Mossa prende come parametro di ingresso Corpo, ossia la parte del corpo coinvolta nella mossa (es arto , tutto corpo ect). &lt;br /&gt;
&lt;br /&gt;
===Oggetto (con statistiche e stati)===&lt;br /&gt;
* armi: lacci (stati), lame (potenze), sassi, reti, pistole (munizioni), razzi, bombe (potenze), fuoco (d'artificio?) =&amp;gt; manuale DnD&lt;br /&gt;
* veleno n modi =&amp;gt; DnD manuale&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (oggetti)&lt;br /&gt;
* automezzi con cannoni, variabile 'hasEntrata', 'tempoRiutilizzo'&lt;br /&gt;
* violino come arma (tutti strumenti musicali): a fiato, a corda, a percussione&lt;br /&gt;
* veleni, ampolle e flaconi magici, insieme di 'oggetti dentro' un oggetto&lt;br /&gt;
&lt;br /&gt;
* Classe oggetto: es albero, roccia, casa: forza necessaria per sradicare + forza per lanciare + destrezza / agilità per appendersi + nascondersi in proporzione alle dimensioni di chi si nasconde. &lt;br /&gt;
* Altri es. pali. Sotto terra o sotto acqua/lava/melma o simili. &lt;br /&gt;
* Acqua rallenta se non hai pinne boolean.&lt;br /&gt;
* Classe strumento per oggetti che si tengono in mano, es reti , pistole, spade, pugnali, scudi, elmi, lancia, arco , frecce, lanciarazzi, fucili cecchino, fucile assalto, corde.&lt;br /&gt;
* Strumenti e mosse: danno ad area, perforante, contundente (vedi dnd armi). Mosse possono creare/modificare/distruggere oggetti e strumenti.&lt;br /&gt;
* Oggetti del campo di gioco incidono su elusione (parametro di personaggio).&lt;br /&gt;
* Buco/abisso (boolean) per dire se c’è o meno il suolo (Suolo come classe?). &lt;br /&gt;
* Radiazioni. &lt;br /&gt;
&lt;br /&gt;
===Modalità gioco===&lt;br /&gt;
* turnazione&lt;br /&gt;
* 1 v 1 v 1 etc., ma anche squadre casuali&lt;br /&gt;
* punteggio: chi fa più punti, più uccisioni, definizione di 'punto', gioco per perdere&lt;br /&gt;
* inserisci personaggio total random&lt;br /&gt;
&lt;br /&gt;
* Modalità battaglia con interazione stile battaglia navale (non si vede mossa dell'avversario)&lt;br /&gt;
* Modalità di gioco: tutti contro tutti (battle royale), death match, vs CPU mode zombie(attaccano solo, se non possono vanno verso nemico): serve introdurre un punteggio, di sicuro per mode zombie , ma anche per death match e tutti contro tutti&lt;br /&gt;
* ingressi: ne entra un altro?&lt;br /&gt;
&lt;br /&gt;
===Mappa===&lt;br /&gt;
* arene&lt;br /&gt;
* minimappa (pixelata ?), legenda oggetti base, devono esserci caselle implicite&lt;br /&gt;
* mappa 100x100 (rivalutato, meno limitata)&lt;br /&gt;
* Cannoni fissi in mezzo al campo (strumento).&lt;br /&gt;
&lt;br /&gt;
===Funzionalità generali===&lt;br /&gt;
* Chiave: non una flat input box per i comandi; ma dinamica: si suppone il soggetto &amp;quot;io&amp;quot; (le azioni le fanno in prima persona i personaggi), ogni mossa deve prevedere dei complementi (&amp;quot;verso&amp;quot;, &amp;quot;tra quanto&amp;quot;, &amp;quot;cosa&amp;quot;, &amp;quot;a favore di chi&amp;quot;, &amp;quot;contro chi&amp;quot;). Ogni complemento collegato con box stile in pop up =&amp;gt; bootstrap (la grafica sara unica). Prevedere anche modalita flat con input del tipo &amp;quot;azione a=pippo verso=termoli&amp;quot; (regex check)&lt;br /&gt;
* &amp;quot;meno tabelle&amp;quot;, &amp;quot;no bottoni&amp;quot; e solo foto che si alternano, &amp;quot;la grafica serve&amp;quot;: text box unica interazione, text area (history), immagine personaggio e immagine mappa&lt;br /&gt;
* &amp;quot;persistenza anche da interfaccia grafica&amp;quot;, diritti di scrittura sui file?&lt;br /&gt;
* Segnalazione (comando per fare nota)&lt;br /&gt;
* Modellare statistiche con funzioni probabilistiche (Gaussiane, esponenziali, uniformi, etc.) con relativa media e varianza piuttosto che individuare fasce/scaglionamenti (meno realistici e meno belli)&lt;br /&gt;
&lt;br /&gt;
===Deploy===&lt;br /&gt;
* &amp;quot;commenta il codice&amp;quot;, &amp;quot;dividi et impera&amp;quot;&lt;br /&gt;
* Server web (Apache) ospita partite (+ localmente ha i file di funzionamento), in LAN client giocano o da remoto con IP pubblico. Interfaccia HTML5 + Javascript per giocare. Studiare engine grafici Javascript&lt;br /&gt;
* bootstrap! (specie per input box)&lt;br /&gt;
* https://bit.dev/ per molti componenti web&lt;br /&gt;
* React, React Native .. forse meglio di Vue per diffusione&lt;br /&gt;
* Unity, WebGL (vedi SDK dedicata, built per Android/iOS/etc.)&lt;br /&gt;
* Modelli 3D videogiochi: https://www.models-resource.com/ , meglio se disaccoppiati da Unity (e.g. in cartelle independenti), aggiunta modelli online&lt;br /&gt;
* creare modelli: blender. creare disegni: krita&lt;br /&gt;
* Tutorial tank Unity: https://learn.unity.com/project/tanks-tutorial ; modelli: https://opengameart.org/&lt;br /&gt;
* WebSocket per gestire client asincroni (NodeJS ?)&lt;br /&gt;
* Su YT in “guarda più tardi” video per interagire unity con JS (“unity.sendMessage()” o simili)&lt;br /&gt;
* Due client: uno con WebGL e uno JS base con solo input (per test, per mancanza di supporto browser a WebGL). Eventualmente 3 client: 1 base (JS puro con qualche immagine al più), 1 WebGL+Unity 2D (grafica pixelata), 1 WebGL+Unity 3D (informazioni di input per mirare, ad es., in base a dove punto nello schermo. Qualcosa di simile anche per 2D). Tutti i client stessi JSON per comunicare al server!&lt;br /&gt;
* photogrammetry, https://medium.com/realities-io/getting-started-with-photogrammetry-d0a6ee40cb72&lt;br /&gt;
* roll20.net .. c'è '''davvero''' molto&lt;br /&gt;
* readthedocs.org&lt;br /&gt;
* css dinamici: sass, https://zurb.com/playground/motion-ui (zurb)&lt;br /&gt;
* progressive web apps: offline with server works. https://it.wikipedia.org/wiki/Progressive_Web_App ; responsive web design&lt;br /&gt;
* https://www.youtube.com/watch?v=CGz-h-DzJDU e relativi link, https://essentialsdocs.fandom.com/wiki/Attack_animations , (google: pokemon move animation editor/sprite)&lt;br /&gt;
&lt;br /&gt;
==== Altro (scartato)====&lt;br /&gt;
* rpgmaker, godot, aseprite, pixelart (in generale), ma anche phaser, piskel&lt;br /&gt;
* joomla! Per far prima con html&lt;br /&gt;
* libreria pygame&lt;br /&gt;
* Vuegg: https://github.com/marketplace/vuegg  &lt;br /&gt;
* Material Design&lt;br /&gt;
* JAVA: Class.forName(&amp;lt;name&amp;gt;.class).newInstance();&lt;br /&gt;
&lt;br /&gt;
===Copia&amp;amp;incolla generale, da smistare in sotto capitoli. Contiene anche '''tutte''' note del telefono (al 22/02/2020)===&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 1:'''&lt;br /&gt;
&lt;br /&gt;
Mosse che trasformano l’avversario: attenzione è una mossa devastante. Trasformazione totale o parziale. Si devono poter aggiungere mosse, strumenti dinamicamente. Battle bot:ribaltano, scintille, elementi (Oggetti) che danneggiano. One piece: I frutti del diavolo (悪魔の実 Akuma no mi?) sono frutti misteriosi che donano poteri soprannaturali a chi li mangia, rendendoli però incapaci di nuotare. Di conseguenza il contatto con l'acqua di mare o con una speciale sostanza conosciuta come agalmatolite indebolisce gli utilizzatori di frutti del diavolo e li priva dei loro poteri. Alcune persone sono inoltre in grado di ricorrere all'Ambizione (覇気 Haki?), una forza spirituale che permette di avvertire la presenza di altri esseri viventi e di predirne i movimenti, di irrobustire parti del corpo e di intimidire o fare svenire le creature con una debole forza di volontà. Personaggio ha funzione baricentro_x, baricentro_y calcolate come (from_x+to_x)/2 sul quale si basa la funzione di libreria getDistance(Personaggio A, Personaggio B, float success); tale funzione serve per calcolare per i PNG e per i PG se ha senso usare una mossa. Non-onniscienza: delle volte non si può sapere distanza avversario e fallisce la mossa per la distanza -&amp;gt; “float success” rappresenta la probabilità di successo (Personaggio ha parametro “osservare”). PNG di due categorie: offensivi o neutrali (no priorità a mosse di attacco, ma tutto casuale). Mosse e oggetti per chiamare Personaggi, magari non necessariamente alleati (2 mosse e 2 oggetti quindi necessari), richiamo di un personaggio preciso o di uno a caso. Ogni mossa/azione deve avere un tempo di attesa espresso in turni (alla meglio 0) per poter ripetere la mossa/azione. Strumenti anche mezzi di trasporto di aria, di terra, di acqua (o lava/palude). Possono attivare una metamorfosi / Unione per cambiare stats personaggio. Veicoli con armi o riparo. Gli strumenti da trattare come gli oggetti. Classe unica? I match/partite (immagino Classe Partita) devono avere variabile boolean “respawn”, per distinguere death match a punti con death match con una vita. Wrestling per ispirarsi nella lotta libera: calci pugni ginocchiate prese lanci salti testate gomitate ecc. Per punti si vince a un limite o dopo un tot di mosse , oppure al primo dei due raggiunti (max_punti e max_mosse parametri di Partita). I punti si guadagnano alla kill (un Punteggio per squadra, int punteggio salvato localmente dentro ogni Personaggio che ha la variabile int squadra). Si guadagnano tanti punti quanti sono i punti della variabile “valore” del personaggio ucciso, tale variabile è calcolata come somma dei valori di tutte le mosse/stats ect del Personaggio. Imperium civitas. Attacco dei giganti. Possibilità di morire se colpiti in un unico punto (tallone d Achille) implementabile come variabile boolean. Jump force. Game dev tycoon. Acqua diventa tsunami. Variabile int per attacco cumulativo di gruppo: es calciatori che più si passano la palla più l’attacco è forte. Suolo magico: non tutti i personaggi possono accedervi, array di string elenca i nomi di chi può accedervi. Funzione esci/entra in classe Personaggio per simulare scambio pokemon 6vs6. Piovra gigante. Rischio=danno*probabilita. Mossa su strumento e con strumento?&lt;br /&gt;
Mosse fisiche per arrampicarsi su avversario(se e solo se sei la metà di dimensioni(?)), atterrarlo, lanciarlo, accecarlo, immobilizzarlo. Se sei in gruppo/ orda bonus ad attacchi combinati. Armi: fruste e scheggie, corni che si suonano per chiamare altri. Tipo della mossa con moltiplicatore tra 0 (immune) e 2 (float): acqua, fuoco, magia, terra: da ispirarsi ai pokemon ma non da copiare, penso. Armi da campo: cannoni e catapulte. Veicoli d’acqua: moto acqua, canoe, barche a motore a remi. Nei veicoli malus su attenzione (variabile int in personaggio, indica attenzione in combattimento e non in altro) perché si è impegnato alla guida . All’inizio in image view “the hero” e “the map”. Condizione vittoria (oltre a morte, punti, o numero mosse, cioè tempo) morte di un singolo Personaggio, che potrebbe rappresentare un edificio, cassaforte o simili. Personaggio si può svestire e lasciare strumenti, modificano statistiche di attacco, difesa , agilità, ect. Variabile luce o non luce, che peggiora/migliora a seconda della specie la visibilità, quindi la precisione , specie in attacchi a distanza: Scurovisione evita i malus.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 2:'''&lt;br /&gt;
&lt;br /&gt;
Gioco2: se ci si lancia da oggetti , dopo essersi arrampicati, possono esserci danni da caduta; strumenti come paracaduti o mosse magiche possono evitare i danni. Pozione del vento, soffi e devi attacchi. In difesa puoi parare, schivare, deviare: tre variabili? Ambiente: colline e pianure uguali, Monti sono Oggetti, picco ossia un unico monte oggetto. Rocce volanti, nuvole sospese: oggetto può essere sospeso e può fare periodicamente una mossa, ad es tuono, può spostarsi, può fare entra/esci, oggetto albero e oggetto foresta, si possono prendere, nascondersi, arrampicarsi, lanciarli, ostacolano velocità ma se si ha abbastanza forza si spezzano alberi. Acqua poco profonda, profonda, molto profonda: variabile boolean in Personaggio “alto” per toccare in acqua profonda, con acqua si generano fiumi laghi e mari. Ambiente si deve poter evolvere: ad esempio oggetto diga può fare metamorfosi e diventare oggetto cascata/torrente in piena. Per edifici più oggetti che rappresentano le mura e il tetto, variabile boolean per oggetto per entrare nell’oggetto. Possono essere spazzati via: danni da crollo, si può combattere all interni, contengono strumenti come tavoli sedie mobili letto ect. Se uno viene schiantato contro uno strumento prende danno(es danno da schianto). Ci possono essere scale, si può non avere contatti visivo sull’avversario. Oggetto mura, oggetto torre, oggetto casa interno sono cose distinte: possono dare malus/bonus su visibilità. Ambiente: pozzi e grotte, da gestire come interno casa. Lava come acqua, ogni oggetto può essere sorgenti di liquido: monte sorgente acqua, vulcano sorgente lava. Può esserci variabile probabilità eruzione, se settata a 1 c’è una continua eruzione. Strade di vario tipo, sovrapposta a altri suoli, migliorano velocità di alcuni strumenti, variabile boolean “ha le ruote” in classe strumenti. Unificare classe strumento e classe oggetto. Oggetti sospesi: case sospese su albero, ad es. Fiamme in mezzo al suolo. Oggetti: porto, aereoporto, grattacieli, dighe, impianti a fune, ospedali per curarsi e prendere oggetti per curarsi dopo, scuole contenenti libri per apprendere una mossa, luoghi di ingegneria per creare oggetti, ad esempio veicoli o armi, soldi nel gioco per comprare da eventuali venditori. Ogni oggetto avra un prezzo (valutabile circa in euro per semplicità). Variabile float per fame, sete, sonno, caldo-freddo (parte da 0.5). Nella mappa ci deve essere per ogni punto la temperatura. Possibilità di vomito, dissenteria, problemi cardiaci, respiratori, muscolari. Armi: balestra, mani nude, sasso, tirapugni, torcia accesa. Armature: intralciano o favoriscono agilità, attacco, poteri magici, rumorosa (elusione), è uno strumento/oggetto. Attacchi possono essere prolungati per turni, mosse variabile boolean prolungabile: può aumentare o diminuire intensità, c’è un max espresso in turni di prolungabilita, inoltre può essere leggermente alterato con una variabile casuale. Equipaggiamento (strumento/oggetto): pietra focaia, attrezzi da scalata, boccale di birra, cavallo, moto, chiodi, martello da fabbro, corda, corazza, dardo, faretra/zaino/sacca (oggetti che contengono una lista di oggetti, stringhe) con un numero per la quantità) e capacità massima zaino e ogni oggetto può avere un valore intero per dimensione (es martello 3, ascia grande 7), mantello, olio, variabile boolean prende fuoco/conduce elettricità, amplifica magnetismo, aumenta esplosioni nucleari, aumenta forza di gravità (?), pala, piccone, rampino, specchio, per osservare quando si è nascosti e si ha malus su visibilità. Strumenti da scasso per aprire porte: variabile boolean per oggetti: entrata con scasso. Personaggio: string razza per swag, immunità a veleni e malattie, elusione, agilità, precisione, abilità magiche(?), difesa fisica. In ultima torcia: agilità, coraggio, forza, intelligenza, magia, manualità, percezione, socialità. Bestiario: aracnoide di varie dimensioni, talpe giganti, vermi giganti di terra di mare e di lava ect, bulbo trascinatore che ha tentacoli per tirare a se e mangiare, lui è immobile, calabrone gigante, serpenti giganti, cinghiali, draghi, elfi, goblin e re goblin, sciamani (goblin), totem di guerra come strumento/oggetti per alterare statistiche nella loro area di influenza, lupo, mastino bruciante, nani, non morti/zombie/mummia/scheletro variabile boolean vivo a false ma ha ancora hp su parti del corpo: variabile boolean “zombizabile”. Orchi, pesci da terra (anfibi) tritone dell abisso, troll e trollin (orchi più deformi), umani. Abilità dei personaggi in ultima torcia: artificiale (robot) immunità a soffocamento, veleni, malattie ect immune a manipolazioni psichiche, visione oscurità; danno da attacco in carica; fiammegiante ossia la creatura può incendiarsi e elettrizzante ossia può diventare elettrica caricamente; modalità furia/mailmen ossia ottiene bonus su alcune/tutte le statistiche; gigantesco o molto piccolo due boolean (?forse non serve); immunità a magie mentali, al fuoco; linguaggi (?); non morto; danno da attacco in presa; pungiglioni velenosi; sa muoversi su ragnatele o è rallentato, resistenza a perforazione, respirare sott’acqua o sotto lava o nei liquidi in genere; rigenerazione; riceve danni dalla luce solare o da assenza di luce; è terrorizzato/impaurito/intimidito o se è imperturbabile boolean. Danno da trascinamento; paralizzante; può diventare più veloce (?non serve); visione a infrarossi attraverso oggetti; volare o andare sotto terra. Imperium editor, cose che penso di non aver ancora scritto: stagioni, suolo erboso o terriccio, sabbia con erba e terra e da sola, strade e stagioni, altitudine, alberi e arbusti, vari tipi a foglia larga, conifere, alberi secchi, palme, arbusti verdi e secchi, cactus, alghe marine, rocce e pietre, scheletri per terra, legna tagliata (alberi tagliati), carri e carretti, grotte e rovine per accessi sotterranei, locande, templi, accampamenti, fortini, monoliti, fontana, tombe e cimiteri, borse per terra, pozzo, troni, croci(del teschio), pozzo, capanne, lapidi, ponti, recinzioni, falò, tende, torri, panoplia, fessure come abissi, statue, rovine (deserto) come case distrutte, colonne per costruire templi, piramidi, sfingi, bandiere, rovine in Europa, campi coltivati che contengono cibo, fiamma (in altre), roccia in altre per montagne, altre-&amp;gt;rovine per monumenti non egiziani ma europei.&lt;br /&gt;
Ci sono paludi. Tende da campo. Forti, porti. Edifici delle fortezze, edifici dei villaggi. Naufragi e scogli.&lt;br /&gt;
Parametri voglia/impegno float per descrivere voglia di combattere Personaggio. Ricevi danno uscendo dalla mappa tra 1-5% tra 6-10% tra 11-15% della vita totale di ogni parte del corpo per ogni turno di gioco. Danno da precipitazione diverso da carica, uno verticale uno orizzontale, se precipiti da molto in alto hai bonus, oltre che danni da schianto lol. Baionette, formazione a blocchi, a quadrato (difensiva) sparano su quattro lati, a schiera vanno avanti. Usano un colpo poi lunga ricarica. Variabile boolean per attivare o meno fuoco amico. Azione per cambiare posizione: in piedi, in ginocchio(inteso come via di mezzo), sdraiato: per permettere migliore visibilità a chi è dietro (nella formazione).&lt;br /&gt;
Altruismo, coraggio, spingere oltre il limite, difendere al posto di un altro, migliorare posizione per avere bonus. Mosse da usare in condizioni psicologiche idonee: mosse estreme per disperazione, bonus unici. Condizioni per situazioni: blocco, spalle al muro, stritolato, confuso, semi parassiti addosso, azzoppato, bagnato d’acqua, lame affilate, corazza indurita, tante copie di me stesso attive, preveggente. Per ambiente:pioggia (torrenziale), barriera a cupola, punte metalliche a terra, blocco di fumo nero. Far volare un avversario/alleato. Tutti possono fare tutto sotto effetti magici o fisici. Un cavallo può volare se viene preso da un uccello e portato in alto.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 3, 4:'''&lt;br /&gt;
&lt;br /&gt;
Gioco1,2,3,4: tutto caricato su wikis.&lt;br /&gt;
&lt;br /&gt;
Gioco3: Mosse con caricamento + spostamento (es. kameamea con teletrasporto). Ciclo di interazione principale:crea o combatti. Modalità campagna, che chiede in input da che battaglia iniziare, ma implica tipi battaglie prefissati. Alla morte/sconfitta di un personaggio si possono alterare statistiche (es personaggio può cambiare fazione). Alcune mosse possono lasciare oggetti sul terreno: (ad es, radici di Groth). Ogni oggetto può alterare le statistiche al passaggio sopra, nelle vicinanze. Boolean invisibile per personaggio, diverso da elusione infinita. Se personaggio va in un altro dimensione -&amp;gt; unreachable. Attacco coordinato, se non lo fanno tutti vale lo stesso ma depotenziato opportunamente . Personaggio in modalità maniac (2 mosse per turno) e in modalità depressive (1 mossa ogni due turni); personaggio Flash può fare 10 mosse in un turno. Chiudi con lucchetto oggetto da dentro o da fuori, oggetto ingresso in oggetto casa , più ingressi per un singolo oggetto.nicole aniston. Rimbalzo se ci si schianta contro oggetto da calcolare con parametro. Ryuk e Darkrai.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gioco 4 23/07/2019:&lt;br /&gt;
Pula fiction, aracnidi, oggetto: due superfici rettangolari di forma diversa, anche inclinate , collegate. Più pezzi collegati tra loro per forme cilindriche cave, ad esempio, tipo vulcano. Mappa con sprite personaggi, canvas: anche mouseClick? Statistiche con nome gerarchico, es pokemon_attacco. Modalità survival, stile isola di jurassic park gdr; sia in coop che contro; possibilità di fare N turni di fila se non ci sono altri player giocanti nelle vicinanze (ciò però comporterebbe , in modalità contro , di capire quando c’è qualcuno nelle vicinanze perché si andrebbe di 1 turno alla volta, soluzioni: in mod contro 1 turno per volta oppure meccanismo di sincronizzazione turni quando uno vede l’altro (anche furtivo) come c’è attacco 1 turno a testa) .. analogo a Battle royale(?); inizio con starter kit random. Modalità assedio al castello. Inoltre se posso fare N turni di fila si può pensare a più pc , uno per persona , coordinati per fare comandi in parallelo, ma va ben congegnato meccanismo di sincronizzazione. Parti DelCorpo -&amp;gt; Componente/i oppure Parte. La mappa deve essere (x,y); l’altezza viene indicata onMouseOver certi pixel dove è posto il Personaggio; se personaggio dentro edificio/grotta cambio img (es sfocato/tratteggiato). Mosse: astrarre per target; molte mosse sono simili tra loro, somiglianza va sfruttata, hanno magari dei target in comune, o variano solo per un parametro. Creare mappa anche con drag and drop immagini ?(un po’ difficile). Più layout per interfaccia grafica (esempio uno che mostra errori input su text area, uno con alert, uno su box text area separato). Input comandi consumato pezzo per pezzo, alcune parole se prevedono parametri quando riconosciute fanno fetch anche di parola (numero) successiva. Face toon foto? Import parziali di personaggi (tutto tranne/solo questi campi specificati). Texture mappa complete o ripetibili (es per suolo). Anteprima battaglia stile battaglia pokemon (magari per 1/2/3 vs 1/2/3) per rappresentare scontro. Conviene usare xslx (excel) per dati, considerare che può non servire la libreria Java per leggere stringhe per operazioni. Mossa “again” , ripeti la precedenza(opportuna modifica parametri, es mossa spostamento). Possibile gestione contromosse: si usano marker (tag): ogni mossa ha elenco tag del tipo di contromosse che può subire (con probabilità annessa, che può dipendere da pg che subisce mossa congiuntamente a mossa stessa). Ogni mossa inoltre deve essere taggata come possibile contromossa che il pg può usare (per schivare può fare in più modi). A seconda del lancio del dado il pg che effettua La contromossa può anche scegliere tipologia di contromossa o solo la mossa della tipologia che ha beccato (entrano in gioco riflessi ect.). I parametri che fanno attivare unq o un’altra contromossa sono dinamici, posso dipendere ad esempio dalla posizione tra i due pg o altre statistiche. Tag contromosse a fasce (es. coprirsi è sempre più facile che schivare che e più facile di schivare e contrattaccare (?); all’interno dello stesso schivare e contrattaccare ci sono più sotto categorie). Per aggiunta personaggio può essere utili interfaccia dedicata, non linea di comando (o altre operazioni, specie se ci sono tabelle). Mossa “premonizione”: predire il futuro a breve termine, dici che mossa vorresti fare e ti dice esito (o più esiti se uno chiede più mosse). Funziona solo sulla prossima mossa. Contromossa delle contromossa gestione?? Eventualmente nell’esito si prevede ancore contro-contromossa. Ma si innesca reazione a catena, inoltre da gestire scelta contromossa in questo caso. Applicazione tag conoscenza(universo di appartenenza): “Termoli”, “pokemon”, “liceo classico Termoli”, anche gerarchici, per filtrare sui personaggi.target componibili , fattorizzato creazione mosse, hanno un costo magari per indicare quantovoccupano dicuna mossa, relativo maybe a un parametro o più del target stesso. In particolare, non saranno salvate le mosse per un personaggio (o solo alcune “preferite”) ma il suo insieme di target i quali devono dire:statistica che influenzano, “costo del turno” che richiedono al variare dell’intensità del target (che aumenta linearmente, esponenzialmente, generica f(x)) quindi corsa blanda costo 1 , Max corsa costo 5 (max), elenco (string) target incompatibili con tale target (se serve), nota relative ad es per quando uno vuole creare una mossa durante la battaglia (“target corsa, max sforzo dedicabile 4 ect” metti “50 metri corsa” “ok/troppo! Vuoi sforzati di più rischiando effetti collaterali?”). Si può autoscrivere la voce narrante del gioco come “la tua coscienza” mentre che giochi, d’altronde si interagisce con essa. Considerare che un target può appartenere a più personaggi, magari sotto nomi di mosse diversi.&lt;br /&gt;
Definire gerarchia di personaggi per template (tipo classe e super classe) e template importabili (tipo usa fuoco). Es umanoide non umanoide, tra umanoide maschio- femmina etc. Classe che estende System.out per creare funzioni che aggiungono Header “DEBUG:” etc; due programmi Java , due main: uno delegato a calcoli + gestione Excel; altro legge stdout dell altro per interfaccia grafica. Per allenare PG creare dei PG fantocci con label per fare Q-learning iniziale, più avanti far allenare pg tra loro; creare vari fantocci: tank terrestre fisico, healer volante etc. Excel: si usa css che si può rendere tabellare, più facile da trattare nel codice rispetto a .xslx. Ogni “utente” ed Lostefra ha il suo personale dizionario con sue personali short cut da usare in partita, eventuale login con password (opzionale) x accesso. Vedere license show down. Mappa unica stile giochi di ruolo, si vede tutto da sopra: click o simili su edifici/caverne per mappe interne a tale posto, così ok sprite e per rappresentare “pg in volo” sprite dedicato. Densità aria per dire quando anche un uomo per es può volare. Ipotesi più efficiente per dare un valore stima al pg: AI base che gioca a manetta contro altre AI base e dalle vittorie si fa l’euristica, più vittoria facile/veloce/stracciante più punti, contro vari pg, contro pg standard bench mark.&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Note&amp;diff=207</id>
		<title>Note</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Note&amp;diff=207"/>
		<updated>2020-06-29T11:54:12Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: /* Inspirational Concepts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Note ==&lt;br /&gt;
&lt;br /&gt;
'''Vedere altre note su fogli di carta e promemoria del telefono. Ce ne sono molte.'''&lt;br /&gt;
'''La copiatura dai fogli di carta dei continuare da pagina 4 (&amp;quot;alterare param..&amp;quot;).'''&lt;br /&gt;
&lt;br /&gt;
===Inspirational Concepts===&lt;br /&gt;
* Gioco Lotta (Pokémon, Pokkén)&lt;br /&gt;
* no caselle esplicite&lt;br /&gt;
* Descrizione rispetto a: ambiente, nemico, oggetti&lt;br /&gt;
* pokémon, DnD, Call of Duty, Super Smash Brawl, corse pazze&lt;br /&gt;
* concentrarsi su: fluidi, telecinesi, razze, bonus/malus, gradi di libertà (fisicamente parlando) &lt;br /&gt;
* scacchi (es. crea casella), shaolin showdown&lt;br /&gt;
* prevedere = creatività&lt;br /&gt;
* acqua, aria, fuoco, terra&lt;br /&gt;
* gravità (newton), verso alto, basso, destra, sinistra, circolare, tutti i versi&lt;br /&gt;
* jumanji, savana, animali, zoologia&lt;br /&gt;
* tempo/spazio&lt;br /&gt;
* BF4, pirati, roma (imperium civitas)&lt;br /&gt;
* musica come arma (rap)&lt;br /&gt;
* magia, prestigiatori&lt;br /&gt;
* dinosauri (documentario, libro, zoologia)&lt;br /&gt;
* avengers, supereroi (libro)&lt;br /&gt;
&lt;br /&gt;
* Looney toons&lt;br /&gt;
* pokemon mystery dungeon (da googlare, escono vari siti con pdf e stats)&lt;br /&gt;
* question tool-for-combat-management: https://rpg.stackexchange.com/questions/171188/tool-for-combat-management&lt;br /&gt;
&lt;br /&gt;
===Personaggi (con statistiche e stati)===&lt;br /&gt;
* combattenti (con statistiche e stati)&lt;br /&gt;
* immagine rappresentativa per rappresentare meglio&lt;br /&gt;
* HP: colore rosso su immagine personaggio, dove sei debole/già colpito (idea scartata)&lt;br /&gt;
* penitenza: il malus può essere inteso come ciò che c'è nell'inserimento successivo, malus cumulativo&lt;br /&gt;
* essere ipocrita, finzione (schermo)&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (personaggi)&lt;br /&gt;
* metamorfosi&lt;br /&gt;
* alchimisti&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* possibilità giù in terra/ giù in acqua, con reachable e unreachable Boolean. Fuori da mappa anche reachable e unreachable.&lt;br /&gt;
* Personaggi composti di parti[] es. testa, busto, gambe, braccia, coda, pinna, ali. Distinzione per arto di movimento e/o spostamento boolean.&lt;br /&gt;
* Arti possono provocare danno, bruciatura , paralisi a contatto (Boolean) . Percentuale di probabilità accompagna ogni Boolean.&lt;br /&gt;
* Ogni parte del corpo punti vita + se inutilizzabile + amputata + stato (es paralisi).&lt;br /&gt;
* Per fare battaglie tra molto grandi =&amp;gt; 1 m lo si intende come 10m.  (rivalutato, aumentare livello scaling)&lt;br /&gt;
* Personaggio fusionabile Boolean + string nomi con cui si fonde.&lt;br /&gt;
* Distinzione tra infernape e infernape1/2/3 ect tra “specie” e “nome”.&lt;br /&gt;
* variabile Boolean respawnable.&lt;br /&gt;
* Raccogliere a piene mani da: https://spore.fandom.com/wiki/Creature_Editor&lt;br /&gt;
* Ad esempio weapons come elemento di Corpo (zanne, corna) e possibilità di muoversi/attaccare furtivamente.&lt;br /&gt;
* Divisibile e unibile come boolean e array di stringe associate per indicare i nomi con cui si unisce il Personaggio o in cui si divide.&lt;br /&gt;
* Variabili posizione nome: from_x/y ; to_x/y.&lt;br /&gt;
* Classe Stato, Personaggio contiene Array di stato, stato contiene moltiplicatori per statistica es attacco velocità precisione elusione ect.&lt;br /&gt;
* Personaggio deve avere una stat tipo sanità mentale, intelligenza, quanto è confuso e quanto è impaurito (2).&lt;br /&gt;
&lt;br /&gt;
* Per personaggi molto piccoli (meno di 1m x 1m x 1m) possibilità di essere in (x,y,z) tra 0 e 1.000.000 (ordine del micrometro, 1*10^-6 == 0,000001) e avere (lenX, lenY, lenZ). In questo modo sono definite dimensioni inferiori ad 1 m^3.&lt;br /&gt;
* personaggi max 20x20 (rivaluato, meno limitata)&lt;br /&gt;
&lt;br /&gt;
===Mosse===&lt;br /&gt;
* &amp;quot;combattimento prescinde da combattente&amp;quot;&lt;br /&gt;
* mosse hanno: direzione, azione, attacco (mosse pokémon)&lt;br /&gt;
* Parametri interi per mossa (direzione, consumabili) con lower e upper bound&lt;br /&gt;
* camuffarsi =&amp;gt; DnD manuale&lt;br /&gt;
* wrestling (libro) per le mosse/prese&lt;br /&gt;
&lt;br /&gt;
* X fa una mossa contro Y: Z potrebbe reagire (Es. ricevendo il colpo al posto di Y). Può essere realizzato sia come se &amp;quot;Y chiede soccorso Z&amp;quot; o come reazione di alleati adiacenti &amp;quot;Z soccorre Y&amp;quot;&lt;br /&gt;
* Mossa prende come parametro di ingresso Corpo, ossia la parte del corpo coinvolta nella mossa (es arto , tutto corpo ect). &lt;br /&gt;
&lt;br /&gt;
===Oggetto (con statistiche e stati)===&lt;br /&gt;
* armi: lacci (stati), lame (potenze), sassi, reti, pistole (munizioni), razzi, bombe (potenze), fuoco (d'artificio?) =&amp;gt; manuale DnD&lt;br /&gt;
* veleno n modi =&amp;gt; DnD manuale&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (oggetti)&lt;br /&gt;
* automezzi con cannoni, variabile 'hasEntrata', 'tempoRiutilizzo'&lt;br /&gt;
* violino come arma (tutti strumenti musicali): a fiato, a corda, a percussione&lt;br /&gt;
* veleni, ampolle e flaconi magici, insieme di 'oggetti dentro' un oggetto&lt;br /&gt;
&lt;br /&gt;
* Classe oggetto: es albero, roccia, casa: forza necessaria per sradicare + forza per lanciare + destrezza / agilità per appendersi + nascondersi in proporzione alle dimensioni di chi si nasconde. &lt;br /&gt;
* Altri es. pali. Sotto terra o sotto acqua/lava/melma o simili. &lt;br /&gt;
* Acqua rallenta se non hai pinne boolean.&lt;br /&gt;
* Classe strumento per oggetti che si tengono in mano, es reti , pistole, spade, pugnali, scudi, elmi, lancia, arco , frecce, lanciarazzi, fucili cecchino, fucile assalto, corde.&lt;br /&gt;
* Strumenti e mosse: danno ad area, perforante, contundente (vedi dnd armi). Mosse possono creare/modificare/distruggere oggetti e strumenti.&lt;br /&gt;
* Oggetti del campo di gioco incidono su elusione (parametro di personaggio).&lt;br /&gt;
* Buco/abisso (boolean) per dire se c’è o meno il suolo (Suolo come classe?). &lt;br /&gt;
* Radiazioni. &lt;br /&gt;
&lt;br /&gt;
===Modalità gioco===&lt;br /&gt;
* turnazione&lt;br /&gt;
* 1 v 1 v 1 etc., ma anche squadre casuali&lt;br /&gt;
* punteggio: chi fa più punti, più uccisioni, definizione di 'punto', gioco per perdere&lt;br /&gt;
* inserisci personaggio total random&lt;br /&gt;
&lt;br /&gt;
* Modalità battaglia con interazione stile battaglia navale (non si vede mossa dell'avversario)&lt;br /&gt;
* Modalità di gioco: tutti contro tutti (battle royale), death match, vs CPU mode zombie(attaccano solo, se non possono vanno verso nemico): serve introdurre un punteggio, di sicuro per mode zombie , ma anche per death match e tutti contro tutti&lt;br /&gt;
* ingressi: ne entra un altro?&lt;br /&gt;
&lt;br /&gt;
===Mappa===&lt;br /&gt;
* arene&lt;br /&gt;
* minimappa (pixelata ?), legenda oggetti base, devono esserci caselle implicite&lt;br /&gt;
* mappa 100x100 (rivalutato, meno limitata)&lt;br /&gt;
* Cannoni fissi in mezzo al campo (strumento).&lt;br /&gt;
&lt;br /&gt;
===Funzionalità generali===&lt;br /&gt;
* Chiave: non una flat input box per i comandi; ma dinamica: si suppone il soggetto &amp;quot;io&amp;quot; (le azioni le fanno in prima persona i personaggi), ogni mossa deve prevedere dei complementi (&amp;quot;verso&amp;quot;, &amp;quot;tra quanto&amp;quot;, &amp;quot;cosa&amp;quot;, &amp;quot;a favore di chi&amp;quot;, &amp;quot;contro chi&amp;quot;). Ogni complemento collegato con box stile in pop up =&amp;gt; bootstrap (la grafica sara unica). Prevedere anche modalita flat con input del tipo &amp;quot;azione a=pippo verso=termoli&amp;quot; (regex check)&lt;br /&gt;
* &amp;quot;meno tabelle&amp;quot;, &amp;quot;no bottoni&amp;quot; e solo foto che si alternano, &amp;quot;la grafica serve&amp;quot;: text box unica interazione, text area (history), immagine personaggio e immagine mappa&lt;br /&gt;
* &amp;quot;persistenza anche da interfaccia grafica&amp;quot;, diritti di scrittura sui file?&lt;br /&gt;
* Segnalazione (comando per fare nota)&lt;br /&gt;
* Modellare statistiche con funzioni probabilistiche (Gaussiane, esponenziali, uniformi, etc.) con relativa media e varianza piuttosto che individuare fasce/scaglionamenti (meno realistici e meno belli)&lt;br /&gt;
&lt;br /&gt;
===Deploy===&lt;br /&gt;
* &amp;quot;commenta il codice&amp;quot;, &amp;quot;dividi et impera&amp;quot;&lt;br /&gt;
* Server web (Apache) ospita partite (+ localmente ha i file di funzionamento), in LAN client giocano o da remoto con IP pubblico. Interfaccia HTML5 + Javascript per giocare. Studiare engine grafici Javascript&lt;br /&gt;
* bootstrap! (specie per input box)&lt;br /&gt;
* https://bit.dev/ per molti componenti web&lt;br /&gt;
* React, React Native .. forse meglio di Vue per diffusione&lt;br /&gt;
* Unity, WebGL (vedi SDK dedicata, built per Android/iOS/etc.)&lt;br /&gt;
* Modelli 3D videogiochi: https://www.models-resource.com/ , meglio se disaccoppiati da Unity (e.g. in cartelle independenti), aggiunta modelli online&lt;br /&gt;
* creare modelli: blender. creare disegni: krita&lt;br /&gt;
* Tutorial tank Unity: https://learn.unity.com/project/tanks-tutorial ; modelli: https://opengameart.org/&lt;br /&gt;
* WebSocket per gestire client asincroni (NodeJS ?)&lt;br /&gt;
* Su YT in “guarda più tardi” video per interagire unity con JS (“unity.sendMessage()” o simili)&lt;br /&gt;
* Due client: uno con WebGL e uno JS base con solo input (per test, per mancanza di supporto browser a WebGL). Eventualmente 3 client: 1 base (JS puro con qualche immagine al più), 1 WebGL+Unity 2D (grafica pixelata), 1 WebGL+Unity 3D (informazioni di input per mirare, ad es., in base a dove punto nello schermo. Qualcosa di simile anche per 2D). Tutti i client stessi JSON per comunicare al server!&lt;br /&gt;
* photogrammetry, https://medium.com/realities-io/getting-started-with-photogrammetry-d0a6ee40cb72&lt;br /&gt;
* roll20.net .. c'è '''davvero''' molto&lt;br /&gt;
* readthedocs.org&lt;br /&gt;
* css dinamici: sass, https://zurb.com/playground/motion-ui (zurb)&lt;br /&gt;
* progressive web apps: offline with server works. https://it.wikipedia.org/wiki/Progressive_Web_App ; responsive web design&lt;br /&gt;
&lt;br /&gt;
==== Altro (scartato)====&lt;br /&gt;
* rpgmaker, godot, aseprite, pixelart (in generale), ma anche phaser, piskel&lt;br /&gt;
* joomla! Per far prima con html&lt;br /&gt;
* libreria pygame&lt;br /&gt;
* Vuegg: https://github.com/marketplace/vuegg  &lt;br /&gt;
* Material Design&lt;br /&gt;
* JAVA: Class.forName(&amp;lt;name&amp;gt;.class).newInstance();&lt;br /&gt;
&lt;br /&gt;
===Copia&amp;amp;incolla generale, da smistare in sotto capitoli. Contiene anche '''tutte''' note del telefono (al 22/02/2020)===&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 1:'''&lt;br /&gt;
&lt;br /&gt;
Mosse che trasformano l’avversario: attenzione è una mossa devastante. Trasformazione totale o parziale. Si devono poter aggiungere mosse, strumenti dinamicamente. Battle bot:ribaltano, scintille, elementi (Oggetti) che danneggiano. One piece: I frutti del diavolo (悪魔の実 Akuma no mi?) sono frutti misteriosi che donano poteri soprannaturali a chi li mangia, rendendoli però incapaci di nuotare. Di conseguenza il contatto con l'acqua di mare o con una speciale sostanza conosciuta come agalmatolite indebolisce gli utilizzatori di frutti del diavolo e li priva dei loro poteri. Alcune persone sono inoltre in grado di ricorrere all'Ambizione (覇気 Haki?), una forza spirituale che permette di avvertire la presenza di altri esseri viventi e di predirne i movimenti, di irrobustire parti del corpo e di intimidire o fare svenire le creature con una debole forza di volontà. Personaggio ha funzione baricentro_x, baricentro_y calcolate come (from_x+to_x)/2 sul quale si basa la funzione di libreria getDistance(Personaggio A, Personaggio B, float success); tale funzione serve per calcolare per i PNG e per i PG se ha senso usare una mossa. Non-onniscienza: delle volte non si può sapere distanza avversario e fallisce la mossa per la distanza -&amp;gt; “float success” rappresenta la probabilità di successo (Personaggio ha parametro “osservare”). PNG di due categorie: offensivi o neutrali (no priorità a mosse di attacco, ma tutto casuale). Mosse e oggetti per chiamare Personaggi, magari non necessariamente alleati (2 mosse e 2 oggetti quindi necessari), richiamo di un personaggio preciso o di uno a caso. Ogni mossa/azione deve avere un tempo di attesa espresso in turni (alla meglio 0) per poter ripetere la mossa/azione. Strumenti anche mezzi di trasporto di aria, di terra, di acqua (o lava/palude). Possono attivare una metamorfosi / Unione per cambiare stats personaggio. Veicoli con armi o riparo. Gli strumenti da trattare come gli oggetti. Classe unica? I match/partite (immagino Classe Partita) devono avere variabile boolean “respawn”, per distinguere death match a punti con death match con una vita. Wrestling per ispirarsi nella lotta libera: calci pugni ginocchiate prese lanci salti testate gomitate ecc. Per punti si vince a un limite o dopo un tot di mosse , oppure al primo dei due raggiunti (max_punti e max_mosse parametri di Partita). I punti si guadagnano alla kill (un Punteggio per squadra, int punteggio salvato localmente dentro ogni Personaggio che ha la variabile int squadra). Si guadagnano tanti punti quanti sono i punti della variabile “valore” del personaggio ucciso, tale variabile è calcolata come somma dei valori di tutte le mosse/stats ect del Personaggio. Imperium civitas. Attacco dei giganti. Possibilità di morire se colpiti in un unico punto (tallone d Achille) implementabile come variabile boolean. Jump force. Game dev tycoon. Acqua diventa tsunami. Variabile int per attacco cumulativo di gruppo: es calciatori che più si passano la palla più l’attacco è forte. Suolo magico: non tutti i personaggi possono accedervi, array di string elenca i nomi di chi può accedervi. Funzione esci/entra in classe Personaggio per simulare scambio pokemon 6vs6. Piovra gigante. Rischio=danno*probabilita. Mossa su strumento e con strumento?&lt;br /&gt;
Mosse fisiche per arrampicarsi su avversario(se e solo se sei la metà di dimensioni(?)), atterrarlo, lanciarlo, accecarlo, immobilizzarlo. Se sei in gruppo/ orda bonus ad attacchi combinati. Armi: fruste e scheggie, corni che si suonano per chiamare altri. Tipo della mossa con moltiplicatore tra 0 (immune) e 2 (float): acqua, fuoco, magia, terra: da ispirarsi ai pokemon ma non da copiare, penso. Armi da campo: cannoni e catapulte. Veicoli d’acqua: moto acqua, canoe, barche a motore a remi. Nei veicoli malus su attenzione (variabile int in personaggio, indica attenzione in combattimento e non in altro) perché si è impegnato alla guida . All’inizio in image view “the hero” e “the map”. Condizione vittoria (oltre a morte, punti, o numero mosse, cioè tempo) morte di un singolo Personaggio, che potrebbe rappresentare un edificio, cassaforte o simili. Personaggio si può svestire e lasciare strumenti, modificano statistiche di attacco, difesa , agilità, ect. Variabile luce o non luce, che peggiora/migliora a seconda della specie la visibilità, quindi la precisione , specie in attacchi a distanza: Scurovisione evita i malus.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 2:'''&lt;br /&gt;
&lt;br /&gt;
Gioco2: se ci si lancia da oggetti , dopo essersi arrampicati, possono esserci danni da caduta; strumenti come paracaduti o mosse magiche possono evitare i danni. Pozione del vento, soffi e devi attacchi. In difesa puoi parare, schivare, deviare: tre variabili? Ambiente: colline e pianure uguali, Monti sono Oggetti, picco ossia un unico monte oggetto. Rocce volanti, nuvole sospese: oggetto può essere sospeso e può fare periodicamente una mossa, ad es tuono, può spostarsi, può fare entra/esci, oggetto albero e oggetto foresta, si possono prendere, nascondersi, arrampicarsi, lanciarli, ostacolano velocità ma se si ha abbastanza forza si spezzano alberi. Acqua poco profonda, profonda, molto profonda: variabile boolean in Personaggio “alto” per toccare in acqua profonda, con acqua si generano fiumi laghi e mari. Ambiente si deve poter evolvere: ad esempio oggetto diga può fare metamorfosi e diventare oggetto cascata/torrente in piena. Per edifici più oggetti che rappresentano le mura e il tetto, variabile boolean per oggetto per entrare nell’oggetto. Possono essere spazzati via: danni da crollo, si può combattere all interni, contengono strumenti come tavoli sedie mobili letto ect. Se uno viene schiantato contro uno strumento prende danno(es danno da schianto). Ci possono essere scale, si può non avere contatti visivo sull’avversario. Oggetto mura, oggetto torre, oggetto casa interno sono cose distinte: possono dare malus/bonus su visibilità. Ambiente: pozzi e grotte, da gestire come interno casa. Lava come acqua, ogni oggetto può essere sorgenti di liquido: monte sorgente acqua, vulcano sorgente lava. Può esserci variabile probabilità eruzione, se settata a 1 c’è una continua eruzione. Strade di vario tipo, sovrapposta a altri suoli, migliorano velocità di alcuni strumenti, variabile boolean “ha le ruote” in classe strumenti. Unificare classe strumento e classe oggetto. Oggetti sospesi: case sospese su albero, ad es. Fiamme in mezzo al suolo. Oggetti: porto, aereoporto, grattacieli, dighe, impianti a fune, ospedali per curarsi e prendere oggetti per curarsi dopo, scuole contenenti libri per apprendere una mossa, luoghi di ingegneria per creare oggetti, ad esempio veicoli o armi, soldi nel gioco per comprare da eventuali venditori. Ogni oggetto avra un prezzo (valutabile circa in euro per semplicità). Variabile float per fame, sete, sonno, caldo-freddo (parte da 0.5). Nella mappa ci deve essere per ogni punto la temperatura. Possibilità di vomito, dissenteria, problemi cardiaci, respiratori, muscolari. Armi: balestra, mani nude, sasso, tirapugni, torcia accesa. Armature: intralciano o favoriscono agilità, attacco, poteri magici, rumorosa (elusione), è uno strumento/oggetto. Attacchi possono essere prolungati per turni, mosse variabile boolean prolungabile: può aumentare o diminuire intensità, c’è un max espresso in turni di prolungabilita, inoltre può essere leggermente alterato con una variabile casuale. Equipaggiamento (strumento/oggetto): pietra focaia, attrezzi da scalata, boccale di birra, cavallo, moto, chiodi, martello da fabbro, corda, corazza, dardo, faretra/zaino/sacca (oggetti che contengono una lista di oggetti, stringhe) con un numero per la quantità) e capacità massima zaino e ogni oggetto può avere un valore intero per dimensione (es martello 3, ascia grande 7), mantello, olio, variabile boolean prende fuoco/conduce elettricità, amplifica magnetismo, aumenta esplosioni nucleari, aumenta forza di gravità (?), pala, piccone, rampino, specchio, per osservare quando si è nascosti e si ha malus su visibilità. Strumenti da scasso per aprire porte: variabile boolean per oggetti: entrata con scasso. Personaggio: string razza per swag, immunità a veleni e malattie, elusione, agilità, precisione, abilità magiche(?), difesa fisica. In ultima torcia: agilità, coraggio, forza, intelligenza, magia, manualità, percezione, socialità. Bestiario: aracnoide di varie dimensioni, talpe giganti, vermi giganti di terra di mare e di lava ect, bulbo trascinatore che ha tentacoli per tirare a se e mangiare, lui è immobile, calabrone gigante, serpenti giganti, cinghiali, draghi, elfi, goblin e re goblin, sciamani (goblin), totem di guerra come strumento/oggetti per alterare statistiche nella loro area di influenza, lupo, mastino bruciante, nani, non morti/zombie/mummia/scheletro variabile boolean vivo a false ma ha ancora hp su parti del corpo: variabile boolean “zombizabile”. Orchi, pesci da terra (anfibi) tritone dell abisso, troll e trollin (orchi più deformi), umani. Abilità dei personaggi in ultima torcia: artificiale (robot) immunità a soffocamento, veleni, malattie ect immune a manipolazioni psichiche, visione oscurità; danno da attacco in carica; fiammegiante ossia la creatura può incendiarsi e elettrizzante ossia può diventare elettrica caricamente; modalità furia/mailmen ossia ottiene bonus su alcune/tutte le statistiche; gigantesco o molto piccolo due boolean (?forse non serve); immunità a magie mentali, al fuoco; linguaggi (?); non morto; danno da attacco in presa; pungiglioni velenosi; sa muoversi su ragnatele o è rallentato, resistenza a perforazione, respirare sott’acqua o sotto lava o nei liquidi in genere; rigenerazione; riceve danni dalla luce solare o da assenza di luce; è terrorizzato/impaurito/intimidito o se è imperturbabile boolean. Danno da trascinamento; paralizzante; può diventare più veloce (?non serve); visione a infrarossi attraverso oggetti; volare o andare sotto terra. Imperium editor, cose che penso di non aver ancora scritto: stagioni, suolo erboso o terriccio, sabbia con erba e terra e da sola, strade e stagioni, altitudine, alberi e arbusti, vari tipi a foglia larga, conifere, alberi secchi, palme, arbusti verdi e secchi, cactus, alghe marine, rocce e pietre, scheletri per terra, legna tagliata (alberi tagliati), carri e carretti, grotte e rovine per accessi sotterranei, locande, templi, accampamenti, fortini, monoliti, fontana, tombe e cimiteri, borse per terra, pozzo, troni, croci(del teschio), pozzo, capanne, lapidi, ponti, recinzioni, falò, tende, torri, panoplia, fessure come abissi, statue, rovine (deserto) come case distrutte, colonne per costruire templi, piramidi, sfingi, bandiere, rovine in Europa, campi coltivati che contengono cibo, fiamma (in altre), roccia in altre per montagne, altre-&amp;gt;rovine per monumenti non egiziani ma europei.&lt;br /&gt;
Ci sono paludi. Tende da campo. Forti, porti. Edifici delle fortezze, edifici dei villaggi. Naufragi e scogli.&lt;br /&gt;
Parametri voglia/impegno float per descrivere voglia di combattere Personaggio. Ricevi danno uscendo dalla mappa tra 1-5% tra 6-10% tra 11-15% della vita totale di ogni parte del corpo per ogni turno di gioco. Danno da precipitazione diverso da carica, uno verticale uno orizzontale, se precipiti da molto in alto hai bonus, oltre che danni da schianto lol. Baionette, formazione a blocchi, a quadrato (difensiva) sparano su quattro lati, a schiera vanno avanti. Usano un colpo poi lunga ricarica. Variabile boolean per attivare o meno fuoco amico. Azione per cambiare posizione: in piedi, in ginocchio(inteso come via di mezzo), sdraiato: per permettere migliore visibilità a chi è dietro (nella formazione).&lt;br /&gt;
Altruismo, coraggio, spingere oltre il limite, difendere al posto di un altro, migliorare posizione per avere bonus. Mosse da usare in condizioni psicologiche idonee: mosse estreme per disperazione, bonus unici. Condizioni per situazioni: blocco, spalle al muro, stritolato, confuso, semi parassiti addosso, azzoppato, bagnato d’acqua, lame affilate, corazza indurita, tante copie di me stesso attive, preveggente. Per ambiente:pioggia (torrenziale), barriera a cupola, punte metalliche a terra, blocco di fumo nero. Far volare un avversario/alleato. Tutti possono fare tutto sotto effetti magici o fisici. Un cavallo può volare se viene preso da un uccello e portato in alto.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 3, 4:'''&lt;br /&gt;
&lt;br /&gt;
Gioco1,2,3,4: tutto caricato su wikis.&lt;br /&gt;
&lt;br /&gt;
Gioco3: Mosse con caricamento + spostamento (es. kameamea con teletrasporto). Ciclo di interazione principale:crea o combatti. Modalità campagna, che chiede in input da che battaglia iniziare, ma implica tipi battaglie prefissati. Alla morte/sconfitta di un personaggio si possono alterare statistiche (es personaggio può cambiare fazione). Alcune mosse possono lasciare oggetti sul terreno: (ad es, radici di Groth). Ogni oggetto può alterare le statistiche al passaggio sopra, nelle vicinanze. Boolean invisibile per personaggio, diverso da elusione infinita. Se personaggio va in un altro dimensione -&amp;gt; unreachable. Attacco coordinato, se non lo fanno tutti vale lo stesso ma depotenziato opportunamente . Personaggio in modalità maniac (2 mosse per turno) e in modalità depressive (1 mossa ogni due turni); personaggio Flash può fare 10 mosse in un turno. Chiudi con lucchetto oggetto da dentro o da fuori, oggetto ingresso in oggetto casa , più ingressi per un singolo oggetto.nicole aniston. Rimbalzo se ci si schianta contro oggetto da calcolare con parametro. Ryuk e Darkrai.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gioco 4 23/07/2019:&lt;br /&gt;
Pula fiction, aracnidi, oggetto: due superfici rettangolari di forma diversa, anche inclinate , collegate. Più pezzi collegati tra loro per forme cilindriche cave, ad esempio, tipo vulcano. Mappa con sprite personaggi, canvas: anche mouseClick? Statistiche con nome gerarchico, es pokemon_attacco. Modalità survival, stile isola di jurassic park gdr; sia in coop che contro; possibilità di fare N turni di fila se non ci sono altri player giocanti nelle vicinanze (ciò però comporterebbe , in modalità contro , di capire quando c’è qualcuno nelle vicinanze perché si andrebbe di 1 turno alla volta, soluzioni: in mod contro 1 turno per volta oppure meccanismo di sincronizzazione turni quando uno vede l’altro (anche furtivo) come c’è attacco 1 turno a testa) .. analogo a Battle royale(?); inizio con starter kit random. Modalità assedio al castello. Inoltre se posso fare N turni di fila si può pensare a più pc , uno per persona , coordinati per fare comandi in parallelo, ma va ben congegnato meccanismo di sincronizzazione. Parti DelCorpo -&amp;gt; Componente/i oppure Parte. La mappa deve essere (x,y); l’altezza viene indicata onMouseOver certi pixel dove è posto il Personaggio; se personaggio dentro edificio/grotta cambio img (es sfocato/tratteggiato). Mosse: astrarre per target; molte mosse sono simili tra loro, somiglianza va sfruttata, hanno magari dei target in comune, o variano solo per un parametro. Creare mappa anche con drag and drop immagini ?(un po’ difficile). Più layout per interfaccia grafica (esempio uno che mostra errori input su text area, uno con alert, uno su box text area separato). Input comandi consumato pezzo per pezzo, alcune parole se prevedono parametri quando riconosciute fanno fetch anche di parola (numero) successiva. Face toon foto? Import parziali di personaggi (tutto tranne/solo questi campi specificati). Texture mappa complete o ripetibili (es per suolo). Anteprima battaglia stile battaglia pokemon (magari per 1/2/3 vs 1/2/3) per rappresentare scontro. Conviene usare xslx (excel) per dati, considerare che può non servire la libreria Java per leggere stringhe per operazioni. Mossa “again” , ripeti la precedenza(opportuna modifica parametri, es mossa spostamento). Possibile gestione contromosse: si usano marker (tag): ogni mossa ha elenco tag del tipo di contromosse che può subire (con probabilità annessa, che può dipendere da pg che subisce mossa congiuntamente a mossa stessa). Ogni mossa inoltre deve essere taggata come possibile contromossa che il pg può usare (per schivare può fare in più modi). A seconda del lancio del dado il pg che effettua La contromossa può anche scegliere tipologia di contromossa o solo la mossa della tipologia che ha beccato (entrano in gioco riflessi ect.). I parametri che fanno attivare unq o un’altra contromossa sono dinamici, posso dipendere ad esempio dalla posizione tra i due pg o altre statistiche. Tag contromosse a fasce (es. coprirsi è sempre più facile che schivare che e più facile di schivare e contrattaccare (?); all’interno dello stesso schivare e contrattaccare ci sono più sotto categorie). Per aggiunta personaggio può essere utili interfaccia dedicata, non linea di comando (o altre operazioni, specie se ci sono tabelle). Mossa “premonizione”: predire il futuro a breve termine, dici che mossa vorresti fare e ti dice esito (o più esiti se uno chiede più mosse). Funziona solo sulla prossima mossa. Contromossa delle contromossa gestione?? Eventualmente nell’esito si prevede ancore contro-contromossa. Ma si innesca reazione a catena, inoltre da gestire scelta contromossa in questo caso. Applicazione tag conoscenza(universo di appartenenza): “Termoli”, “pokemon”, “liceo classico Termoli”, anche gerarchici, per filtrare sui personaggi.target componibili , fattorizzato creazione mosse, hanno un costo magari per indicare quantovoccupano dicuna mossa, relativo maybe a un parametro o più del target stesso. In particolare, non saranno salvate le mosse per un personaggio (o solo alcune “preferite”) ma il suo insieme di target i quali devono dire:statistica che influenzano, “costo del turno” che richiedono al variare dell’intensità del target (che aumenta linearmente, esponenzialmente, generica f(x)) quindi corsa blanda costo 1 , Max corsa costo 5 (max), elenco (string) target incompatibili con tale target (se serve), nota relative ad es per quando uno vuole creare una mossa durante la battaglia (“target corsa, max sforzo dedicabile 4 ect” metti “50 metri corsa” “ok/troppo! Vuoi sforzati di più rischiando effetti collaterali?”). Si può autoscrivere la voce narrante del gioco come “la tua coscienza” mentre che giochi, d’altronde si interagisce con essa. Considerare che un target può appartenere a più personaggi, magari sotto nomi di mosse diversi.&lt;br /&gt;
Definire gerarchia di personaggi per template (tipo classe e super classe) e template importabili (tipo usa fuoco). Es umanoide non umanoide, tra umanoide maschio- femmina etc. Classe che estende System.out per creare funzioni che aggiungono Header “DEBUG:” etc; due programmi Java , due main: uno delegato a calcoli + gestione Excel; altro legge stdout dell altro per interfaccia grafica. Per allenare PG creare dei PG fantocci con label per fare Q-learning iniziale, più avanti far allenare pg tra loro; creare vari fantocci: tank terrestre fisico, healer volante etc. Excel: si usa css che si può rendere tabellare, più facile da trattare nel codice rispetto a .xslx. Ogni “utente” ed Lostefra ha il suo personale dizionario con sue personali short cut da usare in partita, eventuale login con password (opzionale) x accesso. Vedere license show down. Mappa unica stile giochi di ruolo, si vede tutto da sopra: click o simili su edifici/caverne per mappe interne a tale posto, così ok sprite e per rappresentare “pg in volo” sprite dedicato. Densità aria per dire quando anche un uomo per es può volare. Ipotesi più efficiente per dare un valore stima al pg: AI base che gioca a manetta contro altre AI base e dalle vittorie si fa l’euristica, più vittoria facile/veloce/stracciante più punti, contro vari pg, contro pg standard bench mark.&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Note&amp;diff=206</id>
		<title>Note</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Note&amp;diff=206"/>
		<updated>2020-06-23T12:22:00Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: /* Inspirational Concepts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Note ==&lt;br /&gt;
&lt;br /&gt;
'''Vedere altre note su fogli di carta e promemoria del telefono. Ce ne sono molte.'''&lt;br /&gt;
'''La copiatura dai fogli di carta dei continuare da pagina 4 (&amp;quot;alterare param..&amp;quot;).'''&lt;br /&gt;
&lt;br /&gt;
===Inspirational Concepts===&lt;br /&gt;
* Gioco Lotta (Pokémon, Pokkén)&lt;br /&gt;
* no caselle esplicite&lt;br /&gt;
* Descrizione rispetto a: ambiente, nemico, oggetti&lt;br /&gt;
* pokémon, DnD, Call of Duty, Super Smash Brawl, corse pazze&lt;br /&gt;
* concentrarsi su: fluidi, telecinesi, razze, bonus/malus, gradi di libertà (fisicamente parlando) &lt;br /&gt;
* scacchi (es. crea casella), shaolin showdown&lt;br /&gt;
* prevedere = creatività&lt;br /&gt;
* acqua, aria, fuoco, terra&lt;br /&gt;
* gravità (newton), verso alto, basso, destra, sinistra, circolare, tutti i versi&lt;br /&gt;
* jumanji, savana, animali, zoologia&lt;br /&gt;
* tempo/spazio&lt;br /&gt;
* BF4, pirati, roma (imperium civitas)&lt;br /&gt;
* musica come arma (rap)&lt;br /&gt;
* magia, prestigiatori&lt;br /&gt;
* dinosauri (documentario, libro, zoologia)&lt;br /&gt;
* avengers, supereroi (libro)&lt;br /&gt;
&lt;br /&gt;
* Looney toons&lt;br /&gt;
* pokemon mystery dungeon (da googlare, escono vari siti con pdf e stats)&lt;br /&gt;
&lt;br /&gt;
===Personaggi (con statistiche e stati)===&lt;br /&gt;
* combattenti (con statistiche e stati)&lt;br /&gt;
* immagine rappresentativa per rappresentare meglio&lt;br /&gt;
* HP: colore rosso su immagine personaggio, dove sei debole/già colpito (idea scartata)&lt;br /&gt;
* penitenza: il malus può essere inteso come ciò che c'è nell'inserimento successivo, malus cumulativo&lt;br /&gt;
* essere ipocrita, finzione (schermo)&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (personaggi)&lt;br /&gt;
* metamorfosi&lt;br /&gt;
* alchimisti&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* possibilità giù in terra/ giù in acqua, con reachable e unreachable Boolean. Fuori da mappa anche reachable e unreachable.&lt;br /&gt;
* Personaggi composti di parti[] es. testa, busto, gambe, braccia, coda, pinna, ali. Distinzione per arto di movimento e/o spostamento boolean.&lt;br /&gt;
* Arti possono provocare danno, bruciatura , paralisi a contatto (Boolean) . Percentuale di probabilità accompagna ogni Boolean.&lt;br /&gt;
* Ogni parte del corpo punti vita + se inutilizzabile + amputata + stato (es paralisi).&lt;br /&gt;
* Per fare battaglie tra molto grandi =&amp;gt; 1 m lo si intende come 10m.  (rivalutato, aumentare livello scaling)&lt;br /&gt;
* Personaggio fusionabile Boolean + string nomi con cui si fonde.&lt;br /&gt;
* Distinzione tra infernape e infernape1/2/3 ect tra “specie” e “nome”.&lt;br /&gt;
* variabile Boolean respawnable.&lt;br /&gt;
* Raccogliere a piene mani da: https://spore.fandom.com/wiki/Creature_Editor&lt;br /&gt;
* Ad esempio weapons come elemento di Corpo (zanne, corna) e possibilità di muoversi/attaccare furtivamente.&lt;br /&gt;
* Divisibile e unibile come boolean e array di stringe associate per indicare i nomi con cui si unisce il Personaggio o in cui si divide.&lt;br /&gt;
* Variabili posizione nome: from_x/y ; to_x/y.&lt;br /&gt;
* Classe Stato, Personaggio contiene Array di stato, stato contiene moltiplicatori per statistica es attacco velocità precisione elusione ect.&lt;br /&gt;
* Personaggio deve avere una stat tipo sanità mentale, intelligenza, quanto è confuso e quanto è impaurito (2).&lt;br /&gt;
&lt;br /&gt;
* Per personaggi molto piccoli (meno di 1m x 1m x 1m) possibilità di essere in (x,y,z) tra 0 e 1.000.000 (ordine del micrometro, 1*10^-6 == 0,000001) e avere (lenX, lenY, lenZ). In questo modo sono definite dimensioni inferiori ad 1 m^3.&lt;br /&gt;
* personaggi max 20x20 (rivaluato, meno limitata)&lt;br /&gt;
&lt;br /&gt;
===Mosse===&lt;br /&gt;
* &amp;quot;combattimento prescinde da combattente&amp;quot;&lt;br /&gt;
* mosse hanno: direzione, azione, attacco (mosse pokémon)&lt;br /&gt;
* Parametri interi per mossa (direzione, consumabili) con lower e upper bound&lt;br /&gt;
* camuffarsi =&amp;gt; DnD manuale&lt;br /&gt;
* wrestling (libro) per le mosse/prese&lt;br /&gt;
&lt;br /&gt;
* X fa una mossa contro Y: Z potrebbe reagire (Es. ricevendo il colpo al posto di Y). Può essere realizzato sia come se &amp;quot;Y chiede soccorso Z&amp;quot; o come reazione di alleati adiacenti &amp;quot;Z soccorre Y&amp;quot;&lt;br /&gt;
* Mossa prende come parametro di ingresso Corpo, ossia la parte del corpo coinvolta nella mossa (es arto , tutto corpo ect). &lt;br /&gt;
&lt;br /&gt;
===Oggetto (con statistiche e stati)===&lt;br /&gt;
* armi: lacci (stati), lame (potenze), sassi, reti, pistole (munizioni), razzi, bombe (potenze), fuoco (d'artificio?) =&amp;gt; manuale DnD&lt;br /&gt;
* veleno n modi =&amp;gt; DnD manuale&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (oggetti)&lt;br /&gt;
* automezzi con cannoni, variabile 'hasEntrata', 'tempoRiutilizzo'&lt;br /&gt;
* violino come arma (tutti strumenti musicali): a fiato, a corda, a percussione&lt;br /&gt;
* veleni, ampolle e flaconi magici, insieme di 'oggetti dentro' un oggetto&lt;br /&gt;
&lt;br /&gt;
* Classe oggetto: es albero, roccia, casa: forza necessaria per sradicare + forza per lanciare + destrezza / agilità per appendersi + nascondersi in proporzione alle dimensioni di chi si nasconde. &lt;br /&gt;
* Altri es. pali. Sotto terra o sotto acqua/lava/melma o simili. &lt;br /&gt;
* Acqua rallenta se non hai pinne boolean.&lt;br /&gt;
* Classe strumento per oggetti che si tengono in mano, es reti , pistole, spade, pugnali, scudi, elmi, lancia, arco , frecce, lanciarazzi, fucili cecchino, fucile assalto, corde.&lt;br /&gt;
* Strumenti e mosse: danno ad area, perforante, contundente (vedi dnd armi). Mosse possono creare/modificare/distruggere oggetti e strumenti.&lt;br /&gt;
* Oggetti del campo di gioco incidono su elusione (parametro di personaggio).&lt;br /&gt;
* Buco/abisso (boolean) per dire se c’è o meno il suolo (Suolo come classe?). &lt;br /&gt;
* Radiazioni. &lt;br /&gt;
&lt;br /&gt;
===Modalità gioco===&lt;br /&gt;
* turnazione&lt;br /&gt;
* 1 v 1 v 1 etc., ma anche squadre casuali&lt;br /&gt;
* punteggio: chi fa più punti, più uccisioni, definizione di 'punto', gioco per perdere&lt;br /&gt;
* inserisci personaggio total random&lt;br /&gt;
&lt;br /&gt;
* Modalità battaglia con interazione stile battaglia navale (non si vede mossa dell'avversario)&lt;br /&gt;
* Modalità di gioco: tutti contro tutti (battle royale), death match, vs CPU mode zombie(attaccano solo, se non possono vanno verso nemico): serve introdurre un punteggio, di sicuro per mode zombie , ma anche per death match e tutti contro tutti&lt;br /&gt;
* ingressi: ne entra un altro?&lt;br /&gt;
&lt;br /&gt;
===Mappa===&lt;br /&gt;
* arene&lt;br /&gt;
* minimappa (pixelata ?), legenda oggetti base, devono esserci caselle implicite&lt;br /&gt;
* mappa 100x100 (rivalutato, meno limitata)&lt;br /&gt;
* Cannoni fissi in mezzo al campo (strumento).&lt;br /&gt;
&lt;br /&gt;
===Funzionalità generali===&lt;br /&gt;
* Chiave: non una flat input box per i comandi; ma dinamica: si suppone il soggetto &amp;quot;io&amp;quot; (le azioni le fanno in prima persona i personaggi), ogni mossa deve prevedere dei complementi (&amp;quot;verso&amp;quot;, &amp;quot;tra quanto&amp;quot;, &amp;quot;cosa&amp;quot;, &amp;quot;a favore di chi&amp;quot;, &amp;quot;contro chi&amp;quot;). Ogni complemento collegato con box stile in pop up =&amp;gt; bootstrap (la grafica sara unica). Prevedere anche modalita flat con input del tipo &amp;quot;azione a=pippo verso=termoli&amp;quot; (regex check)&lt;br /&gt;
* &amp;quot;meno tabelle&amp;quot;, &amp;quot;no bottoni&amp;quot; e solo foto che si alternano, &amp;quot;la grafica serve&amp;quot;: text box unica interazione, text area (history), immagine personaggio e immagine mappa&lt;br /&gt;
* &amp;quot;persistenza anche da interfaccia grafica&amp;quot;, diritti di scrittura sui file?&lt;br /&gt;
* Segnalazione (comando per fare nota)&lt;br /&gt;
* Modellare statistiche con funzioni probabilistiche (Gaussiane, esponenziali, uniformi, etc.) con relativa media e varianza piuttosto che individuare fasce/scaglionamenti (meno realistici e meno belli)&lt;br /&gt;
&lt;br /&gt;
===Deploy===&lt;br /&gt;
* &amp;quot;commenta il codice&amp;quot;, &amp;quot;dividi et impera&amp;quot;&lt;br /&gt;
* Server web (Apache) ospita partite (+ localmente ha i file di funzionamento), in LAN client giocano o da remoto con IP pubblico. Interfaccia HTML5 + Javascript per giocare. Studiare engine grafici Javascript&lt;br /&gt;
* bootstrap! (specie per input box)&lt;br /&gt;
* https://bit.dev/ per molti componenti web&lt;br /&gt;
* React, React Native .. forse meglio di Vue per diffusione&lt;br /&gt;
* Unity, WebGL (vedi SDK dedicata, built per Android/iOS/etc.)&lt;br /&gt;
* Modelli 3D videogiochi: https://www.models-resource.com/ , meglio se disaccoppiati da Unity (e.g. in cartelle independenti), aggiunta modelli online&lt;br /&gt;
* creare modelli: blender. creare disegni: krita&lt;br /&gt;
* Tutorial tank Unity: https://learn.unity.com/project/tanks-tutorial ; modelli: https://opengameart.org/&lt;br /&gt;
* WebSocket per gestire client asincroni (NodeJS ?)&lt;br /&gt;
* Su YT in “guarda più tardi” video per interagire unity con JS (“unity.sendMessage()” o simili)&lt;br /&gt;
* Due client: uno con WebGL e uno JS base con solo input (per test, per mancanza di supporto browser a WebGL). Eventualmente 3 client: 1 base (JS puro con qualche immagine al più), 1 WebGL+Unity 2D (grafica pixelata), 1 WebGL+Unity 3D (informazioni di input per mirare, ad es., in base a dove punto nello schermo. Qualcosa di simile anche per 2D). Tutti i client stessi JSON per comunicare al server!&lt;br /&gt;
* photogrammetry, https://medium.com/realities-io/getting-started-with-photogrammetry-d0a6ee40cb72&lt;br /&gt;
* roll20.net .. c'è '''davvero''' molto&lt;br /&gt;
* readthedocs.org&lt;br /&gt;
* css dinamici: sass, https://zurb.com/playground/motion-ui (zurb)&lt;br /&gt;
* progressive web apps: offline with server works. https://it.wikipedia.org/wiki/Progressive_Web_App ; responsive web design&lt;br /&gt;
&lt;br /&gt;
==== Altro (scartato)====&lt;br /&gt;
* rpgmaker, godot, aseprite, pixelart (in generale), ma anche phaser, piskel&lt;br /&gt;
* joomla! Per far prima con html&lt;br /&gt;
* libreria pygame&lt;br /&gt;
* Vuegg: https://github.com/marketplace/vuegg  &lt;br /&gt;
* Material Design&lt;br /&gt;
* JAVA: Class.forName(&amp;lt;name&amp;gt;.class).newInstance();&lt;br /&gt;
&lt;br /&gt;
===Copia&amp;amp;incolla generale, da smistare in sotto capitoli. Contiene anche '''tutte''' note del telefono (al 22/02/2020)===&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 1:'''&lt;br /&gt;
&lt;br /&gt;
Mosse che trasformano l’avversario: attenzione è una mossa devastante. Trasformazione totale o parziale. Si devono poter aggiungere mosse, strumenti dinamicamente. Battle bot:ribaltano, scintille, elementi (Oggetti) che danneggiano. One piece: I frutti del diavolo (悪魔の実 Akuma no mi?) sono frutti misteriosi che donano poteri soprannaturali a chi li mangia, rendendoli però incapaci di nuotare. Di conseguenza il contatto con l'acqua di mare o con una speciale sostanza conosciuta come agalmatolite indebolisce gli utilizzatori di frutti del diavolo e li priva dei loro poteri. Alcune persone sono inoltre in grado di ricorrere all'Ambizione (覇気 Haki?), una forza spirituale che permette di avvertire la presenza di altri esseri viventi e di predirne i movimenti, di irrobustire parti del corpo e di intimidire o fare svenire le creature con una debole forza di volontà. Personaggio ha funzione baricentro_x, baricentro_y calcolate come (from_x+to_x)/2 sul quale si basa la funzione di libreria getDistance(Personaggio A, Personaggio B, float success); tale funzione serve per calcolare per i PNG e per i PG se ha senso usare una mossa. Non-onniscienza: delle volte non si può sapere distanza avversario e fallisce la mossa per la distanza -&amp;gt; “float success” rappresenta la probabilità di successo (Personaggio ha parametro “osservare”). PNG di due categorie: offensivi o neutrali (no priorità a mosse di attacco, ma tutto casuale). Mosse e oggetti per chiamare Personaggi, magari non necessariamente alleati (2 mosse e 2 oggetti quindi necessari), richiamo di un personaggio preciso o di uno a caso. Ogni mossa/azione deve avere un tempo di attesa espresso in turni (alla meglio 0) per poter ripetere la mossa/azione. Strumenti anche mezzi di trasporto di aria, di terra, di acqua (o lava/palude). Possono attivare una metamorfosi / Unione per cambiare stats personaggio. Veicoli con armi o riparo. Gli strumenti da trattare come gli oggetti. Classe unica? I match/partite (immagino Classe Partita) devono avere variabile boolean “respawn”, per distinguere death match a punti con death match con una vita. Wrestling per ispirarsi nella lotta libera: calci pugni ginocchiate prese lanci salti testate gomitate ecc. Per punti si vince a un limite o dopo un tot di mosse , oppure al primo dei due raggiunti (max_punti e max_mosse parametri di Partita). I punti si guadagnano alla kill (un Punteggio per squadra, int punteggio salvato localmente dentro ogni Personaggio che ha la variabile int squadra). Si guadagnano tanti punti quanti sono i punti della variabile “valore” del personaggio ucciso, tale variabile è calcolata come somma dei valori di tutte le mosse/stats ect del Personaggio. Imperium civitas. Attacco dei giganti. Possibilità di morire se colpiti in un unico punto (tallone d Achille) implementabile come variabile boolean. Jump force. Game dev tycoon. Acqua diventa tsunami. Variabile int per attacco cumulativo di gruppo: es calciatori che più si passano la palla più l’attacco è forte. Suolo magico: non tutti i personaggi possono accedervi, array di string elenca i nomi di chi può accedervi. Funzione esci/entra in classe Personaggio per simulare scambio pokemon 6vs6. Piovra gigante. Rischio=danno*probabilita. Mossa su strumento e con strumento?&lt;br /&gt;
Mosse fisiche per arrampicarsi su avversario(se e solo se sei la metà di dimensioni(?)), atterrarlo, lanciarlo, accecarlo, immobilizzarlo. Se sei in gruppo/ orda bonus ad attacchi combinati. Armi: fruste e scheggie, corni che si suonano per chiamare altri. Tipo della mossa con moltiplicatore tra 0 (immune) e 2 (float): acqua, fuoco, magia, terra: da ispirarsi ai pokemon ma non da copiare, penso. Armi da campo: cannoni e catapulte. Veicoli d’acqua: moto acqua, canoe, barche a motore a remi. Nei veicoli malus su attenzione (variabile int in personaggio, indica attenzione in combattimento e non in altro) perché si è impegnato alla guida . All’inizio in image view “the hero” e “the map”. Condizione vittoria (oltre a morte, punti, o numero mosse, cioè tempo) morte di un singolo Personaggio, che potrebbe rappresentare un edificio, cassaforte o simili. Personaggio si può svestire e lasciare strumenti, modificano statistiche di attacco, difesa , agilità, ect. Variabile luce o non luce, che peggiora/migliora a seconda della specie la visibilità, quindi la precisione , specie in attacchi a distanza: Scurovisione evita i malus.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 2:'''&lt;br /&gt;
&lt;br /&gt;
Gioco2: se ci si lancia da oggetti , dopo essersi arrampicati, possono esserci danni da caduta; strumenti come paracaduti o mosse magiche possono evitare i danni. Pozione del vento, soffi e devi attacchi. In difesa puoi parare, schivare, deviare: tre variabili? Ambiente: colline e pianure uguali, Monti sono Oggetti, picco ossia un unico monte oggetto. Rocce volanti, nuvole sospese: oggetto può essere sospeso e può fare periodicamente una mossa, ad es tuono, può spostarsi, può fare entra/esci, oggetto albero e oggetto foresta, si possono prendere, nascondersi, arrampicarsi, lanciarli, ostacolano velocità ma se si ha abbastanza forza si spezzano alberi. Acqua poco profonda, profonda, molto profonda: variabile boolean in Personaggio “alto” per toccare in acqua profonda, con acqua si generano fiumi laghi e mari. Ambiente si deve poter evolvere: ad esempio oggetto diga può fare metamorfosi e diventare oggetto cascata/torrente in piena. Per edifici più oggetti che rappresentano le mura e il tetto, variabile boolean per oggetto per entrare nell’oggetto. Possono essere spazzati via: danni da crollo, si può combattere all interni, contengono strumenti come tavoli sedie mobili letto ect. Se uno viene schiantato contro uno strumento prende danno(es danno da schianto). Ci possono essere scale, si può non avere contatti visivo sull’avversario. Oggetto mura, oggetto torre, oggetto casa interno sono cose distinte: possono dare malus/bonus su visibilità. Ambiente: pozzi e grotte, da gestire come interno casa. Lava come acqua, ogni oggetto può essere sorgenti di liquido: monte sorgente acqua, vulcano sorgente lava. Può esserci variabile probabilità eruzione, se settata a 1 c’è una continua eruzione. Strade di vario tipo, sovrapposta a altri suoli, migliorano velocità di alcuni strumenti, variabile boolean “ha le ruote” in classe strumenti. Unificare classe strumento e classe oggetto. Oggetti sospesi: case sospese su albero, ad es. Fiamme in mezzo al suolo. Oggetti: porto, aereoporto, grattacieli, dighe, impianti a fune, ospedali per curarsi e prendere oggetti per curarsi dopo, scuole contenenti libri per apprendere una mossa, luoghi di ingegneria per creare oggetti, ad esempio veicoli o armi, soldi nel gioco per comprare da eventuali venditori. Ogni oggetto avra un prezzo (valutabile circa in euro per semplicità). Variabile float per fame, sete, sonno, caldo-freddo (parte da 0.5). Nella mappa ci deve essere per ogni punto la temperatura. Possibilità di vomito, dissenteria, problemi cardiaci, respiratori, muscolari. Armi: balestra, mani nude, sasso, tirapugni, torcia accesa. Armature: intralciano o favoriscono agilità, attacco, poteri magici, rumorosa (elusione), è uno strumento/oggetto. Attacchi possono essere prolungati per turni, mosse variabile boolean prolungabile: può aumentare o diminuire intensità, c’è un max espresso in turni di prolungabilita, inoltre può essere leggermente alterato con una variabile casuale. Equipaggiamento (strumento/oggetto): pietra focaia, attrezzi da scalata, boccale di birra, cavallo, moto, chiodi, martello da fabbro, corda, corazza, dardo, faretra/zaino/sacca (oggetti che contengono una lista di oggetti, stringhe) con un numero per la quantità) e capacità massima zaino e ogni oggetto può avere un valore intero per dimensione (es martello 3, ascia grande 7), mantello, olio, variabile boolean prende fuoco/conduce elettricità, amplifica magnetismo, aumenta esplosioni nucleari, aumenta forza di gravità (?), pala, piccone, rampino, specchio, per osservare quando si è nascosti e si ha malus su visibilità. Strumenti da scasso per aprire porte: variabile boolean per oggetti: entrata con scasso. Personaggio: string razza per swag, immunità a veleni e malattie, elusione, agilità, precisione, abilità magiche(?), difesa fisica. In ultima torcia: agilità, coraggio, forza, intelligenza, magia, manualità, percezione, socialità. Bestiario: aracnoide di varie dimensioni, talpe giganti, vermi giganti di terra di mare e di lava ect, bulbo trascinatore che ha tentacoli per tirare a se e mangiare, lui è immobile, calabrone gigante, serpenti giganti, cinghiali, draghi, elfi, goblin e re goblin, sciamani (goblin), totem di guerra come strumento/oggetti per alterare statistiche nella loro area di influenza, lupo, mastino bruciante, nani, non morti/zombie/mummia/scheletro variabile boolean vivo a false ma ha ancora hp su parti del corpo: variabile boolean “zombizabile”. Orchi, pesci da terra (anfibi) tritone dell abisso, troll e trollin (orchi più deformi), umani. Abilità dei personaggi in ultima torcia: artificiale (robot) immunità a soffocamento, veleni, malattie ect immune a manipolazioni psichiche, visione oscurità; danno da attacco in carica; fiammegiante ossia la creatura può incendiarsi e elettrizzante ossia può diventare elettrica caricamente; modalità furia/mailmen ossia ottiene bonus su alcune/tutte le statistiche; gigantesco o molto piccolo due boolean (?forse non serve); immunità a magie mentali, al fuoco; linguaggi (?); non morto; danno da attacco in presa; pungiglioni velenosi; sa muoversi su ragnatele o è rallentato, resistenza a perforazione, respirare sott’acqua o sotto lava o nei liquidi in genere; rigenerazione; riceve danni dalla luce solare o da assenza di luce; è terrorizzato/impaurito/intimidito o se è imperturbabile boolean. Danno da trascinamento; paralizzante; può diventare più veloce (?non serve); visione a infrarossi attraverso oggetti; volare o andare sotto terra. Imperium editor, cose che penso di non aver ancora scritto: stagioni, suolo erboso o terriccio, sabbia con erba e terra e da sola, strade e stagioni, altitudine, alberi e arbusti, vari tipi a foglia larga, conifere, alberi secchi, palme, arbusti verdi e secchi, cactus, alghe marine, rocce e pietre, scheletri per terra, legna tagliata (alberi tagliati), carri e carretti, grotte e rovine per accessi sotterranei, locande, templi, accampamenti, fortini, monoliti, fontana, tombe e cimiteri, borse per terra, pozzo, troni, croci(del teschio), pozzo, capanne, lapidi, ponti, recinzioni, falò, tende, torri, panoplia, fessure come abissi, statue, rovine (deserto) come case distrutte, colonne per costruire templi, piramidi, sfingi, bandiere, rovine in Europa, campi coltivati che contengono cibo, fiamma (in altre), roccia in altre per montagne, altre-&amp;gt;rovine per monumenti non egiziani ma europei.&lt;br /&gt;
Ci sono paludi. Tende da campo. Forti, porti. Edifici delle fortezze, edifici dei villaggi. Naufragi e scogli.&lt;br /&gt;
Parametri voglia/impegno float per descrivere voglia di combattere Personaggio. Ricevi danno uscendo dalla mappa tra 1-5% tra 6-10% tra 11-15% della vita totale di ogni parte del corpo per ogni turno di gioco. Danno da precipitazione diverso da carica, uno verticale uno orizzontale, se precipiti da molto in alto hai bonus, oltre che danni da schianto lol. Baionette, formazione a blocchi, a quadrato (difensiva) sparano su quattro lati, a schiera vanno avanti. Usano un colpo poi lunga ricarica. Variabile boolean per attivare o meno fuoco amico. Azione per cambiare posizione: in piedi, in ginocchio(inteso come via di mezzo), sdraiato: per permettere migliore visibilità a chi è dietro (nella formazione).&lt;br /&gt;
Altruismo, coraggio, spingere oltre il limite, difendere al posto di un altro, migliorare posizione per avere bonus. Mosse da usare in condizioni psicologiche idonee: mosse estreme per disperazione, bonus unici. Condizioni per situazioni: blocco, spalle al muro, stritolato, confuso, semi parassiti addosso, azzoppato, bagnato d’acqua, lame affilate, corazza indurita, tante copie di me stesso attive, preveggente. Per ambiente:pioggia (torrenziale), barriera a cupola, punte metalliche a terra, blocco di fumo nero. Far volare un avversario/alleato. Tutti possono fare tutto sotto effetti magici o fisici. Un cavallo può volare se viene preso da un uccello e portato in alto.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 3, 4:'''&lt;br /&gt;
&lt;br /&gt;
Gioco1,2,3,4: tutto caricato su wikis.&lt;br /&gt;
&lt;br /&gt;
Gioco3: Mosse con caricamento + spostamento (es. kameamea con teletrasporto). Ciclo di interazione principale:crea o combatti. Modalità campagna, che chiede in input da che battaglia iniziare, ma implica tipi battaglie prefissati. Alla morte/sconfitta di un personaggio si possono alterare statistiche (es personaggio può cambiare fazione). Alcune mosse possono lasciare oggetti sul terreno: (ad es, radici di Groth). Ogni oggetto può alterare le statistiche al passaggio sopra, nelle vicinanze. Boolean invisibile per personaggio, diverso da elusione infinita. Se personaggio va in un altro dimensione -&amp;gt; unreachable. Attacco coordinato, se non lo fanno tutti vale lo stesso ma depotenziato opportunamente . Personaggio in modalità maniac (2 mosse per turno) e in modalità depressive (1 mossa ogni due turni); personaggio Flash può fare 10 mosse in un turno. Chiudi con lucchetto oggetto da dentro o da fuori, oggetto ingresso in oggetto casa , più ingressi per un singolo oggetto.nicole aniston. Rimbalzo se ci si schianta contro oggetto da calcolare con parametro. Ryuk e Darkrai.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gioco 4 23/07/2019:&lt;br /&gt;
Pula fiction, aracnidi, oggetto: due superfici rettangolari di forma diversa, anche inclinate , collegate. Più pezzi collegati tra loro per forme cilindriche cave, ad esempio, tipo vulcano. Mappa con sprite personaggi, canvas: anche mouseClick? Statistiche con nome gerarchico, es pokemon_attacco. Modalità survival, stile isola di jurassic park gdr; sia in coop che contro; possibilità di fare N turni di fila se non ci sono altri player giocanti nelle vicinanze (ciò però comporterebbe , in modalità contro , di capire quando c’è qualcuno nelle vicinanze perché si andrebbe di 1 turno alla volta, soluzioni: in mod contro 1 turno per volta oppure meccanismo di sincronizzazione turni quando uno vede l’altro (anche furtivo) come c’è attacco 1 turno a testa) .. analogo a Battle royale(?); inizio con starter kit random. Modalità assedio al castello. Inoltre se posso fare N turni di fila si può pensare a più pc , uno per persona , coordinati per fare comandi in parallelo, ma va ben congegnato meccanismo di sincronizzazione. Parti DelCorpo -&amp;gt; Componente/i oppure Parte. La mappa deve essere (x,y); l’altezza viene indicata onMouseOver certi pixel dove è posto il Personaggio; se personaggio dentro edificio/grotta cambio img (es sfocato/tratteggiato). Mosse: astrarre per target; molte mosse sono simili tra loro, somiglianza va sfruttata, hanno magari dei target in comune, o variano solo per un parametro. Creare mappa anche con drag and drop immagini ?(un po’ difficile). Più layout per interfaccia grafica (esempio uno che mostra errori input su text area, uno con alert, uno su box text area separato). Input comandi consumato pezzo per pezzo, alcune parole se prevedono parametri quando riconosciute fanno fetch anche di parola (numero) successiva. Face toon foto? Import parziali di personaggi (tutto tranne/solo questi campi specificati). Texture mappa complete o ripetibili (es per suolo). Anteprima battaglia stile battaglia pokemon (magari per 1/2/3 vs 1/2/3) per rappresentare scontro. Conviene usare xslx (excel) per dati, considerare che può non servire la libreria Java per leggere stringhe per operazioni. Mossa “again” , ripeti la precedenza(opportuna modifica parametri, es mossa spostamento). Possibile gestione contromosse: si usano marker (tag): ogni mossa ha elenco tag del tipo di contromosse che può subire (con probabilità annessa, che può dipendere da pg che subisce mossa congiuntamente a mossa stessa). Ogni mossa inoltre deve essere taggata come possibile contromossa che il pg può usare (per schivare può fare in più modi). A seconda del lancio del dado il pg che effettua La contromossa può anche scegliere tipologia di contromossa o solo la mossa della tipologia che ha beccato (entrano in gioco riflessi ect.). I parametri che fanno attivare unq o un’altra contromossa sono dinamici, posso dipendere ad esempio dalla posizione tra i due pg o altre statistiche. Tag contromosse a fasce (es. coprirsi è sempre più facile che schivare che e più facile di schivare e contrattaccare (?); all’interno dello stesso schivare e contrattaccare ci sono più sotto categorie). Per aggiunta personaggio può essere utili interfaccia dedicata, non linea di comando (o altre operazioni, specie se ci sono tabelle). Mossa “premonizione”: predire il futuro a breve termine, dici che mossa vorresti fare e ti dice esito (o più esiti se uno chiede più mosse). Funziona solo sulla prossima mossa. Contromossa delle contromossa gestione?? Eventualmente nell’esito si prevede ancore contro-contromossa. Ma si innesca reazione a catena, inoltre da gestire scelta contromossa in questo caso. Applicazione tag conoscenza(universo di appartenenza): “Termoli”, “pokemon”, “liceo classico Termoli”, anche gerarchici, per filtrare sui personaggi.target componibili , fattorizzato creazione mosse, hanno un costo magari per indicare quantovoccupano dicuna mossa, relativo maybe a un parametro o più del target stesso. In particolare, non saranno salvate le mosse per un personaggio (o solo alcune “preferite”) ma il suo insieme di target i quali devono dire:statistica che influenzano, “costo del turno” che richiedono al variare dell’intensità del target (che aumenta linearmente, esponenzialmente, generica f(x)) quindi corsa blanda costo 1 , Max corsa costo 5 (max), elenco (string) target incompatibili con tale target (se serve), nota relative ad es per quando uno vuole creare una mossa durante la battaglia (“target corsa, max sforzo dedicabile 4 ect” metti “50 metri corsa” “ok/troppo! Vuoi sforzati di più rischiando effetti collaterali?”). Si può autoscrivere la voce narrante del gioco come “la tua coscienza” mentre che giochi, d’altronde si interagisce con essa. Considerare che un target può appartenere a più personaggi, magari sotto nomi di mosse diversi.&lt;br /&gt;
Definire gerarchia di personaggi per template (tipo classe e super classe) e template importabili (tipo usa fuoco). Es umanoide non umanoide, tra umanoide maschio- femmina etc. Classe che estende System.out per creare funzioni che aggiungono Header “DEBUG:” etc; due programmi Java , due main: uno delegato a calcoli + gestione Excel; altro legge stdout dell altro per interfaccia grafica. Per allenare PG creare dei PG fantocci con label per fare Q-learning iniziale, più avanti far allenare pg tra loro; creare vari fantocci: tank terrestre fisico, healer volante etc. Excel: si usa css che si può rendere tabellare, più facile da trattare nel codice rispetto a .xslx. Ogni “utente” ed Lostefra ha il suo personale dizionario con sue personali short cut da usare in partita, eventuale login con password (opzionale) x accesso. Vedere license show down. Mappa unica stile giochi di ruolo, si vede tutto da sopra: click o simili su edifici/caverne per mappe interne a tale posto, così ok sprite e per rappresentare “pg in volo” sprite dedicato. Densità aria per dire quando anche un uomo per es può volare. Ipotesi più efficiente per dare un valore stima al pg: AI base che gioca a manetta contro altre AI base e dalle vittorie si fa l’euristica, più vittoria facile/veloce/stracciante più punti, contro vari pg, contro pg standard bench mark.&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Note&amp;diff=205</id>
		<title>Note</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Note&amp;diff=205"/>
		<updated>2020-06-23T11:08:53Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: /* Funzionalità generali */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Note ==&lt;br /&gt;
&lt;br /&gt;
'''Vedere altre note su fogli di carta e promemoria del telefono. Ce ne sono molte.'''&lt;br /&gt;
'''La copiatura dai fogli di carta dei continuare da pagina 4 (&amp;quot;alterare param..&amp;quot;).'''&lt;br /&gt;
&lt;br /&gt;
===Inspirational Concepts===&lt;br /&gt;
* Gioco Lotta (Pokémon, Pokkén)&lt;br /&gt;
* no caselle esplicite&lt;br /&gt;
* Descrizione rispetto a: ambiente, nemico, oggetti&lt;br /&gt;
* pokémon, DnD, Call of Duty, Super Smash Brawl, corse pazze&lt;br /&gt;
* concentrarsi su: fluidi, telecinesi, razze, bonus/malus, gradi di libertà (fisicamente parlando) &lt;br /&gt;
* scacchi (es. crea casella), shaolin showdown&lt;br /&gt;
* prevedere = creatività&lt;br /&gt;
* acqua, aria, fuoco, terra&lt;br /&gt;
* gravità (newton), verso alto, basso, destra, sinistra, circolare, tutti i versi&lt;br /&gt;
* jumanji, savana, animali, zoologia&lt;br /&gt;
* tempo/spazio&lt;br /&gt;
* BF4, pirati, roma (imperium civitas)&lt;br /&gt;
* musica come arma (rap)&lt;br /&gt;
* magia, prestigiatori&lt;br /&gt;
* dinosauri (documentario, libro, zoologia)&lt;br /&gt;
* avengers, supereroi (libro)&lt;br /&gt;
&lt;br /&gt;
* Looney toons&lt;br /&gt;
&lt;br /&gt;
===Personaggi (con statistiche e stati)===&lt;br /&gt;
* combattenti (con statistiche e stati)&lt;br /&gt;
* immagine rappresentativa per rappresentare meglio&lt;br /&gt;
* HP: colore rosso su immagine personaggio, dove sei debole/già colpito (idea scartata)&lt;br /&gt;
* penitenza: il malus può essere inteso come ciò che c'è nell'inserimento successivo, malus cumulativo&lt;br /&gt;
* essere ipocrita, finzione (schermo)&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (personaggi)&lt;br /&gt;
* metamorfosi&lt;br /&gt;
* alchimisti&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* possibilità giù in terra/ giù in acqua, con reachable e unreachable Boolean. Fuori da mappa anche reachable e unreachable.&lt;br /&gt;
* Personaggi composti di parti[] es. testa, busto, gambe, braccia, coda, pinna, ali. Distinzione per arto di movimento e/o spostamento boolean.&lt;br /&gt;
* Arti possono provocare danno, bruciatura , paralisi a contatto (Boolean) . Percentuale di probabilità accompagna ogni Boolean.&lt;br /&gt;
* Ogni parte del corpo punti vita + se inutilizzabile + amputata + stato (es paralisi).&lt;br /&gt;
* Per fare battaglie tra molto grandi =&amp;gt; 1 m lo si intende come 10m.  (rivalutato, aumentare livello scaling)&lt;br /&gt;
* Personaggio fusionabile Boolean + string nomi con cui si fonde.&lt;br /&gt;
* Distinzione tra infernape e infernape1/2/3 ect tra “specie” e “nome”.&lt;br /&gt;
* variabile Boolean respawnable.&lt;br /&gt;
* Raccogliere a piene mani da: https://spore.fandom.com/wiki/Creature_Editor&lt;br /&gt;
* Ad esempio weapons come elemento di Corpo (zanne, corna) e possibilità di muoversi/attaccare furtivamente.&lt;br /&gt;
* Divisibile e unibile come boolean e array di stringe associate per indicare i nomi con cui si unisce il Personaggio o in cui si divide.&lt;br /&gt;
* Variabili posizione nome: from_x/y ; to_x/y.&lt;br /&gt;
* Classe Stato, Personaggio contiene Array di stato, stato contiene moltiplicatori per statistica es attacco velocità precisione elusione ect.&lt;br /&gt;
* Personaggio deve avere una stat tipo sanità mentale, intelligenza, quanto è confuso e quanto è impaurito (2).&lt;br /&gt;
&lt;br /&gt;
* Per personaggi molto piccoli (meno di 1m x 1m x 1m) possibilità di essere in (x,y,z) tra 0 e 1.000.000 (ordine del micrometro, 1*10^-6 == 0,000001) e avere (lenX, lenY, lenZ). In questo modo sono definite dimensioni inferiori ad 1 m^3.&lt;br /&gt;
* personaggi max 20x20 (rivaluato, meno limitata)&lt;br /&gt;
&lt;br /&gt;
===Mosse===&lt;br /&gt;
* &amp;quot;combattimento prescinde da combattente&amp;quot;&lt;br /&gt;
* mosse hanno: direzione, azione, attacco (mosse pokémon)&lt;br /&gt;
* Parametri interi per mossa (direzione, consumabili) con lower e upper bound&lt;br /&gt;
* camuffarsi =&amp;gt; DnD manuale&lt;br /&gt;
* wrestling (libro) per le mosse/prese&lt;br /&gt;
&lt;br /&gt;
* X fa una mossa contro Y: Z potrebbe reagire (Es. ricevendo il colpo al posto di Y). Può essere realizzato sia come se &amp;quot;Y chiede soccorso Z&amp;quot; o come reazione di alleati adiacenti &amp;quot;Z soccorre Y&amp;quot;&lt;br /&gt;
* Mossa prende come parametro di ingresso Corpo, ossia la parte del corpo coinvolta nella mossa (es arto , tutto corpo ect). &lt;br /&gt;
&lt;br /&gt;
===Oggetto (con statistiche e stati)===&lt;br /&gt;
* armi: lacci (stati), lame (potenze), sassi, reti, pistole (munizioni), razzi, bombe (potenze), fuoco (d'artificio?) =&amp;gt; manuale DnD&lt;br /&gt;
* veleno n modi =&amp;gt; DnD manuale&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (oggetti)&lt;br /&gt;
* automezzi con cannoni, variabile 'hasEntrata', 'tempoRiutilizzo'&lt;br /&gt;
* violino come arma (tutti strumenti musicali): a fiato, a corda, a percussione&lt;br /&gt;
* veleni, ampolle e flaconi magici, insieme di 'oggetti dentro' un oggetto&lt;br /&gt;
&lt;br /&gt;
* Classe oggetto: es albero, roccia, casa: forza necessaria per sradicare + forza per lanciare + destrezza / agilità per appendersi + nascondersi in proporzione alle dimensioni di chi si nasconde. &lt;br /&gt;
* Altri es. pali. Sotto terra o sotto acqua/lava/melma o simili. &lt;br /&gt;
* Acqua rallenta se non hai pinne boolean.&lt;br /&gt;
* Classe strumento per oggetti che si tengono in mano, es reti , pistole, spade, pugnali, scudi, elmi, lancia, arco , frecce, lanciarazzi, fucili cecchino, fucile assalto, corde.&lt;br /&gt;
* Strumenti e mosse: danno ad area, perforante, contundente (vedi dnd armi). Mosse possono creare/modificare/distruggere oggetti e strumenti.&lt;br /&gt;
* Oggetti del campo di gioco incidono su elusione (parametro di personaggio).&lt;br /&gt;
* Buco/abisso (boolean) per dire se c’è o meno il suolo (Suolo come classe?). &lt;br /&gt;
* Radiazioni. &lt;br /&gt;
&lt;br /&gt;
===Modalità gioco===&lt;br /&gt;
* turnazione&lt;br /&gt;
* 1 v 1 v 1 etc., ma anche squadre casuali&lt;br /&gt;
* punteggio: chi fa più punti, più uccisioni, definizione di 'punto', gioco per perdere&lt;br /&gt;
* inserisci personaggio total random&lt;br /&gt;
&lt;br /&gt;
* Modalità battaglia con interazione stile battaglia navale (non si vede mossa dell'avversario)&lt;br /&gt;
* Modalità di gioco: tutti contro tutti (battle royale), death match, vs CPU mode zombie(attaccano solo, se non possono vanno verso nemico): serve introdurre un punteggio, di sicuro per mode zombie , ma anche per death match e tutti contro tutti&lt;br /&gt;
* ingressi: ne entra un altro?&lt;br /&gt;
&lt;br /&gt;
===Mappa===&lt;br /&gt;
* arene&lt;br /&gt;
* minimappa (pixelata ?), legenda oggetti base, devono esserci caselle implicite&lt;br /&gt;
* mappa 100x100 (rivalutato, meno limitata)&lt;br /&gt;
* Cannoni fissi in mezzo al campo (strumento).&lt;br /&gt;
&lt;br /&gt;
===Funzionalità generali===&lt;br /&gt;
* Chiave: non una flat input box per i comandi; ma dinamica: si suppone il soggetto &amp;quot;io&amp;quot; (le azioni le fanno in prima persona i personaggi), ogni mossa deve prevedere dei complementi (&amp;quot;verso&amp;quot;, &amp;quot;tra quanto&amp;quot;, &amp;quot;cosa&amp;quot;, &amp;quot;a favore di chi&amp;quot;, &amp;quot;contro chi&amp;quot;). Ogni complemento collegato con box stile in pop up =&amp;gt; bootstrap (la grafica sara unica). Prevedere anche modalita flat con input del tipo &amp;quot;azione a=pippo verso=termoli&amp;quot; (regex check)&lt;br /&gt;
* &amp;quot;meno tabelle&amp;quot;, &amp;quot;no bottoni&amp;quot; e solo foto che si alternano, &amp;quot;la grafica serve&amp;quot;: text box unica interazione, text area (history), immagine personaggio e immagine mappa&lt;br /&gt;
* &amp;quot;persistenza anche da interfaccia grafica&amp;quot;, diritti di scrittura sui file?&lt;br /&gt;
* Segnalazione (comando per fare nota)&lt;br /&gt;
* Modellare statistiche con funzioni probabilistiche (Gaussiane, esponenziali, uniformi, etc.) con relativa media e varianza piuttosto che individuare fasce/scaglionamenti (meno realistici e meno belli)&lt;br /&gt;
&lt;br /&gt;
===Deploy===&lt;br /&gt;
* &amp;quot;commenta il codice&amp;quot;, &amp;quot;dividi et impera&amp;quot;&lt;br /&gt;
* Server web (Apache) ospita partite (+ localmente ha i file di funzionamento), in LAN client giocano o da remoto con IP pubblico. Interfaccia HTML5 + Javascript per giocare. Studiare engine grafici Javascript&lt;br /&gt;
* bootstrap! (specie per input box)&lt;br /&gt;
* https://bit.dev/ per molti componenti web&lt;br /&gt;
* React, React Native .. forse meglio di Vue per diffusione&lt;br /&gt;
* Unity, WebGL (vedi SDK dedicata, built per Android/iOS/etc.)&lt;br /&gt;
* Modelli 3D videogiochi: https://www.models-resource.com/ , meglio se disaccoppiati da Unity (e.g. in cartelle independenti), aggiunta modelli online&lt;br /&gt;
* creare modelli: blender. creare disegni: krita&lt;br /&gt;
* Tutorial tank Unity: https://learn.unity.com/project/tanks-tutorial ; modelli: https://opengameart.org/&lt;br /&gt;
* WebSocket per gestire client asincroni (NodeJS ?)&lt;br /&gt;
* Su YT in “guarda più tardi” video per interagire unity con JS (“unity.sendMessage()” o simili)&lt;br /&gt;
* Due client: uno con WebGL e uno JS base con solo input (per test, per mancanza di supporto browser a WebGL). Eventualmente 3 client: 1 base (JS puro con qualche immagine al più), 1 WebGL+Unity 2D (grafica pixelata), 1 WebGL+Unity 3D (informazioni di input per mirare, ad es., in base a dove punto nello schermo. Qualcosa di simile anche per 2D). Tutti i client stessi JSON per comunicare al server!&lt;br /&gt;
* photogrammetry, https://medium.com/realities-io/getting-started-with-photogrammetry-d0a6ee40cb72&lt;br /&gt;
* roll20.net .. c'è '''davvero''' molto&lt;br /&gt;
* readthedocs.org&lt;br /&gt;
* css dinamici: sass, https://zurb.com/playground/motion-ui (zurb)&lt;br /&gt;
* progressive web apps: offline with server works. https://it.wikipedia.org/wiki/Progressive_Web_App ; responsive web design&lt;br /&gt;
&lt;br /&gt;
==== Altro (scartato)====&lt;br /&gt;
* rpgmaker, godot, aseprite, pixelart (in generale), ma anche phaser, piskel&lt;br /&gt;
* joomla! Per far prima con html&lt;br /&gt;
* libreria pygame&lt;br /&gt;
* Vuegg: https://github.com/marketplace/vuegg  &lt;br /&gt;
* Material Design&lt;br /&gt;
* JAVA: Class.forName(&amp;lt;name&amp;gt;.class).newInstance();&lt;br /&gt;
&lt;br /&gt;
===Copia&amp;amp;incolla generale, da smistare in sotto capitoli. Contiene anche '''tutte''' note del telefono (al 22/02/2020)===&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 1:'''&lt;br /&gt;
&lt;br /&gt;
Mosse che trasformano l’avversario: attenzione è una mossa devastante. Trasformazione totale o parziale. Si devono poter aggiungere mosse, strumenti dinamicamente. Battle bot:ribaltano, scintille, elementi (Oggetti) che danneggiano. One piece: I frutti del diavolo (悪魔の実 Akuma no mi?) sono frutti misteriosi che donano poteri soprannaturali a chi li mangia, rendendoli però incapaci di nuotare. Di conseguenza il contatto con l'acqua di mare o con una speciale sostanza conosciuta come agalmatolite indebolisce gli utilizzatori di frutti del diavolo e li priva dei loro poteri. Alcune persone sono inoltre in grado di ricorrere all'Ambizione (覇気 Haki?), una forza spirituale che permette di avvertire la presenza di altri esseri viventi e di predirne i movimenti, di irrobustire parti del corpo e di intimidire o fare svenire le creature con una debole forza di volontà. Personaggio ha funzione baricentro_x, baricentro_y calcolate come (from_x+to_x)/2 sul quale si basa la funzione di libreria getDistance(Personaggio A, Personaggio B, float success); tale funzione serve per calcolare per i PNG e per i PG se ha senso usare una mossa. Non-onniscienza: delle volte non si può sapere distanza avversario e fallisce la mossa per la distanza -&amp;gt; “float success” rappresenta la probabilità di successo (Personaggio ha parametro “osservare”). PNG di due categorie: offensivi o neutrali (no priorità a mosse di attacco, ma tutto casuale). Mosse e oggetti per chiamare Personaggi, magari non necessariamente alleati (2 mosse e 2 oggetti quindi necessari), richiamo di un personaggio preciso o di uno a caso. Ogni mossa/azione deve avere un tempo di attesa espresso in turni (alla meglio 0) per poter ripetere la mossa/azione. Strumenti anche mezzi di trasporto di aria, di terra, di acqua (o lava/palude). Possono attivare una metamorfosi / Unione per cambiare stats personaggio. Veicoli con armi o riparo. Gli strumenti da trattare come gli oggetti. Classe unica? I match/partite (immagino Classe Partita) devono avere variabile boolean “respawn”, per distinguere death match a punti con death match con una vita. Wrestling per ispirarsi nella lotta libera: calci pugni ginocchiate prese lanci salti testate gomitate ecc. Per punti si vince a un limite o dopo un tot di mosse , oppure al primo dei due raggiunti (max_punti e max_mosse parametri di Partita). I punti si guadagnano alla kill (un Punteggio per squadra, int punteggio salvato localmente dentro ogni Personaggio che ha la variabile int squadra). Si guadagnano tanti punti quanti sono i punti della variabile “valore” del personaggio ucciso, tale variabile è calcolata come somma dei valori di tutte le mosse/stats ect del Personaggio. Imperium civitas. Attacco dei giganti. Possibilità di morire se colpiti in un unico punto (tallone d Achille) implementabile come variabile boolean. Jump force. Game dev tycoon. Acqua diventa tsunami. Variabile int per attacco cumulativo di gruppo: es calciatori che più si passano la palla più l’attacco è forte. Suolo magico: non tutti i personaggi possono accedervi, array di string elenca i nomi di chi può accedervi. Funzione esci/entra in classe Personaggio per simulare scambio pokemon 6vs6. Piovra gigante. Rischio=danno*probabilita. Mossa su strumento e con strumento?&lt;br /&gt;
Mosse fisiche per arrampicarsi su avversario(se e solo se sei la metà di dimensioni(?)), atterrarlo, lanciarlo, accecarlo, immobilizzarlo. Se sei in gruppo/ orda bonus ad attacchi combinati. Armi: fruste e scheggie, corni che si suonano per chiamare altri. Tipo della mossa con moltiplicatore tra 0 (immune) e 2 (float): acqua, fuoco, magia, terra: da ispirarsi ai pokemon ma non da copiare, penso. Armi da campo: cannoni e catapulte. Veicoli d’acqua: moto acqua, canoe, barche a motore a remi. Nei veicoli malus su attenzione (variabile int in personaggio, indica attenzione in combattimento e non in altro) perché si è impegnato alla guida . All’inizio in image view “the hero” e “the map”. Condizione vittoria (oltre a morte, punti, o numero mosse, cioè tempo) morte di un singolo Personaggio, che potrebbe rappresentare un edificio, cassaforte o simili. Personaggio si può svestire e lasciare strumenti, modificano statistiche di attacco, difesa , agilità, ect. Variabile luce o non luce, che peggiora/migliora a seconda della specie la visibilità, quindi la precisione , specie in attacchi a distanza: Scurovisione evita i malus.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 2:'''&lt;br /&gt;
&lt;br /&gt;
Gioco2: se ci si lancia da oggetti , dopo essersi arrampicati, possono esserci danni da caduta; strumenti come paracaduti o mosse magiche possono evitare i danni. Pozione del vento, soffi e devi attacchi. In difesa puoi parare, schivare, deviare: tre variabili? Ambiente: colline e pianure uguali, Monti sono Oggetti, picco ossia un unico monte oggetto. Rocce volanti, nuvole sospese: oggetto può essere sospeso e può fare periodicamente una mossa, ad es tuono, può spostarsi, può fare entra/esci, oggetto albero e oggetto foresta, si possono prendere, nascondersi, arrampicarsi, lanciarli, ostacolano velocità ma se si ha abbastanza forza si spezzano alberi. Acqua poco profonda, profonda, molto profonda: variabile boolean in Personaggio “alto” per toccare in acqua profonda, con acqua si generano fiumi laghi e mari. Ambiente si deve poter evolvere: ad esempio oggetto diga può fare metamorfosi e diventare oggetto cascata/torrente in piena. Per edifici più oggetti che rappresentano le mura e il tetto, variabile boolean per oggetto per entrare nell’oggetto. Possono essere spazzati via: danni da crollo, si può combattere all interni, contengono strumenti come tavoli sedie mobili letto ect. Se uno viene schiantato contro uno strumento prende danno(es danno da schianto). Ci possono essere scale, si può non avere contatti visivo sull’avversario. Oggetto mura, oggetto torre, oggetto casa interno sono cose distinte: possono dare malus/bonus su visibilità. Ambiente: pozzi e grotte, da gestire come interno casa. Lava come acqua, ogni oggetto può essere sorgenti di liquido: monte sorgente acqua, vulcano sorgente lava. Può esserci variabile probabilità eruzione, se settata a 1 c’è una continua eruzione. Strade di vario tipo, sovrapposta a altri suoli, migliorano velocità di alcuni strumenti, variabile boolean “ha le ruote” in classe strumenti. Unificare classe strumento e classe oggetto. Oggetti sospesi: case sospese su albero, ad es. Fiamme in mezzo al suolo. Oggetti: porto, aereoporto, grattacieli, dighe, impianti a fune, ospedali per curarsi e prendere oggetti per curarsi dopo, scuole contenenti libri per apprendere una mossa, luoghi di ingegneria per creare oggetti, ad esempio veicoli o armi, soldi nel gioco per comprare da eventuali venditori. Ogni oggetto avra un prezzo (valutabile circa in euro per semplicità). Variabile float per fame, sete, sonno, caldo-freddo (parte da 0.5). Nella mappa ci deve essere per ogni punto la temperatura. Possibilità di vomito, dissenteria, problemi cardiaci, respiratori, muscolari. Armi: balestra, mani nude, sasso, tirapugni, torcia accesa. Armature: intralciano o favoriscono agilità, attacco, poteri magici, rumorosa (elusione), è uno strumento/oggetto. Attacchi possono essere prolungati per turni, mosse variabile boolean prolungabile: può aumentare o diminuire intensità, c’è un max espresso in turni di prolungabilita, inoltre può essere leggermente alterato con una variabile casuale. Equipaggiamento (strumento/oggetto): pietra focaia, attrezzi da scalata, boccale di birra, cavallo, moto, chiodi, martello da fabbro, corda, corazza, dardo, faretra/zaino/sacca (oggetti che contengono una lista di oggetti, stringhe) con un numero per la quantità) e capacità massima zaino e ogni oggetto può avere un valore intero per dimensione (es martello 3, ascia grande 7), mantello, olio, variabile boolean prende fuoco/conduce elettricità, amplifica magnetismo, aumenta esplosioni nucleari, aumenta forza di gravità (?), pala, piccone, rampino, specchio, per osservare quando si è nascosti e si ha malus su visibilità. Strumenti da scasso per aprire porte: variabile boolean per oggetti: entrata con scasso. Personaggio: string razza per swag, immunità a veleni e malattie, elusione, agilità, precisione, abilità magiche(?), difesa fisica. In ultima torcia: agilità, coraggio, forza, intelligenza, magia, manualità, percezione, socialità. Bestiario: aracnoide di varie dimensioni, talpe giganti, vermi giganti di terra di mare e di lava ect, bulbo trascinatore che ha tentacoli per tirare a se e mangiare, lui è immobile, calabrone gigante, serpenti giganti, cinghiali, draghi, elfi, goblin e re goblin, sciamani (goblin), totem di guerra come strumento/oggetti per alterare statistiche nella loro area di influenza, lupo, mastino bruciante, nani, non morti/zombie/mummia/scheletro variabile boolean vivo a false ma ha ancora hp su parti del corpo: variabile boolean “zombizabile”. Orchi, pesci da terra (anfibi) tritone dell abisso, troll e trollin (orchi più deformi), umani. Abilità dei personaggi in ultima torcia: artificiale (robot) immunità a soffocamento, veleni, malattie ect immune a manipolazioni psichiche, visione oscurità; danno da attacco in carica; fiammegiante ossia la creatura può incendiarsi e elettrizzante ossia può diventare elettrica caricamente; modalità furia/mailmen ossia ottiene bonus su alcune/tutte le statistiche; gigantesco o molto piccolo due boolean (?forse non serve); immunità a magie mentali, al fuoco; linguaggi (?); non morto; danno da attacco in presa; pungiglioni velenosi; sa muoversi su ragnatele o è rallentato, resistenza a perforazione, respirare sott’acqua o sotto lava o nei liquidi in genere; rigenerazione; riceve danni dalla luce solare o da assenza di luce; è terrorizzato/impaurito/intimidito o se è imperturbabile boolean. Danno da trascinamento; paralizzante; può diventare più veloce (?non serve); visione a infrarossi attraverso oggetti; volare o andare sotto terra. Imperium editor, cose che penso di non aver ancora scritto: stagioni, suolo erboso o terriccio, sabbia con erba e terra e da sola, strade e stagioni, altitudine, alberi e arbusti, vari tipi a foglia larga, conifere, alberi secchi, palme, arbusti verdi e secchi, cactus, alghe marine, rocce e pietre, scheletri per terra, legna tagliata (alberi tagliati), carri e carretti, grotte e rovine per accessi sotterranei, locande, templi, accampamenti, fortini, monoliti, fontana, tombe e cimiteri, borse per terra, pozzo, troni, croci(del teschio), pozzo, capanne, lapidi, ponti, recinzioni, falò, tende, torri, panoplia, fessure come abissi, statue, rovine (deserto) come case distrutte, colonne per costruire templi, piramidi, sfingi, bandiere, rovine in Europa, campi coltivati che contengono cibo, fiamma (in altre), roccia in altre per montagne, altre-&amp;gt;rovine per monumenti non egiziani ma europei.&lt;br /&gt;
Ci sono paludi. Tende da campo. Forti, porti. Edifici delle fortezze, edifici dei villaggi. Naufragi e scogli.&lt;br /&gt;
Parametri voglia/impegno float per descrivere voglia di combattere Personaggio. Ricevi danno uscendo dalla mappa tra 1-5% tra 6-10% tra 11-15% della vita totale di ogni parte del corpo per ogni turno di gioco. Danno da precipitazione diverso da carica, uno verticale uno orizzontale, se precipiti da molto in alto hai bonus, oltre che danni da schianto lol. Baionette, formazione a blocchi, a quadrato (difensiva) sparano su quattro lati, a schiera vanno avanti. Usano un colpo poi lunga ricarica. Variabile boolean per attivare o meno fuoco amico. Azione per cambiare posizione: in piedi, in ginocchio(inteso come via di mezzo), sdraiato: per permettere migliore visibilità a chi è dietro (nella formazione).&lt;br /&gt;
Altruismo, coraggio, spingere oltre il limite, difendere al posto di un altro, migliorare posizione per avere bonus. Mosse da usare in condizioni psicologiche idonee: mosse estreme per disperazione, bonus unici. Condizioni per situazioni: blocco, spalle al muro, stritolato, confuso, semi parassiti addosso, azzoppato, bagnato d’acqua, lame affilate, corazza indurita, tante copie di me stesso attive, preveggente. Per ambiente:pioggia (torrenziale), barriera a cupola, punte metalliche a terra, blocco di fumo nero. Far volare un avversario/alleato. Tutti possono fare tutto sotto effetti magici o fisici. Un cavallo può volare se viene preso da un uccello e portato in alto.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 3, 4:'''&lt;br /&gt;
&lt;br /&gt;
Gioco1,2,3,4: tutto caricato su wikis.&lt;br /&gt;
&lt;br /&gt;
Gioco3: Mosse con caricamento + spostamento (es. kameamea con teletrasporto). Ciclo di interazione principale:crea o combatti. Modalità campagna, che chiede in input da che battaglia iniziare, ma implica tipi battaglie prefissati. Alla morte/sconfitta di un personaggio si possono alterare statistiche (es personaggio può cambiare fazione). Alcune mosse possono lasciare oggetti sul terreno: (ad es, radici di Groth). Ogni oggetto può alterare le statistiche al passaggio sopra, nelle vicinanze. Boolean invisibile per personaggio, diverso da elusione infinita. Se personaggio va in un altro dimensione -&amp;gt; unreachable. Attacco coordinato, se non lo fanno tutti vale lo stesso ma depotenziato opportunamente . Personaggio in modalità maniac (2 mosse per turno) e in modalità depressive (1 mossa ogni due turni); personaggio Flash può fare 10 mosse in un turno. Chiudi con lucchetto oggetto da dentro o da fuori, oggetto ingresso in oggetto casa , più ingressi per un singolo oggetto.nicole aniston. Rimbalzo se ci si schianta contro oggetto da calcolare con parametro. Ryuk e Darkrai.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gioco 4 23/07/2019:&lt;br /&gt;
Pula fiction, aracnidi, oggetto: due superfici rettangolari di forma diversa, anche inclinate , collegate. Più pezzi collegati tra loro per forme cilindriche cave, ad esempio, tipo vulcano. Mappa con sprite personaggi, canvas: anche mouseClick? Statistiche con nome gerarchico, es pokemon_attacco. Modalità survival, stile isola di jurassic park gdr; sia in coop che contro; possibilità di fare N turni di fila se non ci sono altri player giocanti nelle vicinanze (ciò però comporterebbe , in modalità contro , di capire quando c’è qualcuno nelle vicinanze perché si andrebbe di 1 turno alla volta, soluzioni: in mod contro 1 turno per volta oppure meccanismo di sincronizzazione turni quando uno vede l’altro (anche furtivo) come c’è attacco 1 turno a testa) .. analogo a Battle royale(?); inizio con starter kit random. Modalità assedio al castello. Inoltre se posso fare N turni di fila si può pensare a più pc , uno per persona , coordinati per fare comandi in parallelo, ma va ben congegnato meccanismo di sincronizzazione. Parti DelCorpo -&amp;gt; Componente/i oppure Parte. La mappa deve essere (x,y); l’altezza viene indicata onMouseOver certi pixel dove è posto il Personaggio; se personaggio dentro edificio/grotta cambio img (es sfocato/tratteggiato). Mosse: astrarre per target; molte mosse sono simili tra loro, somiglianza va sfruttata, hanno magari dei target in comune, o variano solo per un parametro. Creare mappa anche con drag and drop immagini ?(un po’ difficile). Più layout per interfaccia grafica (esempio uno che mostra errori input su text area, uno con alert, uno su box text area separato). Input comandi consumato pezzo per pezzo, alcune parole se prevedono parametri quando riconosciute fanno fetch anche di parola (numero) successiva. Face toon foto? Import parziali di personaggi (tutto tranne/solo questi campi specificati). Texture mappa complete o ripetibili (es per suolo). Anteprima battaglia stile battaglia pokemon (magari per 1/2/3 vs 1/2/3) per rappresentare scontro. Conviene usare xslx (excel) per dati, considerare che può non servire la libreria Java per leggere stringhe per operazioni. Mossa “again” , ripeti la precedenza(opportuna modifica parametri, es mossa spostamento). Possibile gestione contromosse: si usano marker (tag): ogni mossa ha elenco tag del tipo di contromosse che può subire (con probabilità annessa, che può dipendere da pg che subisce mossa congiuntamente a mossa stessa). Ogni mossa inoltre deve essere taggata come possibile contromossa che il pg può usare (per schivare può fare in più modi). A seconda del lancio del dado il pg che effettua La contromossa può anche scegliere tipologia di contromossa o solo la mossa della tipologia che ha beccato (entrano in gioco riflessi ect.). I parametri che fanno attivare unq o un’altra contromossa sono dinamici, posso dipendere ad esempio dalla posizione tra i due pg o altre statistiche. Tag contromosse a fasce (es. coprirsi è sempre più facile che schivare che e più facile di schivare e contrattaccare (?); all’interno dello stesso schivare e contrattaccare ci sono più sotto categorie). Per aggiunta personaggio può essere utili interfaccia dedicata, non linea di comando (o altre operazioni, specie se ci sono tabelle). Mossa “premonizione”: predire il futuro a breve termine, dici che mossa vorresti fare e ti dice esito (o più esiti se uno chiede più mosse). Funziona solo sulla prossima mossa. Contromossa delle contromossa gestione?? Eventualmente nell’esito si prevede ancore contro-contromossa. Ma si innesca reazione a catena, inoltre da gestire scelta contromossa in questo caso. Applicazione tag conoscenza(universo di appartenenza): “Termoli”, “pokemon”, “liceo classico Termoli”, anche gerarchici, per filtrare sui personaggi.target componibili , fattorizzato creazione mosse, hanno un costo magari per indicare quantovoccupano dicuna mossa, relativo maybe a un parametro o più del target stesso. In particolare, non saranno salvate le mosse per un personaggio (o solo alcune “preferite”) ma il suo insieme di target i quali devono dire:statistica che influenzano, “costo del turno” che richiedono al variare dell’intensità del target (che aumenta linearmente, esponenzialmente, generica f(x)) quindi corsa blanda costo 1 , Max corsa costo 5 (max), elenco (string) target incompatibili con tale target (se serve), nota relative ad es per quando uno vuole creare una mossa durante la battaglia (“target corsa, max sforzo dedicabile 4 ect” metti “50 metri corsa” “ok/troppo! Vuoi sforzati di più rischiando effetti collaterali?”). Si può autoscrivere la voce narrante del gioco come “la tua coscienza” mentre che giochi, d’altronde si interagisce con essa. Considerare che un target può appartenere a più personaggi, magari sotto nomi di mosse diversi.&lt;br /&gt;
Definire gerarchia di personaggi per template (tipo classe e super classe) e template importabili (tipo usa fuoco). Es umanoide non umanoide, tra umanoide maschio- femmina etc. Classe che estende System.out per creare funzioni che aggiungono Header “DEBUG:” etc; due programmi Java , due main: uno delegato a calcoli + gestione Excel; altro legge stdout dell altro per interfaccia grafica. Per allenare PG creare dei PG fantocci con label per fare Q-learning iniziale, più avanti far allenare pg tra loro; creare vari fantocci: tank terrestre fisico, healer volante etc. Excel: si usa css che si può rendere tabellare, più facile da trattare nel codice rispetto a .xslx. Ogni “utente” ed Lostefra ha il suo personale dizionario con sue personali short cut da usare in partita, eventuale login con password (opzionale) x accesso. Vedere license show down. Mappa unica stile giochi di ruolo, si vede tutto da sopra: click o simili su edifici/caverne per mappe interne a tale posto, così ok sprite e per rappresentare “pg in volo” sprite dedicato. Densità aria per dire quando anche un uomo per es può volare. Ipotesi più efficiente per dare un valore stima al pg: AI base che gioca a manetta contro altre AI base e dalle vittorie si fa l’euristica, più vittoria facile/veloce/stracciante più punti, contro vari pg, contro pg standard bench mark.&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Note&amp;diff=204</id>
		<title>Note</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Note&amp;diff=204"/>
		<updated>2020-06-17T15:34:47Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: /* Deploy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Note ==&lt;br /&gt;
&lt;br /&gt;
'''Vedere altre note su fogli di carta e promemoria del telefono. Ce ne sono molte.'''&lt;br /&gt;
'''La copiatura dai fogli di carta dei continuare da pagina 4 (&amp;quot;alterare param..&amp;quot;).'''&lt;br /&gt;
&lt;br /&gt;
===Inspirational Concepts===&lt;br /&gt;
* Gioco Lotta (Pokémon, Pokkén)&lt;br /&gt;
* no caselle esplicite&lt;br /&gt;
* Descrizione rispetto a: ambiente, nemico, oggetti&lt;br /&gt;
* pokémon, DnD, Call of Duty, Super Smash Brawl, corse pazze&lt;br /&gt;
* concentrarsi su: fluidi, telecinesi, razze, bonus/malus, gradi di libertà (fisicamente parlando) &lt;br /&gt;
* scacchi (es. crea casella), shaolin showdown&lt;br /&gt;
* prevedere = creatività&lt;br /&gt;
* acqua, aria, fuoco, terra&lt;br /&gt;
* gravità (newton), verso alto, basso, destra, sinistra, circolare, tutti i versi&lt;br /&gt;
* jumanji, savana, animali, zoologia&lt;br /&gt;
* tempo/spazio&lt;br /&gt;
* BF4, pirati, roma (imperium civitas)&lt;br /&gt;
* musica come arma (rap)&lt;br /&gt;
* magia, prestigiatori&lt;br /&gt;
* dinosauri (documentario, libro, zoologia)&lt;br /&gt;
* avengers, supereroi (libro)&lt;br /&gt;
&lt;br /&gt;
* Looney toons&lt;br /&gt;
&lt;br /&gt;
===Personaggi (con statistiche e stati)===&lt;br /&gt;
* combattenti (con statistiche e stati)&lt;br /&gt;
* immagine rappresentativa per rappresentare meglio&lt;br /&gt;
* HP: colore rosso su immagine personaggio, dove sei debole/già colpito (idea scartata)&lt;br /&gt;
* penitenza: il malus può essere inteso come ciò che c'è nell'inserimento successivo, malus cumulativo&lt;br /&gt;
* essere ipocrita, finzione (schermo)&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (personaggi)&lt;br /&gt;
* metamorfosi&lt;br /&gt;
* alchimisti&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* possibilità giù in terra/ giù in acqua, con reachable e unreachable Boolean. Fuori da mappa anche reachable e unreachable.&lt;br /&gt;
* Personaggi composti di parti[] es. testa, busto, gambe, braccia, coda, pinna, ali. Distinzione per arto di movimento e/o spostamento boolean.&lt;br /&gt;
* Arti possono provocare danno, bruciatura , paralisi a contatto (Boolean) . Percentuale di probabilità accompagna ogni Boolean.&lt;br /&gt;
* Ogni parte del corpo punti vita + se inutilizzabile + amputata + stato (es paralisi).&lt;br /&gt;
* Per fare battaglie tra molto grandi =&amp;gt; 1 m lo si intende come 10m.  (rivalutato, aumentare livello scaling)&lt;br /&gt;
* Personaggio fusionabile Boolean + string nomi con cui si fonde.&lt;br /&gt;
* Distinzione tra infernape e infernape1/2/3 ect tra “specie” e “nome”.&lt;br /&gt;
* variabile Boolean respawnable.&lt;br /&gt;
* Raccogliere a piene mani da: https://spore.fandom.com/wiki/Creature_Editor&lt;br /&gt;
* Ad esempio weapons come elemento di Corpo (zanne, corna) e possibilità di muoversi/attaccare furtivamente.&lt;br /&gt;
* Divisibile e unibile come boolean e array di stringe associate per indicare i nomi con cui si unisce il Personaggio o in cui si divide.&lt;br /&gt;
* Variabili posizione nome: from_x/y ; to_x/y.&lt;br /&gt;
* Classe Stato, Personaggio contiene Array di stato, stato contiene moltiplicatori per statistica es attacco velocità precisione elusione ect.&lt;br /&gt;
* Personaggio deve avere una stat tipo sanità mentale, intelligenza, quanto è confuso e quanto è impaurito (2).&lt;br /&gt;
&lt;br /&gt;
* Per personaggi molto piccoli (meno di 1m x 1m x 1m) possibilità di essere in (x,y,z) tra 0 e 1.000.000 (ordine del micrometro, 1*10^-6 == 0,000001) e avere (lenX, lenY, lenZ). In questo modo sono definite dimensioni inferiori ad 1 m^3.&lt;br /&gt;
* personaggi max 20x20 (rivaluato, meno limitata)&lt;br /&gt;
&lt;br /&gt;
===Mosse===&lt;br /&gt;
* &amp;quot;combattimento prescinde da combattente&amp;quot;&lt;br /&gt;
* mosse hanno: direzione, azione, attacco (mosse pokémon)&lt;br /&gt;
* Parametri interi per mossa (direzione, consumabili) con lower e upper bound&lt;br /&gt;
* camuffarsi =&amp;gt; DnD manuale&lt;br /&gt;
* wrestling (libro) per le mosse/prese&lt;br /&gt;
&lt;br /&gt;
* X fa una mossa contro Y: Z potrebbe reagire (Es. ricevendo il colpo al posto di Y). Può essere realizzato sia come se &amp;quot;Y chiede soccorso Z&amp;quot; o come reazione di alleati adiacenti &amp;quot;Z soccorre Y&amp;quot;&lt;br /&gt;
* Mossa prende come parametro di ingresso Corpo, ossia la parte del corpo coinvolta nella mossa (es arto , tutto corpo ect). &lt;br /&gt;
&lt;br /&gt;
===Oggetto (con statistiche e stati)===&lt;br /&gt;
* armi: lacci (stati), lame (potenze), sassi, reti, pistole (munizioni), razzi, bombe (potenze), fuoco (d'artificio?) =&amp;gt; manuale DnD&lt;br /&gt;
* veleno n modi =&amp;gt; DnD manuale&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (oggetti)&lt;br /&gt;
* automezzi con cannoni, variabile 'hasEntrata', 'tempoRiutilizzo'&lt;br /&gt;
* violino come arma (tutti strumenti musicali): a fiato, a corda, a percussione&lt;br /&gt;
* veleni, ampolle e flaconi magici, insieme di 'oggetti dentro' un oggetto&lt;br /&gt;
&lt;br /&gt;
* Classe oggetto: es albero, roccia, casa: forza necessaria per sradicare + forza per lanciare + destrezza / agilità per appendersi + nascondersi in proporzione alle dimensioni di chi si nasconde. &lt;br /&gt;
* Altri es. pali. Sotto terra o sotto acqua/lava/melma o simili. &lt;br /&gt;
* Acqua rallenta se non hai pinne boolean.&lt;br /&gt;
* Classe strumento per oggetti che si tengono in mano, es reti , pistole, spade, pugnali, scudi, elmi, lancia, arco , frecce, lanciarazzi, fucili cecchino, fucile assalto, corde.&lt;br /&gt;
* Strumenti e mosse: danno ad area, perforante, contundente (vedi dnd armi). Mosse possono creare/modificare/distruggere oggetti e strumenti.&lt;br /&gt;
* Oggetti del campo di gioco incidono su elusione (parametro di personaggio).&lt;br /&gt;
* Buco/abisso (boolean) per dire se c’è o meno il suolo (Suolo come classe?). &lt;br /&gt;
* Radiazioni. &lt;br /&gt;
&lt;br /&gt;
===Modalità gioco===&lt;br /&gt;
* turnazione&lt;br /&gt;
* 1 v 1 v 1 etc., ma anche squadre casuali&lt;br /&gt;
* punteggio: chi fa più punti, più uccisioni, definizione di 'punto', gioco per perdere&lt;br /&gt;
* inserisci personaggio total random&lt;br /&gt;
&lt;br /&gt;
* Modalità battaglia con interazione stile battaglia navale (non si vede mossa dell'avversario)&lt;br /&gt;
* Modalità di gioco: tutti contro tutti (battle royale), death match, vs CPU mode zombie(attaccano solo, se non possono vanno verso nemico): serve introdurre un punteggio, di sicuro per mode zombie , ma anche per death match e tutti contro tutti&lt;br /&gt;
* ingressi: ne entra un altro?&lt;br /&gt;
&lt;br /&gt;
===Mappa===&lt;br /&gt;
* arene&lt;br /&gt;
* minimappa (pixelata ?), legenda oggetti base, devono esserci caselle implicite&lt;br /&gt;
* mappa 100x100 (rivalutato, meno limitata)&lt;br /&gt;
* Cannoni fissi in mezzo al campo (strumento).&lt;br /&gt;
&lt;br /&gt;
===Funzionalità generali===&lt;br /&gt;
* Chiave: non una flat input box per i comandi; ma dinamica: si suppone il soggetto &amp;quot;io&amp;quot; (le azioni le fanno in prima persona i personaggi), ogni mossa deve prevedere dei complementi (&amp;quot;verso&amp;quot;, &amp;quot;tra quanto&amp;quot;, &amp;quot;cosa&amp;quot;, &amp;quot;a favore di chi&amp;quot;, &amp;quot;contro chi&amp;quot;). Ogni complemento collegato con box stile in pop up =&amp;gt; bootstrap (la grafica sara unica). Prevedere anche modalita flat con input del tipo &amp;quot;azione a=pippo verso=termoli&amp;quot; (regex check)&lt;br /&gt;
* &amp;quot;meno tabelle&amp;quot;, &amp;quot;no bottoni&amp;quot; e solo foto che si alternano, &amp;quot;la grafica serve&amp;quot;: text box unica interazione, text area (history), immagine personaggio e immagine mappa&lt;br /&gt;
* &amp;quot;persistenza anche da interfaccia grafica&amp;quot;, diritti di scrittura sui file?&lt;br /&gt;
* Segnalazione (comando per fare nota)&lt;br /&gt;
&lt;br /&gt;
===Deploy===&lt;br /&gt;
* &amp;quot;commenta il codice&amp;quot;, &amp;quot;dividi et impera&amp;quot;&lt;br /&gt;
* Server web (Apache) ospita partite (+ localmente ha i file di funzionamento), in LAN client giocano o da remoto con IP pubblico. Interfaccia HTML5 + Javascript per giocare. Studiare engine grafici Javascript&lt;br /&gt;
* bootstrap! (specie per input box)&lt;br /&gt;
* https://bit.dev/ per molti componenti web&lt;br /&gt;
* React, React Native .. forse meglio di Vue per diffusione&lt;br /&gt;
* Unity, WebGL (vedi SDK dedicata, built per Android/iOS/etc.)&lt;br /&gt;
* Modelli 3D videogiochi: https://www.models-resource.com/ , meglio se disaccoppiati da Unity (e.g. in cartelle independenti), aggiunta modelli online&lt;br /&gt;
* creare modelli: blender. creare disegni: krita&lt;br /&gt;
* Tutorial tank Unity: https://learn.unity.com/project/tanks-tutorial ; modelli: https://opengameart.org/&lt;br /&gt;
* WebSocket per gestire client asincroni (NodeJS ?)&lt;br /&gt;
* Su YT in “guarda più tardi” video per interagire unity con JS (“unity.sendMessage()” o simili)&lt;br /&gt;
* Due client: uno con WebGL e uno JS base con solo input (per test, per mancanza di supporto browser a WebGL). Eventualmente 3 client: 1 base (JS puro con qualche immagine al più), 1 WebGL+Unity 2D (grafica pixelata), 1 WebGL+Unity 3D (informazioni di input per mirare, ad es., in base a dove punto nello schermo. Qualcosa di simile anche per 2D). Tutti i client stessi JSON per comunicare al server!&lt;br /&gt;
* photogrammetry, https://medium.com/realities-io/getting-started-with-photogrammetry-d0a6ee40cb72&lt;br /&gt;
* roll20.net .. c'è '''davvero''' molto&lt;br /&gt;
* readthedocs.org&lt;br /&gt;
* css dinamici: sass, https://zurb.com/playground/motion-ui (zurb)&lt;br /&gt;
* progressive web apps: offline with server works. https://it.wikipedia.org/wiki/Progressive_Web_App ; responsive web design&lt;br /&gt;
&lt;br /&gt;
==== Altro (scartato)====&lt;br /&gt;
* rpgmaker, godot, aseprite, pixelart (in generale), ma anche phaser, piskel&lt;br /&gt;
* joomla! Per far prima con html&lt;br /&gt;
* libreria pygame&lt;br /&gt;
* Vuegg: https://github.com/marketplace/vuegg  &lt;br /&gt;
* Material Design&lt;br /&gt;
* JAVA: Class.forName(&amp;lt;name&amp;gt;.class).newInstance();&lt;br /&gt;
&lt;br /&gt;
===Copia&amp;amp;incolla generale, da smistare in sotto capitoli. Contiene anche '''tutte''' note del telefono (al 22/02/2020)===&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 1:'''&lt;br /&gt;
&lt;br /&gt;
Mosse che trasformano l’avversario: attenzione è una mossa devastante. Trasformazione totale o parziale. Si devono poter aggiungere mosse, strumenti dinamicamente. Battle bot:ribaltano, scintille, elementi (Oggetti) che danneggiano. One piece: I frutti del diavolo (悪魔の実 Akuma no mi?) sono frutti misteriosi che donano poteri soprannaturali a chi li mangia, rendendoli però incapaci di nuotare. Di conseguenza il contatto con l'acqua di mare o con una speciale sostanza conosciuta come agalmatolite indebolisce gli utilizzatori di frutti del diavolo e li priva dei loro poteri. Alcune persone sono inoltre in grado di ricorrere all'Ambizione (覇気 Haki?), una forza spirituale che permette di avvertire la presenza di altri esseri viventi e di predirne i movimenti, di irrobustire parti del corpo e di intimidire o fare svenire le creature con una debole forza di volontà. Personaggio ha funzione baricentro_x, baricentro_y calcolate come (from_x+to_x)/2 sul quale si basa la funzione di libreria getDistance(Personaggio A, Personaggio B, float success); tale funzione serve per calcolare per i PNG e per i PG se ha senso usare una mossa. Non-onniscienza: delle volte non si può sapere distanza avversario e fallisce la mossa per la distanza -&amp;gt; “float success” rappresenta la probabilità di successo (Personaggio ha parametro “osservare”). PNG di due categorie: offensivi o neutrali (no priorità a mosse di attacco, ma tutto casuale). Mosse e oggetti per chiamare Personaggi, magari non necessariamente alleati (2 mosse e 2 oggetti quindi necessari), richiamo di un personaggio preciso o di uno a caso. Ogni mossa/azione deve avere un tempo di attesa espresso in turni (alla meglio 0) per poter ripetere la mossa/azione. Strumenti anche mezzi di trasporto di aria, di terra, di acqua (o lava/palude). Possono attivare una metamorfosi / Unione per cambiare stats personaggio. Veicoli con armi o riparo. Gli strumenti da trattare come gli oggetti. Classe unica? I match/partite (immagino Classe Partita) devono avere variabile boolean “respawn”, per distinguere death match a punti con death match con una vita. Wrestling per ispirarsi nella lotta libera: calci pugni ginocchiate prese lanci salti testate gomitate ecc. Per punti si vince a un limite o dopo un tot di mosse , oppure al primo dei due raggiunti (max_punti e max_mosse parametri di Partita). I punti si guadagnano alla kill (un Punteggio per squadra, int punteggio salvato localmente dentro ogni Personaggio che ha la variabile int squadra). Si guadagnano tanti punti quanti sono i punti della variabile “valore” del personaggio ucciso, tale variabile è calcolata come somma dei valori di tutte le mosse/stats ect del Personaggio. Imperium civitas. Attacco dei giganti. Possibilità di morire se colpiti in un unico punto (tallone d Achille) implementabile come variabile boolean. Jump force. Game dev tycoon. Acqua diventa tsunami. Variabile int per attacco cumulativo di gruppo: es calciatori che più si passano la palla più l’attacco è forte. Suolo magico: non tutti i personaggi possono accedervi, array di string elenca i nomi di chi può accedervi. Funzione esci/entra in classe Personaggio per simulare scambio pokemon 6vs6. Piovra gigante. Rischio=danno*probabilita. Mossa su strumento e con strumento?&lt;br /&gt;
Mosse fisiche per arrampicarsi su avversario(se e solo se sei la metà di dimensioni(?)), atterrarlo, lanciarlo, accecarlo, immobilizzarlo. Se sei in gruppo/ orda bonus ad attacchi combinati. Armi: fruste e scheggie, corni che si suonano per chiamare altri. Tipo della mossa con moltiplicatore tra 0 (immune) e 2 (float): acqua, fuoco, magia, terra: da ispirarsi ai pokemon ma non da copiare, penso. Armi da campo: cannoni e catapulte. Veicoli d’acqua: moto acqua, canoe, barche a motore a remi. Nei veicoli malus su attenzione (variabile int in personaggio, indica attenzione in combattimento e non in altro) perché si è impegnato alla guida . All’inizio in image view “the hero” e “the map”. Condizione vittoria (oltre a morte, punti, o numero mosse, cioè tempo) morte di un singolo Personaggio, che potrebbe rappresentare un edificio, cassaforte o simili. Personaggio si può svestire e lasciare strumenti, modificano statistiche di attacco, difesa , agilità, ect. Variabile luce o non luce, che peggiora/migliora a seconda della specie la visibilità, quindi la precisione , specie in attacchi a distanza: Scurovisione evita i malus.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 2:'''&lt;br /&gt;
&lt;br /&gt;
Gioco2: se ci si lancia da oggetti , dopo essersi arrampicati, possono esserci danni da caduta; strumenti come paracaduti o mosse magiche possono evitare i danni. Pozione del vento, soffi e devi attacchi. In difesa puoi parare, schivare, deviare: tre variabili? Ambiente: colline e pianure uguali, Monti sono Oggetti, picco ossia un unico monte oggetto. Rocce volanti, nuvole sospese: oggetto può essere sospeso e può fare periodicamente una mossa, ad es tuono, può spostarsi, può fare entra/esci, oggetto albero e oggetto foresta, si possono prendere, nascondersi, arrampicarsi, lanciarli, ostacolano velocità ma se si ha abbastanza forza si spezzano alberi. Acqua poco profonda, profonda, molto profonda: variabile boolean in Personaggio “alto” per toccare in acqua profonda, con acqua si generano fiumi laghi e mari. Ambiente si deve poter evolvere: ad esempio oggetto diga può fare metamorfosi e diventare oggetto cascata/torrente in piena. Per edifici più oggetti che rappresentano le mura e il tetto, variabile boolean per oggetto per entrare nell’oggetto. Possono essere spazzati via: danni da crollo, si può combattere all interni, contengono strumenti come tavoli sedie mobili letto ect. Se uno viene schiantato contro uno strumento prende danno(es danno da schianto). Ci possono essere scale, si può non avere contatti visivo sull’avversario. Oggetto mura, oggetto torre, oggetto casa interno sono cose distinte: possono dare malus/bonus su visibilità. Ambiente: pozzi e grotte, da gestire come interno casa. Lava come acqua, ogni oggetto può essere sorgenti di liquido: monte sorgente acqua, vulcano sorgente lava. Può esserci variabile probabilità eruzione, se settata a 1 c’è una continua eruzione. Strade di vario tipo, sovrapposta a altri suoli, migliorano velocità di alcuni strumenti, variabile boolean “ha le ruote” in classe strumenti. Unificare classe strumento e classe oggetto. Oggetti sospesi: case sospese su albero, ad es. Fiamme in mezzo al suolo. Oggetti: porto, aereoporto, grattacieli, dighe, impianti a fune, ospedali per curarsi e prendere oggetti per curarsi dopo, scuole contenenti libri per apprendere una mossa, luoghi di ingegneria per creare oggetti, ad esempio veicoli o armi, soldi nel gioco per comprare da eventuali venditori. Ogni oggetto avra un prezzo (valutabile circa in euro per semplicità). Variabile float per fame, sete, sonno, caldo-freddo (parte da 0.5). Nella mappa ci deve essere per ogni punto la temperatura. Possibilità di vomito, dissenteria, problemi cardiaci, respiratori, muscolari. Armi: balestra, mani nude, sasso, tirapugni, torcia accesa. Armature: intralciano o favoriscono agilità, attacco, poteri magici, rumorosa (elusione), è uno strumento/oggetto. Attacchi possono essere prolungati per turni, mosse variabile boolean prolungabile: può aumentare o diminuire intensità, c’è un max espresso in turni di prolungabilita, inoltre può essere leggermente alterato con una variabile casuale. Equipaggiamento (strumento/oggetto): pietra focaia, attrezzi da scalata, boccale di birra, cavallo, moto, chiodi, martello da fabbro, corda, corazza, dardo, faretra/zaino/sacca (oggetti che contengono una lista di oggetti, stringhe) con un numero per la quantità) e capacità massima zaino e ogni oggetto può avere un valore intero per dimensione (es martello 3, ascia grande 7), mantello, olio, variabile boolean prende fuoco/conduce elettricità, amplifica magnetismo, aumenta esplosioni nucleari, aumenta forza di gravità (?), pala, piccone, rampino, specchio, per osservare quando si è nascosti e si ha malus su visibilità. Strumenti da scasso per aprire porte: variabile boolean per oggetti: entrata con scasso. Personaggio: string razza per swag, immunità a veleni e malattie, elusione, agilità, precisione, abilità magiche(?), difesa fisica. In ultima torcia: agilità, coraggio, forza, intelligenza, magia, manualità, percezione, socialità. Bestiario: aracnoide di varie dimensioni, talpe giganti, vermi giganti di terra di mare e di lava ect, bulbo trascinatore che ha tentacoli per tirare a se e mangiare, lui è immobile, calabrone gigante, serpenti giganti, cinghiali, draghi, elfi, goblin e re goblin, sciamani (goblin), totem di guerra come strumento/oggetti per alterare statistiche nella loro area di influenza, lupo, mastino bruciante, nani, non morti/zombie/mummia/scheletro variabile boolean vivo a false ma ha ancora hp su parti del corpo: variabile boolean “zombizabile”. Orchi, pesci da terra (anfibi) tritone dell abisso, troll e trollin (orchi più deformi), umani. Abilità dei personaggi in ultima torcia: artificiale (robot) immunità a soffocamento, veleni, malattie ect immune a manipolazioni psichiche, visione oscurità; danno da attacco in carica; fiammegiante ossia la creatura può incendiarsi e elettrizzante ossia può diventare elettrica caricamente; modalità furia/mailmen ossia ottiene bonus su alcune/tutte le statistiche; gigantesco o molto piccolo due boolean (?forse non serve); immunità a magie mentali, al fuoco; linguaggi (?); non morto; danno da attacco in presa; pungiglioni velenosi; sa muoversi su ragnatele o è rallentato, resistenza a perforazione, respirare sott’acqua o sotto lava o nei liquidi in genere; rigenerazione; riceve danni dalla luce solare o da assenza di luce; è terrorizzato/impaurito/intimidito o se è imperturbabile boolean. Danno da trascinamento; paralizzante; può diventare più veloce (?non serve); visione a infrarossi attraverso oggetti; volare o andare sotto terra. Imperium editor, cose che penso di non aver ancora scritto: stagioni, suolo erboso o terriccio, sabbia con erba e terra e da sola, strade e stagioni, altitudine, alberi e arbusti, vari tipi a foglia larga, conifere, alberi secchi, palme, arbusti verdi e secchi, cactus, alghe marine, rocce e pietre, scheletri per terra, legna tagliata (alberi tagliati), carri e carretti, grotte e rovine per accessi sotterranei, locande, templi, accampamenti, fortini, monoliti, fontana, tombe e cimiteri, borse per terra, pozzo, troni, croci(del teschio), pozzo, capanne, lapidi, ponti, recinzioni, falò, tende, torri, panoplia, fessure come abissi, statue, rovine (deserto) come case distrutte, colonne per costruire templi, piramidi, sfingi, bandiere, rovine in Europa, campi coltivati che contengono cibo, fiamma (in altre), roccia in altre per montagne, altre-&amp;gt;rovine per monumenti non egiziani ma europei.&lt;br /&gt;
Ci sono paludi. Tende da campo. Forti, porti. Edifici delle fortezze, edifici dei villaggi. Naufragi e scogli.&lt;br /&gt;
Parametri voglia/impegno float per descrivere voglia di combattere Personaggio. Ricevi danno uscendo dalla mappa tra 1-5% tra 6-10% tra 11-15% della vita totale di ogni parte del corpo per ogni turno di gioco. Danno da precipitazione diverso da carica, uno verticale uno orizzontale, se precipiti da molto in alto hai bonus, oltre che danni da schianto lol. Baionette, formazione a blocchi, a quadrato (difensiva) sparano su quattro lati, a schiera vanno avanti. Usano un colpo poi lunga ricarica. Variabile boolean per attivare o meno fuoco amico. Azione per cambiare posizione: in piedi, in ginocchio(inteso come via di mezzo), sdraiato: per permettere migliore visibilità a chi è dietro (nella formazione).&lt;br /&gt;
Altruismo, coraggio, spingere oltre il limite, difendere al posto di un altro, migliorare posizione per avere bonus. Mosse da usare in condizioni psicologiche idonee: mosse estreme per disperazione, bonus unici. Condizioni per situazioni: blocco, spalle al muro, stritolato, confuso, semi parassiti addosso, azzoppato, bagnato d’acqua, lame affilate, corazza indurita, tante copie di me stesso attive, preveggente. Per ambiente:pioggia (torrenziale), barriera a cupola, punte metalliche a terra, blocco di fumo nero. Far volare un avversario/alleato. Tutti possono fare tutto sotto effetti magici o fisici. Un cavallo può volare se viene preso da un uccello e portato in alto.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 3, 4:'''&lt;br /&gt;
&lt;br /&gt;
Gioco1,2,3,4: tutto caricato su wikis.&lt;br /&gt;
&lt;br /&gt;
Gioco3: Mosse con caricamento + spostamento (es. kameamea con teletrasporto). Ciclo di interazione principale:crea o combatti. Modalità campagna, che chiede in input da che battaglia iniziare, ma implica tipi battaglie prefissati. Alla morte/sconfitta di un personaggio si possono alterare statistiche (es personaggio può cambiare fazione). Alcune mosse possono lasciare oggetti sul terreno: (ad es, radici di Groth). Ogni oggetto può alterare le statistiche al passaggio sopra, nelle vicinanze. Boolean invisibile per personaggio, diverso da elusione infinita. Se personaggio va in un altro dimensione -&amp;gt; unreachable. Attacco coordinato, se non lo fanno tutti vale lo stesso ma depotenziato opportunamente . Personaggio in modalità maniac (2 mosse per turno) e in modalità depressive (1 mossa ogni due turni); personaggio Flash può fare 10 mosse in un turno. Chiudi con lucchetto oggetto da dentro o da fuori, oggetto ingresso in oggetto casa , più ingressi per un singolo oggetto.nicole aniston. Rimbalzo se ci si schianta contro oggetto da calcolare con parametro. Ryuk e Darkrai.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gioco 4 23/07/2019:&lt;br /&gt;
Pula fiction, aracnidi, oggetto: due superfici rettangolari di forma diversa, anche inclinate , collegate. Più pezzi collegati tra loro per forme cilindriche cave, ad esempio, tipo vulcano. Mappa con sprite personaggi, canvas: anche mouseClick? Statistiche con nome gerarchico, es pokemon_attacco. Modalità survival, stile isola di jurassic park gdr; sia in coop che contro; possibilità di fare N turni di fila se non ci sono altri player giocanti nelle vicinanze (ciò però comporterebbe , in modalità contro , di capire quando c’è qualcuno nelle vicinanze perché si andrebbe di 1 turno alla volta, soluzioni: in mod contro 1 turno per volta oppure meccanismo di sincronizzazione turni quando uno vede l’altro (anche furtivo) come c’è attacco 1 turno a testa) .. analogo a Battle royale(?); inizio con starter kit random. Modalità assedio al castello. Inoltre se posso fare N turni di fila si può pensare a più pc , uno per persona , coordinati per fare comandi in parallelo, ma va ben congegnato meccanismo di sincronizzazione. Parti DelCorpo -&amp;gt; Componente/i oppure Parte. La mappa deve essere (x,y); l’altezza viene indicata onMouseOver certi pixel dove è posto il Personaggio; se personaggio dentro edificio/grotta cambio img (es sfocato/tratteggiato). Mosse: astrarre per target; molte mosse sono simili tra loro, somiglianza va sfruttata, hanno magari dei target in comune, o variano solo per un parametro. Creare mappa anche con drag and drop immagini ?(un po’ difficile). Più layout per interfaccia grafica (esempio uno che mostra errori input su text area, uno con alert, uno su box text area separato). Input comandi consumato pezzo per pezzo, alcune parole se prevedono parametri quando riconosciute fanno fetch anche di parola (numero) successiva. Face toon foto? Import parziali di personaggi (tutto tranne/solo questi campi specificati). Texture mappa complete o ripetibili (es per suolo). Anteprima battaglia stile battaglia pokemon (magari per 1/2/3 vs 1/2/3) per rappresentare scontro. Conviene usare xslx (excel) per dati, considerare che può non servire la libreria Java per leggere stringhe per operazioni. Mossa “again” , ripeti la precedenza(opportuna modifica parametri, es mossa spostamento). Possibile gestione contromosse: si usano marker (tag): ogni mossa ha elenco tag del tipo di contromosse che può subire (con probabilità annessa, che può dipendere da pg che subisce mossa congiuntamente a mossa stessa). Ogni mossa inoltre deve essere taggata come possibile contromossa che il pg può usare (per schivare può fare in più modi). A seconda del lancio del dado il pg che effettua La contromossa può anche scegliere tipologia di contromossa o solo la mossa della tipologia che ha beccato (entrano in gioco riflessi ect.). I parametri che fanno attivare unq o un’altra contromossa sono dinamici, posso dipendere ad esempio dalla posizione tra i due pg o altre statistiche. Tag contromosse a fasce (es. coprirsi è sempre più facile che schivare che e più facile di schivare e contrattaccare (?); all’interno dello stesso schivare e contrattaccare ci sono più sotto categorie). Per aggiunta personaggio può essere utili interfaccia dedicata, non linea di comando (o altre operazioni, specie se ci sono tabelle). Mossa “premonizione”: predire il futuro a breve termine, dici che mossa vorresti fare e ti dice esito (o più esiti se uno chiede più mosse). Funziona solo sulla prossima mossa. Contromossa delle contromossa gestione?? Eventualmente nell’esito si prevede ancore contro-contromossa. Ma si innesca reazione a catena, inoltre da gestire scelta contromossa in questo caso. Applicazione tag conoscenza(universo di appartenenza): “Termoli”, “pokemon”, “liceo classico Termoli”, anche gerarchici, per filtrare sui personaggi.target componibili , fattorizzato creazione mosse, hanno un costo magari per indicare quantovoccupano dicuna mossa, relativo maybe a un parametro o più del target stesso. In particolare, non saranno salvate le mosse per un personaggio (o solo alcune “preferite”) ma il suo insieme di target i quali devono dire:statistica che influenzano, “costo del turno” che richiedono al variare dell’intensità del target (che aumenta linearmente, esponenzialmente, generica f(x)) quindi corsa blanda costo 1 , Max corsa costo 5 (max), elenco (string) target incompatibili con tale target (se serve), nota relative ad es per quando uno vuole creare una mossa durante la battaglia (“target corsa, max sforzo dedicabile 4 ect” metti “50 metri corsa” “ok/troppo! Vuoi sforzati di più rischiando effetti collaterali?”). Si può autoscrivere la voce narrante del gioco come “la tua coscienza” mentre che giochi, d’altronde si interagisce con essa. Considerare che un target può appartenere a più personaggi, magari sotto nomi di mosse diversi.&lt;br /&gt;
Definire gerarchia di personaggi per template (tipo classe e super classe) e template importabili (tipo usa fuoco). Es umanoide non umanoide, tra umanoide maschio- femmina etc. Classe che estende System.out per creare funzioni che aggiungono Header “DEBUG:” etc; due programmi Java , due main: uno delegato a calcoli + gestione Excel; altro legge stdout dell altro per interfaccia grafica. Per allenare PG creare dei PG fantocci con label per fare Q-learning iniziale, più avanti far allenare pg tra loro; creare vari fantocci: tank terrestre fisico, healer volante etc. Excel: si usa css che si può rendere tabellare, più facile da trattare nel codice rispetto a .xslx. Ogni “utente” ed Lostefra ha il suo personale dizionario con sue personali short cut da usare in partita, eventuale login con password (opzionale) x accesso. Vedere license show down. Mappa unica stile giochi di ruolo, si vede tutto da sopra: click o simili su edifici/caverne per mappe interne a tale posto, così ok sprite e per rappresentare “pg in volo” sprite dedicato. Densità aria per dire quando anche un uomo per es può volare. Ipotesi più efficiente per dare un valore stima al pg: AI base che gioca a manetta contro altre AI base e dalle vittorie si fa l’euristica, più vittoria facile/veloce/stracciante più punti, contro vari pg, contro pg standard bench mark.&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Note&amp;diff=203</id>
		<title>Note</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Note&amp;diff=203"/>
		<updated>2020-06-13T18:42:06Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: /* Deploy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Note ==&lt;br /&gt;
&lt;br /&gt;
'''Vedere altre note su fogli di carta e promemoria del telefono. Ce ne sono molte.'''&lt;br /&gt;
'''La copiatura dai fogli di carta dei continuare da pagina 4 (&amp;quot;alterare param..&amp;quot;).'''&lt;br /&gt;
&lt;br /&gt;
===Inspirational Concepts===&lt;br /&gt;
* Gioco Lotta (Pokémon, Pokkén)&lt;br /&gt;
* no caselle esplicite&lt;br /&gt;
* Descrizione rispetto a: ambiente, nemico, oggetti&lt;br /&gt;
* pokémon, DnD, Call of Duty, Super Smash Brawl, corse pazze&lt;br /&gt;
* concentrarsi su: fluidi, telecinesi, razze, bonus/malus, gradi di libertà (fisicamente parlando) &lt;br /&gt;
* scacchi (es. crea casella), shaolin showdown&lt;br /&gt;
* prevedere = creatività&lt;br /&gt;
* acqua, aria, fuoco, terra&lt;br /&gt;
* gravità (newton), verso alto, basso, destra, sinistra, circolare, tutti i versi&lt;br /&gt;
* jumanji, savana, animali, zoologia&lt;br /&gt;
* tempo/spazio&lt;br /&gt;
* BF4, pirati, roma (imperium civitas)&lt;br /&gt;
* musica come arma (rap)&lt;br /&gt;
* magia, prestigiatori&lt;br /&gt;
* dinosauri (documentario, libro, zoologia)&lt;br /&gt;
* avengers, supereroi (libro)&lt;br /&gt;
&lt;br /&gt;
* Looney toons&lt;br /&gt;
&lt;br /&gt;
===Personaggi (con statistiche e stati)===&lt;br /&gt;
* combattenti (con statistiche e stati)&lt;br /&gt;
* immagine rappresentativa per rappresentare meglio&lt;br /&gt;
* HP: colore rosso su immagine personaggio, dove sei debole/già colpito (idea scartata)&lt;br /&gt;
* penitenza: il malus può essere inteso come ciò che c'è nell'inserimento successivo, malus cumulativo&lt;br /&gt;
* essere ipocrita, finzione (schermo)&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (personaggi)&lt;br /&gt;
* metamorfosi&lt;br /&gt;
* alchimisti&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* possibilità giù in terra/ giù in acqua, con reachable e unreachable Boolean. Fuori da mappa anche reachable e unreachable.&lt;br /&gt;
* Personaggi composti di parti[] es. testa, busto, gambe, braccia, coda, pinna, ali. Distinzione per arto di movimento e/o spostamento boolean.&lt;br /&gt;
* Arti possono provocare danno, bruciatura , paralisi a contatto (Boolean) . Percentuale di probabilità accompagna ogni Boolean.&lt;br /&gt;
* Ogni parte del corpo punti vita + se inutilizzabile + amputata + stato (es paralisi).&lt;br /&gt;
* Per fare battaglie tra molto grandi =&amp;gt; 1 m lo si intende come 10m.  (rivalutato, aumentare livello scaling)&lt;br /&gt;
* Personaggio fusionabile Boolean + string nomi con cui si fonde.&lt;br /&gt;
* Distinzione tra infernape e infernape1/2/3 ect tra “specie” e “nome”.&lt;br /&gt;
* variabile Boolean respawnable.&lt;br /&gt;
* Raccogliere a piene mani da: https://spore.fandom.com/wiki/Creature_Editor&lt;br /&gt;
* Ad esempio weapons come elemento di Corpo (zanne, corna) e possibilità di muoversi/attaccare furtivamente.&lt;br /&gt;
* Divisibile e unibile come boolean e array di stringe associate per indicare i nomi con cui si unisce il Personaggio o in cui si divide.&lt;br /&gt;
* Variabili posizione nome: from_x/y ; to_x/y.&lt;br /&gt;
* Classe Stato, Personaggio contiene Array di stato, stato contiene moltiplicatori per statistica es attacco velocità precisione elusione ect.&lt;br /&gt;
* Personaggio deve avere una stat tipo sanità mentale, intelligenza, quanto è confuso e quanto è impaurito (2).&lt;br /&gt;
&lt;br /&gt;
* Per personaggi molto piccoli (meno di 1m x 1m x 1m) possibilità di essere in (x,y,z) tra 0 e 1.000.000 (ordine del micrometro, 1*10^-6 == 0,000001) e avere (lenX, lenY, lenZ). In questo modo sono definite dimensioni inferiori ad 1 m^3.&lt;br /&gt;
* personaggi max 20x20 (rivaluato, meno limitata)&lt;br /&gt;
&lt;br /&gt;
===Mosse===&lt;br /&gt;
* &amp;quot;combattimento prescinde da combattente&amp;quot;&lt;br /&gt;
* mosse hanno: direzione, azione, attacco (mosse pokémon)&lt;br /&gt;
* Parametri interi per mossa (direzione, consumabili) con lower e upper bound&lt;br /&gt;
* camuffarsi =&amp;gt; DnD manuale&lt;br /&gt;
* wrestling (libro) per le mosse/prese&lt;br /&gt;
&lt;br /&gt;
* X fa una mossa contro Y: Z potrebbe reagire (Es. ricevendo il colpo al posto di Y). Può essere realizzato sia come se &amp;quot;Y chiede soccorso Z&amp;quot; o come reazione di alleati adiacenti &amp;quot;Z soccorre Y&amp;quot;&lt;br /&gt;
* Mossa prende come parametro di ingresso Corpo, ossia la parte del corpo coinvolta nella mossa (es arto , tutto corpo ect). &lt;br /&gt;
&lt;br /&gt;
===Oggetto (con statistiche e stati)===&lt;br /&gt;
* armi: lacci (stati), lame (potenze), sassi, reti, pistole (munizioni), razzi, bombe (potenze), fuoco (d'artificio?) =&amp;gt; manuale DnD&lt;br /&gt;
* veleno n modi =&amp;gt; DnD manuale&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (oggetti)&lt;br /&gt;
* automezzi con cannoni, variabile 'hasEntrata', 'tempoRiutilizzo'&lt;br /&gt;
* violino come arma (tutti strumenti musicali): a fiato, a corda, a percussione&lt;br /&gt;
* veleni, ampolle e flaconi magici, insieme di 'oggetti dentro' un oggetto&lt;br /&gt;
&lt;br /&gt;
* Classe oggetto: es albero, roccia, casa: forza necessaria per sradicare + forza per lanciare + destrezza / agilità per appendersi + nascondersi in proporzione alle dimensioni di chi si nasconde. &lt;br /&gt;
* Altri es. pali. Sotto terra o sotto acqua/lava/melma o simili. &lt;br /&gt;
* Acqua rallenta se non hai pinne boolean.&lt;br /&gt;
* Classe strumento per oggetti che si tengono in mano, es reti , pistole, spade, pugnali, scudi, elmi, lancia, arco , frecce, lanciarazzi, fucili cecchino, fucile assalto, corde.&lt;br /&gt;
* Strumenti e mosse: danno ad area, perforante, contundente (vedi dnd armi). Mosse possono creare/modificare/distruggere oggetti e strumenti.&lt;br /&gt;
* Oggetti del campo di gioco incidono su elusione (parametro di personaggio).&lt;br /&gt;
* Buco/abisso (boolean) per dire se c’è o meno il suolo (Suolo come classe?). &lt;br /&gt;
* Radiazioni. &lt;br /&gt;
&lt;br /&gt;
===Modalità gioco===&lt;br /&gt;
* turnazione&lt;br /&gt;
* 1 v 1 v 1 etc., ma anche squadre casuali&lt;br /&gt;
* punteggio: chi fa più punti, più uccisioni, definizione di 'punto', gioco per perdere&lt;br /&gt;
* inserisci personaggio total random&lt;br /&gt;
&lt;br /&gt;
* Modalità battaglia con interazione stile battaglia navale (non si vede mossa dell'avversario)&lt;br /&gt;
* Modalità di gioco: tutti contro tutti (battle royale), death match, vs CPU mode zombie(attaccano solo, se non possono vanno verso nemico): serve introdurre un punteggio, di sicuro per mode zombie , ma anche per death match e tutti contro tutti&lt;br /&gt;
* ingressi: ne entra un altro?&lt;br /&gt;
&lt;br /&gt;
===Mappa===&lt;br /&gt;
* arene&lt;br /&gt;
* minimappa (pixelata ?), legenda oggetti base, devono esserci caselle implicite&lt;br /&gt;
* mappa 100x100 (rivalutato, meno limitata)&lt;br /&gt;
* Cannoni fissi in mezzo al campo (strumento).&lt;br /&gt;
&lt;br /&gt;
===Funzionalità generali===&lt;br /&gt;
* Chiave: non una flat input box per i comandi; ma dinamica: si suppone il soggetto &amp;quot;io&amp;quot; (le azioni le fanno in prima persona i personaggi), ogni mossa deve prevedere dei complementi (&amp;quot;verso&amp;quot;, &amp;quot;tra quanto&amp;quot;, &amp;quot;cosa&amp;quot;, &amp;quot;a favore di chi&amp;quot;, &amp;quot;contro chi&amp;quot;). Ogni complemento collegato con box stile in pop up =&amp;gt; bootstrap (la grafica sara unica). Prevedere anche modalita flat con input del tipo &amp;quot;azione a=pippo verso=termoli&amp;quot; (regex check)&lt;br /&gt;
* &amp;quot;meno tabelle&amp;quot;, &amp;quot;no bottoni&amp;quot; e solo foto che si alternano, &amp;quot;la grafica serve&amp;quot;: text box unica interazione, text area (history), immagine personaggio e immagine mappa&lt;br /&gt;
* &amp;quot;persistenza anche da interfaccia grafica&amp;quot;, diritti di scrittura sui file?&lt;br /&gt;
* Segnalazione (comando per fare nota)&lt;br /&gt;
&lt;br /&gt;
===Deploy===&lt;br /&gt;
* &amp;quot;commenta il codice&amp;quot;, &amp;quot;dividi et impera&amp;quot;&lt;br /&gt;
* Server web (Apache) ospita partite (+ localmente ha i file di funzionamento), in LAN client giocano o da remoto con IP pubblico. Interfaccia HTML5 + Javascript per giocare. Studiare engine grafici Javascript&lt;br /&gt;
* bootstrap! (specie per input box)&lt;br /&gt;
* https://bit.dev/ per molti componenti web&lt;br /&gt;
* React, React Native .. forse meglio di Vue per diffusione&lt;br /&gt;
* Unity, WebGL (vedi SDK dedicata, built per Android/iOS/etc.)&lt;br /&gt;
* Modelli 3D videogiochi: https://www.models-resource.com/ , meglio se disaccoppiati da Unity (e.g. in cartelle independenti), aggiunta modelli online&lt;br /&gt;
* creare modelli: blender. creare disegni: krita&lt;br /&gt;
* Tutorial tank Unity: https://learn.unity.com/project/tanks-tutorial ; modelli: https://opengameart.org/&lt;br /&gt;
* WebSocket per gestire client asincroni (NodeJS ?)&lt;br /&gt;
* Su YT in “guarda più tardi” video per interagire unity con JS (“unity.sendMessage()” o simili)&lt;br /&gt;
* Due client: uno con WebGL e uno JS base con solo input (per test, per mancanza di supporto browser a WebGL). Eventualmente 3 client: 1 base (JS puro con qualche immagine al più), 1 WebGL+Unity 2D (grafica pixelata), 1 WebGL+Unity 3D (informazioni di input per mirare, ad es., in base a dove punto nello schermo. Qualcosa di simile anche per 2D). Tutti i client stessi JSON per comunicare al server!&lt;br /&gt;
* photogrammetry, https://medium.com/realities-io/getting-started-with-photogrammetry-d0a6ee40cb72&lt;br /&gt;
* roll20.net .. c'è '''davvero''' molto&lt;br /&gt;
* readthedocs.org&lt;br /&gt;
&lt;br /&gt;
==== Altro (scartato)====&lt;br /&gt;
* rpgmaker, godot, aseprite, pixelart (in generale), ma anche phaser, piskel&lt;br /&gt;
* joomla! Per far prima con html&lt;br /&gt;
* libreria pygame&lt;br /&gt;
* Vuegg: https://github.com/marketplace/vuegg  &lt;br /&gt;
* Material Design&lt;br /&gt;
* JAVA: Class.forName(&amp;lt;name&amp;gt;.class).newInstance();&lt;br /&gt;
&lt;br /&gt;
===Copia&amp;amp;incolla generale, da smistare in sotto capitoli. Contiene anche '''tutte''' note del telefono (al 22/02/2020)===&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 1:'''&lt;br /&gt;
&lt;br /&gt;
Mosse che trasformano l’avversario: attenzione è una mossa devastante. Trasformazione totale o parziale. Si devono poter aggiungere mosse, strumenti dinamicamente. Battle bot:ribaltano, scintille, elementi (Oggetti) che danneggiano. One piece: I frutti del diavolo (悪魔の実 Akuma no mi?) sono frutti misteriosi che donano poteri soprannaturali a chi li mangia, rendendoli però incapaci di nuotare. Di conseguenza il contatto con l'acqua di mare o con una speciale sostanza conosciuta come agalmatolite indebolisce gli utilizzatori di frutti del diavolo e li priva dei loro poteri. Alcune persone sono inoltre in grado di ricorrere all'Ambizione (覇気 Haki?), una forza spirituale che permette di avvertire la presenza di altri esseri viventi e di predirne i movimenti, di irrobustire parti del corpo e di intimidire o fare svenire le creature con una debole forza di volontà. Personaggio ha funzione baricentro_x, baricentro_y calcolate come (from_x+to_x)/2 sul quale si basa la funzione di libreria getDistance(Personaggio A, Personaggio B, float success); tale funzione serve per calcolare per i PNG e per i PG se ha senso usare una mossa. Non-onniscienza: delle volte non si può sapere distanza avversario e fallisce la mossa per la distanza -&amp;gt; “float success” rappresenta la probabilità di successo (Personaggio ha parametro “osservare”). PNG di due categorie: offensivi o neutrali (no priorità a mosse di attacco, ma tutto casuale). Mosse e oggetti per chiamare Personaggi, magari non necessariamente alleati (2 mosse e 2 oggetti quindi necessari), richiamo di un personaggio preciso o di uno a caso. Ogni mossa/azione deve avere un tempo di attesa espresso in turni (alla meglio 0) per poter ripetere la mossa/azione. Strumenti anche mezzi di trasporto di aria, di terra, di acqua (o lava/palude). Possono attivare una metamorfosi / Unione per cambiare stats personaggio. Veicoli con armi o riparo. Gli strumenti da trattare come gli oggetti. Classe unica? I match/partite (immagino Classe Partita) devono avere variabile boolean “respawn”, per distinguere death match a punti con death match con una vita. Wrestling per ispirarsi nella lotta libera: calci pugni ginocchiate prese lanci salti testate gomitate ecc. Per punti si vince a un limite o dopo un tot di mosse , oppure al primo dei due raggiunti (max_punti e max_mosse parametri di Partita). I punti si guadagnano alla kill (un Punteggio per squadra, int punteggio salvato localmente dentro ogni Personaggio che ha la variabile int squadra). Si guadagnano tanti punti quanti sono i punti della variabile “valore” del personaggio ucciso, tale variabile è calcolata come somma dei valori di tutte le mosse/stats ect del Personaggio. Imperium civitas. Attacco dei giganti. Possibilità di morire se colpiti in un unico punto (tallone d Achille) implementabile come variabile boolean. Jump force. Game dev tycoon. Acqua diventa tsunami. Variabile int per attacco cumulativo di gruppo: es calciatori che più si passano la palla più l’attacco è forte. Suolo magico: non tutti i personaggi possono accedervi, array di string elenca i nomi di chi può accedervi. Funzione esci/entra in classe Personaggio per simulare scambio pokemon 6vs6. Piovra gigante. Rischio=danno*probabilita. Mossa su strumento e con strumento?&lt;br /&gt;
Mosse fisiche per arrampicarsi su avversario(se e solo se sei la metà di dimensioni(?)), atterrarlo, lanciarlo, accecarlo, immobilizzarlo. Se sei in gruppo/ orda bonus ad attacchi combinati. Armi: fruste e scheggie, corni che si suonano per chiamare altri. Tipo della mossa con moltiplicatore tra 0 (immune) e 2 (float): acqua, fuoco, magia, terra: da ispirarsi ai pokemon ma non da copiare, penso. Armi da campo: cannoni e catapulte. Veicoli d’acqua: moto acqua, canoe, barche a motore a remi. Nei veicoli malus su attenzione (variabile int in personaggio, indica attenzione in combattimento e non in altro) perché si è impegnato alla guida . All’inizio in image view “the hero” e “the map”. Condizione vittoria (oltre a morte, punti, o numero mosse, cioè tempo) morte di un singolo Personaggio, che potrebbe rappresentare un edificio, cassaforte o simili. Personaggio si può svestire e lasciare strumenti, modificano statistiche di attacco, difesa , agilità, ect. Variabile luce o non luce, che peggiora/migliora a seconda della specie la visibilità, quindi la precisione , specie in attacchi a distanza: Scurovisione evita i malus.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 2:'''&lt;br /&gt;
&lt;br /&gt;
Gioco2: se ci si lancia da oggetti , dopo essersi arrampicati, possono esserci danni da caduta; strumenti come paracaduti o mosse magiche possono evitare i danni. Pozione del vento, soffi e devi attacchi. In difesa puoi parare, schivare, deviare: tre variabili? Ambiente: colline e pianure uguali, Monti sono Oggetti, picco ossia un unico monte oggetto. Rocce volanti, nuvole sospese: oggetto può essere sospeso e può fare periodicamente una mossa, ad es tuono, può spostarsi, può fare entra/esci, oggetto albero e oggetto foresta, si possono prendere, nascondersi, arrampicarsi, lanciarli, ostacolano velocità ma se si ha abbastanza forza si spezzano alberi. Acqua poco profonda, profonda, molto profonda: variabile boolean in Personaggio “alto” per toccare in acqua profonda, con acqua si generano fiumi laghi e mari. Ambiente si deve poter evolvere: ad esempio oggetto diga può fare metamorfosi e diventare oggetto cascata/torrente in piena. Per edifici più oggetti che rappresentano le mura e il tetto, variabile boolean per oggetto per entrare nell’oggetto. Possono essere spazzati via: danni da crollo, si può combattere all interni, contengono strumenti come tavoli sedie mobili letto ect. Se uno viene schiantato contro uno strumento prende danno(es danno da schianto). Ci possono essere scale, si può non avere contatti visivo sull’avversario. Oggetto mura, oggetto torre, oggetto casa interno sono cose distinte: possono dare malus/bonus su visibilità. Ambiente: pozzi e grotte, da gestire come interno casa. Lava come acqua, ogni oggetto può essere sorgenti di liquido: monte sorgente acqua, vulcano sorgente lava. Può esserci variabile probabilità eruzione, se settata a 1 c’è una continua eruzione. Strade di vario tipo, sovrapposta a altri suoli, migliorano velocità di alcuni strumenti, variabile boolean “ha le ruote” in classe strumenti. Unificare classe strumento e classe oggetto. Oggetti sospesi: case sospese su albero, ad es. Fiamme in mezzo al suolo. Oggetti: porto, aereoporto, grattacieli, dighe, impianti a fune, ospedali per curarsi e prendere oggetti per curarsi dopo, scuole contenenti libri per apprendere una mossa, luoghi di ingegneria per creare oggetti, ad esempio veicoli o armi, soldi nel gioco per comprare da eventuali venditori. Ogni oggetto avra un prezzo (valutabile circa in euro per semplicità). Variabile float per fame, sete, sonno, caldo-freddo (parte da 0.5). Nella mappa ci deve essere per ogni punto la temperatura. Possibilità di vomito, dissenteria, problemi cardiaci, respiratori, muscolari. Armi: balestra, mani nude, sasso, tirapugni, torcia accesa. Armature: intralciano o favoriscono agilità, attacco, poteri magici, rumorosa (elusione), è uno strumento/oggetto. Attacchi possono essere prolungati per turni, mosse variabile boolean prolungabile: può aumentare o diminuire intensità, c’è un max espresso in turni di prolungabilita, inoltre può essere leggermente alterato con una variabile casuale. Equipaggiamento (strumento/oggetto): pietra focaia, attrezzi da scalata, boccale di birra, cavallo, moto, chiodi, martello da fabbro, corda, corazza, dardo, faretra/zaino/sacca (oggetti che contengono una lista di oggetti, stringhe) con un numero per la quantità) e capacità massima zaino e ogni oggetto può avere un valore intero per dimensione (es martello 3, ascia grande 7), mantello, olio, variabile boolean prende fuoco/conduce elettricità, amplifica magnetismo, aumenta esplosioni nucleari, aumenta forza di gravità (?), pala, piccone, rampino, specchio, per osservare quando si è nascosti e si ha malus su visibilità. Strumenti da scasso per aprire porte: variabile boolean per oggetti: entrata con scasso. Personaggio: string razza per swag, immunità a veleni e malattie, elusione, agilità, precisione, abilità magiche(?), difesa fisica. In ultima torcia: agilità, coraggio, forza, intelligenza, magia, manualità, percezione, socialità. Bestiario: aracnoide di varie dimensioni, talpe giganti, vermi giganti di terra di mare e di lava ect, bulbo trascinatore che ha tentacoli per tirare a se e mangiare, lui è immobile, calabrone gigante, serpenti giganti, cinghiali, draghi, elfi, goblin e re goblin, sciamani (goblin), totem di guerra come strumento/oggetti per alterare statistiche nella loro area di influenza, lupo, mastino bruciante, nani, non morti/zombie/mummia/scheletro variabile boolean vivo a false ma ha ancora hp su parti del corpo: variabile boolean “zombizabile”. Orchi, pesci da terra (anfibi) tritone dell abisso, troll e trollin (orchi più deformi), umani. Abilità dei personaggi in ultima torcia: artificiale (robot) immunità a soffocamento, veleni, malattie ect immune a manipolazioni psichiche, visione oscurità; danno da attacco in carica; fiammegiante ossia la creatura può incendiarsi e elettrizzante ossia può diventare elettrica caricamente; modalità furia/mailmen ossia ottiene bonus su alcune/tutte le statistiche; gigantesco o molto piccolo due boolean (?forse non serve); immunità a magie mentali, al fuoco; linguaggi (?); non morto; danno da attacco in presa; pungiglioni velenosi; sa muoversi su ragnatele o è rallentato, resistenza a perforazione, respirare sott’acqua o sotto lava o nei liquidi in genere; rigenerazione; riceve danni dalla luce solare o da assenza di luce; è terrorizzato/impaurito/intimidito o se è imperturbabile boolean. Danno da trascinamento; paralizzante; può diventare più veloce (?non serve); visione a infrarossi attraverso oggetti; volare o andare sotto terra. Imperium editor, cose che penso di non aver ancora scritto: stagioni, suolo erboso o terriccio, sabbia con erba e terra e da sola, strade e stagioni, altitudine, alberi e arbusti, vari tipi a foglia larga, conifere, alberi secchi, palme, arbusti verdi e secchi, cactus, alghe marine, rocce e pietre, scheletri per terra, legna tagliata (alberi tagliati), carri e carretti, grotte e rovine per accessi sotterranei, locande, templi, accampamenti, fortini, monoliti, fontana, tombe e cimiteri, borse per terra, pozzo, troni, croci(del teschio), pozzo, capanne, lapidi, ponti, recinzioni, falò, tende, torri, panoplia, fessure come abissi, statue, rovine (deserto) come case distrutte, colonne per costruire templi, piramidi, sfingi, bandiere, rovine in Europa, campi coltivati che contengono cibo, fiamma (in altre), roccia in altre per montagne, altre-&amp;gt;rovine per monumenti non egiziani ma europei.&lt;br /&gt;
Ci sono paludi. Tende da campo. Forti, porti. Edifici delle fortezze, edifici dei villaggi. Naufragi e scogli.&lt;br /&gt;
Parametri voglia/impegno float per descrivere voglia di combattere Personaggio. Ricevi danno uscendo dalla mappa tra 1-5% tra 6-10% tra 11-15% della vita totale di ogni parte del corpo per ogni turno di gioco. Danno da precipitazione diverso da carica, uno verticale uno orizzontale, se precipiti da molto in alto hai bonus, oltre che danni da schianto lol. Baionette, formazione a blocchi, a quadrato (difensiva) sparano su quattro lati, a schiera vanno avanti. Usano un colpo poi lunga ricarica. Variabile boolean per attivare o meno fuoco amico. Azione per cambiare posizione: in piedi, in ginocchio(inteso come via di mezzo), sdraiato: per permettere migliore visibilità a chi è dietro (nella formazione).&lt;br /&gt;
Altruismo, coraggio, spingere oltre il limite, difendere al posto di un altro, migliorare posizione per avere bonus. Mosse da usare in condizioni psicologiche idonee: mosse estreme per disperazione, bonus unici. Condizioni per situazioni: blocco, spalle al muro, stritolato, confuso, semi parassiti addosso, azzoppato, bagnato d’acqua, lame affilate, corazza indurita, tante copie di me stesso attive, preveggente. Per ambiente:pioggia (torrenziale), barriera a cupola, punte metalliche a terra, blocco di fumo nero. Far volare un avversario/alleato. Tutti possono fare tutto sotto effetti magici o fisici. Un cavallo può volare se viene preso da un uccello e portato in alto.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 3, 4:'''&lt;br /&gt;
&lt;br /&gt;
Gioco1,2,3,4: tutto caricato su wikis.&lt;br /&gt;
&lt;br /&gt;
Gioco3: Mosse con caricamento + spostamento (es. kameamea con teletrasporto). Ciclo di interazione principale:crea o combatti. Modalità campagna, che chiede in input da che battaglia iniziare, ma implica tipi battaglie prefissati. Alla morte/sconfitta di un personaggio si possono alterare statistiche (es personaggio può cambiare fazione). Alcune mosse possono lasciare oggetti sul terreno: (ad es, radici di Groth). Ogni oggetto può alterare le statistiche al passaggio sopra, nelle vicinanze. Boolean invisibile per personaggio, diverso da elusione infinita. Se personaggio va in un altro dimensione -&amp;gt; unreachable. Attacco coordinato, se non lo fanno tutti vale lo stesso ma depotenziato opportunamente . Personaggio in modalità maniac (2 mosse per turno) e in modalità depressive (1 mossa ogni due turni); personaggio Flash può fare 10 mosse in un turno. Chiudi con lucchetto oggetto da dentro o da fuori, oggetto ingresso in oggetto casa , più ingressi per un singolo oggetto.nicole aniston. Rimbalzo se ci si schianta contro oggetto da calcolare con parametro. Ryuk e Darkrai.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gioco 4 23/07/2019:&lt;br /&gt;
Pula fiction, aracnidi, oggetto: due superfici rettangolari di forma diversa, anche inclinate , collegate. Più pezzi collegati tra loro per forme cilindriche cave, ad esempio, tipo vulcano. Mappa con sprite personaggi, canvas: anche mouseClick? Statistiche con nome gerarchico, es pokemon_attacco. Modalità survival, stile isola di jurassic park gdr; sia in coop che contro; possibilità di fare N turni di fila se non ci sono altri player giocanti nelle vicinanze (ciò però comporterebbe , in modalità contro , di capire quando c’è qualcuno nelle vicinanze perché si andrebbe di 1 turno alla volta, soluzioni: in mod contro 1 turno per volta oppure meccanismo di sincronizzazione turni quando uno vede l’altro (anche furtivo) come c’è attacco 1 turno a testa) .. analogo a Battle royale(?); inizio con starter kit random. Modalità assedio al castello. Inoltre se posso fare N turni di fila si può pensare a più pc , uno per persona , coordinati per fare comandi in parallelo, ma va ben congegnato meccanismo di sincronizzazione. Parti DelCorpo -&amp;gt; Componente/i oppure Parte. La mappa deve essere (x,y); l’altezza viene indicata onMouseOver certi pixel dove è posto il Personaggio; se personaggio dentro edificio/grotta cambio img (es sfocato/tratteggiato). Mosse: astrarre per target; molte mosse sono simili tra loro, somiglianza va sfruttata, hanno magari dei target in comune, o variano solo per un parametro. Creare mappa anche con drag and drop immagini ?(un po’ difficile). Più layout per interfaccia grafica (esempio uno che mostra errori input su text area, uno con alert, uno su box text area separato). Input comandi consumato pezzo per pezzo, alcune parole se prevedono parametri quando riconosciute fanno fetch anche di parola (numero) successiva. Face toon foto? Import parziali di personaggi (tutto tranne/solo questi campi specificati). Texture mappa complete o ripetibili (es per suolo). Anteprima battaglia stile battaglia pokemon (magari per 1/2/3 vs 1/2/3) per rappresentare scontro. Conviene usare xslx (excel) per dati, considerare che può non servire la libreria Java per leggere stringhe per operazioni. Mossa “again” , ripeti la precedenza(opportuna modifica parametri, es mossa spostamento). Possibile gestione contromosse: si usano marker (tag): ogni mossa ha elenco tag del tipo di contromosse che può subire (con probabilità annessa, che può dipendere da pg che subisce mossa congiuntamente a mossa stessa). Ogni mossa inoltre deve essere taggata come possibile contromossa che il pg può usare (per schivare può fare in più modi). A seconda del lancio del dado il pg che effettua La contromossa può anche scegliere tipologia di contromossa o solo la mossa della tipologia che ha beccato (entrano in gioco riflessi ect.). I parametri che fanno attivare unq o un’altra contromossa sono dinamici, posso dipendere ad esempio dalla posizione tra i due pg o altre statistiche. Tag contromosse a fasce (es. coprirsi è sempre più facile che schivare che e più facile di schivare e contrattaccare (?); all’interno dello stesso schivare e contrattaccare ci sono più sotto categorie). Per aggiunta personaggio può essere utili interfaccia dedicata, non linea di comando (o altre operazioni, specie se ci sono tabelle). Mossa “premonizione”: predire il futuro a breve termine, dici che mossa vorresti fare e ti dice esito (o più esiti se uno chiede più mosse). Funziona solo sulla prossima mossa. Contromossa delle contromossa gestione?? Eventualmente nell’esito si prevede ancore contro-contromossa. Ma si innesca reazione a catena, inoltre da gestire scelta contromossa in questo caso. Applicazione tag conoscenza(universo di appartenenza): “Termoli”, “pokemon”, “liceo classico Termoli”, anche gerarchici, per filtrare sui personaggi.target componibili , fattorizzato creazione mosse, hanno un costo magari per indicare quantovoccupano dicuna mossa, relativo maybe a un parametro o più del target stesso. In particolare, non saranno salvate le mosse per un personaggio (o solo alcune “preferite”) ma il suo insieme di target i quali devono dire:statistica che influenzano, “costo del turno” che richiedono al variare dell’intensità del target (che aumenta linearmente, esponenzialmente, generica f(x)) quindi corsa blanda costo 1 , Max corsa costo 5 (max), elenco (string) target incompatibili con tale target (se serve), nota relative ad es per quando uno vuole creare una mossa durante la battaglia (“target corsa, max sforzo dedicabile 4 ect” metti “50 metri corsa” “ok/troppo! Vuoi sforzati di più rischiando effetti collaterali?”). Si può autoscrivere la voce narrante del gioco come “la tua coscienza” mentre che giochi, d’altronde si interagisce con essa. Considerare che un target può appartenere a più personaggi, magari sotto nomi di mosse diversi.&lt;br /&gt;
Definire gerarchia di personaggi per template (tipo classe e super classe) e template importabili (tipo usa fuoco). Es umanoide non umanoide, tra umanoide maschio- femmina etc. Classe che estende System.out per creare funzioni che aggiungono Header “DEBUG:” etc; due programmi Java , due main: uno delegato a calcoli + gestione Excel; altro legge stdout dell altro per interfaccia grafica. Per allenare PG creare dei PG fantocci con label per fare Q-learning iniziale, più avanti far allenare pg tra loro; creare vari fantocci: tank terrestre fisico, healer volante etc. Excel: si usa css che si può rendere tabellare, più facile da trattare nel codice rispetto a .xslx. Ogni “utente” ed Lostefra ha il suo personale dizionario con sue personali short cut da usare in partita, eventuale login con password (opzionale) x accesso. Vedere license show down. Mappa unica stile giochi di ruolo, si vede tutto da sopra: click o simili su edifici/caverne per mappe interne a tale posto, così ok sprite e per rappresentare “pg in volo” sprite dedicato. Densità aria per dire quando anche un uomo per es può volare. Ipotesi più efficiente per dare un valore stima al pg: AI base che gioca a manetta contro altre AI base e dalle vittorie si fa l’euristica, più vittoria facile/veloce/stracciante più punti, contro vari pg, contro pg standard bench mark.&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Note&amp;diff=202</id>
		<title>Note</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Note&amp;diff=202"/>
		<updated>2020-06-12T11:07:32Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: /* Deploy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Note ==&lt;br /&gt;
&lt;br /&gt;
'''Vedere altre note su fogli di carta e promemoria del telefono. Ce ne sono molte.'''&lt;br /&gt;
'''La copiatura dai fogli di carta dei continuare da pagina 4 (&amp;quot;alterare param..&amp;quot;).'''&lt;br /&gt;
&lt;br /&gt;
===Inspirational Concepts===&lt;br /&gt;
* Gioco Lotta (Pokémon, Pokkén)&lt;br /&gt;
* no caselle esplicite&lt;br /&gt;
* Descrizione rispetto a: ambiente, nemico, oggetti&lt;br /&gt;
* pokémon, DnD, Call of Duty, Super Smash Brawl, corse pazze&lt;br /&gt;
* concentrarsi su: fluidi, telecinesi, razze, bonus/malus, gradi di libertà (fisicamente parlando) &lt;br /&gt;
* scacchi (es. crea casella), shaolin showdown&lt;br /&gt;
* prevedere = creatività&lt;br /&gt;
* acqua, aria, fuoco, terra&lt;br /&gt;
* gravità (newton), verso alto, basso, destra, sinistra, circolare, tutti i versi&lt;br /&gt;
* jumanji, savana, animali, zoologia&lt;br /&gt;
* tempo/spazio&lt;br /&gt;
* BF4, pirati, roma (imperium civitas)&lt;br /&gt;
* musica come arma (rap)&lt;br /&gt;
* magia, prestigiatori&lt;br /&gt;
* dinosauri (documentario, libro, zoologia)&lt;br /&gt;
* avengers, supereroi (libro)&lt;br /&gt;
&lt;br /&gt;
* Looney toons&lt;br /&gt;
&lt;br /&gt;
===Personaggi (con statistiche e stati)===&lt;br /&gt;
* combattenti (con statistiche e stati)&lt;br /&gt;
* immagine rappresentativa per rappresentare meglio&lt;br /&gt;
* HP: colore rosso su immagine personaggio, dove sei debole/già colpito (idea scartata)&lt;br /&gt;
* penitenza: il malus può essere inteso come ciò che c'è nell'inserimento successivo, malus cumulativo&lt;br /&gt;
* essere ipocrita, finzione (schermo)&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (personaggi)&lt;br /&gt;
* metamorfosi&lt;br /&gt;
* alchimisti&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* possibilità giù in terra/ giù in acqua, con reachable e unreachable Boolean. Fuori da mappa anche reachable e unreachable.&lt;br /&gt;
* Personaggi composti di parti[] es. testa, busto, gambe, braccia, coda, pinna, ali. Distinzione per arto di movimento e/o spostamento boolean.&lt;br /&gt;
* Arti possono provocare danno, bruciatura , paralisi a contatto (Boolean) . Percentuale di probabilità accompagna ogni Boolean.&lt;br /&gt;
* Ogni parte del corpo punti vita + se inutilizzabile + amputata + stato (es paralisi).&lt;br /&gt;
* Per fare battaglie tra molto grandi =&amp;gt; 1 m lo si intende come 10m.  (rivalutato, aumentare livello scaling)&lt;br /&gt;
* Personaggio fusionabile Boolean + string nomi con cui si fonde.&lt;br /&gt;
* Distinzione tra infernape e infernape1/2/3 ect tra “specie” e “nome”.&lt;br /&gt;
* variabile Boolean respawnable.&lt;br /&gt;
* Raccogliere a piene mani da: https://spore.fandom.com/wiki/Creature_Editor&lt;br /&gt;
* Ad esempio weapons come elemento di Corpo (zanne, corna) e possibilità di muoversi/attaccare furtivamente.&lt;br /&gt;
* Divisibile e unibile come boolean e array di stringe associate per indicare i nomi con cui si unisce il Personaggio o in cui si divide.&lt;br /&gt;
* Variabili posizione nome: from_x/y ; to_x/y.&lt;br /&gt;
* Classe Stato, Personaggio contiene Array di stato, stato contiene moltiplicatori per statistica es attacco velocità precisione elusione ect.&lt;br /&gt;
* Personaggio deve avere una stat tipo sanità mentale, intelligenza, quanto è confuso e quanto è impaurito (2).&lt;br /&gt;
&lt;br /&gt;
* Per personaggi molto piccoli (meno di 1m x 1m x 1m) possibilità di essere in (x,y,z) tra 0 e 1.000.000 (ordine del micrometro, 1*10^-6 == 0,000001) e avere (lenX, lenY, lenZ). In questo modo sono definite dimensioni inferiori ad 1 m^3.&lt;br /&gt;
* personaggi max 20x20 (rivaluato, meno limitata)&lt;br /&gt;
&lt;br /&gt;
===Mosse===&lt;br /&gt;
* &amp;quot;combattimento prescinde da combattente&amp;quot;&lt;br /&gt;
* mosse hanno: direzione, azione, attacco (mosse pokémon)&lt;br /&gt;
* Parametri interi per mossa (direzione, consumabili) con lower e upper bound&lt;br /&gt;
* camuffarsi =&amp;gt; DnD manuale&lt;br /&gt;
* wrestling (libro) per le mosse/prese&lt;br /&gt;
&lt;br /&gt;
* X fa una mossa contro Y: Z potrebbe reagire (Es. ricevendo il colpo al posto di Y). Può essere realizzato sia come se &amp;quot;Y chiede soccorso Z&amp;quot; o come reazione di alleati adiacenti &amp;quot;Z soccorre Y&amp;quot;&lt;br /&gt;
* Mossa prende come parametro di ingresso Corpo, ossia la parte del corpo coinvolta nella mossa (es arto , tutto corpo ect). &lt;br /&gt;
&lt;br /&gt;
===Oggetto (con statistiche e stati)===&lt;br /&gt;
* armi: lacci (stati), lame (potenze), sassi, reti, pistole (munizioni), razzi, bombe (potenze), fuoco (d'artificio?) =&amp;gt; manuale DnD&lt;br /&gt;
* veleno n modi =&amp;gt; DnD manuale&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (oggetti)&lt;br /&gt;
* automezzi con cannoni, variabile 'hasEntrata', 'tempoRiutilizzo'&lt;br /&gt;
* violino come arma (tutti strumenti musicali): a fiato, a corda, a percussione&lt;br /&gt;
* veleni, ampolle e flaconi magici, insieme di 'oggetti dentro' un oggetto&lt;br /&gt;
&lt;br /&gt;
* Classe oggetto: es albero, roccia, casa: forza necessaria per sradicare + forza per lanciare + destrezza / agilità per appendersi + nascondersi in proporzione alle dimensioni di chi si nasconde. &lt;br /&gt;
* Altri es. pali. Sotto terra o sotto acqua/lava/melma o simili. &lt;br /&gt;
* Acqua rallenta se non hai pinne boolean.&lt;br /&gt;
* Classe strumento per oggetti che si tengono in mano, es reti , pistole, spade, pugnali, scudi, elmi, lancia, arco , frecce, lanciarazzi, fucili cecchino, fucile assalto, corde.&lt;br /&gt;
* Strumenti e mosse: danno ad area, perforante, contundente (vedi dnd armi). Mosse possono creare/modificare/distruggere oggetti e strumenti.&lt;br /&gt;
* Oggetti del campo di gioco incidono su elusione (parametro di personaggio).&lt;br /&gt;
* Buco/abisso (boolean) per dire se c’è o meno il suolo (Suolo come classe?). &lt;br /&gt;
* Radiazioni. &lt;br /&gt;
&lt;br /&gt;
===Modalità gioco===&lt;br /&gt;
* turnazione&lt;br /&gt;
* 1 v 1 v 1 etc., ma anche squadre casuali&lt;br /&gt;
* punteggio: chi fa più punti, più uccisioni, definizione di 'punto', gioco per perdere&lt;br /&gt;
* inserisci personaggio total random&lt;br /&gt;
&lt;br /&gt;
* Modalità battaglia con interazione stile battaglia navale (non si vede mossa dell'avversario)&lt;br /&gt;
* Modalità di gioco: tutti contro tutti (battle royale), death match, vs CPU mode zombie(attaccano solo, se non possono vanno verso nemico): serve introdurre un punteggio, di sicuro per mode zombie , ma anche per death match e tutti contro tutti&lt;br /&gt;
* ingressi: ne entra un altro?&lt;br /&gt;
&lt;br /&gt;
===Mappa===&lt;br /&gt;
* arene&lt;br /&gt;
* minimappa (pixelata ?), legenda oggetti base, devono esserci caselle implicite&lt;br /&gt;
* mappa 100x100 (rivalutato, meno limitata)&lt;br /&gt;
* Cannoni fissi in mezzo al campo (strumento).&lt;br /&gt;
&lt;br /&gt;
===Funzionalità generali===&lt;br /&gt;
* Chiave: non una flat input box per i comandi; ma dinamica: si suppone il soggetto &amp;quot;io&amp;quot; (le azioni le fanno in prima persona i personaggi), ogni mossa deve prevedere dei complementi (&amp;quot;verso&amp;quot;, &amp;quot;tra quanto&amp;quot;, &amp;quot;cosa&amp;quot;, &amp;quot;a favore di chi&amp;quot;, &amp;quot;contro chi&amp;quot;). Ogni complemento collegato con box stile in pop up =&amp;gt; bootstrap (la grafica sara unica). Prevedere anche modalita flat con input del tipo &amp;quot;azione a=pippo verso=termoli&amp;quot; (regex check)&lt;br /&gt;
* &amp;quot;meno tabelle&amp;quot;, &amp;quot;no bottoni&amp;quot; e solo foto che si alternano, &amp;quot;la grafica serve&amp;quot;: text box unica interazione, text area (history), immagine personaggio e immagine mappa&lt;br /&gt;
* &amp;quot;persistenza anche da interfaccia grafica&amp;quot;, diritti di scrittura sui file?&lt;br /&gt;
* Segnalazione (comando per fare nota)&lt;br /&gt;
&lt;br /&gt;
===Deploy===&lt;br /&gt;
* &amp;quot;commenta il codice&amp;quot;, &amp;quot;dividi et impera&amp;quot;&lt;br /&gt;
* Server web (Apache) ospita partite (+ localmente ha i file di funzionamento), in LAN client giocano o da remoto con IP pubblico. Interfaccia HTML5 + Javascript per giocare. Studiare engine grafici Javascript&lt;br /&gt;
* bootstrap! (specie per input box)&lt;br /&gt;
* Unity, WebGL (vedi SDK dedicata, built per Android/iOS/etc.)&lt;br /&gt;
* Modelli 3D videogiochi: https://www.models-resource.com/ , meglio se disaccoppiati da Unity (e.g. in cartelle independenti), aggiunta modelli online&lt;br /&gt;
* creare modelli: blender. creare disegni: krita&lt;br /&gt;
* Tutorial tank Unity: https://learn.unity.com/project/tanks-tutorial ; modelli: https://opengameart.org/&lt;br /&gt;
* WebSocket per gestire client asincroni (NodeJS ?)&lt;br /&gt;
* Su YT in “guarda più tardi” video per interagire unity con JS (“unity.sendMessage()” o simili)&lt;br /&gt;
* Due client: uno con WebGL e uno JS base con solo input (per test, per mancanza di supporto browser a WebGL). Eventualmente 3 client: 1 base (JS puro con qualche immagine al più), 1 WebGL+Unity 2D (grafica pixelata), 1 WebGL+Unity 3D (informazioni di input per mirare, ad es., in base a dove punto nello schermo. Qualcosa di simile anche per 2D). Tutti i client stessi JSON per comunicare al server!&lt;br /&gt;
* photogrammetry, https://medium.com/realities-io/getting-started-with-photogrammetry-d0a6ee40cb72&lt;br /&gt;
* roll20.net .. c'è '''davvero''' molto&lt;br /&gt;
* readthedocs.org&lt;br /&gt;
&lt;br /&gt;
==== Altro (scartato)====&lt;br /&gt;
* rpgmaker, godot, aseprite, pixelart (in generale), ma anche phaser, piskel&lt;br /&gt;
* joomla! Per far prima con html&lt;br /&gt;
* libreria pygame&lt;br /&gt;
* Vuegg: https://github.com/marketplace/vuegg  &lt;br /&gt;
* Material Design&lt;br /&gt;
* JAVA: Class.forName(&amp;lt;name&amp;gt;.class).newInstance();&lt;br /&gt;
&lt;br /&gt;
===Copia&amp;amp;incolla generale, da smistare in sotto capitoli. Contiene anche '''tutte''' note del telefono (al 22/02/2020)===&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 1:'''&lt;br /&gt;
&lt;br /&gt;
Mosse che trasformano l’avversario: attenzione è una mossa devastante. Trasformazione totale o parziale. Si devono poter aggiungere mosse, strumenti dinamicamente. Battle bot:ribaltano, scintille, elementi (Oggetti) che danneggiano. One piece: I frutti del diavolo (悪魔の実 Akuma no mi?) sono frutti misteriosi che donano poteri soprannaturali a chi li mangia, rendendoli però incapaci di nuotare. Di conseguenza il contatto con l'acqua di mare o con una speciale sostanza conosciuta come agalmatolite indebolisce gli utilizzatori di frutti del diavolo e li priva dei loro poteri. Alcune persone sono inoltre in grado di ricorrere all'Ambizione (覇気 Haki?), una forza spirituale che permette di avvertire la presenza di altri esseri viventi e di predirne i movimenti, di irrobustire parti del corpo e di intimidire o fare svenire le creature con una debole forza di volontà. Personaggio ha funzione baricentro_x, baricentro_y calcolate come (from_x+to_x)/2 sul quale si basa la funzione di libreria getDistance(Personaggio A, Personaggio B, float success); tale funzione serve per calcolare per i PNG e per i PG se ha senso usare una mossa. Non-onniscienza: delle volte non si può sapere distanza avversario e fallisce la mossa per la distanza -&amp;gt; “float success” rappresenta la probabilità di successo (Personaggio ha parametro “osservare”). PNG di due categorie: offensivi o neutrali (no priorità a mosse di attacco, ma tutto casuale). Mosse e oggetti per chiamare Personaggi, magari non necessariamente alleati (2 mosse e 2 oggetti quindi necessari), richiamo di un personaggio preciso o di uno a caso. Ogni mossa/azione deve avere un tempo di attesa espresso in turni (alla meglio 0) per poter ripetere la mossa/azione. Strumenti anche mezzi di trasporto di aria, di terra, di acqua (o lava/palude). Possono attivare una metamorfosi / Unione per cambiare stats personaggio. Veicoli con armi o riparo. Gli strumenti da trattare come gli oggetti. Classe unica? I match/partite (immagino Classe Partita) devono avere variabile boolean “respawn”, per distinguere death match a punti con death match con una vita. Wrestling per ispirarsi nella lotta libera: calci pugni ginocchiate prese lanci salti testate gomitate ecc. Per punti si vince a un limite o dopo un tot di mosse , oppure al primo dei due raggiunti (max_punti e max_mosse parametri di Partita). I punti si guadagnano alla kill (un Punteggio per squadra, int punteggio salvato localmente dentro ogni Personaggio che ha la variabile int squadra). Si guadagnano tanti punti quanti sono i punti della variabile “valore” del personaggio ucciso, tale variabile è calcolata come somma dei valori di tutte le mosse/stats ect del Personaggio. Imperium civitas. Attacco dei giganti. Possibilità di morire se colpiti in un unico punto (tallone d Achille) implementabile come variabile boolean. Jump force. Game dev tycoon. Acqua diventa tsunami. Variabile int per attacco cumulativo di gruppo: es calciatori che più si passano la palla più l’attacco è forte. Suolo magico: non tutti i personaggi possono accedervi, array di string elenca i nomi di chi può accedervi. Funzione esci/entra in classe Personaggio per simulare scambio pokemon 6vs6. Piovra gigante. Rischio=danno*probabilita. Mossa su strumento e con strumento?&lt;br /&gt;
Mosse fisiche per arrampicarsi su avversario(se e solo se sei la metà di dimensioni(?)), atterrarlo, lanciarlo, accecarlo, immobilizzarlo. Se sei in gruppo/ orda bonus ad attacchi combinati. Armi: fruste e scheggie, corni che si suonano per chiamare altri. Tipo della mossa con moltiplicatore tra 0 (immune) e 2 (float): acqua, fuoco, magia, terra: da ispirarsi ai pokemon ma non da copiare, penso. Armi da campo: cannoni e catapulte. Veicoli d’acqua: moto acqua, canoe, barche a motore a remi. Nei veicoli malus su attenzione (variabile int in personaggio, indica attenzione in combattimento e non in altro) perché si è impegnato alla guida . All’inizio in image view “the hero” e “the map”. Condizione vittoria (oltre a morte, punti, o numero mosse, cioè tempo) morte di un singolo Personaggio, che potrebbe rappresentare un edificio, cassaforte o simili. Personaggio si può svestire e lasciare strumenti, modificano statistiche di attacco, difesa , agilità, ect. Variabile luce o non luce, che peggiora/migliora a seconda della specie la visibilità, quindi la precisione , specie in attacchi a distanza: Scurovisione evita i malus.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 2:'''&lt;br /&gt;
&lt;br /&gt;
Gioco2: se ci si lancia da oggetti , dopo essersi arrampicati, possono esserci danni da caduta; strumenti come paracaduti o mosse magiche possono evitare i danni. Pozione del vento, soffi e devi attacchi. In difesa puoi parare, schivare, deviare: tre variabili? Ambiente: colline e pianure uguali, Monti sono Oggetti, picco ossia un unico monte oggetto. Rocce volanti, nuvole sospese: oggetto può essere sospeso e può fare periodicamente una mossa, ad es tuono, può spostarsi, può fare entra/esci, oggetto albero e oggetto foresta, si possono prendere, nascondersi, arrampicarsi, lanciarli, ostacolano velocità ma se si ha abbastanza forza si spezzano alberi. Acqua poco profonda, profonda, molto profonda: variabile boolean in Personaggio “alto” per toccare in acqua profonda, con acqua si generano fiumi laghi e mari. Ambiente si deve poter evolvere: ad esempio oggetto diga può fare metamorfosi e diventare oggetto cascata/torrente in piena. Per edifici più oggetti che rappresentano le mura e il tetto, variabile boolean per oggetto per entrare nell’oggetto. Possono essere spazzati via: danni da crollo, si può combattere all interni, contengono strumenti come tavoli sedie mobili letto ect. Se uno viene schiantato contro uno strumento prende danno(es danno da schianto). Ci possono essere scale, si può non avere contatti visivo sull’avversario. Oggetto mura, oggetto torre, oggetto casa interno sono cose distinte: possono dare malus/bonus su visibilità. Ambiente: pozzi e grotte, da gestire come interno casa. Lava come acqua, ogni oggetto può essere sorgenti di liquido: monte sorgente acqua, vulcano sorgente lava. Può esserci variabile probabilità eruzione, se settata a 1 c’è una continua eruzione. Strade di vario tipo, sovrapposta a altri suoli, migliorano velocità di alcuni strumenti, variabile boolean “ha le ruote” in classe strumenti. Unificare classe strumento e classe oggetto. Oggetti sospesi: case sospese su albero, ad es. Fiamme in mezzo al suolo. Oggetti: porto, aereoporto, grattacieli, dighe, impianti a fune, ospedali per curarsi e prendere oggetti per curarsi dopo, scuole contenenti libri per apprendere una mossa, luoghi di ingegneria per creare oggetti, ad esempio veicoli o armi, soldi nel gioco per comprare da eventuali venditori. Ogni oggetto avra un prezzo (valutabile circa in euro per semplicità). Variabile float per fame, sete, sonno, caldo-freddo (parte da 0.5). Nella mappa ci deve essere per ogni punto la temperatura. Possibilità di vomito, dissenteria, problemi cardiaci, respiratori, muscolari. Armi: balestra, mani nude, sasso, tirapugni, torcia accesa. Armature: intralciano o favoriscono agilità, attacco, poteri magici, rumorosa (elusione), è uno strumento/oggetto. Attacchi possono essere prolungati per turni, mosse variabile boolean prolungabile: può aumentare o diminuire intensità, c’è un max espresso in turni di prolungabilita, inoltre può essere leggermente alterato con una variabile casuale. Equipaggiamento (strumento/oggetto): pietra focaia, attrezzi da scalata, boccale di birra, cavallo, moto, chiodi, martello da fabbro, corda, corazza, dardo, faretra/zaino/sacca (oggetti che contengono una lista di oggetti, stringhe) con un numero per la quantità) e capacità massima zaino e ogni oggetto può avere un valore intero per dimensione (es martello 3, ascia grande 7), mantello, olio, variabile boolean prende fuoco/conduce elettricità, amplifica magnetismo, aumenta esplosioni nucleari, aumenta forza di gravità (?), pala, piccone, rampino, specchio, per osservare quando si è nascosti e si ha malus su visibilità. Strumenti da scasso per aprire porte: variabile boolean per oggetti: entrata con scasso. Personaggio: string razza per swag, immunità a veleni e malattie, elusione, agilità, precisione, abilità magiche(?), difesa fisica. In ultima torcia: agilità, coraggio, forza, intelligenza, magia, manualità, percezione, socialità. Bestiario: aracnoide di varie dimensioni, talpe giganti, vermi giganti di terra di mare e di lava ect, bulbo trascinatore che ha tentacoli per tirare a se e mangiare, lui è immobile, calabrone gigante, serpenti giganti, cinghiali, draghi, elfi, goblin e re goblin, sciamani (goblin), totem di guerra come strumento/oggetti per alterare statistiche nella loro area di influenza, lupo, mastino bruciante, nani, non morti/zombie/mummia/scheletro variabile boolean vivo a false ma ha ancora hp su parti del corpo: variabile boolean “zombizabile”. Orchi, pesci da terra (anfibi) tritone dell abisso, troll e trollin (orchi più deformi), umani. Abilità dei personaggi in ultima torcia: artificiale (robot) immunità a soffocamento, veleni, malattie ect immune a manipolazioni psichiche, visione oscurità; danno da attacco in carica; fiammegiante ossia la creatura può incendiarsi e elettrizzante ossia può diventare elettrica caricamente; modalità furia/mailmen ossia ottiene bonus su alcune/tutte le statistiche; gigantesco o molto piccolo due boolean (?forse non serve); immunità a magie mentali, al fuoco; linguaggi (?); non morto; danno da attacco in presa; pungiglioni velenosi; sa muoversi su ragnatele o è rallentato, resistenza a perforazione, respirare sott’acqua o sotto lava o nei liquidi in genere; rigenerazione; riceve danni dalla luce solare o da assenza di luce; è terrorizzato/impaurito/intimidito o se è imperturbabile boolean. Danno da trascinamento; paralizzante; può diventare più veloce (?non serve); visione a infrarossi attraverso oggetti; volare o andare sotto terra. Imperium editor, cose che penso di non aver ancora scritto: stagioni, suolo erboso o terriccio, sabbia con erba e terra e da sola, strade e stagioni, altitudine, alberi e arbusti, vari tipi a foglia larga, conifere, alberi secchi, palme, arbusti verdi e secchi, cactus, alghe marine, rocce e pietre, scheletri per terra, legna tagliata (alberi tagliati), carri e carretti, grotte e rovine per accessi sotterranei, locande, templi, accampamenti, fortini, monoliti, fontana, tombe e cimiteri, borse per terra, pozzo, troni, croci(del teschio), pozzo, capanne, lapidi, ponti, recinzioni, falò, tende, torri, panoplia, fessure come abissi, statue, rovine (deserto) come case distrutte, colonne per costruire templi, piramidi, sfingi, bandiere, rovine in Europa, campi coltivati che contengono cibo, fiamma (in altre), roccia in altre per montagne, altre-&amp;gt;rovine per monumenti non egiziani ma europei.&lt;br /&gt;
Ci sono paludi. Tende da campo. Forti, porti. Edifici delle fortezze, edifici dei villaggi. Naufragi e scogli.&lt;br /&gt;
Parametri voglia/impegno float per descrivere voglia di combattere Personaggio. Ricevi danno uscendo dalla mappa tra 1-5% tra 6-10% tra 11-15% della vita totale di ogni parte del corpo per ogni turno di gioco. Danno da precipitazione diverso da carica, uno verticale uno orizzontale, se precipiti da molto in alto hai bonus, oltre che danni da schianto lol. Baionette, formazione a blocchi, a quadrato (difensiva) sparano su quattro lati, a schiera vanno avanti. Usano un colpo poi lunga ricarica. Variabile boolean per attivare o meno fuoco amico. Azione per cambiare posizione: in piedi, in ginocchio(inteso come via di mezzo), sdraiato: per permettere migliore visibilità a chi è dietro (nella formazione).&lt;br /&gt;
Altruismo, coraggio, spingere oltre il limite, difendere al posto di un altro, migliorare posizione per avere bonus. Mosse da usare in condizioni psicologiche idonee: mosse estreme per disperazione, bonus unici. Condizioni per situazioni: blocco, spalle al muro, stritolato, confuso, semi parassiti addosso, azzoppato, bagnato d’acqua, lame affilate, corazza indurita, tante copie di me stesso attive, preveggente. Per ambiente:pioggia (torrenziale), barriera a cupola, punte metalliche a terra, blocco di fumo nero. Far volare un avversario/alleato. Tutti possono fare tutto sotto effetti magici o fisici. Un cavallo può volare se viene preso da un uccello e portato in alto.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 3, 4:'''&lt;br /&gt;
&lt;br /&gt;
Gioco1,2,3,4: tutto caricato su wikis.&lt;br /&gt;
&lt;br /&gt;
Gioco3: Mosse con caricamento + spostamento (es. kameamea con teletrasporto). Ciclo di interazione principale:crea o combatti. Modalità campagna, che chiede in input da che battaglia iniziare, ma implica tipi battaglie prefissati. Alla morte/sconfitta di un personaggio si possono alterare statistiche (es personaggio può cambiare fazione). Alcune mosse possono lasciare oggetti sul terreno: (ad es, radici di Groth). Ogni oggetto può alterare le statistiche al passaggio sopra, nelle vicinanze. Boolean invisibile per personaggio, diverso da elusione infinita. Se personaggio va in un altro dimensione -&amp;gt; unreachable. Attacco coordinato, se non lo fanno tutti vale lo stesso ma depotenziato opportunamente . Personaggio in modalità maniac (2 mosse per turno) e in modalità depressive (1 mossa ogni due turni); personaggio Flash può fare 10 mosse in un turno. Chiudi con lucchetto oggetto da dentro o da fuori, oggetto ingresso in oggetto casa , più ingressi per un singolo oggetto.nicole aniston. Rimbalzo se ci si schianta contro oggetto da calcolare con parametro. Ryuk e Darkrai.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gioco 4 23/07/2019:&lt;br /&gt;
Pula fiction, aracnidi, oggetto: due superfici rettangolari di forma diversa, anche inclinate , collegate. Più pezzi collegati tra loro per forme cilindriche cave, ad esempio, tipo vulcano. Mappa con sprite personaggi, canvas: anche mouseClick? Statistiche con nome gerarchico, es pokemon_attacco. Modalità survival, stile isola di jurassic park gdr; sia in coop che contro; possibilità di fare N turni di fila se non ci sono altri player giocanti nelle vicinanze (ciò però comporterebbe , in modalità contro , di capire quando c’è qualcuno nelle vicinanze perché si andrebbe di 1 turno alla volta, soluzioni: in mod contro 1 turno per volta oppure meccanismo di sincronizzazione turni quando uno vede l’altro (anche furtivo) come c’è attacco 1 turno a testa) .. analogo a Battle royale(?); inizio con starter kit random. Modalità assedio al castello. Inoltre se posso fare N turni di fila si può pensare a più pc , uno per persona , coordinati per fare comandi in parallelo, ma va ben congegnato meccanismo di sincronizzazione. Parti DelCorpo -&amp;gt; Componente/i oppure Parte. La mappa deve essere (x,y); l’altezza viene indicata onMouseOver certi pixel dove è posto il Personaggio; se personaggio dentro edificio/grotta cambio img (es sfocato/tratteggiato). Mosse: astrarre per target; molte mosse sono simili tra loro, somiglianza va sfruttata, hanno magari dei target in comune, o variano solo per un parametro. Creare mappa anche con drag and drop immagini ?(un po’ difficile). Più layout per interfaccia grafica (esempio uno che mostra errori input su text area, uno con alert, uno su box text area separato). Input comandi consumato pezzo per pezzo, alcune parole se prevedono parametri quando riconosciute fanno fetch anche di parola (numero) successiva. Face toon foto? Import parziali di personaggi (tutto tranne/solo questi campi specificati). Texture mappa complete o ripetibili (es per suolo). Anteprima battaglia stile battaglia pokemon (magari per 1/2/3 vs 1/2/3) per rappresentare scontro. Conviene usare xslx (excel) per dati, considerare che può non servire la libreria Java per leggere stringhe per operazioni. Mossa “again” , ripeti la precedenza(opportuna modifica parametri, es mossa spostamento). Possibile gestione contromosse: si usano marker (tag): ogni mossa ha elenco tag del tipo di contromosse che può subire (con probabilità annessa, che può dipendere da pg che subisce mossa congiuntamente a mossa stessa). Ogni mossa inoltre deve essere taggata come possibile contromossa che il pg può usare (per schivare può fare in più modi). A seconda del lancio del dado il pg che effettua La contromossa può anche scegliere tipologia di contromossa o solo la mossa della tipologia che ha beccato (entrano in gioco riflessi ect.). I parametri che fanno attivare unq o un’altra contromossa sono dinamici, posso dipendere ad esempio dalla posizione tra i due pg o altre statistiche. Tag contromosse a fasce (es. coprirsi è sempre più facile che schivare che e più facile di schivare e contrattaccare (?); all’interno dello stesso schivare e contrattaccare ci sono più sotto categorie). Per aggiunta personaggio può essere utili interfaccia dedicata, non linea di comando (o altre operazioni, specie se ci sono tabelle). Mossa “premonizione”: predire il futuro a breve termine, dici che mossa vorresti fare e ti dice esito (o più esiti se uno chiede più mosse). Funziona solo sulla prossima mossa. Contromossa delle contromossa gestione?? Eventualmente nell’esito si prevede ancore contro-contromossa. Ma si innesca reazione a catena, inoltre da gestire scelta contromossa in questo caso. Applicazione tag conoscenza(universo di appartenenza): “Termoli”, “pokemon”, “liceo classico Termoli”, anche gerarchici, per filtrare sui personaggi.target componibili , fattorizzato creazione mosse, hanno un costo magari per indicare quantovoccupano dicuna mossa, relativo maybe a un parametro o più del target stesso. In particolare, non saranno salvate le mosse per un personaggio (o solo alcune “preferite”) ma il suo insieme di target i quali devono dire:statistica che influenzano, “costo del turno” che richiedono al variare dell’intensità del target (che aumenta linearmente, esponenzialmente, generica f(x)) quindi corsa blanda costo 1 , Max corsa costo 5 (max), elenco (string) target incompatibili con tale target (se serve), nota relative ad es per quando uno vuole creare una mossa durante la battaglia (“target corsa, max sforzo dedicabile 4 ect” metti “50 metri corsa” “ok/troppo! Vuoi sforzati di più rischiando effetti collaterali?”). Si può autoscrivere la voce narrante del gioco come “la tua coscienza” mentre che giochi, d’altronde si interagisce con essa. Considerare che un target può appartenere a più personaggi, magari sotto nomi di mosse diversi.&lt;br /&gt;
Definire gerarchia di personaggi per template (tipo classe e super classe) e template importabili (tipo usa fuoco). Es umanoide non umanoide, tra umanoide maschio- femmina etc. Classe che estende System.out per creare funzioni che aggiungono Header “DEBUG:” etc; due programmi Java , due main: uno delegato a calcoli + gestione Excel; altro legge stdout dell altro per interfaccia grafica. Per allenare PG creare dei PG fantocci con label per fare Q-learning iniziale, più avanti far allenare pg tra loro; creare vari fantocci: tank terrestre fisico, healer volante etc. Excel: si usa css che si può rendere tabellare, più facile da trattare nel codice rispetto a .xslx. Ogni “utente” ed Lostefra ha il suo personale dizionario con sue personali short cut da usare in partita, eventuale login con password (opzionale) x accesso. Vedere license show down. Mappa unica stile giochi di ruolo, si vede tutto da sopra: click o simili su edifici/caverne per mappe interne a tale posto, così ok sprite e per rappresentare “pg in volo” sprite dedicato. Densità aria per dire quando anche un uomo per es può volare. Ipotesi più efficiente per dare un valore stima al pg: AI base che gioca a manetta contro altre AI base e dalle vittorie si fa l’euristica, più vittoria facile/veloce/stracciante più punti, contro vari pg, contro pg standard bench mark.&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Note&amp;diff=201</id>
		<title>Note</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Note&amp;diff=201"/>
		<updated>2020-06-08T11:49:05Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: /* Deploy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Note ==&lt;br /&gt;
&lt;br /&gt;
'''Vedere altre note su fogli di carta e promemoria del telefono. Ce ne sono molte.'''&lt;br /&gt;
'''La copiatura dai fogli di carta dei continuare da pagina 4 (&amp;quot;alterare param..&amp;quot;).'''&lt;br /&gt;
&lt;br /&gt;
===Inspirational Concepts===&lt;br /&gt;
* Gioco Lotta (Pokémon, Pokkén)&lt;br /&gt;
* no caselle esplicite&lt;br /&gt;
* Descrizione rispetto a: ambiente, nemico, oggetti&lt;br /&gt;
* pokémon, DnD, Call of Duty, Super Smash Brawl, corse pazze&lt;br /&gt;
* concentrarsi su: fluidi, telecinesi, razze, bonus/malus, gradi di libertà (fisicamente parlando) &lt;br /&gt;
* scacchi (es. crea casella), shaolin showdown&lt;br /&gt;
* prevedere = creatività&lt;br /&gt;
* acqua, aria, fuoco, terra&lt;br /&gt;
* gravità (newton), verso alto, basso, destra, sinistra, circolare, tutti i versi&lt;br /&gt;
* jumanji, savana, animali, zoologia&lt;br /&gt;
* tempo/spazio&lt;br /&gt;
* BF4, pirati, roma (imperium civitas)&lt;br /&gt;
* musica come arma (rap)&lt;br /&gt;
* magia, prestigiatori&lt;br /&gt;
* dinosauri (documentario, libro, zoologia)&lt;br /&gt;
* avengers, supereroi (libro)&lt;br /&gt;
&lt;br /&gt;
* Looney toons&lt;br /&gt;
&lt;br /&gt;
===Personaggi (con statistiche e stati)===&lt;br /&gt;
* combattenti (con statistiche e stati)&lt;br /&gt;
* immagine rappresentativa per rappresentare meglio&lt;br /&gt;
* HP: colore rosso su immagine personaggio, dove sei debole/già colpito (idea scartata)&lt;br /&gt;
* penitenza: il malus può essere inteso come ciò che c'è nell'inserimento successivo, malus cumulativo&lt;br /&gt;
* essere ipocrita, finzione (schermo)&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (personaggi)&lt;br /&gt;
* metamorfosi&lt;br /&gt;
* alchimisti&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* possibilità giù in terra/ giù in acqua, con reachable e unreachable Boolean. Fuori da mappa anche reachable e unreachable.&lt;br /&gt;
* Personaggi composti di parti[] es. testa, busto, gambe, braccia, coda, pinna, ali. Distinzione per arto di movimento e/o spostamento boolean.&lt;br /&gt;
* Arti possono provocare danno, bruciatura , paralisi a contatto (Boolean) . Percentuale di probabilità accompagna ogni Boolean.&lt;br /&gt;
* Ogni parte del corpo punti vita + se inutilizzabile + amputata + stato (es paralisi).&lt;br /&gt;
* Per fare battaglie tra molto grandi =&amp;gt; 1 m lo si intende come 10m.  (rivalutato, aumentare livello scaling)&lt;br /&gt;
* Personaggio fusionabile Boolean + string nomi con cui si fonde.&lt;br /&gt;
* Distinzione tra infernape e infernape1/2/3 ect tra “specie” e “nome”.&lt;br /&gt;
* variabile Boolean respawnable.&lt;br /&gt;
* Raccogliere a piene mani da: https://spore.fandom.com/wiki/Creature_Editor&lt;br /&gt;
* Ad esempio weapons come elemento di Corpo (zanne, corna) e possibilità di muoversi/attaccare furtivamente.&lt;br /&gt;
* Divisibile e unibile come boolean e array di stringe associate per indicare i nomi con cui si unisce il Personaggio o in cui si divide.&lt;br /&gt;
* Variabili posizione nome: from_x/y ; to_x/y.&lt;br /&gt;
* Classe Stato, Personaggio contiene Array di stato, stato contiene moltiplicatori per statistica es attacco velocità precisione elusione ect.&lt;br /&gt;
* Personaggio deve avere una stat tipo sanità mentale, intelligenza, quanto è confuso e quanto è impaurito (2).&lt;br /&gt;
&lt;br /&gt;
* Per personaggi molto piccoli (meno di 1m x 1m x 1m) possibilità di essere in (x,y,z) tra 0 e 1.000.000 (ordine del micrometro, 1*10^-6 == 0,000001) e avere (lenX, lenY, lenZ). In questo modo sono definite dimensioni inferiori ad 1 m^3.&lt;br /&gt;
* personaggi max 20x20 (rivaluato, meno limitata)&lt;br /&gt;
&lt;br /&gt;
===Mosse===&lt;br /&gt;
* &amp;quot;combattimento prescinde da combattente&amp;quot;&lt;br /&gt;
* mosse hanno: direzione, azione, attacco (mosse pokémon)&lt;br /&gt;
* Parametri interi per mossa (direzione, consumabili) con lower e upper bound&lt;br /&gt;
* camuffarsi =&amp;gt; DnD manuale&lt;br /&gt;
* wrestling (libro) per le mosse/prese&lt;br /&gt;
&lt;br /&gt;
* X fa una mossa contro Y: Z potrebbe reagire (Es. ricevendo il colpo al posto di Y). Può essere realizzato sia come se &amp;quot;Y chiede soccorso Z&amp;quot; o come reazione di alleati adiacenti &amp;quot;Z soccorre Y&amp;quot;&lt;br /&gt;
* Mossa prende come parametro di ingresso Corpo, ossia la parte del corpo coinvolta nella mossa (es arto , tutto corpo ect). &lt;br /&gt;
&lt;br /&gt;
===Oggetto (con statistiche e stati)===&lt;br /&gt;
* armi: lacci (stati), lame (potenze), sassi, reti, pistole (munizioni), razzi, bombe (potenze), fuoco (d'artificio?) =&amp;gt; manuale DnD&lt;br /&gt;
* veleno n modi =&amp;gt; DnD manuale&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (oggetti)&lt;br /&gt;
* automezzi con cannoni, variabile 'hasEntrata', 'tempoRiutilizzo'&lt;br /&gt;
* violino come arma (tutti strumenti musicali): a fiato, a corda, a percussione&lt;br /&gt;
* veleni, ampolle e flaconi magici, insieme di 'oggetti dentro' un oggetto&lt;br /&gt;
&lt;br /&gt;
* Classe oggetto: es albero, roccia, casa: forza necessaria per sradicare + forza per lanciare + destrezza / agilità per appendersi + nascondersi in proporzione alle dimensioni di chi si nasconde. &lt;br /&gt;
* Altri es. pali. Sotto terra o sotto acqua/lava/melma o simili. &lt;br /&gt;
* Acqua rallenta se non hai pinne boolean.&lt;br /&gt;
* Classe strumento per oggetti che si tengono in mano, es reti , pistole, spade, pugnali, scudi, elmi, lancia, arco , frecce, lanciarazzi, fucili cecchino, fucile assalto, corde.&lt;br /&gt;
* Strumenti e mosse: danno ad area, perforante, contundente (vedi dnd armi). Mosse possono creare/modificare/distruggere oggetti e strumenti.&lt;br /&gt;
* Oggetti del campo di gioco incidono su elusione (parametro di personaggio).&lt;br /&gt;
* Buco/abisso (boolean) per dire se c’è o meno il suolo (Suolo come classe?). &lt;br /&gt;
* Radiazioni. &lt;br /&gt;
&lt;br /&gt;
===Modalità gioco===&lt;br /&gt;
* turnazione&lt;br /&gt;
* 1 v 1 v 1 etc., ma anche squadre casuali&lt;br /&gt;
* punteggio: chi fa più punti, più uccisioni, definizione di 'punto', gioco per perdere&lt;br /&gt;
* inserisci personaggio total random&lt;br /&gt;
&lt;br /&gt;
* Modalità battaglia con interazione stile battaglia navale (non si vede mossa dell'avversario)&lt;br /&gt;
* Modalità di gioco: tutti contro tutti (battle royale), death match, vs CPU mode zombie(attaccano solo, se non possono vanno verso nemico): serve introdurre un punteggio, di sicuro per mode zombie , ma anche per death match e tutti contro tutti&lt;br /&gt;
* ingressi: ne entra un altro?&lt;br /&gt;
&lt;br /&gt;
===Mappa===&lt;br /&gt;
* arene&lt;br /&gt;
* minimappa (pixelata ?), legenda oggetti base, devono esserci caselle implicite&lt;br /&gt;
* mappa 100x100 (rivalutato, meno limitata)&lt;br /&gt;
* Cannoni fissi in mezzo al campo (strumento).&lt;br /&gt;
&lt;br /&gt;
===Funzionalità generali===&lt;br /&gt;
* Chiave: non una flat input box per i comandi; ma dinamica: si suppone il soggetto &amp;quot;io&amp;quot; (le azioni le fanno in prima persona i personaggi), ogni mossa deve prevedere dei complementi (&amp;quot;verso&amp;quot;, &amp;quot;tra quanto&amp;quot;, &amp;quot;cosa&amp;quot;, &amp;quot;a favore di chi&amp;quot;, &amp;quot;contro chi&amp;quot;). Ogni complemento collegato con box stile in pop up =&amp;gt; bootstrap (la grafica sara unica). Prevedere anche modalita flat con input del tipo &amp;quot;azione a=pippo verso=termoli&amp;quot; (regex check)&lt;br /&gt;
* &amp;quot;meno tabelle&amp;quot;, &amp;quot;no bottoni&amp;quot; e solo foto che si alternano, &amp;quot;la grafica serve&amp;quot;: text box unica interazione, text area (history), immagine personaggio e immagine mappa&lt;br /&gt;
* &amp;quot;persistenza anche da interfaccia grafica&amp;quot;, diritti di scrittura sui file?&lt;br /&gt;
* Segnalazione (comando per fare nota)&lt;br /&gt;
&lt;br /&gt;
===Deploy===&lt;br /&gt;
* &amp;quot;commenta il codice&amp;quot;, &amp;quot;dividi et impera&amp;quot;&lt;br /&gt;
* Server web (Apache) ospita partite (+ localmente ha i file di funzionamento), in LAN client giocano o da remoto con IP pubblico. Interfaccia HTML5 + Javascript per giocare. Studiare engine grafici Javascript&lt;br /&gt;
* bootstrap! (specie per input box)&lt;br /&gt;
* Unity, WebGL (vedi SDK dedicata, built per Android/iOS/etc.)&lt;br /&gt;
* Modelli 3D videogiochi: https://www.models-resource.com/ , meglio se disaccoppiati da Unity (e.g. in cartelle independenti), aggiunta modelli online&lt;br /&gt;
* creare modelli: blender. creare disegni: krita&lt;br /&gt;
* Tutorial tank Unity: https://learn.unity.com/project/tanks-tutorial ; modelli: https://opengameart.org/&lt;br /&gt;
* WebSocket per gestire client asincroni (NodeJS ?)&lt;br /&gt;
* Su YT in “guarda più tardi” video per interagire unity con JS (“unity.sendMessage()” o simili)&lt;br /&gt;
* Due client: uno con WebGL e uno JS base con solo input (per test, per mancanza di supporto browser a WebGL). Eventualmente 3 client: 1 base (JS puro con qualche immagine al più), 1 WebGL+Unity 2D (grafica pixelata), 1 WebGL+Unity 3D (informazioni di input per mirare, ad es., in base a dove punto nello schermo. Qualcosa di simile anche per 2D). Tutti i client stessi JSON per comunicare al server!&lt;br /&gt;
* photogrammetry, https://medium.com/realities-io/getting-started-with-photogrammetry-d0a6ee40cb72&lt;br /&gt;
* roll20.net .. c'è '''davvero''' molto&lt;br /&gt;
&lt;br /&gt;
==== Altro (scartato)====&lt;br /&gt;
* rpgmaker, godot, aseprite, pixelart (in generale), ma anche phaser, piskel&lt;br /&gt;
* joomla! Per far prima con html&lt;br /&gt;
* libreria pygame&lt;br /&gt;
* Vuegg: https://github.com/marketplace/vuegg  &lt;br /&gt;
* Material Design&lt;br /&gt;
* JAVA: Class.forName(&amp;lt;name&amp;gt;.class).newInstance();&lt;br /&gt;
&lt;br /&gt;
===Copia&amp;amp;incolla generale, da smistare in sotto capitoli. Contiene anche '''tutte''' note del telefono (al 22/02/2020)===&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 1:'''&lt;br /&gt;
&lt;br /&gt;
Mosse che trasformano l’avversario: attenzione è una mossa devastante. Trasformazione totale o parziale. Si devono poter aggiungere mosse, strumenti dinamicamente. Battle bot:ribaltano, scintille, elementi (Oggetti) che danneggiano. One piece: I frutti del diavolo (悪魔の実 Akuma no mi?) sono frutti misteriosi che donano poteri soprannaturali a chi li mangia, rendendoli però incapaci di nuotare. Di conseguenza il contatto con l'acqua di mare o con una speciale sostanza conosciuta come agalmatolite indebolisce gli utilizzatori di frutti del diavolo e li priva dei loro poteri. Alcune persone sono inoltre in grado di ricorrere all'Ambizione (覇気 Haki?), una forza spirituale che permette di avvertire la presenza di altri esseri viventi e di predirne i movimenti, di irrobustire parti del corpo e di intimidire o fare svenire le creature con una debole forza di volontà. Personaggio ha funzione baricentro_x, baricentro_y calcolate come (from_x+to_x)/2 sul quale si basa la funzione di libreria getDistance(Personaggio A, Personaggio B, float success); tale funzione serve per calcolare per i PNG e per i PG se ha senso usare una mossa. Non-onniscienza: delle volte non si può sapere distanza avversario e fallisce la mossa per la distanza -&amp;gt; “float success” rappresenta la probabilità di successo (Personaggio ha parametro “osservare”). PNG di due categorie: offensivi o neutrali (no priorità a mosse di attacco, ma tutto casuale). Mosse e oggetti per chiamare Personaggi, magari non necessariamente alleati (2 mosse e 2 oggetti quindi necessari), richiamo di un personaggio preciso o di uno a caso. Ogni mossa/azione deve avere un tempo di attesa espresso in turni (alla meglio 0) per poter ripetere la mossa/azione. Strumenti anche mezzi di trasporto di aria, di terra, di acqua (o lava/palude). Possono attivare una metamorfosi / Unione per cambiare stats personaggio. Veicoli con armi o riparo. Gli strumenti da trattare come gli oggetti. Classe unica? I match/partite (immagino Classe Partita) devono avere variabile boolean “respawn”, per distinguere death match a punti con death match con una vita. Wrestling per ispirarsi nella lotta libera: calci pugni ginocchiate prese lanci salti testate gomitate ecc. Per punti si vince a un limite o dopo un tot di mosse , oppure al primo dei due raggiunti (max_punti e max_mosse parametri di Partita). I punti si guadagnano alla kill (un Punteggio per squadra, int punteggio salvato localmente dentro ogni Personaggio che ha la variabile int squadra). Si guadagnano tanti punti quanti sono i punti della variabile “valore” del personaggio ucciso, tale variabile è calcolata come somma dei valori di tutte le mosse/stats ect del Personaggio. Imperium civitas. Attacco dei giganti. Possibilità di morire se colpiti in un unico punto (tallone d Achille) implementabile come variabile boolean. Jump force. Game dev tycoon. Acqua diventa tsunami. Variabile int per attacco cumulativo di gruppo: es calciatori che più si passano la palla più l’attacco è forte. Suolo magico: non tutti i personaggi possono accedervi, array di string elenca i nomi di chi può accedervi. Funzione esci/entra in classe Personaggio per simulare scambio pokemon 6vs6. Piovra gigante. Rischio=danno*probabilita. Mossa su strumento e con strumento?&lt;br /&gt;
Mosse fisiche per arrampicarsi su avversario(se e solo se sei la metà di dimensioni(?)), atterrarlo, lanciarlo, accecarlo, immobilizzarlo. Se sei in gruppo/ orda bonus ad attacchi combinati. Armi: fruste e scheggie, corni che si suonano per chiamare altri. Tipo della mossa con moltiplicatore tra 0 (immune) e 2 (float): acqua, fuoco, magia, terra: da ispirarsi ai pokemon ma non da copiare, penso. Armi da campo: cannoni e catapulte. Veicoli d’acqua: moto acqua, canoe, barche a motore a remi. Nei veicoli malus su attenzione (variabile int in personaggio, indica attenzione in combattimento e non in altro) perché si è impegnato alla guida . All’inizio in image view “the hero” e “the map”. Condizione vittoria (oltre a morte, punti, o numero mosse, cioè tempo) morte di un singolo Personaggio, che potrebbe rappresentare un edificio, cassaforte o simili. Personaggio si può svestire e lasciare strumenti, modificano statistiche di attacco, difesa , agilità, ect. Variabile luce o non luce, che peggiora/migliora a seconda della specie la visibilità, quindi la precisione , specie in attacchi a distanza: Scurovisione evita i malus.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 2:'''&lt;br /&gt;
&lt;br /&gt;
Gioco2: se ci si lancia da oggetti , dopo essersi arrampicati, possono esserci danni da caduta; strumenti come paracaduti o mosse magiche possono evitare i danni. Pozione del vento, soffi e devi attacchi. In difesa puoi parare, schivare, deviare: tre variabili? Ambiente: colline e pianure uguali, Monti sono Oggetti, picco ossia un unico monte oggetto. Rocce volanti, nuvole sospese: oggetto può essere sospeso e può fare periodicamente una mossa, ad es tuono, può spostarsi, può fare entra/esci, oggetto albero e oggetto foresta, si possono prendere, nascondersi, arrampicarsi, lanciarli, ostacolano velocità ma se si ha abbastanza forza si spezzano alberi. Acqua poco profonda, profonda, molto profonda: variabile boolean in Personaggio “alto” per toccare in acqua profonda, con acqua si generano fiumi laghi e mari. Ambiente si deve poter evolvere: ad esempio oggetto diga può fare metamorfosi e diventare oggetto cascata/torrente in piena. Per edifici più oggetti che rappresentano le mura e il tetto, variabile boolean per oggetto per entrare nell’oggetto. Possono essere spazzati via: danni da crollo, si può combattere all interni, contengono strumenti come tavoli sedie mobili letto ect. Se uno viene schiantato contro uno strumento prende danno(es danno da schianto). Ci possono essere scale, si può non avere contatti visivo sull’avversario. Oggetto mura, oggetto torre, oggetto casa interno sono cose distinte: possono dare malus/bonus su visibilità. Ambiente: pozzi e grotte, da gestire come interno casa. Lava come acqua, ogni oggetto può essere sorgenti di liquido: monte sorgente acqua, vulcano sorgente lava. Può esserci variabile probabilità eruzione, se settata a 1 c’è una continua eruzione. Strade di vario tipo, sovrapposta a altri suoli, migliorano velocità di alcuni strumenti, variabile boolean “ha le ruote” in classe strumenti. Unificare classe strumento e classe oggetto. Oggetti sospesi: case sospese su albero, ad es. Fiamme in mezzo al suolo. Oggetti: porto, aereoporto, grattacieli, dighe, impianti a fune, ospedali per curarsi e prendere oggetti per curarsi dopo, scuole contenenti libri per apprendere una mossa, luoghi di ingegneria per creare oggetti, ad esempio veicoli o armi, soldi nel gioco per comprare da eventuali venditori. Ogni oggetto avra un prezzo (valutabile circa in euro per semplicità). Variabile float per fame, sete, sonno, caldo-freddo (parte da 0.5). Nella mappa ci deve essere per ogni punto la temperatura. Possibilità di vomito, dissenteria, problemi cardiaci, respiratori, muscolari. Armi: balestra, mani nude, sasso, tirapugni, torcia accesa. Armature: intralciano o favoriscono agilità, attacco, poteri magici, rumorosa (elusione), è uno strumento/oggetto. Attacchi possono essere prolungati per turni, mosse variabile boolean prolungabile: può aumentare o diminuire intensità, c’è un max espresso in turni di prolungabilita, inoltre può essere leggermente alterato con una variabile casuale. Equipaggiamento (strumento/oggetto): pietra focaia, attrezzi da scalata, boccale di birra, cavallo, moto, chiodi, martello da fabbro, corda, corazza, dardo, faretra/zaino/sacca (oggetti che contengono una lista di oggetti, stringhe) con un numero per la quantità) e capacità massima zaino e ogni oggetto può avere un valore intero per dimensione (es martello 3, ascia grande 7), mantello, olio, variabile boolean prende fuoco/conduce elettricità, amplifica magnetismo, aumenta esplosioni nucleari, aumenta forza di gravità (?), pala, piccone, rampino, specchio, per osservare quando si è nascosti e si ha malus su visibilità. Strumenti da scasso per aprire porte: variabile boolean per oggetti: entrata con scasso. Personaggio: string razza per swag, immunità a veleni e malattie, elusione, agilità, precisione, abilità magiche(?), difesa fisica. In ultima torcia: agilità, coraggio, forza, intelligenza, magia, manualità, percezione, socialità. Bestiario: aracnoide di varie dimensioni, talpe giganti, vermi giganti di terra di mare e di lava ect, bulbo trascinatore che ha tentacoli per tirare a se e mangiare, lui è immobile, calabrone gigante, serpenti giganti, cinghiali, draghi, elfi, goblin e re goblin, sciamani (goblin), totem di guerra come strumento/oggetti per alterare statistiche nella loro area di influenza, lupo, mastino bruciante, nani, non morti/zombie/mummia/scheletro variabile boolean vivo a false ma ha ancora hp su parti del corpo: variabile boolean “zombizabile”. Orchi, pesci da terra (anfibi) tritone dell abisso, troll e trollin (orchi più deformi), umani. Abilità dei personaggi in ultima torcia: artificiale (robot) immunità a soffocamento, veleni, malattie ect immune a manipolazioni psichiche, visione oscurità; danno da attacco in carica; fiammegiante ossia la creatura può incendiarsi e elettrizzante ossia può diventare elettrica caricamente; modalità furia/mailmen ossia ottiene bonus su alcune/tutte le statistiche; gigantesco o molto piccolo due boolean (?forse non serve); immunità a magie mentali, al fuoco; linguaggi (?); non morto; danno da attacco in presa; pungiglioni velenosi; sa muoversi su ragnatele o è rallentato, resistenza a perforazione, respirare sott’acqua o sotto lava o nei liquidi in genere; rigenerazione; riceve danni dalla luce solare o da assenza di luce; è terrorizzato/impaurito/intimidito o se è imperturbabile boolean. Danno da trascinamento; paralizzante; può diventare più veloce (?non serve); visione a infrarossi attraverso oggetti; volare o andare sotto terra. Imperium editor, cose che penso di non aver ancora scritto: stagioni, suolo erboso o terriccio, sabbia con erba e terra e da sola, strade e stagioni, altitudine, alberi e arbusti, vari tipi a foglia larga, conifere, alberi secchi, palme, arbusti verdi e secchi, cactus, alghe marine, rocce e pietre, scheletri per terra, legna tagliata (alberi tagliati), carri e carretti, grotte e rovine per accessi sotterranei, locande, templi, accampamenti, fortini, monoliti, fontana, tombe e cimiteri, borse per terra, pozzo, troni, croci(del teschio), pozzo, capanne, lapidi, ponti, recinzioni, falò, tende, torri, panoplia, fessure come abissi, statue, rovine (deserto) come case distrutte, colonne per costruire templi, piramidi, sfingi, bandiere, rovine in Europa, campi coltivati che contengono cibo, fiamma (in altre), roccia in altre per montagne, altre-&amp;gt;rovine per monumenti non egiziani ma europei.&lt;br /&gt;
Ci sono paludi. Tende da campo. Forti, porti. Edifici delle fortezze, edifici dei villaggi. Naufragi e scogli.&lt;br /&gt;
Parametri voglia/impegno float per descrivere voglia di combattere Personaggio. Ricevi danno uscendo dalla mappa tra 1-5% tra 6-10% tra 11-15% della vita totale di ogni parte del corpo per ogni turno di gioco. Danno da precipitazione diverso da carica, uno verticale uno orizzontale, se precipiti da molto in alto hai bonus, oltre che danni da schianto lol. Baionette, formazione a blocchi, a quadrato (difensiva) sparano su quattro lati, a schiera vanno avanti. Usano un colpo poi lunga ricarica. Variabile boolean per attivare o meno fuoco amico. Azione per cambiare posizione: in piedi, in ginocchio(inteso come via di mezzo), sdraiato: per permettere migliore visibilità a chi è dietro (nella formazione).&lt;br /&gt;
Altruismo, coraggio, spingere oltre il limite, difendere al posto di un altro, migliorare posizione per avere bonus. Mosse da usare in condizioni psicologiche idonee: mosse estreme per disperazione, bonus unici. Condizioni per situazioni: blocco, spalle al muro, stritolato, confuso, semi parassiti addosso, azzoppato, bagnato d’acqua, lame affilate, corazza indurita, tante copie di me stesso attive, preveggente. Per ambiente:pioggia (torrenziale), barriera a cupola, punte metalliche a terra, blocco di fumo nero. Far volare un avversario/alleato. Tutti possono fare tutto sotto effetti magici o fisici. Un cavallo può volare se viene preso da un uccello e portato in alto.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 3, 4:'''&lt;br /&gt;
&lt;br /&gt;
Gioco1,2,3,4: tutto caricato su wikis.&lt;br /&gt;
&lt;br /&gt;
Gioco3: Mosse con caricamento + spostamento (es. kameamea con teletrasporto). Ciclo di interazione principale:crea o combatti. Modalità campagna, che chiede in input da che battaglia iniziare, ma implica tipi battaglie prefissati. Alla morte/sconfitta di un personaggio si possono alterare statistiche (es personaggio può cambiare fazione). Alcune mosse possono lasciare oggetti sul terreno: (ad es, radici di Groth). Ogni oggetto può alterare le statistiche al passaggio sopra, nelle vicinanze. Boolean invisibile per personaggio, diverso da elusione infinita. Se personaggio va in un altro dimensione -&amp;gt; unreachable. Attacco coordinato, se non lo fanno tutti vale lo stesso ma depotenziato opportunamente . Personaggio in modalità maniac (2 mosse per turno) e in modalità depressive (1 mossa ogni due turni); personaggio Flash può fare 10 mosse in un turno. Chiudi con lucchetto oggetto da dentro o da fuori, oggetto ingresso in oggetto casa , più ingressi per un singolo oggetto.nicole aniston. Rimbalzo se ci si schianta contro oggetto da calcolare con parametro. Ryuk e Darkrai.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gioco 4 23/07/2019:&lt;br /&gt;
Pula fiction, aracnidi, oggetto: due superfici rettangolari di forma diversa, anche inclinate , collegate. Più pezzi collegati tra loro per forme cilindriche cave, ad esempio, tipo vulcano. Mappa con sprite personaggi, canvas: anche mouseClick? Statistiche con nome gerarchico, es pokemon_attacco. Modalità survival, stile isola di jurassic park gdr; sia in coop che contro; possibilità di fare N turni di fila se non ci sono altri player giocanti nelle vicinanze (ciò però comporterebbe , in modalità contro , di capire quando c’è qualcuno nelle vicinanze perché si andrebbe di 1 turno alla volta, soluzioni: in mod contro 1 turno per volta oppure meccanismo di sincronizzazione turni quando uno vede l’altro (anche furtivo) come c’è attacco 1 turno a testa) .. analogo a Battle royale(?); inizio con starter kit random. Modalità assedio al castello. Inoltre se posso fare N turni di fila si può pensare a più pc , uno per persona , coordinati per fare comandi in parallelo, ma va ben congegnato meccanismo di sincronizzazione. Parti DelCorpo -&amp;gt; Componente/i oppure Parte. La mappa deve essere (x,y); l’altezza viene indicata onMouseOver certi pixel dove è posto il Personaggio; se personaggio dentro edificio/grotta cambio img (es sfocato/tratteggiato). Mosse: astrarre per target; molte mosse sono simili tra loro, somiglianza va sfruttata, hanno magari dei target in comune, o variano solo per un parametro. Creare mappa anche con drag and drop immagini ?(un po’ difficile). Più layout per interfaccia grafica (esempio uno che mostra errori input su text area, uno con alert, uno su box text area separato). Input comandi consumato pezzo per pezzo, alcune parole se prevedono parametri quando riconosciute fanno fetch anche di parola (numero) successiva. Face toon foto? Import parziali di personaggi (tutto tranne/solo questi campi specificati). Texture mappa complete o ripetibili (es per suolo). Anteprima battaglia stile battaglia pokemon (magari per 1/2/3 vs 1/2/3) per rappresentare scontro. Conviene usare xslx (excel) per dati, considerare che può non servire la libreria Java per leggere stringhe per operazioni. Mossa “again” , ripeti la precedenza(opportuna modifica parametri, es mossa spostamento). Possibile gestione contromosse: si usano marker (tag): ogni mossa ha elenco tag del tipo di contromosse che può subire (con probabilità annessa, che può dipendere da pg che subisce mossa congiuntamente a mossa stessa). Ogni mossa inoltre deve essere taggata come possibile contromossa che il pg può usare (per schivare può fare in più modi). A seconda del lancio del dado il pg che effettua La contromossa può anche scegliere tipologia di contromossa o solo la mossa della tipologia che ha beccato (entrano in gioco riflessi ect.). I parametri che fanno attivare unq o un’altra contromossa sono dinamici, posso dipendere ad esempio dalla posizione tra i due pg o altre statistiche. Tag contromosse a fasce (es. coprirsi è sempre più facile che schivare che e più facile di schivare e contrattaccare (?); all’interno dello stesso schivare e contrattaccare ci sono più sotto categorie). Per aggiunta personaggio può essere utili interfaccia dedicata, non linea di comando (o altre operazioni, specie se ci sono tabelle). Mossa “premonizione”: predire il futuro a breve termine, dici che mossa vorresti fare e ti dice esito (o più esiti se uno chiede più mosse). Funziona solo sulla prossima mossa. Contromossa delle contromossa gestione?? Eventualmente nell’esito si prevede ancore contro-contromossa. Ma si innesca reazione a catena, inoltre da gestire scelta contromossa in questo caso. Applicazione tag conoscenza(universo di appartenenza): “Termoli”, “pokemon”, “liceo classico Termoli”, anche gerarchici, per filtrare sui personaggi.target componibili , fattorizzato creazione mosse, hanno un costo magari per indicare quantovoccupano dicuna mossa, relativo maybe a un parametro o più del target stesso. In particolare, non saranno salvate le mosse per un personaggio (o solo alcune “preferite”) ma il suo insieme di target i quali devono dire:statistica che influenzano, “costo del turno” che richiedono al variare dell’intensità del target (che aumenta linearmente, esponenzialmente, generica f(x)) quindi corsa blanda costo 1 , Max corsa costo 5 (max), elenco (string) target incompatibili con tale target (se serve), nota relative ad es per quando uno vuole creare una mossa durante la battaglia (“target corsa, max sforzo dedicabile 4 ect” metti “50 metri corsa” “ok/troppo! Vuoi sforzati di più rischiando effetti collaterali?”). Si può autoscrivere la voce narrante del gioco come “la tua coscienza” mentre che giochi, d’altronde si interagisce con essa. Considerare che un target può appartenere a più personaggi, magari sotto nomi di mosse diversi.&lt;br /&gt;
Definire gerarchia di personaggi per template (tipo classe e super classe) e template importabili (tipo usa fuoco). Es umanoide non umanoide, tra umanoide maschio- femmina etc. Classe che estende System.out per creare funzioni che aggiungono Header “DEBUG:” etc; due programmi Java , due main: uno delegato a calcoli + gestione Excel; altro legge stdout dell altro per interfaccia grafica. Per allenare PG creare dei PG fantocci con label per fare Q-learning iniziale, più avanti far allenare pg tra loro; creare vari fantocci: tank terrestre fisico, healer volante etc. Excel: si usa css che si può rendere tabellare, più facile da trattare nel codice rispetto a .xslx. Ogni “utente” ed Lostefra ha il suo personale dizionario con sue personali short cut da usare in partita, eventuale login con password (opzionale) x accesso. Vedere license show down. Mappa unica stile giochi di ruolo, si vede tutto da sopra: click o simili su edifici/caverne per mappe interne a tale posto, così ok sprite e per rappresentare “pg in volo” sprite dedicato. Densità aria per dire quando anche un uomo per es può volare. Ipotesi più efficiente per dare un valore stima al pg: AI base che gioca a manetta contro altre AI base e dalle vittorie si fa l’euristica, più vittoria facile/veloce/stracciante più punti, contro vari pg, contro pg standard bench mark.&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Note&amp;diff=200</id>
		<title>Note</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Note&amp;diff=200"/>
		<updated>2020-05-30T16:16:23Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: /* Deploy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Note ==&lt;br /&gt;
&lt;br /&gt;
'''Vedere altre note su fogli di carta e promemoria del telefono. Ce ne sono molte.'''&lt;br /&gt;
'''La copiatura dai fogli di carta dei continuare da pagina 4 (&amp;quot;alterare param..&amp;quot;).'''&lt;br /&gt;
&lt;br /&gt;
===Inspirational Concepts===&lt;br /&gt;
* Gioco Lotta (Pokémon, Pokkén)&lt;br /&gt;
* no caselle esplicite&lt;br /&gt;
* Descrizione rispetto a: ambiente, nemico, oggetti&lt;br /&gt;
* pokémon, DnD, Call of Duty, Super Smash Brawl, corse pazze&lt;br /&gt;
* concentrarsi su: fluidi, telecinesi, razze, bonus/malus, gradi di libertà (fisicamente parlando) &lt;br /&gt;
* scacchi (es. crea casella), shaolin showdown&lt;br /&gt;
* prevedere = creatività&lt;br /&gt;
* acqua, aria, fuoco, terra&lt;br /&gt;
* gravità (newton), verso alto, basso, destra, sinistra, circolare, tutti i versi&lt;br /&gt;
* jumanji, savana, animali, zoologia&lt;br /&gt;
* tempo/spazio&lt;br /&gt;
* BF4, pirati, roma (imperium civitas)&lt;br /&gt;
* musica come arma (rap)&lt;br /&gt;
* magia, prestigiatori&lt;br /&gt;
* dinosauri (documentario, libro, zoologia)&lt;br /&gt;
* avengers, supereroi (libro)&lt;br /&gt;
&lt;br /&gt;
* Looney toons&lt;br /&gt;
&lt;br /&gt;
===Personaggi (con statistiche e stati)===&lt;br /&gt;
* combattenti (con statistiche e stati)&lt;br /&gt;
* immagine rappresentativa per rappresentare meglio&lt;br /&gt;
* HP: colore rosso su immagine personaggio, dove sei debole/già colpito (idea scartata)&lt;br /&gt;
* penitenza: il malus può essere inteso come ciò che c'è nell'inserimento successivo, malus cumulativo&lt;br /&gt;
* essere ipocrita, finzione (schermo)&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (personaggi)&lt;br /&gt;
* metamorfosi&lt;br /&gt;
* alchimisti&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* possibilità giù in terra/ giù in acqua, con reachable e unreachable Boolean. Fuori da mappa anche reachable e unreachable.&lt;br /&gt;
* Personaggi composti di parti[] es. testa, busto, gambe, braccia, coda, pinna, ali. Distinzione per arto di movimento e/o spostamento boolean.&lt;br /&gt;
* Arti possono provocare danno, bruciatura , paralisi a contatto (Boolean) . Percentuale di probabilità accompagna ogni Boolean.&lt;br /&gt;
* Ogni parte del corpo punti vita + se inutilizzabile + amputata + stato (es paralisi).&lt;br /&gt;
* Per fare battaglie tra molto grandi =&amp;gt; 1 m lo si intende come 10m.  (rivalutato, aumentare livello scaling)&lt;br /&gt;
* Personaggio fusionabile Boolean + string nomi con cui si fonde.&lt;br /&gt;
* Distinzione tra infernape e infernape1/2/3 ect tra “specie” e “nome”.&lt;br /&gt;
* variabile Boolean respawnable.&lt;br /&gt;
* Raccogliere a piene mani da: https://spore.fandom.com/wiki/Creature_Editor&lt;br /&gt;
* Ad esempio weapons come elemento di Corpo (zanne, corna) e possibilità di muoversi/attaccare furtivamente.&lt;br /&gt;
* Divisibile e unibile come boolean e array di stringe associate per indicare i nomi con cui si unisce il Personaggio o in cui si divide.&lt;br /&gt;
* Variabili posizione nome: from_x/y ; to_x/y.&lt;br /&gt;
* Classe Stato, Personaggio contiene Array di stato, stato contiene moltiplicatori per statistica es attacco velocità precisione elusione ect.&lt;br /&gt;
* Personaggio deve avere una stat tipo sanità mentale, intelligenza, quanto è confuso e quanto è impaurito (2).&lt;br /&gt;
&lt;br /&gt;
* Per personaggi molto piccoli (meno di 1m x 1m x 1m) possibilità di essere in (x,y,z) tra 0 e 1.000.000 (ordine del micrometro, 1*10^-6 == 0,000001) e avere (lenX, lenY, lenZ). In questo modo sono definite dimensioni inferiori ad 1 m^3.&lt;br /&gt;
* personaggi max 20x20 (rivaluato, meno limitata)&lt;br /&gt;
&lt;br /&gt;
===Mosse===&lt;br /&gt;
* &amp;quot;combattimento prescinde da combattente&amp;quot;&lt;br /&gt;
* mosse hanno: direzione, azione, attacco (mosse pokémon)&lt;br /&gt;
* Parametri interi per mossa (direzione, consumabili) con lower e upper bound&lt;br /&gt;
* camuffarsi =&amp;gt; DnD manuale&lt;br /&gt;
* wrestling (libro) per le mosse/prese&lt;br /&gt;
&lt;br /&gt;
* X fa una mossa contro Y: Z potrebbe reagire (Es. ricevendo il colpo al posto di Y). Può essere realizzato sia come se &amp;quot;Y chiede soccorso Z&amp;quot; o come reazione di alleati adiacenti &amp;quot;Z soccorre Y&amp;quot;&lt;br /&gt;
* Mossa prende come parametro di ingresso Corpo, ossia la parte del corpo coinvolta nella mossa (es arto , tutto corpo ect). &lt;br /&gt;
&lt;br /&gt;
===Oggetto (con statistiche e stati)===&lt;br /&gt;
* armi: lacci (stati), lame (potenze), sassi, reti, pistole (munizioni), razzi, bombe (potenze), fuoco (d'artificio?) =&amp;gt; manuale DnD&lt;br /&gt;
* veleno n modi =&amp;gt; DnD manuale&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (oggetti)&lt;br /&gt;
* automezzi con cannoni, variabile 'hasEntrata', 'tempoRiutilizzo'&lt;br /&gt;
* violino come arma (tutti strumenti musicali): a fiato, a corda, a percussione&lt;br /&gt;
* veleni, ampolle e flaconi magici, insieme di 'oggetti dentro' un oggetto&lt;br /&gt;
&lt;br /&gt;
* Classe oggetto: es albero, roccia, casa: forza necessaria per sradicare + forza per lanciare + destrezza / agilità per appendersi + nascondersi in proporzione alle dimensioni di chi si nasconde. &lt;br /&gt;
* Altri es. pali. Sotto terra o sotto acqua/lava/melma o simili. &lt;br /&gt;
* Acqua rallenta se non hai pinne boolean.&lt;br /&gt;
* Classe strumento per oggetti che si tengono in mano, es reti , pistole, spade, pugnali, scudi, elmi, lancia, arco , frecce, lanciarazzi, fucili cecchino, fucile assalto, corde.&lt;br /&gt;
* Strumenti e mosse: danno ad area, perforante, contundente (vedi dnd armi). Mosse possono creare/modificare/distruggere oggetti e strumenti.&lt;br /&gt;
* Oggetti del campo di gioco incidono su elusione (parametro di personaggio).&lt;br /&gt;
* Buco/abisso (boolean) per dire se c’è o meno il suolo (Suolo come classe?). &lt;br /&gt;
* Radiazioni. &lt;br /&gt;
&lt;br /&gt;
===Modalità gioco===&lt;br /&gt;
* turnazione&lt;br /&gt;
* 1 v 1 v 1 etc., ma anche squadre casuali&lt;br /&gt;
* punteggio: chi fa più punti, più uccisioni, definizione di 'punto', gioco per perdere&lt;br /&gt;
* inserisci personaggio total random&lt;br /&gt;
&lt;br /&gt;
* Modalità battaglia con interazione stile battaglia navale (non si vede mossa dell'avversario)&lt;br /&gt;
* Modalità di gioco: tutti contro tutti (battle royale), death match, vs CPU mode zombie(attaccano solo, se non possono vanno verso nemico): serve introdurre un punteggio, di sicuro per mode zombie , ma anche per death match e tutti contro tutti&lt;br /&gt;
* ingressi: ne entra un altro?&lt;br /&gt;
&lt;br /&gt;
===Mappa===&lt;br /&gt;
* arene&lt;br /&gt;
* minimappa (pixelata ?), legenda oggetti base, devono esserci caselle implicite&lt;br /&gt;
* mappa 100x100 (rivalutato, meno limitata)&lt;br /&gt;
* Cannoni fissi in mezzo al campo (strumento).&lt;br /&gt;
&lt;br /&gt;
===Funzionalità generali===&lt;br /&gt;
* Chiave: non una flat input box per i comandi; ma dinamica: si suppone il soggetto &amp;quot;io&amp;quot; (le azioni le fanno in prima persona i personaggi), ogni mossa deve prevedere dei complementi (&amp;quot;verso&amp;quot;, &amp;quot;tra quanto&amp;quot;, &amp;quot;cosa&amp;quot;, &amp;quot;a favore di chi&amp;quot;, &amp;quot;contro chi&amp;quot;). Ogni complemento collegato con box stile in pop up =&amp;gt; bootstrap (la grafica sara unica). Prevedere anche modalita flat con input del tipo &amp;quot;azione a=pippo verso=termoli&amp;quot; (regex check)&lt;br /&gt;
* &amp;quot;meno tabelle&amp;quot;, &amp;quot;no bottoni&amp;quot; e solo foto che si alternano, &amp;quot;la grafica serve&amp;quot;: text box unica interazione, text area (history), immagine personaggio e immagine mappa&lt;br /&gt;
* &amp;quot;persistenza anche da interfaccia grafica&amp;quot;, diritti di scrittura sui file?&lt;br /&gt;
* Segnalazione (comando per fare nota)&lt;br /&gt;
&lt;br /&gt;
===Deploy===&lt;br /&gt;
* &amp;quot;commenta il codice&amp;quot;, &amp;quot;dividi et impera&amp;quot;&lt;br /&gt;
* Server web (Apache) ospita partite (+ localmente ha i file di funzionamento), in LAN client giocano o da remoto con IP pubblico. Interfaccia HTML5 + Javascript per giocare. Studiare engine grafici Javascript&lt;br /&gt;
* bootstrap! (specie per input box)&lt;br /&gt;
* Unity, WebGL (vedi SDK dedicata, built per Android/iOS/etc.)&lt;br /&gt;
* Modelli 3D videogiochi: https://www.models-resource.com/ , meglio se disaccoppiati da Unity (e.g. in cartelle independenti), aggiunta modelli online&lt;br /&gt;
* creare modelli: blender. creare disegni: krita&lt;br /&gt;
* Tutorial tank Unity: https://learn.unity.com/project/tanks-tutorial ; modelli: https://opengameart.org/&lt;br /&gt;
* WebSocket per gestire client asincroni (NodeJS ?)&lt;br /&gt;
* Su YT in “guarda più tardi” video per interagire unity con JS (“unity.sendMessage()” o simili)&lt;br /&gt;
* Due client: uno con WebGL e uno JS base con solo input (per test, per mancanza di supporto browser a WebGL). Eventualmente 3 client: 1 base (JS puro con qualche immagine al più), 1 WebGL+Unity 2D (grafica pixelata), 1 WebGL+Unity 3D (informazioni di input per mirare, ad es., in base a dove punto nello schermo. Qualcosa di simile anche per 2D). Tutti i client stessi JSON per comunicare al server!&lt;br /&gt;
* photogrammetry, https://medium.com/realities-io/getting-started-with-photogrammetry-d0a6ee40cb72&lt;br /&gt;
&lt;br /&gt;
==== Altro (scartato)====&lt;br /&gt;
* rpgmaker, godot, aseprite, pixelart (in generale), ma anche phaser, piskel&lt;br /&gt;
* joomla! Per far prima con html&lt;br /&gt;
* libreria pygame&lt;br /&gt;
* Vuegg: https://github.com/marketplace/vuegg  &lt;br /&gt;
* Material Design&lt;br /&gt;
* JAVA: Class.forName(&amp;lt;name&amp;gt;.class).newInstance();&lt;br /&gt;
&lt;br /&gt;
===Copia&amp;amp;incolla generale, da smistare in sotto capitoli. Contiene anche '''tutte''' note del telefono (al 22/02/2020)===&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 1:'''&lt;br /&gt;
&lt;br /&gt;
Mosse che trasformano l’avversario: attenzione è una mossa devastante. Trasformazione totale o parziale. Si devono poter aggiungere mosse, strumenti dinamicamente. Battle bot:ribaltano, scintille, elementi (Oggetti) che danneggiano. One piece: I frutti del diavolo (悪魔の実 Akuma no mi?) sono frutti misteriosi che donano poteri soprannaturali a chi li mangia, rendendoli però incapaci di nuotare. Di conseguenza il contatto con l'acqua di mare o con una speciale sostanza conosciuta come agalmatolite indebolisce gli utilizzatori di frutti del diavolo e li priva dei loro poteri. Alcune persone sono inoltre in grado di ricorrere all'Ambizione (覇気 Haki?), una forza spirituale che permette di avvertire la presenza di altri esseri viventi e di predirne i movimenti, di irrobustire parti del corpo e di intimidire o fare svenire le creature con una debole forza di volontà. Personaggio ha funzione baricentro_x, baricentro_y calcolate come (from_x+to_x)/2 sul quale si basa la funzione di libreria getDistance(Personaggio A, Personaggio B, float success); tale funzione serve per calcolare per i PNG e per i PG se ha senso usare una mossa. Non-onniscienza: delle volte non si può sapere distanza avversario e fallisce la mossa per la distanza -&amp;gt; “float success” rappresenta la probabilità di successo (Personaggio ha parametro “osservare”). PNG di due categorie: offensivi o neutrali (no priorità a mosse di attacco, ma tutto casuale). Mosse e oggetti per chiamare Personaggi, magari non necessariamente alleati (2 mosse e 2 oggetti quindi necessari), richiamo di un personaggio preciso o di uno a caso. Ogni mossa/azione deve avere un tempo di attesa espresso in turni (alla meglio 0) per poter ripetere la mossa/azione. Strumenti anche mezzi di trasporto di aria, di terra, di acqua (o lava/palude). Possono attivare una metamorfosi / Unione per cambiare stats personaggio. Veicoli con armi o riparo. Gli strumenti da trattare come gli oggetti. Classe unica? I match/partite (immagino Classe Partita) devono avere variabile boolean “respawn”, per distinguere death match a punti con death match con una vita. Wrestling per ispirarsi nella lotta libera: calci pugni ginocchiate prese lanci salti testate gomitate ecc. Per punti si vince a un limite o dopo un tot di mosse , oppure al primo dei due raggiunti (max_punti e max_mosse parametri di Partita). I punti si guadagnano alla kill (un Punteggio per squadra, int punteggio salvato localmente dentro ogni Personaggio che ha la variabile int squadra). Si guadagnano tanti punti quanti sono i punti della variabile “valore” del personaggio ucciso, tale variabile è calcolata come somma dei valori di tutte le mosse/stats ect del Personaggio. Imperium civitas. Attacco dei giganti. Possibilità di morire se colpiti in un unico punto (tallone d Achille) implementabile come variabile boolean. Jump force. Game dev tycoon. Acqua diventa tsunami. Variabile int per attacco cumulativo di gruppo: es calciatori che più si passano la palla più l’attacco è forte. Suolo magico: non tutti i personaggi possono accedervi, array di string elenca i nomi di chi può accedervi. Funzione esci/entra in classe Personaggio per simulare scambio pokemon 6vs6. Piovra gigante. Rischio=danno*probabilita. Mossa su strumento e con strumento?&lt;br /&gt;
Mosse fisiche per arrampicarsi su avversario(se e solo se sei la metà di dimensioni(?)), atterrarlo, lanciarlo, accecarlo, immobilizzarlo. Se sei in gruppo/ orda bonus ad attacchi combinati. Armi: fruste e scheggie, corni che si suonano per chiamare altri. Tipo della mossa con moltiplicatore tra 0 (immune) e 2 (float): acqua, fuoco, magia, terra: da ispirarsi ai pokemon ma non da copiare, penso. Armi da campo: cannoni e catapulte. Veicoli d’acqua: moto acqua, canoe, barche a motore a remi. Nei veicoli malus su attenzione (variabile int in personaggio, indica attenzione in combattimento e non in altro) perché si è impegnato alla guida . All’inizio in image view “the hero” e “the map”. Condizione vittoria (oltre a morte, punti, o numero mosse, cioè tempo) morte di un singolo Personaggio, che potrebbe rappresentare un edificio, cassaforte o simili. Personaggio si può svestire e lasciare strumenti, modificano statistiche di attacco, difesa , agilità, ect. Variabile luce o non luce, che peggiora/migliora a seconda della specie la visibilità, quindi la precisione , specie in attacchi a distanza: Scurovisione evita i malus.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 2:'''&lt;br /&gt;
&lt;br /&gt;
Gioco2: se ci si lancia da oggetti , dopo essersi arrampicati, possono esserci danni da caduta; strumenti come paracaduti o mosse magiche possono evitare i danni. Pozione del vento, soffi e devi attacchi. In difesa puoi parare, schivare, deviare: tre variabili? Ambiente: colline e pianure uguali, Monti sono Oggetti, picco ossia un unico monte oggetto. Rocce volanti, nuvole sospese: oggetto può essere sospeso e può fare periodicamente una mossa, ad es tuono, può spostarsi, può fare entra/esci, oggetto albero e oggetto foresta, si possono prendere, nascondersi, arrampicarsi, lanciarli, ostacolano velocità ma se si ha abbastanza forza si spezzano alberi. Acqua poco profonda, profonda, molto profonda: variabile boolean in Personaggio “alto” per toccare in acqua profonda, con acqua si generano fiumi laghi e mari. Ambiente si deve poter evolvere: ad esempio oggetto diga può fare metamorfosi e diventare oggetto cascata/torrente in piena. Per edifici più oggetti che rappresentano le mura e il tetto, variabile boolean per oggetto per entrare nell’oggetto. Possono essere spazzati via: danni da crollo, si può combattere all interni, contengono strumenti come tavoli sedie mobili letto ect. Se uno viene schiantato contro uno strumento prende danno(es danno da schianto). Ci possono essere scale, si può non avere contatti visivo sull’avversario. Oggetto mura, oggetto torre, oggetto casa interno sono cose distinte: possono dare malus/bonus su visibilità. Ambiente: pozzi e grotte, da gestire come interno casa. Lava come acqua, ogni oggetto può essere sorgenti di liquido: monte sorgente acqua, vulcano sorgente lava. Può esserci variabile probabilità eruzione, se settata a 1 c’è una continua eruzione. Strade di vario tipo, sovrapposta a altri suoli, migliorano velocità di alcuni strumenti, variabile boolean “ha le ruote” in classe strumenti. Unificare classe strumento e classe oggetto. Oggetti sospesi: case sospese su albero, ad es. Fiamme in mezzo al suolo. Oggetti: porto, aereoporto, grattacieli, dighe, impianti a fune, ospedali per curarsi e prendere oggetti per curarsi dopo, scuole contenenti libri per apprendere una mossa, luoghi di ingegneria per creare oggetti, ad esempio veicoli o armi, soldi nel gioco per comprare da eventuali venditori. Ogni oggetto avra un prezzo (valutabile circa in euro per semplicità). Variabile float per fame, sete, sonno, caldo-freddo (parte da 0.5). Nella mappa ci deve essere per ogni punto la temperatura. Possibilità di vomito, dissenteria, problemi cardiaci, respiratori, muscolari. Armi: balestra, mani nude, sasso, tirapugni, torcia accesa. Armature: intralciano o favoriscono agilità, attacco, poteri magici, rumorosa (elusione), è uno strumento/oggetto. Attacchi possono essere prolungati per turni, mosse variabile boolean prolungabile: può aumentare o diminuire intensità, c’è un max espresso in turni di prolungabilita, inoltre può essere leggermente alterato con una variabile casuale. Equipaggiamento (strumento/oggetto): pietra focaia, attrezzi da scalata, boccale di birra, cavallo, moto, chiodi, martello da fabbro, corda, corazza, dardo, faretra/zaino/sacca (oggetti che contengono una lista di oggetti, stringhe) con un numero per la quantità) e capacità massima zaino e ogni oggetto può avere un valore intero per dimensione (es martello 3, ascia grande 7), mantello, olio, variabile boolean prende fuoco/conduce elettricità, amplifica magnetismo, aumenta esplosioni nucleari, aumenta forza di gravità (?), pala, piccone, rampino, specchio, per osservare quando si è nascosti e si ha malus su visibilità. Strumenti da scasso per aprire porte: variabile boolean per oggetti: entrata con scasso. Personaggio: string razza per swag, immunità a veleni e malattie, elusione, agilità, precisione, abilità magiche(?), difesa fisica. In ultima torcia: agilità, coraggio, forza, intelligenza, magia, manualità, percezione, socialità. Bestiario: aracnoide di varie dimensioni, talpe giganti, vermi giganti di terra di mare e di lava ect, bulbo trascinatore che ha tentacoli per tirare a se e mangiare, lui è immobile, calabrone gigante, serpenti giganti, cinghiali, draghi, elfi, goblin e re goblin, sciamani (goblin), totem di guerra come strumento/oggetti per alterare statistiche nella loro area di influenza, lupo, mastino bruciante, nani, non morti/zombie/mummia/scheletro variabile boolean vivo a false ma ha ancora hp su parti del corpo: variabile boolean “zombizabile”. Orchi, pesci da terra (anfibi) tritone dell abisso, troll e trollin (orchi più deformi), umani. Abilità dei personaggi in ultima torcia: artificiale (robot) immunità a soffocamento, veleni, malattie ect immune a manipolazioni psichiche, visione oscurità; danno da attacco in carica; fiammegiante ossia la creatura può incendiarsi e elettrizzante ossia può diventare elettrica caricamente; modalità furia/mailmen ossia ottiene bonus su alcune/tutte le statistiche; gigantesco o molto piccolo due boolean (?forse non serve); immunità a magie mentali, al fuoco; linguaggi (?); non morto; danno da attacco in presa; pungiglioni velenosi; sa muoversi su ragnatele o è rallentato, resistenza a perforazione, respirare sott’acqua o sotto lava o nei liquidi in genere; rigenerazione; riceve danni dalla luce solare o da assenza di luce; è terrorizzato/impaurito/intimidito o se è imperturbabile boolean. Danno da trascinamento; paralizzante; può diventare più veloce (?non serve); visione a infrarossi attraverso oggetti; volare o andare sotto terra. Imperium editor, cose che penso di non aver ancora scritto: stagioni, suolo erboso o terriccio, sabbia con erba e terra e da sola, strade e stagioni, altitudine, alberi e arbusti, vari tipi a foglia larga, conifere, alberi secchi, palme, arbusti verdi e secchi, cactus, alghe marine, rocce e pietre, scheletri per terra, legna tagliata (alberi tagliati), carri e carretti, grotte e rovine per accessi sotterranei, locande, templi, accampamenti, fortini, monoliti, fontana, tombe e cimiteri, borse per terra, pozzo, troni, croci(del teschio), pozzo, capanne, lapidi, ponti, recinzioni, falò, tende, torri, panoplia, fessure come abissi, statue, rovine (deserto) come case distrutte, colonne per costruire templi, piramidi, sfingi, bandiere, rovine in Europa, campi coltivati che contengono cibo, fiamma (in altre), roccia in altre per montagne, altre-&amp;gt;rovine per monumenti non egiziani ma europei.&lt;br /&gt;
Ci sono paludi. Tende da campo. Forti, porti. Edifici delle fortezze, edifici dei villaggi. Naufragi e scogli.&lt;br /&gt;
Parametri voglia/impegno float per descrivere voglia di combattere Personaggio. Ricevi danno uscendo dalla mappa tra 1-5% tra 6-10% tra 11-15% della vita totale di ogni parte del corpo per ogni turno di gioco. Danno da precipitazione diverso da carica, uno verticale uno orizzontale, se precipiti da molto in alto hai bonus, oltre che danni da schianto lol. Baionette, formazione a blocchi, a quadrato (difensiva) sparano su quattro lati, a schiera vanno avanti. Usano un colpo poi lunga ricarica. Variabile boolean per attivare o meno fuoco amico. Azione per cambiare posizione: in piedi, in ginocchio(inteso come via di mezzo), sdraiato: per permettere migliore visibilità a chi è dietro (nella formazione).&lt;br /&gt;
Altruismo, coraggio, spingere oltre il limite, difendere al posto di un altro, migliorare posizione per avere bonus. Mosse da usare in condizioni psicologiche idonee: mosse estreme per disperazione, bonus unici. Condizioni per situazioni: blocco, spalle al muro, stritolato, confuso, semi parassiti addosso, azzoppato, bagnato d’acqua, lame affilate, corazza indurita, tante copie di me stesso attive, preveggente. Per ambiente:pioggia (torrenziale), barriera a cupola, punte metalliche a terra, blocco di fumo nero. Far volare un avversario/alleato. Tutti possono fare tutto sotto effetti magici o fisici. Un cavallo può volare se viene preso da un uccello e portato in alto.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 3, 4:'''&lt;br /&gt;
&lt;br /&gt;
Gioco1,2,3,4: tutto caricato su wikis.&lt;br /&gt;
&lt;br /&gt;
Gioco3: Mosse con caricamento + spostamento (es. kameamea con teletrasporto). Ciclo di interazione principale:crea o combatti. Modalità campagna, che chiede in input da che battaglia iniziare, ma implica tipi battaglie prefissati. Alla morte/sconfitta di un personaggio si possono alterare statistiche (es personaggio può cambiare fazione). Alcune mosse possono lasciare oggetti sul terreno: (ad es, radici di Groth). Ogni oggetto può alterare le statistiche al passaggio sopra, nelle vicinanze. Boolean invisibile per personaggio, diverso da elusione infinita. Se personaggio va in un altro dimensione -&amp;gt; unreachable. Attacco coordinato, se non lo fanno tutti vale lo stesso ma depotenziato opportunamente . Personaggio in modalità maniac (2 mosse per turno) e in modalità depressive (1 mossa ogni due turni); personaggio Flash può fare 10 mosse in un turno. Chiudi con lucchetto oggetto da dentro o da fuori, oggetto ingresso in oggetto casa , più ingressi per un singolo oggetto.nicole aniston. Rimbalzo se ci si schianta contro oggetto da calcolare con parametro. Ryuk e Darkrai.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gioco 4 23/07/2019:&lt;br /&gt;
Pula fiction, aracnidi, oggetto: due superfici rettangolari di forma diversa, anche inclinate , collegate. Più pezzi collegati tra loro per forme cilindriche cave, ad esempio, tipo vulcano. Mappa con sprite personaggi, canvas: anche mouseClick? Statistiche con nome gerarchico, es pokemon_attacco. Modalità survival, stile isola di jurassic park gdr; sia in coop che contro; possibilità di fare N turni di fila se non ci sono altri player giocanti nelle vicinanze (ciò però comporterebbe , in modalità contro , di capire quando c’è qualcuno nelle vicinanze perché si andrebbe di 1 turno alla volta, soluzioni: in mod contro 1 turno per volta oppure meccanismo di sincronizzazione turni quando uno vede l’altro (anche furtivo) come c’è attacco 1 turno a testa) .. analogo a Battle royale(?); inizio con starter kit random. Modalità assedio al castello. Inoltre se posso fare N turni di fila si può pensare a più pc , uno per persona , coordinati per fare comandi in parallelo, ma va ben congegnato meccanismo di sincronizzazione. Parti DelCorpo -&amp;gt; Componente/i oppure Parte. La mappa deve essere (x,y); l’altezza viene indicata onMouseOver certi pixel dove è posto il Personaggio; se personaggio dentro edificio/grotta cambio img (es sfocato/tratteggiato). Mosse: astrarre per target; molte mosse sono simili tra loro, somiglianza va sfruttata, hanno magari dei target in comune, o variano solo per un parametro. Creare mappa anche con drag and drop immagini ?(un po’ difficile). Più layout per interfaccia grafica (esempio uno che mostra errori input su text area, uno con alert, uno su box text area separato). Input comandi consumato pezzo per pezzo, alcune parole se prevedono parametri quando riconosciute fanno fetch anche di parola (numero) successiva. Face toon foto? Import parziali di personaggi (tutto tranne/solo questi campi specificati). Texture mappa complete o ripetibili (es per suolo). Anteprima battaglia stile battaglia pokemon (magari per 1/2/3 vs 1/2/3) per rappresentare scontro. Conviene usare xslx (excel) per dati, considerare che può non servire la libreria Java per leggere stringhe per operazioni. Mossa “again” , ripeti la precedenza(opportuna modifica parametri, es mossa spostamento). Possibile gestione contromosse: si usano marker (tag): ogni mossa ha elenco tag del tipo di contromosse che può subire (con probabilità annessa, che può dipendere da pg che subisce mossa congiuntamente a mossa stessa). Ogni mossa inoltre deve essere taggata come possibile contromossa che il pg può usare (per schivare può fare in più modi). A seconda del lancio del dado il pg che effettua La contromossa può anche scegliere tipologia di contromossa o solo la mossa della tipologia che ha beccato (entrano in gioco riflessi ect.). I parametri che fanno attivare unq o un’altra contromossa sono dinamici, posso dipendere ad esempio dalla posizione tra i due pg o altre statistiche. Tag contromosse a fasce (es. coprirsi è sempre più facile che schivare che e più facile di schivare e contrattaccare (?); all’interno dello stesso schivare e contrattaccare ci sono più sotto categorie). Per aggiunta personaggio può essere utili interfaccia dedicata, non linea di comando (o altre operazioni, specie se ci sono tabelle). Mossa “premonizione”: predire il futuro a breve termine, dici che mossa vorresti fare e ti dice esito (o più esiti se uno chiede più mosse). Funziona solo sulla prossima mossa. Contromossa delle contromossa gestione?? Eventualmente nell’esito si prevede ancore contro-contromossa. Ma si innesca reazione a catena, inoltre da gestire scelta contromossa in questo caso. Applicazione tag conoscenza(universo di appartenenza): “Termoli”, “pokemon”, “liceo classico Termoli”, anche gerarchici, per filtrare sui personaggi.target componibili , fattorizzato creazione mosse, hanno un costo magari per indicare quantovoccupano dicuna mossa, relativo maybe a un parametro o più del target stesso. In particolare, non saranno salvate le mosse per un personaggio (o solo alcune “preferite”) ma il suo insieme di target i quali devono dire:statistica che influenzano, “costo del turno” che richiedono al variare dell’intensità del target (che aumenta linearmente, esponenzialmente, generica f(x)) quindi corsa blanda costo 1 , Max corsa costo 5 (max), elenco (string) target incompatibili con tale target (se serve), nota relative ad es per quando uno vuole creare una mossa durante la battaglia (“target corsa, max sforzo dedicabile 4 ect” metti “50 metri corsa” “ok/troppo! Vuoi sforzati di più rischiando effetti collaterali?”). Si può autoscrivere la voce narrante del gioco come “la tua coscienza” mentre che giochi, d’altronde si interagisce con essa. Considerare che un target può appartenere a più personaggi, magari sotto nomi di mosse diversi.&lt;br /&gt;
Definire gerarchia di personaggi per template (tipo classe e super classe) e template importabili (tipo usa fuoco). Es umanoide non umanoide, tra umanoide maschio- femmina etc. Classe che estende System.out per creare funzioni che aggiungono Header “DEBUG:” etc; due programmi Java , due main: uno delegato a calcoli + gestione Excel; altro legge stdout dell altro per interfaccia grafica. Per allenare PG creare dei PG fantocci con label per fare Q-learning iniziale, più avanti far allenare pg tra loro; creare vari fantocci: tank terrestre fisico, healer volante etc. Excel: si usa css che si può rendere tabellare, più facile da trattare nel codice rispetto a .xslx. Ogni “utente” ed Lostefra ha il suo personale dizionario con sue personali short cut da usare in partita, eventuale login con password (opzionale) x accesso. Vedere license show down. Mappa unica stile giochi di ruolo, si vede tutto da sopra: click o simili su edifici/caverne per mappe interne a tale posto, così ok sprite e per rappresentare “pg in volo” sprite dedicato. Densità aria per dire quando anche un uomo per es può volare. Ipotesi più efficiente per dare un valore stima al pg: AI base che gioca a manetta contro altre AI base e dalle vittorie si fa l’euristica, più vittoria facile/veloce/stracciante più punti, contro vari pg, contro pg standard bench mark.&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Note&amp;diff=199</id>
		<title>Note</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Note&amp;diff=199"/>
		<updated>2020-05-27T12:17:17Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: /* Deploy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Note ==&lt;br /&gt;
&lt;br /&gt;
'''Vedere altre note su fogli di carta e promemoria del telefono. Ce ne sono molte.'''&lt;br /&gt;
'''La copiatura dai fogli di carta dei continuare da pagina 4 (&amp;quot;alterare param..&amp;quot;).'''&lt;br /&gt;
&lt;br /&gt;
===Inspirational Concepts===&lt;br /&gt;
* Gioco Lotta (Pokémon, Pokkén)&lt;br /&gt;
* no caselle esplicite&lt;br /&gt;
* Descrizione rispetto a: ambiente, nemico, oggetti&lt;br /&gt;
* pokémon, DnD, Call of Duty, Super Smash Brawl, corse pazze&lt;br /&gt;
* concentrarsi su: fluidi, telecinesi, razze, bonus/malus, gradi di libertà (fisicamente parlando) &lt;br /&gt;
* scacchi (es. crea casella), shaolin showdown&lt;br /&gt;
* prevedere = creatività&lt;br /&gt;
* acqua, aria, fuoco, terra&lt;br /&gt;
* gravità (newton), verso alto, basso, destra, sinistra, circolare, tutti i versi&lt;br /&gt;
* jumanji, savana, animali, zoologia&lt;br /&gt;
* tempo/spazio&lt;br /&gt;
* BF4, pirati, roma (imperium civitas)&lt;br /&gt;
* musica come arma (rap)&lt;br /&gt;
* magia, prestigiatori&lt;br /&gt;
* dinosauri (documentario, libro, zoologia)&lt;br /&gt;
* avengers, supereroi (libro)&lt;br /&gt;
&lt;br /&gt;
* Looney toons&lt;br /&gt;
&lt;br /&gt;
===Personaggi (con statistiche e stati)===&lt;br /&gt;
* combattenti (con statistiche e stati)&lt;br /&gt;
* immagine rappresentativa per rappresentare meglio&lt;br /&gt;
* HP: colore rosso su immagine personaggio, dove sei debole/già colpito (idea scartata)&lt;br /&gt;
* penitenza: il malus può essere inteso come ciò che c'è nell'inserimento successivo, malus cumulativo&lt;br /&gt;
* essere ipocrita, finzione (schermo)&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (personaggi)&lt;br /&gt;
* metamorfosi&lt;br /&gt;
* alchimisti&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* possibilità giù in terra/ giù in acqua, con reachable e unreachable Boolean. Fuori da mappa anche reachable e unreachable.&lt;br /&gt;
* Personaggi composti di parti[] es. testa, busto, gambe, braccia, coda, pinna, ali. Distinzione per arto di movimento e/o spostamento boolean.&lt;br /&gt;
* Arti possono provocare danno, bruciatura , paralisi a contatto (Boolean) . Percentuale di probabilità accompagna ogni Boolean.&lt;br /&gt;
* Ogni parte del corpo punti vita + se inutilizzabile + amputata + stato (es paralisi).&lt;br /&gt;
* Per fare battaglie tra molto grandi =&amp;gt; 1 m lo si intende come 10m.  (rivalutato, aumentare livello scaling)&lt;br /&gt;
* Personaggio fusionabile Boolean + string nomi con cui si fonde.&lt;br /&gt;
* Distinzione tra infernape e infernape1/2/3 ect tra “specie” e “nome”.&lt;br /&gt;
* variabile Boolean respawnable.&lt;br /&gt;
* Raccogliere a piene mani da: https://spore.fandom.com/wiki/Creature_Editor&lt;br /&gt;
* Ad esempio weapons come elemento di Corpo (zanne, corna) e possibilità di muoversi/attaccare furtivamente.&lt;br /&gt;
* Divisibile e unibile come boolean e array di stringe associate per indicare i nomi con cui si unisce il Personaggio o in cui si divide.&lt;br /&gt;
* Variabili posizione nome: from_x/y ; to_x/y.&lt;br /&gt;
* Classe Stato, Personaggio contiene Array di stato, stato contiene moltiplicatori per statistica es attacco velocità precisione elusione ect.&lt;br /&gt;
* Personaggio deve avere una stat tipo sanità mentale, intelligenza, quanto è confuso e quanto è impaurito (2).&lt;br /&gt;
&lt;br /&gt;
* Per personaggi molto piccoli (meno di 1m x 1m x 1m) possibilità di essere in (x,y,z) tra 0 e 1.000.000 (ordine del micrometro, 1*10^-6 == 0,000001) e avere (lenX, lenY, lenZ). In questo modo sono definite dimensioni inferiori ad 1 m^3.&lt;br /&gt;
* personaggi max 20x20 (rivaluato, meno limitata)&lt;br /&gt;
&lt;br /&gt;
===Mosse===&lt;br /&gt;
* &amp;quot;combattimento prescinde da combattente&amp;quot;&lt;br /&gt;
* mosse hanno: direzione, azione, attacco (mosse pokémon)&lt;br /&gt;
* Parametri interi per mossa (direzione, consumabili) con lower e upper bound&lt;br /&gt;
* camuffarsi =&amp;gt; DnD manuale&lt;br /&gt;
* wrestling (libro) per le mosse/prese&lt;br /&gt;
&lt;br /&gt;
* X fa una mossa contro Y: Z potrebbe reagire (Es. ricevendo il colpo al posto di Y). Può essere realizzato sia come se &amp;quot;Y chiede soccorso Z&amp;quot; o come reazione di alleati adiacenti &amp;quot;Z soccorre Y&amp;quot;&lt;br /&gt;
* Mossa prende come parametro di ingresso Corpo, ossia la parte del corpo coinvolta nella mossa (es arto , tutto corpo ect). &lt;br /&gt;
&lt;br /&gt;
===Oggetto (con statistiche e stati)===&lt;br /&gt;
* armi: lacci (stati), lame (potenze), sassi, reti, pistole (munizioni), razzi, bombe (potenze), fuoco (d'artificio?) =&amp;gt; manuale DnD&lt;br /&gt;
* veleno n modi =&amp;gt; DnD manuale&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (oggetti)&lt;br /&gt;
* automezzi con cannoni, variabile 'hasEntrata', 'tempoRiutilizzo'&lt;br /&gt;
* violino come arma (tutti strumenti musicali): a fiato, a corda, a percussione&lt;br /&gt;
* veleni, ampolle e flaconi magici, insieme di 'oggetti dentro' un oggetto&lt;br /&gt;
&lt;br /&gt;
* Classe oggetto: es albero, roccia, casa: forza necessaria per sradicare + forza per lanciare + destrezza / agilità per appendersi + nascondersi in proporzione alle dimensioni di chi si nasconde. &lt;br /&gt;
* Altri es. pali. Sotto terra o sotto acqua/lava/melma o simili. &lt;br /&gt;
* Acqua rallenta se non hai pinne boolean.&lt;br /&gt;
* Classe strumento per oggetti che si tengono in mano, es reti , pistole, spade, pugnali, scudi, elmi, lancia, arco , frecce, lanciarazzi, fucili cecchino, fucile assalto, corde.&lt;br /&gt;
* Strumenti e mosse: danno ad area, perforante, contundente (vedi dnd armi). Mosse possono creare/modificare/distruggere oggetti e strumenti.&lt;br /&gt;
* Oggetti del campo di gioco incidono su elusione (parametro di personaggio).&lt;br /&gt;
* Buco/abisso (boolean) per dire se c’è o meno il suolo (Suolo come classe?). &lt;br /&gt;
* Radiazioni. &lt;br /&gt;
&lt;br /&gt;
===Modalità gioco===&lt;br /&gt;
* turnazione&lt;br /&gt;
* 1 v 1 v 1 etc., ma anche squadre casuali&lt;br /&gt;
* punteggio: chi fa più punti, più uccisioni, definizione di 'punto', gioco per perdere&lt;br /&gt;
* inserisci personaggio total random&lt;br /&gt;
&lt;br /&gt;
* Modalità battaglia con interazione stile battaglia navale (non si vede mossa dell'avversario)&lt;br /&gt;
* Modalità di gioco: tutti contro tutti (battle royale), death match, vs CPU mode zombie(attaccano solo, se non possono vanno verso nemico): serve introdurre un punteggio, di sicuro per mode zombie , ma anche per death match e tutti contro tutti&lt;br /&gt;
* ingressi: ne entra un altro?&lt;br /&gt;
&lt;br /&gt;
===Mappa===&lt;br /&gt;
* arene&lt;br /&gt;
* minimappa (pixelata ?), legenda oggetti base, devono esserci caselle implicite&lt;br /&gt;
* mappa 100x100 (rivalutato, meno limitata)&lt;br /&gt;
* Cannoni fissi in mezzo al campo (strumento).&lt;br /&gt;
&lt;br /&gt;
===Funzionalità generali===&lt;br /&gt;
* Chiave: non una flat input box per i comandi; ma dinamica: si suppone il soggetto &amp;quot;io&amp;quot; (le azioni le fanno in prima persona i personaggi), ogni mossa deve prevedere dei complementi (&amp;quot;verso&amp;quot;, &amp;quot;tra quanto&amp;quot;, &amp;quot;cosa&amp;quot;, &amp;quot;a favore di chi&amp;quot;, &amp;quot;contro chi&amp;quot;). Ogni complemento collegato con box stile in pop up =&amp;gt; bootstrap (la grafica sara unica). Prevedere anche modalita flat con input del tipo &amp;quot;azione a=pippo verso=termoli&amp;quot; (regex check)&lt;br /&gt;
* &amp;quot;meno tabelle&amp;quot;, &amp;quot;no bottoni&amp;quot; e solo foto che si alternano, &amp;quot;la grafica serve&amp;quot;: text box unica interazione, text area (history), immagine personaggio e immagine mappa&lt;br /&gt;
* &amp;quot;persistenza anche da interfaccia grafica&amp;quot;, diritti di scrittura sui file?&lt;br /&gt;
* Segnalazione (comando per fare nota)&lt;br /&gt;
&lt;br /&gt;
===Deploy===&lt;br /&gt;
* &amp;quot;commenta il codice&amp;quot;, &amp;quot;dividi et impera&amp;quot;&lt;br /&gt;
* Server web (Apache) ospita partite (+ localmente ha i file di funzionamento), in LAN client giocano o da remoto con IP pubblico. Interfaccia HTML5 + Javascript per giocare. Studiare engine grafici Javascript&lt;br /&gt;
* bootstrap! (specie per input box)&lt;br /&gt;
* Unity, WebGL (vedi SDK dedicata, built per Android/iOS/etc.)&lt;br /&gt;
* Modelli 3D videogiochi: https://www.models-resource.com/ , meglio se disaccoppiati da Unity (e.g. in cartelle independenti), aggiunta modelli online&lt;br /&gt;
* Tutorial tank Unity: https://learn.unity.com/project/tanks-tutorial ; modelli: https://opengameart.org/&lt;br /&gt;
* WebSocket per gestire client asincroni (NodeJS ?)&lt;br /&gt;
* Su YT in “guarda più tardi” video per interagire unity con JS (“unity.sendMessage()” o simili)&lt;br /&gt;
* Due client: uno con WebGL e uno JS base con solo input (per test, per mancanza di supporto browser a WebGL). Eventualmente 3 client: 1 base (JS puro con qualche immagine al più), 1 WebGL+Unity 2D (grafica pixelata), 1 WebGL+Unity 3D (informazioni di input per mirare, ad es., in base a dove punto nello schermo. Qualcosa di simile anche per 2D). Tutti i client stessi JSON per comunicare al server!&lt;br /&gt;
* photogrammetry, https://medium.com/realities-io/getting-started-with-photogrammetry-d0a6ee40cb72&lt;br /&gt;
&lt;br /&gt;
==== Altro (scartato)====&lt;br /&gt;
* rpgmaker, godot, aseprite, pixelart (in generale), ma anche phaser, piskel&lt;br /&gt;
* joomla! Per far prima con html&lt;br /&gt;
* libreria pygame&lt;br /&gt;
* Vuegg: https://github.com/marketplace/vuegg  &lt;br /&gt;
* Material Design&lt;br /&gt;
* JAVA: Class.forName(&amp;lt;name&amp;gt;.class).newInstance();&lt;br /&gt;
&lt;br /&gt;
===Copia&amp;amp;incolla generale, da smistare in sotto capitoli. Contiene anche '''tutte''' note del telefono (al 22/02/2020)===&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 1:'''&lt;br /&gt;
&lt;br /&gt;
Mosse che trasformano l’avversario: attenzione è una mossa devastante. Trasformazione totale o parziale. Si devono poter aggiungere mosse, strumenti dinamicamente. Battle bot:ribaltano, scintille, elementi (Oggetti) che danneggiano. One piece: I frutti del diavolo (悪魔の実 Akuma no mi?) sono frutti misteriosi che donano poteri soprannaturali a chi li mangia, rendendoli però incapaci di nuotare. Di conseguenza il contatto con l'acqua di mare o con una speciale sostanza conosciuta come agalmatolite indebolisce gli utilizzatori di frutti del diavolo e li priva dei loro poteri. Alcune persone sono inoltre in grado di ricorrere all'Ambizione (覇気 Haki?), una forza spirituale che permette di avvertire la presenza di altri esseri viventi e di predirne i movimenti, di irrobustire parti del corpo e di intimidire o fare svenire le creature con una debole forza di volontà. Personaggio ha funzione baricentro_x, baricentro_y calcolate come (from_x+to_x)/2 sul quale si basa la funzione di libreria getDistance(Personaggio A, Personaggio B, float success); tale funzione serve per calcolare per i PNG e per i PG se ha senso usare una mossa. Non-onniscienza: delle volte non si può sapere distanza avversario e fallisce la mossa per la distanza -&amp;gt; “float success” rappresenta la probabilità di successo (Personaggio ha parametro “osservare”). PNG di due categorie: offensivi o neutrali (no priorità a mosse di attacco, ma tutto casuale). Mosse e oggetti per chiamare Personaggi, magari non necessariamente alleati (2 mosse e 2 oggetti quindi necessari), richiamo di un personaggio preciso o di uno a caso. Ogni mossa/azione deve avere un tempo di attesa espresso in turni (alla meglio 0) per poter ripetere la mossa/azione. Strumenti anche mezzi di trasporto di aria, di terra, di acqua (o lava/palude). Possono attivare una metamorfosi / Unione per cambiare stats personaggio. Veicoli con armi o riparo. Gli strumenti da trattare come gli oggetti. Classe unica? I match/partite (immagino Classe Partita) devono avere variabile boolean “respawn”, per distinguere death match a punti con death match con una vita. Wrestling per ispirarsi nella lotta libera: calci pugni ginocchiate prese lanci salti testate gomitate ecc. Per punti si vince a un limite o dopo un tot di mosse , oppure al primo dei due raggiunti (max_punti e max_mosse parametri di Partita). I punti si guadagnano alla kill (un Punteggio per squadra, int punteggio salvato localmente dentro ogni Personaggio che ha la variabile int squadra). Si guadagnano tanti punti quanti sono i punti della variabile “valore” del personaggio ucciso, tale variabile è calcolata come somma dei valori di tutte le mosse/stats ect del Personaggio. Imperium civitas. Attacco dei giganti. Possibilità di morire se colpiti in un unico punto (tallone d Achille) implementabile come variabile boolean. Jump force. Game dev tycoon. Acqua diventa tsunami. Variabile int per attacco cumulativo di gruppo: es calciatori che più si passano la palla più l’attacco è forte. Suolo magico: non tutti i personaggi possono accedervi, array di string elenca i nomi di chi può accedervi. Funzione esci/entra in classe Personaggio per simulare scambio pokemon 6vs6. Piovra gigante. Rischio=danno*probabilita. Mossa su strumento e con strumento?&lt;br /&gt;
Mosse fisiche per arrampicarsi su avversario(se e solo se sei la metà di dimensioni(?)), atterrarlo, lanciarlo, accecarlo, immobilizzarlo. Se sei in gruppo/ orda bonus ad attacchi combinati. Armi: fruste e scheggie, corni che si suonano per chiamare altri. Tipo della mossa con moltiplicatore tra 0 (immune) e 2 (float): acqua, fuoco, magia, terra: da ispirarsi ai pokemon ma non da copiare, penso. Armi da campo: cannoni e catapulte. Veicoli d’acqua: moto acqua, canoe, barche a motore a remi. Nei veicoli malus su attenzione (variabile int in personaggio, indica attenzione in combattimento e non in altro) perché si è impegnato alla guida . All’inizio in image view “the hero” e “the map”. Condizione vittoria (oltre a morte, punti, o numero mosse, cioè tempo) morte di un singolo Personaggio, che potrebbe rappresentare un edificio, cassaforte o simili. Personaggio si può svestire e lasciare strumenti, modificano statistiche di attacco, difesa , agilità, ect. Variabile luce o non luce, che peggiora/migliora a seconda della specie la visibilità, quindi la precisione , specie in attacchi a distanza: Scurovisione evita i malus.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 2:'''&lt;br /&gt;
&lt;br /&gt;
Gioco2: se ci si lancia da oggetti , dopo essersi arrampicati, possono esserci danni da caduta; strumenti come paracaduti o mosse magiche possono evitare i danni. Pozione del vento, soffi e devi attacchi. In difesa puoi parare, schivare, deviare: tre variabili? Ambiente: colline e pianure uguali, Monti sono Oggetti, picco ossia un unico monte oggetto. Rocce volanti, nuvole sospese: oggetto può essere sospeso e può fare periodicamente una mossa, ad es tuono, può spostarsi, può fare entra/esci, oggetto albero e oggetto foresta, si possono prendere, nascondersi, arrampicarsi, lanciarli, ostacolano velocità ma se si ha abbastanza forza si spezzano alberi. Acqua poco profonda, profonda, molto profonda: variabile boolean in Personaggio “alto” per toccare in acqua profonda, con acqua si generano fiumi laghi e mari. Ambiente si deve poter evolvere: ad esempio oggetto diga può fare metamorfosi e diventare oggetto cascata/torrente in piena. Per edifici più oggetti che rappresentano le mura e il tetto, variabile boolean per oggetto per entrare nell’oggetto. Possono essere spazzati via: danni da crollo, si può combattere all interni, contengono strumenti come tavoli sedie mobili letto ect. Se uno viene schiantato contro uno strumento prende danno(es danno da schianto). Ci possono essere scale, si può non avere contatti visivo sull’avversario. Oggetto mura, oggetto torre, oggetto casa interno sono cose distinte: possono dare malus/bonus su visibilità. Ambiente: pozzi e grotte, da gestire come interno casa. Lava come acqua, ogni oggetto può essere sorgenti di liquido: monte sorgente acqua, vulcano sorgente lava. Può esserci variabile probabilità eruzione, se settata a 1 c’è una continua eruzione. Strade di vario tipo, sovrapposta a altri suoli, migliorano velocità di alcuni strumenti, variabile boolean “ha le ruote” in classe strumenti. Unificare classe strumento e classe oggetto. Oggetti sospesi: case sospese su albero, ad es. Fiamme in mezzo al suolo. Oggetti: porto, aereoporto, grattacieli, dighe, impianti a fune, ospedali per curarsi e prendere oggetti per curarsi dopo, scuole contenenti libri per apprendere una mossa, luoghi di ingegneria per creare oggetti, ad esempio veicoli o armi, soldi nel gioco per comprare da eventuali venditori. Ogni oggetto avra un prezzo (valutabile circa in euro per semplicità). Variabile float per fame, sete, sonno, caldo-freddo (parte da 0.5). Nella mappa ci deve essere per ogni punto la temperatura. Possibilità di vomito, dissenteria, problemi cardiaci, respiratori, muscolari. Armi: balestra, mani nude, sasso, tirapugni, torcia accesa. Armature: intralciano o favoriscono agilità, attacco, poteri magici, rumorosa (elusione), è uno strumento/oggetto. Attacchi possono essere prolungati per turni, mosse variabile boolean prolungabile: può aumentare o diminuire intensità, c’è un max espresso in turni di prolungabilita, inoltre può essere leggermente alterato con una variabile casuale. Equipaggiamento (strumento/oggetto): pietra focaia, attrezzi da scalata, boccale di birra, cavallo, moto, chiodi, martello da fabbro, corda, corazza, dardo, faretra/zaino/sacca (oggetti che contengono una lista di oggetti, stringhe) con un numero per la quantità) e capacità massima zaino e ogni oggetto può avere un valore intero per dimensione (es martello 3, ascia grande 7), mantello, olio, variabile boolean prende fuoco/conduce elettricità, amplifica magnetismo, aumenta esplosioni nucleari, aumenta forza di gravità (?), pala, piccone, rampino, specchio, per osservare quando si è nascosti e si ha malus su visibilità. Strumenti da scasso per aprire porte: variabile boolean per oggetti: entrata con scasso. Personaggio: string razza per swag, immunità a veleni e malattie, elusione, agilità, precisione, abilità magiche(?), difesa fisica. In ultima torcia: agilità, coraggio, forza, intelligenza, magia, manualità, percezione, socialità. Bestiario: aracnoide di varie dimensioni, talpe giganti, vermi giganti di terra di mare e di lava ect, bulbo trascinatore che ha tentacoli per tirare a se e mangiare, lui è immobile, calabrone gigante, serpenti giganti, cinghiali, draghi, elfi, goblin e re goblin, sciamani (goblin), totem di guerra come strumento/oggetti per alterare statistiche nella loro area di influenza, lupo, mastino bruciante, nani, non morti/zombie/mummia/scheletro variabile boolean vivo a false ma ha ancora hp su parti del corpo: variabile boolean “zombizabile”. Orchi, pesci da terra (anfibi) tritone dell abisso, troll e trollin (orchi più deformi), umani. Abilità dei personaggi in ultima torcia: artificiale (robot) immunità a soffocamento, veleni, malattie ect immune a manipolazioni psichiche, visione oscurità; danno da attacco in carica; fiammegiante ossia la creatura può incendiarsi e elettrizzante ossia può diventare elettrica caricamente; modalità furia/mailmen ossia ottiene bonus su alcune/tutte le statistiche; gigantesco o molto piccolo due boolean (?forse non serve); immunità a magie mentali, al fuoco; linguaggi (?); non morto; danno da attacco in presa; pungiglioni velenosi; sa muoversi su ragnatele o è rallentato, resistenza a perforazione, respirare sott’acqua o sotto lava o nei liquidi in genere; rigenerazione; riceve danni dalla luce solare o da assenza di luce; è terrorizzato/impaurito/intimidito o se è imperturbabile boolean. Danno da trascinamento; paralizzante; può diventare più veloce (?non serve); visione a infrarossi attraverso oggetti; volare o andare sotto terra. Imperium editor, cose che penso di non aver ancora scritto: stagioni, suolo erboso o terriccio, sabbia con erba e terra e da sola, strade e stagioni, altitudine, alberi e arbusti, vari tipi a foglia larga, conifere, alberi secchi, palme, arbusti verdi e secchi, cactus, alghe marine, rocce e pietre, scheletri per terra, legna tagliata (alberi tagliati), carri e carretti, grotte e rovine per accessi sotterranei, locande, templi, accampamenti, fortini, monoliti, fontana, tombe e cimiteri, borse per terra, pozzo, troni, croci(del teschio), pozzo, capanne, lapidi, ponti, recinzioni, falò, tende, torri, panoplia, fessure come abissi, statue, rovine (deserto) come case distrutte, colonne per costruire templi, piramidi, sfingi, bandiere, rovine in Europa, campi coltivati che contengono cibo, fiamma (in altre), roccia in altre per montagne, altre-&amp;gt;rovine per monumenti non egiziani ma europei.&lt;br /&gt;
Ci sono paludi. Tende da campo. Forti, porti. Edifici delle fortezze, edifici dei villaggi. Naufragi e scogli.&lt;br /&gt;
Parametri voglia/impegno float per descrivere voglia di combattere Personaggio. Ricevi danno uscendo dalla mappa tra 1-5% tra 6-10% tra 11-15% della vita totale di ogni parte del corpo per ogni turno di gioco. Danno da precipitazione diverso da carica, uno verticale uno orizzontale, se precipiti da molto in alto hai bonus, oltre che danni da schianto lol. Baionette, formazione a blocchi, a quadrato (difensiva) sparano su quattro lati, a schiera vanno avanti. Usano un colpo poi lunga ricarica. Variabile boolean per attivare o meno fuoco amico. Azione per cambiare posizione: in piedi, in ginocchio(inteso come via di mezzo), sdraiato: per permettere migliore visibilità a chi è dietro (nella formazione).&lt;br /&gt;
Altruismo, coraggio, spingere oltre il limite, difendere al posto di un altro, migliorare posizione per avere bonus. Mosse da usare in condizioni psicologiche idonee: mosse estreme per disperazione, bonus unici. Condizioni per situazioni: blocco, spalle al muro, stritolato, confuso, semi parassiti addosso, azzoppato, bagnato d’acqua, lame affilate, corazza indurita, tante copie di me stesso attive, preveggente. Per ambiente:pioggia (torrenziale), barriera a cupola, punte metalliche a terra, blocco di fumo nero. Far volare un avversario/alleato. Tutti possono fare tutto sotto effetti magici o fisici. Un cavallo può volare se viene preso da un uccello e portato in alto.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 3, 4:'''&lt;br /&gt;
&lt;br /&gt;
Gioco1,2,3,4: tutto caricato su wikis.&lt;br /&gt;
&lt;br /&gt;
Gioco3: Mosse con caricamento + spostamento (es. kameamea con teletrasporto). Ciclo di interazione principale:crea o combatti. Modalità campagna, che chiede in input da che battaglia iniziare, ma implica tipi battaglie prefissati. Alla morte/sconfitta di un personaggio si possono alterare statistiche (es personaggio può cambiare fazione). Alcune mosse possono lasciare oggetti sul terreno: (ad es, radici di Groth). Ogni oggetto può alterare le statistiche al passaggio sopra, nelle vicinanze. Boolean invisibile per personaggio, diverso da elusione infinita. Se personaggio va in un altro dimensione -&amp;gt; unreachable. Attacco coordinato, se non lo fanno tutti vale lo stesso ma depotenziato opportunamente . Personaggio in modalità maniac (2 mosse per turno) e in modalità depressive (1 mossa ogni due turni); personaggio Flash può fare 10 mosse in un turno. Chiudi con lucchetto oggetto da dentro o da fuori, oggetto ingresso in oggetto casa , più ingressi per un singolo oggetto.nicole aniston. Rimbalzo se ci si schianta contro oggetto da calcolare con parametro. Ryuk e Darkrai.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gioco 4 23/07/2019:&lt;br /&gt;
Pula fiction, aracnidi, oggetto: due superfici rettangolari di forma diversa, anche inclinate , collegate. Più pezzi collegati tra loro per forme cilindriche cave, ad esempio, tipo vulcano. Mappa con sprite personaggi, canvas: anche mouseClick? Statistiche con nome gerarchico, es pokemon_attacco. Modalità survival, stile isola di jurassic park gdr; sia in coop che contro; possibilità di fare N turni di fila se non ci sono altri player giocanti nelle vicinanze (ciò però comporterebbe , in modalità contro , di capire quando c’è qualcuno nelle vicinanze perché si andrebbe di 1 turno alla volta, soluzioni: in mod contro 1 turno per volta oppure meccanismo di sincronizzazione turni quando uno vede l’altro (anche furtivo) come c’è attacco 1 turno a testa) .. analogo a Battle royale(?); inizio con starter kit random. Modalità assedio al castello. Inoltre se posso fare N turni di fila si può pensare a più pc , uno per persona , coordinati per fare comandi in parallelo, ma va ben congegnato meccanismo di sincronizzazione. Parti DelCorpo -&amp;gt; Componente/i oppure Parte. La mappa deve essere (x,y); l’altezza viene indicata onMouseOver certi pixel dove è posto il Personaggio; se personaggio dentro edificio/grotta cambio img (es sfocato/tratteggiato). Mosse: astrarre per target; molte mosse sono simili tra loro, somiglianza va sfruttata, hanno magari dei target in comune, o variano solo per un parametro. Creare mappa anche con drag and drop immagini ?(un po’ difficile). Più layout per interfaccia grafica (esempio uno che mostra errori input su text area, uno con alert, uno su box text area separato). Input comandi consumato pezzo per pezzo, alcune parole se prevedono parametri quando riconosciute fanno fetch anche di parola (numero) successiva. Face toon foto? Import parziali di personaggi (tutto tranne/solo questi campi specificati). Texture mappa complete o ripetibili (es per suolo). Anteprima battaglia stile battaglia pokemon (magari per 1/2/3 vs 1/2/3) per rappresentare scontro. Conviene usare xslx (excel) per dati, considerare che può non servire la libreria Java per leggere stringhe per operazioni. Mossa “again” , ripeti la precedenza(opportuna modifica parametri, es mossa spostamento). Possibile gestione contromosse: si usano marker (tag): ogni mossa ha elenco tag del tipo di contromosse che può subire (con probabilità annessa, che può dipendere da pg che subisce mossa congiuntamente a mossa stessa). Ogni mossa inoltre deve essere taggata come possibile contromossa che il pg può usare (per schivare può fare in più modi). A seconda del lancio del dado il pg che effettua La contromossa può anche scegliere tipologia di contromossa o solo la mossa della tipologia che ha beccato (entrano in gioco riflessi ect.). I parametri che fanno attivare unq o un’altra contromossa sono dinamici, posso dipendere ad esempio dalla posizione tra i due pg o altre statistiche. Tag contromosse a fasce (es. coprirsi è sempre più facile che schivare che e più facile di schivare e contrattaccare (?); all’interno dello stesso schivare e contrattaccare ci sono più sotto categorie). Per aggiunta personaggio può essere utili interfaccia dedicata, non linea di comando (o altre operazioni, specie se ci sono tabelle). Mossa “premonizione”: predire il futuro a breve termine, dici che mossa vorresti fare e ti dice esito (o più esiti se uno chiede più mosse). Funziona solo sulla prossima mossa. Contromossa delle contromossa gestione?? Eventualmente nell’esito si prevede ancore contro-contromossa. Ma si innesca reazione a catena, inoltre da gestire scelta contromossa in questo caso. Applicazione tag conoscenza(universo di appartenenza): “Termoli”, “pokemon”, “liceo classico Termoli”, anche gerarchici, per filtrare sui personaggi.target componibili , fattorizzato creazione mosse, hanno un costo magari per indicare quantovoccupano dicuna mossa, relativo maybe a un parametro o più del target stesso. In particolare, non saranno salvate le mosse per un personaggio (o solo alcune “preferite”) ma il suo insieme di target i quali devono dire:statistica che influenzano, “costo del turno” che richiedono al variare dell’intensità del target (che aumenta linearmente, esponenzialmente, generica f(x)) quindi corsa blanda costo 1 , Max corsa costo 5 (max), elenco (string) target incompatibili con tale target (se serve), nota relative ad es per quando uno vuole creare una mossa durante la battaglia (“target corsa, max sforzo dedicabile 4 ect” metti “50 metri corsa” “ok/troppo! Vuoi sforzati di più rischiando effetti collaterali?”). Si può autoscrivere la voce narrante del gioco come “la tua coscienza” mentre che giochi, d’altronde si interagisce con essa. Considerare che un target può appartenere a più personaggi, magari sotto nomi di mosse diversi.&lt;br /&gt;
Definire gerarchia di personaggi per template (tipo classe e super classe) e template importabili (tipo usa fuoco). Es umanoide non umanoide, tra umanoide maschio- femmina etc. Classe che estende System.out per creare funzioni che aggiungono Header “DEBUG:” etc; due programmi Java , due main: uno delegato a calcoli + gestione Excel; altro legge stdout dell altro per interfaccia grafica. Per allenare PG creare dei PG fantocci con label per fare Q-learning iniziale, più avanti far allenare pg tra loro; creare vari fantocci: tank terrestre fisico, healer volante etc. Excel: si usa css che si può rendere tabellare, più facile da trattare nel codice rispetto a .xslx. Ogni “utente” ed Lostefra ha il suo personale dizionario con sue personali short cut da usare in partita, eventuale login con password (opzionale) x accesso. Vedere license show down. Mappa unica stile giochi di ruolo, si vede tutto da sopra: click o simili su edifici/caverne per mappe interne a tale posto, così ok sprite e per rappresentare “pg in volo” sprite dedicato. Densità aria per dire quando anche un uomo per es può volare. Ipotesi più efficiente per dare un valore stima al pg: AI base che gioca a manetta contro altre AI base e dalle vittorie si fa l’euristica, più vittoria facile/veloce/stracciante più punti, contro vari pg, contro pg standard bench mark.&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Note&amp;diff=198</id>
		<title>Note</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Note&amp;diff=198"/>
		<updated>2020-05-25T20:19:27Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: /* Deploy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Note ==&lt;br /&gt;
&lt;br /&gt;
'''Vedere altre note su fogli di carta e promemoria del telefono. Ce ne sono molte.'''&lt;br /&gt;
'''La copiatura dai fogli di carta dei continuare da pagina 4 (&amp;quot;alterare param..&amp;quot;).'''&lt;br /&gt;
&lt;br /&gt;
===Inspirational Concepts===&lt;br /&gt;
* Gioco Lotta (Pokémon, Pokkén)&lt;br /&gt;
* no caselle esplicite&lt;br /&gt;
* Descrizione rispetto a: ambiente, nemico, oggetti&lt;br /&gt;
* pokémon, DnD, Call of Duty, Super Smash Brawl, corse pazze&lt;br /&gt;
* concentrarsi su: fluidi, telecinesi, razze, bonus/malus, gradi di libertà (fisicamente parlando) &lt;br /&gt;
* scacchi (es. crea casella), shaolin showdown&lt;br /&gt;
* prevedere = creatività&lt;br /&gt;
* acqua, aria, fuoco, terra&lt;br /&gt;
* gravità (newton), verso alto, basso, destra, sinistra, circolare, tutti i versi&lt;br /&gt;
* jumanji, savana, animali, zoologia&lt;br /&gt;
* tempo/spazio&lt;br /&gt;
* BF4, pirati, roma (imperium civitas)&lt;br /&gt;
* musica come arma (rap)&lt;br /&gt;
* magia, prestigiatori&lt;br /&gt;
* dinosauri (documentario, libro, zoologia)&lt;br /&gt;
* avengers, supereroi (libro)&lt;br /&gt;
&lt;br /&gt;
* Looney toons&lt;br /&gt;
&lt;br /&gt;
===Personaggi (con statistiche e stati)===&lt;br /&gt;
* combattenti (con statistiche e stati)&lt;br /&gt;
* immagine rappresentativa per rappresentare meglio&lt;br /&gt;
* HP: colore rosso su immagine personaggio, dove sei debole/già colpito (idea scartata)&lt;br /&gt;
* penitenza: il malus può essere inteso come ciò che c'è nell'inserimento successivo, malus cumulativo&lt;br /&gt;
* essere ipocrita, finzione (schermo)&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (personaggi)&lt;br /&gt;
* metamorfosi&lt;br /&gt;
* alchimisti&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* possibilità giù in terra/ giù in acqua, con reachable e unreachable Boolean. Fuori da mappa anche reachable e unreachable.&lt;br /&gt;
* Personaggi composti di parti[] es. testa, busto, gambe, braccia, coda, pinna, ali. Distinzione per arto di movimento e/o spostamento boolean.&lt;br /&gt;
* Arti possono provocare danno, bruciatura , paralisi a contatto (Boolean) . Percentuale di probabilità accompagna ogni Boolean.&lt;br /&gt;
* Ogni parte del corpo punti vita + se inutilizzabile + amputata + stato (es paralisi).&lt;br /&gt;
* Per fare battaglie tra molto grandi =&amp;gt; 1 m lo si intende come 10m.  (rivalutato, aumentare livello scaling)&lt;br /&gt;
* Personaggio fusionabile Boolean + string nomi con cui si fonde.&lt;br /&gt;
* Distinzione tra infernape e infernape1/2/3 ect tra “specie” e “nome”.&lt;br /&gt;
* variabile Boolean respawnable.&lt;br /&gt;
* Raccogliere a piene mani da: https://spore.fandom.com/wiki/Creature_Editor&lt;br /&gt;
* Ad esempio weapons come elemento di Corpo (zanne, corna) e possibilità di muoversi/attaccare furtivamente.&lt;br /&gt;
* Divisibile e unibile come boolean e array di stringe associate per indicare i nomi con cui si unisce il Personaggio o in cui si divide.&lt;br /&gt;
* Variabili posizione nome: from_x/y ; to_x/y.&lt;br /&gt;
* Classe Stato, Personaggio contiene Array di stato, stato contiene moltiplicatori per statistica es attacco velocità precisione elusione ect.&lt;br /&gt;
* Personaggio deve avere una stat tipo sanità mentale, intelligenza, quanto è confuso e quanto è impaurito (2).&lt;br /&gt;
&lt;br /&gt;
* Per personaggi molto piccoli (meno di 1m x 1m x 1m) possibilità di essere in (x,y,z) tra 0 e 1.000.000 (ordine del micrometro, 1*10^-6 == 0,000001) e avere (lenX, lenY, lenZ). In questo modo sono definite dimensioni inferiori ad 1 m^3.&lt;br /&gt;
* personaggi max 20x20 (rivaluato, meno limitata)&lt;br /&gt;
&lt;br /&gt;
===Mosse===&lt;br /&gt;
* &amp;quot;combattimento prescinde da combattente&amp;quot;&lt;br /&gt;
* mosse hanno: direzione, azione, attacco (mosse pokémon)&lt;br /&gt;
* Parametri interi per mossa (direzione, consumabili) con lower e upper bound&lt;br /&gt;
* camuffarsi =&amp;gt; DnD manuale&lt;br /&gt;
* wrestling (libro) per le mosse/prese&lt;br /&gt;
&lt;br /&gt;
* X fa una mossa contro Y: Z potrebbe reagire (Es. ricevendo il colpo al posto di Y). Può essere realizzato sia come se &amp;quot;Y chiede soccorso Z&amp;quot; o come reazione di alleati adiacenti &amp;quot;Z soccorre Y&amp;quot;&lt;br /&gt;
* Mossa prende come parametro di ingresso Corpo, ossia la parte del corpo coinvolta nella mossa (es arto , tutto corpo ect). &lt;br /&gt;
&lt;br /&gt;
===Oggetto (con statistiche e stati)===&lt;br /&gt;
* armi: lacci (stati), lame (potenze), sassi, reti, pistole (munizioni), razzi, bombe (potenze), fuoco (d'artificio?) =&amp;gt; manuale DnD&lt;br /&gt;
* veleno n modi =&amp;gt; DnD manuale&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (oggetti)&lt;br /&gt;
* automezzi con cannoni, variabile 'hasEntrata', 'tempoRiutilizzo'&lt;br /&gt;
* violino come arma (tutti strumenti musicali): a fiato, a corda, a percussione&lt;br /&gt;
* veleni, ampolle e flaconi magici, insieme di 'oggetti dentro' un oggetto&lt;br /&gt;
&lt;br /&gt;
* Classe oggetto: es albero, roccia, casa: forza necessaria per sradicare + forza per lanciare + destrezza / agilità per appendersi + nascondersi in proporzione alle dimensioni di chi si nasconde. &lt;br /&gt;
* Altri es. pali. Sotto terra o sotto acqua/lava/melma o simili. &lt;br /&gt;
* Acqua rallenta se non hai pinne boolean.&lt;br /&gt;
* Classe strumento per oggetti che si tengono in mano, es reti , pistole, spade, pugnali, scudi, elmi, lancia, arco , frecce, lanciarazzi, fucili cecchino, fucile assalto, corde.&lt;br /&gt;
* Strumenti e mosse: danno ad area, perforante, contundente (vedi dnd armi). Mosse possono creare/modificare/distruggere oggetti e strumenti.&lt;br /&gt;
* Oggetti del campo di gioco incidono su elusione (parametro di personaggio).&lt;br /&gt;
* Buco/abisso (boolean) per dire se c’è o meno il suolo (Suolo come classe?). &lt;br /&gt;
* Radiazioni. &lt;br /&gt;
&lt;br /&gt;
===Modalità gioco===&lt;br /&gt;
* turnazione&lt;br /&gt;
* 1 v 1 v 1 etc., ma anche squadre casuali&lt;br /&gt;
* punteggio: chi fa più punti, più uccisioni, definizione di 'punto', gioco per perdere&lt;br /&gt;
* inserisci personaggio total random&lt;br /&gt;
&lt;br /&gt;
* Modalità battaglia con interazione stile battaglia navale (non si vede mossa dell'avversario)&lt;br /&gt;
* Modalità di gioco: tutti contro tutti (battle royale), death match, vs CPU mode zombie(attaccano solo, se non possono vanno verso nemico): serve introdurre un punteggio, di sicuro per mode zombie , ma anche per death match e tutti contro tutti&lt;br /&gt;
* ingressi: ne entra un altro?&lt;br /&gt;
&lt;br /&gt;
===Mappa===&lt;br /&gt;
* arene&lt;br /&gt;
* minimappa (pixelata ?), legenda oggetti base, devono esserci caselle implicite&lt;br /&gt;
* mappa 100x100 (rivalutato, meno limitata)&lt;br /&gt;
* Cannoni fissi in mezzo al campo (strumento).&lt;br /&gt;
&lt;br /&gt;
===Funzionalità generali===&lt;br /&gt;
* Chiave: non una flat input box per i comandi; ma dinamica: si suppone il soggetto &amp;quot;io&amp;quot; (le azioni le fanno in prima persona i personaggi), ogni mossa deve prevedere dei complementi (&amp;quot;verso&amp;quot;, &amp;quot;tra quanto&amp;quot;, &amp;quot;cosa&amp;quot;, &amp;quot;a favore di chi&amp;quot;, &amp;quot;contro chi&amp;quot;). Ogni complemento collegato con box stile in pop up =&amp;gt; bootstrap (la grafica sara unica). Prevedere anche modalita flat con input del tipo &amp;quot;azione a=pippo verso=termoli&amp;quot; (regex check)&lt;br /&gt;
* &amp;quot;meno tabelle&amp;quot;, &amp;quot;no bottoni&amp;quot; e solo foto che si alternano, &amp;quot;la grafica serve&amp;quot;: text box unica interazione, text area (history), immagine personaggio e immagine mappa&lt;br /&gt;
* &amp;quot;persistenza anche da interfaccia grafica&amp;quot;, diritti di scrittura sui file?&lt;br /&gt;
* Segnalazione (comando per fare nota)&lt;br /&gt;
&lt;br /&gt;
===Deploy===&lt;br /&gt;
* &amp;quot;commenta il codice&amp;quot;, &amp;quot;dividi et impera&amp;quot;&lt;br /&gt;
* Server web (Apache) ospita partite (+ localmente ha i file di funzionamento), in LAN client giocano o da remoto con IP pubblico. Interfaccia HTML5 + Javascript per giocare. Studiare engine grafici Javascript&lt;br /&gt;
* bootstrap! (specie per input box)&lt;br /&gt;
* Unity, WebGL (vedi SDK dedicata, built per Android/iOS/etc.)&lt;br /&gt;
* Modelli 3D videogiochi: https://www.models-resource.com/ , meglio se disaccoppiati da Unity (e.g. in cartelle independenti), aggiunta modelli online&lt;br /&gt;
* Tutorial tank Unity: https://learn.unity.com/project/tanks-tutorial ; modelli: https://opengameart.org/&lt;br /&gt;
* WebSocket per gestire client asincroni (NodeJS ?)&lt;br /&gt;
* Su YT in “guarda più tardi” video per interagire unity con JS (“unity.sendMessage()” o simili)&lt;br /&gt;
* Due client: uno con WebGL e uno JS base con solo input (per test, per mancanza di supporto browser a WebGL). Eventualmente 3 client: 1 base (JS puro con qualche immagine al più), 1 WebGL+Unity 2D (grafica pixelata), 1 WebGL+Unity 3D (informazioni di input per mirare, ad es., in base a dove punto nello schermo. Qualcosa di simile anche per 2D). Tutti i client stessi JSON per comunicare al server!&lt;br /&gt;
&lt;br /&gt;
==== Altro (scartato)====&lt;br /&gt;
* rpgmaker, godot, aseprite, pixelart (in generale), ma anche phaser, piskel&lt;br /&gt;
* joomla! Per far prima con html&lt;br /&gt;
* libreria pygame&lt;br /&gt;
* Vuegg: https://github.com/marketplace/vuegg  &lt;br /&gt;
* Material Design&lt;br /&gt;
* JAVA: Class.forName(&amp;lt;name&amp;gt;.class).newInstance();&lt;br /&gt;
&lt;br /&gt;
===Copia&amp;amp;incolla generale, da smistare in sotto capitoli. Contiene anche '''tutte''' note del telefono (al 22/02/2020)===&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 1:'''&lt;br /&gt;
&lt;br /&gt;
Mosse che trasformano l’avversario: attenzione è una mossa devastante. Trasformazione totale o parziale. Si devono poter aggiungere mosse, strumenti dinamicamente. Battle bot:ribaltano, scintille, elementi (Oggetti) che danneggiano. One piece: I frutti del diavolo (悪魔の実 Akuma no mi?) sono frutti misteriosi che donano poteri soprannaturali a chi li mangia, rendendoli però incapaci di nuotare. Di conseguenza il contatto con l'acqua di mare o con una speciale sostanza conosciuta come agalmatolite indebolisce gli utilizzatori di frutti del diavolo e li priva dei loro poteri. Alcune persone sono inoltre in grado di ricorrere all'Ambizione (覇気 Haki?), una forza spirituale che permette di avvertire la presenza di altri esseri viventi e di predirne i movimenti, di irrobustire parti del corpo e di intimidire o fare svenire le creature con una debole forza di volontà. Personaggio ha funzione baricentro_x, baricentro_y calcolate come (from_x+to_x)/2 sul quale si basa la funzione di libreria getDistance(Personaggio A, Personaggio B, float success); tale funzione serve per calcolare per i PNG e per i PG se ha senso usare una mossa. Non-onniscienza: delle volte non si può sapere distanza avversario e fallisce la mossa per la distanza -&amp;gt; “float success” rappresenta la probabilità di successo (Personaggio ha parametro “osservare”). PNG di due categorie: offensivi o neutrali (no priorità a mosse di attacco, ma tutto casuale). Mosse e oggetti per chiamare Personaggi, magari non necessariamente alleati (2 mosse e 2 oggetti quindi necessari), richiamo di un personaggio preciso o di uno a caso. Ogni mossa/azione deve avere un tempo di attesa espresso in turni (alla meglio 0) per poter ripetere la mossa/azione. Strumenti anche mezzi di trasporto di aria, di terra, di acqua (o lava/palude). Possono attivare una metamorfosi / Unione per cambiare stats personaggio. Veicoli con armi o riparo. Gli strumenti da trattare come gli oggetti. Classe unica? I match/partite (immagino Classe Partita) devono avere variabile boolean “respawn”, per distinguere death match a punti con death match con una vita. Wrestling per ispirarsi nella lotta libera: calci pugni ginocchiate prese lanci salti testate gomitate ecc. Per punti si vince a un limite o dopo un tot di mosse , oppure al primo dei due raggiunti (max_punti e max_mosse parametri di Partita). I punti si guadagnano alla kill (un Punteggio per squadra, int punteggio salvato localmente dentro ogni Personaggio che ha la variabile int squadra). Si guadagnano tanti punti quanti sono i punti della variabile “valore” del personaggio ucciso, tale variabile è calcolata come somma dei valori di tutte le mosse/stats ect del Personaggio. Imperium civitas. Attacco dei giganti. Possibilità di morire se colpiti in un unico punto (tallone d Achille) implementabile come variabile boolean. Jump force. Game dev tycoon. Acqua diventa tsunami. Variabile int per attacco cumulativo di gruppo: es calciatori che più si passano la palla più l’attacco è forte. Suolo magico: non tutti i personaggi possono accedervi, array di string elenca i nomi di chi può accedervi. Funzione esci/entra in classe Personaggio per simulare scambio pokemon 6vs6. Piovra gigante. Rischio=danno*probabilita. Mossa su strumento e con strumento?&lt;br /&gt;
Mosse fisiche per arrampicarsi su avversario(se e solo se sei la metà di dimensioni(?)), atterrarlo, lanciarlo, accecarlo, immobilizzarlo. Se sei in gruppo/ orda bonus ad attacchi combinati. Armi: fruste e scheggie, corni che si suonano per chiamare altri. Tipo della mossa con moltiplicatore tra 0 (immune) e 2 (float): acqua, fuoco, magia, terra: da ispirarsi ai pokemon ma non da copiare, penso. Armi da campo: cannoni e catapulte. Veicoli d’acqua: moto acqua, canoe, barche a motore a remi. Nei veicoli malus su attenzione (variabile int in personaggio, indica attenzione in combattimento e non in altro) perché si è impegnato alla guida . All’inizio in image view “the hero” e “the map”. Condizione vittoria (oltre a morte, punti, o numero mosse, cioè tempo) morte di un singolo Personaggio, che potrebbe rappresentare un edificio, cassaforte o simili. Personaggio si può svestire e lasciare strumenti, modificano statistiche di attacco, difesa , agilità, ect. Variabile luce o non luce, che peggiora/migliora a seconda della specie la visibilità, quindi la precisione , specie in attacchi a distanza: Scurovisione evita i malus.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 2:'''&lt;br /&gt;
&lt;br /&gt;
Gioco2: se ci si lancia da oggetti , dopo essersi arrampicati, possono esserci danni da caduta; strumenti come paracaduti o mosse magiche possono evitare i danni. Pozione del vento, soffi e devi attacchi. In difesa puoi parare, schivare, deviare: tre variabili? Ambiente: colline e pianure uguali, Monti sono Oggetti, picco ossia un unico monte oggetto. Rocce volanti, nuvole sospese: oggetto può essere sospeso e può fare periodicamente una mossa, ad es tuono, può spostarsi, può fare entra/esci, oggetto albero e oggetto foresta, si possono prendere, nascondersi, arrampicarsi, lanciarli, ostacolano velocità ma se si ha abbastanza forza si spezzano alberi. Acqua poco profonda, profonda, molto profonda: variabile boolean in Personaggio “alto” per toccare in acqua profonda, con acqua si generano fiumi laghi e mari. Ambiente si deve poter evolvere: ad esempio oggetto diga può fare metamorfosi e diventare oggetto cascata/torrente in piena. Per edifici più oggetti che rappresentano le mura e il tetto, variabile boolean per oggetto per entrare nell’oggetto. Possono essere spazzati via: danni da crollo, si può combattere all interni, contengono strumenti come tavoli sedie mobili letto ect. Se uno viene schiantato contro uno strumento prende danno(es danno da schianto). Ci possono essere scale, si può non avere contatti visivo sull’avversario. Oggetto mura, oggetto torre, oggetto casa interno sono cose distinte: possono dare malus/bonus su visibilità. Ambiente: pozzi e grotte, da gestire come interno casa. Lava come acqua, ogni oggetto può essere sorgenti di liquido: monte sorgente acqua, vulcano sorgente lava. Può esserci variabile probabilità eruzione, se settata a 1 c’è una continua eruzione. Strade di vario tipo, sovrapposta a altri suoli, migliorano velocità di alcuni strumenti, variabile boolean “ha le ruote” in classe strumenti. Unificare classe strumento e classe oggetto. Oggetti sospesi: case sospese su albero, ad es. Fiamme in mezzo al suolo. Oggetti: porto, aereoporto, grattacieli, dighe, impianti a fune, ospedali per curarsi e prendere oggetti per curarsi dopo, scuole contenenti libri per apprendere una mossa, luoghi di ingegneria per creare oggetti, ad esempio veicoli o armi, soldi nel gioco per comprare da eventuali venditori. Ogni oggetto avra un prezzo (valutabile circa in euro per semplicità). Variabile float per fame, sete, sonno, caldo-freddo (parte da 0.5). Nella mappa ci deve essere per ogni punto la temperatura. Possibilità di vomito, dissenteria, problemi cardiaci, respiratori, muscolari. Armi: balestra, mani nude, sasso, tirapugni, torcia accesa. Armature: intralciano o favoriscono agilità, attacco, poteri magici, rumorosa (elusione), è uno strumento/oggetto. Attacchi possono essere prolungati per turni, mosse variabile boolean prolungabile: può aumentare o diminuire intensità, c’è un max espresso in turni di prolungabilita, inoltre può essere leggermente alterato con una variabile casuale. Equipaggiamento (strumento/oggetto): pietra focaia, attrezzi da scalata, boccale di birra, cavallo, moto, chiodi, martello da fabbro, corda, corazza, dardo, faretra/zaino/sacca (oggetti che contengono una lista di oggetti, stringhe) con un numero per la quantità) e capacità massima zaino e ogni oggetto può avere un valore intero per dimensione (es martello 3, ascia grande 7), mantello, olio, variabile boolean prende fuoco/conduce elettricità, amplifica magnetismo, aumenta esplosioni nucleari, aumenta forza di gravità (?), pala, piccone, rampino, specchio, per osservare quando si è nascosti e si ha malus su visibilità. Strumenti da scasso per aprire porte: variabile boolean per oggetti: entrata con scasso. Personaggio: string razza per swag, immunità a veleni e malattie, elusione, agilità, precisione, abilità magiche(?), difesa fisica. In ultima torcia: agilità, coraggio, forza, intelligenza, magia, manualità, percezione, socialità. Bestiario: aracnoide di varie dimensioni, talpe giganti, vermi giganti di terra di mare e di lava ect, bulbo trascinatore che ha tentacoli per tirare a se e mangiare, lui è immobile, calabrone gigante, serpenti giganti, cinghiali, draghi, elfi, goblin e re goblin, sciamani (goblin), totem di guerra come strumento/oggetti per alterare statistiche nella loro area di influenza, lupo, mastino bruciante, nani, non morti/zombie/mummia/scheletro variabile boolean vivo a false ma ha ancora hp su parti del corpo: variabile boolean “zombizabile”. Orchi, pesci da terra (anfibi) tritone dell abisso, troll e trollin (orchi più deformi), umani. Abilità dei personaggi in ultima torcia: artificiale (robot) immunità a soffocamento, veleni, malattie ect immune a manipolazioni psichiche, visione oscurità; danno da attacco in carica; fiammegiante ossia la creatura può incendiarsi e elettrizzante ossia può diventare elettrica caricamente; modalità furia/mailmen ossia ottiene bonus su alcune/tutte le statistiche; gigantesco o molto piccolo due boolean (?forse non serve); immunità a magie mentali, al fuoco; linguaggi (?); non morto; danno da attacco in presa; pungiglioni velenosi; sa muoversi su ragnatele o è rallentato, resistenza a perforazione, respirare sott’acqua o sotto lava o nei liquidi in genere; rigenerazione; riceve danni dalla luce solare o da assenza di luce; è terrorizzato/impaurito/intimidito o se è imperturbabile boolean. Danno da trascinamento; paralizzante; può diventare più veloce (?non serve); visione a infrarossi attraverso oggetti; volare o andare sotto terra. Imperium editor, cose che penso di non aver ancora scritto: stagioni, suolo erboso o terriccio, sabbia con erba e terra e da sola, strade e stagioni, altitudine, alberi e arbusti, vari tipi a foglia larga, conifere, alberi secchi, palme, arbusti verdi e secchi, cactus, alghe marine, rocce e pietre, scheletri per terra, legna tagliata (alberi tagliati), carri e carretti, grotte e rovine per accessi sotterranei, locande, templi, accampamenti, fortini, monoliti, fontana, tombe e cimiteri, borse per terra, pozzo, troni, croci(del teschio), pozzo, capanne, lapidi, ponti, recinzioni, falò, tende, torri, panoplia, fessure come abissi, statue, rovine (deserto) come case distrutte, colonne per costruire templi, piramidi, sfingi, bandiere, rovine in Europa, campi coltivati che contengono cibo, fiamma (in altre), roccia in altre per montagne, altre-&amp;gt;rovine per monumenti non egiziani ma europei.&lt;br /&gt;
Ci sono paludi. Tende da campo. Forti, porti. Edifici delle fortezze, edifici dei villaggi. Naufragi e scogli.&lt;br /&gt;
Parametri voglia/impegno float per descrivere voglia di combattere Personaggio. Ricevi danno uscendo dalla mappa tra 1-5% tra 6-10% tra 11-15% della vita totale di ogni parte del corpo per ogni turno di gioco. Danno da precipitazione diverso da carica, uno verticale uno orizzontale, se precipiti da molto in alto hai bonus, oltre che danni da schianto lol. Baionette, formazione a blocchi, a quadrato (difensiva) sparano su quattro lati, a schiera vanno avanti. Usano un colpo poi lunga ricarica. Variabile boolean per attivare o meno fuoco amico. Azione per cambiare posizione: in piedi, in ginocchio(inteso come via di mezzo), sdraiato: per permettere migliore visibilità a chi è dietro (nella formazione).&lt;br /&gt;
Altruismo, coraggio, spingere oltre il limite, difendere al posto di un altro, migliorare posizione per avere bonus. Mosse da usare in condizioni psicologiche idonee: mosse estreme per disperazione, bonus unici. Condizioni per situazioni: blocco, spalle al muro, stritolato, confuso, semi parassiti addosso, azzoppato, bagnato d’acqua, lame affilate, corazza indurita, tante copie di me stesso attive, preveggente. Per ambiente:pioggia (torrenziale), barriera a cupola, punte metalliche a terra, blocco di fumo nero. Far volare un avversario/alleato. Tutti possono fare tutto sotto effetti magici o fisici. Un cavallo può volare se viene preso da un uccello e portato in alto.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 3, 4:'''&lt;br /&gt;
&lt;br /&gt;
Gioco1,2,3,4: tutto caricato su wikis.&lt;br /&gt;
&lt;br /&gt;
Gioco3: Mosse con caricamento + spostamento (es. kameamea con teletrasporto). Ciclo di interazione principale:crea o combatti. Modalità campagna, che chiede in input da che battaglia iniziare, ma implica tipi battaglie prefissati. Alla morte/sconfitta di un personaggio si possono alterare statistiche (es personaggio può cambiare fazione). Alcune mosse possono lasciare oggetti sul terreno: (ad es, radici di Groth). Ogni oggetto può alterare le statistiche al passaggio sopra, nelle vicinanze. Boolean invisibile per personaggio, diverso da elusione infinita. Se personaggio va in un altro dimensione -&amp;gt; unreachable. Attacco coordinato, se non lo fanno tutti vale lo stesso ma depotenziato opportunamente . Personaggio in modalità maniac (2 mosse per turno) e in modalità depressive (1 mossa ogni due turni); personaggio Flash può fare 10 mosse in un turno. Chiudi con lucchetto oggetto da dentro o da fuori, oggetto ingresso in oggetto casa , più ingressi per un singolo oggetto.nicole aniston. Rimbalzo se ci si schianta contro oggetto da calcolare con parametro. Ryuk e Darkrai.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gioco 4 23/07/2019:&lt;br /&gt;
Pula fiction, aracnidi, oggetto: due superfici rettangolari di forma diversa, anche inclinate , collegate. Più pezzi collegati tra loro per forme cilindriche cave, ad esempio, tipo vulcano. Mappa con sprite personaggi, canvas: anche mouseClick? Statistiche con nome gerarchico, es pokemon_attacco. Modalità survival, stile isola di jurassic park gdr; sia in coop che contro; possibilità di fare N turni di fila se non ci sono altri player giocanti nelle vicinanze (ciò però comporterebbe , in modalità contro , di capire quando c’è qualcuno nelle vicinanze perché si andrebbe di 1 turno alla volta, soluzioni: in mod contro 1 turno per volta oppure meccanismo di sincronizzazione turni quando uno vede l’altro (anche furtivo) come c’è attacco 1 turno a testa) .. analogo a Battle royale(?); inizio con starter kit random. Modalità assedio al castello. Inoltre se posso fare N turni di fila si può pensare a più pc , uno per persona , coordinati per fare comandi in parallelo, ma va ben congegnato meccanismo di sincronizzazione. Parti DelCorpo -&amp;gt; Componente/i oppure Parte. La mappa deve essere (x,y); l’altezza viene indicata onMouseOver certi pixel dove è posto il Personaggio; se personaggio dentro edificio/grotta cambio img (es sfocato/tratteggiato). Mosse: astrarre per target; molte mosse sono simili tra loro, somiglianza va sfruttata, hanno magari dei target in comune, o variano solo per un parametro. Creare mappa anche con drag and drop immagini ?(un po’ difficile). Più layout per interfaccia grafica (esempio uno che mostra errori input su text area, uno con alert, uno su box text area separato). Input comandi consumato pezzo per pezzo, alcune parole se prevedono parametri quando riconosciute fanno fetch anche di parola (numero) successiva. Face toon foto? Import parziali di personaggi (tutto tranne/solo questi campi specificati). Texture mappa complete o ripetibili (es per suolo). Anteprima battaglia stile battaglia pokemon (magari per 1/2/3 vs 1/2/3) per rappresentare scontro. Conviene usare xslx (excel) per dati, considerare che può non servire la libreria Java per leggere stringhe per operazioni. Mossa “again” , ripeti la precedenza(opportuna modifica parametri, es mossa spostamento). Possibile gestione contromosse: si usano marker (tag): ogni mossa ha elenco tag del tipo di contromosse che può subire (con probabilità annessa, che può dipendere da pg che subisce mossa congiuntamente a mossa stessa). Ogni mossa inoltre deve essere taggata come possibile contromossa che il pg può usare (per schivare può fare in più modi). A seconda del lancio del dado il pg che effettua La contromossa può anche scegliere tipologia di contromossa o solo la mossa della tipologia che ha beccato (entrano in gioco riflessi ect.). I parametri che fanno attivare unq o un’altra contromossa sono dinamici, posso dipendere ad esempio dalla posizione tra i due pg o altre statistiche. Tag contromosse a fasce (es. coprirsi è sempre più facile che schivare che e più facile di schivare e contrattaccare (?); all’interno dello stesso schivare e contrattaccare ci sono più sotto categorie). Per aggiunta personaggio può essere utili interfaccia dedicata, non linea di comando (o altre operazioni, specie se ci sono tabelle). Mossa “premonizione”: predire il futuro a breve termine, dici che mossa vorresti fare e ti dice esito (o più esiti se uno chiede più mosse). Funziona solo sulla prossima mossa. Contromossa delle contromossa gestione?? Eventualmente nell’esito si prevede ancore contro-contromossa. Ma si innesca reazione a catena, inoltre da gestire scelta contromossa in questo caso. Applicazione tag conoscenza(universo di appartenenza): “Termoli”, “pokemon”, “liceo classico Termoli”, anche gerarchici, per filtrare sui personaggi.target componibili , fattorizzato creazione mosse, hanno un costo magari per indicare quantovoccupano dicuna mossa, relativo maybe a un parametro o più del target stesso. In particolare, non saranno salvate le mosse per un personaggio (o solo alcune “preferite”) ma il suo insieme di target i quali devono dire:statistica che influenzano, “costo del turno” che richiedono al variare dell’intensità del target (che aumenta linearmente, esponenzialmente, generica f(x)) quindi corsa blanda costo 1 , Max corsa costo 5 (max), elenco (string) target incompatibili con tale target (se serve), nota relative ad es per quando uno vuole creare una mossa durante la battaglia (“target corsa, max sforzo dedicabile 4 ect” metti “50 metri corsa” “ok/troppo! Vuoi sforzati di più rischiando effetti collaterali?”). Si può autoscrivere la voce narrante del gioco come “la tua coscienza” mentre che giochi, d’altronde si interagisce con essa. Considerare che un target può appartenere a più personaggi, magari sotto nomi di mosse diversi.&lt;br /&gt;
Definire gerarchia di personaggi per template (tipo classe e super classe) e template importabili (tipo usa fuoco). Es umanoide non umanoide, tra umanoide maschio- femmina etc. Classe che estende System.out per creare funzioni che aggiungono Header “DEBUG:” etc; due programmi Java , due main: uno delegato a calcoli + gestione Excel; altro legge stdout dell altro per interfaccia grafica. Per allenare PG creare dei PG fantocci con label per fare Q-learning iniziale, più avanti far allenare pg tra loro; creare vari fantocci: tank terrestre fisico, healer volante etc. Excel: si usa css che si può rendere tabellare, più facile da trattare nel codice rispetto a .xslx. Ogni “utente” ed Lostefra ha il suo personale dizionario con sue personali short cut da usare in partita, eventuale login con password (opzionale) x accesso. Vedere license show down. Mappa unica stile giochi di ruolo, si vede tutto da sopra: click o simili su edifici/caverne per mappe interne a tale posto, così ok sprite e per rappresentare “pg in volo” sprite dedicato. Densità aria per dire quando anche un uomo per es può volare. Ipotesi più efficiente per dare un valore stima al pg: AI base che gioca a manetta contro altre AI base e dalle vittorie si fa l’euristica, più vittoria facile/veloce/stracciante più punti, contro vari pg, contro pg standard bench mark.&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Note&amp;diff=197</id>
		<title>Note</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Note&amp;diff=197"/>
		<updated>2020-05-24T16:04:13Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: /* Deploy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Note ==&lt;br /&gt;
&lt;br /&gt;
'''Vedere altre note su fogli di carta e promemoria del telefono. Ce ne sono molte.'''&lt;br /&gt;
'''La copiatura dai fogli di carta dei continuare da pagina 4 (&amp;quot;alterare param..&amp;quot;).'''&lt;br /&gt;
&lt;br /&gt;
===Inspirational Concepts===&lt;br /&gt;
* Gioco Lotta (Pokémon, Pokkén)&lt;br /&gt;
* no caselle esplicite&lt;br /&gt;
* Descrizione rispetto a: ambiente, nemico, oggetti&lt;br /&gt;
* pokémon, DnD, Call of Duty, Super Smash Brawl, corse pazze&lt;br /&gt;
* concentrarsi su: fluidi, telecinesi, razze, bonus/malus, gradi di libertà (fisicamente parlando) &lt;br /&gt;
* scacchi (es. crea casella), shaolin showdown&lt;br /&gt;
* prevedere = creatività&lt;br /&gt;
* acqua, aria, fuoco, terra&lt;br /&gt;
* gravità (newton), verso alto, basso, destra, sinistra, circolare, tutti i versi&lt;br /&gt;
* jumanji, savana, animali, zoologia&lt;br /&gt;
* tempo/spazio&lt;br /&gt;
* BF4, pirati, roma (imperium civitas)&lt;br /&gt;
* musica come arma (rap)&lt;br /&gt;
* magia, prestigiatori&lt;br /&gt;
* dinosauri (documentario, libro, zoologia)&lt;br /&gt;
* avengers, supereroi (libro)&lt;br /&gt;
&lt;br /&gt;
* Looney toons&lt;br /&gt;
&lt;br /&gt;
===Personaggi (con statistiche e stati)===&lt;br /&gt;
* combattenti (con statistiche e stati)&lt;br /&gt;
* immagine rappresentativa per rappresentare meglio&lt;br /&gt;
* HP: colore rosso su immagine personaggio, dove sei debole/già colpito (idea scartata)&lt;br /&gt;
* penitenza: il malus può essere inteso come ciò che c'è nell'inserimento successivo, malus cumulativo&lt;br /&gt;
* essere ipocrita, finzione (schermo)&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (personaggi)&lt;br /&gt;
* metamorfosi&lt;br /&gt;
* alchimisti&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* possibilità giù in terra/ giù in acqua, con reachable e unreachable Boolean. Fuori da mappa anche reachable e unreachable.&lt;br /&gt;
* Personaggi composti di parti[] es. testa, busto, gambe, braccia, coda, pinna, ali. Distinzione per arto di movimento e/o spostamento boolean.&lt;br /&gt;
* Arti possono provocare danno, bruciatura , paralisi a contatto (Boolean) . Percentuale di probabilità accompagna ogni Boolean.&lt;br /&gt;
* Ogni parte del corpo punti vita + se inutilizzabile + amputata + stato (es paralisi).&lt;br /&gt;
* Per fare battaglie tra molto grandi =&amp;gt; 1 m lo si intende come 10m.  (rivalutato, aumentare livello scaling)&lt;br /&gt;
* Personaggio fusionabile Boolean + string nomi con cui si fonde.&lt;br /&gt;
* Distinzione tra infernape e infernape1/2/3 ect tra “specie” e “nome”.&lt;br /&gt;
* variabile Boolean respawnable.&lt;br /&gt;
* Raccogliere a piene mani da: https://spore.fandom.com/wiki/Creature_Editor&lt;br /&gt;
* Ad esempio weapons come elemento di Corpo (zanne, corna) e possibilità di muoversi/attaccare furtivamente.&lt;br /&gt;
* Divisibile e unibile come boolean e array di stringe associate per indicare i nomi con cui si unisce il Personaggio o in cui si divide.&lt;br /&gt;
* Variabili posizione nome: from_x/y ; to_x/y.&lt;br /&gt;
* Classe Stato, Personaggio contiene Array di stato, stato contiene moltiplicatori per statistica es attacco velocità precisione elusione ect.&lt;br /&gt;
* Personaggio deve avere una stat tipo sanità mentale, intelligenza, quanto è confuso e quanto è impaurito (2).&lt;br /&gt;
&lt;br /&gt;
* Per personaggi molto piccoli (meno di 1m x 1m x 1m) possibilità di essere in (x,y,z) tra 0 e 1.000.000 (ordine del micrometro, 1*10^-6 == 0,000001) e avere (lenX, lenY, lenZ). In questo modo sono definite dimensioni inferiori ad 1 m^3.&lt;br /&gt;
* personaggi max 20x20 (rivaluato, meno limitata)&lt;br /&gt;
&lt;br /&gt;
===Mosse===&lt;br /&gt;
* &amp;quot;combattimento prescinde da combattente&amp;quot;&lt;br /&gt;
* mosse hanno: direzione, azione, attacco (mosse pokémon)&lt;br /&gt;
* Parametri interi per mossa (direzione, consumabili) con lower e upper bound&lt;br /&gt;
* camuffarsi =&amp;gt; DnD manuale&lt;br /&gt;
* wrestling (libro) per le mosse/prese&lt;br /&gt;
&lt;br /&gt;
* X fa una mossa contro Y: Z potrebbe reagire (Es. ricevendo il colpo al posto di Y). Può essere realizzato sia come se &amp;quot;Y chiede soccorso Z&amp;quot; o come reazione di alleati adiacenti &amp;quot;Z soccorre Y&amp;quot;&lt;br /&gt;
* Mossa prende come parametro di ingresso Corpo, ossia la parte del corpo coinvolta nella mossa (es arto , tutto corpo ect). &lt;br /&gt;
&lt;br /&gt;
===Oggetto (con statistiche e stati)===&lt;br /&gt;
* armi: lacci (stati), lame (potenze), sassi, reti, pistole (munizioni), razzi, bombe (potenze), fuoco (d'artificio?) =&amp;gt; manuale DnD&lt;br /&gt;
* veleno n modi =&amp;gt; DnD manuale&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (oggetti)&lt;br /&gt;
* automezzi con cannoni, variabile 'hasEntrata', 'tempoRiutilizzo'&lt;br /&gt;
* violino come arma (tutti strumenti musicali): a fiato, a corda, a percussione&lt;br /&gt;
* veleni, ampolle e flaconi magici, insieme di 'oggetti dentro' un oggetto&lt;br /&gt;
&lt;br /&gt;
* Classe oggetto: es albero, roccia, casa: forza necessaria per sradicare + forza per lanciare + destrezza / agilità per appendersi + nascondersi in proporzione alle dimensioni di chi si nasconde. &lt;br /&gt;
* Altri es. pali. Sotto terra o sotto acqua/lava/melma o simili. &lt;br /&gt;
* Acqua rallenta se non hai pinne boolean.&lt;br /&gt;
* Classe strumento per oggetti che si tengono in mano, es reti , pistole, spade, pugnali, scudi, elmi, lancia, arco , frecce, lanciarazzi, fucili cecchino, fucile assalto, corde.&lt;br /&gt;
* Strumenti e mosse: danno ad area, perforante, contundente (vedi dnd armi). Mosse possono creare/modificare/distruggere oggetti e strumenti.&lt;br /&gt;
* Oggetti del campo di gioco incidono su elusione (parametro di personaggio).&lt;br /&gt;
* Buco/abisso (boolean) per dire se c’è o meno il suolo (Suolo come classe?). &lt;br /&gt;
* Radiazioni. &lt;br /&gt;
&lt;br /&gt;
===Modalità gioco===&lt;br /&gt;
* turnazione&lt;br /&gt;
* 1 v 1 v 1 etc., ma anche squadre casuali&lt;br /&gt;
* punteggio: chi fa più punti, più uccisioni, definizione di 'punto', gioco per perdere&lt;br /&gt;
* inserisci personaggio total random&lt;br /&gt;
&lt;br /&gt;
* Modalità battaglia con interazione stile battaglia navale (non si vede mossa dell'avversario)&lt;br /&gt;
* Modalità di gioco: tutti contro tutti (battle royale), death match, vs CPU mode zombie(attaccano solo, se non possono vanno verso nemico): serve introdurre un punteggio, di sicuro per mode zombie , ma anche per death match e tutti contro tutti&lt;br /&gt;
* ingressi: ne entra un altro?&lt;br /&gt;
&lt;br /&gt;
===Mappa===&lt;br /&gt;
* arene&lt;br /&gt;
* minimappa (pixelata ?), legenda oggetti base, devono esserci caselle implicite&lt;br /&gt;
* mappa 100x100 (rivalutato, meno limitata)&lt;br /&gt;
* Cannoni fissi in mezzo al campo (strumento).&lt;br /&gt;
&lt;br /&gt;
===Funzionalità generali===&lt;br /&gt;
* Chiave: non una flat input box per i comandi; ma dinamica: si suppone il soggetto &amp;quot;io&amp;quot; (le azioni le fanno in prima persona i personaggi), ogni mossa deve prevedere dei complementi (&amp;quot;verso&amp;quot;, &amp;quot;tra quanto&amp;quot;, &amp;quot;cosa&amp;quot;, &amp;quot;a favore di chi&amp;quot;, &amp;quot;contro chi&amp;quot;). Ogni complemento collegato con box stile in pop up =&amp;gt; bootstrap (la grafica sara unica). Prevedere anche modalita flat con input del tipo &amp;quot;azione a=pippo verso=termoli&amp;quot; (regex check)&lt;br /&gt;
* &amp;quot;meno tabelle&amp;quot;, &amp;quot;no bottoni&amp;quot; e solo foto che si alternano, &amp;quot;la grafica serve&amp;quot;: text box unica interazione, text area (history), immagine personaggio e immagine mappa&lt;br /&gt;
* &amp;quot;persistenza anche da interfaccia grafica&amp;quot;, diritti di scrittura sui file?&lt;br /&gt;
* Segnalazione (comando per fare nota)&lt;br /&gt;
&lt;br /&gt;
===Deploy===&lt;br /&gt;
* &amp;quot;commenta il codice&amp;quot;, &amp;quot;dividi et impera&amp;quot;&lt;br /&gt;
* Server web (Apache) ospita partite (+ localmente ha i file di funzionamento), in LAN client giocano o da remoto con IP pubblico. Interfaccia HTML5 + Javascript per giocare. Studiare engine grafici Javascript&lt;br /&gt;
* bootstrap! (specie per input box)&lt;br /&gt;
* Unity, WebGL (vedi SDK dedicata, built per Android/iOS/etc.)&lt;br /&gt;
* Modelli 3D videogiochi: https://www.models-resource.com/ , meglio se disaccoppiati da Unity (e.g. in cartelle independenti), aggiunta modelli online&lt;br /&gt;
* Tutorial tank Unity: https://learn.unity.com/project/tanks-tutorial&lt;br /&gt;
* WebSocket per gestire client asincroni (NodeJS ?)&lt;br /&gt;
* Su YT in “guarda più tardi” video per interagire unity con JS (“unity.sendMessage()” o simili)&lt;br /&gt;
* Due client: uno con WebGL e uno JS base con solo input (per test, per mancanza di supporto browser a WebGL). Eventualmente 3 client: 1 base (JS puro con qualche immagine al più), 1 WebGL+Unity 2D (grafica pixelata), 1 WebGL+Unity 3D (informazioni di input per mirare, ad es., in base a dove punto nello schermo. Qualcosa di simile anche per 2D). Tutti i client stessi JSON per comunicare al server!&lt;br /&gt;
&lt;br /&gt;
==== Altro (scartato)====&lt;br /&gt;
* rpgmaker, godot, aseprite, pixelart (in generale), ma anche phaser, piskel&lt;br /&gt;
* joomla! Per far prima con html&lt;br /&gt;
* libreria pygame&lt;br /&gt;
* Vuegg: https://github.com/marketplace/vuegg  &lt;br /&gt;
* Material Design&lt;br /&gt;
* JAVA: Class.forName(&amp;lt;name&amp;gt;.class).newInstance();&lt;br /&gt;
&lt;br /&gt;
===Copia&amp;amp;incolla generale, da smistare in sotto capitoli. Contiene anche '''tutte''' note del telefono (al 22/02/2020)===&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 1:'''&lt;br /&gt;
&lt;br /&gt;
Mosse che trasformano l’avversario: attenzione è una mossa devastante. Trasformazione totale o parziale. Si devono poter aggiungere mosse, strumenti dinamicamente. Battle bot:ribaltano, scintille, elementi (Oggetti) che danneggiano. One piece: I frutti del diavolo (悪魔の実 Akuma no mi?) sono frutti misteriosi che donano poteri soprannaturali a chi li mangia, rendendoli però incapaci di nuotare. Di conseguenza il contatto con l'acqua di mare o con una speciale sostanza conosciuta come agalmatolite indebolisce gli utilizzatori di frutti del diavolo e li priva dei loro poteri. Alcune persone sono inoltre in grado di ricorrere all'Ambizione (覇気 Haki?), una forza spirituale che permette di avvertire la presenza di altri esseri viventi e di predirne i movimenti, di irrobustire parti del corpo e di intimidire o fare svenire le creature con una debole forza di volontà. Personaggio ha funzione baricentro_x, baricentro_y calcolate come (from_x+to_x)/2 sul quale si basa la funzione di libreria getDistance(Personaggio A, Personaggio B, float success); tale funzione serve per calcolare per i PNG e per i PG se ha senso usare una mossa. Non-onniscienza: delle volte non si può sapere distanza avversario e fallisce la mossa per la distanza -&amp;gt; “float success” rappresenta la probabilità di successo (Personaggio ha parametro “osservare”). PNG di due categorie: offensivi o neutrali (no priorità a mosse di attacco, ma tutto casuale). Mosse e oggetti per chiamare Personaggi, magari non necessariamente alleati (2 mosse e 2 oggetti quindi necessari), richiamo di un personaggio preciso o di uno a caso. Ogni mossa/azione deve avere un tempo di attesa espresso in turni (alla meglio 0) per poter ripetere la mossa/azione. Strumenti anche mezzi di trasporto di aria, di terra, di acqua (o lava/palude). Possono attivare una metamorfosi / Unione per cambiare stats personaggio. Veicoli con armi o riparo. Gli strumenti da trattare come gli oggetti. Classe unica? I match/partite (immagino Classe Partita) devono avere variabile boolean “respawn”, per distinguere death match a punti con death match con una vita. Wrestling per ispirarsi nella lotta libera: calci pugni ginocchiate prese lanci salti testate gomitate ecc. Per punti si vince a un limite o dopo un tot di mosse , oppure al primo dei due raggiunti (max_punti e max_mosse parametri di Partita). I punti si guadagnano alla kill (un Punteggio per squadra, int punteggio salvato localmente dentro ogni Personaggio che ha la variabile int squadra). Si guadagnano tanti punti quanti sono i punti della variabile “valore” del personaggio ucciso, tale variabile è calcolata come somma dei valori di tutte le mosse/stats ect del Personaggio. Imperium civitas. Attacco dei giganti. Possibilità di morire se colpiti in un unico punto (tallone d Achille) implementabile come variabile boolean. Jump force. Game dev tycoon. Acqua diventa tsunami. Variabile int per attacco cumulativo di gruppo: es calciatori che più si passano la palla più l’attacco è forte. Suolo magico: non tutti i personaggi possono accedervi, array di string elenca i nomi di chi può accedervi. Funzione esci/entra in classe Personaggio per simulare scambio pokemon 6vs6. Piovra gigante. Rischio=danno*probabilita. Mossa su strumento e con strumento?&lt;br /&gt;
Mosse fisiche per arrampicarsi su avversario(se e solo se sei la metà di dimensioni(?)), atterrarlo, lanciarlo, accecarlo, immobilizzarlo. Se sei in gruppo/ orda bonus ad attacchi combinati. Armi: fruste e scheggie, corni che si suonano per chiamare altri. Tipo della mossa con moltiplicatore tra 0 (immune) e 2 (float): acqua, fuoco, magia, terra: da ispirarsi ai pokemon ma non da copiare, penso. Armi da campo: cannoni e catapulte. Veicoli d’acqua: moto acqua, canoe, barche a motore a remi. Nei veicoli malus su attenzione (variabile int in personaggio, indica attenzione in combattimento e non in altro) perché si è impegnato alla guida . All’inizio in image view “the hero” e “the map”. Condizione vittoria (oltre a morte, punti, o numero mosse, cioè tempo) morte di un singolo Personaggio, che potrebbe rappresentare un edificio, cassaforte o simili. Personaggio si può svestire e lasciare strumenti, modificano statistiche di attacco, difesa , agilità, ect. Variabile luce o non luce, che peggiora/migliora a seconda della specie la visibilità, quindi la precisione , specie in attacchi a distanza: Scurovisione evita i malus.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 2:'''&lt;br /&gt;
&lt;br /&gt;
Gioco2: se ci si lancia da oggetti , dopo essersi arrampicati, possono esserci danni da caduta; strumenti come paracaduti o mosse magiche possono evitare i danni. Pozione del vento, soffi e devi attacchi. In difesa puoi parare, schivare, deviare: tre variabili? Ambiente: colline e pianure uguali, Monti sono Oggetti, picco ossia un unico monte oggetto. Rocce volanti, nuvole sospese: oggetto può essere sospeso e può fare periodicamente una mossa, ad es tuono, può spostarsi, può fare entra/esci, oggetto albero e oggetto foresta, si possono prendere, nascondersi, arrampicarsi, lanciarli, ostacolano velocità ma se si ha abbastanza forza si spezzano alberi. Acqua poco profonda, profonda, molto profonda: variabile boolean in Personaggio “alto” per toccare in acqua profonda, con acqua si generano fiumi laghi e mari. Ambiente si deve poter evolvere: ad esempio oggetto diga può fare metamorfosi e diventare oggetto cascata/torrente in piena. Per edifici più oggetti che rappresentano le mura e il tetto, variabile boolean per oggetto per entrare nell’oggetto. Possono essere spazzati via: danni da crollo, si può combattere all interni, contengono strumenti come tavoli sedie mobili letto ect. Se uno viene schiantato contro uno strumento prende danno(es danno da schianto). Ci possono essere scale, si può non avere contatti visivo sull’avversario. Oggetto mura, oggetto torre, oggetto casa interno sono cose distinte: possono dare malus/bonus su visibilità. Ambiente: pozzi e grotte, da gestire come interno casa. Lava come acqua, ogni oggetto può essere sorgenti di liquido: monte sorgente acqua, vulcano sorgente lava. Può esserci variabile probabilità eruzione, se settata a 1 c’è una continua eruzione. Strade di vario tipo, sovrapposta a altri suoli, migliorano velocità di alcuni strumenti, variabile boolean “ha le ruote” in classe strumenti. Unificare classe strumento e classe oggetto. Oggetti sospesi: case sospese su albero, ad es. Fiamme in mezzo al suolo. Oggetti: porto, aereoporto, grattacieli, dighe, impianti a fune, ospedali per curarsi e prendere oggetti per curarsi dopo, scuole contenenti libri per apprendere una mossa, luoghi di ingegneria per creare oggetti, ad esempio veicoli o armi, soldi nel gioco per comprare da eventuali venditori. Ogni oggetto avra un prezzo (valutabile circa in euro per semplicità). Variabile float per fame, sete, sonno, caldo-freddo (parte da 0.5). Nella mappa ci deve essere per ogni punto la temperatura. Possibilità di vomito, dissenteria, problemi cardiaci, respiratori, muscolari. Armi: balestra, mani nude, sasso, tirapugni, torcia accesa. Armature: intralciano o favoriscono agilità, attacco, poteri magici, rumorosa (elusione), è uno strumento/oggetto. Attacchi possono essere prolungati per turni, mosse variabile boolean prolungabile: può aumentare o diminuire intensità, c’è un max espresso in turni di prolungabilita, inoltre può essere leggermente alterato con una variabile casuale. Equipaggiamento (strumento/oggetto): pietra focaia, attrezzi da scalata, boccale di birra, cavallo, moto, chiodi, martello da fabbro, corda, corazza, dardo, faretra/zaino/sacca (oggetti che contengono una lista di oggetti, stringhe) con un numero per la quantità) e capacità massima zaino e ogni oggetto può avere un valore intero per dimensione (es martello 3, ascia grande 7), mantello, olio, variabile boolean prende fuoco/conduce elettricità, amplifica magnetismo, aumenta esplosioni nucleari, aumenta forza di gravità (?), pala, piccone, rampino, specchio, per osservare quando si è nascosti e si ha malus su visibilità. Strumenti da scasso per aprire porte: variabile boolean per oggetti: entrata con scasso. Personaggio: string razza per swag, immunità a veleni e malattie, elusione, agilità, precisione, abilità magiche(?), difesa fisica. In ultima torcia: agilità, coraggio, forza, intelligenza, magia, manualità, percezione, socialità. Bestiario: aracnoide di varie dimensioni, talpe giganti, vermi giganti di terra di mare e di lava ect, bulbo trascinatore che ha tentacoli per tirare a se e mangiare, lui è immobile, calabrone gigante, serpenti giganti, cinghiali, draghi, elfi, goblin e re goblin, sciamani (goblin), totem di guerra come strumento/oggetti per alterare statistiche nella loro area di influenza, lupo, mastino bruciante, nani, non morti/zombie/mummia/scheletro variabile boolean vivo a false ma ha ancora hp su parti del corpo: variabile boolean “zombizabile”. Orchi, pesci da terra (anfibi) tritone dell abisso, troll e trollin (orchi più deformi), umani. Abilità dei personaggi in ultima torcia: artificiale (robot) immunità a soffocamento, veleni, malattie ect immune a manipolazioni psichiche, visione oscurità; danno da attacco in carica; fiammegiante ossia la creatura può incendiarsi e elettrizzante ossia può diventare elettrica caricamente; modalità furia/mailmen ossia ottiene bonus su alcune/tutte le statistiche; gigantesco o molto piccolo due boolean (?forse non serve); immunità a magie mentali, al fuoco; linguaggi (?); non morto; danno da attacco in presa; pungiglioni velenosi; sa muoversi su ragnatele o è rallentato, resistenza a perforazione, respirare sott’acqua o sotto lava o nei liquidi in genere; rigenerazione; riceve danni dalla luce solare o da assenza di luce; è terrorizzato/impaurito/intimidito o se è imperturbabile boolean. Danno da trascinamento; paralizzante; può diventare più veloce (?non serve); visione a infrarossi attraverso oggetti; volare o andare sotto terra. Imperium editor, cose che penso di non aver ancora scritto: stagioni, suolo erboso o terriccio, sabbia con erba e terra e da sola, strade e stagioni, altitudine, alberi e arbusti, vari tipi a foglia larga, conifere, alberi secchi, palme, arbusti verdi e secchi, cactus, alghe marine, rocce e pietre, scheletri per terra, legna tagliata (alberi tagliati), carri e carretti, grotte e rovine per accessi sotterranei, locande, templi, accampamenti, fortini, monoliti, fontana, tombe e cimiteri, borse per terra, pozzo, troni, croci(del teschio), pozzo, capanne, lapidi, ponti, recinzioni, falò, tende, torri, panoplia, fessure come abissi, statue, rovine (deserto) come case distrutte, colonne per costruire templi, piramidi, sfingi, bandiere, rovine in Europa, campi coltivati che contengono cibo, fiamma (in altre), roccia in altre per montagne, altre-&amp;gt;rovine per monumenti non egiziani ma europei.&lt;br /&gt;
Ci sono paludi. Tende da campo. Forti, porti. Edifici delle fortezze, edifici dei villaggi. Naufragi e scogli.&lt;br /&gt;
Parametri voglia/impegno float per descrivere voglia di combattere Personaggio. Ricevi danno uscendo dalla mappa tra 1-5% tra 6-10% tra 11-15% della vita totale di ogni parte del corpo per ogni turno di gioco. Danno da precipitazione diverso da carica, uno verticale uno orizzontale, se precipiti da molto in alto hai bonus, oltre che danni da schianto lol. Baionette, formazione a blocchi, a quadrato (difensiva) sparano su quattro lati, a schiera vanno avanti. Usano un colpo poi lunga ricarica. Variabile boolean per attivare o meno fuoco amico. Azione per cambiare posizione: in piedi, in ginocchio(inteso come via di mezzo), sdraiato: per permettere migliore visibilità a chi è dietro (nella formazione).&lt;br /&gt;
Altruismo, coraggio, spingere oltre il limite, difendere al posto di un altro, migliorare posizione per avere bonus. Mosse da usare in condizioni psicologiche idonee: mosse estreme per disperazione, bonus unici. Condizioni per situazioni: blocco, spalle al muro, stritolato, confuso, semi parassiti addosso, azzoppato, bagnato d’acqua, lame affilate, corazza indurita, tante copie di me stesso attive, preveggente. Per ambiente:pioggia (torrenziale), barriera a cupola, punte metalliche a terra, blocco di fumo nero. Far volare un avversario/alleato. Tutti possono fare tutto sotto effetti magici o fisici. Un cavallo può volare se viene preso da un uccello e portato in alto.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 3, 4:'''&lt;br /&gt;
&lt;br /&gt;
Gioco1,2,3,4: tutto caricato su wikis.&lt;br /&gt;
&lt;br /&gt;
Gioco3: Mosse con caricamento + spostamento (es. kameamea con teletrasporto). Ciclo di interazione principale:crea o combatti. Modalità campagna, che chiede in input da che battaglia iniziare, ma implica tipi battaglie prefissati. Alla morte/sconfitta di un personaggio si possono alterare statistiche (es personaggio può cambiare fazione). Alcune mosse possono lasciare oggetti sul terreno: (ad es, radici di Groth). Ogni oggetto può alterare le statistiche al passaggio sopra, nelle vicinanze. Boolean invisibile per personaggio, diverso da elusione infinita. Se personaggio va in un altro dimensione -&amp;gt; unreachable. Attacco coordinato, se non lo fanno tutti vale lo stesso ma depotenziato opportunamente . Personaggio in modalità maniac (2 mosse per turno) e in modalità depressive (1 mossa ogni due turni); personaggio Flash può fare 10 mosse in un turno. Chiudi con lucchetto oggetto da dentro o da fuori, oggetto ingresso in oggetto casa , più ingressi per un singolo oggetto.nicole aniston. Rimbalzo se ci si schianta contro oggetto da calcolare con parametro. Ryuk e Darkrai.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gioco 4 23/07/2019:&lt;br /&gt;
Pula fiction, aracnidi, oggetto: due superfici rettangolari di forma diversa, anche inclinate , collegate. Più pezzi collegati tra loro per forme cilindriche cave, ad esempio, tipo vulcano. Mappa con sprite personaggi, canvas: anche mouseClick? Statistiche con nome gerarchico, es pokemon_attacco. Modalità survival, stile isola di jurassic park gdr; sia in coop che contro; possibilità di fare N turni di fila se non ci sono altri player giocanti nelle vicinanze (ciò però comporterebbe , in modalità contro , di capire quando c’è qualcuno nelle vicinanze perché si andrebbe di 1 turno alla volta, soluzioni: in mod contro 1 turno per volta oppure meccanismo di sincronizzazione turni quando uno vede l’altro (anche furtivo) come c’è attacco 1 turno a testa) .. analogo a Battle royale(?); inizio con starter kit random. Modalità assedio al castello. Inoltre se posso fare N turni di fila si può pensare a più pc , uno per persona , coordinati per fare comandi in parallelo, ma va ben congegnato meccanismo di sincronizzazione. Parti DelCorpo -&amp;gt; Componente/i oppure Parte. La mappa deve essere (x,y); l’altezza viene indicata onMouseOver certi pixel dove è posto il Personaggio; se personaggio dentro edificio/grotta cambio img (es sfocato/tratteggiato). Mosse: astrarre per target; molte mosse sono simili tra loro, somiglianza va sfruttata, hanno magari dei target in comune, o variano solo per un parametro. Creare mappa anche con drag and drop immagini ?(un po’ difficile). Più layout per interfaccia grafica (esempio uno che mostra errori input su text area, uno con alert, uno su box text area separato). Input comandi consumato pezzo per pezzo, alcune parole se prevedono parametri quando riconosciute fanno fetch anche di parola (numero) successiva. Face toon foto? Import parziali di personaggi (tutto tranne/solo questi campi specificati). Texture mappa complete o ripetibili (es per suolo). Anteprima battaglia stile battaglia pokemon (magari per 1/2/3 vs 1/2/3) per rappresentare scontro. Conviene usare xslx (excel) per dati, considerare che può non servire la libreria Java per leggere stringhe per operazioni. Mossa “again” , ripeti la precedenza(opportuna modifica parametri, es mossa spostamento). Possibile gestione contromosse: si usano marker (tag): ogni mossa ha elenco tag del tipo di contromosse che può subire (con probabilità annessa, che può dipendere da pg che subisce mossa congiuntamente a mossa stessa). Ogni mossa inoltre deve essere taggata come possibile contromossa che il pg può usare (per schivare può fare in più modi). A seconda del lancio del dado il pg che effettua La contromossa può anche scegliere tipologia di contromossa o solo la mossa della tipologia che ha beccato (entrano in gioco riflessi ect.). I parametri che fanno attivare unq o un’altra contromossa sono dinamici, posso dipendere ad esempio dalla posizione tra i due pg o altre statistiche. Tag contromosse a fasce (es. coprirsi è sempre più facile che schivare che e più facile di schivare e contrattaccare (?); all’interno dello stesso schivare e contrattaccare ci sono più sotto categorie). Per aggiunta personaggio può essere utili interfaccia dedicata, non linea di comando (o altre operazioni, specie se ci sono tabelle). Mossa “premonizione”: predire il futuro a breve termine, dici che mossa vorresti fare e ti dice esito (o più esiti se uno chiede più mosse). Funziona solo sulla prossima mossa. Contromossa delle contromossa gestione?? Eventualmente nell’esito si prevede ancore contro-contromossa. Ma si innesca reazione a catena, inoltre da gestire scelta contromossa in questo caso. Applicazione tag conoscenza(universo di appartenenza): “Termoli”, “pokemon”, “liceo classico Termoli”, anche gerarchici, per filtrare sui personaggi.target componibili , fattorizzato creazione mosse, hanno un costo magari per indicare quantovoccupano dicuna mossa, relativo maybe a un parametro o più del target stesso. In particolare, non saranno salvate le mosse per un personaggio (o solo alcune “preferite”) ma il suo insieme di target i quali devono dire:statistica che influenzano, “costo del turno” che richiedono al variare dell’intensità del target (che aumenta linearmente, esponenzialmente, generica f(x)) quindi corsa blanda costo 1 , Max corsa costo 5 (max), elenco (string) target incompatibili con tale target (se serve), nota relative ad es per quando uno vuole creare una mossa durante la battaglia (“target corsa, max sforzo dedicabile 4 ect” metti “50 metri corsa” “ok/troppo! Vuoi sforzati di più rischiando effetti collaterali?”). Si può autoscrivere la voce narrante del gioco come “la tua coscienza” mentre che giochi, d’altronde si interagisce con essa. Considerare che un target può appartenere a più personaggi, magari sotto nomi di mosse diversi.&lt;br /&gt;
Definire gerarchia di personaggi per template (tipo classe e super classe) e template importabili (tipo usa fuoco). Es umanoide non umanoide, tra umanoide maschio- femmina etc. Classe che estende System.out per creare funzioni che aggiungono Header “DEBUG:” etc; due programmi Java , due main: uno delegato a calcoli + gestione Excel; altro legge stdout dell altro per interfaccia grafica. Per allenare PG creare dei PG fantocci con label per fare Q-learning iniziale, più avanti far allenare pg tra loro; creare vari fantocci: tank terrestre fisico, healer volante etc. Excel: si usa css che si può rendere tabellare, più facile da trattare nel codice rispetto a .xslx. Ogni “utente” ed Lostefra ha il suo personale dizionario con sue personali short cut da usare in partita, eventuale login con password (opzionale) x accesso. Vedere license show down. Mappa unica stile giochi di ruolo, si vede tutto da sopra: click o simili su edifici/caverne per mappe interne a tale posto, così ok sprite e per rappresentare “pg in volo” sprite dedicato. Densità aria per dire quando anche un uomo per es può volare. Ipotesi più efficiente per dare un valore stima al pg: AI base che gioca a manetta contro altre AI base e dalle vittorie si fa l’euristica, più vittoria facile/veloce/stracciante più punti, contro vari pg, contro pg standard bench mark.&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Note&amp;diff=196</id>
		<title>Note</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Note&amp;diff=196"/>
		<updated>2020-05-23T18:01:04Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: /* Deploy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Note ==&lt;br /&gt;
&lt;br /&gt;
'''Vedere altre note su fogli di carta e promemoria del telefono. Ce ne sono molte.'''&lt;br /&gt;
'''La copiatura dai fogli di carta dei continuare da pagina 4 (&amp;quot;alterare param..&amp;quot;).'''&lt;br /&gt;
&lt;br /&gt;
===Inspirational Concepts===&lt;br /&gt;
* Gioco Lotta (Pokémon, Pokkén)&lt;br /&gt;
* no caselle esplicite&lt;br /&gt;
* Descrizione rispetto a: ambiente, nemico, oggetti&lt;br /&gt;
* pokémon, DnD, Call of Duty, Super Smash Brawl, corse pazze&lt;br /&gt;
* concentrarsi su: fluidi, telecinesi, razze, bonus/malus, gradi di libertà (fisicamente parlando) &lt;br /&gt;
* scacchi (es. crea casella), shaolin showdown&lt;br /&gt;
* prevedere = creatività&lt;br /&gt;
* acqua, aria, fuoco, terra&lt;br /&gt;
* gravità (newton), verso alto, basso, destra, sinistra, circolare, tutti i versi&lt;br /&gt;
* jumanji, savana, animali, zoologia&lt;br /&gt;
* tempo/spazio&lt;br /&gt;
* BF4, pirati, roma (imperium civitas)&lt;br /&gt;
* musica come arma (rap)&lt;br /&gt;
* magia, prestigiatori&lt;br /&gt;
* dinosauri (documentario, libro, zoologia)&lt;br /&gt;
* avengers, supereroi (libro)&lt;br /&gt;
&lt;br /&gt;
* Looney toons&lt;br /&gt;
&lt;br /&gt;
===Personaggi (con statistiche e stati)===&lt;br /&gt;
* combattenti (con statistiche e stati)&lt;br /&gt;
* immagine rappresentativa per rappresentare meglio&lt;br /&gt;
* HP: colore rosso su immagine personaggio, dove sei debole/già colpito (idea scartata)&lt;br /&gt;
* penitenza: il malus può essere inteso come ciò che c'è nell'inserimento successivo, malus cumulativo&lt;br /&gt;
* essere ipocrita, finzione (schermo)&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (personaggi)&lt;br /&gt;
* metamorfosi&lt;br /&gt;
* alchimisti&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* possibilità giù in terra/ giù in acqua, con reachable e unreachable Boolean. Fuori da mappa anche reachable e unreachable.&lt;br /&gt;
* Personaggi composti di parti[] es. testa, busto, gambe, braccia, coda, pinna, ali. Distinzione per arto di movimento e/o spostamento boolean.&lt;br /&gt;
* Arti possono provocare danno, bruciatura , paralisi a contatto (Boolean) . Percentuale di probabilità accompagna ogni Boolean.&lt;br /&gt;
* Ogni parte del corpo punti vita + se inutilizzabile + amputata + stato (es paralisi).&lt;br /&gt;
* Per fare battaglie tra molto grandi =&amp;gt; 1 m lo si intende come 10m.  (rivalutato, aumentare livello scaling)&lt;br /&gt;
* Personaggio fusionabile Boolean + string nomi con cui si fonde.&lt;br /&gt;
* Distinzione tra infernape e infernape1/2/3 ect tra “specie” e “nome”.&lt;br /&gt;
* variabile Boolean respawnable.&lt;br /&gt;
* Raccogliere a piene mani da: https://spore.fandom.com/wiki/Creature_Editor&lt;br /&gt;
* Ad esempio weapons come elemento di Corpo (zanne, corna) e possibilità di muoversi/attaccare furtivamente.&lt;br /&gt;
* Divisibile e unibile come boolean e array di stringe associate per indicare i nomi con cui si unisce il Personaggio o in cui si divide.&lt;br /&gt;
* Variabili posizione nome: from_x/y ; to_x/y.&lt;br /&gt;
* Classe Stato, Personaggio contiene Array di stato, stato contiene moltiplicatori per statistica es attacco velocità precisione elusione ect.&lt;br /&gt;
* Personaggio deve avere una stat tipo sanità mentale, intelligenza, quanto è confuso e quanto è impaurito (2).&lt;br /&gt;
&lt;br /&gt;
* Per personaggi molto piccoli (meno di 1m x 1m x 1m) possibilità di essere in (x,y,z) tra 0 e 1.000.000 (ordine del micrometro, 1*10^-6 == 0,000001) e avere (lenX, lenY, lenZ). In questo modo sono definite dimensioni inferiori ad 1 m^3.&lt;br /&gt;
* personaggi max 20x20 (rivaluato, meno limitata)&lt;br /&gt;
&lt;br /&gt;
===Mosse===&lt;br /&gt;
* &amp;quot;combattimento prescinde da combattente&amp;quot;&lt;br /&gt;
* mosse hanno: direzione, azione, attacco (mosse pokémon)&lt;br /&gt;
* Parametri interi per mossa (direzione, consumabili) con lower e upper bound&lt;br /&gt;
* camuffarsi =&amp;gt; DnD manuale&lt;br /&gt;
* wrestling (libro) per le mosse/prese&lt;br /&gt;
&lt;br /&gt;
* X fa una mossa contro Y: Z potrebbe reagire (Es. ricevendo il colpo al posto di Y). Può essere realizzato sia come se &amp;quot;Y chiede soccorso Z&amp;quot; o come reazione di alleati adiacenti &amp;quot;Z soccorre Y&amp;quot;&lt;br /&gt;
* Mossa prende come parametro di ingresso Corpo, ossia la parte del corpo coinvolta nella mossa (es arto , tutto corpo ect). &lt;br /&gt;
&lt;br /&gt;
===Oggetto (con statistiche e stati)===&lt;br /&gt;
* armi: lacci (stati), lame (potenze), sassi, reti, pistole (munizioni), razzi, bombe (potenze), fuoco (d'artificio?) =&amp;gt; manuale DnD&lt;br /&gt;
* veleno n modi =&amp;gt; DnD manuale&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (oggetti)&lt;br /&gt;
* automezzi con cannoni, variabile 'hasEntrata', 'tempoRiutilizzo'&lt;br /&gt;
* violino come arma (tutti strumenti musicali): a fiato, a corda, a percussione&lt;br /&gt;
* veleni, ampolle e flaconi magici, insieme di 'oggetti dentro' un oggetto&lt;br /&gt;
&lt;br /&gt;
* Classe oggetto: es albero, roccia, casa: forza necessaria per sradicare + forza per lanciare + destrezza / agilità per appendersi + nascondersi in proporzione alle dimensioni di chi si nasconde. &lt;br /&gt;
* Altri es. pali. Sotto terra o sotto acqua/lava/melma o simili. &lt;br /&gt;
* Acqua rallenta se non hai pinne boolean.&lt;br /&gt;
* Classe strumento per oggetti che si tengono in mano, es reti , pistole, spade, pugnali, scudi, elmi, lancia, arco , frecce, lanciarazzi, fucili cecchino, fucile assalto, corde.&lt;br /&gt;
* Strumenti e mosse: danno ad area, perforante, contundente (vedi dnd armi). Mosse possono creare/modificare/distruggere oggetti e strumenti.&lt;br /&gt;
* Oggetti del campo di gioco incidono su elusione (parametro di personaggio).&lt;br /&gt;
* Buco/abisso (boolean) per dire se c’è o meno il suolo (Suolo come classe?). &lt;br /&gt;
* Radiazioni. &lt;br /&gt;
&lt;br /&gt;
===Modalità gioco===&lt;br /&gt;
* turnazione&lt;br /&gt;
* 1 v 1 v 1 etc., ma anche squadre casuali&lt;br /&gt;
* punteggio: chi fa più punti, più uccisioni, definizione di 'punto', gioco per perdere&lt;br /&gt;
* inserisci personaggio total random&lt;br /&gt;
&lt;br /&gt;
* Modalità battaglia con interazione stile battaglia navale (non si vede mossa dell'avversario)&lt;br /&gt;
* Modalità di gioco: tutti contro tutti (battle royale), death match, vs CPU mode zombie(attaccano solo, se non possono vanno verso nemico): serve introdurre un punteggio, di sicuro per mode zombie , ma anche per death match e tutti contro tutti&lt;br /&gt;
* ingressi: ne entra un altro?&lt;br /&gt;
&lt;br /&gt;
===Mappa===&lt;br /&gt;
* arene&lt;br /&gt;
* minimappa (pixelata ?), legenda oggetti base, devono esserci caselle implicite&lt;br /&gt;
* mappa 100x100 (rivalutato, meno limitata)&lt;br /&gt;
* Cannoni fissi in mezzo al campo (strumento).&lt;br /&gt;
&lt;br /&gt;
===Funzionalità generali===&lt;br /&gt;
* Chiave: non una flat input box per i comandi; ma dinamica: si suppone il soggetto &amp;quot;io&amp;quot; (le azioni le fanno in prima persona i personaggi), ogni mossa deve prevedere dei complementi (&amp;quot;verso&amp;quot;, &amp;quot;tra quanto&amp;quot;, &amp;quot;cosa&amp;quot;, &amp;quot;a favore di chi&amp;quot;, &amp;quot;contro chi&amp;quot;). Ogni complemento collegato con box stile in pop up =&amp;gt; bootstrap (la grafica sara unica). Prevedere anche modalita flat con input del tipo &amp;quot;azione a=pippo verso=termoli&amp;quot; (regex check)&lt;br /&gt;
* &amp;quot;meno tabelle&amp;quot;, &amp;quot;no bottoni&amp;quot; e solo foto che si alternano, &amp;quot;la grafica serve&amp;quot;: text box unica interazione, text area (history), immagine personaggio e immagine mappa&lt;br /&gt;
* &amp;quot;persistenza anche da interfaccia grafica&amp;quot;, diritti di scrittura sui file?&lt;br /&gt;
* Segnalazione (comando per fare nota)&lt;br /&gt;
&lt;br /&gt;
===Deploy===&lt;br /&gt;
* &amp;quot;commenta il codice&amp;quot;, &amp;quot;dividi et impera&amp;quot;&lt;br /&gt;
* Server web (Apache) ospita partite (+ localmente ha i file di funzionamento), in LAN client giocano o da remoto con IP pubblico. Interfaccia HTML5 + Javascript per giocare. Studiare engine grafici Javascript&lt;br /&gt;
* bootstrap! (specie per input box)&lt;br /&gt;
* Unity, WebGL (vedi SDK dedicata, built per Android/iOS/etc.)&lt;br /&gt;
* Modelli 3D videogiochi: https://www.models-resource.com/ , meglio se disaccoppiati da Unity (e.g. in cartelle independenti), aggiunta modelli online&lt;br /&gt;
* Tutorial tank Unity: https://learn.unity.com/project/tanks-tutorial&lt;br /&gt;
* WebSocket per gestire client asincroni (NodeJS ?)&lt;br /&gt;
* Su YT in “guarda più tardi” video per interagire unity con JS (“unity.sendMessage()” o simili)&lt;br /&gt;
* Due client: uno con WebGL e uno JS base con solo input (per test, per mancanza di supporto browser a WebGL)&lt;br /&gt;
&lt;br /&gt;
==== Altro (scartato)====&lt;br /&gt;
* rpgmaker, godot, aseprite, pixelart (in generale), ma anche phaser, piskel&lt;br /&gt;
* joomla! Per far prima con html&lt;br /&gt;
* libreria pygame&lt;br /&gt;
* Vuegg: https://github.com/marketplace/vuegg  &lt;br /&gt;
* Material Design&lt;br /&gt;
* JAVA: Class.forName(&amp;lt;name&amp;gt;.class).newInstance();&lt;br /&gt;
&lt;br /&gt;
===Copia&amp;amp;incolla generale, da smistare in sotto capitoli. Contiene anche '''tutte''' note del telefono (al 22/02/2020)===&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 1:'''&lt;br /&gt;
&lt;br /&gt;
Mosse che trasformano l’avversario: attenzione è una mossa devastante. Trasformazione totale o parziale. Si devono poter aggiungere mosse, strumenti dinamicamente. Battle bot:ribaltano, scintille, elementi (Oggetti) che danneggiano. One piece: I frutti del diavolo (悪魔の実 Akuma no mi?) sono frutti misteriosi che donano poteri soprannaturali a chi li mangia, rendendoli però incapaci di nuotare. Di conseguenza il contatto con l'acqua di mare o con una speciale sostanza conosciuta come agalmatolite indebolisce gli utilizzatori di frutti del diavolo e li priva dei loro poteri. Alcune persone sono inoltre in grado di ricorrere all'Ambizione (覇気 Haki?), una forza spirituale che permette di avvertire la presenza di altri esseri viventi e di predirne i movimenti, di irrobustire parti del corpo e di intimidire o fare svenire le creature con una debole forza di volontà. Personaggio ha funzione baricentro_x, baricentro_y calcolate come (from_x+to_x)/2 sul quale si basa la funzione di libreria getDistance(Personaggio A, Personaggio B, float success); tale funzione serve per calcolare per i PNG e per i PG se ha senso usare una mossa. Non-onniscienza: delle volte non si può sapere distanza avversario e fallisce la mossa per la distanza -&amp;gt; “float success” rappresenta la probabilità di successo (Personaggio ha parametro “osservare”). PNG di due categorie: offensivi o neutrali (no priorità a mosse di attacco, ma tutto casuale). Mosse e oggetti per chiamare Personaggi, magari non necessariamente alleati (2 mosse e 2 oggetti quindi necessari), richiamo di un personaggio preciso o di uno a caso. Ogni mossa/azione deve avere un tempo di attesa espresso in turni (alla meglio 0) per poter ripetere la mossa/azione. Strumenti anche mezzi di trasporto di aria, di terra, di acqua (o lava/palude). Possono attivare una metamorfosi / Unione per cambiare stats personaggio. Veicoli con armi o riparo. Gli strumenti da trattare come gli oggetti. Classe unica? I match/partite (immagino Classe Partita) devono avere variabile boolean “respawn”, per distinguere death match a punti con death match con una vita. Wrestling per ispirarsi nella lotta libera: calci pugni ginocchiate prese lanci salti testate gomitate ecc. Per punti si vince a un limite o dopo un tot di mosse , oppure al primo dei due raggiunti (max_punti e max_mosse parametri di Partita). I punti si guadagnano alla kill (un Punteggio per squadra, int punteggio salvato localmente dentro ogni Personaggio che ha la variabile int squadra). Si guadagnano tanti punti quanti sono i punti della variabile “valore” del personaggio ucciso, tale variabile è calcolata come somma dei valori di tutte le mosse/stats ect del Personaggio. Imperium civitas. Attacco dei giganti. Possibilità di morire se colpiti in un unico punto (tallone d Achille) implementabile come variabile boolean. Jump force. Game dev tycoon. Acqua diventa tsunami. Variabile int per attacco cumulativo di gruppo: es calciatori che più si passano la palla più l’attacco è forte. Suolo magico: non tutti i personaggi possono accedervi, array di string elenca i nomi di chi può accedervi. Funzione esci/entra in classe Personaggio per simulare scambio pokemon 6vs6. Piovra gigante. Rischio=danno*probabilita. Mossa su strumento e con strumento?&lt;br /&gt;
Mosse fisiche per arrampicarsi su avversario(se e solo se sei la metà di dimensioni(?)), atterrarlo, lanciarlo, accecarlo, immobilizzarlo. Se sei in gruppo/ orda bonus ad attacchi combinati. Armi: fruste e scheggie, corni che si suonano per chiamare altri. Tipo della mossa con moltiplicatore tra 0 (immune) e 2 (float): acqua, fuoco, magia, terra: da ispirarsi ai pokemon ma non da copiare, penso. Armi da campo: cannoni e catapulte. Veicoli d’acqua: moto acqua, canoe, barche a motore a remi. Nei veicoli malus su attenzione (variabile int in personaggio, indica attenzione in combattimento e non in altro) perché si è impegnato alla guida . All’inizio in image view “the hero” e “the map”. Condizione vittoria (oltre a morte, punti, o numero mosse, cioè tempo) morte di un singolo Personaggio, che potrebbe rappresentare un edificio, cassaforte o simili. Personaggio si può svestire e lasciare strumenti, modificano statistiche di attacco, difesa , agilità, ect. Variabile luce o non luce, che peggiora/migliora a seconda della specie la visibilità, quindi la precisione , specie in attacchi a distanza: Scurovisione evita i malus.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 2:'''&lt;br /&gt;
&lt;br /&gt;
Gioco2: se ci si lancia da oggetti , dopo essersi arrampicati, possono esserci danni da caduta; strumenti come paracaduti o mosse magiche possono evitare i danni. Pozione del vento, soffi e devi attacchi. In difesa puoi parare, schivare, deviare: tre variabili? Ambiente: colline e pianure uguali, Monti sono Oggetti, picco ossia un unico monte oggetto. Rocce volanti, nuvole sospese: oggetto può essere sospeso e può fare periodicamente una mossa, ad es tuono, può spostarsi, può fare entra/esci, oggetto albero e oggetto foresta, si possono prendere, nascondersi, arrampicarsi, lanciarli, ostacolano velocità ma se si ha abbastanza forza si spezzano alberi. Acqua poco profonda, profonda, molto profonda: variabile boolean in Personaggio “alto” per toccare in acqua profonda, con acqua si generano fiumi laghi e mari. Ambiente si deve poter evolvere: ad esempio oggetto diga può fare metamorfosi e diventare oggetto cascata/torrente in piena. Per edifici più oggetti che rappresentano le mura e il tetto, variabile boolean per oggetto per entrare nell’oggetto. Possono essere spazzati via: danni da crollo, si può combattere all interni, contengono strumenti come tavoli sedie mobili letto ect. Se uno viene schiantato contro uno strumento prende danno(es danno da schianto). Ci possono essere scale, si può non avere contatti visivo sull’avversario. Oggetto mura, oggetto torre, oggetto casa interno sono cose distinte: possono dare malus/bonus su visibilità. Ambiente: pozzi e grotte, da gestire come interno casa. Lava come acqua, ogni oggetto può essere sorgenti di liquido: monte sorgente acqua, vulcano sorgente lava. Può esserci variabile probabilità eruzione, se settata a 1 c’è una continua eruzione. Strade di vario tipo, sovrapposta a altri suoli, migliorano velocità di alcuni strumenti, variabile boolean “ha le ruote” in classe strumenti. Unificare classe strumento e classe oggetto. Oggetti sospesi: case sospese su albero, ad es. Fiamme in mezzo al suolo. Oggetti: porto, aereoporto, grattacieli, dighe, impianti a fune, ospedali per curarsi e prendere oggetti per curarsi dopo, scuole contenenti libri per apprendere una mossa, luoghi di ingegneria per creare oggetti, ad esempio veicoli o armi, soldi nel gioco per comprare da eventuali venditori. Ogni oggetto avra un prezzo (valutabile circa in euro per semplicità). Variabile float per fame, sete, sonno, caldo-freddo (parte da 0.5). Nella mappa ci deve essere per ogni punto la temperatura. Possibilità di vomito, dissenteria, problemi cardiaci, respiratori, muscolari. Armi: balestra, mani nude, sasso, tirapugni, torcia accesa. Armature: intralciano o favoriscono agilità, attacco, poteri magici, rumorosa (elusione), è uno strumento/oggetto. Attacchi possono essere prolungati per turni, mosse variabile boolean prolungabile: può aumentare o diminuire intensità, c’è un max espresso in turni di prolungabilita, inoltre può essere leggermente alterato con una variabile casuale. Equipaggiamento (strumento/oggetto): pietra focaia, attrezzi da scalata, boccale di birra, cavallo, moto, chiodi, martello da fabbro, corda, corazza, dardo, faretra/zaino/sacca (oggetti che contengono una lista di oggetti, stringhe) con un numero per la quantità) e capacità massima zaino e ogni oggetto può avere un valore intero per dimensione (es martello 3, ascia grande 7), mantello, olio, variabile boolean prende fuoco/conduce elettricità, amplifica magnetismo, aumenta esplosioni nucleari, aumenta forza di gravità (?), pala, piccone, rampino, specchio, per osservare quando si è nascosti e si ha malus su visibilità. Strumenti da scasso per aprire porte: variabile boolean per oggetti: entrata con scasso. Personaggio: string razza per swag, immunità a veleni e malattie, elusione, agilità, precisione, abilità magiche(?), difesa fisica. In ultima torcia: agilità, coraggio, forza, intelligenza, magia, manualità, percezione, socialità. Bestiario: aracnoide di varie dimensioni, talpe giganti, vermi giganti di terra di mare e di lava ect, bulbo trascinatore che ha tentacoli per tirare a se e mangiare, lui è immobile, calabrone gigante, serpenti giganti, cinghiali, draghi, elfi, goblin e re goblin, sciamani (goblin), totem di guerra come strumento/oggetti per alterare statistiche nella loro area di influenza, lupo, mastino bruciante, nani, non morti/zombie/mummia/scheletro variabile boolean vivo a false ma ha ancora hp su parti del corpo: variabile boolean “zombizabile”. Orchi, pesci da terra (anfibi) tritone dell abisso, troll e trollin (orchi più deformi), umani. Abilità dei personaggi in ultima torcia: artificiale (robot) immunità a soffocamento, veleni, malattie ect immune a manipolazioni psichiche, visione oscurità; danno da attacco in carica; fiammegiante ossia la creatura può incendiarsi e elettrizzante ossia può diventare elettrica caricamente; modalità furia/mailmen ossia ottiene bonus su alcune/tutte le statistiche; gigantesco o molto piccolo due boolean (?forse non serve); immunità a magie mentali, al fuoco; linguaggi (?); non morto; danno da attacco in presa; pungiglioni velenosi; sa muoversi su ragnatele o è rallentato, resistenza a perforazione, respirare sott’acqua o sotto lava o nei liquidi in genere; rigenerazione; riceve danni dalla luce solare o da assenza di luce; è terrorizzato/impaurito/intimidito o se è imperturbabile boolean. Danno da trascinamento; paralizzante; può diventare più veloce (?non serve); visione a infrarossi attraverso oggetti; volare o andare sotto terra. Imperium editor, cose che penso di non aver ancora scritto: stagioni, suolo erboso o terriccio, sabbia con erba e terra e da sola, strade e stagioni, altitudine, alberi e arbusti, vari tipi a foglia larga, conifere, alberi secchi, palme, arbusti verdi e secchi, cactus, alghe marine, rocce e pietre, scheletri per terra, legna tagliata (alberi tagliati), carri e carretti, grotte e rovine per accessi sotterranei, locande, templi, accampamenti, fortini, monoliti, fontana, tombe e cimiteri, borse per terra, pozzo, troni, croci(del teschio), pozzo, capanne, lapidi, ponti, recinzioni, falò, tende, torri, panoplia, fessure come abissi, statue, rovine (deserto) come case distrutte, colonne per costruire templi, piramidi, sfingi, bandiere, rovine in Europa, campi coltivati che contengono cibo, fiamma (in altre), roccia in altre per montagne, altre-&amp;gt;rovine per monumenti non egiziani ma europei.&lt;br /&gt;
Ci sono paludi. Tende da campo. Forti, porti. Edifici delle fortezze, edifici dei villaggi. Naufragi e scogli.&lt;br /&gt;
Parametri voglia/impegno float per descrivere voglia di combattere Personaggio. Ricevi danno uscendo dalla mappa tra 1-5% tra 6-10% tra 11-15% della vita totale di ogni parte del corpo per ogni turno di gioco. Danno da precipitazione diverso da carica, uno verticale uno orizzontale, se precipiti da molto in alto hai bonus, oltre che danni da schianto lol. Baionette, formazione a blocchi, a quadrato (difensiva) sparano su quattro lati, a schiera vanno avanti. Usano un colpo poi lunga ricarica. Variabile boolean per attivare o meno fuoco amico. Azione per cambiare posizione: in piedi, in ginocchio(inteso come via di mezzo), sdraiato: per permettere migliore visibilità a chi è dietro (nella formazione).&lt;br /&gt;
Altruismo, coraggio, spingere oltre il limite, difendere al posto di un altro, migliorare posizione per avere bonus. Mosse da usare in condizioni psicologiche idonee: mosse estreme per disperazione, bonus unici. Condizioni per situazioni: blocco, spalle al muro, stritolato, confuso, semi parassiti addosso, azzoppato, bagnato d’acqua, lame affilate, corazza indurita, tante copie di me stesso attive, preveggente. Per ambiente:pioggia (torrenziale), barriera a cupola, punte metalliche a terra, blocco di fumo nero. Far volare un avversario/alleato. Tutti possono fare tutto sotto effetti magici o fisici. Un cavallo può volare se viene preso da un uccello e portato in alto.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 3, 4:'''&lt;br /&gt;
&lt;br /&gt;
Gioco1,2,3,4: tutto caricato su wikis.&lt;br /&gt;
&lt;br /&gt;
Gioco3: Mosse con caricamento + spostamento (es. kameamea con teletrasporto). Ciclo di interazione principale:crea o combatti. Modalità campagna, che chiede in input da che battaglia iniziare, ma implica tipi battaglie prefissati. Alla morte/sconfitta di un personaggio si possono alterare statistiche (es personaggio può cambiare fazione). Alcune mosse possono lasciare oggetti sul terreno: (ad es, radici di Groth). Ogni oggetto può alterare le statistiche al passaggio sopra, nelle vicinanze. Boolean invisibile per personaggio, diverso da elusione infinita. Se personaggio va in un altro dimensione -&amp;gt; unreachable. Attacco coordinato, se non lo fanno tutti vale lo stesso ma depotenziato opportunamente . Personaggio in modalità maniac (2 mosse per turno) e in modalità depressive (1 mossa ogni due turni); personaggio Flash può fare 10 mosse in un turno. Chiudi con lucchetto oggetto da dentro o da fuori, oggetto ingresso in oggetto casa , più ingressi per un singolo oggetto.nicole aniston. Rimbalzo se ci si schianta contro oggetto da calcolare con parametro. Ryuk e Darkrai.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gioco 4 23/07/2019:&lt;br /&gt;
Pula fiction, aracnidi, oggetto: due superfici rettangolari di forma diversa, anche inclinate , collegate. Più pezzi collegati tra loro per forme cilindriche cave, ad esempio, tipo vulcano. Mappa con sprite personaggi, canvas: anche mouseClick? Statistiche con nome gerarchico, es pokemon_attacco. Modalità survival, stile isola di jurassic park gdr; sia in coop che contro; possibilità di fare N turni di fila se non ci sono altri player giocanti nelle vicinanze (ciò però comporterebbe , in modalità contro , di capire quando c’è qualcuno nelle vicinanze perché si andrebbe di 1 turno alla volta, soluzioni: in mod contro 1 turno per volta oppure meccanismo di sincronizzazione turni quando uno vede l’altro (anche furtivo) come c’è attacco 1 turno a testa) .. analogo a Battle royale(?); inizio con starter kit random. Modalità assedio al castello. Inoltre se posso fare N turni di fila si può pensare a più pc , uno per persona , coordinati per fare comandi in parallelo, ma va ben congegnato meccanismo di sincronizzazione. Parti DelCorpo -&amp;gt; Componente/i oppure Parte. La mappa deve essere (x,y); l’altezza viene indicata onMouseOver certi pixel dove è posto il Personaggio; se personaggio dentro edificio/grotta cambio img (es sfocato/tratteggiato). Mosse: astrarre per target; molte mosse sono simili tra loro, somiglianza va sfruttata, hanno magari dei target in comune, o variano solo per un parametro. Creare mappa anche con drag and drop immagini ?(un po’ difficile). Più layout per interfaccia grafica (esempio uno che mostra errori input su text area, uno con alert, uno su box text area separato). Input comandi consumato pezzo per pezzo, alcune parole se prevedono parametri quando riconosciute fanno fetch anche di parola (numero) successiva. Face toon foto? Import parziali di personaggi (tutto tranne/solo questi campi specificati). Texture mappa complete o ripetibili (es per suolo). Anteprima battaglia stile battaglia pokemon (magari per 1/2/3 vs 1/2/3) per rappresentare scontro. Conviene usare xslx (excel) per dati, considerare che può non servire la libreria Java per leggere stringhe per operazioni. Mossa “again” , ripeti la precedenza(opportuna modifica parametri, es mossa spostamento). Possibile gestione contromosse: si usano marker (tag): ogni mossa ha elenco tag del tipo di contromosse che può subire (con probabilità annessa, che può dipendere da pg che subisce mossa congiuntamente a mossa stessa). Ogni mossa inoltre deve essere taggata come possibile contromossa che il pg può usare (per schivare può fare in più modi). A seconda del lancio del dado il pg che effettua La contromossa può anche scegliere tipologia di contromossa o solo la mossa della tipologia che ha beccato (entrano in gioco riflessi ect.). I parametri che fanno attivare unq o un’altra contromossa sono dinamici, posso dipendere ad esempio dalla posizione tra i due pg o altre statistiche. Tag contromosse a fasce (es. coprirsi è sempre più facile che schivare che e più facile di schivare e contrattaccare (?); all’interno dello stesso schivare e contrattaccare ci sono più sotto categorie). Per aggiunta personaggio può essere utili interfaccia dedicata, non linea di comando (o altre operazioni, specie se ci sono tabelle). Mossa “premonizione”: predire il futuro a breve termine, dici che mossa vorresti fare e ti dice esito (o più esiti se uno chiede più mosse). Funziona solo sulla prossima mossa. Contromossa delle contromossa gestione?? Eventualmente nell’esito si prevede ancore contro-contromossa. Ma si innesca reazione a catena, inoltre da gestire scelta contromossa in questo caso. Applicazione tag conoscenza(universo di appartenenza): “Termoli”, “pokemon”, “liceo classico Termoli”, anche gerarchici, per filtrare sui personaggi.target componibili , fattorizzato creazione mosse, hanno un costo magari per indicare quantovoccupano dicuna mossa, relativo maybe a un parametro o più del target stesso. In particolare, non saranno salvate le mosse per un personaggio (o solo alcune “preferite”) ma il suo insieme di target i quali devono dire:statistica che influenzano, “costo del turno” che richiedono al variare dell’intensità del target (che aumenta linearmente, esponenzialmente, generica f(x)) quindi corsa blanda costo 1 , Max corsa costo 5 (max), elenco (string) target incompatibili con tale target (se serve), nota relative ad es per quando uno vuole creare una mossa durante la battaglia (“target corsa, max sforzo dedicabile 4 ect” metti “50 metri corsa” “ok/troppo! Vuoi sforzati di più rischiando effetti collaterali?”). Si può autoscrivere la voce narrante del gioco come “la tua coscienza” mentre che giochi, d’altronde si interagisce con essa. Considerare che un target può appartenere a più personaggi, magari sotto nomi di mosse diversi.&lt;br /&gt;
Definire gerarchia di personaggi per template (tipo classe e super classe) e template importabili (tipo usa fuoco). Es umanoide non umanoide, tra umanoide maschio- femmina etc. Classe che estende System.out per creare funzioni che aggiungono Header “DEBUG:” etc; due programmi Java , due main: uno delegato a calcoli + gestione Excel; altro legge stdout dell altro per interfaccia grafica. Per allenare PG creare dei PG fantocci con label per fare Q-learning iniziale, più avanti far allenare pg tra loro; creare vari fantocci: tank terrestre fisico, healer volante etc. Excel: si usa css che si può rendere tabellare, più facile da trattare nel codice rispetto a .xslx. Ogni “utente” ed Lostefra ha il suo personale dizionario con sue personali short cut da usare in partita, eventuale login con password (opzionale) x accesso. Vedere license show down. Mappa unica stile giochi di ruolo, si vede tutto da sopra: click o simili su edifici/caverne per mappe interne a tale posto, così ok sprite e per rappresentare “pg in volo” sprite dedicato. Densità aria per dire quando anche un uomo per es può volare. Ipotesi più efficiente per dare un valore stima al pg: AI base che gioca a manetta contro altre AI base e dalle vittorie si fa l’euristica, più vittoria facile/veloce/stracciante più punti, contro vari pg, contro pg standard bench mark.&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Note&amp;diff=195</id>
		<title>Note</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Note&amp;diff=195"/>
		<updated>2020-05-23T17:36:56Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: /* Deploy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Note ==&lt;br /&gt;
&lt;br /&gt;
'''Vedere altre note su fogli di carta e promemoria del telefono. Ce ne sono molte.'''&lt;br /&gt;
'''La copiatura dai fogli di carta dei continuare da pagina 4 (&amp;quot;alterare param..&amp;quot;).'''&lt;br /&gt;
&lt;br /&gt;
===Inspirational Concepts===&lt;br /&gt;
* Gioco Lotta (Pokémon, Pokkén)&lt;br /&gt;
* no caselle esplicite&lt;br /&gt;
* Descrizione rispetto a: ambiente, nemico, oggetti&lt;br /&gt;
* pokémon, DnD, Call of Duty, Super Smash Brawl, corse pazze&lt;br /&gt;
* concentrarsi su: fluidi, telecinesi, razze, bonus/malus, gradi di libertà (fisicamente parlando) &lt;br /&gt;
* scacchi (es. crea casella), shaolin showdown&lt;br /&gt;
* prevedere = creatività&lt;br /&gt;
* acqua, aria, fuoco, terra&lt;br /&gt;
* gravità (newton), verso alto, basso, destra, sinistra, circolare, tutti i versi&lt;br /&gt;
* jumanji, savana, animali, zoologia&lt;br /&gt;
* tempo/spazio&lt;br /&gt;
* BF4, pirati, roma (imperium civitas)&lt;br /&gt;
* musica come arma (rap)&lt;br /&gt;
* magia, prestigiatori&lt;br /&gt;
* dinosauri (documentario, libro, zoologia)&lt;br /&gt;
* avengers, supereroi (libro)&lt;br /&gt;
&lt;br /&gt;
* Looney toons&lt;br /&gt;
&lt;br /&gt;
===Personaggi (con statistiche e stati)===&lt;br /&gt;
* combattenti (con statistiche e stati)&lt;br /&gt;
* immagine rappresentativa per rappresentare meglio&lt;br /&gt;
* HP: colore rosso su immagine personaggio, dove sei debole/già colpito (idea scartata)&lt;br /&gt;
* penitenza: il malus può essere inteso come ciò che c'è nell'inserimento successivo, malus cumulativo&lt;br /&gt;
* essere ipocrita, finzione (schermo)&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (personaggi)&lt;br /&gt;
* metamorfosi&lt;br /&gt;
* alchimisti&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* possibilità giù in terra/ giù in acqua, con reachable e unreachable Boolean. Fuori da mappa anche reachable e unreachable.&lt;br /&gt;
* Personaggi composti di parti[] es. testa, busto, gambe, braccia, coda, pinna, ali. Distinzione per arto di movimento e/o spostamento boolean.&lt;br /&gt;
* Arti possono provocare danno, bruciatura , paralisi a contatto (Boolean) . Percentuale di probabilità accompagna ogni Boolean.&lt;br /&gt;
* Ogni parte del corpo punti vita + se inutilizzabile + amputata + stato (es paralisi).&lt;br /&gt;
* Per fare battaglie tra molto grandi =&amp;gt; 1 m lo si intende come 10m.  (rivalutato, aumentare livello scaling)&lt;br /&gt;
* Personaggio fusionabile Boolean + string nomi con cui si fonde.&lt;br /&gt;
* Distinzione tra infernape e infernape1/2/3 ect tra “specie” e “nome”.&lt;br /&gt;
* variabile Boolean respawnable.&lt;br /&gt;
* Raccogliere a piene mani da: https://spore.fandom.com/wiki/Creature_Editor&lt;br /&gt;
* Ad esempio weapons come elemento di Corpo (zanne, corna) e possibilità di muoversi/attaccare furtivamente.&lt;br /&gt;
* Divisibile e unibile come boolean e array di stringe associate per indicare i nomi con cui si unisce il Personaggio o in cui si divide.&lt;br /&gt;
* Variabili posizione nome: from_x/y ; to_x/y.&lt;br /&gt;
* Classe Stato, Personaggio contiene Array di stato, stato contiene moltiplicatori per statistica es attacco velocità precisione elusione ect.&lt;br /&gt;
* Personaggio deve avere una stat tipo sanità mentale, intelligenza, quanto è confuso e quanto è impaurito (2).&lt;br /&gt;
&lt;br /&gt;
* Per personaggi molto piccoli (meno di 1m x 1m x 1m) possibilità di essere in (x,y,z) tra 0 e 1.000.000 (ordine del micrometro, 1*10^-6 == 0,000001) e avere (lenX, lenY, lenZ). In questo modo sono definite dimensioni inferiori ad 1 m^3.&lt;br /&gt;
* personaggi max 20x20 (rivaluato, meno limitata)&lt;br /&gt;
&lt;br /&gt;
===Mosse===&lt;br /&gt;
* &amp;quot;combattimento prescinde da combattente&amp;quot;&lt;br /&gt;
* mosse hanno: direzione, azione, attacco (mosse pokémon)&lt;br /&gt;
* Parametri interi per mossa (direzione, consumabili) con lower e upper bound&lt;br /&gt;
* camuffarsi =&amp;gt; DnD manuale&lt;br /&gt;
* wrestling (libro) per le mosse/prese&lt;br /&gt;
&lt;br /&gt;
* X fa una mossa contro Y: Z potrebbe reagire (Es. ricevendo il colpo al posto di Y). Può essere realizzato sia come se &amp;quot;Y chiede soccorso Z&amp;quot; o come reazione di alleati adiacenti &amp;quot;Z soccorre Y&amp;quot;&lt;br /&gt;
* Mossa prende come parametro di ingresso Corpo, ossia la parte del corpo coinvolta nella mossa (es arto , tutto corpo ect). &lt;br /&gt;
&lt;br /&gt;
===Oggetto (con statistiche e stati)===&lt;br /&gt;
* armi: lacci (stati), lame (potenze), sassi, reti, pistole (munizioni), razzi, bombe (potenze), fuoco (d'artificio?) =&amp;gt; manuale DnD&lt;br /&gt;
* veleno n modi =&amp;gt; DnD manuale&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (oggetti)&lt;br /&gt;
* automezzi con cannoni, variabile 'hasEntrata', 'tempoRiutilizzo'&lt;br /&gt;
* violino come arma (tutti strumenti musicali): a fiato, a corda, a percussione&lt;br /&gt;
* veleni, ampolle e flaconi magici, insieme di 'oggetti dentro' un oggetto&lt;br /&gt;
&lt;br /&gt;
* Classe oggetto: es albero, roccia, casa: forza necessaria per sradicare + forza per lanciare + destrezza / agilità per appendersi + nascondersi in proporzione alle dimensioni di chi si nasconde. &lt;br /&gt;
* Altri es. pali. Sotto terra o sotto acqua/lava/melma o simili. &lt;br /&gt;
* Acqua rallenta se non hai pinne boolean.&lt;br /&gt;
* Classe strumento per oggetti che si tengono in mano, es reti , pistole, spade, pugnali, scudi, elmi, lancia, arco , frecce, lanciarazzi, fucili cecchino, fucile assalto, corde.&lt;br /&gt;
* Strumenti e mosse: danno ad area, perforante, contundente (vedi dnd armi). Mosse possono creare/modificare/distruggere oggetti e strumenti.&lt;br /&gt;
* Oggetti del campo di gioco incidono su elusione (parametro di personaggio).&lt;br /&gt;
* Buco/abisso (boolean) per dire se c’è o meno il suolo (Suolo come classe?). &lt;br /&gt;
* Radiazioni. &lt;br /&gt;
&lt;br /&gt;
===Modalità gioco===&lt;br /&gt;
* turnazione&lt;br /&gt;
* 1 v 1 v 1 etc., ma anche squadre casuali&lt;br /&gt;
* punteggio: chi fa più punti, più uccisioni, definizione di 'punto', gioco per perdere&lt;br /&gt;
* inserisci personaggio total random&lt;br /&gt;
&lt;br /&gt;
* Modalità battaglia con interazione stile battaglia navale (non si vede mossa dell'avversario)&lt;br /&gt;
* Modalità di gioco: tutti contro tutti (battle royale), death match, vs CPU mode zombie(attaccano solo, se non possono vanno verso nemico): serve introdurre un punteggio, di sicuro per mode zombie , ma anche per death match e tutti contro tutti&lt;br /&gt;
* ingressi: ne entra un altro?&lt;br /&gt;
&lt;br /&gt;
===Mappa===&lt;br /&gt;
* arene&lt;br /&gt;
* minimappa (pixelata ?), legenda oggetti base, devono esserci caselle implicite&lt;br /&gt;
* mappa 100x100 (rivalutato, meno limitata)&lt;br /&gt;
* Cannoni fissi in mezzo al campo (strumento).&lt;br /&gt;
&lt;br /&gt;
===Funzionalità generali===&lt;br /&gt;
* Chiave: non una flat input box per i comandi; ma dinamica: si suppone il soggetto &amp;quot;io&amp;quot; (le azioni le fanno in prima persona i personaggi), ogni mossa deve prevedere dei complementi (&amp;quot;verso&amp;quot;, &amp;quot;tra quanto&amp;quot;, &amp;quot;cosa&amp;quot;, &amp;quot;a favore di chi&amp;quot;, &amp;quot;contro chi&amp;quot;). Ogni complemento collegato con box stile in pop up =&amp;gt; bootstrap (la grafica sara unica). Prevedere anche modalita flat con input del tipo &amp;quot;azione a=pippo verso=termoli&amp;quot; (regex check)&lt;br /&gt;
* &amp;quot;meno tabelle&amp;quot;, &amp;quot;no bottoni&amp;quot; e solo foto che si alternano, &amp;quot;la grafica serve&amp;quot;: text box unica interazione, text area (history), immagine personaggio e immagine mappa&lt;br /&gt;
* &amp;quot;persistenza anche da interfaccia grafica&amp;quot;, diritti di scrittura sui file?&lt;br /&gt;
* Segnalazione (comando per fare nota)&lt;br /&gt;
&lt;br /&gt;
===Deploy===&lt;br /&gt;
* &amp;quot;commenta il codice&amp;quot;, &amp;quot;dividi et impera&amp;quot;&lt;br /&gt;
* Server web (Apache) ospita partite (+ localmente ha i file di funzionamento), in LAN client giocano o da remoto con IP pubblico. Interfaccia HTML5 + Javascript per giocare. Studiare engine grafici Javascript&lt;br /&gt;
* bootstrap! (specie per input box)&lt;br /&gt;
* Unity, WebGL (vedi SDK dedicata, built per Android/iOS/etc.)&lt;br /&gt;
* Modelli 3D videogiochi: https://www.models-resource.com/ , meglio se disaccoppiati da Unity (e.g. in cartelle independenti), aggiunta modelli online&lt;br /&gt;
* Tutorial tank Unity: https://learn.unity.com/project/tanks-tutorial&lt;br /&gt;
* WebSocket per gestire client asincroni (NodeJS ?)&lt;br /&gt;
* Su YT in “guarda più tardi” video per interagire unity con JS (“unity.sendMessage()” o simili)&lt;br /&gt;
&lt;br /&gt;
==== Altro (scartato)====&lt;br /&gt;
* rpgmaker, godot, aseprite, pixelart (in generale), ma anche phaser, piskel&lt;br /&gt;
* joomla! Per far prima con html&lt;br /&gt;
* libreria pygame&lt;br /&gt;
* Vuegg: https://github.com/marketplace/vuegg  &lt;br /&gt;
* Material Design&lt;br /&gt;
* JAVA: Class.forName(&amp;lt;name&amp;gt;.class).newInstance();&lt;br /&gt;
&lt;br /&gt;
===Copia&amp;amp;incolla generale, da smistare in sotto capitoli. Contiene anche '''tutte''' note del telefono (al 22/02/2020)===&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 1:'''&lt;br /&gt;
&lt;br /&gt;
Mosse che trasformano l’avversario: attenzione è una mossa devastante. Trasformazione totale o parziale. Si devono poter aggiungere mosse, strumenti dinamicamente. Battle bot:ribaltano, scintille, elementi (Oggetti) che danneggiano. One piece: I frutti del diavolo (悪魔の実 Akuma no mi?) sono frutti misteriosi che donano poteri soprannaturali a chi li mangia, rendendoli però incapaci di nuotare. Di conseguenza il contatto con l'acqua di mare o con una speciale sostanza conosciuta come agalmatolite indebolisce gli utilizzatori di frutti del diavolo e li priva dei loro poteri. Alcune persone sono inoltre in grado di ricorrere all'Ambizione (覇気 Haki?), una forza spirituale che permette di avvertire la presenza di altri esseri viventi e di predirne i movimenti, di irrobustire parti del corpo e di intimidire o fare svenire le creature con una debole forza di volontà. Personaggio ha funzione baricentro_x, baricentro_y calcolate come (from_x+to_x)/2 sul quale si basa la funzione di libreria getDistance(Personaggio A, Personaggio B, float success); tale funzione serve per calcolare per i PNG e per i PG se ha senso usare una mossa. Non-onniscienza: delle volte non si può sapere distanza avversario e fallisce la mossa per la distanza -&amp;gt; “float success” rappresenta la probabilità di successo (Personaggio ha parametro “osservare”). PNG di due categorie: offensivi o neutrali (no priorità a mosse di attacco, ma tutto casuale). Mosse e oggetti per chiamare Personaggi, magari non necessariamente alleati (2 mosse e 2 oggetti quindi necessari), richiamo di un personaggio preciso o di uno a caso. Ogni mossa/azione deve avere un tempo di attesa espresso in turni (alla meglio 0) per poter ripetere la mossa/azione. Strumenti anche mezzi di trasporto di aria, di terra, di acqua (o lava/palude). Possono attivare una metamorfosi / Unione per cambiare stats personaggio. Veicoli con armi o riparo. Gli strumenti da trattare come gli oggetti. Classe unica? I match/partite (immagino Classe Partita) devono avere variabile boolean “respawn”, per distinguere death match a punti con death match con una vita. Wrestling per ispirarsi nella lotta libera: calci pugni ginocchiate prese lanci salti testate gomitate ecc. Per punti si vince a un limite o dopo un tot di mosse , oppure al primo dei due raggiunti (max_punti e max_mosse parametri di Partita). I punti si guadagnano alla kill (un Punteggio per squadra, int punteggio salvato localmente dentro ogni Personaggio che ha la variabile int squadra). Si guadagnano tanti punti quanti sono i punti della variabile “valore” del personaggio ucciso, tale variabile è calcolata come somma dei valori di tutte le mosse/stats ect del Personaggio. Imperium civitas. Attacco dei giganti. Possibilità di morire se colpiti in un unico punto (tallone d Achille) implementabile come variabile boolean. Jump force. Game dev tycoon. Acqua diventa tsunami. Variabile int per attacco cumulativo di gruppo: es calciatori che più si passano la palla più l’attacco è forte. Suolo magico: non tutti i personaggi possono accedervi, array di string elenca i nomi di chi può accedervi. Funzione esci/entra in classe Personaggio per simulare scambio pokemon 6vs6. Piovra gigante. Rischio=danno*probabilita. Mossa su strumento e con strumento?&lt;br /&gt;
Mosse fisiche per arrampicarsi su avversario(se e solo se sei la metà di dimensioni(?)), atterrarlo, lanciarlo, accecarlo, immobilizzarlo. Se sei in gruppo/ orda bonus ad attacchi combinati. Armi: fruste e scheggie, corni che si suonano per chiamare altri. Tipo della mossa con moltiplicatore tra 0 (immune) e 2 (float): acqua, fuoco, magia, terra: da ispirarsi ai pokemon ma non da copiare, penso. Armi da campo: cannoni e catapulte. Veicoli d’acqua: moto acqua, canoe, barche a motore a remi. Nei veicoli malus su attenzione (variabile int in personaggio, indica attenzione in combattimento e non in altro) perché si è impegnato alla guida . All’inizio in image view “the hero” e “the map”. Condizione vittoria (oltre a morte, punti, o numero mosse, cioè tempo) morte di un singolo Personaggio, che potrebbe rappresentare un edificio, cassaforte o simili. Personaggio si può svestire e lasciare strumenti, modificano statistiche di attacco, difesa , agilità, ect. Variabile luce o non luce, che peggiora/migliora a seconda della specie la visibilità, quindi la precisione , specie in attacchi a distanza: Scurovisione evita i malus.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 2:'''&lt;br /&gt;
&lt;br /&gt;
Gioco2: se ci si lancia da oggetti , dopo essersi arrampicati, possono esserci danni da caduta; strumenti come paracaduti o mosse magiche possono evitare i danni. Pozione del vento, soffi e devi attacchi. In difesa puoi parare, schivare, deviare: tre variabili? Ambiente: colline e pianure uguali, Monti sono Oggetti, picco ossia un unico monte oggetto. Rocce volanti, nuvole sospese: oggetto può essere sospeso e può fare periodicamente una mossa, ad es tuono, può spostarsi, può fare entra/esci, oggetto albero e oggetto foresta, si possono prendere, nascondersi, arrampicarsi, lanciarli, ostacolano velocità ma se si ha abbastanza forza si spezzano alberi. Acqua poco profonda, profonda, molto profonda: variabile boolean in Personaggio “alto” per toccare in acqua profonda, con acqua si generano fiumi laghi e mari. Ambiente si deve poter evolvere: ad esempio oggetto diga può fare metamorfosi e diventare oggetto cascata/torrente in piena. Per edifici più oggetti che rappresentano le mura e il tetto, variabile boolean per oggetto per entrare nell’oggetto. Possono essere spazzati via: danni da crollo, si può combattere all interni, contengono strumenti come tavoli sedie mobili letto ect. Se uno viene schiantato contro uno strumento prende danno(es danno da schianto). Ci possono essere scale, si può non avere contatti visivo sull’avversario. Oggetto mura, oggetto torre, oggetto casa interno sono cose distinte: possono dare malus/bonus su visibilità. Ambiente: pozzi e grotte, da gestire come interno casa. Lava come acqua, ogni oggetto può essere sorgenti di liquido: monte sorgente acqua, vulcano sorgente lava. Può esserci variabile probabilità eruzione, se settata a 1 c’è una continua eruzione. Strade di vario tipo, sovrapposta a altri suoli, migliorano velocità di alcuni strumenti, variabile boolean “ha le ruote” in classe strumenti. Unificare classe strumento e classe oggetto. Oggetti sospesi: case sospese su albero, ad es. Fiamme in mezzo al suolo. Oggetti: porto, aereoporto, grattacieli, dighe, impianti a fune, ospedali per curarsi e prendere oggetti per curarsi dopo, scuole contenenti libri per apprendere una mossa, luoghi di ingegneria per creare oggetti, ad esempio veicoli o armi, soldi nel gioco per comprare da eventuali venditori. Ogni oggetto avra un prezzo (valutabile circa in euro per semplicità). Variabile float per fame, sete, sonno, caldo-freddo (parte da 0.5). Nella mappa ci deve essere per ogni punto la temperatura. Possibilità di vomito, dissenteria, problemi cardiaci, respiratori, muscolari. Armi: balestra, mani nude, sasso, tirapugni, torcia accesa. Armature: intralciano o favoriscono agilità, attacco, poteri magici, rumorosa (elusione), è uno strumento/oggetto. Attacchi possono essere prolungati per turni, mosse variabile boolean prolungabile: può aumentare o diminuire intensità, c’è un max espresso in turni di prolungabilita, inoltre può essere leggermente alterato con una variabile casuale. Equipaggiamento (strumento/oggetto): pietra focaia, attrezzi da scalata, boccale di birra, cavallo, moto, chiodi, martello da fabbro, corda, corazza, dardo, faretra/zaino/sacca (oggetti che contengono una lista di oggetti, stringhe) con un numero per la quantità) e capacità massima zaino e ogni oggetto può avere un valore intero per dimensione (es martello 3, ascia grande 7), mantello, olio, variabile boolean prende fuoco/conduce elettricità, amplifica magnetismo, aumenta esplosioni nucleari, aumenta forza di gravità (?), pala, piccone, rampino, specchio, per osservare quando si è nascosti e si ha malus su visibilità. Strumenti da scasso per aprire porte: variabile boolean per oggetti: entrata con scasso. Personaggio: string razza per swag, immunità a veleni e malattie, elusione, agilità, precisione, abilità magiche(?), difesa fisica. In ultima torcia: agilità, coraggio, forza, intelligenza, magia, manualità, percezione, socialità. Bestiario: aracnoide di varie dimensioni, talpe giganti, vermi giganti di terra di mare e di lava ect, bulbo trascinatore che ha tentacoli per tirare a se e mangiare, lui è immobile, calabrone gigante, serpenti giganti, cinghiali, draghi, elfi, goblin e re goblin, sciamani (goblin), totem di guerra come strumento/oggetti per alterare statistiche nella loro area di influenza, lupo, mastino bruciante, nani, non morti/zombie/mummia/scheletro variabile boolean vivo a false ma ha ancora hp su parti del corpo: variabile boolean “zombizabile”. Orchi, pesci da terra (anfibi) tritone dell abisso, troll e trollin (orchi più deformi), umani. Abilità dei personaggi in ultima torcia: artificiale (robot) immunità a soffocamento, veleni, malattie ect immune a manipolazioni psichiche, visione oscurità; danno da attacco in carica; fiammegiante ossia la creatura può incendiarsi e elettrizzante ossia può diventare elettrica caricamente; modalità furia/mailmen ossia ottiene bonus su alcune/tutte le statistiche; gigantesco o molto piccolo due boolean (?forse non serve); immunità a magie mentali, al fuoco; linguaggi (?); non morto; danno da attacco in presa; pungiglioni velenosi; sa muoversi su ragnatele o è rallentato, resistenza a perforazione, respirare sott’acqua o sotto lava o nei liquidi in genere; rigenerazione; riceve danni dalla luce solare o da assenza di luce; è terrorizzato/impaurito/intimidito o se è imperturbabile boolean. Danno da trascinamento; paralizzante; può diventare più veloce (?non serve); visione a infrarossi attraverso oggetti; volare o andare sotto terra. Imperium editor, cose che penso di non aver ancora scritto: stagioni, suolo erboso o terriccio, sabbia con erba e terra e da sola, strade e stagioni, altitudine, alberi e arbusti, vari tipi a foglia larga, conifere, alberi secchi, palme, arbusti verdi e secchi, cactus, alghe marine, rocce e pietre, scheletri per terra, legna tagliata (alberi tagliati), carri e carretti, grotte e rovine per accessi sotterranei, locande, templi, accampamenti, fortini, monoliti, fontana, tombe e cimiteri, borse per terra, pozzo, troni, croci(del teschio), pozzo, capanne, lapidi, ponti, recinzioni, falò, tende, torri, panoplia, fessure come abissi, statue, rovine (deserto) come case distrutte, colonne per costruire templi, piramidi, sfingi, bandiere, rovine in Europa, campi coltivati che contengono cibo, fiamma (in altre), roccia in altre per montagne, altre-&amp;gt;rovine per monumenti non egiziani ma europei.&lt;br /&gt;
Ci sono paludi. Tende da campo. Forti, porti. Edifici delle fortezze, edifici dei villaggi. Naufragi e scogli.&lt;br /&gt;
Parametri voglia/impegno float per descrivere voglia di combattere Personaggio. Ricevi danno uscendo dalla mappa tra 1-5% tra 6-10% tra 11-15% della vita totale di ogni parte del corpo per ogni turno di gioco. Danno da precipitazione diverso da carica, uno verticale uno orizzontale, se precipiti da molto in alto hai bonus, oltre che danni da schianto lol. Baionette, formazione a blocchi, a quadrato (difensiva) sparano su quattro lati, a schiera vanno avanti. Usano un colpo poi lunga ricarica. Variabile boolean per attivare o meno fuoco amico. Azione per cambiare posizione: in piedi, in ginocchio(inteso come via di mezzo), sdraiato: per permettere migliore visibilità a chi è dietro (nella formazione).&lt;br /&gt;
Altruismo, coraggio, spingere oltre il limite, difendere al posto di un altro, migliorare posizione per avere bonus. Mosse da usare in condizioni psicologiche idonee: mosse estreme per disperazione, bonus unici. Condizioni per situazioni: blocco, spalle al muro, stritolato, confuso, semi parassiti addosso, azzoppato, bagnato d’acqua, lame affilate, corazza indurita, tante copie di me stesso attive, preveggente. Per ambiente:pioggia (torrenziale), barriera a cupola, punte metalliche a terra, blocco di fumo nero. Far volare un avversario/alleato. Tutti possono fare tutto sotto effetti magici o fisici. Un cavallo può volare se viene preso da un uccello e portato in alto.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 3, 4:'''&lt;br /&gt;
&lt;br /&gt;
Gioco1,2,3,4: tutto caricato su wikis.&lt;br /&gt;
&lt;br /&gt;
Gioco3: Mosse con caricamento + spostamento (es. kameamea con teletrasporto). Ciclo di interazione principale:crea o combatti. Modalità campagna, che chiede in input da che battaglia iniziare, ma implica tipi battaglie prefissati. Alla morte/sconfitta di un personaggio si possono alterare statistiche (es personaggio può cambiare fazione). Alcune mosse possono lasciare oggetti sul terreno: (ad es, radici di Groth). Ogni oggetto può alterare le statistiche al passaggio sopra, nelle vicinanze. Boolean invisibile per personaggio, diverso da elusione infinita. Se personaggio va in un altro dimensione -&amp;gt; unreachable. Attacco coordinato, se non lo fanno tutti vale lo stesso ma depotenziato opportunamente . Personaggio in modalità maniac (2 mosse per turno) e in modalità depressive (1 mossa ogni due turni); personaggio Flash può fare 10 mosse in un turno. Chiudi con lucchetto oggetto da dentro o da fuori, oggetto ingresso in oggetto casa , più ingressi per un singolo oggetto.nicole aniston. Rimbalzo se ci si schianta contro oggetto da calcolare con parametro. Ryuk e Darkrai.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gioco 4 23/07/2019:&lt;br /&gt;
Pula fiction, aracnidi, oggetto: due superfici rettangolari di forma diversa, anche inclinate , collegate. Più pezzi collegati tra loro per forme cilindriche cave, ad esempio, tipo vulcano. Mappa con sprite personaggi, canvas: anche mouseClick? Statistiche con nome gerarchico, es pokemon_attacco. Modalità survival, stile isola di jurassic park gdr; sia in coop che contro; possibilità di fare N turni di fila se non ci sono altri player giocanti nelle vicinanze (ciò però comporterebbe , in modalità contro , di capire quando c’è qualcuno nelle vicinanze perché si andrebbe di 1 turno alla volta, soluzioni: in mod contro 1 turno per volta oppure meccanismo di sincronizzazione turni quando uno vede l’altro (anche furtivo) come c’è attacco 1 turno a testa) .. analogo a Battle royale(?); inizio con starter kit random. Modalità assedio al castello. Inoltre se posso fare N turni di fila si può pensare a più pc , uno per persona , coordinati per fare comandi in parallelo, ma va ben congegnato meccanismo di sincronizzazione. Parti DelCorpo -&amp;gt; Componente/i oppure Parte. La mappa deve essere (x,y); l’altezza viene indicata onMouseOver certi pixel dove è posto il Personaggio; se personaggio dentro edificio/grotta cambio img (es sfocato/tratteggiato). Mosse: astrarre per target; molte mosse sono simili tra loro, somiglianza va sfruttata, hanno magari dei target in comune, o variano solo per un parametro. Creare mappa anche con drag and drop immagini ?(un po’ difficile). Più layout per interfaccia grafica (esempio uno che mostra errori input su text area, uno con alert, uno su box text area separato). Input comandi consumato pezzo per pezzo, alcune parole se prevedono parametri quando riconosciute fanno fetch anche di parola (numero) successiva. Face toon foto? Import parziali di personaggi (tutto tranne/solo questi campi specificati). Texture mappa complete o ripetibili (es per suolo). Anteprima battaglia stile battaglia pokemon (magari per 1/2/3 vs 1/2/3) per rappresentare scontro. Conviene usare xslx (excel) per dati, considerare che può non servire la libreria Java per leggere stringhe per operazioni. Mossa “again” , ripeti la precedenza(opportuna modifica parametri, es mossa spostamento). Possibile gestione contromosse: si usano marker (tag): ogni mossa ha elenco tag del tipo di contromosse che può subire (con probabilità annessa, che può dipendere da pg che subisce mossa congiuntamente a mossa stessa). Ogni mossa inoltre deve essere taggata come possibile contromossa che il pg può usare (per schivare può fare in più modi). A seconda del lancio del dado il pg che effettua La contromossa può anche scegliere tipologia di contromossa o solo la mossa della tipologia che ha beccato (entrano in gioco riflessi ect.). I parametri che fanno attivare unq o un’altra contromossa sono dinamici, posso dipendere ad esempio dalla posizione tra i due pg o altre statistiche. Tag contromosse a fasce (es. coprirsi è sempre più facile che schivare che e più facile di schivare e contrattaccare (?); all’interno dello stesso schivare e contrattaccare ci sono più sotto categorie). Per aggiunta personaggio può essere utili interfaccia dedicata, non linea di comando (o altre operazioni, specie se ci sono tabelle). Mossa “premonizione”: predire il futuro a breve termine, dici che mossa vorresti fare e ti dice esito (o più esiti se uno chiede più mosse). Funziona solo sulla prossima mossa. Contromossa delle contromossa gestione?? Eventualmente nell’esito si prevede ancore contro-contromossa. Ma si innesca reazione a catena, inoltre da gestire scelta contromossa in questo caso. Applicazione tag conoscenza(universo di appartenenza): “Termoli”, “pokemon”, “liceo classico Termoli”, anche gerarchici, per filtrare sui personaggi.target componibili , fattorizzato creazione mosse, hanno un costo magari per indicare quantovoccupano dicuna mossa, relativo maybe a un parametro o più del target stesso. In particolare, non saranno salvate le mosse per un personaggio (o solo alcune “preferite”) ma il suo insieme di target i quali devono dire:statistica che influenzano, “costo del turno” che richiedono al variare dell’intensità del target (che aumenta linearmente, esponenzialmente, generica f(x)) quindi corsa blanda costo 1 , Max corsa costo 5 (max), elenco (string) target incompatibili con tale target (se serve), nota relative ad es per quando uno vuole creare una mossa durante la battaglia (“target corsa, max sforzo dedicabile 4 ect” metti “50 metri corsa” “ok/troppo! Vuoi sforzati di più rischiando effetti collaterali?”). Si può autoscrivere la voce narrante del gioco come “la tua coscienza” mentre che giochi, d’altronde si interagisce con essa. Considerare che un target può appartenere a più personaggi, magari sotto nomi di mosse diversi.&lt;br /&gt;
Definire gerarchia di personaggi per template (tipo classe e super classe) e template importabili (tipo usa fuoco). Es umanoide non umanoide, tra umanoide maschio- femmina etc. Classe che estende System.out per creare funzioni che aggiungono Header “DEBUG:” etc; due programmi Java , due main: uno delegato a calcoli + gestione Excel; altro legge stdout dell altro per interfaccia grafica. Per allenare PG creare dei PG fantocci con label per fare Q-learning iniziale, più avanti far allenare pg tra loro; creare vari fantocci: tank terrestre fisico, healer volante etc. Excel: si usa css che si può rendere tabellare, più facile da trattare nel codice rispetto a .xslx. Ogni “utente” ed Lostefra ha il suo personale dizionario con sue personali short cut da usare in partita, eventuale login con password (opzionale) x accesso. Vedere license show down. Mappa unica stile giochi di ruolo, si vede tutto da sopra: click o simili su edifici/caverne per mappe interne a tale posto, così ok sprite e per rappresentare “pg in volo” sprite dedicato. Densità aria per dire quando anche un uomo per es può volare. Ipotesi più efficiente per dare un valore stima al pg: AI base che gioca a manetta contro altre AI base e dalle vittorie si fa l’euristica, più vittoria facile/veloce/stracciante più punti, contro vari pg, contro pg standard bench mark.&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Note&amp;diff=194</id>
		<title>Note</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Note&amp;diff=194"/>
		<updated>2020-05-20T10:43:48Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: /* Deploy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Note ==&lt;br /&gt;
&lt;br /&gt;
'''Vedere altre note su fogli di carta e promemoria del telefono. Ce ne sono molte.'''&lt;br /&gt;
'''La copiatura dai fogli di carta dei continuare da pagina 4 (&amp;quot;alterare param..&amp;quot;).'''&lt;br /&gt;
&lt;br /&gt;
===Inspirational Concepts===&lt;br /&gt;
* Gioco Lotta (Pokémon, Pokkén)&lt;br /&gt;
* no caselle esplicite&lt;br /&gt;
* Descrizione rispetto a: ambiente, nemico, oggetti&lt;br /&gt;
* pokémon, DnD, Call of Duty, Super Smash Brawl, corse pazze&lt;br /&gt;
* concentrarsi su: fluidi, telecinesi, razze, bonus/malus, gradi di libertà (fisicamente parlando) &lt;br /&gt;
* scacchi (es. crea casella), shaolin showdown&lt;br /&gt;
* prevedere = creatività&lt;br /&gt;
* acqua, aria, fuoco, terra&lt;br /&gt;
* gravità (newton), verso alto, basso, destra, sinistra, circolare, tutti i versi&lt;br /&gt;
* jumanji, savana, animali, zoologia&lt;br /&gt;
* tempo/spazio&lt;br /&gt;
* BF4, pirati, roma (imperium civitas)&lt;br /&gt;
* musica come arma (rap)&lt;br /&gt;
* magia, prestigiatori&lt;br /&gt;
* dinosauri (documentario, libro, zoologia)&lt;br /&gt;
* avengers, supereroi (libro)&lt;br /&gt;
&lt;br /&gt;
* Looney toons&lt;br /&gt;
&lt;br /&gt;
===Personaggi (con statistiche e stati)===&lt;br /&gt;
* combattenti (con statistiche e stati)&lt;br /&gt;
* immagine rappresentativa per rappresentare meglio&lt;br /&gt;
* HP: colore rosso su immagine personaggio, dove sei debole/già colpito (idea scartata)&lt;br /&gt;
* penitenza: il malus può essere inteso come ciò che c'è nell'inserimento successivo, malus cumulativo&lt;br /&gt;
* essere ipocrita, finzione (schermo)&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (personaggi)&lt;br /&gt;
* metamorfosi&lt;br /&gt;
* alchimisti&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* possibilità giù in terra/ giù in acqua, con reachable e unreachable Boolean. Fuori da mappa anche reachable e unreachable.&lt;br /&gt;
* Personaggi composti di parti[] es. testa, busto, gambe, braccia, coda, pinna, ali. Distinzione per arto di movimento e/o spostamento boolean.&lt;br /&gt;
* Arti possono provocare danno, bruciatura , paralisi a contatto (Boolean) . Percentuale di probabilità accompagna ogni Boolean.&lt;br /&gt;
* Ogni parte del corpo punti vita + se inutilizzabile + amputata + stato (es paralisi).&lt;br /&gt;
* Per fare battaglie tra molto grandi =&amp;gt; 1 m lo si intende come 10m.  (rivalutato, aumentare livello scaling)&lt;br /&gt;
* Personaggio fusionabile Boolean + string nomi con cui si fonde.&lt;br /&gt;
* Distinzione tra infernape e infernape1/2/3 ect tra “specie” e “nome”.&lt;br /&gt;
* variabile Boolean respawnable.&lt;br /&gt;
* Raccogliere a piene mani da: https://spore.fandom.com/wiki/Creature_Editor&lt;br /&gt;
* Ad esempio weapons come elemento di Corpo (zanne, corna) e possibilità di muoversi/attaccare furtivamente.&lt;br /&gt;
* Divisibile e unibile come boolean e array di stringe associate per indicare i nomi con cui si unisce il Personaggio o in cui si divide.&lt;br /&gt;
* Variabili posizione nome: from_x/y ; to_x/y.&lt;br /&gt;
* Classe Stato, Personaggio contiene Array di stato, stato contiene moltiplicatori per statistica es attacco velocità precisione elusione ect.&lt;br /&gt;
* Personaggio deve avere una stat tipo sanità mentale, intelligenza, quanto è confuso e quanto è impaurito (2).&lt;br /&gt;
&lt;br /&gt;
* Per personaggi molto piccoli (meno di 1m x 1m x 1m) possibilità di essere in (x,y,z) tra 0 e 1.000.000 (ordine del micrometro, 1*10^-6 == 0,000001) e avere (lenX, lenY, lenZ). In questo modo sono definite dimensioni inferiori ad 1 m^3.&lt;br /&gt;
* personaggi max 20x20 (rivaluato, meno limitata)&lt;br /&gt;
&lt;br /&gt;
===Mosse===&lt;br /&gt;
* &amp;quot;combattimento prescinde da combattente&amp;quot;&lt;br /&gt;
* mosse hanno: direzione, azione, attacco (mosse pokémon)&lt;br /&gt;
* Parametri interi per mossa (direzione, consumabili) con lower e upper bound&lt;br /&gt;
* camuffarsi =&amp;gt; DnD manuale&lt;br /&gt;
* wrestling (libro) per le mosse/prese&lt;br /&gt;
&lt;br /&gt;
* X fa una mossa contro Y: Z potrebbe reagire (Es. ricevendo il colpo al posto di Y). Può essere realizzato sia come se &amp;quot;Y chiede soccorso Z&amp;quot; o come reazione di alleati adiacenti &amp;quot;Z soccorre Y&amp;quot;&lt;br /&gt;
* Mossa prende come parametro di ingresso Corpo, ossia la parte del corpo coinvolta nella mossa (es arto , tutto corpo ect). &lt;br /&gt;
&lt;br /&gt;
===Oggetto (con statistiche e stati)===&lt;br /&gt;
* armi: lacci (stati), lame (potenze), sassi, reti, pistole (munizioni), razzi, bombe (potenze), fuoco (d'artificio?) =&amp;gt; manuale DnD&lt;br /&gt;
* veleno n modi =&amp;gt; DnD manuale&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (oggetti)&lt;br /&gt;
* automezzi con cannoni, variabile 'hasEntrata', 'tempoRiutilizzo'&lt;br /&gt;
* violino come arma (tutti strumenti musicali): a fiato, a corda, a percussione&lt;br /&gt;
* veleni, ampolle e flaconi magici, insieme di 'oggetti dentro' un oggetto&lt;br /&gt;
&lt;br /&gt;
* Classe oggetto: es albero, roccia, casa: forza necessaria per sradicare + forza per lanciare + destrezza / agilità per appendersi + nascondersi in proporzione alle dimensioni di chi si nasconde. &lt;br /&gt;
* Altri es. pali. Sotto terra o sotto acqua/lava/melma o simili. &lt;br /&gt;
* Acqua rallenta se non hai pinne boolean.&lt;br /&gt;
* Classe strumento per oggetti che si tengono in mano, es reti , pistole, spade, pugnali, scudi, elmi, lancia, arco , frecce, lanciarazzi, fucili cecchino, fucile assalto, corde.&lt;br /&gt;
* Strumenti e mosse: danno ad area, perforante, contundente (vedi dnd armi). Mosse possono creare/modificare/distruggere oggetti e strumenti.&lt;br /&gt;
* Oggetti del campo di gioco incidono su elusione (parametro di personaggio).&lt;br /&gt;
* Buco/abisso (boolean) per dire se c’è o meno il suolo (Suolo come classe?). &lt;br /&gt;
* Radiazioni. &lt;br /&gt;
&lt;br /&gt;
===Modalità gioco===&lt;br /&gt;
* turnazione&lt;br /&gt;
* 1 v 1 v 1 etc., ma anche squadre casuali&lt;br /&gt;
* punteggio: chi fa più punti, più uccisioni, definizione di 'punto', gioco per perdere&lt;br /&gt;
* inserisci personaggio total random&lt;br /&gt;
&lt;br /&gt;
* Modalità battaglia con interazione stile battaglia navale (non si vede mossa dell'avversario)&lt;br /&gt;
* Modalità di gioco: tutti contro tutti (battle royale), death match, vs CPU mode zombie(attaccano solo, se non possono vanno verso nemico): serve introdurre un punteggio, di sicuro per mode zombie , ma anche per death match e tutti contro tutti&lt;br /&gt;
* ingressi: ne entra un altro?&lt;br /&gt;
&lt;br /&gt;
===Mappa===&lt;br /&gt;
* arene&lt;br /&gt;
* minimappa (pixelata ?), legenda oggetti base, devono esserci caselle implicite&lt;br /&gt;
* mappa 100x100 (rivalutato, meno limitata)&lt;br /&gt;
* Cannoni fissi in mezzo al campo (strumento).&lt;br /&gt;
&lt;br /&gt;
===Funzionalità generali===&lt;br /&gt;
* Chiave: non una flat input box per i comandi; ma dinamica: si suppone il soggetto &amp;quot;io&amp;quot; (le azioni le fanno in prima persona i personaggi), ogni mossa deve prevedere dei complementi (&amp;quot;verso&amp;quot;, &amp;quot;tra quanto&amp;quot;, &amp;quot;cosa&amp;quot;, &amp;quot;a favore di chi&amp;quot;, &amp;quot;contro chi&amp;quot;). Ogni complemento collegato con box stile in pop up =&amp;gt; bootstrap (la grafica sara unica). Prevedere anche modalita flat con input del tipo &amp;quot;azione a=pippo verso=termoli&amp;quot; (regex check)&lt;br /&gt;
* &amp;quot;meno tabelle&amp;quot;, &amp;quot;no bottoni&amp;quot; e solo foto che si alternano, &amp;quot;la grafica serve&amp;quot;: text box unica interazione, text area (history), immagine personaggio e immagine mappa&lt;br /&gt;
* &amp;quot;persistenza anche da interfaccia grafica&amp;quot;, diritti di scrittura sui file?&lt;br /&gt;
* Segnalazione (comando per fare nota)&lt;br /&gt;
&lt;br /&gt;
===Deploy===&lt;br /&gt;
* &amp;quot;commenta il codice&amp;quot;, &amp;quot;dividi et impera&amp;quot;&lt;br /&gt;
* Server web (Apache) ospita partite (+ localmente ha i file di funzionamento), in LAN client giocano o da remoto con IP pubblico. Interfaccia HTML5 + Javascript per giocare. Studiare engine grafici Javascript&lt;br /&gt;
* bootstrap! (specie per input box)&lt;br /&gt;
* Unity, WebGL (vedi SDK dedicata, built per Android/iOS/etc.)&lt;br /&gt;
* Modelli 3D videogiochi: https://www.models-resource.com/ , meglio se disaccoppiati da Unity (e.g. in cartelle independenti), aggiunta modelli online&lt;br /&gt;
* Tutorial tank Unity: https://learn.unity.com/project/tanks-tutorial&lt;br /&gt;
&lt;br /&gt;
==== Altre ====&lt;br /&gt;
* rpgmaker, godot, aseprite, pixelart (in generale), ma anche phaser, piskel&lt;br /&gt;
* joomla! Per far prima con html&lt;br /&gt;
* libreria pygame&lt;br /&gt;
* Vuegg: https://github.com/marketplace/vuegg  &lt;br /&gt;
* Material Design&lt;br /&gt;
* JAVA: Class.forName(&amp;lt;name&amp;gt;.class).newInstance();&lt;br /&gt;
&lt;br /&gt;
===Copia&amp;amp;incolla generale, da smistare in sotto capitoli. Contiene anche '''tutte''' note del telefono (al 22/02/2020)===&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 1:'''&lt;br /&gt;
&lt;br /&gt;
Mosse che trasformano l’avversario: attenzione è una mossa devastante. Trasformazione totale o parziale. Si devono poter aggiungere mosse, strumenti dinamicamente. Battle bot:ribaltano, scintille, elementi (Oggetti) che danneggiano. One piece: I frutti del diavolo (悪魔の実 Akuma no mi?) sono frutti misteriosi che donano poteri soprannaturali a chi li mangia, rendendoli però incapaci di nuotare. Di conseguenza il contatto con l'acqua di mare o con una speciale sostanza conosciuta come agalmatolite indebolisce gli utilizzatori di frutti del diavolo e li priva dei loro poteri. Alcune persone sono inoltre in grado di ricorrere all'Ambizione (覇気 Haki?), una forza spirituale che permette di avvertire la presenza di altri esseri viventi e di predirne i movimenti, di irrobustire parti del corpo e di intimidire o fare svenire le creature con una debole forza di volontà. Personaggio ha funzione baricentro_x, baricentro_y calcolate come (from_x+to_x)/2 sul quale si basa la funzione di libreria getDistance(Personaggio A, Personaggio B, float success); tale funzione serve per calcolare per i PNG e per i PG se ha senso usare una mossa. Non-onniscienza: delle volte non si può sapere distanza avversario e fallisce la mossa per la distanza -&amp;gt; “float success” rappresenta la probabilità di successo (Personaggio ha parametro “osservare”). PNG di due categorie: offensivi o neutrali (no priorità a mosse di attacco, ma tutto casuale). Mosse e oggetti per chiamare Personaggi, magari non necessariamente alleati (2 mosse e 2 oggetti quindi necessari), richiamo di un personaggio preciso o di uno a caso. Ogni mossa/azione deve avere un tempo di attesa espresso in turni (alla meglio 0) per poter ripetere la mossa/azione. Strumenti anche mezzi di trasporto di aria, di terra, di acqua (o lava/palude). Possono attivare una metamorfosi / Unione per cambiare stats personaggio. Veicoli con armi o riparo. Gli strumenti da trattare come gli oggetti. Classe unica? I match/partite (immagino Classe Partita) devono avere variabile boolean “respawn”, per distinguere death match a punti con death match con una vita. Wrestling per ispirarsi nella lotta libera: calci pugni ginocchiate prese lanci salti testate gomitate ecc. Per punti si vince a un limite o dopo un tot di mosse , oppure al primo dei due raggiunti (max_punti e max_mosse parametri di Partita). I punti si guadagnano alla kill (un Punteggio per squadra, int punteggio salvato localmente dentro ogni Personaggio che ha la variabile int squadra). Si guadagnano tanti punti quanti sono i punti della variabile “valore” del personaggio ucciso, tale variabile è calcolata come somma dei valori di tutte le mosse/stats ect del Personaggio. Imperium civitas. Attacco dei giganti. Possibilità di morire se colpiti in un unico punto (tallone d Achille) implementabile come variabile boolean. Jump force. Game dev tycoon. Acqua diventa tsunami. Variabile int per attacco cumulativo di gruppo: es calciatori che più si passano la palla più l’attacco è forte. Suolo magico: non tutti i personaggi possono accedervi, array di string elenca i nomi di chi può accedervi. Funzione esci/entra in classe Personaggio per simulare scambio pokemon 6vs6. Piovra gigante. Rischio=danno*probabilita. Mossa su strumento e con strumento?&lt;br /&gt;
Mosse fisiche per arrampicarsi su avversario(se e solo se sei la metà di dimensioni(?)), atterrarlo, lanciarlo, accecarlo, immobilizzarlo. Se sei in gruppo/ orda bonus ad attacchi combinati. Armi: fruste e scheggie, corni che si suonano per chiamare altri. Tipo della mossa con moltiplicatore tra 0 (immune) e 2 (float): acqua, fuoco, magia, terra: da ispirarsi ai pokemon ma non da copiare, penso. Armi da campo: cannoni e catapulte. Veicoli d’acqua: moto acqua, canoe, barche a motore a remi. Nei veicoli malus su attenzione (variabile int in personaggio, indica attenzione in combattimento e non in altro) perché si è impegnato alla guida . All’inizio in image view “the hero” e “the map”. Condizione vittoria (oltre a morte, punti, o numero mosse, cioè tempo) morte di un singolo Personaggio, che potrebbe rappresentare un edificio, cassaforte o simili. Personaggio si può svestire e lasciare strumenti, modificano statistiche di attacco, difesa , agilità, ect. Variabile luce o non luce, che peggiora/migliora a seconda della specie la visibilità, quindi la precisione , specie in attacchi a distanza: Scurovisione evita i malus.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 2:'''&lt;br /&gt;
&lt;br /&gt;
Gioco2: se ci si lancia da oggetti , dopo essersi arrampicati, possono esserci danni da caduta; strumenti come paracaduti o mosse magiche possono evitare i danni. Pozione del vento, soffi e devi attacchi. In difesa puoi parare, schivare, deviare: tre variabili? Ambiente: colline e pianure uguali, Monti sono Oggetti, picco ossia un unico monte oggetto. Rocce volanti, nuvole sospese: oggetto può essere sospeso e può fare periodicamente una mossa, ad es tuono, può spostarsi, può fare entra/esci, oggetto albero e oggetto foresta, si possono prendere, nascondersi, arrampicarsi, lanciarli, ostacolano velocità ma se si ha abbastanza forza si spezzano alberi. Acqua poco profonda, profonda, molto profonda: variabile boolean in Personaggio “alto” per toccare in acqua profonda, con acqua si generano fiumi laghi e mari. Ambiente si deve poter evolvere: ad esempio oggetto diga può fare metamorfosi e diventare oggetto cascata/torrente in piena. Per edifici più oggetti che rappresentano le mura e il tetto, variabile boolean per oggetto per entrare nell’oggetto. Possono essere spazzati via: danni da crollo, si può combattere all interni, contengono strumenti come tavoli sedie mobili letto ect. Se uno viene schiantato contro uno strumento prende danno(es danno da schianto). Ci possono essere scale, si può non avere contatti visivo sull’avversario. Oggetto mura, oggetto torre, oggetto casa interno sono cose distinte: possono dare malus/bonus su visibilità. Ambiente: pozzi e grotte, da gestire come interno casa. Lava come acqua, ogni oggetto può essere sorgenti di liquido: monte sorgente acqua, vulcano sorgente lava. Può esserci variabile probabilità eruzione, se settata a 1 c’è una continua eruzione. Strade di vario tipo, sovrapposta a altri suoli, migliorano velocità di alcuni strumenti, variabile boolean “ha le ruote” in classe strumenti. Unificare classe strumento e classe oggetto. Oggetti sospesi: case sospese su albero, ad es. Fiamme in mezzo al suolo. Oggetti: porto, aereoporto, grattacieli, dighe, impianti a fune, ospedali per curarsi e prendere oggetti per curarsi dopo, scuole contenenti libri per apprendere una mossa, luoghi di ingegneria per creare oggetti, ad esempio veicoli o armi, soldi nel gioco per comprare da eventuali venditori. Ogni oggetto avra un prezzo (valutabile circa in euro per semplicità). Variabile float per fame, sete, sonno, caldo-freddo (parte da 0.5). Nella mappa ci deve essere per ogni punto la temperatura. Possibilità di vomito, dissenteria, problemi cardiaci, respiratori, muscolari. Armi: balestra, mani nude, sasso, tirapugni, torcia accesa. Armature: intralciano o favoriscono agilità, attacco, poteri magici, rumorosa (elusione), è uno strumento/oggetto. Attacchi possono essere prolungati per turni, mosse variabile boolean prolungabile: può aumentare o diminuire intensità, c’è un max espresso in turni di prolungabilita, inoltre può essere leggermente alterato con una variabile casuale. Equipaggiamento (strumento/oggetto): pietra focaia, attrezzi da scalata, boccale di birra, cavallo, moto, chiodi, martello da fabbro, corda, corazza, dardo, faretra/zaino/sacca (oggetti che contengono una lista di oggetti, stringhe) con un numero per la quantità) e capacità massima zaino e ogni oggetto può avere un valore intero per dimensione (es martello 3, ascia grande 7), mantello, olio, variabile boolean prende fuoco/conduce elettricità, amplifica magnetismo, aumenta esplosioni nucleari, aumenta forza di gravità (?), pala, piccone, rampino, specchio, per osservare quando si è nascosti e si ha malus su visibilità. Strumenti da scasso per aprire porte: variabile boolean per oggetti: entrata con scasso. Personaggio: string razza per swag, immunità a veleni e malattie, elusione, agilità, precisione, abilità magiche(?), difesa fisica. In ultima torcia: agilità, coraggio, forza, intelligenza, magia, manualità, percezione, socialità. Bestiario: aracnoide di varie dimensioni, talpe giganti, vermi giganti di terra di mare e di lava ect, bulbo trascinatore che ha tentacoli per tirare a se e mangiare, lui è immobile, calabrone gigante, serpenti giganti, cinghiali, draghi, elfi, goblin e re goblin, sciamani (goblin), totem di guerra come strumento/oggetti per alterare statistiche nella loro area di influenza, lupo, mastino bruciante, nani, non morti/zombie/mummia/scheletro variabile boolean vivo a false ma ha ancora hp su parti del corpo: variabile boolean “zombizabile”. Orchi, pesci da terra (anfibi) tritone dell abisso, troll e trollin (orchi più deformi), umani. Abilità dei personaggi in ultima torcia: artificiale (robot) immunità a soffocamento, veleni, malattie ect immune a manipolazioni psichiche, visione oscurità; danno da attacco in carica; fiammegiante ossia la creatura può incendiarsi e elettrizzante ossia può diventare elettrica caricamente; modalità furia/mailmen ossia ottiene bonus su alcune/tutte le statistiche; gigantesco o molto piccolo due boolean (?forse non serve); immunità a magie mentali, al fuoco; linguaggi (?); non morto; danno da attacco in presa; pungiglioni velenosi; sa muoversi su ragnatele o è rallentato, resistenza a perforazione, respirare sott’acqua o sotto lava o nei liquidi in genere; rigenerazione; riceve danni dalla luce solare o da assenza di luce; è terrorizzato/impaurito/intimidito o se è imperturbabile boolean. Danno da trascinamento; paralizzante; può diventare più veloce (?non serve); visione a infrarossi attraverso oggetti; volare o andare sotto terra. Imperium editor, cose che penso di non aver ancora scritto: stagioni, suolo erboso o terriccio, sabbia con erba e terra e da sola, strade e stagioni, altitudine, alberi e arbusti, vari tipi a foglia larga, conifere, alberi secchi, palme, arbusti verdi e secchi, cactus, alghe marine, rocce e pietre, scheletri per terra, legna tagliata (alberi tagliati), carri e carretti, grotte e rovine per accessi sotterranei, locande, templi, accampamenti, fortini, monoliti, fontana, tombe e cimiteri, borse per terra, pozzo, troni, croci(del teschio), pozzo, capanne, lapidi, ponti, recinzioni, falò, tende, torri, panoplia, fessure come abissi, statue, rovine (deserto) come case distrutte, colonne per costruire templi, piramidi, sfingi, bandiere, rovine in Europa, campi coltivati che contengono cibo, fiamma (in altre), roccia in altre per montagne, altre-&amp;gt;rovine per monumenti non egiziani ma europei.&lt;br /&gt;
Ci sono paludi. Tende da campo. Forti, porti. Edifici delle fortezze, edifici dei villaggi. Naufragi e scogli.&lt;br /&gt;
Parametri voglia/impegno float per descrivere voglia di combattere Personaggio. Ricevi danno uscendo dalla mappa tra 1-5% tra 6-10% tra 11-15% della vita totale di ogni parte del corpo per ogni turno di gioco. Danno da precipitazione diverso da carica, uno verticale uno orizzontale, se precipiti da molto in alto hai bonus, oltre che danni da schianto lol. Baionette, formazione a blocchi, a quadrato (difensiva) sparano su quattro lati, a schiera vanno avanti. Usano un colpo poi lunga ricarica. Variabile boolean per attivare o meno fuoco amico. Azione per cambiare posizione: in piedi, in ginocchio(inteso come via di mezzo), sdraiato: per permettere migliore visibilità a chi è dietro (nella formazione).&lt;br /&gt;
Altruismo, coraggio, spingere oltre il limite, difendere al posto di un altro, migliorare posizione per avere bonus. Mosse da usare in condizioni psicologiche idonee: mosse estreme per disperazione, bonus unici. Condizioni per situazioni: blocco, spalle al muro, stritolato, confuso, semi parassiti addosso, azzoppato, bagnato d’acqua, lame affilate, corazza indurita, tante copie di me stesso attive, preveggente. Per ambiente:pioggia (torrenziale), barriera a cupola, punte metalliche a terra, blocco di fumo nero. Far volare un avversario/alleato. Tutti possono fare tutto sotto effetti magici o fisici. Un cavallo può volare se viene preso da un uccello e portato in alto.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 3, 4:'''&lt;br /&gt;
&lt;br /&gt;
Gioco1,2,3,4: tutto caricato su wikis.&lt;br /&gt;
&lt;br /&gt;
Gioco3: Mosse con caricamento + spostamento (es. kameamea con teletrasporto). Ciclo di interazione principale:crea o combatti. Modalità campagna, che chiede in input da che battaglia iniziare, ma implica tipi battaglie prefissati. Alla morte/sconfitta di un personaggio si possono alterare statistiche (es personaggio può cambiare fazione). Alcune mosse possono lasciare oggetti sul terreno: (ad es, radici di Groth). Ogni oggetto può alterare le statistiche al passaggio sopra, nelle vicinanze. Boolean invisibile per personaggio, diverso da elusione infinita. Se personaggio va in un altro dimensione -&amp;gt; unreachable. Attacco coordinato, se non lo fanno tutti vale lo stesso ma depotenziato opportunamente . Personaggio in modalità maniac (2 mosse per turno) e in modalità depressive (1 mossa ogni due turni); personaggio Flash può fare 10 mosse in un turno. Chiudi con lucchetto oggetto da dentro o da fuori, oggetto ingresso in oggetto casa , più ingressi per un singolo oggetto.nicole aniston. Rimbalzo se ci si schianta contro oggetto da calcolare con parametro. Ryuk e Darkrai.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gioco 4 23/07/2019:&lt;br /&gt;
Pula fiction, aracnidi, oggetto: due superfici rettangolari di forma diversa, anche inclinate , collegate. Più pezzi collegati tra loro per forme cilindriche cave, ad esempio, tipo vulcano. Mappa con sprite personaggi, canvas: anche mouseClick? Statistiche con nome gerarchico, es pokemon_attacco. Modalità survival, stile isola di jurassic park gdr; sia in coop che contro; possibilità di fare N turni di fila se non ci sono altri player giocanti nelle vicinanze (ciò però comporterebbe , in modalità contro , di capire quando c’è qualcuno nelle vicinanze perché si andrebbe di 1 turno alla volta, soluzioni: in mod contro 1 turno per volta oppure meccanismo di sincronizzazione turni quando uno vede l’altro (anche furtivo) come c’è attacco 1 turno a testa) .. analogo a Battle royale(?); inizio con starter kit random. Modalità assedio al castello. Inoltre se posso fare N turni di fila si può pensare a più pc , uno per persona , coordinati per fare comandi in parallelo, ma va ben congegnato meccanismo di sincronizzazione. Parti DelCorpo -&amp;gt; Componente/i oppure Parte. La mappa deve essere (x,y); l’altezza viene indicata onMouseOver certi pixel dove è posto il Personaggio; se personaggio dentro edificio/grotta cambio img (es sfocato/tratteggiato). Mosse: astrarre per target; molte mosse sono simili tra loro, somiglianza va sfruttata, hanno magari dei target in comune, o variano solo per un parametro. Creare mappa anche con drag and drop immagini ?(un po’ difficile). Più layout per interfaccia grafica (esempio uno che mostra errori input su text area, uno con alert, uno su box text area separato). Input comandi consumato pezzo per pezzo, alcune parole se prevedono parametri quando riconosciute fanno fetch anche di parola (numero) successiva. Face toon foto? Import parziali di personaggi (tutto tranne/solo questi campi specificati). Texture mappa complete o ripetibili (es per suolo). Anteprima battaglia stile battaglia pokemon (magari per 1/2/3 vs 1/2/3) per rappresentare scontro. Conviene usare xslx (excel) per dati, considerare che può non servire la libreria Java per leggere stringhe per operazioni. Mossa “again” , ripeti la precedenza(opportuna modifica parametri, es mossa spostamento). Possibile gestione contromosse: si usano marker (tag): ogni mossa ha elenco tag del tipo di contromosse che può subire (con probabilità annessa, che può dipendere da pg che subisce mossa congiuntamente a mossa stessa). Ogni mossa inoltre deve essere taggata come possibile contromossa che il pg può usare (per schivare può fare in più modi). A seconda del lancio del dado il pg che effettua La contromossa può anche scegliere tipologia di contromossa o solo la mossa della tipologia che ha beccato (entrano in gioco riflessi ect.). I parametri che fanno attivare unq o un’altra contromossa sono dinamici, posso dipendere ad esempio dalla posizione tra i due pg o altre statistiche. Tag contromosse a fasce (es. coprirsi è sempre più facile che schivare che e più facile di schivare e contrattaccare (?); all’interno dello stesso schivare e contrattaccare ci sono più sotto categorie). Per aggiunta personaggio può essere utili interfaccia dedicata, non linea di comando (o altre operazioni, specie se ci sono tabelle). Mossa “premonizione”: predire il futuro a breve termine, dici che mossa vorresti fare e ti dice esito (o più esiti se uno chiede più mosse). Funziona solo sulla prossima mossa. Contromossa delle contromossa gestione?? Eventualmente nell’esito si prevede ancore contro-contromossa. Ma si innesca reazione a catena, inoltre da gestire scelta contromossa in questo caso. Applicazione tag conoscenza(universo di appartenenza): “Termoli”, “pokemon”, “liceo classico Termoli”, anche gerarchici, per filtrare sui personaggi.target componibili , fattorizzato creazione mosse, hanno un costo magari per indicare quantovoccupano dicuna mossa, relativo maybe a un parametro o più del target stesso. In particolare, non saranno salvate le mosse per un personaggio (o solo alcune “preferite”) ma il suo insieme di target i quali devono dire:statistica che influenzano, “costo del turno” che richiedono al variare dell’intensità del target (che aumenta linearmente, esponenzialmente, generica f(x)) quindi corsa blanda costo 1 , Max corsa costo 5 (max), elenco (string) target incompatibili con tale target (se serve), nota relative ad es per quando uno vuole creare una mossa durante la battaglia (“target corsa, max sforzo dedicabile 4 ect” metti “50 metri corsa” “ok/troppo! Vuoi sforzati di più rischiando effetti collaterali?”). Si può autoscrivere la voce narrante del gioco come “la tua coscienza” mentre che giochi, d’altronde si interagisce con essa. Considerare che un target può appartenere a più personaggi, magari sotto nomi di mosse diversi.&lt;br /&gt;
Definire gerarchia di personaggi per template (tipo classe e super classe) e template importabili (tipo usa fuoco). Es umanoide non umanoide, tra umanoide maschio- femmina etc. Classe che estende System.out per creare funzioni che aggiungono Header “DEBUG:” etc; due programmi Java , due main: uno delegato a calcoli + gestione Excel; altro legge stdout dell altro per interfaccia grafica. Per allenare PG creare dei PG fantocci con label per fare Q-learning iniziale, più avanti far allenare pg tra loro; creare vari fantocci: tank terrestre fisico, healer volante etc. Excel: si usa css che si può rendere tabellare, più facile da trattare nel codice rispetto a .xslx. Ogni “utente” ed Lostefra ha il suo personale dizionario con sue personali short cut da usare in partita, eventuale login con password (opzionale) x accesso. Vedere license show down. Mappa unica stile giochi di ruolo, si vede tutto da sopra: click o simili su edifici/caverne per mappe interne a tale posto, così ok sprite e per rappresentare “pg in volo” sprite dedicato. Densità aria per dire quando anche un uomo per es può volare. Ipotesi più efficiente per dare un valore stima al pg: AI base che gioca a manetta contro altre AI base e dalle vittorie si fa l’euristica, più vittoria facile/veloce/stracciante più punti, contro vari pg, contro pg standard bench mark.&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Note&amp;diff=193</id>
		<title>Note</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Note&amp;diff=193"/>
		<updated>2020-05-02T17:01:20Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: /* Deploy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Note ==&lt;br /&gt;
&lt;br /&gt;
'''Vedere altre note su fogli di carta e promemoria del telefono. Ce ne sono molte.'''&lt;br /&gt;
'''La copiatura dai fogli di carta dei continuare da pagina 4 (&amp;quot;alterare param..&amp;quot;).'''&lt;br /&gt;
&lt;br /&gt;
===Inspirational Concepts===&lt;br /&gt;
* Gioco Lotta (Pokémon, Pokkén)&lt;br /&gt;
* no caselle esplicite&lt;br /&gt;
* Descrizione rispetto a: ambiente, nemico, oggetti&lt;br /&gt;
* pokémon, DnD, Call of Duty, Super Smash Brawl, corse pazze&lt;br /&gt;
* concentrarsi su: fluidi, telecinesi, razze, bonus/malus, gradi di libertà (fisicamente parlando) &lt;br /&gt;
* scacchi (es. crea casella), shaolin showdown&lt;br /&gt;
* prevedere = creatività&lt;br /&gt;
* acqua, aria, fuoco, terra&lt;br /&gt;
* gravità (newton), verso alto, basso, destra, sinistra, circolare, tutti i versi&lt;br /&gt;
* jumanji, savana, animali, zoologia&lt;br /&gt;
* tempo/spazio&lt;br /&gt;
* BF4, pirati, roma (imperium civitas)&lt;br /&gt;
* musica come arma (rap)&lt;br /&gt;
* magia, prestigiatori&lt;br /&gt;
* dinosauri (documentario, libro, zoologia)&lt;br /&gt;
* avengers, supereroi (libro)&lt;br /&gt;
&lt;br /&gt;
* Looney toons&lt;br /&gt;
&lt;br /&gt;
===Personaggi (con statistiche e stati)===&lt;br /&gt;
* combattenti (con statistiche e stati)&lt;br /&gt;
* immagine rappresentativa per rappresentare meglio&lt;br /&gt;
* HP: colore rosso su immagine personaggio, dove sei debole/già colpito (idea scartata)&lt;br /&gt;
* penitenza: il malus può essere inteso come ciò che c'è nell'inserimento successivo, malus cumulativo&lt;br /&gt;
* essere ipocrita, finzione (schermo)&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (personaggi)&lt;br /&gt;
* metamorfosi&lt;br /&gt;
* alchimisti&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* possibilità giù in terra/ giù in acqua, con reachable e unreachable Boolean. Fuori da mappa anche reachable e unreachable.&lt;br /&gt;
* Personaggi composti di parti[] es. testa, busto, gambe, braccia, coda, pinna, ali. Distinzione per arto di movimento e/o spostamento boolean.&lt;br /&gt;
* Arti possono provocare danno, bruciatura , paralisi a contatto (Boolean) . Percentuale di probabilità accompagna ogni Boolean.&lt;br /&gt;
* Ogni parte del corpo punti vita + se inutilizzabile + amputata + stato (es paralisi).&lt;br /&gt;
* Per fare battaglie tra molto grandi =&amp;gt; 1 m lo si intende come 10m.  (rivalutato, aumentare livello scaling)&lt;br /&gt;
* Personaggio fusionabile Boolean + string nomi con cui si fonde.&lt;br /&gt;
* Distinzione tra infernape e infernape1/2/3 ect tra “specie” e “nome”.&lt;br /&gt;
* variabile Boolean respawnable.&lt;br /&gt;
* Raccogliere a piene mani da: https://spore.fandom.com/wiki/Creature_Editor&lt;br /&gt;
* Ad esempio weapons come elemento di Corpo (zanne, corna) e possibilità di muoversi/attaccare furtivamente.&lt;br /&gt;
* Divisibile e unibile come boolean e array di stringe associate per indicare i nomi con cui si unisce il Personaggio o in cui si divide.&lt;br /&gt;
* Variabili posizione nome: from_x/y ; to_x/y.&lt;br /&gt;
* Classe Stato, Personaggio contiene Array di stato, stato contiene moltiplicatori per statistica es attacco velocità precisione elusione ect.&lt;br /&gt;
* Personaggio deve avere una stat tipo sanità mentale, intelligenza, quanto è confuso e quanto è impaurito (2).&lt;br /&gt;
&lt;br /&gt;
* Per personaggi molto piccoli (meno di 1m x 1m x 1m) possibilità di essere in (x,y,z) tra 0 e 1.000.000 (ordine del micrometro, 1*10^-6 == 0,000001) e avere (lenX, lenY, lenZ). In questo modo sono definite dimensioni inferiori ad 1 m^3.&lt;br /&gt;
* personaggi max 20x20 (rivaluato, meno limitata)&lt;br /&gt;
&lt;br /&gt;
===Mosse===&lt;br /&gt;
* &amp;quot;combattimento prescinde da combattente&amp;quot;&lt;br /&gt;
* mosse hanno: direzione, azione, attacco (mosse pokémon)&lt;br /&gt;
* Parametri interi per mossa (direzione, consumabili) con lower e upper bound&lt;br /&gt;
* camuffarsi =&amp;gt; DnD manuale&lt;br /&gt;
* wrestling (libro) per le mosse/prese&lt;br /&gt;
&lt;br /&gt;
* X fa una mossa contro Y: Z potrebbe reagire (Es. ricevendo il colpo al posto di Y). Può essere realizzato sia come se &amp;quot;Y chiede soccorso Z&amp;quot; o come reazione di alleati adiacenti &amp;quot;Z soccorre Y&amp;quot;&lt;br /&gt;
* Mossa prende come parametro di ingresso Corpo, ossia la parte del corpo coinvolta nella mossa (es arto , tutto corpo ect). &lt;br /&gt;
&lt;br /&gt;
===Oggetto (con statistiche e stati)===&lt;br /&gt;
* armi: lacci (stati), lame (potenze), sassi, reti, pistole (munizioni), razzi, bombe (potenze), fuoco (d'artificio?) =&amp;gt; manuale DnD&lt;br /&gt;
* veleno n modi =&amp;gt; DnD manuale&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (oggetti)&lt;br /&gt;
* automezzi con cannoni, variabile 'hasEntrata', 'tempoRiutilizzo'&lt;br /&gt;
* violino come arma (tutti strumenti musicali): a fiato, a corda, a percussione&lt;br /&gt;
* veleni, ampolle e flaconi magici, insieme di 'oggetti dentro' un oggetto&lt;br /&gt;
&lt;br /&gt;
* Classe oggetto: es albero, roccia, casa: forza necessaria per sradicare + forza per lanciare + destrezza / agilità per appendersi + nascondersi in proporzione alle dimensioni di chi si nasconde. &lt;br /&gt;
* Altri es. pali. Sotto terra o sotto acqua/lava/melma o simili. &lt;br /&gt;
* Acqua rallenta se non hai pinne boolean.&lt;br /&gt;
* Classe strumento per oggetti che si tengono in mano, es reti , pistole, spade, pugnali, scudi, elmi, lancia, arco , frecce, lanciarazzi, fucili cecchino, fucile assalto, corde.&lt;br /&gt;
* Strumenti e mosse: danno ad area, perforante, contundente (vedi dnd armi). Mosse possono creare/modificare/distruggere oggetti e strumenti.&lt;br /&gt;
* Oggetti del campo di gioco incidono su elusione (parametro di personaggio).&lt;br /&gt;
* Buco/abisso (boolean) per dire se c’è o meno il suolo (Suolo come classe?). &lt;br /&gt;
* Radiazioni. &lt;br /&gt;
&lt;br /&gt;
===Modalità gioco===&lt;br /&gt;
* turnazione&lt;br /&gt;
* 1 v 1 v 1 etc., ma anche squadre casuali&lt;br /&gt;
* punteggio: chi fa più punti, più uccisioni, definizione di 'punto', gioco per perdere&lt;br /&gt;
* inserisci personaggio total random&lt;br /&gt;
&lt;br /&gt;
* Modalità battaglia con interazione stile battaglia navale (non si vede mossa dell'avversario)&lt;br /&gt;
* Modalità di gioco: tutti contro tutti (battle royale), death match, vs CPU mode zombie(attaccano solo, se non possono vanno verso nemico): serve introdurre un punteggio, di sicuro per mode zombie , ma anche per death match e tutti contro tutti&lt;br /&gt;
* ingressi: ne entra un altro?&lt;br /&gt;
&lt;br /&gt;
===Mappa===&lt;br /&gt;
* arene&lt;br /&gt;
* minimappa (pixelata ?), legenda oggetti base, devono esserci caselle implicite&lt;br /&gt;
* mappa 100x100 (rivalutato, meno limitata)&lt;br /&gt;
* Cannoni fissi in mezzo al campo (strumento).&lt;br /&gt;
&lt;br /&gt;
===Funzionalità generali===&lt;br /&gt;
* Chiave: non una flat input box per i comandi; ma dinamica: si suppone il soggetto &amp;quot;io&amp;quot; (le azioni le fanno in prima persona i personaggi), ogni mossa deve prevedere dei complementi (&amp;quot;verso&amp;quot;, &amp;quot;tra quanto&amp;quot;, &amp;quot;cosa&amp;quot;, &amp;quot;a favore di chi&amp;quot;, &amp;quot;contro chi&amp;quot;). Ogni complemento collegato con box stile in pop up =&amp;gt; bootstrap (la grafica sara unica). Prevedere anche modalita flat con input del tipo &amp;quot;azione a=pippo verso=termoli&amp;quot; (regex check)&lt;br /&gt;
* &amp;quot;meno tabelle&amp;quot;, &amp;quot;no bottoni&amp;quot; e solo foto che si alternano, &amp;quot;la grafica serve&amp;quot;: text box unica interazione, text area (history), immagine personaggio e immagine mappa&lt;br /&gt;
* &amp;quot;persistenza anche da interfaccia grafica&amp;quot;, diritti di scrittura sui file?&lt;br /&gt;
* Segnalazione (comando per fare nota)&lt;br /&gt;
&lt;br /&gt;
===Deploy===&lt;br /&gt;
* &amp;quot;commenta il codice&amp;quot;, &amp;quot;dividi et impera&amp;quot;&lt;br /&gt;
* JAVA: Class.forName(&amp;lt;name&amp;gt;.class).newInstance();&lt;br /&gt;
* Server web (Apache Tomcat) ospita partite (+ localmente ha i file di funzionamento), in LAN client giocano. Interfaccia HTML5 + Javascript per giocare. Scalabile per futuro, basta offrire servizio su un ip pubblico. Studiare engine grafici Javascript&lt;br /&gt;
* bootstrap! (specie per input box)&lt;br /&gt;
* Vuegg: https://github.com/marketplace/vuegg  &lt;br /&gt;
* Material Design&lt;br /&gt;
* Unity, WebGL (vedi SDK dedicata, built per Android/iOS/etc.)&lt;br /&gt;
* rpgmaker, godot, aseprite, pixelart (in generale), ma anche phaser, piskel&lt;br /&gt;
* joomla! Per far prima con html&lt;br /&gt;
* libreria pygame&lt;br /&gt;
&lt;br /&gt;
===Copia&amp;amp;incolla generale, da smistare in sotto capitoli. Contiene anche '''tutte''' note del telefono (al 22/02/2020)===&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 1:'''&lt;br /&gt;
&lt;br /&gt;
Mosse che trasformano l’avversario: attenzione è una mossa devastante. Trasformazione totale o parziale. Si devono poter aggiungere mosse, strumenti dinamicamente. Battle bot:ribaltano, scintille, elementi (Oggetti) che danneggiano. One piece: I frutti del diavolo (悪魔の実 Akuma no mi?) sono frutti misteriosi che donano poteri soprannaturali a chi li mangia, rendendoli però incapaci di nuotare. Di conseguenza il contatto con l'acqua di mare o con una speciale sostanza conosciuta come agalmatolite indebolisce gli utilizzatori di frutti del diavolo e li priva dei loro poteri. Alcune persone sono inoltre in grado di ricorrere all'Ambizione (覇気 Haki?), una forza spirituale che permette di avvertire la presenza di altri esseri viventi e di predirne i movimenti, di irrobustire parti del corpo e di intimidire o fare svenire le creature con una debole forza di volontà. Personaggio ha funzione baricentro_x, baricentro_y calcolate come (from_x+to_x)/2 sul quale si basa la funzione di libreria getDistance(Personaggio A, Personaggio B, float success); tale funzione serve per calcolare per i PNG e per i PG se ha senso usare una mossa. Non-onniscienza: delle volte non si può sapere distanza avversario e fallisce la mossa per la distanza -&amp;gt; “float success” rappresenta la probabilità di successo (Personaggio ha parametro “osservare”). PNG di due categorie: offensivi o neutrali (no priorità a mosse di attacco, ma tutto casuale). Mosse e oggetti per chiamare Personaggi, magari non necessariamente alleati (2 mosse e 2 oggetti quindi necessari), richiamo di un personaggio preciso o di uno a caso. Ogni mossa/azione deve avere un tempo di attesa espresso in turni (alla meglio 0) per poter ripetere la mossa/azione. Strumenti anche mezzi di trasporto di aria, di terra, di acqua (o lava/palude). Possono attivare una metamorfosi / Unione per cambiare stats personaggio. Veicoli con armi o riparo. Gli strumenti da trattare come gli oggetti. Classe unica? I match/partite (immagino Classe Partita) devono avere variabile boolean “respawn”, per distinguere death match a punti con death match con una vita. Wrestling per ispirarsi nella lotta libera: calci pugni ginocchiate prese lanci salti testate gomitate ecc. Per punti si vince a un limite o dopo un tot di mosse , oppure al primo dei due raggiunti (max_punti e max_mosse parametri di Partita). I punti si guadagnano alla kill (un Punteggio per squadra, int punteggio salvato localmente dentro ogni Personaggio che ha la variabile int squadra). Si guadagnano tanti punti quanti sono i punti della variabile “valore” del personaggio ucciso, tale variabile è calcolata come somma dei valori di tutte le mosse/stats ect del Personaggio. Imperium civitas. Attacco dei giganti. Possibilità di morire se colpiti in un unico punto (tallone d Achille) implementabile come variabile boolean. Jump force. Game dev tycoon. Acqua diventa tsunami. Variabile int per attacco cumulativo di gruppo: es calciatori che più si passano la palla più l’attacco è forte. Suolo magico: non tutti i personaggi possono accedervi, array di string elenca i nomi di chi può accedervi. Funzione esci/entra in classe Personaggio per simulare scambio pokemon 6vs6. Piovra gigante. Rischio=danno*probabilita. Mossa su strumento e con strumento?&lt;br /&gt;
Mosse fisiche per arrampicarsi su avversario(se e solo se sei la metà di dimensioni(?)), atterrarlo, lanciarlo, accecarlo, immobilizzarlo. Se sei in gruppo/ orda bonus ad attacchi combinati. Armi: fruste e scheggie, corni che si suonano per chiamare altri. Tipo della mossa con moltiplicatore tra 0 (immune) e 2 (float): acqua, fuoco, magia, terra: da ispirarsi ai pokemon ma non da copiare, penso. Armi da campo: cannoni e catapulte. Veicoli d’acqua: moto acqua, canoe, barche a motore a remi. Nei veicoli malus su attenzione (variabile int in personaggio, indica attenzione in combattimento e non in altro) perché si è impegnato alla guida . All’inizio in image view “the hero” e “the map”. Condizione vittoria (oltre a morte, punti, o numero mosse, cioè tempo) morte di un singolo Personaggio, che potrebbe rappresentare un edificio, cassaforte o simili. Personaggio si può svestire e lasciare strumenti, modificano statistiche di attacco, difesa , agilità, ect. Variabile luce o non luce, che peggiora/migliora a seconda della specie la visibilità, quindi la precisione , specie in attacchi a distanza: Scurovisione evita i malus.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 2:'''&lt;br /&gt;
&lt;br /&gt;
Gioco2: se ci si lancia da oggetti , dopo essersi arrampicati, possono esserci danni da caduta; strumenti come paracaduti o mosse magiche possono evitare i danni. Pozione del vento, soffi e devi attacchi. In difesa puoi parare, schivare, deviare: tre variabili? Ambiente: colline e pianure uguali, Monti sono Oggetti, picco ossia un unico monte oggetto. Rocce volanti, nuvole sospese: oggetto può essere sospeso e può fare periodicamente una mossa, ad es tuono, può spostarsi, può fare entra/esci, oggetto albero e oggetto foresta, si possono prendere, nascondersi, arrampicarsi, lanciarli, ostacolano velocità ma se si ha abbastanza forza si spezzano alberi. Acqua poco profonda, profonda, molto profonda: variabile boolean in Personaggio “alto” per toccare in acqua profonda, con acqua si generano fiumi laghi e mari. Ambiente si deve poter evolvere: ad esempio oggetto diga può fare metamorfosi e diventare oggetto cascata/torrente in piena. Per edifici più oggetti che rappresentano le mura e il tetto, variabile boolean per oggetto per entrare nell’oggetto. Possono essere spazzati via: danni da crollo, si può combattere all interni, contengono strumenti come tavoli sedie mobili letto ect. Se uno viene schiantato contro uno strumento prende danno(es danno da schianto). Ci possono essere scale, si può non avere contatti visivo sull’avversario. Oggetto mura, oggetto torre, oggetto casa interno sono cose distinte: possono dare malus/bonus su visibilità. Ambiente: pozzi e grotte, da gestire come interno casa. Lava come acqua, ogni oggetto può essere sorgenti di liquido: monte sorgente acqua, vulcano sorgente lava. Può esserci variabile probabilità eruzione, se settata a 1 c’è una continua eruzione. Strade di vario tipo, sovrapposta a altri suoli, migliorano velocità di alcuni strumenti, variabile boolean “ha le ruote” in classe strumenti. Unificare classe strumento e classe oggetto. Oggetti sospesi: case sospese su albero, ad es. Fiamme in mezzo al suolo. Oggetti: porto, aereoporto, grattacieli, dighe, impianti a fune, ospedali per curarsi e prendere oggetti per curarsi dopo, scuole contenenti libri per apprendere una mossa, luoghi di ingegneria per creare oggetti, ad esempio veicoli o armi, soldi nel gioco per comprare da eventuali venditori. Ogni oggetto avra un prezzo (valutabile circa in euro per semplicità). Variabile float per fame, sete, sonno, caldo-freddo (parte da 0.5). Nella mappa ci deve essere per ogni punto la temperatura. Possibilità di vomito, dissenteria, problemi cardiaci, respiratori, muscolari. Armi: balestra, mani nude, sasso, tirapugni, torcia accesa. Armature: intralciano o favoriscono agilità, attacco, poteri magici, rumorosa (elusione), è uno strumento/oggetto. Attacchi possono essere prolungati per turni, mosse variabile boolean prolungabile: può aumentare o diminuire intensità, c’è un max espresso in turni di prolungabilita, inoltre può essere leggermente alterato con una variabile casuale. Equipaggiamento (strumento/oggetto): pietra focaia, attrezzi da scalata, boccale di birra, cavallo, moto, chiodi, martello da fabbro, corda, corazza, dardo, faretra/zaino/sacca (oggetti che contengono una lista di oggetti, stringhe) con un numero per la quantità) e capacità massima zaino e ogni oggetto può avere un valore intero per dimensione (es martello 3, ascia grande 7), mantello, olio, variabile boolean prende fuoco/conduce elettricità, amplifica magnetismo, aumenta esplosioni nucleari, aumenta forza di gravità (?), pala, piccone, rampino, specchio, per osservare quando si è nascosti e si ha malus su visibilità. Strumenti da scasso per aprire porte: variabile boolean per oggetti: entrata con scasso. Personaggio: string razza per swag, immunità a veleni e malattie, elusione, agilità, precisione, abilità magiche(?), difesa fisica. In ultima torcia: agilità, coraggio, forza, intelligenza, magia, manualità, percezione, socialità. Bestiario: aracnoide di varie dimensioni, talpe giganti, vermi giganti di terra di mare e di lava ect, bulbo trascinatore che ha tentacoli per tirare a se e mangiare, lui è immobile, calabrone gigante, serpenti giganti, cinghiali, draghi, elfi, goblin e re goblin, sciamani (goblin), totem di guerra come strumento/oggetti per alterare statistiche nella loro area di influenza, lupo, mastino bruciante, nani, non morti/zombie/mummia/scheletro variabile boolean vivo a false ma ha ancora hp su parti del corpo: variabile boolean “zombizabile”. Orchi, pesci da terra (anfibi) tritone dell abisso, troll e trollin (orchi più deformi), umani. Abilità dei personaggi in ultima torcia: artificiale (robot) immunità a soffocamento, veleni, malattie ect immune a manipolazioni psichiche, visione oscurità; danno da attacco in carica; fiammegiante ossia la creatura può incendiarsi e elettrizzante ossia può diventare elettrica caricamente; modalità furia/mailmen ossia ottiene bonus su alcune/tutte le statistiche; gigantesco o molto piccolo due boolean (?forse non serve); immunità a magie mentali, al fuoco; linguaggi (?); non morto; danno da attacco in presa; pungiglioni velenosi; sa muoversi su ragnatele o è rallentato, resistenza a perforazione, respirare sott’acqua o sotto lava o nei liquidi in genere; rigenerazione; riceve danni dalla luce solare o da assenza di luce; è terrorizzato/impaurito/intimidito o se è imperturbabile boolean. Danno da trascinamento; paralizzante; può diventare più veloce (?non serve); visione a infrarossi attraverso oggetti; volare o andare sotto terra. Imperium editor, cose che penso di non aver ancora scritto: stagioni, suolo erboso o terriccio, sabbia con erba e terra e da sola, strade e stagioni, altitudine, alberi e arbusti, vari tipi a foglia larga, conifere, alberi secchi, palme, arbusti verdi e secchi, cactus, alghe marine, rocce e pietre, scheletri per terra, legna tagliata (alberi tagliati), carri e carretti, grotte e rovine per accessi sotterranei, locande, templi, accampamenti, fortini, monoliti, fontana, tombe e cimiteri, borse per terra, pozzo, troni, croci(del teschio), pozzo, capanne, lapidi, ponti, recinzioni, falò, tende, torri, panoplia, fessure come abissi, statue, rovine (deserto) come case distrutte, colonne per costruire templi, piramidi, sfingi, bandiere, rovine in Europa, campi coltivati che contengono cibo, fiamma (in altre), roccia in altre per montagne, altre-&amp;gt;rovine per monumenti non egiziani ma europei.&lt;br /&gt;
Ci sono paludi. Tende da campo. Forti, porti. Edifici delle fortezze, edifici dei villaggi. Naufragi e scogli.&lt;br /&gt;
Parametri voglia/impegno float per descrivere voglia di combattere Personaggio. Ricevi danno uscendo dalla mappa tra 1-5% tra 6-10% tra 11-15% della vita totale di ogni parte del corpo per ogni turno di gioco. Danno da precipitazione diverso da carica, uno verticale uno orizzontale, se precipiti da molto in alto hai bonus, oltre che danni da schianto lol. Baionette, formazione a blocchi, a quadrato (difensiva) sparano su quattro lati, a schiera vanno avanti. Usano un colpo poi lunga ricarica. Variabile boolean per attivare o meno fuoco amico. Azione per cambiare posizione: in piedi, in ginocchio(inteso come via di mezzo), sdraiato: per permettere migliore visibilità a chi è dietro (nella formazione).&lt;br /&gt;
Altruismo, coraggio, spingere oltre il limite, difendere al posto di un altro, migliorare posizione per avere bonus. Mosse da usare in condizioni psicologiche idonee: mosse estreme per disperazione, bonus unici. Condizioni per situazioni: blocco, spalle al muro, stritolato, confuso, semi parassiti addosso, azzoppato, bagnato d’acqua, lame affilate, corazza indurita, tante copie di me stesso attive, preveggente. Per ambiente:pioggia (torrenziale), barriera a cupola, punte metalliche a terra, blocco di fumo nero. Far volare un avversario/alleato. Tutti possono fare tutto sotto effetti magici o fisici. Un cavallo può volare se viene preso da un uccello e portato in alto.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 3, 4:'''&lt;br /&gt;
&lt;br /&gt;
Gioco1,2,3,4: tutto caricato su wikis.&lt;br /&gt;
&lt;br /&gt;
Gioco3: Mosse con caricamento + spostamento (es. kameamea con teletrasporto). Ciclo di interazione principale:crea o combatti. Modalità campagna, che chiede in input da che battaglia iniziare, ma implica tipi battaglie prefissati. Alla morte/sconfitta di un personaggio si possono alterare statistiche (es personaggio può cambiare fazione). Alcune mosse possono lasciare oggetti sul terreno: (ad es, radici di Groth). Ogni oggetto può alterare le statistiche al passaggio sopra, nelle vicinanze. Boolean invisibile per personaggio, diverso da elusione infinita. Se personaggio va in un altro dimensione -&amp;gt; unreachable. Attacco coordinato, se non lo fanno tutti vale lo stesso ma depotenziato opportunamente . Personaggio in modalità maniac (2 mosse per turno) e in modalità depressive (1 mossa ogni due turni); personaggio Flash può fare 10 mosse in un turno. Chiudi con lucchetto oggetto da dentro o da fuori, oggetto ingresso in oggetto casa , più ingressi per un singolo oggetto.nicole aniston. Rimbalzo se ci si schianta contro oggetto da calcolare con parametro. Ryuk e Darkrai.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gioco 4 23/07/2019:&lt;br /&gt;
Pula fiction, aracnidi, oggetto: due superfici rettangolari di forma diversa, anche inclinate , collegate. Più pezzi collegati tra loro per forme cilindriche cave, ad esempio, tipo vulcano. Mappa con sprite personaggi, canvas: anche mouseClick? Statistiche con nome gerarchico, es pokemon_attacco. Modalità survival, stile isola di jurassic park gdr; sia in coop che contro; possibilità di fare N turni di fila se non ci sono altri player giocanti nelle vicinanze (ciò però comporterebbe , in modalità contro , di capire quando c’è qualcuno nelle vicinanze perché si andrebbe di 1 turno alla volta, soluzioni: in mod contro 1 turno per volta oppure meccanismo di sincronizzazione turni quando uno vede l’altro (anche furtivo) come c’è attacco 1 turno a testa) .. analogo a Battle royale(?); inizio con starter kit random. Modalità assedio al castello. Inoltre se posso fare N turni di fila si può pensare a più pc , uno per persona , coordinati per fare comandi in parallelo, ma va ben congegnato meccanismo di sincronizzazione. Parti DelCorpo -&amp;gt; Componente/i oppure Parte. La mappa deve essere (x,y); l’altezza viene indicata onMouseOver certi pixel dove è posto il Personaggio; se personaggio dentro edificio/grotta cambio img (es sfocato/tratteggiato). Mosse: astrarre per target; molte mosse sono simili tra loro, somiglianza va sfruttata, hanno magari dei target in comune, o variano solo per un parametro. Creare mappa anche con drag and drop immagini ?(un po’ difficile). Più layout per interfaccia grafica (esempio uno che mostra errori input su text area, uno con alert, uno su box text area separato). Input comandi consumato pezzo per pezzo, alcune parole se prevedono parametri quando riconosciute fanno fetch anche di parola (numero) successiva. Face toon foto? Import parziali di personaggi (tutto tranne/solo questi campi specificati). Texture mappa complete o ripetibili (es per suolo). Anteprima battaglia stile battaglia pokemon (magari per 1/2/3 vs 1/2/3) per rappresentare scontro. Conviene usare xslx (excel) per dati, considerare che può non servire la libreria Java per leggere stringhe per operazioni. Mossa “again” , ripeti la precedenza(opportuna modifica parametri, es mossa spostamento). Possibile gestione contromosse: si usano marker (tag): ogni mossa ha elenco tag del tipo di contromosse che può subire (con probabilità annessa, che può dipendere da pg che subisce mossa congiuntamente a mossa stessa). Ogni mossa inoltre deve essere taggata come possibile contromossa che il pg può usare (per schivare può fare in più modi). A seconda del lancio del dado il pg che effettua La contromossa può anche scegliere tipologia di contromossa o solo la mossa della tipologia che ha beccato (entrano in gioco riflessi ect.). I parametri che fanno attivare unq o un’altra contromossa sono dinamici, posso dipendere ad esempio dalla posizione tra i due pg o altre statistiche. Tag contromosse a fasce (es. coprirsi è sempre più facile che schivare che e più facile di schivare e contrattaccare (?); all’interno dello stesso schivare e contrattaccare ci sono più sotto categorie). Per aggiunta personaggio può essere utili interfaccia dedicata, non linea di comando (o altre operazioni, specie se ci sono tabelle). Mossa “premonizione”: predire il futuro a breve termine, dici che mossa vorresti fare e ti dice esito (o più esiti se uno chiede più mosse). Funziona solo sulla prossima mossa. Contromossa delle contromossa gestione?? Eventualmente nell’esito si prevede ancore contro-contromossa. Ma si innesca reazione a catena, inoltre da gestire scelta contromossa in questo caso. Applicazione tag conoscenza(universo di appartenenza): “Termoli”, “pokemon”, “liceo classico Termoli”, anche gerarchici, per filtrare sui personaggi.target componibili , fattorizzato creazione mosse, hanno un costo magari per indicare quantovoccupano dicuna mossa, relativo maybe a un parametro o più del target stesso. In particolare, non saranno salvate le mosse per un personaggio (o solo alcune “preferite”) ma il suo insieme di target i quali devono dire:statistica che influenzano, “costo del turno” che richiedono al variare dell’intensità del target (che aumenta linearmente, esponenzialmente, generica f(x)) quindi corsa blanda costo 1 , Max corsa costo 5 (max), elenco (string) target incompatibili con tale target (se serve), nota relative ad es per quando uno vuole creare una mossa durante la battaglia (“target corsa, max sforzo dedicabile 4 ect” metti “50 metri corsa” “ok/troppo! Vuoi sforzati di più rischiando effetti collaterali?”). Si può autoscrivere la voce narrante del gioco come “la tua coscienza” mentre che giochi, d’altronde si interagisce con essa. Considerare che un target può appartenere a più personaggi, magari sotto nomi di mosse diversi.&lt;br /&gt;
Definire gerarchia di personaggi per template (tipo classe e super classe) e template importabili (tipo usa fuoco). Es umanoide non umanoide, tra umanoide maschio- femmina etc. Classe che estende System.out per creare funzioni che aggiungono Header “DEBUG:” etc; due programmi Java , due main: uno delegato a calcoli + gestione Excel; altro legge stdout dell altro per interfaccia grafica. Per allenare PG creare dei PG fantocci con label per fare Q-learning iniziale, più avanti far allenare pg tra loro; creare vari fantocci: tank terrestre fisico, healer volante etc. Excel: si usa css che si può rendere tabellare, più facile da trattare nel codice rispetto a .xslx. Ogni “utente” ed Lostefra ha il suo personale dizionario con sue personali short cut da usare in partita, eventuale login con password (opzionale) x accesso. Vedere license show down. Mappa unica stile giochi di ruolo, si vede tutto da sopra: click o simili su edifici/caverne per mappe interne a tale posto, così ok sprite e per rappresentare “pg in volo” sprite dedicato. Densità aria per dire quando anche un uomo per es può volare. Ipotesi più efficiente per dare un valore stima al pg: AI base che gioca a manetta contro altre AI base e dalle vittorie si fa l’euristica, più vittoria facile/veloce/stracciante più punti, contro vari pg, contro pg standard bench mark.&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Note&amp;diff=192</id>
		<title>Note</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Note&amp;diff=192"/>
		<updated>2020-05-02T14:40:08Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: /* Deploy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Note ==&lt;br /&gt;
&lt;br /&gt;
'''Vedere altre note su fogli di carta e promemoria del telefono. Ce ne sono molte.'''&lt;br /&gt;
'''La copiatura dai fogli di carta dei continuare da pagina 4 (&amp;quot;alterare param..&amp;quot;).'''&lt;br /&gt;
&lt;br /&gt;
===Inspirational Concepts===&lt;br /&gt;
* Gioco Lotta (Pokémon, Pokkén)&lt;br /&gt;
* no caselle esplicite&lt;br /&gt;
* Descrizione rispetto a: ambiente, nemico, oggetti&lt;br /&gt;
* pokémon, DnD, Call of Duty, Super Smash Brawl, corse pazze&lt;br /&gt;
* concentrarsi su: fluidi, telecinesi, razze, bonus/malus, gradi di libertà (fisicamente parlando) &lt;br /&gt;
* scacchi (es. crea casella), shaolin showdown&lt;br /&gt;
* prevedere = creatività&lt;br /&gt;
* acqua, aria, fuoco, terra&lt;br /&gt;
* gravità (newton), verso alto, basso, destra, sinistra, circolare, tutti i versi&lt;br /&gt;
* jumanji, savana, animali, zoologia&lt;br /&gt;
* tempo/spazio&lt;br /&gt;
* BF4, pirati, roma (imperium civitas)&lt;br /&gt;
* musica come arma (rap)&lt;br /&gt;
* magia, prestigiatori&lt;br /&gt;
* dinosauri (documentario, libro, zoologia)&lt;br /&gt;
* avengers, supereroi (libro)&lt;br /&gt;
&lt;br /&gt;
* Looney toons&lt;br /&gt;
&lt;br /&gt;
===Personaggi (con statistiche e stati)===&lt;br /&gt;
* combattenti (con statistiche e stati)&lt;br /&gt;
* immagine rappresentativa per rappresentare meglio&lt;br /&gt;
* HP: colore rosso su immagine personaggio, dove sei debole/già colpito (idea scartata)&lt;br /&gt;
* penitenza: il malus può essere inteso come ciò che c'è nell'inserimento successivo, malus cumulativo&lt;br /&gt;
* essere ipocrita, finzione (schermo)&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (personaggi)&lt;br /&gt;
* metamorfosi&lt;br /&gt;
* alchimisti&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* possibilità giù in terra/ giù in acqua, con reachable e unreachable Boolean. Fuori da mappa anche reachable e unreachable.&lt;br /&gt;
* Personaggi composti di parti[] es. testa, busto, gambe, braccia, coda, pinna, ali. Distinzione per arto di movimento e/o spostamento boolean.&lt;br /&gt;
* Arti possono provocare danno, bruciatura , paralisi a contatto (Boolean) . Percentuale di probabilità accompagna ogni Boolean.&lt;br /&gt;
* Ogni parte del corpo punti vita + se inutilizzabile + amputata + stato (es paralisi).&lt;br /&gt;
* Per fare battaglie tra molto grandi =&amp;gt; 1 m lo si intende come 10m.  (rivalutato, aumentare livello scaling)&lt;br /&gt;
* Personaggio fusionabile Boolean + string nomi con cui si fonde.&lt;br /&gt;
* Distinzione tra infernape e infernape1/2/3 ect tra “specie” e “nome”.&lt;br /&gt;
* variabile Boolean respawnable.&lt;br /&gt;
* Raccogliere a piene mani da: https://spore.fandom.com/wiki/Creature_Editor&lt;br /&gt;
* Ad esempio weapons come elemento di Corpo (zanne, corna) e possibilità di muoversi/attaccare furtivamente.&lt;br /&gt;
* Divisibile e unibile come boolean e array di stringe associate per indicare i nomi con cui si unisce il Personaggio o in cui si divide.&lt;br /&gt;
* Variabili posizione nome: from_x/y ; to_x/y.&lt;br /&gt;
* Classe Stato, Personaggio contiene Array di stato, stato contiene moltiplicatori per statistica es attacco velocità precisione elusione ect.&lt;br /&gt;
* Personaggio deve avere una stat tipo sanità mentale, intelligenza, quanto è confuso e quanto è impaurito (2).&lt;br /&gt;
&lt;br /&gt;
* Per personaggi molto piccoli (meno di 1m x 1m x 1m) possibilità di essere in (x,y,z) tra 0 e 1.000.000 (ordine del micrometro, 1*10^-6 == 0,000001) e avere (lenX, lenY, lenZ). In questo modo sono definite dimensioni inferiori ad 1 m^3.&lt;br /&gt;
* personaggi max 20x20 (rivaluato, meno limitata)&lt;br /&gt;
&lt;br /&gt;
===Mosse===&lt;br /&gt;
* &amp;quot;combattimento prescinde da combattente&amp;quot;&lt;br /&gt;
* mosse hanno: direzione, azione, attacco (mosse pokémon)&lt;br /&gt;
* Parametri interi per mossa (direzione, consumabili) con lower e upper bound&lt;br /&gt;
* camuffarsi =&amp;gt; DnD manuale&lt;br /&gt;
* wrestling (libro) per le mosse/prese&lt;br /&gt;
&lt;br /&gt;
* X fa una mossa contro Y: Z potrebbe reagire (Es. ricevendo il colpo al posto di Y). Può essere realizzato sia come se &amp;quot;Y chiede soccorso Z&amp;quot; o come reazione di alleati adiacenti &amp;quot;Z soccorre Y&amp;quot;&lt;br /&gt;
* Mossa prende come parametro di ingresso Corpo, ossia la parte del corpo coinvolta nella mossa (es arto , tutto corpo ect). &lt;br /&gt;
&lt;br /&gt;
===Oggetto (con statistiche e stati)===&lt;br /&gt;
* armi: lacci (stati), lame (potenze), sassi, reti, pistole (munizioni), razzi, bombe (potenze), fuoco (d'artificio?) =&amp;gt; manuale DnD&lt;br /&gt;
* veleno n modi =&amp;gt; DnD manuale&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (oggetti)&lt;br /&gt;
* automezzi con cannoni, variabile 'hasEntrata', 'tempoRiutilizzo'&lt;br /&gt;
* violino come arma (tutti strumenti musicali): a fiato, a corda, a percussione&lt;br /&gt;
* veleni, ampolle e flaconi magici, insieme di 'oggetti dentro' un oggetto&lt;br /&gt;
&lt;br /&gt;
* Classe oggetto: es albero, roccia, casa: forza necessaria per sradicare + forza per lanciare + destrezza / agilità per appendersi + nascondersi in proporzione alle dimensioni di chi si nasconde. &lt;br /&gt;
* Altri es. pali. Sotto terra o sotto acqua/lava/melma o simili. &lt;br /&gt;
* Acqua rallenta se non hai pinne boolean.&lt;br /&gt;
* Classe strumento per oggetti che si tengono in mano, es reti , pistole, spade, pugnali, scudi, elmi, lancia, arco , frecce, lanciarazzi, fucili cecchino, fucile assalto, corde.&lt;br /&gt;
* Strumenti e mosse: danno ad area, perforante, contundente (vedi dnd armi). Mosse possono creare/modificare/distruggere oggetti e strumenti.&lt;br /&gt;
* Oggetti del campo di gioco incidono su elusione (parametro di personaggio).&lt;br /&gt;
* Buco/abisso (boolean) per dire se c’è o meno il suolo (Suolo come classe?). &lt;br /&gt;
* Radiazioni. &lt;br /&gt;
&lt;br /&gt;
===Modalità gioco===&lt;br /&gt;
* turnazione&lt;br /&gt;
* 1 v 1 v 1 etc., ma anche squadre casuali&lt;br /&gt;
* punteggio: chi fa più punti, più uccisioni, definizione di 'punto', gioco per perdere&lt;br /&gt;
* inserisci personaggio total random&lt;br /&gt;
&lt;br /&gt;
* Modalità battaglia con interazione stile battaglia navale (non si vede mossa dell'avversario)&lt;br /&gt;
* Modalità di gioco: tutti contro tutti (battle royale), death match, vs CPU mode zombie(attaccano solo, se non possono vanno verso nemico): serve introdurre un punteggio, di sicuro per mode zombie , ma anche per death match e tutti contro tutti&lt;br /&gt;
* ingressi: ne entra un altro?&lt;br /&gt;
&lt;br /&gt;
===Mappa===&lt;br /&gt;
* arene&lt;br /&gt;
* minimappa (pixelata ?), legenda oggetti base, devono esserci caselle implicite&lt;br /&gt;
* mappa 100x100 (rivalutato, meno limitata)&lt;br /&gt;
* Cannoni fissi in mezzo al campo (strumento).&lt;br /&gt;
&lt;br /&gt;
===Funzionalità generali===&lt;br /&gt;
* Chiave: non una flat input box per i comandi; ma dinamica: si suppone il soggetto &amp;quot;io&amp;quot; (le azioni le fanno in prima persona i personaggi), ogni mossa deve prevedere dei complementi (&amp;quot;verso&amp;quot;, &amp;quot;tra quanto&amp;quot;, &amp;quot;cosa&amp;quot;, &amp;quot;a favore di chi&amp;quot;, &amp;quot;contro chi&amp;quot;). Ogni complemento collegato con box stile in pop up =&amp;gt; bootstrap (la grafica sara unica). Prevedere anche modalita flat con input del tipo &amp;quot;azione a=pippo verso=termoli&amp;quot; (regex check)&lt;br /&gt;
* &amp;quot;meno tabelle&amp;quot;, &amp;quot;no bottoni&amp;quot; e solo foto che si alternano, &amp;quot;la grafica serve&amp;quot;: text box unica interazione, text area (history), immagine personaggio e immagine mappa&lt;br /&gt;
* &amp;quot;persistenza anche da interfaccia grafica&amp;quot;, diritti di scrittura sui file?&lt;br /&gt;
* Segnalazione (comando per fare nota)&lt;br /&gt;
&lt;br /&gt;
===Deploy===&lt;br /&gt;
* &amp;quot;commenta il codice&amp;quot;, &amp;quot;dividi et impera&amp;quot;&lt;br /&gt;
* JAVA: Class.forName(&amp;lt;name&amp;gt;.class).newInstance();&lt;br /&gt;
* Server web (Apache Tomcat) ospita partite (+ localmente ha i file di funzionamento), in LAN client giocano. Interfaccia HTML5 + Javascript per giocare. Scalabile per futuro, basta offrire servizio su un ip pubblico. Studiare engine grafici Javascript&lt;br /&gt;
* bootstrap! (specie per input box)&lt;br /&gt;
* Vuegg: https://github.com/marketplace/vuegg  &lt;br /&gt;
* Material Design&lt;br /&gt;
* Unity, WebGL&lt;br /&gt;
* rpgmaker, godot, aseprite, pixelart (in generale), ma anche phaser, piskel&lt;br /&gt;
* joomla! Per far prima con html&lt;br /&gt;
* libreria pygame&lt;br /&gt;
&lt;br /&gt;
===Copia&amp;amp;incolla generale, da smistare in sotto capitoli. Contiene anche '''tutte''' note del telefono (al 22/02/2020)===&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 1:'''&lt;br /&gt;
&lt;br /&gt;
Mosse che trasformano l’avversario: attenzione è una mossa devastante. Trasformazione totale o parziale. Si devono poter aggiungere mosse, strumenti dinamicamente. Battle bot:ribaltano, scintille, elementi (Oggetti) che danneggiano. One piece: I frutti del diavolo (悪魔の実 Akuma no mi?) sono frutti misteriosi che donano poteri soprannaturali a chi li mangia, rendendoli però incapaci di nuotare. Di conseguenza il contatto con l'acqua di mare o con una speciale sostanza conosciuta come agalmatolite indebolisce gli utilizzatori di frutti del diavolo e li priva dei loro poteri. Alcune persone sono inoltre in grado di ricorrere all'Ambizione (覇気 Haki?), una forza spirituale che permette di avvertire la presenza di altri esseri viventi e di predirne i movimenti, di irrobustire parti del corpo e di intimidire o fare svenire le creature con una debole forza di volontà. Personaggio ha funzione baricentro_x, baricentro_y calcolate come (from_x+to_x)/2 sul quale si basa la funzione di libreria getDistance(Personaggio A, Personaggio B, float success); tale funzione serve per calcolare per i PNG e per i PG se ha senso usare una mossa. Non-onniscienza: delle volte non si può sapere distanza avversario e fallisce la mossa per la distanza -&amp;gt; “float success” rappresenta la probabilità di successo (Personaggio ha parametro “osservare”). PNG di due categorie: offensivi o neutrali (no priorità a mosse di attacco, ma tutto casuale). Mosse e oggetti per chiamare Personaggi, magari non necessariamente alleati (2 mosse e 2 oggetti quindi necessari), richiamo di un personaggio preciso o di uno a caso. Ogni mossa/azione deve avere un tempo di attesa espresso in turni (alla meglio 0) per poter ripetere la mossa/azione. Strumenti anche mezzi di trasporto di aria, di terra, di acqua (o lava/palude). Possono attivare una metamorfosi / Unione per cambiare stats personaggio. Veicoli con armi o riparo. Gli strumenti da trattare come gli oggetti. Classe unica? I match/partite (immagino Classe Partita) devono avere variabile boolean “respawn”, per distinguere death match a punti con death match con una vita. Wrestling per ispirarsi nella lotta libera: calci pugni ginocchiate prese lanci salti testate gomitate ecc. Per punti si vince a un limite o dopo un tot di mosse , oppure al primo dei due raggiunti (max_punti e max_mosse parametri di Partita). I punti si guadagnano alla kill (un Punteggio per squadra, int punteggio salvato localmente dentro ogni Personaggio che ha la variabile int squadra). Si guadagnano tanti punti quanti sono i punti della variabile “valore” del personaggio ucciso, tale variabile è calcolata come somma dei valori di tutte le mosse/stats ect del Personaggio. Imperium civitas. Attacco dei giganti. Possibilità di morire se colpiti in un unico punto (tallone d Achille) implementabile come variabile boolean. Jump force. Game dev tycoon. Acqua diventa tsunami. Variabile int per attacco cumulativo di gruppo: es calciatori che più si passano la palla più l’attacco è forte. Suolo magico: non tutti i personaggi possono accedervi, array di string elenca i nomi di chi può accedervi. Funzione esci/entra in classe Personaggio per simulare scambio pokemon 6vs6. Piovra gigante. Rischio=danno*probabilita. Mossa su strumento e con strumento?&lt;br /&gt;
Mosse fisiche per arrampicarsi su avversario(se e solo se sei la metà di dimensioni(?)), atterrarlo, lanciarlo, accecarlo, immobilizzarlo. Se sei in gruppo/ orda bonus ad attacchi combinati. Armi: fruste e scheggie, corni che si suonano per chiamare altri. Tipo della mossa con moltiplicatore tra 0 (immune) e 2 (float): acqua, fuoco, magia, terra: da ispirarsi ai pokemon ma non da copiare, penso. Armi da campo: cannoni e catapulte. Veicoli d’acqua: moto acqua, canoe, barche a motore a remi. Nei veicoli malus su attenzione (variabile int in personaggio, indica attenzione in combattimento e non in altro) perché si è impegnato alla guida . All’inizio in image view “the hero” e “the map”. Condizione vittoria (oltre a morte, punti, o numero mosse, cioè tempo) morte di un singolo Personaggio, che potrebbe rappresentare un edificio, cassaforte o simili. Personaggio si può svestire e lasciare strumenti, modificano statistiche di attacco, difesa , agilità, ect. Variabile luce o non luce, che peggiora/migliora a seconda della specie la visibilità, quindi la precisione , specie in attacchi a distanza: Scurovisione evita i malus.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 2:'''&lt;br /&gt;
&lt;br /&gt;
Gioco2: se ci si lancia da oggetti , dopo essersi arrampicati, possono esserci danni da caduta; strumenti come paracaduti o mosse magiche possono evitare i danni. Pozione del vento, soffi e devi attacchi. In difesa puoi parare, schivare, deviare: tre variabili? Ambiente: colline e pianure uguali, Monti sono Oggetti, picco ossia un unico monte oggetto. Rocce volanti, nuvole sospese: oggetto può essere sospeso e può fare periodicamente una mossa, ad es tuono, può spostarsi, può fare entra/esci, oggetto albero e oggetto foresta, si possono prendere, nascondersi, arrampicarsi, lanciarli, ostacolano velocità ma se si ha abbastanza forza si spezzano alberi. Acqua poco profonda, profonda, molto profonda: variabile boolean in Personaggio “alto” per toccare in acqua profonda, con acqua si generano fiumi laghi e mari. Ambiente si deve poter evolvere: ad esempio oggetto diga può fare metamorfosi e diventare oggetto cascata/torrente in piena. Per edifici più oggetti che rappresentano le mura e il tetto, variabile boolean per oggetto per entrare nell’oggetto. Possono essere spazzati via: danni da crollo, si può combattere all interni, contengono strumenti come tavoli sedie mobili letto ect. Se uno viene schiantato contro uno strumento prende danno(es danno da schianto). Ci possono essere scale, si può non avere contatti visivo sull’avversario. Oggetto mura, oggetto torre, oggetto casa interno sono cose distinte: possono dare malus/bonus su visibilità. Ambiente: pozzi e grotte, da gestire come interno casa. Lava come acqua, ogni oggetto può essere sorgenti di liquido: monte sorgente acqua, vulcano sorgente lava. Può esserci variabile probabilità eruzione, se settata a 1 c’è una continua eruzione. Strade di vario tipo, sovrapposta a altri suoli, migliorano velocità di alcuni strumenti, variabile boolean “ha le ruote” in classe strumenti. Unificare classe strumento e classe oggetto. Oggetti sospesi: case sospese su albero, ad es. Fiamme in mezzo al suolo. Oggetti: porto, aereoporto, grattacieli, dighe, impianti a fune, ospedali per curarsi e prendere oggetti per curarsi dopo, scuole contenenti libri per apprendere una mossa, luoghi di ingegneria per creare oggetti, ad esempio veicoli o armi, soldi nel gioco per comprare da eventuali venditori. Ogni oggetto avra un prezzo (valutabile circa in euro per semplicità). Variabile float per fame, sete, sonno, caldo-freddo (parte da 0.5). Nella mappa ci deve essere per ogni punto la temperatura. Possibilità di vomito, dissenteria, problemi cardiaci, respiratori, muscolari. Armi: balestra, mani nude, sasso, tirapugni, torcia accesa. Armature: intralciano o favoriscono agilità, attacco, poteri magici, rumorosa (elusione), è uno strumento/oggetto. Attacchi possono essere prolungati per turni, mosse variabile boolean prolungabile: può aumentare o diminuire intensità, c’è un max espresso in turni di prolungabilita, inoltre può essere leggermente alterato con una variabile casuale. Equipaggiamento (strumento/oggetto): pietra focaia, attrezzi da scalata, boccale di birra, cavallo, moto, chiodi, martello da fabbro, corda, corazza, dardo, faretra/zaino/sacca (oggetti che contengono una lista di oggetti, stringhe) con un numero per la quantità) e capacità massima zaino e ogni oggetto può avere un valore intero per dimensione (es martello 3, ascia grande 7), mantello, olio, variabile boolean prende fuoco/conduce elettricità, amplifica magnetismo, aumenta esplosioni nucleari, aumenta forza di gravità (?), pala, piccone, rampino, specchio, per osservare quando si è nascosti e si ha malus su visibilità. Strumenti da scasso per aprire porte: variabile boolean per oggetti: entrata con scasso. Personaggio: string razza per swag, immunità a veleni e malattie, elusione, agilità, precisione, abilità magiche(?), difesa fisica. In ultima torcia: agilità, coraggio, forza, intelligenza, magia, manualità, percezione, socialità. Bestiario: aracnoide di varie dimensioni, talpe giganti, vermi giganti di terra di mare e di lava ect, bulbo trascinatore che ha tentacoli per tirare a se e mangiare, lui è immobile, calabrone gigante, serpenti giganti, cinghiali, draghi, elfi, goblin e re goblin, sciamani (goblin), totem di guerra come strumento/oggetti per alterare statistiche nella loro area di influenza, lupo, mastino bruciante, nani, non morti/zombie/mummia/scheletro variabile boolean vivo a false ma ha ancora hp su parti del corpo: variabile boolean “zombizabile”. Orchi, pesci da terra (anfibi) tritone dell abisso, troll e trollin (orchi più deformi), umani. Abilità dei personaggi in ultima torcia: artificiale (robot) immunità a soffocamento, veleni, malattie ect immune a manipolazioni psichiche, visione oscurità; danno da attacco in carica; fiammegiante ossia la creatura può incendiarsi e elettrizzante ossia può diventare elettrica caricamente; modalità furia/mailmen ossia ottiene bonus su alcune/tutte le statistiche; gigantesco o molto piccolo due boolean (?forse non serve); immunità a magie mentali, al fuoco; linguaggi (?); non morto; danno da attacco in presa; pungiglioni velenosi; sa muoversi su ragnatele o è rallentato, resistenza a perforazione, respirare sott’acqua o sotto lava o nei liquidi in genere; rigenerazione; riceve danni dalla luce solare o da assenza di luce; è terrorizzato/impaurito/intimidito o se è imperturbabile boolean. Danno da trascinamento; paralizzante; può diventare più veloce (?non serve); visione a infrarossi attraverso oggetti; volare o andare sotto terra. Imperium editor, cose che penso di non aver ancora scritto: stagioni, suolo erboso o terriccio, sabbia con erba e terra e da sola, strade e stagioni, altitudine, alberi e arbusti, vari tipi a foglia larga, conifere, alberi secchi, palme, arbusti verdi e secchi, cactus, alghe marine, rocce e pietre, scheletri per terra, legna tagliata (alberi tagliati), carri e carretti, grotte e rovine per accessi sotterranei, locande, templi, accampamenti, fortini, monoliti, fontana, tombe e cimiteri, borse per terra, pozzo, troni, croci(del teschio), pozzo, capanne, lapidi, ponti, recinzioni, falò, tende, torri, panoplia, fessure come abissi, statue, rovine (deserto) come case distrutte, colonne per costruire templi, piramidi, sfingi, bandiere, rovine in Europa, campi coltivati che contengono cibo, fiamma (in altre), roccia in altre per montagne, altre-&amp;gt;rovine per monumenti non egiziani ma europei.&lt;br /&gt;
Ci sono paludi. Tende da campo. Forti, porti. Edifici delle fortezze, edifici dei villaggi. Naufragi e scogli.&lt;br /&gt;
Parametri voglia/impegno float per descrivere voglia di combattere Personaggio. Ricevi danno uscendo dalla mappa tra 1-5% tra 6-10% tra 11-15% della vita totale di ogni parte del corpo per ogni turno di gioco. Danno da precipitazione diverso da carica, uno verticale uno orizzontale, se precipiti da molto in alto hai bonus, oltre che danni da schianto lol. Baionette, formazione a blocchi, a quadrato (difensiva) sparano su quattro lati, a schiera vanno avanti. Usano un colpo poi lunga ricarica. Variabile boolean per attivare o meno fuoco amico. Azione per cambiare posizione: in piedi, in ginocchio(inteso come via di mezzo), sdraiato: per permettere migliore visibilità a chi è dietro (nella formazione).&lt;br /&gt;
Altruismo, coraggio, spingere oltre il limite, difendere al posto di un altro, migliorare posizione per avere bonus. Mosse da usare in condizioni psicologiche idonee: mosse estreme per disperazione, bonus unici. Condizioni per situazioni: blocco, spalle al muro, stritolato, confuso, semi parassiti addosso, azzoppato, bagnato d’acqua, lame affilate, corazza indurita, tante copie di me stesso attive, preveggente. Per ambiente:pioggia (torrenziale), barriera a cupola, punte metalliche a terra, blocco di fumo nero. Far volare un avversario/alleato. Tutti possono fare tutto sotto effetti magici o fisici. Un cavallo può volare se viene preso da un uccello e portato in alto.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 3, 4:'''&lt;br /&gt;
&lt;br /&gt;
Gioco1,2,3,4: tutto caricato su wikis.&lt;br /&gt;
&lt;br /&gt;
Gioco3: Mosse con caricamento + spostamento (es. kameamea con teletrasporto). Ciclo di interazione principale:crea o combatti. Modalità campagna, che chiede in input da che battaglia iniziare, ma implica tipi battaglie prefissati. Alla morte/sconfitta di un personaggio si possono alterare statistiche (es personaggio può cambiare fazione). Alcune mosse possono lasciare oggetti sul terreno: (ad es, radici di Groth). Ogni oggetto può alterare le statistiche al passaggio sopra, nelle vicinanze. Boolean invisibile per personaggio, diverso da elusione infinita. Se personaggio va in un altro dimensione -&amp;gt; unreachable. Attacco coordinato, se non lo fanno tutti vale lo stesso ma depotenziato opportunamente . Personaggio in modalità maniac (2 mosse per turno) e in modalità depressive (1 mossa ogni due turni); personaggio Flash può fare 10 mosse in un turno. Chiudi con lucchetto oggetto da dentro o da fuori, oggetto ingresso in oggetto casa , più ingressi per un singolo oggetto.nicole aniston. Rimbalzo se ci si schianta contro oggetto da calcolare con parametro. Ryuk e Darkrai.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gioco 4 23/07/2019:&lt;br /&gt;
Pula fiction, aracnidi, oggetto: due superfici rettangolari di forma diversa, anche inclinate , collegate. Più pezzi collegati tra loro per forme cilindriche cave, ad esempio, tipo vulcano. Mappa con sprite personaggi, canvas: anche mouseClick? Statistiche con nome gerarchico, es pokemon_attacco. Modalità survival, stile isola di jurassic park gdr; sia in coop che contro; possibilità di fare N turni di fila se non ci sono altri player giocanti nelle vicinanze (ciò però comporterebbe , in modalità contro , di capire quando c’è qualcuno nelle vicinanze perché si andrebbe di 1 turno alla volta, soluzioni: in mod contro 1 turno per volta oppure meccanismo di sincronizzazione turni quando uno vede l’altro (anche furtivo) come c’è attacco 1 turno a testa) .. analogo a Battle royale(?); inizio con starter kit random. Modalità assedio al castello. Inoltre se posso fare N turni di fila si può pensare a più pc , uno per persona , coordinati per fare comandi in parallelo, ma va ben congegnato meccanismo di sincronizzazione. Parti DelCorpo -&amp;gt; Componente/i oppure Parte. La mappa deve essere (x,y); l’altezza viene indicata onMouseOver certi pixel dove è posto il Personaggio; se personaggio dentro edificio/grotta cambio img (es sfocato/tratteggiato). Mosse: astrarre per target; molte mosse sono simili tra loro, somiglianza va sfruttata, hanno magari dei target in comune, o variano solo per un parametro. Creare mappa anche con drag and drop immagini ?(un po’ difficile). Più layout per interfaccia grafica (esempio uno che mostra errori input su text area, uno con alert, uno su box text area separato). Input comandi consumato pezzo per pezzo, alcune parole se prevedono parametri quando riconosciute fanno fetch anche di parola (numero) successiva. Face toon foto? Import parziali di personaggi (tutto tranne/solo questi campi specificati). Texture mappa complete o ripetibili (es per suolo). Anteprima battaglia stile battaglia pokemon (magari per 1/2/3 vs 1/2/3) per rappresentare scontro. Conviene usare xslx (excel) per dati, considerare che può non servire la libreria Java per leggere stringhe per operazioni. Mossa “again” , ripeti la precedenza(opportuna modifica parametri, es mossa spostamento). Possibile gestione contromosse: si usano marker (tag): ogni mossa ha elenco tag del tipo di contromosse che può subire (con probabilità annessa, che può dipendere da pg che subisce mossa congiuntamente a mossa stessa). Ogni mossa inoltre deve essere taggata come possibile contromossa che il pg può usare (per schivare può fare in più modi). A seconda del lancio del dado il pg che effettua La contromossa può anche scegliere tipologia di contromossa o solo la mossa della tipologia che ha beccato (entrano in gioco riflessi ect.). I parametri che fanno attivare unq o un’altra contromossa sono dinamici, posso dipendere ad esempio dalla posizione tra i due pg o altre statistiche. Tag contromosse a fasce (es. coprirsi è sempre più facile che schivare che e più facile di schivare e contrattaccare (?); all’interno dello stesso schivare e contrattaccare ci sono più sotto categorie). Per aggiunta personaggio può essere utili interfaccia dedicata, non linea di comando (o altre operazioni, specie se ci sono tabelle). Mossa “premonizione”: predire il futuro a breve termine, dici che mossa vorresti fare e ti dice esito (o più esiti se uno chiede più mosse). Funziona solo sulla prossima mossa. Contromossa delle contromossa gestione?? Eventualmente nell’esito si prevede ancore contro-contromossa. Ma si innesca reazione a catena, inoltre da gestire scelta contromossa in questo caso. Applicazione tag conoscenza(universo di appartenenza): “Termoli”, “pokemon”, “liceo classico Termoli”, anche gerarchici, per filtrare sui personaggi.target componibili , fattorizzato creazione mosse, hanno un costo magari per indicare quantovoccupano dicuna mossa, relativo maybe a un parametro o più del target stesso. In particolare, non saranno salvate le mosse per un personaggio (o solo alcune “preferite”) ma il suo insieme di target i quali devono dire:statistica che influenzano, “costo del turno” che richiedono al variare dell’intensità del target (che aumenta linearmente, esponenzialmente, generica f(x)) quindi corsa blanda costo 1 , Max corsa costo 5 (max), elenco (string) target incompatibili con tale target (se serve), nota relative ad es per quando uno vuole creare una mossa durante la battaglia (“target corsa, max sforzo dedicabile 4 ect” metti “50 metri corsa” “ok/troppo! Vuoi sforzati di più rischiando effetti collaterali?”). Si può autoscrivere la voce narrante del gioco come “la tua coscienza” mentre che giochi, d’altronde si interagisce con essa. Considerare che un target può appartenere a più personaggi, magari sotto nomi di mosse diversi.&lt;br /&gt;
Definire gerarchia di personaggi per template (tipo classe e super classe) e template importabili (tipo usa fuoco). Es umanoide non umanoide, tra umanoide maschio- femmina etc. Classe che estende System.out per creare funzioni che aggiungono Header “DEBUG:” etc; due programmi Java , due main: uno delegato a calcoli + gestione Excel; altro legge stdout dell altro per interfaccia grafica. Per allenare PG creare dei PG fantocci con label per fare Q-learning iniziale, più avanti far allenare pg tra loro; creare vari fantocci: tank terrestre fisico, healer volante etc. Excel: si usa css che si può rendere tabellare, più facile da trattare nel codice rispetto a .xslx. Ogni “utente” ed Lostefra ha il suo personale dizionario con sue personali short cut da usare in partita, eventuale login con password (opzionale) x accesso. Vedere license show down. Mappa unica stile giochi di ruolo, si vede tutto da sopra: click o simili su edifici/caverne per mappe interne a tale posto, così ok sprite e per rappresentare “pg in volo” sprite dedicato. Densità aria per dire quando anche un uomo per es può volare. Ipotesi più efficiente per dare un valore stima al pg: AI base che gioca a manetta contro altre AI base e dalle vittorie si fa l’euristica, più vittoria facile/veloce/stracciante più punti, contro vari pg, contro pg standard bench mark.&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Note&amp;diff=191</id>
		<title>Note</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Note&amp;diff=191"/>
		<updated>2020-05-01T13:46:17Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: /* Deploy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Note ==&lt;br /&gt;
&lt;br /&gt;
'''Vedere altre note su fogli di carta e promemoria del telefono. Ce ne sono molte.'''&lt;br /&gt;
'''La copiatura dai fogli di carta dei continuare da pagina 4 (&amp;quot;alterare param..&amp;quot;).'''&lt;br /&gt;
&lt;br /&gt;
===Inspirational Concepts===&lt;br /&gt;
* Gioco Lotta (Pokémon, Pokkén)&lt;br /&gt;
* no caselle esplicite&lt;br /&gt;
* Descrizione rispetto a: ambiente, nemico, oggetti&lt;br /&gt;
* pokémon, DnD, Call of Duty, Super Smash Brawl, corse pazze&lt;br /&gt;
* concentrarsi su: fluidi, telecinesi, razze, bonus/malus, gradi di libertà (fisicamente parlando) &lt;br /&gt;
* scacchi (es. crea casella), shaolin showdown&lt;br /&gt;
* prevedere = creatività&lt;br /&gt;
* acqua, aria, fuoco, terra&lt;br /&gt;
* gravità (newton), verso alto, basso, destra, sinistra, circolare, tutti i versi&lt;br /&gt;
* jumanji, savana, animali, zoologia&lt;br /&gt;
* tempo/spazio&lt;br /&gt;
* BF4, pirati, roma (imperium civitas)&lt;br /&gt;
* musica come arma (rap)&lt;br /&gt;
* magia, prestigiatori&lt;br /&gt;
* dinosauri (documentario, libro, zoologia)&lt;br /&gt;
* avengers, supereroi (libro)&lt;br /&gt;
&lt;br /&gt;
* Looney toons&lt;br /&gt;
&lt;br /&gt;
===Personaggi (con statistiche e stati)===&lt;br /&gt;
* combattenti (con statistiche e stati)&lt;br /&gt;
* immagine rappresentativa per rappresentare meglio&lt;br /&gt;
* HP: colore rosso su immagine personaggio, dove sei debole/già colpito (idea scartata)&lt;br /&gt;
* penitenza: il malus può essere inteso come ciò che c'è nell'inserimento successivo, malus cumulativo&lt;br /&gt;
* essere ipocrita, finzione (schermo)&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (personaggi)&lt;br /&gt;
* metamorfosi&lt;br /&gt;
* alchimisti&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* possibilità giù in terra/ giù in acqua, con reachable e unreachable Boolean. Fuori da mappa anche reachable e unreachable.&lt;br /&gt;
* Personaggi composti di parti[] es. testa, busto, gambe, braccia, coda, pinna, ali. Distinzione per arto di movimento e/o spostamento boolean.&lt;br /&gt;
* Arti possono provocare danno, bruciatura , paralisi a contatto (Boolean) . Percentuale di probabilità accompagna ogni Boolean.&lt;br /&gt;
* Ogni parte del corpo punti vita + se inutilizzabile + amputata + stato (es paralisi).&lt;br /&gt;
* Per fare battaglie tra molto grandi =&amp;gt; 1 m lo si intende come 10m.  (rivalutato, aumentare livello scaling)&lt;br /&gt;
* Personaggio fusionabile Boolean + string nomi con cui si fonde.&lt;br /&gt;
* Distinzione tra infernape e infernape1/2/3 ect tra “specie” e “nome”.&lt;br /&gt;
* variabile Boolean respawnable.&lt;br /&gt;
* Raccogliere a piene mani da: https://spore.fandom.com/wiki/Creature_Editor&lt;br /&gt;
* Ad esempio weapons come elemento di Corpo (zanne, corna) e possibilità di muoversi/attaccare furtivamente.&lt;br /&gt;
* Divisibile e unibile come boolean e array di stringe associate per indicare i nomi con cui si unisce il Personaggio o in cui si divide.&lt;br /&gt;
* Variabili posizione nome: from_x/y ; to_x/y.&lt;br /&gt;
* Classe Stato, Personaggio contiene Array di stato, stato contiene moltiplicatori per statistica es attacco velocità precisione elusione ect.&lt;br /&gt;
* Personaggio deve avere una stat tipo sanità mentale, intelligenza, quanto è confuso e quanto è impaurito (2).&lt;br /&gt;
&lt;br /&gt;
* Per personaggi molto piccoli (meno di 1m x 1m x 1m) possibilità di essere in (x,y,z) tra 0 e 1.000.000 (ordine del micrometro, 1*10^-6 == 0,000001) e avere (lenX, lenY, lenZ). In questo modo sono definite dimensioni inferiori ad 1 m^3.&lt;br /&gt;
* personaggi max 20x20 (rivaluato, meno limitata)&lt;br /&gt;
&lt;br /&gt;
===Mosse===&lt;br /&gt;
* &amp;quot;combattimento prescinde da combattente&amp;quot;&lt;br /&gt;
* mosse hanno: direzione, azione, attacco (mosse pokémon)&lt;br /&gt;
* Parametri interi per mossa (direzione, consumabili) con lower e upper bound&lt;br /&gt;
* camuffarsi =&amp;gt; DnD manuale&lt;br /&gt;
* wrestling (libro) per le mosse/prese&lt;br /&gt;
&lt;br /&gt;
* X fa una mossa contro Y: Z potrebbe reagire (Es. ricevendo il colpo al posto di Y). Può essere realizzato sia come se &amp;quot;Y chiede soccorso Z&amp;quot; o come reazione di alleati adiacenti &amp;quot;Z soccorre Y&amp;quot;&lt;br /&gt;
* Mossa prende come parametro di ingresso Corpo, ossia la parte del corpo coinvolta nella mossa (es arto , tutto corpo ect). &lt;br /&gt;
&lt;br /&gt;
===Oggetto (con statistiche e stati)===&lt;br /&gt;
* armi: lacci (stati), lame (potenze), sassi, reti, pistole (munizioni), razzi, bombe (potenze), fuoco (d'artificio?) =&amp;gt; manuale DnD&lt;br /&gt;
* veleno n modi =&amp;gt; DnD manuale&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (oggetti)&lt;br /&gt;
* automezzi con cannoni, variabile 'hasEntrata', 'tempoRiutilizzo'&lt;br /&gt;
* violino come arma (tutti strumenti musicali): a fiato, a corda, a percussione&lt;br /&gt;
* veleni, ampolle e flaconi magici, insieme di 'oggetti dentro' un oggetto&lt;br /&gt;
&lt;br /&gt;
* Classe oggetto: es albero, roccia, casa: forza necessaria per sradicare + forza per lanciare + destrezza / agilità per appendersi + nascondersi in proporzione alle dimensioni di chi si nasconde. &lt;br /&gt;
* Altri es. pali. Sotto terra o sotto acqua/lava/melma o simili. &lt;br /&gt;
* Acqua rallenta se non hai pinne boolean.&lt;br /&gt;
* Classe strumento per oggetti che si tengono in mano, es reti , pistole, spade, pugnali, scudi, elmi, lancia, arco , frecce, lanciarazzi, fucili cecchino, fucile assalto, corde.&lt;br /&gt;
* Strumenti e mosse: danno ad area, perforante, contundente (vedi dnd armi). Mosse possono creare/modificare/distruggere oggetti e strumenti.&lt;br /&gt;
* Oggetti del campo di gioco incidono su elusione (parametro di personaggio).&lt;br /&gt;
* Buco/abisso (boolean) per dire se c’è o meno il suolo (Suolo come classe?). &lt;br /&gt;
* Radiazioni. &lt;br /&gt;
&lt;br /&gt;
===Modalità gioco===&lt;br /&gt;
* turnazione&lt;br /&gt;
* 1 v 1 v 1 etc., ma anche squadre casuali&lt;br /&gt;
* punteggio: chi fa più punti, più uccisioni, definizione di 'punto', gioco per perdere&lt;br /&gt;
* inserisci personaggio total random&lt;br /&gt;
&lt;br /&gt;
* Modalità battaglia con interazione stile battaglia navale (non si vede mossa dell'avversario)&lt;br /&gt;
* Modalità di gioco: tutti contro tutti (battle royale), death match, vs CPU mode zombie(attaccano solo, se non possono vanno verso nemico): serve introdurre un punteggio, di sicuro per mode zombie , ma anche per death match e tutti contro tutti&lt;br /&gt;
* ingressi: ne entra un altro?&lt;br /&gt;
&lt;br /&gt;
===Mappa===&lt;br /&gt;
* arene&lt;br /&gt;
* minimappa (pixelata ?), legenda oggetti base, devono esserci caselle implicite&lt;br /&gt;
* mappa 100x100 (rivalutato, meno limitata)&lt;br /&gt;
* Cannoni fissi in mezzo al campo (strumento).&lt;br /&gt;
&lt;br /&gt;
===Funzionalità generali===&lt;br /&gt;
* Chiave: non una flat input box per i comandi; ma dinamica: si suppone il soggetto &amp;quot;io&amp;quot; (le azioni le fanno in prima persona i personaggi), ogni mossa deve prevedere dei complementi (&amp;quot;verso&amp;quot;, &amp;quot;tra quanto&amp;quot;, &amp;quot;cosa&amp;quot;, &amp;quot;a favore di chi&amp;quot;, &amp;quot;contro chi&amp;quot;). Ogni complemento collegato con box stile in pop up =&amp;gt; bootstrap (la grafica sara unica). Prevedere anche modalita flat con input del tipo &amp;quot;azione a=pippo verso=termoli&amp;quot; (regex check)&lt;br /&gt;
* &amp;quot;meno tabelle&amp;quot;, &amp;quot;no bottoni&amp;quot; e solo foto che si alternano, &amp;quot;la grafica serve&amp;quot;: text box unica interazione, text area (history), immagine personaggio e immagine mappa&lt;br /&gt;
* &amp;quot;persistenza anche da interfaccia grafica&amp;quot;, diritti di scrittura sui file?&lt;br /&gt;
* Segnalazione (comando per fare nota)&lt;br /&gt;
&lt;br /&gt;
===Deploy===&lt;br /&gt;
* &amp;quot;commenta il codice&amp;quot;, &amp;quot;dividi et impera&amp;quot;&lt;br /&gt;
* JAVA: Class.forName(&amp;lt;name&amp;gt;.class).newInstance();&lt;br /&gt;
* Server web (Apache Tomcat) ospita partite (+ localmente ha i file di funzionamento), in LAN client giocano. Interfaccia HTML5 + Javascript per giocare. Scalabile per futuro, basta offrire servizio su un ip pubblico. Studiare engine grafici Javascript&lt;br /&gt;
* bootstrap! (specie per input box)&lt;br /&gt;
* Vuegg: https://github.com/marketplace/vuegg  &lt;br /&gt;
* Material Design&lt;br /&gt;
* rpgmaker, godot, aseprite, pixelart (in generale), ma anche phaser, piskel&lt;br /&gt;
* joomla! Per far prima con html&lt;br /&gt;
* libreria pygame&lt;br /&gt;
&lt;br /&gt;
===Copia&amp;amp;incolla generale, da smistare in sotto capitoli. Contiene anche '''tutte''' note del telefono (al 22/02/2020)===&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 1:'''&lt;br /&gt;
&lt;br /&gt;
Mosse che trasformano l’avversario: attenzione è una mossa devastante. Trasformazione totale o parziale. Si devono poter aggiungere mosse, strumenti dinamicamente. Battle bot:ribaltano, scintille, elementi (Oggetti) che danneggiano. One piece: I frutti del diavolo (悪魔の実 Akuma no mi?) sono frutti misteriosi che donano poteri soprannaturali a chi li mangia, rendendoli però incapaci di nuotare. Di conseguenza il contatto con l'acqua di mare o con una speciale sostanza conosciuta come agalmatolite indebolisce gli utilizzatori di frutti del diavolo e li priva dei loro poteri. Alcune persone sono inoltre in grado di ricorrere all'Ambizione (覇気 Haki?), una forza spirituale che permette di avvertire la presenza di altri esseri viventi e di predirne i movimenti, di irrobustire parti del corpo e di intimidire o fare svenire le creature con una debole forza di volontà. Personaggio ha funzione baricentro_x, baricentro_y calcolate come (from_x+to_x)/2 sul quale si basa la funzione di libreria getDistance(Personaggio A, Personaggio B, float success); tale funzione serve per calcolare per i PNG e per i PG se ha senso usare una mossa. Non-onniscienza: delle volte non si può sapere distanza avversario e fallisce la mossa per la distanza -&amp;gt; “float success” rappresenta la probabilità di successo (Personaggio ha parametro “osservare”). PNG di due categorie: offensivi o neutrali (no priorità a mosse di attacco, ma tutto casuale). Mosse e oggetti per chiamare Personaggi, magari non necessariamente alleati (2 mosse e 2 oggetti quindi necessari), richiamo di un personaggio preciso o di uno a caso. Ogni mossa/azione deve avere un tempo di attesa espresso in turni (alla meglio 0) per poter ripetere la mossa/azione. Strumenti anche mezzi di trasporto di aria, di terra, di acqua (o lava/palude). Possono attivare una metamorfosi / Unione per cambiare stats personaggio. Veicoli con armi o riparo. Gli strumenti da trattare come gli oggetti. Classe unica? I match/partite (immagino Classe Partita) devono avere variabile boolean “respawn”, per distinguere death match a punti con death match con una vita. Wrestling per ispirarsi nella lotta libera: calci pugni ginocchiate prese lanci salti testate gomitate ecc. Per punti si vince a un limite o dopo un tot di mosse , oppure al primo dei due raggiunti (max_punti e max_mosse parametri di Partita). I punti si guadagnano alla kill (un Punteggio per squadra, int punteggio salvato localmente dentro ogni Personaggio che ha la variabile int squadra). Si guadagnano tanti punti quanti sono i punti della variabile “valore” del personaggio ucciso, tale variabile è calcolata come somma dei valori di tutte le mosse/stats ect del Personaggio. Imperium civitas. Attacco dei giganti. Possibilità di morire se colpiti in un unico punto (tallone d Achille) implementabile come variabile boolean. Jump force. Game dev tycoon. Acqua diventa tsunami. Variabile int per attacco cumulativo di gruppo: es calciatori che più si passano la palla più l’attacco è forte. Suolo magico: non tutti i personaggi possono accedervi, array di string elenca i nomi di chi può accedervi. Funzione esci/entra in classe Personaggio per simulare scambio pokemon 6vs6. Piovra gigante. Rischio=danno*probabilita. Mossa su strumento e con strumento?&lt;br /&gt;
Mosse fisiche per arrampicarsi su avversario(se e solo se sei la metà di dimensioni(?)), atterrarlo, lanciarlo, accecarlo, immobilizzarlo. Se sei in gruppo/ orda bonus ad attacchi combinati. Armi: fruste e scheggie, corni che si suonano per chiamare altri. Tipo della mossa con moltiplicatore tra 0 (immune) e 2 (float): acqua, fuoco, magia, terra: da ispirarsi ai pokemon ma non da copiare, penso. Armi da campo: cannoni e catapulte. Veicoli d’acqua: moto acqua, canoe, barche a motore a remi. Nei veicoli malus su attenzione (variabile int in personaggio, indica attenzione in combattimento e non in altro) perché si è impegnato alla guida . All’inizio in image view “the hero” e “the map”. Condizione vittoria (oltre a morte, punti, o numero mosse, cioè tempo) morte di un singolo Personaggio, che potrebbe rappresentare un edificio, cassaforte o simili. Personaggio si può svestire e lasciare strumenti, modificano statistiche di attacco, difesa , agilità, ect. Variabile luce o non luce, che peggiora/migliora a seconda della specie la visibilità, quindi la precisione , specie in attacchi a distanza: Scurovisione evita i malus.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 2:'''&lt;br /&gt;
&lt;br /&gt;
Gioco2: se ci si lancia da oggetti , dopo essersi arrampicati, possono esserci danni da caduta; strumenti come paracaduti o mosse magiche possono evitare i danni. Pozione del vento, soffi e devi attacchi. In difesa puoi parare, schivare, deviare: tre variabili? Ambiente: colline e pianure uguali, Monti sono Oggetti, picco ossia un unico monte oggetto. Rocce volanti, nuvole sospese: oggetto può essere sospeso e può fare periodicamente una mossa, ad es tuono, può spostarsi, può fare entra/esci, oggetto albero e oggetto foresta, si possono prendere, nascondersi, arrampicarsi, lanciarli, ostacolano velocità ma se si ha abbastanza forza si spezzano alberi. Acqua poco profonda, profonda, molto profonda: variabile boolean in Personaggio “alto” per toccare in acqua profonda, con acqua si generano fiumi laghi e mari. Ambiente si deve poter evolvere: ad esempio oggetto diga può fare metamorfosi e diventare oggetto cascata/torrente in piena. Per edifici più oggetti che rappresentano le mura e il tetto, variabile boolean per oggetto per entrare nell’oggetto. Possono essere spazzati via: danni da crollo, si può combattere all interni, contengono strumenti come tavoli sedie mobili letto ect. Se uno viene schiantato contro uno strumento prende danno(es danno da schianto). Ci possono essere scale, si può non avere contatti visivo sull’avversario. Oggetto mura, oggetto torre, oggetto casa interno sono cose distinte: possono dare malus/bonus su visibilità. Ambiente: pozzi e grotte, da gestire come interno casa. Lava come acqua, ogni oggetto può essere sorgenti di liquido: monte sorgente acqua, vulcano sorgente lava. Può esserci variabile probabilità eruzione, se settata a 1 c’è una continua eruzione. Strade di vario tipo, sovrapposta a altri suoli, migliorano velocità di alcuni strumenti, variabile boolean “ha le ruote” in classe strumenti. Unificare classe strumento e classe oggetto. Oggetti sospesi: case sospese su albero, ad es. Fiamme in mezzo al suolo. Oggetti: porto, aereoporto, grattacieli, dighe, impianti a fune, ospedali per curarsi e prendere oggetti per curarsi dopo, scuole contenenti libri per apprendere una mossa, luoghi di ingegneria per creare oggetti, ad esempio veicoli o armi, soldi nel gioco per comprare da eventuali venditori. Ogni oggetto avra un prezzo (valutabile circa in euro per semplicità). Variabile float per fame, sete, sonno, caldo-freddo (parte da 0.5). Nella mappa ci deve essere per ogni punto la temperatura. Possibilità di vomito, dissenteria, problemi cardiaci, respiratori, muscolari. Armi: balestra, mani nude, sasso, tirapugni, torcia accesa. Armature: intralciano o favoriscono agilità, attacco, poteri magici, rumorosa (elusione), è uno strumento/oggetto. Attacchi possono essere prolungati per turni, mosse variabile boolean prolungabile: può aumentare o diminuire intensità, c’è un max espresso in turni di prolungabilita, inoltre può essere leggermente alterato con una variabile casuale. Equipaggiamento (strumento/oggetto): pietra focaia, attrezzi da scalata, boccale di birra, cavallo, moto, chiodi, martello da fabbro, corda, corazza, dardo, faretra/zaino/sacca (oggetti che contengono una lista di oggetti, stringhe) con un numero per la quantità) e capacità massima zaino e ogni oggetto può avere un valore intero per dimensione (es martello 3, ascia grande 7), mantello, olio, variabile boolean prende fuoco/conduce elettricità, amplifica magnetismo, aumenta esplosioni nucleari, aumenta forza di gravità (?), pala, piccone, rampino, specchio, per osservare quando si è nascosti e si ha malus su visibilità. Strumenti da scasso per aprire porte: variabile boolean per oggetti: entrata con scasso. Personaggio: string razza per swag, immunità a veleni e malattie, elusione, agilità, precisione, abilità magiche(?), difesa fisica. In ultima torcia: agilità, coraggio, forza, intelligenza, magia, manualità, percezione, socialità. Bestiario: aracnoide di varie dimensioni, talpe giganti, vermi giganti di terra di mare e di lava ect, bulbo trascinatore che ha tentacoli per tirare a se e mangiare, lui è immobile, calabrone gigante, serpenti giganti, cinghiali, draghi, elfi, goblin e re goblin, sciamani (goblin), totem di guerra come strumento/oggetti per alterare statistiche nella loro area di influenza, lupo, mastino bruciante, nani, non morti/zombie/mummia/scheletro variabile boolean vivo a false ma ha ancora hp su parti del corpo: variabile boolean “zombizabile”. Orchi, pesci da terra (anfibi) tritone dell abisso, troll e trollin (orchi più deformi), umani. Abilità dei personaggi in ultima torcia: artificiale (robot) immunità a soffocamento, veleni, malattie ect immune a manipolazioni psichiche, visione oscurità; danno da attacco in carica; fiammegiante ossia la creatura può incendiarsi e elettrizzante ossia può diventare elettrica caricamente; modalità furia/mailmen ossia ottiene bonus su alcune/tutte le statistiche; gigantesco o molto piccolo due boolean (?forse non serve); immunità a magie mentali, al fuoco; linguaggi (?); non morto; danno da attacco in presa; pungiglioni velenosi; sa muoversi su ragnatele o è rallentato, resistenza a perforazione, respirare sott’acqua o sotto lava o nei liquidi in genere; rigenerazione; riceve danni dalla luce solare o da assenza di luce; è terrorizzato/impaurito/intimidito o se è imperturbabile boolean. Danno da trascinamento; paralizzante; può diventare più veloce (?non serve); visione a infrarossi attraverso oggetti; volare o andare sotto terra. Imperium editor, cose che penso di non aver ancora scritto: stagioni, suolo erboso o terriccio, sabbia con erba e terra e da sola, strade e stagioni, altitudine, alberi e arbusti, vari tipi a foglia larga, conifere, alberi secchi, palme, arbusti verdi e secchi, cactus, alghe marine, rocce e pietre, scheletri per terra, legna tagliata (alberi tagliati), carri e carretti, grotte e rovine per accessi sotterranei, locande, templi, accampamenti, fortini, monoliti, fontana, tombe e cimiteri, borse per terra, pozzo, troni, croci(del teschio), pozzo, capanne, lapidi, ponti, recinzioni, falò, tende, torri, panoplia, fessure come abissi, statue, rovine (deserto) come case distrutte, colonne per costruire templi, piramidi, sfingi, bandiere, rovine in Europa, campi coltivati che contengono cibo, fiamma (in altre), roccia in altre per montagne, altre-&amp;gt;rovine per monumenti non egiziani ma europei.&lt;br /&gt;
Ci sono paludi. Tende da campo. Forti, porti. Edifici delle fortezze, edifici dei villaggi. Naufragi e scogli.&lt;br /&gt;
Parametri voglia/impegno float per descrivere voglia di combattere Personaggio. Ricevi danno uscendo dalla mappa tra 1-5% tra 6-10% tra 11-15% della vita totale di ogni parte del corpo per ogni turno di gioco. Danno da precipitazione diverso da carica, uno verticale uno orizzontale, se precipiti da molto in alto hai bonus, oltre che danni da schianto lol. Baionette, formazione a blocchi, a quadrato (difensiva) sparano su quattro lati, a schiera vanno avanti. Usano un colpo poi lunga ricarica. Variabile boolean per attivare o meno fuoco amico. Azione per cambiare posizione: in piedi, in ginocchio(inteso come via di mezzo), sdraiato: per permettere migliore visibilità a chi è dietro (nella formazione).&lt;br /&gt;
Altruismo, coraggio, spingere oltre il limite, difendere al posto di un altro, migliorare posizione per avere bonus. Mosse da usare in condizioni psicologiche idonee: mosse estreme per disperazione, bonus unici. Condizioni per situazioni: blocco, spalle al muro, stritolato, confuso, semi parassiti addosso, azzoppato, bagnato d’acqua, lame affilate, corazza indurita, tante copie di me stesso attive, preveggente. Per ambiente:pioggia (torrenziale), barriera a cupola, punte metalliche a terra, blocco di fumo nero. Far volare un avversario/alleato. Tutti possono fare tutto sotto effetti magici o fisici. Un cavallo può volare se viene preso da un uccello e portato in alto.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 3, 4:'''&lt;br /&gt;
&lt;br /&gt;
Gioco1,2,3,4: tutto caricato su wikis.&lt;br /&gt;
&lt;br /&gt;
Gioco3: Mosse con caricamento + spostamento (es. kameamea con teletrasporto). Ciclo di interazione principale:crea o combatti. Modalità campagna, che chiede in input da che battaglia iniziare, ma implica tipi battaglie prefissati. Alla morte/sconfitta di un personaggio si possono alterare statistiche (es personaggio può cambiare fazione). Alcune mosse possono lasciare oggetti sul terreno: (ad es, radici di Groth). Ogni oggetto può alterare le statistiche al passaggio sopra, nelle vicinanze. Boolean invisibile per personaggio, diverso da elusione infinita. Se personaggio va in un altro dimensione -&amp;gt; unreachable. Attacco coordinato, se non lo fanno tutti vale lo stesso ma depotenziato opportunamente . Personaggio in modalità maniac (2 mosse per turno) e in modalità depressive (1 mossa ogni due turni); personaggio Flash può fare 10 mosse in un turno. Chiudi con lucchetto oggetto da dentro o da fuori, oggetto ingresso in oggetto casa , più ingressi per un singolo oggetto.nicole aniston. Rimbalzo se ci si schianta contro oggetto da calcolare con parametro. Ryuk e Darkrai.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gioco 4 23/07/2019:&lt;br /&gt;
Pula fiction, aracnidi, oggetto: due superfici rettangolari di forma diversa, anche inclinate , collegate. Più pezzi collegati tra loro per forme cilindriche cave, ad esempio, tipo vulcano. Mappa con sprite personaggi, canvas: anche mouseClick? Statistiche con nome gerarchico, es pokemon_attacco. Modalità survival, stile isola di jurassic park gdr; sia in coop che contro; possibilità di fare N turni di fila se non ci sono altri player giocanti nelle vicinanze (ciò però comporterebbe , in modalità contro , di capire quando c’è qualcuno nelle vicinanze perché si andrebbe di 1 turno alla volta, soluzioni: in mod contro 1 turno per volta oppure meccanismo di sincronizzazione turni quando uno vede l’altro (anche furtivo) come c’è attacco 1 turno a testa) .. analogo a Battle royale(?); inizio con starter kit random. Modalità assedio al castello. Inoltre se posso fare N turni di fila si può pensare a più pc , uno per persona , coordinati per fare comandi in parallelo, ma va ben congegnato meccanismo di sincronizzazione. Parti DelCorpo -&amp;gt; Componente/i oppure Parte. La mappa deve essere (x,y); l’altezza viene indicata onMouseOver certi pixel dove è posto il Personaggio; se personaggio dentro edificio/grotta cambio img (es sfocato/tratteggiato). Mosse: astrarre per target; molte mosse sono simili tra loro, somiglianza va sfruttata, hanno magari dei target in comune, o variano solo per un parametro. Creare mappa anche con drag and drop immagini ?(un po’ difficile). Più layout per interfaccia grafica (esempio uno che mostra errori input su text area, uno con alert, uno su box text area separato). Input comandi consumato pezzo per pezzo, alcune parole se prevedono parametri quando riconosciute fanno fetch anche di parola (numero) successiva. Face toon foto? Import parziali di personaggi (tutto tranne/solo questi campi specificati). Texture mappa complete o ripetibili (es per suolo). Anteprima battaglia stile battaglia pokemon (magari per 1/2/3 vs 1/2/3) per rappresentare scontro. Conviene usare xslx (excel) per dati, considerare che può non servire la libreria Java per leggere stringhe per operazioni. Mossa “again” , ripeti la precedenza(opportuna modifica parametri, es mossa spostamento). Possibile gestione contromosse: si usano marker (tag): ogni mossa ha elenco tag del tipo di contromosse che può subire (con probabilità annessa, che può dipendere da pg che subisce mossa congiuntamente a mossa stessa). Ogni mossa inoltre deve essere taggata come possibile contromossa che il pg può usare (per schivare può fare in più modi). A seconda del lancio del dado il pg che effettua La contromossa può anche scegliere tipologia di contromossa o solo la mossa della tipologia che ha beccato (entrano in gioco riflessi ect.). I parametri che fanno attivare unq o un’altra contromossa sono dinamici, posso dipendere ad esempio dalla posizione tra i due pg o altre statistiche. Tag contromosse a fasce (es. coprirsi è sempre più facile che schivare che e più facile di schivare e contrattaccare (?); all’interno dello stesso schivare e contrattaccare ci sono più sotto categorie). Per aggiunta personaggio può essere utili interfaccia dedicata, non linea di comando (o altre operazioni, specie se ci sono tabelle). Mossa “premonizione”: predire il futuro a breve termine, dici che mossa vorresti fare e ti dice esito (o più esiti se uno chiede più mosse). Funziona solo sulla prossima mossa. Contromossa delle contromossa gestione?? Eventualmente nell’esito si prevede ancore contro-contromossa. Ma si innesca reazione a catena, inoltre da gestire scelta contromossa in questo caso. Applicazione tag conoscenza(universo di appartenenza): “Termoli”, “pokemon”, “liceo classico Termoli”, anche gerarchici, per filtrare sui personaggi.target componibili , fattorizzato creazione mosse, hanno un costo magari per indicare quantovoccupano dicuna mossa, relativo maybe a un parametro o più del target stesso. In particolare, non saranno salvate le mosse per un personaggio (o solo alcune “preferite”) ma il suo insieme di target i quali devono dire:statistica che influenzano, “costo del turno” che richiedono al variare dell’intensità del target (che aumenta linearmente, esponenzialmente, generica f(x)) quindi corsa blanda costo 1 , Max corsa costo 5 (max), elenco (string) target incompatibili con tale target (se serve), nota relative ad es per quando uno vuole creare una mossa durante la battaglia (“target corsa, max sforzo dedicabile 4 ect” metti “50 metri corsa” “ok/troppo! Vuoi sforzati di più rischiando effetti collaterali?”). Si può autoscrivere la voce narrante del gioco come “la tua coscienza” mentre che giochi, d’altronde si interagisce con essa. Considerare che un target può appartenere a più personaggi, magari sotto nomi di mosse diversi.&lt;br /&gt;
Definire gerarchia di personaggi per template (tipo classe e super classe) e template importabili (tipo usa fuoco). Es umanoide non umanoide, tra umanoide maschio- femmina etc. Classe che estende System.out per creare funzioni che aggiungono Header “DEBUG:” etc; due programmi Java , due main: uno delegato a calcoli + gestione Excel; altro legge stdout dell altro per interfaccia grafica. Per allenare PG creare dei PG fantocci con label per fare Q-learning iniziale, più avanti far allenare pg tra loro; creare vari fantocci: tank terrestre fisico, healer volante etc. Excel: si usa css che si può rendere tabellare, più facile da trattare nel codice rispetto a .xslx. Ogni “utente” ed Lostefra ha il suo personale dizionario con sue personali short cut da usare in partita, eventuale login con password (opzionale) x accesso. Vedere license show down. Mappa unica stile giochi di ruolo, si vede tutto da sopra: click o simili su edifici/caverne per mappe interne a tale posto, così ok sprite e per rappresentare “pg in volo” sprite dedicato. Densità aria per dire quando anche un uomo per es può volare. Ipotesi più efficiente per dare un valore stima al pg: AI base che gioca a manetta contro altre AI base e dalle vittorie si fa l’euristica, più vittoria facile/veloce/stracciante più punti, contro vari pg, contro pg standard bench mark.&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Note&amp;diff=190</id>
		<title>Note</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Note&amp;diff=190"/>
		<updated>2020-04-30T13:32:49Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: /* Deploy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Note ==&lt;br /&gt;
&lt;br /&gt;
'''Vedere altre note su fogli di carta e promemoria del telefono. Ce ne sono molte.'''&lt;br /&gt;
'''La copiatura dai fogli di carta dei continuare da pagina 4 (&amp;quot;alterare param..&amp;quot;).'''&lt;br /&gt;
&lt;br /&gt;
===Inspirational Concepts===&lt;br /&gt;
* Gioco Lotta (Pokémon, Pokkén)&lt;br /&gt;
* no caselle esplicite&lt;br /&gt;
* Descrizione rispetto a: ambiente, nemico, oggetti&lt;br /&gt;
* pokémon, DnD, Call of Duty, Super Smash Brawl, corse pazze&lt;br /&gt;
* concentrarsi su: fluidi, telecinesi, razze, bonus/malus, gradi di libertà (fisicamente parlando) &lt;br /&gt;
* scacchi (es. crea casella), shaolin showdown&lt;br /&gt;
* prevedere = creatività&lt;br /&gt;
* acqua, aria, fuoco, terra&lt;br /&gt;
* gravità (newton), verso alto, basso, destra, sinistra, circolare, tutti i versi&lt;br /&gt;
* jumanji, savana, animali, zoologia&lt;br /&gt;
* tempo/spazio&lt;br /&gt;
* BF4, pirati, roma (imperium civitas)&lt;br /&gt;
* musica come arma (rap)&lt;br /&gt;
* magia, prestigiatori&lt;br /&gt;
* dinosauri (documentario, libro, zoologia)&lt;br /&gt;
* avengers, supereroi (libro)&lt;br /&gt;
&lt;br /&gt;
* Looney toons&lt;br /&gt;
&lt;br /&gt;
===Personaggi (con statistiche e stati)===&lt;br /&gt;
* combattenti (con statistiche e stati)&lt;br /&gt;
* immagine rappresentativa per rappresentare meglio&lt;br /&gt;
* HP: colore rosso su immagine personaggio, dove sei debole/già colpito (idea scartata)&lt;br /&gt;
* penitenza: il malus può essere inteso come ciò che c'è nell'inserimento successivo, malus cumulativo&lt;br /&gt;
* essere ipocrita, finzione (schermo)&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (personaggi)&lt;br /&gt;
* metamorfosi&lt;br /&gt;
* alchimisti&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* possibilità giù in terra/ giù in acqua, con reachable e unreachable Boolean. Fuori da mappa anche reachable e unreachable.&lt;br /&gt;
* Personaggi composti di parti[] es. testa, busto, gambe, braccia, coda, pinna, ali. Distinzione per arto di movimento e/o spostamento boolean.&lt;br /&gt;
* Arti possono provocare danno, bruciatura , paralisi a contatto (Boolean) . Percentuale di probabilità accompagna ogni Boolean.&lt;br /&gt;
* Ogni parte del corpo punti vita + se inutilizzabile + amputata + stato (es paralisi).&lt;br /&gt;
* Per fare battaglie tra molto grandi =&amp;gt; 1 m lo si intende come 10m.  (rivalutato, aumentare livello scaling)&lt;br /&gt;
* Personaggio fusionabile Boolean + string nomi con cui si fonde.&lt;br /&gt;
* Distinzione tra infernape e infernape1/2/3 ect tra “specie” e “nome”.&lt;br /&gt;
* variabile Boolean respawnable.&lt;br /&gt;
* Raccogliere a piene mani da: https://spore.fandom.com/wiki/Creature_Editor&lt;br /&gt;
* Ad esempio weapons come elemento di Corpo (zanne, corna) e possibilità di muoversi/attaccare furtivamente.&lt;br /&gt;
* Divisibile e unibile come boolean e array di stringe associate per indicare i nomi con cui si unisce il Personaggio o in cui si divide.&lt;br /&gt;
* Variabili posizione nome: from_x/y ; to_x/y.&lt;br /&gt;
* Classe Stato, Personaggio contiene Array di stato, stato contiene moltiplicatori per statistica es attacco velocità precisione elusione ect.&lt;br /&gt;
* Personaggio deve avere una stat tipo sanità mentale, intelligenza, quanto è confuso e quanto è impaurito (2).&lt;br /&gt;
&lt;br /&gt;
* Per personaggi molto piccoli (meno di 1m x 1m x 1m) possibilità di essere in (x,y,z) tra 0 e 1.000.000 (ordine del micrometro, 1*10^-6 == 0,000001) e avere (lenX, lenY, lenZ). In questo modo sono definite dimensioni inferiori ad 1 m^3.&lt;br /&gt;
* personaggi max 20x20 (rivaluato, meno limitata)&lt;br /&gt;
&lt;br /&gt;
===Mosse===&lt;br /&gt;
* &amp;quot;combattimento prescinde da combattente&amp;quot;&lt;br /&gt;
* mosse hanno: direzione, azione, attacco (mosse pokémon)&lt;br /&gt;
* Parametri interi per mossa (direzione, consumabili) con lower e upper bound&lt;br /&gt;
* camuffarsi =&amp;gt; DnD manuale&lt;br /&gt;
* wrestling (libro) per le mosse/prese&lt;br /&gt;
&lt;br /&gt;
* X fa una mossa contro Y: Z potrebbe reagire (Es. ricevendo il colpo al posto di Y). Può essere realizzato sia come se &amp;quot;Y chiede soccorso Z&amp;quot; o come reazione di alleati adiacenti &amp;quot;Z soccorre Y&amp;quot;&lt;br /&gt;
* Mossa prende come parametro di ingresso Corpo, ossia la parte del corpo coinvolta nella mossa (es arto , tutto corpo ect). &lt;br /&gt;
&lt;br /&gt;
===Oggetto (con statistiche e stati)===&lt;br /&gt;
* armi: lacci (stati), lame (potenze), sassi, reti, pistole (munizioni), razzi, bombe (potenze), fuoco (d'artificio?) =&amp;gt; manuale DnD&lt;br /&gt;
* veleno n modi =&amp;gt; DnD manuale&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (oggetti)&lt;br /&gt;
* automezzi con cannoni, variabile 'hasEntrata', 'tempoRiutilizzo'&lt;br /&gt;
* violino come arma (tutti strumenti musicali): a fiato, a corda, a percussione&lt;br /&gt;
* veleni, ampolle e flaconi magici, insieme di 'oggetti dentro' un oggetto&lt;br /&gt;
&lt;br /&gt;
* Classe oggetto: es albero, roccia, casa: forza necessaria per sradicare + forza per lanciare + destrezza / agilità per appendersi + nascondersi in proporzione alle dimensioni di chi si nasconde. &lt;br /&gt;
* Altri es. pali. Sotto terra o sotto acqua/lava/melma o simili. &lt;br /&gt;
* Acqua rallenta se non hai pinne boolean.&lt;br /&gt;
* Classe strumento per oggetti che si tengono in mano, es reti , pistole, spade, pugnali, scudi, elmi, lancia, arco , frecce, lanciarazzi, fucili cecchino, fucile assalto, corde.&lt;br /&gt;
* Strumenti e mosse: danno ad area, perforante, contundente (vedi dnd armi). Mosse possono creare/modificare/distruggere oggetti e strumenti.&lt;br /&gt;
* Oggetti del campo di gioco incidono su elusione (parametro di personaggio).&lt;br /&gt;
* Buco/abisso (boolean) per dire se c’è o meno il suolo (Suolo come classe?). &lt;br /&gt;
* Radiazioni. &lt;br /&gt;
&lt;br /&gt;
===Modalità gioco===&lt;br /&gt;
* turnazione&lt;br /&gt;
* 1 v 1 v 1 etc., ma anche squadre casuali&lt;br /&gt;
* punteggio: chi fa più punti, più uccisioni, definizione di 'punto', gioco per perdere&lt;br /&gt;
* inserisci personaggio total random&lt;br /&gt;
&lt;br /&gt;
* Modalità battaglia con interazione stile battaglia navale (non si vede mossa dell'avversario)&lt;br /&gt;
* Modalità di gioco: tutti contro tutti (battle royale), death match, vs CPU mode zombie(attaccano solo, se non possono vanno verso nemico): serve introdurre un punteggio, di sicuro per mode zombie , ma anche per death match e tutti contro tutti&lt;br /&gt;
* ingressi: ne entra un altro?&lt;br /&gt;
&lt;br /&gt;
===Mappa===&lt;br /&gt;
* arene&lt;br /&gt;
* minimappa (pixelata ?), legenda oggetti base, devono esserci caselle implicite&lt;br /&gt;
* mappa 100x100 (rivalutato, meno limitata)&lt;br /&gt;
* Cannoni fissi in mezzo al campo (strumento).&lt;br /&gt;
&lt;br /&gt;
===Funzionalità generali===&lt;br /&gt;
* Chiave: non una flat input box per i comandi; ma dinamica: si suppone il soggetto &amp;quot;io&amp;quot; (le azioni le fanno in prima persona i personaggi), ogni mossa deve prevedere dei complementi (&amp;quot;verso&amp;quot;, &amp;quot;tra quanto&amp;quot;, &amp;quot;cosa&amp;quot;, &amp;quot;a favore di chi&amp;quot;, &amp;quot;contro chi&amp;quot;). Ogni complemento collegato con box stile in pop up =&amp;gt; bootstrap (la grafica sara unica). Prevedere anche modalita flat con input del tipo &amp;quot;azione a=pippo verso=termoli&amp;quot; (regex check)&lt;br /&gt;
* &amp;quot;meno tabelle&amp;quot;, &amp;quot;no bottoni&amp;quot; e solo foto che si alternano, &amp;quot;la grafica serve&amp;quot;: text box unica interazione, text area (history), immagine personaggio e immagine mappa&lt;br /&gt;
* &amp;quot;persistenza anche da interfaccia grafica&amp;quot;, diritti di scrittura sui file?&lt;br /&gt;
* Segnalazione (comando per fare nota)&lt;br /&gt;
&lt;br /&gt;
===Deploy===&lt;br /&gt;
* &amp;quot;commenta il codice&amp;quot;, &amp;quot;dividi et impera&amp;quot;&lt;br /&gt;
* JAVA: Class.forName(&amp;lt;name&amp;gt;.class).newInstance();&lt;br /&gt;
* Server web (Apache Tomcat) ospita partite (+ localmente ha i file di funzionamento), in LAN client giocano. Interfaccia HTML5 + Javascript per giocare. Scalabile per futuro, basta offrire servizio su un ip pubblico. Studiare engine grafici Javascript&lt;br /&gt;
* bootstrap! (specie per input box)&lt;br /&gt;
* rpgmaker, godot, aseprite, pixelart (in generale), ma anche phaser, piskel&lt;br /&gt;
* joomla! Per far prima con html&lt;br /&gt;
* libreria pygame&lt;br /&gt;
&lt;br /&gt;
===Copia&amp;amp;incolla generale, da smistare in sotto capitoli. Contiene anche '''tutte''' note del telefono (al 22/02/2020)===&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 1:'''&lt;br /&gt;
&lt;br /&gt;
Mosse che trasformano l’avversario: attenzione è una mossa devastante. Trasformazione totale o parziale. Si devono poter aggiungere mosse, strumenti dinamicamente. Battle bot:ribaltano, scintille, elementi (Oggetti) che danneggiano. One piece: I frutti del diavolo (悪魔の実 Akuma no mi?) sono frutti misteriosi che donano poteri soprannaturali a chi li mangia, rendendoli però incapaci di nuotare. Di conseguenza il contatto con l'acqua di mare o con una speciale sostanza conosciuta come agalmatolite indebolisce gli utilizzatori di frutti del diavolo e li priva dei loro poteri. Alcune persone sono inoltre in grado di ricorrere all'Ambizione (覇気 Haki?), una forza spirituale che permette di avvertire la presenza di altri esseri viventi e di predirne i movimenti, di irrobustire parti del corpo e di intimidire o fare svenire le creature con una debole forza di volontà. Personaggio ha funzione baricentro_x, baricentro_y calcolate come (from_x+to_x)/2 sul quale si basa la funzione di libreria getDistance(Personaggio A, Personaggio B, float success); tale funzione serve per calcolare per i PNG e per i PG se ha senso usare una mossa. Non-onniscienza: delle volte non si può sapere distanza avversario e fallisce la mossa per la distanza -&amp;gt; “float success” rappresenta la probabilità di successo (Personaggio ha parametro “osservare”). PNG di due categorie: offensivi o neutrali (no priorità a mosse di attacco, ma tutto casuale). Mosse e oggetti per chiamare Personaggi, magari non necessariamente alleati (2 mosse e 2 oggetti quindi necessari), richiamo di un personaggio preciso o di uno a caso. Ogni mossa/azione deve avere un tempo di attesa espresso in turni (alla meglio 0) per poter ripetere la mossa/azione. Strumenti anche mezzi di trasporto di aria, di terra, di acqua (o lava/palude). Possono attivare una metamorfosi / Unione per cambiare stats personaggio. Veicoli con armi o riparo. Gli strumenti da trattare come gli oggetti. Classe unica? I match/partite (immagino Classe Partita) devono avere variabile boolean “respawn”, per distinguere death match a punti con death match con una vita. Wrestling per ispirarsi nella lotta libera: calci pugni ginocchiate prese lanci salti testate gomitate ecc. Per punti si vince a un limite o dopo un tot di mosse , oppure al primo dei due raggiunti (max_punti e max_mosse parametri di Partita). I punti si guadagnano alla kill (un Punteggio per squadra, int punteggio salvato localmente dentro ogni Personaggio che ha la variabile int squadra). Si guadagnano tanti punti quanti sono i punti della variabile “valore” del personaggio ucciso, tale variabile è calcolata come somma dei valori di tutte le mosse/stats ect del Personaggio. Imperium civitas. Attacco dei giganti. Possibilità di morire se colpiti in un unico punto (tallone d Achille) implementabile come variabile boolean. Jump force. Game dev tycoon. Acqua diventa tsunami. Variabile int per attacco cumulativo di gruppo: es calciatori che più si passano la palla più l’attacco è forte. Suolo magico: non tutti i personaggi possono accedervi, array di string elenca i nomi di chi può accedervi. Funzione esci/entra in classe Personaggio per simulare scambio pokemon 6vs6. Piovra gigante. Rischio=danno*probabilita. Mossa su strumento e con strumento?&lt;br /&gt;
Mosse fisiche per arrampicarsi su avversario(se e solo se sei la metà di dimensioni(?)), atterrarlo, lanciarlo, accecarlo, immobilizzarlo. Se sei in gruppo/ orda bonus ad attacchi combinati. Armi: fruste e scheggie, corni che si suonano per chiamare altri. Tipo della mossa con moltiplicatore tra 0 (immune) e 2 (float): acqua, fuoco, magia, terra: da ispirarsi ai pokemon ma non da copiare, penso. Armi da campo: cannoni e catapulte. Veicoli d’acqua: moto acqua, canoe, barche a motore a remi. Nei veicoli malus su attenzione (variabile int in personaggio, indica attenzione in combattimento e non in altro) perché si è impegnato alla guida . All’inizio in image view “the hero” e “the map”. Condizione vittoria (oltre a morte, punti, o numero mosse, cioè tempo) morte di un singolo Personaggio, che potrebbe rappresentare un edificio, cassaforte o simili. Personaggio si può svestire e lasciare strumenti, modificano statistiche di attacco, difesa , agilità, ect. Variabile luce o non luce, che peggiora/migliora a seconda della specie la visibilità, quindi la precisione , specie in attacchi a distanza: Scurovisione evita i malus.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 2:'''&lt;br /&gt;
&lt;br /&gt;
Gioco2: se ci si lancia da oggetti , dopo essersi arrampicati, possono esserci danni da caduta; strumenti come paracaduti o mosse magiche possono evitare i danni. Pozione del vento, soffi e devi attacchi. In difesa puoi parare, schivare, deviare: tre variabili? Ambiente: colline e pianure uguali, Monti sono Oggetti, picco ossia un unico monte oggetto. Rocce volanti, nuvole sospese: oggetto può essere sospeso e può fare periodicamente una mossa, ad es tuono, può spostarsi, può fare entra/esci, oggetto albero e oggetto foresta, si possono prendere, nascondersi, arrampicarsi, lanciarli, ostacolano velocità ma se si ha abbastanza forza si spezzano alberi. Acqua poco profonda, profonda, molto profonda: variabile boolean in Personaggio “alto” per toccare in acqua profonda, con acqua si generano fiumi laghi e mari. Ambiente si deve poter evolvere: ad esempio oggetto diga può fare metamorfosi e diventare oggetto cascata/torrente in piena. Per edifici più oggetti che rappresentano le mura e il tetto, variabile boolean per oggetto per entrare nell’oggetto. Possono essere spazzati via: danni da crollo, si può combattere all interni, contengono strumenti come tavoli sedie mobili letto ect. Se uno viene schiantato contro uno strumento prende danno(es danno da schianto). Ci possono essere scale, si può non avere contatti visivo sull’avversario. Oggetto mura, oggetto torre, oggetto casa interno sono cose distinte: possono dare malus/bonus su visibilità. Ambiente: pozzi e grotte, da gestire come interno casa. Lava come acqua, ogni oggetto può essere sorgenti di liquido: monte sorgente acqua, vulcano sorgente lava. Può esserci variabile probabilità eruzione, se settata a 1 c’è una continua eruzione. Strade di vario tipo, sovrapposta a altri suoli, migliorano velocità di alcuni strumenti, variabile boolean “ha le ruote” in classe strumenti. Unificare classe strumento e classe oggetto. Oggetti sospesi: case sospese su albero, ad es. Fiamme in mezzo al suolo. Oggetti: porto, aereoporto, grattacieli, dighe, impianti a fune, ospedali per curarsi e prendere oggetti per curarsi dopo, scuole contenenti libri per apprendere una mossa, luoghi di ingegneria per creare oggetti, ad esempio veicoli o armi, soldi nel gioco per comprare da eventuali venditori. Ogni oggetto avra un prezzo (valutabile circa in euro per semplicità). Variabile float per fame, sete, sonno, caldo-freddo (parte da 0.5). Nella mappa ci deve essere per ogni punto la temperatura. Possibilità di vomito, dissenteria, problemi cardiaci, respiratori, muscolari. Armi: balestra, mani nude, sasso, tirapugni, torcia accesa. Armature: intralciano o favoriscono agilità, attacco, poteri magici, rumorosa (elusione), è uno strumento/oggetto. Attacchi possono essere prolungati per turni, mosse variabile boolean prolungabile: può aumentare o diminuire intensità, c’è un max espresso in turni di prolungabilita, inoltre può essere leggermente alterato con una variabile casuale. Equipaggiamento (strumento/oggetto): pietra focaia, attrezzi da scalata, boccale di birra, cavallo, moto, chiodi, martello da fabbro, corda, corazza, dardo, faretra/zaino/sacca (oggetti che contengono una lista di oggetti, stringhe) con un numero per la quantità) e capacità massima zaino e ogni oggetto può avere un valore intero per dimensione (es martello 3, ascia grande 7), mantello, olio, variabile boolean prende fuoco/conduce elettricità, amplifica magnetismo, aumenta esplosioni nucleari, aumenta forza di gravità (?), pala, piccone, rampino, specchio, per osservare quando si è nascosti e si ha malus su visibilità. Strumenti da scasso per aprire porte: variabile boolean per oggetti: entrata con scasso. Personaggio: string razza per swag, immunità a veleni e malattie, elusione, agilità, precisione, abilità magiche(?), difesa fisica. In ultima torcia: agilità, coraggio, forza, intelligenza, magia, manualità, percezione, socialità. Bestiario: aracnoide di varie dimensioni, talpe giganti, vermi giganti di terra di mare e di lava ect, bulbo trascinatore che ha tentacoli per tirare a se e mangiare, lui è immobile, calabrone gigante, serpenti giganti, cinghiali, draghi, elfi, goblin e re goblin, sciamani (goblin), totem di guerra come strumento/oggetti per alterare statistiche nella loro area di influenza, lupo, mastino bruciante, nani, non morti/zombie/mummia/scheletro variabile boolean vivo a false ma ha ancora hp su parti del corpo: variabile boolean “zombizabile”. Orchi, pesci da terra (anfibi) tritone dell abisso, troll e trollin (orchi più deformi), umani. Abilità dei personaggi in ultima torcia: artificiale (robot) immunità a soffocamento, veleni, malattie ect immune a manipolazioni psichiche, visione oscurità; danno da attacco in carica; fiammegiante ossia la creatura può incendiarsi e elettrizzante ossia può diventare elettrica caricamente; modalità furia/mailmen ossia ottiene bonus su alcune/tutte le statistiche; gigantesco o molto piccolo due boolean (?forse non serve); immunità a magie mentali, al fuoco; linguaggi (?); non morto; danno da attacco in presa; pungiglioni velenosi; sa muoversi su ragnatele o è rallentato, resistenza a perforazione, respirare sott’acqua o sotto lava o nei liquidi in genere; rigenerazione; riceve danni dalla luce solare o da assenza di luce; è terrorizzato/impaurito/intimidito o se è imperturbabile boolean. Danno da trascinamento; paralizzante; può diventare più veloce (?non serve); visione a infrarossi attraverso oggetti; volare o andare sotto terra. Imperium editor, cose che penso di non aver ancora scritto: stagioni, suolo erboso o terriccio, sabbia con erba e terra e da sola, strade e stagioni, altitudine, alberi e arbusti, vari tipi a foglia larga, conifere, alberi secchi, palme, arbusti verdi e secchi, cactus, alghe marine, rocce e pietre, scheletri per terra, legna tagliata (alberi tagliati), carri e carretti, grotte e rovine per accessi sotterranei, locande, templi, accampamenti, fortini, monoliti, fontana, tombe e cimiteri, borse per terra, pozzo, troni, croci(del teschio), pozzo, capanne, lapidi, ponti, recinzioni, falò, tende, torri, panoplia, fessure come abissi, statue, rovine (deserto) come case distrutte, colonne per costruire templi, piramidi, sfingi, bandiere, rovine in Europa, campi coltivati che contengono cibo, fiamma (in altre), roccia in altre per montagne, altre-&amp;gt;rovine per monumenti non egiziani ma europei.&lt;br /&gt;
Ci sono paludi. Tende da campo. Forti, porti. Edifici delle fortezze, edifici dei villaggi. Naufragi e scogli.&lt;br /&gt;
Parametri voglia/impegno float per descrivere voglia di combattere Personaggio. Ricevi danno uscendo dalla mappa tra 1-5% tra 6-10% tra 11-15% della vita totale di ogni parte del corpo per ogni turno di gioco. Danno da precipitazione diverso da carica, uno verticale uno orizzontale, se precipiti da molto in alto hai bonus, oltre che danni da schianto lol. Baionette, formazione a blocchi, a quadrato (difensiva) sparano su quattro lati, a schiera vanno avanti. Usano un colpo poi lunga ricarica. Variabile boolean per attivare o meno fuoco amico. Azione per cambiare posizione: in piedi, in ginocchio(inteso come via di mezzo), sdraiato: per permettere migliore visibilità a chi è dietro (nella formazione).&lt;br /&gt;
Altruismo, coraggio, spingere oltre il limite, difendere al posto di un altro, migliorare posizione per avere bonus. Mosse da usare in condizioni psicologiche idonee: mosse estreme per disperazione, bonus unici. Condizioni per situazioni: blocco, spalle al muro, stritolato, confuso, semi parassiti addosso, azzoppato, bagnato d’acqua, lame affilate, corazza indurita, tante copie di me stesso attive, preveggente. Per ambiente:pioggia (torrenziale), barriera a cupola, punte metalliche a terra, blocco di fumo nero. Far volare un avversario/alleato. Tutti possono fare tutto sotto effetti magici o fisici. Un cavallo può volare se viene preso da un uccello e portato in alto.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 3, 4:'''&lt;br /&gt;
&lt;br /&gt;
Gioco1,2,3,4: tutto caricato su wikis.&lt;br /&gt;
&lt;br /&gt;
Gioco3: Mosse con caricamento + spostamento (es. kameamea con teletrasporto). Ciclo di interazione principale:crea o combatti. Modalità campagna, che chiede in input da che battaglia iniziare, ma implica tipi battaglie prefissati. Alla morte/sconfitta di un personaggio si possono alterare statistiche (es personaggio può cambiare fazione). Alcune mosse possono lasciare oggetti sul terreno: (ad es, radici di Groth). Ogni oggetto può alterare le statistiche al passaggio sopra, nelle vicinanze. Boolean invisibile per personaggio, diverso da elusione infinita. Se personaggio va in un altro dimensione -&amp;gt; unreachable. Attacco coordinato, se non lo fanno tutti vale lo stesso ma depotenziato opportunamente . Personaggio in modalità maniac (2 mosse per turno) e in modalità depressive (1 mossa ogni due turni); personaggio Flash può fare 10 mosse in un turno. Chiudi con lucchetto oggetto da dentro o da fuori, oggetto ingresso in oggetto casa , più ingressi per un singolo oggetto.nicole aniston. Rimbalzo se ci si schianta contro oggetto da calcolare con parametro. Ryuk e Darkrai.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gioco 4 23/07/2019:&lt;br /&gt;
Pula fiction, aracnidi, oggetto: due superfici rettangolari di forma diversa, anche inclinate , collegate. Più pezzi collegati tra loro per forme cilindriche cave, ad esempio, tipo vulcano. Mappa con sprite personaggi, canvas: anche mouseClick? Statistiche con nome gerarchico, es pokemon_attacco. Modalità survival, stile isola di jurassic park gdr; sia in coop che contro; possibilità di fare N turni di fila se non ci sono altri player giocanti nelle vicinanze (ciò però comporterebbe , in modalità contro , di capire quando c’è qualcuno nelle vicinanze perché si andrebbe di 1 turno alla volta, soluzioni: in mod contro 1 turno per volta oppure meccanismo di sincronizzazione turni quando uno vede l’altro (anche furtivo) come c’è attacco 1 turno a testa) .. analogo a Battle royale(?); inizio con starter kit random. Modalità assedio al castello. Inoltre se posso fare N turni di fila si può pensare a più pc , uno per persona , coordinati per fare comandi in parallelo, ma va ben congegnato meccanismo di sincronizzazione. Parti DelCorpo -&amp;gt; Componente/i oppure Parte. La mappa deve essere (x,y); l’altezza viene indicata onMouseOver certi pixel dove è posto il Personaggio; se personaggio dentro edificio/grotta cambio img (es sfocato/tratteggiato). Mosse: astrarre per target; molte mosse sono simili tra loro, somiglianza va sfruttata, hanno magari dei target in comune, o variano solo per un parametro. Creare mappa anche con drag and drop immagini ?(un po’ difficile). Più layout per interfaccia grafica (esempio uno che mostra errori input su text area, uno con alert, uno su box text area separato). Input comandi consumato pezzo per pezzo, alcune parole se prevedono parametri quando riconosciute fanno fetch anche di parola (numero) successiva. Face toon foto? Import parziali di personaggi (tutto tranne/solo questi campi specificati). Texture mappa complete o ripetibili (es per suolo). Anteprima battaglia stile battaglia pokemon (magari per 1/2/3 vs 1/2/3) per rappresentare scontro. Conviene usare xslx (excel) per dati, considerare che può non servire la libreria Java per leggere stringhe per operazioni. Mossa “again” , ripeti la precedenza(opportuna modifica parametri, es mossa spostamento). Possibile gestione contromosse: si usano marker (tag): ogni mossa ha elenco tag del tipo di contromosse che può subire (con probabilità annessa, che può dipendere da pg che subisce mossa congiuntamente a mossa stessa). Ogni mossa inoltre deve essere taggata come possibile contromossa che il pg può usare (per schivare può fare in più modi). A seconda del lancio del dado il pg che effettua La contromossa può anche scegliere tipologia di contromossa o solo la mossa della tipologia che ha beccato (entrano in gioco riflessi ect.). I parametri che fanno attivare unq o un’altra contromossa sono dinamici, posso dipendere ad esempio dalla posizione tra i due pg o altre statistiche. Tag contromosse a fasce (es. coprirsi è sempre più facile che schivare che e più facile di schivare e contrattaccare (?); all’interno dello stesso schivare e contrattaccare ci sono più sotto categorie). Per aggiunta personaggio può essere utili interfaccia dedicata, non linea di comando (o altre operazioni, specie se ci sono tabelle). Mossa “premonizione”: predire il futuro a breve termine, dici che mossa vorresti fare e ti dice esito (o più esiti se uno chiede più mosse). Funziona solo sulla prossima mossa. Contromossa delle contromossa gestione?? Eventualmente nell’esito si prevede ancore contro-contromossa. Ma si innesca reazione a catena, inoltre da gestire scelta contromossa in questo caso. Applicazione tag conoscenza(universo di appartenenza): “Termoli”, “pokemon”, “liceo classico Termoli”, anche gerarchici, per filtrare sui personaggi.target componibili , fattorizzato creazione mosse, hanno un costo magari per indicare quantovoccupano dicuna mossa, relativo maybe a un parametro o più del target stesso. In particolare, non saranno salvate le mosse per un personaggio (o solo alcune “preferite”) ma il suo insieme di target i quali devono dire:statistica che influenzano, “costo del turno” che richiedono al variare dell’intensità del target (che aumenta linearmente, esponenzialmente, generica f(x)) quindi corsa blanda costo 1 , Max corsa costo 5 (max), elenco (string) target incompatibili con tale target (se serve), nota relative ad es per quando uno vuole creare una mossa durante la battaglia (“target corsa, max sforzo dedicabile 4 ect” metti “50 metri corsa” “ok/troppo! Vuoi sforzati di più rischiando effetti collaterali?”). Si può autoscrivere la voce narrante del gioco come “la tua coscienza” mentre che giochi, d’altronde si interagisce con essa. Considerare che un target può appartenere a più personaggi, magari sotto nomi di mosse diversi.&lt;br /&gt;
Definire gerarchia di personaggi per template (tipo classe e super classe) e template importabili (tipo usa fuoco). Es umanoide non umanoide, tra umanoide maschio- femmina etc. Classe che estende System.out per creare funzioni che aggiungono Header “DEBUG:” etc; due programmi Java , due main: uno delegato a calcoli + gestione Excel; altro legge stdout dell altro per interfaccia grafica. Per allenare PG creare dei PG fantocci con label per fare Q-learning iniziale, più avanti far allenare pg tra loro; creare vari fantocci: tank terrestre fisico, healer volante etc. Excel: si usa css che si può rendere tabellare, più facile da trattare nel codice rispetto a .xslx. Ogni “utente” ed Lostefra ha il suo personale dizionario con sue personali short cut da usare in partita, eventuale login con password (opzionale) x accesso. Vedere license show down. Mappa unica stile giochi di ruolo, si vede tutto da sopra: click o simili su edifici/caverne per mappe interne a tale posto, così ok sprite e per rappresentare “pg in volo” sprite dedicato. Densità aria per dire quando anche un uomo per es può volare. Ipotesi più efficiente per dare un valore stima al pg: AI base che gioca a manetta contro altre AI base e dalle vittorie si fa l’euristica, più vittoria facile/veloce/stracciante più punti, contro vari pg, contro pg standard bench mark.&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Note&amp;diff=189</id>
		<title>Note</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Note&amp;diff=189"/>
		<updated>2020-04-30T13:25:59Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: /* Funzionalità generali */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Note ==&lt;br /&gt;
&lt;br /&gt;
'''Vedere altre note su fogli di carta e promemoria del telefono. Ce ne sono molte.'''&lt;br /&gt;
'''La copiatura dai fogli di carta dei continuare da pagina 4 (&amp;quot;alterare param..&amp;quot;).'''&lt;br /&gt;
&lt;br /&gt;
===Inspirational Concepts===&lt;br /&gt;
* Gioco Lotta (Pokémon, Pokkén)&lt;br /&gt;
* no caselle esplicite&lt;br /&gt;
* Descrizione rispetto a: ambiente, nemico, oggetti&lt;br /&gt;
* pokémon, DnD, Call of Duty, Super Smash Brawl, corse pazze&lt;br /&gt;
* concentrarsi su: fluidi, telecinesi, razze, bonus/malus, gradi di libertà (fisicamente parlando) &lt;br /&gt;
* scacchi (es. crea casella), shaolin showdown&lt;br /&gt;
* prevedere = creatività&lt;br /&gt;
* acqua, aria, fuoco, terra&lt;br /&gt;
* gravità (newton), verso alto, basso, destra, sinistra, circolare, tutti i versi&lt;br /&gt;
* jumanji, savana, animali, zoologia&lt;br /&gt;
* tempo/spazio&lt;br /&gt;
* BF4, pirati, roma (imperium civitas)&lt;br /&gt;
* musica come arma (rap)&lt;br /&gt;
* magia, prestigiatori&lt;br /&gt;
* dinosauri (documentario, libro, zoologia)&lt;br /&gt;
* avengers, supereroi (libro)&lt;br /&gt;
&lt;br /&gt;
* Looney toons&lt;br /&gt;
&lt;br /&gt;
===Personaggi (con statistiche e stati)===&lt;br /&gt;
* combattenti (con statistiche e stati)&lt;br /&gt;
* immagine rappresentativa per rappresentare meglio&lt;br /&gt;
* HP: colore rosso su immagine personaggio, dove sei debole/già colpito (idea scartata)&lt;br /&gt;
* penitenza: il malus può essere inteso come ciò che c'è nell'inserimento successivo, malus cumulativo&lt;br /&gt;
* essere ipocrita, finzione (schermo)&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (personaggi)&lt;br /&gt;
* metamorfosi&lt;br /&gt;
* alchimisti&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* possibilità giù in terra/ giù in acqua, con reachable e unreachable Boolean. Fuori da mappa anche reachable e unreachable.&lt;br /&gt;
* Personaggi composti di parti[] es. testa, busto, gambe, braccia, coda, pinna, ali. Distinzione per arto di movimento e/o spostamento boolean.&lt;br /&gt;
* Arti possono provocare danno, bruciatura , paralisi a contatto (Boolean) . Percentuale di probabilità accompagna ogni Boolean.&lt;br /&gt;
* Ogni parte del corpo punti vita + se inutilizzabile + amputata + stato (es paralisi).&lt;br /&gt;
* Per fare battaglie tra molto grandi =&amp;gt; 1 m lo si intende come 10m.  (rivalutato, aumentare livello scaling)&lt;br /&gt;
* Personaggio fusionabile Boolean + string nomi con cui si fonde.&lt;br /&gt;
* Distinzione tra infernape e infernape1/2/3 ect tra “specie” e “nome”.&lt;br /&gt;
* variabile Boolean respawnable.&lt;br /&gt;
* Raccogliere a piene mani da: https://spore.fandom.com/wiki/Creature_Editor&lt;br /&gt;
* Ad esempio weapons come elemento di Corpo (zanne, corna) e possibilità di muoversi/attaccare furtivamente.&lt;br /&gt;
* Divisibile e unibile come boolean e array di stringe associate per indicare i nomi con cui si unisce il Personaggio o in cui si divide.&lt;br /&gt;
* Variabili posizione nome: from_x/y ; to_x/y.&lt;br /&gt;
* Classe Stato, Personaggio contiene Array di stato, stato contiene moltiplicatori per statistica es attacco velocità precisione elusione ect.&lt;br /&gt;
* Personaggio deve avere una stat tipo sanità mentale, intelligenza, quanto è confuso e quanto è impaurito (2).&lt;br /&gt;
&lt;br /&gt;
* Per personaggi molto piccoli (meno di 1m x 1m x 1m) possibilità di essere in (x,y,z) tra 0 e 1.000.000 (ordine del micrometro, 1*10^-6 == 0,000001) e avere (lenX, lenY, lenZ). In questo modo sono definite dimensioni inferiori ad 1 m^3.&lt;br /&gt;
* personaggi max 20x20 (rivaluato, meno limitata)&lt;br /&gt;
&lt;br /&gt;
===Mosse===&lt;br /&gt;
* &amp;quot;combattimento prescinde da combattente&amp;quot;&lt;br /&gt;
* mosse hanno: direzione, azione, attacco (mosse pokémon)&lt;br /&gt;
* Parametri interi per mossa (direzione, consumabili) con lower e upper bound&lt;br /&gt;
* camuffarsi =&amp;gt; DnD manuale&lt;br /&gt;
* wrestling (libro) per le mosse/prese&lt;br /&gt;
&lt;br /&gt;
* X fa una mossa contro Y: Z potrebbe reagire (Es. ricevendo il colpo al posto di Y). Può essere realizzato sia come se &amp;quot;Y chiede soccorso Z&amp;quot; o come reazione di alleati adiacenti &amp;quot;Z soccorre Y&amp;quot;&lt;br /&gt;
* Mossa prende come parametro di ingresso Corpo, ossia la parte del corpo coinvolta nella mossa (es arto , tutto corpo ect). &lt;br /&gt;
&lt;br /&gt;
===Oggetto (con statistiche e stati)===&lt;br /&gt;
* armi: lacci (stati), lame (potenze), sassi, reti, pistole (munizioni), razzi, bombe (potenze), fuoco (d'artificio?) =&amp;gt; manuale DnD&lt;br /&gt;
* veleno n modi =&amp;gt; DnD manuale&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (oggetti)&lt;br /&gt;
* automezzi con cannoni, variabile 'hasEntrata', 'tempoRiutilizzo'&lt;br /&gt;
* violino come arma (tutti strumenti musicali): a fiato, a corda, a percussione&lt;br /&gt;
* veleni, ampolle e flaconi magici, insieme di 'oggetti dentro' un oggetto&lt;br /&gt;
&lt;br /&gt;
* Classe oggetto: es albero, roccia, casa: forza necessaria per sradicare + forza per lanciare + destrezza / agilità per appendersi + nascondersi in proporzione alle dimensioni di chi si nasconde. &lt;br /&gt;
* Altri es. pali. Sotto terra o sotto acqua/lava/melma o simili. &lt;br /&gt;
* Acqua rallenta se non hai pinne boolean.&lt;br /&gt;
* Classe strumento per oggetti che si tengono in mano, es reti , pistole, spade, pugnali, scudi, elmi, lancia, arco , frecce, lanciarazzi, fucili cecchino, fucile assalto, corde.&lt;br /&gt;
* Strumenti e mosse: danno ad area, perforante, contundente (vedi dnd armi). Mosse possono creare/modificare/distruggere oggetti e strumenti.&lt;br /&gt;
* Oggetti del campo di gioco incidono su elusione (parametro di personaggio).&lt;br /&gt;
* Buco/abisso (boolean) per dire se c’è o meno il suolo (Suolo come classe?). &lt;br /&gt;
* Radiazioni. &lt;br /&gt;
&lt;br /&gt;
===Modalità gioco===&lt;br /&gt;
* turnazione&lt;br /&gt;
* 1 v 1 v 1 etc., ma anche squadre casuali&lt;br /&gt;
* punteggio: chi fa più punti, più uccisioni, definizione di 'punto', gioco per perdere&lt;br /&gt;
* inserisci personaggio total random&lt;br /&gt;
&lt;br /&gt;
* Modalità battaglia con interazione stile battaglia navale (non si vede mossa dell'avversario)&lt;br /&gt;
* Modalità di gioco: tutti contro tutti (battle royale), death match, vs CPU mode zombie(attaccano solo, se non possono vanno verso nemico): serve introdurre un punteggio, di sicuro per mode zombie , ma anche per death match e tutti contro tutti&lt;br /&gt;
* ingressi: ne entra un altro?&lt;br /&gt;
&lt;br /&gt;
===Mappa===&lt;br /&gt;
* arene&lt;br /&gt;
* minimappa (pixelata ?), legenda oggetti base, devono esserci caselle implicite&lt;br /&gt;
* mappa 100x100 (rivalutato, meno limitata)&lt;br /&gt;
* Cannoni fissi in mezzo al campo (strumento).&lt;br /&gt;
&lt;br /&gt;
===Funzionalità generali===&lt;br /&gt;
* Chiave: non una flat input box per i comandi; ma dinamica: si suppone il soggetto &amp;quot;io&amp;quot; (le azioni le fanno in prima persona i personaggi), ogni mossa deve prevedere dei complementi (&amp;quot;verso&amp;quot;, &amp;quot;tra quanto&amp;quot;, &amp;quot;cosa&amp;quot;, &amp;quot;a favore di chi&amp;quot;, &amp;quot;contro chi&amp;quot;). Ogni complemento collegato con box stile in pop up =&amp;gt; bootstrap (la grafica sara unica). Prevedere anche modalita flat con input del tipo &amp;quot;azione a=pippo verso=termoli&amp;quot; (regex check)&lt;br /&gt;
* &amp;quot;meno tabelle&amp;quot;, &amp;quot;no bottoni&amp;quot; e solo foto che si alternano, &amp;quot;la grafica serve&amp;quot;: text box unica interazione, text area (history), immagine personaggio e immagine mappa&lt;br /&gt;
* &amp;quot;persistenza anche da interfaccia grafica&amp;quot;, diritti di scrittura sui file?&lt;br /&gt;
* Segnalazione (comando per fare nota)&lt;br /&gt;
&lt;br /&gt;
===Deploy===&lt;br /&gt;
* &amp;quot;commenta il codice&amp;quot;, &amp;quot;dividi et impera&amp;quot;&lt;br /&gt;
* JAVA: Class.forName(&amp;lt;name&amp;gt;.class).newInstance();&lt;br /&gt;
* Server web (Apache Tomcat) ospita partite (+ localmente ha i file di funzionamento), in LAN client giocano. Interfaccia HTML5 + Javascript per giocare. Scalabile per futuro, basta offrire servizio su un ip pubblico. Studiare engine grafici Javascript&lt;br /&gt;
* rpgmaker, godot, aseprite, pixelart (in generale), ma anche phaser, piskel&lt;br /&gt;
* joomla! Per far prima con html&lt;br /&gt;
* libreria pygame&lt;br /&gt;
&lt;br /&gt;
===Copia&amp;amp;incolla generale, da smistare in sotto capitoli. Contiene anche '''tutte''' note del telefono (al 22/02/2020)===&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 1:'''&lt;br /&gt;
&lt;br /&gt;
Mosse che trasformano l’avversario: attenzione è una mossa devastante. Trasformazione totale o parziale. Si devono poter aggiungere mosse, strumenti dinamicamente. Battle bot:ribaltano, scintille, elementi (Oggetti) che danneggiano. One piece: I frutti del diavolo (悪魔の実 Akuma no mi?) sono frutti misteriosi che donano poteri soprannaturali a chi li mangia, rendendoli però incapaci di nuotare. Di conseguenza il contatto con l'acqua di mare o con una speciale sostanza conosciuta come agalmatolite indebolisce gli utilizzatori di frutti del diavolo e li priva dei loro poteri. Alcune persone sono inoltre in grado di ricorrere all'Ambizione (覇気 Haki?), una forza spirituale che permette di avvertire la presenza di altri esseri viventi e di predirne i movimenti, di irrobustire parti del corpo e di intimidire o fare svenire le creature con una debole forza di volontà. Personaggio ha funzione baricentro_x, baricentro_y calcolate come (from_x+to_x)/2 sul quale si basa la funzione di libreria getDistance(Personaggio A, Personaggio B, float success); tale funzione serve per calcolare per i PNG e per i PG se ha senso usare una mossa. Non-onniscienza: delle volte non si può sapere distanza avversario e fallisce la mossa per la distanza -&amp;gt; “float success” rappresenta la probabilità di successo (Personaggio ha parametro “osservare”). PNG di due categorie: offensivi o neutrali (no priorità a mosse di attacco, ma tutto casuale). Mosse e oggetti per chiamare Personaggi, magari non necessariamente alleati (2 mosse e 2 oggetti quindi necessari), richiamo di un personaggio preciso o di uno a caso. Ogni mossa/azione deve avere un tempo di attesa espresso in turni (alla meglio 0) per poter ripetere la mossa/azione. Strumenti anche mezzi di trasporto di aria, di terra, di acqua (o lava/palude). Possono attivare una metamorfosi / Unione per cambiare stats personaggio. Veicoli con armi o riparo. Gli strumenti da trattare come gli oggetti. Classe unica? I match/partite (immagino Classe Partita) devono avere variabile boolean “respawn”, per distinguere death match a punti con death match con una vita. Wrestling per ispirarsi nella lotta libera: calci pugni ginocchiate prese lanci salti testate gomitate ecc. Per punti si vince a un limite o dopo un tot di mosse , oppure al primo dei due raggiunti (max_punti e max_mosse parametri di Partita). I punti si guadagnano alla kill (un Punteggio per squadra, int punteggio salvato localmente dentro ogni Personaggio che ha la variabile int squadra). Si guadagnano tanti punti quanti sono i punti della variabile “valore” del personaggio ucciso, tale variabile è calcolata come somma dei valori di tutte le mosse/stats ect del Personaggio. Imperium civitas. Attacco dei giganti. Possibilità di morire se colpiti in un unico punto (tallone d Achille) implementabile come variabile boolean. Jump force. Game dev tycoon. Acqua diventa tsunami. Variabile int per attacco cumulativo di gruppo: es calciatori che più si passano la palla più l’attacco è forte. Suolo magico: non tutti i personaggi possono accedervi, array di string elenca i nomi di chi può accedervi. Funzione esci/entra in classe Personaggio per simulare scambio pokemon 6vs6. Piovra gigante. Rischio=danno*probabilita. Mossa su strumento e con strumento?&lt;br /&gt;
Mosse fisiche per arrampicarsi su avversario(se e solo se sei la metà di dimensioni(?)), atterrarlo, lanciarlo, accecarlo, immobilizzarlo. Se sei in gruppo/ orda bonus ad attacchi combinati. Armi: fruste e scheggie, corni che si suonano per chiamare altri. Tipo della mossa con moltiplicatore tra 0 (immune) e 2 (float): acqua, fuoco, magia, terra: da ispirarsi ai pokemon ma non da copiare, penso. Armi da campo: cannoni e catapulte. Veicoli d’acqua: moto acqua, canoe, barche a motore a remi. Nei veicoli malus su attenzione (variabile int in personaggio, indica attenzione in combattimento e non in altro) perché si è impegnato alla guida . All’inizio in image view “the hero” e “the map”. Condizione vittoria (oltre a morte, punti, o numero mosse, cioè tempo) morte di un singolo Personaggio, che potrebbe rappresentare un edificio, cassaforte o simili. Personaggio si può svestire e lasciare strumenti, modificano statistiche di attacco, difesa , agilità, ect. Variabile luce o non luce, che peggiora/migliora a seconda della specie la visibilità, quindi la precisione , specie in attacchi a distanza: Scurovisione evita i malus.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 2:'''&lt;br /&gt;
&lt;br /&gt;
Gioco2: se ci si lancia da oggetti , dopo essersi arrampicati, possono esserci danni da caduta; strumenti come paracaduti o mosse magiche possono evitare i danni. Pozione del vento, soffi e devi attacchi. In difesa puoi parare, schivare, deviare: tre variabili? Ambiente: colline e pianure uguali, Monti sono Oggetti, picco ossia un unico monte oggetto. Rocce volanti, nuvole sospese: oggetto può essere sospeso e può fare periodicamente una mossa, ad es tuono, può spostarsi, può fare entra/esci, oggetto albero e oggetto foresta, si possono prendere, nascondersi, arrampicarsi, lanciarli, ostacolano velocità ma se si ha abbastanza forza si spezzano alberi. Acqua poco profonda, profonda, molto profonda: variabile boolean in Personaggio “alto” per toccare in acqua profonda, con acqua si generano fiumi laghi e mari. Ambiente si deve poter evolvere: ad esempio oggetto diga può fare metamorfosi e diventare oggetto cascata/torrente in piena. Per edifici più oggetti che rappresentano le mura e il tetto, variabile boolean per oggetto per entrare nell’oggetto. Possono essere spazzati via: danni da crollo, si può combattere all interni, contengono strumenti come tavoli sedie mobili letto ect. Se uno viene schiantato contro uno strumento prende danno(es danno da schianto). Ci possono essere scale, si può non avere contatti visivo sull’avversario. Oggetto mura, oggetto torre, oggetto casa interno sono cose distinte: possono dare malus/bonus su visibilità. Ambiente: pozzi e grotte, da gestire come interno casa. Lava come acqua, ogni oggetto può essere sorgenti di liquido: monte sorgente acqua, vulcano sorgente lava. Può esserci variabile probabilità eruzione, se settata a 1 c’è una continua eruzione. Strade di vario tipo, sovrapposta a altri suoli, migliorano velocità di alcuni strumenti, variabile boolean “ha le ruote” in classe strumenti. Unificare classe strumento e classe oggetto. Oggetti sospesi: case sospese su albero, ad es. Fiamme in mezzo al suolo. Oggetti: porto, aereoporto, grattacieli, dighe, impianti a fune, ospedali per curarsi e prendere oggetti per curarsi dopo, scuole contenenti libri per apprendere una mossa, luoghi di ingegneria per creare oggetti, ad esempio veicoli o armi, soldi nel gioco per comprare da eventuali venditori. Ogni oggetto avra un prezzo (valutabile circa in euro per semplicità). Variabile float per fame, sete, sonno, caldo-freddo (parte da 0.5). Nella mappa ci deve essere per ogni punto la temperatura. Possibilità di vomito, dissenteria, problemi cardiaci, respiratori, muscolari. Armi: balestra, mani nude, sasso, tirapugni, torcia accesa. Armature: intralciano o favoriscono agilità, attacco, poteri magici, rumorosa (elusione), è uno strumento/oggetto. Attacchi possono essere prolungati per turni, mosse variabile boolean prolungabile: può aumentare o diminuire intensità, c’è un max espresso in turni di prolungabilita, inoltre può essere leggermente alterato con una variabile casuale. Equipaggiamento (strumento/oggetto): pietra focaia, attrezzi da scalata, boccale di birra, cavallo, moto, chiodi, martello da fabbro, corda, corazza, dardo, faretra/zaino/sacca (oggetti che contengono una lista di oggetti, stringhe) con un numero per la quantità) e capacità massima zaino e ogni oggetto può avere un valore intero per dimensione (es martello 3, ascia grande 7), mantello, olio, variabile boolean prende fuoco/conduce elettricità, amplifica magnetismo, aumenta esplosioni nucleari, aumenta forza di gravità (?), pala, piccone, rampino, specchio, per osservare quando si è nascosti e si ha malus su visibilità. Strumenti da scasso per aprire porte: variabile boolean per oggetti: entrata con scasso. Personaggio: string razza per swag, immunità a veleni e malattie, elusione, agilità, precisione, abilità magiche(?), difesa fisica. In ultima torcia: agilità, coraggio, forza, intelligenza, magia, manualità, percezione, socialità. Bestiario: aracnoide di varie dimensioni, talpe giganti, vermi giganti di terra di mare e di lava ect, bulbo trascinatore che ha tentacoli per tirare a se e mangiare, lui è immobile, calabrone gigante, serpenti giganti, cinghiali, draghi, elfi, goblin e re goblin, sciamani (goblin), totem di guerra come strumento/oggetti per alterare statistiche nella loro area di influenza, lupo, mastino bruciante, nani, non morti/zombie/mummia/scheletro variabile boolean vivo a false ma ha ancora hp su parti del corpo: variabile boolean “zombizabile”. Orchi, pesci da terra (anfibi) tritone dell abisso, troll e trollin (orchi più deformi), umani. Abilità dei personaggi in ultima torcia: artificiale (robot) immunità a soffocamento, veleni, malattie ect immune a manipolazioni psichiche, visione oscurità; danno da attacco in carica; fiammegiante ossia la creatura può incendiarsi e elettrizzante ossia può diventare elettrica caricamente; modalità furia/mailmen ossia ottiene bonus su alcune/tutte le statistiche; gigantesco o molto piccolo due boolean (?forse non serve); immunità a magie mentali, al fuoco; linguaggi (?); non morto; danno da attacco in presa; pungiglioni velenosi; sa muoversi su ragnatele o è rallentato, resistenza a perforazione, respirare sott’acqua o sotto lava o nei liquidi in genere; rigenerazione; riceve danni dalla luce solare o da assenza di luce; è terrorizzato/impaurito/intimidito o se è imperturbabile boolean. Danno da trascinamento; paralizzante; può diventare più veloce (?non serve); visione a infrarossi attraverso oggetti; volare o andare sotto terra. Imperium editor, cose che penso di non aver ancora scritto: stagioni, suolo erboso o terriccio, sabbia con erba e terra e da sola, strade e stagioni, altitudine, alberi e arbusti, vari tipi a foglia larga, conifere, alberi secchi, palme, arbusti verdi e secchi, cactus, alghe marine, rocce e pietre, scheletri per terra, legna tagliata (alberi tagliati), carri e carretti, grotte e rovine per accessi sotterranei, locande, templi, accampamenti, fortini, monoliti, fontana, tombe e cimiteri, borse per terra, pozzo, troni, croci(del teschio), pozzo, capanne, lapidi, ponti, recinzioni, falò, tende, torri, panoplia, fessure come abissi, statue, rovine (deserto) come case distrutte, colonne per costruire templi, piramidi, sfingi, bandiere, rovine in Europa, campi coltivati che contengono cibo, fiamma (in altre), roccia in altre per montagne, altre-&amp;gt;rovine per monumenti non egiziani ma europei.&lt;br /&gt;
Ci sono paludi. Tende da campo. Forti, porti. Edifici delle fortezze, edifici dei villaggi. Naufragi e scogli.&lt;br /&gt;
Parametri voglia/impegno float per descrivere voglia di combattere Personaggio. Ricevi danno uscendo dalla mappa tra 1-5% tra 6-10% tra 11-15% della vita totale di ogni parte del corpo per ogni turno di gioco. Danno da precipitazione diverso da carica, uno verticale uno orizzontale, se precipiti da molto in alto hai bonus, oltre che danni da schianto lol. Baionette, formazione a blocchi, a quadrato (difensiva) sparano su quattro lati, a schiera vanno avanti. Usano un colpo poi lunga ricarica. Variabile boolean per attivare o meno fuoco amico. Azione per cambiare posizione: in piedi, in ginocchio(inteso come via di mezzo), sdraiato: per permettere migliore visibilità a chi è dietro (nella formazione).&lt;br /&gt;
Altruismo, coraggio, spingere oltre il limite, difendere al posto di un altro, migliorare posizione per avere bonus. Mosse da usare in condizioni psicologiche idonee: mosse estreme per disperazione, bonus unici. Condizioni per situazioni: blocco, spalle al muro, stritolato, confuso, semi parassiti addosso, azzoppato, bagnato d’acqua, lame affilate, corazza indurita, tante copie di me stesso attive, preveggente. Per ambiente:pioggia (torrenziale), barriera a cupola, punte metalliche a terra, blocco di fumo nero. Far volare un avversario/alleato. Tutti possono fare tutto sotto effetti magici o fisici. Un cavallo può volare se viene preso da un uccello e portato in alto.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 3, 4:'''&lt;br /&gt;
&lt;br /&gt;
Gioco1,2,3,4: tutto caricato su wikis.&lt;br /&gt;
&lt;br /&gt;
Gioco3: Mosse con caricamento + spostamento (es. kameamea con teletrasporto). Ciclo di interazione principale:crea o combatti. Modalità campagna, che chiede in input da che battaglia iniziare, ma implica tipi battaglie prefissati. Alla morte/sconfitta di un personaggio si possono alterare statistiche (es personaggio può cambiare fazione). Alcune mosse possono lasciare oggetti sul terreno: (ad es, radici di Groth). Ogni oggetto può alterare le statistiche al passaggio sopra, nelle vicinanze. Boolean invisibile per personaggio, diverso da elusione infinita. Se personaggio va in un altro dimensione -&amp;gt; unreachable. Attacco coordinato, se non lo fanno tutti vale lo stesso ma depotenziato opportunamente . Personaggio in modalità maniac (2 mosse per turno) e in modalità depressive (1 mossa ogni due turni); personaggio Flash può fare 10 mosse in un turno. Chiudi con lucchetto oggetto da dentro o da fuori, oggetto ingresso in oggetto casa , più ingressi per un singolo oggetto.nicole aniston. Rimbalzo se ci si schianta contro oggetto da calcolare con parametro. Ryuk e Darkrai.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gioco 4 23/07/2019:&lt;br /&gt;
Pula fiction, aracnidi, oggetto: due superfici rettangolari di forma diversa, anche inclinate , collegate. Più pezzi collegati tra loro per forme cilindriche cave, ad esempio, tipo vulcano. Mappa con sprite personaggi, canvas: anche mouseClick? Statistiche con nome gerarchico, es pokemon_attacco. Modalità survival, stile isola di jurassic park gdr; sia in coop che contro; possibilità di fare N turni di fila se non ci sono altri player giocanti nelle vicinanze (ciò però comporterebbe , in modalità contro , di capire quando c’è qualcuno nelle vicinanze perché si andrebbe di 1 turno alla volta, soluzioni: in mod contro 1 turno per volta oppure meccanismo di sincronizzazione turni quando uno vede l’altro (anche furtivo) come c’è attacco 1 turno a testa) .. analogo a Battle royale(?); inizio con starter kit random. Modalità assedio al castello. Inoltre se posso fare N turni di fila si può pensare a più pc , uno per persona , coordinati per fare comandi in parallelo, ma va ben congegnato meccanismo di sincronizzazione. Parti DelCorpo -&amp;gt; Componente/i oppure Parte. La mappa deve essere (x,y); l’altezza viene indicata onMouseOver certi pixel dove è posto il Personaggio; se personaggio dentro edificio/grotta cambio img (es sfocato/tratteggiato). Mosse: astrarre per target; molte mosse sono simili tra loro, somiglianza va sfruttata, hanno magari dei target in comune, o variano solo per un parametro. Creare mappa anche con drag and drop immagini ?(un po’ difficile). Più layout per interfaccia grafica (esempio uno che mostra errori input su text area, uno con alert, uno su box text area separato). Input comandi consumato pezzo per pezzo, alcune parole se prevedono parametri quando riconosciute fanno fetch anche di parola (numero) successiva. Face toon foto? Import parziali di personaggi (tutto tranne/solo questi campi specificati). Texture mappa complete o ripetibili (es per suolo). Anteprima battaglia stile battaglia pokemon (magari per 1/2/3 vs 1/2/3) per rappresentare scontro. Conviene usare xslx (excel) per dati, considerare che può non servire la libreria Java per leggere stringhe per operazioni. Mossa “again” , ripeti la precedenza(opportuna modifica parametri, es mossa spostamento). Possibile gestione contromosse: si usano marker (tag): ogni mossa ha elenco tag del tipo di contromosse che può subire (con probabilità annessa, che può dipendere da pg che subisce mossa congiuntamente a mossa stessa). Ogni mossa inoltre deve essere taggata come possibile contromossa che il pg può usare (per schivare può fare in più modi). A seconda del lancio del dado il pg che effettua La contromossa può anche scegliere tipologia di contromossa o solo la mossa della tipologia che ha beccato (entrano in gioco riflessi ect.). I parametri che fanno attivare unq o un’altra contromossa sono dinamici, posso dipendere ad esempio dalla posizione tra i due pg o altre statistiche. Tag contromosse a fasce (es. coprirsi è sempre più facile che schivare che e più facile di schivare e contrattaccare (?); all’interno dello stesso schivare e contrattaccare ci sono più sotto categorie). Per aggiunta personaggio può essere utili interfaccia dedicata, non linea di comando (o altre operazioni, specie se ci sono tabelle). Mossa “premonizione”: predire il futuro a breve termine, dici che mossa vorresti fare e ti dice esito (o più esiti se uno chiede più mosse). Funziona solo sulla prossima mossa. Contromossa delle contromossa gestione?? Eventualmente nell’esito si prevede ancore contro-contromossa. Ma si innesca reazione a catena, inoltre da gestire scelta contromossa in questo caso. Applicazione tag conoscenza(universo di appartenenza): “Termoli”, “pokemon”, “liceo classico Termoli”, anche gerarchici, per filtrare sui personaggi.target componibili , fattorizzato creazione mosse, hanno un costo magari per indicare quantovoccupano dicuna mossa, relativo maybe a un parametro o più del target stesso. In particolare, non saranno salvate le mosse per un personaggio (o solo alcune “preferite”) ma il suo insieme di target i quali devono dire:statistica che influenzano, “costo del turno” che richiedono al variare dell’intensità del target (che aumenta linearmente, esponenzialmente, generica f(x)) quindi corsa blanda costo 1 , Max corsa costo 5 (max), elenco (string) target incompatibili con tale target (se serve), nota relative ad es per quando uno vuole creare una mossa durante la battaglia (“target corsa, max sforzo dedicabile 4 ect” metti “50 metri corsa” “ok/troppo! Vuoi sforzati di più rischiando effetti collaterali?”). Si può autoscrivere la voce narrante del gioco come “la tua coscienza” mentre che giochi, d’altronde si interagisce con essa. Considerare che un target può appartenere a più personaggi, magari sotto nomi di mosse diversi.&lt;br /&gt;
Definire gerarchia di personaggi per template (tipo classe e super classe) e template importabili (tipo usa fuoco). Es umanoide non umanoide, tra umanoide maschio- femmina etc. Classe che estende System.out per creare funzioni che aggiungono Header “DEBUG:” etc; due programmi Java , due main: uno delegato a calcoli + gestione Excel; altro legge stdout dell altro per interfaccia grafica. Per allenare PG creare dei PG fantocci con label per fare Q-learning iniziale, più avanti far allenare pg tra loro; creare vari fantocci: tank terrestre fisico, healer volante etc. Excel: si usa css che si può rendere tabellare, più facile da trattare nel codice rispetto a .xslx. Ogni “utente” ed Lostefra ha il suo personale dizionario con sue personali short cut da usare in partita, eventuale login con password (opzionale) x accesso. Vedere license show down. Mappa unica stile giochi di ruolo, si vede tutto da sopra: click o simili su edifici/caverne per mappe interne a tale posto, così ok sprite e per rappresentare “pg in volo” sprite dedicato. Densità aria per dire quando anche un uomo per es può volare. Ipotesi più efficiente per dare un valore stima al pg: AI base che gioca a manetta contro altre AI base e dalle vittorie si fa l’euristica, più vittoria facile/veloce/stracciante più punti, contro vari pg, contro pg standard bench mark.&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Note&amp;diff=188</id>
		<title>Note</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Note&amp;diff=188"/>
		<updated>2020-03-16T00:30:21Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: /* Deploy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Note ==&lt;br /&gt;
&lt;br /&gt;
'''Vedere altre note su fogli di carta e promemoria del telefono. Ce ne sono molte.'''&lt;br /&gt;
'''La copiatura dai fogli di carta dei continuare da pagina 4 (&amp;quot;alterare param..&amp;quot;).'''&lt;br /&gt;
&lt;br /&gt;
===Inspirational Concepts===&lt;br /&gt;
* Gioco Lotta (Pokémon, Pokkén)&lt;br /&gt;
* no caselle esplicite&lt;br /&gt;
* Descrizione rispetto a: ambiente, nemico, oggetti&lt;br /&gt;
* pokémon, DnD, Call of Duty, Super Smash Brawl, corse pazze&lt;br /&gt;
* concentrarsi su: fluidi, telecinesi, razze, bonus/malus, gradi di libertà (fisicamente parlando) &lt;br /&gt;
* scacchi (es. crea casella), shaolin showdown&lt;br /&gt;
* prevedere = creatività&lt;br /&gt;
* acqua, aria, fuoco, terra&lt;br /&gt;
* gravità (newton), verso alto, basso, destra, sinistra, circolare, tutti i versi&lt;br /&gt;
* jumanji, savana, animali, zoologia&lt;br /&gt;
* tempo/spazio&lt;br /&gt;
* BF4, pirati, roma (imperium civitas)&lt;br /&gt;
* musica come arma (rap)&lt;br /&gt;
* magia, prestigiatori&lt;br /&gt;
* dinosauri (documentario, libro, zoologia)&lt;br /&gt;
* avengers, supereroi (libro)&lt;br /&gt;
&lt;br /&gt;
* Looney toons&lt;br /&gt;
&lt;br /&gt;
===Personaggi (con statistiche e stati)===&lt;br /&gt;
* combattenti (con statistiche e stati)&lt;br /&gt;
* immagine rappresentativa per rappresentare meglio&lt;br /&gt;
* HP: colore rosso su immagine personaggio, dove sei debole/già colpito (idea scartata)&lt;br /&gt;
* penitenza: il malus può essere inteso come ciò che c'è nell'inserimento successivo, malus cumulativo&lt;br /&gt;
* essere ipocrita, finzione (schermo)&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (personaggi)&lt;br /&gt;
* metamorfosi&lt;br /&gt;
* alchimisti&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* possibilità giù in terra/ giù in acqua, con reachable e unreachable Boolean. Fuori da mappa anche reachable e unreachable.&lt;br /&gt;
* Personaggi composti di parti[] es. testa, busto, gambe, braccia, coda, pinna, ali. Distinzione per arto di movimento e/o spostamento boolean.&lt;br /&gt;
* Arti possono provocare danno, bruciatura , paralisi a contatto (Boolean) . Percentuale di probabilità accompagna ogni Boolean.&lt;br /&gt;
* Ogni parte del corpo punti vita + se inutilizzabile + amputata + stato (es paralisi).&lt;br /&gt;
* Per fare battaglie tra molto grandi =&amp;gt; 1 m lo si intende come 10m.  (rivalutato, aumentare livello scaling)&lt;br /&gt;
* Personaggio fusionabile Boolean + string nomi con cui si fonde.&lt;br /&gt;
* Distinzione tra infernape e infernape1/2/3 ect tra “specie” e “nome”.&lt;br /&gt;
* variabile Boolean respawnable.&lt;br /&gt;
* Raccogliere a piene mani da: https://spore.fandom.com/wiki/Creature_Editor&lt;br /&gt;
* Ad esempio weapons come elemento di Corpo (zanne, corna) e possibilità di muoversi/attaccare furtivamente.&lt;br /&gt;
* Divisibile e unibile come boolean e array di stringe associate per indicare i nomi con cui si unisce il Personaggio o in cui si divide.&lt;br /&gt;
* Variabili posizione nome: from_x/y ; to_x/y.&lt;br /&gt;
* Classe Stato, Personaggio contiene Array di stato, stato contiene moltiplicatori per statistica es attacco velocità precisione elusione ect.&lt;br /&gt;
* Personaggio deve avere una stat tipo sanità mentale, intelligenza, quanto è confuso e quanto è impaurito (2).&lt;br /&gt;
&lt;br /&gt;
* Per personaggi molto piccoli (meno di 1m x 1m x 1m) possibilità di essere in (x,y,z) tra 0 e 1.000.000 (ordine del micrometro, 1*10^-6 == 0,000001) e avere (lenX, lenY, lenZ). In questo modo sono definite dimensioni inferiori ad 1 m^3.&lt;br /&gt;
* personaggi max 20x20 (rivaluato, meno limitata)&lt;br /&gt;
&lt;br /&gt;
===Mosse===&lt;br /&gt;
* &amp;quot;combattimento prescinde da combattente&amp;quot;&lt;br /&gt;
* mosse hanno: direzione, azione, attacco (mosse pokémon)&lt;br /&gt;
* Parametri interi per mossa (direzione, consumabili) con lower e upper bound&lt;br /&gt;
* camuffarsi =&amp;gt; DnD manuale&lt;br /&gt;
* wrestling (libro) per le mosse/prese&lt;br /&gt;
&lt;br /&gt;
* X fa una mossa contro Y: Z potrebbe reagire (Es. ricevendo il colpo al posto di Y). Può essere realizzato sia come se &amp;quot;Y chiede soccorso Z&amp;quot; o come reazione di alleati adiacenti &amp;quot;Z soccorre Y&amp;quot;&lt;br /&gt;
* Mossa prende come parametro di ingresso Corpo, ossia la parte del corpo coinvolta nella mossa (es arto , tutto corpo ect). &lt;br /&gt;
&lt;br /&gt;
===Oggetto (con statistiche e stati)===&lt;br /&gt;
* armi: lacci (stati), lame (potenze), sassi, reti, pistole (munizioni), razzi, bombe (potenze), fuoco (d'artificio?) =&amp;gt; manuale DnD&lt;br /&gt;
* veleno n modi =&amp;gt; DnD manuale&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (oggetti)&lt;br /&gt;
* automezzi con cannoni, variabile 'hasEntrata', 'tempoRiutilizzo'&lt;br /&gt;
* violino come arma (tutti strumenti musicali): a fiato, a corda, a percussione&lt;br /&gt;
* veleni, ampolle e flaconi magici, insieme di 'oggetti dentro' un oggetto&lt;br /&gt;
&lt;br /&gt;
* Classe oggetto: es albero, roccia, casa: forza necessaria per sradicare + forza per lanciare + destrezza / agilità per appendersi + nascondersi in proporzione alle dimensioni di chi si nasconde. &lt;br /&gt;
* Altri es. pali. Sotto terra o sotto acqua/lava/melma o simili. &lt;br /&gt;
* Acqua rallenta se non hai pinne boolean.&lt;br /&gt;
* Classe strumento per oggetti che si tengono in mano, es reti , pistole, spade, pugnali, scudi, elmi, lancia, arco , frecce, lanciarazzi, fucili cecchino, fucile assalto, corde.&lt;br /&gt;
* Strumenti e mosse: danno ad area, perforante, contundente (vedi dnd armi). Mosse possono creare/modificare/distruggere oggetti e strumenti.&lt;br /&gt;
* Oggetti del campo di gioco incidono su elusione (parametro di personaggio).&lt;br /&gt;
* Buco/abisso (boolean) per dire se c’è o meno il suolo (Suolo come classe?). &lt;br /&gt;
* Radiazioni. &lt;br /&gt;
&lt;br /&gt;
===Modalità gioco===&lt;br /&gt;
* turnazione&lt;br /&gt;
* 1 v 1 v 1 etc., ma anche squadre casuali&lt;br /&gt;
* punteggio: chi fa più punti, più uccisioni, definizione di 'punto', gioco per perdere&lt;br /&gt;
* inserisci personaggio total random&lt;br /&gt;
&lt;br /&gt;
* Modalità battaglia con interazione stile battaglia navale (non si vede mossa dell'avversario)&lt;br /&gt;
* Modalità di gioco: tutti contro tutti (battle royale), death match, vs CPU mode zombie(attaccano solo, se non possono vanno verso nemico): serve introdurre un punteggio, di sicuro per mode zombie , ma anche per death match e tutti contro tutti&lt;br /&gt;
* ingressi: ne entra un altro?&lt;br /&gt;
&lt;br /&gt;
===Mappa===&lt;br /&gt;
* arene&lt;br /&gt;
* minimappa (pixelata ?), legenda oggetti base, devono esserci caselle implicite&lt;br /&gt;
* mappa 100x100 (rivalutato, meno limitata)&lt;br /&gt;
* Cannoni fissi in mezzo al campo (strumento).&lt;br /&gt;
&lt;br /&gt;
===Funzionalità generali===&lt;br /&gt;
* &amp;quot;meno tabelle&amp;quot;, &amp;quot;no bottoni&amp;quot; e solo foto che si alternano, &amp;quot;la grafica serve&amp;quot;: text box unica interazione, text area (history), immagine personaggio e immagine mappa&lt;br /&gt;
* &amp;quot;persistenza anche da interfaccia grafica&amp;quot;, diritti di scrittura sui file?&lt;br /&gt;
* Segnalazione (comando per fare nota)&lt;br /&gt;
&lt;br /&gt;
===Deploy===&lt;br /&gt;
* &amp;quot;commenta il codice&amp;quot;, &amp;quot;dividi et impera&amp;quot;&lt;br /&gt;
* JAVA: Class.forName(&amp;lt;name&amp;gt;.class).newInstance();&lt;br /&gt;
* Server web (Apache Tomcat) ospita partite (+ localmente ha i file di funzionamento), in LAN client giocano. Interfaccia HTML5 + Javascript per giocare. Scalabile per futuro, basta offrire servizio su un ip pubblico. Studiare engine grafici Javascript&lt;br /&gt;
* rpgmaker, godot, aseprite, pixelart (in generale), ma anche phaser, piskel&lt;br /&gt;
* joomla! Per far prima con html&lt;br /&gt;
* libreria pygame&lt;br /&gt;
&lt;br /&gt;
===Copia&amp;amp;incolla generale, da smistare in sotto capitoli. Contiene anche '''tutte''' note del telefono (al 22/02/2020)===&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 1:'''&lt;br /&gt;
&lt;br /&gt;
Mosse che trasformano l’avversario: attenzione è una mossa devastante. Trasformazione totale o parziale. Si devono poter aggiungere mosse, strumenti dinamicamente. Battle bot:ribaltano, scintille, elementi (Oggetti) che danneggiano. One piece: I frutti del diavolo (悪魔の実 Akuma no mi?) sono frutti misteriosi che donano poteri soprannaturali a chi li mangia, rendendoli però incapaci di nuotare. Di conseguenza il contatto con l'acqua di mare o con una speciale sostanza conosciuta come agalmatolite indebolisce gli utilizzatori di frutti del diavolo e li priva dei loro poteri. Alcune persone sono inoltre in grado di ricorrere all'Ambizione (覇気 Haki?), una forza spirituale che permette di avvertire la presenza di altri esseri viventi e di predirne i movimenti, di irrobustire parti del corpo e di intimidire o fare svenire le creature con una debole forza di volontà. Personaggio ha funzione baricentro_x, baricentro_y calcolate come (from_x+to_x)/2 sul quale si basa la funzione di libreria getDistance(Personaggio A, Personaggio B, float success); tale funzione serve per calcolare per i PNG e per i PG se ha senso usare una mossa. Non-onniscienza: delle volte non si può sapere distanza avversario e fallisce la mossa per la distanza -&amp;gt; “float success” rappresenta la probabilità di successo (Personaggio ha parametro “osservare”). PNG di due categorie: offensivi o neutrali (no priorità a mosse di attacco, ma tutto casuale). Mosse e oggetti per chiamare Personaggi, magari non necessariamente alleati (2 mosse e 2 oggetti quindi necessari), richiamo di un personaggio preciso o di uno a caso. Ogni mossa/azione deve avere un tempo di attesa espresso in turni (alla meglio 0) per poter ripetere la mossa/azione. Strumenti anche mezzi di trasporto di aria, di terra, di acqua (o lava/palude). Possono attivare una metamorfosi / Unione per cambiare stats personaggio. Veicoli con armi o riparo. Gli strumenti da trattare come gli oggetti. Classe unica? I match/partite (immagino Classe Partita) devono avere variabile boolean “respawn”, per distinguere death match a punti con death match con una vita. Wrestling per ispirarsi nella lotta libera: calci pugni ginocchiate prese lanci salti testate gomitate ecc. Per punti si vince a un limite o dopo un tot di mosse , oppure al primo dei due raggiunti (max_punti e max_mosse parametri di Partita). I punti si guadagnano alla kill (un Punteggio per squadra, int punteggio salvato localmente dentro ogni Personaggio che ha la variabile int squadra). Si guadagnano tanti punti quanti sono i punti della variabile “valore” del personaggio ucciso, tale variabile è calcolata come somma dei valori di tutte le mosse/stats ect del Personaggio. Imperium civitas. Attacco dei giganti. Possibilità di morire se colpiti in un unico punto (tallone d Achille) implementabile come variabile boolean. Jump force. Game dev tycoon. Acqua diventa tsunami. Variabile int per attacco cumulativo di gruppo: es calciatori che più si passano la palla più l’attacco è forte. Suolo magico: non tutti i personaggi possono accedervi, array di string elenca i nomi di chi può accedervi. Funzione esci/entra in classe Personaggio per simulare scambio pokemon 6vs6. Piovra gigante. Rischio=danno*probabilita. Mossa su strumento e con strumento?&lt;br /&gt;
Mosse fisiche per arrampicarsi su avversario(se e solo se sei la metà di dimensioni(?)), atterrarlo, lanciarlo, accecarlo, immobilizzarlo. Se sei in gruppo/ orda bonus ad attacchi combinati. Armi: fruste e scheggie, corni che si suonano per chiamare altri. Tipo della mossa con moltiplicatore tra 0 (immune) e 2 (float): acqua, fuoco, magia, terra: da ispirarsi ai pokemon ma non da copiare, penso. Armi da campo: cannoni e catapulte. Veicoli d’acqua: moto acqua, canoe, barche a motore a remi. Nei veicoli malus su attenzione (variabile int in personaggio, indica attenzione in combattimento e non in altro) perché si è impegnato alla guida . All’inizio in image view “the hero” e “the map”. Condizione vittoria (oltre a morte, punti, o numero mosse, cioè tempo) morte di un singolo Personaggio, che potrebbe rappresentare un edificio, cassaforte o simili. Personaggio si può svestire e lasciare strumenti, modificano statistiche di attacco, difesa , agilità, ect. Variabile luce o non luce, che peggiora/migliora a seconda della specie la visibilità, quindi la precisione , specie in attacchi a distanza: Scurovisione evita i malus.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 2:'''&lt;br /&gt;
&lt;br /&gt;
Gioco2: se ci si lancia da oggetti , dopo essersi arrampicati, possono esserci danni da caduta; strumenti come paracaduti o mosse magiche possono evitare i danni. Pozione del vento, soffi e devi attacchi. In difesa puoi parare, schivare, deviare: tre variabili? Ambiente: colline e pianure uguali, Monti sono Oggetti, picco ossia un unico monte oggetto. Rocce volanti, nuvole sospese: oggetto può essere sospeso e può fare periodicamente una mossa, ad es tuono, può spostarsi, può fare entra/esci, oggetto albero e oggetto foresta, si possono prendere, nascondersi, arrampicarsi, lanciarli, ostacolano velocità ma se si ha abbastanza forza si spezzano alberi. Acqua poco profonda, profonda, molto profonda: variabile boolean in Personaggio “alto” per toccare in acqua profonda, con acqua si generano fiumi laghi e mari. Ambiente si deve poter evolvere: ad esempio oggetto diga può fare metamorfosi e diventare oggetto cascata/torrente in piena. Per edifici più oggetti che rappresentano le mura e il tetto, variabile boolean per oggetto per entrare nell’oggetto. Possono essere spazzati via: danni da crollo, si può combattere all interni, contengono strumenti come tavoli sedie mobili letto ect. Se uno viene schiantato contro uno strumento prende danno(es danno da schianto). Ci possono essere scale, si può non avere contatti visivo sull’avversario. Oggetto mura, oggetto torre, oggetto casa interno sono cose distinte: possono dare malus/bonus su visibilità. Ambiente: pozzi e grotte, da gestire come interno casa. Lava come acqua, ogni oggetto può essere sorgenti di liquido: monte sorgente acqua, vulcano sorgente lava. Può esserci variabile probabilità eruzione, se settata a 1 c’è una continua eruzione. Strade di vario tipo, sovrapposta a altri suoli, migliorano velocità di alcuni strumenti, variabile boolean “ha le ruote” in classe strumenti. Unificare classe strumento e classe oggetto. Oggetti sospesi: case sospese su albero, ad es. Fiamme in mezzo al suolo. Oggetti: porto, aereoporto, grattacieli, dighe, impianti a fune, ospedali per curarsi e prendere oggetti per curarsi dopo, scuole contenenti libri per apprendere una mossa, luoghi di ingegneria per creare oggetti, ad esempio veicoli o armi, soldi nel gioco per comprare da eventuali venditori. Ogni oggetto avra un prezzo (valutabile circa in euro per semplicità). Variabile float per fame, sete, sonno, caldo-freddo (parte da 0.5). Nella mappa ci deve essere per ogni punto la temperatura. Possibilità di vomito, dissenteria, problemi cardiaci, respiratori, muscolari. Armi: balestra, mani nude, sasso, tirapugni, torcia accesa. Armature: intralciano o favoriscono agilità, attacco, poteri magici, rumorosa (elusione), è uno strumento/oggetto. Attacchi possono essere prolungati per turni, mosse variabile boolean prolungabile: può aumentare o diminuire intensità, c’è un max espresso in turni di prolungabilita, inoltre può essere leggermente alterato con una variabile casuale. Equipaggiamento (strumento/oggetto): pietra focaia, attrezzi da scalata, boccale di birra, cavallo, moto, chiodi, martello da fabbro, corda, corazza, dardo, faretra/zaino/sacca (oggetti che contengono una lista di oggetti, stringhe) con un numero per la quantità) e capacità massima zaino e ogni oggetto può avere un valore intero per dimensione (es martello 3, ascia grande 7), mantello, olio, variabile boolean prende fuoco/conduce elettricità, amplifica magnetismo, aumenta esplosioni nucleari, aumenta forza di gravità (?), pala, piccone, rampino, specchio, per osservare quando si è nascosti e si ha malus su visibilità. Strumenti da scasso per aprire porte: variabile boolean per oggetti: entrata con scasso. Personaggio: string razza per swag, immunità a veleni e malattie, elusione, agilità, precisione, abilità magiche(?), difesa fisica. In ultima torcia: agilità, coraggio, forza, intelligenza, magia, manualità, percezione, socialità. Bestiario: aracnoide di varie dimensioni, talpe giganti, vermi giganti di terra di mare e di lava ect, bulbo trascinatore che ha tentacoli per tirare a se e mangiare, lui è immobile, calabrone gigante, serpenti giganti, cinghiali, draghi, elfi, goblin e re goblin, sciamani (goblin), totem di guerra come strumento/oggetti per alterare statistiche nella loro area di influenza, lupo, mastino bruciante, nani, non morti/zombie/mummia/scheletro variabile boolean vivo a false ma ha ancora hp su parti del corpo: variabile boolean “zombizabile”. Orchi, pesci da terra (anfibi) tritone dell abisso, troll e trollin (orchi più deformi), umani. Abilità dei personaggi in ultima torcia: artificiale (robot) immunità a soffocamento, veleni, malattie ect immune a manipolazioni psichiche, visione oscurità; danno da attacco in carica; fiammegiante ossia la creatura può incendiarsi e elettrizzante ossia può diventare elettrica caricamente; modalità furia/mailmen ossia ottiene bonus su alcune/tutte le statistiche; gigantesco o molto piccolo due boolean (?forse non serve); immunità a magie mentali, al fuoco; linguaggi (?); non morto; danno da attacco in presa; pungiglioni velenosi; sa muoversi su ragnatele o è rallentato, resistenza a perforazione, respirare sott’acqua o sotto lava o nei liquidi in genere; rigenerazione; riceve danni dalla luce solare o da assenza di luce; è terrorizzato/impaurito/intimidito o se è imperturbabile boolean. Danno da trascinamento; paralizzante; può diventare più veloce (?non serve); visione a infrarossi attraverso oggetti; volare o andare sotto terra. Imperium editor, cose che penso di non aver ancora scritto: stagioni, suolo erboso o terriccio, sabbia con erba e terra e da sola, strade e stagioni, altitudine, alberi e arbusti, vari tipi a foglia larga, conifere, alberi secchi, palme, arbusti verdi e secchi, cactus, alghe marine, rocce e pietre, scheletri per terra, legna tagliata (alberi tagliati), carri e carretti, grotte e rovine per accessi sotterranei, locande, templi, accampamenti, fortini, monoliti, fontana, tombe e cimiteri, borse per terra, pozzo, troni, croci(del teschio), pozzo, capanne, lapidi, ponti, recinzioni, falò, tende, torri, panoplia, fessure come abissi, statue, rovine (deserto) come case distrutte, colonne per costruire templi, piramidi, sfingi, bandiere, rovine in Europa, campi coltivati che contengono cibo, fiamma (in altre), roccia in altre per montagne, altre-&amp;gt;rovine per monumenti non egiziani ma europei.&lt;br /&gt;
Ci sono paludi. Tende da campo. Forti, porti. Edifici delle fortezze, edifici dei villaggi. Naufragi e scogli.&lt;br /&gt;
Parametri voglia/impegno float per descrivere voglia di combattere Personaggio. Ricevi danno uscendo dalla mappa tra 1-5% tra 6-10% tra 11-15% della vita totale di ogni parte del corpo per ogni turno di gioco. Danno da precipitazione diverso da carica, uno verticale uno orizzontale, se precipiti da molto in alto hai bonus, oltre che danni da schianto lol. Baionette, formazione a blocchi, a quadrato (difensiva) sparano su quattro lati, a schiera vanno avanti. Usano un colpo poi lunga ricarica. Variabile boolean per attivare o meno fuoco amico. Azione per cambiare posizione: in piedi, in ginocchio(inteso come via di mezzo), sdraiato: per permettere migliore visibilità a chi è dietro (nella formazione).&lt;br /&gt;
Altruismo, coraggio, spingere oltre il limite, difendere al posto di un altro, migliorare posizione per avere bonus. Mosse da usare in condizioni psicologiche idonee: mosse estreme per disperazione, bonus unici. Condizioni per situazioni: blocco, spalle al muro, stritolato, confuso, semi parassiti addosso, azzoppato, bagnato d’acqua, lame affilate, corazza indurita, tante copie di me stesso attive, preveggente. Per ambiente:pioggia (torrenziale), barriera a cupola, punte metalliche a terra, blocco di fumo nero. Far volare un avversario/alleato. Tutti possono fare tutto sotto effetti magici o fisici. Un cavallo può volare se viene preso da un uccello e portato in alto.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 3, 4:'''&lt;br /&gt;
&lt;br /&gt;
Gioco1,2,3,4: tutto caricato su wikis.&lt;br /&gt;
&lt;br /&gt;
Gioco3: Mosse con caricamento + spostamento (es. kameamea con teletrasporto). Ciclo di interazione principale:crea o combatti. Modalità campagna, che chiede in input da che battaglia iniziare, ma implica tipi battaglie prefissati. Alla morte/sconfitta di un personaggio si possono alterare statistiche (es personaggio può cambiare fazione). Alcune mosse possono lasciare oggetti sul terreno: (ad es, radici di Groth). Ogni oggetto può alterare le statistiche al passaggio sopra, nelle vicinanze. Boolean invisibile per personaggio, diverso da elusione infinita. Se personaggio va in un altro dimensione -&amp;gt; unreachable. Attacco coordinato, se non lo fanno tutti vale lo stesso ma depotenziato opportunamente . Personaggio in modalità maniac (2 mosse per turno) e in modalità depressive (1 mossa ogni due turni); personaggio Flash può fare 10 mosse in un turno. Chiudi con lucchetto oggetto da dentro o da fuori, oggetto ingresso in oggetto casa , più ingressi per un singolo oggetto.nicole aniston. Rimbalzo se ci si schianta contro oggetto da calcolare con parametro. Ryuk e Darkrai.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gioco 4 23/07/2019:&lt;br /&gt;
Pula fiction, aracnidi, oggetto: due superfici rettangolari di forma diversa, anche inclinate , collegate. Più pezzi collegati tra loro per forme cilindriche cave, ad esempio, tipo vulcano. Mappa con sprite personaggi, canvas: anche mouseClick? Statistiche con nome gerarchico, es pokemon_attacco. Modalità survival, stile isola di jurassic park gdr; sia in coop che contro; possibilità di fare N turni di fila se non ci sono altri player giocanti nelle vicinanze (ciò però comporterebbe , in modalità contro , di capire quando c’è qualcuno nelle vicinanze perché si andrebbe di 1 turno alla volta, soluzioni: in mod contro 1 turno per volta oppure meccanismo di sincronizzazione turni quando uno vede l’altro (anche furtivo) come c’è attacco 1 turno a testa) .. analogo a Battle royale(?); inizio con starter kit random. Modalità assedio al castello. Inoltre se posso fare N turni di fila si può pensare a più pc , uno per persona , coordinati per fare comandi in parallelo, ma va ben congegnato meccanismo di sincronizzazione. Parti DelCorpo -&amp;gt; Componente/i oppure Parte. La mappa deve essere (x,y); l’altezza viene indicata onMouseOver certi pixel dove è posto il Personaggio; se personaggio dentro edificio/grotta cambio img (es sfocato/tratteggiato). Mosse: astrarre per target; molte mosse sono simili tra loro, somiglianza va sfruttata, hanno magari dei target in comune, o variano solo per un parametro. Creare mappa anche con drag and drop immagini ?(un po’ difficile). Più layout per interfaccia grafica (esempio uno che mostra errori input su text area, uno con alert, uno su box text area separato). Input comandi consumato pezzo per pezzo, alcune parole se prevedono parametri quando riconosciute fanno fetch anche di parola (numero) successiva. Face toon foto? Import parziali di personaggi (tutto tranne/solo questi campi specificati). Texture mappa complete o ripetibili (es per suolo). Anteprima battaglia stile battaglia pokemon (magari per 1/2/3 vs 1/2/3) per rappresentare scontro. Conviene usare xslx (excel) per dati, considerare che può non servire la libreria Java per leggere stringhe per operazioni. Mossa “again” , ripeti la precedenza(opportuna modifica parametri, es mossa spostamento). Possibile gestione contromosse: si usano marker (tag): ogni mossa ha elenco tag del tipo di contromosse che può subire (con probabilità annessa, che può dipendere da pg che subisce mossa congiuntamente a mossa stessa). Ogni mossa inoltre deve essere taggata come possibile contromossa che il pg può usare (per schivare può fare in più modi). A seconda del lancio del dado il pg che effettua La contromossa può anche scegliere tipologia di contromossa o solo la mossa della tipologia che ha beccato (entrano in gioco riflessi ect.). I parametri che fanno attivare unq o un’altra contromossa sono dinamici, posso dipendere ad esempio dalla posizione tra i due pg o altre statistiche. Tag contromosse a fasce (es. coprirsi è sempre più facile che schivare che e più facile di schivare e contrattaccare (?); all’interno dello stesso schivare e contrattaccare ci sono più sotto categorie). Per aggiunta personaggio può essere utili interfaccia dedicata, non linea di comando (o altre operazioni, specie se ci sono tabelle). Mossa “premonizione”: predire il futuro a breve termine, dici che mossa vorresti fare e ti dice esito (o più esiti se uno chiede più mosse). Funziona solo sulla prossima mossa. Contromossa delle contromossa gestione?? Eventualmente nell’esito si prevede ancore contro-contromossa. Ma si innesca reazione a catena, inoltre da gestire scelta contromossa in questo caso. Applicazione tag conoscenza(universo di appartenenza): “Termoli”, “pokemon”, “liceo classico Termoli”, anche gerarchici, per filtrare sui personaggi.target componibili , fattorizzato creazione mosse, hanno un costo magari per indicare quantovoccupano dicuna mossa, relativo maybe a un parametro o più del target stesso. In particolare, non saranno salvate le mosse per un personaggio (o solo alcune “preferite”) ma il suo insieme di target i quali devono dire:statistica che influenzano, “costo del turno” che richiedono al variare dell’intensità del target (che aumenta linearmente, esponenzialmente, generica f(x)) quindi corsa blanda costo 1 , Max corsa costo 5 (max), elenco (string) target incompatibili con tale target (se serve), nota relative ad es per quando uno vuole creare una mossa durante la battaglia (“target corsa, max sforzo dedicabile 4 ect” metti “50 metri corsa” “ok/troppo! Vuoi sforzati di più rischiando effetti collaterali?”). Si può autoscrivere la voce narrante del gioco come “la tua coscienza” mentre che giochi, d’altronde si interagisce con essa. Considerare che un target può appartenere a più personaggi, magari sotto nomi di mosse diversi.&lt;br /&gt;
Definire gerarchia di personaggi per template (tipo classe e super classe) e template importabili (tipo usa fuoco). Es umanoide non umanoide, tra umanoide maschio- femmina etc. Classe che estende System.out per creare funzioni che aggiungono Header “DEBUG:” etc; due programmi Java , due main: uno delegato a calcoli + gestione Excel; altro legge stdout dell altro per interfaccia grafica. Per allenare PG creare dei PG fantocci con label per fare Q-learning iniziale, più avanti far allenare pg tra loro; creare vari fantocci: tank terrestre fisico, healer volante etc. Excel: si usa css che si può rendere tabellare, più facile da trattare nel codice rispetto a .xslx. Ogni “utente” ed Lostefra ha il suo personale dizionario con sue personali short cut da usare in partita, eventuale login con password (opzionale) x accesso. Vedere license show down. Mappa unica stile giochi di ruolo, si vede tutto da sopra: click o simili su edifici/caverne per mappe interne a tale posto, così ok sprite e per rappresentare “pg in volo” sprite dedicato. Densità aria per dire quando anche un uomo per es può volare. Ipotesi più efficiente per dare un valore stima al pg: AI base che gioca a manetta contro altre AI base e dalle vittorie si fa l’euristica, più vittoria facile/veloce/stracciante più punti, contro vari pg, contro pg standard bench mark.&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Note&amp;diff=187</id>
		<title>Note</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Note&amp;diff=187"/>
		<updated>2020-03-05T10:47:53Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: /* Deploy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Note ==&lt;br /&gt;
&lt;br /&gt;
'''Vedere altre note su fogli di carta e promemoria del telefono. Ce ne sono molte.'''&lt;br /&gt;
'''La copiatura dai fogli di carta dei continuare da pagina 4 (&amp;quot;alterare param..&amp;quot;).'''&lt;br /&gt;
&lt;br /&gt;
===Inspirational Concepts===&lt;br /&gt;
* Gioco Lotta (Pokémon, Pokkén)&lt;br /&gt;
* no caselle esplicite&lt;br /&gt;
* Descrizione rispetto a: ambiente, nemico, oggetti&lt;br /&gt;
* pokémon, DnD, Call of Duty, Super Smash Brawl, corse pazze&lt;br /&gt;
* concentrarsi su: fluidi, telecinesi, razze, bonus/malus, gradi di libertà (fisicamente parlando) &lt;br /&gt;
* scacchi (es. crea casella), shaolin showdown&lt;br /&gt;
* prevedere = creatività&lt;br /&gt;
* acqua, aria, fuoco, terra&lt;br /&gt;
* gravità (newton), verso alto, basso, destra, sinistra, circolare, tutti i versi&lt;br /&gt;
* jumanji, savana, animali, zoologia&lt;br /&gt;
* tempo/spazio&lt;br /&gt;
* BF4, pirati, roma (imperium civitas)&lt;br /&gt;
* musica come arma (rap)&lt;br /&gt;
* magia, prestigiatori&lt;br /&gt;
* dinosauri (documentario, libro, zoologia)&lt;br /&gt;
* avengers, supereroi (libro)&lt;br /&gt;
&lt;br /&gt;
* Looney toons&lt;br /&gt;
&lt;br /&gt;
===Personaggi (con statistiche e stati)===&lt;br /&gt;
* combattenti (con statistiche e stati)&lt;br /&gt;
* immagine rappresentativa per rappresentare meglio&lt;br /&gt;
* HP: colore rosso su immagine personaggio, dove sei debole/già colpito (idea scartata)&lt;br /&gt;
* penitenza: il malus può essere inteso come ciò che c'è nell'inserimento successivo, malus cumulativo&lt;br /&gt;
* essere ipocrita, finzione (schermo)&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (personaggi)&lt;br /&gt;
* metamorfosi&lt;br /&gt;
* alchimisti&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* possibilità giù in terra/ giù in acqua, con reachable e unreachable Boolean. Fuori da mappa anche reachable e unreachable.&lt;br /&gt;
* Personaggi composti di parti[] es. testa, busto, gambe, braccia, coda, pinna, ali. Distinzione per arto di movimento e/o spostamento boolean.&lt;br /&gt;
* Arti possono provocare danno, bruciatura , paralisi a contatto (Boolean) . Percentuale di probabilità accompagna ogni Boolean.&lt;br /&gt;
* Ogni parte del corpo punti vita + se inutilizzabile + amputata + stato (es paralisi).&lt;br /&gt;
* Per fare battaglie tra molto grandi =&amp;gt; 1 m lo si intende come 10m.  (rivalutato, aumentare livello scaling)&lt;br /&gt;
* Personaggio fusionabile Boolean + string nomi con cui si fonde.&lt;br /&gt;
* Distinzione tra infernape e infernape1/2/3 ect tra “specie” e “nome”.&lt;br /&gt;
* variabile Boolean respawnable.&lt;br /&gt;
* Raccogliere a piene mani da: https://spore.fandom.com/wiki/Creature_Editor&lt;br /&gt;
* Ad esempio weapons come elemento di Corpo (zanne, corna) e possibilità di muoversi/attaccare furtivamente.&lt;br /&gt;
* Divisibile e unibile come boolean e array di stringe associate per indicare i nomi con cui si unisce il Personaggio o in cui si divide.&lt;br /&gt;
* Variabili posizione nome: from_x/y ; to_x/y.&lt;br /&gt;
* Classe Stato, Personaggio contiene Array di stato, stato contiene moltiplicatori per statistica es attacco velocità precisione elusione ect.&lt;br /&gt;
* Personaggio deve avere una stat tipo sanità mentale, intelligenza, quanto è confuso e quanto è impaurito (2).&lt;br /&gt;
&lt;br /&gt;
* Per personaggi molto piccoli (meno di 1m x 1m x 1m) possibilità di essere in (x,y,z) tra 0 e 1.000.000 (ordine del micrometro, 1*10^-6 == 0,000001) e avere (lenX, lenY, lenZ). In questo modo sono definite dimensioni inferiori ad 1 m^3.&lt;br /&gt;
* personaggi max 20x20 (rivaluato, meno limitata)&lt;br /&gt;
&lt;br /&gt;
===Mosse===&lt;br /&gt;
* &amp;quot;combattimento prescinde da combattente&amp;quot;&lt;br /&gt;
* mosse hanno: direzione, azione, attacco (mosse pokémon)&lt;br /&gt;
* Parametri interi per mossa (direzione, consumabili) con lower e upper bound&lt;br /&gt;
* camuffarsi =&amp;gt; DnD manuale&lt;br /&gt;
* wrestling (libro) per le mosse/prese&lt;br /&gt;
&lt;br /&gt;
* X fa una mossa contro Y: Z potrebbe reagire (Es. ricevendo il colpo al posto di Y). Può essere realizzato sia come se &amp;quot;Y chiede soccorso Z&amp;quot; o come reazione di alleati adiacenti &amp;quot;Z soccorre Y&amp;quot;&lt;br /&gt;
* Mossa prende come parametro di ingresso Corpo, ossia la parte del corpo coinvolta nella mossa (es arto , tutto corpo ect). &lt;br /&gt;
&lt;br /&gt;
===Oggetto (con statistiche e stati)===&lt;br /&gt;
* armi: lacci (stati), lame (potenze), sassi, reti, pistole (munizioni), razzi, bombe (potenze), fuoco (d'artificio?) =&amp;gt; manuale DnD&lt;br /&gt;
* veleno n modi =&amp;gt; DnD manuale&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (oggetti)&lt;br /&gt;
* automezzi con cannoni, variabile 'hasEntrata', 'tempoRiutilizzo'&lt;br /&gt;
* violino come arma (tutti strumenti musicali): a fiato, a corda, a percussione&lt;br /&gt;
* veleni, ampolle e flaconi magici, insieme di 'oggetti dentro' un oggetto&lt;br /&gt;
&lt;br /&gt;
* Classe oggetto: es albero, roccia, casa: forza necessaria per sradicare + forza per lanciare + destrezza / agilità per appendersi + nascondersi in proporzione alle dimensioni di chi si nasconde. &lt;br /&gt;
* Altri es. pali. Sotto terra o sotto acqua/lava/melma o simili. &lt;br /&gt;
* Acqua rallenta se non hai pinne boolean.&lt;br /&gt;
* Classe strumento per oggetti che si tengono in mano, es reti , pistole, spade, pugnali, scudi, elmi, lancia, arco , frecce, lanciarazzi, fucili cecchino, fucile assalto, corde.&lt;br /&gt;
* Strumenti e mosse: danno ad area, perforante, contundente (vedi dnd armi). Mosse possono creare/modificare/distruggere oggetti e strumenti.&lt;br /&gt;
* Oggetti del campo di gioco incidono su elusione (parametro di personaggio).&lt;br /&gt;
* Buco/abisso (boolean) per dire se c’è o meno il suolo (Suolo come classe?). &lt;br /&gt;
* Radiazioni. &lt;br /&gt;
&lt;br /&gt;
===Modalità gioco===&lt;br /&gt;
* turnazione&lt;br /&gt;
* 1 v 1 v 1 etc., ma anche squadre casuali&lt;br /&gt;
* punteggio: chi fa più punti, più uccisioni, definizione di 'punto', gioco per perdere&lt;br /&gt;
* inserisci personaggio total random&lt;br /&gt;
&lt;br /&gt;
* Modalità battaglia con interazione stile battaglia navale (non si vede mossa dell'avversario)&lt;br /&gt;
* Modalità di gioco: tutti contro tutti (battle royale), death match, vs CPU mode zombie(attaccano solo, se non possono vanno verso nemico): serve introdurre un punteggio, di sicuro per mode zombie , ma anche per death match e tutti contro tutti&lt;br /&gt;
* ingressi: ne entra un altro?&lt;br /&gt;
&lt;br /&gt;
===Mappa===&lt;br /&gt;
* arene&lt;br /&gt;
* minimappa (pixelata ?), legenda oggetti base, devono esserci caselle implicite&lt;br /&gt;
* mappa 100x100 (rivalutato, meno limitata)&lt;br /&gt;
* Cannoni fissi in mezzo al campo (strumento).&lt;br /&gt;
&lt;br /&gt;
===Funzionalità generali===&lt;br /&gt;
* &amp;quot;meno tabelle&amp;quot;, &amp;quot;no bottoni&amp;quot; e solo foto che si alternano, &amp;quot;la grafica serve&amp;quot;: text box unica interazione, text area (history), immagine personaggio e immagine mappa&lt;br /&gt;
* &amp;quot;persistenza anche da interfaccia grafica&amp;quot;, diritti di scrittura sui file?&lt;br /&gt;
* Segnalazione (comando per fare nota)&lt;br /&gt;
&lt;br /&gt;
===Deploy===&lt;br /&gt;
* &amp;quot;commenta il codice&amp;quot;, &amp;quot;dividi et impera&amp;quot;&lt;br /&gt;
* JAVA: Class.forName(&amp;lt;name&amp;gt;.class).newInstance();&lt;br /&gt;
* Server web (Apache Tomcat) ospita partite (+ localmente ha i file di funzionamento), in LAN client giocano. Interfaccia HTML5 + Javascript per giocare. Scalabile per futuro, basta offrire servizio su un ip pubblico. Studiare engine grafici Javascript&lt;br /&gt;
* rpgmaker, godot, aseprite, pixelart (in generale), ma anche phaser, piskel&lt;br /&gt;
&lt;br /&gt;
===Copia&amp;amp;incolla generale, da smistare in sotto capitoli. Contiene anche '''tutte''' note del telefono (al 22/02/2020)===&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 1:'''&lt;br /&gt;
&lt;br /&gt;
Mosse che trasformano l’avversario: attenzione è una mossa devastante. Trasformazione totale o parziale. Si devono poter aggiungere mosse, strumenti dinamicamente. Battle bot:ribaltano, scintille, elementi (Oggetti) che danneggiano. One piece: I frutti del diavolo (悪魔の実 Akuma no mi?) sono frutti misteriosi che donano poteri soprannaturali a chi li mangia, rendendoli però incapaci di nuotare. Di conseguenza il contatto con l'acqua di mare o con una speciale sostanza conosciuta come agalmatolite indebolisce gli utilizzatori di frutti del diavolo e li priva dei loro poteri. Alcune persone sono inoltre in grado di ricorrere all'Ambizione (覇気 Haki?), una forza spirituale che permette di avvertire la presenza di altri esseri viventi e di predirne i movimenti, di irrobustire parti del corpo e di intimidire o fare svenire le creature con una debole forza di volontà. Personaggio ha funzione baricentro_x, baricentro_y calcolate come (from_x+to_x)/2 sul quale si basa la funzione di libreria getDistance(Personaggio A, Personaggio B, float success); tale funzione serve per calcolare per i PNG e per i PG se ha senso usare una mossa. Non-onniscienza: delle volte non si può sapere distanza avversario e fallisce la mossa per la distanza -&amp;gt; “float success” rappresenta la probabilità di successo (Personaggio ha parametro “osservare”). PNG di due categorie: offensivi o neutrali (no priorità a mosse di attacco, ma tutto casuale). Mosse e oggetti per chiamare Personaggi, magari non necessariamente alleati (2 mosse e 2 oggetti quindi necessari), richiamo di un personaggio preciso o di uno a caso. Ogni mossa/azione deve avere un tempo di attesa espresso in turni (alla meglio 0) per poter ripetere la mossa/azione. Strumenti anche mezzi di trasporto di aria, di terra, di acqua (o lava/palude). Possono attivare una metamorfosi / Unione per cambiare stats personaggio. Veicoli con armi o riparo. Gli strumenti da trattare come gli oggetti. Classe unica? I match/partite (immagino Classe Partita) devono avere variabile boolean “respawn”, per distinguere death match a punti con death match con una vita. Wrestling per ispirarsi nella lotta libera: calci pugni ginocchiate prese lanci salti testate gomitate ecc. Per punti si vince a un limite o dopo un tot di mosse , oppure al primo dei due raggiunti (max_punti e max_mosse parametri di Partita). I punti si guadagnano alla kill (un Punteggio per squadra, int punteggio salvato localmente dentro ogni Personaggio che ha la variabile int squadra). Si guadagnano tanti punti quanti sono i punti della variabile “valore” del personaggio ucciso, tale variabile è calcolata come somma dei valori di tutte le mosse/stats ect del Personaggio. Imperium civitas. Attacco dei giganti. Possibilità di morire se colpiti in un unico punto (tallone d Achille) implementabile come variabile boolean. Jump force. Game dev tycoon. Acqua diventa tsunami. Variabile int per attacco cumulativo di gruppo: es calciatori che più si passano la palla più l’attacco è forte. Suolo magico: non tutti i personaggi possono accedervi, array di string elenca i nomi di chi può accedervi. Funzione esci/entra in classe Personaggio per simulare scambio pokemon 6vs6. Piovra gigante. Rischio=danno*probabilita. Mossa su strumento e con strumento?&lt;br /&gt;
Mosse fisiche per arrampicarsi su avversario(se e solo se sei la metà di dimensioni(?)), atterrarlo, lanciarlo, accecarlo, immobilizzarlo. Se sei in gruppo/ orda bonus ad attacchi combinati. Armi: fruste e scheggie, corni che si suonano per chiamare altri. Tipo della mossa con moltiplicatore tra 0 (immune) e 2 (float): acqua, fuoco, magia, terra: da ispirarsi ai pokemon ma non da copiare, penso. Armi da campo: cannoni e catapulte. Veicoli d’acqua: moto acqua, canoe, barche a motore a remi. Nei veicoli malus su attenzione (variabile int in personaggio, indica attenzione in combattimento e non in altro) perché si è impegnato alla guida . All’inizio in image view “the hero” e “the map”. Condizione vittoria (oltre a morte, punti, o numero mosse, cioè tempo) morte di un singolo Personaggio, che potrebbe rappresentare un edificio, cassaforte o simili. Personaggio si può svestire e lasciare strumenti, modificano statistiche di attacco, difesa , agilità, ect. Variabile luce o non luce, che peggiora/migliora a seconda della specie la visibilità, quindi la precisione , specie in attacchi a distanza: Scurovisione evita i malus.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 2:'''&lt;br /&gt;
&lt;br /&gt;
Gioco2: se ci si lancia da oggetti , dopo essersi arrampicati, possono esserci danni da caduta; strumenti come paracaduti o mosse magiche possono evitare i danni. Pozione del vento, soffi e devi attacchi. In difesa puoi parare, schivare, deviare: tre variabili? Ambiente: colline e pianure uguali, Monti sono Oggetti, picco ossia un unico monte oggetto. Rocce volanti, nuvole sospese: oggetto può essere sospeso e può fare periodicamente una mossa, ad es tuono, può spostarsi, può fare entra/esci, oggetto albero e oggetto foresta, si possono prendere, nascondersi, arrampicarsi, lanciarli, ostacolano velocità ma se si ha abbastanza forza si spezzano alberi. Acqua poco profonda, profonda, molto profonda: variabile boolean in Personaggio “alto” per toccare in acqua profonda, con acqua si generano fiumi laghi e mari. Ambiente si deve poter evolvere: ad esempio oggetto diga può fare metamorfosi e diventare oggetto cascata/torrente in piena. Per edifici più oggetti che rappresentano le mura e il tetto, variabile boolean per oggetto per entrare nell’oggetto. Possono essere spazzati via: danni da crollo, si può combattere all interni, contengono strumenti come tavoli sedie mobili letto ect. Se uno viene schiantato contro uno strumento prende danno(es danno da schianto). Ci possono essere scale, si può non avere contatti visivo sull’avversario. Oggetto mura, oggetto torre, oggetto casa interno sono cose distinte: possono dare malus/bonus su visibilità. Ambiente: pozzi e grotte, da gestire come interno casa. Lava come acqua, ogni oggetto può essere sorgenti di liquido: monte sorgente acqua, vulcano sorgente lava. Può esserci variabile probabilità eruzione, se settata a 1 c’è una continua eruzione. Strade di vario tipo, sovrapposta a altri suoli, migliorano velocità di alcuni strumenti, variabile boolean “ha le ruote” in classe strumenti. Unificare classe strumento e classe oggetto. Oggetti sospesi: case sospese su albero, ad es. Fiamme in mezzo al suolo. Oggetti: porto, aereoporto, grattacieli, dighe, impianti a fune, ospedali per curarsi e prendere oggetti per curarsi dopo, scuole contenenti libri per apprendere una mossa, luoghi di ingegneria per creare oggetti, ad esempio veicoli o armi, soldi nel gioco per comprare da eventuali venditori. Ogni oggetto avra un prezzo (valutabile circa in euro per semplicità). Variabile float per fame, sete, sonno, caldo-freddo (parte da 0.5). Nella mappa ci deve essere per ogni punto la temperatura. Possibilità di vomito, dissenteria, problemi cardiaci, respiratori, muscolari. Armi: balestra, mani nude, sasso, tirapugni, torcia accesa. Armature: intralciano o favoriscono agilità, attacco, poteri magici, rumorosa (elusione), è uno strumento/oggetto. Attacchi possono essere prolungati per turni, mosse variabile boolean prolungabile: può aumentare o diminuire intensità, c’è un max espresso in turni di prolungabilita, inoltre può essere leggermente alterato con una variabile casuale. Equipaggiamento (strumento/oggetto): pietra focaia, attrezzi da scalata, boccale di birra, cavallo, moto, chiodi, martello da fabbro, corda, corazza, dardo, faretra/zaino/sacca (oggetti che contengono una lista di oggetti, stringhe) con un numero per la quantità) e capacità massima zaino e ogni oggetto può avere un valore intero per dimensione (es martello 3, ascia grande 7), mantello, olio, variabile boolean prende fuoco/conduce elettricità, amplifica magnetismo, aumenta esplosioni nucleari, aumenta forza di gravità (?), pala, piccone, rampino, specchio, per osservare quando si è nascosti e si ha malus su visibilità. Strumenti da scasso per aprire porte: variabile boolean per oggetti: entrata con scasso. Personaggio: string razza per swag, immunità a veleni e malattie, elusione, agilità, precisione, abilità magiche(?), difesa fisica. In ultima torcia: agilità, coraggio, forza, intelligenza, magia, manualità, percezione, socialità. Bestiario: aracnoide di varie dimensioni, talpe giganti, vermi giganti di terra di mare e di lava ect, bulbo trascinatore che ha tentacoli per tirare a se e mangiare, lui è immobile, calabrone gigante, serpenti giganti, cinghiali, draghi, elfi, goblin e re goblin, sciamani (goblin), totem di guerra come strumento/oggetti per alterare statistiche nella loro area di influenza, lupo, mastino bruciante, nani, non morti/zombie/mummia/scheletro variabile boolean vivo a false ma ha ancora hp su parti del corpo: variabile boolean “zombizabile”. Orchi, pesci da terra (anfibi) tritone dell abisso, troll e trollin (orchi più deformi), umani. Abilità dei personaggi in ultima torcia: artificiale (robot) immunità a soffocamento, veleni, malattie ect immune a manipolazioni psichiche, visione oscurità; danno da attacco in carica; fiammegiante ossia la creatura può incendiarsi e elettrizzante ossia può diventare elettrica caricamente; modalità furia/mailmen ossia ottiene bonus su alcune/tutte le statistiche; gigantesco o molto piccolo due boolean (?forse non serve); immunità a magie mentali, al fuoco; linguaggi (?); non morto; danno da attacco in presa; pungiglioni velenosi; sa muoversi su ragnatele o è rallentato, resistenza a perforazione, respirare sott’acqua o sotto lava o nei liquidi in genere; rigenerazione; riceve danni dalla luce solare o da assenza di luce; è terrorizzato/impaurito/intimidito o se è imperturbabile boolean. Danno da trascinamento; paralizzante; può diventare più veloce (?non serve); visione a infrarossi attraverso oggetti; volare o andare sotto terra. Imperium editor, cose che penso di non aver ancora scritto: stagioni, suolo erboso o terriccio, sabbia con erba e terra e da sola, strade e stagioni, altitudine, alberi e arbusti, vari tipi a foglia larga, conifere, alberi secchi, palme, arbusti verdi e secchi, cactus, alghe marine, rocce e pietre, scheletri per terra, legna tagliata (alberi tagliati), carri e carretti, grotte e rovine per accessi sotterranei, locande, templi, accampamenti, fortini, monoliti, fontana, tombe e cimiteri, borse per terra, pozzo, troni, croci(del teschio), pozzo, capanne, lapidi, ponti, recinzioni, falò, tende, torri, panoplia, fessure come abissi, statue, rovine (deserto) come case distrutte, colonne per costruire templi, piramidi, sfingi, bandiere, rovine in Europa, campi coltivati che contengono cibo, fiamma (in altre), roccia in altre per montagne, altre-&amp;gt;rovine per monumenti non egiziani ma europei.&lt;br /&gt;
Ci sono paludi. Tende da campo. Forti, porti. Edifici delle fortezze, edifici dei villaggi. Naufragi e scogli.&lt;br /&gt;
Parametri voglia/impegno float per descrivere voglia di combattere Personaggio. Ricevi danno uscendo dalla mappa tra 1-5% tra 6-10% tra 11-15% della vita totale di ogni parte del corpo per ogni turno di gioco. Danno da precipitazione diverso da carica, uno verticale uno orizzontale, se precipiti da molto in alto hai bonus, oltre che danni da schianto lol. Baionette, formazione a blocchi, a quadrato (difensiva) sparano su quattro lati, a schiera vanno avanti. Usano un colpo poi lunga ricarica. Variabile boolean per attivare o meno fuoco amico. Azione per cambiare posizione: in piedi, in ginocchio(inteso come via di mezzo), sdraiato: per permettere migliore visibilità a chi è dietro (nella formazione).&lt;br /&gt;
Altruismo, coraggio, spingere oltre il limite, difendere al posto di un altro, migliorare posizione per avere bonus. Mosse da usare in condizioni psicologiche idonee: mosse estreme per disperazione, bonus unici. Condizioni per situazioni: blocco, spalle al muro, stritolato, confuso, semi parassiti addosso, azzoppato, bagnato d’acqua, lame affilate, corazza indurita, tante copie di me stesso attive, preveggente. Per ambiente:pioggia (torrenziale), barriera a cupola, punte metalliche a terra, blocco di fumo nero. Far volare un avversario/alleato. Tutti possono fare tutto sotto effetti magici o fisici. Un cavallo può volare se viene preso da un uccello e portato in alto.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 3, 4:'''&lt;br /&gt;
&lt;br /&gt;
Gioco1,2,3,4: tutto caricato su wikis.&lt;br /&gt;
&lt;br /&gt;
Gioco3: Mosse con caricamento + spostamento (es. kameamea con teletrasporto). Ciclo di interazione principale:crea o combatti. Modalità campagna, che chiede in input da che battaglia iniziare, ma implica tipi battaglie prefissati. Alla morte/sconfitta di un personaggio si possono alterare statistiche (es personaggio può cambiare fazione). Alcune mosse possono lasciare oggetti sul terreno: (ad es, radici di Groth). Ogni oggetto può alterare le statistiche al passaggio sopra, nelle vicinanze. Boolean invisibile per personaggio, diverso da elusione infinita. Se personaggio va in un altro dimensione -&amp;gt; unreachable. Attacco coordinato, se non lo fanno tutti vale lo stesso ma depotenziato opportunamente . Personaggio in modalità maniac (2 mosse per turno) e in modalità depressive (1 mossa ogni due turni); personaggio Flash può fare 10 mosse in un turno. Chiudi con lucchetto oggetto da dentro o da fuori, oggetto ingresso in oggetto casa , più ingressi per un singolo oggetto.nicole aniston. Rimbalzo se ci si schianta contro oggetto da calcolare con parametro. Ryuk e Darkrai.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gioco 4 23/07/2019:&lt;br /&gt;
Pula fiction, aracnidi, oggetto: due superfici rettangolari di forma diversa, anche inclinate , collegate. Più pezzi collegati tra loro per forme cilindriche cave, ad esempio, tipo vulcano. Mappa con sprite personaggi, canvas: anche mouseClick? Statistiche con nome gerarchico, es pokemon_attacco. Modalità survival, stile isola di jurassic park gdr; sia in coop che contro; possibilità di fare N turni di fila se non ci sono altri player giocanti nelle vicinanze (ciò però comporterebbe , in modalità contro , di capire quando c’è qualcuno nelle vicinanze perché si andrebbe di 1 turno alla volta, soluzioni: in mod contro 1 turno per volta oppure meccanismo di sincronizzazione turni quando uno vede l’altro (anche furtivo) come c’è attacco 1 turno a testa) .. analogo a Battle royale(?); inizio con starter kit random. Modalità assedio al castello. Inoltre se posso fare N turni di fila si può pensare a più pc , uno per persona , coordinati per fare comandi in parallelo, ma va ben congegnato meccanismo di sincronizzazione. Parti DelCorpo -&amp;gt; Componente/i oppure Parte. La mappa deve essere (x,y); l’altezza viene indicata onMouseOver certi pixel dove è posto il Personaggio; se personaggio dentro edificio/grotta cambio img (es sfocato/tratteggiato). Mosse: astrarre per target; molte mosse sono simili tra loro, somiglianza va sfruttata, hanno magari dei target in comune, o variano solo per un parametro. Creare mappa anche con drag and drop immagini ?(un po’ difficile). Più layout per interfaccia grafica (esempio uno che mostra errori input su text area, uno con alert, uno su box text area separato). Input comandi consumato pezzo per pezzo, alcune parole se prevedono parametri quando riconosciute fanno fetch anche di parola (numero) successiva. Face toon foto? Import parziali di personaggi (tutto tranne/solo questi campi specificati). Texture mappa complete o ripetibili (es per suolo). Anteprima battaglia stile battaglia pokemon (magari per 1/2/3 vs 1/2/3) per rappresentare scontro. Conviene usare xslx (excel) per dati, considerare che può non servire la libreria Java per leggere stringhe per operazioni. Mossa “again” , ripeti la precedenza(opportuna modifica parametri, es mossa spostamento). Possibile gestione contromosse: si usano marker (tag): ogni mossa ha elenco tag del tipo di contromosse che può subire (con probabilità annessa, che può dipendere da pg che subisce mossa congiuntamente a mossa stessa). Ogni mossa inoltre deve essere taggata come possibile contromossa che il pg può usare (per schivare può fare in più modi). A seconda del lancio del dado il pg che effettua La contromossa può anche scegliere tipologia di contromossa o solo la mossa della tipologia che ha beccato (entrano in gioco riflessi ect.). I parametri che fanno attivare unq o un’altra contromossa sono dinamici, posso dipendere ad esempio dalla posizione tra i due pg o altre statistiche. Tag contromosse a fasce (es. coprirsi è sempre più facile che schivare che e più facile di schivare e contrattaccare (?); all’interno dello stesso schivare e contrattaccare ci sono più sotto categorie). Per aggiunta personaggio può essere utili interfaccia dedicata, non linea di comando (o altre operazioni, specie se ci sono tabelle). Mossa “premonizione”: predire il futuro a breve termine, dici che mossa vorresti fare e ti dice esito (o più esiti se uno chiede più mosse). Funziona solo sulla prossima mossa. Contromossa delle contromossa gestione?? Eventualmente nell’esito si prevede ancore contro-contromossa. Ma si innesca reazione a catena, inoltre da gestire scelta contromossa in questo caso. Applicazione tag conoscenza(universo di appartenenza): “Termoli”, “pokemon”, “liceo classico Termoli”, anche gerarchici, per filtrare sui personaggi.target componibili , fattorizzato creazione mosse, hanno un costo magari per indicare quantovoccupano dicuna mossa, relativo maybe a un parametro o più del target stesso. In particolare, non saranno salvate le mosse per un personaggio (o solo alcune “preferite”) ma il suo insieme di target i quali devono dire:statistica che influenzano, “costo del turno” che richiedono al variare dell’intensità del target (che aumenta linearmente, esponenzialmente, generica f(x)) quindi corsa blanda costo 1 , Max corsa costo 5 (max), elenco (string) target incompatibili con tale target (se serve), nota relative ad es per quando uno vuole creare una mossa durante la battaglia (“target corsa, max sforzo dedicabile 4 ect” metti “50 metri corsa” “ok/troppo! Vuoi sforzati di più rischiando effetti collaterali?”). Si può autoscrivere la voce narrante del gioco come “la tua coscienza” mentre che giochi, d’altronde si interagisce con essa. Considerare che un target può appartenere a più personaggi, magari sotto nomi di mosse diversi.&lt;br /&gt;
Definire gerarchia di personaggi per template (tipo classe e super classe) e template importabili (tipo usa fuoco). Es umanoide non umanoide, tra umanoide maschio- femmina etc. Classe che estende System.out per creare funzioni che aggiungono Header “DEBUG:” etc; due programmi Java , due main: uno delegato a calcoli + gestione Excel; altro legge stdout dell altro per interfaccia grafica. Per allenare PG creare dei PG fantocci con label per fare Q-learning iniziale, più avanti far allenare pg tra loro; creare vari fantocci: tank terrestre fisico, healer volante etc. Excel: si usa css che si può rendere tabellare, più facile da trattare nel codice rispetto a .xslx. Ogni “utente” ed Lostefra ha il suo personale dizionario con sue personali short cut da usare in partita, eventuale login con password (opzionale) x accesso. Vedere license show down. Mappa unica stile giochi di ruolo, si vede tutto da sopra: click o simili su edifici/caverne per mappe interne a tale posto, così ok sprite e per rappresentare “pg in volo” sprite dedicato. Densità aria per dire quando anche un uomo per es può volare. Ipotesi più efficiente per dare un valore stima al pg: AI base che gioca a manetta contro altre AI base e dalle vittorie si fa l’euristica, più vittoria facile/veloce/stracciante più punti, contro vari pg, contro pg standard bench mark.&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Note&amp;diff=186</id>
		<title>Note</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Note&amp;diff=186"/>
		<updated>2020-03-04T17:59:31Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: /* Deploy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Note ==&lt;br /&gt;
&lt;br /&gt;
'''Vedere altre note su fogli di carta e promemoria del telefono. Ce ne sono molte.'''&lt;br /&gt;
'''La copiatura dai fogli di carta dei continuare da pagina 4 (&amp;quot;alterare param..&amp;quot;).'''&lt;br /&gt;
&lt;br /&gt;
===Inspirational Concepts===&lt;br /&gt;
* Gioco Lotta (Pokémon, Pokkén)&lt;br /&gt;
* no caselle esplicite&lt;br /&gt;
* Descrizione rispetto a: ambiente, nemico, oggetti&lt;br /&gt;
* pokémon, DnD, Call of Duty, Super Smash Brawl, corse pazze&lt;br /&gt;
* concentrarsi su: fluidi, telecinesi, razze, bonus/malus, gradi di libertà (fisicamente parlando) &lt;br /&gt;
* scacchi (es. crea casella), shaolin showdown&lt;br /&gt;
* prevedere = creatività&lt;br /&gt;
* acqua, aria, fuoco, terra&lt;br /&gt;
* gravità (newton), verso alto, basso, destra, sinistra, circolare, tutti i versi&lt;br /&gt;
* jumanji, savana, animali, zoologia&lt;br /&gt;
* tempo/spazio&lt;br /&gt;
* BF4, pirati, roma (imperium civitas)&lt;br /&gt;
* musica come arma (rap)&lt;br /&gt;
* magia, prestigiatori&lt;br /&gt;
* dinosauri (documentario, libro, zoologia)&lt;br /&gt;
* avengers, supereroi (libro)&lt;br /&gt;
&lt;br /&gt;
* Looney toons&lt;br /&gt;
&lt;br /&gt;
===Personaggi (con statistiche e stati)===&lt;br /&gt;
* combattenti (con statistiche e stati)&lt;br /&gt;
* immagine rappresentativa per rappresentare meglio&lt;br /&gt;
* HP: colore rosso su immagine personaggio, dove sei debole/già colpito (idea scartata)&lt;br /&gt;
* penitenza: il malus può essere inteso come ciò che c'è nell'inserimento successivo, malus cumulativo&lt;br /&gt;
* essere ipocrita, finzione (schermo)&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (personaggi)&lt;br /&gt;
* metamorfosi&lt;br /&gt;
* alchimisti&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* possibilità giù in terra/ giù in acqua, con reachable e unreachable Boolean. Fuori da mappa anche reachable e unreachable.&lt;br /&gt;
* Personaggi composti di parti[] es. testa, busto, gambe, braccia, coda, pinna, ali. Distinzione per arto di movimento e/o spostamento boolean.&lt;br /&gt;
* Arti possono provocare danno, bruciatura , paralisi a contatto (Boolean) . Percentuale di probabilità accompagna ogni Boolean.&lt;br /&gt;
* Ogni parte del corpo punti vita + se inutilizzabile + amputata + stato (es paralisi).&lt;br /&gt;
* Per fare battaglie tra molto grandi =&amp;gt; 1 m lo si intende come 10m.  (rivalutato, aumentare livello scaling)&lt;br /&gt;
* Personaggio fusionabile Boolean + string nomi con cui si fonde.&lt;br /&gt;
* Distinzione tra infernape e infernape1/2/3 ect tra “specie” e “nome”.&lt;br /&gt;
* variabile Boolean respawnable.&lt;br /&gt;
* Raccogliere a piene mani da: https://spore.fandom.com/wiki/Creature_Editor&lt;br /&gt;
* Ad esempio weapons come elemento di Corpo (zanne, corna) e possibilità di muoversi/attaccare furtivamente.&lt;br /&gt;
* Divisibile e unibile come boolean e array di stringe associate per indicare i nomi con cui si unisce il Personaggio o in cui si divide.&lt;br /&gt;
* Variabili posizione nome: from_x/y ; to_x/y.&lt;br /&gt;
* Classe Stato, Personaggio contiene Array di stato, stato contiene moltiplicatori per statistica es attacco velocità precisione elusione ect.&lt;br /&gt;
* Personaggio deve avere una stat tipo sanità mentale, intelligenza, quanto è confuso e quanto è impaurito (2).&lt;br /&gt;
&lt;br /&gt;
* Per personaggi molto piccoli (meno di 1m x 1m x 1m) possibilità di essere in (x,y,z) tra 0 e 1.000.000 (ordine del micrometro, 1*10^-6 == 0,000001) e avere (lenX, lenY, lenZ). In questo modo sono definite dimensioni inferiori ad 1 m^3.&lt;br /&gt;
* personaggi max 20x20 (rivaluato, meno limitata)&lt;br /&gt;
&lt;br /&gt;
===Mosse===&lt;br /&gt;
* &amp;quot;combattimento prescinde da combattente&amp;quot;&lt;br /&gt;
* mosse hanno: direzione, azione, attacco (mosse pokémon)&lt;br /&gt;
* Parametri interi per mossa (direzione, consumabili) con lower e upper bound&lt;br /&gt;
* camuffarsi =&amp;gt; DnD manuale&lt;br /&gt;
* wrestling (libro) per le mosse/prese&lt;br /&gt;
&lt;br /&gt;
* X fa una mossa contro Y: Z potrebbe reagire (Es. ricevendo il colpo al posto di Y). Può essere realizzato sia come se &amp;quot;Y chiede soccorso Z&amp;quot; o come reazione di alleati adiacenti &amp;quot;Z soccorre Y&amp;quot;&lt;br /&gt;
* Mossa prende come parametro di ingresso Corpo, ossia la parte del corpo coinvolta nella mossa (es arto , tutto corpo ect). &lt;br /&gt;
&lt;br /&gt;
===Oggetto (con statistiche e stati)===&lt;br /&gt;
* armi: lacci (stati), lame (potenze), sassi, reti, pistole (munizioni), razzi, bombe (potenze), fuoco (d'artificio?) =&amp;gt; manuale DnD&lt;br /&gt;
* veleno n modi =&amp;gt; DnD manuale&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (oggetti)&lt;br /&gt;
* automezzi con cannoni, variabile 'hasEntrata', 'tempoRiutilizzo'&lt;br /&gt;
* violino come arma (tutti strumenti musicali): a fiato, a corda, a percussione&lt;br /&gt;
* veleni, ampolle e flaconi magici, insieme di 'oggetti dentro' un oggetto&lt;br /&gt;
&lt;br /&gt;
* Classe oggetto: es albero, roccia, casa: forza necessaria per sradicare + forza per lanciare + destrezza / agilità per appendersi + nascondersi in proporzione alle dimensioni di chi si nasconde. &lt;br /&gt;
* Altri es. pali. Sotto terra o sotto acqua/lava/melma o simili. &lt;br /&gt;
* Acqua rallenta se non hai pinne boolean.&lt;br /&gt;
* Classe strumento per oggetti che si tengono in mano, es reti , pistole, spade, pugnali, scudi, elmi, lancia, arco , frecce, lanciarazzi, fucili cecchino, fucile assalto, corde.&lt;br /&gt;
* Strumenti e mosse: danno ad area, perforante, contundente (vedi dnd armi). Mosse possono creare/modificare/distruggere oggetti e strumenti.&lt;br /&gt;
* Oggetti del campo di gioco incidono su elusione (parametro di personaggio).&lt;br /&gt;
* Buco/abisso (boolean) per dire se c’è o meno il suolo (Suolo come classe?). &lt;br /&gt;
* Radiazioni. &lt;br /&gt;
&lt;br /&gt;
===Modalità gioco===&lt;br /&gt;
* turnazione&lt;br /&gt;
* 1 v 1 v 1 etc., ma anche squadre casuali&lt;br /&gt;
* punteggio: chi fa più punti, più uccisioni, definizione di 'punto', gioco per perdere&lt;br /&gt;
* inserisci personaggio total random&lt;br /&gt;
&lt;br /&gt;
* Modalità battaglia con interazione stile battaglia navale (non si vede mossa dell'avversario)&lt;br /&gt;
* Modalità di gioco: tutti contro tutti (battle royale), death match, vs CPU mode zombie(attaccano solo, se non possono vanno verso nemico): serve introdurre un punteggio, di sicuro per mode zombie , ma anche per death match e tutti contro tutti&lt;br /&gt;
* ingressi: ne entra un altro?&lt;br /&gt;
&lt;br /&gt;
===Mappa===&lt;br /&gt;
* arene&lt;br /&gt;
* minimappa (pixelata ?), legenda oggetti base, devono esserci caselle implicite&lt;br /&gt;
* mappa 100x100 (rivalutato, meno limitata)&lt;br /&gt;
* Cannoni fissi in mezzo al campo (strumento).&lt;br /&gt;
&lt;br /&gt;
===Funzionalità generali===&lt;br /&gt;
* &amp;quot;meno tabelle&amp;quot;, &amp;quot;no bottoni&amp;quot; e solo foto che si alternano, &amp;quot;la grafica serve&amp;quot;: text box unica interazione, text area (history), immagine personaggio e immagine mappa&lt;br /&gt;
* &amp;quot;persistenza anche da interfaccia grafica&amp;quot;, diritti di scrittura sui file?&lt;br /&gt;
* Segnalazione (comando per fare nota)&lt;br /&gt;
&lt;br /&gt;
===Deploy===&lt;br /&gt;
* &amp;quot;commenta il codice&amp;quot;, &amp;quot;dividi et impera&amp;quot;&lt;br /&gt;
* JAVA: Class.forName(&amp;lt;name&amp;gt;.class).newInstance();&lt;br /&gt;
* Server web (Apache Tomcat) ospita partite (+ localmente ha i file di funzionamento), in LAN client giocano. Interfaccia HTML5 + Javascript per giocare. Scalabile per futuro, basta offrire servizio su un ip pubblico. Studiare engine grafici Javascript&lt;br /&gt;
* rpgmaker, godot, aseprite, pixelart (in generale)&lt;br /&gt;
&lt;br /&gt;
===Copia&amp;amp;incolla generale, da smistare in sotto capitoli. Contiene anche '''tutte''' note del telefono (al 22/02/2020)===&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 1:'''&lt;br /&gt;
&lt;br /&gt;
Mosse che trasformano l’avversario: attenzione è una mossa devastante. Trasformazione totale o parziale. Si devono poter aggiungere mosse, strumenti dinamicamente. Battle bot:ribaltano, scintille, elementi (Oggetti) che danneggiano. One piece: I frutti del diavolo (悪魔の実 Akuma no mi?) sono frutti misteriosi che donano poteri soprannaturali a chi li mangia, rendendoli però incapaci di nuotare. Di conseguenza il contatto con l'acqua di mare o con una speciale sostanza conosciuta come agalmatolite indebolisce gli utilizzatori di frutti del diavolo e li priva dei loro poteri. Alcune persone sono inoltre in grado di ricorrere all'Ambizione (覇気 Haki?), una forza spirituale che permette di avvertire la presenza di altri esseri viventi e di predirne i movimenti, di irrobustire parti del corpo e di intimidire o fare svenire le creature con una debole forza di volontà. Personaggio ha funzione baricentro_x, baricentro_y calcolate come (from_x+to_x)/2 sul quale si basa la funzione di libreria getDistance(Personaggio A, Personaggio B, float success); tale funzione serve per calcolare per i PNG e per i PG se ha senso usare una mossa. Non-onniscienza: delle volte non si può sapere distanza avversario e fallisce la mossa per la distanza -&amp;gt; “float success” rappresenta la probabilità di successo (Personaggio ha parametro “osservare”). PNG di due categorie: offensivi o neutrali (no priorità a mosse di attacco, ma tutto casuale). Mosse e oggetti per chiamare Personaggi, magari non necessariamente alleati (2 mosse e 2 oggetti quindi necessari), richiamo di un personaggio preciso o di uno a caso. Ogni mossa/azione deve avere un tempo di attesa espresso in turni (alla meglio 0) per poter ripetere la mossa/azione. Strumenti anche mezzi di trasporto di aria, di terra, di acqua (o lava/palude). Possono attivare una metamorfosi / Unione per cambiare stats personaggio. Veicoli con armi o riparo. Gli strumenti da trattare come gli oggetti. Classe unica? I match/partite (immagino Classe Partita) devono avere variabile boolean “respawn”, per distinguere death match a punti con death match con una vita. Wrestling per ispirarsi nella lotta libera: calci pugni ginocchiate prese lanci salti testate gomitate ecc. Per punti si vince a un limite o dopo un tot di mosse , oppure al primo dei due raggiunti (max_punti e max_mosse parametri di Partita). I punti si guadagnano alla kill (un Punteggio per squadra, int punteggio salvato localmente dentro ogni Personaggio che ha la variabile int squadra). Si guadagnano tanti punti quanti sono i punti della variabile “valore” del personaggio ucciso, tale variabile è calcolata come somma dei valori di tutte le mosse/stats ect del Personaggio. Imperium civitas. Attacco dei giganti. Possibilità di morire se colpiti in un unico punto (tallone d Achille) implementabile come variabile boolean. Jump force. Game dev tycoon. Acqua diventa tsunami. Variabile int per attacco cumulativo di gruppo: es calciatori che più si passano la palla più l’attacco è forte. Suolo magico: non tutti i personaggi possono accedervi, array di string elenca i nomi di chi può accedervi. Funzione esci/entra in classe Personaggio per simulare scambio pokemon 6vs6. Piovra gigante. Rischio=danno*probabilita. Mossa su strumento e con strumento?&lt;br /&gt;
Mosse fisiche per arrampicarsi su avversario(se e solo se sei la metà di dimensioni(?)), atterrarlo, lanciarlo, accecarlo, immobilizzarlo. Se sei in gruppo/ orda bonus ad attacchi combinati. Armi: fruste e scheggie, corni che si suonano per chiamare altri. Tipo della mossa con moltiplicatore tra 0 (immune) e 2 (float): acqua, fuoco, magia, terra: da ispirarsi ai pokemon ma non da copiare, penso. Armi da campo: cannoni e catapulte. Veicoli d’acqua: moto acqua, canoe, barche a motore a remi. Nei veicoli malus su attenzione (variabile int in personaggio, indica attenzione in combattimento e non in altro) perché si è impegnato alla guida . All’inizio in image view “the hero” e “the map”. Condizione vittoria (oltre a morte, punti, o numero mosse, cioè tempo) morte di un singolo Personaggio, che potrebbe rappresentare un edificio, cassaforte o simili. Personaggio si può svestire e lasciare strumenti, modificano statistiche di attacco, difesa , agilità, ect. Variabile luce o non luce, che peggiora/migliora a seconda della specie la visibilità, quindi la precisione , specie in attacchi a distanza: Scurovisione evita i malus.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 2:'''&lt;br /&gt;
&lt;br /&gt;
Gioco2: se ci si lancia da oggetti , dopo essersi arrampicati, possono esserci danni da caduta; strumenti come paracaduti o mosse magiche possono evitare i danni. Pozione del vento, soffi e devi attacchi. In difesa puoi parare, schivare, deviare: tre variabili? Ambiente: colline e pianure uguali, Monti sono Oggetti, picco ossia un unico monte oggetto. Rocce volanti, nuvole sospese: oggetto può essere sospeso e può fare periodicamente una mossa, ad es tuono, può spostarsi, può fare entra/esci, oggetto albero e oggetto foresta, si possono prendere, nascondersi, arrampicarsi, lanciarli, ostacolano velocità ma se si ha abbastanza forza si spezzano alberi. Acqua poco profonda, profonda, molto profonda: variabile boolean in Personaggio “alto” per toccare in acqua profonda, con acqua si generano fiumi laghi e mari. Ambiente si deve poter evolvere: ad esempio oggetto diga può fare metamorfosi e diventare oggetto cascata/torrente in piena. Per edifici più oggetti che rappresentano le mura e il tetto, variabile boolean per oggetto per entrare nell’oggetto. Possono essere spazzati via: danni da crollo, si può combattere all interni, contengono strumenti come tavoli sedie mobili letto ect. Se uno viene schiantato contro uno strumento prende danno(es danno da schianto). Ci possono essere scale, si può non avere contatti visivo sull’avversario. Oggetto mura, oggetto torre, oggetto casa interno sono cose distinte: possono dare malus/bonus su visibilità. Ambiente: pozzi e grotte, da gestire come interno casa. Lava come acqua, ogni oggetto può essere sorgenti di liquido: monte sorgente acqua, vulcano sorgente lava. Può esserci variabile probabilità eruzione, se settata a 1 c’è una continua eruzione. Strade di vario tipo, sovrapposta a altri suoli, migliorano velocità di alcuni strumenti, variabile boolean “ha le ruote” in classe strumenti. Unificare classe strumento e classe oggetto. Oggetti sospesi: case sospese su albero, ad es. Fiamme in mezzo al suolo. Oggetti: porto, aereoporto, grattacieli, dighe, impianti a fune, ospedali per curarsi e prendere oggetti per curarsi dopo, scuole contenenti libri per apprendere una mossa, luoghi di ingegneria per creare oggetti, ad esempio veicoli o armi, soldi nel gioco per comprare da eventuali venditori. Ogni oggetto avra un prezzo (valutabile circa in euro per semplicità). Variabile float per fame, sete, sonno, caldo-freddo (parte da 0.5). Nella mappa ci deve essere per ogni punto la temperatura. Possibilità di vomito, dissenteria, problemi cardiaci, respiratori, muscolari. Armi: balestra, mani nude, sasso, tirapugni, torcia accesa. Armature: intralciano o favoriscono agilità, attacco, poteri magici, rumorosa (elusione), è uno strumento/oggetto. Attacchi possono essere prolungati per turni, mosse variabile boolean prolungabile: può aumentare o diminuire intensità, c’è un max espresso in turni di prolungabilita, inoltre può essere leggermente alterato con una variabile casuale. Equipaggiamento (strumento/oggetto): pietra focaia, attrezzi da scalata, boccale di birra, cavallo, moto, chiodi, martello da fabbro, corda, corazza, dardo, faretra/zaino/sacca (oggetti che contengono una lista di oggetti, stringhe) con un numero per la quantità) e capacità massima zaino e ogni oggetto può avere un valore intero per dimensione (es martello 3, ascia grande 7), mantello, olio, variabile boolean prende fuoco/conduce elettricità, amplifica magnetismo, aumenta esplosioni nucleari, aumenta forza di gravità (?), pala, piccone, rampino, specchio, per osservare quando si è nascosti e si ha malus su visibilità. Strumenti da scasso per aprire porte: variabile boolean per oggetti: entrata con scasso. Personaggio: string razza per swag, immunità a veleni e malattie, elusione, agilità, precisione, abilità magiche(?), difesa fisica. In ultima torcia: agilità, coraggio, forza, intelligenza, magia, manualità, percezione, socialità. Bestiario: aracnoide di varie dimensioni, talpe giganti, vermi giganti di terra di mare e di lava ect, bulbo trascinatore che ha tentacoli per tirare a se e mangiare, lui è immobile, calabrone gigante, serpenti giganti, cinghiali, draghi, elfi, goblin e re goblin, sciamani (goblin), totem di guerra come strumento/oggetti per alterare statistiche nella loro area di influenza, lupo, mastino bruciante, nani, non morti/zombie/mummia/scheletro variabile boolean vivo a false ma ha ancora hp su parti del corpo: variabile boolean “zombizabile”. Orchi, pesci da terra (anfibi) tritone dell abisso, troll e trollin (orchi più deformi), umani. Abilità dei personaggi in ultima torcia: artificiale (robot) immunità a soffocamento, veleni, malattie ect immune a manipolazioni psichiche, visione oscurità; danno da attacco in carica; fiammegiante ossia la creatura può incendiarsi e elettrizzante ossia può diventare elettrica caricamente; modalità furia/mailmen ossia ottiene bonus su alcune/tutte le statistiche; gigantesco o molto piccolo due boolean (?forse non serve); immunità a magie mentali, al fuoco; linguaggi (?); non morto; danno da attacco in presa; pungiglioni velenosi; sa muoversi su ragnatele o è rallentato, resistenza a perforazione, respirare sott’acqua o sotto lava o nei liquidi in genere; rigenerazione; riceve danni dalla luce solare o da assenza di luce; è terrorizzato/impaurito/intimidito o se è imperturbabile boolean. Danno da trascinamento; paralizzante; può diventare più veloce (?non serve); visione a infrarossi attraverso oggetti; volare o andare sotto terra. Imperium editor, cose che penso di non aver ancora scritto: stagioni, suolo erboso o terriccio, sabbia con erba e terra e da sola, strade e stagioni, altitudine, alberi e arbusti, vari tipi a foglia larga, conifere, alberi secchi, palme, arbusti verdi e secchi, cactus, alghe marine, rocce e pietre, scheletri per terra, legna tagliata (alberi tagliati), carri e carretti, grotte e rovine per accessi sotterranei, locande, templi, accampamenti, fortini, monoliti, fontana, tombe e cimiteri, borse per terra, pozzo, troni, croci(del teschio), pozzo, capanne, lapidi, ponti, recinzioni, falò, tende, torri, panoplia, fessure come abissi, statue, rovine (deserto) come case distrutte, colonne per costruire templi, piramidi, sfingi, bandiere, rovine in Europa, campi coltivati che contengono cibo, fiamma (in altre), roccia in altre per montagne, altre-&amp;gt;rovine per monumenti non egiziani ma europei.&lt;br /&gt;
Ci sono paludi. Tende da campo. Forti, porti. Edifici delle fortezze, edifici dei villaggi. Naufragi e scogli.&lt;br /&gt;
Parametri voglia/impegno float per descrivere voglia di combattere Personaggio. Ricevi danno uscendo dalla mappa tra 1-5% tra 6-10% tra 11-15% della vita totale di ogni parte del corpo per ogni turno di gioco. Danno da precipitazione diverso da carica, uno verticale uno orizzontale, se precipiti da molto in alto hai bonus, oltre che danni da schianto lol. Baionette, formazione a blocchi, a quadrato (difensiva) sparano su quattro lati, a schiera vanno avanti. Usano un colpo poi lunga ricarica. Variabile boolean per attivare o meno fuoco amico. Azione per cambiare posizione: in piedi, in ginocchio(inteso come via di mezzo), sdraiato: per permettere migliore visibilità a chi è dietro (nella formazione).&lt;br /&gt;
Altruismo, coraggio, spingere oltre il limite, difendere al posto di un altro, migliorare posizione per avere bonus. Mosse da usare in condizioni psicologiche idonee: mosse estreme per disperazione, bonus unici. Condizioni per situazioni: blocco, spalle al muro, stritolato, confuso, semi parassiti addosso, azzoppato, bagnato d’acqua, lame affilate, corazza indurita, tante copie di me stesso attive, preveggente. Per ambiente:pioggia (torrenziale), barriera a cupola, punte metalliche a terra, blocco di fumo nero. Far volare un avversario/alleato. Tutti possono fare tutto sotto effetti magici o fisici. Un cavallo può volare se viene preso da un uccello e portato in alto.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 3, 4:'''&lt;br /&gt;
&lt;br /&gt;
Gioco1,2,3,4: tutto caricato su wikis.&lt;br /&gt;
&lt;br /&gt;
Gioco3: Mosse con caricamento + spostamento (es. kameamea con teletrasporto). Ciclo di interazione principale:crea o combatti. Modalità campagna, che chiede in input da che battaglia iniziare, ma implica tipi battaglie prefissati. Alla morte/sconfitta di un personaggio si possono alterare statistiche (es personaggio può cambiare fazione). Alcune mosse possono lasciare oggetti sul terreno: (ad es, radici di Groth). Ogni oggetto può alterare le statistiche al passaggio sopra, nelle vicinanze. Boolean invisibile per personaggio, diverso da elusione infinita. Se personaggio va in un altro dimensione -&amp;gt; unreachable. Attacco coordinato, se non lo fanno tutti vale lo stesso ma depotenziato opportunamente . Personaggio in modalità maniac (2 mosse per turno) e in modalità depressive (1 mossa ogni due turni); personaggio Flash può fare 10 mosse in un turno. Chiudi con lucchetto oggetto da dentro o da fuori, oggetto ingresso in oggetto casa , più ingressi per un singolo oggetto.nicole aniston. Rimbalzo se ci si schianta contro oggetto da calcolare con parametro. Ryuk e Darkrai.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gioco 4 23/07/2019:&lt;br /&gt;
Pula fiction, aracnidi, oggetto: due superfici rettangolari di forma diversa, anche inclinate , collegate. Più pezzi collegati tra loro per forme cilindriche cave, ad esempio, tipo vulcano. Mappa con sprite personaggi, canvas: anche mouseClick? Statistiche con nome gerarchico, es pokemon_attacco. Modalità survival, stile isola di jurassic park gdr; sia in coop che contro; possibilità di fare N turni di fila se non ci sono altri player giocanti nelle vicinanze (ciò però comporterebbe , in modalità contro , di capire quando c’è qualcuno nelle vicinanze perché si andrebbe di 1 turno alla volta, soluzioni: in mod contro 1 turno per volta oppure meccanismo di sincronizzazione turni quando uno vede l’altro (anche furtivo) come c’è attacco 1 turno a testa) .. analogo a Battle royale(?); inizio con starter kit random. Modalità assedio al castello. Inoltre se posso fare N turni di fila si può pensare a più pc , uno per persona , coordinati per fare comandi in parallelo, ma va ben congegnato meccanismo di sincronizzazione. Parti DelCorpo -&amp;gt; Componente/i oppure Parte. La mappa deve essere (x,y); l’altezza viene indicata onMouseOver certi pixel dove è posto il Personaggio; se personaggio dentro edificio/grotta cambio img (es sfocato/tratteggiato). Mosse: astrarre per target; molte mosse sono simili tra loro, somiglianza va sfruttata, hanno magari dei target in comune, o variano solo per un parametro. Creare mappa anche con drag and drop immagini ?(un po’ difficile). Più layout per interfaccia grafica (esempio uno che mostra errori input su text area, uno con alert, uno su box text area separato). Input comandi consumato pezzo per pezzo, alcune parole se prevedono parametri quando riconosciute fanno fetch anche di parola (numero) successiva. Face toon foto? Import parziali di personaggi (tutto tranne/solo questi campi specificati). Texture mappa complete o ripetibili (es per suolo). Anteprima battaglia stile battaglia pokemon (magari per 1/2/3 vs 1/2/3) per rappresentare scontro. Conviene usare xslx (excel) per dati, considerare che può non servire la libreria Java per leggere stringhe per operazioni. Mossa “again” , ripeti la precedenza(opportuna modifica parametri, es mossa spostamento). Possibile gestione contromosse: si usano marker (tag): ogni mossa ha elenco tag del tipo di contromosse che può subire (con probabilità annessa, che può dipendere da pg che subisce mossa congiuntamente a mossa stessa). Ogni mossa inoltre deve essere taggata come possibile contromossa che il pg può usare (per schivare può fare in più modi). A seconda del lancio del dado il pg che effettua La contromossa può anche scegliere tipologia di contromossa o solo la mossa della tipologia che ha beccato (entrano in gioco riflessi ect.). I parametri che fanno attivare unq o un’altra contromossa sono dinamici, posso dipendere ad esempio dalla posizione tra i due pg o altre statistiche. Tag contromosse a fasce (es. coprirsi è sempre più facile che schivare che e più facile di schivare e contrattaccare (?); all’interno dello stesso schivare e contrattaccare ci sono più sotto categorie). Per aggiunta personaggio può essere utili interfaccia dedicata, non linea di comando (o altre operazioni, specie se ci sono tabelle). Mossa “premonizione”: predire il futuro a breve termine, dici che mossa vorresti fare e ti dice esito (o più esiti se uno chiede più mosse). Funziona solo sulla prossima mossa. Contromossa delle contromossa gestione?? Eventualmente nell’esito si prevede ancore contro-contromossa. Ma si innesca reazione a catena, inoltre da gestire scelta contromossa in questo caso. Applicazione tag conoscenza(universo di appartenenza): “Termoli”, “pokemon”, “liceo classico Termoli”, anche gerarchici, per filtrare sui personaggi.target componibili , fattorizzato creazione mosse, hanno un costo magari per indicare quantovoccupano dicuna mossa, relativo maybe a un parametro o più del target stesso. In particolare, non saranno salvate le mosse per un personaggio (o solo alcune “preferite”) ma il suo insieme di target i quali devono dire:statistica che influenzano, “costo del turno” che richiedono al variare dell’intensità del target (che aumenta linearmente, esponenzialmente, generica f(x)) quindi corsa blanda costo 1 , Max corsa costo 5 (max), elenco (string) target incompatibili con tale target (se serve), nota relative ad es per quando uno vuole creare una mossa durante la battaglia (“target corsa, max sforzo dedicabile 4 ect” metti “50 metri corsa” “ok/troppo! Vuoi sforzati di più rischiando effetti collaterali?”). Si può autoscrivere la voce narrante del gioco come “la tua coscienza” mentre che giochi, d’altronde si interagisce con essa. Considerare che un target può appartenere a più personaggi, magari sotto nomi di mosse diversi.&lt;br /&gt;
Definire gerarchia di personaggi per template (tipo classe e super classe) e template importabili (tipo usa fuoco). Es umanoide non umanoide, tra umanoide maschio- femmina etc. Classe che estende System.out per creare funzioni che aggiungono Header “DEBUG:” etc; due programmi Java , due main: uno delegato a calcoli + gestione Excel; altro legge stdout dell altro per interfaccia grafica. Per allenare PG creare dei PG fantocci con label per fare Q-learning iniziale, più avanti far allenare pg tra loro; creare vari fantocci: tank terrestre fisico, healer volante etc. Excel: si usa css che si può rendere tabellare, più facile da trattare nel codice rispetto a .xslx. Ogni “utente” ed Lostefra ha il suo personale dizionario con sue personali short cut da usare in partita, eventuale login con password (opzionale) x accesso. Vedere license show down. Mappa unica stile giochi di ruolo, si vede tutto da sopra: click o simili su edifici/caverne per mappe interne a tale posto, così ok sprite e per rappresentare “pg in volo” sprite dedicato. Densità aria per dire quando anche un uomo per es può volare. Ipotesi più efficiente per dare un valore stima al pg: AI base che gioca a manetta contro altre AI base e dalle vittorie si fa l’euristica, più vittoria facile/veloce/stracciante più punti, contro vari pg, contro pg standard bench mark.&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Note&amp;diff=185</id>
		<title>Note</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Note&amp;diff=185"/>
		<updated>2020-02-25T22:24:26Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: init fogli di carta&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Note ==&lt;br /&gt;
&lt;br /&gt;
'''Vedere altre note su fogli di carta e promemoria del telefono. Ce ne sono molte.'''&lt;br /&gt;
'''La copiatura dai fogli di carta dei continuare da pagina 4 (&amp;quot;alterare param..&amp;quot;).'''&lt;br /&gt;
&lt;br /&gt;
===Inspirational Concepts===&lt;br /&gt;
* Gioco Lotta (Pokémon, Pokkén)&lt;br /&gt;
* no caselle esplicite&lt;br /&gt;
* Descrizione rispetto a: ambiente, nemico, oggetti&lt;br /&gt;
* pokémon, DnD, Call of Duty, Super Smash Brawl, corse pazze&lt;br /&gt;
* concentrarsi su: fluidi, telecinesi, razze, bonus/malus, gradi di libertà (fisicamente parlando) &lt;br /&gt;
* scacchi (es. crea casella), shaolin showdown&lt;br /&gt;
* prevedere = creatività&lt;br /&gt;
* acqua, aria, fuoco, terra&lt;br /&gt;
* gravità (newton), verso alto, basso, destra, sinistra, circolare, tutti i versi&lt;br /&gt;
* jumanji, savana, animali, zoologia&lt;br /&gt;
* tempo/spazio&lt;br /&gt;
* BF4, pirati, roma (imperium civitas)&lt;br /&gt;
* musica come arma (rap)&lt;br /&gt;
* magia, prestigiatori&lt;br /&gt;
* dinosauri (documentario, libro, zoologia)&lt;br /&gt;
* avengers, supereroi (libro)&lt;br /&gt;
&lt;br /&gt;
* Looney toons&lt;br /&gt;
&lt;br /&gt;
===Personaggi (con statistiche e stati)===&lt;br /&gt;
* combattenti (con statistiche e stati)&lt;br /&gt;
* immagine rappresentativa per rappresentare meglio&lt;br /&gt;
* HP: colore rosso su immagine personaggio, dove sei debole/già colpito (idea scartata)&lt;br /&gt;
* penitenza: il malus può essere inteso come ciò che c'è nell'inserimento successivo, malus cumulativo&lt;br /&gt;
* essere ipocrita, finzione (schermo)&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (personaggi)&lt;br /&gt;
* metamorfosi&lt;br /&gt;
* alchimisti&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* possibilità giù in terra/ giù in acqua, con reachable e unreachable Boolean. Fuori da mappa anche reachable e unreachable.&lt;br /&gt;
* Personaggi composti di parti[] es. testa, busto, gambe, braccia, coda, pinna, ali. Distinzione per arto di movimento e/o spostamento boolean.&lt;br /&gt;
* Arti possono provocare danno, bruciatura , paralisi a contatto (Boolean) . Percentuale di probabilità accompagna ogni Boolean.&lt;br /&gt;
* Ogni parte del corpo punti vita + se inutilizzabile + amputata + stato (es paralisi).&lt;br /&gt;
* Per fare battaglie tra molto grandi =&amp;gt; 1 m lo si intende come 10m.  (rivalutato, aumentare livello scaling)&lt;br /&gt;
* Personaggio fusionabile Boolean + string nomi con cui si fonde.&lt;br /&gt;
* Distinzione tra infernape e infernape1/2/3 ect tra “specie” e “nome”.&lt;br /&gt;
* variabile Boolean respawnable.&lt;br /&gt;
* Raccogliere a piene mani da: https://spore.fandom.com/wiki/Creature_Editor&lt;br /&gt;
* Ad esempio weapons come elemento di Corpo (zanne, corna) e possibilità di muoversi/attaccare furtivamente.&lt;br /&gt;
* Divisibile e unibile come boolean e array di stringe associate per indicare i nomi con cui si unisce il Personaggio o in cui si divide.&lt;br /&gt;
* Variabili posizione nome: from_x/y ; to_x/y.&lt;br /&gt;
* Classe Stato, Personaggio contiene Array di stato, stato contiene moltiplicatori per statistica es attacco velocità precisione elusione ect.&lt;br /&gt;
* Personaggio deve avere una stat tipo sanità mentale, intelligenza, quanto è confuso e quanto è impaurito (2).&lt;br /&gt;
&lt;br /&gt;
* Per personaggi molto piccoli (meno di 1m x 1m x 1m) possibilità di essere in (x,y,z) tra 0 e 1.000.000 (ordine del micrometro, 1*10^-6 == 0,000001) e avere (lenX, lenY, lenZ). In questo modo sono definite dimensioni inferiori ad 1 m^3.&lt;br /&gt;
* personaggi max 20x20 (rivaluato, meno limitata)&lt;br /&gt;
&lt;br /&gt;
===Mosse===&lt;br /&gt;
* &amp;quot;combattimento prescinde da combattente&amp;quot;&lt;br /&gt;
* mosse hanno: direzione, azione, attacco (mosse pokémon)&lt;br /&gt;
* Parametri interi per mossa (direzione, consumabili) con lower e upper bound&lt;br /&gt;
* camuffarsi =&amp;gt; DnD manuale&lt;br /&gt;
* wrestling (libro) per le mosse/prese&lt;br /&gt;
&lt;br /&gt;
* X fa una mossa contro Y: Z potrebbe reagire (Es. ricevendo il colpo al posto di Y). Può essere realizzato sia come se &amp;quot;Y chiede soccorso Z&amp;quot; o come reazione di alleati adiacenti &amp;quot;Z soccorre Y&amp;quot;&lt;br /&gt;
* Mossa prende come parametro di ingresso Corpo, ossia la parte del corpo coinvolta nella mossa (es arto , tutto corpo ect). &lt;br /&gt;
&lt;br /&gt;
===Oggetto (con statistiche e stati)===&lt;br /&gt;
* armi: lacci (stati), lame (potenze), sassi, reti, pistole (munizioni), razzi, bombe (potenze), fuoco (d'artificio?) =&amp;gt; manuale DnD&lt;br /&gt;
* veleno n modi =&amp;gt; DnD manuale&lt;br /&gt;
* elettronica =&amp;gt; miniaturizzarsi (oggetti)&lt;br /&gt;
* automezzi con cannoni, variabile 'hasEntrata', 'tempoRiutilizzo'&lt;br /&gt;
* violino come arma (tutti strumenti musicali): a fiato, a corda, a percussione&lt;br /&gt;
* veleni, ampolle e flaconi magici, insieme di 'oggetti dentro' un oggetto&lt;br /&gt;
&lt;br /&gt;
* Classe oggetto: es albero, roccia, casa: forza necessaria per sradicare + forza per lanciare + destrezza / agilità per appendersi + nascondersi in proporzione alle dimensioni di chi si nasconde. &lt;br /&gt;
* Altri es. pali. Sotto terra o sotto acqua/lava/melma o simili. &lt;br /&gt;
* Acqua rallenta se non hai pinne boolean.&lt;br /&gt;
* Classe strumento per oggetti che si tengono in mano, es reti , pistole, spade, pugnali, scudi, elmi, lancia, arco , frecce, lanciarazzi, fucili cecchino, fucile assalto, corde.&lt;br /&gt;
* Strumenti e mosse: danno ad area, perforante, contundente (vedi dnd armi). Mosse possono creare/modificare/distruggere oggetti e strumenti.&lt;br /&gt;
* Oggetti del campo di gioco incidono su elusione (parametro di personaggio).&lt;br /&gt;
* Buco/abisso (boolean) per dire se c’è o meno il suolo (Suolo come classe?). &lt;br /&gt;
* Radiazioni. &lt;br /&gt;
&lt;br /&gt;
===Modalità gioco===&lt;br /&gt;
* turnazione&lt;br /&gt;
* 1 v 1 v 1 etc., ma anche squadre casuali&lt;br /&gt;
* punteggio: chi fa più punti, più uccisioni, definizione di 'punto', gioco per perdere&lt;br /&gt;
* inserisci personaggio total random&lt;br /&gt;
&lt;br /&gt;
* Modalità battaglia con interazione stile battaglia navale (non si vede mossa dell'avversario)&lt;br /&gt;
* Modalità di gioco: tutti contro tutti (battle royale), death match, vs CPU mode zombie(attaccano solo, se non possono vanno verso nemico): serve introdurre un punteggio, di sicuro per mode zombie , ma anche per death match e tutti contro tutti&lt;br /&gt;
* ingressi: ne entra un altro?&lt;br /&gt;
&lt;br /&gt;
===Mappa===&lt;br /&gt;
* arene&lt;br /&gt;
* minimappa (pixelata ?), legenda oggetti base, devono esserci caselle implicite&lt;br /&gt;
* mappa 100x100 (rivalutato, meno limitata)&lt;br /&gt;
* Cannoni fissi in mezzo al campo (strumento).&lt;br /&gt;
&lt;br /&gt;
===Funzionalità generali===&lt;br /&gt;
* &amp;quot;meno tabelle&amp;quot;, &amp;quot;no bottoni&amp;quot; e solo foto che si alternano, &amp;quot;la grafica serve&amp;quot;: text box unica interazione, text area (history), immagine personaggio e immagine mappa&lt;br /&gt;
* &amp;quot;persistenza anche da interfaccia grafica&amp;quot;, diritti di scrittura sui file?&lt;br /&gt;
* Segnalazione (comando per fare nota)&lt;br /&gt;
&lt;br /&gt;
===Deploy===&lt;br /&gt;
* &amp;quot;commenta il codice&amp;quot;, &amp;quot;dividi et impera&amp;quot;&lt;br /&gt;
* JAVA: Class.forName(&amp;lt;name&amp;gt;.class).newInstance();&lt;br /&gt;
* Server web (Apache Tomcat) ospita partite (+ localmente ha i file di funzionamento), in LAN client giocano. Interfaccia HTML5 + Javascript per giocare. Scalabile per futuro, basta offrire servizio su un ip pubblico. Studiare engine grafici Javascript&lt;br /&gt;
&lt;br /&gt;
===Copia&amp;amp;incolla generale, da smistare in sotto capitoli. Contiene anche '''tutte''' note del telefono (al 22/02/2020)===&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 1:'''&lt;br /&gt;
&lt;br /&gt;
Mosse che trasformano l’avversario: attenzione è una mossa devastante. Trasformazione totale o parziale. Si devono poter aggiungere mosse, strumenti dinamicamente. Battle bot:ribaltano, scintille, elementi (Oggetti) che danneggiano. One piece: I frutti del diavolo (悪魔の実 Akuma no mi?) sono frutti misteriosi che donano poteri soprannaturali a chi li mangia, rendendoli però incapaci di nuotare. Di conseguenza il contatto con l'acqua di mare o con una speciale sostanza conosciuta come agalmatolite indebolisce gli utilizzatori di frutti del diavolo e li priva dei loro poteri. Alcune persone sono inoltre in grado di ricorrere all'Ambizione (覇気 Haki?), una forza spirituale che permette di avvertire la presenza di altri esseri viventi e di predirne i movimenti, di irrobustire parti del corpo e di intimidire o fare svenire le creature con una debole forza di volontà. Personaggio ha funzione baricentro_x, baricentro_y calcolate come (from_x+to_x)/2 sul quale si basa la funzione di libreria getDistance(Personaggio A, Personaggio B, float success); tale funzione serve per calcolare per i PNG e per i PG se ha senso usare una mossa. Non-onniscienza: delle volte non si può sapere distanza avversario e fallisce la mossa per la distanza -&amp;gt; “float success” rappresenta la probabilità di successo (Personaggio ha parametro “osservare”). PNG di due categorie: offensivi o neutrali (no priorità a mosse di attacco, ma tutto casuale). Mosse e oggetti per chiamare Personaggi, magari non necessariamente alleati (2 mosse e 2 oggetti quindi necessari), richiamo di un personaggio preciso o di uno a caso. Ogni mossa/azione deve avere un tempo di attesa espresso in turni (alla meglio 0) per poter ripetere la mossa/azione. Strumenti anche mezzi di trasporto di aria, di terra, di acqua (o lava/palude). Possono attivare una metamorfosi / Unione per cambiare stats personaggio. Veicoli con armi o riparo. Gli strumenti da trattare come gli oggetti. Classe unica? I match/partite (immagino Classe Partita) devono avere variabile boolean “respawn”, per distinguere death match a punti con death match con una vita. Wrestling per ispirarsi nella lotta libera: calci pugni ginocchiate prese lanci salti testate gomitate ecc. Per punti si vince a un limite o dopo un tot di mosse , oppure al primo dei due raggiunti (max_punti e max_mosse parametri di Partita). I punti si guadagnano alla kill (un Punteggio per squadra, int punteggio salvato localmente dentro ogni Personaggio che ha la variabile int squadra). Si guadagnano tanti punti quanti sono i punti della variabile “valore” del personaggio ucciso, tale variabile è calcolata come somma dei valori di tutte le mosse/stats ect del Personaggio. Imperium civitas. Attacco dei giganti. Possibilità di morire se colpiti in un unico punto (tallone d Achille) implementabile come variabile boolean. Jump force. Game dev tycoon. Acqua diventa tsunami. Variabile int per attacco cumulativo di gruppo: es calciatori che più si passano la palla più l’attacco è forte. Suolo magico: non tutti i personaggi possono accedervi, array di string elenca i nomi di chi può accedervi. Funzione esci/entra in classe Personaggio per simulare scambio pokemon 6vs6. Piovra gigante. Rischio=danno*probabilita. Mossa su strumento e con strumento?&lt;br /&gt;
Mosse fisiche per arrampicarsi su avversario(se e solo se sei la metà di dimensioni(?)), atterrarlo, lanciarlo, accecarlo, immobilizzarlo. Se sei in gruppo/ orda bonus ad attacchi combinati. Armi: fruste e scheggie, corni che si suonano per chiamare altri. Tipo della mossa con moltiplicatore tra 0 (immune) e 2 (float): acqua, fuoco, magia, terra: da ispirarsi ai pokemon ma non da copiare, penso. Armi da campo: cannoni e catapulte. Veicoli d’acqua: moto acqua, canoe, barche a motore a remi. Nei veicoli malus su attenzione (variabile int in personaggio, indica attenzione in combattimento e non in altro) perché si è impegnato alla guida . All’inizio in image view “the hero” e “the map”. Condizione vittoria (oltre a morte, punti, o numero mosse, cioè tempo) morte di un singolo Personaggio, che potrebbe rappresentare un edificio, cassaforte o simili. Personaggio si può svestire e lasciare strumenti, modificano statistiche di attacco, difesa , agilità, ect. Variabile luce o non luce, che peggiora/migliora a seconda della specie la visibilità, quindi la precisione , specie in attacchi a distanza: Scurovisione evita i malus.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 2:'''&lt;br /&gt;
&lt;br /&gt;
Gioco2: se ci si lancia da oggetti , dopo essersi arrampicati, possono esserci danni da caduta; strumenti come paracaduti o mosse magiche possono evitare i danni. Pozione del vento, soffi e devi attacchi. In difesa puoi parare, schivare, deviare: tre variabili? Ambiente: colline e pianure uguali, Monti sono Oggetti, picco ossia un unico monte oggetto. Rocce volanti, nuvole sospese: oggetto può essere sospeso e può fare periodicamente una mossa, ad es tuono, può spostarsi, può fare entra/esci, oggetto albero e oggetto foresta, si possono prendere, nascondersi, arrampicarsi, lanciarli, ostacolano velocità ma se si ha abbastanza forza si spezzano alberi. Acqua poco profonda, profonda, molto profonda: variabile boolean in Personaggio “alto” per toccare in acqua profonda, con acqua si generano fiumi laghi e mari. Ambiente si deve poter evolvere: ad esempio oggetto diga può fare metamorfosi e diventare oggetto cascata/torrente in piena. Per edifici più oggetti che rappresentano le mura e il tetto, variabile boolean per oggetto per entrare nell’oggetto. Possono essere spazzati via: danni da crollo, si può combattere all interni, contengono strumenti come tavoli sedie mobili letto ect. Se uno viene schiantato contro uno strumento prende danno(es danno da schianto). Ci possono essere scale, si può non avere contatti visivo sull’avversario. Oggetto mura, oggetto torre, oggetto casa interno sono cose distinte: possono dare malus/bonus su visibilità. Ambiente: pozzi e grotte, da gestire come interno casa. Lava come acqua, ogni oggetto può essere sorgenti di liquido: monte sorgente acqua, vulcano sorgente lava. Può esserci variabile probabilità eruzione, se settata a 1 c’è una continua eruzione. Strade di vario tipo, sovrapposta a altri suoli, migliorano velocità di alcuni strumenti, variabile boolean “ha le ruote” in classe strumenti. Unificare classe strumento e classe oggetto. Oggetti sospesi: case sospese su albero, ad es. Fiamme in mezzo al suolo. Oggetti: porto, aereoporto, grattacieli, dighe, impianti a fune, ospedali per curarsi e prendere oggetti per curarsi dopo, scuole contenenti libri per apprendere una mossa, luoghi di ingegneria per creare oggetti, ad esempio veicoli o armi, soldi nel gioco per comprare da eventuali venditori. Ogni oggetto avra un prezzo (valutabile circa in euro per semplicità). Variabile float per fame, sete, sonno, caldo-freddo (parte da 0.5). Nella mappa ci deve essere per ogni punto la temperatura. Possibilità di vomito, dissenteria, problemi cardiaci, respiratori, muscolari. Armi: balestra, mani nude, sasso, tirapugni, torcia accesa. Armature: intralciano o favoriscono agilità, attacco, poteri magici, rumorosa (elusione), è uno strumento/oggetto. Attacchi possono essere prolungati per turni, mosse variabile boolean prolungabile: può aumentare o diminuire intensità, c’è un max espresso in turni di prolungabilita, inoltre può essere leggermente alterato con una variabile casuale. Equipaggiamento (strumento/oggetto): pietra focaia, attrezzi da scalata, boccale di birra, cavallo, moto, chiodi, martello da fabbro, corda, corazza, dardo, faretra/zaino/sacca (oggetti che contengono una lista di oggetti, stringhe) con un numero per la quantità) e capacità massima zaino e ogni oggetto può avere un valore intero per dimensione (es martello 3, ascia grande 7), mantello, olio, variabile boolean prende fuoco/conduce elettricità, amplifica magnetismo, aumenta esplosioni nucleari, aumenta forza di gravità (?), pala, piccone, rampino, specchio, per osservare quando si è nascosti e si ha malus su visibilità. Strumenti da scasso per aprire porte: variabile boolean per oggetti: entrata con scasso. Personaggio: string razza per swag, immunità a veleni e malattie, elusione, agilità, precisione, abilità magiche(?), difesa fisica. In ultima torcia: agilità, coraggio, forza, intelligenza, magia, manualità, percezione, socialità. Bestiario: aracnoide di varie dimensioni, talpe giganti, vermi giganti di terra di mare e di lava ect, bulbo trascinatore che ha tentacoli per tirare a se e mangiare, lui è immobile, calabrone gigante, serpenti giganti, cinghiali, draghi, elfi, goblin e re goblin, sciamani (goblin), totem di guerra come strumento/oggetti per alterare statistiche nella loro area di influenza, lupo, mastino bruciante, nani, non morti/zombie/mummia/scheletro variabile boolean vivo a false ma ha ancora hp su parti del corpo: variabile boolean “zombizabile”. Orchi, pesci da terra (anfibi) tritone dell abisso, troll e trollin (orchi più deformi), umani. Abilità dei personaggi in ultima torcia: artificiale (robot) immunità a soffocamento, veleni, malattie ect immune a manipolazioni psichiche, visione oscurità; danno da attacco in carica; fiammegiante ossia la creatura può incendiarsi e elettrizzante ossia può diventare elettrica caricamente; modalità furia/mailmen ossia ottiene bonus su alcune/tutte le statistiche; gigantesco o molto piccolo due boolean (?forse non serve); immunità a magie mentali, al fuoco; linguaggi (?); non morto; danno da attacco in presa; pungiglioni velenosi; sa muoversi su ragnatele o è rallentato, resistenza a perforazione, respirare sott’acqua o sotto lava o nei liquidi in genere; rigenerazione; riceve danni dalla luce solare o da assenza di luce; è terrorizzato/impaurito/intimidito o se è imperturbabile boolean. Danno da trascinamento; paralizzante; può diventare più veloce (?non serve); visione a infrarossi attraverso oggetti; volare o andare sotto terra. Imperium editor, cose che penso di non aver ancora scritto: stagioni, suolo erboso o terriccio, sabbia con erba e terra e da sola, strade e stagioni, altitudine, alberi e arbusti, vari tipi a foglia larga, conifere, alberi secchi, palme, arbusti verdi e secchi, cactus, alghe marine, rocce e pietre, scheletri per terra, legna tagliata (alberi tagliati), carri e carretti, grotte e rovine per accessi sotterranei, locande, templi, accampamenti, fortini, monoliti, fontana, tombe e cimiteri, borse per terra, pozzo, troni, croci(del teschio), pozzo, capanne, lapidi, ponti, recinzioni, falò, tende, torri, panoplia, fessure come abissi, statue, rovine (deserto) come case distrutte, colonne per costruire templi, piramidi, sfingi, bandiere, rovine in Europa, campi coltivati che contengono cibo, fiamma (in altre), roccia in altre per montagne, altre-&amp;gt;rovine per monumenti non egiziani ma europei.&lt;br /&gt;
Ci sono paludi. Tende da campo. Forti, porti. Edifici delle fortezze, edifici dei villaggi. Naufragi e scogli.&lt;br /&gt;
Parametri voglia/impegno float per descrivere voglia di combattere Personaggio. Ricevi danno uscendo dalla mappa tra 1-5% tra 6-10% tra 11-15% della vita totale di ogni parte del corpo per ogni turno di gioco. Danno da precipitazione diverso da carica, uno verticale uno orizzontale, se precipiti da molto in alto hai bonus, oltre che danni da schianto lol. Baionette, formazione a blocchi, a quadrato (difensiva) sparano su quattro lati, a schiera vanno avanti. Usano un colpo poi lunga ricarica. Variabile boolean per attivare o meno fuoco amico. Azione per cambiare posizione: in piedi, in ginocchio(inteso come via di mezzo), sdraiato: per permettere migliore visibilità a chi è dietro (nella formazione).&lt;br /&gt;
Altruismo, coraggio, spingere oltre il limite, difendere al posto di un altro, migliorare posizione per avere bonus. Mosse da usare in condizioni psicologiche idonee: mosse estreme per disperazione, bonus unici. Condizioni per situazioni: blocco, spalle al muro, stritolato, confuso, semi parassiti addosso, azzoppato, bagnato d’acqua, lame affilate, corazza indurita, tante copie di me stesso attive, preveggente. Per ambiente:pioggia (torrenziale), barriera a cupola, punte metalliche a terra, blocco di fumo nero. Far volare un avversario/alleato. Tutti possono fare tutto sotto effetti magici o fisici. Un cavallo può volare se viene preso da un uccello e portato in alto.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 3, 4:'''&lt;br /&gt;
&lt;br /&gt;
Gioco1,2,3,4: tutto caricato su wikis.&lt;br /&gt;
&lt;br /&gt;
Gioco3: Mosse con caricamento + spostamento (es. kameamea con teletrasporto). Ciclo di interazione principale:crea o combatti. Modalità campagna, che chiede in input da che battaglia iniziare, ma implica tipi battaglie prefissati. Alla morte/sconfitta di un personaggio si possono alterare statistiche (es personaggio può cambiare fazione). Alcune mosse possono lasciare oggetti sul terreno: (ad es, radici di Groth). Ogni oggetto può alterare le statistiche al passaggio sopra, nelle vicinanze. Boolean invisibile per personaggio, diverso da elusione infinita. Se personaggio va in un altro dimensione -&amp;gt; unreachable. Attacco coordinato, se non lo fanno tutti vale lo stesso ma depotenziato opportunamente . Personaggio in modalità maniac (2 mosse per turno) e in modalità depressive (1 mossa ogni due turni); personaggio Flash può fare 10 mosse in un turno. Chiudi con lucchetto oggetto da dentro o da fuori, oggetto ingresso in oggetto casa , più ingressi per un singolo oggetto.nicole aniston. Rimbalzo se ci si schianta contro oggetto da calcolare con parametro. Ryuk e Darkrai.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gioco 4 23/07/2019:&lt;br /&gt;
Pula fiction, aracnidi, oggetto: due superfici rettangolari di forma diversa, anche inclinate , collegate. Più pezzi collegati tra loro per forme cilindriche cave, ad esempio, tipo vulcano. Mappa con sprite personaggi, canvas: anche mouseClick? Statistiche con nome gerarchico, es pokemon_attacco. Modalità survival, stile isola di jurassic park gdr; sia in coop che contro; possibilità di fare N turni di fila se non ci sono altri player giocanti nelle vicinanze (ciò però comporterebbe , in modalità contro , di capire quando c’è qualcuno nelle vicinanze perché si andrebbe di 1 turno alla volta, soluzioni: in mod contro 1 turno per volta oppure meccanismo di sincronizzazione turni quando uno vede l’altro (anche furtivo) come c’è attacco 1 turno a testa) .. analogo a Battle royale(?); inizio con starter kit random. Modalità assedio al castello. Inoltre se posso fare N turni di fila si può pensare a più pc , uno per persona , coordinati per fare comandi in parallelo, ma va ben congegnato meccanismo di sincronizzazione. Parti DelCorpo -&amp;gt; Componente/i oppure Parte. La mappa deve essere (x,y); l’altezza viene indicata onMouseOver certi pixel dove è posto il Personaggio; se personaggio dentro edificio/grotta cambio img (es sfocato/tratteggiato). Mosse: astrarre per target; molte mosse sono simili tra loro, somiglianza va sfruttata, hanno magari dei target in comune, o variano solo per un parametro. Creare mappa anche con drag and drop immagini ?(un po’ difficile). Più layout per interfaccia grafica (esempio uno che mostra errori input su text area, uno con alert, uno su box text area separato). Input comandi consumato pezzo per pezzo, alcune parole se prevedono parametri quando riconosciute fanno fetch anche di parola (numero) successiva. Face toon foto? Import parziali di personaggi (tutto tranne/solo questi campi specificati). Texture mappa complete o ripetibili (es per suolo). Anteprima battaglia stile battaglia pokemon (magari per 1/2/3 vs 1/2/3) per rappresentare scontro. Conviene usare xslx (excel) per dati, considerare che può non servire la libreria Java per leggere stringhe per operazioni. Mossa “again” , ripeti la precedenza(opportuna modifica parametri, es mossa spostamento). Possibile gestione contromosse: si usano marker (tag): ogni mossa ha elenco tag del tipo di contromosse che può subire (con probabilità annessa, che può dipendere da pg che subisce mossa congiuntamente a mossa stessa). Ogni mossa inoltre deve essere taggata come possibile contromossa che il pg può usare (per schivare può fare in più modi). A seconda del lancio del dado il pg che effettua La contromossa può anche scegliere tipologia di contromossa o solo la mossa della tipologia che ha beccato (entrano in gioco riflessi ect.). I parametri che fanno attivare unq o un’altra contromossa sono dinamici, posso dipendere ad esempio dalla posizione tra i due pg o altre statistiche. Tag contromosse a fasce (es. coprirsi è sempre più facile che schivare che e più facile di schivare e contrattaccare (?); all’interno dello stesso schivare e contrattaccare ci sono più sotto categorie). Per aggiunta personaggio può essere utili interfaccia dedicata, non linea di comando (o altre operazioni, specie se ci sono tabelle). Mossa “premonizione”: predire il futuro a breve termine, dici che mossa vorresti fare e ti dice esito (o più esiti se uno chiede più mosse). Funziona solo sulla prossima mossa. Contromossa delle contromossa gestione?? Eventualmente nell’esito si prevede ancore contro-contromossa. Ma si innesca reazione a catena, inoltre da gestire scelta contromossa in questo caso. Applicazione tag conoscenza(universo di appartenenza): “Termoli”, “pokemon”, “liceo classico Termoli”, anche gerarchici, per filtrare sui personaggi.target componibili , fattorizzato creazione mosse, hanno un costo magari per indicare quantovoccupano dicuna mossa, relativo maybe a un parametro o più del target stesso. In particolare, non saranno salvate le mosse per un personaggio (o solo alcune “preferite”) ma il suo insieme di target i quali devono dire:statistica che influenzano, “costo del turno” che richiedono al variare dell’intensità del target (che aumenta linearmente, esponenzialmente, generica f(x)) quindi corsa blanda costo 1 , Max corsa costo 5 (max), elenco (string) target incompatibili con tale target (se serve), nota relative ad es per quando uno vuole creare una mossa durante la battaglia (“target corsa, max sforzo dedicabile 4 ect” metti “50 metri corsa” “ok/troppo! Vuoi sforzati di più rischiando effetti collaterali?”). Si può autoscrivere la voce narrante del gioco come “la tua coscienza” mentre che giochi, d’altronde si interagisce con essa. Considerare che un target può appartenere a più personaggi, magari sotto nomi di mosse diversi.&lt;br /&gt;
Definire gerarchia di personaggi per template (tipo classe e super classe) e template importabili (tipo usa fuoco). Es umanoide non umanoide, tra umanoide maschio- femmina etc. Classe che estende System.out per creare funzioni che aggiungono Header “DEBUG:” etc; due programmi Java , due main: uno delegato a calcoli + gestione Excel; altro legge stdout dell altro per interfaccia grafica. Per allenare PG creare dei PG fantocci con label per fare Q-learning iniziale, più avanti far allenare pg tra loro; creare vari fantocci: tank terrestre fisico, healer volante etc. Excel: si usa css che si può rendere tabellare, più facile da trattare nel codice rispetto a .xslx. Ogni “utente” ed Lostefra ha il suo personale dizionario con sue personali short cut da usare in partita, eventuale login con password (opzionale) x accesso. Vedere license show down. Mappa unica stile giochi di ruolo, si vede tutto da sopra: click o simili su edifici/caverne per mappe interne a tale posto, così ok sprite e per rappresentare “pg in volo” sprite dedicato. Densità aria per dire quando anche un uomo per es può volare. Ipotesi più efficiente per dare un valore stima al pg: AI base che gioca a manetta contro altre AI base e dalle vittorie si fa l’euristica, più vittoria facile/veloce/stracciante più punti, contro vari pg, contro pg standard bench mark.&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Note&amp;diff=184</id>
		<title>Note</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Note&amp;diff=184"/>
		<updated>2020-02-22T12:38:42Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: deploy base&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Note ==&lt;br /&gt;
&lt;br /&gt;
'''Vedere altre note su fogli di carta e promemoria del telefono. Ce ne sono molte.'''&lt;br /&gt;
&lt;br /&gt;
===Deploy===&lt;br /&gt;
*Server web (Apache Tomcat) ospita partite (+ localmente ha i file di funzionamento), in LAN client giocano. Interfaccia HTML5 + Javascript per giocare. Scalabile per futuro, basta offrire servizio su un ip pubblico. Studiare engine grafici Javascript&lt;br /&gt;
&lt;br /&gt;
===Inspirational Concepts===&lt;br /&gt;
* Looney toons&lt;br /&gt;
&lt;br /&gt;
===Personaggi===&lt;br /&gt;
* Per personaggi molto piccoli (meno di 1m x 1m x 1m) possibilità di essere in (x,y,z) tra 0 e 1.000.000 (ordine del micrometro, 1*10^-6 == 0,000001) e avere (lenX, lenY, lenZ). In questo modo sono definite dimensioni inferiori ad 1 m^3.&lt;br /&gt;
* personaggi max 20x20 (rivaluato, meno limitata)&lt;br /&gt;
* possibilità giù in terra/ giù in acqua, con reachable e unreachable Boolean. Fuori da mappa anche reachable e unreachable.&lt;br /&gt;
* Personaggi composti di parti[] es. testa, busto, gambe, braccia, coda, pinna, ali. Distinzione per arto di movimento e/o spostamento boolean.&lt;br /&gt;
* Arti possono provocare danno, bruciatura , paralisi a contatto (Boolean) . Percentuale di probabilità accompagna ogni Boolean.&lt;br /&gt;
* Ogni parte del corpo punti vita + se inutilizzabile + amputata + stato (es paralisi).&lt;br /&gt;
* Per fare battaglie tra molto grandi =&amp;gt; 1 m lo si intende come 10m.  (rivalutato, aumentare livello scaling)&lt;br /&gt;
* Personaggio fusionabile Boolean + string nomi con cui si fonde.&lt;br /&gt;
&lt;br /&gt;
===Mosse===&lt;br /&gt;
* Parametri interi per mossa (direzione, consumabili) con lower e upper bound&lt;br /&gt;
* X fa una mossa contro Y: Z potrebbe reagire (Es. ricevendo il colpo al posto di Y). Può essere realizzato sia come se &amp;quot;Y chiede soccorso Z&amp;quot; o come reazione di alleati adiacenti &amp;quot;Z soccorre Y&amp;quot;&lt;br /&gt;
* Mossa prende come parametro di ingresso Corpo, ossia la parte del corpo coinvolta nella mossa (es arto , tutto corpo ect). &lt;br /&gt;
&lt;br /&gt;
===Oggetto===&lt;br /&gt;
* Classe oggetto: es albero, roccia, casa: forza necessaria per sradicare + forza per lanciare + destrezza / agilità per appendersi + nascondersi in proporzione alle dimensioni di chi si nasconde. &lt;br /&gt;
* Altri es. pali. Sotto terra o sotto acqua/lava/melma o simili. &lt;br /&gt;
* Acqua rallenta se non hai pinne boolean.&lt;br /&gt;
* Classe strumento per oggetti che si tengono in mano, es reti , pistole, spade, pugnali, scudi, elmi, lancia, arco , frecce, lanciarazzi, fucili cecchino, fucile assalto, corde.&lt;br /&gt;
*Strumenti e mosse: danno ad area, perforante, contundente (vedi dnd armi). Mosse possono creare/modificare/distruggere oggetti e strumenti .&lt;br /&gt;
&lt;br /&gt;
===Modalità gioco===&lt;br /&gt;
* Modalità battaglia con interazione stile battaglia navale (non si vede mossa dell'avversario)&lt;br /&gt;
&lt;br /&gt;
===Mappa===&lt;br /&gt;
* mappa 100x100 (rivalutato, meno limitata)&lt;br /&gt;
* Cannoni fissi in mezzo al campo (strumento).&lt;br /&gt;
&lt;br /&gt;
===Funzionalità generali===&lt;br /&gt;
* Segnalazione (comando per fare nota)&lt;br /&gt;
&lt;br /&gt;
===Copia&amp;amp;incolla generale, da smistare in sotto capitoli. Contiene anche '''tutte''' note del telefono (al 22/02/2020)===&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 1:'''&lt;br /&gt;
&lt;br /&gt;
Distinzione tra infernape e infernape1/2/3 ect tra “specie” e “nome”. Modalità di gioco: tutti contro tutti (battle royale), death match, vs CPU mode zombie(attaccano solo, se non possono vanno verso nemico): serve introdurre un punteggio, di sicuro per mode zombie , ma anche per death match e tutti contro tutti: variabile Boolean respawnable. Raccogliere a piene mani da: https://spore.fandom.com/wiki/Creature_Editor&lt;br /&gt;
Ad esempio weapons come elemento di Corpo (zanne, corna) e possibilità di muoversi/attaccare furtivamente.&lt;br /&gt;
Oggetti del campo di gioco incidono su elusione (parametro di personaggio ). Buco/abisso (boolean) per dire se c’è o meno il suolo (Suolo come classe?). Divisibile e unibile come boolean e array di stringe associate per indicare i nomi con cui si unisce il Personaggio o in cui si divide. Variabili posizione nome: from_x/y ; to_x/y. Classe Stato, Personaggio contiene Array di stato, stato contiene moltiplicatori per statistica es attacco velocità precisione elusione ect. Personaggio deve avere una stat tipo sanità mentale, intelligenza, quanto è confuso e quanto è impaurito (2). Radiazioni. Mosse che trasformano l’avversario: attenzione è una mossa devastante. Trasformazione totale o parziale. Si devono poter aggiungere mosse, strumenti dinamicamente. Battle bot:ribaltano, scintille, elementi (Oggetti) che danneggiano. One piece: I frutti del diavolo (悪魔の実 Akuma no mi?) sono frutti misteriosi che donano poteri soprannaturali a chi li mangia, rendendoli però incapaci di nuotare. Di conseguenza il contatto con l'acqua di mare o con una speciale sostanza conosciuta come agalmatolite indebolisce gli utilizzatori di frutti del diavolo e li priva dei loro poteri. Alcune persone sono inoltre in grado di ricorrere all'Ambizione (覇気 Haki?), una forza spirituale che permette di avvertire la presenza di altri esseri viventi e di predirne i movimenti, di irrobustire parti del corpo e di intimidire o fare svenire le creature con una debole forza di volontà. Personaggio ha funzione baricentro_x, baricentro_y calcolate come (from_x+to_x)/2 sul quale si basa la funzione di libreria getDistance(Personaggio A, Personaggio B, float success); tale funzione serve per calcolare per i PNG e per i PG se ha senso usare una mossa. Non-onniscienza: delle volte non si può sapere distanza avversario e fallisce la mossa per la distanza -&amp;gt; “float success” rappresenta la probabilità di successo (Personaggio ha parametro “osservare”). PNG di due categorie: offensivi o neutrali (no priorità a mosse di attacco, ma tutto casuale). Mosse e oggetti per chiamare Personaggi, magari non necessariamente alleati (2 mosse e 2 oggetti quindi necessari), richiamo di un personaggio preciso o di uno a caso. Ogni mossa/azione deve avere un tempo di attesa espresso in turni (alla meglio 0) per poter ripetere la mossa/azione. Strumenti anche mezzi di trasporto di aria, di terra, di acqua (o lava/palude). Possono attivare una metamorfosi / Unione per cambiare stats personaggio. Veicoli con armi o riparo. Gli strumenti da trattare come gli oggetti. Classe unica? I match/partite (immagino Classe Partita) devono avere variabile boolean “respawn”, per distinguere death match a punti con death match con una vita. Wrestling per ispirarsi nella lotta libera: calci pugni ginocchiate prese lanci salti testate gomitate ecc. Per punti si vince a un limite o dopo un tot di mosse , oppure al primo dei due raggiunti (max_punti e max_mosse parametri di Partita). I punti si guadagnano alla kill (un Punteggio per squadra, int punteggio salvato localmente dentro ogni Personaggio che ha la variabile int squadra). Si guadagnano tanti punti quanti sono i punti della variabile “valore” del personaggio ucciso, tale variabile è calcolata come somma dei valori di tutte le mosse/stats ect del Personaggio. Imperium civitas. Attacco dei giganti. Possibilità di morire se colpiti in un unico punto (tallone d Achille) implementabile come variabile boolean. Jump force. Game dev tycoon. Acqua diventa tsunami. Variabile int per attacco cumulativo di gruppo: es calciatori che più si passano la palla più l’attacco è forte. Suolo magico: non tutti i personaggi possono accedervi, array di string elenca i nomi di chi può accedervi. Funzione esci/entra in classe Personaggio per simulare scambio pokemon 6vs6. Piovra gigante. Rischio=danno*probabilita. Mossa su strumento e con strumento?&lt;br /&gt;
Mosse fisiche per arrampicarsi su avversario(se e solo se sei la metà di dimensioni(?)), atterrarlo, lanciarlo, accecarlo, immobilizzarlo. Se sei in gruppo/ orda bonus ad attacchi combinati. Armi: fruste e scheggie, corni che si suonano per chiamare altri. Tipo della mossa con moltiplicatore tra 0 (immune) e 2 (float): acqua, fuoco, magia, terra: da ispirarsi ai pokemon ma non da copiare, penso. Armi da campo: cannoni e catapulte. Veicoli d’acqua: moto acqua, canoe, barche a motore a remi. Nei veicoli malus su attenzione (variabile int in personaggio, indica attenzione in combattimento e non in altro) perché si è impegnato alla guida . All’inizio in image view “the hero” e “the map”. Condizione vittoria (oltre a morte, punti, o numero mosse, cioè tempo) morte di un singolo Personaggio, che potrebbe rappresentare un edificio, cassaforte o simili. Personaggio si può svestire e lasciare strumenti, modificano statistiche di attacco, difesa , agilità, ect. Variabile luce o non luce, che peggiora/migliora a seconda della specie la visibilità, quindi la precisione , specie in attacchi a distanza: Scurovisione evita i malus.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 2:'''&lt;br /&gt;
&lt;br /&gt;
Gioco2: se ci si lancia da oggetti , dopo essersi arrampicati, possono esserci danni da caduta; strumenti come paracaduti o mosse magiche possono evitare i danni. Pozione del vento, soffi e devi attacchi. In difesa puoi parare, schivare, deviare: tre variabili? Ambiente: colline e pianure uguali, Monti sono Oggetti, picco ossia un unico monte oggetto. Rocce volanti, nuvole sospese: oggetto può essere sospeso e può fare periodicamente una mossa, ad es tuono, può spostarsi, può fare entra/esci, oggetto albero e oggetto foresta, si possono prendere, nascondersi, arrampicarsi, lanciarli, ostacolano velocità ma se si ha abbastanza forza si spezzano alberi. Acqua poco profonda, profonda, molto profonda: variabile boolean in Personaggio “alto” per toccare in acqua profonda, con acqua si generano fiumi laghi e mari. Ambiente si deve poter evolvere: ad esempio oggetto diga può fare metamorfosi e diventare oggetto cascata/torrente in piena. Per edifici più oggetti che rappresentano le mura e il tetto, variabile boolean per oggetto per entrare nell’oggetto. Possono essere spazzati via: danni da crollo, si può combattere all interni, contengono strumenti come tavoli sedie mobili letto ect. Se uno viene schiantato contro uno strumento prende danno(es danno da schianto). Ci possono essere scale, si può non avere contatti visivo sull’avversario. Oggetto mura, oggetto torre, oggetto casa interno sono cose distinte: possono dare malus/bonus su visibilità. Ambiente: pozzi e grotte, da gestire come interno casa. Lava come acqua, ogni oggetto può essere sorgenti di liquido: monte sorgente acqua, vulcano sorgente lava. Può esserci variabile probabilità eruzione, se settata a 1 c’è una continua eruzione. Strade di vario tipo, sovrapposta a altri suoli, migliorano velocità di alcuni strumenti, variabile boolean “ha le ruote” in classe strumenti. Unificare classe strumento e classe oggetto. Oggetti sospesi: case sospese su albero, ad es. Fiamme in mezzo al suolo. Oggetti: porto, aereoporto, grattacieli, dighe, impianti a fune, ospedali per curarsi e prendere oggetti per curarsi dopo, scuole contenenti libri per apprendere una mossa, luoghi di ingegneria per creare oggetti, ad esempio veicoli o armi, soldi nel gioco per comprare da eventuali venditori. Ogni oggetto avra un prezzo (valutabile circa in euro per semplicità). Variabile float per fame, sete, sonno, caldo-freddo (parte da 0.5). Nella mappa ci deve essere per ogni punto la temperatura. Possibilità di vomito, dissenteria, problemi cardiaci, respiratori, muscolari. Armi: balestra, mani nude, sasso, tirapugni, torcia accesa. Armature: intralciano o favoriscono agilità, attacco, poteri magici, rumorosa (elusione), è uno strumento/oggetto. Attacchi possono essere prolungati per turni, mosse variabile boolean prolungabile: può aumentare o diminuire intensità, c’è un max espresso in turni di prolungabilita, inoltre può essere leggermente alterato con una variabile casuale. Equipaggiamento (strumento/oggetto): pietra focaia, attrezzi da scalata, boccale di birra, cavallo, moto, chiodi, martello da fabbro, corda, corazza, dardo, faretra/zaino/sacca (oggetti che contengono una lista di oggetti, stringhe) con un numero per la quantità) e capacità massima zaino e ogni oggetto può avere un valore intero per dimensione (es martello 3, ascia grande 7), mantello, olio, variabile boolean prende fuoco/conduce elettricità, amplifica magnetismo, aumenta esplosioni nucleari, aumenta forza di gravità (?), pala, piccone, rampino, specchio, per osservare quando si è nascosti e si ha malus su visibilità. Strumenti da scasso per aprire porte: variabile boolean per oggetti: entrata con scasso. Personaggio: string razza per swag, immunità a veleni e malattie, elusione, agilità, precisione, abilità magiche(?), difesa fisica. In ultima torcia: agilità, coraggio, forza, intelligenza, magia, manualità, percezione, socialità. Bestiario: aracnoide di varie dimensioni, talpe giganti, vermi giganti di terra di mare e di lava ect, bulbo trascinatore che ha tentacoli per tirare a se e mangiare, lui è immobile, calabrone gigante, serpenti giganti, cinghiali, draghi, elfi, goblin e re goblin, sciamani (goblin), totem di guerra come strumento/oggetti per alterare statistiche nella loro area di influenza, lupo, mastino bruciante, nani, non morti/zombie/mummia/scheletro variabile boolean vivo a false ma ha ancora hp su parti del corpo: variabile boolean “zombizabile”. Orchi, pesci da terra (anfibi) tritone dell abisso, troll e trollin (orchi più deformi), umani. Abilità dei personaggi in ultima torcia: artificiale (robot) immunità a soffocamento, veleni, malattie ect immune a manipolazioni psichiche, visione oscurità; danno da attacco in carica; fiammegiante ossia la creatura può incendiarsi e elettrizzante ossia può diventare elettrica caricamente; modalità furia/mailmen ossia ottiene bonus su alcune/tutte le statistiche; gigantesco o molto piccolo due boolean (?forse non serve); immunità a magie mentali, al fuoco; linguaggi (?); non morto; danno da attacco in presa; pungiglioni velenosi; sa muoversi su ragnatele o è rallentato, resistenza a perforazione, respirare sott’acqua o sotto lava o nei liquidi in genere; rigenerazione; riceve danni dalla luce solare o da assenza di luce; è terrorizzato/impaurito/intimidito o se è imperturbabile boolean. Danno da trascinamento; paralizzante; può diventare più veloce (?non serve); visione a infrarossi attraverso oggetti; volare o andare sotto terra. Imperium editor, cose che penso di non aver ancora scritto: stagioni, suolo erboso o terriccio, sabbia con erba e terra e da sola, strade e stagioni, altitudine, alberi e arbusti, vari tipi a foglia larga, conifere, alberi secchi, palme, arbusti verdi e secchi, cactus, alghe marine, rocce e pietre, scheletri per terra, legna tagliata (alberi tagliati), carri e carretti, grotte e rovine per accessi sotterranei, locande, templi, accampamenti, fortini, monoliti, fontana, tombe e cimiteri, borse per terra, pozzo, troni, croci(del teschio), pozzo, capanne, lapidi, ponti, recinzioni, falò, tende, torri, panoplia, fessure come abissi, statue, rovine (deserto) come case distrutte, colonne per costruire templi, piramidi, sfingi, bandiere, rovine in Europa, campi coltivati che contengono cibo, fiamma (in altre), roccia in altre per montagne, altre-&amp;gt;rovine per monumenti non egiziani ma europei.&lt;br /&gt;
Ci sono paludi. Tende da campo. Forti, porti. Edifici delle fortezze, edifici dei villaggi. Naufragi e scogli.&lt;br /&gt;
Parametri voglia/impegno float per descrivere voglia di combattere Personaggio. Ricevi danno uscendo dalla mappa tra 1-5% tra 6-10% tra 11-15% della vita totale di ogni parte del corpo per ogni turno di gioco. Danno da precipitazione diverso da carica, uno verticale uno orizzontale, se precipiti da molto in alto hai bonus, oltre che danni da schianto lol. Baionette, formazione a blocchi, a quadrato (difensiva) sparano su quattro lati, a schiera vanno avanti. Usano un colpo poi lunga ricarica. Variabile boolean per attivare o meno fuoco amico. Azione per cambiare posizione: in piedi, in ginocchio(inteso come via di mezzo), sdraiato: per permettere migliore visibilità a chi è dietro (nella formazione).&lt;br /&gt;
Altruismo, coraggio, spingere oltre il limite, difendere al posto di un altro, migliorare posizione per avere bonus. Mosse da usare in condizioni psicologiche idonee: mosse estreme per disperazione, bonus unici. Condizioni per situazioni: blocco, spalle al muro, stritolato, confuso, semi parassiti addosso, azzoppato, bagnato d’acqua, lame affilate, corazza indurita, tante copie di me stesso attive, preveggente. Per ambiente:pioggia (torrenziale), barriera a cupola, punte metalliche a terra, blocco di fumo nero. Far volare un avversario/alleato. Tutti possono fare tutto sotto effetti magici o fisici. Un cavallo può volare se viene preso da un uccello e portato in alto.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 3, 4:'''&lt;br /&gt;
&lt;br /&gt;
Gioco1,2,3,4: tutto caricato su wikis.&lt;br /&gt;
&lt;br /&gt;
Gioco3: Mosse con caricamento + spostamento (es. kameamea con teletrasporto). Ciclo di interazione principale:crea o combatti. Modalità campagna, che chiede in input da che battaglia iniziare, ma implica tipi battaglie prefissati. Alla morte/sconfitta di un personaggio si possono alterare statistiche (es personaggio può cambiare fazione). Alcune mosse possono lasciare oggetti sul terreno: (ad es, radici di Groth). Ogni oggetto può alterare le statistiche al passaggio sopra, nelle vicinanze. Boolean invisibile per personaggio, diverso da elusione infinita. Se personaggio va in un altro dimensione -&amp;gt; unreachable. Attacco coordinato, se non lo fanno tutti vale lo stesso ma depotenziato opportunamente . Personaggio in modalità maniac (2 mosse per turno) e in modalità depressive (1 mossa ogni due turni); personaggio Flash può fare 10 mosse in un turno. Chiudi con lucchetto oggetto da dentro o da fuori, oggetto ingresso in oggetto casa , più ingressi per un singolo oggetto.nicole aniston. Rimbalzo se ci si schianta contro oggetto da calcolare con parametro. Ryuk e Darkrai.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gioco 4 23/07/2019:&lt;br /&gt;
Pula fiction, aracnidi, oggetto: due superfici rettangolari di forma diversa, anche inclinate , collegate. Più pezzi collegati tra loro per forme cilindriche cave, ad esempio, tipo vulcano. Mappa con sprite personaggi, canvas: anche mouseClick? Statistiche con nome gerarchico, es pokemon_attacco. Modalità survival, stile isola di jurassic park gdr; sia in coop che contro; possibilità di fare N turni di fila se non ci sono altri player giocanti nelle vicinanze (ciò però comporterebbe , in modalità contro , di capire quando c’è qualcuno nelle vicinanze perché si andrebbe di 1 turno alla volta, soluzioni: in mod contro 1 turno per volta oppure meccanismo di sincronizzazione turni quando uno vede l’altro (anche furtivo) come c’è attacco 1 turno a testa) .. analogo a Battle royale(?); inizio con starter kit random. Modalità assedio al castello. Inoltre se posso fare N turni di fila si può pensare a più pc , uno per persona , coordinati per fare comandi in parallelo, ma va ben congegnato meccanismo di sincronizzazione. Parti DelCorpo -&amp;gt; Componente/i oppure Parte. La mappa deve essere (x,y); l’altezza viene indicata onMouseOver certi pixel dove è posto il Personaggio; se personaggio dentro edificio/grotta cambio img (es sfocato/tratteggiato). Mosse: astrarre per target; molte mosse sono simili tra loro, somiglianza va sfruttata, hanno magari dei target in comune, o variano solo per un parametro. Creare mappa anche con drag and drop immagini ?(un po’ difficile). Più layout per interfaccia grafica (esempio uno che mostra errori input su text area, uno con alert, uno su box text area separato). Input comandi consumato pezzo per pezzo, alcune parole se prevedono parametri quando riconosciute fanno fetch anche di parola (numero) successiva. Face toon foto? Import parziali di personaggi (tutto tranne/solo questi campi specificati). Texture mappa complete o ripetibili (es per suolo). Anteprima battaglia stile battaglia pokemon (magari per 1/2/3 vs 1/2/3) per rappresentare scontro. Conviene usare xslx (excel) per dati, considerare che può non servire la libreria Java per leggere stringhe per operazioni. Mossa “again” , ripeti la precedenza(opportuna modifica parametri, es mossa spostamento). Possibile gestione contromosse: si usano marker (tag): ogni mossa ha elenco tag del tipo di contromosse che può subire (con probabilità annessa, che può dipendere da pg che subisce mossa congiuntamente a mossa stessa). Ogni mossa inoltre deve essere taggata come possibile contromossa che il pg può usare (per schivare può fare in più modi). A seconda del lancio del dado il pg che effettua La contromossa può anche scegliere tipologia di contromossa o solo la mossa della tipologia che ha beccato (entrano in gioco riflessi ect.). I parametri che fanno attivare unq o un’altra contromossa sono dinamici, posso dipendere ad esempio dalla posizione tra i due pg o altre statistiche. Tag contromosse a fasce (es. coprirsi è sempre più facile che schivare che e più facile di schivare e contrattaccare (?); all’interno dello stesso schivare e contrattaccare ci sono più sotto categorie). Per aggiunta personaggio può essere utili interfaccia dedicata, non linea di comando (o altre operazioni, specie se ci sono tabelle). Mossa “premonizione”: predire il futuro a breve termine, dici che mossa vorresti fare e ti dice esito (o più esiti se uno chiede più mosse). Funziona solo sulla prossima mossa. Contromossa delle contromossa gestione?? Eventualmente nell’esito si prevede ancore contro-contromossa. Ma si innesca reazione a catena, inoltre da gestire scelta contromossa in questo caso. Applicazione tag conoscenza(universo di appartenenza): “Termoli”, “pokemon”, “liceo classico Termoli”, anche gerarchici, per filtrare sui personaggi.target componibili , fattorizzato creazione mosse, hanno un costo magari per indicare quantovoccupano dicuna mossa, relativo maybe a un parametro o più del target stesso. In particolare, non saranno salvate le mosse per un personaggio (o solo alcune “preferite”) ma il suo insieme di target i quali devono dire:statistica che influenzano, “costo del turno” che richiedono al variare dell’intensità del target (che aumenta linearmente, esponenzialmente, generica f(x)) quindi corsa blanda costo 1 , Max corsa costo 5 (max), elenco (string) target incompatibili con tale target (se serve), nota relative ad es per quando uno vuole creare una mossa durante la battaglia (“target corsa, max sforzo dedicabile 4 ect” metti “50 metri corsa” “ok/troppo! Vuoi sforzati di più rischiando effetti collaterali?”). Si può autoscrivere la voce narrante del gioco come “la tua coscienza” mentre che giochi, d’altronde si interagisce con essa. Considerare che un target può appartenere a più personaggi, magari sotto nomi di mosse diversi.&lt;br /&gt;
Definire gerarchia di personaggi per template (tipo classe e super classe) e template importabili (tipo usa fuoco). Es umanoide non umanoide, tra umanoide maschio- femmina etc. Classe che estende System.out per creare funzioni che aggiungono Header “DEBUG:” etc; due programmi Java , due main: uno delegato a calcoli + gestione Excel; altro legge stdout dell altro per interfaccia grafica. Per allenare PG creare dei PG fantocci con label per fare Q-learning iniziale, più avanti far allenare pg tra loro; creare vari fantocci: tank terrestre fisico, healer volante etc. Excel: si usa css che si può rendere tabellare, più facile da trattare nel codice rispetto a .xslx. Ogni “utente” ed Lostefra ha il suo personale dizionario con sue personali short cut da usare in partita, eventuale login con password (opzionale) x accesso. Vedere license show down. Mappa unica stile giochi di ruolo, si vede tutto da sopra: click o simili su edifici/caverne per mappe interne a tale posto, così ok sprite e per rappresentare “pg in volo” sprite dedicato. Densità aria per dire quando anche un uomo per es può volare. Ipotesi più efficiente per dare un valore stima al pg: AI base che gioca a manetta contro altre AI base e dalle vittorie si fa l’euristica, più vittoria facile/veloce/stracciante più punti, contro vari pg, contro pg standard bench mark.&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Note&amp;diff=183</id>
		<title>Note</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Note&amp;diff=183"/>
		<updated>2020-02-18T19:52:00Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: /* Note */  - note telefono update, riscrittura parzialmente iniziata&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Note ==&lt;br /&gt;
&lt;br /&gt;
'''Vedere altre note su fogli di carta e promemoria del telefono. Ce ne sono molte.'''&lt;br /&gt;
&lt;br /&gt;
===Inspirational Concepts===&lt;br /&gt;
* Looney toons&lt;br /&gt;
&lt;br /&gt;
===Personaggi===&lt;br /&gt;
* Per personaggi molto piccoli (meno di 1m x 1m x 1m) possibilità di essere in (x,y,z) tra 0 e 1.000.000 (ordine del micrometro, 1*10^-6 == 0,000001) e avere (lenX, lenY, lenZ). In questo modo sono definite dimensioni inferiori ad 1 m^3.&lt;br /&gt;
* personaggi max 20x20 (rivaluato, meno limitata)&lt;br /&gt;
* possibilità giù in terra/ giù in acqua, con reachable e unreachable Boolean. Fuori da mappa anche reachable e unreachable.&lt;br /&gt;
* Personaggi composti di parti[] es. testa, busto, gambe, braccia, coda, pinna, ali. Distinzione per arto di movimento e/o spostamento boolean.&lt;br /&gt;
* Arti possono provocare danno, bruciatura , paralisi a contatto (Boolean) . Percentuale di probabilità accompagna ogni Boolean.&lt;br /&gt;
* Ogni parte del corpo punti vita + se inutilizzabile + amputata + stato (es paralisi).&lt;br /&gt;
* Per fare battaglie tra molto grandi =&amp;gt; 1 m lo si intende come 10m.  (rivalutato, aumentare livello scaling)&lt;br /&gt;
* Personaggio fusionabile Boolean + string nomi con cui si fonde.&lt;br /&gt;
&lt;br /&gt;
===Mosse===&lt;br /&gt;
* Parametri interi per mossa (direzione, consumabili) con lower e upper bound&lt;br /&gt;
* X fa una mossa contro Y: Z potrebbe reagire (Es. ricevendo il colpo al posto di Y). Può essere realizzato sia come se &amp;quot;Y chiede soccorso Z&amp;quot; o come reazione di alleati adiacenti &amp;quot;Z soccorre Y&amp;quot;&lt;br /&gt;
* Mossa prende come parametro di ingresso Corpo, ossia la parte del corpo coinvolta nella mossa (es arto , tutto corpo ect). &lt;br /&gt;
&lt;br /&gt;
===Oggetto===&lt;br /&gt;
* Classe oggetto: es albero, roccia, casa: forza necessaria per sradicare + forza per lanciare + destrezza / agilità per appendersi + nascondersi in proporzione alle dimensioni di chi si nasconde. &lt;br /&gt;
* Altri es. pali. Sotto terra o sotto acqua/lava/melma o simili. &lt;br /&gt;
* Acqua rallenta se non hai pinne boolean.&lt;br /&gt;
* Classe strumento per oggetti che si tengono in mano, es reti , pistole, spade, pugnali, scudi, elmi, lancia, arco , frecce, lanciarazzi, fucili cecchino, fucile assalto, corde.&lt;br /&gt;
*Strumenti e mosse: danno ad area, perforante, contundente (vedi dnd armi). Mosse possono creare/modificare/distruggere oggetti e strumenti .&lt;br /&gt;
&lt;br /&gt;
===Modalità gioco===&lt;br /&gt;
* Modalità battaglia con interazione stile battaglia navale (non si vede mossa dell'avversario)&lt;br /&gt;
&lt;br /&gt;
===Mappa===&lt;br /&gt;
* mappa 100x100 (rivalutato, meno limitata)&lt;br /&gt;
* Cannoni fissi in mezzo al campo (strumento).&lt;br /&gt;
&lt;br /&gt;
===Funzionalità generali===&lt;br /&gt;
* Segnalazione (comando per fare nota)&lt;br /&gt;
&lt;br /&gt;
===Copia&amp;amp;incolla generale, da smistare in sotto capitoli. Contiene anche tutte note del telefono===&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 1:'''&lt;br /&gt;
&lt;br /&gt;
Distinzione tra infernape e infernape1/2/3 ect tra “specie” e “nome”. Modalità di gioco: tutti contro tutti (battle royale), death match, vs CPU mode zombie(attaccano solo, se non possono vanno verso nemico): serve introdurre un punteggio, di sicuro per mode zombie , ma anche per death match e tutti contro tutti: variabile Boolean respawnable. Raccogliere a piene mani da: https://spore.fandom.com/wiki/Creature_Editor&lt;br /&gt;
Ad esempio weapons come elemento di Corpo (zanne, corna) e possibilità di muoversi/attaccare furtivamente.&lt;br /&gt;
Oggetti del campo di gioco incidono su elusione (parametro di personaggio ). Buco/abisso (boolean) per dire se c’è o meno il suolo (Suolo come classe?). Divisibile e unibile come boolean e array di stringe associate per indicare i nomi con cui si unisce il Personaggio o in cui si divide. Variabili posizione nome: from_x/y ; to_x/y. Classe Stato, Personaggio contiene Array di stato, stato contiene moltiplicatori per statistica es attacco velocità precisione elusione ect. Personaggio deve avere una stat tipo sanità mentale, intelligenza, quanto è confuso e quanto è impaurito (2). Radiazioni. Mosse che trasformano l’avversario: attenzione è una mossa devastante. Trasformazione totale o parziale. Si devono poter aggiungere mosse, strumenti dinamicamente. Battle bot:ribaltano, scintille, elementi (Oggetti) che danneggiano. One piece: I frutti del diavolo (悪魔の実 Akuma no mi?) sono frutti misteriosi che donano poteri soprannaturali a chi li mangia, rendendoli però incapaci di nuotare. Di conseguenza il contatto con l'acqua di mare o con una speciale sostanza conosciuta come agalmatolite indebolisce gli utilizzatori di frutti del diavolo e li priva dei loro poteri. Alcune persone sono inoltre in grado di ricorrere all'Ambizione (覇気 Haki?), una forza spirituale che permette di avvertire la presenza di altri esseri viventi e di predirne i movimenti, di irrobustire parti del corpo e di intimidire o fare svenire le creature con una debole forza di volontà. Personaggio ha funzione baricentro_x, baricentro_y calcolate come (from_x+to_x)/2 sul quale si basa la funzione di libreria getDistance(Personaggio A, Personaggio B, float success); tale funzione serve per calcolare per i PNG e per i PG se ha senso usare una mossa. Non-onniscienza: delle volte non si può sapere distanza avversario e fallisce la mossa per la distanza -&amp;gt; “float success” rappresenta la probabilità di successo (Personaggio ha parametro “osservare”). PNG di due categorie: offensivi o neutrali (no priorità a mosse di attacco, ma tutto casuale). Mosse e oggetti per chiamare Personaggi, magari non necessariamente alleati (2 mosse e 2 oggetti quindi necessari), richiamo di un personaggio preciso o di uno a caso. Ogni mossa/azione deve avere un tempo di attesa espresso in turni (alla meglio 0) per poter ripetere la mossa/azione. Strumenti anche mezzi di trasporto di aria, di terra, di acqua (o lava/palude). Possono attivare una metamorfosi / Unione per cambiare stats personaggio. Veicoli con armi o riparo. Gli strumenti da trattare come gli oggetti. Classe unica? I match/partite (immagino Classe Partita) devono avere variabile boolean “respawn”, per distinguere death match a punti con death match con una vita. Wrestling per ispirarsi nella lotta libera: calci pugni ginocchiate prese lanci salti testate gomitate ecc. Per punti si vince a un limite o dopo un tot di mosse , oppure al primo dei due raggiunti (max_punti e max_mosse parametri di Partita). I punti si guadagnano alla kill (un Punteggio per squadra, int punteggio salvato localmente dentro ogni Personaggio che ha la variabile int squadra). Si guadagnano tanti punti quanti sono i punti della variabile “valore” del personaggio ucciso, tale variabile è calcolata come somma dei valori di tutte le mosse/stats ect del Personaggio. Imperium civitas. Attacco dei giganti. Possibilità di morire se colpiti in un unico punto (tallone d Achille) implementabile come variabile boolean. Jump force. Game dev tycoon. Acqua diventa tsunami. Variabile int per attacco cumulativo di gruppo: es calciatori che più si passano la palla più l’attacco è forte. Suolo magico: non tutti i personaggi possono accedervi, array di string elenca i nomi di chi può accedervi. Funzione esci/entra in classe Personaggio per simulare scambio pokemon 6vs6. Piovra gigante. Rischio=danno*probabilita. Mossa su strumento e con strumento?&lt;br /&gt;
Mosse fisiche per arrampicarsi su avversario(se e solo se sei la metà di dimensioni(?)), atterrarlo, lanciarlo, accecarlo, immobilizzarlo. Se sei in gruppo/ orda bonus ad attacchi combinati. Armi: fruste e scheggie, corni che si suonano per chiamare altri. Tipo della mossa con moltiplicatore tra 0 (immune) e 2 (float): acqua, fuoco, magia, terra: da ispirarsi ai pokemon ma non da copiare, penso. Armi da campo: cannoni e catapulte. Veicoli d’acqua: moto acqua, canoe, barche a motore a remi. Nei veicoli malus su attenzione (variabile int in personaggio, indica attenzione in combattimento e non in altro) perché si è impegnato alla guida . All’inizio in image view “the hero” e “the map”. Condizione vittoria (oltre a morte, punti, o numero mosse, cioè tempo) morte di un singolo Personaggio, che potrebbe rappresentare un edificio, cassaforte o simili. Personaggio si può svestire e lasciare strumenti, modificano statistiche di attacco, difesa , agilità, ect. Variabile luce o non luce, che peggiora/migliora a seconda della specie la visibilità, quindi la precisione , specie in attacchi a distanza: Scurovisione evita i malus.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 2:'''&lt;br /&gt;
&lt;br /&gt;
Gioco2: se ci si lancia da oggetti , dopo essersi arrampicati, possono esserci danni da caduta; strumenti come paracaduti o mosse magiche possono evitare i danni. Pozione del vento, soffi e devi attacchi. In difesa puoi parare, schivare, deviare: tre variabili? Ambiente: colline e pianure uguali, Monti sono Oggetti, picco ossia un unico monte oggetto. Rocce volanti, nuvole sospese: oggetto può essere sospeso e può fare periodicamente una mossa, ad es tuono, può spostarsi, può fare entra/esci, oggetto albero e oggetto foresta, si possono prendere, nascondersi, arrampicarsi, lanciarli, ostacolano velocità ma se si ha abbastanza forza si spezzano alberi. Acqua poco profonda, profonda, molto profonda: variabile boolean in Personaggio “alto” per toccare in acqua profonda, con acqua si generano fiumi laghi e mari. Ambiente si deve poter evolvere: ad esempio oggetto diga può fare metamorfosi e diventare oggetto cascata/torrente in piena. Per edifici più oggetti che rappresentano le mura e il tetto, variabile boolean per oggetto per entrare nell’oggetto. Possono essere spazzati via: danni da crollo, si può combattere all interni, contengono strumenti come tavoli sedie mobili letto ect. Se uno viene schiantato contro uno strumento prende danno(es danno da schianto). Ci possono essere scale, si può non avere contatti visivo sull’avversario. Oggetto mura, oggetto torre, oggetto casa interno sono cose distinte: possono dare malus/bonus su visibilità. Ambiente: pozzi e grotte, da gestire come interno casa. Lava come acqua, ogni oggetto può essere sorgenti di liquido: monte sorgente acqua, vulcano sorgente lava. Può esserci variabile probabilità eruzione, se settata a 1 c’è una continua eruzione. Strade di vario tipo, sovrapposta a altri suoli, migliorano velocità di alcuni strumenti, variabile boolean “ha le ruote” in classe strumenti. Unificare classe strumento e classe oggetto. Oggetti sospesi: case sospese su albero, ad es. Fiamme in mezzo al suolo. Oggetti: porto, aereoporto, grattacieli, dighe, impianti a fune, ospedali per curarsi e prendere oggetti per curarsi dopo, scuole contenenti libri per apprendere una mossa, luoghi di ingegneria per creare oggetti, ad esempio veicoli o armi, soldi nel gioco per comprare da eventuali venditori. Ogni oggetto avra un prezzo (valutabile circa in euro per semplicità). Variabile float per fame, sete, sonno, caldo-freddo (parte da 0.5). Nella mappa ci deve essere per ogni punto la temperatura. Possibilità di vomito, dissenteria, problemi cardiaci, respiratori, muscolari. Armi: balestra, mani nude, sasso, tirapugni, torcia accesa. Armature: intralciano o favoriscono agilità, attacco, poteri magici, rumorosa (elusione), è uno strumento/oggetto. Attacchi possono essere prolungati per turni, mosse variabile boolean prolungabile: può aumentare o diminuire intensità, c’è un max espresso in turni di prolungabilita, inoltre può essere leggermente alterato con una variabile casuale. Equipaggiamento (strumento/oggetto): pietra focaia, attrezzi da scalata, boccale di birra, cavallo, moto, chiodi, martello da fabbro, corda, corazza, dardo, faretra/zaino/sacca (oggetti che contengono una lista di oggetti, stringhe) con un numero per la quantità) e capacità massima zaino e ogni oggetto può avere un valore intero per dimensione (es martello 3, ascia grande 7), mantello, olio, variabile boolean prende fuoco/conduce elettricità, amplifica magnetismo, aumenta esplosioni nucleari, aumenta forza di gravità (?), pala, piccone, rampino, specchio, per osservare quando si è nascosti e si ha malus su visibilità. Strumenti da scasso per aprire porte: variabile boolean per oggetti: entrata con scasso. Personaggio: string razza per swag, immunità a veleni e malattie, elusione, agilità, precisione, abilità magiche(?), difesa fisica. In ultima torcia: agilità, coraggio, forza, intelligenza, magia, manualità, percezione, socialità. Bestiario: aracnoide di varie dimensioni, talpe giganti, vermi giganti di terra di mare e di lava ect, bulbo trascinatore che ha tentacoli per tirare a se e mangiare, lui è immobile, calabrone gigante, serpenti giganti, cinghiali, draghi, elfi, goblin e re goblin, sciamani (goblin), totem di guerra come strumento/oggetti per alterare statistiche nella loro area di influenza, lupo, mastino bruciante, nani, non morti/zombie/mummia/scheletro variabile boolean vivo a false ma ha ancora hp su parti del corpo: variabile boolean “zombizabile”. Orchi, pesci da terra (anfibi) tritone dell abisso, troll e trollin (orchi più deformi), umani. Abilità dei personaggi in ultima torcia: artificiale (robot) immunità a soffocamento, veleni, malattie ect immune a manipolazioni psichiche, visione oscurità; danno da attacco in carica; fiammegiante ossia la creatura può incendiarsi e elettrizzante ossia può diventare elettrica caricamente; modalità furia/mailmen ossia ottiene bonus su alcune/tutte le statistiche; gigantesco o molto piccolo due boolean (?forse non serve); immunità a magie mentali, al fuoco; linguaggi (?); non morto; danno da attacco in presa; pungiglioni velenosi; sa muoversi su ragnatele o è rallentato, resistenza a perforazione, respirare sott’acqua o sotto lava o nei liquidi in genere; rigenerazione; riceve danni dalla luce solare o da assenza di luce; è terrorizzato/impaurito/intimidito o se è imperturbabile boolean. Danno da trascinamento; paralizzante; può diventare più veloce (?non serve); visione a infrarossi attraverso oggetti; volare o andare sotto terra. Imperium editor, cose che penso di non aver ancora scritto: stagioni, suolo erboso o terriccio, sabbia con erba e terra e da sola, strade e stagioni, altitudine, alberi e arbusti, vari tipi a foglia larga, conifere, alberi secchi, palme, arbusti verdi e secchi, cactus, alghe marine, rocce e pietre, scheletri per terra, legna tagliata (alberi tagliati), carri e carretti, grotte e rovine per accessi sotterranei, locande, templi, accampamenti, fortini, monoliti, fontana, tombe e cimiteri, borse per terra, pozzo, troni, croci(del teschio), pozzo, capanne, lapidi, ponti, recinzioni, falò, tende, torri, panoplia, fessure come abissi, statue, rovine (deserto) come case distrutte, colonne per costruire templi, piramidi, sfingi, bandiere, rovine in Europa, campi coltivati che contengono cibo, fiamma (in altre), roccia in altre per montagne, altre-&amp;gt;rovine per monumenti non egiziani ma europei.&lt;br /&gt;
Ci sono paludi. Tende da campo. Forti, porti. Edifici delle fortezze, edifici dei villaggi. Naufragi e scogli.&lt;br /&gt;
Parametri voglia/impegno float per descrivere voglia di combattere Personaggio. Ricevi danno uscendo dalla mappa tra 1-5% tra 6-10% tra 11-15% della vita totale di ogni parte del corpo per ogni turno di gioco. Danno da precipitazione diverso da carica, uno verticale uno orizzontale, se precipiti da molto in alto hai bonus, oltre che danni da schianto lol. Baionette, formazione a blocchi, a quadrato (difensiva) sparano su quattro lati, a schiera vanno avanti. Usano un colpo poi lunga ricarica. Variabile boolean per attivare o meno fuoco amico. Azione per cambiare posizione: in piedi, in ginocchio(inteso come via di mezzo), sdraiato: per permettere migliore visibilità a chi è dietro (nella formazione).&lt;br /&gt;
Altruismo, coraggio, spingere oltre il limite, difendere al posto di un altro, migliorare posizione per avere bonus. Mosse da usare in condizioni psicologiche idonee: mosse estreme per disperazione, bonus unici. Condizioni per situazioni: blocco, spalle al muro, stritolato, confuso, semi parassiti addosso, azzoppato, bagnato d’acqua, lame affilate, corazza indurita, tante copie di me stesso attive, preveggente. Per ambiente:pioggia (torrenziale), barriera a cupola, punte metalliche a terra, blocco di fumo nero. Far volare un avversario/alleato. Tutti possono fare tutto sotto effetti magici o fisici. Un cavallo può volare se viene preso da un uccello e portato in alto.&lt;br /&gt;
&lt;br /&gt;
Da '''GIOCO 3, 4:'''&lt;br /&gt;
&lt;br /&gt;
Gioco1,2,3,4: tutto caricato su wikis.&lt;br /&gt;
&lt;br /&gt;
Gioco3: Mosse con caricamento + spostamento (es. kameamea con teletrasporto). Ciclo di interazione principale:crea o combatti. Modalità campagna, che chiede in input da che battaglia iniziare, ma implica tipi battaglie prefissati. Alla morte/sconfitta di un personaggio si possono alterare statistiche (es personaggio può cambiare fazione). Alcune mosse possono lasciare oggetti sul terreno: (ad es, radici di Groth). Ogni oggetto può alterare le statistiche al passaggio sopra, nelle vicinanze. Boolean invisibile per personaggio, diverso da elusione infinita. Se personaggio va in un altro dimensione -&amp;gt; unreachable. Attacco coordinato, se non lo fanno tutti vale lo stesso ma depotenziato opportunamente . Personaggio in modalità maniac (2 mosse per turno) e in modalità depressive (1 mossa ogni due turni); personaggio Flash può fare 10 mosse in un turno. Chiudi con lucchetto oggetto da dentro o da fuori, oggetto ingresso in oggetto casa , più ingressi per un singolo oggetto.nicole aniston. Rimbalzo se ci si schianta contro oggetto da calcolare con parametro. Ryuk e Darkrai.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gioco 4 23/07/2019:&lt;br /&gt;
Pula fiction, aracnidi, oggetto: due superfici rettangolari di forma diversa, anche inclinate , collegate. Più pezzi collegati tra loro per forme cilindriche cave, ad esempio, tipo vulcano. Mappa con sprite personaggi, canvas: anche mouseClick? Statistiche con nome gerarchico, es pokemon_attacco. Modalità survival, stile isola di jurassic park gdr; sia in coop che contro; possibilità di fare N turni di fila se non ci sono altri player giocanti nelle vicinanze (ciò però comporterebbe , in modalità contro , di capire quando c’è qualcuno nelle vicinanze perché si andrebbe di 1 turno alla volta, soluzioni: in mod contro 1 turno per volta oppure meccanismo di sincronizzazione turni quando uno vede l’altro (anche furtivo) come c’è attacco 1 turno a testa) .. analogo a Battle royale(?); inizio con starter kit random. Modalità assedio al castello. Inoltre se posso fare N turni di fila si può pensare a più pc , uno per persona , coordinati per fare comandi in parallelo, ma va ben congegnato meccanismo di sincronizzazione. Parti DelCorpo -&amp;gt; Componente/i oppure Parte. La mappa deve essere (x,y); l’altezza viene indicata onMouseOver certi pixel dove è posto il Personaggio; se personaggio dentro edificio/grotta cambio img (es sfocato/tratteggiato). Mosse: astrarre per target; molte mosse sono simili tra loro, somiglianza va sfruttata, hanno magari dei target in comune, o variano solo per un parametro. Creare mappa anche con drag and drop immagini ?(un po’ difficile). Più layout per interfaccia grafica (esempio uno che mostra errori input su text area, uno con alert, uno su box text area separato). Input comandi consumato pezzo per pezzo, alcune parole se prevedono parametri quando riconosciute fanno fetch anche di parola (numero) successiva. Face toon foto? Import parziali di personaggi (tutto tranne/solo questi campi specificati). Texture mappa complete o ripetibili (es per suolo). Anteprima battaglia stile battaglia pokemon (magari per 1/2/3 vs 1/2/3) per rappresentare scontro. Conviene usare xslx (excel) per dati, considerare che può non servire la libreria Java per leggere stringhe per operazioni. Mossa “again” , ripeti la precedenza(opportuna modifica parametri, es mossa spostamento). Possibile gestione contromosse: si usano marker (tag): ogni mossa ha elenco tag del tipo di contromosse che può subire (con probabilità annessa, che può dipendere da pg che subisce mossa congiuntamente a mossa stessa). Ogni mossa inoltre deve essere taggata come possibile contromossa che il pg può usare (per schivare può fare in più modi). A seconda del lancio del dado il pg che effettua La contromossa può anche scegliere tipologia di contromossa o solo la mossa della tipologia che ha beccato (entrano in gioco riflessi ect.). I parametri che fanno attivare unq o un’altra contromossa sono dinamici, posso dipendere ad esempio dalla posizione tra i due pg o altre statistiche. Tag contromosse a fasce (es. coprirsi è sempre più facile che schivare che e più facile di schivare e contrattaccare (?); all’interno dello stesso schivare e contrattaccare ci sono più sotto categorie). Per aggiunta personaggio può essere utili interfaccia dedicata, non linea di comando (o altre operazioni, specie se ci sono tabelle). Mossa “premonizione”: predire il futuro a breve termine, dici che mossa vorresti fare e ti dice esito (o più esiti se uno chiede più mosse). Funziona solo sulla prossima mossa. Contromossa delle contromossa gestione?? Eventualmente nell’esito si prevede ancore contro-contromossa. Ma si innesca reazione a catena, inoltre da gestire scelta contromossa in questo caso. Applicazione tag conoscenza(universo di appartenenza): “Termoli”, “pokemon”, “liceo classico Termoli”, anche gerarchici, per filtrare sui personaggi.target componibili , fattorizzato creazione mosse, hanno un costo magari per indicare quantovoccupano dicuna mossa, relativo maybe a un parametro o più del target stesso. In particolare, non saranno salvate le mosse per un personaggio (o solo alcune “preferite”) ma il suo insieme di target i quali devono dire:statistica che influenzano, “costo del turno” che richiedono al variare dell’intensità del target (che aumenta linearmente, esponenzialmente, generica f(x)) quindi corsa blanda costo 1 , Max corsa costo 5 (max), elenco (string) target incompatibili con tale target (se serve), nota relative ad es per quando uno vuole creare una mossa durante la battaglia (“target corsa, max sforzo dedicabile 4 ect” metti “50 metri corsa” “ok/troppo! Vuoi sforzati di più rischiando effetti collaterali?”). Si può autoscrivere la voce narrante del gioco come “la tua coscienza” mentre che giochi, d’altronde si interagisce con essa. Considerare che un target può appartenere a più personaggi, magari sotto nomi di mosse diversi.&lt;br /&gt;
Definire gerarchia di personaggi per template (tipo classe e super classe) e template importabili (tipo usa fuoco). Es umanoide non umanoide, tra umanoide maschio- femmina etc. Classe che estende System.out per creare funzioni che aggiungono Header “DEBUG:” etc; due programmi Java , due main: uno delegato a calcoli + gestione Excel; altro legge stdout dell altro per interfaccia grafica. Per allenare PG creare dei PG fantocci con label per fare Q-learning iniziale, più avanti far allenare pg tra loro; creare vari fantocci: tank terrestre fisico, healer volante etc. Excel: si usa css che si può rendere tabellare, più facile da trattare nel codice rispetto a .xslx. Ogni “utente” ed Lostefra ha il suo personale dizionario con sue personali short cut da usare in partita, eventuale login con password (opzionale) x accesso. Vedere license show down. Mappa unica stile giochi di ruolo, si vede tutto da sopra: click o simili su edifici/caverne per mappe interne a tale posto, così ok sprite e per rappresentare “pg in volo” sprite dedicato. Densità aria per dire quando anche un uomo per es può volare. Ipotesi più efficiente per dare un valore stima al pg: AI base che gioca a manetta contro altre AI base e dalle vittorie si fa l’euristica, più vittoria facile/veloce/stracciante più punti, contro vari pg, contro pg standard bench mark.&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=La_Lotta&amp;diff=182</id>
		<title>La Lotta</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=La_Lotta&amp;diff=182"/>
		<updated>2019-10-20T16:53:17Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: headers&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Benvenuto nel wiki del gioco La Lotta ===&lt;br /&gt;
Ciao! Questo è un progetto personale che mira a simulare un gioco di lotta in una qualunque modalità pensabile e tra combattenti di una qualunque tipologia immaginabile. &lt;br /&gt;
&lt;br /&gt;
Su questo wiki sarà presente la parte progettuale, su [https://github.com/Lostefra/LaLotta Github] sarà presente il codice sorgente dell'applicazione (attualmente il progetto è privato, per visionarlo contattami).&lt;br /&gt;
&lt;br /&gt;
Il gioco sarà testuale e molto basilare in apparenza, ma avrà una logica interna tutt'altro che banale! Buon divertimento!&lt;br /&gt;
&lt;br /&gt;
=== Indice Wiki ===&lt;br /&gt;
Qui puoi trovare un '''indice''' che riassume le sezioni del wiki: &lt;br /&gt;
* [http://wikis.primomiglio.it/index.php?title=Classi_Dominio Classi del Dominio]&lt;br /&gt;
&lt;br /&gt;
Attualmente è presente solo l'indice delle classi di dominio, quando ci saranno altre sezioni sarà fornito un indice generale.&lt;br /&gt;
&lt;br /&gt;
Infine, [http://wikis.primomiglio.it/index.php?title=Note qui] puoi trovare le '''note''', ossia spunti di riflessione che sto portando avanti nella progettazione del gioco.&lt;br /&gt;
&lt;br /&gt;
=== Elenco lavori in corso ===&lt;br /&gt;
Attualmente è in lavorazione l'analisi del dominio del gioco. Sono reperibili qui sul wiki informazioni sulla struttura delle classi che saranno utilizzate. Il progetto complessivamente è in fase '''embrionale'''.&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Classi_Dominio&amp;diff=181</id>
		<title>Classi Dominio</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Classi_Dominio&amp;diff=181"/>
		<updated>2019-10-20T16:52:01Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Elenco classi di dominio ===&lt;br /&gt;
&lt;br /&gt;
* [http://wikis.primomiglio.it/index.php?title=Ente_(Personaggio/Oggetto)#Ente Ente]&lt;br /&gt;
* [http://wikis.primomiglio.it/index.php?title=Ente_(Personaggio/Oggetto)#Personaggio Personaggio]&lt;br /&gt;
* [http://wikis.primomiglio.it/index.php?title=Ente_(Personaggio/Oggetto)#Oggetto Oggetto]&lt;br /&gt;
* [http://wikis.primomiglio.it/index.php?title=Statistica Statistica]&lt;br /&gt;
* [http://wikis.primomiglio.it/index.php?title=Stato Stato]&lt;br /&gt;
* [http://wikis.primomiglio.it/index.php?title=Mossa Mossa]&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=La_Lotta&amp;diff=180</id>
		<title>La Lotta</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=La_Lotta&amp;diff=180"/>
		<updated>2019-10-20T16:46:54Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: link aggiornati&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Benvenuto nel wiki del gioco La Lotta ==&lt;br /&gt;
Ciao! Questo è un progetto personale che mira a simulare un gioco di lotta in una qualunque modalità pensabile e tra combattenti di una qualunque tipologia immaginabile. &lt;br /&gt;
&lt;br /&gt;
Su questo wiki sarà presente la parte progettuale, su [https://github.com/Lostefra/LaLotta Github] sarà presente il codice sorgente dell'applicazione (attualmente il progetto è privato, per visionarlo contattami).&lt;br /&gt;
&lt;br /&gt;
Il gioco sarà testuale e molto basilare in apparenza, ma avrà una logica interna tutt'altro che banale! Buon divertimento!&lt;br /&gt;
&lt;br /&gt;
== Indice Wiki ==&lt;br /&gt;
Qui puoi trovare un '''indice''' che riassume le sezioni del wiki: &lt;br /&gt;
* [http://wikis.primomiglio.it/index.php?title=Classi_Dominio Classi del Dominio]&lt;br /&gt;
&lt;br /&gt;
Attualmente è presente solo l'indice delle classi di dominio, quando ci saranno altre sezioni sarà fornito un indice generale.&lt;br /&gt;
&lt;br /&gt;
Infine, [http://wikis.primomiglio.it/index.php?title=Note qui] puoi trovare le '''note''', ossia spunti di riflessione che sto portando avanti nella progettazione del gioco.&lt;br /&gt;
&lt;br /&gt;
== Elenco lavori in corso ==&lt;br /&gt;
Attualmente è in lavorazione l'analisi del dominio del gioco. Sono reperibili qui sul wiki informazioni sulla struttura delle classi che saranno utilizzate. Il progetto complessivamente è in fase '''embrionale'''.&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Note&amp;diff=179</id>
		<title>Note</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Note&amp;diff=179"/>
		<updated>2019-10-20T16:44:55Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: note init&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Note ==&lt;br /&gt;
&lt;br /&gt;
Vedere altre note su fogli di carta e promemoria del telefono. Ce ne sono molte.&lt;br /&gt;
&lt;br /&gt;
* Per personaggi molto piccoli (meno di 1m x 1m x 1m) possibilità di essere in (x,y,z) tra 0 e 1.000.000 (ordine del micrometro, 1*10^-6 == 0,000001) e avere (lenX, lenY, lenZ). In questo modo sono definite dimensioni inferiori ad 1 m^3.&lt;br /&gt;
* Parametri interi per mossa (direzione, consumabili) con lower e upper bound&lt;br /&gt;
* Segnalazione (comando per fare nota)&lt;br /&gt;
* Modalità battaglia con interazione stile battaglia navale (non si vede mossa dell'avversario)&lt;br /&gt;
* Looney toons&lt;br /&gt;
* X fa una mossa contro Y: Z potrebbe reagire (Es. ricevendo il colpo al posto di Y). Può essere realizzato sia come se &amp;quot;Y chiede soccorso Z&amp;quot; o come reazione di alleati adiacenti &amp;quot;Z soccorre Y&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Mossa&amp;diff=178</id>
		<title>Mossa</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Mossa&amp;diff=178"/>
		<updated>2019-10-20T16:29:00Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: Creata pagina con &amp;quot;== Mossa ==  Scrivi qui la seconda sezione del tuo articolo.  Category: La Lotta&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Mossa ==&lt;br /&gt;
&lt;br /&gt;
Scrivi qui la seconda sezione del tuo articolo.&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Stato&amp;diff=177</id>
		<title>Stato</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Stato&amp;diff=177"/>
		<updated>2019-10-20T16:28:17Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: Creata pagina con &amp;quot;== Stato ==  Scrivi qui la seconda sezione del tuo articolo.  Category: La Lotta&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Stato ==&lt;br /&gt;
&lt;br /&gt;
Scrivi qui la seconda sezione del tuo articolo.&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Statistica&amp;diff=176</id>
		<title>Statistica</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Statistica&amp;diff=176"/>
		<updated>2019-10-20T16:27:26Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: Creata pagina con &amp;quot;== Statistica ==  Scrivi qui la seconda sezione del tuo articolo. tuo articolo.  Category: La Lotta&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Statistica ==&lt;br /&gt;
&lt;br /&gt;
Scrivi qui la seconda sezione del tuo articolo.&lt;br /&gt;
tuo articolo.&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Ente_(Personaggio/Oggetto)&amp;diff=175</id>
		<title>Ente (Personaggio/Oggetto)</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Ente_(Personaggio/Oggetto)&amp;diff=175"/>
		<updated>2019-10-20T16:26:18Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: Creata pagina con &amp;quot;== Ente ==  Scrivi qui la prima sezione del tuo articolo.  == Personaggio ==  Scrivi qui la seconda sezione del tuo articolo.  == Oggetto ==  Scrivi qui la seconda sezione del...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Ente ==&lt;br /&gt;
&lt;br /&gt;
Scrivi qui la prima sezione del tuo articolo.&lt;br /&gt;
&lt;br /&gt;
== Personaggio ==&lt;br /&gt;
&lt;br /&gt;
Scrivi qui la seconda sezione del tuo articolo.&lt;br /&gt;
&lt;br /&gt;
== Oggetto ==&lt;br /&gt;
&lt;br /&gt;
Scrivi qui la seconda sezione del tuo articolo.&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Classi_Dominio&amp;diff=174</id>
		<title>Classi Dominio</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Classi_Dominio&amp;diff=174"/>
		<updated>2019-10-20T16:19:25Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: classi versione 0&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Ente ==&lt;br /&gt;
https://lalotta.fandom.com/it/wiki/Ente_(Personaggio/Oggetto)&lt;br /&gt;
&lt;br /&gt;
'''link corretto'''&lt;br /&gt;
&lt;br /&gt;
== Personaggio ==&lt;br /&gt;
https://lalotta.fandom.com/it/wiki/Ente_(Personaggio/Oggetto)&lt;br /&gt;
&lt;br /&gt;
'''link corretto'''&lt;br /&gt;
&lt;br /&gt;
== Oggetto ==&lt;br /&gt;
https://lalotta.fandom.com/it/wiki/Ente_(Personaggio/Oggetto)&lt;br /&gt;
&lt;br /&gt;
'''link corretto'''&lt;br /&gt;
&lt;br /&gt;
== Statistica ==&lt;br /&gt;
https://lalotta.fandom.com/it/wiki/Statistica&lt;br /&gt;
&lt;br /&gt;
'''link corretto'''&lt;br /&gt;
&lt;br /&gt;
== Stato ==&lt;br /&gt;
https://lalotta.fandom.com/it/wiki/Stato&lt;br /&gt;
&lt;br /&gt;
'''link corretto'''&lt;br /&gt;
&lt;br /&gt;
== Mossa ==&lt;br /&gt;
https://lalotta.fandom.com/it/wiki/Mossa&lt;br /&gt;
&lt;br /&gt;
'''link corretto'''&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Categoria:La_Lotta&amp;diff=173</id>
		<title>Categoria:La Lotta</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Categoria:La_Lotta&amp;diff=173"/>
		<updated>2019-10-20T16:11:16Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: categoria &amp;quot;La Lotta&amp;quot; init&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questa categoria indica una pagina del wiki appartenente al progetto (gioco) &amp;quot;La Lotta&amp;quot;&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=La_Lotta&amp;diff=172</id>
		<title>La Lotta</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=La_Lotta&amp;diff=172"/>
		<updated>2019-10-20T16:08:31Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: la lotta - main page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Benvenuto nel wiki del gioco La Lotta ==&lt;br /&gt;
Ciao! Questo è un progetto personale che mira a simulare un gioco di lotta in una qualunque modalità pensabile e tra combattenti di una qualunque tipologia immaginabile. &lt;br /&gt;
&lt;br /&gt;
Su questo wiki sarà presente la parte progettuale, a questo link: https://github.com/Lostefra/LaLotta sarà presente il codice sorgente dell'applicazione (attualmente il progetto è privato, per visionarlo contattami).&lt;br /&gt;
&lt;br /&gt;
Il gioco sarà testuale e molto basilare in apparenza, ma avrà una logica interna tutt'altro che banale! Buon divertimento!&lt;br /&gt;
&lt;br /&gt;
== Indice ==&lt;br /&gt;
Qui puoi trovare un indice che riassume le sezioni del wiki: ''' link Indice_classi_dominio'''&lt;br /&gt;
&lt;br /&gt;
Attualmente è presente l'indice delle classi di dominio, quando ci saranno altre sezioni sarà fornito un indice generale.&lt;br /&gt;
&lt;br /&gt;
Qui puoi trovare le note, ossia spunti di riflessione che sto portando avanti nella progettazione del gioco: '''link note'''&lt;br /&gt;
&lt;br /&gt;
== Elenco lavori in corso ==&lt;br /&gt;
Attualmente è in lavorazione l'analisi del dominio del gioco. Sono reperibili qui sul wiki informazioni sulla struttura delle classi che saranno utilizzate. Il progetto complessivamente è in fase embrionale.&lt;br /&gt;
&lt;br /&gt;
== Note ==&lt;br /&gt;
''' da spostare'''&lt;br /&gt;
Vedere altre note su fogli di carta, ora le note e promemoria del telefono non dovrebbero contenere altri appunti.&lt;br /&gt;
* Per personaggi molto piccoli (meno di 1m x 1m x 1m) possibilità di essere in (x,y,z) tra 0 e 1.000.000 (ordine del micrometro, 1*10^-6 == 0,000001) e avere (lenX, lenY, lenZ). In questo modo sono definite dimensioni inferiori ad 1 m^3.&lt;br /&gt;
* Parametri interi per mossa (direzione, consumabili) con lower e upper bound&lt;br /&gt;
* Segnalazione (comando per fare nota)&lt;br /&gt;
* Modalità battaglia con interazione stile battaglia navale (non si vede mossa dell'avversario)&lt;br /&gt;
* Looney toons&lt;br /&gt;
* X fa una mossa contro Y: Z potrebbe reagire (Es. ricevendo il colpo al posto di Y). Può essere realizzato sia come se &amp;quot;Y chiede soccorso Z&amp;quot; o come reazione di alleati adiacenti &amp;quot;Z soccorre Y&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Category: La Lotta]]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Servizio_web_per_il_trattamento_dei_dati_personali_contenuti_in_documenti_OOXML_complessi&amp;diff=171</id>
		<title>Servizio web per il trattamento dei dati personali contenuti in documenti OOXML complessi</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Servizio_web_per_il_trattamento_dei_dati_personali_contenuti_in_documenti_OOXML_complessi&amp;diff=171"/>
		<updated>2019-09-30T06:07:05Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: /* Ottimizzazioni del processo di minimizzazione */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduzione==&lt;br /&gt;
&lt;br /&gt;
Il recente Regolamento Generale europeo sulla Protezione dei Dati (UE) 2016/679 ([0034], [0035]) o ''GDPR'' (''General Data Protection Regulation'', come nel seguito sarà chiamato) ha modernizzato significativamente la normativa in materia di protezione dei dati personali, rendendola omogenea fra tutti gli stati membri. È bene notare che, fin dal titolo, il ''GDPR'' non riduce gli spazi per i trattamenti di dati personali, ma anzi ne protegge la &amp;quot;libera circolazione&amp;quot;, dettando, però, regole definite e certe. Rinunciando ad una presentazione più completa del ''GDPR'', saranno riportati nei successivi capitoli i concetti necessari alla discussione dell'argomento.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Enti ed organizzazioni, aventi a che fare con documenti contenenti dati sensibili, devono operare in maniera conforme al ''GDPR''; potrebbero, di conseguenza, trarre beneficio da servizi specifici in grado di supportarli in queste esigenze.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
L'oggetto principale della tesi sarà dunque, come riportato dal titolo, la progettazione e la realizzazione di un servizio per la gestione di dati personali.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F05])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La larga maggioranza dei documenti testuali viene generata con strumenti cosiddetti di &amp;quot;produttività individuale&amp;quot;, cioè da ''word-processors''. L'osservazione, ovvia nella sua evidenza, consente di introdurre una riflessione: quando un documento è generato da un'elaborazione automatica, magari per composizione di ''template'' con dati estratti da un database, l'individuazione dei &amp;quot;dati personali&amp;quot; nel documento prodotto può avvenire in modo rigoroso e senza incertezze, sulla base degli elementi di composizione del documento; ad es.: i campi del documento estratti da una anagrafica di soggetti sono certamente dati personali e come tali possono essere opportunamente trattati nel processo di elaborazione automatica (ad es. cancellati).&lt;br /&gt;
&lt;br /&gt;
Ma, in quella larga maggioranza di documenti testuali generata con ''word-processors'' l'individuazione ed il trattamento dei dati personali vanno affrontati con altri approcci, discussi in questa tesi.&lt;br /&gt;
&lt;br /&gt;
==Scenario di lavoro==&lt;br /&gt;
&lt;br /&gt;
===Minimizzazione dei dati personali===&lt;br /&gt;
&lt;br /&gt;
Un concetto espresso in modo pervasivo dal ''GDPR'' è quello della &amp;quot;''minimizzazione''&amp;quot; dei dati personali trattati ed a maggior ragione dei dati personali pubblicati. In particolare l'Art. 5 ed il Considerando 39 prescrivono che i dati personali trattati siano &amp;quot;''adeguati, pertinenti e limitati a quanto necessario rispetto alle finalità per le quali sono trattati («minimizzazione dei dati»)''&amp;quot; ([0035]).&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Con questo fine, il GDPR delinea due possibilità organizzative e tecniche di &amp;quot;''minimizzazione''&amp;quot;: l'anonimizzazione e la psedonimizzazione.&lt;br /&gt;
&lt;br /&gt;
====Anonimizzazione====&lt;br /&gt;
&lt;br /&gt;
Sono anonimizzati i dati personali non (più) riferibili alle persone a cui sono appartenuti; si tratta di serie di dati, spesso ingenti, che sono stati definitivamente ed irreversibilmente separati da ogni riferimento alle persone che caratterizzavano. Sono le serie di dati utilizzate per fini statistici, scientifici, etc. E' importante notare che, come fissato dal Considerando 26 del ''GDPR'', il Regolamento non si applica al &amp;quot;''trattamento di tali informazioni anonime''&amp;quot; ([0035]). Per questo, sottoporre database e documenti ad un procedimento, cioè un trattamento, di anonimizzazione consente di non doversi più preoccupare del ''GDPR''.&lt;br /&gt;
&lt;br /&gt;
====Pseudonimizzazione====&lt;br /&gt;
&lt;br /&gt;
Fra le definizioni dell'Art. 4 del ''GDPR'', la &amp;quot;pseudonimizzazione&amp;quot; viene indicata come &amp;quot;''il trattamento tale che i dati personali non possano più essere attribuiti a un interessato specifico senza l’utilizzo di informazioni aggiuntive, a condizione che tali informazioni aggiuntive siano conservate separatamente''&amp;quot; ([0035]).&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Traducendo in termini &amp;quot;operativi&amp;quot;, si tratta del procedimento che, dal &amp;quot;record&amp;quot; dei dati di un interessato, separa i campi che caratterizzano l'interessato stesso da quelli che lo identificano, trasferendo questi ultimi in una nuova distinta tabella; nelle due tabelle vengono aggiunti i riferimenti che permettono la ricostruzione del record originario; il procedimento è completo quando la nuova tabella con gli identificativi viene archiviata separatamente ed eventualmente cifrata. In margine si annota che in molti casi, come molti studi dimostrano, è possibile identificare, quindi &amp;quot;riconoscere&amp;quot;, gli interessati utilizzando la sola tabella con i dati pseudonimizzati.&lt;br /&gt;
&lt;br /&gt;
====Altri trattamenti di &amp;quot;minimizzazione&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Un problema pratico che si incontra di frequente è quello di dover pubblicare documenti più o meno ampi che contengono dati personali. Spesso la pubblicazione è obbligatoria per legge: si pensi alle graduatorie relative a concorsi pubblici, alle sentenze dei tribunali, etc.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In questi frequenti casi, analizzando meglio le finalità per le quali sono pubblicati quei dati personali, si osserva che sono possibili e legittimi almeno due approcci per &amp;quot;minimizzare&amp;quot; il dato nel &amp;quot;trattamento di pubblicazione&amp;quot; e, dunque, per minimizzarne la propagazione, ad esempio attraverso motori di ricerca, ben oltre ogni ragionevole finalità. I contesti ed i corrispondenti approcci sono:&lt;br /&gt;
#  Situazioni in cui è necessario che l'interessato possa riconoscersi nel documento ed essere riconosciuto dagli altri soggetti menzionati nel contesto, ma non è plausibile la necessità di identificazione dell'interessato al di fuori di quel contesto specifico. A questo caso si riconducono le graduatorie di concorsi, gli elenchi per la formazione di classi, gli elenchi per convocazioni, etc. In tutti questi casi, nel processo di redazione del documento è più pratico trattare internamente i dati personali in forma completa; ma praticamente mai è necessario pubblicarli per intero, esponendo al pubblico accesso codici fiscali, indirizzi, recapiti telefonici etc. Per di più, nella maggior parte delle volte, è sufficiente pubblicare il solo cognome perché l'interessato conosca la sua posizione in graduatoria; ciò è spesso sufficiente anche a trasmettere l'informazione necessaria ai colleghi dell'interessato nella medesima graduatoria, o nella medesima classe, etc. Notare che, pubblicando il solo cognome, viene di fatto oscurato anche il sesso. Dunque, in questi casi è auspicabile cancellare una larga parte dei dati personali presenti nel documento.&lt;br /&gt;
# Situazioni in cui il documento deve essere pubblicato affinché siano rese note le motivazioni che lo hanno originato, senza che sia necessaria la precisa identificazione dei soggetti che vi compaiono. Questo è il caso della pubblicazione di sentenze giudiziarie di ogni grado. Le sentenze vengono notificate direttamente agli &amp;quot;aventi causa&amp;quot;; ma anche, come la legge prescrive, pubblicate al fine di costituire giurisprudenza. In questo secondo caso, risulta del tutto eccedente la pubblicazione dei reali nominativi degli interessati, che troverebbero verosimilmente la propria vicenda inutilmente indicizzata dai motori di ricerca negli anni a venire. Nella pubblicazione delle sentenze appare un approccio ottimale quello di sostituire con pseudonimi o con iniziali alterate i veri nominativi degli interessati presenti: il senso e le argomentazioni della sentenza restano pienamente comprensibili, come è necessario; il dato personale, del tutto superfluo ai fini della giurisprudenza, viene protetto.&lt;br /&gt;
In questi casi appare opportuno sostituire i dati identificativi dell'interessato, ed in particolare il nome e cognome, con pseudonimi o, ancora, con iniziali alterate, cioè non coincidenti con le iniziali reali. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Proprio questi tipi di trattamenti di &amp;quot;minimizzazione&amp;quot; sono l'oggetto di questa tesi.&lt;br /&gt;
&lt;br /&gt;
===Punti di partenza per la progettazione del servizio===&lt;br /&gt;
&lt;br /&gt;
La tesi è stata svolta in collaborazione con l'azienda AFA Systems (www.afasystems.it/gdpr) con la quale si sono discusse le problematiche di progettazione e realizzazione di un servizio generalizzato di minimizzazione dei dati personali presenti in un documento.&lt;br /&gt;
Con l'intenzione di fornire il servizio ad un bacino d'utenza il più vasto e variegato possibile, si è pensato ad un'applicazione ''web-based'', indipendente così dai singoli devices sui quali poi sarà utilizzata.&lt;br /&gt;
L'attenzione è stata concentrata sul trattamento dei nomi e dei cognomi (che da qui chiameremo nominativi), poiché sono quelli sempre presenti nei documenti (ad es. gli indirizzi sono presenti solo a volte), rappresentano gli elementi tramite i quali è immediato il riconoscimento della persone, non hanno formato predefinito (come ad es. i codici fiscali); altri dati personali (indirizzi, codici fiscali, etc.), potranno essere considerati in successive evoluzioni del progetto.&lt;br /&gt;
È utile notare che la parte iniziale della collaborazione con l'azienda è stata dedicata alla discussione delle specifiche, la cui più precisa definizione è parte rilevante di questa tesi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Tra i requisiti che necessitano di un opportuno studio troviamo ad esempio:&lt;br /&gt;
* L'individuazione di metodi efficaci per il riconoscimento dei nominativi nei documenti&lt;br /&gt;
* L'identificazione delle migliori procedure di interazione con l'utente&lt;br /&gt;
* La scelta dei formati da trattare&lt;br /&gt;
* I vincoli non funzionali legati al rispetto del ''GDPR''.&lt;br /&gt;
&lt;br /&gt;
==Definizione delle specifiche==&lt;br /&gt;
&lt;br /&gt;
===Riconoscimento dei nominativi===&lt;br /&gt;
&lt;br /&gt;
====Scelta della strategia di riconoscimento====&lt;br /&gt;
 &lt;br /&gt;
Le difficoltà principali con cui ci si imbatte nel processo di riconoscimento dei nominativi riguardano la complessità strutturale dei documenti di testo, ma soprattutto l'intrinseca ambiguità del linguaggio naturale. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Le variabili ed impredicibili strutture e formattazioni dei documenti introducono alcuni problemi significativi. Rendendo fortemente eterogeneo il contenuto dei documenti, infatti, esse non consentono di ricondurre il problema del riconoscimento dei nominativi ad uno o a pochi singoli casi, ma comportano lo studio di tutte le strutture e formattazioni possibili, rendendo quindi l'analisi molto generale. L'altra rilevante difficoltà presente sta nella complessità di effettuare il riconoscimento di una stringa testuale immersa in un insieme di elementi non tutti testuali. Ogni elemento di formattazione, che sia una tabella o una barra orizzontale, introduce infatti un proprio significato logico e semantico nel documento di cui bisogna tenere conto.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Il linguaggio naturale introduce anch'esso complessità: si pensi alle molteplici tipologie di proposizioni con cui possono essere articolati i periodi; ma i problemi principali derivano dalle sue ambiguità. Esse vengono classificate in diverse tipologie ([0025]); le principali sono le ambiguità sintattiche e lessicali.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si ha ambiguità sintattica quando la sintassi di una frase può essere interpretata in diversi modi e, di conseguenza, la frase stessa assume significati diversi. Essa è presente, ad esempio, nelle seguenti frasi:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
* &amp;quot;''Rapina in banca con rivoltella da centomila euro''&amp;quot;&lt;br /&gt;
* &amp;quot;''Luigi ha visto un uomo nel parco con il binocolo''&amp;quot;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
L'esasperazione massima della problematica delle ambiguità sintattiche si presenta con l'&amp;lt;i&amp;gt;antinomia&amp;lt;/i&amp;gt;, ossia un particolare tipo di paradosso che indica la compresenza di due affermazioni contraddittorie che possono essere entrambe dimostrate o giustificate.&lt;br /&gt;
L'antinomia di Epimenide o ''Paradosso del mentitore'', nota fin dal VI secolo, è probabilmente uno dei più noti esempi: &amp;quot;''il cretese Epimenide afferma che tutti i cretesi mentono''&amp;quot;. Se la proposizione è vera (i cretesi mentono) allora il suo significato implica che sia falsa (Epimenide mente e quindi i cretesi dicono la verità), ma se è falsa (i cretesi dicono la verità) ciò significa che è vera (Epimenide dice la verità e quindi i cretesi mentono). La proposizione appare contemporaneamente vera e falsa. A partire dagli anni venti del '900, sono state elaborate varie teorie per la risoluzione delle contraddizioni provocate dalle antinomie, soprattutto attraverso l'elaborazione di linguaggi multilivello o attraverso l'elaborazione di logiche polivalenti (quindi non-booleane).&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si ha ambiguità lessicale, invece, quando una parola possiede più di un significato nella lingua a cui appartiene ([0026]), in tal caso la parola è definita ''polisemica''. In italiano, alcuni termini soggetti a questo tipo di ambiguità sono, ad esempio &amp;quot;''acuto''&amp;quot; o &amp;quot;''venti''&amp;quot;. È questo genere di ambiguità che risulta critico per il riconoscimento dei nominativi. La difficoltà determinata dalle ambiguità sintattiche, infatti, riguarda l'individuazione corretta di soggetti, predicati e complementi di un periodo, mentre le ambiguità lessicali ostacolano la comprensione del significato del singolo lessema. Nel processo di riconoscimento è irrilevante determinare la funzione logica che il nominativo svolge nella frase, mentre è necessario essere certi che i termini che compongono il nominativo siano effettivamente dei nomi propri di persona o dei cognomi, non altri vocaboli del lessico comune. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In linguistica, l'intervento con cui si toglie ambiguità a una parola o a una frase prende il nome di &amp;quot;disambiguazione&amp;quot; ([0027]). Il problema della disambiguazione automatica (in inglese ''Word Sense Disambiguation'' o, abbreviato, ''WSD'') riveste particolare importanza nelle ricerche sull'intelligenza artificiale e, in particolare, nell'elaborazione del linguaggio naturale. Si prevedono benefici della disambiguazione, ad esempio, in programmi di traduzione automatica, recupero dell'informazione o estrazione automatica di informazioni. Nell'analisi delle soluzioni esistenti in letteratura per la risoluzione delle ambiguità, ci si sofferma specialmente sulle ricerche incentrate sul trattamento dell'ambiguità lessicale, essendo essa la più rilevante per i nostri interessi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
La ''WSD'' richiede due input necessariamente: un dizionario per specificare i sensi che devono essere disambiguati e un corpus di dati linguistici da disambiguare. Nello scenario più realistico, si trattano testi le cui parole non sono note a priori e risulta molto onerosa la produzione del corpus, essendo infatti necessaria la valutazione di un operatore umano per verificare la correttezza delle disambiguazioni effettuate dagli algoritmi (''supervised learning'').&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Uno tra i principali dizionari semantici-lessicali utilizzati della lingua inglese è ''WordNet'' ([0029]), mentre alcuni dei database equivalenti che trattano l'italiano sono ''BabelNet'' ([0030]), ''ItalWordNet'' ([0031]) e ''MultiWordNet'' ([0032]).&lt;br /&gt;
Un elemento importante da considerare è che le prestazioni di disambiguazione per la lingua inglese, impiegando ''WordNet'', risultano corrette tra l'80% e il 90% delle volte ([0028]), percentuali discrete ma non sufficienti per avere la totale garanzia.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
I fattori che ostacolano la realizzazione di algoritmi di intelligenza artificiale per la disambiguazione sono molteplici:&lt;br /&gt;
# Differenze tra dizionari impiegati: i database prima citati si basano su varie fonti che raggruppano semanticamente in maniera diversa i vocaboli, quindi programmi sviluppati con dizionari diversi generalmente hanno performance differenti.&lt;br /&gt;
# Complessità della codifica di parte del discorso: per poter disambiguare correttamente un termine è importante riuscire a comprendere correttamente il contesto in cui è inserito, operazione non banale.&lt;br /&gt;
# Varianza tra giudici: i supervisori dell'apprendimento degli algoritmi possono avere opinioni diverse, o semplicemente sbagliare, nella valutazione delle disambiguazioni, ciò porta ad algoritmi che hanno comportamenti diversi.&lt;br /&gt;
# Impossibilità di applicare la disciplina della ''pragmatica'', ossia la logica del ''buon senso'': per identificare correttamente il senso di alcune parole, ad esempio nella comprensioni di anafore e catafore, è necessario applicare il buon senso.&lt;br /&gt;
# Dipendenza del senso delle parole dai contesti: ogni scenario richiede la propria divisione del significato delle parole in sensi rilevanti. In un contesto informatico, ad esempio, il termine &amp;quot;''mouse''&amp;quot; deve essere ricondotto al dispositivo di puntamento, non al cognome del celebre personaggio Disney ''Mickey Mouse''; viceversa dovrà invece avvenire in un contesto di letteratura a fumetti.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Laddove la ''WSD'' è una tecnica molto generale e che mira a risolvere un'ambiguità riguardante una qualunque parola, per le finalità del servizio oggetto di questa tesi è sufficiente risolvere le ambiguità dei nomi e dei cognomi. &lt;br /&gt;
Uno dei difetti che il servizio presenterebbe adottando un approccio ''WDS'' è legato alla impredicibile formattazione dei documenti, che aggiunge informazione semantica al testo ma introduce complessità nella individuazione automatica delle parti che formano il contesto; un altro difetto dipende dalla vastità del lessico da elaborare, essendo i documenti da trattare forniti dai più disparati utenti, su qualunque genere di argomento e relativi ai più vari ambiti.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La strategia che sarà adottata per risolvere la problematica del riconoscimento dei nominativi sarà impostata attraverso un modello ''pattern-based'', impiegando le ''regular expressions'' (''regex''). Esse risultano comunemente usate per effettuare operazioni di ricerca o sostituzione in un testo, di conseguenza se si riesce ad individuare un pattern associato ad un nominativo dato, allora sarà possibile processare il documento ricercando le occorrenze del nominativo e &amp;quot;minimizzarlo&amp;quot; opportunamente.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le ''regular expressions'' risultano particolarmente efficaci poiché, se opportunamente progettate, possono identificare un nominativo indipendentemente dal significato linguistico del contesto in cui è calato, basandosi piuttosto sui singoli caratteri che compongono i lessemi analizzati; permettono, di conseguenza, di effettuare una valutazione estremamente minuziosa, riducendo al minimo le possibilità di errori.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Un algoritmo di risoluzione ''pattern-based'' risulta, inoltre, più efficiente nell'esecuzione, in generale, di un algoritmo di intelligenza artificiale; per fornire la risposta il più velocemente possibile ad un utente, fruitore del servizio via web, l'approccio di riconoscimento tramite pattern è il più indicato.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Definizione dei pattern====&lt;br /&gt;
Nella progettazione del servizio si adotta, come detto, un approccio ''pattern-based'' per il riconoscimento dei nominativi. In linea di massima è opportuno che vengano riconosciuti più nominativi possibili e allo stesso tempo che la correttezza dell'identificazione di un nominativo sia garantita, quindi bisogna individuare dei pattern non troppo stringenti ma neppure troppo laschi. Per analizzare come i pattern devono essere strutturati si prende come caso di studio un generico nominativo, ad esempio ''Lorenzo Mario Amorosa''. Nel documento esso può comparire esattamente come appena indicato, ma anche in altre plausibili varianti, in cui l'ordine dei termini viene alterato, si pensi ad esempio ad &amp;quot;Amorosa Lorenzo Mario&amp;quot; o &amp;quot;Mario Lorenzo Amorosa&amp;quot;, o in altre varianti ancora in cui alcuni nomi non compaiono, come in &amp;quot;Lorenzo Amorosa&amp;quot;. Bisogna tuttavia supporre un limite alla variabilità: si osserva infatti che il cognome deve sempre comparire (il solo nome ''Lorenzo'' non è riconducibile a ''Lorenzo Mario Amorosa'') e che esso inoltre deve essere necessariamente anteposto o posposto, ma non interposto, ai nomi (è poco ragionevole ricondurre &amp;quot;Lorenzo Amorosa Mario&amp;quot; a &amp;quot;Lorenzo Mario Amorosa'').&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Questa prima specifica permette di ricondursi a una soluzione generale, sufficiente nella maggior parte dei casi, ma che non risolve alcune criticità. Un nominativo può, in alcuni documenti, comparire manifestandosi unicamente attraverso il cognome (riferendoci all'esempio precedente, ''Lorenzo Mario Amorosa'' apparirebbe nella forma ''Amorosa''). Sorge qui il problema che molti dei cognomi italiani hanno un significato proprio nel linguaggio comune; ad es., nella frase ''una relazione amorosa è bella'' è errato considerare la parola ''amorosa'' come cognome di un nominativo. Per risolvere questo genere di ambiguità si potrebbe pensare che per stabilire che il termine ''Amorosa'' sia un cognome sia sufficiente verificare che esso inizi con una lettera maiuscola, ma ciò può verificarsi anche perché la parola si trova ad inizio di frase. Inoltre, vari cognomi italiani possono iniziare con una lettera minuscola (''de Angelis'', ''d'Onofrio'', etc.), quindi basare l'identificazione di un cognome sul fatto che la sua prima lettera sia in maiuscolo non è in generale un metodo valido. Volendo in maniera prioritaria garantire il corretto funzionamento del servizio, e quindi attuare le procedure di anonimizzazione solo sui nominativi senza applicarle erroneamente ad altri termini, risulta necessario evitare il trattamento dei nominativi che si manifestano con i soli cognomi. Per via del contesto e dei significati che i cognomi possono assumere, infatti, risulta spesso impossibile distinguerli da parole del linguaggio comune. &lt;br /&gt;
&lt;br /&gt;
Ci si concentra, quindi, nello studio di nominativi composti da un cognome seguito o preceduto da uno o più nomi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si rappresenta dunque in formato di ''regular expression'' il pattern attualmente ideato. Per semplicità espositiva, si definisce il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; come l'insieme delle permutazioni di tutti i nomi del nominativo più l'insieme delle permutazioni di tutti i possibili sottoinsiemi di nomi del nominativo. Considerando il nominativo preso precedentemente come caso di studio, ad esempio, si avrebbe:&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt; &amp;lt;nomi&amp;gt; = Lorenzo Mario|Mario Lorenzo|Lorenzo|Mario&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Posto inoltre il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt; ad indicare il cognome contenuto nel nominativo e il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;regex&amp;gt;&amp;lt;/span&amp;gt; ad indicare la ''regular expression'' associata al nominativo, si ottiene:&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt; &amp;lt;regex&amp;gt; := &amp;lt;cognome&amp;gt; (&amp;lt;nomi&amp;gt;)|(&amp;lt;nomi&amp;gt;) &amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Una osservazione sottile ma di fondamentale importanza per la corretta progettazione delle ''regular expressions'' sta nella piena comprensione della semantica dell'operatore di scelta, espresso con il carattere ''pipe'' (&amp;quot;|&amp;quot;). Un qualunque ''engine'' di elaborazione delle ''regex'', infatti, interrompe la valutazione di una stringa non appena può stabilire se tale stringa fa match o meno con il pattern dato, senza quindi necessariamente valutarlo nella sua interezza, come parimenti avviene nelle valutazioni ''a corto circuito'' delle espressioni logiche nei linguaggi di programmazione. Ogni nominativo avrà a sè associato un pattern che lo rappresenta in più possibili sequenze di caratteri; per effettuare una corretta &amp;quot;minimizzazione&amp;quot; dei dati è necessario che le sequenze contenenti tutti i nomi sia poste per prime, mentre quelle contenenti un singolo nome per ultime.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In questa prima formulazione della ''regex'', inoltre, si è posto come separatore unicamente lo spazio bianco, ma alcuni documenti potrebbero contenere dei nominativi i cui termini sono separati da altri caratteri, come ad esempio una virgola nel caso di &amp;quot;Amorosa, Lorenzo Mario&amp;quot;. Per poter quindi identificare un nominativo anche in questi casi, si potrebbe considerare un qualunque carattere di interpunzione come possibile separatore dei termini del nominativo.&lt;br /&gt;
Adottando questa soluzione si ha però come effetto collaterale che risultano critici i casi in cui nel testo sono presenti dei nominativi soggetti ad omonimia. Si consideri una generica frase contenente una sequenza di nominativi, ad esempio ''Amorosa Lorenzo, Mario Giacomo e Fabio Rossi'', e si supponga che i nominativi da trattare siano ''Amorosa Lorenzo Mario'', ''Mario Giacomo'' (in cui la parola ''Mario'' è il cognome) e ''Fabio Rossi''. Gli ultimi due nominativi compaiono nella frase nella loro forma estesa, mentre il primo compare con il solo nome ''Lorenzo'' (eventualità possibile considerando la definizione del pattern precedentemente data). Considerando la virgola come carattere separatore dei termini del nominativo, la sequenza di parole ''Amorosa Lorenzo, Mario'' sarebbe ricondotta, venendo elaborata per prima, ad ''Amorosa Lorenzo Mario'', mentre rimarrebbe non trattata la parola ''Giacomo'', in quanto il cognome ''Mario'' che gli era associato è stato già identificato come un nome del nominativo ''Amorosa Lorenzo Mario'' ed il termine ''Giacomo'' preso singolarmente non rappresenta un nominativo.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Prima di valutare ulteriormente le problematiche relative alle omonimie, si possono scegliere due approcci per risolvere questo specifico caso:&lt;br /&gt;
# Si riconduce una sequenza di parole ad un nominativo se e solo se tutti i suoi nomi sono contenuti nella sequenza&lt;br /&gt;
# Si considerano come separatori dei termini contenuti nei nominativi solo spazi bianchi, tabulazioni e a capo, non gli altri segni di punteggiatura.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Entrambe le strategie sono valide, in quanto risolvono il problema garantendo la corretta identificazione dei nominativi, ma allo stesso tempo entrambe presentano lo svantaggio di ridurre le sequenze di parole riconducibili a dei nominativi, aumentando le possibilità che alcuni di essi non vengano trattati.&lt;br /&gt;
Si consideri nuovamente il nominativo preso come caso di studio ''Amorosa Lorenzo Mario'': applicando la prima strategia, non sarebbe possibile ricondurgli la sequenza ''Amorosa Lorenzo'', mentre applicando il secondo metodo non sarebbe riconducibile la sequenza ''Amorosa, Lorenzo Mario''.&lt;br /&gt;
Si decide di attuare la seconda strategia, in quanto è opportuno non imporre vincoli troppo stringenti sui nomi e poiché nella gran parte dei casi i termini dei nominativi nei documenti sono separati tra loro da caratteri quali spazi bianchi, tabulazioni ed a capo.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Un altro elemento su cui porre l'attenzione è la possibilità che i documenti da trattare contengano dei nominativi scritti interamente in maiuscolo o minuscolo, di conseguenza è conveniente che le ''regular expressions'' siano progettate ''case-insensitive''.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Un ulteriore punto su cui bisogna soffermarsi è la posizione all'interno di un periodo in cui un nominativo può comparire, in particolare si vogliono evitare quei casi critici in cui uno dei termini del nominativo è una sotto-stringa di un'altra parola del testo (si pensi ad ''amorosa'' in ''clamorosa''). Come regola generale si può stabilire che è sempre necessario che un nominativo sia preceduto e seguito da un ''carattere non alfabetico''. Un caso particolare si presenta quando il nominativo è posto ad inizio o a fine documento, situazione in cui quindi esso non è preceduto o non è seguito da alcun carattere: entrambe le posizioni sono da considerare corrette.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
È opportuno ora definire il concetto di ''carattere non alfabetico'', e ciò si può fare più facilmente ragionando sul problema in logica positiva; infatti risulta più semplice individuare quei caratteri che rappresentano lettere piuttosto che quelli che rappresentano segni di interpunzione ed individuare ogni altro carattere che non può mai comporre una parola.&lt;br /&gt;
&lt;br /&gt;
Inquadrando lo scenario di applicazione del servizio, molto probabilmente l'utente vorrà trattare un documento scritto nella lingua di uno dei paesi dell'Unione Europea, poiché il ''GDPR'' vige nei soli paesi membri dell'Unione.&lt;br /&gt;
Si può, quindi, ipotizzare che i documenti trattati possono sì contenere parole e nominativi stranieri, ma che i caratteri contenuti siano appartenenti all'alfabeto latino (''Latin script''), usato in molti stati nel mondo e da tutti i principali stati europei (fatta eccezione per la Grecia ed alcuni stati che scrivono in caratteri cirillici).&lt;br /&gt;
Inoltre, testi scritti in altri alfabeti, come esempio il cinese, l'arabo o il cirillico, vengono generalmente traslitterati. Considerare, quindi, ''caratteri non alfabetici'' tutti i caratteri diversi dalle lettere contenute nell'alfabeto latino sarebbe di conseguenza estremamente riduttivo ed inoltre in questo modo non si terrebbe conto delle lettere accentate, molto utilizzate anche nella lingua italiana.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(XXXX QUI IMG [0F00])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per risolvere il problema facciamo riferimento alla codifica standard Unicode dell'alfabeto latino ([0022]); in essa è possibile individuare, oltre ai caratteri rappresentanti le lettere nella codifica ''ASCII'' classica, i caratteri rappresentanti le lettere nella codifica standard ''ISO/IEC 8859-1'' ([0023]), encoding orientato principalmente alla rappresentazione delle lingue dell'Europa occidentale.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;i&amp;gt;Caratteri latini nei primi due blocchi dello standard Unicode&amp;lt;/i&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;nounderlines&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border-collapse:collapse&amp;quot;&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; &lt;br /&gt;
!style=&amp;quot;background:#ccf; text-align:center; font-weight: bold;&amp;quot;|U+&lt;br /&gt;
!style=&amp;quot;text-align:center; font-weight: bold;&amp;quot;|0||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|1||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|2||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|3||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|4||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|5||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|6||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|7||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|8||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|9||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|A||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|B||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|C||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|D||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|E||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|F||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|Block||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|#&lt;br /&gt;
|-&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|0040&lt;br /&gt;
|style=&amp;quot;background:#fff&amp;quot;|@||A||B||C||D||E||F||G||H||I||J||K||L||M||N||O&lt;br /&gt;
|rowspan=&amp;quot;4&amp;quot; style=&amp;quot;background:#fff&amp;quot; align:&amp;quot;center&amp;quot;|C0 Controls and Basic Latin&amp;lt;br&amp;gt;0000–007F&amp;lt;br&amp;gt;(identical to ASCII)&lt;br /&gt;
|rowspan=&amp;quot;4&amp;quot; style=&amp;quot;background:#fff&amp;quot;|52&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|0050&lt;br /&gt;
|P||Q||R||S||T||U||V||W||X||Y||Z||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#91;||style=&amp;quot;background:#fff&amp;quot;|\||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#93;||style=&amp;quot;background:#fff&amp;quot;|^||style=&amp;quot;background:#fff&amp;quot;|_&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|0060&lt;br /&gt;
|style=&amp;quot;background:#fff&amp;quot;|`||a||b||c||d||e||f||g||h||i||j||k||l||m||n||o&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|0070&lt;br /&gt;
|p||q||r||s||t||u||v||w||x||y||z||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#123;||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#124;||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#125;||style=&amp;quot;background:#fff&amp;quot;|~||style=&amp;quot;background:#fff; font-size:75%&amp;quot;|DEL&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;19&amp;quot;| &lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#fff&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00A0&lt;br /&gt;
|&amp;amp;nbsp;||¡||¢||£||¤||¥||¦||§||¨||©||ª||«||¬||||®||¯&lt;br /&gt;
|rowspan=&amp;quot;6&amp;quot; style=&amp;quot;background:#fff&amp;quot; align=&amp;quot;center&amp;quot;|C1 Controls and Latin-1 Supplement&amp;lt;br&amp;gt;0080–00FF&amp;lt;br&amp;gt;(identical to ISO/IEC 8859-1)&lt;br /&gt;
|rowspan=&amp;quot;6&amp;quot; style=&amp;quot;background:#fff&amp;quot;|62&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#fff&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00B0&lt;br /&gt;
|°||±||²||³||´||µ||¶||·||¸||¹||º||»||¼||½||¾||¿&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00C0&lt;br /&gt;
|À||Á||Â||Ã||Ä||Å||Æ||Ç||È||É||Ê||Ë||Ì||Í||Î||Ï&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00D0&lt;br /&gt;
|Ð||Ñ||Ò||Ó||Ô||Õ||Ö||style=&amp;quot;background:#fff&amp;quot;|×||Ø||Ù||Ú||Û||Ü||Ý||Þ||ß&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00E0&lt;br /&gt;
|à||á||â||ã||ä||å||æ||ç||è||é||ê||ë||ì||í||î||ï&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00F0&lt;br /&gt;
|ð||ñ||ò||ó||ô||õ||ö||style=&amp;quot;background:#fff&amp;quot;|÷||ø||ù||ú||û||ü||ý||þ||ÿ&lt;br /&gt;
|---- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I caratteri indicati in rosso nella tabella sono tutti i possibili ''caratteri alfabetici'' che compaiono nei documenti scritti in 29 lingue diverse ([0023]), tra le quali sono presenti l'italiano, l'inglese, lo spagnolo, il tedesco e il portoghese. &lt;br /&gt;
Aggiungendo pochi altri caratteri all'insieme dei ''caratteri alfabetici'' appena mostrati, si riesce a rappresentare ogni parola di altre 12 lingue ([0023]), tra cui il francese, l'olandese, il ceco e il turco.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
I caratteri mostrati in tabella corrispondono ad una parte dei primi due blocchi dello standard Unicode che codificano l'alfabeto latino e, come già accennato in precedenza, essi sono presenti negli standard ''ASCII'' e ''ISO/IEC 8859-1''. I rimanenti ''caratteri alfabetici'', invece, sono presenti in estensioni dello standard Unicode per il ''Latin script''. Queste estensioni sono state realizzate per fornire il massimo supporto a tutte le lingue e contenenti molti simboli ad uso speciale, come ad esempio per la rappresentazione dei fonemi. Si osserva, inoltre, che i ''caratteri alfabetici'' definiti nelle estensioni dello standard Unicode sono presenti anche nella codifica ''ISO/IEC 8859-2'' o nelle versioni successive ([0023]).&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Definiti i ''caratteri non alfabetici'' come elementi di separazione tra un nominativo ed il testo in cui esso è inserito, occorre definire opportunamente la ''regex'' che al nominativo è associata.&lt;br /&gt;
&lt;br /&gt;
Utili strumenti messi a disposizione dalle ''regular expressions'' sono i gruppi speciali ''lookahead'' e ''lookbehind''. Un pattern di un nominativo deve essere preceduto o seguito da una prestabilita sequenza di caratteri, la quale però non è parte del nominativo. Utilizzando i due costrutti citati, è possibile far sì che nell'elaborazione di una stringa facciano match solamente le parole effettivamente appartenenti al nominativo, non i caratteri che lo delimitano dal resto del testo, e allo stesso tempo che un nominativo faccia match se e solo se preceduto o seguito da una certa sequenza di caratteri. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per esprimere nella sintassi delle ''regex'' un carattere letterale in un qualunque alfabeto si può utilizzare il costrutto ''\p{L}'', che però risulta molto generale e troppo lasco per i requisiti considerati. Si può piuttosto valutare l'impiego del costrutto ''\p{Latin}'', il quale identifica un qualunque carattere alfabetico presente nell'alfabeto latino. Tra i caratteri corrispondenti al costrutto, però, ve ne sono alcuni che per le specifiche del servizio devono essere considerati ''caratteri non alfabetici'', come ad esempio i caratteri dei fonemi, i segni diacritici e gli indicatori ordinali; di conseguenza è necessario individuare una strategia ad hoc per risolvere questa problematica.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per chiarezza espositiva, si definisce il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;start&amp;gt;&amp;lt;/span&amp;gt;, per indicare un qualunque carattere non alfabetico o l'inizio stringa, il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;end&amp;gt;&amp;lt;/span&amp;gt;, per indicare un qualunque carattere non alfabetico o il fine stringa, ed il tag &amp;lt;extra&amp;gt;, per indicare i ''caratteri alfabetici'' non presenti negli standard ''ASCII'' o ''ISO/IEC 8859-1'':&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;extra&amp;gt; := ĿŀČčŘřŠšŽžĲĳŒœŸŐőŰűḂḃĊċḊḋḞḟĠġṀṁṠṡṪṫĀāĒēĪīŌōŪūİıĞğŞşẀẁẂẃŴŵŶŷǾǿẞ&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;start&amp;gt; := (?&amp;lt;=[^A-Za-zÀ-ÖØ-öø-ÿ&amp;lt;extra&amp;gt;]|^)&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;end&amp;gt; := (?=[^A-Za-zÀ-ÖØ-öø-ÿ&amp;lt;extra&amp;gt;]|$)&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva che si sono utilizzati i gruppi speciali prima descritti e che si sono inseriti i caratteri dello standard Unicode presentati in precedenza. Si definisce nuovamente la ''regular expression'' associata ad un generico nominativo. Applicando i tag appena definiti, il costrutto ''(?i)'' che rende il pattern ''case-insensitive'' ed il costrutto ''\s'' che rappresenta un carattere qualunque tra i separatori non visibili, ossia ''\r \n \t \f \v'' e lo spazio bianco, si ottiene:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;regex&amp;gt; := (?i)(&amp;lt;start&amp;gt;&amp;lt;cognome&amp;gt;\s+(&amp;lt;nomi&amp;gt;)|(&amp;lt;nomi&amp;gt;)\s+&amp;lt;cognome&amp;gt;&amp;lt;end&amp;gt;)&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva, inoltre, che in questa nuova formulazione della ''regular expression'' i nomi sono da intendersi separati tra loro da ''\s+''.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
A questo punto si è quasi giunti alla formulazione finale del pattern da associare ad un nominativo, rimangono solo da trattare alcuni casi critici non ancora risolti.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt; &lt;br /&gt;
Si è già presentato in precedenza il problema legato al fatto che alcuni cognomi possono avere un significato proprio nel lessico comune e che ciò costringeva, quindi, ad abbandonare l'idea di trattare nominativi formati dal solo cognome. Questa problematica di ambiguità si presenta anche con alcuni nomi (si pensi, ad esempio, al nome ''Gioia''). Ciò non rappresenta generalmente un problema, in quanto la coppia nome-cognome che forma il nominativo, presa complessivamente, non è soggetta ad ambiguità. Esistono, però, dei casi in cui questo non è vero. Si prenda in analisi il nominativo ''Gioia Grande'': risulta evidentemente soggetto a rischio di ambiguità. Una soluzione che si può adottare, per risolvere questo caso critico, si basa sull'associazione di un pattern più stringente ai nominativi. In particolare, si osserva che i nomi propri di persona compaiono sempre ed obbligatoriamente, in un documento grammaticalmente corretto, con la prima lettera maiuscola ([0024]). I cognomi, invece, non sono soggetti ad una regola così stringente: un cognome iniziante con una lettera minuscola (come ''de Rosa'') in alcuni casi, ad esempio se posto dopo un punto fermo, può comparire scritto con la prima lettera sia maiuscola che minuscola; naturalmente, in nessuna occorrenza un cognome che inizi con una lettera maiuscola potrà comparire con una minuscola. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Occorre quindi ridefinire, alla luce di queste osservazioni, la ''regex'' associata ad un nominativo, poiché precedentemente era stata posta interamente ''case-insensitive''. Nel pattern, in particolare, i nomi dovranno sempre iniziare con una maiuscola, mentre i cognomi avranno questo vincolo solo se nel nominativo compaiono con la prima lettera maiuscola. Si mostra quindi quali sono i tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; e &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt; associati a due nominativi, ad esempio ''Gioia Grande'' e ''Antonio de Rosa''. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per ''Gioia Grande'' si ha:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt; = G((?i)ioia)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt; = G((?i)rande)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per ''Antonio de Rosa'' si ha:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt; = A((?i)ntonio)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt; = (?i)de Rosa&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si presenta dunque la definizione finale del tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;regex&amp;gt;&amp;lt;/span&amp;gt;. Nella definizione il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; è definito il base al numero di nomi del nominativo ed il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt; è definito in base al carattere iniziale del cognome.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;regex&amp;gt; := &amp;lt;start&amp;gt;&amp;lt;cognome&amp;gt;\s+(&amp;lt;nomi&amp;gt;)|(&amp;lt;nomi&amp;gt;)\s+&amp;lt;cognome&amp;gt;&amp;lt;end&amp;gt;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Vengono inoltre mostrati i valori dei due tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; e &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt; per il nominativo preso come caso di studio in fase iniziale, ossia ''Amorosa Lorenzo Mario''. Si ottiene:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt; = L((?i)orenzo)\s+M((?i)ario)|M((?i)ario)\s+L((?i)orenzo)|L((?i)orenzo)|M((?i)ario)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt; = A((?i)morosa)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Infine, per completezza, viene mostrata la ''regular expression'', associata a quest'ultimo nominativo, risolvendo tutti i tag che la compongono:&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;regex&amp;gt; = (?&amp;lt;=[^A-Za-zÀ-ÖØ-öø-ÿĿŀČčŘřŠšŽžĲĳŒœŸŐőŰűḂḃĊċḊḋḞḟĠġṀṁṠṡṪṫĀāĒēĪīŌōŪūİıĞğŞşẀẁẂẃŴŵŶŷǾǿẞ]|^)(A((?i)morosa)\s+(L((?i)orenzo)\s+M((?i)ario)|M((?i)ario)\s+L((?i)orenzo)|L((?i)orenzo)|M((?i)ario))|(L((?i)orenzo)\s+M((?i)ario)|M((?i)ario)\s+L((?i)orenzo)|L((?i)orenzo)|M((?i)ario))\s+A((?i)morosa))(?=[^A-Za-zÀ-ÖØ-öø-ÿĿŀČčŘřŠšŽžĲĳŒœŸŐőŰűḂḃĊċḊḋḞḟĠġṀṁṠṡṪṫĀāĒēĪīŌōŪūİıĞğŞşẀẁẂẃŴŵŶŷǾǿẞ]|$)&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Gestione delle omonimie====&lt;br /&gt;
&lt;br /&gt;
Nei ragionamenti che hanno portato alla formulazione della ''regular expression'' associata ai nominativi, si è tenuto conto di possibili ambiguità con termini appartenenti al linguaggio comune, risolte con l'introduzione nel pattern di stringhe ''case-sensitive'', e di possibili nominativi posti in sequenza parzialmente omonimi (ossia aventi un nome o il cognome in comune tra loro), gestite con l'imposizione dei soli caratteri separatori non visibili come delimitatori delle parole componenti un nominativo. Per rendere l'analisi completa occorre valutare come ci si debba comportare in altri possibili casi di omonimia. Si osserva, per inciso, che nel pattern individuato nella sezione precedente il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; è stato l'unico non definito formalmente. La definizione di tale tag infatti dipende, oltre che dai nomi del nominativo, anche dall'insieme complessivo dei nominativi da trattare presenti nel documento.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Il caso più semplice di omonimia, che si verifica quando un solo nome o il solo cognome di un nominativo coincide con un nome o il cognome di un altro (come nel caso di ''Lorenzo Mario Amorosa'' e ''Stefano Amorosa''), risulta già ben gestito dall'attuale formulazione del pattern. Infatti, un riconoscimento è determinato quando almeno un nome e il cognome del nominativo appaiono in sequenza.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Il problema si complica quando un nominativo ha due o più componenti in comune con un altro. Si osserva che se l'omonimia riguarda solo i nomi dei nominativi, ciò non risulta problematico, in quanto il cognome, supposto sempre presente nel pattern, funge da elemento di disambiguazione. Si considera da ora, quindi, che i nominativi abbiano il medesimo cognome e si analizzano i casi in cui anche uno o più nomi risultano in comune, attraverso degli esempi: &lt;br /&gt;
* Nomi_A = {&amp;quot;Lorenzo&amp;quot;, &amp;quot;Mario&amp;quot;, &amp;quot;Luca&amp;quot;}; Nomi_B = {&amp;quot;Stefano&amp;quot;, &amp;quot;Mario&amp;quot;}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F01])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In questo caso sono elementi di disambiguazione i nomi ''Lorenzo'' e ''Luca'' per il primo nominativo e ''Stefano'' per il secondo, bisognerà quindi far sì che almeno uno tra tali nomi compaia sempre nelle ''regex'' associate ai nominativi in questione. L'occorrenza ''Mario &amp;lt;cognome&amp;gt;'' rimane ambigua e non può essere trattata.&lt;br /&gt;
* Nomi_A = {&amp;quot;Lorenzo&amp;quot;, &amp;quot;Mario&amp;quot;, &amp;quot;Luca&amp;quot;}; Nomi_B = {&amp;quot;Mario&amp;quot;, &amp;quot;Luca&amp;quot;}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F02])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
L'insieme Nomi_B risulta un sottoinsieme di Nomi_A, di conseguenza solo il primo nominativo presenta degli elementi utili per risolvere l'ambiguità. Nel pattern relativo al primo nominativo dovrà essere presente almeno un tra i nomi non in comune, mentre il pattern del secondo nominativo rappresenterà inevitabilmente espressioni ambigue poiché riconducibili all'altro. Le soluzioni possibili sono due: rifiutarsi di effettuare il trattamento del secondo nominativo oppure decretare che esso è riconosciuto se e solo se appare nella sua forma estesa, presentando quindi tutti i nomi. Quest'ultima soluzione è ragionevole e la si sceglie, poiché così si aumentano, per quanto possibile, le sequenze &amp;quot;minimizzabili&amp;quot;, e viene inoltre messo in conto di informare l'utente opportunamente sulla gestione di questo genere di omonimia per rendere le operazioni trasparenti.&lt;br /&gt;
* Nomi_A = Nomi_B = {&amp;quot;Lorenzo&amp;quot;, &amp;quot;Mario&amp;quot;, &amp;quot;Luca&amp;quot;}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F03])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Qualora l'insieme dei nomi dei due nominativi sia identico risulta impossibile distinguerli e non possono in alcun modo essere trattati, poiché l'ordine con cui compaiono i nomi di un nominativo non rappresenta un elemento di disambiguità. I dati appartenenti a persone completamente omonime contenuti in uno stesso documento, quindi, non sono &amp;quot;minimizzabili&amp;quot; distintamente.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva che è di fondamentale importanza che i documenti che gli utenti forniscono siano grammaticalmente corretti, in quanto un errato uso dei segni di interpunzione può rendere impossibile l'applicazione delle ''regular expression''. Si prenda ad esempio una sequenza anomala di caratteri in cui non è corretto l'uso delle virgole, come &amp;quot;''Amorosa Mario Rossi Giacomo''&amp;quot;: supponendo che nel documento si vogliano trattare i nominativi ''Amorosa Mario'', ''Rossi Mario'' e ''Rossi Giacomo'', risulta impossibile identificare quali tra questi siano rappresentatati nella sequenza.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In conclusione, risultano quindi individuate le strategie che permettono di formulare ''regular expressions'' anche per i nominativi soggetti ad omonimia.&lt;br /&gt;
&lt;br /&gt;
====Formattazione dei documenti====&lt;br /&gt;
 &lt;br /&gt;
I documenti prodotti in enti ed organizzazioni presentano generalmente formattazioni e non sono puramente testuali. Si vuole qui considerare quale debbano essere le interpretazioni più adatte da dare agli elementi grafici per rendere sempre efficace il riconoscimento dei nominativi. In particolare, quindi, non si tratteranno gli elementi di punteggiatura, come parentesi o virgolette, poiché già compresi nelle ''regex'', bensì tutti gli elementi che in un pattern composto da caratteri non sono espressi. Si inizia dunque la rassegna:&lt;br /&gt;
* Elementi di formattazione del testo&lt;br /&gt;
I font, la dimensione dei caratteri, il grassetto, il corsivo, l'evidenziazione e tutti i possibili elementi di modifica della apparizione grafica del testo non alterano il significato dei lessemi coinvolti. Se il cognome di un nominativo è posto in grassetto ed il nome no, ad esempio, la coppia nome-cognome rappresenta sempre il nominativo iniziale; lo stesso vale per gli altri elementi citati.&lt;br /&gt;
* Aree di comparizione del testo&lt;br /&gt;
In genere ogni documento è formato da più sezioni, ha un corpo principale ed eventuali titoli, note a piè pagina, intestazioni ed altre possibili aree. Il trattamento di &amp;quot;minimizzazione&amp;quot;, secondo il ''GDPR'', deve essere effettuato al documento in ogni sua parte, ma ogni sezione deve essere elaborata in maniera indipendente dalle altre sezioni in quanto rappresenta un blocco logico a sé. Ciò significa che, ad esempio, bisogna individuare eventuali nominativi presenti nel titolo, ma non bisogna considerare nominativo una sequenza di parole che è posta in parte nel titolo e in parte nel primo paragrafo del testo.&lt;br /&gt;
* Elementi blocco&lt;br /&gt;
Gli elementi blocco, come ad esempio le immagini, possono causare un'interruzione netta in un paragrafo, suddividendolo quindi in più blocchi logici, che devono essere analizzati separatamente; tuttavia nel caso in cui questi elementi siano posti ''fluttuanti'', ossia ancorati ai bordi della pagina, il testo scorre in un unico flusso e forma quindi un unico blocco logico.&lt;br /&gt;
* Divisione in sillabe&lt;br /&gt;
Un problema rilevante nella formattazione del documento è che spesso, per esigenze estetiche, contiene delle parole divise in sillabe poste su righe diverse e separate da un trattino. Ovviamente se un nome va a capo a fine linea non perde il suo significato semantico, bisognerà quindi continuare a riconoscerlo.&lt;br /&gt;
* Tabelle&lt;br /&gt;
Molti documenti, specialmente quelli contenenti ingenti quantità di nominativi, possono essere strutturati in forma tabellare. Trascurando una trattazione per esteso delle modalità con cui i nominativi potrebbero comparire nelle tabelle, si considera esclusivamente il caso di gran lunga più ricorrente. In genere, infatti, in una tabella contenente dei nominativi, essi sono presenti nella stessa colonna o in colonne contigue: l'una contenente i nomi, l'altra il cognome, o viceversa. Senza basarsi sull'intestazione delle colonne, si può valutare se il contenuto di due celle adiacenti poste su di una stessa riga faccia match con il pattern di un nominativo, ed in caso ciò accada si può affermare la coppia di celle individuata rappresenta un nominativo.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva che si sono fornite solamente le interpretazioni più plausibili e comuni a questi elementi grafici e non si è ideato alcun particolare algoritmo per la loro elaborazione. L'espressione di tali strutture, infatti, è fortemente determinata dal formato in cui il documento è redatto. Si rimanda, quindi, ai capitoli successivi per specificazioni ulteriori della soluzione. Occorre notare, infine, che gli elementi di formattazione non sono descritti da stringhe nel formato delle ''regular expressions'': bisognerà quindi integrare gli elementi presentati in questa sezione con l'approccio ''pattern-based'' adottato.&lt;br /&gt;
&lt;br /&gt;
===Analisi dell'usabilità===&lt;br /&gt;
&lt;br /&gt;
====Elenco dei nominativi da trattare esplicitamente espressi come dati in input====&lt;br /&gt;
&lt;br /&gt;
In questo caso, per usufruire del servizio, l'utente deve fornire un documento contenente una serie di nominativi da trattare. Una garanzia della corretta elaborazione del documento si ha richiedendo all'utente stesso quali siano i nominativi da trattare: in questo modo potranno essere &amp;quot;minimizzati&amp;quot; i dati (cioè i nominativi) di tutte e sole le persone espressamente richieste. In molti plausibili scenari, infatti, è necessario anonimizzare solo alcuni dei nominativi presenti nel documento; ad esempio in un atto giudiziario serve anonimizzare le parti in causa ma non i magistrati. &lt;br /&gt;
&lt;br /&gt;
Questa configurazione del servizio permette quindi all'utente di avere il massimo controllo possibile del risultato. Tuttavia questo approccio è poco pratico nel caso in cui i documenti da trattare contengano grandi quantità di nominativi diversi e, magari, l'utente che ne richiede il trattamento non li conosce; si pensi ad esempio a lunghe graduatorie di concorsi o altro. Si osserva inoltre che anche per pochi nominativi l'usabilità può degradare, se l'inserimento viene fatto con estemporanea digitazione, esposta anche al rischio di possibili errori di battitura, con conseguenti noiose ripetizioni delle operazioni.&lt;br /&gt;
&lt;br /&gt;
Si osserva, infine, che il sistema progettato è sufficientemente robusto nel trattare i nominativi in input espressi da un utente che ha digitato caratteri maiuscoli o minuscoli violando le convenzioni grammaticali. Supposto che il documento trattato debba essere grammaticalmente corretto, infatti, si ha la garanzia che i nomi ivi presenti comincino con una maiuscola; è sufficiente, quindi, forzare una conversione ''to-upper-case'' dei nomi inseriti dall'utente e le ''regex'' progettate funzionano correttamente. Un discorso a parte va fatto per i cognomi inseriti dall'utente, in quanto essi possono comparire con la prima lettera sia maiuscola che minuscola. L'inserimento di un cognome iniziante con una minuscola non crea grossi problemi, in quanto in tal caso la ''regex'' risultante sarebbe totalmente ''case-insensitive'' per il cognome, mentre l'aggiunta di un cognome cominciante con una maiuscola determina una ''regex'' ''case-insensitive'' per la prima lettera del cognome; qualora quindi un utente inserisse un nominativo tutto in maiuscolo, le occorrenze del cognome, presenti nel documento, inizianti con una lettera minuscola non verrebbero riconosciute.&lt;br /&gt;
Per le altre lettere dopo la prima, sia per i nomi che per i cognomi, il pattern è stato progettato ''case-insensitive'', quindi non emergono problemi. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In sintesi, il rischio che vengano introdotte delle ambiguità lessicali, incaricando l'utente dell'inserimento dei nominativi, è piuttosto basso ed il controllo che si ha sui nominativi è il massimo desiderabile, mentre i requisiti di usabilità risultano penalizzati.&lt;br /&gt;
&lt;br /&gt;
====Elenco dei nominativi da trattare dedotti automaticamente da un dizionario====&lt;br /&gt;
&lt;br /&gt;
Se si desidera privilegiare la tematica dell'usabilità nella progettazione del servizio, risulta necessario individuare delle strategie che semplifichino il più possibile i compiti che devono essere svolti dall'utente. L'unica operazione che inevitabilmente resta a suo carico è l'upload del documento da trattare; non è infatti necessario richiedergli l'elencazione dei nominativi dei nominativi da trattare, in quanto questi possono essere dedotti automaticamente impiegando dei dizionari, dei quali va quindi valutato il contenuto e le modalità di utilizzo. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si scarta subito l'ipotesi di dedurre automaticamente i nominativi basandosi unicamente sul fatto che le iniziali di nomi e cognomi siano maiuscole; come già argomentato infatti l'uso delle lettere maiuscole non è limitato solo a questi usi e, inoltre, non si può avere la certezza che un cognome inizi con una maiuscola.&lt;br /&gt;
&lt;br /&gt;
Sono disponibili fortunatamente alcuni dizionari di nomi ed altri di cognomi, in diverse lingue; si fa qui riferimento a quelli di &amp;quot;Data World&amp;quot; (un'azienda focalizzata sulla raccolta, produzione e pubblicazione di dataset: https://data.world) ([0037]).&lt;br /&gt;
&lt;br /&gt;
Si inizia l'analisi inquadrando le dimensioni che un dizionario contenente nomi o cognomi avrebbe. Risalta subito all'occhio la differenza tra il numero di termini contenuti nei due casi: facendo riferimento ai soli nomi e cognomi italiani, risultano esistenti circa 350.000 cognomi ([0036]) e circa 9.000 nomi, dei quale circa 5.000 maschili e circa 4.000 femminili ([0037]); il numero dei cognomi è quindi quasi 40 volte più grande del numero dei nomi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si ipotizza, per chiarire le idee, di applicare questi dizionari in uno scenario reale, in cui, ad esempio, si vuole trattare un documento di 10 pagine contenente 5.000 parole. Si trascurano inoltre i meccanismi che permettono di ricondurre un nome od un cognome ad un nominativo per concentrarsi unicamente sul numero di confronti necessari da effettuare nell'elaborazione. Nel peggiore dei casi possibili, ossia quando nessuna parola del documento compare tra i termini del dizionari, e dove occorre quindi confrontare ogni singola parola del documento con tutti i termini del dizionario, per semplice moltiplicazione si ottiene che l'impiego di un dizionario di nomi darebbe luogo a 45.000.000 confronti, mentre un dizionario di cognomi ben a 1.750.000.000 confronti. Se invece le parole nel documento fossero 50.000 si avrebbero 450.000.000 di confronti nel primo caso e 10.750.000.000 nel secondo. In sintesi, sebbene il rapporto tra il numero di confronti nei due casi rimanga sempre costante (circa 1:40) indipendentemente dalla lunghezza del documento, la differenza tra il numero di confronti cresce proporzionalmente al numero di parole che vengono sottoposte all'elaborazione. Per quantificare, infine, attraverso un unità di tempo, la differenza esistente tra l'impiego delle due diverse tipologie di dizionario, si realizza un semplice programma java, di cui si riporta qui sotto il contenuto del metodo principale, che realizza i confronti necessari attraverso l'uso di ''regular expression'':&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
final String regex = &amp;quot;\bLorenzo\b&amp;quot;;&amp;lt;br/&amp;gt;&lt;br /&gt;
final String string =  ... //testo di prova&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);&amp;lt;br/&amp;gt;&lt;br /&gt;
final Matcher matcher = pattern.matcher(string);&amp;lt;br/&amp;gt;&lt;br /&gt;
int start, total;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
start = System.currentTimeMillis();&lt;br /&gt;
while (matcher.find()) {&lt;br /&gt;
    System.out.println(&amp;quot;Full match: &amp;quot; + matcher.group(0));&lt;br /&gt;
    for (int i = 1; i &amp;lt;= matcher.groupCount(); i++) {&lt;br /&gt;
        System.out.println(&amp;quot;Group &amp;quot; + i + &amp;quot;: &amp;quot; + matcher.group(i));&lt;br /&gt;
    }&lt;br /&gt;
} &amp;lt;br/&amp;gt;&lt;br /&gt;
total = System.currentTimeMillis() - start;&lt;br /&gt;
System.out.println(&amp;quot;Total: &amp;quot; + total + &amp;quot; ms&amp;quot;);&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Eseguendo il test più volte, inserendo fino a 10 occorrenze della parola &amp;quot;Lorenzo&amp;quot; nel testo, si ha un tempo di elaborazione medio di circa 3 ms, con prestazioni di picco di 2 ms, ottenibili con poche occorrenze del nome presenti, e tempo di attesa massimo di 6 ms, dovuto alla presenza invece a una presenza più frequente del nome nel testo.&lt;br /&gt;
Questo fenomeno si comprende meglio ricordando che, come spiegato nel capitolo precedente, le ''regular expressions'' ottimizzano la ricerca, considerano le stringhe del testo trattato solo finché necessario, ossia fino a quando non vi è certezza che esse corrispondano o non corrispondano ad un match. Ogni volta che nel testo si presenta una parola che inizia con una lettera diversa dalla 'L' di &amp;quot;Lorenzo&amp;quot;, la ricerca procede direttamente con la valutazione della parola successiva, ignorando i rimanenti caratteri della parola. &lt;br /&gt;
&lt;br /&gt;
Risulta, invece, più onerosa la verifica della corrispondenza tra una stringa ed il pattern desiderato, poiché in questo caso vanno elaborati tutti i caratteri della parola. Come caso limite, si è posta come stringa da elaborare la sequenza di caratteri &amp;quot;Lorenzo &amp;quot; ripetuta 500 volte: il tempo di esecuzione medio del programma risultante, a parità di piattaforma, è stato di circa 25 ms.&lt;br /&gt;
&lt;br /&gt;
Un'altra diretta conseguenza di questo meccanismo di confronto è che all'aumentare del numero di parole nel documento non corrisponde un eccessivo aumento del tempo di esecuzione: considerando un documento di 5000 parole, con 0 occorrenze del nome &amp;quot;Lorenzo&amp;quot; il tempo di esecuzione medio risulta di 9 ms, con 10 occorrenze di 10 ms, con 100 occorrenze di 15 ms.&lt;br /&gt;
&lt;br /&gt;
Occorre precisare, prima di formulare ulteriori ragionamenti, che in documento di 5.000 parole potranno essere presenti al più 2500 coppie nome-cognome; in un dizionario con più di 2.500 termini almeno uno di questi non contribuirà nell'individuazione di un nominativo. Se poi sono presenti altre parole oltre ai nominativi nel documento, la percentuale di nomi che presenterà 0 occorrenze crescerà di conseguenza. Ad ogni modo, si sceglie di sviluppare i ragionamenti considerando necessario il tempo medio di 10 ms per individuare le occorrenze di un termine di un dizionario in un documento di 5.000 parole; questo tempo è sicuramente maggiore rispetto al caso reale, ma valutando per eccesso questo valore è possibile trascurare il tempo impiegato nelle altre operazioni di routine a supporto dell'algoritmo di ricerca.&lt;br /&gt;
&lt;br /&gt;
Ritornando all'esempio di partenza, considerando quindi necessari 10 ms per individuare le occorrenze di un termine di un dizionario in un documento di 5.000 parole, risulta che l'identificazione di tutti i cognomi contenuti nel testo richieda circa 3.500 secondi, (quasi un'ora!), mentre l'individuazione dei nomi &amp;quot;solo&amp;quot; 90 secondi.&lt;br /&gt;
I tempi di attesa che l'utente dovrebbe aspettare sono estremamente elevati e irragionevoli, specialmente se calati nel contesto nelle ''web application''. Come primo espediente per ovviare al problema si decide di abbandonare completamente l'idea di impiegare un dizionario di cognomi, in quanto, seppur si individuassero delle soluzioni in grado di effettuare il riconoscimento di tutte le occorrenze di un termine in un documento indipendentemente dalla lunghezza in solo 1 ms (irreale), sarebbero comunque necessari 3 minuti e 50 secondi per l'elaborazione. Non verranno quindi neppure trattate possibili soluzioni che prevedono l'applicazione di entrambi i dizionari.&lt;br /&gt;
&lt;br /&gt;
I 90 secondi richiesti dal dizionario di nomi, invece, risultano anch'essi eccessivi, ma attraverso opportune valutazioni si possono individuare delle strategie che consentono la minimizzazione del tempo necessario all'elaborazione dei documenti. Tali metodi di ottimizzazione saranno trattati in un successivo capitolo, mentre ora ci si continua a concentrare sulle modalità di impiego del dizionario.&lt;br /&gt;
&lt;br /&gt;
Per inciso, si osserva che i problemi di efficienza sono strettamente legati al riconoscimento automatico dei nominativi, in quanto in questo caso devono essere applicate quasi una decina di migliaia di ''regex'' diverse; nel caso in cui i nominativi da elaborare e le ''regex'' a loro associate siano noti, si ha a che fare con un numero esiguo di pattern da trattare e l'esecuzione del programma risulta infinitamente più rapida.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per migliorare l'efficacia del servizio sarebbe opportuno introdurre nel dizionario anche nomi stranieri, sempre più diffusi in una società sempre più globalizzata. Il tempo di esecuzione medio del riconoscimento, già critico, crescerebbe ulteriormente: si decide allora di introdurre nel dizionario i soli nomi inglesi, in totale quasi 5500 ([0037]). Considerando sempre un tempo medio di esecuzione di 10 ms per nome, con un dizionario di circa 14.500 termini si avrebbe un tempo di esecuzione medio complessivo di 145 secondi, ossia pari a 2 minuti e 25 secondi, e risulta ancora possibile effettuare alcune ottimizzazioni che lo riducono ad un livello accettabile.&lt;br /&gt;
&lt;br /&gt;
Una volta individuati i nomi contenuti nel documento occorre stabilire se essi fanno parte di un nominativo, progettando un'opportuna ''regular expression''. È importante notare che per conseguire questo scopo bisogna individuare la soluzione più efficiente possibile.&lt;br /&gt;
&lt;br /&gt;
Un nominativo, come già ripetuto più volte, è composto da uno o più nomi e da un cognome. Individuato un nome, la priorità che si ha è verificare se accanto ad esso sia presente un cognome. Finora i cognomi sono stati supposti non regolamentati da alcun pattern specifico, ma è necessario formularne almeno uno per consentirne il riconoscimento automatico. È ragionevole supporre che un cognome sia formato da massimo due parole, separate da spazio o apostrofo, sempre inizianti entrambe con una maiuscola, fatta eccezione per la prima parola laddove essa sia una preposizione semplice o articolata oppure un articolo, tenendo conto dei possibili troncamenti, come &amp;lt;i&amp;gt;d'&amp;lt;/i&amp;gt; e &amp;lt;i&amp;gt;dell'&amp;lt;/i&amp;gt;. Inoltre per verificare se un termine adiacente al nome trovato rappresenti un nome si evita di impiegare nuovamente il dizionario per non gravare ulteriormente sul tempo di esecuzione. Inoltre, si nota che avendo supposto un cognome composto da massimo due parole inizianti con una lettera maiuscola, un altro nome, oltre quello trovato dal dizionario, viene già automaticamente riconosciuto qualora il cognome sia composto da una sola parola. Rinunciando ad individuare nominativi composti da tre nomi o più, si formula una ''regular expression'' per il riconoscimento automatico in seguito al identificazione di un nome, qui indicato con il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nome&amp;gt;&amp;lt;/span&amp;gt;, supponendo il cognome come precedentemente indicato e ipotizzando la presenza di un ulteriore nominativo.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;prep&amp;gt; := d((a|e)(l(l[aeo]?)?|i|gli?)?|i)?|(ne|a|su)(l(l[aeo]?)?|i|gli)?|l[aeo]?|co[iln]?|i[ln]?|gli|per&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cognome&amp;gt; := (([A-Z][a-zA-ZÀ-ÖØ-öø-ÿ]*|&amp;lt;prep&amp;gt;)('|\s))?[A-Z][a-zA-ZÀ-ÖØ-öø-ÿ]+&lt;br /&gt;
&lt;br /&gt;
&amp;lt;second_name&amp;gt; := [A-Z][a-zA-ZÀ-ÖØ-öø-ÿ]+&lt;br /&gt;
&lt;br /&gt;
&amp;lt;regex&amp;gt; := (&amp;lt;second_name&amp;gt;\s)?(&amp;lt;nome&amp;gt;)\s&amp;lt;cognome&amp;gt;|&amp;lt;cognome&amp;gt;\s(&amp;lt;nome&amp;gt;)(\s&amp;lt;second_name&amp;gt;)?&lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Nella scrittura della ''regex'' si è prestata particolare attenzione all'utilizzo della simbologia per rendere l'espressione il più performante possibile, attraverso il massimo sfruttamento dei cortocircuiti logici e l'opportuno ordinamento dei caratteri (sono stati anteposti i caratteri comuni a più preposizioni od articoli). Inoltre, per alleggerire la ''regex'' si è rinunciato all'utilizzo dei caratteri dell'alfabeto latino non appartenenti ai primi due blocchi Unicode.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
È mostrata in figura la corretta elaborazione di 57 possibili casi di cognomi diversi&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F04])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva tuttavia che in alcune circostanze, come nella frase &amp;quot;''di Amorosa Lorenzo non si hanno notizie''&amp;quot;, accade che un parola (&amp;quot;''di''&amp;quot; in questo caso), non sia parte del cognome ma il programma non è in grado di riconoscerlo. Questa ambiguità è fortemente dipendente dal contesto e non è possibile trattarla senza significativi degradi delle performance; quindi è necessario rinunciare a trattarla, accettando riconoscimenti erronei. In altre situazioni, invece, dove magari si sta elaborando la stringa contenente il nominativo ''Mario Lorenzo'', risulta impossibile determinare quale tra i due termini sia il nome e quale il cognome; cioè significa che l'unico trattamento di &amp;quot;minimizzazione&amp;quot; automatico che risulta ragionevole applicare è la sostituzione del nominativo con uno pseudonimo, non il troncamento o l'alterazione dei nomi.&lt;br /&gt;
In conclusione, con il riconoscimento automatico dei nominativi si migliora complessivamente l'usabilità del servizio, in quanto l'utente non deve digitare i nominativi, ma la latenza introdotta è notevole, si è soggetti a rischi di ambiguità e non è in alcun modo esprimibile la preferenza su quali nominativi si desidera &amp;quot;minimizzare&amp;quot; o meno. La soluzione così ideata non risulta quindi adeguata.&lt;br /&gt;
&lt;br /&gt;
====Soluzione ibrida adottata====&lt;br /&gt;
Entrambe le tipologie di riconoscimento prima individuate hanno significativi problemi, si cerca quindi di sintetizzare una soluzione in grado di trarre i vantaggi dell'una e dell'altra. Risulta efficace, in particolare, che il documento venga inizialmente trattato tramite dizionari, evitando all'utente l'onere di specificare i nominativi, e che in seguito venga lasciata all'utente la possibilità di intervenire.&lt;br /&gt;
Infatti, esso potrebbe voler esprimere delle preferenze su quali nominativi debbano essere trattati tra quelli individuati e gestire gli eventuali errori di riconoscimento dovuti a richieste di trattamento di nominativi aventi un nome non presente nel dizionario o anche dovuti a casi di ambiguità lessicale già presentati.&lt;br /&gt;
&lt;br /&gt;
Una volta inserito il documento e terminata l'elaborazione tramite il dizionario, l'utente può sia richiedere l'immediato download del file ed effettuare le operazioni prima definite, attraverso un'opportuna interfaccia. Per fornire il supporto alle esigenze più disparate, si prevede la possibilità di:&lt;br /&gt;
# eseguire download del file trattato unicamente con il dizionario&lt;br /&gt;
# ripetere la &amp;quot;minimizzazione&amp;quot; del documento, specificando:&lt;br /&gt;
## nuovi nominativi&lt;br /&gt;
## quali nominativi tra quelli precedentemente individuati ''non'' si vogliono trattare&lt;br /&gt;
## quale parola/e dei nominativi individuati rappresenta il cognome (in tal caso, si possono utilizzare altri metodi, oltre alla sostituzione con pseudonimo, per il trattamento)&lt;br /&gt;
## quale parola/e dei nominativi individuati non compone il nominativo (situazione che si verifica quando ci si imbatte in una ambiguità).&lt;br /&gt;
&lt;br /&gt;
Senza soffermarsi in questo momento sull'intera sequenza concreta di interazioni tra utente e servizio, si osserva che l'unico vincolo non funzionale da valutare resta il tempo medio di attesa dell'utente. L'usabilità complessiva è molto buona ed i vincoli funzionali sono soddisfatti.&lt;br /&gt;
&lt;br /&gt;
===Scelta dei formati da trattare===&lt;br /&gt;
&lt;br /&gt;
Una considerazione intuitiva, ed una buona prassi, è che un documento contenente dati personali sia pseudonimizzato o anonimizzato quanto prima possibile e cioè quando è ancora solo nelle mani del suo autore: questo approccio scongiura che informazioni sensibili e dati personali in chiaro ''sfuggano'' in rete.&lt;br /&gt;
Si può per questo ragionevolmente ipotizzare che i naturali destinatari del servizio siano gli stessi autori (creatori) che redigono il documento. Nello scenario tipico di utilizzo, infatti, il fruitore del servizio procederà al trattamento dei dati non appena avrà finito di scrivere il documento del quale, essendone autore, potrà scegliere il formato. Si osserva che potrebbe accadere che il documento sia redatto da terzi: in tal caso l'utente che richiede il trattamento può scegliere il formato in maniera indiretta concordandolo con il redattore. Avendo quindi l'utente la possibilità di stabilire il formato del proprio documento, risulta ragionevole progettare un servizio che lavori su un solo formato.&lt;br /&gt;
A questo punto occorre individuare quale sia il formato che maggiormente si presta alle finalità del servizio.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Una possibilità è quella di richiedere all'utente di inserire come documento da trattare un semplice file di testo in formato ''txt'': in questo modo ci sarebbe il grande vantaggio di trattare file molto semplici, riducendo così al minimo la complessità realizzativa, e inoltre si avrebbe  l'indipendenza dagli editor di testo utilizzati, in quanto tutti supportano i file in formato ''txt''. &lt;br /&gt;
Risulta tuttavia sconveniente utilizzare questo formato, poiché non ha alcuna capacità espressiva per gestire elementi complessi come tabelle, modifiche allo stile del testo e così via. &lt;br /&gt;
Bisogna quindi optare per un formato in grado di gestire questi elementi, al costo di aumentare la complessità della progettazione, ricordando sempre che è necessario allo stesso tempo che tale formato sia supportato da tutti i principali editor di testo.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Con facilità è possibile individuare quali sono i formati di testo più comuni oltre al ''txt'': ''doc'', ''docx'', ''odt'', ''pdf'', ''pages'', ''rtf'', ''tex''. Si passa ora dunque a valutare quale tra questi formati potrebbe meglio soddisfare i requisiti prima enunciati. &lt;br /&gt;
Facendo una cernita iniziale sulla base delle finalità per le quali un formato è utilizzato, si può immediatamente escludere ''tex'', che trova impiego principalmente in ambito scientifico e matematico. In questo settore, infatti, non è richiesta generalmente l'applicazione delle procedura di trattamento dei dati. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt; &lt;br /&gt;
Si può inoltre abbandonare l'idea di trattare documenti con estensione ''pages'', formato proprietario di Apple, poiché utilizzati esclusivamente dall'omonimo editor di testo anch'esso proprietario, e i documenti con estensione ''rtf'', acronimo di ''Rich Text Format'', formato proprietario di Microsoft che supporta una formattazione avanzata, poiché, pur gestito da vari editor, è un formato decisamente datato (ultima versione 1.9.1 risalente a marzo 2008 ([0009])). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si esclude inoltre il formato ''pdf'' per motivi di usabilità: molti editor, infatti, consentono di esportare un documento in questo formato ma non permettono di importarlo. Un utente dopo aver effettuato l'anonimizzazione di un documento non può quindi proseguire modificandolo ulteriormente. Il ''Portable Document Format'', infatti, è ideato per realizzare dei documenti destinati alla sola lettura.&lt;br /&gt;
L'ultima esclusione, piuttosto immediata da effettuare, riguarda il formato ''doc'', binario e proprietario di Microsoft. Esso infatti risulta, a partire dal 2006, soppiantato dal formato ''docx'', sempre proprietario di Microsoft. &lt;br /&gt;
&lt;br /&gt;
Si giunge infine a valutare quale tra gli ultimi due possibili formati rimanenti, ossia ''docx'' e ''odt'', si presta meglio alle finalità del servizio. In via preliminare si osserva che entrambi i formati possiedono ottime capacità espressive, hanno una struttura interna di simile complessità e sono entrambi supportati dai principali editor di testo. È necessario quindi effettuare delle analisi più approfondite per poter sceglierne uno tra i due.&lt;br /&gt;
La struttura del formato ''docx'', sviluppato da Microsoft e formalmente denominato ''Office Open XML Document (OOXML Document)'', è costituita da un file compresso .zip contenente un insieme di file ''XML''. Il formato ''OOXML'' permette la rappresentazione, oltre che di documenti testuali, anche di fogli elettronici (formato ''OOXML 'Workbook'', noto anche come ''xslx'') e di presentazioni (formato ''OOXML Presentation'', noto anche come ''pptx'') ([0008], [0013]).&lt;br /&gt;
Il formato inoltre è stato inizialmente standardizzato nel 2006 dall'&amp;lt;i&amp;gt;ECMA&amp;lt;/i&amp;gt;  (come ''ECMA-376'') e successivamente nel 2008 dall'&amp;lt;i&amp;gt;ISO&amp;lt;/i&amp;gt; e dall'&amp;lt;i&amp;gt;IEC&amp;lt;/i&amp;gt; (come ''ISO/IEC 29500'') in una versione ''transitional'', retrocompatibile con alcune versioni precedenti del formato contenenti elementi deprecati, e in una versione ''strict'', dove tali elementi non sono ammessi. I due standard sono stati poi successivamente aggiornati e sono tutt'ora oggetto di revisioni ([0002]).&lt;br /&gt;
&lt;br /&gt;
Anche la struttura del formato open source ''odt'', sviluppato dall'&amp;lt;i&amp;gt;OASIS&amp;lt;/i&amp;gt; e formalmente denominato ''OpenDocument Text'', è basata su uno zip contenente un insieme di file ''XML''. Inoltre, il formato ''OpenDocument Format (ODF)'' permette di trattare fogli elettronici (formato ''OpenDocument Spreadsheet'', noto anche come ''ods'') e presentazioni (formato ''OpenDocument Presentation'', noto anche come ''odp'') ([0007]). Anche ''OpenDocument Text'' è stato standardizzato, in particolare dall'&amp;lt;i&amp;gt;OASIS&amp;lt;/i&amp;gt; stesso nel 2005 e dall'&amp;lt;i&amp;gt;ISO/IEC&amp;lt;/i&amp;gt; nel 2006, ed è soggetto a revisioni e aggiornamenti ([0003]).&lt;br /&gt;
&lt;br /&gt;
In sintesi, basandosi sulla struttura dei documenti e sulla standardizzazione dei formati, non è ancora possibile individuare quale sia il formato migliore. L'unico elemento che potrebbe portare punti a favore del formato ''odt'' è che esso, a differenza del formato ''docx'', è aperto, tuttavia, essendo le specifiche di entrambi i formati pubbliche, ciò non rappresenta un fattore determinante nell'elezione del formato.&lt;br /&gt;
Entrambi i formati, inoltre, sono largamente supportati dai word processors.&lt;br /&gt;
&lt;br /&gt;
Le seguenti tabelle riepilogano il supporto all'uno ed all'altro formato dei ''word-processors'' più usati, ossia ''Microsoft Office Word'', ''LibreOffice Writer'', ''OpenOffice Writer'' e ''Pages''. &lt;br /&gt;
Le tabelle sono tratte da wikipedia ([0000], [0001], [0006]). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;i&amp;gt;Supporto fornito dagli editor di testo al formato docx&amp;lt;/i&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  !! Microsoft Office Word !! LibreOffice Writer !! OpenOffice Writer !! Pages&lt;br /&gt;
|-&lt;br /&gt;
! Version&lt;br /&gt;
|| 2013, 2011 for Mac || All versions || 3.0 || '08&lt;br /&gt;
|-&lt;br /&gt;
! Operating systems&lt;br /&gt;
|| Windows, Mac OS X || Windows, OS X, Linux, Unix, Android || Windows, Linux, Unix, Mac OS X || Mac OS X&lt;br /&gt;
|-&lt;br /&gt;
! Office suite&lt;br /&gt;
|| Microsoft Office ||  || OpenOffice.org || iWork&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
|| Microsoft || The Document Foundation || Apache OpenOffice || Apple Inc.&lt;br /&gt;
|-&lt;br /&gt;
! License&lt;br /&gt;
|| proprietary || MPL || LGPL || proprietary&lt;br /&gt;
|-&lt;br /&gt;
! ECMA-376&lt;br /&gt;
|| yes || yes || yes || yes&lt;br /&gt;
|-&lt;br /&gt;
! ISO/IEC 29500:2008&lt;br /&gt;
|| yes || yes || || &lt;br /&gt;
|-&lt;br /&gt;
! Notes&lt;br /&gt;
||  ||  || Import only ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;i&amp;gt;Supporto fornito dagli editor di testo al formato odt&amp;lt;/i&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  !! Microsoft Office Word !! LibreOffice Writer !! OpenOffice Writer &lt;br /&gt;
|-&lt;br /&gt;
! Version&lt;br /&gt;
|| 2007 SP2 || 4.0.3 || 3.0.0&lt;br /&gt;
|-&lt;br /&gt;
! Operating systems&lt;br /&gt;
|| Windows || Unix-based systems, Mac OS X, Solaris || Windows, Linux, Unix-based systems, Mac OS X, Solaris&lt;br /&gt;
|-&lt;br /&gt;
! Office suite&lt;br /&gt;
|| Microsoft Office ||  || OpenOffice.org&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
|| Microsoft || The Document Foundation || Apache OpenOffice&lt;br /&gt;
|-&lt;br /&gt;
! License&lt;br /&gt;
|| Proprietary || MPL || LGPL&lt;br /&gt;
|-&lt;br /&gt;
! ISO/IEC 26300:2006&lt;br /&gt;
|| yes || yes || yes&lt;br /&gt;
|-&lt;br /&gt;
! Notes&lt;br /&gt;
|| some limitations || Multiple ODF versions supported (ISO/ODF 1.0/1.1/1.2/1.2 Extended) || adjustable ODF version (ISO/ODF 1.2) &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si possono effettuare le seguenti osservazioni:&lt;br /&gt;
* ''Microsoft Office Word'' è, in ambiente Microsoft, il word processor maggiormente usato; è molto usato anche in ambiente Apple Mac. Esso offre il pieno supporto al formato ''OOXML Document''; solo parzialmente invece gestisce il formato ''OpenDocument Text'': il processamento di file con estensione ''odt'' con questo editor comporta la perdita di alcune informazioni secondarie.&lt;br /&gt;
* ''LibreOffice Writer'', l'editor open source maggiormente utilizzato, supporta pienamente entrambi formati. Nato con lo scopo di gestire i file con formato ''OpenDocument Text'', attualmente supporta completamente anche il formato ''OOXML Document''. &lt;br /&gt;
* ''OpenOffice Writer'', un altro degli editor di testo tra i più utilizzati, supporta pienamente ''odt'', mentre è solo in grado di importare i file con estensione ''docx''.&lt;br /&gt;
* ''Pages'', il word process installato a default sui Mac della Apple e, di conseguenza anche maggiormente usato su questi dispositivi, non offre supporto al formato ''odt'', ma elabora correttamente i documenti con estensione ''docx'' ([0005],[0004]). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Queste osservazioni evidenziano che quindi è impossibile adottare un formato supportato da tutti gli editor; la scelta va allora indirizzata verso quello maggiormente supportato dai word processor più popolari.&lt;br /&gt;
Per avere un'indicazione di ''popolarità'', e quindi per poter comprendere meglio quali tra gli editor prima citati siano i più usati, si può fare un'analisi, tramite motori di ricerca, di quanti file con una certa estensione siano presenti in rete.&lt;br /&gt;
È possibile, ad esempio, ricercare su Google i file che contengono nel proprio nome una determinata sequenza di caratteri o aventi una certa estensione (''filetype''). Sono qui presentati i risultati delle interrogazioni riguardo ai file aventi formato ''docx'', ''doc'' e ''odt'' ed il cui nome contiene uno dei caratteri, fra i più frequenti, &amp;quot;1&amp;quot; o &amp;quot;a&amp;quot; o &amp;quot;e&amp;quot;. L'investigazione è stata effettuata inserendo nella barra di ricerca di Google le stringhe ''1 filetype:docx'', ''a filetype:docx'' e così via.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Formato cercato !! Documenti con &amp;quot;1&amp;quot; nel nome !! Documenti con &amp;quot;a&amp;quot; nel nome !! Documenti con &amp;quot;e&amp;quot; nel nome&lt;br /&gt;
|-&lt;br /&gt;
| docx || 16.900.000  || 12.800.000 || 8.730.000&lt;br /&gt;
|-&lt;br /&gt;
| odt || 736.000 || 667.000 || 507.000&lt;br /&gt;
|-&lt;br /&gt;
| doc || 32.300.000 || 26.300.000 || 21.500.000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Effettivamente il formato più diffuso è il ''doc''; tuttavia esso è supportato per retro-compatibilità anche dagli editor che supportano formati ''OOXML'', con i quali non si ha difficoltà nel convertire i documenti dal formato ''doc'' al ''docx''. In conclusione, quale che sia l'editor più diffuso, è ragionevole adottare il formato ''OOXML Document'' per le finalità del servizio, in quanto molto diffuso, ben supportato dagli editor e avente ottime capacità espressive. Di conseguenza i documenti che saranno elaborati dovranno essere forniti dall'utente in tale formato. In successive sezioni verrà approfondita la struttura dei documenti ''OOXML''.&lt;br /&gt;
&lt;br /&gt;
===Privacy by design===&lt;br /&gt;
&lt;br /&gt;
L'Art. 25 del ''GDPR'', con i Considerando 75 e 78, ha per titolo e per oggetto la &amp;quot;protezione dei dati fin dalla progettazione e protezione per impostazione predefinita&amp;quot; ([0035]), perfettamente in linea con i concetti di &amp;quot;minimizzazione&amp;quot;, già richiamati.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Il senso dell'Art. 25 viene spesso sintetizzato con l'espressione &amp;quot;''PbD - privacy by design, privacy by default''&amp;quot; ([0035]). Il principio fissato nell'Art. 25 dovrà sempre più essere tenuto ben presente nell'ambito dell'ingegneria del software, in quanto impone di adottare nuove cautele nella realizzazione delle applicazioni software.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Del principio ''PbD'' si è ben tenuto conto nella progettazione descritta in questa tesi. In particolare, relativamente alla ''privacy by design'', si è fatto in modo che nessun dato personale permanga registrato sul sistema di esecuzione, o altrove, al termine dell'applicazione. Anche laddove l'applicazione termini in modo anomale non vi sono strutture dati superstiti, che restano memorizzate sul sistema.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Marginale in questa tesi è la nozione di ''privacy by default'', giacché l'applicazione non offre all'utente alcuna opzione che possa indurlo in errore ed acconsentire a trattamenti dei dati personali, oltre quello realizzato dall'applicazione.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
È utile osservare quanto sia importante esprimere queste impostazioni di progettazione fra le condizioni d'uso presentate all'utente: esse costituiscono uno dei presupposti affinché l'utente abbia piena fiducia (''trust'') nel servizio, lo utilizzi, lo divulghi, lo renda un servizio di successo.&lt;br /&gt;
&lt;br /&gt;
==Architettura del servizio== &lt;br /&gt;
&lt;br /&gt;
===I componenti software nell'architettura LAMP===&lt;br /&gt;
&lt;br /&gt;
Il servizio è realizzato in forma di ''web-based application'' poiché, come già illustrato nell'introduzione, si intende renderlo disponibile per il massimo numero di utenti possibili. Nella progettazione e realizzazione dell'architettura web si adotta la piattaforma ''LAMP'', il cui nome deriva dall'acronimo dei componenti open source che la realizzano (il sistema operativo Linux, il server HTTP Apache, il sistema per la gestione di database relazionali MySQL ed il linguaggio di programmazione PHP). Poichè il modello è composto da quattro livelli, spesso si parla anche di ''stack LAMP''. Uno degli elementi di forza del modello ''LAMP'' è che i componenti dei vari ''layer'' sono sostituibili, a seconda delle esigenze, con dei componenti più adatti, tipicamente open source ([0015], [0018], [0019]). Basando la piattaforma su un sistema operativo della famiglia di Microsoft Windows, ad esempio, si ottiene uno ''stack WAMP'', mentre se si usa un sistema operativo Mac OS si realizza uno ''stack MAMP''. Un'architettura web basata sul modello ''LAMP'' può, inoltre, essere integrata con software open source che offre utili funzionalità, come, ad esempio, il monitoraggio (''Nagios''), il load balancing (''Linux Virtual Server''), la rilevazione di accessi illeciti (''Snort'') e il security testing (''netsniff-ng''). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si valutano ora brevemente la diffusione dei componenti tradizionali dello ''stack LAMP'' e le alternative maggiormente usate per i vari ''layer''.&lt;br /&gt;
Le distribuzioni Linux risultano essere la scelta più comune per l'ultimo ''layer'' dello ''stack''. Secondo W3Techs, infatti, nell'ottobre del 2013, il 58.5% dei web server a livello globale avevano come sistema operativo la distribuzione Debian o Ubuntu, mentre il 37.3% una tra RHEL, Fedora e CentOS([0016]). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Tra i web server, Apache risulta essere maggiormente usato. Secondo le stime fatte da Netcraft, a giugno del 2014 circa il 51.9% del milione di siti web più trafficati al mondo usavano un web server Apache, il 19.2% nginx ed il 12.4% Microsoft ([0017]). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
I principali ''DBMS'' relazionali, oltre a MySQL, che possono essere presenti nello ''stack LAMP'' sono MariaDB e PostgreSQL, mentre tra i ''DBMS NoSQL'' MongoDB risulta essere il più comune. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Nello stack, infine, il ruolo di linguaggio di programmazione, solitamente svolto dal linguaggio PHP, spesso è ricoperto dai linguaggi Perl o Python. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva, ad ogni modo, che le informazioni sulla diffusione delle tecnologie non rappresentano un fattore vincolante nella scelta delle stesse, in quanto la piattaforma ''LAMP'' è anche aperta verso molti altri componenti oltre quelli citati; di conseguenza la scelta delle tecnologie da impiegare può essere effettuata basandosi principalmente sui requisiti e sulle specifiche del servizio. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Principi di progettazione per l'architettura===&lt;br /&gt;
&lt;br /&gt;
====Single Responsibility Principle====&lt;br /&gt;
&lt;br /&gt;
Per rendere il servizio maggiormente manutenibile ed estensibile, si presta particolare attenzione al rispetto del ''Single Responsibility Principle'' (''SRP'') ([0020]). Si cerca, quindi, di fattorizzare il software in più moduli, suddividendo tra questi le elaborazioni da svolgere. Un altro importante beneficio che si ottiene dalla fattorizzazione del codice è la riusabilità dei componenti. Ogni singolo modulo, infatti, svolge il proprio compito in maniera indipendente dal resto della applicazione ed è, quindi, riutilizzabile in altri scenari simili senza dover essere re-implementato. Inquadrando meglio questa metodologia di progettazione con i requisiti del servizio e la piattaforma web ''LAMP'', si individuano i due principali compiti a carico dell'applicazione:&lt;br /&gt;
* La gestione dell'interazione web con l'utente per la trasmissione del documento e dei nominativi da trattare&lt;br /&gt;
* Il processamento del documento per effettuare la &amp;quot;minimizzazione&amp;quot; dei dati.&lt;br /&gt;
Questi due differenti ''task'' saranno, quindi, portate a termine da componenti diversi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Progettando la struttura dell'applicazione in questo modo, si disaccoppia completamente la logica di business del servizio dalle interfacce web di comunicazione con l'utente. In un futuro sviluppo sarà possibile, quindi, realizzare nuove interfacce utilizzando altre tecnologie senza dover modificare la logica applicativa. &lt;br /&gt;
&lt;br /&gt;
====Dependency Inversion Principle====&lt;br /&gt;
&lt;br /&gt;
Un altro principio di design architetturale che risulta importante nella progettazione è il ''Dependency Inversion Principle'' (''DIP'') ([0038]). Esso si traduce nella realizzazione di componenti che non dipendono dalle specifiche implementazioni degli altri moduli del sistema, bensì dalle loro ''astrazioni''. &lt;br /&gt;
In relazione all'estensibilità e manutenibilità del prodotto software, infatti, l'impiego di moduli dipendenti direttamente dalla definizione dei metodi presenti in altri componenti risulta problematica: il modulo dipendente deve essere re-implementato ad ogni variazione del modulo da cui dipende.&lt;br /&gt;
Nella programmazione orientata agli oggetti, per rispettare questo principio, si su può fare uso di classi astratte o interfacce, costrutti che definiscono i moduli senza implementarli completamente o senza implementarli affatto.  &lt;br /&gt;
&lt;br /&gt;
===Stile architetturale REST=== &lt;br /&gt;
&lt;br /&gt;
Il modello architetturale del servizio che si sta definendo presenta una serie di caratteristiche, come ad esempio l'indipendenza dei moduli, che permettono di realizzarlo secondo il paradigma delle ''RESTful API''. L'espressione &amp;quot;Representational State Transfer&amp;quot; e il suo acronimo &amp;quot;REST&amp;quot; furono introdotti nel 2000 nella tesi di dottorato di Roy Fielding ([0021]), uno dei principali autori delle specifiche dell'Hypertext Transfer Protocol (HTTP). Roy Fielding descrive il ''Representational State Transfer'' come uno stile architetturale (&amp;quot;''architectural style''&amp;quot;), ovvero un'astrazione degli elementi di un'architettura all'interno di un sistema hypermedia distribuito. ''REST'' non specifica i dettagli dell'implementazione dei componenti e della sintassi del protocollo, ma definisce i ruoli dei componenti, i vincoli sulla loro modalità di interazione e la loro interpretazione.&lt;br /&gt;
Riassumiamo quindi i principi che deve rispettare una architettura ''REST'':&lt;br /&gt;
# Architettura Client-Server &amp;lt;br/&amp;gt;In una architettura ''REST'' viene data particolare importanza ai principi ''SRP'' e ''DIP'' prima citati, più generale si può affermare che l'architettura sposi il paradigma noto con il termine di &amp;quot;''Separation of Concerns''&amp;quot;. Una ''Restful API'' applica questi principi in un architettura Client-Server, capace di supportare l'evoluzione indipendente della logica lato client e della logica lato server.&lt;br /&gt;
# Stateless &amp;lt;br/&amp;gt;La comunicazione tra utente e fornitore del servizio deve essere senza stato, quindi ogni richiesta del client deve contenere tutte le informazioni di cui il fornitore necessita per l'erogazione del servizio offerto. Questa ipotesi viene fatta per rendere una ''Restful API'' facilmente scalabile orizzontalmente.&lt;br /&gt;
# Uso della cache &amp;lt;br/&amp;gt;In un Architettura ''REST'' i messaggi di risposta inviati dal server devono esplicitamente indicare se possono essere memorizzati nella cache del client o di componenti middleware per il riutilizzo nelle richieste successive.&lt;br /&gt;
# Interfaccia uniforme &amp;lt;br/&amp;gt;I componenti devono essere in grado di comunicare attraverso un'interfaccia uniforme e le risorse devono essere trasferite in un formato standard. Inoltre l'utente deve poter effettuare la navigazione tra le risorse di suo interesse tramite collegamenti ipertestuali. Per inciso, si osserva che il protocollo HTTP usato correttamente rispetta i requisiti di un architettura ''REST'' e che nelle implementazioni delle ''RESTful API'' il formato più usato per la modellazione dei dati è JSON.&lt;br /&gt;
# Layered System &amp;lt;br/&amp;gt;In un sistema a livelli, componenti intermedi (come i proxy) possono essere collocati tra client e server per intercettare il traffico per scopi specifici; ad esempio il caching o la sicurezza. Una soluzione basata su ''REST'' può essere composta da più livelli architettonici, indipendenti l'uno dall'altro.&lt;br /&gt;
# Code on Demand &amp;lt;br/&amp;gt;Questo vincolo facoltativo è inteso principalmente a consentire aggiornamenti alla logica all'interno dei client (come i browser Web) indipendentemente dalla logica lato server. Una ''single page application'', ad esempio, rispetta in pieno questo punto.&lt;br /&gt;
&lt;br /&gt;
Un'applicazione progettata sul modello dell'architettura ''REST'' ha quindi gli indiscutibili vantaggi di:&lt;br /&gt;
* consentire l'evoluzione indipendente delle diverse componenti &lt;br /&gt;
* avere un'interfaccia utente portabile con altri tipi di piattaforme&lt;br /&gt;
* permettere agevolmente la replicazione delle macchine server&lt;br /&gt;
* non vincolare moduli server e client a linguaggi e tecnologie specifiche.&lt;br /&gt;
&lt;br /&gt;
L'architettura del servizio oggetto di questa tesi si trova già perfettamente in linea con alcuni dei vincoli discussi, ma sono necessarie alcune considerazioni. Il punto 1 (&amp;quot;architettura Client-Server&amp;quot;) è chiaramente soddisfatto. &lt;br /&gt;
Il punto 2 (&amp;quot;Stateless&amp;quot;), direttamente collegato con i punti 3 e 5 (&amp;quot;Uso della cache&amp;quot;, &amp;quot;Layered System&amp;quot;), può essere rispettato con facilità; a ogni richiesta di &amp;quot;minimizzazione&amp;quot; del client corrisponde la restituzione del documento trattato dal server, non c'è quindi necessita di avere uno stato nell'interazione. &lt;br /&gt;
&lt;br /&gt;
Analizzando le caratteristiche di una applicazione stateless in relazione al principio ''privacy by design'' illustrato in precedenza, si osserva che l'assenza di stato determina la semplificazione delle problematiche critiche relative al principio. Non vengono conservate, infatti, informazioni contenenti dati sensibili, poiché dopo aver effettuato l'invio della risposta, sarà subito eliminato sul server il file elaborato.&lt;br /&gt;
&lt;br /&gt;
Nei capitoli precedenti tuttavia si è detto che l'utente può ripetere più volte il trattamento di uno stesso documento nella stessa sessione di interazione; essendo il vincolo dell'efficienza già difficile da rispettare per via dell'elaborazione onerosa del documento, si può progettare una modalità alternativa del funzionamento con stato del servizio, applicabile in assenza di replicazione delle macchine server e sfruttando le ripetute richieste di trattamento per uno stesso documento. &lt;br /&gt;
Si può infatti memorizzare lato server il documento inviato dal client inizialmente e, alle successive richieste di trattamento del medesimo documento, evitarne la ritrasmissione da client a server. Per rispettare il ''PbD'', al termine della sessione di interazione il documento verrà rimosso dal server. Si nota, inoltre, che per predisporre il servizio alla gestione delle due diverse modalità di funzionamento si può utilizzare un parametro di configurazione a livello applicativo.&lt;br /&gt;
I punti 4 e 6 infine (&amp;quot;Interfaccia uniforme&amp;quot;, &amp;quot;Code on Demand&amp;quot;) si possono rispettare utilizzando il formato JSON per la trasmissione dei documenti e dei nominativi, e usando localmente sul client Javascript per offrire tutte le funzionalità del servizio in un'unica pagina html.&lt;br /&gt;
&lt;br /&gt;
===Moduli software del servizio===&lt;br /&gt;
&lt;br /&gt;
====Scelta dei componenti software====&lt;br /&gt;
&lt;br /&gt;
Si opera ora la scelta delle tecnologie da utilizzare per i componenti dei 4 layer dello ''stack LAMP''. Per i due layer inferiori risulta piuttosto immediato decidere di usare le tecnologie presenti per default. Un sistema operativo Linux ed un web server Apache sono adatti all'architettura del servizio.&lt;br /&gt;
Inoltre anche il linguaggio di programmazione PHP può essere usato senza significativi problemi, anche se verranno fatte in seguito, in una sezione di questo capitolo, alcune considerazioni sulle problematiche di esecuzioni concorrenti di script PHP. Il linguaggio sarà impiegato in particolare per la realizzazione della logica necessaria a gestire l'interazione web con il cliente, mentre l'elaborazione del documento OOXML lato server sarà effettuata da un programma Java. &lt;br /&gt;
&lt;br /&gt;
I due ''task'' principali del servizio sono delegati, quindi, a due programmi distinti realizzati con tecnologie diverse. Si concretizza in questo modo il principio ''SRP'' e, sfruttando l'&amp;lt;i&amp;gt;openness&amp;lt;/i&amp;gt; della piattaforma LAMP, le funzionalità necessarie vengono realizzate attraverso i linguaggi più adatti.&lt;br /&gt;
La scelta del linguaggio Java per l'implementazione del ''main core'' della logica di business è dovuta alla libreria open source in ambiente java Docx4j ([40],[41]). Questa libreria è realizzata per il processamento delle tre tipologie di formati OOXML (''docx'', ''xslx'', ''pptx'') e permette tutte le possibili operazioni di creazione, lettura e modifica su questo tipo di documenti. Anche questa libreria sarà approfondita in sezioni successive. Si osserva, per inciso, che esistono altre librerie equivalenti in ambiente .NET. &lt;br /&gt;
&lt;br /&gt;
Nella scelta del linguaggio di programmazione usato per elaborare i documenti ed effettuare i confronti tramite ''regular expressions'', un dato non di poco conto da considerare è l'encoding delle stringhe. In Java, in particolare, una stringa è rappresentata internamente come un array di char, ognuno codificato da 2 byte in formato UTF-16 ([0042]); la codifica esprime in 16 bit tutti i caratteri definiti dallo standard Unicode, quindi è possibile scegliere Java.&lt;br /&gt;
&lt;br /&gt;
Per il ''layer'' della persistenza, infine, l'impiego di un database MySql risulta una buona scelta. Si osserva che questo livello non verrà utilizzato nella tradizionale maniera prevista dallo ''stack LAMP''. Infatti, generalmente, la base di dati viene interrogata direttamente dal componente che si occupa dell'interazione con l'utente (PHP) per il reperimento delle informazioni utili da restituire al client; nel servizio, invece, la base di dati sarà a supporto unicamente del programma Java, poiché gli unici dati persistenti da gestire sono i nomi del dizionario (si ricordi sempre il ''PbD'') e solo i moduli dell'eseguibile Java devono utilizzarli. Se il dizionario contenessero unicamente i nomi (senza informazioni accessorie correlate) e fossero usati in sola lettura, un semplice file di testo poteva essere sufficiente per la rappresentazione. Tuttavia, poiché saranno individuate tecniche di ottimizzazione nell'impiego dei dizionari che richiedono operazioni di scrittura e ordinamento dei dati, risulta opportuno usare un database relazionale.&lt;br /&gt;
&lt;br /&gt;
====Logica di business e dinamiche di interazione====&lt;br /&gt;
&lt;br /&gt;
Vengono presentati in questa sezione gli aspetti principali dei funzionamenti dei moduli del servizio. Per mettere bene a fuoco quali siano le meccaniche di interazione e i flussi di esecuzione dei programmi, si propone il diagramma di sequenza del tipico scenario di utilizzo. In questo schema UML si descrive il caso d'uso dove un utente, dopo aver inserito un documento ed averlo ricevuto &amp;quot;minimizzato&amp;quot;, esprime delle preferenze e richiede poi un secondo trattamento.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F00])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si descrivono quindi ora le principali operazioni che vengono eseguite.&lt;br /&gt;
All'avvio dell'interazione viene presentata una pagina PHP di benvenuto contenente le informazioni su come i dati personali vengano elaborati ed un ''file-picker'' per consentire l'upload di un documento ''OOXML''; nel momento in cui l'utente confermerà il caricamento del documento, esso verrà trasferito sul server. &lt;br /&gt;
Bisogna prestare particolare attenzione al comportamento del sistema nel caso in cui più utenti richiedano contemporaneamente l'esecuzione del servizio, e cioè alle problematiche di esecuzioni concorrenti di script PHP; è necessario, in particolare, evitare situazioni in cui i nomi dei file inviati dagli utenti siano in conflitto. Analizzando più in dettaglio il problema, ogniqualvolta un web server Apache riceve una richiesta HTTP per una pagina PHP, si ha la generazione di un nuovo processo che esegue il codice presentato nella pagina PHP richiesta. Supponendo quindi che N utenti eseguano l'invio del file contemporaneamente, si avrebbe che sul server N processi diversi dovrebbero procedere con la scrittura di un file. Ovviamente se due o più file condividono il nome almeno uno di essi sarà sovrascritto. Per risolvere questo problema, supponendo di voler salvare tutti i documenti in una cartella temporanea, occorre modificare il filename dei documenti inviati dagli utenti per esser certi di non incorrere in sovrascritture o altri tipi di errori correlati.&lt;br /&gt;
Una valida possibilità è l'inserimento di un ''prefisso'' univoco nel filename. Per la generazione di una stringa univoca da anteporre al filename, che permetta di distinguere file caricati da utenti diversi, si può direttamente usare il ''session id'' dell'utente. In PHP esso è determinato casualmente combinando ([0043]): l'IP del cliente, orario di attribuzione dell'id, un numero pseudo-casuale (con il ''PHP Linear Congruence Generator'') e, se presente un &amp;quot;''random source''&amp;quot; sul sistema operativo del Client (spesso chiamato impropriamente &amp;quot;''seme''&amp;quot;), un ulteriore numero pseudo-casuale.&lt;br /&gt;
Per introdurre ulteriore alea, necessaria se, ad esempio, un utente tenti l'upload di file omonimi (con contenuto interno diverso) e mantenga il medesimo ''session id'', si utilizza un ulteriore generatore pseudo-casuale per produrre un altro numero con cui comporre il prefisso.&lt;br /&gt;
Concatenando i due numeri generati si ha praticamente certezza di aver individuato un numero univoco nel sistema per il tempo in cui il servizio sarà erogato al cliente.&lt;br /&gt;
&lt;br /&gt;
Una volta memorizzato il file, lo script PHP dovrà ricorrere all'invocazione del modulo Java, delegato al vero e proprio processamento del documento. Occorre quindi individuare un set di opzioni che consenta al modulo che gestisce l'interazione con il cliente di sfruttare al meglio il componente delegato all'elaborazione del documento, in qualunque circostanza; la totale indipendenza dei moduli, la loro sostituibilità e la replicazione possibile di macchine server sono solo alcuni dei fattori che rendono mutevole la configurazione del sistema. Va definito un protocollo di comunicazione, quindi, che astragga completamente dall'implementazione dei moduli o dalla locazione dei file.&lt;br /&gt;
&lt;br /&gt;
Valutando i possibili flussi logici, anche con l'ausilio del diagramma di sequenza, si ha che i tipi di esecuzione sono due:&lt;br /&gt;
* &amp;quot;minimizzazione&amp;quot; con dizionario&lt;br /&gt;
* &amp;quot;minimizzazione&amp;quot; di specifici nominativi&lt;br /&gt;
Il protocollo di comunicazione tra i due moduli è costituito in entrambi i casi di una singola richiesta a cui segue una singola risposta. Più in particolare, lo script PHP invoca il comando Java esprimendo obbligatoriamente il path del file da trattare e opzionalmente l'elenco dei nominativi. A suo volta, il modulo Java restituisce i nominativi trovati, qualora non espressamente richiesti dallo script, e segnala la corretta terminazione dell'elaborazione.&lt;br /&gt;
Si definiscono come canali di comunicazione standard del protocollo gli argomenti presi in input dal modulo di processamento del documento e lo standard output del processo che esegue tale programma. Inoltre è importante definire un formato standard per la comunicazione dei nominativi tra moduli; è necessario quindi scegliere un pattern che permetta di determinare univocamente la composizione dei nominativi. Un possibile formato, espresso tramite ''regex'', è il seguente:&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt; &amp;lt;nominativo&amp;gt; = ^(&amp;lt;nome&amp;gt;:)*&amp;lt;nome&amp;gt;;&amp;lt;cognome&amp;gt;$&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt; &amp;lt;nominativi&amp;gt; = ^(&amp;lt;nominativo&amp;gt;\s+)+$&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Dove nome e cognome sono una sequenza di caratteri Unicode come già discusso. Ulteriori opzioni importanti da definire nel protocollo per l'invocazione del programma che si occupa delle funzionalità di elaborazione sono le seguenti:&lt;br /&gt;
* path file da elaborare (opzione &amp;quot;-i &amp;lt;file_path&amp;gt;&amp;quot;, obbligatoria)&lt;br /&gt;
* path con cui salvare il file elaborato (opzione &amp;quot;-o &amp;lt;file_path&amp;gt;&amp;quot;, opzionale: per default viene creato un nuovo file automaticamente)&lt;br /&gt;
* abilitazione stampe verbose, da usare solo in fase di debug (opzione &amp;quot;-d&amp;quot;, opzionale)&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Una volta terminato il processamento, il modulo di gestione dell'interazione con l'utente dovrà accertarsi che l'&amp;lt;i&amp;gt;exit status&amp;lt;/i&amp;gt; sia 0 e leggere dallo standard output del processo appena terminato, qualora si sia stata eseguita la &amp;quot;minimizzazione&amp;quot; con dizionario, l'elenco dei nominativi trovati. Se invece la &amp;quot;minimimizzazione&amp;quot; ha avuto luogo con i nominativi già specificati non sarà scritto nulla sullo standard output.&lt;br /&gt;
A margine si osserva che l'impiego dell'opzione &amp;quot;-d&amp;quot; deve sempre consentire una semplice individuazione dei nominativi trovati; in particolare, se tale opzione è specificata, nello standard output i nominativi compariranno con un ''header'' riconoscibile (&amp;quot;''NOMINATIVO=''&amp;quot;).&lt;br /&gt;
Ritornando alla descrizione del flusso di esecuzione tipo, una volta che il modulo Java ha completato il trattamento del documento, lo script PHP ne effettuerà l'upload sul client e presenterà all'utente le opzioni già descritte nel capitolo sull'usabilità. &lt;br /&gt;
A questo punto l'interazione con client potrebbe concludersi, qualora si eseguisse il download e si chiudesse il browser, o continuare elaborando i ''suggerimenti'' dell'utente espressi dopo il primo trattamento. Le modalità di comunicazione dei moduli varierebbero leggermente come appena illustrato, mentre, a seconda della configurazione stateful o stateless del servizio, verrebbe eseguito o meno un nuovo upload del file dal client al server.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si osserva infine che, per predisporre a successivi studi di ottimizzazione il servizio e per agevolare tutti i possibili sviluppi futuri, si applica largamente nella progettazione del modulo di elaborazione Java il ''Dependency Inversion Principle'', in quanto si desidera realizzare classi estendibili ed intercambiabili.&lt;br /&gt;
In particolare, si introducono delle classi astratte per rappresentare in maniera generica il concetto di &amp;quot;''persona''&amp;quot; e &amp;quot;''minimizzatore''&amp;quot;. È possibile infatti realizzare successivi studi per trattare ulteriori dati personali oltre che ai nomi e cognomi; inoltre, in base ai tipi di documenti trattati o eventuali altri fattori utili, è possibile studiare differenti tecniche di &amp;quot;minimizzazione&amp;quot; realizzate da differenti algoritmi &amp;quot;''minimizzatori''&amp;quot;.&lt;br /&gt;
In particolare una &amp;quot;''persona''&amp;quot; dovrà sempre esporre un metodo &amp;quot;''minimizza''&amp;quot; che prende in input una stringa, la &amp;quot;minimizza&amp;quot; e la restituisce; il pattern con il quale si effettua la &amp;quot;minimizzazione&amp;quot; sarà fornito in implementazione a seconda dei dati sensibili di interesse.&lt;br /&gt;
Un &amp;quot;''minimizzatore''&amp;quot; esporrà sempre un metodo &amp;quot;''work''&amp;quot; che, presa in input una lista di persone ed un documento ''OXML'', con l'ausilio della libreria Docx4j, fornirà in output un documento del tutto &amp;quot;minimizzato&amp;quot;; la definizione delle modalità con cui si estrapolano le informazioni dal documento e con cui si invoca il metodo &amp;quot;''minimizza''&amp;quot; della classe persona sono confinate nell'implementazione.&lt;br /&gt;
Definendo delle classi astratte risulta, quindi, più veloce la realizzazione dei futuri componenti e si svincola il processo di &amp;quot;minimizzazione&amp;quot; dal tipo di dati che si &amp;quot;minimizzano&amp;quot; e viceversa.&lt;br /&gt;
&lt;br /&gt;
====Le classi principali del progetto====&lt;br /&gt;
Le classi principali del progetto vengono quindi presentate in appendice. Esse sono:&lt;br /&gt;
* App.java, contenente il main&lt;br /&gt;
* Elaborator.java, che presenta il metodo &amp;quot;''work''&amp;quot;&lt;br /&gt;
* Persona.java, che presenta il metodo &amp;quot;''minimizza''&amp;quot;&lt;br /&gt;
* Testing.java, contenente alcune funzioni usate in fase di debug.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gli script in PHP sono stati forniti dall'azienda come implementazione minimale e provvisoria, da perfezionare a seguito della eventuale definizione sulle modalità di presentazione del servizio su Internet.&lt;br /&gt;
&lt;br /&gt;
Una considerazione di implementazione comune a tutte le classi deriva del principio ''Privacy by Design'', indifferentemente dalla modalità di configurazione stateful o stateless del servizio: è di fondamentale importanza che nel sistema non siano memorizzati permanentemente in alcun caso i documenti inviati dagli utenti del servizio. &lt;br /&gt;
Per realizzare un sistema robusto, per fronteggiare crash improvvisi del client o congestioni della rete, è opportuno impostare dei timeout lato server che procedano automaticamente alla eliminazione dei documenti degli utenti dopo un periodo di inattività troppo prolungato. Qualora invece si dovesse verificare un interruzione critica del servizio a causa di un errore logico del server o semplicemente per via di un'interruzione dell'alimentazione della macchina server, bisogna considerare altri metodi; essendo il servizio realizzato con un sistema operativo Linux, si può configurare il demone ''crond'' per eseguire a ogni reboot e, per sicurezza, una volta al giorno l'eliminazione dei file usati dall'applicazione tutti contenuti all'interno della cartella temporanea.&lt;br /&gt;
&lt;br /&gt;
==Approfondimenti tecnologici==&lt;br /&gt;
&lt;br /&gt;
===Analisi della struttura del formato OOXML===&lt;br /&gt;
&lt;br /&gt;
Come argomentato, il formato dei documenti elaborati dal servizio progettato dovrà essere ''Office Open XML'', o ''OOXML''; si tratta di un formato ''XML-based'' per documenti di testo, fogli elettronici e presentazioni, in grado di rappresentare grafici, diagrammi, immagini e altro materiale grafico. La specifica fu sviluppata da Microsoft e adottata dall'&amp;lt;i&amp;gt;ECMA International&amp;lt;/i&amp;gt; come standard ''ECMA-376'' nel 2006. Una seconda versione fu rilasciata nel 2008, una terza nel 2011, una quarta nel 2012 ed una quinta tra il 2015 ed il 2016 ([0010]). La specifica è stata adottata, inoltre dall'&amp;lt;i&amp;gt;ISO&amp;lt;/i&amp;gt; e dall'&amp;lt;i&amp;gt;IEC&amp;lt;/i&amp;gt; come standard ''ISO/IEC 29500'' a partire dal 2008 ([0011], [0012]).&lt;br /&gt;
&lt;br /&gt;
====Linguaggi di markup====&lt;br /&gt;
&lt;br /&gt;
Lo standard ''ECMA-376'' ([0010]) include tre differenti specifiche di linguaggio per ognuna delle tre principali categorie di documenti:&lt;br /&gt;
* ''WordprocessingML'' per i documenti testuali&lt;br /&gt;
* ''SpreadsheetML'' per i fogli elettronici&lt;br /&gt;
* ''PresentationML'' per le presentazioni elettroniche&lt;br /&gt;
* ''DrawingML'' ed altri linguaggi di markup di supporto per la rappresentazione di disegni, forme e diagrammi.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
La specifica include sia gli schemi ''XML'' sia i vincoli espressi per iscritto. Ogni documento conforme al formato dovrà, quindi, rispettare gli schemi ''XML'' e dovrà essere codificato in ''UTF-8'' o ''UTF-16''. La specifica, inoltre, permette l'aggiunta di ''custom tag XML'' a supporto dei linguaggi di markup dati, per default nel formato ''OOXML'', consentendo quindi la libera personalizzazione dei documenti.&lt;br /&gt;
&lt;br /&gt;
====File packaging====&lt;br /&gt;
&lt;br /&gt;
Oltre alla specifiche relative ai linguaggi di markup, la seconda parte dell'&amp;lt;i&amp;gt;ECMA-376&amp;lt;/i&amp;gt; ([0010]) definisce la struttura gerarchica dei file del formato adottando le ''Open Packaging Conventions'' (''OPC''). ''OPC'', una tecnologia ''file-container'' basata sul comune formato compresso ''zip'', che stabilisce che tutti i file che riguardano una stessa entità devono essere raggruppati in un unico package ([0014]). Un documento ''OOXML'' è, infatti, un archivio ''zip'' contenente alcuni files ''XML'' (detti anche ''parti'') organizzati in un singolo package. Questa frammentazione dei dati in più files rende più semplice e veloce l'accesso ai dati stessi e riduce le possibilità di una loro corruzione. Le ''parti'' possono contenere qualsiasi tipo di dato; per tenere traccia della relazione tra una ''parte'' e la sua tipologia di contenuto, senza basarsi sull'estensione del file, è presente nel package, nella cartella radice della gerarchia, il file denominato ''[Content_Types].xml'', il quale mappa appunto queste associazioni. È mostrata qui ad esempio l'associazione tra la ''parte'' rappresentante il documento principale e il suo ''ContentType''.&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Override PartName=&amp;quot;/word/document.xml&amp;quot; ContentType=&amp;quot;application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Le informazioni relative alle relazioni che ogni ''parte'' ha con le altre ''parti'', con risorse esterne e con il package in sé sono mantenute separatamente dal contenuto della ''parte'' stessa. Tali informazioni sono presenti, infatti, all'interno delle cartelle denominate ''_rels'': ne esiste una per il package nel suo complesso e una per ogni sotto-cartella del package contenente delle ''parti'' coinvolte in delle relazioni. In questo modo i riferimenti che una ''parte'' ha verso altre ''parti'' o risorse sono salvati una sola volta e possono essere aggiornati con semplicità se necessario, senza dover modificare il contenuto stesso delle ''parti'' coinvolte. È mostrato qui un esempio di relazione contenuta in ''_rels/.rels'' relativa al documento principale e al suo schema.&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Relationship Id=&amp;quot;rId1&amp;quot; Type=&amp;quot;http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument&amp;quot; Target=&amp;quot;word/document.xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Il documento principale, ossia il file ''word/document.xml'', ha inoltre numerose relazioni con altre ''parti'', come ad esempio ''word/styles.xml'' e ''word/footer.xml'', e risorse esterne collegate con degli URI. Per descrivere queste relazioni si usa la cartella ''word/_rels''.&lt;br /&gt;
&lt;br /&gt;
====Parti di un Documento OOXML====&lt;br /&gt;
&lt;br /&gt;
Vengono qui presentate le ''parti'' che sono caratteristiche esclusive di un ''WordprocessingML package'', non presenti quindi negli altri due formati ''OOXML''. È importante osservare che alcune di esse sono facoltative e sono presenti nel package solo se necessario.&lt;br /&gt;
&lt;br /&gt;
Le ''parti'' relative al vero e proprio contenuto testuale sono:&lt;br /&gt;
* ''Main Document'', contiene le informazioni principali ed è salvata come ''word/document.xml''&lt;br /&gt;
* ''Header'', contiene i dati relativi alle intestazioni ed è salvata in ''word/header.xml''. Ogni sezione del documento può avere intestazioni diverse per la prima pagina, per le pagine pari e per le dispari, quindi possono esserci molteplici ''parti header''&lt;br /&gt;
* ''Footer'', contiene le informazione relative al piè pagina ed è salvata in ''word/footer.xml''. Può essere presente più volte, per motivi analoghi alla ''parte header''&lt;br /&gt;
* ''Footnotes'', contiene le eventuali note a piè pagina del documento ed è salvata come ''word/footnotes.xml''&lt;br /&gt;
* ''Endnotes'', contiene le note di chiusura del documento ed è salvata in ''word/endnotes.xml''.&lt;br /&gt;
&lt;br /&gt;
Sono presenti poi delle ''parti'' relative allo stile e alle impostazioni del documento:&lt;br /&gt;
* ''Style Definitions'', contiene la definizione di un insieme di stili usati dal documento, salvata in ''word/styles.xml''&lt;br /&gt;
* ''Font Table'', contiene informazioni riguardo i font usati, salvata in ''word/fontTable.xml''&lt;br /&gt;
* ''Numbering Definitions'', contiene le definizioni sulla struttura delle liste contenute nel documento, salvata in ''word/numbering.xml''&lt;br /&gt;
* ''Document Settings'', specifica come il word processor debba trattare il documento (spell checking, gestione delle revisioni, etc.), contenuta in ''word/settings.xml''&lt;br /&gt;
* ''Web Settings'', contiene informazioni su come il documento debba essere convertito in ''HTML'' se richiesto, contenuta in ''word/webSettings.xml''.&lt;br /&gt;
&lt;br /&gt;
Sono presenti anche delle ''parti'' che rappresentano testo secondario:&lt;br /&gt;
* ''Comments'', contiene i commenti sul documento inseriti attraverso un word processor&lt;br /&gt;
* ''Glossary'', contiene dati testuali aggiuntivi secondari, ne è permessa una sola. Tutte le ''parti'' prima elencate, tranne il ''Main Document'', possono comparire una seconda volta in relazione alla ''parte glossary''.&lt;br /&gt;
&lt;br /&gt;
====Analisi del Main Document====&lt;br /&gt;
&lt;br /&gt;
Il file ''document.xml'', elemento principale di un documento ''WordprocessingML'', è costituito da due tipi di informazioni:&lt;br /&gt;
* ''properties'', che definiscono lo stile e la formattazione del testo&lt;br /&gt;
* ''stories'', che rappresentano il contenuto testuale delle varie parti del documento.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le ''properties'' verranno trattate in misura minore. Queste informazioni sono espresse attraverso una struttura XML gerarchica che ha come elemento radice il nodo ''document''. Esso ha due nodi figli:&lt;br /&gt;
* ''background'', che contiene alcune ''properties'' che descrivono lo sfondo del documento&lt;br /&gt;
* ''body'', che contiene tutti i rimanenti contenuti ed è potenzialmente molto complesso.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si osserva che per le finalità del trattamento dei dati risultano di primario interesse le ''stories'' e che è opportuno effettuare un'analisi ''bottom-up'' del problema: anziché considerare la gerarchia a partire dal ''body'' (nodo padre) partiremo dalla rappresentazione più semplice del testo contenuta nel documento (nodi figli).&lt;br /&gt;
&lt;br /&gt;
Facendo direttamente riferimento allo standard ''ECMA-376'' ([0010]),  si evince che l'unico nodo che contiene puro testo ha il nome ''t'' (''Text''). Questo elemento contiene una stringa rappresentante gli esatti caratteri che vengono poi mostrati negli editor a video. Il nodo ''Text'' non presenta figli e l'unico nodo padre che può avere è ''r'' (''Run''). Quest'altro nodo definisce una regione di testo con comuni proprietà (ad esempio l'uso del grassetto). Attraverso l'uso di tag ''t'' ed ''r'' quindi si rappresenta una regione di testo formattata con differenti elementi stilistici.&lt;br /&gt;
Occorre però evidenziare che un nodo ''r'' può presentare molti altri figli oltre a ''t'', come ad esempio immagini, in quanto rappresenta un'area generica del documento.&lt;br /&gt;
Si supponga quindi di avere due nodi ''Text'' fratelli, ossia figli dello stesso nodo ''r'': essi rappresenteranno semanticamente un unico blocco logico se e solo se compariranno a video come una sequenza di parole continua. Questo fenomeno è facilmente identificabile anche nel file ''XML'' descrittivo: due sequenze di parole mostrate a video adiacenti compaiono infatti nel file ''XML'' in due righe consecutive; se invece due parti di testo dovessero essere intervallate ad es. da un'immagine nel documento ''XML'' ci sarebbe un tag ''drawing'' a dividere i due tag ''t''. Dalla consecutività dei nodi ''Text'' nel file ''document.xml'' si può determinare quali siano i blocchi logici da trattare.&lt;br /&gt;
Un insieme di ''Run'' infine può essere figlio di diversi nodi, ma ciò non è di rilevante importanza, in quanto ogni area di testo individuata dal nodo ''Run'' rappresenta già un blocco logico a sé e, di conseguenza, contiene sufficienti informazioni per la &amp;quot;minimizzazione&amp;quot;.&lt;br /&gt;
L'unico caso di rilievo nel quale bisogna valutare quale sia la gerarchia a monte di un nodo ''Run'' è nell'elaborazione di una tabella. In tal caso, in realtà, occorre verificare opportunamente la strutturazione della gerarchia processata. Per chiarezza espositiva viene mostrata la rappresentazione in formato ''OOXML'' di una tabella con una riga e due colonne (senza l'uso di ''properties'' per la formattazione stilistica).&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;w:tbl&amp;gt;&lt;br /&gt;
  &amp;lt;w:tr&amp;gt;&lt;br /&gt;
    &amp;lt;w:tc&amp;gt;&lt;br /&gt;
      &amp;lt;w:p&amp;gt;&lt;br /&gt;
        &amp;lt;w:r&amp;gt;&lt;br /&gt;
          &amp;lt;w:t&amp;gt;Cella A&amp;lt;/w:t&amp;gt;&lt;br /&gt;
        &amp;lt;/w:r&amp;gt;&lt;br /&gt;
      &amp;lt;/w:p&amp;gt;&lt;br /&gt;
    &amp;lt;/w:tc&amp;gt;&lt;br /&gt;
    &amp;lt;w:tc&amp;gt;&lt;br /&gt;
      &amp;lt;w:p&amp;gt;&lt;br /&gt;
        &amp;lt;w:r&amp;gt;&lt;br /&gt;
          &amp;lt;w:t&amp;gt;Cella B&amp;lt;/w:t&amp;gt;&lt;br /&gt;
        &amp;lt;/w:r&amp;gt;&lt;br /&gt;
      &amp;lt;/w:p&amp;gt;&lt;br /&gt;
    &amp;lt;/w:tc&amp;gt;&lt;br /&gt;
  &amp;lt;/w:tr&amp;gt;&lt;br /&gt;
&amp;lt;/w:tbl&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Come si osserva in figura, in una tabella il nodo ''r'' sarà figlio del nodo ''p'' (''Paragraph''), il quale a sua volta sarà contenuto in un noto ''tc'' (''Table Cell''). Celle di una tabella appartenenti ad una stessa riga saranno presenti all'interno dello stesso ''tr'' (''Table Row'') ed infine tutte le righe della tabella saranno inserite del tag ''tbl'' (''Table'').&lt;br /&gt;
&lt;br /&gt;
Per determinare quindi se due nodi ''Text'' sono scritti in due colonne adiacenti di una stessa riga (e quindi costituiscono un unico blocco logico) è necessario verificare che per i due nodi ''Text'':&lt;br /&gt;
# il nodo &amp;quot;padre&amp;quot;  '''non sia''' in comune&lt;br /&gt;
# il nodo &amp;quot;padre di 2° livello&amp;quot; sia ''Paragraph'' e '''non sia''' in comune&lt;br /&gt;
# il nodo &amp;quot;padre di 3° livello&amp;quot; sia ''Table Cell'' e '''non sia''' in comune&lt;br /&gt;
# il nodo &amp;quot;padre di 4° livello&amp;quot; sia ''Table Row'' e '''sia''' in comune&lt;br /&gt;
# i nodi &amp;quot;padre di 3° livello&amp;quot; '''siano''' consecutivi.&lt;br /&gt;
Se tutte queste ipotesi sono soddisfatte, le due celle vanno &amp;quot;minimizzate&amp;quot; come unico blocco logico.&lt;br /&gt;
&lt;br /&gt;
Si valutano infine gli ultimi vincoli emersi nell'analisi sull'interpretazione della formattazione di un documento.&lt;br /&gt;
In particolare, descrivendo le parti che compongo un documento ''OOXML'', era già emerso che alcune sezioni di testo, ossia note a piè pagina ed intestazioni, compaiono in altri file ''XML'' e non in ''document.xml''. Questi file (''header.xml'', ''footer.xml'', ''endnotes.xml'', etc.) sono tutti raccolti in un package (&amp;quot;''word''&amp;quot;) e la grammatica ''XML'' è la stessa usata per il Main Document.&lt;br /&gt;
Si conclude osservando che il problema della divisione in sillabe delle parole non si pone, in quanto la divisione sillabica mostrata a video dai word-processors è calcolata dinamicamente; in particolare, su una porzione di testo viene applicata la sillabazione (ove necessario) se è presente tra le ''properties'' di quella regione di documento il tag ''hyphenationZone''.&lt;br /&gt;
&lt;br /&gt;
====La libreria in ambiente java open source Docx4j====&lt;br /&gt;
&lt;br /&gt;
La libreria Docx4j offre completo supporto alla manipolazione di documenti ''docx'' (compressione e decompressione archivio zip, generazione file ''XML'' necessari, etc.). Offre inoltre un'utile mappatura in specifici oggetti Java della gerarchia ''XML'' presente nei vari file del formato.&lt;br /&gt;
Uno tra gli elementi più interessanti è la tecnica con cui vengono recuperati i nodi dai file ''XML'', in quanto si fa impiego del linguaggio standard W3C ''XPath'' ([0044], [0045]). Con ''XPath'' è possibile esprimere con una stringa un sottoinsieme di nodi presenti in una gerarchia ''XML'' non solo in base al loro nome o valore, ma anche in relazione alla posizione reciproca rispetto agli altri nodi. Riferendoci alle problematiche del servizio risulta, ad esempio, significativamente agevolato il trattamento di dati personali in forma tabellare.&lt;br /&gt;
Si osserva infine che la libreria attribuisce un id univoco ad ogni nodo del documento, di conseguenza se ne può trarre vantaggio nei confronti tra i nodi.&lt;br /&gt;
&lt;br /&gt;
===Ottimizzazioni del processo di minimizzazione===&lt;br /&gt;
&lt;br /&gt;
Durante l'analisi dei requisiti è emerso che l'efficienza costituisce un aspetto problematico del servizio. Si ricorda di aver stimato la durata di una prestazione media di circa 145 secondi, considerando dati: &lt;br /&gt;
* un documento di medie dimensioni (10 pagine ~ 5000 parole) &lt;br /&gt;
* tempo medio di 10 ms per individuare le occorrenze di un nome&lt;br /&gt;
* un dizionario di circa 14.500 parole&lt;br /&gt;
&lt;br /&gt;
In linea di massima si individuano due generi di strategie che consentirebbero la riduzione del tempo medio di esecuzione: uno mirato a ridurre il più possibile il testo da sottoporre a &amp;quot;minimizzazione&amp;quot; automatica, l'altro a ottimizzare l'impiego del dizionario e dell'algoritmo di ricerca.&lt;br /&gt;
&lt;br /&gt;
====Riduzione del testo da trattare====&lt;br /&gt;
&lt;br /&gt;
Come già spiegato, l'approccio di ricerca ''pattern-based'' è poco sensibile all'aumentare della lunghezza del documento, ma da questo valore ha una dipendenza non trascurabile.&lt;br /&gt;
&lt;br /&gt;
Nel documento è altamente probabile che ci siano interi periodi, se non pagine, dove non sia presente alcun nominativo. Anche all'interno di una frase che necessita di ''minimizzazione'' è plausibile che siano sono poche le coppie (al più le terne) di parole riconducibili ad una sequenza nome-cognome. È inessenziale che sezioni di testo che non necessitano di &amp;quot;minimizzazione&amp;quot; vengano processate. Si osserva per inciso che, ovviamente, questo ragionamento è corretto per via dell'indipendenza dal contesto di un approccio ''pattern-based''.&lt;br /&gt;
&lt;br /&gt;
Il pattern definito per la ricerca di un nominativo è molto restrittivo, in quanto accetta solo sequenze di parole costituenti un nominativo contenente un nome specifico; d'altronde la progettazione del pattern è stata effettuata mirando ad identificare il più accuratamente possibile le sequenze da anonimizzare.&lt;br /&gt;
&lt;br /&gt;
Analizzando attentamente il problema, si può fare il seguente ragionamento: per ridurre il più possibile il numero di parole da processare a ogni iterazione di ricerca del pattern di un nome, è possibile individuare preliminarmente tutte le sequenze di parole del documento che ''potrebbero essere'' dei nominativi e ''potrebbero'' fare match.&lt;br /&gt;
&lt;br /&gt;
L'operazione di pre-filtraggio si applica processando il documento con un ''pattern'' che presenta un'espressione più generale e permissiva delle ''regex'' definite per i nomi del dizionario. Si osserva che una qualunque successione di caratteri ''alfabetici'' iniziante con un carattere maiuscolo ''potrebbe'' rappresentare un nome. Per realizzare un espressione adatta si parte dalla definizione della ''regular expression'' già data ai nomi del dizionario:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;regex&amp;gt; := (&amp;lt;second_name&amp;gt;\s)?(&amp;lt;nome&amp;gt;)\s&amp;lt;cognome&amp;gt;|&amp;lt;cognome&amp;gt;\s(&amp;lt;nome&amp;gt;)(\s&amp;lt;second_name&amp;gt;)?&lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Nell'uso fatto finora di questa espressione, al tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nome&amp;gt;&amp;lt;/span&amp;gt; viene attributo, ciclo dopo ciclo, una parola del dizionario diversa. È possibile definire una variante più generale dell'espressione appena presentata:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;nome_pre&amp;gt; := [A-Z][a-zA-ZÀ-ÖØ-öø-ÿ&amp;lt;extra&amp;gt;]+&lt;br /&gt;
&lt;br /&gt;
&amp;lt;regex_pre&amp;gt; := (&amp;lt;second_name&amp;gt;\s)?(&amp;lt;nome_pre&amp;gt;)\s&amp;lt;cognome&amp;gt;|&amp;lt;cognome&amp;gt;\s(&amp;lt;nome_pre&amp;gt;)(\s&amp;lt;second_name&amp;gt;)?&lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Con questa ''regex'' si identifica una qualunque sequenza che rappresenta un nominativo, ma allo stesso tempo anche, ad esempio, tutte le parole consecutive inizianti con una maiuscola. È importante sottolineare che questo pattern presenta tutte le caratteristiche già ampiamente discusse sul formato delle ''regex'' per riconoscimenti automatici (gestione dei delimitatori, posizione relativa tra i nomi ed il cognome, etc.).&lt;br /&gt;
Il processamento di una ''regex'' generale inoltre sarà inevitabilmente più lento di quello di ''regex'' aventi i nomi specificati, in quanto molte più sequenze faranno match essendo l'espressione più permissiva. La mancanza di accuratezza va rapportata all'impiego della ''regular expression'': fornendo essa un semplice pre-filtraggio del documento non risulta necessario nè che individui esclusivamente nominativi nè che sia in grado di distinguerli gli uni dagli altri. Il leggero ritardo introdotto viene valutato sperimentalmente, applicando lo stesso l'algoritmo già usato in precedenza ed elaborando gli stessi documenti, sempre a parità di piattaforma.&lt;br /&gt;
&lt;br /&gt;
Partendo dall'elaborazione di un documento contenente 10 nominativi ed in totale 5.000 parole, si misura che tempo il processamento medio della ''regex'' di pre-filtraggio è di circa 36 ms; si ricorda che per lo stesso documento il tempo di esecuzione medio per il processamento di un nominativo non presente è di circa 9 ms, se le occorrenze salgono a 10, il tempo è in media di circa 10 ms.&lt;br /&gt;
Sebbene l'elaborazione di questa ''regex'' sia circa 4 volte più lenta dell'elaborazione di ''regex'' più specifiche, un ritardo introdotto dell'ordine dei millisecondi è trascurabile rispetto al tempo di processamento complessivo (stimato di circa 145 second).&lt;br /&gt;
Si osserva, per inciso, che nell'elaborazione di questo particolare documento sono stati individuati altre 21 sequenze che rispettavano il pattern che non costituivano dei nominativi. &lt;br /&gt;
&lt;br /&gt;
Terminata l'esecuzione dell'operazione di pre-filtraggio, occorre sfruttare opportunamente le informazioni ottenute: in particolare, si possono elaborare con le ''regex'' dei nomi le sole sotto-stringhe che hanno fatto match con la ''regular expression'' nell'operazione preliminare. In altri termini, con questo metodo si effettua una sola elaborazione del testo completo e molteplici processamenti delle sotto-stringhe che ''potrebbero'' contenere nominativi. &lt;br /&gt;
Si osserva inoltre che, conoscendo con certezza gli indici di inizio e fine delle sotto-stringhe che ''potenzialmente'' contengono nominativi, è possibile &amp;quot;alleggerire&amp;quot; la ''regex'' associata ai nomi del dizionario: si possono rimuovere i costrutti ''lookahead'' e ''lookbehind'' in quanto la sotto-stringa è stata già rimossa dal contesto e quindi rappresenta esclusivamente i caratteri individuati dalla ''regular expression'' di pre-filtraggio.&lt;br /&gt;
&lt;br /&gt;
A questo punto occorre valutare sperimentalmente l'ottimizzazione ottenuta. Si misura che sono sufficienti 2 ms di elaborazione in media per nome, mentre, nel caso raro in cui tutti i 10 nominativi presenti si riconducano ad un unico nome, il tempo medio di esecuzione tende verso i 3 ms. Si osserva che questo è possibile perché le parole nelle sotto-stringhe sono poco meno di 50, ossia si è ridotta di oltre il 99% la dimensione complessiva di dati da processare!&lt;br /&gt;
Valutando l'ottimizzazione complessiva in termini di tempo si ha che, processando un dizionario di circa 14.500 termini, sono necessari in media 29 secondi.&lt;br /&gt;
&lt;br /&gt;
Ovviamente questo dato è fortemente dipendente dal contenuto del documento. Vanno effettuate opportune misurazioni nel caso in cui la percentuale di nominativi presenti rispetto alle parole complessive nel documento sia maggiore. Si considera un documento di 5.000 parole contenente 200 sequenze riconosciute dall'algoritmo di pre-filtraggio delle quali 100 costituiscono dei nominativi. &lt;br /&gt;
Si misura che il tempo di esecuzione medio è di 6 ms nel caso generale del processamento di un nome con poche occorrenze e tenderà verso i 10 ms nel caso sporadico in cui le occorrenze del nome saranno proprio 100 o poco meno. Il tempo di esecuzione del pre-filtraggio è di circa 48 ms. &lt;br /&gt;
Per inciso, si osserva che la ragione per cui il tempo necessario al pre-filtraggio non aumenta esageratamente è dovuta al pattern della ''regex''. La ''regular expression'' impiegata infatti, facendo principalmente uso di caratteri espressi in un range unitamente al quantificatore &amp;quot;+&amp;quot;, risulta particolarmente efficiente da elaborare.&lt;br /&gt;
Nel caso di documenti più &amp;quot;ricchi&amp;quot; di nomi si stima l'elaborazione media complessiva di circa 1 minuto e 27 secondi.&lt;br /&gt;
&lt;br /&gt;
Facendo il punto della situazione, si è ridotto di circa 5 volte il tempo di esecuzione complessivo nel caso di documenti &amp;quot;scarsamente popolati&amp;quot; da nominativi e quasi dimezzato il tempo necessario nell'elaborazione di documenti contenenti molte coppie nome-cognome. Occorre proseguire nello studio per migliorare l'ottimizzazione, considerando dove l'algoritmo di ricerca e l'impiego del dizionario possono essere migliorati.&lt;br /&gt;
&lt;br /&gt;
====Ordinamento del dizionario====&lt;br /&gt;
&lt;br /&gt;
Viene posta una semplice domanda sulle modalità di ricerca dei nominativi nell'insieme delle sotto-stringhe del documento: è computazionalmente equivalente prendere una ad una le sotto-stringhe e confrontarle con le ''regex'' dei nomi rispetto che prendere una ad una le ''regex'' dei nomi e confrontarle con le sotto-stringhe?&lt;br /&gt;
&lt;br /&gt;
Si fornisce una spiegazione formale alla domanda. &lt;br /&gt;
&lt;br /&gt;
Si definiscono due insiemi:&lt;br /&gt;
* A = {a_1, a_2, ... a_n}&lt;br /&gt;
* B = {b_1, b_2, ... b_m}&lt;br /&gt;
&lt;br /&gt;
Gli elementi dell'insieme A rappresentano le sotto-stringhe (cardinalità N), mentre gli elementi dell'insieme di B indicano le ''regex'' dei nomi (cardinalità M). È importante considerare che per il secondo insieme è definita una relazione di unicità che lega il valore degli elementi: per ogni ''b_i'' appartenente a B non esiste un indice ''j'', ''j'' compreso tra 1 ed M, tale che il testo del nodo ''i'' sia uguale al testo del nodo ''j'' (tranne se ''i'' = ''j''); in altre parole gli elementi rappresentanti le ''regex'' (''b_i'') per definizione sono posti univoci in B. &lt;br /&gt;
&lt;br /&gt;
Si presti attenzione al fatto che l'insieme delle sotto-stringhe presenta N elementi distinti tra loro in identità (&amp;quot;id nodo&amp;quot;), ma il cui contenuto testuale può essere equivalente a quello di altre sotto-stringhe. L'equivalenza tra due sotto-stringhe sussiste, in questo particolare contesto, qualora i contenuti testuali di entrambe facciano match con una stessa ''regex'' presente nell'insieme B. L'insieme delle ''regex'', invece, presentano elementi i cui valori testuali sono sempre univoci, in quanto ottenuti da nomi sempre diversi.&lt;br /&gt;
&lt;br /&gt;
Definiti gli insiemi si procede alla formulazione della risposta alla domanda precedente. Per chiarezza espositiva indicheremo con &amp;quot;A-&amp;gt;B&amp;quot; la procedura con cui si opera il confronto prendendo una ad una le sotto-stringhe per poi confrontarle con le ''regex'', mentre indicheremo con &amp;quot;B-&amp;gt;A&amp;quot; la procedura con cui si opera il confronto prendendo una ad una le ''regex'' dei nomi per poi confrontarle con le sotto-stringhe.&lt;br /&gt;
&lt;br /&gt;
Nel caso in cui l'insieme delle sotto-stringhe non contenga alcun nominativo, si ha una complessità computazionale equivalente per &amp;quot;A-&amp;gt;B&amp;quot; e per &amp;quot;B-&amp;gt;A&amp;quot;. Viene mostrato nei calcoli in figura che il numero di confronti necessari ''C_1'' è dato dal prodotto delle cardinalità degli insiemi, ossia ''C_1 = N · M''. &lt;br /&gt;
&lt;br /&gt;
(QUI FIG[0F07])&lt;br /&gt;
&lt;br /&gt;
Si suppone ora che il testo della sotto-stringa di posizione ''r'' faccia match con la ''regex'' in posizione ''k''; si applica &amp;quot;A-&amp;gt;B&amp;quot;. Come si mostra attraverso i calcoli in figura, il numero totale di confronti ''C_2'' sarà inferiore a ''C_1'' poiché, quando la sotto-stringa in posizione ''r'' risulta equivalente alla ''regex'' in posizione ''k'' si può direttamente passare alla valutazione della stringa in posizione ''r + 1'' e non svolgere i rimanenti ''m - k&amp;quot; confronti per la stringa in posizione ''r''. Si calcola che ''C_2 = k + m · (n -1)''.&lt;br /&gt;
&lt;br /&gt;
(QUI FIG[0F08])&lt;br /&gt;
&lt;br /&gt;
Supponendo sempre che il testo della sotto-stringa di posizione ''r'' faccia match con la ''regex'' in posizione ''k'', si applica &amp;quot;B-&amp;gt;A&amp;quot;. Similmente al caso precedente, quando la sotto-stringa in posizione ''r'' risulta equivalente alla ''regex'' in posizione ''k'' si può direttamente passare alla valutazione della ''regex'' in posizione ''k + 1'' e non svolgere i rimanenti ''n - r&amp;quot; confronti per la ''regex'' in posizione ''k''. Si osserva inoltre che è inutile confrontare le rimanenti ''m - k'' ''regex'' con la sotto-stringa di posizione ''r'': essa è risultata già equivalente ad una ''regex'' e, essendo le ''regex'' poste per definizione diverse tra loro, è di conseguenza impossibile che soddisfi un'altra uguaglianza.&lt;br /&gt;
Per inciso si osserva che nel calcolo di ''C_2'' un ragionamento di questo genere non è applicabile: ogni sotto-stringa può potenzialmente fare match con una qualsiasi ''regex''. &lt;br /&gt;
Il numero totale di confronti ''C_3'' viene calcolato come mostrato, si ottiene ''C_3 = k + m · (n -1) - n + r''.&lt;br /&gt;
&lt;br /&gt;
(QUI FIG[0F09])&lt;br /&gt;
&lt;br /&gt;
Si osserva che ''C_3 = C_2 - n + r'' e, essendo ''r'' la posizione della sotto-stringa coinvolta nel match, si ha che ''C_3'' è sempre minore di ''C_2'' qualunque sia la posizione della sotto-stringa. L'unico caso in cui ''C_3 = C_2'' si verifica quando la ''r = n'', ossia se la sotto-stringa è l'ultima dell'insieme.&lt;br /&gt;
&lt;br /&gt;
Per estendere il ragionamento, si prende la ''regex'' di posizione ''k'' e si indica con ''T'' il numero di sotto-stringhe che sono già risultate equivalenti ad una ''regex'' nelle elaborazioni precedenti. Risulta che, per il ragionamento spiegato nel calcolo di ''C_3'', potranno essere risparmiati almeno ''N - T'' confronti per la ''regex'' ''k'' e per ogni ''regex'' in posizioni successive. In generale, maggiore è il numero di nominativi nel documento, maggiore sarebbe l'ottimizzazione della procedura. &lt;br /&gt;
&lt;br /&gt;
Le conclusioni che si traggono sono due:&lt;br /&gt;
* indipendentemente dal numero o dalla posizione dei nominativi nelle sotto-stringhe, nell'algoritmo di minimizzazione è più efficiente prendere una ad una le ''regex'' dei nomi e con ognuna trattare l'insieme delle sotto-stringhe&lt;br /&gt;
* un efficace ordine di elaborazione delle ''regex'' può introdurre ottimizzazioni&lt;br /&gt;
&lt;br /&gt;
Va eseguita ora una valutazione sperimentale dei tempi di esecuzione del processo di &amp;quot;minimizzazione&amp;quot; tenendo conto di questi elementi. Le ''regex'' che fanno match con i nominativi presenti nel testo, quindi, vengono trattate tra le prime. Risulta di interesse principalmente valutare i miglioramenti ottenibili nel caso di documenti ''molto popolati'' da nominativi, poiché è questo il caso in cui l'ottimizzazione entra in gioco.&lt;br /&gt;
Si esegue il test sullo stesso documento trattato precedentemente con la sola tecnica di pre-filtraggio. Esso è composto da 5.000 parole, dal pre-filtraggio sono individuate 200 sotto-stringhe delle quali 100 costituiscono dei nominativi. &lt;br /&gt;
Nel test si è fatto riferimento a dati Istat ([0046]) per stabilire, quanto più realisticamente possibile, il miglior ordine di elaborazione delle ''regex'' associate ai nomi; risulta che circa il 25% dei nominativi è individuato entro i primi 15 cicli di esecuzione; circa il 35% entro i primi 50 ed il 100% entro circa i primi 3000. Per inciso, si osserva che un altro documento può dare origine a tempi significativamente peggiori qualora presenti molti nominativi con nomi desueti e presenti in fondo al dizionario. &lt;br /&gt;
Si misura che, dopo il &amp;quot;transitorio iniziale&amp;quot; (ossia dalla 51° ''regex'' in poi), il tempo medio è di 5 ms per l'elaborazione di una ''regex''. Si osserva che, una volta che sono state elaborate circa le prime 3000 ''regex'', il tempo medio di elaborazione di una ''regex'' scende a 4 ms. Per completezza, si riporta anche il tempo medio per la fase di &amp;quot;transitorio iniziale&amp;quot;, che si misura di circa 8 ms; il tempo di pre-filtraggio, già precedentemente calcolato, risulta di 48 ms.&lt;br /&gt;
Calcolando complessivamente la durata del processamento si ottiene che l'elaborazione media complessiva è di circa 61 secondi, si ottiene quindi una riduzione significativa rispetto al tempo di 1 minuto e 27 prima individuato.&lt;br /&gt;
&lt;br /&gt;
Si considerano, in relazione alle conclusioni della discussione teorica prima formalizzata, le implicazioni realizzative: in primis che l'imposizione del verso con cui eseguire la &amp;quot;minimizzazione&amp;quot; non determina particolari problemi implementativi, in secundis che l'ordinamento efficiente dei nomi del dizionario può essere trattato attraverso una tecnica di ''machine learning''.&lt;br /&gt;
&lt;br /&gt;
La tecnica di apprendimento che si realizza si basa sull'estrapolazione di informazioni utili nei documenti inviati dagli utenti. Si tiene traccia, infatti, della ''frequenza'' con cui un nome appare in diversi processamenti. Alla fine di ogni &amp;quot;minimizzazione&amp;quot;, dopo aver concluso il salvataggio del nuovo file ''OOXML'', il programma Java eseguirà l'update sul database MySql delle frequenze dei nomi trovate, incrementandole.&lt;br /&gt;
Nell'interrogazione al database per l'ottenimento dell'insieme dei nomi, di conseguenza, si richiederà l'ordinamento per frequenza delle tuple restituite. In questo modo, più volte un nome compare nei documenti, più incrementi riceverà il suo campo frequenza, più avrà la probabilità di comparire in cima al dizionario.&lt;br /&gt;
Si progetta inoltre l'inserimento di un campo &amp;quot;ultimo utilizzo&amp;quot;, associato ai nomi sul database, che permette di avere un secondo criterio di ordinamento utile. Tale campo viene impiegato anche per evitare una crescita esagerata del valore della frequenza; periodicamente, con ''crond'' ad esempio, si decrementano i valori del campo &amp;quot;frequenza&amp;quot; dei nomi il cui &amp;quot;ultimo utilizzo&amp;quot; è troppo vecchio. Si osserva che i valori di configurazione per la gestione di queste elementi dipendono dal carico medio del sistema, noto solo dopo la progettazione, andranno valutati con precisione in fasi future. Ovviamente l'aggiornamento del campo &amp;quot;ultimo utilizzo&amp;quot; sarà contestuale all'aggiornamento della ''frequenza''. &lt;br /&gt;
Si osserva, per inciso, che l'impiego di un dizionario di cognomi sarebbe stato problematico per l'aggiornamento delle frequenze. Per via del principio ''Privacy by Design'', infatti, aggiornando la frequenza per la entry del cognome di una persona, indirettamente si sarebbe tenuto traccia di un dato sensibile, specialmente nel caso in cui il cognome risulti &amp;quot;raro&amp;quot;. &lt;br /&gt;
Una valutazione rilevante da fare è sulle implicazioni relative agli accessi concorrenti al dizionario, dovute all'introduzione dell'algoritmo appena spiegato, che esegue scrittura di &amp;quot;frequenza&amp;quot; e ''ultimo utilizzo'' sul database. Si osserva che non sono problematiche le &amp;quot;letture sporche&amp;quot;, poiché, se si verificano, al più risulta alterato l'ordine di qualche nome; inoltre nemmeno un &amp;quot;lost update&amp;quot; risulta eccessivamente problematico, poiché l'ultimo utilizzo risulta sempre aggiornato e la perdita di un incremento delle frequenza di un nome non rappresenta in linea di massima un problema. Questi scenari presentati vanno valutati complessivamente, però, una volta che si realizza il reale carico del sistema: perdere molti update risulta critico per l'ottimizzazione del processamento. Conviene in linea precauzionale prevedere una semantica transazionale per l'interazione tra modulo Java e database. Per inciso, eseguire l'update finale con una transazione non influenza il tempo di attesa dell'utente, poiché il documento è stato già elaborato per intero. &lt;br /&gt;
&lt;br /&gt;
Si fa infine un'ultima osservazione che consente di abbattere i tempi di attesa enormemente, a costo di perdere dell'accuratezza nel processamento automatico: ridurre il numero di nomi del dizionario processato, elaborando solo quelli in cima. &lt;br /&gt;
Si osserva che questa soluzione è ancor più efficace se i nomi contenuti nel documento sono pochi. In questo caso, infatti, il processamento dei nomi durante la fase di &amp;quot;transitorio iniziale&amp;quot; richiede lo stesso tempo del processamento di nomi &amp;quot;a regime&amp;quot;, ossia dopo l'avvenuta riduzione del numero di sotto-stringhe da elaborare. Nei documenti &amp;quot;ricchi&amp;quot; di nominativi, come già spiegato, ciò non avviene.&lt;br /&gt;
Per concludere, si usano i risultati dei test sperimentali precedentemente misurati per stimare il tempo di processamento complessivo, supponendo di:&lt;br /&gt;
* applicare la tecnica di pre-filtraggio&lt;br /&gt;
* usare i primi 1.500 nomi di un dizionario ordinato per frequenza&lt;br /&gt;
&lt;br /&gt;
Caso A:&lt;br /&gt;
* documento contenente 10 nominativi ed un totale di 5.000 parole&lt;br /&gt;
* processamento medio della ''regex'' di pre-filtraggio di circa 36 ms&lt;br /&gt;
* individuazione di 31 sotto-stringhe totali&lt;br /&gt;
* durata elaborazione in media per nome di circa 2 ms&lt;br /&gt;
&lt;br /&gt;
Durata esecuzione senza troncamento: 29 secondi circa&lt;br /&gt;
&lt;br /&gt;
Durata esecuzione con troncamento: 3 secondi circa&lt;br /&gt;
&lt;br /&gt;
Caso B:&lt;br /&gt;
* documento contenente 100 nominativi ed un totale di 5.000 parole&lt;br /&gt;
* processamento medio della ''regex'' di pre-filtraggio di circa 48 ms&lt;br /&gt;
* individuazione di 200 sotto-stringhe totali&lt;br /&gt;
* durata elaborazione in media per nome di circa 8 ms per prime 50 iterazioni&lt;br /&gt;
* durata elaborazione in media per nome di circa 5 ms per successive&lt;br /&gt;
&lt;br /&gt;
Durata esecuzione con solo pre-filtraggio: 1 minuto e 27 secondi&lt;br /&gt;
&lt;br /&gt;
Durata esecuzione senza troncamento: 61 secondi circa&lt;br /&gt;
&lt;br /&gt;
Durata esecuzione con troncamento: 7.7 secondi circa&lt;br /&gt;
&lt;br /&gt;
I tempi a cui si giunge risultano soddisfacenti in entrambi i casi. Si prevede di lasciare all'utente la possibilità di scegliere di ricevere un servizio o più veloce o più accurato, in base alle sue esigenze.&lt;br /&gt;
&lt;br /&gt;
===Tecnologie complementari===&lt;br /&gt;
&lt;br /&gt;
La redazione di questa tesi è avvenuta su Mediawiki, la più importante fra le piattaforme wiki essendo il motore di Wikipedia.&lt;br /&gt;
&lt;br /&gt;
Le piattaforme wiki sono riconosciute come elemento caratterizzante dell’evoluzione Internet al Web 2.0, cioè al web nel quale gli utenti-navigatori, fino ad allora &amp;quot;''consumatori&amp;quot;'' (&amp;quot;''consumers&amp;quot;'') di contenuti si sono trasformati essi stessi in &amp;quot;''produttori&amp;quot;'' (&amp;quot;''producers&amp;quot;''), e cioè in &amp;quot;''prosumers&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
Un ''wiki'' è fondamentalmente un sito web che contiene informazioni e che consente agli utenti di editare facilmente il suo contenuto.&lt;br /&gt;
&lt;br /&gt;
Nel redigere una pagina wiki si utilizza ciò che è chiamato ''wikitext&amp;quot; per definire capitoli, paragrafi, hyperlinks, elementi di formattazione della pagina, etc.; sebbene il ''wikitext&amp;quot; risulti non difficile da apprendere, quasi ogni piattaforma wiki è corredata da editor di tipo visuale, che non richiede alcuna conoscenza della sintassi del ''wikitext&amp;quot;; tuttavia è esperienza comune che utilizzare direttamente il ''wikitext&amp;quot; induce a concentrarsi maggiormente sui contenuti e non sulla formattazione. Il linguaggio ''wikitext'' è strettamente correlato con il linguaggio HTML, infatti nella scrittura è possibile utilizzare tag come h1, span, div e così via, oltre che la sintassi esclusiva di ''wikitext''; simmetricamente una pagina prodotta da media wiki è costituita da HTML ben formato e direttamente importabile in ogni word processor. &lt;br /&gt;
&lt;br /&gt;
I wiki presentano una funzionalità di grande utilità nella redazione di documenti articolati: la tracciatura delle successive revisioni (&amp;quot;''Cronologia&amp;quot;''). La possibilità di ripercorrere l’evoluzione del testo è davvero d’aiuto quando si fissano idee originali in uno scritto, cercando di definirle, precisarle, chiarirle, come è avvenuto in effetti, anche nella redazione di questa tesi. Per curiosità, si segnala che, pur avendo redatto la maggior parte del testo off-line, la pagina wiki di questa tesi conta oltre 50 revisioni.&lt;br /&gt;
&lt;br /&gt;
Per inciso, si osserva che è stata molto utile la funzionalità di &amp;quot;ricerca nel codice&amp;quot; offerta dalla piattaforma di revisione online GitHub nella corretta comprensione della libreria Docx4j, il cui codice sorgente è ivi rilasciato. &lt;br /&gt;
&lt;br /&gt;
Si conclude infine dicendo che per ottimizzare le procedure di debug del codice sono stati realizzati utili tool a riga di comando per Linux per la rapida estrazione-modifica-ricompattazione di documenti ''OOXML''. Si propone in appendice un comando bash per questi scopi.&lt;br /&gt;
&lt;br /&gt;
==Sviluppi futuri==&lt;br /&gt;
&lt;br /&gt;
In questa sezione si fa cenno, senza poterle approfondire, ad alcune interessanti questioni emerse nello svolgimento della tesi.&lt;br /&gt;
&lt;br /&gt;
===Accesso al servizio web===&lt;br /&gt;
&lt;br /&gt;
In fase iniziale, il servizio web potrà essere reso accessibile in forma completamente aperta, senza richiedere cioè la registrazione dell’utente o l’autenticazione dell’utente già registrato. In questo modo, in effetti, si premia la facilità d’uso, ma si incorre nella nota problematica di un uso malevolo, costituito da accessi a raffica, finalizzati a saturare il server e generare una condizione di ''DoS – Denial of Service''. Diverse sono le tecniche che possono essere adottate per contrastare questo tipo di accessi malevoli, come richiedere di superare &amp;quot;''captcha''&amp;quot; e/o introdurre ritardi crescenti ed eventualmente blocchi in risposta ad accessi prevenienti con alta frequenza dallo stesso indirizzo IP.&lt;br /&gt;
È possibile anche pensare ad un accesso previa registrazione ed autenticazione dell’utente, penalizzando l’immediatezza di utilizzo del servizio, ma eventualmente ottenendo l’indirizzo email degli utenti che acconsentono a lasciarlo per successive finalità marketing.&lt;br /&gt;
È possibile, infine, un utilizzo misto, contando in un cookie il numero di accessi eseguiti e richiedendo all’utente di registrarsi per continuare ad utilizzare il servizio, dopo qualche accesso.&lt;br /&gt;
&lt;br /&gt;
===Ampliamento dinamico del dizionario===&lt;br /&gt;
&lt;br /&gt;
Nel restituire il documento elaborato all'utente, gli si da la possibilità di richiedere una nuova elaborazione, dopo aver indicato i nominativi che fossero sfuggiti; pare inesauribile, infatti, la &amp;quot;fantasia&amp;quot; dei genitori nel dare nome ai propri figlioli!&lt;br /&gt;
I nominativi indicati dall'utente sono sfuggiti al servizio perché non presenti nel dizionario: facilmente viene in mente l’idea di arricchire il dizionario con i nominativi indicati dall’utente. Va però considerato il caso che l’utente in malafede indichi nominativi fasulli al fine di inquinare il dizionario.&lt;br /&gt;
Il caso malevolo può essere affrontato attraverso una strategia che preveda non direttamente l'inserimento del nuovo nominativo nel dizionario, ma invece l'utilizzo di un concetto di &amp;quot;candidatura&amp;quot;: il nuovo nominativo viene registrato, ma si attende di avere un certo numero di utenti che lo propongono prima di approvarne l'inserimento nel dizionario.&lt;br /&gt;
Può anche essere utilizzato un concetto di &amp;quot;attendibilità&amp;quot; della candidatura di un nuovo nominativo, verificando ad esempio l'utente che lo propone scarichi effettivamente il file rielaborato.&lt;br /&gt;
Nel caso l'accesso avvenga con autenticazione, e cioè identificando gli utenti, si apre la possibilità di individuare e bannare gli utenti malevoli.&lt;br /&gt;
&lt;br /&gt;
===Natura del documento e ricorrenza del nominativo===&lt;br /&gt;
&lt;br /&gt;
Si coglie facilmente la differenza di formato fra un documento in forma di elenco (es. una graduatoria) da un documento in forma di relazione (es. una sentenza giudiziaria). Differenze di questo tipo potrebbero essere utilizzate per escludere o ammettere la ripetizione dei nominativi.&lt;br /&gt;
Per meglio dire: in un elenco la ripetizione di un nominativo è di fatto da escludersi o va trattata come omonimia. In una relazione, l’individuazione di un nominativo può essere utilizzata per ricercarlo direttamente in altri punti del documento stesso.&lt;br /&gt;
&lt;br /&gt;
===Altri dati personali===&lt;br /&gt;
&lt;br /&gt;
Altri dati personali sono trattabili con le stesse tecniche analizzate in questa tesi: date e luoghi di nascita, codici fiscali, indirizzi, email, numeri di telefono, sesso etc. In qualche caso, come per i codici fiscali, l’individuazione del pattern da trattare è persino più semplice.&lt;br /&gt;
Diversi studi ([0039]) hanno dimostrato che, utilizzando set di dati personali parziali, è possibile la re-identificazione dei soggetti, pur in documenti pseudonimizzati. È questo un altro motivo per estendere i trattamenti descritti anche agli altri dati personali richiamati.&lt;br /&gt;
&lt;br /&gt;
===Altri alfabeti===&lt;br /&gt;
&lt;br /&gt;
È possibile estendere il sotto-insieme di caratteri Unicode utilizzati nelle ''regex'' per elaborare documenti scritti in altri alfabeti non latini.&lt;br /&gt;
&lt;br /&gt;
==Conclusioni==&lt;br /&gt;
&lt;br /&gt;
Questa tesi è partita da un problema basilare, quasi scolastico, dell'informatica: la ricerca di un testo in un documento, al fine della sua cancellazione o modifica.&lt;br /&gt;
&lt;br /&gt;
Il problema si è subito discostato dalla sua formulazione basilare, principalmente perché, nei casi d'uso, il documento da ricercare non è un semplice testo (&amp;quot;''plain text''&amp;quot;) ma invece è il prodotto di un ''word-processor'': quindi è costituito da una struttura XML più o meno complessa, rappresentante formattazioni, riferimenti interni o esterni, note, etc. La ricerca deve avvenire nei soli nodi di puro testo, individuando ed escludendo dall'analisi lessicale gli elementi testuali di mark-up che non costituiscono contenuto informativo. Nell'approfondire le strutture ed i concetti XML ho potuto notare quanto essi siano ricorrenti in molti ambiti dell'informatica.&lt;br /&gt;
&lt;br /&gt;
Nell'analisi delle specifiche, un'altra complicazione si è presto aggiunta: l'usabilità del servizio cresce drasticamente se si evita di chiedere all'utente, come si era pensato in un primo tempo di fare, quali siano le stringhe (i nominativi) da ricercare e trattare; è nata allora l'idea di reperire queste stringhe in un dizionario di nomi ed in un dizionario di cognomi, considerando anche le permutazioni dei lemmi reperiti. Ho così dovuto approfondire alcuni problemi tipici dei dizionari, come il loro ampliamento automatico con tecniche oggi comprese nel ''machine-learning''. Non ho potuto &amp;quot;resistere&amp;quot; alla tentazione di ''formalizzare la matematica'' in base alla quale ho costruito le strategie di ricerca.&lt;br /&gt;
&lt;br /&gt;
Spunto per la tesi è stata la recente legislazione in materia di dati personali, il GDPR. Esaminandone gli articoli pertinenti, ho maturato una riflessione generale: sempre più il software dovrà essere progettato e realizzato anche alla luce di altre discipline, non solo di quelle informatiche, come le discipline giuridiche ed il diritto.&lt;br /&gt;
&lt;br /&gt;
Durante la fase iniziale della collaborazione con l'azienda mi sono dedicato alla messa a punto delle specifiche; ciò mi ha permesso di comprendere quanto questa fase sia importante e come completezza e precisione delle specifiche siano alla base di un progetto efficace.&lt;br /&gt;
&lt;br /&gt;
Molto importanti sono state la analisi relative al tipo e formato dei documenti da assumere come input ed alla presentazione ottimale del servizio rispetto all'usabilità. &lt;br /&gt;
&lt;br /&gt;
Centrale nel lavoro ed avvincente è stata la definizione della strategia per il riconoscimento dei lessemi attraverso la costruzione dinamica di ''regex'' idonee. In questo fase del lavoro, anche per passione personale, ho approfondito le questioni del riconoscimento &amp;quot;di testi nei testi&amp;quot; che legano, fin dalle origini, l'informatica e la linguistica.&lt;br /&gt;
&lt;br /&gt;
La fase di definizione dell'architettura del servizio mi ha permesso di ripercorrere molte le materie studiate nei tre anni del Corso di Ingegneria Informatica, affrontando argomenti  come il Single Responsibility Principle, il Dependency Inversion Principle, lo &amp;quot;stile&amp;quot; architetturale REST. Molto istruttiva è stata anche la riflessione sulla scomposizione del servizio in moduli software.&lt;br /&gt;
&lt;br /&gt;
Come sempre accade nell'affrontare un progetto nuovo, sono nate molte nuove idee; ho così immaginato numerosi sviluppi futuri, sia a perfezionamento funzionale dell'accesso web al servizio, sia ad estensione delle specifiche per coprire casi applicativi contigui (es. quando il dato che si vuole trattare è un codice fiscale). Dovendo necessariamente tener presente che questo lavoro è una tesi, verificherò con il supporto del mio relatore come poterne proseguire lo sviluppo.&lt;br /&gt;
&lt;br /&gt;
==Bibliografia==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0000]https://en.wikipedia.org/wiki/Comparison_of_Office_Open_XML_software&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0001]https://en.wikipedia.org/wiki/Comparison_of_OpenDocument_software&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0002]https://en.wikipedia.org/wiki/Standardization_of_Office_Open_XML&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0003]https://en.wikipedia.org/wiki/OpenDocument_standardization&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0004]https://support.apple.com/en-us/HT202227&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0005]https://en.wikipedia.org/wiki/Pages_(word_processor)&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0006]https://en.wikipedia.org/wiki/Comparison_of_word_processors&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0007]https://en.wikipedia.org/wiki/OpenDocument&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0008]https://en.wikipedia.org/wiki/Office_Open_XML_file_formats&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0009]https://en.wikipedia.org/wiki/Rich_Text_Format&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0010]https://www.ecma-international.org/publications/standards/Ecma-376.htm&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0011]https://www.iso.org/standard/51463.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0012]https://www.iso.org/standard/71691.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0013]https://en.wikipedia.org/wiki/Office_Open_XML&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0014]https://en.wikipedia.org/wiki/Open_Packaging_Conventions&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0015]https://en.wikipedia.org/wiki/LAMP_(software_bundle)&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0016]https://w3techs.com/blog/entry/debian_ubuntu_extend_the_dominance_in_the_linux_web_server_market_at_the_expense_of_red_hat_centos&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0017]https://news.netcraft.com/archives/2014/06/06/june-2014-web-server-survey.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0018]https://whatis.techtarget.com/definition/LAMP-Linux-Apache-MySQL-PHP&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0019]https://www.ibm.com/cloud/learn/lamp-stack-explained&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0020]https://en.wikipedia.org/wiki/Single_responsibility_principle&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0021]https://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0022]https://en.wikipedia.org/wiki/Latin_script_in_Unicode&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0023]https://it.wikipedia.org/wiki/ISO/IEC_8859-1&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0024]http://www.treccani.it/enciclopedia/uso-delle-maiuscole_%28La-grammatica-italiana%29/&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0025]https://en.wikipedia.org/wiki/Ambiguity#Linguistic_forms&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0026]Steven L. Small; Garrison W Cottrell; Michael K Tanenhaus (22 October 2013). Lexical Ambiguity Resolution: Perspective from Psycholinguistics, Neuropsychology and Artificial Intelligence. Elsevier Science. ISBN 978-0-08-051013-2.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0027]http://www.treccani.it/vocabolario/disambiguazione/&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0028]R. Navigli, K. Litkowski, O. Hargraves. 2007. SemEval-2007 Task 07: Coarse-Grained English All-Words Task. Proc. of Semeval-2007 Workshop (SemEval), in the 45th Annual Meeting of the Association for Computational Linguistics (ACL 2007), Prague, Czech Republic, pp. 30–35 http://www.aclweb.org/anthology/S/S07/S07-1006.pdf&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0029]https://wordnet.princeton.edu/&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0030]R. Navigli, S. P. Ponzetto. BabelNet: Building a Very Large Multilingual Semantic Network. Proc. of the 48th Annual Meeting of the Association for Computational Linguistics (ACL 2010), Uppsala, Sweden, July 11-16, 2010, pp. 216-225. http://aclweb.org/anthology/P/P10/P10-1023.pdf&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0031]Roventini A., Alonge A., Calzolari N., Magnini B., Bertagna F. (2000), &amp;quot;ItalWordNet: a Large Semantic Database for Italian&amp;quot;, Proc. of the 2nd International Conference on Language Resources and Evaluation (LREC 2000), Athens, Greece, 2000, pp. 783-790.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0032]E. Pianta, L. Bentivogli, C. Girardi. MultiWordNet: developing an aligned multilingual database, Proc. of the First International Conference on Global WordNet, Mysore, India, January 21-25, 2002. http://multiwordnet.fbk.eu/paper/MWN-India-published.pdf&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0033]https://www.iso.org/standard/28245.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0034]https://www.gpdp.it/web/guest/regolamentoue&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0035]https://eur-lex.europa.eu/legal-content/IT/TXT/?uri=uriserv:OJ.L_.2016.119.01.0001.01.ITA&amp;amp;toc=OJ:L:2016:119:TOC&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0036]https://www.corriere.it/Primo_Piano/Cronache/2006/09_Settembre/15/cognomi.shtml&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0037]https://data.world/axtscz/italian-first-names&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0038]https://en.wikipedia.org/wiki/Dependency_inversion_principle&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0039]https://imperialcollegelondon.app.box.com/s/lqqcugie51pllz26uixjvx0uio8qxgo5/file/493461282808&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0040https://www.docx4java.org/trac/docx4j]&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0041]https://github.com/plutext/docx4j&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0042]https://docs.oracle.com/javase/9/docs/api/java/lang/String.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0043]https://github.com/php/php-src/blob/master/ext/session/session.c&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0044]https://github.com/plutext/docx4j/search?q=getJAXBNodesViaXPath+in%3Afile&amp;amp;type=Code&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0045]https://www.w3.org/TR/xpath-30/&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0046]https://www.istat.it/it/dati-analisi-e-prodotti/contenuti-interattivi/contanomi&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0047]&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0048]&lt;br /&gt;
&lt;br /&gt;
==Indice delle figure==&lt;br /&gt;
&lt;br /&gt;
[0F00]https://en.wikipedia.org/wiki/Latin_script&lt;br /&gt;
&amp;lt;!-- [[File:Latin alphabet world distribution.svg|thumb|upright=1.6|In verde scuro le nazioni dove è usato solo l'alfabeto latino; in verde chiaro quelle dove all'alfabeto latino è affiancato un altro alfabeto.]] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[0F01]Diagramma di Venn 1&lt;br /&gt;
&lt;br /&gt;
[0F02]Diagramma di Venn 2&lt;br /&gt;
&lt;br /&gt;
[0F03]Diagramma di Venn 3&lt;br /&gt;
&lt;br /&gt;
[0F04]Esito unit test regex (cartella immagini)&lt;br /&gt;
&lt;br /&gt;
[0F05]Inforgrafica GDPR&lt;br /&gt;
&lt;br /&gt;
[0F06]Diagramma di sequenza UML&lt;br /&gt;
&lt;br /&gt;
[0F07]Primo calcolo valutazione algoritmo&lt;br /&gt;
&lt;br /&gt;
[0F08]Secondo calcolo valutazione algoritmo&lt;br /&gt;
&lt;br /&gt;
[0F09]Terzo calcolo valutazione algoritmo&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Servizio_web_per_il_trattamento_dei_dati_personali_contenuti_in_documenti_OOXML_complessi&amp;diff=170</id>
		<title>Servizio web per il trattamento dei dati personali contenuti in documenti OOXML complessi</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Servizio_web_per_il_trattamento_dei_dati_personali_contenuti_in_documenti_OOXML_complessi&amp;diff=170"/>
		<updated>2019-09-30T04:00:52Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: /* Ottimizzazioni del processo di minimizzazione */ - nomi sotto pragraf.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduzione==&lt;br /&gt;
&lt;br /&gt;
Il recente Regolamento Generale europeo sulla Protezione dei Dati (UE) 2016/679 ([0034], [0035]) o ''GDPR'' (''General Data Protection Regulation'', come nel seguito sarà chiamato) ha modernizzato significativamente la normativa in materia di protezione dei dati personali, rendendola omogenea fra tutti gli stati membri. È bene notare che, fin dal titolo, il ''GDPR'' non riduce gli spazi per i trattamenti di dati personali, ma anzi ne protegge la &amp;quot;libera circolazione&amp;quot;, dettando, però, regole definite e certe. Rinunciando ad una presentazione più completa del ''GDPR'', saranno riportati nei successivi capitoli i concetti necessari alla discussione dell'argomento.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Enti ed organizzazioni, aventi a che fare con documenti contenenti dati sensibili, devono operare in maniera conforme al ''GDPR''; potrebbero, di conseguenza, trarre beneficio da servizi specifici in grado di supportarli in queste esigenze.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
L'oggetto principale della tesi sarà dunque, come riportato dal titolo, la progettazione e la realizzazione di un servizio per la gestione di dati personali.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F05])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La larga maggioranza dei documenti testuali viene generata con strumenti cosiddetti di &amp;quot;produttività individuale&amp;quot;, cioè da ''word-processors''. L'osservazione, ovvia nella sua evidenza, consente di introdurre una riflessione: quando un documento è generato da un'elaborazione automatica, magari per composizione di ''template'' con dati estratti da un database, l'individuazione dei &amp;quot;dati personali&amp;quot; nel documento prodotto può avvenire in modo rigoroso e senza incertezze, sulla base degli elementi di composizione del documento; ad es.: i campi del documento estratti da una anagrafica di soggetti sono certamente dati personali e come tali possono essere opportunamente trattati nel processo di elaborazione automatica (ad es. cancellati).&lt;br /&gt;
&lt;br /&gt;
Ma, in quella larga maggioranza di documenti testuali generata con ''word-processors'' l'individuazione ed il trattamento dei dati personali vanno affrontati con altri approcci, discussi in questa tesi.&lt;br /&gt;
&lt;br /&gt;
==Scenario di lavoro==&lt;br /&gt;
&lt;br /&gt;
===Minimizzazione dei dati personali===&lt;br /&gt;
&lt;br /&gt;
Un concetto espresso in modo pervasivo dal ''GDPR'' è quello della &amp;quot;''minimizzazione''&amp;quot; dei dati personali trattati ed a maggior ragione dei dati personali pubblicati. In particolare l'Art. 5 ed il Considerando 39 prescrivono che i dati personali trattati siano &amp;quot;''adeguati, pertinenti e limitati a quanto necessario rispetto alle finalità per le quali sono trattati («minimizzazione dei dati»)''&amp;quot; ([0035]).&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Con questo fine, il GDPR delinea due possibilità organizzative e tecniche di &amp;quot;''minimizzazione''&amp;quot;: l'anonimizzazione e la psedonimizzazione.&lt;br /&gt;
&lt;br /&gt;
====Anonimizzazione====&lt;br /&gt;
&lt;br /&gt;
Sono anonimizzati i dati personali non (più) riferibili alle persone a cui sono appartenuti; si tratta di serie di dati, spesso ingenti, che sono stati definitivamente ed irreversibilmente separati da ogni riferimento alle persone che caratterizzavano. Sono le serie di dati utilizzate per fini statistici, scientifici, etc. E' importante notare che, come fissato dal Considerando 26 del ''GDPR'', il Regolamento non si applica al &amp;quot;''trattamento di tali informazioni anonime''&amp;quot; ([0035]). Per questo, sottoporre database e documenti ad un procedimento, cioè un trattamento, di anonimizzazione consente di non doversi più preoccupare del ''GDPR''.&lt;br /&gt;
&lt;br /&gt;
====Pseudonimizzazione====&lt;br /&gt;
&lt;br /&gt;
Fra le definizioni dell'Art. 4 del ''GDPR'', la &amp;quot;pseudonimizzazione&amp;quot; viene indicata come &amp;quot;''il trattamento tale che i dati personali non possano più essere attribuiti a un interessato specifico senza l’utilizzo di informazioni aggiuntive, a condizione che tali informazioni aggiuntive siano conservate separatamente''&amp;quot; ([0035]).&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Traducendo in termini &amp;quot;operativi&amp;quot;, si tratta del procedimento che, dal &amp;quot;record&amp;quot; dei dati di un interessato, separa i campi che caratterizzano l'interessato stesso da quelli che lo identificano, trasferendo questi ultimi in una nuova distinta tabella; nelle due tabelle vengono aggiunti i riferimenti che permettono la ricostruzione del record originario; il procedimento è completo quando la nuova tabella con gli identificativi viene archiviata separatamente ed eventualmente cifrata. In margine si annota che in molti casi, come molti studi dimostrano, è possibile identificare, quindi &amp;quot;riconoscere&amp;quot;, gli interessati utilizzando la sola tabella con i dati pseudonimizzati.&lt;br /&gt;
&lt;br /&gt;
====Altri trattamenti di &amp;quot;minimizzazione&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Un problema pratico che si incontra di frequente è quello di dover pubblicare documenti più o meno ampi che contengono dati personali. Spesso la pubblicazione è obbligatoria per legge: si pensi alle graduatorie relative a concorsi pubblici, alle sentenze dei tribunali, etc.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In questi frequenti casi, analizzando meglio le finalità per le quali sono pubblicati quei dati personali, si osserva che sono possibili e legittimi almeno due approcci per &amp;quot;minimizzare&amp;quot; il dato nel &amp;quot;trattamento di pubblicazione&amp;quot; e, dunque, per minimizzarne la propagazione, ad esempio attraverso motori di ricerca, ben oltre ogni ragionevole finalità. I contesti ed i corrispondenti approcci sono:&lt;br /&gt;
#  Situazioni in cui è necessario che l'interessato possa riconoscersi nel documento ed essere riconosciuto dagli altri soggetti menzionati nel contesto, ma non è plausibile la necessità di identificazione dell'interessato al di fuori di quel contesto specifico. A questo caso si riconducono le graduatorie di concorsi, gli elenchi per la formazione di classi, gli elenchi per convocazioni, etc. In tutti questi casi, nel processo di redazione del documento è più pratico trattare internamente i dati personali in forma completa; ma praticamente mai è necessario pubblicarli per intero, esponendo al pubblico accesso codici fiscali, indirizzi, recapiti telefonici etc. Per di più, nella maggior parte delle volte, è sufficiente pubblicare il solo cognome perché l'interessato conosca la sua posizione in graduatoria; ciò è spesso sufficiente anche a trasmettere l'informazione necessaria ai colleghi dell'interessato nella medesima graduatoria, o nella medesima classe, etc. Notare che, pubblicando il solo cognome, viene di fatto oscurato anche il sesso. Dunque, in questi casi è auspicabile cancellare una larga parte dei dati personali presenti nel documento.&lt;br /&gt;
# Situazioni in cui il documento deve essere pubblicato affinché siano rese note le motivazioni che lo hanno originato, senza che sia necessaria la precisa identificazione dei soggetti che vi compaiono. Questo è il caso della pubblicazione di sentenze giudiziarie di ogni grado. Le sentenze vengono notificate direttamente agli &amp;quot;aventi causa&amp;quot;; ma anche, come la legge prescrive, pubblicate al fine di costituire giurisprudenza. In questo secondo caso, risulta del tutto eccedente la pubblicazione dei reali nominativi degli interessati, che troverebbero verosimilmente la propria vicenda inutilmente indicizzata dai motori di ricerca negli anni a venire. Nella pubblicazione delle sentenze appare un approccio ottimale quello di sostituire con pseudonimi o con iniziali alterate i veri nominativi degli interessati presenti: il senso e le argomentazioni della sentenza restano pienamente comprensibili, come è necessario; il dato personale, del tutto superfluo ai fini della giurisprudenza, viene protetto.&lt;br /&gt;
In questi casi appare opportuno sostituire i dati identificativi dell'interessato, ed in particolare il nome e cognome, con pseudonimi o, ancora, con iniziali alterate, cioè non coincidenti con le iniziali reali. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Proprio questi tipi di trattamenti di &amp;quot;minimizzazione&amp;quot; sono l'oggetto di questa tesi.&lt;br /&gt;
&lt;br /&gt;
===Punti di partenza per la progettazione del servizio===&lt;br /&gt;
&lt;br /&gt;
La tesi è stata svolta in collaborazione con l'azienda AFA Systems (www.afasystems.it/gdpr) con la quale si sono discusse le problematiche di progettazione e realizzazione di un servizio generalizzato di minimizzazione dei dati personali presenti in un documento.&lt;br /&gt;
Con l'intenzione di fornire il servizio ad un bacino d'utenza il più vasto e variegato possibile, si è pensato ad un'applicazione ''web-based'', indipendente così dai singoli devices sui quali poi sarà utilizzata.&lt;br /&gt;
L'attenzione è stata concentrata sul trattamento dei nomi e dei cognomi (che da qui chiameremo nominativi), poiché sono quelli sempre presenti nei documenti (ad es. gli indirizzi sono presenti solo a volte), rappresentano gli elementi tramite i quali è immediato il riconoscimento della persone, non hanno formato predefinito (come ad es. i codici fiscali); altri dati personali (indirizzi, codici fiscali, etc.), potranno essere considerati in successive evoluzioni del progetto.&lt;br /&gt;
È utile notare che la parte iniziale della collaborazione con l'azienda è stata dedicata alla discussione delle specifiche, la cui più precisa definizione è parte rilevante di questa tesi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Tra i requisiti che necessitano di un opportuno studio troviamo ad esempio:&lt;br /&gt;
* L'individuazione di metodi efficaci per il riconoscimento dei nominativi nei documenti&lt;br /&gt;
* L'identificazione delle migliori procedure di interazione con l'utente&lt;br /&gt;
* La scelta dei formati da trattare&lt;br /&gt;
* I vincoli non funzionali legati al rispetto del ''GDPR''.&lt;br /&gt;
&lt;br /&gt;
==Definizione delle specifiche==&lt;br /&gt;
&lt;br /&gt;
===Riconoscimento dei nominativi===&lt;br /&gt;
&lt;br /&gt;
====Scelta della strategia di riconoscimento====&lt;br /&gt;
 &lt;br /&gt;
Le difficoltà principali con cui ci si imbatte nel processo di riconoscimento dei nominativi riguardano la complessità strutturale dei documenti di testo, ma soprattutto l'intrinseca ambiguità del linguaggio naturale. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Le variabili ed impredicibili strutture e formattazioni dei documenti introducono alcuni problemi significativi. Rendendo fortemente eterogeneo il contenuto dei documenti, infatti, esse non consentono di ricondurre il problema del riconoscimento dei nominativi ad uno o a pochi singoli casi, ma comportano lo studio di tutte le strutture e formattazioni possibili, rendendo quindi l'analisi molto generale. L'altra rilevante difficoltà presente sta nella complessità di effettuare il riconoscimento di una stringa testuale immersa in un insieme di elementi non tutti testuali. Ogni elemento di formattazione, che sia una tabella o una barra orizzontale, introduce infatti un proprio significato logico e semantico nel documento di cui bisogna tenere conto.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Il linguaggio naturale introduce anch'esso complessità: si pensi alle molteplici tipologie di proposizioni con cui possono essere articolati i periodi; ma i problemi principali derivano dalle sue ambiguità. Esse vengono classificate in diverse tipologie ([0025]); le principali sono le ambiguità sintattiche e lessicali.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si ha ambiguità sintattica quando la sintassi di una frase può essere interpretata in diversi modi e, di conseguenza, la frase stessa assume significati diversi. Essa è presente, ad esempio, nelle seguenti frasi:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
* &amp;quot;''Rapina in banca con rivoltella da centomila euro''&amp;quot;&lt;br /&gt;
* &amp;quot;''Luigi ha visto un uomo nel parco con il binocolo''&amp;quot;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
L'esasperazione massima della problematica delle ambiguità sintattiche si presenta con l'&amp;lt;i&amp;gt;antinomia&amp;lt;/i&amp;gt;, ossia un particolare tipo di paradosso che indica la compresenza di due affermazioni contraddittorie che possono essere entrambe dimostrate o giustificate.&lt;br /&gt;
L'antinomia di Epimenide o ''Paradosso del mentitore'', nota fin dal VI secolo, è probabilmente uno dei più noti esempi: &amp;quot;''il cretese Epimenide afferma che tutti i cretesi mentono''&amp;quot;. Se la proposizione è vera (i cretesi mentono) allora il suo significato implica che sia falsa (Epimenide mente e quindi i cretesi dicono la verità), ma se è falsa (i cretesi dicono la verità) ciò significa che è vera (Epimenide dice la verità e quindi i cretesi mentono). La proposizione appare contemporaneamente vera e falsa. A partire dagli anni venti del '900, sono state elaborate varie teorie per la risoluzione delle contraddizioni provocate dalle antinomie, soprattutto attraverso l'elaborazione di linguaggi multilivello o attraverso l'elaborazione di logiche polivalenti (quindi non-booleane).&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si ha ambiguità lessicale, invece, quando una parola possiede più di un significato nella lingua a cui appartiene ([0026]), in tal caso la parola è definita ''polisemica''. In italiano, alcuni termini soggetti a questo tipo di ambiguità sono, ad esempio &amp;quot;''acuto''&amp;quot; o &amp;quot;''venti''&amp;quot;. È questo genere di ambiguità che risulta critico per il riconoscimento dei nominativi. La difficoltà determinata dalle ambiguità sintattiche, infatti, riguarda l'individuazione corretta di soggetti, predicati e complementi di un periodo, mentre le ambiguità lessicali ostacolano la comprensione del significato del singolo lessema. Nel processo di riconoscimento è irrilevante determinare la funzione logica che il nominativo svolge nella frase, mentre è necessario essere certi che i termini che compongono il nominativo siano effettivamente dei nomi propri di persona o dei cognomi, non altri vocaboli del lessico comune. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In linguistica, l'intervento con cui si toglie ambiguità a una parola o a una frase prende il nome di &amp;quot;disambiguazione&amp;quot; ([0027]). Il problema della disambiguazione automatica (in inglese ''Word Sense Disambiguation'' o, abbreviato, ''WSD'') riveste particolare importanza nelle ricerche sull'intelligenza artificiale e, in particolare, nell'elaborazione del linguaggio naturale. Si prevedono benefici della disambiguazione, ad esempio, in programmi di traduzione automatica, recupero dell'informazione o estrazione automatica di informazioni. Nell'analisi delle soluzioni esistenti in letteratura per la risoluzione delle ambiguità, ci si sofferma specialmente sulle ricerche incentrate sul trattamento dell'ambiguità lessicale, essendo essa la più rilevante per i nostri interessi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
La ''WSD'' richiede due input necessariamente: un dizionario per specificare i sensi che devono essere disambiguati e un corpus di dati linguistici da disambiguare. Nello scenario più realistico, si trattano testi le cui parole non sono note a priori e risulta molto onerosa la produzione del corpus, essendo infatti necessaria la valutazione di un operatore umano per verificare la correttezza delle disambiguazioni effettuate dagli algoritmi (''supervised learning'').&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Uno tra i principali dizionari semantici-lessicali utilizzati della lingua inglese è ''WordNet'' ([0029]), mentre alcuni dei database equivalenti che trattano l'italiano sono ''BabelNet'' ([0030]), ''ItalWordNet'' ([0031]) e ''MultiWordNet'' ([0032]).&lt;br /&gt;
Un elemento importante da considerare è che le prestazioni di disambiguazione per la lingua inglese, impiegando ''WordNet'', risultano corrette tra l'80% e il 90% delle volte ([0028]), percentuali discrete ma non sufficienti per avere la totale garanzia.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
I fattori che ostacolano la realizzazione di algoritmi di intelligenza artificiale per la disambiguazione sono molteplici:&lt;br /&gt;
# Differenze tra dizionari impiegati: i database prima citati si basano su varie fonti che raggruppano semanticamente in maniera diversa i vocaboli, quindi programmi sviluppati con dizionari diversi generalmente hanno performance differenti.&lt;br /&gt;
# Complessità della codifica di parte del discorso: per poter disambiguare correttamente un termine è importante riuscire a comprendere correttamente il contesto in cui è inserito, operazione non banale.&lt;br /&gt;
# Varianza tra giudici: i supervisori dell'apprendimento degli algoritmi possono avere opinioni diverse, o semplicemente sbagliare, nella valutazione delle disambiguazioni, ciò porta ad algoritmi che hanno comportamenti diversi.&lt;br /&gt;
# Impossibilità di applicare la disciplina della ''pragmatica'', ossia la logica del ''buon senso'': per identificare correttamente il senso di alcune parole, ad esempio nella comprensioni di anafore e catafore, è necessario applicare il buon senso.&lt;br /&gt;
# Dipendenza del senso delle parole dai contesti: ogni scenario richiede la propria divisione del significato delle parole in sensi rilevanti. In un contesto informatico, ad esempio, il termine &amp;quot;''mouse''&amp;quot; deve essere ricondotto al dispositivo di puntamento, non al cognome del celebre personaggio Disney ''Mickey Mouse''; viceversa dovrà invece avvenire in un contesto di letteratura a fumetti.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Laddove la ''WSD'' è una tecnica molto generale e che mira a risolvere un'ambiguità riguardante una qualunque parola, per le finalità del servizio oggetto di questa tesi è sufficiente risolvere le ambiguità dei nomi e dei cognomi. &lt;br /&gt;
Uno dei difetti che il servizio presenterebbe adottando un approccio ''WDS'' è legato alla impredicibile formattazione dei documenti, che aggiunge informazione semantica al testo ma introduce complessità nella individuazione automatica delle parti che formano il contesto; un altro difetto dipende dalla vastità del lessico da elaborare, essendo i documenti da trattare forniti dai più disparati utenti, su qualunque genere di argomento e relativi ai più vari ambiti.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La strategia che sarà adottata per risolvere la problematica del riconoscimento dei nominativi sarà impostata attraverso un modello ''pattern-based'', impiegando le ''regular expressions'' (''regex''). Esse risultano comunemente usate per effettuare operazioni di ricerca o sostituzione in un testo, di conseguenza se si riesce ad individuare un pattern associato ad un nominativo dato, allora sarà possibile processare il documento ricercando le occorrenze del nominativo e &amp;quot;minimizzarlo&amp;quot; opportunamente.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le ''regular expressions'' risultano particolarmente efficaci poiché, se opportunamente progettate, possono identificare un nominativo indipendentemente dal significato linguistico del contesto in cui è calato, basandosi piuttosto sui singoli caratteri che compongono i lessemi analizzati; permettono, di conseguenza, di effettuare una valutazione estremamente minuziosa, riducendo al minimo le possibilità di errori.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Un algoritmo di risoluzione ''pattern-based'' risulta, inoltre, più efficiente nell'esecuzione, in generale, di un algoritmo di intelligenza artificiale; per fornire la risposta il più velocemente possibile ad un utente, fruitore del servizio via web, l'approccio di riconoscimento tramite pattern è il più indicato.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Definizione dei pattern====&lt;br /&gt;
Nella progettazione del servizio si adotta, come detto, un approccio ''pattern-based'' per il riconoscimento dei nominativi. In linea di massima è opportuno che vengano riconosciuti più nominativi possibili e allo stesso tempo che la correttezza dell'identificazione di un nominativo sia garantita, quindi bisogna individuare dei pattern non troppo stringenti ma neppure troppo laschi. Per analizzare come i pattern devono essere strutturati si prende come caso di studio un generico nominativo, ad esempio ''Lorenzo Mario Amorosa''. Nel documento esso può comparire esattamente come appena indicato, ma anche in altre plausibili varianti, in cui l'ordine dei termini viene alterato, si pensi ad esempio ad &amp;quot;Amorosa Lorenzo Mario&amp;quot; o &amp;quot;Mario Lorenzo Amorosa&amp;quot;, o in altre varianti ancora in cui alcuni nomi non compaiono, come in &amp;quot;Lorenzo Amorosa&amp;quot;. Bisogna tuttavia supporre un limite alla variabilità: si osserva infatti che il cognome deve sempre comparire (il solo nome ''Lorenzo'' non è riconducibile a ''Lorenzo Mario Amorosa'') e che esso inoltre deve essere necessariamente anteposto o posposto, ma non interposto, ai nomi (è poco ragionevole ricondurre &amp;quot;Lorenzo Amorosa Mario&amp;quot; a &amp;quot;Lorenzo Mario Amorosa'').&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Questa prima specifica permette di ricondursi a una soluzione generale, sufficiente nella maggior parte dei casi, ma che non risolve alcune criticità. Un nominativo può, in alcuni documenti, comparire manifestandosi unicamente attraverso il cognome (riferendoci all'esempio precedente, ''Lorenzo Mario Amorosa'' apparirebbe nella forma ''Amorosa''). Sorge qui il problema che molti dei cognomi italiani hanno un significato proprio nel linguaggio comune; ad es., nella frase ''una relazione amorosa è bella'' è errato considerare la parola ''amorosa'' come cognome di un nominativo. Per risolvere questo genere di ambiguità si potrebbe pensare che per stabilire che il termine ''Amorosa'' sia un cognome sia sufficiente verificare che esso inizi con una lettera maiuscola, ma ciò può verificarsi anche perché la parola si trova ad inizio di frase. Inoltre, vari cognomi italiani possono iniziare con una lettera minuscola (''de Angelis'', ''d'Onofrio'', etc.), quindi basare l'identificazione di un cognome sul fatto che la sua prima lettera sia in maiuscolo non è in generale un metodo valido. Volendo in maniera prioritaria garantire il corretto funzionamento del servizio, e quindi attuare le procedure di anonimizzazione solo sui nominativi senza applicarle erroneamente ad altri termini, risulta necessario evitare il trattamento dei nominativi che si manifestano con i soli cognomi. Per via del contesto e dei significati che i cognomi possono assumere, infatti, risulta spesso impossibile distinguerli da parole del linguaggio comune. &lt;br /&gt;
&lt;br /&gt;
Ci si concentra, quindi, nello studio di nominativi composti da un cognome seguito o preceduto da uno o più nomi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si rappresenta dunque in formato di ''regular expression'' il pattern attualmente ideato. Per semplicità espositiva, si definisce il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; come l'insieme delle permutazioni di tutti i nomi del nominativo più l'insieme delle permutazioni di tutti i possibili sottoinsiemi di nomi del nominativo. Considerando il nominativo preso precedentemente come caso di studio, ad esempio, si avrebbe:&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt; &amp;lt;nomi&amp;gt; = Lorenzo Mario|Mario Lorenzo|Lorenzo|Mario&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Posto inoltre il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt; ad indicare il cognome contenuto nel nominativo e il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;regex&amp;gt;&amp;lt;/span&amp;gt; ad indicare la ''regular expression'' associata al nominativo, si ottiene:&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt; &amp;lt;regex&amp;gt; := &amp;lt;cognome&amp;gt; (&amp;lt;nomi&amp;gt;)|(&amp;lt;nomi&amp;gt;) &amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Una osservazione sottile ma di fondamentale importanza per la corretta progettazione delle ''regular expressions'' sta nella piena comprensione della semantica dell'operatore di scelta, espresso con il carattere ''pipe'' (&amp;quot;|&amp;quot;). Un qualunque ''engine'' di elaborazione delle ''regex'', infatti, interrompe la valutazione di una stringa non appena può stabilire se tale stringa fa match o meno con il pattern dato, senza quindi necessariamente valutarlo nella sua interezza, come parimenti avviene nelle valutazioni ''a corto circuito'' delle espressioni logiche nei linguaggi di programmazione. Ogni nominativo avrà a sè associato un pattern che lo rappresenta in più possibili sequenze di caratteri; per effettuare una corretta &amp;quot;minimizzazione&amp;quot; dei dati è necessario che le sequenze contenenti tutti i nomi sia poste per prime, mentre quelle contenenti un singolo nome per ultime.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In questa prima formulazione della ''regex'', inoltre, si è posto come separatore unicamente lo spazio bianco, ma alcuni documenti potrebbero contenere dei nominativi i cui termini sono separati da altri caratteri, come ad esempio una virgola nel caso di &amp;quot;Amorosa, Lorenzo Mario&amp;quot;. Per poter quindi identificare un nominativo anche in questi casi, si potrebbe considerare un qualunque carattere di interpunzione come possibile separatore dei termini del nominativo.&lt;br /&gt;
Adottando questa soluzione si ha però come effetto collaterale che risultano critici i casi in cui nel testo sono presenti dei nominativi soggetti ad omonimia. Si consideri una generica frase contenente una sequenza di nominativi, ad esempio ''Amorosa Lorenzo, Mario Giacomo e Fabio Rossi'', e si supponga che i nominativi da trattare siano ''Amorosa Lorenzo Mario'', ''Mario Giacomo'' (in cui la parola ''Mario'' è il cognome) e ''Fabio Rossi''. Gli ultimi due nominativi compaiono nella frase nella loro forma estesa, mentre il primo compare con il solo nome ''Lorenzo'' (eventualità possibile considerando la definizione del pattern precedentemente data). Considerando la virgola come carattere separatore dei termini del nominativo, la sequenza di parole ''Amorosa Lorenzo, Mario'' sarebbe ricondotta, venendo elaborata per prima, ad ''Amorosa Lorenzo Mario'', mentre rimarrebbe non trattata la parola ''Giacomo'', in quanto il cognome ''Mario'' che gli era associato è stato già identificato come un nome del nominativo ''Amorosa Lorenzo Mario'' ed il termine ''Giacomo'' preso singolarmente non rappresenta un nominativo.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Prima di valutare ulteriormente le problematiche relative alle omonimie, si possono scegliere due approcci per risolvere questo specifico caso:&lt;br /&gt;
# Si riconduce una sequenza di parole ad un nominativo se e solo se tutti i suoi nomi sono contenuti nella sequenza&lt;br /&gt;
# Si considerano come separatori dei termini contenuti nei nominativi solo spazi bianchi, tabulazioni e a capo, non gli altri segni di punteggiatura.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Entrambe le strategie sono valide, in quanto risolvono il problema garantendo la corretta identificazione dei nominativi, ma allo stesso tempo entrambe presentano lo svantaggio di ridurre le sequenze di parole riconducibili a dei nominativi, aumentando le possibilità che alcuni di essi non vengano trattati.&lt;br /&gt;
Si consideri nuovamente il nominativo preso come caso di studio ''Amorosa Lorenzo Mario'': applicando la prima strategia, non sarebbe possibile ricondurgli la sequenza ''Amorosa Lorenzo'', mentre applicando il secondo metodo non sarebbe riconducibile la sequenza ''Amorosa, Lorenzo Mario''.&lt;br /&gt;
Si decide di attuare la seconda strategia, in quanto è opportuno non imporre vincoli troppo stringenti sui nomi e poiché nella gran parte dei casi i termini dei nominativi nei documenti sono separati tra loro da caratteri quali spazi bianchi, tabulazioni ed a capo.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Un altro elemento su cui porre l'attenzione è la possibilità che i documenti da trattare contengano dei nominativi scritti interamente in maiuscolo o minuscolo, di conseguenza è conveniente che le ''regular expressions'' siano progettate ''case-insensitive''.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Un ulteriore punto su cui bisogna soffermarsi è la posizione all'interno di un periodo in cui un nominativo può comparire, in particolare si vogliono evitare quei casi critici in cui uno dei termini del nominativo è una sotto-stringa di un'altra parola del testo (si pensi ad ''amorosa'' in ''clamorosa''). Come regola generale si può stabilire che è sempre necessario che un nominativo sia preceduto e seguito da un ''carattere non alfabetico''. Un caso particolare si presenta quando il nominativo è posto ad inizio o a fine documento, situazione in cui quindi esso non è preceduto o non è seguito da alcun carattere: entrambe le posizioni sono da considerare corrette.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
È opportuno ora definire il concetto di ''carattere non alfabetico'', e ciò si può fare più facilmente ragionando sul problema in logica positiva; infatti risulta più semplice individuare quei caratteri che rappresentano lettere piuttosto che quelli che rappresentano segni di interpunzione ed individuare ogni altro carattere che non può mai comporre una parola.&lt;br /&gt;
&lt;br /&gt;
Inquadrando lo scenario di applicazione del servizio, molto probabilmente l'utente vorrà trattare un documento scritto nella lingua di uno dei paesi dell'Unione Europea, poiché il ''GDPR'' vige nei soli paesi membri dell'Unione.&lt;br /&gt;
Si può, quindi, ipotizzare che i documenti trattati possono sì contenere parole e nominativi stranieri, ma che i caratteri contenuti siano appartenenti all'alfabeto latino (''Latin script''), usato in molti stati nel mondo e da tutti i principali stati europei (fatta eccezione per la Grecia ed alcuni stati che scrivono in caratteri cirillici).&lt;br /&gt;
Inoltre, testi scritti in altri alfabeti, come esempio il cinese, l'arabo o il cirillico, vengono generalmente traslitterati. Considerare, quindi, ''caratteri non alfabetici'' tutti i caratteri diversi dalle lettere contenute nell'alfabeto latino sarebbe di conseguenza estremamente riduttivo ed inoltre in questo modo non si terrebbe conto delle lettere accentate, molto utilizzate anche nella lingua italiana.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(XXXX QUI IMG [0F00])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per risolvere il problema facciamo riferimento alla codifica standard Unicode dell'alfabeto latino ([0022]); in essa è possibile individuare, oltre ai caratteri rappresentanti le lettere nella codifica ''ASCII'' classica, i caratteri rappresentanti le lettere nella codifica standard ''ISO/IEC 8859-1'' ([0023]), encoding orientato principalmente alla rappresentazione delle lingue dell'Europa occidentale.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;i&amp;gt;Caratteri latini nei primi due blocchi dello standard Unicode&amp;lt;/i&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;nounderlines&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border-collapse:collapse&amp;quot;&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; &lt;br /&gt;
!style=&amp;quot;background:#ccf; text-align:center; font-weight: bold;&amp;quot;|U+&lt;br /&gt;
!style=&amp;quot;text-align:center; font-weight: bold;&amp;quot;|0||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|1||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|2||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|3||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|4||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|5||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|6||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|7||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|8||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|9||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|A||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|B||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|C||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|D||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|E||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|F||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|Block||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|#&lt;br /&gt;
|-&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|0040&lt;br /&gt;
|style=&amp;quot;background:#fff&amp;quot;|@||A||B||C||D||E||F||G||H||I||J||K||L||M||N||O&lt;br /&gt;
|rowspan=&amp;quot;4&amp;quot; style=&amp;quot;background:#fff&amp;quot; align:&amp;quot;center&amp;quot;|C0 Controls and Basic Latin&amp;lt;br&amp;gt;0000–007F&amp;lt;br&amp;gt;(identical to ASCII)&lt;br /&gt;
|rowspan=&amp;quot;4&amp;quot; style=&amp;quot;background:#fff&amp;quot;|52&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|0050&lt;br /&gt;
|P||Q||R||S||T||U||V||W||X||Y||Z||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#91;||style=&amp;quot;background:#fff&amp;quot;|\||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#93;||style=&amp;quot;background:#fff&amp;quot;|^||style=&amp;quot;background:#fff&amp;quot;|_&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|0060&lt;br /&gt;
|style=&amp;quot;background:#fff&amp;quot;|`||a||b||c||d||e||f||g||h||i||j||k||l||m||n||o&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|0070&lt;br /&gt;
|p||q||r||s||t||u||v||w||x||y||z||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#123;||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#124;||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#125;||style=&amp;quot;background:#fff&amp;quot;|~||style=&amp;quot;background:#fff; font-size:75%&amp;quot;|DEL&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;19&amp;quot;| &lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#fff&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00A0&lt;br /&gt;
|&amp;amp;nbsp;||¡||¢||£||¤||¥||¦||§||¨||©||ª||«||¬||||®||¯&lt;br /&gt;
|rowspan=&amp;quot;6&amp;quot; style=&amp;quot;background:#fff&amp;quot; align=&amp;quot;center&amp;quot;|C1 Controls and Latin-1 Supplement&amp;lt;br&amp;gt;0080–00FF&amp;lt;br&amp;gt;(identical to ISO/IEC 8859-1)&lt;br /&gt;
|rowspan=&amp;quot;6&amp;quot; style=&amp;quot;background:#fff&amp;quot;|62&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#fff&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00B0&lt;br /&gt;
|°||±||²||³||´||µ||¶||·||¸||¹||º||»||¼||½||¾||¿&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00C0&lt;br /&gt;
|À||Á||Â||Ã||Ä||Å||Æ||Ç||È||É||Ê||Ë||Ì||Í||Î||Ï&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00D0&lt;br /&gt;
|Ð||Ñ||Ò||Ó||Ô||Õ||Ö||style=&amp;quot;background:#fff&amp;quot;|×||Ø||Ù||Ú||Û||Ü||Ý||Þ||ß&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00E0&lt;br /&gt;
|à||á||â||ã||ä||å||æ||ç||è||é||ê||ë||ì||í||î||ï&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00F0&lt;br /&gt;
|ð||ñ||ò||ó||ô||õ||ö||style=&amp;quot;background:#fff&amp;quot;|÷||ø||ù||ú||û||ü||ý||þ||ÿ&lt;br /&gt;
|---- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I caratteri indicati in rosso nella tabella sono tutti i possibili ''caratteri alfabetici'' che compaiono nei documenti scritti in 29 lingue diverse ([0023]), tra le quali sono presenti l'italiano, l'inglese, lo spagnolo, il tedesco e il portoghese. &lt;br /&gt;
Aggiungendo pochi altri caratteri all'insieme dei ''caratteri alfabetici'' appena mostrati, si riesce a rappresentare ogni parola di altre 12 lingue ([0023]), tra cui il francese, l'olandese, il ceco e il turco.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
I caratteri mostrati in tabella corrispondono ad una parte dei primi due blocchi dello standard Unicode che codificano l'alfabeto latino e, come già accennato in precedenza, essi sono presenti negli standard ''ASCII'' e ''ISO/IEC 8859-1''. I rimanenti ''caratteri alfabetici'', invece, sono presenti in estensioni dello standard Unicode per il ''Latin script''. Queste estensioni sono state realizzate per fornire il massimo supporto a tutte le lingue e contenenti molti simboli ad uso speciale, come ad esempio per la rappresentazione dei fonemi. Si osserva, inoltre, che i ''caratteri alfabetici'' definiti nelle estensioni dello standard Unicode sono presenti anche nella codifica ''ISO/IEC 8859-2'' o nelle versioni successive ([0023]).&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Definiti i ''caratteri non alfabetici'' come elementi di separazione tra un nominativo ed il testo in cui esso è inserito, occorre definire opportunamente la ''regex'' che al nominativo è associata.&lt;br /&gt;
&lt;br /&gt;
Utili strumenti messi a disposizione dalle ''regular expressions'' sono i gruppi speciali ''lookahead'' e ''lookbehind''. Un pattern di un nominativo deve essere preceduto o seguito da una prestabilita sequenza di caratteri, la quale però non è parte del nominativo. Utilizzando i due costrutti citati, è possibile far sì che nell'elaborazione di una stringa facciano match solamente le parole effettivamente appartenenti al nominativo, non i caratteri che lo delimitano dal resto del testo, e allo stesso tempo che un nominativo faccia match se e solo se preceduto o seguito da una certa sequenza di caratteri. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per esprimere nella sintassi delle ''regex'' un carattere letterale in un qualunque alfabeto si può utilizzare il costrutto ''\p{L}'', che però risulta molto generale e troppo lasco per i requisiti considerati. Si può piuttosto valutare l'impiego del costrutto ''\p{Latin}'', il quale identifica un qualunque carattere alfabetico presente nell'alfabeto latino. Tra i caratteri corrispondenti al costrutto, però, ve ne sono alcuni che per le specifiche del servizio devono essere considerati ''caratteri non alfabetici'', come ad esempio i caratteri dei fonemi, i segni diacritici e gli indicatori ordinali; di conseguenza è necessario individuare una strategia ad hoc per risolvere questa problematica.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per chiarezza espositiva, si definisce il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;start&amp;gt;&amp;lt;/span&amp;gt;, per indicare un qualunque carattere non alfabetico o l'inizio stringa, il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;end&amp;gt;&amp;lt;/span&amp;gt;, per indicare un qualunque carattere non alfabetico o il fine stringa, ed il tag &amp;lt;extra&amp;gt;, per indicare i ''caratteri alfabetici'' non presenti negli standard ''ASCII'' o ''ISO/IEC 8859-1'':&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;extra&amp;gt; := ĿŀČčŘřŠšŽžĲĳŒœŸŐőŰűḂḃĊċḊḋḞḟĠġṀṁṠṡṪṫĀāĒēĪīŌōŪūİıĞğŞşẀẁẂẃŴŵŶŷǾǿẞ&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;start&amp;gt; := (?&amp;lt;=[^A-Za-zÀ-ÖØ-öø-ÿ&amp;lt;extra&amp;gt;]|^)&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;end&amp;gt; := (?=[^A-Za-zÀ-ÖØ-öø-ÿ&amp;lt;extra&amp;gt;]|$)&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva che si sono utilizzati i gruppi speciali prima descritti e che si sono inseriti i caratteri dello standard Unicode presentati in precedenza. Si definisce nuovamente la ''regular expression'' associata ad un generico nominativo. Applicando i tag appena definiti, il costrutto ''(?i)'' che rende il pattern ''case-insensitive'' ed il costrutto ''\s'' che rappresenta un carattere qualunque tra i separatori non visibili, ossia ''\r \n \t \f \v'' e lo spazio bianco, si ottiene:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;regex&amp;gt; := (?i)(&amp;lt;start&amp;gt;&amp;lt;cognome&amp;gt;\s+(&amp;lt;nomi&amp;gt;)|(&amp;lt;nomi&amp;gt;)\s+&amp;lt;cognome&amp;gt;&amp;lt;end&amp;gt;)&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva, inoltre, che in questa nuova formulazione della ''regular expression'' i nomi sono da intendersi separati tra loro da ''\s+''.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
A questo punto si è quasi giunti alla formulazione finale del pattern da associare ad un nominativo, rimangono solo da trattare alcuni casi critici non ancora risolti.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt; &lt;br /&gt;
Si è già presentato in precedenza il problema legato al fatto che alcuni cognomi possono avere un significato proprio nel lessico comune e che ciò costringeva, quindi, ad abbandonare l'idea di trattare nominativi formati dal solo cognome. Questa problematica di ambiguità si presenta anche con alcuni nomi (si pensi, ad esempio, al nome ''Gioia''). Ciò non rappresenta generalmente un problema, in quanto la coppia nome-cognome che forma il nominativo, presa complessivamente, non è soggetta ad ambiguità. Esistono, però, dei casi in cui questo non è vero. Si prenda in analisi il nominativo ''Gioia Grande'': risulta evidentemente soggetto a rischio di ambiguità. Una soluzione che si può adottare, per risolvere questo caso critico, si basa sull'associazione di un pattern più stringente ai nominativi. In particolare, si osserva che i nomi propri di persona compaiono sempre ed obbligatoriamente, in un documento grammaticalmente corretto, con la prima lettera maiuscola ([0024]). I cognomi, invece, non sono soggetti ad una regola così stringente: un cognome iniziante con una lettera minuscola (come ''de Rosa'') in alcuni casi, ad esempio se posto dopo un punto fermo, può comparire scritto con la prima lettera sia maiuscola che minuscola; naturalmente, in nessuna occorrenza un cognome che inizi con una lettera maiuscola potrà comparire con una minuscola. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Occorre quindi ridefinire, alla luce di queste osservazioni, la ''regex'' associata ad un nominativo, poiché precedentemente era stata posta interamente ''case-insensitive''. Nel pattern, in particolare, i nomi dovranno sempre iniziare con una maiuscola, mentre i cognomi avranno questo vincolo solo se nel nominativo compaiono con la prima lettera maiuscola. Si mostra quindi quali sono i tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; e &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt; associati a due nominativi, ad esempio ''Gioia Grande'' e ''Antonio de Rosa''. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per ''Gioia Grande'' si ha:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt; = G((?i)ioia)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt; = G((?i)rande)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per ''Antonio de Rosa'' si ha:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt; = A((?i)ntonio)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt; = (?i)de Rosa&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si presenta dunque la definizione finale del tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;regex&amp;gt;&amp;lt;/span&amp;gt;. Nella definizione il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; è definito il base al numero di nomi del nominativo ed il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt; è definito in base al carattere iniziale del cognome.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;regex&amp;gt; := &amp;lt;start&amp;gt;&amp;lt;cognome&amp;gt;\s+(&amp;lt;nomi&amp;gt;)|(&amp;lt;nomi&amp;gt;)\s+&amp;lt;cognome&amp;gt;&amp;lt;end&amp;gt;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Vengono inoltre mostrati i valori dei due tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; e &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt; per il nominativo preso come caso di studio in fase iniziale, ossia ''Amorosa Lorenzo Mario''. Si ottiene:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt; = L((?i)orenzo)\s+M((?i)ario)|M((?i)ario)\s+L((?i)orenzo)|L((?i)orenzo)|M((?i)ario)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt; = A((?i)morosa)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Infine, per completezza, viene mostrata la ''regular expression'', associata a quest'ultimo nominativo, risolvendo tutti i tag che la compongono:&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;regex&amp;gt; = (?&amp;lt;=[^A-Za-zÀ-ÖØ-öø-ÿĿŀČčŘřŠšŽžĲĳŒœŸŐőŰűḂḃĊċḊḋḞḟĠġṀṁṠṡṪṫĀāĒēĪīŌōŪūİıĞğŞşẀẁẂẃŴŵŶŷǾǿẞ]|^)(A((?i)morosa)\s+(L((?i)orenzo)\s+M((?i)ario)|M((?i)ario)\s+L((?i)orenzo)|L((?i)orenzo)|M((?i)ario))|(L((?i)orenzo)\s+M((?i)ario)|M((?i)ario)\s+L((?i)orenzo)|L((?i)orenzo)|M((?i)ario))\s+A((?i)morosa))(?=[^A-Za-zÀ-ÖØ-öø-ÿĿŀČčŘřŠšŽžĲĳŒœŸŐőŰűḂḃĊċḊḋḞḟĠġṀṁṠṡṪṫĀāĒēĪīŌōŪūİıĞğŞşẀẁẂẃŴŵŶŷǾǿẞ]|$)&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Gestione delle omonimie====&lt;br /&gt;
&lt;br /&gt;
Nei ragionamenti che hanno portato alla formulazione della ''regular expression'' associata ai nominativi, si è tenuto conto di possibili ambiguità con termini appartenenti al linguaggio comune, risolte con l'introduzione nel pattern di stringhe ''case-sensitive'', e di possibili nominativi posti in sequenza parzialmente omonimi (ossia aventi un nome o il cognome in comune tra loro), gestite con l'imposizione dei soli caratteri separatori non visibili come delimitatori delle parole componenti un nominativo. Per rendere l'analisi completa occorre valutare come ci si debba comportare in altri possibili casi di omonimia. Si osserva, per inciso, che nel pattern individuato nella sezione precedente il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; è stato l'unico non definito formalmente. La definizione di tale tag infatti dipende, oltre che dai nomi del nominativo, anche dall'insieme complessivo dei nominativi da trattare presenti nel documento.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Il caso più semplice di omonimia, che si verifica quando un solo nome o il solo cognome di un nominativo coincide con un nome o il cognome di un altro (come nel caso di ''Lorenzo Mario Amorosa'' e ''Stefano Amorosa''), risulta già ben gestito dall'attuale formulazione del pattern. Infatti, un riconoscimento è determinato quando almeno un nome e il cognome del nominativo appaiono in sequenza.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Il problema si complica quando un nominativo ha due o più componenti in comune con un altro. Si osserva che se l'omonimia riguarda solo i nomi dei nominativi, ciò non risulta problematico, in quanto il cognome, supposto sempre presente nel pattern, funge da elemento di disambiguazione. Si considera da ora, quindi, che i nominativi abbiano il medesimo cognome e si analizzano i casi in cui anche uno o più nomi risultano in comune, attraverso degli esempi: &lt;br /&gt;
* Nomi_A = {&amp;quot;Lorenzo&amp;quot;, &amp;quot;Mario&amp;quot;, &amp;quot;Luca&amp;quot;}; Nomi_B = {&amp;quot;Stefano&amp;quot;, &amp;quot;Mario&amp;quot;}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F01])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In questo caso sono elementi di disambiguazione i nomi ''Lorenzo'' e ''Luca'' per il primo nominativo e ''Stefano'' per il secondo, bisognerà quindi far sì che almeno uno tra tali nomi compaia sempre nelle ''regex'' associate ai nominativi in questione. L'occorrenza ''Mario &amp;lt;cognome&amp;gt;'' rimane ambigua e non può essere trattata.&lt;br /&gt;
* Nomi_A = {&amp;quot;Lorenzo&amp;quot;, &amp;quot;Mario&amp;quot;, &amp;quot;Luca&amp;quot;}; Nomi_B = {&amp;quot;Mario&amp;quot;, &amp;quot;Luca&amp;quot;}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F02])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
L'insieme Nomi_B risulta un sottoinsieme di Nomi_A, di conseguenza solo il primo nominativo presenta degli elementi utili per risolvere l'ambiguità. Nel pattern relativo al primo nominativo dovrà essere presente almeno un tra i nomi non in comune, mentre il pattern del secondo nominativo rappresenterà inevitabilmente espressioni ambigue poiché riconducibili all'altro. Le soluzioni possibili sono due: rifiutarsi di effettuare il trattamento del secondo nominativo oppure decretare che esso è riconosciuto se e solo se appare nella sua forma estesa, presentando quindi tutti i nomi. Quest'ultima soluzione è ragionevole e la si sceglie, poiché così si aumentano, per quanto possibile, le sequenze &amp;quot;minimizzabili&amp;quot;, e viene inoltre messo in conto di informare l'utente opportunamente sulla gestione di questo genere di omonimia per rendere le operazioni trasparenti.&lt;br /&gt;
* Nomi_A = Nomi_B = {&amp;quot;Lorenzo&amp;quot;, &amp;quot;Mario&amp;quot;, &amp;quot;Luca&amp;quot;}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F03])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Qualora l'insieme dei nomi dei due nominativi sia identico risulta impossibile distinguerli e non possono in alcun modo essere trattati, poiché l'ordine con cui compaiono i nomi di un nominativo non rappresenta un elemento di disambiguità. I dati appartenenti a persone completamente omonime contenuti in uno stesso documento, quindi, non sono &amp;quot;minimizzabili&amp;quot; distintamente.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva che è di fondamentale importanza che i documenti che gli utenti forniscono siano grammaticalmente corretti, in quanto un errato uso dei segni di interpunzione può rendere impossibile l'applicazione delle ''regular expression''. Si prenda ad esempio una sequenza anomala di caratteri in cui non è corretto l'uso delle virgole, come &amp;quot;''Amorosa Mario Rossi Giacomo''&amp;quot;: supponendo che nel documento si vogliano trattare i nominativi ''Amorosa Mario'', ''Rossi Mario'' e ''Rossi Giacomo'', risulta impossibile identificare quali tra questi siano rappresentatati nella sequenza.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In conclusione, risultano quindi individuate le strategie che permettono di formulare ''regular expressions'' anche per i nominativi soggetti ad omonimia.&lt;br /&gt;
&lt;br /&gt;
====Formattazione dei documenti====&lt;br /&gt;
 &lt;br /&gt;
I documenti prodotti in enti ed organizzazioni presentano generalmente formattazioni e non sono puramente testuali. Si vuole qui considerare quale debbano essere le interpretazioni più adatte da dare agli elementi grafici per rendere sempre efficace il riconoscimento dei nominativi. In particolare, quindi, non si tratteranno gli elementi di punteggiatura, come parentesi o virgolette, poiché già compresi nelle ''regex'', bensì tutti gli elementi che in un pattern composto da caratteri non sono espressi. Si inizia dunque la rassegna:&lt;br /&gt;
* Elementi di formattazione del testo&lt;br /&gt;
I font, la dimensione dei caratteri, il grassetto, il corsivo, l'evidenziazione e tutti i possibili elementi di modifica della apparizione grafica del testo non alterano il significato dei lessemi coinvolti. Se il cognome di un nominativo è posto in grassetto ed il nome no, ad esempio, la coppia nome-cognome rappresenta sempre il nominativo iniziale; lo stesso vale per gli altri elementi citati.&lt;br /&gt;
* Aree di comparizione del testo&lt;br /&gt;
In genere ogni documento è formato da più sezioni, ha un corpo principale ed eventuali titoli, note a piè pagina, intestazioni ed altre possibili aree. Il trattamento di &amp;quot;minimizzazione&amp;quot;, secondo il ''GDPR'', deve essere effettuato al documento in ogni sua parte, ma ogni sezione deve essere elaborata in maniera indipendente dalle altre sezioni in quanto rappresenta un blocco logico a sé. Ciò significa che, ad esempio, bisogna individuare eventuali nominativi presenti nel titolo, ma non bisogna considerare nominativo una sequenza di parole che è posta in parte nel titolo e in parte nel primo paragrafo del testo.&lt;br /&gt;
* Elementi blocco&lt;br /&gt;
Gli elementi blocco, come ad esempio le immagini, possono causare un'interruzione netta in un paragrafo, suddividendolo quindi in più blocchi logici, che devono essere analizzati separatamente; tuttavia nel caso in cui questi elementi siano posti ''fluttuanti'', ossia ancorati ai bordi della pagina, il testo scorre in un unico flusso e forma quindi un unico blocco logico.&lt;br /&gt;
* Divisione in sillabe&lt;br /&gt;
Un problema rilevante nella formattazione del documento è che spesso, per esigenze estetiche, contiene delle parole divise in sillabe poste su righe diverse e separate da un trattino. Ovviamente se un nome va a capo a fine linea non perde il suo significato semantico, bisognerà quindi continuare a riconoscerlo.&lt;br /&gt;
* Tabelle&lt;br /&gt;
Molti documenti, specialmente quelli contenenti ingenti quantità di nominativi, possono essere strutturati in forma tabellare. Trascurando una trattazione per esteso delle modalità con cui i nominativi potrebbero comparire nelle tabelle, si considera esclusivamente il caso di gran lunga più ricorrente. In genere, infatti, in una tabella contenente dei nominativi, essi sono presenti nella stessa colonna o in colonne contigue: l'una contenente i nomi, l'altra il cognome, o viceversa. Senza basarsi sull'intestazione delle colonne, si può valutare se il contenuto di due celle adiacenti poste su di una stessa riga faccia match con il pattern di un nominativo, ed in caso ciò accada si può affermare la coppia di celle individuata rappresenta un nominativo.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva che si sono fornite solamente le interpretazioni più plausibili e comuni a questi elementi grafici e non si è ideato alcun particolare algoritmo per la loro elaborazione. L'espressione di tali strutture, infatti, è fortemente determinata dal formato in cui il documento è redatto. Si rimanda, quindi, ai capitoli successivi per specificazioni ulteriori della soluzione. Occorre notare, infine, che gli elementi di formattazione non sono descritti da stringhe nel formato delle ''regular expressions'': bisognerà quindi integrare gli elementi presentati in questa sezione con l'approccio ''pattern-based'' adottato.&lt;br /&gt;
&lt;br /&gt;
===Analisi dell'usabilità===&lt;br /&gt;
&lt;br /&gt;
====Elenco dei nominativi da trattare esplicitamente espressi come dati in input====&lt;br /&gt;
&lt;br /&gt;
In questo caso, per usufruire del servizio, l'utente deve fornire un documento contenente una serie di nominativi da trattare. Una garanzia della corretta elaborazione del documento si ha richiedendo all'utente stesso quali siano i nominativi da trattare: in questo modo potranno essere &amp;quot;minimizzati&amp;quot; i dati (cioè i nominativi) di tutte e sole le persone espressamente richieste. In molti plausibili scenari, infatti, è necessario anonimizzare solo alcuni dei nominativi presenti nel documento; ad esempio in un atto giudiziario serve anonimizzare le parti in causa ma non i magistrati. &lt;br /&gt;
&lt;br /&gt;
Questa configurazione del servizio permette quindi all'utente di avere il massimo controllo possibile del risultato. Tuttavia questo approccio è poco pratico nel caso in cui i documenti da trattare contengano grandi quantità di nominativi diversi e, magari, l'utente che ne richiede il trattamento non li conosce; si pensi ad esempio a lunghe graduatorie di concorsi o altro. Si osserva inoltre che anche per pochi nominativi l'usabilità può degradare, se l'inserimento viene fatto con estemporanea digitazione, esposta anche al rischio di possibili errori di battitura, con conseguenti noiose ripetizioni delle operazioni.&lt;br /&gt;
&lt;br /&gt;
Si osserva, infine, che il sistema progettato è sufficientemente robusto nel trattare i nominativi in input espressi da un utente che ha digitato caratteri maiuscoli o minuscoli violando le convenzioni grammaticali. Supposto che il documento trattato debba essere grammaticalmente corretto, infatti, si ha la garanzia che i nomi ivi presenti comincino con una maiuscola; è sufficiente, quindi, forzare una conversione ''to-upper-case'' dei nomi inseriti dall'utente e le ''regex'' progettate funzionano correttamente. Un discorso a parte va fatto per i cognomi inseriti dall'utente, in quanto essi possono comparire con la prima lettera sia maiuscola che minuscola. L'inserimento di un cognome iniziante con una minuscola non crea grossi problemi, in quanto in tal caso la ''regex'' risultante sarebbe totalmente ''case-insensitive'' per il cognome, mentre l'aggiunta di un cognome cominciante con una maiuscola determina una ''regex'' ''case-insensitive'' per la prima lettera del cognome; qualora quindi un utente inserisse un nominativo tutto in maiuscolo, le occorrenze del cognome, presenti nel documento, inizianti con una lettera minuscola non verrebbero riconosciute.&lt;br /&gt;
Per le altre lettere dopo la prima, sia per i nomi che per i cognomi, il pattern è stato progettato ''case-insensitive'', quindi non emergono problemi. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In sintesi, il rischio che vengano introdotte delle ambiguità lessicali, incaricando l'utente dell'inserimento dei nominativi, è piuttosto basso ed il controllo che si ha sui nominativi è il massimo desiderabile, mentre i requisiti di usabilità risultano penalizzati.&lt;br /&gt;
&lt;br /&gt;
====Elenco dei nominativi da trattare dedotti automaticamente da un dizionario====&lt;br /&gt;
&lt;br /&gt;
Se si desidera privilegiare la tematica dell'usabilità nella progettazione del servizio, risulta necessario individuare delle strategie che semplifichino il più possibile i compiti che devono essere svolti dall'utente. L'unica operazione che inevitabilmente resta a suo carico è l'upload del documento da trattare; non è infatti necessario richiedergli l'elencazione dei nominativi dei nominativi da trattare, in quanto questi possono essere dedotti automaticamente impiegando dei dizionari, dei quali va quindi valutato il contenuto e le modalità di utilizzo. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si scarta subito l'ipotesi di dedurre automaticamente i nominativi basandosi unicamente sul fatto che le iniziali di nomi e cognomi siano maiuscole; come già argomentato infatti l'uso delle lettere maiuscole non è limitato solo a questi usi e, inoltre, non si può avere la certezza che un cognome inizi con una maiuscola.&lt;br /&gt;
&lt;br /&gt;
Sono disponibili fortunatamente alcuni dizionari di nomi ed altri di cognomi, in diverse lingue; si fa qui riferimento a quelli di &amp;quot;Data World&amp;quot; (un'azienda focalizzata sulla raccolta, produzione e pubblicazione di dataset: https://data.world) ([0037]).&lt;br /&gt;
&lt;br /&gt;
Si inizia l'analisi inquadrando le dimensioni che un dizionario contenente nomi o cognomi avrebbe. Risalta subito all'occhio la differenza tra il numero di termini contenuti nei due casi: facendo riferimento ai soli nomi e cognomi italiani, risultano esistenti circa 350.000 cognomi ([0036]) e circa 9.000 nomi, dei quale circa 5.000 maschili e circa 4.000 femminili ([0037]); il numero dei cognomi è quindi quasi 40 volte più grande del numero dei nomi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si ipotizza, per chiarire le idee, di applicare questi dizionari in uno scenario reale, in cui, ad esempio, si vuole trattare un documento di 10 pagine contenente 5.000 parole. Si trascurano inoltre i meccanismi che permettono di ricondurre un nome od un cognome ad un nominativo per concentrarsi unicamente sul numero di confronti necessari da effettuare nell'elaborazione. Nel peggiore dei casi possibili, ossia quando nessuna parola del documento compare tra i termini del dizionari, e dove occorre quindi confrontare ogni singola parola del documento con tutti i termini del dizionario, per semplice moltiplicazione si ottiene che l'impiego di un dizionario di nomi darebbe luogo a 45.000.000 confronti, mentre un dizionario di cognomi ben a 1.750.000.000 confronti. Se invece le parole nel documento fossero 50.000 si avrebbero 450.000.000 di confronti nel primo caso e 10.750.000.000 nel secondo. In sintesi, sebbene il rapporto tra il numero di confronti nei due casi rimanga sempre costante (circa 1:40) indipendentemente dalla lunghezza del documento, la differenza tra il numero di confronti cresce proporzionalmente al numero di parole che vengono sottoposte all'elaborazione. Per quantificare, infine, attraverso un unità di tempo, la differenza esistente tra l'impiego delle due diverse tipologie di dizionario, si realizza un semplice programma java, di cui si riporta qui sotto il contenuto del metodo principale, che realizza i confronti necessari attraverso l'uso di ''regular expression'':&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
final String regex = &amp;quot;\bLorenzo\b&amp;quot;;&amp;lt;br/&amp;gt;&lt;br /&gt;
final String string =  ... //testo di prova&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);&amp;lt;br/&amp;gt;&lt;br /&gt;
final Matcher matcher = pattern.matcher(string);&amp;lt;br/&amp;gt;&lt;br /&gt;
int start, total;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
start = System.currentTimeMillis();&lt;br /&gt;
while (matcher.find()) {&lt;br /&gt;
    System.out.println(&amp;quot;Full match: &amp;quot; + matcher.group(0));&lt;br /&gt;
    for (int i = 1; i &amp;lt;= matcher.groupCount(); i++) {&lt;br /&gt;
        System.out.println(&amp;quot;Group &amp;quot; + i + &amp;quot;: &amp;quot; + matcher.group(i));&lt;br /&gt;
    }&lt;br /&gt;
} &amp;lt;br/&amp;gt;&lt;br /&gt;
total = System.currentTimeMillis() - start;&lt;br /&gt;
System.out.println(&amp;quot;Total: &amp;quot; + total + &amp;quot; ms&amp;quot;);&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Eseguendo il test più volte, inserendo fino a 10 occorrenze della parola &amp;quot;Lorenzo&amp;quot; nel testo, si ha un tempo di elaborazione medio di circa 3 ms, con prestazioni di picco di 2 ms, ottenibili con poche occorrenze del nome presenti, e tempo di attesa massimo di 6 ms, dovuto alla presenza invece a una presenza più frequente del nome nel testo.&lt;br /&gt;
Questo fenomeno si comprende meglio ricordando che, come spiegato nel capitolo precedente, le ''regular expressions'' ottimizzano la ricerca, considerano le stringhe del testo trattato solo finché necessario, ossia fino a quando non vi è certezza che esse corrispondano o non corrispondano ad un match. Ogni volta che nel testo si presenta una parola che inizia con una lettera diversa dalla 'L' di &amp;quot;Lorenzo&amp;quot;, la ricerca procede direttamente con la valutazione della parola successiva, ignorando i rimanenti caratteri della parola. &lt;br /&gt;
&lt;br /&gt;
Risulta, invece, più onerosa la verifica della corrispondenza tra una stringa ed il pattern desiderato, poiché in questo caso vanno elaborati tutti i caratteri della parola. Come caso limite, si è posta come stringa da elaborare la sequenza di caratteri &amp;quot;Lorenzo &amp;quot; ripetuta 500 volte: il tempo di esecuzione medio del programma risultante, a parità di piattaforma, è stato di circa 25 ms.&lt;br /&gt;
&lt;br /&gt;
Un'altra diretta conseguenza di questo meccanismo di confronto è che all'aumentare del numero di parole nel documento non corrisponde un eccessivo aumento del tempo di esecuzione: considerando un documento di 5000 parole, con 0 occorrenze del nome &amp;quot;Lorenzo&amp;quot; il tempo di esecuzione medio risulta di 9 ms, con 10 occorrenze di 10 ms, con 100 occorrenze di 15 ms.&lt;br /&gt;
&lt;br /&gt;
Occorre precisare, prima di formulare ulteriori ragionamenti, che in documento di 5.000 parole potranno essere presenti al più 2500 coppie nome-cognome; in un dizionario con più di 2.500 termini almeno uno di questi non contribuirà nell'individuazione di un nominativo. Se poi sono presenti altre parole oltre ai nominativi nel documento, la percentuale di nomi che presenterà 0 occorrenze crescerà di conseguenza. Ad ogni modo, si sceglie di sviluppare i ragionamenti considerando necessario il tempo medio di 10 ms per individuare le occorrenze di un termine di un dizionario in un documento di 5.000 parole; questo tempo è sicuramente maggiore rispetto al caso reale, ma valutando per eccesso questo valore è possibile trascurare il tempo impiegato nelle altre operazioni di routine a supporto dell'algoritmo di ricerca.&lt;br /&gt;
&lt;br /&gt;
Ritornando all'esempio di partenza, considerando quindi necessari 10 ms per individuare le occorrenze di un termine di un dizionario in un documento di 5.000 parole, risulta che l'identificazione di tutti i cognomi contenuti nel testo richieda circa 3.500 secondi, (quasi un'ora!), mentre l'individuazione dei nomi &amp;quot;solo&amp;quot; 90 secondi.&lt;br /&gt;
I tempi di attesa che l'utente dovrebbe aspettare sono estremamente elevati e irragionevoli, specialmente se calati nel contesto nelle ''web application''. Come primo espediente per ovviare al problema si decide di abbandonare completamente l'idea di impiegare un dizionario di cognomi, in quanto, seppur si individuassero delle soluzioni in grado di effettuare il riconoscimento di tutte le occorrenze di un termine in un documento indipendentemente dalla lunghezza in solo 1 ms (irreale), sarebbero comunque necessari 3 minuti e 50 secondi per l'elaborazione. Non verranno quindi neppure trattate possibili soluzioni che prevedono l'applicazione di entrambi i dizionari.&lt;br /&gt;
&lt;br /&gt;
I 90 secondi richiesti dal dizionario di nomi, invece, risultano anch'essi eccessivi, ma attraverso opportune valutazioni si possono individuare delle strategie che consentono la minimizzazione del tempo necessario all'elaborazione dei documenti. Tali metodi di ottimizzazione saranno trattati in un successivo capitolo, mentre ora ci si continua a concentrare sulle modalità di impiego del dizionario.&lt;br /&gt;
&lt;br /&gt;
Per inciso, si osserva che i problemi di efficienza sono strettamente legati al riconoscimento automatico dei nominativi, in quanto in questo caso devono essere applicate quasi una decina di migliaia di ''regex'' diverse; nel caso in cui i nominativi da elaborare e le ''regex'' a loro associate siano noti, si ha a che fare con un numero esiguo di pattern da trattare e l'esecuzione del programma risulta infinitamente più rapida.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per migliorare l'efficacia del servizio sarebbe opportuno introdurre nel dizionario anche nomi stranieri, sempre più diffusi in una società sempre più globalizzata. Il tempo di esecuzione medio del riconoscimento, già critico, crescerebbe ulteriormente: si decide allora di introdurre nel dizionario i soli nomi inglesi, in totale quasi 5500 ([0037]). Considerando sempre un tempo medio di esecuzione di 10 ms per nome, con un dizionario di circa 14.500 termini si avrebbe un tempo di esecuzione medio complessivo di 145 secondi, ossia pari a 2 minuti e 25 secondi, e risulta ancora possibile effettuare alcune ottimizzazioni che lo riducono ad un livello accettabile.&lt;br /&gt;
&lt;br /&gt;
Una volta individuati i nomi contenuti nel documento occorre stabilire se essi fanno parte di un nominativo, progettando un'opportuna ''regular expression''. È importante notare che per conseguire questo scopo bisogna individuare la soluzione più efficiente possibile.&lt;br /&gt;
&lt;br /&gt;
Un nominativo, come già ripetuto più volte, è composto da uno o più nomi e da un cognome. Individuato un nome, la priorità che si ha è verificare se accanto ad esso sia presente un cognome. Finora i cognomi sono stati supposti non regolamentati da alcun pattern specifico, ma è necessario formularne almeno uno per consentirne il riconoscimento automatico. È ragionevole supporre che un cognome sia formato da massimo due parole, separate da spazio o apostrofo, sempre inizianti entrambe con una maiuscola, fatta eccezione per la prima parola laddove essa sia una preposizione semplice o articolata oppure un articolo, tenendo conto dei possibili troncamenti, come &amp;lt;i&amp;gt;d'&amp;lt;/i&amp;gt; e &amp;lt;i&amp;gt;dell'&amp;lt;/i&amp;gt;. Inoltre per verificare se un termine adiacente al nome trovato rappresenti un nome si evita di impiegare nuovamente il dizionario per non gravare ulteriormente sul tempo di esecuzione. Inoltre, si nota che avendo supposto un cognome composto da massimo due parole inizianti con una lettera maiuscola, un altro nome, oltre quello trovato dal dizionario, viene già automaticamente riconosciuto qualora il cognome sia composto da una sola parola. Rinunciando ad individuare nominativi composti da tre nomi o più, si formula una ''regular expression'' per il riconoscimento automatico in seguito al identificazione di un nome, qui indicato con il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nome&amp;gt;&amp;lt;/span&amp;gt;, supponendo il cognome come precedentemente indicato e ipotizzando la presenza di un ulteriore nominativo.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;prep&amp;gt; := d((a|e)(l(l[aeo]?)?|i|gli?)?|i)?|(ne|a|su)(l(l[aeo]?)?|i|gli)?|l[aeo]?|co[iln]?|i[ln]?|gli|per&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cognome&amp;gt; := (([A-Z][a-zA-ZÀ-ÖØ-öø-ÿ]*|&amp;lt;prep&amp;gt;)('|\s))?[A-Z][a-zA-ZÀ-ÖØ-öø-ÿ]+&lt;br /&gt;
&lt;br /&gt;
&amp;lt;second_name&amp;gt; := [A-Z][a-zA-ZÀ-ÖØ-öø-ÿ]+&lt;br /&gt;
&lt;br /&gt;
&amp;lt;regex&amp;gt; := (&amp;lt;second_name&amp;gt;\s)?(&amp;lt;nome&amp;gt;)\s&amp;lt;cognome&amp;gt;|&amp;lt;cognome&amp;gt;\s(&amp;lt;nome&amp;gt;)(\s&amp;lt;second_name&amp;gt;)?&lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Nella scrittura della ''regex'' si è prestata particolare attenzione all'utilizzo della simbologia per rendere l'espressione il più performante possibile, attraverso il massimo sfruttamento dei cortocircuiti logici e l'opportuno ordinamento dei caratteri (sono stati anteposti i caratteri comuni a più preposizioni od articoli). Inoltre, per alleggerire la ''regex'' si è rinunciato all'utilizzo dei caratteri dell'alfabeto latino non appartenenti ai primi due blocchi Unicode.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
È mostrata in figura la corretta elaborazione di 57 possibili casi di cognomi diversi&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F04])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva tuttavia che in alcune circostanze, come nella frase &amp;quot;''di Amorosa Lorenzo non si hanno notizie''&amp;quot;, accade che un parola (&amp;quot;''di''&amp;quot; in questo caso), non sia parte del cognome ma il programma non è in grado di riconoscerlo. Questa ambiguità è fortemente dipendente dal contesto e non è possibile trattarla senza significativi degradi delle performance; quindi è necessario rinunciare a trattarla, accettando riconoscimenti erronei. In altre situazioni, invece, dove magari si sta elaborando la stringa contenente il nominativo ''Mario Lorenzo'', risulta impossibile determinare quale tra i due termini sia il nome e quale il cognome; cioè significa che l'unico trattamento di &amp;quot;minimizzazione&amp;quot; automatico che risulta ragionevole applicare è la sostituzione del nominativo con uno pseudonimo, non il troncamento o l'alterazione dei nomi.&lt;br /&gt;
In conclusione, con il riconoscimento automatico dei nominativi si migliora complessivamente l'usabilità del servizio, in quanto l'utente non deve digitare i nominativi, ma la latenza introdotta è notevole, si è soggetti a rischi di ambiguità e non è in alcun modo esprimibile la preferenza su quali nominativi si desidera &amp;quot;minimizzare&amp;quot; o meno. La soluzione così ideata non risulta quindi adeguata.&lt;br /&gt;
&lt;br /&gt;
====Soluzione ibrida adottata====&lt;br /&gt;
Entrambe le tipologie di riconoscimento prima individuate hanno significativi problemi, si cerca quindi di sintetizzare una soluzione in grado di trarre i vantaggi dell'una e dell'altra. Risulta efficace, in particolare, che il documento venga inizialmente trattato tramite dizionari, evitando all'utente l'onere di specificare i nominativi, e che in seguito venga lasciata all'utente la possibilità di intervenire.&lt;br /&gt;
Infatti, esso potrebbe voler esprimere delle preferenze su quali nominativi debbano essere trattati tra quelli individuati e gestire gli eventuali errori di riconoscimento dovuti a richieste di trattamento di nominativi aventi un nome non presente nel dizionario o anche dovuti a casi di ambiguità lessicale già presentati.&lt;br /&gt;
&lt;br /&gt;
Una volta inserito il documento e terminata l'elaborazione tramite il dizionario, l'utente può sia richiedere l'immediato download del file ed effettuare le operazioni prima definite, attraverso un'opportuna interfaccia. Per fornire il supporto alle esigenze più disparate, si prevede la possibilità di:&lt;br /&gt;
# eseguire download del file trattato unicamente con il dizionario&lt;br /&gt;
# ripetere la &amp;quot;minimizzazione&amp;quot; del documento, specificando:&lt;br /&gt;
## nuovi nominativi&lt;br /&gt;
## quali nominativi tra quelli precedentemente individuati ''non'' si vogliono trattare&lt;br /&gt;
## quale parola/e dei nominativi individuati rappresenta il cognome (in tal caso, si possono utilizzare altri metodi, oltre alla sostituzione con pseudonimo, per il trattamento)&lt;br /&gt;
## quale parola/e dei nominativi individuati non compone il nominativo (situazione che si verifica quando ci si imbatte in una ambiguità).&lt;br /&gt;
&lt;br /&gt;
Senza soffermarsi in questo momento sull'intera sequenza concreta di interazioni tra utente e servizio, si osserva che l'unico vincolo non funzionale da valutare resta il tempo medio di attesa dell'utente. L'usabilità complessiva è molto buona ed i vincoli funzionali sono soddisfatti.&lt;br /&gt;
&lt;br /&gt;
===Scelta dei formati da trattare===&lt;br /&gt;
&lt;br /&gt;
Una considerazione intuitiva, ed una buona prassi, è che un documento contenente dati personali sia pseudonimizzato o anonimizzato quanto prima possibile e cioè quando è ancora solo nelle mani del suo autore: questo approccio scongiura che informazioni sensibili e dati personali in chiaro ''sfuggano'' in rete.&lt;br /&gt;
Si può per questo ragionevolmente ipotizzare che i naturali destinatari del servizio siano gli stessi autori (creatori) che redigono il documento. Nello scenario tipico di utilizzo, infatti, il fruitore del servizio procederà al trattamento dei dati non appena avrà finito di scrivere il documento del quale, essendone autore, potrà scegliere il formato. Si osserva che potrebbe accadere che il documento sia redatto da terzi: in tal caso l'utente che richiede il trattamento può scegliere il formato in maniera indiretta concordandolo con il redattore. Avendo quindi l'utente la possibilità di stabilire il formato del proprio documento, risulta ragionevole progettare un servizio che lavori su un solo formato.&lt;br /&gt;
A questo punto occorre individuare quale sia il formato che maggiormente si presta alle finalità del servizio.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Una possibilità è quella di richiedere all'utente di inserire come documento da trattare un semplice file di testo in formato ''txt'': in questo modo ci sarebbe il grande vantaggio di trattare file molto semplici, riducendo così al minimo la complessità realizzativa, e inoltre si avrebbe  l'indipendenza dagli editor di testo utilizzati, in quanto tutti supportano i file in formato ''txt''. &lt;br /&gt;
Risulta tuttavia sconveniente utilizzare questo formato, poiché non ha alcuna capacità espressiva per gestire elementi complessi come tabelle, modifiche allo stile del testo e così via. &lt;br /&gt;
Bisogna quindi optare per un formato in grado di gestire questi elementi, al costo di aumentare la complessità della progettazione, ricordando sempre che è necessario allo stesso tempo che tale formato sia supportato da tutti i principali editor di testo.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Con facilità è possibile individuare quali sono i formati di testo più comuni oltre al ''txt'': ''doc'', ''docx'', ''odt'', ''pdf'', ''pages'', ''rtf'', ''tex''. Si passa ora dunque a valutare quale tra questi formati potrebbe meglio soddisfare i requisiti prima enunciati. &lt;br /&gt;
Facendo una cernita iniziale sulla base delle finalità per le quali un formato è utilizzato, si può immediatamente escludere ''tex'', che trova impiego principalmente in ambito scientifico e matematico. In questo settore, infatti, non è richiesta generalmente l'applicazione delle procedura di trattamento dei dati. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt; &lt;br /&gt;
Si può inoltre abbandonare l'idea di trattare documenti con estensione ''pages'', formato proprietario di Apple, poiché utilizzati esclusivamente dall'omonimo editor di testo anch'esso proprietario, e i documenti con estensione ''rtf'', acronimo di ''Rich Text Format'', formato proprietario di Microsoft che supporta una formattazione avanzata, poiché, pur gestito da vari editor, è un formato decisamente datato (ultima versione 1.9.1 risalente a marzo 2008 ([0009])). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si esclude inoltre il formato ''pdf'' per motivi di usabilità: molti editor, infatti, consentono di esportare un documento in questo formato ma non permettono di importarlo. Un utente dopo aver effettuato l'anonimizzazione di un documento non può quindi proseguire modificandolo ulteriormente. Il ''Portable Document Format'', infatti, è ideato per realizzare dei documenti destinati alla sola lettura.&lt;br /&gt;
L'ultima esclusione, piuttosto immediata da effettuare, riguarda il formato ''doc'', binario e proprietario di Microsoft. Esso infatti risulta, a partire dal 2006, soppiantato dal formato ''docx'', sempre proprietario di Microsoft. &lt;br /&gt;
&lt;br /&gt;
Si giunge infine a valutare quale tra gli ultimi due possibili formati rimanenti, ossia ''docx'' e ''odt'', si presta meglio alle finalità del servizio. In via preliminare si osserva che entrambi i formati possiedono ottime capacità espressive, hanno una struttura interna di simile complessità e sono entrambi supportati dai principali editor di testo. È necessario quindi effettuare delle analisi più approfondite per poter sceglierne uno tra i due.&lt;br /&gt;
La struttura del formato ''docx'', sviluppato da Microsoft e formalmente denominato ''Office Open XML Document (OOXML Document)'', è costituita da un file compresso .zip contenente un insieme di file ''XML''. Il formato ''OOXML'' permette la rappresentazione, oltre che di documenti testuali, anche di fogli elettronici (formato ''OOXML 'Workbook'', noto anche come ''xslx'') e di presentazioni (formato ''OOXML Presentation'', noto anche come ''pptx'') ([0008], [0013]).&lt;br /&gt;
Il formato inoltre è stato inizialmente standardizzato nel 2006 dall'&amp;lt;i&amp;gt;ECMA&amp;lt;/i&amp;gt;  (come ''ECMA-376'') e successivamente nel 2008 dall'&amp;lt;i&amp;gt;ISO&amp;lt;/i&amp;gt; e dall'&amp;lt;i&amp;gt;IEC&amp;lt;/i&amp;gt; (come ''ISO/IEC 29500'') in una versione ''transitional'', retrocompatibile con alcune versioni precedenti del formato contenenti elementi deprecati, e in una versione ''strict'', dove tali elementi non sono ammessi. I due standard sono stati poi successivamente aggiornati e sono tutt'ora oggetto di revisioni ([0002]).&lt;br /&gt;
&lt;br /&gt;
Anche la struttura del formato open source ''odt'', sviluppato dall'&amp;lt;i&amp;gt;OASIS&amp;lt;/i&amp;gt; e formalmente denominato ''OpenDocument Text'', è basata su uno zip contenente un insieme di file ''XML''. Inoltre, il formato ''OpenDocument Format (ODF)'' permette di trattare fogli elettronici (formato ''OpenDocument Spreadsheet'', noto anche come ''ods'') e presentazioni (formato ''OpenDocument Presentation'', noto anche come ''odp'') ([0007]). Anche ''OpenDocument Text'' è stato standardizzato, in particolare dall'&amp;lt;i&amp;gt;OASIS&amp;lt;/i&amp;gt; stesso nel 2005 e dall'&amp;lt;i&amp;gt;ISO/IEC&amp;lt;/i&amp;gt; nel 2006, ed è soggetto a revisioni e aggiornamenti ([0003]).&lt;br /&gt;
&lt;br /&gt;
In sintesi, basandosi sulla struttura dei documenti e sulla standardizzazione dei formati, non è ancora possibile individuare quale sia il formato migliore. L'unico elemento che potrebbe portare punti a favore del formato ''odt'' è che esso, a differenza del formato ''docx'', è aperto, tuttavia, essendo le specifiche di entrambi i formati pubbliche, ciò non rappresenta un fattore determinante nell'elezione del formato.&lt;br /&gt;
Entrambi i formati, inoltre, sono largamente supportati dai word processors.&lt;br /&gt;
&lt;br /&gt;
Le seguenti tabelle riepilogano il supporto all'uno ed all'altro formato dei ''word-processors'' più usati, ossia ''Microsoft Office Word'', ''LibreOffice Writer'', ''OpenOffice Writer'' e ''Pages''. &lt;br /&gt;
Le tabelle sono tratte da wikipedia ([0000], [0001], [0006]). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;i&amp;gt;Supporto fornito dagli editor di testo al formato docx&amp;lt;/i&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  !! Microsoft Office Word !! LibreOffice Writer !! OpenOffice Writer !! Pages&lt;br /&gt;
|-&lt;br /&gt;
! Version&lt;br /&gt;
|| 2013, 2011 for Mac || All versions || 3.0 || '08&lt;br /&gt;
|-&lt;br /&gt;
! Operating systems&lt;br /&gt;
|| Windows, Mac OS X || Windows, OS X, Linux, Unix, Android || Windows, Linux, Unix, Mac OS X || Mac OS X&lt;br /&gt;
|-&lt;br /&gt;
! Office suite&lt;br /&gt;
|| Microsoft Office ||  || OpenOffice.org || iWork&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
|| Microsoft || The Document Foundation || Apache OpenOffice || Apple Inc.&lt;br /&gt;
|-&lt;br /&gt;
! License&lt;br /&gt;
|| proprietary || MPL || LGPL || proprietary&lt;br /&gt;
|-&lt;br /&gt;
! ECMA-376&lt;br /&gt;
|| yes || yes || yes || yes&lt;br /&gt;
|-&lt;br /&gt;
! ISO/IEC 29500:2008&lt;br /&gt;
|| yes || yes || || &lt;br /&gt;
|-&lt;br /&gt;
! Notes&lt;br /&gt;
||  ||  || Import only ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;i&amp;gt;Supporto fornito dagli editor di testo al formato odt&amp;lt;/i&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  !! Microsoft Office Word !! LibreOffice Writer !! OpenOffice Writer &lt;br /&gt;
|-&lt;br /&gt;
! Version&lt;br /&gt;
|| 2007 SP2 || 4.0.3 || 3.0.0&lt;br /&gt;
|-&lt;br /&gt;
! Operating systems&lt;br /&gt;
|| Windows || Unix-based systems, Mac OS X, Solaris || Windows, Linux, Unix-based systems, Mac OS X, Solaris&lt;br /&gt;
|-&lt;br /&gt;
! Office suite&lt;br /&gt;
|| Microsoft Office ||  || OpenOffice.org&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
|| Microsoft || The Document Foundation || Apache OpenOffice&lt;br /&gt;
|-&lt;br /&gt;
! License&lt;br /&gt;
|| Proprietary || MPL || LGPL&lt;br /&gt;
|-&lt;br /&gt;
! ISO/IEC 26300:2006&lt;br /&gt;
|| yes || yes || yes&lt;br /&gt;
|-&lt;br /&gt;
! Notes&lt;br /&gt;
|| some limitations || Multiple ODF versions supported (ISO/ODF 1.0/1.1/1.2/1.2 Extended) || adjustable ODF version (ISO/ODF 1.2) &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si possono effettuare le seguenti osservazioni:&lt;br /&gt;
* ''Microsoft Office Word'' è, in ambiente Microsoft, il word processor maggiormente usato; è molto usato anche in ambiente Apple Mac. Esso offre il pieno supporto al formato ''OOXML Document''; solo parzialmente invece gestisce il formato ''OpenDocument Text'': il processamento di file con estensione ''odt'' con questo editor comporta la perdita di alcune informazioni secondarie.&lt;br /&gt;
* ''LibreOffice Writer'', l'editor open source maggiormente utilizzato, supporta pienamente entrambi formati. Nato con lo scopo di gestire i file con formato ''OpenDocument Text'', attualmente supporta completamente anche il formato ''OOXML Document''. &lt;br /&gt;
* ''OpenOffice Writer'', un altro degli editor di testo tra i più utilizzati, supporta pienamente ''odt'', mentre è solo in grado di importare i file con estensione ''docx''.&lt;br /&gt;
* ''Pages'', il word process installato a default sui Mac della Apple e, di conseguenza anche maggiormente usato su questi dispositivi, non offre supporto al formato ''odt'', ma elabora correttamente i documenti con estensione ''docx'' ([0005],[0004]). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Queste osservazioni evidenziano che quindi è impossibile adottare un formato supportato da tutti gli editor; la scelta va allora indirizzata verso quello maggiormente supportato dai word processor più popolari.&lt;br /&gt;
Per avere un'indicazione di ''popolarità'', e quindi per poter comprendere meglio quali tra gli editor prima citati siano i più usati, si può fare un'analisi, tramite motori di ricerca, di quanti file con una certa estensione siano presenti in rete.&lt;br /&gt;
È possibile, ad esempio, ricercare su Google i file che contengono nel proprio nome una determinata sequenza di caratteri o aventi una certa estensione (''filetype''). Sono qui presentati i risultati delle interrogazioni riguardo ai file aventi formato ''docx'', ''doc'' e ''odt'' ed il cui nome contiene uno dei caratteri, fra i più frequenti, &amp;quot;1&amp;quot; o &amp;quot;a&amp;quot; o &amp;quot;e&amp;quot;. L'investigazione è stata effettuata inserendo nella barra di ricerca di Google le stringhe ''1 filetype:docx'', ''a filetype:docx'' e così via.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Formato cercato !! Documenti con &amp;quot;1&amp;quot; nel nome !! Documenti con &amp;quot;a&amp;quot; nel nome !! Documenti con &amp;quot;e&amp;quot; nel nome&lt;br /&gt;
|-&lt;br /&gt;
| docx || 16.900.000  || 12.800.000 || 8.730.000&lt;br /&gt;
|-&lt;br /&gt;
| odt || 736.000 || 667.000 || 507.000&lt;br /&gt;
|-&lt;br /&gt;
| doc || 32.300.000 || 26.300.000 || 21.500.000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Effettivamente il formato più diffuso è il ''doc''; tuttavia esso è supportato per retro-compatibilità anche dagli editor che supportano formati ''OOXML'', con i quali non si ha difficoltà nel convertire i documenti dal formato ''doc'' al ''docx''. In conclusione, quale che sia l'editor più diffuso, è ragionevole adottare il formato ''OOXML Document'' per le finalità del servizio, in quanto molto diffuso, ben supportato dagli editor e avente ottime capacità espressive. Di conseguenza i documenti che saranno elaborati dovranno essere forniti dall'utente in tale formato. In successive sezioni verrà approfondita la struttura dei documenti ''OOXML''.&lt;br /&gt;
&lt;br /&gt;
===Privacy by design===&lt;br /&gt;
&lt;br /&gt;
L'Art. 25 del ''GDPR'', con i Considerando 75 e 78, ha per titolo e per oggetto la &amp;quot;protezione dei dati fin dalla progettazione e protezione per impostazione predefinita&amp;quot; ([0035]), perfettamente in linea con i concetti di &amp;quot;minimizzazione&amp;quot;, già richiamati.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Il senso dell'Art. 25 viene spesso sintetizzato con l'espressione &amp;quot;''PbD - privacy by design, privacy by default''&amp;quot; ([0035]). Il principio fissato nell'Art. 25 dovrà sempre più essere tenuto ben presente nell'ambito dell'ingegneria del software, in quanto impone di adottare nuove cautele nella realizzazione delle applicazioni software.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Del principio ''PbD'' si è ben tenuto conto nella progettazione descritta in questa tesi. In particolare, relativamente alla ''privacy by design'', si è fatto in modo che nessun dato personale permanga registrato sul sistema di esecuzione, o altrove, al termine dell'applicazione. Anche laddove l'applicazione termini in modo anomale non vi sono strutture dati superstiti, che restano memorizzate sul sistema.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Marginale in questa tesi è la nozione di ''privacy by default'', giacché l'applicazione non offre all'utente alcuna opzione che possa indurlo in errore ed acconsentire a trattamenti dei dati personali, oltre quello realizzato dall'applicazione.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
È utile osservare quanto sia importante esprimere queste impostazioni di progettazione fra le condizioni d'uso presentate all'utente: esse costituiscono uno dei presupposti affinché l'utente abbia piena fiducia (''trust'') nel servizio, lo utilizzi, lo divulghi, lo renda un servizio di successo.&lt;br /&gt;
&lt;br /&gt;
==Architettura del servizio== &lt;br /&gt;
&lt;br /&gt;
===I componenti software nell'architettura LAMP===&lt;br /&gt;
&lt;br /&gt;
Il servizio è realizzato in forma di ''web-based application'' poiché, come già illustrato nell'introduzione, si intende renderlo disponibile per il massimo numero di utenti possibili. Nella progettazione e realizzazione dell'architettura web si adotta la piattaforma ''LAMP'', il cui nome deriva dall'acronimo dei componenti open source che la realizzano (il sistema operativo Linux, il server HTTP Apache, il sistema per la gestione di database relazionali MySQL ed il linguaggio di programmazione PHP). Poichè il modello è composto da quattro livelli, spesso si parla anche di ''stack LAMP''. Uno degli elementi di forza del modello ''LAMP'' è che i componenti dei vari ''layer'' sono sostituibili, a seconda delle esigenze, con dei componenti più adatti, tipicamente open source ([0015], [0018], [0019]). Basando la piattaforma su un sistema operativo della famiglia di Microsoft Windows, ad esempio, si ottiene uno ''stack WAMP'', mentre se si usa un sistema operativo Mac OS si realizza uno ''stack MAMP''. Un'architettura web basata sul modello ''LAMP'' può, inoltre, essere integrata con software open source che offre utili funzionalità, come, ad esempio, il monitoraggio (''Nagios''), il load balancing (''Linux Virtual Server''), la rilevazione di accessi illeciti (''Snort'') e il security testing (''netsniff-ng''). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si valutano ora brevemente la diffusione dei componenti tradizionali dello ''stack LAMP'' e le alternative maggiormente usate per i vari ''layer''.&lt;br /&gt;
Le distribuzioni Linux risultano essere la scelta più comune per l'ultimo ''layer'' dello ''stack''. Secondo W3Techs, infatti, nell'ottobre del 2013, il 58.5% dei web server a livello globale avevano come sistema operativo la distribuzione Debian o Ubuntu, mentre il 37.3% una tra RHEL, Fedora e CentOS([0016]). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Tra i web server, Apache risulta essere maggiormente usato. Secondo le stime fatte da Netcraft, a giugno del 2014 circa il 51.9% del milione di siti web più trafficati al mondo usavano un web server Apache, il 19.2% nginx ed il 12.4% Microsoft ([0017]). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
I principali ''DBMS'' relazionali, oltre a MySQL, che possono essere presenti nello ''stack LAMP'' sono MariaDB e PostgreSQL, mentre tra i ''DBMS NoSQL'' MongoDB risulta essere il più comune. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Nello stack, infine, il ruolo di linguaggio di programmazione, solitamente svolto dal linguaggio PHP, spesso è ricoperto dai linguaggi Perl o Python. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva, ad ogni modo, che le informazioni sulla diffusione delle tecnologie non rappresentano un fattore vincolante nella scelta delle stesse, in quanto la piattaforma ''LAMP'' è anche aperta verso molti altri componenti oltre quelli citati; di conseguenza la scelta delle tecnologie da impiegare può essere effettuata basandosi principalmente sui requisiti e sulle specifiche del servizio. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Principi di progettazione per l'architettura===&lt;br /&gt;
&lt;br /&gt;
====Single Responsibility Principle====&lt;br /&gt;
&lt;br /&gt;
Per rendere il servizio maggiormente manutenibile ed estensibile, si presta particolare attenzione al rispetto del ''Single Responsibility Principle'' (''SRP'') ([0020]). Si cerca, quindi, di fattorizzare il software in più moduli, suddividendo tra questi le elaborazioni da svolgere. Un altro importante beneficio che si ottiene dalla fattorizzazione del codice è la riusabilità dei componenti. Ogni singolo modulo, infatti, svolge il proprio compito in maniera indipendente dal resto della applicazione ed è, quindi, riutilizzabile in altri scenari simili senza dover essere re-implementato. Inquadrando meglio questa metodologia di progettazione con i requisiti del servizio e la piattaforma web ''LAMP'', si individuano i due principali compiti a carico dell'applicazione:&lt;br /&gt;
* La gestione dell'interazione web con l'utente per la trasmissione del documento e dei nominativi da trattare&lt;br /&gt;
* Il processamento del documento per effettuare la &amp;quot;minimizzazione&amp;quot; dei dati.&lt;br /&gt;
Questi due differenti ''task'' saranno, quindi, portate a termine da componenti diversi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Progettando la struttura dell'applicazione in questo modo, si disaccoppia completamente la logica di business del servizio dalle interfacce web di comunicazione con l'utente. In un futuro sviluppo sarà possibile, quindi, realizzare nuove interfacce utilizzando altre tecnologie senza dover modificare la logica applicativa. &lt;br /&gt;
&lt;br /&gt;
====Dependency Inversion Principle====&lt;br /&gt;
&lt;br /&gt;
Un altro principio di design architetturale che risulta importante nella progettazione è il ''Dependency Inversion Principle'' (''DIP'') ([0038]). Esso si traduce nella realizzazione di componenti che non dipendono dalle specifiche implementazioni degli altri moduli del sistema, bensì dalle loro ''astrazioni''. &lt;br /&gt;
In relazione all'estensibilità e manutenibilità del prodotto software, infatti, l'impiego di moduli dipendenti direttamente dalla definizione dei metodi presenti in altri componenti risulta problematica: il modulo dipendente deve essere re-implementato ad ogni variazione del modulo da cui dipende.&lt;br /&gt;
Nella programmazione orientata agli oggetti, per rispettare questo principio, si su può fare uso di classi astratte o interfacce, costrutti che definiscono i moduli senza implementarli completamente o senza implementarli affatto.  &lt;br /&gt;
&lt;br /&gt;
===Stile architetturale REST=== &lt;br /&gt;
&lt;br /&gt;
Il modello architetturale del servizio che si sta definendo presenta una serie di caratteristiche, come ad esempio l'indipendenza dei moduli, che permettono di realizzarlo secondo il paradigma delle ''RESTful API''. L'espressione &amp;quot;Representational State Transfer&amp;quot; e il suo acronimo &amp;quot;REST&amp;quot; furono introdotti nel 2000 nella tesi di dottorato di Roy Fielding ([0021]), uno dei principali autori delle specifiche dell'Hypertext Transfer Protocol (HTTP). Roy Fielding descrive il ''Representational State Transfer'' come uno stile architetturale (&amp;quot;''architectural style''&amp;quot;), ovvero un'astrazione degli elementi di un'architettura all'interno di un sistema hypermedia distribuito. ''REST'' non specifica i dettagli dell'implementazione dei componenti e della sintassi del protocollo, ma definisce i ruoli dei componenti, i vincoli sulla loro modalità di interazione e la loro interpretazione.&lt;br /&gt;
Riassumiamo quindi i principi che deve rispettare una architettura ''REST'':&lt;br /&gt;
# Architettura Client-Server &amp;lt;br/&amp;gt;In una architettura ''REST'' viene data particolare importanza ai principi ''SRP'' e ''DIP'' prima citati, più generale si può affermare che l'architettura sposi il paradigma noto con il termine di &amp;quot;''Separation of Concerns''&amp;quot;. Una ''Restful API'' applica questi principi in un architettura Client-Server, capace di supportare l'evoluzione indipendente della logica lato client e della logica lato server.&lt;br /&gt;
# Stateless &amp;lt;br/&amp;gt;La comunicazione tra utente e fornitore del servizio deve essere senza stato, quindi ogni richiesta del client deve contenere tutte le informazioni di cui il fornitore necessita per l'erogazione del servizio offerto. Questa ipotesi viene fatta per rendere una ''Restful API'' facilmente scalabile orizzontalmente.&lt;br /&gt;
# Uso della cache &amp;lt;br/&amp;gt;In un Architettura ''REST'' i messaggi di risposta inviati dal server devono esplicitamente indicare se possono essere memorizzati nella cache del client o di componenti middleware per il riutilizzo nelle richieste successive.&lt;br /&gt;
# Interfaccia uniforme &amp;lt;br/&amp;gt;I componenti devono essere in grado di comunicare attraverso un'interfaccia uniforme e le risorse devono essere trasferite in un formato standard. Inoltre l'utente deve poter effettuare la navigazione tra le risorse di suo interesse tramite collegamenti ipertestuali. Per inciso, si osserva che il protocollo HTTP usato correttamente rispetta i requisiti di un architettura ''REST'' e che nelle implementazioni delle ''RESTful API'' il formato più usato per la modellazione dei dati è JSON.&lt;br /&gt;
# Layered System &amp;lt;br/&amp;gt;In un sistema a livelli, componenti intermedi (come i proxy) possono essere collocati tra client e server per intercettare il traffico per scopi specifici; ad esempio il caching o la sicurezza. Una soluzione basata su ''REST'' può essere composta da più livelli architettonici, indipendenti l'uno dall'altro.&lt;br /&gt;
# Code on Demand &amp;lt;br/&amp;gt;Questo vincolo facoltativo è inteso principalmente a consentire aggiornamenti alla logica all'interno dei client (come i browser Web) indipendentemente dalla logica lato server. Una ''single page application'', ad esempio, rispetta in pieno questo punto.&lt;br /&gt;
&lt;br /&gt;
Un'applicazione progettata sul modello dell'architettura ''REST'' ha quindi gli indiscutibili vantaggi di:&lt;br /&gt;
* consentire l'evoluzione indipendente delle diverse componenti &lt;br /&gt;
* avere un'interfaccia utente portabile con altri tipi di piattaforme&lt;br /&gt;
* permettere agevolmente la replicazione delle macchine server&lt;br /&gt;
* non vincolare moduli server e client a linguaggi e tecnologie specifiche.&lt;br /&gt;
&lt;br /&gt;
L'architettura del servizio oggetto di questa tesi si trova già perfettamente in linea con alcuni dei vincoli discussi, ma sono necessarie alcune considerazioni. Il punto 1 (&amp;quot;architettura Client-Server&amp;quot;) è chiaramente soddisfatto. &lt;br /&gt;
Il punto 2 (&amp;quot;Stateless&amp;quot;), direttamente collegato con i punti 3 e 5 (&amp;quot;Uso della cache&amp;quot;, &amp;quot;Layered System&amp;quot;), può essere rispettato con facilità; a ogni richiesta di &amp;quot;minimizzazione&amp;quot; del client corrisponde la restituzione del documento trattato dal server, non c'è quindi necessita di avere uno stato nell'interazione. &lt;br /&gt;
&lt;br /&gt;
Analizzando le caratteristiche di una applicazione stateless in relazione al principio ''privacy by design'' illustrato in precedenza, si osserva che l'assenza di stato determina la semplificazione delle problematiche critiche relative al principio. Non vengono conservate, infatti, informazioni contenenti dati sensibili, poiché dopo aver effettuato l'invio della risposta, sarà subito eliminato sul server il file elaborato.&lt;br /&gt;
&lt;br /&gt;
Nei capitoli precedenti tuttavia si è detto che l'utente può ripetere più volte il trattamento di uno stesso documento nella stessa sessione di interazione; essendo il vincolo dell'efficienza già difficile da rispettare per via dell'elaborazione onerosa del documento, si può progettare una modalità alternativa del funzionamento con stato del servizio, applicabile in assenza di replicazione delle macchine server e sfruttando le ripetute richieste di trattamento per uno stesso documento. &lt;br /&gt;
Si può infatti memorizzare lato server il documento inviato dal client inizialmente e, alle successive richieste di trattamento del medesimo documento, evitarne la ritrasmissione da client a server. Per rispettare il ''PbD'', al termine della sessione di interazione il documento verrà rimosso dal server. Si nota, inoltre, che per predisporre il servizio alla gestione delle due diverse modalità di funzionamento si può utilizzare un parametro di configurazione a livello applicativo.&lt;br /&gt;
I punti 4 e 6 infine (&amp;quot;Interfaccia uniforme&amp;quot;, &amp;quot;Code on Demand&amp;quot;) si possono rispettare utilizzando il formato JSON per la trasmissione dei documenti e dei nominativi, e usando localmente sul client Javascript per offrire tutte le funzionalità del servizio in un'unica pagina html.&lt;br /&gt;
&lt;br /&gt;
===Moduli software del servizio===&lt;br /&gt;
&lt;br /&gt;
====Scelta dei componenti software====&lt;br /&gt;
&lt;br /&gt;
Si opera ora la scelta delle tecnologie da utilizzare per i componenti dei 4 layer dello ''stack LAMP''. Per i due layer inferiori risulta piuttosto immediato decidere di usare le tecnologie presenti per default. Un sistema operativo Linux ed un web server Apache sono adatti all'architettura del servizio.&lt;br /&gt;
Inoltre anche il linguaggio di programmazione PHP può essere usato senza significativi problemi, anche se verranno fatte in seguito, in una sezione di questo capitolo, alcune considerazioni sulle problematiche di esecuzioni concorrenti di script PHP. Il linguaggio sarà impiegato in particolare per la realizzazione della logica necessaria a gestire l'interazione web con il cliente, mentre l'elaborazione del documento OOXML lato server sarà effettuata da un programma Java. &lt;br /&gt;
&lt;br /&gt;
I due ''task'' principali del servizio sono delegati, quindi, a due programmi distinti realizzati con tecnologie diverse. Si concretizza in questo modo il principio ''SRP'' e, sfruttando l'&amp;lt;i&amp;gt;openness&amp;lt;/i&amp;gt; della piattaforma LAMP, le funzionalità necessarie vengono realizzate attraverso i linguaggi più adatti.&lt;br /&gt;
La scelta del linguaggio Java per l'implementazione del ''main core'' della logica di business è dovuta alla libreria open source in ambiente java Docx4j ([40],[41]). Questa libreria è realizzata per il processamento delle tre tipologie di formati OOXML (''docx'', ''xslx'', ''pptx'') e permette tutte le possibili operazioni di creazione, lettura e modifica su questo tipo di documenti. Anche questa libreria sarà approfondita in sezioni successive. Si osserva, per inciso, che esistono altre librerie equivalenti in ambiente .NET. &lt;br /&gt;
&lt;br /&gt;
Nella scelta del linguaggio di programmazione usato per elaborare i documenti ed effettuare i confronti tramite ''regular expressions'', un dato non di poco conto da considerare è l'encoding delle stringhe. In Java, in particolare, una stringa è rappresentata internamente come un array di char, ognuno codificato da 2 byte in formato UTF-16 ([0042]); la codifica esprime in 16 bit tutti i caratteri definiti dallo standard Unicode, quindi è possibile scegliere Java.&lt;br /&gt;
&lt;br /&gt;
Per il ''layer'' della persistenza, infine, l'impiego di un database MySql risulta una buona scelta. Si osserva che questo livello non verrà utilizzato nella tradizionale maniera prevista dallo ''stack LAMP''. Infatti, generalmente, la base di dati viene interrogata direttamente dal componente che si occupa dell'interazione con l'utente (PHP) per il reperimento delle informazioni utili da restituire al client; nel servizio, invece, la base di dati sarà a supporto unicamente del programma Java, poiché gli unici dati persistenti da gestire sono i nomi del dizionario (si ricordi sempre il ''PbD'') e solo i moduli dell'eseguibile Java devono utilizzarli. Se il dizionario contenessero unicamente i nomi (senza informazioni accessorie correlate) e fossero usati in sola lettura, un semplice file di testo poteva essere sufficiente per la rappresentazione. Tuttavia, poiché saranno individuate tecniche di ottimizzazione nell'impiego dei dizionari che richiedono operazioni di scrittura e ordinamento dei dati, risulta opportuno usare un database relazionale.&lt;br /&gt;
&lt;br /&gt;
====Logica di business e dinamiche di interazione====&lt;br /&gt;
&lt;br /&gt;
Vengono presentati in questa sezione gli aspetti principali dei funzionamenti dei moduli del servizio. Per mettere bene a fuoco quali siano le meccaniche di interazione e i flussi di esecuzione dei programmi, si propone il diagramma di sequenza del tipico scenario di utilizzo. In questo schema UML si descrive il caso d'uso dove un utente, dopo aver inserito un documento ed averlo ricevuto &amp;quot;minimizzato&amp;quot;, esprime delle preferenze e richiede poi un secondo trattamento.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F00])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si descrivono quindi ora le principali operazioni che vengono eseguite.&lt;br /&gt;
All'avvio dell'interazione viene presentata una pagina PHP di benvenuto contenente le informazioni su come i dati personali vengano elaborati ed un ''file-picker'' per consentire l'upload di un documento ''OOXML''; nel momento in cui l'utente confermerà il caricamento del documento, esso verrà trasferito sul server. &lt;br /&gt;
Bisogna prestare particolare attenzione al comportamento del sistema nel caso in cui più utenti richiedano contemporaneamente l'esecuzione del servizio, e cioè alle problematiche di esecuzioni concorrenti di script PHP; è necessario, in particolare, evitare situazioni in cui i nomi dei file inviati dagli utenti siano in conflitto. Analizzando più in dettaglio il problema, ogniqualvolta un web server Apache riceve una richiesta HTTP per una pagina PHP, si ha la generazione di un nuovo processo che esegue il codice presentato nella pagina PHP richiesta. Supponendo quindi che N utenti eseguano l'invio del file contemporaneamente, si avrebbe che sul server N processi diversi dovrebbero procedere con la scrittura di un file. Ovviamente se due o più file condividono il nome almeno uno di essi sarà sovrascritto. Per risolvere questo problema, supponendo di voler salvare tutti i documenti in una cartella temporanea, occorre modificare il filename dei documenti inviati dagli utenti per esser certi di non incorrere in sovrascritture o altri tipi di errori correlati.&lt;br /&gt;
Una valida possibilità è l'inserimento di un ''prefisso'' univoco nel filename. Per la generazione di una stringa univoca da anteporre al filename, che permetta di distinguere file caricati da utenti diversi, si può direttamente usare il ''session id'' dell'utente. In PHP esso è determinato casualmente combinando ([0043]): l'IP del cliente, orario di attribuzione dell'id, un numero pseudo-casuale (con il ''PHP Linear Congruence Generator'') e, se presente un &amp;quot;''random source''&amp;quot; sul sistema operativo del Client (spesso chiamato impropriamente &amp;quot;''seme''&amp;quot;), un ulteriore numero pseudo-casuale.&lt;br /&gt;
Per introdurre ulteriore alea, necessaria se, ad esempio, un utente tenti l'upload di file omonimi (con contenuto interno diverso) e mantenga il medesimo ''session id'', si utilizza un ulteriore generatore pseudo-casuale per produrre un altro numero con cui comporre il prefisso.&lt;br /&gt;
Concatenando i due numeri generati si ha praticamente certezza di aver individuato un numero univoco nel sistema per il tempo in cui il servizio sarà erogato al cliente.&lt;br /&gt;
&lt;br /&gt;
Una volta memorizzato il file, lo script PHP dovrà ricorrere all'invocazione del modulo Java, delegato al vero e proprio processamento del documento. Occorre quindi individuare un set di opzioni che consenta al modulo che gestisce l'interazione con il cliente di sfruttare al meglio il componente delegato all'elaborazione del documento, in qualunque circostanza; la totale indipendenza dei moduli, la loro sostituibilità e la replicazione possibile di macchine server sono solo alcuni dei fattori che rendono mutevole la configurazione del sistema. Va definito un protocollo di comunicazione, quindi, che astragga completamente dall'implementazione dei moduli o dalla locazione dei file.&lt;br /&gt;
&lt;br /&gt;
Valutando i possibili flussi logici, anche con l'ausilio del diagramma di sequenza, si ha che i tipi di esecuzione sono due:&lt;br /&gt;
* &amp;quot;minimizzazione&amp;quot; con dizionario&lt;br /&gt;
* &amp;quot;minimizzazione&amp;quot; di specifici nominativi&lt;br /&gt;
Il protocollo di comunicazione tra i due moduli è costituito in entrambi i casi di una singola richiesta a cui segue una singola risposta. Più in particolare, lo script PHP invoca il comando Java esprimendo obbligatoriamente il path del file da trattare e opzionalmente l'elenco dei nominativi. A suo volta, il modulo Java restituisce i nominativi trovati, qualora non espressamente richiesti dallo script, e segnala la corretta terminazione dell'elaborazione.&lt;br /&gt;
Si definiscono come canali di comunicazione standard del protocollo gli argomenti presi in input dal modulo di processamento del documento e lo standard output del processo che esegue tale programma. Inoltre è importante definire un formato standard per la comunicazione dei nominativi tra moduli; è necessario quindi scegliere un pattern che permetta di determinare univocamente la composizione dei nominativi. Un possibile formato, espresso tramite ''regex'', è il seguente:&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt; &amp;lt;nominativo&amp;gt; = ^(&amp;lt;nome&amp;gt;:)*&amp;lt;nome&amp;gt;;&amp;lt;cognome&amp;gt;$&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt; &amp;lt;nominativi&amp;gt; = ^(&amp;lt;nominativo&amp;gt;\s+)+$&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Dove nome e cognome sono una sequenza di caratteri Unicode come già discusso. Ulteriori opzioni importanti da definire nel protocollo per l'invocazione del programma che si occupa delle funzionalità di elaborazione sono le seguenti:&lt;br /&gt;
* path file da elaborare (opzione &amp;quot;-i &amp;lt;file_path&amp;gt;&amp;quot;, obbligatoria)&lt;br /&gt;
* path con cui salvare il file elaborato (opzione &amp;quot;-o &amp;lt;file_path&amp;gt;&amp;quot;, opzionale: per default viene creato un nuovo file automaticamente)&lt;br /&gt;
* abilitazione stampe verbose, da usare solo in fase di debug (opzione &amp;quot;-d&amp;quot;, opzionale)&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Una volta terminato il processamento, il modulo di gestione dell'interazione con l'utente dovrà accertarsi che l'&amp;lt;i&amp;gt;exit status&amp;lt;/i&amp;gt; sia 0 e leggere dallo standard output del processo appena terminato, qualora si sia stata eseguita la &amp;quot;minimizzazione&amp;quot; con dizionario, l'elenco dei nominativi trovati. Se invece la &amp;quot;minimimizzazione&amp;quot; ha avuto luogo con i nominativi già specificati non sarà scritto nulla sullo standard output.&lt;br /&gt;
A margine si osserva che l'impiego dell'opzione &amp;quot;-d&amp;quot; deve sempre consentire una semplice individuazione dei nominativi trovati; in particolare, se tale opzione è specificata, nello standard output i nominativi compariranno con un ''header'' riconoscibile (&amp;quot;''NOMINATIVO=''&amp;quot;).&lt;br /&gt;
Ritornando alla descrizione del flusso di esecuzione tipo, una volta che il modulo Java ha completato il trattamento del documento, lo script PHP ne effettuerà l'upload sul client e presenterà all'utente le opzioni già descritte nel capitolo sull'usabilità. &lt;br /&gt;
A questo punto l'interazione con client potrebbe concludersi, qualora si eseguisse il download e si chiudesse il browser, o continuare elaborando i ''suggerimenti'' dell'utente espressi dopo il primo trattamento. Le modalità di comunicazione dei moduli varierebbero leggermente come appena illustrato, mentre, a seconda della configurazione stateful o stateless del servizio, verrebbe eseguito o meno un nuovo upload del file dal client al server.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si osserva infine che, per predisporre a successivi studi di ottimizzazione il servizio e per agevolare tutti i possibili sviluppi futuri, si applica largamente nella progettazione del modulo di elaborazione Java il ''Dependency Inversion Principle'', in quanto si desidera realizzare classi estendibili ed intercambiabili.&lt;br /&gt;
In particolare, si introducono delle classi astratte per rappresentare in maniera generica il concetto di &amp;quot;''persona''&amp;quot; e &amp;quot;''minimizzatore''&amp;quot;. È possibile infatti realizzare successivi studi per trattare ulteriori dati personali oltre che ai nomi e cognomi; inoltre, in base ai tipi di documenti trattati o eventuali altri fattori utili, è possibile studiare differenti tecniche di &amp;quot;minimizzazione&amp;quot; realizzate da differenti algoritmi &amp;quot;''minimizzatori''&amp;quot;.&lt;br /&gt;
In particolare una &amp;quot;''persona''&amp;quot; dovrà sempre esporre un metodo &amp;quot;''minimizza''&amp;quot; che prende in input una stringa, la &amp;quot;minimizza&amp;quot; e la restituisce; il pattern con il quale si effettua la &amp;quot;minimizzazione&amp;quot; sarà fornito in implementazione a seconda dei dati sensibili di interesse.&lt;br /&gt;
Un &amp;quot;''minimizzatore''&amp;quot; esporrà sempre un metodo &amp;quot;''work''&amp;quot; che, presa in input una lista di persone ed un documento ''OXML'', con l'ausilio della libreria Docx4j, fornirà in output un documento del tutto &amp;quot;minimizzato&amp;quot;; la definizione delle modalità con cui si estrapolano le informazioni dal documento e con cui si invoca il metodo &amp;quot;''minimizza''&amp;quot; della classe persona sono confinate nell'implementazione.&lt;br /&gt;
Definendo delle classi astratte risulta, quindi, più veloce la realizzazione dei futuri componenti e si svincola il processo di &amp;quot;minimizzazione&amp;quot; dal tipo di dati che si &amp;quot;minimizzano&amp;quot; e viceversa.&lt;br /&gt;
&lt;br /&gt;
====Le classi principali del progetto====&lt;br /&gt;
Le classi principali del progetto vengono quindi presentate in appendice. Esse sono:&lt;br /&gt;
* App.java, contenente il main&lt;br /&gt;
* Elaborator.java, che presenta il metodo &amp;quot;''work''&amp;quot;&lt;br /&gt;
* Persona.java, che presenta il metodo &amp;quot;''minimizza''&amp;quot;&lt;br /&gt;
* Testing.java, contenente alcune funzioni usate in fase di debug.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gli script in PHP sono stati forniti dall'azienda come implementazione minimale e provvisoria, da perfezionare a seguito della eventuale definizione sulle modalità di presentazione del servizio su Internet.&lt;br /&gt;
&lt;br /&gt;
Una considerazione di implementazione comune a tutte le classi deriva del principio ''Privacy by Design'', indifferentemente dalla modalità di configurazione stateful o stateless del servizio: è di fondamentale importanza che nel sistema non siano memorizzati permanentemente in alcun caso i documenti inviati dagli utenti del servizio. &lt;br /&gt;
Per realizzare un sistema robusto, per fronteggiare crash improvvisi del client o congestioni della rete, è opportuno impostare dei timeout lato server che procedano automaticamente alla eliminazione dei documenti degli utenti dopo un periodo di inattività troppo prolungato. Qualora invece si dovesse verificare un interruzione critica del servizio a causa di un errore logico del server o semplicemente per via di un'interruzione dell'alimentazione della macchina server, bisogna considerare altri metodi; essendo il servizio realizzato con un sistema operativo Linux, si può configurare il demone ''crond'' per eseguire a ogni reboot e, per sicurezza, una volta al giorno l'eliminazione dei file usati dall'applicazione tutti contenuti all'interno della cartella temporanea.&lt;br /&gt;
&lt;br /&gt;
==Approfondimenti tecnologici==&lt;br /&gt;
&lt;br /&gt;
===Analisi della struttura del formato OOXML===&lt;br /&gt;
&lt;br /&gt;
Come argomentato, il formato dei documenti elaborati dal servizio progettato dovrà essere ''Office Open XML'', o ''OOXML''; si tratta di un formato ''XML-based'' per documenti di testo, fogli elettronici e presentazioni, in grado di rappresentare grafici, diagrammi, immagini e altro materiale grafico. La specifica fu sviluppata da Microsoft e adottata dall'&amp;lt;i&amp;gt;ECMA International&amp;lt;/i&amp;gt; come standard ''ECMA-376'' nel 2006. Una seconda versione fu rilasciata nel 2008, una terza nel 2011, una quarta nel 2012 ed una quinta tra il 2015 ed il 2016 ([0010]). La specifica è stata adottata, inoltre dall'&amp;lt;i&amp;gt;ISO&amp;lt;/i&amp;gt; e dall'&amp;lt;i&amp;gt;IEC&amp;lt;/i&amp;gt; come standard ''ISO/IEC 29500'' a partire dal 2008 ([0011], [0012]).&lt;br /&gt;
&lt;br /&gt;
====Linguaggi di markup====&lt;br /&gt;
&lt;br /&gt;
Lo standard ''ECMA-376'' ([0010]) include tre differenti specifiche di linguaggio per ognuna delle tre principali categorie di documenti:&lt;br /&gt;
* ''WordprocessingML'' per i documenti testuali&lt;br /&gt;
* ''SpreadsheetML'' per i fogli elettronici&lt;br /&gt;
* ''PresentationML'' per le presentazioni elettroniche&lt;br /&gt;
* ''DrawingML'' ed altri linguaggi di markup di supporto per la rappresentazione di disegni, forme e diagrammi.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
La specifica include sia gli schemi ''XML'' sia i vincoli espressi per iscritto. Ogni documento conforme al formato dovrà, quindi, rispettare gli schemi ''XML'' e dovrà essere codificato in ''UTF-8'' o ''UTF-16''. La specifica, inoltre, permette l'aggiunta di ''custom tag XML'' a supporto dei linguaggi di markup dati, per default nel formato ''OOXML'', consentendo quindi la libera personalizzazione dei documenti.&lt;br /&gt;
&lt;br /&gt;
====File packaging====&lt;br /&gt;
&lt;br /&gt;
Oltre alla specifiche relative ai linguaggi di markup, la seconda parte dell'&amp;lt;i&amp;gt;ECMA-376&amp;lt;/i&amp;gt; ([0010]) definisce la struttura gerarchica dei file del formato adottando le ''Open Packaging Conventions'' (''OPC''). ''OPC'', una tecnologia ''file-container'' basata sul comune formato compresso ''zip'', che stabilisce che tutti i file che riguardano una stessa entità devono essere raggruppati in un unico package ([0014]). Un documento ''OOXML'' è, infatti, un archivio ''zip'' contenente alcuni files ''XML'' (detti anche ''parti'') organizzati in un singolo package. Questa frammentazione dei dati in più files rende più semplice e veloce l'accesso ai dati stessi e riduce le possibilità di una loro corruzione. Le ''parti'' possono contenere qualsiasi tipo di dato; per tenere traccia della relazione tra una ''parte'' e la sua tipologia di contenuto, senza basarsi sull'estensione del file, è presente nel package, nella cartella radice della gerarchia, il file denominato ''[Content_Types].xml'', il quale mappa appunto queste associazioni. È mostrata qui ad esempio l'associazione tra la ''parte'' rappresentante il documento principale e il suo ''ContentType''.&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Override PartName=&amp;quot;/word/document.xml&amp;quot; ContentType=&amp;quot;application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Le informazioni relative alle relazioni che ogni ''parte'' ha con le altre ''parti'', con risorse esterne e con il package in sé sono mantenute separatamente dal contenuto della ''parte'' stessa. Tali informazioni sono presenti, infatti, all'interno delle cartelle denominate ''_rels'': ne esiste una per il package nel suo complesso e una per ogni sotto-cartella del package contenente delle ''parti'' coinvolte in delle relazioni. In questo modo i riferimenti che una ''parte'' ha verso altre ''parti'' o risorse sono salvati una sola volta e possono essere aggiornati con semplicità se necessario, senza dover modificare il contenuto stesso delle ''parti'' coinvolte. È mostrato qui un esempio di relazione contenuta in ''_rels/.rels'' relativa al documento principale e al suo schema.&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Relationship Id=&amp;quot;rId1&amp;quot; Type=&amp;quot;http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument&amp;quot; Target=&amp;quot;word/document.xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Il documento principale, ossia il file ''word/document.xml'', ha inoltre numerose relazioni con altre ''parti'', come ad esempio ''word/styles.xml'' e ''word/footer.xml'', e risorse esterne collegate con degli URI. Per descrivere queste relazioni si usa la cartella ''word/_rels''.&lt;br /&gt;
&lt;br /&gt;
====Parti di un Documento OOXML====&lt;br /&gt;
&lt;br /&gt;
Vengono qui presentate le ''parti'' che sono caratteristiche esclusive di un ''WordprocessingML package'', non presenti quindi negli altri due formati ''OOXML''. È importante osservare che alcune di esse sono facoltative e sono presenti nel package solo se necessario.&lt;br /&gt;
&lt;br /&gt;
Le ''parti'' relative al vero e proprio contenuto testuale sono:&lt;br /&gt;
* ''Main Document'', contiene le informazioni principali ed è salvata come ''word/document.xml''&lt;br /&gt;
* ''Header'', contiene i dati relativi alle intestazioni ed è salvata in ''word/header.xml''. Ogni sezione del documento può avere intestazioni diverse per la prima pagina, per le pagine pari e per le dispari, quindi possono esserci molteplici ''parti header''&lt;br /&gt;
* ''Footer'', contiene le informazione relative al piè pagina ed è salvata in ''word/footer.xml''. Può essere presente più volte, per motivi analoghi alla ''parte header''&lt;br /&gt;
* ''Footnotes'', contiene le eventuali note a piè pagina del documento ed è salvata come ''word/footnotes.xml''&lt;br /&gt;
* ''Endnotes'', contiene le note di chiusura del documento ed è salvata in ''word/endnotes.xml''.&lt;br /&gt;
&lt;br /&gt;
Sono presenti poi delle ''parti'' relative allo stile e alle impostazioni del documento:&lt;br /&gt;
* ''Style Definitions'', contiene la definizione di un insieme di stili usati dal documento, salvata in ''word/styles.xml''&lt;br /&gt;
* ''Font Table'', contiene informazioni riguardo i font usati, salvata in ''word/fontTable.xml''&lt;br /&gt;
* ''Numbering Definitions'', contiene le definizioni sulla struttura delle liste contenute nel documento, salvata in ''word/numbering.xml''&lt;br /&gt;
* ''Document Settings'', specifica come il word processor debba trattare il documento (spell checking, gestione delle revisioni, etc.), contenuta in ''word/settings.xml''&lt;br /&gt;
* ''Web Settings'', contiene informazioni su come il documento debba essere convertito in ''HTML'' se richiesto, contenuta in ''word/webSettings.xml''.&lt;br /&gt;
&lt;br /&gt;
Sono presenti anche delle ''parti'' che rappresentano testo secondario:&lt;br /&gt;
* ''Comments'', contiene i commenti sul documento inseriti attraverso un word processor&lt;br /&gt;
* ''Glossary'', contiene dati testuali aggiuntivi secondari, ne è permessa una sola. Tutte le ''parti'' prima elencate, tranne il ''Main Document'', possono comparire una seconda volta in relazione alla ''parte glossary''.&lt;br /&gt;
&lt;br /&gt;
====Analisi del Main Document====&lt;br /&gt;
&lt;br /&gt;
Il file ''document.xml'', elemento principale di un documento ''WordprocessingML'', è costituito da due tipi di informazioni:&lt;br /&gt;
* ''properties'', che definiscono lo stile e la formattazione del testo&lt;br /&gt;
* ''stories'', che rappresentano il contenuto testuale delle varie parti del documento.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le ''properties'' verranno trattate in misura minore. Queste informazioni sono espresse attraverso una struttura XML gerarchica che ha come elemento radice il nodo ''document''. Esso ha due nodi figli:&lt;br /&gt;
* ''background'', che contiene alcune ''properties'' che descrivono lo sfondo del documento&lt;br /&gt;
* ''body'', che contiene tutti i rimanenti contenuti ed è potenzialmente molto complesso.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si osserva che per le finalità del trattamento dei dati risultano di primario interesse le ''stories'' e che è opportuno effettuare un'analisi ''bottom-up'' del problema: anziché considerare la gerarchia a partire dal ''body'' (nodo padre) partiremo dalla rappresentazione più semplice del testo contenuta nel documento (nodi figli).&lt;br /&gt;
&lt;br /&gt;
Facendo direttamente riferimento allo standard ''ECMA-376'' ([0010]),  si evince che l'unico nodo che contiene puro testo ha il nome ''t'' (''Text''). Questo elemento contiene una stringa rappresentante gli esatti caratteri che vengono poi mostrati negli editor a video. Il nodo ''Text'' non presenta figli e l'unico nodo padre che può avere è ''r'' (''Run''). Quest'altro nodo definisce una regione di testo con comuni proprietà (ad esempio l'uso del grassetto). Attraverso l'uso di tag ''t'' ed ''r'' quindi si rappresenta una regione di testo formattata con differenti elementi stilistici.&lt;br /&gt;
Occorre però evidenziare che un nodo ''r'' può presentare molti altri figli oltre a ''t'', come ad esempio immagini, in quanto rappresenta un'area generica del documento.&lt;br /&gt;
Si supponga quindi di avere due nodi ''Text'' fratelli, ossia figli dello stesso nodo ''r'': essi rappresenteranno semanticamente un unico blocco logico se e solo se compariranno a video come una sequenza di parole continua. Questo fenomeno è facilmente identificabile anche nel file ''XML'' descrittivo: due sequenze di parole mostrate a video adiacenti compaiono infatti nel file ''XML'' in due righe consecutive; se invece due parti di testo dovessero essere intervallate ad es. da un'immagine nel documento ''XML'' ci sarebbe un tag ''drawing'' a dividere i due tag ''t''. Dalla consecutività dei nodi ''Text'' nel file ''document.xml'' si può determinare quali siano i blocchi logici da trattare.&lt;br /&gt;
Un insieme di ''Run'' infine può essere figlio di diversi nodi, ma ciò non è di rilevante importanza, in quanto ogni area di testo individuata dal nodo ''Run'' rappresenta già un blocco logico a sé e, di conseguenza, contiene sufficienti informazioni per la &amp;quot;minimizzazione&amp;quot;.&lt;br /&gt;
L'unico caso di rilievo nel quale bisogna valutare quale sia la gerarchia a monte di un nodo ''Run'' è nell'elaborazione di una tabella. In tal caso, in realtà, occorre verificare opportunamente la strutturazione della gerarchia processata. Per chiarezza espositiva viene mostrata la rappresentazione in formato ''OOXML'' di una tabella con una riga e due colonne (senza l'uso di ''properties'' per la formattazione stilistica).&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;w:tbl&amp;gt;&lt;br /&gt;
  &amp;lt;w:tr&amp;gt;&lt;br /&gt;
    &amp;lt;w:tc&amp;gt;&lt;br /&gt;
      &amp;lt;w:p&amp;gt;&lt;br /&gt;
        &amp;lt;w:r&amp;gt;&lt;br /&gt;
          &amp;lt;w:t&amp;gt;Cella A&amp;lt;/w:t&amp;gt;&lt;br /&gt;
        &amp;lt;/w:r&amp;gt;&lt;br /&gt;
      &amp;lt;/w:p&amp;gt;&lt;br /&gt;
    &amp;lt;/w:tc&amp;gt;&lt;br /&gt;
    &amp;lt;w:tc&amp;gt;&lt;br /&gt;
      &amp;lt;w:p&amp;gt;&lt;br /&gt;
        &amp;lt;w:r&amp;gt;&lt;br /&gt;
          &amp;lt;w:t&amp;gt;Cella B&amp;lt;/w:t&amp;gt;&lt;br /&gt;
        &amp;lt;/w:r&amp;gt;&lt;br /&gt;
      &amp;lt;/w:p&amp;gt;&lt;br /&gt;
    &amp;lt;/w:tc&amp;gt;&lt;br /&gt;
  &amp;lt;/w:tr&amp;gt;&lt;br /&gt;
&amp;lt;/w:tbl&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Come si osserva in figura, in una tabella il nodo ''r'' sarà figlio del nodo ''p'' (''Paragraph''), il quale a sua volta sarà contenuto in un noto ''tc'' (''Table Cell''). Celle di una tabella appartenenti ad una stessa riga saranno presenti all'interno dello stesso ''tr'' (''Table Row'') ed infine tutte le righe della tabella saranno inserite del tag ''tbl'' (''Table'').&lt;br /&gt;
&lt;br /&gt;
Per determinare quindi se due nodi ''Text'' sono scritti in due colonne adiacenti di una stessa riga (e quindi costituiscono un unico blocco logico) è necessario verificare che per i due nodi ''Text'':&lt;br /&gt;
# il nodo &amp;quot;padre&amp;quot;  '''non sia''' in comune&lt;br /&gt;
# il nodo &amp;quot;padre di 2° livello&amp;quot; sia ''Paragraph'' e '''non sia''' in comune&lt;br /&gt;
# il nodo &amp;quot;padre di 3° livello&amp;quot; sia ''Table Cell'' e '''non sia''' in comune&lt;br /&gt;
# il nodo &amp;quot;padre di 4° livello&amp;quot; sia ''Table Row'' e '''sia''' in comune&lt;br /&gt;
# i nodi &amp;quot;padre di 3° livello&amp;quot; '''siano''' consecutivi.&lt;br /&gt;
Se tutte queste ipotesi sono soddisfatte, le due celle vanno &amp;quot;minimizzate&amp;quot; come unico blocco logico.&lt;br /&gt;
&lt;br /&gt;
Si valutano infine gli ultimi vincoli emersi nell'analisi sull'interpretazione della formattazione di un documento.&lt;br /&gt;
In particolare, descrivendo le parti che compongo un documento ''OOXML'', era già emerso che alcune sezioni di testo, ossia note a piè pagina ed intestazioni, compaiono in altri file ''XML'' e non in ''document.xml''. Questi file (''header.xml'', ''footer.xml'', ''endnotes.xml'', etc.) sono tutti raccolti in un package (&amp;quot;''word''&amp;quot;) e la grammatica ''XML'' è la stessa usata per il Main Document.&lt;br /&gt;
Si conclude osservando che il problema della divisione in sillabe delle parole non si pone, in quanto la divisione sillabica mostrata a video dai word-processors è calcolata dinamicamente; in particolare, su una porzione di testo viene applicata la sillabazione (ove necessario) se è presente tra le ''properties'' di quella regione di documento il tag ''hyphenationZone''.&lt;br /&gt;
&lt;br /&gt;
====La libreria in ambiente java open source Docx4j====&lt;br /&gt;
&lt;br /&gt;
La libreria Docx4j offre completo supporto alla manipolazione di documenti ''docx'' (compressione e decompressione archivio zip, generazione file ''XML'' necessari, etc.). Offre inoltre un'utile mappatura in specifici oggetti Java della gerarchia ''XML'' presente nei vari file del formato.&lt;br /&gt;
Uno tra gli elementi più interessanti è la tecnica con cui vengono recuperati i nodi dai file ''XML'', in quanto si fa impiego del linguaggio standard W3C ''XPath'' ([0044], [0045]). Con ''XPath'' è possibile esprimere con una stringa un sottoinsieme di nodi presenti in una gerarchia ''XML'' non solo in base al loro nome o valore, ma anche in relazione alla posizione reciproca rispetto agli altri nodi. Riferendoci alle problematiche del servizio risulta, ad esempio, significativamente agevolato il trattamento di dati personali in forma tabellare.&lt;br /&gt;
Si osserva infine che la libreria attribuisce un id univoco ad ogni nodo del documento, di conseguenza se ne può trarre vantaggio nei confronti tra i nodi.&lt;br /&gt;
&lt;br /&gt;
===Ottimizzazioni del processo di minimizzazione===&lt;br /&gt;
&lt;br /&gt;
Durante l'analisi dei requisiti è emerso che l'efficienza costituisce un aspetto problematico del servizio. Si ricorda di aver stimato la durata di una prestazione media di circa 145 secondi, considerando dati: &lt;br /&gt;
* un documento di medie dimensioni (10 pagine ~ 5000 parole) &lt;br /&gt;
* tempo medio di 10 ms per individuare le occorrenze di un nome&lt;br /&gt;
* un dizionario di circa 14.500 parole&lt;br /&gt;
&lt;br /&gt;
In linea di massima si individuano due generi di strategie che consentirebbero la riduzione del tempo medio di esecuzione: uno mirato a ridurre il più possibile il testo da sottoporre a &amp;quot;minimizzazione&amp;quot; automatica, l'altro a ottimizzare l'impiego del dizionario e dell'algoritmo di ricerca.&lt;br /&gt;
&lt;br /&gt;
====Riduzione del testo da trattare====&lt;br /&gt;
&lt;br /&gt;
Come già spiegato, l'approccio di ricerca ''pattern-based'' è poco sensibile all'aumentare della lunghezza del documento, ma da questo valore ha una dipendenza non trascurabile.&lt;br /&gt;
&lt;br /&gt;
Nel documento è altamente probabile che ci siano interi periodi, se non pagine, dove non sia presente alcun nominativo. Anche all'interno di una frase che necessita di ''minimizzazione'' è plausibile che siano sono poche le coppie (al più le terne) di parole riconducibili ad una sequenza nome-cognome. È inessenziale che sezioni di testo che non necessitano di &amp;quot;minimizzazione&amp;quot; vengano processate. Si osserva per inciso che, ovviamente, questo ragionamento è corretto per via dell'indipendenza dal contesto di un approccio ''pattern-based''.&lt;br /&gt;
&lt;br /&gt;
Il pattern definito per la ricerca di un nominativo è molto restrittivo, in quanto accetta solo sequenze di parole costituenti un nominativo contenente un nome specifico; d'altronde la progettazione del pattern è stata effettuata mirando ad identificare il più accuratamente possibile le sequenze da anonimizzare.&lt;br /&gt;
&lt;br /&gt;
Analizzando attentamente il problema, si può fare il seguente ragionamento: per ridurre il più possibile il numero di parole da processare a ogni iterazione di ricerca del pattern di un nome, è possibile individuare preliminarmente tutte le sequenze di parole del documento che ''potrebbero essere'' dei nominativi e ''potrebbero'' fare match.&lt;br /&gt;
&lt;br /&gt;
L'operazione di &amp;quot;pre-filtraggio&amp;quot; si applica processando il documento con un ''pattern'' che presenta un'espressione più generale e permissiva delle ''regex'' definite per i nomi del dizionario. Si osserva che una qualunque successione di caratteri ''alfabetici'' iniziante con un carattere maiuscolo ''potrebbe'' rappresentare un nome. Per realizzare un espressione adatta si parte dalla definizione della ''regular expression'' già data ai nomi del dizionario:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;regex&amp;gt; := (&amp;lt;second_name&amp;gt;\s)?(&amp;lt;nome&amp;gt;)\s&amp;lt;cognome&amp;gt;|&amp;lt;cognome&amp;gt;\s(&amp;lt;nome&amp;gt;)(\s&amp;lt;second_name&amp;gt;)?&lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Nell'uso fatto finora di questa espressione, al tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nome&amp;gt;&amp;lt;/span&amp;gt; viene attributo, ciclio dopo ciclio, una parola del dizionario diversa. È possibile definire una variante più generale dell'espressione appena presentata:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;nome_pre&amp;gt; := [A-Z][a-zA-ZÀ-ÖØ-öø-ÿ&amp;lt;extra&amp;gt;]+&lt;br /&gt;
&lt;br /&gt;
&amp;lt;regex_pre&amp;gt; := (&amp;lt;second_name&amp;gt;\s)?(&amp;lt;nome_pre&amp;gt;)\s&amp;lt;cognome&amp;gt;|&amp;lt;cognome&amp;gt;\s(&amp;lt;nome_pre&amp;gt;)(\s&amp;lt;second_name&amp;gt;)?&lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Con questa ''regex'' si identifica una qualunque sequenza che rappresenta un nominativo, ma allo stesso tempo anche, ad esempio, tutte le parole consecutive inizianti con una maiuscola. È importante sottolineare che questo pattern presenta tutte le caratteristiche già ampiamente discusse sul formato delle ''regex'' per riconoscimenti automatici (gestione dei delimitatori, posizione relativa tra i nomi ed il cognome, etc.).&lt;br /&gt;
Il processamento di una ''regex'' generale inoltre sarà inevitabilmente più lento di quello di ''regex'' aventi i nomi specificati, in quanto molte più sequenze faranno match essendo l'espressione più permissiva. La mancanza di accuratezza va rapportata all'impiego della ''regular expression'': fornendo essa un semplice &amp;quot;pre-filtraggio&amp;quot; del documento non risulta necessario nè che individui esclusivamente nominativi nè che sia in grado di distinguerli gli uni dagli altri. Il leggero ritardo introdotto viene valutato sperimentalmente, applicando lo stesso l'algoritmo già usato in precedenza ed elaborando gli stessi documenti, sempre a parità di piattaforma.&lt;br /&gt;
&lt;br /&gt;
Partendo dall'elaborazione di un documento contenente 10 nominativi ed in totale 5.000 parole, si misura che tempo il processamento medio della ''regex'' di &amp;quot;pre-filtraggio&amp;quot; è di circa 36 ms; si ricorda che per lo stesso documento il tempo di esecuzione medio per il processamento di un nominativo non presente è di circa 9 ms, se le occorrenze salgono a 10, il tempo è in media di circa 10 ms.&lt;br /&gt;
Sebbene l'elaborazione di questa ''regex'' sia circa 4 volte più lenta dell'elaborazione di ''regex'' più specifiche, un ritardo introdotto dell'ordine dei millisecondi è trascurabile rispetto al tempo di processamento complessivo (stimato di circa 145 second).&lt;br /&gt;
Si osserva, per inciso, che nell'elaborazione di questo particolare documento sono stati individuati altre 21 sequenze che rispettavano il pattern che non costituivano dei nominativi. &lt;br /&gt;
&lt;br /&gt;
Terminata l'esecuzione dell'operazione di prefiltraggio, occorre sfruttare opportunamente le informazioni ottenute: in particolare, si possono elaborare con le ''regex'' dei nomi le sole sotto-stringhe che hanno fatto match con la ''regular expression'' nell'operazione preliminare. In altri termini, con questo metodo si effettua una sola elaborazione del testo completo e molteplici processamenti delle sotto-stringhe che ''potrebbero'' contenere nominativi. &lt;br /&gt;
Si osserva inoltre che, conoscendo con certezza gli indici di inizio e fine delle sotto-stringhe che ''potenzialmente'' contengono nominativi, è possibile &amp;quot;alleggerire&amp;quot; la ''regex'' associata ai nomi del dizionario: si possono rimuovere i costrutti ''lookahead'' e ''lookbehind'' in quanto la sotto-stringa è stata già rimossa dal contesto e quindi rappresenta esclusivamente i caratteri individuati dalla ''regular expression'' di &amp;quot;pre-filtraggio&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A questo punto occorre valutare sperimentalmente l'ottimizzazione ottenuta. Si misura che sono sufficienti 2 ms di elaborazione in media per nome, mentre, nel caso raro in cui tutti i 10 nominativi presenti si riconducano ad un unico nome, il tempo medio di esecuzione tende verso i 3 ms. Si osserva che questo è possibile perchè le parole nelle sotto-stringhe sono poco meno di 50, ossia si è ridotta di oltre il 99% la dimensione complessiva di dati da processare!&lt;br /&gt;
Valutando l'ottimizzazione complessiva in termini di tempo si ha che, processando un dizionario di circa 14.500 termini, sono necessari in media 29 secondi.&lt;br /&gt;
&lt;br /&gt;
Ovviamente questo dato è fortemente dipendente dal contenuto del documento. Vanno effettuate opportune misurazioni nel caso in cui la percentuale di nominativi presenti rispetto alle parole complessive nel documento sia maggiore. Si considera un documento di 5.000 parole contenente 200 sequenze riconosciute dall'algoritmo di &amp;quot;pre-filtraggio&amp;quot; delle quali 100 costituiscono dei nominativi. &lt;br /&gt;
Si misura che il tempo di esecuzione medio è di 6 ms nel caso generale del processamento di un nome con poche occorenze e tenderà verso i 10 ms nel caso sporadico in cui le occorrenze del nome saranno proprio 100 o poco meno. Il tempo di esecuzione del &amp;quot;pre-filtraggio&amp;quot; è di circa 48 ms. &lt;br /&gt;
Per inciso, si osserva che la ragione per cui il tempo necessario al &amp;quot;pre-filtraggio&amp;quot; non aumenta esageratamente è dovuta al pattern della ''regex''. La ''regular expression'' impiegata infatti, facendo principalmente uso di caratteri espressi in un range unitamente al quantificatore &amp;quot;+&amp;quot;, risulta particolarmente efficiente da elaborare.&lt;br /&gt;
Nel caso di documenti più &amp;quot;ricchi&amp;quot; di nomi si stima l'elaborazione media complessiva di circa 1 minuto e 27 secondi.&lt;br /&gt;
&lt;br /&gt;
Facendo il punto della situazione, si è ridotto di circa 5 volte il tempo di esecuzione complessivo nel caso di documenti &amp;quot;scarsamente popolati&amp;quot; da nominativi e quasi dimezzato il tempo necessario nell'elaborazione di documenti contenenti molte coppie nome-cognome. Occorre proseguire nello studio per migliorare l'ottimizzazione, considerando dove l'algoritmo di ricerca e l'impiego del dizionario possono essere migliorati.&lt;br /&gt;
&lt;br /&gt;
====Ordinamento del dizionario====&lt;br /&gt;
&lt;br /&gt;
Viene posta una semplice domanda sulle modalità di ricerca dei nominativi nell'insieme delle sotto-stringhe del documento: è computazionalmente equivalente prendere una ad una le sotto-stringhe e confrontarle con le ''regex'' dei nomi rispetto che prendere una ad una le ''regex'' dei nomi e confrontarle con le sotto-stringhe?&lt;br /&gt;
&lt;br /&gt;
Si fornisce una spiegazione formale alla domanda. &lt;br /&gt;
&lt;br /&gt;
Si definiscono due insiemi:&lt;br /&gt;
* A = {a_1, a_2, ... a_n}&lt;br /&gt;
* B = {b_1, b_2, ... b_m}&lt;br /&gt;
&lt;br /&gt;
Gli elementi dell'insieme A rappresentano le sotto-stringhe (cardinalità N), mentre gli elementi dell'insieme di B indicano le ''regex'' dei nomi (cardinalità M). È importante considerare che per il secondo insieme è definita una relazione di unicità che lega il valore degli elementi: per ogni ''b_i'' appartenente a B non esiste un indice ''j'', ''j'' compreso tra 1 ed M, tale che il testo del nodo ''i'' sia uguale al testo del nodo ''j'' (tranne se ''i'' = ''j''); in altre parole gli elementi rappresentanti le ''regex'' (''b_i'') per definizione sono posti univoci in B. &lt;br /&gt;
&lt;br /&gt;
Si presti attenzione al fatto che l'insieme delle sotto-stringhe presenta N elementi distinti tra loro in identità (&amp;quot;id nodo&amp;quot;), ma il cui contenuto testuale può essere equivalente a quello di altre sotto-stringhe. L'equivalenza tra due sotto-stringhe sussiste, in questo particolare contesto, qualora i contenuti testuali di entrambe facciano match con una stessa ''regex'' presente nell'insieme B. L'insieme delle ''regex'', invece, presentano elementi i cui valori testuali sono sempre univoci, in quanto ottenuti da nomi sempre diversi.&lt;br /&gt;
&lt;br /&gt;
Definiti gli insiemi si procede alla formulazione della risposta alla domanda precedente. Per chiarezza espositiva indicheremo con &amp;quot;A-&amp;gt;B&amp;quot; la procedura con cui si opera il confronto prendendo una ad una le sotto-stringhe per poi confrontarle con le ''regex'', mentre indicheremo con &amp;quot;B-&amp;gt;A&amp;quot; la procedura con cui si opera il confronto prendendo una ad una le ''regex'' dei nomi per poi confrontarle con le sotto-stringhe.&lt;br /&gt;
&lt;br /&gt;
Nel caso in cui l'insieme delle sotto-stringhe non contenga alcun nominativo, si ha una complessità computazionale equivalente per &amp;quot;A-&amp;gt;B&amp;quot; e per &amp;quot;B-&amp;gt;A&amp;quot;. Viene mostrato nei calcoli in figura che il numero di confronti necessari ''C_1'' è dato dal prodotto delle cardinalità degli insiemi, ossia ''C_1 = N · M''. &lt;br /&gt;
&lt;br /&gt;
(QUI FIG[0F07])&lt;br /&gt;
&lt;br /&gt;
Si suppone ora che il testo della sotto-stringa di posizione ''r'' faccia match con la ''regex'' in posizione ''k''; si applica &amp;quot;A-&amp;gt;B&amp;quot;. Come si mostra attraverso i calcoli in figura, il numero totale di confronti ''C_2'' sarà inferiore a ''C_1'' poichè, quando la sotta-stringa in posizione ''r'' risulta equivalente alla ''regex'' in posizione ''k'' si può direttamente passare alla valutazione della stringa in posizione ''r + 1'' e non svolgere i rimanenti ''m - k&amp;quot; confronti per la stringa in posizione ''r''. Si calcola che ''C_2 = k + m · (n -1)''.&lt;br /&gt;
&lt;br /&gt;
(QUI FIG[0F08])&lt;br /&gt;
&lt;br /&gt;
Supponendo sempre che il testo della sotto-stringa di posizione ''r'' faccia match con la ''regex'' in posizione ''k'', si applica &amp;quot;B-&amp;gt;A&amp;quot;. Similmente al caso precedente, quando la sotta-stringa in posizione ''r'' risulta equivalente alla ''regex'' in posizione ''k'' si può direttamente passare alla valutazione della ''regex'' in posizione ''k + 1'' e non svolgere i rimanenti ''n - r&amp;quot; confronti per la ''regex'' in posizione ''k''. Si osserva inoltre che è inutile confrontare le rimanenti ''m - k'' ''regex'' con la sottostringa di posizione ''r'': essa è risultata già equivalente ad una ''regex'' e, essendo le ''regex'' poste per definizione diverse tra loro, è di conseguenza impossibile che soddisfi un'altra uguaglianza.&lt;br /&gt;
Per inciso si osserva che nel calcolo di ''C_2'' un ragionamento di questo genere non è applicabile: ogni sotto-stringa può potenzialmente fare match con una qualsiasi ''regex''. &lt;br /&gt;
Il numero totale di confronti ''C_3'' viene calcolato come mostrato, si ottiene ''C_3 = k + m · (n -1) - n + r''.&lt;br /&gt;
&lt;br /&gt;
(QUI FIG[0F09])&lt;br /&gt;
&lt;br /&gt;
Si osserva che ''C_3 = C_2 - n + r'' e, essendo ''r'' la posizione della sotto-stringa coinvolta nel match, si ha che ''C_3'' è sempre minore di ''C_2'' qualunque sia la posizione della sotto-stringa. L'unico caso in cui ''C_3 = C_2'' si verifica quando la ''r = n'', ossia se la sotto-stringa è l'ultima dell'insieme.&lt;br /&gt;
&lt;br /&gt;
Per estendere il ragionamento, si prende la ''regex'' di posizione ''k'' e si indica con ''T'' il numero di sotto-stringhe che sono già risultate equivalenti ad una ''regex'' nelle elaborazioni precedenti. Risulta che, per il ragionamento spiegato nel calcolo di ''C_3'', potranno essere risparmiati almeno ''N - T'' confronti per la ''regex'' ''k'' e per ogni ''regex'' in posizioni successive. In generale, maggiore è il numero di nominativi nel documento, maggiore sarebbe l'ottimizzazione della procedura. &lt;br /&gt;
&lt;br /&gt;
Le conclusioni che si traggono sono due:&lt;br /&gt;
* indipendentemente dal numero o dalla posizione dei nominativi nelle sotto-stringhe, nell'algoritmo di minimizzazione è più efficiente prendere una ad una le ''regex'' dei nomi e con ognuna trattare l'insieme delle sotto-stringhe&lt;br /&gt;
* un efficace ordine di elaborazione delle ''regex'' può introdurre ottimizzazioni&lt;br /&gt;
&lt;br /&gt;
Va eseguita ora una valutazione sperimentale dei tempi di esecuzione del processo di &amp;quot;minimizzazione&amp;quot; tenendo conto di questi elementi. Le ''regex'' che fanno match con i nominativi presenti nel testo, quindi, vengono trattate tra le prime. Risulta di interesse principalmente valutare i miglioramenti ottenibili nel caso di documenti ''molto popolati'' da nominativi, poichè è questo il caso in cui l'ottimizzazione entra in gioco.&lt;br /&gt;
Si esegue il test sullo stesso documento trattato precedentemente con la sola tecnica di &amp;quot;pre-filtraggio&amp;quot;. Esso è composto da 5.000 parole, dal &amp;quot;pre-filtraggio&amp;quot; sono individuate 200 sotto-stringhe delle quali 100 costituiscono dei nominativi. &lt;br /&gt;
Nel test si è fatto riferimento a dati Istat ([0046]) per stabilire, quanto più realisticamente possibile, il miglior ordine di elaborazione delle ''regex'' associate ai nomi; risulta che circa il 25% dei nominativi è individuato entro i primi 15 cicli di esecuzione; circa il 35% entro i primi 50 ed il 100% entro circa i primi 3000. Per inciso, si osserva che un altro documento può dare origine a tempi significativamente peggiori qualora presenti molti nominativi con nomi desueti e presenti in fondo al dizionario. &lt;br /&gt;
Si misura che, dopo il &amp;quot;transitorio iniziale&amp;quot; (ossia dalla 51° ''regex'' in poi), il tempo medio è di 5 ms per l'elaborazione di una ''regex''. Si osserva che, una volta che sono state elaborate circa le prime 3000 ''regex'', il tempo medio di elaborazione di una ''regex'' scende a 4 ms. Per completezza, si riporta anche il tempo medio per la fase di &amp;quot;transitorio iniziale&amp;quot;, che si misura di circa 8 ms; il tempo di &amp;quot;pre-filtraggio&amp;quot;, già precedentemente calcolato, risulta di 48 ms.&lt;br /&gt;
Calcolando complessivamente la durata del processamento si ottiene che l'elaborazione media complessiva è di circa 61 secondi, si ottiene quindi una riduzione significativa rispetto al tempo di 1 minuto e 27 prima individuato.&lt;br /&gt;
&lt;br /&gt;
Si considerano, in relazione alle conclusioni della discussione teorica prima formalizzata, le implicazioni realizzative: in primis che l'imposizione del verso con cui eseguire la &amp;quot;minimizzazione&amp;quot; non determina particolari problemi implementativi, in secundis che l'ordinamento efficiente dei nomi del dizionario può essere trattato attraverso una tecnica di ''machine learning''.&lt;br /&gt;
&lt;br /&gt;
La tecnica di apprendimento che si realizza si basa sull'estrapolazione di informazioni utili nei documenti inviati dagli utenti. Si tiene traccia, infatti, della ''frequenza'' con cui un nome appare in diversi processamenti. Alla fine di ogni &amp;quot;minimizzazione&amp;quot;, dopo aver concluso il salvataggio del nuovo file ''OOXML'', il programma Java eseguira l'update sul database MySql delle frequenze dei nomi trovate, incrementandole.&lt;br /&gt;
Nell'interrogazione al database per l'ottenimento dell'insieme dei nomi, di conseguenza, si richiederà l'ordinamento per frequenza delle tuple restituite. In questo modo, più volte un nome compare nei documenti, più incrementi riceverà il suo campo frequenza, più avrà la probabilità di comparire in cima al dizionario.&lt;br /&gt;
Si progetta inoltre l'inserimento di un campo &amp;quot;ultimo utilizzo&amp;quot;, associato ai nomi sul database, che permette di avere un secondo criterio di ordinamento utile. Tale campo viene impiegato anche per evitare una crescita esagerata del valore della frequenza; periodicamente, con ''crond'' ad esempio, si decrementano i valori del campo &amp;quot;frequenza&amp;quot; dei nomi il cui &amp;quot;ultimo utilizzo&amp;quot; è troppo vecchio. Si osserva che i valori di configurazione per la gestione di queste elementi dipendono dal carico medio del sistema, noto solo dopo la progettazione, andranno valutati con precisione in fasi future. Ovviamente l'aggiornamento del campo &amp;quot;ultimo utilizzo&amp;quot; sarà contestuale all'aggiornamento della ''frequenza''. &lt;br /&gt;
Si osserva, per inciso, che l'impiego di un dizionario di cognomi sarebbe stato problematico per l'aggiornamento delle frequenze. Per via del principio ''Privacy by Design'', infatti, aggiornando la frequenza per la entry del cognome di una persona, indirettamente si sarebbe tenuto traccia di un dato sensibile, specialmente nel caso in cui il cognome risulti &amp;quot;raro&amp;quot;. &lt;br /&gt;
Una valutazione rilevante da fare è sulle implicazioni relative agli accessi concorrenti al dizionario, dovute all'introduzione dell'algoritmo appena spiegato, che esegue scrittura di &amp;quot;frequenza&amp;quot; e ''ultimo utilizzo'' sul database. Si osserva che non sono problematiche le &amp;quot;letture sporche&amp;quot;, poichè, se si verificano, al più risulta alterato l'ordine di qualche nome; inoltre nemmeno un &amp;quot;lost update&amp;quot; risulta eccessivamente problematico, poichè l'ultimo utilizzo risulta sempre aggiornato e la perdita di un incremento delle frequenza di un nome non rappresenta in linea di massima un problema. Questi scenari presentati vanno valutati complessivamente, però, una volta che si realizza il reale carico del sistema: perdere molti update risulta critico per l'ottimizzazione del processamento. Conviene in linea precauzionale prevedere una semantica transazionale per l'interazione tra modulo Java e database. Per inciso, eseguire l'update finale con una transazione non influenza il tempo di attesa dell'utente, poichè il documento è stato già elaborato per intero. &lt;br /&gt;
&lt;br /&gt;
Si fa infine un'ultima osservazione che consente di abbattere i tempi di attesa enormemente, a costo di perdere dell'accuratezza nel processamento automatico: ridurre il numero di nomi del dizionario processato, elaborando solo quelli in cima. &lt;br /&gt;
Si osserva che questa soluzione è ancor più efficace se i nomi contenuti nel documento sono pochi. In questo caso, infatti, il processamento dei nomi durante la fase di &amp;quot;transitorio iniziale&amp;quot; richiede lo stesso tempo del processamento di nomi &amp;quot;a regime&amp;quot;, ossia dopo l'avvenuta riduzione del numero di sotto-stringhe da elaborare. Nei documenti &amp;quot;ricchi&amp;quot; di nominativi, come già spiegato, ciò non avviene.&lt;br /&gt;
Per concludere, si usano i risultati dei test sperimentali precedentemente misurati per stimare il tempo di processamento complessivo, supponendo di:&lt;br /&gt;
* applicare la tecnica di &amp;quot;pre-filtraggio&amp;quot;&lt;br /&gt;
* usare i primi 1.500 nomi di un dizionario ordinato per frequenza&lt;br /&gt;
&lt;br /&gt;
Caso A:&lt;br /&gt;
* documento contenente 10 nominativi ed un totale di 5.000 parole&lt;br /&gt;
* processamento medio della ''regex'' di &amp;quot;pre-filtraggio&amp;quot; di circa 36 ms&lt;br /&gt;
* individuazione di 31 sotto-stringhe totali&lt;br /&gt;
* durata elaborazione in media per nome di circa 2 ms&lt;br /&gt;
&lt;br /&gt;
Durata esecuzione senza troncamento: 29 secondi circa&lt;br /&gt;
&lt;br /&gt;
Durata esecuzione con troncamento: 3 secondi circa&lt;br /&gt;
&lt;br /&gt;
Caso B:&lt;br /&gt;
* documento contenente 100 nominativi ed un totale di 5.000 parole&lt;br /&gt;
* processamento medio della ''regex'' di &amp;quot;pre-filtraggio&amp;quot; di circa 48 ms&lt;br /&gt;
* individuazione di 200 sotto-stringhe totali&lt;br /&gt;
* durata elaborazione in media per nome di circa 8 ms per prime 50 iterazioni&lt;br /&gt;
* durata elaborazione in media per nome di circa 5 ms per successive&lt;br /&gt;
&lt;br /&gt;
Durata esecuzione con solo &amp;quot;pre-filtraggio&amp;quot; : 1 minuto e 27 secondi&lt;br /&gt;
&lt;br /&gt;
Durata esecuzione senza troncamento: 61 secondi circa&lt;br /&gt;
&lt;br /&gt;
Durata esecuzione con troncamento: 7.7 secondi circa&lt;br /&gt;
&lt;br /&gt;
I tempi a cui si giunge risultano soddisfacenti in entrambi i casi. Si prevede di lasciare all'utente la possibilità di scegliere di ricevere un servizio o più veloce o più accurato, in base alle sue esigenze.&lt;br /&gt;
&lt;br /&gt;
===Tecnologie complementari===&lt;br /&gt;
&lt;br /&gt;
La redazione di questa tesi è avvenuta su Mediawiki, la più importante fra le piattaforme wiki essendo il motore di Wikipedia.&lt;br /&gt;
&lt;br /&gt;
Le piattaforme wiki sono riconosciute come elemento caratterizzante dell’evoluzione Internet al Web 2.0, cioè al web nel quale gli utenti-navigatori, fino ad allora &amp;quot;''consumatori&amp;quot;'' (&amp;quot;''consumers&amp;quot;'') di contenuti si sono trasformati essi stessi in &amp;quot;''produttori&amp;quot;'' (&amp;quot;''producers&amp;quot;''), e cioè in &amp;quot;''prosumers&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
Un ''wiki'' è fondamentalmente un sito web che contiene informazioni e che consente agli utenti di editare facilmente il suo contenuto.&lt;br /&gt;
&lt;br /&gt;
Nel redigere una pagina wiki si utilizza ciò che è chiamato ''wikitext&amp;quot; per definire capitoli, paragrafi, hyperlinks, elementi di formattazione della pagina, etc.; sebbene il ''wikitext&amp;quot; risulti non difficile da apprendere, quasi ogni piattaforma wiki è corredata da editor di tipo visuale, che non richiede alcuna conoscenza della sintassi del ''wikitext&amp;quot;; tuttavia è esperienza comune che utilizzare direttamente il ''wikitext&amp;quot; induce a concentrarsi maggiormente sui contenuti e non sulla formattazione. Il linguaggio ''wikitext'' è strettamente correlato con il linguaggio HTML, infatti nella scrittura è possibile utilizzare tag come h1, span, div e così via, oltre che la sintassi esclusiva di ''wikitext''; simmetricamente una pagina prodotta da media wiki è costituita da HTML ben formato e direttamente importabile in ogni word processor. &lt;br /&gt;
&lt;br /&gt;
I wiki presentano una funzionalità di grande utilità nella redazione di documenti articolati: la tracciatura delle successive revisioni (&amp;quot;''Cronologia&amp;quot;''). La possibilità di ripercorrere l’evoluzione del testo è davvero d’aiuto quando si fissano idee originali in uno scritto, cercando di definirle, precisarle, chiarirle, come è avvenuto in effetti, anche nella redazione di questa tesi. Per curiosità, si segnala che, pur avendo redatto la maggior parte del testo off-line, la pagina wiki di questa tesi conta oltre 50 revisioni.&lt;br /&gt;
&lt;br /&gt;
Per inciso, si osserva che è stata molto utile la funzionalità di &amp;quot;ricerca nel codice&amp;quot; offerta dalla piattaforma di revisione online GitHub nella corretta comprensione della libreria Docx4j, il cui codice sorgente è ivi rilasciato. &lt;br /&gt;
&lt;br /&gt;
Si conclude infine dicendo che per ottimizzare le procedure di debug del codice sono stati realizzati utili tool a riga di comando per Linux per la rapida estrazione-modifica-ricompattazione di documenti ''OOXML''. Si propone in appendice un comando bash per questi scopi.&lt;br /&gt;
&lt;br /&gt;
==Sviluppi futuri==&lt;br /&gt;
&lt;br /&gt;
In questa sezione si fa cenno, senza poterle approfondire, ad alcune interessanti questioni emerse nello svolgimento della tesi.&lt;br /&gt;
&lt;br /&gt;
===Accesso al servizio web===&lt;br /&gt;
&lt;br /&gt;
In fase iniziale, il servizio web potrà essere reso accessibile in forma completamente aperta, senza richiedere cioè la registrazione dell’utente o l’autenticazione dell’utente già registrato. In questo modo, in effetti, si premia la facilità d’uso, ma si incorre nella nota problematica di un uso malevolo, costituito da accessi a raffica, finalizzati a saturare il server e generare una condizione di ''DoS – Denial of Service''. Diverse sono le tecniche che possono essere adottate per contrastare questo tipo di accessi malevoli, come richiedere di superare &amp;quot;''captcha''&amp;quot; e/o introdurre ritardi crescenti ed eventualmente blocchi in risposta ad accessi prevenienti con alta frequenza dallo stesso indirizzo IP.&lt;br /&gt;
È possibile anche pensare ad un accesso previa registrazione ed autenticazione dell’utente, penalizzando l’immediatezza di utilizzo del servizio, ma eventualmente ottenendo l’indirizzo email degli utenti che acconsentono a lasciarlo per successive finalità marketing.&lt;br /&gt;
È possibile, infine, un utilizzo misto, contando in un cookie il numero di accessi eseguiti e richiedendo all’utente di registrarsi per continuare ad utilizzare il servizio, dopo qualche accesso.&lt;br /&gt;
&lt;br /&gt;
===Ampliamento dinamico del dizionario===&lt;br /&gt;
&lt;br /&gt;
Nel restituire il documento elaborato all'utente, gli si da la possibilità di richiedere una nuova elaborazione, dopo aver indicato i nominativi che fossero sfuggiti; pare inesauribile, infatti, la &amp;quot;fantasia&amp;quot; dei genitori nel dare nome ai propri figlioli!&lt;br /&gt;
I nominativi indicati dall'utente sono sfuggiti al servizio perché non presenti nel dizionario: facilmente viene in mente l’idea di arricchire il dizionario con i nominativi indicati dall’utente. Va però considerato il caso che l’utente in malafede indichi nominativi fasulli al fine di inquinare il dizionario.&lt;br /&gt;
Il caso malevolo può essere affrontato attraverso una strategia che preveda non direttamente l'inserimento del nuovo nominativo nel dizionario, ma invece l'utilizzo di un concetto di &amp;quot;candidatura&amp;quot;: il nuovo nominativo viene registrato, ma si attende di avere un certo numero di utenti che lo propongono prima di approvarne l'inserimento nel dizionario.&lt;br /&gt;
Può anche essere utilizzato un concetto di &amp;quot;attendibilità&amp;quot; della candidatura di un nuovo nominativo, verificando ad esempio l'utente che lo propone scarichi effettivamente il file rielaborato.&lt;br /&gt;
Nel caso l'accesso avvenga con autenticazione, e cioè identificando gli utenti, si apre la possibilità di individuare e bannare gli utenti malevoli.&lt;br /&gt;
&lt;br /&gt;
===Natura del documento e ricorrenza del nominativo===&lt;br /&gt;
&lt;br /&gt;
Si coglie facilmente la differenza di formato fra un documento in forma di elenco (es. una graduatoria) da un documento in forma di relazione (es. una sentenza giudiziaria). Differenze di questo tipo potrebbero essere utilizzate per escludere o ammettere la ripetizione dei nominativi.&lt;br /&gt;
Per meglio dire: in un elenco la ripetizione di un nominativo è di fatto da escludersi o va trattata come omonimia. In una relazione, l’individuazione di un nominativo può essere utilizzata per ricercarlo direttamente in altri punti del documento stesso.&lt;br /&gt;
&lt;br /&gt;
===Altri dati personali===&lt;br /&gt;
&lt;br /&gt;
Altri dati personali sono trattabili con le stesse tecniche analizzate in questa tesi: date e luoghi di nascita, codici fiscali, indirizzi, email, numeri di telefono, sesso etc. In qualche caso, come per i codici fiscali, l’individuazione del pattern da trattare è persino più semplice.&lt;br /&gt;
Diversi studi ([0039]) hanno dimostrato che, utilizzando set di dati personali parziali, è possibile la re-identificazione dei soggetti, pur in documenti pseudonimizzati. È questo un altro motivo per estendere i trattamenti descritti anche agli altri dati personali richiamati.&lt;br /&gt;
&lt;br /&gt;
===Altri alfabeti===&lt;br /&gt;
&lt;br /&gt;
È possibile estendere il sotto-insieme di caratteri Unicode utilizzati nelle ''regex'' per elaborare documenti scritti in altri alfabeti non latini.&lt;br /&gt;
&lt;br /&gt;
==Conclusioni==&lt;br /&gt;
&lt;br /&gt;
Questa tesi è partita da un problema basilare, quasi scolastico, dell'informatica: la ricerca di un testo in un documento, al fine della sua cancellazione o modifica.&lt;br /&gt;
&lt;br /&gt;
Il problema si è subito discostato dalla sua formulazione basilare, principalmente perché, nei casi d'uso, il documento da ricercare non è un semplice testo (&amp;quot;''plain text''&amp;quot;) ma invece è il prodotto di un ''word-processor'': quindi è costituito da una struttura XML più o meno complessa, rappresentante formattazioni, riferimenti interni o esterni, note, etc. La ricerca deve avvenire nei soli nodi di puro testo, individuando ed escludendo dall'analisi lessicale gli elementi testuali di mark-up che non costituiscono contenuto informativo. Nell'approfondire le strutture ed i concetti XML ho potuto notare quanto essi siano ricorrenti in molti ambiti dell'informatica.&lt;br /&gt;
&lt;br /&gt;
Nell'analisi delle specifiche, un'altra complicazione si è presto aggiunta: l'usabilità del servizio cresce drasticamente se si evita di chiedere all'utente, come si era pensato in un primo tempo di fare, quali siano le stringhe (i nominativi) da ricercare e trattare; è nata allora l'idea di reperire queste stringhe in un dizionario di nomi ed in un dizionario di cognomi, considerando anche le permutazioni dei lemmi reperiti. Ho così dovuto approfondire alcuni problemi tipici dei dizionari, come il loro ampliamento automatico con tecniche oggi comprese nel ''machine-learning''. Non ho potuto &amp;quot;resistere&amp;quot; alla tentazione di ''formalizzare la matematica'' in base alla quale ho costruito le strategie di ricerca.&lt;br /&gt;
&lt;br /&gt;
Spunto per la tesi è stata la recente legislazione in materia di dati personali, il GDPR. Esaminandone gli articoli pertinenti, ho maturato una riflessione generale: sempre più il software dovrà essere progettato e realizzato anche alla luce di altre discipline, non solo di quelle informatiche, come le discipline giuridiche ed il diritto.&lt;br /&gt;
&lt;br /&gt;
Durante la fase iniziale della collaborazione con l'azienda mi sono dedicato alla messa a punto delle specifiche; ciò mi ha permesso di comprendere quanto questa fase sia importante e come completezza e precisione delle specifiche siano alla base di un progetto efficace.&lt;br /&gt;
&lt;br /&gt;
Molto importanti sono state la analisi relative al tipo e formato dei documenti da assumere come input ed alla presentazione ottimale del servizio rispetto all'usabilità. &lt;br /&gt;
&lt;br /&gt;
Centrale nel lavoro ed avvincente è stata la definizione della strategia per il riconoscimento dei lessemi attraverso la costruzione dinamica di ''regex'' idonee. In questo fase del lavoro, anche per passione personale, ho approfondito le questioni del riconoscimento &amp;quot;di testi nei testi&amp;quot; che legano, fin dalle origini, l'informatica e la linguistica.&lt;br /&gt;
&lt;br /&gt;
La fase di definizione dell'architettura del servizio mi ha permesso di ripercorrere molte le materie studiate nei tre anni del Corso di Ingegneria Informatica, affrontando argomenti  come il Single Responsibility Principle, il Dependency Inversion Principle, lo &amp;quot;stile&amp;quot; architetturale REST. Molto istruttiva è stata anche la riflessione sulla scomposizione del servizio in moduli software.&lt;br /&gt;
&lt;br /&gt;
Come sempre accade nell'affrontare un progetto nuovo, sono nate molte nuove idee; ho così immaginato numerosi sviluppi futuri, sia a perfezionamento funzionale dell'accesso web al servizio, sia ad estensione delle specifiche per coprire casi applicativi contigui (es. quando il dato che si vuole trattare è un codice fiscale). Dovendo necessariamente tener presente che questo lavoro è una tesi, verificherò con il supporto del mio relatore come poterne proseguire lo sviluppo.&lt;br /&gt;
&lt;br /&gt;
==Bibliografia==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0000]https://en.wikipedia.org/wiki/Comparison_of_Office_Open_XML_software&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0001]https://en.wikipedia.org/wiki/Comparison_of_OpenDocument_software&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0002]https://en.wikipedia.org/wiki/Standardization_of_Office_Open_XML&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0003]https://en.wikipedia.org/wiki/OpenDocument_standardization&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0004]https://support.apple.com/en-us/HT202227&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0005]https://en.wikipedia.org/wiki/Pages_(word_processor)&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0006]https://en.wikipedia.org/wiki/Comparison_of_word_processors&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0007]https://en.wikipedia.org/wiki/OpenDocument&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0008]https://en.wikipedia.org/wiki/Office_Open_XML_file_formats&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0009]https://en.wikipedia.org/wiki/Rich_Text_Format&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0010]https://www.ecma-international.org/publications/standards/Ecma-376.htm&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0011]https://www.iso.org/standard/51463.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0012]https://www.iso.org/standard/71691.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0013]https://en.wikipedia.org/wiki/Office_Open_XML&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0014]https://en.wikipedia.org/wiki/Open_Packaging_Conventions&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0015]https://en.wikipedia.org/wiki/LAMP_(software_bundle)&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0016]https://w3techs.com/blog/entry/debian_ubuntu_extend_the_dominance_in_the_linux_web_server_market_at_the_expense_of_red_hat_centos&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0017]https://news.netcraft.com/archives/2014/06/06/june-2014-web-server-survey.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0018]https://whatis.techtarget.com/definition/LAMP-Linux-Apache-MySQL-PHP&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0019]https://www.ibm.com/cloud/learn/lamp-stack-explained&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0020]https://en.wikipedia.org/wiki/Single_responsibility_principle&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0021]https://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0022]https://en.wikipedia.org/wiki/Latin_script_in_Unicode&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0023]https://it.wikipedia.org/wiki/ISO/IEC_8859-1&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0024]http://www.treccani.it/enciclopedia/uso-delle-maiuscole_%28La-grammatica-italiana%29/&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0025]https://en.wikipedia.org/wiki/Ambiguity#Linguistic_forms&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0026]Steven L. Small; Garrison W Cottrell; Michael K Tanenhaus (22 October 2013). Lexical Ambiguity Resolution: Perspective from Psycholinguistics, Neuropsychology and Artificial Intelligence. Elsevier Science. ISBN 978-0-08-051013-2.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0027]http://www.treccani.it/vocabolario/disambiguazione/&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0028]R. Navigli, K. Litkowski, O. Hargraves. 2007. SemEval-2007 Task 07: Coarse-Grained English All-Words Task. Proc. of Semeval-2007 Workshop (SemEval), in the 45th Annual Meeting of the Association for Computational Linguistics (ACL 2007), Prague, Czech Republic, pp. 30–35 http://www.aclweb.org/anthology/S/S07/S07-1006.pdf&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0029]https://wordnet.princeton.edu/&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0030]R. Navigli, S. P. Ponzetto. BabelNet: Building a Very Large Multilingual Semantic Network. Proc. of the 48th Annual Meeting of the Association for Computational Linguistics (ACL 2010), Uppsala, Sweden, July 11-16, 2010, pp. 216-225. http://aclweb.org/anthology/P/P10/P10-1023.pdf&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0031]Roventini A., Alonge A., Calzolari N., Magnini B., Bertagna F. (2000), &amp;quot;ItalWordNet: a Large Semantic Database for Italian&amp;quot;, Proc. of the 2nd International Conference on Language Resources and Evaluation (LREC 2000), Athens, Greece, 2000, pp. 783-790.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0032]E. Pianta, L. Bentivogli, C. Girardi. MultiWordNet: developing an aligned multilingual database, Proc. of the First International Conference on Global WordNet, Mysore, India, January 21-25, 2002. http://multiwordnet.fbk.eu/paper/MWN-India-published.pdf&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0033]https://www.iso.org/standard/28245.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0034]https://www.gpdp.it/web/guest/regolamentoue&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0035]https://eur-lex.europa.eu/legal-content/IT/TXT/?uri=uriserv:OJ.L_.2016.119.01.0001.01.ITA&amp;amp;toc=OJ:L:2016:119:TOC&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0036]https://www.corriere.it/Primo_Piano/Cronache/2006/09_Settembre/15/cognomi.shtml&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0037]https://data.world/axtscz/italian-first-names&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0038]https://en.wikipedia.org/wiki/Dependency_inversion_principle&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0039]https://imperialcollegelondon.app.box.com/s/lqqcugie51pllz26uixjvx0uio8qxgo5/file/493461282808&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0040https://www.docx4java.org/trac/docx4j]&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0041]https://github.com/plutext/docx4j&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0042]https://docs.oracle.com/javase/9/docs/api/java/lang/String.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0043]https://github.com/php/php-src/blob/master/ext/session/session.c&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0044]https://github.com/plutext/docx4j/search?q=getJAXBNodesViaXPath+in%3Afile&amp;amp;type=Code&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0045]https://www.w3.org/TR/xpath-30/&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0046]https://www.istat.it/it/dati-analisi-e-prodotti/contenuti-interattivi/contanomi&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0047]&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0048]&lt;br /&gt;
&lt;br /&gt;
==Indice delle figure==&lt;br /&gt;
&lt;br /&gt;
[0F00]https://en.wikipedia.org/wiki/Latin_script&lt;br /&gt;
&amp;lt;!-- [[File:Latin alphabet world distribution.svg|thumb|upright=1.6|In verde scuro le nazioni dove è usato solo l'alfabeto latino; in verde chiaro quelle dove all'alfabeto latino è affiancato un altro alfabeto.]] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[0F01]Diagramma di Venn 1&lt;br /&gt;
&lt;br /&gt;
[0F02]Diagramma di Venn 2&lt;br /&gt;
&lt;br /&gt;
[0F03]Diagramma di Venn 3&lt;br /&gt;
&lt;br /&gt;
[0F04]Esito unit test regex (cartella immagini)&lt;br /&gt;
&lt;br /&gt;
[0F05]Inforgrafica GDPR&lt;br /&gt;
&lt;br /&gt;
[0F06]Diagramma di sequenza UML&lt;br /&gt;
&lt;br /&gt;
[0F07]Primo calcolo valutazione algoritmo&lt;br /&gt;
&lt;br /&gt;
[0F08]Secondo calcolo valutazione algoritmo&lt;br /&gt;
&lt;br /&gt;
[0F09]Terzo calcolo valutazione algoritmo&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Servizio_web_per_il_trattamento_dei_dati_personali_contenuti_in_documenti_OOXML_complessi&amp;diff=169</id>
		<title>Servizio web per il trattamento dei dati personali contenuti in documenti OOXML complessi</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Servizio_web_per_il_trattamento_dei_dati_personali_contenuti_in_documenti_OOXML_complessi&amp;diff=169"/>
		<updated>2019-09-30T03:49:28Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: /* Ottimizzazioni del processo di minimizzazione */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduzione==&lt;br /&gt;
&lt;br /&gt;
Il recente Regolamento Generale europeo sulla Protezione dei Dati (UE) 2016/679 ([0034], [0035]) o ''GDPR'' (''General Data Protection Regulation'', come nel seguito sarà chiamato) ha modernizzato significativamente la normativa in materia di protezione dei dati personali, rendendola omogenea fra tutti gli stati membri. È bene notare che, fin dal titolo, il ''GDPR'' non riduce gli spazi per i trattamenti di dati personali, ma anzi ne protegge la &amp;quot;libera circolazione&amp;quot;, dettando, però, regole definite e certe. Rinunciando ad una presentazione più completa del ''GDPR'', saranno riportati nei successivi capitoli i concetti necessari alla discussione dell'argomento.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Enti ed organizzazioni, aventi a che fare con documenti contenenti dati sensibili, devono operare in maniera conforme al ''GDPR''; potrebbero, di conseguenza, trarre beneficio da servizi specifici in grado di supportarli in queste esigenze.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
L'oggetto principale della tesi sarà dunque, come riportato dal titolo, la progettazione e la realizzazione di un servizio per la gestione di dati personali.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F05])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La larga maggioranza dei documenti testuali viene generata con strumenti cosiddetti di &amp;quot;produttività individuale&amp;quot;, cioè da ''word-processors''. L'osservazione, ovvia nella sua evidenza, consente di introdurre una riflessione: quando un documento è generato da un'elaborazione automatica, magari per composizione di ''template'' con dati estratti da un database, l'individuazione dei &amp;quot;dati personali&amp;quot; nel documento prodotto può avvenire in modo rigoroso e senza incertezze, sulla base degli elementi di composizione del documento; ad es.: i campi del documento estratti da una anagrafica di soggetti sono certamente dati personali e come tali possono essere opportunamente trattati nel processo di elaborazione automatica (ad es. cancellati).&lt;br /&gt;
&lt;br /&gt;
Ma, in quella larga maggioranza di documenti testuali generata con ''word-processors'' l'individuazione ed il trattamento dei dati personali vanno affrontati con altri approcci, discussi in questa tesi.&lt;br /&gt;
&lt;br /&gt;
==Scenario di lavoro==&lt;br /&gt;
&lt;br /&gt;
===Minimizzazione dei dati personali===&lt;br /&gt;
&lt;br /&gt;
Un concetto espresso in modo pervasivo dal ''GDPR'' è quello della &amp;quot;''minimizzazione''&amp;quot; dei dati personali trattati ed a maggior ragione dei dati personali pubblicati. In particolare l'Art. 5 ed il Considerando 39 prescrivono che i dati personali trattati siano &amp;quot;''adeguati, pertinenti e limitati a quanto necessario rispetto alle finalità per le quali sono trattati («minimizzazione dei dati»)''&amp;quot; ([0035]).&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Con questo fine, il GDPR delinea due possibilità organizzative e tecniche di &amp;quot;''minimizzazione''&amp;quot;: l'anonimizzazione e la psedonimizzazione.&lt;br /&gt;
&lt;br /&gt;
====Anonimizzazione====&lt;br /&gt;
&lt;br /&gt;
Sono anonimizzati i dati personali non (più) riferibili alle persone a cui sono appartenuti; si tratta di serie di dati, spesso ingenti, che sono stati definitivamente ed irreversibilmente separati da ogni riferimento alle persone che caratterizzavano. Sono le serie di dati utilizzate per fini statistici, scientifici, etc. E' importante notare che, come fissato dal Considerando 26 del ''GDPR'', il Regolamento non si applica al &amp;quot;''trattamento di tali informazioni anonime''&amp;quot; ([0035]). Per questo, sottoporre database e documenti ad un procedimento, cioè un trattamento, di anonimizzazione consente di non doversi più preoccupare del ''GDPR''.&lt;br /&gt;
&lt;br /&gt;
====Pseudonimizzazione====&lt;br /&gt;
&lt;br /&gt;
Fra le definizioni dell'Art. 4 del ''GDPR'', la &amp;quot;pseudonimizzazione&amp;quot; viene indicata come &amp;quot;''il trattamento tale che i dati personali non possano più essere attribuiti a un interessato specifico senza l’utilizzo di informazioni aggiuntive, a condizione che tali informazioni aggiuntive siano conservate separatamente''&amp;quot; ([0035]).&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Traducendo in termini &amp;quot;operativi&amp;quot;, si tratta del procedimento che, dal &amp;quot;record&amp;quot; dei dati di un interessato, separa i campi che caratterizzano l'interessato stesso da quelli che lo identificano, trasferendo questi ultimi in una nuova distinta tabella; nelle due tabelle vengono aggiunti i riferimenti che permettono la ricostruzione del record originario; il procedimento è completo quando la nuova tabella con gli identificativi viene archiviata separatamente ed eventualmente cifrata. In margine si annota che in molti casi, come molti studi dimostrano, è possibile identificare, quindi &amp;quot;riconoscere&amp;quot;, gli interessati utilizzando la sola tabella con i dati pseudonimizzati.&lt;br /&gt;
&lt;br /&gt;
====Altri trattamenti di &amp;quot;minimizzazione&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Un problema pratico che si incontra di frequente è quello di dover pubblicare documenti più o meno ampi che contengono dati personali. Spesso la pubblicazione è obbligatoria per legge: si pensi alle graduatorie relative a concorsi pubblici, alle sentenze dei tribunali, etc.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In questi frequenti casi, analizzando meglio le finalità per le quali sono pubblicati quei dati personali, si osserva che sono possibili e legittimi almeno due approcci per &amp;quot;minimizzare&amp;quot; il dato nel &amp;quot;trattamento di pubblicazione&amp;quot; e, dunque, per minimizzarne la propagazione, ad esempio attraverso motori di ricerca, ben oltre ogni ragionevole finalità. I contesti ed i corrispondenti approcci sono:&lt;br /&gt;
#  Situazioni in cui è necessario che l'interessato possa riconoscersi nel documento ed essere riconosciuto dagli altri soggetti menzionati nel contesto, ma non è plausibile la necessità di identificazione dell'interessato al di fuori di quel contesto specifico. A questo caso si riconducono le graduatorie di concorsi, gli elenchi per la formazione di classi, gli elenchi per convocazioni, etc. In tutti questi casi, nel processo di redazione del documento è più pratico trattare internamente i dati personali in forma completa; ma praticamente mai è necessario pubblicarli per intero, esponendo al pubblico accesso codici fiscali, indirizzi, recapiti telefonici etc. Per di più, nella maggior parte delle volte, è sufficiente pubblicare il solo cognome perché l'interessato conosca la sua posizione in graduatoria; ciò è spesso sufficiente anche a trasmettere l'informazione necessaria ai colleghi dell'interessato nella medesima graduatoria, o nella medesima classe, etc. Notare che, pubblicando il solo cognome, viene di fatto oscurato anche il sesso. Dunque, in questi casi è auspicabile cancellare una larga parte dei dati personali presenti nel documento.&lt;br /&gt;
# Situazioni in cui il documento deve essere pubblicato affinché siano rese note le motivazioni che lo hanno originato, senza che sia necessaria la precisa identificazione dei soggetti che vi compaiono. Questo è il caso della pubblicazione di sentenze giudiziarie di ogni grado. Le sentenze vengono notificate direttamente agli &amp;quot;aventi causa&amp;quot;; ma anche, come la legge prescrive, pubblicate al fine di costituire giurisprudenza. In questo secondo caso, risulta del tutto eccedente la pubblicazione dei reali nominativi degli interessati, che troverebbero verosimilmente la propria vicenda inutilmente indicizzata dai motori di ricerca negli anni a venire. Nella pubblicazione delle sentenze appare un approccio ottimale quello di sostituire con pseudonimi o con iniziali alterate i veri nominativi degli interessati presenti: il senso e le argomentazioni della sentenza restano pienamente comprensibili, come è necessario; il dato personale, del tutto superfluo ai fini della giurisprudenza, viene protetto.&lt;br /&gt;
In questi casi appare opportuno sostituire i dati identificativi dell'interessato, ed in particolare il nome e cognome, con pseudonimi o, ancora, con iniziali alterate, cioè non coincidenti con le iniziali reali. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Proprio questi tipi di trattamenti di &amp;quot;minimizzazione&amp;quot; sono l'oggetto di questa tesi.&lt;br /&gt;
&lt;br /&gt;
===Punti di partenza per la progettazione del servizio===&lt;br /&gt;
&lt;br /&gt;
La tesi è stata svolta in collaborazione con l'azienda AFA Systems (www.afasystems.it/gdpr) con la quale si sono discusse le problematiche di progettazione e realizzazione di un servizio generalizzato di minimizzazione dei dati personali presenti in un documento.&lt;br /&gt;
Con l'intenzione di fornire il servizio ad un bacino d'utenza il più vasto e variegato possibile, si è pensato ad un'applicazione ''web-based'', indipendente così dai singoli devices sui quali poi sarà utilizzata.&lt;br /&gt;
L'attenzione è stata concentrata sul trattamento dei nomi e dei cognomi (che da qui chiameremo nominativi), poiché sono quelli sempre presenti nei documenti (ad es. gli indirizzi sono presenti solo a volte), rappresentano gli elementi tramite i quali è immediato il riconoscimento della persone, non hanno formato predefinito (come ad es. i codici fiscali); altri dati personali (indirizzi, codici fiscali, etc.), potranno essere considerati in successive evoluzioni del progetto.&lt;br /&gt;
È utile notare che la parte iniziale della collaborazione con l'azienda è stata dedicata alla discussione delle specifiche, la cui più precisa definizione è parte rilevante di questa tesi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Tra i requisiti che necessitano di un opportuno studio troviamo ad esempio:&lt;br /&gt;
* L'individuazione di metodi efficaci per il riconoscimento dei nominativi nei documenti&lt;br /&gt;
* L'identificazione delle migliori procedure di interazione con l'utente&lt;br /&gt;
* La scelta dei formati da trattare&lt;br /&gt;
* I vincoli non funzionali legati al rispetto del ''GDPR''.&lt;br /&gt;
&lt;br /&gt;
==Definizione delle specifiche==&lt;br /&gt;
&lt;br /&gt;
===Riconoscimento dei nominativi===&lt;br /&gt;
&lt;br /&gt;
====Scelta della strategia di riconoscimento====&lt;br /&gt;
 &lt;br /&gt;
Le difficoltà principali con cui ci si imbatte nel processo di riconoscimento dei nominativi riguardano la complessità strutturale dei documenti di testo, ma soprattutto l'intrinseca ambiguità del linguaggio naturale. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Le variabili ed impredicibili strutture e formattazioni dei documenti introducono alcuni problemi significativi. Rendendo fortemente eterogeneo il contenuto dei documenti, infatti, esse non consentono di ricondurre il problema del riconoscimento dei nominativi ad uno o a pochi singoli casi, ma comportano lo studio di tutte le strutture e formattazioni possibili, rendendo quindi l'analisi molto generale. L'altra rilevante difficoltà presente sta nella complessità di effettuare il riconoscimento di una stringa testuale immersa in un insieme di elementi non tutti testuali. Ogni elemento di formattazione, che sia una tabella o una barra orizzontale, introduce infatti un proprio significato logico e semantico nel documento di cui bisogna tenere conto.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Il linguaggio naturale introduce anch'esso complessità: si pensi alle molteplici tipologie di proposizioni con cui possono essere articolati i periodi; ma i problemi principali derivano dalle sue ambiguità. Esse vengono classificate in diverse tipologie ([0025]); le principali sono le ambiguità sintattiche e lessicali.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si ha ambiguità sintattica quando la sintassi di una frase può essere interpretata in diversi modi e, di conseguenza, la frase stessa assume significati diversi. Essa è presente, ad esempio, nelle seguenti frasi:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
* &amp;quot;''Rapina in banca con rivoltella da centomila euro''&amp;quot;&lt;br /&gt;
* &amp;quot;''Luigi ha visto un uomo nel parco con il binocolo''&amp;quot;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
L'esasperazione massima della problematica delle ambiguità sintattiche si presenta con l'&amp;lt;i&amp;gt;antinomia&amp;lt;/i&amp;gt;, ossia un particolare tipo di paradosso che indica la compresenza di due affermazioni contraddittorie che possono essere entrambe dimostrate o giustificate.&lt;br /&gt;
L'antinomia di Epimenide o ''Paradosso del mentitore'', nota fin dal VI secolo, è probabilmente uno dei più noti esempi: &amp;quot;''il cretese Epimenide afferma che tutti i cretesi mentono''&amp;quot;. Se la proposizione è vera (i cretesi mentono) allora il suo significato implica che sia falsa (Epimenide mente e quindi i cretesi dicono la verità), ma se è falsa (i cretesi dicono la verità) ciò significa che è vera (Epimenide dice la verità e quindi i cretesi mentono). La proposizione appare contemporaneamente vera e falsa. A partire dagli anni venti del '900, sono state elaborate varie teorie per la risoluzione delle contraddizioni provocate dalle antinomie, soprattutto attraverso l'elaborazione di linguaggi multilivello o attraverso l'elaborazione di logiche polivalenti (quindi non-booleane).&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si ha ambiguità lessicale, invece, quando una parola possiede più di un significato nella lingua a cui appartiene ([0026]), in tal caso la parola è definita ''polisemica''. In italiano, alcuni termini soggetti a questo tipo di ambiguità sono, ad esempio &amp;quot;''acuto''&amp;quot; o &amp;quot;''venti''&amp;quot;. È questo genere di ambiguità che risulta critico per il riconoscimento dei nominativi. La difficoltà determinata dalle ambiguità sintattiche, infatti, riguarda l'individuazione corretta di soggetti, predicati e complementi di un periodo, mentre le ambiguità lessicali ostacolano la comprensione del significato del singolo lessema. Nel processo di riconoscimento è irrilevante determinare la funzione logica che il nominativo svolge nella frase, mentre è necessario essere certi che i termini che compongono il nominativo siano effettivamente dei nomi propri di persona o dei cognomi, non altri vocaboli del lessico comune. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In linguistica, l'intervento con cui si toglie ambiguità a una parola o a una frase prende il nome di &amp;quot;disambiguazione&amp;quot; ([0027]). Il problema della disambiguazione automatica (in inglese ''Word Sense Disambiguation'' o, abbreviato, ''WSD'') riveste particolare importanza nelle ricerche sull'intelligenza artificiale e, in particolare, nell'elaborazione del linguaggio naturale. Si prevedono benefici della disambiguazione, ad esempio, in programmi di traduzione automatica, recupero dell'informazione o estrazione automatica di informazioni. Nell'analisi delle soluzioni esistenti in letteratura per la risoluzione delle ambiguità, ci si sofferma specialmente sulle ricerche incentrate sul trattamento dell'ambiguità lessicale, essendo essa la più rilevante per i nostri interessi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
La ''WSD'' richiede due input necessariamente: un dizionario per specificare i sensi che devono essere disambiguati e un corpus di dati linguistici da disambiguare. Nello scenario più realistico, si trattano testi le cui parole non sono note a priori e risulta molto onerosa la produzione del corpus, essendo infatti necessaria la valutazione di un operatore umano per verificare la correttezza delle disambiguazioni effettuate dagli algoritmi (''supervised learning'').&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Uno tra i principali dizionari semantici-lessicali utilizzati della lingua inglese è ''WordNet'' ([0029]), mentre alcuni dei database equivalenti che trattano l'italiano sono ''BabelNet'' ([0030]), ''ItalWordNet'' ([0031]) e ''MultiWordNet'' ([0032]).&lt;br /&gt;
Un elemento importante da considerare è che le prestazioni di disambiguazione per la lingua inglese, impiegando ''WordNet'', risultano corrette tra l'80% e il 90% delle volte ([0028]), percentuali discrete ma non sufficienti per avere la totale garanzia.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
I fattori che ostacolano la realizzazione di algoritmi di intelligenza artificiale per la disambiguazione sono molteplici:&lt;br /&gt;
# Differenze tra dizionari impiegati: i database prima citati si basano su varie fonti che raggruppano semanticamente in maniera diversa i vocaboli, quindi programmi sviluppati con dizionari diversi generalmente hanno performance differenti.&lt;br /&gt;
# Complessità della codifica di parte del discorso: per poter disambiguare correttamente un termine è importante riuscire a comprendere correttamente il contesto in cui è inserito, operazione non banale.&lt;br /&gt;
# Varianza tra giudici: i supervisori dell'apprendimento degli algoritmi possono avere opinioni diverse, o semplicemente sbagliare, nella valutazione delle disambiguazioni, ciò porta ad algoritmi che hanno comportamenti diversi.&lt;br /&gt;
# Impossibilità di applicare la disciplina della ''pragmatica'', ossia la logica del ''buon senso'': per identificare correttamente il senso di alcune parole, ad esempio nella comprensioni di anafore e catafore, è necessario applicare il buon senso.&lt;br /&gt;
# Dipendenza del senso delle parole dai contesti: ogni scenario richiede la propria divisione del significato delle parole in sensi rilevanti. In un contesto informatico, ad esempio, il termine &amp;quot;''mouse''&amp;quot; deve essere ricondotto al dispositivo di puntamento, non al cognome del celebre personaggio Disney ''Mickey Mouse''; viceversa dovrà invece avvenire in un contesto di letteratura a fumetti.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Laddove la ''WSD'' è una tecnica molto generale e che mira a risolvere un'ambiguità riguardante una qualunque parola, per le finalità del servizio oggetto di questa tesi è sufficiente risolvere le ambiguità dei nomi e dei cognomi. &lt;br /&gt;
Uno dei difetti che il servizio presenterebbe adottando un approccio ''WDS'' è legato alla impredicibile formattazione dei documenti, che aggiunge informazione semantica al testo ma introduce complessità nella individuazione automatica delle parti che formano il contesto; un altro difetto dipende dalla vastità del lessico da elaborare, essendo i documenti da trattare forniti dai più disparati utenti, su qualunque genere di argomento e relativi ai più vari ambiti.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La strategia che sarà adottata per risolvere la problematica del riconoscimento dei nominativi sarà impostata attraverso un modello ''pattern-based'', impiegando le ''regular expressions'' (''regex''). Esse risultano comunemente usate per effettuare operazioni di ricerca o sostituzione in un testo, di conseguenza se si riesce ad individuare un pattern associato ad un nominativo dato, allora sarà possibile processare il documento ricercando le occorrenze del nominativo e &amp;quot;minimizzarlo&amp;quot; opportunamente.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le ''regular expressions'' risultano particolarmente efficaci poiché, se opportunamente progettate, possono identificare un nominativo indipendentemente dal significato linguistico del contesto in cui è calato, basandosi piuttosto sui singoli caratteri che compongono i lessemi analizzati; permettono, di conseguenza, di effettuare una valutazione estremamente minuziosa, riducendo al minimo le possibilità di errori.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Un algoritmo di risoluzione ''pattern-based'' risulta, inoltre, più efficiente nell'esecuzione, in generale, di un algoritmo di intelligenza artificiale; per fornire la risposta il più velocemente possibile ad un utente, fruitore del servizio via web, l'approccio di riconoscimento tramite pattern è il più indicato.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Definizione dei pattern====&lt;br /&gt;
Nella progettazione del servizio si adotta, come detto, un approccio ''pattern-based'' per il riconoscimento dei nominativi. In linea di massima è opportuno che vengano riconosciuti più nominativi possibili e allo stesso tempo che la correttezza dell'identificazione di un nominativo sia garantita, quindi bisogna individuare dei pattern non troppo stringenti ma neppure troppo laschi. Per analizzare come i pattern devono essere strutturati si prende come caso di studio un generico nominativo, ad esempio ''Lorenzo Mario Amorosa''. Nel documento esso può comparire esattamente come appena indicato, ma anche in altre plausibili varianti, in cui l'ordine dei termini viene alterato, si pensi ad esempio ad &amp;quot;Amorosa Lorenzo Mario&amp;quot; o &amp;quot;Mario Lorenzo Amorosa&amp;quot;, o in altre varianti ancora in cui alcuni nomi non compaiono, come in &amp;quot;Lorenzo Amorosa&amp;quot;. Bisogna tuttavia supporre un limite alla variabilità: si osserva infatti che il cognome deve sempre comparire (il solo nome ''Lorenzo'' non è riconducibile a ''Lorenzo Mario Amorosa'') e che esso inoltre deve essere necessariamente anteposto o posposto, ma non interposto, ai nomi (è poco ragionevole ricondurre &amp;quot;Lorenzo Amorosa Mario&amp;quot; a &amp;quot;Lorenzo Mario Amorosa'').&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Questa prima specifica permette di ricondursi a una soluzione generale, sufficiente nella maggior parte dei casi, ma che non risolve alcune criticità. Un nominativo può, in alcuni documenti, comparire manifestandosi unicamente attraverso il cognome (riferendoci all'esempio precedente, ''Lorenzo Mario Amorosa'' apparirebbe nella forma ''Amorosa''). Sorge qui il problema che molti dei cognomi italiani hanno un significato proprio nel linguaggio comune; ad es., nella frase ''una relazione amorosa è bella'' è errato considerare la parola ''amorosa'' come cognome di un nominativo. Per risolvere questo genere di ambiguità si potrebbe pensare che per stabilire che il termine ''Amorosa'' sia un cognome sia sufficiente verificare che esso inizi con una lettera maiuscola, ma ciò può verificarsi anche perché la parola si trova ad inizio di frase. Inoltre, vari cognomi italiani possono iniziare con una lettera minuscola (''de Angelis'', ''d'Onofrio'', etc.), quindi basare l'identificazione di un cognome sul fatto che la sua prima lettera sia in maiuscolo non è in generale un metodo valido. Volendo in maniera prioritaria garantire il corretto funzionamento del servizio, e quindi attuare le procedure di anonimizzazione solo sui nominativi senza applicarle erroneamente ad altri termini, risulta necessario evitare il trattamento dei nominativi che si manifestano con i soli cognomi. Per via del contesto e dei significati che i cognomi possono assumere, infatti, risulta spesso impossibile distinguerli da parole del linguaggio comune. &lt;br /&gt;
&lt;br /&gt;
Ci si concentra, quindi, nello studio di nominativi composti da un cognome seguito o preceduto da uno o più nomi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si rappresenta dunque in formato di ''regular expression'' il pattern attualmente ideato. Per semplicità espositiva, si definisce il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; come l'insieme delle permutazioni di tutti i nomi del nominativo più l'insieme delle permutazioni di tutti i possibili sottoinsiemi di nomi del nominativo. Considerando il nominativo preso precedentemente come caso di studio, ad esempio, si avrebbe:&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt; &amp;lt;nomi&amp;gt; = Lorenzo Mario|Mario Lorenzo|Lorenzo|Mario&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Posto inoltre il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt; ad indicare il cognome contenuto nel nominativo e il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;regex&amp;gt;&amp;lt;/span&amp;gt; ad indicare la ''regular expression'' associata al nominativo, si ottiene:&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt; &amp;lt;regex&amp;gt; := &amp;lt;cognome&amp;gt; (&amp;lt;nomi&amp;gt;)|(&amp;lt;nomi&amp;gt;) &amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Una osservazione sottile ma di fondamentale importanza per la corretta progettazione delle ''regular expressions'' sta nella piena comprensione della semantica dell'operatore di scelta, espresso con il carattere ''pipe'' (&amp;quot;|&amp;quot;). Un qualunque ''engine'' di elaborazione delle ''regex'', infatti, interrompe la valutazione di una stringa non appena può stabilire se tale stringa fa match o meno con il pattern dato, senza quindi necessariamente valutarlo nella sua interezza, come parimenti avviene nelle valutazioni ''a corto circuito'' delle espressioni logiche nei linguaggi di programmazione. Ogni nominativo avrà a sè associato un pattern che lo rappresenta in più possibili sequenze di caratteri; per effettuare una corretta &amp;quot;minimizzazione&amp;quot; dei dati è necessario che le sequenze contenenti tutti i nomi sia poste per prime, mentre quelle contenenti un singolo nome per ultime.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In questa prima formulazione della ''regex'', inoltre, si è posto come separatore unicamente lo spazio bianco, ma alcuni documenti potrebbero contenere dei nominativi i cui termini sono separati da altri caratteri, come ad esempio una virgola nel caso di &amp;quot;Amorosa, Lorenzo Mario&amp;quot;. Per poter quindi identificare un nominativo anche in questi casi, si potrebbe considerare un qualunque carattere di interpunzione come possibile separatore dei termini del nominativo.&lt;br /&gt;
Adottando questa soluzione si ha però come effetto collaterale che risultano critici i casi in cui nel testo sono presenti dei nominativi soggetti ad omonimia. Si consideri una generica frase contenente una sequenza di nominativi, ad esempio ''Amorosa Lorenzo, Mario Giacomo e Fabio Rossi'', e si supponga che i nominativi da trattare siano ''Amorosa Lorenzo Mario'', ''Mario Giacomo'' (in cui la parola ''Mario'' è il cognome) e ''Fabio Rossi''. Gli ultimi due nominativi compaiono nella frase nella loro forma estesa, mentre il primo compare con il solo nome ''Lorenzo'' (eventualità possibile considerando la definizione del pattern precedentemente data). Considerando la virgola come carattere separatore dei termini del nominativo, la sequenza di parole ''Amorosa Lorenzo, Mario'' sarebbe ricondotta, venendo elaborata per prima, ad ''Amorosa Lorenzo Mario'', mentre rimarrebbe non trattata la parola ''Giacomo'', in quanto il cognome ''Mario'' che gli era associato è stato già identificato come un nome del nominativo ''Amorosa Lorenzo Mario'' ed il termine ''Giacomo'' preso singolarmente non rappresenta un nominativo.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Prima di valutare ulteriormente le problematiche relative alle omonimie, si possono scegliere due approcci per risolvere questo specifico caso:&lt;br /&gt;
# Si riconduce una sequenza di parole ad un nominativo se e solo se tutti i suoi nomi sono contenuti nella sequenza&lt;br /&gt;
# Si considerano come separatori dei termini contenuti nei nominativi solo spazi bianchi, tabulazioni e a capo, non gli altri segni di punteggiatura.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Entrambe le strategie sono valide, in quanto risolvono il problema garantendo la corretta identificazione dei nominativi, ma allo stesso tempo entrambe presentano lo svantaggio di ridurre le sequenze di parole riconducibili a dei nominativi, aumentando le possibilità che alcuni di essi non vengano trattati.&lt;br /&gt;
Si consideri nuovamente il nominativo preso come caso di studio ''Amorosa Lorenzo Mario'': applicando la prima strategia, non sarebbe possibile ricondurgli la sequenza ''Amorosa Lorenzo'', mentre applicando il secondo metodo non sarebbe riconducibile la sequenza ''Amorosa, Lorenzo Mario''.&lt;br /&gt;
Si decide di attuare la seconda strategia, in quanto è opportuno non imporre vincoli troppo stringenti sui nomi e poiché nella gran parte dei casi i termini dei nominativi nei documenti sono separati tra loro da caratteri quali spazi bianchi, tabulazioni ed a capo.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Un altro elemento su cui porre l'attenzione è la possibilità che i documenti da trattare contengano dei nominativi scritti interamente in maiuscolo o minuscolo, di conseguenza è conveniente che le ''regular expressions'' siano progettate ''case-insensitive''.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Un ulteriore punto su cui bisogna soffermarsi è la posizione all'interno di un periodo in cui un nominativo può comparire, in particolare si vogliono evitare quei casi critici in cui uno dei termini del nominativo è una sotto-stringa di un'altra parola del testo (si pensi ad ''amorosa'' in ''clamorosa''). Come regola generale si può stabilire che è sempre necessario che un nominativo sia preceduto e seguito da un ''carattere non alfabetico''. Un caso particolare si presenta quando il nominativo è posto ad inizio o a fine documento, situazione in cui quindi esso non è preceduto o non è seguito da alcun carattere: entrambe le posizioni sono da considerare corrette.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
È opportuno ora definire il concetto di ''carattere non alfabetico'', e ciò si può fare più facilmente ragionando sul problema in logica positiva; infatti risulta più semplice individuare quei caratteri che rappresentano lettere piuttosto che quelli che rappresentano segni di interpunzione ed individuare ogni altro carattere che non può mai comporre una parola.&lt;br /&gt;
&lt;br /&gt;
Inquadrando lo scenario di applicazione del servizio, molto probabilmente l'utente vorrà trattare un documento scritto nella lingua di uno dei paesi dell'Unione Europea, poiché il ''GDPR'' vige nei soli paesi membri dell'Unione.&lt;br /&gt;
Si può, quindi, ipotizzare che i documenti trattati possono sì contenere parole e nominativi stranieri, ma che i caratteri contenuti siano appartenenti all'alfabeto latino (''Latin script''), usato in molti stati nel mondo e da tutti i principali stati europei (fatta eccezione per la Grecia ed alcuni stati che scrivono in caratteri cirillici).&lt;br /&gt;
Inoltre, testi scritti in altri alfabeti, come esempio il cinese, l'arabo o il cirillico, vengono generalmente traslitterati. Considerare, quindi, ''caratteri non alfabetici'' tutti i caratteri diversi dalle lettere contenute nell'alfabeto latino sarebbe di conseguenza estremamente riduttivo ed inoltre in questo modo non si terrebbe conto delle lettere accentate, molto utilizzate anche nella lingua italiana.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(XXXX QUI IMG [0F00])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per risolvere il problema facciamo riferimento alla codifica standard Unicode dell'alfabeto latino ([0022]); in essa è possibile individuare, oltre ai caratteri rappresentanti le lettere nella codifica ''ASCII'' classica, i caratteri rappresentanti le lettere nella codifica standard ''ISO/IEC 8859-1'' ([0023]), encoding orientato principalmente alla rappresentazione delle lingue dell'Europa occidentale.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;i&amp;gt;Caratteri latini nei primi due blocchi dello standard Unicode&amp;lt;/i&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;nounderlines&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border-collapse:collapse&amp;quot;&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; &lt;br /&gt;
!style=&amp;quot;background:#ccf; text-align:center; font-weight: bold;&amp;quot;|U+&lt;br /&gt;
!style=&amp;quot;text-align:center; font-weight: bold;&amp;quot;|0||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|1||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|2||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|3||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|4||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|5||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|6||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|7||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|8||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|9||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|A||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|B||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|C||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|D||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|E||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|F||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|Block||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|#&lt;br /&gt;
|-&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|0040&lt;br /&gt;
|style=&amp;quot;background:#fff&amp;quot;|@||A||B||C||D||E||F||G||H||I||J||K||L||M||N||O&lt;br /&gt;
|rowspan=&amp;quot;4&amp;quot; style=&amp;quot;background:#fff&amp;quot; align:&amp;quot;center&amp;quot;|C0 Controls and Basic Latin&amp;lt;br&amp;gt;0000–007F&amp;lt;br&amp;gt;(identical to ASCII)&lt;br /&gt;
|rowspan=&amp;quot;4&amp;quot; style=&amp;quot;background:#fff&amp;quot;|52&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|0050&lt;br /&gt;
|P||Q||R||S||T||U||V||W||X||Y||Z||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#91;||style=&amp;quot;background:#fff&amp;quot;|\||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#93;||style=&amp;quot;background:#fff&amp;quot;|^||style=&amp;quot;background:#fff&amp;quot;|_&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|0060&lt;br /&gt;
|style=&amp;quot;background:#fff&amp;quot;|`||a||b||c||d||e||f||g||h||i||j||k||l||m||n||o&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|0070&lt;br /&gt;
|p||q||r||s||t||u||v||w||x||y||z||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#123;||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#124;||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#125;||style=&amp;quot;background:#fff&amp;quot;|~||style=&amp;quot;background:#fff; font-size:75%&amp;quot;|DEL&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;19&amp;quot;| &lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#fff&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00A0&lt;br /&gt;
|&amp;amp;nbsp;||¡||¢||£||¤||¥||¦||§||¨||©||ª||«||¬||||®||¯&lt;br /&gt;
|rowspan=&amp;quot;6&amp;quot; style=&amp;quot;background:#fff&amp;quot; align=&amp;quot;center&amp;quot;|C1 Controls and Latin-1 Supplement&amp;lt;br&amp;gt;0080–00FF&amp;lt;br&amp;gt;(identical to ISO/IEC 8859-1)&lt;br /&gt;
|rowspan=&amp;quot;6&amp;quot; style=&amp;quot;background:#fff&amp;quot;|62&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#fff&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00B0&lt;br /&gt;
|°||±||²||³||´||µ||¶||·||¸||¹||º||»||¼||½||¾||¿&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00C0&lt;br /&gt;
|À||Á||Â||Ã||Ä||Å||Æ||Ç||È||É||Ê||Ë||Ì||Í||Î||Ï&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00D0&lt;br /&gt;
|Ð||Ñ||Ò||Ó||Ô||Õ||Ö||style=&amp;quot;background:#fff&amp;quot;|×||Ø||Ù||Ú||Û||Ü||Ý||Þ||ß&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00E0&lt;br /&gt;
|à||á||â||ã||ä||å||æ||ç||è||é||ê||ë||ì||í||î||ï&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00F0&lt;br /&gt;
|ð||ñ||ò||ó||ô||õ||ö||style=&amp;quot;background:#fff&amp;quot;|÷||ø||ù||ú||û||ü||ý||þ||ÿ&lt;br /&gt;
|---- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I caratteri indicati in rosso nella tabella sono tutti i possibili ''caratteri alfabetici'' che compaiono nei documenti scritti in 29 lingue diverse ([0023]), tra le quali sono presenti l'italiano, l'inglese, lo spagnolo, il tedesco e il portoghese. &lt;br /&gt;
Aggiungendo pochi altri caratteri all'insieme dei ''caratteri alfabetici'' appena mostrati, si riesce a rappresentare ogni parola di altre 12 lingue ([0023]), tra cui il francese, l'olandese, il ceco e il turco.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
I caratteri mostrati in tabella corrispondono ad una parte dei primi due blocchi dello standard Unicode che codificano l'alfabeto latino e, come già accennato in precedenza, essi sono presenti negli standard ''ASCII'' e ''ISO/IEC 8859-1''. I rimanenti ''caratteri alfabetici'', invece, sono presenti in estensioni dello standard Unicode per il ''Latin script''. Queste estensioni sono state realizzate per fornire il massimo supporto a tutte le lingue e contenenti molti simboli ad uso speciale, come ad esempio per la rappresentazione dei fonemi. Si osserva, inoltre, che i ''caratteri alfabetici'' definiti nelle estensioni dello standard Unicode sono presenti anche nella codifica ''ISO/IEC 8859-2'' o nelle versioni successive ([0023]).&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Definiti i ''caratteri non alfabetici'' come elementi di separazione tra un nominativo ed il testo in cui esso è inserito, occorre definire opportunamente la ''regex'' che al nominativo è associata.&lt;br /&gt;
&lt;br /&gt;
Utili strumenti messi a disposizione dalle ''regular expressions'' sono i gruppi speciali ''lookahead'' e ''lookbehind''. Un pattern di un nominativo deve essere preceduto o seguito da una prestabilita sequenza di caratteri, la quale però non è parte del nominativo. Utilizzando i due costrutti citati, è possibile far sì che nell'elaborazione di una stringa facciano match solamente le parole effettivamente appartenenti al nominativo, non i caratteri che lo delimitano dal resto del testo, e allo stesso tempo che un nominativo faccia match se e solo se preceduto o seguito da una certa sequenza di caratteri. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per esprimere nella sintassi delle ''regex'' un carattere letterale in un qualunque alfabeto si può utilizzare il costrutto ''\p{L}'', che però risulta molto generale e troppo lasco per i requisiti considerati. Si può piuttosto valutare l'impiego del costrutto ''\p{Latin}'', il quale identifica un qualunque carattere alfabetico presente nell'alfabeto latino. Tra i caratteri corrispondenti al costrutto, però, ve ne sono alcuni che per le specifiche del servizio devono essere considerati ''caratteri non alfabetici'', come ad esempio i caratteri dei fonemi, i segni diacritici e gli indicatori ordinali; di conseguenza è necessario individuare una strategia ad hoc per risolvere questa problematica.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per chiarezza espositiva, si definisce il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;start&amp;gt;&amp;lt;/span&amp;gt;, per indicare un qualunque carattere non alfabetico o l'inizio stringa, il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;end&amp;gt;&amp;lt;/span&amp;gt;, per indicare un qualunque carattere non alfabetico o il fine stringa, ed il tag &amp;lt;extra&amp;gt;, per indicare i ''caratteri alfabetici'' non presenti negli standard ''ASCII'' o ''ISO/IEC 8859-1'':&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;extra&amp;gt; := ĿŀČčŘřŠšŽžĲĳŒœŸŐőŰűḂḃĊċḊḋḞḟĠġṀṁṠṡṪṫĀāĒēĪīŌōŪūİıĞğŞşẀẁẂẃŴŵŶŷǾǿẞ&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;start&amp;gt; := (?&amp;lt;=[^A-Za-zÀ-ÖØ-öø-ÿ&amp;lt;extra&amp;gt;]|^)&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;end&amp;gt; := (?=[^A-Za-zÀ-ÖØ-öø-ÿ&amp;lt;extra&amp;gt;]|$)&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva che si sono utilizzati i gruppi speciali prima descritti e che si sono inseriti i caratteri dello standard Unicode presentati in precedenza. Si definisce nuovamente la ''regular expression'' associata ad un generico nominativo. Applicando i tag appena definiti, il costrutto ''(?i)'' che rende il pattern ''case-insensitive'' ed il costrutto ''\s'' che rappresenta un carattere qualunque tra i separatori non visibili, ossia ''\r \n \t \f \v'' e lo spazio bianco, si ottiene:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;regex&amp;gt; := (?i)(&amp;lt;start&amp;gt;&amp;lt;cognome&amp;gt;\s+(&amp;lt;nomi&amp;gt;)|(&amp;lt;nomi&amp;gt;)\s+&amp;lt;cognome&amp;gt;&amp;lt;end&amp;gt;)&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva, inoltre, che in questa nuova formulazione della ''regular expression'' i nomi sono da intendersi separati tra loro da ''\s+''.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
A questo punto si è quasi giunti alla formulazione finale del pattern da associare ad un nominativo, rimangono solo da trattare alcuni casi critici non ancora risolti.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt; &lt;br /&gt;
Si è già presentato in precedenza il problema legato al fatto che alcuni cognomi possono avere un significato proprio nel lessico comune e che ciò costringeva, quindi, ad abbandonare l'idea di trattare nominativi formati dal solo cognome. Questa problematica di ambiguità si presenta anche con alcuni nomi (si pensi, ad esempio, al nome ''Gioia''). Ciò non rappresenta generalmente un problema, in quanto la coppia nome-cognome che forma il nominativo, presa complessivamente, non è soggetta ad ambiguità. Esistono, però, dei casi in cui questo non è vero. Si prenda in analisi il nominativo ''Gioia Grande'': risulta evidentemente soggetto a rischio di ambiguità. Una soluzione che si può adottare, per risolvere questo caso critico, si basa sull'associazione di un pattern più stringente ai nominativi. In particolare, si osserva che i nomi propri di persona compaiono sempre ed obbligatoriamente, in un documento grammaticalmente corretto, con la prima lettera maiuscola ([0024]). I cognomi, invece, non sono soggetti ad una regola così stringente: un cognome iniziante con una lettera minuscola (come ''de Rosa'') in alcuni casi, ad esempio se posto dopo un punto fermo, può comparire scritto con la prima lettera sia maiuscola che minuscola; naturalmente, in nessuna occorrenza un cognome che inizi con una lettera maiuscola potrà comparire con una minuscola. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Occorre quindi ridefinire, alla luce di queste osservazioni, la ''regex'' associata ad un nominativo, poiché precedentemente era stata posta interamente ''case-insensitive''. Nel pattern, in particolare, i nomi dovranno sempre iniziare con una maiuscola, mentre i cognomi avranno questo vincolo solo se nel nominativo compaiono con la prima lettera maiuscola. Si mostra quindi quali sono i tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; e &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt; associati a due nominativi, ad esempio ''Gioia Grande'' e ''Antonio de Rosa''. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per ''Gioia Grande'' si ha:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt; = G((?i)ioia)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt; = G((?i)rande)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per ''Antonio de Rosa'' si ha:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt; = A((?i)ntonio)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt; = (?i)de Rosa&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si presenta dunque la definizione finale del tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;regex&amp;gt;&amp;lt;/span&amp;gt;. Nella definizione il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; è definito il base al numero di nomi del nominativo ed il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt; è definito in base al carattere iniziale del cognome.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;regex&amp;gt; := &amp;lt;start&amp;gt;&amp;lt;cognome&amp;gt;\s+(&amp;lt;nomi&amp;gt;)|(&amp;lt;nomi&amp;gt;)\s+&amp;lt;cognome&amp;gt;&amp;lt;end&amp;gt;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Vengono inoltre mostrati i valori dei due tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; e &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt; per il nominativo preso come caso di studio in fase iniziale, ossia ''Amorosa Lorenzo Mario''. Si ottiene:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt; = L((?i)orenzo)\s+M((?i)ario)|M((?i)ario)\s+L((?i)orenzo)|L((?i)orenzo)|M((?i)ario)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt; = A((?i)morosa)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Infine, per completezza, viene mostrata la ''regular expression'', associata a quest'ultimo nominativo, risolvendo tutti i tag che la compongono:&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;regex&amp;gt; = (?&amp;lt;=[^A-Za-zÀ-ÖØ-öø-ÿĿŀČčŘřŠšŽžĲĳŒœŸŐőŰűḂḃĊċḊḋḞḟĠġṀṁṠṡṪṫĀāĒēĪīŌōŪūİıĞğŞşẀẁẂẃŴŵŶŷǾǿẞ]|^)(A((?i)morosa)\s+(L((?i)orenzo)\s+M((?i)ario)|M((?i)ario)\s+L((?i)orenzo)|L((?i)orenzo)|M((?i)ario))|(L((?i)orenzo)\s+M((?i)ario)|M((?i)ario)\s+L((?i)orenzo)|L((?i)orenzo)|M((?i)ario))\s+A((?i)morosa))(?=[^A-Za-zÀ-ÖØ-öø-ÿĿŀČčŘřŠšŽžĲĳŒœŸŐőŰűḂḃĊċḊḋḞḟĠġṀṁṠṡṪṫĀāĒēĪīŌōŪūİıĞğŞşẀẁẂẃŴŵŶŷǾǿẞ]|$)&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Gestione delle omonimie====&lt;br /&gt;
&lt;br /&gt;
Nei ragionamenti che hanno portato alla formulazione della ''regular expression'' associata ai nominativi, si è tenuto conto di possibili ambiguità con termini appartenenti al linguaggio comune, risolte con l'introduzione nel pattern di stringhe ''case-sensitive'', e di possibili nominativi posti in sequenza parzialmente omonimi (ossia aventi un nome o il cognome in comune tra loro), gestite con l'imposizione dei soli caratteri separatori non visibili come delimitatori delle parole componenti un nominativo. Per rendere l'analisi completa occorre valutare come ci si debba comportare in altri possibili casi di omonimia. Si osserva, per inciso, che nel pattern individuato nella sezione precedente il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; è stato l'unico non definito formalmente. La definizione di tale tag infatti dipende, oltre che dai nomi del nominativo, anche dall'insieme complessivo dei nominativi da trattare presenti nel documento.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Il caso più semplice di omonimia, che si verifica quando un solo nome o il solo cognome di un nominativo coincide con un nome o il cognome di un altro (come nel caso di ''Lorenzo Mario Amorosa'' e ''Stefano Amorosa''), risulta già ben gestito dall'attuale formulazione del pattern. Infatti, un riconoscimento è determinato quando almeno un nome e il cognome del nominativo appaiono in sequenza.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Il problema si complica quando un nominativo ha due o più componenti in comune con un altro. Si osserva che se l'omonimia riguarda solo i nomi dei nominativi, ciò non risulta problematico, in quanto il cognome, supposto sempre presente nel pattern, funge da elemento di disambiguazione. Si considera da ora, quindi, che i nominativi abbiano il medesimo cognome e si analizzano i casi in cui anche uno o più nomi risultano in comune, attraverso degli esempi: &lt;br /&gt;
* Nomi_A = {&amp;quot;Lorenzo&amp;quot;, &amp;quot;Mario&amp;quot;, &amp;quot;Luca&amp;quot;}; Nomi_B = {&amp;quot;Stefano&amp;quot;, &amp;quot;Mario&amp;quot;}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F01])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In questo caso sono elementi di disambiguazione i nomi ''Lorenzo'' e ''Luca'' per il primo nominativo e ''Stefano'' per il secondo, bisognerà quindi far sì che almeno uno tra tali nomi compaia sempre nelle ''regex'' associate ai nominativi in questione. L'occorrenza ''Mario &amp;lt;cognome&amp;gt;'' rimane ambigua e non può essere trattata.&lt;br /&gt;
* Nomi_A = {&amp;quot;Lorenzo&amp;quot;, &amp;quot;Mario&amp;quot;, &amp;quot;Luca&amp;quot;}; Nomi_B = {&amp;quot;Mario&amp;quot;, &amp;quot;Luca&amp;quot;}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F02])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
L'insieme Nomi_B risulta un sottoinsieme di Nomi_A, di conseguenza solo il primo nominativo presenta degli elementi utili per risolvere l'ambiguità. Nel pattern relativo al primo nominativo dovrà essere presente almeno un tra i nomi non in comune, mentre il pattern del secondo nominativo rappresenterà inevitabilmente espressioni ambigue poiché riconducibili all'altro. Le soluzioni possibili sono due: rifiutarsi di effettuare il trattamento del secondo nominativo oppure decretare che esso è riconosciuto se e solo se appare nella sua forma estesa, presentando quindi tutti i nomi. Quest'ultima soluzione è ragionevole e la si sceglie, poiché così si aumentano, per quanto possibile, le sequenze &amp;quot;minimizzabili&amp;quot;, e viene inoltre messo in conto di informare l'utente opportunamente sulla gestione di questo genere di omonimia per rendere le operazioni trasparenti.&lt;br /&gt;
* Nomi_A = Nomi_B = {&amp;quot;Lorenzo&amp;quot;, &amp;quot;Mario&amp;quot;, &amp;quot;Luca&amp;quot;}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F03])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Qualora l'insieme dei nomi dei due nominativi sia identico risulta impossibile distinguerli e non possono in alcun modo essere trattati, poiché l'ordine con cui compaiono i nomi di un nominativo non rappresenta un elemento di disambiguità. I dati appartenenti a persone completamente omonime contenuti in uno stesso documento, quindi, non sono &amp;quot;minimizzabili&amp;quot; distintamente.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva che è di fondamentale importanza che i documenti che gli utenti forniscono siano grammaticalmente corretti, in quanto un errato uso dei segni di interpunzione può rendere impossibile l'applicazione delle ''regular expression''. Si prenda ad esempio una sequenza anomala di caratteri in cui non è corretto l'uso delle virgole, come &amp;quot;''Amorosa Mario Rossi Giacomo''&amp;quot;: supponendo che nel documento si vogliano trattare i nominativi ''Amorosa Mario'', ''Rossi Mario'' e ''Rossi Giacomo'', risulta impossibile identificare quali tra questi siano rappresentatati nella sequenza.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In conclusione, risultano quindi individuate le strategie che permettono di formulare ''regular expressions'' anche per i nominativi soggetti ad omonimia.&lt;br /&gt;
&lt;br /&gt;
====Formattazione dei documenti====&lt;br /&gt;
 &lt;br /&gt;
I documenti prodotti in enti ed organizzazioni presentano generalmente formattazioni e non sono puramente testuali. Si vuole qui considerare quale debbano essere le interpretazioni più adatte da dare agli elementi grafici per rendere sempre efficace il riconoscimento dei nominativi. In particolare, quindi, non si tratteranno gli elementi di punteggiatura, come parentesi o virgolette, poiché già compresi nelle ''regex'', bensì tutti gli elementi che in un pattern composto da caratteri non sono espressi. Si inizia dunque la rassegna:&lt;br /&gt;
* Elementi di formattazione del testo&lt;br /&gt;
I font, la dimensione dei caratteri, il grassetto, il corsivo, l'evidenziazione e tutti i possibili elementi di modifica della apparizione grafica del testo non alterano il significato dei lessemi coinvolti. Se il cognome di un nominativo è posto in grassetto ed il nome no, ad esempio, la coppia nome-cognome rappresenta sempre il nominativo iniziale; lo stesso vale per gli altri elementi citati.&lt;br /&gt;
* Aree di comparizione del testo&lt;br /&gt;
In genere ogni documento è formato da più sezioni, ha un corpo principale ed eventuali titoli, note a piè pagina, intestazioni ed altre possibili aree. Il trattamento di &amp;quot;minimizzazione&amp;quot;, secondo il ''GDPR'', deve essere effettuato al documento in ogni sua parte, ma ogni sezione deve essere elaborata in maniera indipendente dalle altre sezioni in quanto rappresenta un blocco logico a sé. Ciò significa che, ad esempio, bisogna individuare eventuali nominativi presenti nel titolo, ma non bisogna considerare nominativo una sequenza di parole che è posta in parte nel titolo e in parte nel primo paragrafo del testo.&lt;br /&gt;
* Elementi blocco&lt;br /&gt;
Gli elementi blocco, come ad esempio le immagini, possono causare un'interruzione netta in un paragrafo, suddividendolo quindi in più blocchi logici, che devono essere analizzati separatamente; tuttavia nel caso in cui questi elementi siano posti ''fluttuanti'', ossia ancorati ai bordi della pagina, il testo scorre in un unico flusso e forma quindi un unico blocco logico.&lt;br /&gt;
* Divisione in sillabe&lt;br /&gt;
Un problema rilevante nella formattazione del documento è che spesso, per esigenze estetiche, contiene delle parole divise in sillabe poste su righe diverse e separate da un trattino. Ovviamente se un nome va a capo a fine linea non perde il suo significato semantico, bisognerà quindi continuare a riconoscerlo.&lt;br /&gt;
* Tabelle&lt;br /&gt;
Molti documenti, specialmente quelli contenenti ingenti quantità di nominativi, possono essere strutturati in forma tabellare. Trascurando una trattazione per esteso delle modalità con cui i nominativi potrebbero comparire nelle tabelle, si considera esclusivamente il caso di gran lunga più ricorrente. In genere, infatti, in una tabella contenente dei nominativi, essi sono presenti nella stessa colonna o in colonne contigue: l'una contenente i nomi, l'altra il cognome, o viceversa. Senza basarsi sull'intestazione delle colonne, si può valutare se il contenuto di due celle adiacenti poste su di una stessa riga faccia match con il pattern di un nominativo, ed in caso ciò accada si può affermare la coppia di celle individuata rappresenta un nominativo.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva che si sono fornite solamente le interpretazioni più plausibili e comuni a questi elementi grafici e non si è ideato alcun particolare algoritmo per la loro elaborazione. L'espressione di tali strutture, infatti, è fortemente determinata dal formato in cui il documento è redatto. Si rimanda, quindi, ai capitoli successivi per specificazioni ulteriori della soluzione. Occorre notare, infine, che gli elementi di formattazione non sono descritti da stringhe nel formato delle ''regular expressions'': bisognerà quindi integrare gli elementi presentati in questa sezione con l'approccio ''pattern-based'' adottato.&lt;br /&gt;
&lt;br /&gt;
===Analisi dell'usabilità===&lt;br /&gt;
&lt;br /&gt;
====Elenco dei nominativi da trattare esplicitamente espressi come dati in input====&lt;br /&gt;
&lt;br /&gt;
In questo caso, per usufruire del servizio, l'utente deve fornire un documento contenente una serie di nominativi da trattare. Una garanzia della corretta elaborazione del documento si ha richiedendo all'utente stesso quali siano i nominativi da trattare: in questo modo potranno essere &amp;quot;minimizzati&amp;quot; i dati (cioè i nominativi) di tutte e sole le persone espressamente richieste. In molti plausibili scenari, infatti, è necessario anonimizzare solo alcuni dei nominativi presenti nel documento; ad esempio in un atto giudiziario serve anonimizzare le parti in causa ma non i magistrati. &lt;br /&gt;
&lt;br /&gt;
Questa configurazione del servizio permette quindi all'utente di avere il massimo controllo possibile del risultato. Tuttavia questo approccio è poco pratico nel caso in cui i documenti da trattare contengano grandi quantità di nominativi diversi e, magari, l'utente che ne richiede il trattamento non li conosce; si pensi ad esempio a lunghe graduatorie di concorsi o altro. Si osserva inoltre che anche per pochi nominativi l'usabilità può degradare, se l'inserimento viene fatto con estemporanea digitazione, esposta anche al rischio di possibili errori di battitura, con conseguenti noiose ripetizioni delle operazioni.&lt;br /&gt;
&lt;br /&gt;
Si osserva, infine, che il sistema progettato è sufficientemente robusto nel trattare i nominativi in input espressi da un utente che ha digitato caratteri maiuscoli o minuscoli violando le convenzioni grammaticali. Supposto che il documento trattato debba essere grammaticalmente corretto, infatti, si ha la garanzia che i nomi ivi presenti comincino con una maiuscola; è sufficiente, quindi, forzare una conversione ''to-upper-case'' dei nomi inseriti dall'utente e le ''regex'' progettate funzionano correttamente. Un discorso a parte va fatto per i cognomi inseriti dall'utente, in quanto essi possono comparire con la prima lettera sia maiuscola che minuscola. L'inserimento di un cognome iniziante con una minuscola non crea grossi problemi, in quanto in tal caso la ''regex'' risultante sarebbe totalmente ''case-insensitive'' per il cognome, mentre l'aggiunta di un cognome cominciante con una maiuscola determina una ''regex'' ''case-insensitive'' per la prima lettera del cognome; qualora quindi un utente inserisse un nominativo tutto in maiuscolo, le occorrenze del cognome, presenti nel documento, inizianti con una lettera minuscola non verrebbero riconosciute.&lt;br /&gt;
Per le altre lettere dopo la prima, sia per i nomi che per i cognomi, il pattern è stato progettato ''case-insensitive'', quindi non emergono problemi. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In sintesi, il rischio che vengano introdotte delle ambiguità lessicali, incaricando l'utente dell'inserimento dei nominativi, è piuttosto basso ed il controllo che si ha sui nominativi è il massimo desiderabile, mentre i requisiti di usabilità risultano penalizzati.&lt;br /&gt;
&lt;br /&gt;
====Elenco dei nominativi da trattare dedotti automaticamente da un dizionario====&lt;br /&gt;
&lt;br /&gt;
Se si desidera privilegiare la tematica dell'usabilità nella progettazione del servizio, risulta necessario individuare delle strategie che semplifichino il più possibile i compiti che devono essere svolti dall'utente. L'unica operazione che inevitabilmente resta a suo carico è l'upload del documento da trattare; non è infatti necessario richiedergli l'elencazione dei nominativi dei nominativi da trattare, in quanto questi possono essere dedotti automaticamente impiegando dei dizionari, dei quali va quindi valutato il contenuto e le modalità di utilizzo. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si scarta subito l'ipotesi di dedurre automaticamente i nominativi basandosi unicamente sul fatto che le iniziali di nomi e cognomi siano maiuscole; come già argomentato infatti l'uso delle lettere maiuscole non è limitato solo a questi usi e, inoltre, non si può avere la certezza che un cognome inizi con una maiuscola.&lt;br /&gt;
&lt;br /&gt;
Sono disponibili fortunatamente alcuni dizionari di nomi ed altri di cognomi, in diverse lingue; si fa qui riferimento a quelli di &amp;quot;Data World&amp;quot; (un'azienda focalizzata sulla raccolta, produzione e pubblicazione di dataset: https://data.world) ([0037]).&lt;br /&gt;
&lt;br /&gt;
Si inizia l'analisi inquadrando le dimensioni che un dizionario contenente nomi o cognomi avrebbe. Risalta subito all'occhio la differenza tra il numero di termini contenuti nei due casi: facendo riferimento ai soli nomi e cognomi italiani, risultano esistenti circa 350.000 cognomi ([0036]) e circa 9.000 nomi, dei quale circa 5.000 maschili e circa 4.000 femminili ([0037]); il numero dei cognomi è quindi quasi 40 volte più grande del numero dei nomi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si ipotizza, per chiarire le idee, di applicare questi dizionari in uno scenario reale, in cui, ad esempio, si vuole trattare un documento di 10 pagine contenente 5.000 parole. Si trascurano inoltre i meccanismi che permettono di ricondurre un nome od un cognome ad un nominativo per concentrarsi unicamente sul numero di confronti necessari da effettuare nell'elaborazione. Nel peggiore dei casi possibili, ossia quando nessuna parola del documento compare tra i termini del dizionari, e dove occorre quindi confrontare ogni singola parola del documento con tutti i termini del dizionario, per semplice moltiplicazione si ottiene che l'impiego di un dizionario di nomi darebbe luogo a 45.000.000 confronti, mentre un dizionario di cognomi ben a 1.750.000.000 confronti. Se invece le parole nel documento fossero 50.000 si avrebbero 450.000.000 di confronti nel primo caso e 10.750.000.000 nel secondo. In sintesi, sebbene il rapporto tra il numero di confronti nei due casi rimanga sempre costante (circa 1:40) indipendentemente dalla lunghezza del documento, la differenza tra il numero di confronti cresce proporzionalmente al numero di parole che vengono sottoposte all'elaborazione. Per quantificare, infine, attraverso un unità di tempo, la differenza esistente tra l'impiego delle due diverse tipologie di dizionario, si realizza un semplice programma java, di cui si riporta qui sotto il contenuto del metodo principale, che realizza i confronti necessari attraverso l'uso di ''regular expression'':&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
final String regex = &amp;quot;\bLorenzo\b&amp;quot;;&amp;lt;br/&amp;gt;&lt;br /&gt;
final String string =  ... //testo di prova&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);&amp;lt;br/&amp;gt;&lt;br /&gt;
final Matcher matcher = pattern.matcher(string);&amp;lt;br/&amp;gt;&lt;br /&gt;
int start, total;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
start = System.currentTimeMillis();&lt;br /&gt;
while (matcher.find()) {&lt;br /&gt;
    System.out.println(&amp;quot;Full match: &amp;quot; + matcher.group(0));&lt;br /&gt;
    for (int i = 1; i &amp;lt;= matcher.groupCount(); i++) {&lt;br /&gt;
        System.out.println(&amp;quot;Group &amp;quot; + i + &amp;quot;: &amp;quot; + matcher.group(i));&lt;br /&gt;
    }&lt;br /&gt;
} &amp;lt;br/&amp;gt;&lt;br /&gt;
total = System.currentTimeMillis() - start;&lt;br /&gt;
System.out.println(&amp;quot;Total: &amp;quot; + total + &amp;quot; ms&amp;quot;);&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Eseguendo il test più volte, inserendo fino a 10 occorrenze della parola &amp;quot;Lorenzo&amp;quot; nel testo, si ha un tempo di elaborazione medio di circa 3 ms, con prestazioni di picco di 2 ms, ottenibili con poche occorrenze del nome presenti, e tempo di attesa massimo di 6 ms, dovuto alla presenza invece a una presenza più frequente del nome nel testo.&lt;br /&gt;
Questo fenomeno si comprende meglio ricordando che, come spiegato nel capitolo precedente, le ''regular expressions'' ottimizzano la ricerca, considerano le stringhe del testo trattato solo finché necessario, ossia fino a quando non vi è certezza che esse corrispondano o non corrispondano ad un match. Ogni volta che nel testo si presenta una parola che inizia con una lettera diversa dalla 'L' di &amp;quot;Lorenzo&amp;quot;, la ricerca procede direttamente con la valutazione della parola successiva, ignorando i rimanenti caratteri della parola. &lt;br /&gt;
&lt;br /&gt;
Risulta, invece, più onerosa la verifica della corrispondenza tra una stringa ed il pattern desiderato, poiché in questo caso vanno elaborati tutti i caratteri della parola. Come caso limite, si è posta come stringa da elaborare la sequenza di caratteri &amp;quot;Lorenzo &amp;quot; ripetuta 500 volte: il tempo di esecuzione medio del programma risultante, a parità di piattaforma, è stato di circa 25 ms.&lt;br /&gt;
&lt;br /&gt;
Un'altra diretta conseguenza di questo meccanismo di confronto è che all'aumentare del numero di parole nel documento non corrisponde un eccessivo aumento del tempo di esecuzione: considerando un documento di 5000 parole, con 0 occorrenze del nome &amp;quot;Lorenzo&amp;quot; il tempo di esecuzione medio risulta di 9 ms, con 10 occorrenze di 10 ms, con 100 occorrenze di 15 ms.&lt;br /&gt;
&lt;br /&gt;
Occorre precisare, prima di formulare ulteriori ragionamenti, che in documento di 5.000 parole potranno essere presenti al più 2500 coppie nome-cognome; in un dizionario con più di 2.500 termini almeno uno di questi non contribuirà nell'individuazione di un nominativo. Se poi sono presenti altre parole oltre ai nominativi nel documento, la percentuale di nomi che presenterà 0 occorrenze crescerà di conseguenza. Ad ogni modo, si sceglie di sviluppare i ragionamenti considerando necessario il tempo medio di 10 ms per individuare le occorrenze di un termine di un dizionario in un documento di 5.000 parole; questo tempo è sicuramente maggiore rispetto al caso reale, ma valutando per eccesso questo valore è possibile trascurare il tempo impiegato nelle altre operazioni di routine a supporto dell'algoritmo di ricerca.&lt;br /&gt;
&lt;br /&gt;
Ritornando all'esempio di partenza, considerando quindi necessari 10 ms per individuare le occorrenze di un termine di un dizionario in un documento di 5.000 parole, risulta che l'identificazione di tutti i cognomi contenuti nel testo richieda circa 3.500 secondi, (quasi un'ora!), mentre l'individuazione dei nomi &amp;quot;solo&amp;quot; 90 secondi.&lt;br /&gt;
I tempi di attesa che l'utente dovrebbe aspettare sono estremamente elevati e irragionevoli, specialmente se calati nel contesto nelle ''web application''. Come primo espediente per ovviare al problema si decide di abbandonare completamente l'idea di impiegare un dizionario di cognomi, in quanto, seppur si individuassero delle soluzioni in grado di effettuare il riconoscimento di tutte le occorrenze di un termine in un documento indipendentemente dalla lunghezza in solo 1 ms (irreale), sarebbero comunque necessari 3 minuti e 50 secondi per l'elaborazione. Non verranno quindi neppure trattate possibili soluzioni che prevedono l'applicazione di entrambi i dizionari.&lt;br /&gt;
&lt;br /&gt;
I 90 secondi richiesti dal dizionario di nomi, invece, risultano anch'essi eccessivi, ma attraverso opportune valutazioni si possono individuare delle strategie che consentono la minimizzazione del tempo necessario all'elaborazione dei documenti. Tali metodi di ottimizzazione saranno trattati in un successivo capitolo, mentre ora ci si continua a concentrare sulle modalità di impiego del dizionario.&lt;br /&gt;
&lt;br /&gt;
Per inciso, si osserva che i problemi di efficienza sono strettamente legati al riconoscimento automatico dei nominativi, in quanto in questo caso devono essere applicate quasi una decina di migliaia di ''regex'' diverse; nel caso in cui i nominativi da elaborare e le ''regex'' a loro associate siano noti, si ha a che fare con un numero esiguo di pattern da trattare e l'esecuzione del programma risulta infinitamente più rapida.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per migliorare l'efficacia del servizio sarebbe opportuno introdurre nel dizionario anche nomi stranieri, sempre più diffusi in una società sempre più globalizzata. Il tempo di esecuzione medio del riconoscimento, già critico, crescerebbe ulteriormente: si decide allora di introdurre nel dizionario i soli nomi inglesi, in totale quasi 5500 ([0037]). Considerando sempre un tempo medio di esecuzione di 10 ms per nome, con un dizionario di circa 14.500 termini si avrebbe un tempo di esecuzione medio complessivo di 145 secondi, ossia pari a 2 minuti e 25 secondi, e risulta ancora possibile effettuare alcune ottimizzazioni che lo riducono ad un livello accettabile.&lt;br /&gt;
&lt;br /&gt;
Una volta individuati i nomi contenuti nel documento occorre stabilire se essi fanno parte di un nominativo, progettando un'opportuna ''regular expression''. È importante notare che per conseguire questo scopo bisogna individuare la soluzione più efficiente possibile.&lt;br /&gt;
&lt;br /&gt;
Un nominativo, come già ripetuto più volte, è composto da uno o più nomi e da un cognome. Individuato un nome, la priorità che si ha è verificare se accanto ad esso sia presente un cognome. Finora i cognomi sono stati supposti non regolamentati da alcun pattern specifico, ma è necessario formularne almeno uno per consentirne il riconoscimento automatico. È ragionevole supporre che un cognome sia formato da massimo due parole, separate da spazio o apostrofo, sempre inizianti entrambe con una maiuscola, fatta eccezione per la prima parola laddove essa sia una preposizione semplice o articolata oppure un articolo, tenendo conto dei possibili troncamenti, come &amp;lt;i&amp;gt;d'&amp;lt;/i&amp;gt; e &amp;lt;i&amp;gt;dell'&amp;lt;/i&amp;gt;. Inoltre per verificare se un termine adiacente al nome trovato rappresenti un nome si evita di impiegare nuovamente il dizionario per non gravare ulteriormente sul tempo di esecuzione. Inoltre, si nota che avendo supposto un cognome composto da massimo due parole inizianti con una lettera maiuscola, un altro nome, oltre quello trovato dal dizionario, viene già automaticamente riconosciuto qualora il cognome sia composto da una sola parola. Rinunciando ad individuare nominativi composti da tre nomi o più, si formula una ''regular expression'' per il riconoscimento automatico in seguito al identificazione di un nome, qui indicato con il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nome&amp;gt;&amp;lt;/span&amp;gt;, supponendo il cognome come precedentemente indicato e ipotizzando la presenza di un ulteriore nominativo.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;prep&amp;gt; := d((a|e)(l(l[aeo]?)?|i|gli?)?|i)?|(ne|a|su)(l(l[aeo]?)?|i|gli)?|l[aeo]?|co[iln]?|i[ln]?|gli|per&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cognome&amp;gt; := (([A-Z][a-zA-ZÀ-ÖØ-öø-ÿ]*|&amp;lt;prep&amp;gt;)('|\s))?[A-Z][a-zA-ZÀ-ÖØ-öø-ÿ]+&lt;br /&gt;
&lt;br /&gt;
&amp;lt;second_name&amp;gt; := [A-Z][a-zA-ZÀ-ÖØ-öø-ÿ]+&lt;br /&gt;
&lt;br /&gt;
&amp;lt;regex&amp;gt; := (&amp;lt;second_name&amp;gt;\s)?(&amp;lt;nome&amp;gt;)\s&amp;lt;cognome&amp;gt;|&amp;lt;cognome&amp;gt;\s(&amp;lt;nome&amp;gt;)(\s&amp;lt;second_name&amp;gt;)?&lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Nella scrittura della ''regex'' si è prestata particolare attenzione all'utilizzo della simbologia per rendere l'espressione il più performante possibile, attraverso il massimo sfruttamento dei cortocircuiti logici e l'opportuno ordinamento dei caratteri (sono stati anteposti i caratteri comuni a più preposizioni od articoli). Inoltre, per alleggerire la ''regex'' si è rinunciato all'utilizzo dei caratteri dell'alfabeto latino non appartenenti ai primi due blocchi Unicode.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
È mostrata in figura la corretta elaborazione di 57 possibili casi di cognomi diversi&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F04])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva tuttavia che in alcune circostanze, come nella frase &amp;quot;''di Amorosa Lorenzo non si hanno notizie''&amp;quot;, accade che un parola (&amp;quot;''di''&amp;quot; in questo caso), non sia parte del cognome ma il programma non è in grado di riconoscerlo. Questa ambiguità è fortemente dipendente dal contesto e non è possibile trattarla senza significativi degradi delle performance; quindi è necessario rinunciare a trattarla, accettando riconoscimenti erronei. In altre situazioni, invece, dove magari si sta elaborando la stringa contenente il nominativo ''Mario Lorenzo'', risulta impossibile determinare quale tra i due termini sia il nome e quale il cognome; cioè significa che l'unico trattamento di &amp;quot;minimizzazione&amp;quot; automatico che risulta ragionevole applicare è la sostituzione del nominativo con uno pseudonimo, non il troncamento o l'alterazione dei nomi.&lt;br /&gt;
In conclusione, con il riconoscimento automatico dei nominativi si migliora complessivamente l'usabilità del servizio, in quanto l'utente non deve digitare i nominativi, ma la latenza introdotta è notevole, si è soggetti a rischi di ambiguità e non è in alcun modo esprimibile la preferenza su quali nominativi si desidera &amp;quot;minimizzare&amp;quot; o meno. La soluzione così ideata non risulta quindi adeguata.&lt;br /&gt;
&lt;br /&gt;
====Soluzione ibrida adottata====&lt;br /&gt;
Entrambe le tipologie di riconoscimento prima individuate hanno significativi problemi, si cerca quindi di sintetizzare una soluzione in grado di trarre i vantaggi dell'una e dell'altra. Risulta efficace, in particolare, che il documento venga inizialmente trattato tramite dizionari, evitando all'utente l'onere di specificare i nominativi, e che in seguito venga lasciata all'utente la possibilità di intervenire.&lt;br /&gt;
Infatti, esso potrebbe voler esprimere delle preferenze su quali nominativi debbano essere trattati tra quelli individuati e gestire gli eventuali errori di riconoscimento dovuti a richieste di trattamento di nominativi aventi un nome non presente nel dizionario o anche dovuti a casi di ambiguità lessicale già presentati.&lt;br /&gt;
&lt;br /&gt;
Una volta inserito il documento e terminata l'elaborazione tramite il dizionario, l'utente può sia richiedere l'immediato download del file ed effettuare le operazioni prima definite, attraverso un'opportuna interfaccia. Per fornire il supporto alle esigenze più disparate, si prevede la possibilità di:&lt;br /&gt;
# eseguire download del file trattato unicamente con il dizionario&lt;br /&gt;
# ripetere la &amp;quot;minimizzazione&amp;quot; del documento, specificando:&lt;br /&gt;
## nuovi nominativi&lt;br /&gt;
## quali nominativi tra quelli precedentemente individuati ''non'' si vogliono trattare&lt;br /&gt;
## quale parola/e dei nominativi individuati rappresenta il cognome (in tal caso, si possono utilizzare altri metodi, oltre alla sostituzione con pseudonimo, per il trattamento)&lt;br /&gt;
## quale parola/e dei nominativi individuati non compone il nominativo (situazione che si verifica quando ci si imbatte in una ambiguità).&lt;br /&gt;
&lt;br /&gt;
Senza soffermarsi in questo momento sull'intera sequenza concreta di interazioni tra utente e servizio, si osserva che l'unico vincolo non funzionale da valutare resta il tempo medio di attesa dell'utente. L'usabilità complessiva è molto buona ed i vincoli funzionali sono soddisfatti.&lt;br /&gt;
&lt;br /&gt;
===Scelta dei formati da trattare===&lt;br /&gt;
&lt;br /&gt;
Una considerazione intuitiva, ed una buona prassi, è che un documento contenente dati personali sia pseudonimizzato o anonimizzato quanto prima possibile e cioè quando è ancora solo nelle mani del suo autore: questo approccio scongiura che informazioni sensibili e dati personali in chiaro ''sfuggano'' in rete.&lt;br /&gt;
Si può per questo ragionevolmente ipotizzare che i naturali destinatari del servizio siano gli stessi autori (creatori) che redigono il documento. Nello scenario tipico di utilizzo, infatti, il fruitore del servizio procederà al trattamento dei dati non appena avrà finito di scrivere il documento del quale, essendone autore, potrà scegliere il formato. Si osserva che potrebbe accadere che il documento sia redatto da terzi: in tal caso l'utente che richiede il trattamento può scegliere il formato in maniera indiretta concordandolo con il redattore. Avendo quindi l'utente la possibilità di stabilire il formato del proprio documento, risulta ragionevole progettare un servizio che lavori su un solo formato.&lt;br /&gt;
A questo punto occorre individuare quale sia il formato che maggiormente si presta alle finalità del servizio.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Una possibilità è quella di richiedere all'utente di inserire come documento da trattare un semplice file di testo in formato ''txt'': in questo modo ci sarebbe il grande vantaggio di trattare file molto semplici, riducendo così al minimo la complessità realizzativa, e inoltre si avrebbe  l'indipendenza dagli editor di testo utilizzati, in quanto tutti supportano i file in formato ''txt''. &lt;br /&gt;
Risulta tuttavia sconveniente utilizzare questo formato, poiché non ha alcuna capacità espressiva per gestire elementi complessi come tabelle, modifiche allo stile del testo e così via. &lt;br /&gt;
Bisogna quindi optare per un formato in grado di gestire questi elementi, al costo di aumentare la complessità della progettazione, ricordando sempre che è necessario allo stesso tempo che tale formato sia supportato da tutti i principali editor di testo.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Con facilità è possibile individuare quali sono i formati di testo più comuni oltre al ''txt'': ''doc'', ''docx'', ''odt'', ''pdf'', ''pages'', ''rtf'', ''tex''. Si passa ora dunque a valutare quale tra questi formati potrebbe meglio soddisfare i requisiti prima enunciati. &lt;br /&gt;
Facendo una cernita iniziale sulla base delle finalità per le quali un formato è utilizzato, si può immediatamente escludere ''tex'', che trova impiego principalmente in ambito scientifico e matematico. In questo settore, infatti, non è richiesta generalmente l'applicazione delle procedura di trattamento dei dati. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt; &lt;br /&gt;
Si può inoltre abbandonare l'idea di trattare documenti con estensione ''pages'', formato proprietario di Apple, poiché utilizzati esclusivamente dall'omonimo editor di testo anch'esso proprietario, e i documenti con estensione ''rtf'', acronimo di ''Rich Text Format'', formato proprietario di Microsoft che supporta una formattazione avanzata, poiché, pur gestito da vari editor, è un formato decisamente datato (ultima versione 1.9.1 risalente a marzo 2008 ([0009])). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si esclude inoltre il formato ''pdf'' per motivi di usabilità: molti editor, infatti, consentono di esportare un documento in questo formato ma non permettono di importarlo. Un utente dopo aver effettuato l'anonimizzazione di un documento non può quindi proseguire modificandolo ulteriormente. Il ''Portable Document Format'', infatti, è ideato per realizzare dei documenti destinati alla sola lettura.&lt;br /&gt;
L'ultima esclusione, piuttosto immediata da effettuare, riguarda il formato ''doc'', binario e proprietario di Microsoft. Esso infatti risulta, a partire dal 2006, soppiantato dal formato ''docx'', sempre proprietario di Microsoft. &lt;br /&gt;
&lt;br /&gt;
Si giunge infine a valutare quale tra gli ultimi due possibili formati rimanenti, ossia ''docx'' e ''odt'', si presta meglio alle finalità del servizio. In via preliminare si osserva che entrambi i formati possiedono ottime capacità espressive, hanno una struttura interna di simile complessità e sono entrambi supportati dai principali editor di testo. È necessario quindi effettuare delle analisi più approfondite per poter sceglierne uno tra i due.&lt;br /&gt;
La struttura del formato ''docx'', sviluppato da Microsoft e formalmente denominato ''Office Open XML Document (OOXML Document)'', è costituita da un file compresso .zip contenente un insieme di file ''XML''. Il formato ''OOXML'' permette la rappresentazione, oltre che di documenti testuali, anche di fogli elettronici (formato ''OOXML 'Workbook'', noto anche come ''xslx'') e di presentazioni (formato ''OOXML Presentation'', noto anche come ''pptx'') ([0008], [0013]).&lt;br /&gt;
Il formato inoltre è stato inizialmente standardizzato nel 2006 dall'&amp;lt;i&amp;gt;ECMA&amp;lt;/i&amp;gt;  (come ''ECMA-376'') e successivamente nel 2008 dall'&amp;lt;i&amp;gt;ISO&amp;lt;/i&amp;gt; e dall'&amp;lt;i&amp;gt;IEC&amp;lt;/i&amp;gt; (come ''ISO/IEC 29500'') in una versione ''transitional'', retrocompatibile con alcune versioni precedenti del formato contenenti elementi deprecati, e in una versione ''strict'', dove tali elementi non sono ammessi. I due standard sono stati poi successivamente aggiornati e sono tutt'ora oggetto di revisioni ([0002]).&lt;br /&gt;
&lt;br /&gt;
Anche la struttura del formato open source ''odt'', sviluppato dall'&amp;lt;i&amp;gt;OASIS&amp;lt;/i&amp;gt; e formalmente denominato ''OpenDocument Text'', è basata su uno zip contenente un insieme di file ''XML''. Inoltre, il formato ''OpenDocument Format (ODF)'' permette di trattare fogli elettronici (formato ''OpenDocument Spreadsheet'', noto anche come ''ods'') e presentazioni (formato ''OpenDocument Presentation'', noto anche come ''odp'') ([0007]). Anche ''OpenDocument Text'' è stato standardizzato, in particolare dall'&amp;lt;i&amp;gt;OASIS&amp;lt;/i&amp;gt; stesso nel 2005 e dall'&amp;lt;i&amp;gt;ISO/IEC&amp;lt;/i&amp;gt; nel 2006, ed è soggetto a revisioni e aggiornamenti ([0003]).&lt;br /&gt;
&lt;br /&gt;
In sintesi, basandosi sulla struttura dei documenti e sulla standardizzazione dei formati, non è ancora possibile individuare quale sia il formato migliore. L'unico elemento che potrebbe portare punti a favore del formato ''odt'' è che esso, a differenza del formato ''docx'', è aperto, tuttavia, essendo le specifiche di entrambi i formati pubbliche, ciò non rappresenta un fattore determinante nell'elezione del formato.&lt;br /&gt;
Entrambi i formati, inoltre, sono largamente supportati dai word processors.&lt;br /&gt;
&lt;br /&gt;
Le seguenti tabelle riepilogano il supporto all'uno ed all'altro formato dei ''word-processors'' più usati, ossia ''Microsoft Office Word'', ''LibreOffice Writer'', ''OpenOffice Writer'' e ''Pages''. &lt;br /&gt;
Le tabelle sono tratte da wikipedia ([0000], [0001], [0006]). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;i&amp;gt;Supporto fornito dagli editor di testo al formato docx&amp;lt;/i&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  !! Microsoft Office Word !! LibreOffice Writer !! OpenOffice Writer !! Pages&lt;br /&gt;
|-&lt;br /&gt;
! Version&lt;br /&gt;
|| 2013, 2011 for Mac || All versions || 3.0 || '08&lt;br /&gt;
|-&lt;br /&gt;
! Operating systems&lt;br /&gt;
|| Windows, Mac OS X || Windows, OS X, Linux, Unix, Android || Windows, Linux, Unix, Mac OS X || Mac OS X&lt;br /&gt;
|-&lt;br /&gt;
! Office suite&lt;br /&gt;
|| Microsoft Office ||  || OpenOffice.org || iWork&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
|| Microsoft || The Document Foundation || Apache OpenOffice || Apple Inc.&lt;br /&gt;
|-&lt;br /&gt;
! License&lt;br /&gt;
|| proprietary || MPL || LGPL || proprietary&lt;br /&gt;
|-&lt;br /&gt;
! ECMA-376&lt;br /&gt;
|| yes || yes || yes || yes&lt;br /&gt;
|-&lt;br /&gt;
! ISO/IEC 29500:2008&lt;br /&gt;
|| yes || yes || || &lt;br /&gt;
|-&lt;br /&gt;
! Notes&lt;br /&gt;
||  ||  || Import only ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;i&amp;gt;Supporto fornito dagli editor di testo al formato odt&amp;lt;/i&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  !! Microsoft Office Word !! LibreOffice Writer !! OpenOffice Writer &lt;br /&gt;
|-&lt;br /&gt;
! Version&lt;br /&gt;
|| 2007 SP2 || 4.0.3 || 3.0.0&lt;br /&gt;
|-&lt;br /&gt;
! Operating systems&lt;br /&gt;
|| Windows || Unix-based systems, Mac OS X, Solaris || Windows, Linux, Unix-based systems, Mac OS X, Solaris&lt;br /&gt;
|-&lt;br /&gt;
! Office suite&lt;br /&gt;
|| Microsoft Office ||  || OpenOffice.org&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
|| Microsoft || The Document Foundation || Apache OpenOffice&lt;br /&gt;
|-&lt;br /&gt;
! License&lt;br /&gt;
|| Proprietary || MPL || LGPL&lt;br /&gt;
|-&lt;br /&gt;
! ISO/IEC 26300:2006&lt;br /&gt;
|| yes || yes || yes&lt;br /&gt;
|-&lt;br /&gt;
! Notes&lt;br /&gt;
|| some limitations || Multiple ODF versions supported (ISO/ODF 1.0/1.1/1.2/1.2 Extended) || adjustable ODF version (ISO/ODF 1.2) &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si possono effettuare le seguenti osservazioni:&lt;br /&gt;
* ''Microsoft Office Word'' è, in ambiente Microsoft, il word processor maggiormente usato; è molto usato anche in ambiente Apple Mac. Esso offre il pieno supporto al formato ''OOXML Document''; solo parzialmente invece gestisce il formato ''OpenDocument Text'': il processamento di file con estensione ''odt'' con questo editor comporta la perdita di alcune informazioni secondarie.&lt;br /&gt;
* ''LibreOffice Writer'', l'editor open source maggiormente utilizzato, supporta pienamente entrambi formati. Nato con lo scopo di gestire i file con formato ''OpenDocument Text'', attualmente supporta completamente anche il formato ''OOXML Document''. &lt;br /&gt;
* ''OpenOffice Writer'', un altro degli editor di testo tra i più utilizzati, supporta pienamente ''odt'', mentre è solo in grado di importare i file con estensione ''docx''.&lt;br /&gt;
* ''Pages'', il word process installato a default sui Mac della Apple e, di conseguenza anche maggiormente usato su questi dispositivi, non offre supporto al formato ''odt'', ma elabora correttamente i documenti con estensione ''docx'' ([0005],[0004]). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Queste osservazioni evidenziano che quindi è impossibile adottare un formato supportato da tutti gli editor; la scelta va allora indirizzata verso quello maggiormente supportato dai word processor più popolari.&lt;br /&gt;
Per avere un'indicazione di ''popolarità'', e quindi per poter comprendere meglio quali tra gli editor prima citati siano i più usati, si può fare un'analisi, tramite motori di ricerca, di quanti file con una certa estensione siano presenti in rete.&lt;br /&gt;
È possibile, ad esempio, ricercare su Google i file che contengono nel proprio nome una determinata sequenza di caratteri o aventi una certa estensione (''filetype''). Sono qui presentati i risultati delle interrogazioni riguardo ai file aventi formato ''docx'', ''doc'' e ''odt'' ed il cui nome contiene uno dei caratteri, fra i più frequenti, &amp;quot;1&amp;quot; o &amp;quot;a&amp;quot; o &amp;quot;e&amp;quot;. L'investigazione è stata effettuata inserendo nella barra di ricerca di Google le stringhe ''1 filetype:docx'', ''a filetype:docx'' e così via.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Formato cercato !! Documenti con &amp;quot;1&amp;quot; nel nome !! Documenti con &amp;quot;a&amp;quot; nel nome !! Documenti con &amp;quot;e&amp;quot; nel nome&lt;br /&gt;
|-&lt;br /&gt;
| docx || 16.900.000  || 12.800.000 || 8.730.000&lt;br /&gt;
|-&lt;br /&gt;
| odt || 736.000 || 667.000 || 507.000&lt;br /&gt;
|-&lt;br /&gt;
| doc || 32.300.000 || 26.300.000 || 21.500.000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Effettivamente il formato più diffuso è il ''doc''; tuttavia esso è supportato per retro-compatibilità anche dagli editor che supportano formati ''OOXML'', con i quali non si ha difficoltà nel convertire i documenti dal formato ''doc'' al ''docx''. In conclusione, quale che sia l'editor più diffuso, è ragionevole adottare il formato ''OOXML Document'' per le finalità del servizio, in quanto molto diffuso, ben supportato dagli editor e avente ottime capacità espressive. Di conseguenza i documenti che saranno elaborati dovranno essere forniti dall'utente in tale formato. In successive sezioni verrà approfondita la struttura dei documenti ''OOXML''.&lt;br /&gt;
&lt;br /&gt;
===Privacy by design===&lt;br /&gt;
&lt;br /&gt;
L'Art. 25 del ''GDPR'', con i Considerando 75 e 78, ha per titolo e per oggetto la &amp;quot;protezione dei dati fin dalla progettazione e protezione per impostazione predefinita&amp;quot; ([0035]), perfettamente in linea con i concetti di &amp;quot;minimizzazione&amp;quot;, già richiamati.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Il senso dell'Art. 25 viene spesso sintetizzato con l'espressione &amp;quot;''PbD - privacy by design, privacy by default''&amp;quot; ([0035]). Il principio fissato nell'Art. 25 dovrà sempre più essere tenuto ben presente nell'ambito dell'ingegneria del software, in quanto impone di adottare nuove cautele nella realizzazione delle applicazioni software.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Del principio ''PbD'' si è ben tenuto conto nella progettazione descritta in questa tesi. In particolare, relativamente alla ''privacy by design'', si è fatto in modo che nessun dato personale permanga registrato sul sistema di esecuzione, o altrove, al termine dell'applicazione. Anche laddove l'applicazione termini in modo anomale non vi sono strutture dati superstiti, che restano memorizzate sul sistema.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Marginale in questa tesi è la nozione di ''privacy by default'', giacché l'applicazione non offre all'utente alcuna opzione che possa indurlo in errore ed acconsentire a trattamenti dei dati personali, oltre quello realizzato dall'applicazione.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
È utile osservare quanto sia importante esprimere queste impostazioni di progettazione fra le condizioni d'uso presentate all'utente: esse costituiscono uno dei presupposti affinché l'utente abbia piena fiducia (''trust'') nel servizio, lo utilizzi, lo divulghi, lo renda un servizio di successo.&lt;br /&gt;
&lt;br /&gt;
==Architettura del servizio== &lt;br /&gt;
&lt;br /&gt;
===I componenti software nell'architettura LAMP===&lt;br /&gt;
&lt;br /&gt;
Il servizio è realizzato in forma di ''web-based application'' poiché, come già illustrato nell'introduzione, si intende renderlo disponibile per il massimo numero di utenti possibili. Nella progettazione e realizzazione dell'architettura web si adotta la piattaforma ''LAMP'', il cui nome deriva dall'acronimo dei componenti open source che la realizzano (il sistema operativo Linux, il server HTTP Apache, il sistema per la gestione di database relazionali MySQL ed il linguaggio di programmazione PHP). Poichè il modello è composto da quattro livelli, spesso si parla anche di ''stack LAMP''. Uno degli elementi di forza del modello ''LAMP'' è che i componenti dei vari ''layer'' sono sostituibili, a seconda delle esigenze, con dei componenti più adatti, tipicamente open source ([0015], [0018], [0019]). Basando la piattaforma su un sistema operativo della famiglia di Microsoft Windows, ad esempio, si ottiene uno ''stack WAMP'', mentre se si usa un sistema operativo Mac OS si realizza uno ''stack MAMP''. Un'architettura web basata sul modello ''LAMP'' può, inoltre, essere integrata con software open source che offre utili funzionalità, come, ad esempio, il monitoraggio (''Nagios''), il load balancing (''Linux Virtual Server''), la rilevazione di accessi illeciti (''Snort'') e il security testing (''netsniff-ng''). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si valutano ora brevemente la diffusione dei componenti tradizionali dello ''stack LAMP'' e le alternative maggiormente usate per i vari ''layer''.&lt;br /&gt;
Le distribuzioni Linux risultano essere la scelta più comune per l'ultimo ''layer'' dello ''stack''. Secondo W3Techs, infatti, nell'ottobre del 2013, il 58.5% dei web server a livello globale avevano come sistema operativo la distribuzione Debian o Ubuntu, mentre il 37.3% una tra RHEL, Fedora e CentOS([0016]). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Tra i web server, Apache risulta essere maggiormente usato. Secondo le stime fatte da Netcraft, a giugno del 2014 circa il 51.9% del milione di siti web più trafficati al mondo usavano un web server Apache, il 19.2% nginx ed il 12.4% Microsoft ([0017]). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
I principali ''DBMS'' relazionali, oltre a MySQL, che possono essere presenti nello ''stack LAMP'' sono MariaDB e PostgreSQL, mentre tra i ''DBMS NoSQL'' MongoDB risulta essere il più comune. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Nello stack, infine, il ruolo di linguaggio di programmazione, solitamente svolto dal linguaggio PHP, spesso è ricoperto dai linguaggi Perl o Python. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva, ad ogni modo, che le informazioni sulla diffusione delle tecnologie non rappresentano un fattore vincolante nella scelta delle stesse, in quanto la piattaforma ''LAMP'' è anche aperta verso molti altri componenti oltre quelli citati; di conseguenza la scelta delle tecnologie da impiegare può essere effettuata basandosi principalmente sui requisiti e sulle specifiche del servizio. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Principi di progettazione per l'architettura===&lt;br /&gt;
&lt;br /&gt;
====Single Responsibility Principle====&lt;br /&gt;
&lt;br /&gt;
Per rendere il servizio maggiormente manutenibile ed estensibile, si presta particolare attenzione al rispetto del ''Single Responsibility Principle'' (''SRP'') ([0020]). Si cerca, quindi, di fattorizzare il software in più moduli, suddividendo tra questi le elaborazioni da svolgere. Un altro importante beneficio che si ottiene dalla fattorizzazione del codice è la riusabilità dei componenti. Ogni singolo modulo, infatti, svolge il proprio compito in maniera indipendente dal resto della applicazione ed è, quindi, riutilizzabile in altri scenari simili senza dover essere re-implementato. Inquadrando meglio questa metodologia di progettazione con i requisiti del servizio e la piattaforma web ''LAMP'', si individuano i due principali compiti a carico dell'applicazione:&lt;br /&gt;
* La gestione dell'interazione web con l'utente per la trasmissione del documento e dei nominativi da trattare&lt;br /&gt;
* Il processamento del documento per effettuare la &amp;quot;minimizzazione&amp;quot; dei dati.&lt;br /&gt;
Questi due differenti ''task'' saranno, quindi, portate a termine da componenti diversi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Progettando la struttura dell'applicazione in questo modo, si disaccoppia completamente la logica di business del servizio dalle interfacce web di comunicazione con l'utente. In un futuro sviluppo sarà possibile, quindi, realizzare nuove interfacce utilizzando altre tecnologie senza dover modificare la logica applicativa. &lt;br /&gt;
&lt;br /&gt;
====Dependency Inversion Principle====&lt;br /&gt;
&lt;br /&gt;
Un altro principio di design architetturale che risulta importante nella progettazione è il ''Dependency Inversion Principle'' (''DIP'') ([0038]). Esso si traduce nella realizzazione di componenti che non dipendono dalle specifiche implementazioni degli altri moduli del sistema, bensì dalle loro ''astrazioni''. &lt;br /&gt;
In relazione all'estensibilità e manutenibilità del prodotto software, infatti, l'impiego di moduli dipendenti direttamente dalla definizione dei metodi presenti in altri componenti risulta problematica: il modulo dipendente deve essere re-implementato ad ogni variazione del modulo da cui dipende.&lt;br /&gt;
Nella programmazione orientata agli oggetti, per rispettare questo principio, si su può fare uso di classi astratte o interfacce, costrutti che definiscono i moduli senza implementarli completamente o senza implementarli affatto.  &lt;br /&gt;
&lt;br /&gt;
===Stile architetturale REST=== &lt;br /&gt;
&lt;br /&gt;
Il modello architetturale del servizio che si sta definendo presenta una serie di caratteristiche, come ad esempio l'indipendenza dei moduli, che permettono di realizzarlo secondo il paradigma delle ''RESTful API''. L'espressione &amp;quot;Representational State Transfer&amp;quot; e il suo acronimo &amp;quot;REST&amp;quot; furono introdotti nel 2000 nella tesi di dottorato di Roy Fielding ([0021]), uno dei principali autori delle specifiche dell'Hypertext Transfer Protocol (HTTP). Roy Fielding descrive il ''Representational State Transfer'' come uno stile architetturale (&amp;quot;''architectural style''&amp;quot;), ovvero un'astrazione degli elementi di un'architettura all'interno di un sistema hypermedia distribuito. ''REST'' non specifica i dettagli dell'implementazione dei componenti e della sintassi del protocollo, ma definisce i ruoli dei componenti, i vincoli sulla loro modalità di interazione e la loro interpretazione.&lt;br /&gt;
Riassumiamo quindi i principi che deve rispettare una architettura ''REST'':&lt;br /&gt;
# Architettura Client-Server &amp;lt;br/&amp;gt;In una architettura ''REST'' viene data particolare importanza ai principi ''SRP'' e ''DIP'' prima citati, più generale si può affermare che l'architettura sposi il paradigma noto con il termine di &amp;quot;''Separation of Concerns''&amp;quot;. Una ''Restful API'' applica questi principi in un architettura Client-Server, capace di supportare l'evoluzione indipendente della logica lato client e della logica lato server.&lt;br /&gt;
# Stateless &amp;lt;br/&amp;gt;La comunicazione tra utente e fornitore del servizio deve essere senza stato, quindi ogni richiesta del client deve contenere tutte le informazioni di cui il fornitore necessita per l'erogazione del servizio offerto. Questa ipotesi viene fatta per rendere una ''Restful API'' facilmente scalabile orizzontalmente.&lt;br /&gt;
# Uso della cache &amp;lt;br/&amp;gt;In un Architettura ''REST'' i messaggi di risposta inviati dal server devono esplicitamente indicare se possono essere memorizzati nella cache del client o di componenti middleware per il riutilizzo nelle richieste successive.&lt;br /&gt;
# Interfaccia uniforme &amp;lt;br/&amp;gt;I componenti devono essere in grado di comunicare attraverso un'interfaccia uniforme e le risorse devono essere trasferite in un formato standard. Inoltre l'utente deve poter effettuare la navigazione tra le risorse di suo interesse tramite collegamenti ipertestuali. Per inciso, si osserva che il protocollo HTTP usato correttamente rispetta i requisiti di un architettura ''REST'' e che nelle implementazioni delle ''RESTful API'' il formato più usato per la modellazione dei dati è JSON.&lt;br /&gt;
# Layered System &amp;lt;br/&amp;gt;In un sistema a livelli, componenti intermedi (come i proxy) possono essere collocati tra client e server per intercettare il traffico per scopi specifici; ad esempio il caching o la sicurezza. Una soluzione basata su ''REST'' può essere composta da più livelli architettonici, indipendenti l'uno dall'altro.&lt;br /&gt;
# Code on Demand &amp;lt;br/&amp;gt;Questo vincolo facoltativo è inteso principalmente a consentire aggiornamenti alla logica all'interno dei client (come i browser Web) indipendentemente dalla logica lato server. Una ''single page application'', ad esempio, rispetta in pieno questo punto.&lt;br /&gt;
&lt;br /&gt;
Un'applicazione progettata sul modello dell'architettura ''REST'' ha quindi gli indiscutibili vantaggi di:&lt;br /&gt;
* consentire l'evoluzione indipendente delle diverse componenti &lt;br /&gt;
* avere un'interfaccia utente portabile con altri tipi di piattaforme&lt;br /&gt;
* permettere agevolmente la replicazione delle macchine server&lt;br /&gt;
* non vincolare moduli server e client a linguaggi e tecnologie specifiche.&lt;br /&gt;
&lt;br /&gt;
L'architettura del servizio oggetto di questa tesi si trova già perfettamente in linea con alcuni dei vincoli discussi, ma sono necessarie alcune considerazioni. Il punto 1 (&amp;quot;architettura Client-Server&amp;quot;) è chiaramente soddisfatto. &lt;br /&gt;
Il punto 2 (&amp;quot;Stateless&amp;quot;), direttamente collegato con i punti 3 e 5 (&amp;quot;Uso della cache&amp;quot;, &amp;quot;Layered System&amp;quot;), può essere rispettato con facilità; a ogni richiesta di &amp;quot;minimizzazione&amp;quot; del client corrisponde la restituzione del documento trattato dal server, non c'è quindi necessita di avere uno stato nell'interazione. &lt;br /&gt;
&lt;br /&gt;
Analizzando le caratteristiche di una applicazione stateless in relazione al principio ''privacy by design'' illustrato in precedenza, si osserva che l'assenza di stato determina la semplificazione delle problematiche critiche relative al principio. Non vengono conservate, infatti, informazioni contenenti dati sensibili, poiché dopo aver effettuato l'invio della risposta, sarà subito eliminato sul server il file elaborato.&lt;br /&gt;
&lt;br /&gt;
Nei capitoli precedenti tuttavia si è detto che l'utente può ripetere più volte il trattamento di uno stesso documento nella stessa sessione di interazione; essendo il vincolo dell'efficienza già difficile da rispettare per via dell'elaborazione onerosa del documento, si può progettare una modalità alternativa del funzionamento con stato del servizio, applicabile in assenza di replicazione delle macchine server e sfruttando le ripetute richieste di trattamento per uno stesso documento. &lt;br /&gt;
Si può infatti memorizzare lato server il documento inviato dal client inizialmente e, alle successive richieste di trattamento del medesimo documento, evitarne la ritrasmissione da client a server. Per rispettare il ''PbD'', al termine della sessione di interazione il documento verrà rimosso dal server. Si nota, inoltre, che per predisporre il servizio alla gestione delle due diverse modalità di funzionamento si può utilizzare un parametro di configurazione a livello applicativo.&lt;br /&gt;
I punti 4 e 6 infine (&amp;quot;Interfaccia uniforme&amp;quot;, &amp;quot;Code on Demand&amp;quot;) si possono rispettare utilizzando il formato JSON per la trasmissione dei documenti e dei nominativi, e usando localmente sul client Javascript per offrire tutte le funzionalità del servizio in un'unica pagina html.&lt;br /&gt;
&lt;br /&gt;
===Moduli software del servizio===&lt;br /&gt;
&lt;br /&gt;
====Scelta dei componenti software====&lt;br /&gt;
&lt;br /&gt;
Si opera ora la scelta delle tecnologie da utilizzare per i componenti dei 4 layer dello ''stack LAMP''. Per i due layer inferiori risulta piuttosto immediato decidere di usare le tecnologie presenti per default. Un sistema operativo Linux ed un web server Apache sono adatti all'architettura del servizio.&lt;br /&gt;
Inoltre anche il linguaggio di programmazione PHP può essere usato senza significativi problemi, anche se verranno fatte in seguito, in una sezione di questo capitolo, alcune considerazioni sulle problematiche di esecuzioni concorrenti di script PHP. Il linguaggio sarà impiegato in particolare per la realizzazione della logica necessaria a gestire l'interazione web con il cliente, mentre l'elaborazione del documento OOXML lato server sarà effettuata da un programma Java. &lt;br /&gt;
&lt;br /&gt;
I due ''task'' principali del servizio sono delegati, quindi, a due programmi distinti realizzati con tecnologie diverse. Si concretizza in questo modo il principio ''SRP'' e, sfruttando l'&amp;lt;i&amp;gt;openness&amp;lt;/i&amp;gt; della piattaforma LAMP, le funzionalità necessarie vengono realizzate attraverso i linguaggi più adatti.&lt;br /&gt;
La scelta del linguaggio Java per l'implementazione del ''main core'' della logica di business è dovuta alla libreria open source in ambiente java Docx4j ([40],[41]). Questa libreria è realizzata per il processamento delle tre tipologie di formati OOXML (''docx'', ''xslx'', ''pptx'') e permette tutte le possibili operazioni di creazione, lettura e modifica su questo tipo di documenti. Anche questa libreria sarà approfondita in sezioni successive. Si osserva, per inciso, che esistono altre librerie equivalenti in ambiente .NET. &lt;br /&gt;
&lt;br /&gt;
Nella scelta del linguaggio di programmazione usato per elaborare i documenti ed effettuare i confronti tramite ''regular expressions'', un dato non di poco conto da considerare è l'encoding delle stringhe. In Java, in particolare, una stringa è rappresentata internamente come un array di char, ognuno codificato da 2 byte in formato UTF-16 ([0042]); la codifica esprime in 16 bit tutti i caratteri definiti dallo standard Unicode, quindi è possibile scegliere Java.&lt;br /&gt;
&lt;br /&gt;
Per il ''layer'' della persistenza, infine, l'impiego di un database MySql risulta una buona scelta. Si osserva che questo livello non verrà utilizzato nella tradizionale maniera prevista dallo ''stack LAMP''. Infatti, generalmente, la base di dati viene interrogata direttamente dal componente che si occupa dell'interazione con l'utente (PHP) per il reperimento delle informazioni utili da restituire al client; nel servizio, invece, la base di dati sarà a supporto unicamente del programma Java, poiché gli unici dati persistenti da gestire sono i nomi del dizionario (si ricordi sempre il ''PbD'') e solo i moduli dell'eseguibile Java devono utilizzarli. Se il dizionario contenessero unicamente i nomi (senza informazioni accessorie correlate) e fossero usati in sola lettura, un semplice file di testo poteva essere sufficiente per la rappresentazione. Tuttavia, poiché saranno individuate tecniche di ottimizzazione nell'impiego dei dizionari che richiedono operazioni di scrittura e ordinamento dei dati, risulta opportuno usare un database relazionale.&lt;br /&gt;
&lt;br /&gt;
====Logica di business e dinamiche di interazione====&lt;br /&gt;
&lt;br /&gt;
Vengono presentati in questa sezione gli aspetti principali dei funzionamenti dei moduli del servizio. Per mettere bene a fuoco quali siano le meccaniche di interazione e i flussi di esecuzione dei programmi, si propone il diagramma di sequenza del tipico scenario di utilizzo. In questo schema UML si descrive il caso d'uso dove un utente, dopo aver inserito un documento ed averlo ricevuto &amp;quot;minimizzato&amp;quot;, esprime delle preferenze e richiede poi un secondo trattamento.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F00])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si descrivono quindi ora le principali operazioni che vengono eseguite.&lt;br /&gt;
All'avvio dell'interazione viene presentata una pagina PHP di benvenuto contenente le informazioni su come i dati personali vengano elaborati ed un ''file-picker'' per consentire l'upload di un documento ''OOXML''; nel momento in cui l'utente confermerà il caricamento del documento, esso verrà trasferito sul server. &lt;br /&gt;
Bisogna prestare particolare attenzione al comportamento del sistema nel caso in cui più utenti richiedano contemporaneamente l'esecuzione del servizio, e cioè alle problematiche di esecuzioni concorrenti di script PHP; è necessario, in particolare, evitare situazioni in cui i nomi dei file inviati dagli utenti siano in conflitto. Analizzando più in dettaglio il problema, ogniqualvolta un web server Apache riceve una richiesta HTTP per una pagina PHP, si ha la generazione di un nuovo processo che esegue il codice presentato nella pagina PHP richiesta. Supponendo quindi che N utenti eseguano l'invio del file contemporaneamente, si avrebbe che sul server N processi diversi dovrebbero procedere con la scrittura di un file. Ovviamente se due o più file condividono il nome almeno uno di essi sarà sovrascritto. Per risolvere questo problema, supponendo di voler salvare tutti i documenti in una cartella temporanea, occorre modificare il filename dei documenti inviati dagli utenti per esser certi di non incorrere in sovrascritture o altri tipi di errori correlati.&lt;br /&gt;
Una valida possibilità è l'inserimento di un ''prefisso'' univoco nel filename. Per la generazione di una stringa univoca da anteporre al filename, che permetta di distinguere file caricati da utenti diversi, si può direttamente usare il ''session id'' dell'utente. In PHP esso è determinato casualmente combinando ([0043]): l'IP del cliente, orario di attribuzione dell'id, un numero pseudo-casuale (con il ''PHP Linear Congruence Generator'') e, se presente un &amp;quot;''random source''&amp;quot; sul sistema operativo del Client (spesso chiamato impropriamente &amp;quot;''seme''&amp;quot;), un ulteriore numero pseudo-casuale.&lt;br /&gt;
Per introdurre ulteriore alea, necessaria se, ad esempio, un utente tenti l'upload di file omonimi (con contenuto interno diverso) e mantenga il medesimo ''session id'', si utilizza un ulteriore generatore pseudo-casuale per produrre un altro numero con cui comporre il prefisso.&lt;br /&gt;
Concatenando i due numeri generati si ha praticamente certezza di aver individuato un numero univoco nel sistema per il tempo in cui il servizio sarà erogato al cliente.&lt;br /&gt;
&lt;br /&gt;
Una volta memorizzato il file, lo script PHP dovrà ricorrere all'invocazione del modulo Java, delegato al vero e proprio processamento del documento. Occorre quindi individuare un set di opzioni che consenta al modulo che gestisce l'interazione con il cliente di sfruttare al meglio il componente delegato all'elaborazione del documento, in qualunque circostanza; la totale indipendenza dei moduli, la loro sostituibilità e la replicazione possibile di macchine server sono solo alcuni dei fattori che rendono mutevole la configurazione del sistema. Va definito un protocollo di comunicazione, quindi, che astragga completamente dall'implementazione dei moduli o dalla locazione dei file.&lt;br /&gt;
&lt;br /&gt;
Valutando i possibili flussi logici, anche con l'ausilio del diagramma di sequenza, si ha che i tipi di esecuzione sono due:&lt;br /&gt;
* &amp;quot;minimizzazione&amp;quot; con dizionario&lt;br /&gt;
* &amp;quot;minimizzazione&amp;quot; di specifici nominativi&lt;br /&gt;
Il protocollo di comunicazione tra i due moduli è costituito in entrambi i casi di una singola richiesta a cui segue una singola risposta. Più in particolare, lo script PHP invoca il comando Java esprimendo obbligatoriamente il path del file da trattare e opzionalmente l'elenco dei nominativi. A suo volta, il modulo Java restituisce i nominativi trovati, qualora non espressamente richiesti dallo script, e segnala la corretta terminazione dell'elaborazione.&lt;br /&gt;
Si definiscono come canali di comunicazione standard del protocollo gli argomenti presi in input dal modulo di processamento del documento e lo standard output del processo che esegue tale programma. Inoltre è importante definire un formato standard per la comunicazione dei nominativi tra moduli; è necessario quindi scegliere un pattern che permetta di determinare univocamente la composizione dei nominativi. Un possibile formato, espresso tramite ''regex'', è il seguente:&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt; &amp;lt;nominativo&amp;gt; = ^(&amp;lt;nome&amp;gt;:)*&amp;lt;nome&amp;gt;;&amp;lt;cognome&amp;gt;$&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt; &amp;lt;nominativi&amp;gt; = ^(&amp;lt;nominativo&amp;gt;\s+)+$&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Dove nome e cognome sono una sequenza di caratteri Unicode come già discusso. Ulteriori opzioni importanti da definire nel protocollo per l'invocazione del programma che si occupa delle funzionalità di elaborazione sono le seguenti:&lt;br /&gt;
* path file da elaborare (opzione &amp;quot;-i &amp;lt;file_path&amp;gt;&amp;quot;, obbligatoria)&lt;br /&gt;
* path con cui salvare il file elaborato (opzione &amp;quot;-o &amp;lt;file_path&amp;gt;&amp;quot;, opzionale: per default viene creato un nuovo file automaticamente)&lt;br /&gt;
* abilitazione stampe verbose, da usare solo in fase di debug (opzione &amp;quot;-d&amp;quot;, opzionale)&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Una volta terminato il processamento, il modulo di gestione dell'interazione con l'utente dovrà accertarsi che l'&amp;lt;i&amp;gt;exit status&amp;lt;/i&amp;gt; sia 0 e leggere dallo standard output del processo appena terminato, qualora si sia stata eseguita la &amp;quot;minimizzazione&amp;quot; con dizionario, l'elenco dei nominativi trovati. Se invece la &amp;quot;minimimizzazione&amp;quot; ha avuto luogo con i nominativi già specificati non sarà scritto nulla sullo standard output.&lt;br /&gt;
A margine si osserva che l'impiego dell'opzione &amp;quot;-d&amp;quot; deve sempre consentire una semplice individuazione dei nominativi trovati; in particolare, se tale opzione è specificata, nello standard output i nominativi compariranno con un ''header'' riconoscibile (&amp;quot;''NOMINATIVO=''&amp;quot;).&lt;br /&gt;
Ritornando alla descrizione del flusso di esecuzione tipo, una volta che il modulo Java ha completato il trattamento del documento, lo script PHP ne effettuerà l'upload sul client e presenterà all'utente le opzioni già descritte nel capitolo sull'usabilità. &lt;br /&gt;
A questo punto l'interazione con client potrebbe concludersi, qualora si eseguisse il download e si chiudesse il browser, o continuare elaborando i ''suggerimenti'' dell'utente espressi dopo il primo trattamento. Le modalità di comunicazione dei moduli varierebbero leggermente come appena illustrato, mentre, a seconda della configurazione stateful o stateless del servizio, verrebbe eseguito o meno un nuovo upload del file dal client al server.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si osserva infine che, per predisporre a successivi studi di ottimizzazione il servizio e per agevolare tutti i possibili sviluppi futuri, si applica largamente nella progettazione del modulo di elaborazione Java il ''Dependency Inversion Principle'', in quanto si desidera realizzare classi estendibili ed intercambiabili.&lt;br /&gt;
In particolare, si introducono delle classi astratte per rappresentare in maniera generica il concetto di &amp;quot;''persona''&amp;quot; e &amp;quot;''minimizzatore''&amp;quot;. È possibile infatti realizzare successivi studi per trattare ulteriori dati personali oltre che ai nomi e cognomi; inoltre, in base ai tipi di documenti trattati o eventuali altri fattori utili, è possibile studiare differenti tecniche di &amp;quot;minimizzazione&amp;quot; realizzate da differenti algoritmi &amp;quot;''minimizzatori''&amp;quot;.&lt;br /&gt;
In particolare una &amp;quot;''persona''&amp;quot; dovrà sempre esporre un metodo &amp;quot;''minimizza''&amp;quot; che prende in input una stringa, la &amp;quot;minimizza&amp;quot; e la restituisce; il pattern con il quale si effettua la &amp;quot;minimizzazione&amp;quot; sarà fornito in implementazione a seconda dei dati sensibili di interesse.&lt;br /&gt;
Un &amp;quot;''minimizzatore''&amp;quot; esporrà sempre un metodo &amp;quot;''work''&amp;quot; che, presa in input una lista di persone ed un documento ''OXML'', con l'ausilio della libreria Docx4j, fornirà in output un documento del tutto &amp;quot;minimizzato&amp;quot;; la definizione delle modalità con cui si estrapolano le informazioni dal documento e con cui si invoca il metodo &amp;quot;''minimizza''&amp;quot; della classe persona sono confinate nell'implementazione.&lt;br /&gt;
Definendo delle classi astratte risulta, quindi, più veloce la realizzazione dei futuri componenti e si svincola il processo di &amp;quot;minimizzazione&amp;quot; dal tipo di dati che si &amp;quot;minimizzano&amp;quot; e viceversa.&lt;br /&gt;
&lt;br /&gt;
====Le classi principali del progetto====&lt;br /&gt;
Le classi principali del progetto vengono quindi presentate in appendice. Esse sono:&lt;br /&gt;
* App.java, contenente il main&lt;br /&gt;
* Elaborator.java, che presenta il metodo &amp;quot;''work''&amp;quot;&lt;br /&gt;
* Persona.java, che presenta il metodo &amp;quot;''minimizza''&amp;quot;&lt;br /&gt;
* Testing.java, contenente alcune funzioni usate in fase di debug.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gli script in PHP sono stati forniti dall'azienda come implementazione minimale e provvisoria, da perfezionare a seguito della eventuale definizione sulle modalità di presentazione del servizio su Internet.&lt;br /&gt;
&lt;br /&gt;
Una considerazione di implementazione comune a tutte le classi deriva del principio ''Privacy by Design'', indifferentemente dalla modalità di configurazione stateful o stateless del servizio: è di fondamentale importanza che nel sistema non siano memorizzati permanentemente in alcun caso i documenti inviati dagli utenti del servizio. &lt;br /&gt;
Per realizzare un sistema robusto, per fronteggiare crash improvvisi del client o congestioni della rete, è opportuno impostare dei timeout lato server che procedano automaticamente alla eliminazione dei documenti degli utenti dopo un periodo di inattività troppo prolungato. Qualora invece si dovesse verificare un interruzione critica del servizio a causa di un errore logico del server o semplicemente per via di un'interruzione dell'alimentazione della macchina server, bisogna considerare altri metodi; essendo il servizio realizzato con un sistema operativo Linux, si può configurare il demone ''crond'' per eseguire a ogni reboot e, per sicurezza, una volta al giorno l'eliminazione dei file usati dall'applicazione tutti contenuti all'interno della cartella temporanea.&lt;br /&gt;
&lt;br /&gt;
==Approfondimenti tecnologici==&lt;br /&gt;
&lt;br /&gt;
===Analisi della struttura del formato OOXML===&lt;br /&gt;
&lt;br /&gt;
Come argomentato, il formato dei documenti elaborati dal servizio progettato dovrà essere ''Office Open XML'', o ''OOXML''; si tratta di un formato ''XML-based'' per documenti di testo, fogli elettronici e presentazioni, in grado di rappresentare grafici, diagrammi, immagini e altro materiale grafico. La specifica fu sviluppata da Microsoft e adottata dall'&amp;lt;i&amp;gt;ECMA International&amp;lt;/i&amp;gt; come standard ''ECMA-376'' nel 2006. Una seconda versione fu rilasciata nel 2008, una terza nel 2011, una quarta nel 2012 ed una quinta tra il 2015 ed il 2016 ([0010]). La specifica è stata adottata, inoltre dall'&amp;lt;i&amp;gt;ISO&amp;lt;/i&amp;gt; e dall'&amp;lt;i&amp;gt;IEC&amp;lt;/i&amp;gt; come standard ''ISO/IEC 29500'' a partire dal 2008 ([0011], [0012]).&lt;br /&gt;
&lt;br /&gt;
====Linguaggi di markup====&lt;br /&gt;
&lt;br /&gt;
Lo standard ''ECMA-376'' ([0010]) include tre differenti specifiche di linguaggio per ognuna delle tre principali categorie di documenti:&lt;br /&gt;
* ''WordprocessingML'' per i documenti testuali&lt;br /&gt;
* ''SpreadsheetML'' per i fogli elettronici&lt;br /&gt;
* ''PresentationML'' per le presentazioni elettroniche&lt;br /&gt;
* ''DrawingML'' ed altri linguaggi di markup di supporto per la rappresentazione di disegni, forme e diagrammi.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
La specifica include sia gli schemi ''XML'' sia i vincoli espressi per iscritto. Ogni documento conforme al formato dovrà, quindi, rispettare gli schemi ''XML'' e dovrà essere codificato in ''UTF-8'' o ''UTF-16''. La specifica, inoltre, permette l'aggiunta di ''custom tag XML'' a supporto dei linguaggi di markup dati, per default nel formato ''OOXML'', consentendo quindi la libera personalizzazione dei documenti.&lt;br /&gt;
&lt;br /&gt;
====File packaging====&lt;br /&gt;
&lt;br /&gt;
Oltre alla specifiche relative ai linguaggi di markup, la seconda parte dell'&amp;lt;i&amp;gt;ECMA-376&amp;lt;/i&amp;gt; ([0010]) definisce la struttura gerarchica dei file del formato adottando le ''Open Packaging Conventions'' (''OPC''). ''OPC'', una tecnologia ''file-container'' basata sul comune formato compresso ''zip'', che stabilisce che tutti i file che riguardano una stessa entità devono essere raggruppati in un unico package ([0014]). Un documento ''OOXML'' è, infatti, un archivio ''zip'' contenente alcuni files ''XML'' (detti anche ''parti'') organizzati in un singolo package. Questa frammentazione dei dati in più files rende più semplice e veloce l'accesso ai dati stessi e riduce le possibilità di una loro corruzione. Le ''parti'' possono contenere qualsiasi tipo di dato; per tenere traccia della relazione tra una ''parte'' e la sua tipologia di contenuto, senza basarsi sull'estensione del file, è presente nel package, nella cartella radice della gerarchia, il file denominato ''[Content_Types].xml'', il quale mappa appunto queste associazioni. È mostrata qui ad esempio l'associazione tra la ''parte'' rappresentante il documento principale e il suo ''ContentType''.&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Override PartName=&amp;quot;/word/document.xml&amp;quot; ContentType=&amp;quot;application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Le informazioni relative alle relazioni che ogni ''parte'' ha con le altre ''parti'', con risorse esterne e con il package in sé sono mantenute separatamente dal contenuto della ''parte'' stessa. Tali informazioni sono presenti, infatti, all'interno delle cartelle denominate ''_rels'': ne esiste una per il package nel suo complesso e una per ogni sotto-cartella del package contenente delle ''parti'' coinvolte in delle relazioni. In questo modo i riferimenti che una ''parte'' ha verso altre ''parti'' o risorse sono salvati una sola volta e possono essere aggiornati con semplicità se necessario, senza dover modificare il contenuto stesso delle ''parti'' coinvolte. È mostrato qui un esempio di relazione contenuta in ''_rels/.rels'' relativa al documento principale e al suo schema.&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Relationship Id=&amp;quot;rId1&amp;quot; Type=&amp;quot;http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument&amp;quot; Target=&amp;quot;word/document.xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Il documento principale, ossia il file ''word/document.xml'', ha inoltre numerose relazioni con altre ''parti'', come ad esempio ''word/styles.xml'' e ''word/footer.xml'', e risorse esterne collegate con degli URI. Per descrivere queste relazioni si usa la cartella ''word/_rels''.&lt;br /&gt;
&lt;br /&gt;
====Parti di un Documento OOXML====&lt;br /&gt;
&lt;br /&gt;
Vengono qui presentate le ''parti'' che sono caratteristiche esclusive di un ''WordprocessingML package'', non presenti quindi negli altri due formati ''OOXML''. È importante osservare che alcune di esse sono facoltative e sono presenti nel package solo se necessario.&lt;br /&gt;
&lt;br /&gt;
Le ''parti'' relative al vero e proprio contenuto testuale sono:&lt;br /&gt;
* ''Main Document'', contiene le informazioni principali ed è salvata come ''word/document.xml''&lt;br /&gt;
* ''Header'', contiene i dati relativi alle intestazioni ed è salvata in ''word/header.xml''. Ogni sezione del documento può avere intestazioni diverse per la prima pagina, per le pagine pari e per le dispari, quindi possono esserci molteplici ''parti header''&lt;br /&gt;
* ''Footer'', contiene le informazione relative al piè pagina ed è salvata in ''word/footer.xml''. Può essere presente più volte, per motivi analoghi alla ''parte header''&lt;br /&gt;
* ''Footnotes'', contiene le eventuali note a piè pagina del documento ed è salvata come ''word/footnotes.xml''&lt;br /&gt;
* ''Endnotes'', contiene le note di chiusura del documento ed è salvata in ''word/endnotes.xml''.&lt;br /&gt;
&lt;br /&gt;
Sono presenti poi delle ''parti'' relative allo stile e alle impostazioni del documento:&lt;br /&gt;
* ''Style Definitions'', contiene la definizione di un insieme di stili usati dal documento, salvata in ''word/styles.xml''&lt;br /&gt;
* ''Font Table'', contiene informazioni riguardo i font usati, salvata in ''word/fontTable.xml''&lt;br /&gt;
* ''Numbering Definitions'', contiene le definizioni sulla struttura delle liste contenute nel documento, salvata in ''word/numbering.xml''&lt;br /&gt;
* ''Document Settings'', specifica come il word processor debba trattare il documento (spell checking, gestione delle revisioni, etc.), contenuta in ''word/settings.xml''&lt;br /&gt;
* ''Web Settings'', contiene informazioni su come il documento debba essere convertito in ''HTML'' se richiesto, contenuta in ''word/webSettings.xml''.&lt;br /&gt;
&lt;br /&gt;
Sono presenti anche delle ''parti'' che rappresentano testo secondario:&lt;br /&gt;
* ''Comments'', contiene i commenti sul documento inseriti attraverso un word processor&lt;br /&gt;
* ''Glossary'', contiene dati testuali aggiuntivi secondari, ne è permessa una sola. Tutte le ''parti'' prima elencate, tranne il ''Main Document'', possono comparire una seconda volta in relazione alla ''parte glossary''.&lt;br /&gt;
&lt;br /&gt;
====Analisi del Main Document====&lt;br /&gt;
&lt;br /&gt;
Il file ''document.xml'', elemento principale di un documento ''WordprocessingML'', è costituito da due tipi di informazioni:&lt;br /&gt;
* ''properties'', che definiscono lo stile e la formattazione del testo&lt;br /&gt;
* ''stories'', che rappresentano il contenuto testuale delle varie parti del documento.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le ''properties'' verranno trattate in misura minore. Queste informazioni sono espresse attraverso una struttura XML gerarchica che ha come elemento radice il nodo ''document''. Esso ha due nodi figli:&lt;br /&gt;
* ''background'', che contiene alcune ''properties'' che descrivono lo sfondo del documento&lt;br /&gt;
* ''body'', che contiene tutti i rimanenti contenuti ed è potenzialmente molto complesso.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si osserva che per le finalità del trattamento dei dati risultano di primario interesse le ''stories'' e che è opportuno effettuare un'analisi ''bottom-up'' del problema: anziché considerare la gerarchia a partire dal ''body'' (nodo padre) partiremo dalla rappresentazione più semplice del testo contenuta nel documento (nodi figli).&lt;br /&gt;
&lt;br /&gt;
Facendo direttamente riferimento allo standard ''ECMA-376'' ([0010]),  si evince che l'unico nodo che contiene puro testo ha il nome ''t'' (''Text''). Questo elemento contiene una stringa rappresentante gli esatti caratteri che vengono poi mostrati negli editor a video. Il nodo ''Text'' non presenta figli e l'unico nodo padre che può avere è ''r'' (''Run''). Quest'altro nodo definisce una regione di testo con comuni proprietà (ad esempio l'uso del grassetto). Attraverso l'uso di tag ''t'' ed ''r'' quindi si rappresenta una regione di testo formattata con differenti elementi stilistici.&lt;br /&gt;
Occorre però evidenziare che un nodo ''r'' può presentare molti altri figli oltre a ''t'', come ad esempio immagini, in quanto rappresenta un'area generica del documento.&lt;br /&gt;
Si supponga quindi di avere due nodi ''Text'' fratelli, ossia figli dello stesso nodo ''r'': essi rappresenteranno semanticamente un unico blocco logico se e solo se compariranno a video come una sequenza di parole continua. Questo fenomeno è facilmente identificabile anche nel file ''XML'' descrittivo: due sequenze di parole mostrate a video adiacenti compaiono infatti nel file ''XML'' in due righe consecutive; se invece due parti di testo dovessero essere intervallate ad es. da un'immagine nel documento ''XML'' ci sarebbe un tag ''drawing'' a dividere i due tag ''t''. Dalla consecutività dei nodi ''Text'' nel file ''document.xml'' si può determinare quali siano i blocchi logici da trattare.&lt;br /&gt;
Un insieme di ''Run'' infine può essere figlio di diversi nodi, ma ciò non è di rilevante importanza, in quanto ogni area di testo individuata dal nodo ''Run'' rappresenta già un blocco logico a sé e, di conseguenza, contiene sufficienti informazioni per la &amp;quot;minimizzazione&amp;quot;.&lt;br /&gt;
L'unico caso di rilievo nel quale bisogna valutare quale sia la gerarchia a monte di un nodo ''Run'' è nell'elaborazione di una tabella. In tal caso, in realtà, occorre verificare opportunamente la strutturazione della gerarchia processata. Per chiarezza espositiva viene mostrata la rappresentazione in formato ''OOXML'' di una tabella con una riga e due colonne (senza l'uso di ''properties'' per la formattazione stilistica).&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;w:tbl&amp;gt;&lt;br /&gt;
  &amp;lt;w:tr&amp;gt;&lt;br /&gt;
    &amp;lt;w:tc&amp;gt;&lt;br /&gt;
      &amp;lt;w:p&amp;gt;&lt;br /&gt;
        &amp;lt;w:r&amp;gt;&lt;br /&gt;
          &amp;lt;w:t&amp;gt;Cella A&amp;lt;/w:t&amp;gt;&lt;br /&gt;
        &amp;lt;/w:r&amp;gt;&lt;br /&gt;
      &amp;lt;/w:p&amp;gt;&lt;br /&gt;
    &amp;lt;/w:tc&amp;gt;&lt;br /&gt;
    &amp;lt;w:tc&amp;gt;&lt;br /&gt;
      &amp;lt;w:p&amp;gt;&lt;br /&gt;
        &amp;lt;w:r&amp;gt;&lt;br /&gt;
          &amp;lt;w:t&amp;gt;Cella B&amp;lt;/w:t&amp;gt;&lt;br /&gt;
        &amp;lt;/w:r&amp;gt;&lt;br /&gt;
      &amp;lt;/w:p&amp;gt;&lt;br /&gt;
    &amp;lt;/w:tc&amp;gt;&lt;br /&gt;
  &amp;lt;/w:tr&amp;gt;&lt;br /&gt;
&amp;lt;/w:tbl&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Come si osserva in figura, in una tabella il nodo ''r'' sarà figlio del nodo ''p'' (''Paragraph''), il quale a sua volta sarà contenuto in un noto ''tc'' (''Table Cell''). Celle di una tabella appartenenti ad una stessa riga saranno presenti all'interno dello stesso ''tr'' (''Table Row'') ed infine tutte le righe della tabella saranno inserite del tag ''tbl'' (''Table'').&lt;br /&gt;
&lt;br /&gt;
Per determinare quindi se due nodi ''Text'' sono scritti in due colonne adiacenti di una stessa riga (e quindi costituiscono un unico blocco logico) è necessario verificare che per i due nodi ''Text'':&lt;br /&gt;
# il nodo &amp;quot;padre&amp;quot;  '''non sia''' in comune&lt;br /&gt;
# il nodo &amp;quot;padre di 2° livello&amp;quot; sia ''Paragraph'' e '''non sia''' in comune&lt;br /&gt;
# il nodo &amp;quot;padre di 3° livello&amp;quot; sia ''Table Cell'' e '''non sia''' in comune&lt;br /&gt;
# il nodo &amp;quot;padre di 4° livello&amp;quot; sia ''Table Row'' e '''sia''' in comune&lt;br /&gt;
# i nodi &amp;quot;padre di 3° livello&amp;quot; '''siano''' consecutivi.&lt;br /&gt;
Se tutte queste ipotesi sono soddisfatte, le due celle vanno &amp;quot;minimizzate&amp;quot; come unico blocco logico.&lt;br /&gt;
&lt;br /&gt;
Si valutano infine gli ultimi vincoli emersi nell'analisi sull'interpretazione della formattazione di un documento.&lt;br /&gt;
In particolare, descrivendo le parti che compongo un documento ''OOXML'', era già emerso che alcune sezioni di testo, ossia note a piè pagina ed intestazioni, compaiono in altri file ''XML'' e non in ''document.xml''. Questi file (''header.xml'', ''footer.xml'', ''endnotes.xml'', etc.) sono tutti raccolti in un package (&amp;quot;''word''&amp;quot;) e la grammatica ''XML'' è la stessa usata per il Main Document.&lt;br /&gt;
Si conclude osservando che il problema della divisione in sillabe delle parole non si pone, in quanto la divisione sillabica mostrata a video dai word-processors è calcolata dinamicamente; in particolare, su una porzione di testo viene applicata la sillabazione (ove necessario) se è presente tra le ''properties'' di quella regione di documento il tag ''hyphenationZone''.&lt;br /&gt;
&lt;br /&gt;
====La libreria in ambiente java open source Docx4j====&lt;br /&gt;
&lt;br /&gt;
La libreria Docx4j offre completo supporto alla manipolazione di documenti ''docx'' (compressione e decompressione archivio zip, generazione file ''XML'' necessari, etc.). Offre inoltre un'utile mappatura in specifici oggetti Java della gerarchia ''XML'' presente nei vari file del formato.&lt;br /&gt;
Uno tra gli elementi più interessanti è la tecnica con cui vengono recuperati i nodi dai file ''XML'', in quanto si fa impiego del linguaggio standard W3C ''XPath'' ([0044], [0045]). Con ''XPath'' è possibile esprimere con una stringa un sottoinsieme di nodi presenti in una gerarchia ''XML'' non solo in base al loro nome o valore, ma anche in relazione alla posizione reciproca rispetto agli altri nodi. Riferendoci alle problematiche del servizio risulta, ad esempio, significativamente agevolato il trattamento di dati personali in forma tabellare.&lt;br /&gt;
Si osserva infine che la libreria attribuisce un id univoco ad ogni nodo del documento, di conseguenza se ne può trarre vantaggio nei confronti tra i nodi.&lt;br /&gt;
&lt;br /&gt;
===Ottimizzazioni del processo di minimizzazione===&lt;br /&gt;
&lt;br /&gt;
Durante l'analisi dei requisiti è emerso che l'efficienza costituisce un aspetto problematico del servizio. Si ricorda di aver stimato la durata di una prestazione media di circa 145 secondi, considerando dati: &lt;br /&gt;
* un documento di medie dimensioni (10 pagine ~ 5000 parole) &lt;br /&gt;
* tempo medio di 10 ms per individuare le occorrenze di un nome&lt;br /&gt;
* un dizionario di circa 14.500 parole&lt;br /&gt;
&lt;br /&gt;
In linea di massima si individuano due generi di strategie che consentirebbero la riduzione del tempo medio di esecuzione: uno mirato a ridurre il più possibile il testo da sottoporre a &amp;quot;minimizzazione&amp;quot; automatica, l'altro a ottimizzare l'impiego del dizionario e dell'algoritmo di ricerca.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Come già spiegato, l'approccio di ricerca ''pattern-based'' è poco sensibile all'aumentare della lunghezza del documento, ma da questo valore ha una dipendenza non trascurabile.&lt;br /&gt;
&lt;br /&gt;
Nel documento è altamente probabile che ci siano interi periodi, se non pagine, dove non sia presente alcun nominativo. Anche all'interno di una frase che necessita di ''minimizzazione'' è plausibile che siano sono poche le coppie (al più le terne) di parole riconducibili ad una sequenza nome-cognome. È inessenziale che sezioni di testo che non necessitano di &amp;quot;minimizzazione&amp;quot; vengano processate. Si osserva per inciso che, ovviamente, questo ragionamento è corretto per via dell'indipendenza dal contesto di un approccio ''pattern-based''.&lt;br /&gt;
&lt;br /&gt;
Il pattern definito per la ricerca di un nominativo è molto restrittivo, in quanto accetta solo sequenze di parole costituenti un nominativo contenente un nome specifico; d'altronde la progettazione del pattern è stata effettuata mirando ad identificare il più accuratamente possibile le sequenze da anonimizzare.&lt;br /&gt;
&lt;br /&gt;
Analizzando attentamente il problema, si può fare il seguente ragionamento: per ridurre il più possibile il numero di parole da processare a ogni iterazione di ricerca del pattern di un nome, è possibile individuare preliminarmente tutte le sequenze di parole del documento che ''potrebbero essere'' dei nominativi e ''potrebbero'' fare match.&lt;br /&gt;
&lt;br /&gt;
L'operazione di &amp;quot;pre-filtraggio&amp;quot; si applica processando il documento con un ''pattern'' che presenta un'espressione più generale e permissiva delle ''regex'' definite per i nomi del dizionario. Si osserva che una qualunque successione di caratteri ''alfabetici'' iniziante con un carattere maiuscolo ''potrebbe'' rappresentare un nome. Per realizzare un espressione adatta si parte dalla definizione della ''regular expression'' già data ai nomi del dizionario:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;regex&amp;gt; := (&amp;lt;second_name&amp;gt;\s)?(&amp;lt;nome&amp;gt;)\s&amp;lt;cognome&amp;gt;|&amp;lt;cognome&amp;gt;\s(&amp;lt;nome&amp;gt;)(\s&amp;lt;second_name&amp;gt;)?&lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Nell'uso fatto finora di questa espressione, al tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nome&amp;gt;&amp;lt;/span&amp;gt; viene attributo, ciclio dopo ciclio, una parola del dizionario diversa. È possibile definire una variante più generale dell'espressione appena presentata:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;nome_pre&amp;gt; := [A-Z][a-zA-ZÀ-ÖØ-öø-ÿ&amp;lt;extra&amp;gt;]+&lt;br /&gt;
&lt;br /&gt;
&amp;lt;regex_pre&amp;gt; := (&amp;lt;second_name&amp;gt;\s)?(&amp;lt;nome_pre&amp;gt;)\s&amp;lt;cognome&amp;gt;|&amp;lt;cognome&amp;gt;\s(&amp;lt;nome_pre&amp;gt;)(\s&amp;lt;second_name&amp;gt;)?&lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Con questa ''regex'' si identifica una qualunque sequenza che rappresenta un nominativo, ma allo stesso tempo anche, ad esempio, tutte le parole consecutive inizianti con una maiuscola. È importante sottolineare che questo pattern presenta tutte le caratteristiche già ampiamente discusse sul formato delle ''regex'' per riconoscimenti automatici (gestione dei delimitatori, posizione relativa tra i nomi ed il cognome, etc.).&lt;br /&gt;
Il processamento di una ''regex'' generale inoltre sarà inevitabilmente più lento di quello di ''regex'' aventi i nomi specificati, in quanto molte più sequenze faranno match essendo l'espressione più permissiva. La mancanza di accuratezza va rapportata all'impiego della ''regular expression'': fornendo essa un semplice &amp;quot;pre-filtraggio&amp;quot; del documento non risulta necessario nè che individui esclusivamente nominativi nè che sia in grado di distinguerli gli uni dagli altri. Il leggero ritardo introdotto viene valutato sperimentalmente, applicando lo stesso l'algoritmo già usato in precedenza ed elaborando gli stessi documenti, sempre a parità di piattaforma.&lt;br /&gt;
&lt;br /&gt;
Partendo dall'elaborazione di un documento contenente 10 nominativi ed in totale 5.000 parole, si misura che tempo il processamento medio della ''regex'' di &amp;quot;pre-filtraggio&amp;quot; è di circa 36 ms; si ricorda che per lo stesso documento il tempo di esecuzione medio per il processamento di un nominativo non presente è di circa 9 ms, se le occorrenze salgono a 10, il tempo è in media di circa 10 ms.&lt;br /&gt;
Sebbene l'elaborazione di questa ''regex'' sia circa 4 volte più lenta dell'elaborazione di ''regex'' più specifiche, un ritardo introdotto dell'ordine dei millisecondi è trascurabile rispetto al tempo di processamento complessivo (stimato di circa 145 second).&lt;br /&gt;
Si osserva, per inciso, che nell'elaborazione di questo particolare documento sono stati individuati altre 21 sequenze che rispettavano il pattern che non costituivano dei nominativi. &lt;br /&gt;
&lt;br /&gt;
Terminata l'esecuzione dell'operazione di prefiltraggio, occorre sfruttare opportunamente le informazioni ottenute: in particolare, si possono elaborare con le ''regex'' dei nomi le sole sotto-stringhe che hanno fatto match con la ''regular expression'' nell'operazione preliminare. In altri termini, con questo metodo si effettua una sola elaborazione del testo completo e molteplici processamenti delle sotto-stringhe che ''potrebbero'' contenere nominativi. &lt;br /&gt;
Si osserva inoltre che, conoscendo con certezza gli indici di inizio e fine delle sotto-stringhe che ''potenzialmente'' contengono nominativi, è possibile &amp;quot;alleggerire&amp;quot; la ''regex'' associata ai nomi del dizionario: si possono rimuovere i costrutti ''lookahead'' e ''lookbehind'' in quanto la sotto-stringa è stata già rimossa dal contesto e quindi rappresenta esclusivamente i caratteri individuati dalla ''regular expression'' di &amp;quot;pre-filtraggio&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A questo punto occorre valutare sperimentalmente l'ottimizzazione ottenuta. Si misura che sono sufficienti 2 ms di elaborazione in media per nome, mentre, nel caso raro in cui tutti i 10 nominativi presenti si riconducano ad un unico nome, il tempo medio di esecuzione tende verso i 3 ms. Si osserva che questo è possibile perchè le parole nelle sotto-stringhe sono poco meno di 50, ossia si è ridotta di oltre il 99% la dimensione complessiva di dati da processare!&lt;br /&gt;
Valutando l'ottimizzazione complessiva in termini di tempo si ha che, processando un dizionario di circa 14.500 termini, sono necessari in media 29 secondi.&lt;br /&gt;
&lt;br /&gt;
Ovviamente questo dato è fortemente dipendente dal contenuto del documento. Vanno effettuate opportune misurazioni nel caso in cui la percentuale di nominativi presenti rispetto alle parole complessive nel documento sia maggiore. Si considera un documento di 5.000 parole contenente 200 sequenze riconosciute dall'algoritmo di &amp;quot;pre-filtraggio&amp;quot; delle quali 100 costituiscono dei nominativi. &lt;br /&gt;
Si misura che il tempo di esecuzione medio è di 6 ms nel caso generale del processamento di un nome con poche occorenze e tenderà verso i 10 ms nel caso sporadico in cui le occorrenze del nome saranno proprio 100 o poco meno. Il tempo di esecuzione del &amp;quot;pre-filtraggio&amp;quot; è di circa 48 ms. &lt;br /&gt;
Per inciso, si osserva che la ragione per cui il tempo necessario al &amp;quot;pre-filtraggio&amp;quot; non aumenta esageratamente è dovuta al pattern della ''regex''. La ''regular expression'' impiegata infatti, facendo principalmente uso di caratteri espressi in un range unitamente al quantificatore &amp;quot;+&amp;quot;, risulta particolarmente efficiente da elaborare.&lt;br /&gt;
Nel caso di documenti più &amp;quot;ricchi&amp;quot; di nomi si stima l'elaborazione media complessiva di circa 1 minuto e 27 secondi.&lt;br /&gt;
&lt;br /&gt;
Facendo il punto della situazione, si è ridotto di circa 5 volte il tempo di esecuzione complessivo nel caso di documenti &amp;quot;scarsamente popolati&amp;quot; da nominativi e quasi dimezzato il tempo necessario nell'elaborazione di documenti contenenti molte coppie nome-cognome. Occorre proseguire nello studio per migliorare l'ottimizzazione, considerando dove l'algoritmo di ricerca e l'impiego del dizionario possono essere migliorati.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Viene posta una semplice domanda sulle modalità di ricerca dei nominativi nell'insieme delle sotto-stringhe del documento: è computazionalmente equivalente prendere una ad una le sotto-stringhe e confrontarle con le ''regex'' dei nomi rispetto che prendere una ad una le ''regex'' dei nomi e confrontarle con le sotto-stringhe?&lt;br /&gt;
&lt;br /&gt;
Si fornisce una spiegazione formale alla domanda. &lt;br /&gt;
&lt;br /&gt;
Si definiscono due insiemi:&lt;br /&gt;
* A = {a_1, a_2, ... a_n}&lt;br /&gt;
* B = {b_1, b_2, ... b_m}&lt;br /&gt;
&lt;br /&gt;
Gli elementi dell'insieme A rappresentano le sotto-stringhe (cardinalità N), mentre gli elementi dell'insieme di B indicano le ''regex'' dei nomi (cardinalità M). È importante considerare che per il secondo insieme è definita una relazione di unicità che lega il valore degli elementi: per ogni ''b_i'' appartenente a B non esiste un indice ''j'', ''j'' compreso tra 1 ed M, tale che il testo del nodo ''i'' sia uguale al testo del nodo ''j'' (tranne se ''i'' = ''j''); in altre parole gli elementi rappresentanti le ''regex'' (''b_i'') per definizione sono posti univoci in B. &lt;br /&gt;
&lt;br /&gt;
Si presti attenzione al fatto che l'insieme delle sotto-stringhe presenta N elementi distinti tra loro in identità (&amp;quot;id nodo&amp;quot;), ma il cui contenuto testuale può essere equivalente a quello di altre sotto-stringhe. L'equivalenza tra due sotto-stringhe sussiste, in questo particolare contesto, qualora i contenuti testuali di entrambe facciano match con una stessa ''regex'' presente nell'insieme B. L'insieme delle ''regex'', invece, presentano elementi i cui valori testuali sono sempre univoci, in quanto ottenuti da nomi sempre diversi.&lt;br /&gt;
&lt;br /&gt;
Definiti gli insiemi si procede alla formulazione della risposta alla domanda precedente. Per chiarezza espositiva indicheremo con &amp;quot;A-&amp;gt;B&amp;quot; la procedura con cui si opera il confronto prendendo una ad una le sotto-stringhe per poi confrontarle con le ''regex'', mentre indicheremo con &amp;quot;B-&amp;gt;A&amp;quot; la procedura con cui si opera il confronto prendendo una ad una le ''regex'' dei nomi per poi confrontarle con le sotto-stringhe.&lt;br /&gt;
&lt;br /&gt;
Nel caso in cui l'insieme delle sotto-stringhe non contenga alcun nominativo, si ha una complessità computazionale equivalente per &amp;quot;A-&amp;gt;B&amp;quot; e per &amp;quot;B-&amp;gt;A&amp;quot;. Viene mostrato nei calcoli in figura che il numero di confronti necessari ''C_1'' è dato dal prodotto delle cardinalità degli insiemi, ossia ''C_1 = N · M''. &lt;br /&gt;
&lt;br /&gt;
(QUI FIG[0F07])&lt;br /&gt;
&lt;br /&gt;
Si suppone ora che il testo della sotto-stringa di posizione ''r'' faccia match con la ''regex'' in posizione ''k''; si applica &amp;quot;A-&amp;gt;B&amp;quot;. Come si mostra attraverso i calcoli in figura, il numero totale di confronti ''C_2'' sarà inferiore a ''C_1'' poichè, quando la sotta-stringa in posizione ''r'' risulta equivalente alla ''regex'' in posizione ''k'' si può direttamente passare alla valutazione della stringa in posizione ''r + 1'' e non svolgere i rimanenti ''m - k&amp;quot; confronti per la stringa in posizione ''r''. Si calcola che ''C_2 = k + m · (n -1)''.&lt;br /&gt;
&lt;br /&gt;
(QUI FIG[0F08])&lt;br /&gt;
&lt;br /&gt;
Supponendo sempre che il testo della sotto-stringa di posizione ''r'' faccia match con la ''regex'' in posizione ''k'', si applica &amp;quot;B-&amp;gt;A&amp;quot;. Similmente al caso precedente, quando la sotta-stringa in posizione ''r'' risulta equivalente alla ''regex'' in posizione ''k'' si può direttamente passare alla valutazione della ''regex'' in posizione ''k + 1'' e non svolgere i rimanenti ''n - r&amp;quot; confronti per la ''regex'' in posizione ''k''. Si osserva inoltre che è inutile confrontare le rimanenti ''m - k'' ''regex'' con la sottostringa di posizione ''r'': essa è risultata già equivalente ad una ''regex'' e, essendo le ''regex'' poste per definizione diverse tra loro, è di conseguenza impossibile che soddisfi un'altra uguaglianza.&lt;br /&gt;
Per inciso si osserva che nel calcolo di ''C_2'' un ragionamento di questo genere non è applicabile: ogni sotto-stringa può potenzialmente fare match con una qualsiasi ''regex''. &lt;br /&gt;
Il numero totale di confronti ''C_3'' viene calcolato come mostrato, si ottiene ''C_3 = k + m · (n -1) - n + r''.&lt;br /&gt;
&lt;br /&gt;
(QUI FIG[0F09])&lt;br /&gt;
&lt;br /&gt;
Si osserva che ''C_3 = C_2 - n + r'' e, essendo ''r'' la posizione della sotto-stringa coinvolta nel match, si ha che ''C_3'' è sempre minore di ''C_2'' qualunque sia la posizione della sotto-stringa. L'unico caso in cui ''C_3 = C_2'' si verifica quando la ''r = n'', ossia se la sotto-stringa è l'ultima dell'insieme.&lt;br /&gt;
&lt;br /&gt;
Per estendere il ragionamento, si prende la ''regex'' di posizione ''k'' e si indica con ''T'' il numero di sotto-stringhe che sono già risultate equivalenti ad una ''regex'' nelle elaborazioni precedenti. Risulta che, per il ragionamento spiegato nel calcolo di ''C_3'', potranno essere risparmiati almeno ''N - T'' confronti per la ''regex'' ''k'' e per ogni ''regex'' in posizioni successive. In generale, maggiore è il numero di nominativi nel documento, maggiore sarebbe l'ottimizzazione della procedura. &lt;br /&gt;
&lt;br /&gt;
Le conclusioni che si traggono sono due:&lt;br /&gt;
* indipendentemente dal numero o dalla posizione dei nominativi nelle sotto-stringhe, nell'algoritmo di minimizzazione è più efficiente prendere una ad una le ''regex'' dei nomi e con ognuna trattare l'insieme delle sotto-stringhe&lt;br /&gt;
* un efficace ordine di elaborazione delle ''regex'' può introdurre ottimizzazioni&lt;br /&gt;
&lt;br /&gt;
Va eseguita ora una valutazione sperimentale dei tempi di esecuzione del processo di &amp;quot;minimizzazione&amp;quot; tenendo conto di questi elementi. Le ''regex'' che fanno match con i nominativi presenti nel testo, quindi, vengono trattate tra le prime. Risulta di interesse principalmente valutare i miglioramenti ottenibili nel caso di documenti ''molto popolati'' da nominativi, poichè è questo il caso in cui l'ottimizzazione entra in gioco.&lt;br /&gt;
Si esegue il test sullo stesso documento trattato precedentemente con la sola tecnica di &amp;quot;pre-filtraggio&amp;quot;. Esso è composto da 5.000 parole, dal &amp;quot;pre-filtraggio&amp;quot; sono individuate 200 sotto-stringhe delle quali 100 costituiscono dei nominativi. &lt;br /&gt;
Nel test si è fatto riferimento a dati Istat ([0046]) per stabilire, quanto più realisticamente possibile, il miglior ordine di elaborazione delle ''regex'' associate ai nomi; risulta che circa il 25% dei nominativi è individuato entro i primi 15 cicli di esecuzione; circa il 35% entro i primi 50 ed il 100% entro circa i primi 3000. Per inciso, si osserva che un altro documento può dare origine a tempi significativamente peggiori qualora presenti molti nominativi con nomi desueti e presenti in fondo al dizionario. &lt;br /&gt;
Si misura che, dopo il &amp;quot;transitorio iniziale&amp;quot; (ossia dalla 51° ''regex'' in poi), il tempo medio è di 5 ms per l'elaborazione di una ''regex''. Si osserva che, una volta che sono state elaborate circa le prime 3000 ''regex'', il tempo medio di elaborazione di una ''regex'' scende a 4 ms. Per completezza, si riporta anche il tempo medio per la fase di &amp;quot;transitorio iniziale&amp;quot;, che si misura di circa 8 ms; il tempo di &amp;quot;pre-filtraggio&amp;quot;, già precedentemente calcolato, risulta di 48 ms.&lt;br /&gt;
Calcolando complessivamente la durata del processamento si ottiene che l'elaborazione media complessiva è di circa 61 secondi, si ottiene quindi una riduzione significativa rispetto al tempo di 1 minuto e 27 prima individuato.&lt;br /&gt;
&lt;br /&gt;
Si considerano, in relazione alle conclusioni della discussione teorica prima formalizzata, le implicazioni realizzative: in primis che l'imposizione del verso con cui eseguire la &amp;quot;minimizzazione&amp;quot; non determina particolari problemi implementativi, in secundis che l'ordinamento efficiente dei nomi del dizionario può essere trattato attraverso una tecnica di ''machine learning''.&lt;br /&gt;
&lt;br /&gt;
La tecnica di apprendimento che si realizza si basa sull'estrapolazione di informazioni utili nei documenti inviati dagli utenti. Si tiene traccia, infatti, della ''frequenza'' con cui un nome appare in diversi processamenti. Alla fine di ogni &amp;quot;minimizzazione&amp;quot;, dopo aver concluso il salvataggio del nuovo file ''OOXML'', il programma Java eseguira l'update sul database MySql delle frequenze dei nomi trovate, incrementandole.&lt;br /&gt;
Nell'interrogazione al database per l'ottenimento dell'insieme dei nomi, di conseguenza, si richiederà l'ordinamento per frequenza delle tuple restituite. In questo modo, più volte un nome compare nei documenti, più incrementi riceverà il suo campo frequenza, più avrà la probabilità di comparire in cima al dizionario.&lt;br /&gt;
Si progetta inoltre l'inserimento di un campo &amp;quot;ultimo utilizzo&amp;quot;, associato ai nomi sul database, che permette di avere un secondo criterio di ordinamento utile. Tale campo viene impiegato anche per evitare una crescita esagerata del valore della frequenza; periodicamente, con ''crond'' ad esempio, si decrementano i valori del campo &amp;quot;frequenza&amp;quot; dei nomi il cui &amp;quot;ultimo utilizzo&amp;quot; è troppo vecchio. Si osserva che i valori di configurazione per la gestione di queste elementi dipendono dal carico medio del sistema, noto solo dopo la progettazione, andranno valutati con precisione in fasi future. Ovviamente l'aggiornamento del campo &amp;quot;ultimo utilizzo&amp;quot; sarà contestuale all'aggiornamento della ''frequenza''. &lt;br /&gt;
Si osserva, per inciso, che l'impiego di un dizionario di cognomi sarebbe stato problematico per l'aggiornamento delle frequenze. Per via del principio ''Privacy by Design'', infatti, aggiornando la frequenza per la entry del cognome di una persona, indirettamente si sarebbe tenuto traccia di un dato sensibile, specialmente nel caso in cui il cognome risulti &amp;quot;raro&amp;quot;. &lt;br /&gt;
Una valutazione rilevante da fare è sulle implicazioni relative agli accessi concorrenti al dizionario, dovute all'introduzione dell'algoritmo appena spiegato, che esegue scrittura di &amp;quot;frequenza&amp;quot; e ''ultimo utilizzo'' sul database. Si osserva che non sono problematiche le &amp;quot;letture sporche&amp;quot;, poichè, se si verificano, al più risulta alterato l'ordine di qualche nome; inoltre nemmeno un &amp;quot;lost update&amp;quot; risulta eccessivamente problematico, poichè l'ultimo utilizzo risulta sempre aggiornato e la perdita di un incremento delle frequenza di un nome non rappresenta in linea di massima un problema. Questi scenari presentati vanno valutati complessivamente, però, una volta che si realizza il reale carico del sistema: perdere molti update risulta critico per l'ottimizzazione del processamento. Conviene in linea precauzionale prevedere una semantica transazionale per l'interazione tra modulo Java e database. Per inciso, eseguire l'update finale con una transazione non influenza il tempo di attesa dell'utente, poichè il documento è stato già elaborato per intero. &lt;br /&gt;
&lt;br /&gt;
Si fa infine un'ultima osservazione che consente di abbattere i tempi di attesa enormemente, a costo di perdere dell'accuratezza nel processamento automatico: ridurre il numero di nomi del dizionario processato, elaborando solo quelli in cima. &lt;br /&gt;
Si osserva che questa soluzione è ancor più efficace se i nomi contenuti nel documento sono pochi. In questo caso, infatti, il processamento dei nomi durante la fase di &amp;quot;transitorio iniziale&amp;quot; richiede lo stesso tempo del processamento di nomi &amp;quot;a regime&amp;quot;, ossia dopo l'avvenuta riduzione del numero di sotto-stringhe da elaborare. Nei documenti &amp;quot;ricchi&amp;quot; di nominativi, come già spiegato, ciò non avviene.&lt;br /&gt;
Per concludere, si usano i risultati dei test sperimentali precedentemente misurati per stimare il tempo di processamento complessivo, supponendo di:&lt;br /&gt;
* applicare la tecnica di &amp;quot;pre-filtraggio&amp;quot;&lt;br /&gt;
* usare i primi 1.500 nomi di un dizionario ordinato per frequenza&lt;br /&gt;
&lt;br /&gt;
Caso A:&lt;br /&gt;
* documento contenente 10 nominativi ed un totale di 5.000 parole&lt;br /&gt;
* processamento medio della ''regex'' di &amp;quot;pre-filtraggio&amp;quot; di circa 36 ms&lt;br /&gt;
* individuazione di 31 sotto-stringhe totali&lt;br /&gt;
* durata elaborazione in media per nome di circa 2 ms&lt;br /&gt;
&lt;br /&gt;
Durata esecuzione senza troncamento: 29 secondi circa&lt;br /&gt;
&lt;br /&gt;
Durata esecuzione con troncamento: 3 secondi circa&lt;br /&gt;
&lt;br /&gt;
Caso B:&lt;br /&gt;
* documento contenente 100 nominativi ed un totale di 5.000 parole&lt;br /&gt;
* processamento medio della ''regex'' di &amp;quot;pre-filtraggio&amp;quot; di circa 48 ms&lt;br /&gt;
* individuazione di 200 sotto-stringhe totali&lt;br /&gt;
* durata elaborazione in media per nome di circa 8 ms per prime 50 iterazioni&lt;br /&gt;
* durata elaborazione in media per nome di circa 5 ms per successive&lt;br /&gt;
&lt;br /&gt;
Durata esecuzione con solo &amp;quot;pre-filtraggio&amp;quot; : 1 minuto e 27 secondi&lt;br /&gt;
&lt;br /&gt;
Durata esecuzione senza troncamento: 61 secondi circa&lt;br /&gt;
&lt;br /&gt;
Durata esecuzione con troncamento: 7.7 secondi circa&lt;br /&gt;
&lt;br /&gt;
I tempi a cui si giunge risultano soddisfacenti in entrambi i casi. Si prevede di lasciare all'utente la possibilità di scegliere di ricevere un servizio o più veloce o più accurato, in base alle sue esigenze.&lt;br /&gt;
&lt;br /&gt;
===Tecnologie complementari===&lt;br /&gt;
&lt;br /&gt;
La redazione di questa tesi è avvenuta su Mediawiki, la più importante fra le piattaforme wiki essendo il motore di Wikipedia.&lt;br /&gt;
&lt;br /&gt;
Le piattaforme wiki sono riconosciute come elemento caratterizzante dell’evoluzione Internet al Web 2.0, cioè al web nel quale gli utenti-navigatori, fino ad allora &amp;quot;''consumatori&amp;quot;'' (&amp;quot;''consumers&amp;quot;'') di contenuti si sono trasformati essi stessi in &amp;quot;''produttori&amp;quot;'' (&amp;quot;''producers&amp;quot;''), e cioè in &amp;quot;''prosumers&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
Un ''wiki'' è fondamentalmente un sito web che contiene informazioni e che consente agli utenti di editare facilmente il suo contenuto.&lt;br /&gt;
&lt;br /&gt;
Nel redigere una pagina wiki si utilizza ciò che è chiamato ''wikitext&amp;quot; per definire capitoli, paragrafi, hyperlinks, elementi di formattazione della pagina, etc.; sebbene il ''wikitext&amp;quot; risulti non difficile da apprendere, quasi ogni piattaforma wiki è corredata da editor di tipo visuale, che non richiede alcuna conoscenza della sintassi del ''wikitext&amp;quot;; tuttavia è esperienza comune che utilizzare direttamente il ''wikitext&amp;quot; induce a concentrarsi maggiormente sui contenuti e non sulla formattazione. Il linguaggio ''wikitext'' è strettamente correlato con il linguaggio HTML, infatti nella scrittura è possibile utilizzare tag come h1, span, div e così via, oltre che la sintassi esclusiva di ''wikitext''; simmetricamente una pagina prodotta da media wiki è costituita da HTML ben formato e direttamente importabile in ogni word processor. &lt;br /&gt;
&lt;br /&gt;
I wiki presentano una funzionalità di grande utilità nella redazione di documenti articolati: la tracciatura delle successive revisioni (&amp;quot;''Cronologia&amp;quot;''). La possibilità di ripercorrere l’evoluzione del testo è davvero d’aiuto quando si fissano idee originali in uno scritto, cercando di definirle, precisarle, chiarirle, come è avvenuto in effetti, anche nella redazione di questa tesi. Per curiosità, si segnala che, pur avendo redatto la maggior parte del testo off-line, la pagina wiki di questa tesi conta oltre 50 revisioni.&lt;br /&gt;
&lt;br /&gt;
Per inciso, si osserva che è stata molto utile la funzionalità di &amp;quot;ricerca nel codice&amp;quot; offerta dalla piattaforma di revisione online GitHub nella corretta comprensione della libreria Docx4j, il cui codice sorgente è ivi rilasciato. &lt;br /&gt;
&lt;br /&gt;
Si conclude infine dicendo che per ottimizzare le procedure di debug del codice sono stati realizzati utili tool a riga di comando per Linux per la rapida estrazione-modifica-ricompattazione di documenti ''OOXML''. Si propone in appendice un comando bash per questi scopi.&lt;br /&gt;
&lt;br /&gt;
==Sviluppi futuri==&lt;br /&gt;
&lt;br /&gt;
In questa sezione si fa cenno, senza poterle approfondire, ad alcune interessanti questioni emerse nello svolgimento della tesi.&lt;br /&gt;
&lt;br /&gt;
===Accesso al servizio web===&lt;br /&gt;
&lt;br /&gt;
In fase iniziale, il servizio web potrà essere reso accessibile in forma completamente aperta, senza richiedere cioè la registrazione dell’utente o l’autenticazione dell’utente già registrato. In questo modo, in effetti, si premia la facilità d’uso, ma si incorre nella nota problematica di un uso malevolo, costituito da accessi a raffica, finalizzati a saturare il server e generare una condizione di ''DoS – Denial of Service''. Diverse sono le tecniche che possono essere adottate per contrastare questo tipo di accessi malevoli, come richiedere di superare &amp;quot;''captcha''&amp;quot; e/o introdurre ritardi crescenti ed eventualmente blocchi in risposta ad accessi prevenienti con alta frequenza dallo stesso indirizzo IP.&lt;br /&gt;
È possibile anche pensare ad un accesso previa registrazione ed autenticazione dell’utente, penalizzando l’immediatezza di utilizzo del servizio, ma eventualmente ottenendo l’indirizzo email degli utenti che acconsentono a lasciarlo per successive finalità marketing.&lt;br /&gt;
È possibile, infine, un utilizzo misto, contando in un cookie il numero di accessi eseguiti e richiedendo all’utente di registrarsi per continuare ad utilizzare il servizio, dopo qualche accesso.&lt;br /&gt;
&lt;br /&gt;
===Ampliamento dinamico del dizionario===&lt;br /&gt;
&lt;br /&gt;
Nel restituire il documento elaborato all'utente, gli si da la possibilità di richiedere una nuova elaborazione, dopo aver indicato i nominativi che fossero sfuggiti; pare inesauribile, infatti, la &amp;quot;fantasia&amp;quot; dei genitori nel dare nome ai propri figlioli!&lt;br /&gt;
I nominativi indicati dall'utente sono sfuggiti al servizio perché non presenti nel dizionario: facilmente viene in mente l’idea di arricchire il dizionario con i nominativi indicati dall’utente. Va però considerato il caso che l’utente in malafede indichi nominativi fasulli al fine di inquinare il dizionario.&lt;br /&gt;
Il caso malevolo può essere affrontato attraverso una strategia che preveda non direttamente l'inserimento del nuovo nominativo nel dizionario, ma invece l'utilizzo di un concetto di &amp;quot;candidatura&amp;quot;: il nuovo nominativo viene registrato, ma si attende di avere un certo numero di utenti che lo propongono prima di approvarne l'inserimento nel dizionario.&lt;br /&gt;
Può anche essere utilizzato un concetto di &amp;quot;attendibilità&amp;quot; della candidatura di un nuovo nominativo, verificando ad esempio l'utente che lo propone scarichi effettivamente il file rielaborato.&lt;br /&gt;
Nel caso l'accesso avvenga con autenticazione, e cioè identificando gli utenti, si apre la possibilità di individuare e bannare gli utenti malevoli.&lt;br /&gt;
&lt;br /&gt;
===Natura del documento e ricorrenza del nominativo===&lt;br /&gt;
&lt;br /&gt;
Si coglie facilmente la differenza di formato fra un documento in forma di elenco (es. una graduatoria) da un documento in forma di relazione (es. una sentenza giudiziaria). Differenze di questo tipo potrebbero essere utilizzate per escludere o ammettere la ripetizione dei nominativi.&lt;br /&gt;
Per meglio dire: in un elenco la ripetizione di un nominativo è di fatto da escludersi o va trattata come omonimia. In una relazione, l’individuazione di un nominativo può essere utilizzata per ricercarlo direttamente in altri punti del documento stesso.&lt;br /&gt;
&lt;br /&gt;
===Altri dati personali===&lt;br /&gt;
&lt;br /&gt;
Altri dati personali sono trattabili con le stesse tecniche analizzate in questa tesi: date e luoghi di nascita, codici fiscali, indirizzi, email, numeri di telefono, sesso etc. In qualche caso, come per i codici fiscali, l’individuazione del pattern da trattare è persino più semplice.&lt;br /&gt;
Diversi studi ([0039]) hanno dimostrato che, utilizzando set di dati personali parziali, è possibile la re-identificazione dei soggetti, pur in documenti pseudonimizzati. È questo un altro motivo per estendere i trattamenti descritti anche agli altri dati personali richiamati.&lt;br /&gt;
&lt;br /&gt;
===Altri alfabeti===&lt;br /&gt;
&lt;br /&gt;
È possibile estendere il sotto-insieme di caratteri Unicode utilizzati nelle ''regex'' per elaborare documenti scritti in altri alfabeti non latini.&lt;br /&gt;
&lt;br /&gt;
==Conclusioni==&lt;br /&gt;
&lt;br /&gt;
Questa tesi è partita da un problema basilare, quasi scolastico, dell'informatica: la ricerca di un testo in un documento, al fine della sua cancellazione o modifica.&lt;br /&gt;
&lt;br /&gt;
Il problema si è subito discostato dalla sua formulazione basilare, principalmente perché, nei casi d'uso, il documento da ricercare non è un semplice testo (&amp;quot;''plain text''&amp;quot;) ma invece è il prodotto di un ''word-processor'': quindi è costituito da una struttura XML più o meno complessa, rappresentante formattazioni, riferimenti interni o esterni, note, etc. La ricerca deve avvenire nei soli nodi di puro testo, individuando ed escludendo dall'analisi lessicale gli elementi testuali di mark-up che non costituiscono contenuto informativo. Nell'approfondire le strutture ed i concetti XML ho potuto notare quanto essi siano ricorrenti in molti ambiti dell'informatica.&lt;br /&gt;
&lt;br /&gt;
Nell'analisi delle specifiche, un'altra complicazione si è presto aggiunta: l'usabilità del servizio cresce drasticamente se si evita di chiedere all'utente, come si era pensato in un primo tempo di fare, quali siano le stringhe (i nominativi) da ricercare e trattare; è nata allora l'idea di reperire queste stringhe in un dizionario di nomi ed in un dizionario di cognomi, considerando anche le permutazioni dei lemmi reperiti. Ho così dovuto approfondire alcuni problemi tipici dei dizionari, come il loro ampliamento automatico con tecniche oggi comprese nel ''machine-learning''. Non ho potuto &amp;quot;resistere&amp;quot; alla tentazione di ''formalizzare la matematica'' in base alla quale ho costruito le strategie di ricerca.&lt;br /&gt;
&lt;br /&gt;
Spunto per la tesi è stata la recente legislazione in materia di dati personali, il GDPR. Esaminandone gli articoli pertinenti, ho maturato una riflessione generale: sempre più il software dovrà essere progettato e realizzato anche alla luce di altre discipline, non solo di quelle informatiche, come le discipline giuridiche ed il diritto.&lt;br /&gt;
&lt;br /&gt;
Durante la fase iniziale della collaborazione con l'azienda mi sono dedicato alla messa a punto delle specifiche; ciò mi ha permesso di comprendere quanto questa fase sia importante e come completezza e precisione delle specifiche siano alla base di un progetto efficace.&lt;br /&gt;
&lt;br /&gt;
Molto importanti sono state la analisi relative al tipo e formato dei documenti da assumere come input ed alla presentazione ottimale del servizio rispetto all'usabilità. &lt;br /&gt;
&lt;br /&gt;
Centrale nel lavoro ed avvincente è stata la definizione della strategia per il riconoscimento dei lessemi attraverso la costruzione dinamica di ''regex'' idonee. In questo fase del lavoro, anche per passione personale, ho approfondito le questioni del riconoscimento &amp;quot;di testi nei testi&amp;quot; che legano, fin dalle origini, l'informatica e la linguistica.&lt;br /&gt;
&lt;br /&gt;
La fase di definizione dell'architettura del servizio mi ha permesso di ripercorrere molte le materie studiate nei tre anni del Corso di Ingegneria Informatica, affrontando argomenti  come il Single Responsibility Principle, il Dependency Inversion Principle, lo &amp;quot;stile&amp;quot; architetturale REST. Molto istruttiva è stata anche la riflessione sulla scomposizione del servizio in moduli software.&lt;br /&gt;
&lt;br /&gt;
Come sempre accade nell'affrontare un progetto nuovo, sono nate molte nuove idee; ho così immaginato numerosi sviluppi futuri, sia a perfezionamento funzionale dell'accesso web al servizio, sia ad estensione delle specifiche per coprire casi applicativi contigui (es. quando il dato che si vuole trattare è un codice fiscale). Dovendo necessariamente tener presente che questo lavoro è una tesi, verificherò con il supporto del mio relatore come poterne proseguire lo sviluppo.&lt;br /&gt;
&lt;br /&gt;
==Bibliografia==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0000]https://en.wikipedia.org/wiki/Comparison_of_Office_Open_XML_software&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0001]https://en.wikipedia.org/wiki/Comparison_of_OpenDocument_software&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0002]https://en.wikipedia.org/wiki/Standardization_of_Office_Open_XML&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0003]https://en.wikipedia.org/wiki/OpenDocument_standardization&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0004]https://support.apple.com/en-us/HT202227&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0005]https://en.wikipedia.org/wiki/Pages_(word_processor)&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0006]https://en.wikipedia.org/wiki/Comparison_of_word_processors&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0007]https://en.wikipedia.org/wiki/OpenDocument&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0008]https://en.wikipedia.org/wiki/Office_Open_XML_file_formats&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0009]https://en.wikipedia.org/wiki/Rich_Text_Format&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0010]https://www.ecma-international.org/publications/standards/Ecma-376.htm&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0011]https://www.iso.org/standard/51463.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0012]https://www.iso.org/standard/71691.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0013]https://en.wikipedia.org/wiki/Office_Open_XML&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0014]https://en.wikipedia.org/wiki/Open_Packaging_Conventions&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0015]https://en.wikipedia.org/wiki/LAMP_(software_bundle)&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0016]https://w3techs.com/blog/entry/debian_ubuntu_extend_the_dominance_in_the_linux_web_server_market_at_the_expense_of_red_hat_centos&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0017]https://news.netcraft.com/archives/2014/06/06/june-2014-web-server-survey.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0018]https://whatis.techtarget.com/definition/LAMP-Linux-Apache-MySQL-PHP&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0019]https://www.ibm.com/cloud/learn/lamp-stack-explained&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0020]https://en.wikipedia.org/wiki/Single_responsibility_principle&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0021]https://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0022]https://en.wikipedia.org/wiki/Latin_script_in_Unicode&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0023]https://it.wikipedia.org/wiki/ISO/IEC_8859-1&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0024]http://www.treccani.it/enciclopedia/uso-delle-maiuscole_%28La-grammatica-italiana%29/&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0025]https://en.wikipedia.org/wiki/Ambiguity#Linguistic_forms&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0026]Steven L. Small; Garrison W Cottrell; Michael K Tanenhaus (22 October 2013). Lexical Ambiguity Resolution: Perspective from Psycholinguistics, Neuropsychology and Artificial Intelligence. Elsevier Science. ISBN 978-0-08-051013-2.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0027]http://www.treccani.it/vocabolario/disambiguazione/&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0028]R. Navigli, K. Litkowski, O. Hargraves. 2007. SemEval-2007 Task 07: Coarse-Grained English All-Words Task. Proc. of Semeval-2007 Workshop (SemEval), in the 45th Annual Meeting of the Association for Computational Linguistics (ACL 2007), Prague, Czech Republic, pp. 30–35 http://www.aclweb.org/anthology/S/S07/S07-1006.pdf&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0029]https://wordnet.princeton.edu/&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0030]R. Navigli, S. P. Ponzetto. BabelNet: Building a Very Large Multilingual Semantic Network. Proc. of the 48th Annual Meeting of the Association for Computational Linguistics (ACL 2010), Uppsala, Sweden, July 11-16, 2010, pp. 216-225. http://aclweb.org/anthology/P/P10/P10-1023.pdf&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0031]Roventini A., Alonge A., Calzolari N., Magnini B., Bertagna F. (2000), &amp;quot;ItalWordNet: a Large Semantic Database for Italian&amp;quot;, Proc. of the 2nd International Conference on Language Resources and Evaluation (LREC 2000), Athens, Greece, 2000, pp. 783-790.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0032]E. Pianta, L. Bentivogli, C. Girardi. MultiWordNet: developing an aligned multilingual database, Proc. of the First International Conference on Global WordNet, Mysore, India, January 21-25, 2002. http://multiwordnet.fbk.eu/paper/MWN-India-published.pdf&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0033]https://www.iso.org/standard/28245.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0034]https://www.gpdp.it/web/guest/regolamentoue&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0035]https://eur-lex.europa.eu/legal-content/IT/TXT/?uri=uriserv:OJ.L_.2016.119.01.0001.01.ITA&amp;amp;toc=OJ:L:2016:119:TOC&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0036]https://www.corriere.it/Primo_Piano/Cronache/2006/09_Settembre/15/cognomi.shtml&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0037]https://data.world/axtscz/italian-first-names&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0038]https://en.wikipedia.org/wiki/Dependency_inversion_principle&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0039]https://imperialcollegelondon.app.box.com/s/lqqcugie51pllz26uixjvx0uio8qxgo5/file/493461282808&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0040https://www.docx4java.org/trac/docx4j]&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0041]https://github.com/plutext/docx4j&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0042]https://docs.oracle.com/javase/9/docs/api/java/lang/String.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0043]https://github.com/php/php-src/blob/master/ext/session/session.c&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0044]https://github.com/plutext/docx4j/search?q=getJAXBNodesViaXPath+in%3Afile&amp;amp;type=Code&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0045]https://www.w3.org/TR/xpath-30/&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0046]https://www.istat.it/it/dati-analisi-e-prodotti/contenuti-interattivi/contanomi&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0047]&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0048]&lt;br /&gt;
&lt;br /&gt;
==Indice delle figure==&lt;br /&gt;
&lt;br /&gt;
[0F00]https://en.wikipedia.org/wiki/Latin_script&lt;br /&gt;
&amp;lt;!-- [[File:Latin alphabet world distribution.svg|thumb|upright=1.6|In verde scuro le nazioni dove è usato solo l'alfabeto latino; in verde chiaro quelle dove all'alfabeto latino è affiancato un altro alfabeto.]] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[0F01]Diagramma di Venn 1&lt;br /&gt;
&lt;br /&gt;
[0F02]Diagramma di Venn 2&lt;br /&gt;
&lt;br /&gt;
[0F03]Diagramma di Venn 3&lt;br /&gt;
&lt;br /&gt;
[0F04]Esito unit test regex (cartella immagini)&lt;br /&gt;
&lt;br /&gt;
[0F05]Inforgrafica GDPR&lt;br /&gt;
&lt;br /&gt;
[0F06]Diagramma di sequenza UML&lt;br /&gt;
&lt;br /&gt;
[0F07]Primo calcolo valutazione algoritmo&lt;br /&gt;
&lt;br /&gt;
[0F08]Secondo calcolo valutazione algoritmo&lt;br /&gt;
&lt;br /&gt;
[0F09]Terzo calcolo valutazione algoritmo&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Servizio_web_per_il_trattamento_dei_dati_personali_contenuti_in_documenti_OOXML_complessi&amp;diff=168</id>
		<title>Servizio web per il trattamento dei dati personali contenuti in documenti OOXML complessi</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Servizio_web_per_il_trattamento_dei_dati_personali_contenuti_in_documenti_OOXML_complessi&amp;diff=168"/>
		<updated>2019-09-30T03:47:50Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: /* Ottimizzazioni del processo di minimizzazione */ - fine&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduzione==&lt;br /&gt;
&lt;br /&gt;
Il recente Regolamento Generale europeo sulla Protezione dei Dati (UE) 2016/679 ([0034], [0035]) o ''GDPR'' (''General Data Protection Regulation'', come nel seguito sarà chiamato) ha modernizzato significativamente la normativa in materia di protezione dei dati personali, rendendola omogenea fra tutti gli stati membri. È bene notare che, fin dal titolo, il ''GDPR'' non riduce gli spazi per i trattamenti di dati personali, ma anzi ne protegge la &amp;quot;libera circolazione&amp;quot;, dettando, però, regole definite e certe. Rinunciando ad una presentazione più completa del ''GDPR'', saranno riportati nei successivi capitoli i concetti necessari alla discussione dell'argomento.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Enti ed organizzazioni, aventi a che fare con documenti contenenti dati sensibili, devono operare in maniera conforme al ''GDPR''; potrebbero, di conseguenza, trarre beneficio da servizi specifici in grado di supportarli in queste esigenze.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
L'oggetto principale della tesi sarà dunque, come riportato dal titolo, la progettazione e la realizzazione di un servizio per la gestione di dati personali.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F05])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La larga maggioranza dei documenti testuali viene generata con strumenti cosiddetti di &amp;quot;produttività individuale&amp;quot;, cioè da ''word-processors''. L'osservazione, ovvia nella sua evidenza, consente di introdurre una riflessione: quando un documento è generato da un'elaborazione automatica, magari per composizione di ''template'' con dati estratti da un database, l'individuazione dei &amp;quot;dati personali&amp;quot; nel documento prodotto può avvenire in modo rigoroso e senza incertezze, sulla base degli elementi di composizione del documento; ad es.: i campi del documento estratti da una anagrafica di soggetti sono certamente dati personali e come tali possono essere opportunamente trattati nel processo di elaborazione automatica (ad es. cancellati).&lt;br /&gt;
&lt;br /&gt;
Ma, in quella larga maggioranza di documenti testuali generata con ''word-processors'' l'individuazione ed il trattamento dei dati personali vanno affrontati con altri approcci, discussi in questa tesi.&lt;br /&gt;
&lt;br /&gt;
==Scenario di lavoro==&lt;br /&gt;
&lt;br /&gt;
===Minimizzazione dei dati personali===&lt;br /&gt;
&lt;br /&gt;
Un concetto espresso in modo pervasivo dal ''GDPR'' è quello della &amp;quot;''minimizzazione''&amp;quot; dei dati personali trattati ed a maggior ragione dei dati personali pubblicati. In particolare l'Art. 5 ed il Considerando 39 prescrivono che i dati personali trattati siano &amp;quot;''adeguati, pertinenti e limitati a quanto necessario rispetto alle finalità per le quali sono trattati («minimizzazione dei dati»)''&amp;quot; ([0035]).&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Con questo fine, il GDPR delinea due possibilità organizzative e tecniche di &amp;quot;''minimizzazione''&amp;quot;: l'anonimizzazione e la psedonimizzazione.&lt;br /&gt;
&lt;br /&gt;
====Anonimizzazione====&lt;br /&gt;
&lt;br /&gt;
Sono anonimizzati i dati personali non (più) riferibili alle persone a cui sono appartenuti; si tratta di serie di dati, spesso ingenti, che sono stati definitivamente ed irreversibilmente separati da ogni riferimento alle persone che caratterizzavano. Sono le serie di dati utilizzate per fini statistici, scientifici, etc. E' importante notare che, come fissato dal Considerando 26 del ''GDPR'', il Regolamento non si applica al &amp;quot;''trattamento di tali informazioni anonime''&amp;quot; ([0035]). Per questo, sottoporre database e documenti ad un procedimento, cioè un trattamento, di anonimizzazione consente di non doversi più preoccupare del ''GDPR''.&lt;br /&gt;
&lt;br /&gt;
====Pseudonimizzazione====&lt;br /&gt;
&lt;br /&gt;
Fra le definizioni dell'Art. 4 del ''GDPR'', la &amp;quot;pseudonimizzazione&amp;quot; viene indicata come &amp;quot;''il trattamento tale che i dati personali non possano più essere attribuiti a un interessato specifico senza l’utilizzo di informazioni aggiuntive, a condizione che tali informazioni aggiuntive siano conservate separatamente''&amp;quot; ([0035]).&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Traducendo in termini &amp;quot;operativi&amp;quot;, si tratta del procedimento che, dal &amp;quot;record&amp;quot; dei dati di un interessato, separa i campi che caratterizzano l'interessato stesso da quelli che lo identificano, trasferendo questi ultimi in una nuova distinta tabella; nelle due tabelle vengono aggiunti i riferimenti che permettono la ricostruzione del record originario; il procedimento è completo quando la nuova tabella con gli identificativi viene archiviata separatamente ed eventualmente cifrata. In margine si annota che in molti casi, come molti studi dimostrano, è possibile identificare, quindi &amp;quot;riconoscere&amp;quot;, gli interessati utilizzando la sola tabella con i dati pseudonimizzati.&lt;br /&gt;
&lt;br /&gt;
====Altri trattamenti di &amp;quot;minimizzazione&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Un problema pratico che si incontra di frequente è quello di dover pubblicare documenti più o meno ampi che contengono dati personali. Spesso la pubblicazione è obbligatoria per legge: si pensi alle graduatorie relative a concorsi pubblici, alle sentenze dei tribunali, etc.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In questi frequenti casi, analizzando meglio le finalità per le quali sono pubblicati quei dati personali, si osserva che sono possibili e legittimi almeno due approcci per &amp;quot;minimizzare&amp;quot; il dato nel &amp;quot;trattamento di pubblicazione&amp;quot; e, dunque, per minimizzarne la propagazione, ad esempio attraverso motori di ricerca, ben oltre ogni ragionevole finalità. I contesti ed i corrispondenti approcci sono:&lt;br /&gt;
#  Situazioni in cui è necessario che l'interessato possa riconoscersi nel documento ed essere riconosciuto dagli altri soggetti menzionati nel contesto, ma non è plausibile la necessità di identificazione dell'interessato al di fuori di quel contesto specifico. A questo caso si riconducono le graduatorie di concorsi, gli elenchi per la formazione di classi, gli elenchi per convocazioni, etc. In tutti questi casi, nel processo di redazione del documento è più pratico trattare internamente i dati personali in forma completa; ma praticamente mai è necessario pubblicarli per intero, esponendo al pubblico accesso codici fiscali, indirizzi, recapiti telefonici etc. Per di più, nella maggior parte delle volte, è sufficiente pubblicare il solo cognome perché l'interessato conosca la sua posizione in graduatoria; ciò è spesso sufficiente anche a trasmettere l'informazione necessaria ai colleghi dell'interessato nella medesima graduatoria, o nella medesima classe, etc. Notare che, pubblicando il solo cognome, viene di fatto oscurato anche il sesso. Dunque, in questi casi è auspicabile cancellare una larga parte dei dati personali presenti nel documento.&lt;br /&gt;
# Situazioni in cui il documento deve essere pubblicato affinché siano rese note le motivazioni che lo hanno originato, senza che sia necessaria la precisa identificazione dei soggetti che vi compaiono. Questo è il caso della pubblicazione di sentenze giudiziarie di ogni grado. Le sentenze vengono notificate direttamente agli &amp;quot;aventi causa&amp;quot;; ma anche, come la legge prescrive, pubblicate al fine di costituire giurisprudenza. In questo secondo caso, risulta del tutto eccedente la pubblicazione dei reali nominativi degli interessati, che troverebbero verosimilmente la propria vicenda inutilmente indicizzata dai motori di ricerca negli anni a venire. Nella pubblicazione delle sentenze appare un approccio ottimale quello di sostituire con pseudonimi o con iniziali alterate i veri nominativi degli interessati presenti: il senso e le argomentazioni della sentenza restano pienamente comprensibili, come è necessario; il dato personale, del tutto superfluo ai fini della giurisprudenza, viene protetto.&lt;br /&gt;
In questi casi appare opportuno sostituire i dati identificativi dell'interessato, ed in particolare il nome e cognome, con pseudonimi o, ancora, con iniziali alterate, cioè non coincidenti con le iniziali reali. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Proprio questi tipi di trattamenti di &amp;quot;minimizzazione&amp;quot; sono l'oggetto di questa tesi.&lt;br /&gt;
&lt;br /&gt;
===Punti di partenza per la progettazione del servizio===&lt;br /&gt;
&lt;br /&gt;
La tesi è stata svolta in collaborazione con l'azienda AFA Systems (www.afasystems.it/gdpr) con la quale si sono discusse le problematiche di progettazione e realizzazione di un servizio generalizzato di minimizzazione dei dati personali presenti in un documento.&lt;br /&gt;
Con l'intenzione di fornire il servizio ad un bacino d'utenza il più vasto e variegato possibile, si è pensato ad un'applicazione ''web-based'', indipendente così dai singoli devices sui quali poi sarà utilizzata.&lt;br /&gt;
L'attenzione è stata concentrata sul trattamento dei nomi e dei cognomi (che da qui chiameremo nominativi), poiché sono quelli sempre presenti nei documenti (ad es. gli indirizzi sono presenti solo a volte), rappresentano gli elementi tramite i quali è immediato il riconoscimento della persone, non hanno formato predefinito (come ad es. i codici fiscali); altri dati personali (indirizzi, codici fiscali, etc.), potranno essere considerati in successive evoluzioni del progetto.&lt;br /&gt;
È utile notare che la parte iniziale della collaborazione con l'azienda è stata dedicata alla discussione delle specifiche, la cui più precisa definizione è parte rilevante di questa tesi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Tra i requisiti che necessitano di un opportuno studio troviamo ad esempio:&lt;br /&gt;
* L'individuazione di metodi efficaci per il riconoscimento dei nominativi nei documenti&lt;br /&gt;
* L'identificazione delle migliori procedure di interazione con l'utente&lt;br /&gt;
* La scelta dei formati da trattare&lt;br /&gt;
* I vincoli non funzionali legati al rispetto del ''GDPR''.&lt;br /&gt;
&lt;br /&gt;
==Definizione delle specifiche==&lt;br /&gt;
&lt;br /&gt;
===Riconoscimento dei nominativi===&lt;br /&gt;
&lt;br /&gt;
====Scelta della strategia di riconoscimento====&lt;br /&gt;
 &lt;br /&gt;
Le difficoltà principali con cui ci si imbatte nel processo di riconoscimento dei nominativi riguardano la complessità strutturale dei documenti di testo, ma soprattutto l'intrinseca ambiguità del linguaggio naturale. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Le variabili ed impredicibili strutture e formattazioni dei documenti introducono alcuni problemi significativi. Rendendo fortemente eterogeneo il contenuto dei documenti, infatti, esse non consentono di ricondurre il problema del riconoscimento dei nominativi ad uno o a pochi singoli casi, ma comportano lo studio di tutte le strutture e formattazioni possibili, rendendo quindi l'analisi molto generale. L'altra rilevante difficoltà presente sta nella complessità di effettuare il riconoscimento di una stringa testuale immersa in un insieme di elementi non tutti testuali. Ogni elemento di formattazione, che sia una tabella o una barra orizzontale, introduce infatti un proprio significato logico e semantico nel documento di cui bisogna tenere conto.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Il linguaggio naturale introduce anch'esso complessità: si pensi alle molteplici tipologie di proposizioni con cui possono essere articolati i periodi; ma i problemi principali derivano dalle sue ambiguità. Esse vengono classificate in diverse tipologie ([0025]); le principali sono le ambiguità sintattiche e lessicali.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si ha ambiguità sintattica quando la sintassi di una frase può essere interpretata in diversi modi e, di conseguenza, la frase stessa assume significati diversi. Essa è presente, ad esempio, nelle seguenti frasi:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
* &amp;quot;''Rapina in banca con rivoltella da centomila euro''&amp;quot;&lt;br /&gt;
* &amp;quot;''Luigi ha visto un uomo nel parco con il binocolo''&amp;quot;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
L'esasperazione massima della problematica delle ambiguità sintattiche si presenta con l'&amp;lt;i&amp;gt;antinomia&amp;lt;/i&amp;gt;, ossia un particolare tipo di paradosso che indica la compresenza di due affermazioni contraddittorie che possono essere entrambe dimostrate o giustificate.&lt;br /&gt;
L'antinomia di Epimenide o ''Paradosso del mentitore'', nota fin dal VI secolo, è probabilmente uno dei più noti esempi: &amp;quot;''il cretese Epimenide afferma che tutti i cretesi mentono''&amp;quot;. Se la proposizione è vera (i cretesi mentono) allora il suo significato implica che sia falsa (Epimenide mente e quindi i cretesi dicono la verità), ma se è falsa (i cretesi dicono la verità) ciò significa che è vera (Epimenide dice la verità e quindi i cretesi mentono). La proposizione appare contemporaneamente vera e falsa. A partire dagli anni venti del '900, sono state elaborate varie teorie per la risoluzione delle contraddizioni provocate dalle antinomie, soprattutto attraverso l'elaborazione di linguaggi multilivello o attraverso l'elaborazione di logiche polivalenti (quindi non-booleane).&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si ha ambiguità lessicale, invece, quando una parola possiede più di un significato nella lingua a cui appartiene ([0026]), in tal caso la parola è definita ''polisemica''. In italiano, alcuni termini soggetti a questo tipo di ambiguità sono, ad esempio &amp;quot;''acuto''&amp;quot; o &amp;quot;''venti''&amp;quot;. È questo genere di ambiguità che risulta critico per il riconoscimento dei nominativi. La difficoltà determinata dalle ambiguità sintattiche, infatti, riguarda l'individuazione corretta di soggetti, predicati e complementi di un periodo, mentre le ambiguità lessicali ostacolano la comprensione del significato del singolo lessema. Nel processo di riconoscimento è irrilevante determinare la funzione logica che il nominativo svolge nella frase, mentre è necessario essere certi che i termini che compongono il nominativo siano effettivamente dei nomi propri di persona o dei cognomi, non altri vocaboli del lessico comune. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In linguistica, l'intervento con cui si toglie ambiguità a una parola o a una frase prende il nome di &amp;quot;disambiguazione&amp;quot; ([0027]). Il problema della disambiguazione automatica (in inglese ''Word Sense Disambiguation'' o, abbreviato, ''WSD'') riveste particolare importanza nelle ricerche sull'intelligenza artificiale e, in particolare, nell'elaborazione del linguaggio naturale. Si prevedono benefici della disambiguazione, ad esempio, in programmi di traduzione automatica, recupero dell'informazione o estrazione automatica di informazioni. Nell'analisi delle soluzioni esistenti in letteratura per la risoluzione delle ambiguità, ci si sofferma specialmente sulle ricerche incentrate sul trattamento dell'ambiguità lessicale, essendo essa la più rilevante per i nostri interessi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
La ''WSD'' richiede due input necessariamente: un dizionario per specificare i sensi che devono essere disambiguati e un corpus di dati linguistici da disambiguare. Nello scenario più realistico, si trattano testi le cui parole non sono note a priori e risulta molto onerosa la produzione del corpus, essendo infatti necessaria la valutazione di un operatore umano per verificare la correttezza delle disambiguazioni effettuate dagli algoritmi (''supervised learning'').&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Uno tra i principali dizionari semantici-lessicali utilizzati della lingua inglese è ''WordNet'' ([0029]), mentre alcuni dei database equivalenti che trattano l'italiano sono ''BabelNet'' ([0030]), ''ItalWordNet'' ([0031]) e ''MultiWordNet'' ([0032]).&lt;br /&gt;
Un elemento importante da considerare è che le prestazioni di disambiguazione per la lingua inglese, impiegando ''WordNet'', risultano corrette tra l'80% e il 90% delle volte ([0028]), percentuali discrete ma non sufficienti per avere la totale garanzia.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
I fattori che ostacolano la realizzazione di algoritmi di intelligenza artificiale per la disambiguazione sono molteplici:&lt;br /&gt;
# Differenze tra dizionari impiegati: i database prima citati si basano su varie fonti che raggruppano semanticamente in maniera diversa i vocaboli, quindi programmi sviluppati con dizionari diversi generalmente hanno performance differenti.&lt;br /&gt;
# Complessità della codifica di parte del discorso: per poter disambiguare correttamente un termine è importante riuscire a comprendere correttamente il contesto in cui è inserito, operazione non banale.&lt;br /&gt;
# Varianza tra giudici: i supervisori dell'apprendimento degli algoritmi possono avere opinioni diverse, o semplicemente sbagliare, nella valutazione delle disambiguazioni, ciò porta ad algoritmi che hanno comportamenti diversi.&lt;br /&gt;
# Impossibilità di applicare la disciplina della ''pragmatica'', ossia la logica del ''buon senso'': per identificare correttamente il senso di alcune parole, ad esempio nella comprensioni di anafore e catafore, è necessario applicare il buon senso.&lt;br /&gt;
# Dipendenza del senso delle parole dai contesti: ogni scenario richiede la propria divisione del significato delle parole in sensi rilevanti. In un contesto informatico, ad esempio, il termine &amp;quot;''mouse''&amp;quot; deve essere ricondotto al dispositivo di puntamento, non al cognome del celebre personaggio Disney ''Mickey Mouse''; viceversa dovrà invece avvenire in un contesto di letteratura a fumetti.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Laddove la ''WSD'' è una tecnica molto generale e che mira a risolvere un'ambiguità riguardante una qualunque parola, per le finalità del servizio oggetto di questa tesi è sufficiente risolvere le ambiguità dei nomi e dei cognomi. &lt;br /&gt;
Uno dei difetti che il servizio presenterebbe adottando un approccio ''WDS'' è legato alla impredicibile formattazione dei documenti, che aggiunge informazione semantica al testo ma introduce complessità nella individuazione automatica delle parti che formano il contesto; un altro difetto dipende dalla vastità del lessico da elaborare, essendo i documenti da trattare forniti dai più disparati utenti, su qualunque genere di argomento e relativi ai più vari ambiti.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La strategia che sarà adottata per risolvere la problematica del riconoscimento dei nominativi sarà impostata attraverso un modello ''pattern-based'', impiegando le ''regular expressions'' (''regex''). Esse risultano comunemente usate per effettuare operazioni di ricerca o sostituzione in un testo, di conseguenza se si riesce ad individuare un pattern associato ad un nominativo dato, allora sarà possibile processare il documento ricercando le occorrenze del nominativo e &amp;quot;minimizzarlo&amp;quot; opportunamente.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le ''regular expressions'' risultano particolarmente efficaci poiché, se opportunamente progettate, possono identificare un nominativo indipendentemente dal significato linguistico del contesto in cui è calato, basandosi piuttosto sui singoli caratteri che compongono i lessemi analizzati; permettono, di conseguenza, di effettuare una valutazione estremamente minuziosa, riducendo al minimo le possibilità di errori.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Un algoritmo di risoluzione ''pattern-based'' risulta, inoltre, più efficiente nell'esecuzione, in generale, di un algoritmo di intelligenza artificiale; per fornire la risposta il più velocemente possibile ad un utente, fruitore del servizio via web, l'approccio di riconoscimento tramite pattern è il più indicato.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Definizione dei pattern====&lt;br /&gt;
Nella progettazione del servizio si adotta, come detto, un approccio ''pattern-based'' per il riconoscimento dei nominativi. In linea di massima è opportuno che vengano riconosciuti più nominativi possibili e allo stesso tempo che la correttezza dell'identificazione di un nominativo sia garantita, quindi bisogna individuare dei pattern non troppo stringenti ma neppure troppo laschi. Per analizzare come i pattern devono essere strutturati si prende come caso di studio un generico nominativo, ad esempio ''Lorenzo Mario Amorosa''. Nel documento esso può comparire esattamente come appena indicato, ma anche in altre plausibili varianti, in cui l'ordine dei termini viene alterato, si pensi ad esempio ad &amp;quot;Amorosa Lorenzo Mario&amp;quot; o &amp;quot;Mario Lorenzo Amorosa&amp;quot;, o in altre varianti ancora in cui alcuni nomi non compaiono, come in &amp;quot;Lorenzo Amorosa&amp;quot;. Bisogna tuttavia supporre un limite alla variabilità: si osserva infatti che il cognome deve sempre comparire (il solo nome ''Lorenzo'' non è riconducibile a ''Lorenzo Mario Amorosa'') e che esso inoltre deve essere necessariamente anteposto o posposto, ma non interposto, ai nomi (è poco ragionevole ricondurre &amp;quot;Lorenzo Amorosa Mario&amp;quot; a &amp;quot;Lorenzo Mario Amorosa'').&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Questa prima specifica permette di ricondursi a una soluzione generale, sufficiente nella maggior parte dei casi, ma che non risolve alcune criticità. Un nominativo può, in alcuni documenti, comparire manifestandosi unicamente attraverso il cognome (riferendoci all'esempio precedente, ''Lorenzo Mario Amorosa'' apparirebbe nella forma ''Amorosa''). Sorge qui il problema che molti dei cognomi italiani hanno un significato proprio nel linguaggio comune; ad es., nella frase ''una relazione amorosa è bella'' è errato considerare la parola ''amorosa'' come cognome di un nominativo. Per risolvere questo genere di ambiguità si potrebbe pensare che per stabilire che il termine ''Amorosa'' sia un cognome sia sufficiente verificare che esso inizi con una lettera maiuscola, ma ciò può verificarsi anche perché la parola si trova ad inizio di frase. Inoltre, vari cognomi italiani possono iniziare con una lettera minuscola (''de Angelis'', ''d'Onofrio'', etc.), quindi basare l'identificazione di un cognome sul fatto che la sua prima lettera sia in maiuscolo non è in generale un metodo valido. Volendo in maniera prioritaria garantire il corretto funzionamento del servizio, e quindi attuare le procedure di anonimizzazione solo sui nominativi senza applicarle erroneamente ad altri termini, risulta necessario evitare il trattamento dei nominativi che si manifestano con i soli cognomi. Per via del contesto e dei significati che i cognomi possono assumere, infatti, risulta spesso impossibile distinguerli da parole del linguaggio comune. &lt;br /&gt;
&lt;br /&gt;
Ci si concentra, quindi, nello studio di nominativi composti da un cognome seguito o preceduto da uno o più nomi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si rappresenta dunque in formato di ''regular expression'' il pattern attualmente ideato. Per semplicità espositiva, si definisce il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; come l'insieme delle permutazioni di tutti i nomi del nominativo più l'insieme delle permutazioni di tutti i possibili sottoinsiemi di nomi del nominativo. Considerando il nominativo preso precedentemente come caso di studio, ad esempio, si avrebbe:&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt; &amp;lt;nomi&amp;gt; = Lorenzo Mario|Mario Lorenzo|Lorenzo|Mario&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Posto inoltre il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt; ad indicare il cognome contenuto nel nominativo e il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;regex&amp;gt;&amp;lt;/span&amp;gt; ad indicare la ''regular expression'' associata al nominativo, si ottiene:&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt; &amp;lt;regex&amp;gt; := &amp;lt;cognome&amp;gt; (&amp;lt;nomi&amp;gt;)|(&amp;lt;nomi&amp;gt;) &amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Una osservazione sottile ma di fondamentale importanza per la corretta progettazione delle ''regular expressions'' sta nella piena comprensione della semantica dell'operatore di scelta, espresso con il carattere ''pipe'' (&amp;quot;|&amp;quot;). Un qualunque ''engine'' di elaborazione delle ''regex'', infatti, interrompe la valutazione di una stringa non appena può stabilire se tale stringa fa match o meno con il pattern dato, senza quindi necessariamente valutarlo nella sua interezza, come parimenti avviene nelle valutazioni ''a corto circuito'' delle espressioni logiche nei linguaggi di programmazione. Ogni nominativo avrà a sè associato un pattern che lo rappresenta in più possibili sequenze di caratteri; per effettuare una corretta &amp;quot;minimizzazione&amp;quot; dei dati è necessario che le sequenze contenenti tutti i nomi sia poste per prime, mentre quelle contenenti un singolo nome per ultime.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In questa prima formulazione della ''regex'', inoltre, si è posto come separatore unicamente lo spazio bianco, ma alcuni documenti potrebbero contenere dei nominativi i cui termini sono separati da altri caratteri, come ad esempio una virgola nel caso di &amp;quot;Amorosa, Lorenzo Mario&amp;quot;. Per poter quindi identificare un nominativo anche in questi casi, si potrebbe considerare un qualunque carattere di interpunzione come possibile separatore dei termini del nominativo.&lt;br /&gt;
Adottando questa soluzione si ha però come effetto collaterale che risultano critici i casi in cui nel testo sono presenti dei nominativi soggetti ad omonimia. Si consideri una generica frase contenente una sequenza di nominativi, ad esempio ''Amorosa Lorenzo, Mario Giacomo e Fabio Rossi'', e si supponga che i nominativi da trattare siano ''Amorosa Lorenzo Mario'', ''Mario Giacomo'' (in cui la parola ''Mario'' è il cognome) e ''Fabio Rossi''. Gli ultimi due nominativi compaiono nella frase nella loro forma estesa, mentre il primo compare con il solo nome ''Lorenzo'' (eventualità possibile considerando la definizione del pattern precedentemente data). Considerando la virgola come carattere separatore dei termini del nominativo, la sequenza di parole ''Amorosa Lorenzo, Mario'' sarebbe ricondotta, venendo elaborata per prima, ad ''Amorosa Lorenzo Mario'', mentre rimarrebbe non trattata la parola ''Giacomo'', in quanto il cognome ''Mario'' che gli era associato è stato già identificato come un nome del nominativo ''Amorosa Lorenzo Mario'' ed il termine ''Giacomo'' preso singolarmente non rappresenta un nominativo.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Prima di valutare ulteriormente le problematiche relative alle omonimie, si possono scegliere due approcci per risolvere questo specifico caso:&lt;br /&gt;
# Si riconduce una sequenza di parole ad un nominativo se e solo se tutti i suoi nomi sono contenuti nella sequenza&lt;br /&gt;
# Si considerano come separatori dei termini contenuti nei nominativi solo spazi bianchi, tabulazioni e a capo, non gli altri segni di punteggiatura.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Entrambe le strategie sono valide, in quanto risolvono il problema garantendo la corretta identificazione dei nominativi, ma allo stesso tempo entrambe presentano lo svantaggio di ridurre le sequenze di parole riconducibili a dei nominativi, aumentando le possibilità che alcuni di essi non vengano trattati.&lt;br /&gt;
Si consideri nuovamente il nominativo preso come caso di studio ''Amorosa Lorenzo Mario'': applicando la prima strategia, non sarebbe possibile ricondurgli la sequenza ''Amorosa Lorenzo'', mentre applicando il secondo metodo non sarebbe riconducibile la sequenza ''Amorosa, Lorenzo Mario''.&lt;br /&gt;
Si decide di attuare la seconda strategia, in quanto è opportuno non imporre vincoli troppo stringenti sui nomi e poiché nella gran parte dei casi i termini dei nominativi nei documenti sono separati tra loro da caratteri quali spazi bianchi, tabulazioni ed a capo.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Un altro elemento su cui porre l'attenzione è la possibilità che i documenti da trattare contengano dei nominativi scritti interamente in maiuscolo o minuscolo, di conseguenza è conveniente che le ''regular expressions'' siano progettate ''case-insensitive''.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Un ulteriore punto su cui bisogna soffermarsi è la posizione all'interno di un periodo in cui un nominativo può comparire, in particolare si vogliono evitare quei casi critici in cui uno dei termini del nominativo è una sotto-stringa di un'altra parola del testo (si pensi ad ''amorosa'' in ''clamorosa''). Come regola generale si può stabilire che è sempre necessario che un nominativo sia preceduto e seguito da un ''carattere non alfabetico''. Un caso particolare si presenta quando il nominativo è posto ad inizio o a fine documento, situazione in cui quindi esso non è preceduto o non è seguito da alcun carattere: entrambe le posizioni sono da considerare corrette.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
È opportuno ora definire il concetto di ''carattere non alfabetico'', e ciò si può fare più facilmente ragionando sul problema in logica positiva; infatti risulta più semplice individuare quei caratteri che rappresentano lettere piuttosto che quelli che rappresentano segni di interpunzione ed individuare ogni altro carattere che non può mai comporre una parola.&lt;br /&gt;
&lt;br /&gt;
Inquadrando lo scenario di applicazione del servizio, molto probabilmente l'utente vorrà trattare un documento scritto nella lingua di uno dei paesi dell'Unione Europea, poiché il ''GDPR'' vige nei soli paesi membri dell'Unione.&lt;br /&gt;
Si può, quindi, ipotizzare che i documenti trattati possono sì contenere parole e nominativi stranieri, ma che i caratteri contenuti siano appartenenti all'alfabeto latino (''Latin script''), usato in molti stati nel mondo e da tutti i principali stati europei (fatta eccezione per la Grecia ed alcuni stati che scrivono in caratteri cirillici).&lt;br /&gt;
Inoltre, testi scritti in altri alfabeti, come esempio il cinese, l'arabo o il cirillico, vengono generalmente traslitterati. Considerare, quindi, ''caratteri non alfabetici'' tutti i caratteri diversi dalle lettere contenute nell'alfabeto latino sarebbe di conseguenza estremamente riduttivo ed inoltre in questo modo non si terrebbe conto delle lettere accentate, molto utilizzate anche nella lingua italiana.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(XXXX QUI IMG [0F00])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per risolvere il problema facciamo riferimento alla codifica standard Unicode dell'alfabeto latino ([0022]); in essa è possibile individuare, oltre ai caratteri rappresentanti le lettere nella codifica ''ASCII'' classica, i caratteri rappresentanti le lettere nella codifica standard ''ISO/IEC 8859-1'' ([0023]), encoding orientato principalmente alla rappresentazione delle lingue dell'Europa occidentale.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;i&amp;gt;Caratteri latini nei primi due blocchi dello standard Unicode&amp;lt;/i&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;nounderlines&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border-collapse:collapse&amp;quot;&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; &lt;br /&gt;
!style=&amp;quot;background:#ccf; text-align:center; font-weight: bold;&amp;quot;|U+&lt;br /&gt;
!style=&amp;quot;text-align:center; font-weight: bold;&amp;quot;|0||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|1||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|2||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|3||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|4||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|5||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|6||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|7||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|8||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|9||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|A||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|B||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|C||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|D||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|E||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|F||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|Block||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|#&lt;br /&gt;
|-&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|0040&lt;br /&gt;
|style=&amp;quot;background:#fff&amp;quot;|@||A||B||C||D||E||F||G||H||I||J||K||L||M||N||O&lt;br /&gt;
|rowspan=&amp;quot;4&amp;quot; style=&amp;quot;background:#fff&amp;quot; align:&amp;quot;center&amp;quot;|C0 Controls and Basic Latin&amp;lt;br&amp;gt;0000–007F&amp;lt;br&amp;gt;(identical to ASCII)&lt;br /&gt;
|rowspan=&amp;quot;4&amp;quot; style=&amp;quot;background:#fff&amp;quot;|52&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|0050&lt;br /&gt;
|P||Q||R||S||T||U||V||W||X||Y||Z||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#91;||style=&amp;quot;background:#fff&amp;quot;|\||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#93;||style=&amp;quot;background:#fff&amp;quot;|^||style=&amp;quot;background:#fff&amp;quot;|_&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|0060&lt;br /&gt;
|style=&amp;quot;background:#fff&amp;quot;|`||a||b||c||d||e||f||g||h||i||j||k||l||m||n||o&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|0070&lt;br /&gt;
|p||q||r||s||t||u||v||w||x||y||z||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#123;||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#124;||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#125;||style=&amp;quot;background:#fff&amp;quot;|~||style=&amp;quot;background:#fff; font-size:75%&amp;quot;|DEL&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;19&amp;quot;| &lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#fff&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00A0&lt;br /&gt;
|&amp;amp;nbsp;||¡||¢||£||¤||¥||¦||§||¨||©||ª||«||¬||||®||¯&lt;br /&gt;
|rowspan=&amp;quot;6&amp;quot; style=&amp;quot;background:#fff&amp;quot; align=&amp;quot;center&amp;quot;|C1 Controls and Latin-1 Supplement&amp;lt;br&amp;gt;0080–00FF&amp;lt;br&amp;gt;(identical to ISO/IEC 8859-1)&lt;br /&gt;
|rowspan=&amp;quot;6&amp;quot; style=&amp;quot;background:#fff&amp;quot;|62&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#fff&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00B0&lt;br /&gt;
|°||±||²||³||´||µ||¶||·||¸||¹||º||»||¼||½||¾||¿&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00C0&lt;br /&gt;
|À||Á||Â||Ã||Ä||Å||Æ||Ç||È||É||Ê||Ë||Ì||Í||Î||Ï&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00D0&lt;br /&gt;
|Ð||Ñ||Ò||Ó||Ô||Õ||Ö||style=&amp;quot;background:#fff&amp;quot;|×||Ø||Ù||Ú||Û||Ü||Ý||Þ||ß&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00E0&lt;br /&gt;
|à||á||â||ã||ä||å||æ||ç||è||é||ê||ë||ì||í||î||ï&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00F0&lt;br /&gt;
|ð||ñ||ò||ó||ô||õ||ö||style=&amp;quot;background:#fff&amp;quot;|÷||ø||ù||ú||û||ü||ý||þ||ÿ&lt;br /&gt;
|---- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I caratteri indicati in rosso nella tabella sono tutti i possibili ''caratteri alfabetici'' che compaiono nei documenti scritti in 29 lingue diverse ([0023]), tra le quali sono presenti l'italiano, l'inglese, lo spagnolo, il tedesco e il portoghese. &lt;br /&gt;
Aggiungendo pochi altri caratteri all'insieme dei ''caratteri alfabetici'' appena mostrati, si riesce a rappresentare ogni parola di altre 12 lingue ([0023]), tra cui il francese, l'olandese, il ceco e il turco.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
I caratteri mostrati in tabella corrispondono ad una parte dei primi due blocchi dello standard Unicode che codificano l'alfabeto latino e, come già accennato in precedenza, essi sono presenti negli standard ''ASCII'' e ''ISO/IEC 8859-1''. I rimanenti ''caratteri alfabetici'', invece, sono presenti in estensioni dello standard Unicode per il ''Latin script''. Queste estensioni sono state realizzate per fornire il massimo supporto a tutte le lingue e contenenti molti simboli ad uso speciale, come ad esempio per la rappresentazione dei fonemi. Si osserva, inoltre, che i ''caratteri alfabetici'' definiti nelle estensioni dello standard Unicode sono presenti anche nella codifica ''ISO/IEC 8859-2'' o nelle versioni successive ([0023]).&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Definiti i ''caratteri non alfabetici'' come elementi di separazione tra un nominativo ed il testo in cui esso è inserito, occorre definire opportunamente la ''regex'' che al nominativo è associata.&lt;br /&gt;
&lt;br /&gt;
Utili strumenti messi a disposizione dalle ''regular expressions'' sono i gruppi speciali ''lookahead'' e ''lookbehind''. Un pattern di un nominativo deve essere preceduto o seguito da una prestabilita sequenza di caratteri, la quale però non è parte del nominativo. Utilizzando i due costrutti citati, è possibile far sì che nell'elaborazione di una stringa facciano match solamente le parole effettivamente appartenenti al nominativo, non i caratteri che lo delimitano dal resto del testo, e allo stesso tempo che un nominativo faccia match se e solo se preceduto o seguito da una certa sequenza di caratteri. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per esprimere nella sintassi delle ''regex'' un carattere letterale in un qualunque alfabeto si può utilizzare il costrutto ''\p{L}'', che però risulta molto generale e troppo lasco per i requisiti considerati. Si può piuttosto valutare l'impiego del costrutto ''\p{Latin}'', il quale identifica un qualunque carattere alfabetico presente nell'alfabeto latino. Tra i caratteri corrispondenti al costrutto, però, ve ne sono alcuni che per le specifiche del servizio devono essere considerati ''caratteri non alfabetici'', come ad esempio i caratteri dei fonemi, i segni diacritici e gli indicatori ordinali; di conseguenza è necessario individuare una strategia ad hoc per risolvere questa problematica.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per chiarezza espositiva, si definisce il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;start&amp;gt;&amp;lt;/span&amp;gt;, per indicare un qualunque carattere non alfabetico o l'inizio stringa, il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;end&amp;gt;&amp;lt;/span&amp;gt;, per indicare un qualunque carattere non alfabetico o il fine stringa, ed il tag &amp;lt;extra&amp;gt;, per indicare i ''caratteri alfabetici'' non presenti negli standard ''ASCII'' o ''ISO/IEC 8859-1'':&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;extra&amp;gt; := ĿŀČčŘřŠšŽžĲĳŒœŸŐőŰűḂḃĊċḊḋḞḟĠġṀṁṠṡṪṫĀāĒēĪīŌōŪūİıĞğŞşẀẁẂẃŴŵŶŷǾǿẞ&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;start&amp;gt; := (?&amp;lt;=[^A-Za-zÀ-ÖØ-öø-ÿ&amp;lt;extra&amp;gt;]|^)&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;end&amp;gt; := (?=[^A-Za-zÀ-ÖØ-öø-ÿ&amp;lt;extra&amp;gt;]|$)&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva che si sono utilizzati i gruppi speciali prima descritti e che si sono inseriti i caratteri dello standard Unicode presentati in precedenza. Si definisce nuovamente la ''regular expression'' associata ad un generico nominativo. Applicando i tag appena definiti, il costrutto ''(?i)'' che rende il pattern ''case-insensitive'' ed il costrutto ''\s'' che rappresenta un carattere qualunque tra i separatori non visibili, ossia ''\r \n \t \f \v'' e lo spazio bianco, si ottiene:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;regex&amp;gt; := (?i)(&amp;lt;start&amp;gt;&amp;lt;cognome&amp;gt;\s+(&amp;lt;nomi&amp;gt;)|(&amp;lt;nomi&amp;gt;)\s+&amp;lt;cognome&amp;gt;&amp;lt;end&amp;gt;)&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva, inoltre, che in questa nuova formulazione della ''regular expression'' i nomi sono da intendersi separati tra loro da ''\s+''.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
A questo punto si è quasi giunti alla formulazione finale del pattern da associare ad un nominativo, rimangono solo da trattare alcuni casi critici non ancora risolti.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt; &lt;br /&gt;
Si è già presentato in precedenza il problema legato al fatto che alcuni cognomi possono avere un significato proprio nel lessico comune e che ciò costringeva, quindi, ad abbandonare l'idea di trattare nominativi formati dal solo cognome. Questa problematica di ambiguità si presenta anche con alcuni nomi (si pensi, ad esempio, al nome ''Gioia''). Ciò non rappresenta generalmente un problema, in quanto la coppia nome-cognome che forma il nominativo, presa complessivamente, non è soggetta ad ambiguità. Esistono, però, dei casi in cui questo non è vero. Si prenda in analisi il nominativo ''Gioia Grande'': risulta evidentemente soggetto a rischio di ambiguità. Una soluzione che si può adottare, per risolvere questo caso critico, si basa sull'associazione di un pattern più stringente ai nominativi. In particolare, si osserva che i nomi propri di persona compaiono sempre ed obbligatoriamente, in un documento grammaticalmente corretto, con la prima lettera maiuscola ([0024]). I cognomi, invece, non sono soggetti ad una regola così stringente: un cognome iniziante con una lettera minuscola (come ''de Rosa'') in alcuni casi, ad esempio se posto dopo un punto fermo, può comparire scritto con la prima lettera sia maiuscola che minuscola; naturalmente, in nessuna occorrenza un cognome che inizi con una lettera maiuscola potrà comparire con una minuscola. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Occorre quindi ridefinire, alla luce di queste osservazioni, la ''regex'' associata ad un nominativo, poiché precedentemente era stata posta interamente ''case-insensitive''. Nel pattern, in particolare, i nomi dovranno sempre iniziare con una maiuscola, mentre i cognomi avranno questo vincolo solo se nel nominativo compaiono con la prima lettera maiuscola. Si mostra quindi quali sono i tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; e &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt; associati a due nominativi, ad esempio ''Gioia Grande'' e ''Antonio de Rosa''. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per ''Gioia Grande'' si ha:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt; = G((?i)ioia)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt; = G((?i)rande)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per ''Antonio de Rosa'' si ha:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt; = A((?i)ntonio)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt; = (?i)de Rosa&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si presenta dunque la definizione finale del tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;regex&amp;gt;&amp;lt;/span&amp;gt;. Nella definizione il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; è definito il base al numero di nomi del nominativo ed il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt; è definito in base al carattere iniziale del cognome.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;regex&amp;gt; := &amp;lt;start&amp;gt;&amp;lt;cognome&amp;gt;\s+(&amp;lt;nomi&amp;gt;)|(&amp;lt;nomi&amp;gt;)\s+&amp;lt;cognome&amp;gt;&amp;lt;end&amp;gt;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Vengono inoltre mostrati i valori dei due tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; e &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt; per il nominativo preso come caso di studio in fase iniziale, ossia ''Amorosa Lorenzo Mario''. Si ottiene:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt; = L((?i)orenzo)\s+M((?i)ario)|M((?i)ario)\s+L((?i)orenzo)|L((?i)orenzo)|M((?i)ario)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt; = A((?i)morosa)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Infine, per completezza, viene mostrata la ''regular expression'', associata a quest'ultimo nominativo, risolvendo tutti i tag che la compongono:&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;regex&amp;gt; = (?&amp;lt;=[^A-Za-zÀ-ÖØ-öø-ÿĿŀČčŘřŠšŽžĲĳŒœŸŐőŰűḂḃĊċḊḋḞḟĠġṀṁṠṡṪṫĀāĒēĪīŌōŪūİıĞğŞşẀẁẂẃŴŵŶŷǾǿẞ]|^)(A((?i)morosa)\s+(L((?i)orenzo)\s+M((?i)ario)|M((?i)ario)\s+L((?i)orenzo)|L((?i)orenzo)|M((?i)ario))|(L((?i)orenzo)\s+M((?i)ario)|M((?i)ario)\s+L((?i)orenzo)|L((?i)orenzo)|M((?i)ario))\s+A((?i)morosa))(?=[^A-Za-zÀ-ÖØ-öø-ÿĿŀČčŘřŠšŽžĲĳŒœŸŐőŰűḂḃĊċḊḋḞḟĠġṀṁṠṡṪṫĀāĒēĪīŌōŪūİıĞğŞşẀẁẂẃŴŵŶŷǾǿẞ]|$)&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Gestione delle omonimie====&lt;br /&gt;
&lt;br /&gt;
Nei ragionamenti che hanno portato alla formulazione della ''regular expression'' associata ai nominativi, si è tenuto conto di possibili ambiguità con termini appartenenti al linguaggio comune, risolte con l'introduzione nel pattern di stringhe ''case-sensitive'', e di possibili nominativi posti in sequenza parzialmente omonimi (ossia aventi un nome o il cognome in comune tra loro), gestite con l'imposizione dei soli caratteri separatori non visibili come delimitatori delle parole componenti un nominativo. Per rendere l'analisi completa occorre valutare come ci si debba comportare in altri possibili casi di omonimia. Si osserva, per inciso, che nel pattern individuato nella sezione precedente il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; è stato l'unico non definito formalmente. La definizione di tale tag infatti dipende, oltre che dai nomi del nominativo, anche dall'insieme complessivo dei nominativi da trattare presenti nel documento.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Il caso più semplice di omonimia, che si verifica quando un solo nome o il solo cognome di un nominativo coincide con un nome o il cognome di un altro (come nel caso di ''Lorenzo Mario Amorosa'' e ''Stefano Amorosa''), risulta già ben gestito dall'attuale formulazione del pattern. Infatti, un riconoscimento è determinato quando almeno un nome e il cognome del nominativo appaiono in sequenza.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Il problema si complica quando un nominativo ha due o più componenti in comune con un altro. Si osserva che se l'omonimia riguarda solo i nomi dei nominativi, ciò non risulta problematico, in quanto il cognome, supposto sempre presente nel pattern, funge da elemento di disambiguazione. Si considera da ora, quindi, che i nominativi abbiano il medesimo cognome e si analizzano i casi in cui anche uno o più nomi risultano in comune, attraverso degli esempi: &lt;br /&gt;
* Nomi_A = {&amp;quot;Lorenzo&amp;quot;, &amp;quot;Mario&amp;quot;, &amp;quot;Luca&amp;quot;}; Nomi_B = {&amp;quot;Stefano&amp;quot;, &amp;quot;Mario&amp;quot;}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F01])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In questo caso sono elementi di disambiguazione i nomi ''Lorenzo'' e ''Luca'' per il primo nominativo e ''Stefano'' per il secondo, bisognerà quindi far sì che almeno uno tra tali nomi compaia sempre nelle ''regex'' associate ai nominativi in questione. L'occorrenza ''Mario &amp;lt;cognome&amp;gt;'' rimane ambigua e non può essere trattata.&lt;br /&gt;
* Nomi_A = {&amp;quot;Lorenzo&amp;quot;, &amp;quot;Mario&amp;quot;, &amp;quot;Luca&amp;quot;}; Nomi_B = {&amp;quot;Mario&amp;quot;, &amp;quot;Luca&amp;quot;}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F02])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
L'insieme Nomi_B risulta un sottoinsieme di Nomi_A, di conseguenza solo il primo nominativo presenta degli elementi utili per risolvere l'ambiguità. Nel pattern relativo al primo nominativo dovrà essere presente almeno un tra i nomi non in comune, mentre il pattern del secondo nominativo rappresenterà inevitabilmente espressioni ambigue poiché riconducibili all'altro. Le soluzioni possibili sono due: rifiutarsi di effettuare il trattamento del secondo nominativo oppure decretare che esso è riconosciuto se e solo se appare nella sua forma estesa, presentando quindi tutti i nomi. Quest'ultima soluzione è ragionevole e la si sceglie, poiché così si aumentano, per quanto possibile, le sequenze &amp;quot;minimizzabili&amp;quot;, e viene inoltre messo in conto di informare l'utente opportunamente sulla gestione di questo genere di omonimia per rendere le operazioni trasparenti.&lt;br /&gt;
* Nomi_A = Nomi_B = {&amp;quot;Lorenzo&amp;quot;, &amp;quot;Mario&amp;quot;, &amp;quot;Luca&amp;quot;}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F03])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Qualora l'insieme dei nomi dei due nominativi sia identico risulta impossibile distinguerli e non possono in alcun modo essere trattati, poiché l'ordine con cui compaiono i nomi di un nominativo non rappresenta un elemento di disambiguità. I dati appartenenti a persone completamente omonime contenuti in uno stesso documento, quindi, non sono &amp;quot;minimizzabili&amp;quot; distintamente.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva che è di fondamentale importanza che i documenti che gli utenti forniscono siano grammaticalmente corretti, in quanto un errato uso dei segni di interpunzione può rendere impossibile l'applicazione delle ''regular expression''. Si prenda ad esempio una sequenza anomala di caratteri in cui non è corretto l'uso delle virgole, come &amp;quot;''Amorosa Mario Rossi Giacomo''&amp;quot;: supponendo che nel documento si vogliano trattare i nominativi ''Amorosa Mario'', ''Rossi Mario'' e ''Rossi Giacomo'', risulta impossibile identificare quali tra questi siano rappresentatati nella sequenza.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In conclusione, risultano quindi individuate le strategie che permettono di formulare ''regular expressions'' anche per i nominativi soggetti ad omonimia.&lt;br /&gt;
&lt;br /&gt;
====Formattazione dei documenti====&lt;br /&gt;
 &lt;br /&gt;
I documenti prodotti in enti ed organizzazioni presentano generalmente formattazioni e non sono puramente testuali. Si vuole qui considerare quale debbano essere le interpretazioni più adatte da dare agli elementi grafici per rendere sempre efficace il riconoscimento dei nominativi. In particolare, quindi, non si tratteranno gli elementi di punteggiatura, come parentesi o virgolette, poiché già compresi nelle ''regex'', bensì tutti gli elementi che in un pattern composto da caratteri non sono espressi. Si inizia dunque la rassegna:&lt;br /&gt;
* Elementi di formattazione del testo&lt;br /&gt;
I font, la dimensione dei caratteri, il grassetto, il corsivo, l'evidenziazione e tutti i possibili elementi di modifica della apparizione grafica del testo non alterano il significato dei lessemi coinvolti. Se il cognome di un nominativo è posto in grassetto ed il nome no, ad esempio, la coppia nome-cognome rappresenta sempre il nominativo iniziale; lo stesso vale per gli altri elementi citati.&lt;br /&gt;
* Aree di comparizione del testo&lt;br /&gt;
In genere ogni documento è formato da più sezioni, ha un corpo principale ed eventuali titoli, note a piè pagina, intestazioni ed altre possibili aree. Il trattamento di &amp;quot;minimizzazione&amp;quot;, secondo il ''GDPR'', deve essere effettuato al documento in ogni sua parte, ma ogni sezione deve essere elaborata in maniera indipendente dalle altre sezioni in quanto rappresenta un blocco logico a sé. Ciò significa che, ad esempio, bisogna individuare eventuali nominativi presenti nel titolo, ma non bisogna considerare nominativo una sequenza di parole che è posta in parte nel titolo e in parte nel primo paragrafo del testo.&lt;br /&gt;
* Elementi blocco&lt;br /&gt;
Gli elementi blocco, come ad esempio le immagini, possono causare un'interruzione netta in un paragrafo, suddividendolo quindi in più blocchi logici, che devono essere analizzati separatamente; tuttavia nel caso in cui questi elementi siano posti ''fluttuanti'', ossia ancorati ai bordi della pagina, il testo scorre in un unico flusso e forma quindi un unico blocco logico.&lt;br /&gt;
* Divisione in sillabe&lt;br /&gt;
Un problema rilevante nella formattazione del documento è che spesso, per esigenze estetiche, contiene delle parole divise in sillabe poste su righe diverse e separate da un trattino. Ovviamente se un nome va a capo a fine linea non perde il suo significato semantico, bisognerà quindi continuare a riconoscerlo.&lt;br /&gt;
* Tabelle&lt;br /&gt;
Molti documenti, specialmente quelli contenenti ingenti quantità di nominativi, possono essere strutturati in forma tabellare. Trascurando una trattazione per esteso delle modalità con cui i nominativi potrebbero comparire nelle tabelle, si considera esclusivamente il caso di gran lunga più ricorrente. In genere, infatti, in una tabella contenente dei nominativi, essi sono presenti nella stessa colonna o in colonne contigue: l'una contenente i nomi, l'altra il cognome, o viceversa. Senza basarsi sull'intestazione delle colonne, si può valutare se il contenuto di due celle adiacenti poste su di una stessa riga faccia match con il pattern di un nominativo, ed in caso ciò accada si può affermare la coppia di celle individuata rappresenta un nominativo.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva che si sono fornite solamente le interpretazioni più plausibili e comuni a questi elementi grafici e non si è ideato alcun particolare algoritmo per la loro elaborazione. L'espressione di tali strutture, infatti, è fortemente determinata dal formato in cui il documento è redatto. Si rimanda, quindi, ai capitoli successivi per specificazioni ulteriori della soluzione. Occorre notare, infine, che gli elementi di formattazione non sono descritti da stringhe nel formato delle ''regular expressions'': bisognerà quindi integrare gli elementi presentati in questa sezione con l'approccio ''pattern-based'' adottato.&lt;br /&gt;
&lt;br /&gt;
===Analisi dell'usabilità===&lt;br /&gt;
&lt;br /&gt;
====Elenco dei nominativi da trattare esplicitamente espressi come dati in input====&lt;br /&gt;
&lt;br /&gt;
In questo caso, per usufruire del servizio, l'utente deve fornire un documento contenente una serie di nominativi da trattare. Una garanzia della corretta elaborazione del documento si ha richiedendo all'utente stesso quali siano i nominativi da trattare: in questo modo potranno essere &amp;quot;minimizzati&amp;quot; i dati (cioè i nominativi) di tutte e sole le persone espressamente richieste. In molti plausibili scenari, infatti, è necessario anonimizzare solo alcuni dei nominativi presenti nel documento; ad esempio in un atto giudiziario serve anonimizzare le parti in causa ma non i magistrati. &lt;br /&gt;
&lt;br /&gt;
Questa configurazione del servizio permette quindi all'utente di avere il massimo controllo possibile del risultato. Tuttavia questo approccio è poco pratico nel caso in cui i documenti da trattare contengano grandi quantità di nominativi diversi e, magari, l'utente che ne richiede il trattamento non li conosce; si pensi ad esempio a lunghe graduatorie di concorsi o altro. Si osserva inoltre che anche per pochi nominativi l'usabilità può degradare, se l'inserimento viene fatto con estemporanea digitazione, esposta anche al rischio di possibili errori di battitura, con conseguenti noiose ripetizioni delle operazioni.&lt;br /&gt;
&lt;br /&gt;
Si osserva, infine, che il sistema progettato è sufficientemente robusto nel trattare i nominativi in input espressi da un utente che ha digitato caratteri maiuscoli o minuscoli violando le convenzioni grammaticali. Supposto che il documento trattato debba essere grammaticalmente corretto, infatti, si ha la garanzia che i nomi ivi presenti comincino con una maiuscola; è sufficiente, quindi, forzare una conversione ''to-upper-case'' dei nomi inseriti dall'utente e le ''regex'' progettate funzionano correttamente. Un discorso a parte va fatto per i cognomi inseriti dall'utente, in quanto essi possono comparire con la prima lettera sia maiuscola che minuscola. L'inserimento di un cognome iniziante con una minuscola non crea grossi problemi, in quanto in tal caso la ''regex'' risultante sarebbe totalmente ''case-insensitive'' per il cognome, mentre l'aggiunta di un cognome cominciante con una maiuscola determina una ''regex'' ''case-insensitive'' per la prima lettera del cognome; qualora quindi un utente inserisse un nominativo tutto in maiuscolo, le occorrenze del cognome, presenti nel documento, inizianti con una lettera minuscola non verrebbero riconosciute.&lt;br /&gt;
Per le altre lettere dopo la prima, sia per i nomi che per i cognomi, il pattern è stato progettato ''case-insensitive'', quindi non emergono problemi. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In sintesi, il rischio che vengano introdotte delle ambiguità lessicali, incaricando l'utente dell'inserimento dei nominativi, è piuttosto basso ed il controllo che si ha sui nominativi è il massimo desiderabile, mentre i requisiti di usabilità risultano penalizzati.&lt;br /&gt;
&lt;br /&gt;
====Elenco dei nominativi da trattare dedotti automaticamente da un dizionario====&lt;br /&gt;
&lt;br /&gt;
Se si desidera privilegiare la tematica dell'usabilità nella progettazione del servizio, risulta necessario individuare delle strategie che semplifichino il più possibile i compiti che devono essere svolti dall'utente. L'unica operazione che inevitabilmente resta a suo carico è l'upload del documento da trattare; non è infatti necessario richiedergli l'elencazione dei nominativi dei nominativi da trattare, in quanto questi possono essere dedotti automaticamente impiegando dei dizionari, dei quali va quindi valutato il contenuto e le modalità di utilizzo. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si scarta subito l'ipotesi di dedurre automaticamente i nominativi basandosi unicamente sul fatto che le iniziali di nomi e cognomi siano maiuscole; come già argomentato infatti l'uso delle lettere maiuscole non è limitato solo a questi usi e, inoltre, non si può avere la certezza che un cognome inizi con una maiuscola.&lt;br /&gt;
&lt;br /&gt;
Sono disponibili fortunatamente alcuni dizionari di nomi ed altri di cognomi, in diverse lingue; si fa qui riferimento a quelli di &amp;quot;Data World&amp;quot; (un'azienda focalizzata sulla raccolta, produzione e pubblicazione di dataset: https://data.world) ([0037]).&lt;br /&gt;
&lt;br /&gt;
Si inizia l'analisi inquadrando le dimensioni che un dizionario contenente nomi o cognomi avrebbe. Risalta subito all'occhio la differenza tra il numero di termini contenuti nei due casi: facendo riferimento ai soli nomi e cognomi italiani, risultano esistenti circa 350.000 cognomi ([0036]) e circa 9.000 nomi, dei quale circa 5.000 maschili e circa 4.000 femminili ([0037]); il numero dei cognomi è quindi quasi 40 volte più grande del numero dei nomi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si ipotizza, per chiarire le idee, di applicare questi dizionari in uno scenario reale, in cui, ad esempio, si vuole trattare un documento di 10 pagine contenente 5.000 parole. Si trascurano inoltre i meccanismi che permettono di ricondurre un nome od un cognome ad un nominativo per concentrarsi unicamente sul numero di confronti necessari da effettuare nell'elaborazione. Nel peggiore dei casi possibili, ossia quando nessuna parola del documento compare tra i termini del dizionari, e dove occorre quindi confrontare ogni singola parola del documento con tutti i termini del dizionario, per semplice moltiplicazione si ottiene che l'impiego di un dizionario di nomi darebbe luogo a 45.000.000 confronti, mentre un dizionario di cognomi ben a 1.750.000.000 confronti. Se invece le parole nel documento fossero 50.000 si avrebbero 450.000.000 di confronti nel primo caso e 10.750.000.000 nel secondo. In sintesi, sebbene il rapporto tra il numero di confronti nei due casi rimanga sempre costante (circa 1:40) indipendentemente dalla lunghezza del documento, la differenza tra il numero di confronti cresce proporzionalmente al numero di parole che vengono sottoposte all'elaborazione. Per quantificare, infine, attraverso un unità di tempo, la differenza esistente tra l'impiego delle due diverse tipologie di dizionario, si realizza un semplice programma java, di cui si riporta qui sotto il contenuto del metodo principale, che realizza i confronti necessari attraverso l'uso di ''regular expression'':&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
final String regex = &amp;quot;\bLorenzo\b&amp;quot;;&amp;lt;br/&amp;gt;&lt;br /&gt;
final String string =  ... //testo di prova&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);&amp;lt;br/&amp;gt;&lt;br /&gt;
final Matcher matcher = pattern.matcher(string);&amp;lt;br/&amp;gt;&lt;br /&gt;
int start, total;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
start = System.currentTimeMillis();&lt;br /&gt;
while (matcher.find()) {&lt;br /&gt;
    System.out.println(&amp;quot;Full match: &amp;quot; + matcher.group(0));&lt;br /&gt;
    for (int i = 1; i &amp;lt;= matcher.groupCount(); i++) {&lt;br /&gt;
        System.out.println(&amp;quot;Group &amp;quot; + i + &amp;quot;: &amp;quot; + matcher.group(i));&lt;br /&gt;
    }&lt;br /&gt;
} &amp;lt;br/&amp;gt;&lt;br /&gt;
total = System.currentTimeMillis() - start;&lt;br /&gt;
System.out.println(&amp;quot;Total: &amp;quot; + total + &amp;quot; ms&amp;quot;);&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Eseguendo il test più volte, inserendo fino a 10 occorrenze della parola &amp;quot;Lorenzo&amp;quot; nel testo, si ha un tempo di elaborazione medio di circa 3 ms, con prestazioni di picco di 2 ms, ottenibili con poche occorrenze del nome presenti, e tempo di attesa massimo di 6 ms, dovuto alla presenza invece a una presenza più frequente del nome nel testo.&lt;br /&gt;
Questo fenomeno si comprende meglio ricordando che, come spiegato nel capitolo precedente, le ''regular expressions'' ottimizzano la ricerca, considerano le stringhe del testo trattato solo finché necessario, ossia fino a quando non vi è certezza che esse corrispondano o non corrispondano ad un match. Ogni volta che nel testo si presenta una parola che inizia con una lettera diversa dalla 'L' di &amp;quot;Lorenzo&amp;quot;, la ricerca procede direttamente con la valutazione della parola successiva, ignorando i rimanenti caratteri della parola. &lt;br /&gt;
&lt;br /&gt;
Risulta, invece, più onerosa la verifica della corrispondenza tra una stringa ed il pattern desiderato, poiché in questo caso vanno elaborati tutti i caratteri della parola. Come caso limite, si è posta come stringa da elaborare la sequenza di caratteri &amp;quot;Lorenzo &amp;quot; ripetuta 500 volte: il tempo di esecuzione medio del programma risultante, a parità di piattaforma, è stato di circa 25 ms.&lt;br /&gt;
&lt;br /&gt;
Un'altra diretta conseguenza di questo meccanismo di confronto è che all'aumentare del numero di parole nel documento non corrisponde un eccessivo aumento del tempo di esecuzione: considerando un documento di 5000 parole, con 0 occorrenze del nome &amp;quot;Lorenzo&amp;quot; il tempo di esecuzione medio risulta di 9 ms, con 10 occorrenze di 10 ms, con 100 occorrenze di 15 ms.&lt;br /&gt;
&lt;br /&gt;
Occorre precisare, prima di formulare ulteriori ragionamenti, che in documento di 5.000 parole potranno essere presenti al più 2500 coppie nome-cognome; in un dizionario con più di 2.500 termini almeno uno di questi non contribuirà nell'individuazione di un nominativo. Se poi sono presenti altre parole oltre ai nominativi nel documento, la percentuale di nomi che presenterà 0 occorrenze crescerà di conseguenza. Ad ogni modo, si sceglie di sviluppare i ragionamenti considerando necessario il tempo medio di 10 ms per individuare le occorrenze di un termine di un dizionario in un documento di 5.000 parole; questo tempo è sicuramente maggiore rispetto al caso reale, ma valutando per eccesso questo valore è possibile trascurare il tempo impiegato nelle altre operazioni di routine a supporto dell'algoritmo di ricerca.&lt;br /&gt;
&lt;br /&gt;
Ritornando all'esempio di partenza, considerando quindi necessari 10 ms per individuare le occorrenze di un termine di un dizionario in un documento di 5.000 parole, risulta che l'identificazione di tutti i cognomi contenuti nel testo richieda circa 3.500 secondi, (quasi un'ora!), mentre l'individuazione dei nomi &amp;quot;solo&amp;quot; 90 secondi.&lt;br /&gt;
I tempi di attesa che l'utente dovrebbe aspettare sono estremamente elevati e irragionevoli, specialmente se calati nel contesto nelle ''web application''. Come primo espediente per ovviare al problema si decide di abbandonare completamente l'idea di impiegare un dizionario di cognomi, in quanto, seppur si individuassero delle soluzioni in grado di effettuare il riconoscimento di tutte le occorrenze di un termine in un documento indipendentemente dalla lunghezza in solo 1 ms (irreale), sarebbero comunque necessari 3 minuti e 50 secondi per l'elaborazione. Non verranno quindi neppure trattate possibili soluzioni che prevedono l'applicazione di entrambi i dizionari.&lt;br /&gt;
&lt;br /&gt;
I 90 secondi richiesti dal dizionario di nomi, invece, risultano anch'essi eccessivi, ma attraverso opportune valutazioni si possono individuare delle strategie che consentono la minimizzazione del tempo necessario all'elaborazione dei documenti. Tali metodi di ottimizzazione saranno trattati in un successivo capitolo, mentre ora ci si continua a concentrare sulle modalità di impiego del dizionario.&lt;br /&gt;
&lt;br /&gt;
Per inciso, si osserva che i problemi di efficienza sono strettamente legati al riconoscimento automatico dei nominativi, in quanto in questo caso devono essere applicate quasi una decina di migliaia di ''regex'' diverse; nel caso in cui i nominativi da elaborare e le ''regex'' a loro associate siano noti, si ha a che fare con un numero esiguo di pattern da trattare e l'esecuzione del programma risulta infinitamente più rapida.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per migliorare l'efficacia del servizio sarebbe opportuno introdurre nel dizionario anche nomi stranieri, sempre più diffusi in una società sempre più globalizzata. Il tempo di esecuzione medio del riconoscimento, già critico, crescerebbe ulteriormente: si decide allora di introdurre nel dizionario i soli nomi inglesi, in totale quasi 5500 ([0037]). Considerando sempre un tempo medio di esecuzione di 10 ms per nome, con un dizionario di circa 14.500 termini si avrebbe un tempo di esecuzione medio complessivo di 145 secondi, ossia pari a 2 minuti e 25 secondi, e risulta ancora possibile effettuare alcune ottimizzazioni che lo riducono ad un livello accettabile.&lt;br /&gt;
&lt;br /&gt;
Una volta individuati i nomi contenuti nel documento occorre stabilire se essi fanno parte di un nominativo, progettando un'opportuna ''regular expression''. È importante notare che per conseguire questo scopo bisogna individuare la soluzione più efficiente possibile.&lt;br /&gt;
&lt;br /&gt;
Un nominativo, come già ripetuto più volte, è composto da uno o più nomi e da un cognome. Individuato un nome, la priorità che si ha è verificare se accanto ad esso sia presente un cognome. Finora i cognomi sono stati supposti non regolamentati da alcun pattern specifico, ma è necessario formularne almeno uno per consentirne il riconoscimento automatico. È ragionevole supporre che un cognome sia formato da massimo due parole, separate da spazio o apostrofo, sempre inizianti entrambe con una maiuscola, fatta eccezione per la prima parola laddove essa sia una preposizione semplice o articolata oppure un articolo, tenendo conto dei possibili troncamenti, come &amp;lt;i&amp;gt;d'&amp;lt;/i&amp;gt; e &amp;lt;i&amp;gt;dell'&amp;lt;/i&amp;gt;. Inoltre per verificare se un termine adiacente al nome trovato rappresenti un nome si evita di impiegare nuovamente il dizionario per non gravare ulteriormente sul tempo di esecuzione. Inoltre, si nota che avendo supposto un cognome composto da massimo due parole inizianti con una lettera maiuscola, un altro nome, oltre quello trovato dal dizionario, viene già automaticamente riconosciuto qualora il cognome sia composto da una sola parola. Rinunciando ad individuare nominativi composti da tre nomi o più, si formula una ''regular expression'' per il riconoscimento automatico in seguito al identificazione di un nome, qui indicato con il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nome&amp;gt;&amp;lt;/span&amp;gt;, supponendo il cognome come precedentemente indicato e ipotizzando la presenza di un ulteriore nominativo.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;prep&amp;gt; := d((a|e)(l(l[aeo]?)?|i|gli?)?|i)?|(ne|a|su)(l(l[aeo]?)?|i|gli)?|l[aeo]?|co[iln]?|i[ln]?|gli|per&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cognome&amp;gt; := (([A-Z][a-zA-ZÀ-ÖØ-öø-ÿ]*|&amp;lt;prep&amp;gt;)('|\s))?[A-Z][a-zA-ZÀ-ÖØ-öø-ÿ]+&lt;br /&gt;
&lt;br /&gt;
&amp;lt;second_name&amp;gt; := [A-Z][a-zA-ZÀ-ÖØ-öø-ÿ]+&lt;br /&gt;
&lt;br /&gt;
&amp;lt;regex&amp;gt; := (&amp;lt;second_name&amp;gt;\s)?(&amp;lt;nome&amp;gt;)\s&amp;lt;cognome&amp;gt;|&amp;lt;cognome&amp;gt;\s(&amp;lt;nome&amp;gt;)(\s&amp;lt;second_name&amp;gt;)?&lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Nella scrittura della ''regex'' si è prestata particolare attenzione all'utilizzo della simbologia per rendere l'espressione il più performante possibile, attraverso il massimo sfruttamento dei cortocircuiti logici e l'opportuno ordinamento dei caratteri (sono stati anteposti i caratteri comuni a più preposizioni od articoli). Inoltre, per alleggerire la ''regex'' si è rinunciato all'utilizzo dei caratteri dell'alfabeto latino non appartenenti ai primi due blocchi Unicode.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
È mostrata in figura la corretta elaborazione di 57 possibili casi di cognomi diversi&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F04])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva tuttavia che in alcune circostanze, come nella frase &amp;quot;''di Amorosa Lorenzo non si hanno notizie''&amp;quot;, accade che un parola (&amp;quot;''di''&amp;quot; in questo caso), non sia parte del cognome ma il programma non è in grado di riconoscerlo. Questa ambiguità è fortemente dipendente dal contesto e non è possibile trattarla senza significativi degradi delle performance; quindi è necessario rinunciare a trattarla, accettando riconoscimenti erronei. In altre situazioni, invece, dove magari si sta elaborando la stringa contenente il nominativo ''Mario Lorenzo'', risulta impossibile determinare quale tra i due termini sia il nome e quale il cognome; cioè significa che l'unico trattamento di &amp;quot;minimizzazione&amp;quot; automatico che risulta ragionevole applicare è la sostituzione del nominativo con uno pseudonimo, non il troncamento o l'alterazione dei nomi.&lt;br /&gt;
In conclusione, con il riconoscimento automatico dei nominativi si migliora complessivamente l'usabilità del servizio, in quanto l'utente non deve digitare i nominativi, ma la latenza introdotta è notevole, si è soggetti a rischi di ambiguità e non è in alcun modo esprimibile la preferenza su quali nominativi si desidera &amp;quot;minimizzare&amp;quot; o meno. La soluzione così ideata non risulta quindi adeguata.&lt;br /&gt;
&lt;br /&gt;
====Soluzione ibrida adottata====&lt;br /&gt;
Entrambe le tipologie di riconoscimento prima individuate hanno significativi problemi, si cerca quindi di sintetizzare una soluzione in grado di trarre i vantaggi dell'una e dell'altra. Risulta efficace, in particolare, che il documento venga inizialmente trattato tramite dizionari, evitando all'utente l'onere di specificare i nominativi, e che in seguito venga lasciata all'utente la possibilità di intervenire.&lt;br /&gt;
Infatti, esso potrebbe voler esprimere delle preferenze su quali nominativi debbano essere trattati tra quelli individuati e gestire gli eventuali errori di riconoscimento dovuti a richieste di trattamento di nominativi aventi un nome non presente nel dizionario o anche dovuti a casi di ambiguità lessicale già presentati.&lt;br /&gt;
&lt;br /&gt;
Una volta inserito il documento e terminata l'elaborazione tramite il dizionario, l'utente può sia richiedere l'immediato download del file ed effettuare le operazioni prima definite, attraverso un'opportuna interfaccia. Per fornire il supporto alle esigenze più disparate, si prevede la possibilità di:&lt;br /&gt;
# eseguire download del file trattato unicamente con il dizionario&lt;br /&gt;
# ripetere la &amp;quot;minimizzazione&amp;quot; del documento, specificando:&lt;br /&gt;
## nuovi nominativi&lt;br /&gt;
## quali nominativi tra quelli precedentemente individuati ''non'' si vogliono trattare&lt;br /&gt;
## quale parola/e dei nominativi individuati rappresenta il cognome (in tal caso, si possono utilizzare altri metodi, oltre alla sostituzione con pseudonimo, per il trattamento)&lt;br /&gt;
## quale parola/e dei nominativi individuati non compone il nominativo (situazione che si verifica quando ci si imbatte in una ambiguità).&lt;br /&gt;
&lt;br /&gt;
Senza soffermarsi in questo momento sull'intera sequenza concreta di interazioni tra utente e servizio, si osserva che l'unico vincolo non funzionale da valutare resta il tempo medio di attesa dell'utente. L'usabilità complessiva è molto buona ed i vincoli funzionali sono soddisfatti.&lt;br /&gt;
&lt;br /&gt;
===Scelta dei formati da trattare===&lt;br /&gt;
&lt;br /&gt;
Una considerazione intuitiva, ed una buona prassi, è che un documento contenente dati personali sia pseudonimizzato o anonimizzato quanto prima possibile e cioè quando è ancora solo nelle mani del suo autore: questo approccio scongiura che informazioni sensibili e dati personali in chiaro ''sfuggano'' in rete.&lt;br /&gt;
Si può per questo ragionevolmente ipotizzare che i naturali destinatari del servizio siano gli stessi autori (creatori) che redigono il documento. Nello scenario tipico di utilizzo, infatti, il fruitore del servizio procederà al trattamento dei dati non appena avrà finito di scrivere il documento del quale, essendone autore, potrà scegliere il formato. Si osserva che potrebbe accadere che il documento sia redatto da terzi: in tal caso l'utente che richiede il trattamento può scegliere il formato in maniera indiretta concordandolo con il redattore. Avendo quindi l'utente la possibilità di stabilire il formato del proprio documento, risulta ragionevole progettare un servizio che lavori su un solo formato.&lt;br /&gt;
A questo punto occorre individuare quale sia il formato che maggiormente si presta alle finalità del servizio.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Una possibilità è quella di richiedere all'utente di inserire come documento da trattare un semplice file di testo in formato ''txt'': in questo modo ci sarebbe il grande vantaggio di trattare file molto semplici, riducendo così al minimo la complessità realizzativa, e inoltre si avrebbe  l'indipendenza dagli editor di testo utilizzati, in quanto tutti supportano i file in formato ''txt''. &lt;br /&gt;
Risulta tuttavia sconveniente utilizzare questo formato, poiché non ha alcuna capacità espressiva per gestire elementi complessi come tabelle, modifiche allo stile del testo e così via. &lt;br /&gt;
Bisogna quindi optare per un formato in grado di gestire questi elementi, al costo di aumentare la complessità della progettazione, ricordando sempre che è necessario allo stesso tempo che tale formato sia supportato da tutti i principali editor di testo.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Con facilità è possibile individuare quali sono i formati di testo più comuni oltre al ''txt'': ''doc'', ''docx'', ''odt'', ''pdf'', ''pages'', ''rtf'', ''tex''. Si passa ora dunque a valutare quale tra questi formati potrebbe meglio soddisfare i requisiti prima enunciati. &lt;br /&gt;
Facendo una cernita iniziale sulla base delle finalità per le quali un formato è utilizzato, si può immediatamente escludere ''tex'', che trova impiego principalmente in ambito scientifico e matematico. In questo settore, infatti, non è richiesta generalmente l'applicazione delle procedura di trattamento dei dati. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt; &lt;br /&gt;
Si può inoltre abbandonare l'idea di trattare documenti con estensione ''pages'', formato proprietario di Apple, poiché utilizzati esclusivamente dall'omonimo editor di testo anch'esso proprietario, e i documenti con estensione ''rtf'', acronimo di ''Rich Text Format'', formato proprietario di Microsoft che supporta una formattazione avanzata, poiché, pur gestito da vari editor, è un formato decisamente datato (ultima versione 1.9.1 risalente a marzo 2008 ([0009])). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si esclude inoltre il formato ''pdf'' per motivi di usabilità: molti editor, infatti, consentono di esportare un documento in questo formato ma non permettono di importarlo. Un utente dopo aver effettuato l'anonimizzazione di un documento non può quindi proseguire modificandolo ulteriormente. Il ''Portable Document Format'', infatti, è ideato per realizzare dei documenti destinati alla sola lettura.&lt;br /&gt;
L'ultima esclusione, piuttosto immediata da effettuare, riguarda il formato ''doc'', binario e proprietario di Microsoft. Esso infatti risulta, a partire dal 2006, soppiantato dal formato ''docx'', sempre proprietario di Microsoft. &lt;br /&gt;
&lt;br /&gt;
Si giunge infine a valutare quale tra gli ultimi due possibili formati rimanenti, ossia ''docx'' e ''odt'', si presta meglio alle finalità del servizio. In via preliminare si osserva che entrambi i formati possiedono ottime capacità espressive, hanno una struttura interna di simile complessità e sono entrambi supportati dai principali editor di testo. È necessario quindi effettuare delle analisi più approfondite per poter sceglierne uno tra i due.&lt;br /&gt;
La struttura del formato ''docx'', sviluppato da Microsoft e formalmente denominato ''Office Open XML Document (OOXML Document)'', è costituita da un file compresso .zip contenente un insieme di file ''XML''. Il formato ''OOXML'' permette la rappresentazione, oltre che di documenti testuali, anche di fogli elettronici (formato ''OOXML 'Workbook'', noto anche come ''xslx'') e di presentazioni (formato ''OOXML Presentation'', noto anche come ''pptx'') ([0008], [0013]).&lt;br /&gt;
Il formato inoltre è stato inizialmente standardizzato nel 2006 dall'&amp;lt;i&amp;gt;ECMA&amp;lt;/i&amp;gt;  (come ''ECMA-376'') e successivamente nel 2008 dall'&amp;lt;i&amp;gt;ISO&amp;lt;/i&amp;gt; e dall'&amp;lt;i&amp;gt;IEC&amp;lt;/i&amp;gt; (come ''ISO/IEC 29500'') in una versione ''transitional'', retrocompatibile con alcune versioni precedenti del formato contenenti elementi deprecati, e in una versione ''strict'', dove tali elementi non sono ammessi. I due standard sono stati poi successivamente aggiornati e sono tutt'ora oggetto di revisioni ([0002]).&lt;br /&gt;
&lt;br /&gt;
Anche la struttura del formato open source ''odt'', sviluppato dall'&amp;lt;i&amp;gt;OASIS&amp;lt;/i&amp;gt; e formalmente denominato ''OpenDocument Text'', è basata su uno zip contenente un insieme di file ''XML''. Inoltre, il formato ''OpenDocument Format (ODF)'' permette di trattare fogli elettronici (formato ''OpenDocument Spreadsheet'', noto anche come ''ods'') e presentazioni (formato ''OpenDocument Presentation'', noto anche come ''odp'') ([0007]). Anche ''OpenDocument Text'' è stato standardizzato, in particolare dall'&amp;lt;i&amp;gt;OASIS&amp;lt;/i&amp;gt; stesso nel 2005 e dall'&amp;lt;i&amp;gt;ISO/IEC&amp;lt;/i&amp;gt; nel 2006, ed è soggetto a revisioni e aggiornamenti ([0003]).&lt;br /&gt;
&lt;br /&gt;
In sintesi, basandosi sulla struttura dei documenti e sulla standardizzazione dei formati, non è ancora possibile individuare quale sia il formato migliore. L'unico elemento che potrebbe portare punti a favore del formato ''odt'' è che esso, a differenza del formato ''docx'', è aperto, tuttavia, essendo le specifiche di entrambi i formati pubbliche, ciò non rappresenta un fattore determinante nell'elezione del formato.&lt;br /&gt;
Entrambi i formati, inoltre, sono largamente supportati dai word processors.&lt;br /&gt;
&lt;br /&gt;
Le seguenti tabelle riepilogano il supporto all'uno ed all'altro formato dei ''word-processors'' più usati, ossia ''Microsoft Office Word'', ''LibreOffice Writer'', ''OpenOffice Writer'' e ''Pages''. &lt;br /&gt;
Le tabelle sono tratte da wikipedia ([0000], [0001], [0006]). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;i&amp;gt;Supporto fornito dagli editor di testo al formato docx&amp;lt;/i&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  !! Microsoft Office Word !! LibreOffice Writer !! OpenOffice Writer !! Pages&lt;br /&gt;
|-&lt;br /&gt;
! Version&lt;br /&gt;
|| 2013, 2011 for Mac || All versions || 3.0 || '08&lt;br /&gt;
|-&lt;br /&gt;
! Operating systems&lt;br /&gt;
|| Windows, Mac OS X || Windows, OS X, Linux, Unix, Android || Windows, Linux, Unix, Mac OS X || Mac OS X&lt;br /&gt;
|-&lt;br /&gt;
! Office suite&lt;br /&gt;
|| Microsoft Office ||  || OpenOffice.org || iWork&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
|| Microsoft || The Document Foundation || Apache OpenOffice || Apple Inc.&lt;br /&gt;
|-&lt;br /&gt;
! License&lt;br /&gt;
|| proprietary || MPL || LGPL || proprietary&lt;br /&gt;
|-&lt;br /&gt;
! ECMA-376&lt;br /&gt;
|| yes || yes || yes || yes&lt;br /&gt;
|-&lt;br /&gt;
! ISO/IEC 29500:2008&lt;br /&gt;
|| yes || yes || || &lt;br /&gt;
|-&lt;br /&gt;
! Notes&lt;br /&gt;
||  ||  || Import only ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;i&amp;gt;Supporto fornito dagli editor di testo al formato odt&amp;lt;/i&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  !! Microsoft Office Word !! LibreOffice Writer !! OpenOffice Writer &lt;br /&gt;
|-&lt;br /&gt;
! Version&lt;br /&gt;
|| 2007 SP2 || 4.0.3 || 3.0.0&lt;br /&gt;
|-&lt;br /&gt;
! Operating systems&lt;br /&gt;
|| Windows || Unix-based systems, Mac OS X, Solaris || Windows, Linux, Unix-based systems, Mac OS X, Solaris&lt;br /&gt;
|-&lt;br /&gt;
! Office suite&lt;br /&gt;
|| Microsoft Office ||  || OpenOffice.org&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
|| Microsoft || The Document Foundation || Apache OpenOffice&lt;br /&gt;
|-&lt;br /&gt;
! License&lt;br /&gt;
|| Proprietary || MPL || LGPL&lt;br /&gt;
|-&lt;br /&gt;
! ISO/IEC 26300:2006&lt;br /&gt;
|| yes || yes || yes&lt;br /&gt;
|-&lt;br /&gt;
! Notes&lt;br /&gt;
|| some limitations || Multiple ODF versions supported (ISO/ODF 1.0/1.1/1.2/1.2 Extended) || adjustable ODF version (ISO/ODF 1.2) &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si possono effettuare le seguenti osservazioni:&lt;br /&gt;
* ''Microsoft Office Word'' è, in ambiente Microsoft, il word processor maggiormente usato; è molto usato anche in ambiente Apple Mac. Esso offre il pieno supporto al formato ''OOXML Document''; solo parzialmente invece gestisce il formato ''OpenDocument Text'': il processamento di file con estensione ''odt'' con questo editor comporta la perdita di alcune informazioni secondarie.&lt;br /&gt;
* ''LibreOffice Writer'', l'editor open source maggiormente utilizzato, supporta pienamente entrambi formati. Nato con lo scopo di gestire i file con formato ''OpenDocument Text'', attualmente supporta completamente anche il formato ''OOXML Document''. &lt;br /&gt;
* ''OpenOffice Writer'', un altro degli editor di testo tra i più utilizzati, supporta pienamente ''odt'', mentre è solo in grado di importare i file con estensione ''docx''.&lt;br /&gt;
* ''Pages'', il word process installato a default sui Mac della Apple e, di conseguenza anche maggiormente usato su questi dispositivi, non offre supporto al formato ''odt'', ma elabora correttamente i documenti con estensione ''docx'' ([0005],[0004]). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Queste osservazioni evidenziano che quindi è impossibile adottare un formato supportato da tutti gli editor; la scelta va allora indirizzata verso quello maggiormente supportato dai word processor più popolari.&lt;br /&gt;
Per avere un'indicazione di ''popolarità'', e quindi per poter comprendere meglio quali tra gli editor prima citati siano i più usati, si può fare un'analisi, tramite motori di ricerca, di quanti file con una certa estensione siano presenti in rete.&lt;br /&gt;
È possibile, ad esempio, ricercare su Google i file che contengono nel proprio nome una determinata sequenza di caratteri o aventi una certa estensione (''filetype''). Sono qui presentati i risultati delle interrogazioni riguardo ai file aventi formato ''docx'', ''doc'' e ''odt'' ed il cui nome contiene uno dei caratteri, fra i più frequenti, &amp;quot;1&amp;quot; o &amp;quot;a&amp;quot; o &amp;quot;e&amp;quot;. L'investigazione è stata effettuata inserendo nella barra di ricerca di Google le stringhe ''1 filetype:docx'', ''a filetype:docx'' e così via.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Formato cercato !! Documenti con &amp;quot;1&amp;quot; nel nome !! Documenti con &amp;quot;a&amp;quot; nel nome !! Documenti con &amp;quot;e&amp;quot; nel nome&lt;br /&gt;
|-&lt;br /&gt;
| docx || 16.900.000  || 12.800.000 || 8.730.000&lt;br /&gt;
|-&lt;br /&gt;
| odt || 736.000 || 667.000 || 507.000&lt;br /&gt;
|-&lt;br /&gt;
| doc || 32.300.000 || 26.300.000 || 21.500.000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Effettivamente il formato più diffuso è il ''doc''; tuttavia esso è supportato per retro-compatibilità anche dagli editor che supportano formati ''OOXML'', con i quali non si ha difficoltà nel convertire i documenti dal formato ''doc'' al ''docx''. In conclusione, quale che sia l'editor più diffuso, è ragionevole adottare il formato ''OOXML Document'' per le finalità del servizio, in quanto molto diffuso, ben supportato dagli editor e avente ottime capacità espressive. Di conseguenza i documenti che saranno elaborati dovranno essere forniti dall'utente in tale formato. In successive sezioni verrà approfondita la struttura dei documenti ''OOXML''.&lt;br /&gt;
&lt;br /&gt;
===Privacy by design===&lt;br /&gt;
&lt;br /&gt;
L'Art. 25 del ''GDPR'', con i Considerando 75 e 78, ha per titolo e per oggetto la &amp;quot;protezione dei dati fin dalla progettazione e protezione per impostazione predefinita&amp;quot; ([0035]), perfettamente in linea con i concetti di &amp;quot;minimizzazione&amp;quot;, già richiamati.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Il senso dell'Art. 25 viene spesso sintetizzato con l'espressione &amp;quot;''PbD - privacy by design, privacy by default''&amp;quot; ([0035]). Il principio fissato nell'Art. 25 dovrà sempre più essere tenuto ben presente nell'ambito dell'ingegneria del software, in quanto impone di adottare nuove cautele nella realizzazione delle applicazioni software.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Del principio ''PbD'' si è ben tenuto conto nella progettazione descritta in questa tesi. In particolare, relativamente alla ''privacy by design'', si è fatto in modo che nessun dato personale permanga registrato sul sistema di esecuzione, o altrove, al termine dell'applicazione. Anche laddove l'applicazione termini in modo anomale non vi sono strutture dati superstiti, che restano memorizzate sul sistema.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Marginale in questa tesi è la nozione di ''privacy by default'', giacché l'applicazione non offre all'utente alcuna opzione che possa indurlo in errore ed acconsentire a trattamenti dei dati personali, oltre quello realizzato dall'applicazione.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
È utile osservare quanto sia importante esprimere queste impostazioni di progettazione fra le condizioni d'uso presentate all'utente: esse costituiscono uno dei presupposti affinché l'utente abbia piena fiducia (''trust'') nel servizio, lo utilizzi, lo divulghi, lo renda un servizio di successo.&lt;br /&gt;
&lt;br /&gt;
==Architettura del servizio== &lt;br /&gt;
&lt;br /&gt;
===I componenti software nell'architettura LAMP===&lt;br /&gt;
&lt;br /&gt;
Il servizio è realizzato in forma di ''web-based application'' poiché, come già illustrato nell'introduzione, si intende renderlo disponibile per il massimo numero di utenti possibili. Nella progettazione e realizzazione dell'architettura web si adotta la piattaforma ''LAMP'', il cui nome deriva dall'acronimo dei componenti open source che la realizzano (il sistema operativo Linux, il server HTTP Apache, il sistema per la gestione di database relazionali MySQL ed il linguaggio di programmazione PHP). Poichè il modello è composto da quattro livelli, spesso si parla anche di ''stack LAMP''. Uno degli elementi di forza del modello ''LAMP'' è che i componenti dei vari ''layer'' sono sostituibili, a seconda delle esigenze, con dei componenti più adatti, tipicamente open source ([0015], [0018], [0019]). Basando la piattaforma su un sistema operativo della famiglia di Microsoft Windows, ad esempio, si ottiene uno ''stack WAMP'', mentre se si usa un sistema operativo Mac OS si realizza uno ''stack MAMP''. Un'architettura web basata sul modello ''LAMP'' può, inoltre, essere integrata con software open source che offre utili funzionalità, come, ad esempio, il monitoraggio (''Nagios''), il load balancing (''Linux Virtual Server''), la rilevazione di accessi illeciti (''Snort'') e il security testing (''netsniff-ng''). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si valutano ora brevemente la diffusione dei componenti tradizionali dello ''stack LAMP'' e le alternative maggiormente usate per i vari ''layer''.&lt;br /&gt;
Le distribuzioni Linux risultano essere la scelta più comune per l'ultimo ''layer'' dello ''stack''. Secondo W3Techs, infatti, nell'ottobre del 2013, il 58.5% dei web server a livello globale avevano come sistema operativo la distribuzione Debian o Ubuntu, mentre il 37.3% una tra RHEL, Fedora e CentOS([0016]). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Tra i web server, Apache risulta essere maggiormente usato. Secondo le stime fatte da Netcraft, a giugno del 2014 circa il 51.9% del milione di siti web più trafficati al mondo usavano un web server Apache, il 19.2% nginx ed il 12.4% Microsoft ([0017]). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
I principali ''DBMS'' relazionali, oltre a MySQL, che possono essere presenti nello ''stack LAMP'' sono MariaDB e PostgreSQL, mentre tra i ''DBMS NoSQL'' MongoDB risulta essere il più comune. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Nello stack, infine, il ruolo di linguaggio di programmazione, solitamente svolto dal linguaggio PHP, spesso è ricoperto dai linguaggi Perl o Python. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva, ad ogni modo, che le informazioni sulla diffusione delle tecnologie non rappresentano un fattore vincolante nella scelta delle stesse, in quanto la piattaforma ''LAMP'' è anche aperta verso molti altri componenti oltre quelli citati; di conseguenza la scelta delle tecnologie da impiegare può essere effettuata basandosi principalmente sui requisiti e sulle specifiche del servizio. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Principi di progettazione per l'architettura===&lt;br /&gt;
&lt;br /&gt;
====Single Responsibility Principle====&lt;br /&gt;
&lt;br /&gt;
Per rendere il servizio maggiormente manutenibile ed estensibile, si presta particolare attenzione al rispetto del ''Single Responsibility Principle'' (''SRP'') ([0020]). Si cerca, quindi, di fattorizzare il software in più moduli, suddividendo tra questi le elaborazioni da svolgere. Un altro importante beneficio che si ottiene dalla fattorizzazione del codice è la riusabilità dei componenti. Ogni singolo modulo, infatti, svolge il proprio compito in maniera indipendente dal resto della applicazione ed è, quindi, riutilizzabile in altri scenari simili senza dover essere re-implementato. Inquadrando meglio questa metodologia di progettazione con i requisiti del servizio e la piattaforma web ''LAMP'', si individuano i due principali compiti a carico dell'applicazione:&lt;br /&gt;
* La gestione dell'interazione web con l'utente per la trasmissione del documento e dei nominativi da trattare&lt;br /&gt;
* Il processamento del documento per effettuare la &amp;quot;minimizzazione&amp;quot; dei dati.&lt;br /&gt;
Questi due differenti ''task'' saranno, quindi, portate a termine da componenti diversi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Progettando la struttura dell'applicazione in questo modo, si disaccoppia completamente la logica di business del servizio dalle interfacce web di comunicazione con l'utente. In un futuro sviluppo sarà possibile, quindi, realizzare nuove interfacce utilizzando altre tecnologie senza dover modificare la logica applicativa. &lt;br /&gt;
&lt;br /&gt;
====Dependency Inversion Principle====&lt;br /&gt;
&lt;br /&gt;
Un altro principio di design architetturale che risulta importante nella progettazione è il ''Dependency Inversion Principle'' (''DIP'') ([0038]). Esso si traduce nella realizzazione di componenti che non dipendono dalle specifiche implementazioni degli altri moduli del sistema, bensì dalle loro ''astrazioni''. &lt;br /&gt;
In relazione all'estensibilità e manutenibilità del prodotto software, infatti, l'impiego di moduli dipendenti direttamente dalla definizione dei metodi presenti in altri componenti risulta problematica: il modulo dipendente deve essere re-implementato ad ogni variazione del modulo da cui dipende.&lt;br /&gt;
Nella programmazione orientata agli oggetti, per rispettare questo principio, si su può fare uso di classi astratte o interfacce, costrutti che definiscono i moduli senza implementarli completamente o senza implementarli affatto.  &lt;br /&gt;
&lt;br /&gt;
===Stile architetturale REST=== &lt;br /&gt;
&lt;br /&gt;
Il modello architetturale del servizio che si sta definendo presenta una serie di caratteristiche, come ad esempio l'indipendenza dei moduli, che permettono di realizzarlo secondo il paradigma delle ''RESTful API''. L'espressione &amp;quot;Representational State Transfer&amp;quot; e il suo acronimo &amp;quot;REST&amp;quot; furono introdotti nel 2000 nella tesi di dottorato di Roy Fielding ([0021]), uno dei principali autori delle specifiche dell'Hypertext Transfer Protocol (HTTP). Roy Fielding descrive il ''Representational State Transfer'' come uno stile architetturale (&amp;quot;''architectural style''&amp;quot;), ovvero un'astrazione degli elementi di un'architettura all'interno di un sistema hypermedia distribuito. ''REST'' non specifica i dettagli dell'implementazione dei componenti e della sintassi del protocollo, ma definisce i ruoli dei componenti, i vincoli sulla loro modalità di interazione e la loro interpretazione.&lt;br /&gt;
Riassumiamo quindi i principi che deve rispettare una architettura ''REST'':&lt;br /&gt;
# Architettura Client-Server &amp;lt;br/&amp;gt;In una architettura ''REST'' viene data particolare importanza ai principi ''SRP'' e ''DIP'' prima citati, più generale si può affermare che l'architettura sposi il paradigma noto con il termine di &amp;quot;''Separation of Concerns''&amp;quot;. Una ''Restful API'' applica questi principi in un architettura Client-Server, capace di supportare l'evoluzione indipendente della logica lato client e della logica lato server.&lt;br /&gt;
# Stateless &amp;lt;br/&amp;gt;La comunicazione tra utente e fornitore del servizio deve essere senza stato, quindi ogni richiesta del client deve contenere tutte le informazioni di cui il fornitore necessita per l'erogazione del servizio offerto. Questa ipotesi viene fatta per rendere una ''Restful API'' facilmente scalabile orizzontalmente.&lt;br /&gt;
# Uso della cache &amp;lt;br/&amp;gt;In un Architettura ''REST'' i messaggi di risposta inviati dal server devono esplicitamente indicare se possono essere memorizzati nella cache del client o di componenti middleware per il riutilizzo nelle richieste successive.&lt;br /&gt;
# Interfaccia uniforme &amp;lt;br/&amp;gt;I componenti devono essere in grado di comunicare attraverso un'interfaccia uniforme e le risorse devono essere trasferite in un formato standard. Inoltre l'utente deve poter effettuare la navigazione tra le risorse di suo interesse tramite collegamenti ipertestuali. Per inciso, si osserva che il protocollo HTTP usato correttamente rispetta i requisiti di un architettura ''REST'' e che nelle implementazioni delle ''RESTful API'' il formato più usato per la modellazione dei dati è JSON.&lt;br /&gt;
# Layered System &amp;lt;br/&amp;gt;In un sistema a livelli, componenti intermedi (come i proxy) possono essere collocati tra client e server per intercettare il traffico per scopi specifici; ad esempio il caching o la sicurezza. Una soluzione basata su ''REST'' può essere composta da più livelli architettonici, indipendenti l'uno dall'altro.&lt;br /&gt;
# Code on Demand &amp;lt;br/&amp;gt;Questo vincolo facoltativo è inteso principalmente a consentire aggiornamenti alla logica all'interno dei client (come i browser Web) indipendentemente dalla logica lato server. Una ''single page application'', ad esempio, rispetta in pieno questo punto.&lt;br /&gt;
&lt;br /&gt;
Un'applicazione progettata sul modello dell'architettura ''REST'' ha quindi gli indiscutibili vantaggi di:&lt;br /&gt;
* consentire l'evoluzione indipendente delle diverse componenti &lt;br /&gt;
* avere un'interfaccia utente portabile con altri tipi di piattaforme&lt;br /&gt;
* permettere agevolmente la replicazione delle macchine server&lt;br /&gt;
* non vincolare moduli server e client a linguaggi e tecnologie specifiche.&lt;br /&gt;
&lt;br /&gt;
L'architettura del servizio oggetto di questa tesi si trova già perfettamente in linea con alcuni dei vincoli discussi, ma sono necessarie alcune considerazioni. Il punto 1 (&amp;quot;architettura Client-Server&amp;quot;) è chiaramente soddisfatto. &lt;br /&gt;
Il punto 2 (&amp;quot;Stateless&amp;quot;), direttamente collegato con i punti 3 e 5 (&amp;quot;Uso della cache&amp;quot;, &amp;quot;Layered System&amp;quot;), può essere rispettato con facilità; a ogni richiesta di &amp;quot;minimizzazione&amp;quot; del client corrisponde la restituzione del documento trattato dal server, non c'è quindi necessita di avere uno stato nell'interazione. &lt;br /&gt;
&lt;br /&gt;
Analizzando le caratteristiche di una applicazione stateless in relazione al principio ''privacy by design'' illustrato in precedenza, si osserva che l'assenza di stato determina la semplificazione delle problematiche critiche relative al principio. Non vengono conservate, infatti, informazioni contenenti dati sensibili, poiché dopo aver effettuato l'invio della risposta, sarà subito eliminato sul server il file elaborato.&lt;br /&gt;
&lt;br /&gt;
Nei capitoli precedenti tuttavia si è detto che l'utente può ripetere più volte il trattamento di uno stesso documento nella stessa sessione di interazione; essendo il vincolo dell'efficienza già difficile da rispettare per via dell'elaborazione onerosa del documento, si può progettare una modalità alternativa del funzionamento con stato del servizio, applicabile in assenza di replicazione delle macchine server e sfruttando le ripetute richieste di trattamento per uno stesso documento. &lt;br /&gt;
Si può infatti memorizzare lato server il documento inviato dal client inizialmente e, alle successive richieste di trattamento del medesimo documento, evitarne la ritrasmissione da client a server. Per rispettare il ''PbD'', al termine della sessione di interazione il documento verrà rimosso dal server. Si nota, inoltre, che per predisporre il servizio alla gestione delle due diverse modalità di funzionamento si può utilizzare un parametro di configurazione a livello applicativo.&lt;br /&gt;
I punti 4 e 6 infine (&amp;quot;Interfaccia uniforme&amp;quot;, &amp;quot;Code on Demand&amp;quot;) si possono rispettare utilizzando il formato JSON per la trasmissione dei documenti e dei nominativi, e usando localmente sul client Javascript per offrire tutte le funzionalità del servizio in un'unica pagina html.&lt;br /&gt;
&lt;br /&gt;
===Moduli software del servizio===&lt;br /&gt;
&lt;br /&gt;
====Scelta dei componenti software====&lt;br /&gt;
&lt;br /&gt;
Si opera ora la scelta delle tecnologie da utilizzare per i componenti dei 4 layer dello ''stack LAMP''. Per i due layer inferiori risulta piuttosto immediato decidere di usare le tecnologie presenti per default. Un sistema operativo Linux ed un web server Apache sono adatti all'architettura del servizio.&lt;br /&gt;
Inoltre anche il linguaggio di programmazione PHP può essere usato senza significativi problemi, anche se verranno fatte in seguito, in una sezione di questo capitolo, alcune considerazioni sulle problematiche di esecuzioni concorrenti di script PHP. Il linguaggio sarà impiegato in particolare per la realizzazione della logica necessaria a gestire l'interazione web con il cliente, mentre l'elaborazione del documento OOXML lato server sarà effettuata da un programma Java. &lt;br /&gt;
&lt;br /&gt;
I due ''task'' principali del servizio sono delegati, quindi, a due programmi distinti realizzati con tecnologie diverse. Si concretizza in questo modo il principio ''SRP'' e, sfruttando l'&amp;lt;i&amp;gt;openness&amp;lt;/i&amp;gt; della piattaforma LAMP, le funzionalità necessarie vengono realizzate attraverso i linguaggi più adatti.&lt;br /&gt;
La scelta del linguaggio Java per l'implementazione del ''main core'' della logica di business è dovuta alla libreria open source in ambiente java Docx4j ([40],[41]). Questa libreria è realizzata per il processamento delle tre tipologie di formati OOXML (''docx'', ''xslx'', ''pptx'') e permette tutte le possibili operazioni di creazione, lettura e modifica su questo tipo di documenti. Anche questa libreria sarà approfondita in sezioni successive. Si osserva, per inciso, che esistono altre librerie equivalenti in ambiente .NET. &lt;br /&gt;
&lt;br /&gt;
Nella scelta del linguaggio di programmazione usato per elaborare i documenti ed effettuare i confronti tramite ''regular expressions'', un dato non di poco conto da considerare è l'encoding delle stringhe. In Java, in particolare, una stringa è rappresentata internamente come un array di char, ognuno codificato da 2 byte in formato UTF-16 ([0042]); la codifica esprime in 16 bit tutti i caratteri definiti dallo standard Unicode, quindi è possibile scegliere Java.&lt;br /&gt;
&lt;br /&gt;
Per il ''layer'' della persistenza, infine, l'impiego di un database MySql risulta una buona scelta. Si osserva che questo livello non verrà utilizzato nella tradizionale maniera prevista dallo ''stack LAMP''. Infatti, generalmente, la base di dati viene interrogata direttamente dal componente che si occupa dell'interazione con l'utente (PHP) per il reperimento delle informazioni utili da restituire al client; nel servizio, invece, la base di dati sarà a supporto unicamente del programma Java, poiché gli unici dati persistenti da gestire sono i nomi del dizionario (si ricordi sempre il ''PbD'') e solo i moduli dell'eseguibile Java devono utilizzarli. Se il dizionario contenessero unicamente i nomi (senza informazioni accessorie correlate) e fossero usati in sola lettura, un semplice file di testo poteva essere sufficiente per la rappresentazione. Tuttavia, poiché saranno individuate tecniche di ottimizzazione nell'impiego dei dizionari che richiedono operazioni di scrittura e ordinamento dei dati, risulta opportuno usare un database relazionale.&lt;br /&gt;
&lt;br /&gt;
====Logica di business e dinamiche di interazione====&lt;br /&gt;
&lt;br /&gt;
Vengono presentati in questa sezione gli aspetti principali dei funzionamenti dei moduli del servizio. Per mettere bene a fuoco quali siano le meccaniche di interazione e i flussi di esecuzione dei programmi, si propone il diagramma di sequenza del tipico scenario di utilizzo. In questo schema UML si descrive il caso d'uso dove un utente, dopo aver inserito un documento ed averlo ricevuto &amp;quot;minimizzato&amp;quot;, esprime delle preferenze e richiede poi un secondo trattamento.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F00])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si descrivono quindi ora le principali operazioni che vengono eseguite.&lt;br /&gt;
All'avvio dell'interazione viene presentata una pagina PHP di benvenuto contenente le informazioni su come i dati personali vengano elaborati ed un ''file-picker'' per consentire l'upload di un documento ''OOXML''; nel momento in cui l'utente confermerà il caricamento del documento, esso verrà trasferito sul server. &lt;br /&gt;
Bisogna prestare particolare attenzione al comportamento del sistema nel caso in cui più utenti richiedano contemporaneamente l'esecuzione del servizio, e cioè alle problematiche di esecuzioni concorrenti di script PHP; è necessario, in particolare, evitare situazioni in cui i nomi dei file inviati dagli utenti siano in conflitto. Analizzando più in dettaglio il problema, ogniqualvolta un web server Apache riceve una richiesta HTTP per una pagina PHP, si ha la generazione di un nuovo processo che esegue il codice presentato nella pagina PHP richiesta. Supponendo quindi che N utenti eseguano l'invio del file contemporaneamente, si avrebbe che sul server N processi diversi dovrebbero procedere con la scrittura di un file. Ovviamente se due o più file condividono il nome almeno uno di essi sarà sovrascritto. Per risolvere questo problema, supponendo di voler salvare tutti i documenti in una cartella temporanea, occorre modificare il filename dei documenti inviati dagli utenti per esser certi di non incorrere in sovrascritture o altri tipi di errori correlati.&lt;br /&gt;
Una valida possibilità è l'inserimento di un ''prefisso'' univoco nel filename. Per la generazione di una stringa univoca da anteporre al filename, che permetta di distinguere file caricati da utenti diversi, si può direttamente usare il ''session id'' dell'utente. In PHP esso è determinato casualmente combinando ([0043]): l'IP del cliente, orario di attribuzione dell'id, un numero pseudo-casuale (con il ''PHP Linear Congruence Generator'') e, se presente un &amp;quot;''random source''&amp;quot; sul sistema operativo del Client (spesso chiamato impropriamente &amp;quot;''seme''&amp;quot;), un ulteriore numero pseudo-casuale.&lt;br /&gt;
Per introdurre ulteriore alea, necessaria se, ad esempio, un utente tenti l'upload di file omonimi (con contenuto interno diverso) e mantenga il medesimo ''session id'', si utilizza un ulteriore generatore pseudo-casuale per produrre un altro numero con cui comporre il prefisso.&lt;br /&gt;
Concatenando i due numeri generati si ha praticamente certezza di aver individuato un numero univoco nel sistema per il tempo in cui il servizio sarà erogato al cliente.&lt;br /&gt;
&lt;br /&gt;
Una volta memorizzato il file, lo script PHP dovrà ricorrere all'invocazione del modulo Java, delegato al vero e proprio processamento del documento. Occorre quindi individuare un set di opzioni che consenta al modulo che gestisce l'interazione con il cliente di sfruttare al meglio il componente delegato all'elaborazione del documento, in qualunque circostanza; la totale indipendenza dei moduli, la loro sostituibilità e la replicazione possibile di macchine server sono solo alcuni dei fattori che rendono mutevole la configurazione del sistema. Va definito un protocollo di comunicazione, quindi, che astragga completamente dall'implementazione dei moduli o dalla locazione dei file.&lt;br /&gt;
&lt;br /&gt;
Valutando i possibili flussi logici, anche con l'ausilio del diagramma di sequenza, si ha che i tipi di esecuzione sono due:&lt;br /&gt;
* &amp;quot;minimizzazione&amp;quot; con dizionario&lt;br /&gt;
* &amp;quot;minimizzazione&amp;quot; di specifici nominativi&lt;br /&gt;
Il protocollo di comunicazione tra i due moduli è costituito in entrambi i casi di una singola richiesta a cui segue una singola risposta. Più in particolare, lo script PHP invoca il comando Java esprimendo obbligatoriamente il path del file da trattare e opzionalmente l'elenco dei nominativi. A suo volta, il modulo Java restituisce i nominativi trovati, qualora non espressamente richiesti dallo script, e segnala la corretta terminazione dell'elaborazione.&lt;br /&gt;
Si definiscono come canali di comunicazione standard del protocollo gli argomenti presi in input dal modulo di processamento del documento e lo standard output del processo che esegue tale programma. Inoltre è importante definire un formato standard per la comunicazione dei nominativi tra moduli; è necessario quindi scegliere un pattern che permetta di determinare univocamente la composizione dei nominativi. Un possibile formato, espresso tramite ''regex'', è il seguente:&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt; &amp;lt;nominativo&amp;gt; = ^(&amp;lt;nome&amp;gt;:)*&amp;lt;nome&amp;gt;;&amp;lt;cognome&amp;gt;$&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt; &amp;lt;nominativi&amp;gt; = ^(&amp;lt;nominativo&amp;gt;\s+)+$&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Dove nome e cognome sono una sequenza di caratteri Unicode come già discusso. Ulteriori opzioni importanti da definire nel protocollo per l'invocazione del programma che si occupa delle funzionalità di elaborazione sono le seguenti:&lt;br /&gt;
* path file da elaborare (opzione &amp;quot;-i &amp;lt;file_path&amp;gt;&amp;quot;, obbligatoria)&lt;br /&gt;
* path con cui salvare il file elaborato (opzione &amp;quot;-o &amp;lt;file_path&amp;gt;&amp;quot;, opzionale: per default viene creato un nuovo file automaticamente)&lt;br /&gt;
* abilitazione stampe verbose, da usare solo in fase di debug (opzione &amp;quot;-d&amp;quot;, opzionale)&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Una volta terminato il processamento, il modulo di gestione dell'interazione con l'utente dovrà accertarsi che l'&amp;lt;i&amp;gt;exit status&amp;lt;/i&amp;gt; sia 0 e leggere dallo standard output del processo appena terminato, qualora si sia stata eseguita la &amp;quot;minimizzazione&amp;quot; con dizionario, l'elenco dei nominativi trovati. Se invece la &amp;quot;minimimizzazione&amp;quot; ha avuto luogo con i nominativi già specificati non sarà scritto nulla sullo standard output.&lt;br /&gt;
A margine si osserva che l'impiego dell'opzione &amp;quot;-d&amp;quot; deve sempre consentire una semplice individuazione dei nominativi trovati; in particolare, se tale opzione è specificata, nello standard output i nominativi compariranno con un ''header'' riconoscibile (&amp;quot;''NOMINATIVO=''&amp;quot;).&lt;br /&gt;
Ritornando alla descrizione del flusso di esecuzione tipo, una volta che il modulo Java ha completato il trattamento del documento, lo script PHP ne effettuerà l'upload sul client e presenterà all'utente le opzioni già descritte nel capitolo sull'usabilità. &lt;br /&gt;
A questo punto l'interazione con client potrebbe concludersi, qualora si eseguisse il download e si chiudesse il browser, o continuare elaborando i ''suggerimenti'' dell'utente espressi dopo il primo trattamento. Le modalità di comunicazione dei moduli varierebbero leggermente come appena illustrato, mentre, a seconda della configurazione stateful o stateless del servizio, verrebbe eseguito o meno un nuovo upload del file dal client al server.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si osserva infine che, per predisporre a successivi studi di ottimizzazione il servizio e per agevolare tutti i possibili sviluppi futuri, si applica largamente nella progettazione del modulo di elaborazione Java il ''Dependency Inversion Principle'', in quanto si desidera realizzare classi estendibili ed intercambiabili.&lt;br /&gt;
In particolare, si introducono delle classi astratte per rappresentare in maniera generica il concetto di &amp;quot;''persona''&amp;quot; e &amp;quot;''minimizzatore''&amp;quot;. È possibile infatti realizzare successivi studi per trattare ulteriori dati personali oltre che ai nomi e cognomi; inoltre, in base ai tipi di documenti trattati o eventuali altri fattori utili, è possibile studiare differenti tecniche di &amp;quot;minimizzazione&amp;quot; realizzate da differenti algoritmi &amp;quot;''minimizzatori''&amp;quot;.&lt;br /&gt;
In particolare una &amp;quot;''persona''&amp;quot; dovrà sempre esporre un metodo &amp;quot;''minimizza''&amp;quot; che prende in input una stringa, la &amp;quot;minimizza&amp;quot; e la restituisce; il pattern con il quale si effettua la &amp;quot;minimizzazione&amp;quot; sarà fornito in implementazione a seconda dei dati sensibili di interesse.&lt;br /&gt;
Un &amp;quot;''minimizzatore''&amp;quot; esporrà sempre un metodo &amp;quot;''work''&amp;quot; che, presa in input una lista di persone ed un documento ''OXML'', con l'ausilio della libreria Docx4j, fornirà in output un documento del tutto &amp;quot;minimizzato&amp;quot;; la definizione delle modalità con cui si estrapolano le informazioni dal documento e con cui si invoca il metodo &amp;quot;''minimizza''&amp;quot; della classe persona sono confinate nell'implementazione.&lt;br /&gt;
Definendo delle classi astratte risulta, quindi, più veloce la realizzazione dei futuri componenti e si svincola il processo di &amp;quot;minimizzazione&amp;quot; dal tipo di dati che si &amp;quot;minimizzano&amp;quot; e viceversa.&lt;br /&gt;
&lt;br /&gt;
====Le classi principali del progetto====&lt;br /&gt;
Le classi principali del progetto vengono quindi presentate in appendice. Esse sono:&lt;br /&gt;
* App.java, contenente il main&lt;br /&gt;
* Elaborator.java, che presenta il metodo &amp;quot;''work''&amp;quot;&lt;br /&gt;
* Persona.java, che presenta il metodo &amp;quot;''minimizza''&amp;quot;&lt;br /&gt;
* Testing.java, contenente alcune funzioni usate in fase di debug.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gli script in PHP sono stati forniti dall'azienda come implementazione minimale e provvisoria, da perfezionare a seguito della eventuale definizione sulle modalità di presentazione del servizio su Internet.&lt;br /&gt;
&lt;br /&gt;
Una considerazione di implementazione comune a tutte le classi deriva del principio ''Privacy by Design'', indifferentemente dalla modalità di configurazione stateful o stateless del servizio: è di fondamentale importanza che nel sistema non siano memorizzati permanentemente in alcun caso i documenti inviati dagli utenti del servizio. &lt;br /&gt;
Per realizzare un sistema robusto, per fronteggiare crash improvvisi del client o congestioni della rete, è opportuno impostare dei timeout lato server che procedano automaticamente alla eliminazione dei documenti degli utenti dopo un periodo di inattività troppo prolungato. Qualora invece si dovesse verificare un interruzione critica del servizio a causa di un errore logico del server o semplicemente per via di un'interruzione dell'alimentazione della macchina server, bisogna considerare altri metodi; essendo il servizio realizzato con un sistema operativo Linux, si può configurare il demone ''crond'' per eseguire a ogni reboot e, per sicurezza, una volta al giorno l'eliminazione dei file usati dall'applicazione tutti contenuti all'interno della cartella temporanea.&lt;br /&gt;
&lt;br /&gt;
==Approfondimenti tecnologici==&lt;br /&gt;
&lt;br /&gt;
===Analisi della struttura del formato OOXML===&lt;br /&gt;
&lt;br /&gt;
Come argomentato, il formato dei documenti elaborati dal servizio progettato dovrà essere ''Office Open XML'', o ''OOXML''; si tratta di un formato ''XML-based'' per documenti di testo, fogli elettronici e presentazioni, in grado di rappresentare grafici, diagrammi, immagini e altro materiale grafico. La specifica fu sviluppata da Microsoft e adottata dall'&amp;lt;i&amp;gt;ECMA International&amp;lt;/i&amp;gt; come standard ''ECMA-376'' nel 2006. Una seconda versione fu rilasciata nel 2008, una terza nel 2011, una quarta nel 2012 ed una quinta tra il 2015 ed il 2016 ([0010]). La specifica è stata adottata, inoltre dall'&amp;lt;i&amp;gt;ISO&amp;lt;/i&amp;gt; e dall'&amp;lt;i&amp;gt;IEC&amp;lt;/i&amp;gt; come standard ''ISO/IEC 29500'' a partire dal 2008 ([0011], [0012]).&lt;br /&gt;
&lt;br /&gt;
====Linguaggi di markup====&lt;br /&gt;
&lt;br /&gt;
Lo standard ''ECMA-376'' ([0010]) include tre differenti specifiche di linguaggio per ognuna delle tre principali categorie di documenti:&lt;br /&gt;
* ''WordprocessingML'' per i documenti testuali&lt;br /&gt;
* ''SpreadsheetML'' per i fogli elettronici&lt;br /&gt;
* ''PresentationML'' per le presentazioni elettroniche&lt;br /&gt;
* ''DrawingML'' ed altri linguaggi di markup di supporto per la rappresentazione di disegni, forme e diagrammi.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
La specifica include sia gli schemi ''XML'' sia i vincoli espressi per iscritto. Ogni documento conforme al formato dovrà, quindi, rispettare gli schemi ''XML'' e dovrà essere codificato in ''UTF-8'' o ''UTF-16''. La specifica, inoltre, permette l'aggiunta di ''custom tag XML'' a supporto dei linguaggi di markup dati, per default nel formato ''OOXML'', consentendo quindi la libera personalizzazione dei documenti.&lt;br /&gt;
&lt;br /&gt;
====File packaging====&lt;br /&gt;
&lt;br /&gt;
Oltre alla specifiche relative ai linguaggi di markup, la seconda parte dell'&amp;lt;i&amp;gt;ECMA-376&amp;lt;/i&amp;gt; ([0010]) definisce la struttura gerarchica dei file del formato adottando le ''Open Packaging Conventions'' (''OPC''). ''OPC'', una tecnologia ''file-container'' basata sul comune formato compresso ''zip'', che stabilisce che tutti i file che riguardano una stessa entità devono essere raggruppati in un unico package ([0014]). Un documento ''OOXML'' è, infatti, un archivio ''zip'' contenente alcuni files ''XML'' (detti anche ''parti'') organizzati in un singolo package. Questa frammentazione dei dati in più files rende più semplice e veloce l'accesso ai dati stessi e riduce le possibilità di una loro corruzione. Le ''parti'' possono contenere qualsiasi tipo di dato; per tenere traccia della relazione tra una ''parte'' e la sua tipologia di contenuto, senza basarsi sull'estensione del file, è presente nel package, nella cartella radice della gerarchia, il file denominato ''[Content_Types].xml'', il quale mappa appunto queste associazioni. È mostrata qui ad esempio l'associazione tra la ''parte'' rappresentante il documento principale e il suo ''ContentType''.&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Override PartName=&amp;quot;/word/document.xml&amp;quot; ContentType=&amp;quot;application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Le informazioni relative alle relazioni che ogni ''parte'' ha con le altre ''parti'', con risorse esterne e con il package in sé sono mantenute separatamente dal contenuto della ''parte'' stessa. Tali informazioni sono presenti, infatti, all'interno delle cartelle denominate ''_rels'': ne esiste una per il package nel suo complesso e una per ogni sotto-cartella del package contenente delle ''parti'' coinvolte in delle relazioni. In questo modo i riferimenti che una ''parte'' ha verso altre ''parti'' o risorse sono salvati una sola volta e possono essere aggiornati con semplicità se necessario, senza dover modificare il contenuto stesso delle ''parti'' coinvolte. È mostrato qui un esempio di relazione contenuta in ''_rels/.rels'' relativa al documento principale e al suo schema.&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Relationship Id=&amp;quot;rId1&amp;quot; Type=&amp;quot;http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument&amp;quot; Target=&amp;quot;word/document.xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Il documento principale, ossia il file ''word/document.xml'', ha inoltre numerose relazioni con altre ''parti'', come ad esempio ''word/styles.xml'' e ''word/footer.xml'', e risorse esterne collegate con degli URI. Per descrivere queste relazioni si usa la cartella ''word/_rels''.&lt;br /&gt;
&lt;br /&gt;
====Parti di un Documento OOXML====&lt;br /&gt;
&lt;br /&gt;
Vengono qui presentate le ''parti'' che sono caratteristiche esclusive di un ''WordprocessingML package'', non presenti quindi negli altri due formati ''OOXML''. È importante osservare che alcune di esse sono facoltative e sono presenti nel package solo se necessario.&lt;br /&gt;
&lt;br /&gt;
Le ''parti'' relative al vero e proprio contenuto testuale sono:&lt;br /&gt;
* ''Main Document'', contiene le informazioni principali ed è salvata come ''word/document.xml''&lt;br /&gt;
* ''Header'', contiene i dati relativi alle intestazioni ed è salvata in ''word/header.xml''. Ogni sezione del documento può avere intestazioni diverse per la prima pagina, per le pagine pari e per le dispari, quindi possono esserci molteplici ''parti header''&lt;br /&gt;
* ''Footer'', contiene le informazione relative al piè pagina ed è salvata in ''word/footer.xml''. Può essere presente più volte, per motivi analoghi alla ''parte header''&lt;br /&gt;
* ''Footnotes'', contiene le eventuali note a piè pagina del documento ed è salvata come ''word/footnotes.xml''&lt;br /&gt;
* ''Endnotes'', contiene le note di chiusura del documento ed è salvata in ''word/endnotes.xml''.&lt;br /&gt;
&lt;br /&gt;
Sono presenti poi delle ''parti'' relative allo stile e alle impostazioni del documento:&lt;br /&gt;
* ''Style Definitions'', contiene la definizione di un insieme di stili usati dal documento, salvata in ''word/styles.xml''&lt;br /&gt;
* ''Font Table'', contiene informazioni riguardo i font usati, salvata in ''word/fontTable.xml''&lt;br /&gt;
* ''Numbering Definitions'', contiene le definizioni sulla struttura delle liste contenute nel documento, salvata in ''word/numbering.xml''&lt;br /&gt;
* ''Document Settings'', specifica come il word processor debba trattare il documento (spell checking, gestione delle revisioni, etc.), contenuta in ''word/settings.xml''&lt;br /&gt;
* ''Web Settings'', contiene informazioni su come il documento debba essere convertito in ''HTML'' se richiesto, contenuta in ''word/webSettings.xml''.&lt;br /&gt;
&lt;br /&gt;
Sono presenti anche delle ''parti'' che rappresentano testo secondario:&lt;br /&gt;
* ''Comments'', contiene i commenti sul documento inseriti attraverso un word processor&lt;br /&gt;
* ''Glossary'', contiene dati testuali aggiuntivi secondari, ne è permessa una sola. Tutte le ''parti'' prima elencate, tranne il ''Main Document'', possono comparire una seconda volta in relazione alla ''parte glossary''.&lt;br /&gt;
&lt;br /&gt;
====Analisi del Main Document====&lt;br /&gt;
&lt;br /&gt;
Il file ''document.xml'', elemento principale di un documento ''WordprocessingML'', è costituito da due tipi di informazioni:&lt;br /&gt;
* ''properties'', che definiscono lo stile e la formattazione del testo&lt;br /&gt;
* ''stories'', che rappresentano il contenuto testuale delle varie parti del documento.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le ''properties'' verranno trattate in misura minore. Queste informazioni sono espresse attraverso una struttura XML gerarchica che ha come elemento radice il nodo ''document''. Esso ha due nodi figli:&lt;br /&gt;
* ''background'', che contiene alcune ''properties'' che descrivono lo sfondo del documento&lt;br /&gt;
* ''body'', che contiene tutti i rimanenti contenuti ed è potenzialmente molto complesso.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si osserva che per le finalità del trattamento dei dati risultano di primario interesse le ''stories'' e che è opportuno effettuare un'analisi ''bottom-up'' del problema: anziché considerare la gerarchia a partire dal ''body'' (nodo padre) partiremo dalla rappresentazione più semplice del testo contenuta nel documento (nodi figli).&lt;br /&gt;
&lt;br /&gt;
Facendo direttamente riferimento allo standard ''ECMA-376'' ([0010]),  si evince che l'unico nodo che contiene puro testo ha il nome ''t'' (''Text''). Questo elemento contiene una stringa rappresentante gli esatti caratteri che vengono poi mostrati negli editor a video. Il nodo ''Text'' non presenta figli e l'unico nodo padre che può avere è ''r'' (''Run''). Quest'altro nodo definisce una regione di testo con comuni proprietà (ad esempio l'uso del grassetto). Attraverso l'uso di tag ''t'' ed ''r'' quindi si rappresenta una regione di testo formattata con differenti elementi stilistici.&lt;br /&gt;
Occorre però evidenziare che un nodo ''r'' può presentare molti altri figli oltre a ''t'', come ad esempio immagini, in quanto rappresenta un'area generica del documento.&lt;br /&gt;
Si supponga quindi di avere due nodi ''Text'' fratelli, ossia figli dello stesso nodo ''r'': essi rappresenteranno semanticamente un unico blocco logico se e solo se compariranno a video come una sequenza di parole continua. Questo fenomeno è facilmente identificabile anche nel file ''XML'' descrittivo: due sequenze di parole mostrate a video adiacenti compaiono infatti nel file ''XML'' in due righe consecutive; se invece due parti di testo dovessero essere intervallate ad es. da un'immagine nel documento ''XML'' ci sarebbe un tag ''drawing'' a dividere i due tag ''t''. Dalla consecutività dei nodi ''Text'' nel file ''document.xml'' si può determinare quali siano i blocchi logici da trattare.&lt;br /&gt;
Un insieme di ''Run'' infine può essere figlio di diversi nodi, ma ciò non è di rilevante importanza, in quanto ogni area di testo individuata dal nodo ''Run'' rappresenta già un blocco logico a sé e, di conseguenza, contiene sufficienti informazioni per la &amp;quot;minimizzazione&amp;quot;.&lt;br /&gt;
L'unico caso di rilievo nel quale bisogna valutare quale sia la gerarchia a monte di un nodo ''Run'' è nell'elaborazione di una tabella. In tal caso, in realtà, occorre verificare opportunamente la strutturazione della gerarchia processata. Per chiarezza espositiva viene mostrata la rappresentazione in formato ''OOXML'' di una tabella con una riga e due colonne (senza l'uso di ''properties'' per la formattazione stilistica).&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;w:tbl&amp;gt;&lt;br /&gt;
  &amp;lt;w:tr&amp;gt;&lt;br /&gt;
    &amp;lt;w:tc&amp;gt;&lt;br /&gt;
      &amp;lt;w:p&amp;gt;&lt;br /&gt;
        &amp;lt;w:r&amp;gt;&lt;br /&gt;
          &amp;lt;w:t&amp;gt;Cella A&amp;lt;/w:t&amp;gt;&lt;br /&gt;
        &amp;lt;/w:r&amp;gt;&lt;br /&gt;
      &amp;lt;/w:p&amp;gt;&lt;br /&gt;
    &amp;lt;/w:tc&amp;gt;&lt;br /&gt;
    &amp;lt;w:tc&amp;gt;&lt;br /&gt;
      &amp;lt;w:p&amp;gt;&lt;br /&gt;
        &amp;lt;w:r&amp;gt;&lt;br /&gt;
          &amp;lt;w:t&amp;gt;Cella B&amp;lt;/w:t&amp;gt;&lt;br /&gt;
        &amp;lt;/w:r&amp;gt;&lt;br /&gt;
      &amp;lt;/w:p&amp;gt;&lt;br /&gt;
    &amp;lt;/w:tc&amp;gt;&lt;br /&gt;
  &amp;lt;/w:tr&amp;gt;&lt;br /&gt;
&amp;lt;/w:tbl&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Come si osserva in figura, in una tabella il nodo ''r'' sarà figlio del nodo ''p'' (''Paragraph''), il quale a sua volta sarà contenuto in un noto ''tc'' (''Table Cell''). Celle di una tabella appartenenti ad una stessa riga saranno presenti all'interno dello stesso ''tr'' (''Table Row'') ed infine tutte le righe della tabella saranno inserite del tag ''tbl'' (''Table'').&lt;br /&gt;
&lt;br /&gt;
Per determinare quindi se due nodi ''Text'' sono scritti in due colonne adiacenti di una stessa riga (e quindi costituiscono un unico blocco logico) è necessario verificare che per i due nodi ''Text'':&lt;br /&gt;
# il nodo &amp;quot;padre&amp;quot;  '''non sia''' in comune&lt;br /&gt;
# il nodo &amp;quot;padre di 2° livello&amp;quot; sia ''Paragraph'' e '''non sia''' in comune&lt;br /&gt;
# il nodo &amp;quot;padre di 3° livello&amp;quot; sia ''Table Cell'' e '''non sia''' in comune&lt;br /&gt;
# il nodo &amp;quot;padre di 4° livello&amp;quot; sia ''Table Row'' e '''sia''' in comune&lt;br /&gt;
# i nodi &amp;quot;padre di 3° livello&amp;quot; '''siano''' consecutivi.&lt;br /&gt;
Se tutte queste ipotesi sono soddisfatte, le due celle vanno &amp;quot;minimizzate&amp;quot; come unico blocco logico.&lt;br /&gt;
&lt;br /&gt;
Si valutano infine gli ultimi vincoli emersi nell'analisi sull'interpretazione della formattazione di un documento.&lt;br /&gt;
In particolare, descrivendo le parti che compongo un documento ''OOXML'', era già emerso che alcune sezioni di testo, ossia note a piè pagina ed intestazioni, compaiono in altri file ''XML'' e non in ''document.xml''. Questi file (''header.xml'', ''footer.xml'', ''endnotes.xml'', etc.) sono tutti raccolti in un package (&amp;quot;''word''&amp;quot;) e la grammatica ''XML'' è la stessa usata per il Main Document.&lt;br /&gt;
Si conclude osservando che il problema della divisione in sillabe delle parole non si pone, in quanto la divisione sillabica mostrata a video dai word-processors è calcolata dinamicamente; in particolare, su una porzione di testo viene applicata la sillabazione (ove necessario) se è presente tra le ''properties'' di quella regione di documento il tag ''hyphenationZone''.&lt;br /&gt;
&lt;br /&gt;
====La libreria in ambiente java open source Docx4j====&lt;br /&gt;
&lt;br /&gt;
La libreria Docx4j offre completo supporto alla manipolazione di documenti ''docx'' (compressione e decompressione archivio zip, generazione file ''XML'' necessari, etc.). Offre inoltre un'utile mappatura in specifici oggetti Java della gerarchia ''XML'' presente nei vari file del formato.&lt;br /&gt;
Uno tra gli elementi più interessanti è la tecnica con cui vengono recuperati i nodi dai file ''XML'', in quanto si fa impiego del linguaggio standard W3C ''XPath'' ([0044], [0045]). Con ''XPath'' è possibile esprimere con una stringa un sottoinsieme di nodi presenti in una gerarchia ''XML'' non solo in base al loro nome o valore, ma anche in relazione alla posizione reciproca rispetto agli altri nodi. Riferendoci alle problematiche del servizio risulta, ad esempio, significativamente agevolato il trattamento di dati personali in forma tabellare.&lt;br /&gt;
Si osserva infine che la libreria attribuisce un id univoco ad ogni nodo del documento, di conseguenza se ne può trarre vantaggio nei confronti tra i nodi.&lt;br /&gt;
&lt;br /&gt;
===Ottimizzazioni del processo di minimizzazione===&lt;br /&gt;
&lt;br /&gt;
Durante l'analisi dei requisiti è emerso che l'efficienza costituisce un aspetto problematico del servizio. Si ricorda di aver stimato la durata di una prestazione media di circa 145 secondi, considerando dati: &lt;br /&gt;
* un documento di medie dimensioni (10 pagine ~ 5000 parole) &lt;br /&gt;
* tempo medio di 10 ms per individuare le occorrenze di un nome&lt;br /&gt;
* un dizionario di circa 14.500 parole&lt;br /&gt;
&lt;br /&gt;
In linea di massima si individuano due generi di strategie che consentirebbero la riduzione del tempo medio di esecuzione: uno mirato a ridurre il più possibile il testo da sottoporre a &amp;quot;minimizzazione&amp;quot; automatica, l'altro a ottimizzare l'impiego del dizionario e dell'algoritmo di ricerca.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Come già spiegato, l'approccio di ricerca ''pattern-based'' è poco sensibile all'aumentare della lunghezza del documento, ma da questo valore ha una dipendenza non trascurabile.&lt;br /&gt;
&lt;br /&gt;
Nel documento è altamente probabile che ci siano interi periodi, se non pagine, dove non sia presente alcun nominativo. Anche all'interno di una frase che necessita di ''minimizzazione'' è plausibile che siano sono poche le coppie (al più le terne) di parole riconducibili ad una sequenza nome-cognome. È inessenziale che sezioni di testo che non necessitano di &amp;quot;minimizzazione&amp;quot; vengano processate. Si osserva per inciso che, ovviamente, questo ragionamento è corretto per via dell'indipendenza dal contesto di un approccio ''pattern-based''.&lt;br /&gt;
&lt;br /&gt;
Il pattern definito per la ricerca di un nominativo è molto restrittivo, in quanto accetta solo sequenze di parole costituenti un nominativo contenente un nome specifico; d'altronde la progettazione del pattern è stata effettuata mirando ad identificare il più accuratamente possibile le sequenze da anonimizzare.&lt;br /&gt;
&lt;br /&gt;
Analizzando attentamente il problema, si può fare il seguente ragionamento: per ridurre il più possibile il numero di parole da processare a ogni iterazione di ricerca del pattern di un nome, è possibile individuare preliminarmente tutte le sequenze di parole del documento che ''potrebbero essere'' dei nominativi e ''potrebbero'' fare match.&lt;br /&gt;
&lt;br /&gt;
L'operazione di &amp;quot;pre-filtraggio&amp;quot; si applica processando il documento con un ''pattern'' che presenta un'espressione più generale e permissiva delle ''regex'' definite per i nomi del dizionario. Si osserva che una qualunque successione di caratteri ''alfabetici'' iniziante con un carattere maiuscolo ''potrebbe'' rappresentare un nome. Per realizzare un espressione adatta si parte dalla definizione della ''regular expression'' già data ai nomi del dizionario:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;regex&amp;gt; := (&amp;lt;second_name&amp;gt;\s)?(&amp;lt;nome&amp;gt;)\s&amp;lt;cognome&amp;gt;|&amp;lt;cognome&amp;gt;\s(&amp;lt;nome&amp;gt;)(\s&amp;lt;second_name&amp;gt;)?&lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Nell'uso fatto finora di questa espressione, al tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nome&amp;gt;&amp;lt;/span&amp;gt; viene attributo, ciclio dopo ciclio, una parola del dizionario diversa. È possibile definire una variante più generale dell'espressione appena presentata:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;nome_pre&amp;gt; := [A-Z][a-zA-ZÀ-ÖØ-öø-ÿ&amp;lt;extra&amp;gt;]+&lt;br /&gt;
&lt;br /&gt;
&amp;lt;regex_pre&amp;gt; := (&amp;lt;second_name&amp;gt;\s)?(&amp;lt;nome_pre&amp;gt;)\s&amp;lt;cognome&amp;gt;|&amp;lt;cognome&amp;gt;\s(&amp;lt;nome_pre&amp;gt;)(\s&amp;lt;second_name&amp;gt;)?&lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Con questa ''regex'' si identifica una qualunque sequenza che rappresenta un nominativo, ma allo stesso tempo anche, ad esempio, tutte le parole consecutive inizianti con una maiuscola. È importante sottolineare che questo pattern presenta tutte le caratteristiche già ampiamente discusse sul formato delle ''regex'' per riconoscimenti automatici (gestione dei delimitatori, posizione relativa tra i nomi ed il cognome, etc.).&lt;br /&gt;
Il processamento di una ''regex'' generale inoltre sarà inevitabilmente più lento di quello di ''regex'' aventi i nomi specificati, in quanto molte più sequenze faranno match essendo l'espressione più permissiva. La mancanza di accuratezza va rapportata all'impiego della ''regular expression'': fornendo essa un semplice &amp;quot;pre-filtraggio&amp;quot; del documento non risulta necessario nè che individui esclusivamente nominativi nè che sia in grado di distinguerli gli uni dagli altri. Il leggero ritardo introdotto viene valutato sperimentalmente, applicando lo stesso l'algoritmo già usato in precedenza ed elaborando gli stessi documenti, sempre a parità di piattaforma.&lt;br /&gt;
&lt;br /&gt;
Partendo dall'elaborazione di un documento contenente 10 nominativi ed in totale 5.000 parole, si misura che tempo il processamento medio della ''regex'' di &amp;quot;pre-filtraggio&amp;quot; è di circa 36 ms; si ricorda che per lo stesso documento il tempo di esecuzione medio per il processamento di un nominativo non presente è di circa 9 ms, se le occorrenze salgono a 10, il tempo è in media di circa 10 ms.&lt;br /&gt;
Sebbene l'elaborazione di questa ''regex'' sia circa 4 volte più lenta dell'elaborazione di ''regex'' più specifiche, un ritardo introdotto dell'ordine dei millisecondi è trascurabile rispetto al tempo di processamento complessivo (stimato di circa 145 second).&lt;br /&gt;
Si osserva, per inciso, che nell'elaborazione di questo particolare documento sono stati individuati altre 21 sequenze che rispettavano il pattern che non costituivano dei nominativi. &lt;br /&gt;
&lt;br /&gt;
Terminata l'esecuzione dell'operazione di prefiltraggio, occorre sfruttare opportunamente le informazioni ottenute: in particolare, si possono elaborare con le ''regex'' dei nomi le sole sotto-stringhe che hanno fatto match con la ''regular expression'' nell'operazione preliminare. In altri termini, con questo metodo si effettua una sola elaborazione del testo completo e molteplici processamenti delle sotto-stringhe che ''potrebbero'' contenere nominativi. &lt;br /&gt;
Si osserva inoltre che, conoscendo con certezza gli indici di inizio e fine delle sotto-stringhe che ''potenzialmente'' contengono nominativi, è possibile &amp;quot;alleggerire&amp;quot; la ''regex'' associata ai nomi del dizionario: si possono rimuovere i costrutti ''lookahead'' e ''lookbehind'' in quanto la sotto-stringa è stata già rimossa dal contesto e quindi rappresenta esclusivamente i caratteri individuati dalla ''regular expression'' di &amp;quot;pre-filtraggio&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A questo punto occorre valutare sperimentalmente l'ottimizzazione ottenuta. Si misura che sono sufficienti 2 ms di elaborazione in media per nome, mentre, nel caso raro in cui tutti i 10 nominativi presenti si riconducano ad un unico nome, il tempo medio di esecuzione tende verso i 3 ms. Si osserva che questo è possibile perchè le parole nelle sotto-stringhe sono poco meno di 50, ossia si è ridotta di oltre il 99% la dimensione complessiva di dati da processare!&lt;br /&gt;
Valutando l'ottimizzazione complessiva in termini di tempo si ha che, processando un dizionario di circa 14.500 termini, sono necessari in media 29 secondi.&lt;br /&gt;
&lt;br /&gt;
Ovviamente questo dato è fortemente dipendente dal contenuto del documento. Vanno effettuate opportune misurazioni nel caso in cui la percentuale di nominativi presenti rispetto alle parole complessive nel documento sia maggiore. Si considera un documento di 5.000 parole contenente 200 sequenze riconosciute dall'algoritmo di &amp;quot;pre-filtraggio&amp;quot; delle quali 100 costituiscono dei nominativi. &lt;br /&gt;
Si misura che il tempo di esecuzione medio è di 6 ms nel caso generale del processamento di un nome con poche occorenze e tenderà verso i 10 ms nel caso sporadico in cui le occorrenze del nome saranno proprio 100 o poco meno. Il tempo di esecuzione del &amp;quot;pre-filtraggio&amp;quot; è di circa 48 ms. &lt;br /&gt;
Per inciso, si osserva che la ragione per cui il tempo necessario al &amp;quot;pre-filtraggio&amp;quot; non aumenta esageratamente è dovuta al pattern della ''regex''. La ''regular expression'' impiegata infatti, facendo principalmente uso di caratteri espressi in un range unitamente al quantificatore &amp;quot;+&amp;quot;, risulta particolarmente efficiente da elaborare.&lt;br /&gt;
Nel caso di documenti più &amp;quot;ricchi&amp;quot; di nomi si stima l'elaborazione media complessiva di circa 1 minuto e 27 secondi.&lt;br /&gt;
&lt;br /&gt;
Facendo il punto della situazione, si è ridotto di circa 5 volte il tempo di esecuzione complessivo nel caso di documenti &amp;quot;scarsamente popolati&amp;quot; da nominativi e quasi dimezzato il tempo necessario nell'elaborazione di documenti contenenti molte coppie nome-cognome. Occorre proseguire nello studio per migliorare l'ottimizzazione, considerando dove l'algoritmo di ricerca e l'impiego del dizionario possono essere migliorati.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Viene posta una semplice domanda sulle modalità di ricerca dei nominativi nell'insieme delle sotto-stringhe del documento: è computazionalmente equivalente prendere una ad una le sotto-stringhe e confrontarle con le ''regex'' dei nomi rispetto che prendere una ad una le ''regex'' dei nomi e confrontarle con le sotto-stringhe?&lt;br /&gt;
&lt;br /&gt;
Si fornisce una spiegazione formale alla domanda. &lt;br /&gt;
&lt;br /&gt;
Si definiscono due insiemi:&lt;br /&gt;
* A = {a_1, a_2, ... a_n}&lt;br /&gt;
* B = {b_1, b_2, ... b_m}&lt;br /&gt;
&lt;br /&gt;
Gli elementi dell'insieme A rappresentano le sotto-stringhe (cardinalità N), mentre gli elementi dell'insieme di B indicano le ''regex'' dei nomi (cardinalità M). È importante considerare che per il secondo insieme è definita una relazione di unicità che lega il valore degli elementi: per ogni ''b_i'' appartenente a B non esiste un indice ''j'', ''j'' compreso tra 1 ed M, tale che il testo del nodo ''i'' sia uguale al testo del nodo ''j'' (tranne se ''i'' = ''j''); in altre parole gli elementi rappresentanti le ''regex'' (''b_i'') per definizione sono posti univoci in B. &lt;br /&gt;
&lt;br /&gt;
Si presti attenzione al fatto che l'insieme delle sotto-stringhe presenta N elementi distinti tra loro in identità (&amp;quot;id nodo&amp;quot;), ma il cui contenuto testuale può essere equivalente a quello di altre sotto-stringhe. L'equivalenza tra due sotto-stringhe sussiste, in questo particolare contesto, qualora i contenuti testuali di entrambe facciano match con una stessa ''regex'' presente nell'insieme B. L'insieme delle ''regex'', invece, presentano elementi i cui valori testuali sono sempre univoci, in quanto ottenuti da nomi sempre diversi.&lt;br /&gt;
&lt;br /&gt;
Definiti gli insiemi si procede alla formulazione della risposta alla domanda precedente. Per chiarezza espositiva indicheremo con &amp;quot;A-&amp;gt;B&amp;quot; la procedura con cui si opera il confronto prendendo una ad una le sotto-stringhe per poi confrontarle con le ''regex'', mentre indicheremo con &amp;quot;B-&amp;gt;A&amp;quot; la procedura con cui si opera il confronto prendendo una ad una le ''regex'' dei nomi per poi confrontarle con le sotto-stringhe.&lt;br /&gt;
&lt;br /&gt;
Nel caso in cui l'insieme delle sotto-stringhe non contenga alcun nominativo, si ha una complessità computazionale equivalente per &amp;quot;A-&amp;gt;B&amp;quot; e per &amp;quot;B-&amp;gt;A&amp;quot;. Viene mostrato nei calcoli in figura che il numero di confronti necessari ''C_1'' è dato dal prodotto delle cardinalità degli insiemi, ossia ''C_1 = N · M''. &lt;br /&gt;
&lt;br /&gt;
(QUI FIG[0F07])&lt;br /&gt;
&lt;br /&gt;
Si suppone ora che il testo della sotto-stringa di posizione ''r'' faccia match con la ''regex'' in posizione ''k''; si applica &amp;quot;A-&amp;gt;B&amp;quot;. Come si mostra attraverso i calcoli in figura, il numero totale di confronti ''C_2'' sarà inferiore a ''C_1'' poichè, quando la sotta-stringa in posizione ''r'' risulta equivalente alla ''regex'' in posizione ''k'' si può direttamente passare alla valutazione della stringa in posizione ''r + 1'' e non svolgere i rimanenti ''m - k&amp;quot; confronti per la stringa in posizione ''r''. Si calcola che ''C_2 = k + m · (n -1)''.&lt;br /&gt;
&lt;br /&gt;
(QUI FIG[0F08])&lt;br /&gt;
&lt;br /&gt;
Supponendo sempre che il testo della sotto-stringa di posizione ''r'' faccia match con la ''regex'' in posizione ''k'', si applica &amp;quot;B-&amp;gt;A&amp;quot;. Similmente al caso precedente, quando la sotta-stringa in posizione ''r'' risulta equivalente alla ''regex'' in posizione ''k'' si può direttamente passare alla valutazione della ''regex'' in posizione ''k + 1'' e non svolgere i rimanenti ''n - r&amp;quot; confronti per la ''regex'' in posizione ''k''. Si osserva inoltre che è inutile confrontare le rimanenti ''m - k'' ''regex'' con la sottostringa di posizione ''r'': essa è risultata già equivalente ad una ''regex'' e, essendo le ''regex'' poste per definizione diverse tra loro, è di conseguenza impossibile che soddisfi un'altra uguaglianza.&lt;br /&gt;
Per inciso si osserva che nel calcolo di ''C_2'' un ragionamento di questo genere non è applicabile: ogni sotto-stringa può potenzialmente fare match con una qualsiasi ''regex''. &lt;br /&gt;
Il numero totale di confronti ''C_3'' viene calcolato come mostrato, si ottiene ''C_3 = k + m · (n -1) - n + r''.&lt;br /&gt;
&lt;br /&gt;
(QUI FIG[0F09])&lt;br /&gt;
&lt;br /&gt;
Si osserva che ''C_3 = C_2 - n + r'' e, essendo ''r'' la posizione della sotto-stringa coinvolta nel match, si ha che ''C_3'' è sempre minore di ''C_2'' qualunque sia la posizione della sotto-stringa. L'unico caso in cui ''C_3 = C_2'' si verifica quando la ''r = n'', ossia se la sotto-stringa è l'ultima dell'insieme.&lt;br /&gt;
&lt;br /&gt;
Per estendere il ragionamento, si prende la ''regex'' di posizione ''k'' e si indica con ''T'' il numero di sotto-stringhe che sono già risultate equivalenti ad una ''regex'' nelle elaborazioni precedenti. Risulta che, per il ragionamento spiegato nel calcolo di ''C_3'', potranno essere risparmiati almeno ''N - T'' confronti per la ''regex'' ''k'' e per ogni ''regex'' in posizioni successive. In generale, maggiore è il numero di nominativi nel documento, maggiore sarebbe l'ottimizzazione della procedura. &lt;br /&gt;
&lt;br /&gt;
Le conclusioni che si traggono sono due:&lt;br /&gt;
* indipendentemente dal numero o dalla posizione dei nominativi nelle sotto-stringhe, nell'algoritmo di minimizzazione è più efficiente prendere una ad una le ''regex'' dei nomi e con ognuna trattare l'insieme delle sotto-stringhe&lt;br /&gt;
* un efficace ordine di elaborazione delle ''regex'' può introdurre ottimizzazioni&lt;br /&gt;
&lt;br /&gt;
Va eseguita ora una valutazione sperimentale dei tempi di esecuzione del processo di &amp;quot;minimizzazione&amp;quot; tenendo conto di questi elementi. Le ''regex'' che fanno match con i nominativi presenti nel testo, quindi, vengono trattate tra le prime. Risulta di interesse principalmente valutare i miglioramenti ottenibili nel caso di documenti ''molto popolati'' da nominativi, poichè è questo il caso in cui l'ottimizzazione entra in gioco.&lt;br /&gt;
Si esegue il test sullo stesso documento trattato precedentemente con la sola tecnica di &amp;quot;pre-filtraggio&amp;quot;. Esso è composto da 5.000 parole, dal &amp;quot;pre-filtraggio&amp;quot; sono individuate 200 sotto-stringhe delle quali 100 costituiscono dei nominativi. &lt;br /&gt;
Nel test si è fatto riferimento a dati Istat ([0046]) per stabilire, quanto più realisticamente possibile, il miglior ordine di elaborazione delle ''regex'' associate ai nomi; risulta che circa il 25% dei nominativi è individuato entro i primi 15 cicli di esecuzione; circa il 35% entro i primi 50 ed il 100% entro circa i primi 3000. Per inciso, si osserva che un altro documento può dare origine a tempi significativamente peggiori qualora presenti molti nominativi con nomi desueti e presenti in fondo al dizionario. &lt;br /&gt;
Si misura che, dopo il &amp;quot;transitorio iniziale&amp;quot; (ossia dalla 51° ''regex'' in poi), il tempo medio è di 5 ms per l'elaborazione di una ''regex''. Si osserva che, una volta che sono state elaborate circa le prime 3000 ''regex'', il tempo medio di elaborazione di una ''regex'' scende a 4 ms. Per completezza, si riporta anche il tempo medio per la fase di &amp;quot;transitorio iniziale&amp;quot;, che si misura di circa 8 ms; il tempo di &amp;quot;pre-filtraggio&amp;quot;, già precedentemente calcolato, risulta di 48 ms.&lt;br /&gt;
Calcolando complessivamente la durata del processamento si ottiene che l'elaborazione media complessiva è di circa 61 secondi, si ottiene quindi una riduzione significativa rispetto al tempo di 1 minuto e 27 prima individuato.&lt;br /&gt;
&lt;br /&gt;
Si considerano, in relazione alle conclusioni della discussione teorica prima formalizzata, le implicazioni realizzative: in primis che l'imposizione del verso con cui eseguire la &amp;quot;minimizzazione&amp;quot; non determina particolari problemi implementativi, in secundis che l'ordinamento efficiente dei nomi del dizionario può essere trattato attraverso una tecnica di ''machine learning''.&lt;br /&gt;
&lt;br /&gt;
La tecnica di apprendimento che si realizza si basa sull'estrapolazione di informazioni utili nei documenti inviati dagli utenti. Si tiene traccia, infatti, della ''frequenza'' con cui un nome appare in diversi processamenti. Alla fine di ogni &amp;quot;minimizzazione&amp;quot;, dopo aver concluso il salvataggio del nuovo file ''OOXML'', il programma Java eseguira l'update sul database MySql delle frequenze dei nomi trovate, incrementandole.&lt;br /&gt;
Nell'interrogazione al database per l'ottenimento dell'insieme dei nomi, di conseguenza, si richiederà l'ordinamento per frequenza delle tuple restituite. In questo modo, più volte un nome compare nei documenti, più incrementi riceverà il suo campo frequenza, più avrà la probabilità di comparire in cima al dizionario.&lt;br /&gt;
Si progetta inoltre l'inserimento di un campo &amp;quot;ultimo utilizzo&amp;quot;, associato ai nomi sul database, che permette di avere un secondo criterio di ordinamento utile. Tale campo viene impiegato anche per evitare una crescita esagerata del valore della frequenza; periodicamente, con ''crond'' ad esempio, si decrementano i valori del campo &amp;quot;frequenza&amp;quot; dei nomi il cui &amp;quot;ultimo utilizzo&amp;quot; è troppo vecchio. Si osserva che i valori di configurazione per la gestione di queste elementi dipendono dal carico medio del sistema, noto solo dopo la progettazione, andranno valutati con precisione in fasi future. Ovviamente l'aggiornamento del campo &amp;quot;ultimo utilizzo&amp;quot; sarà contestuale all'aggiornamento della ''frequenza''. &lt;br /&gt;
Si osserva, per inciso, che l'impiego di un dizionario di cognomi sarebbe stato problematico per l'aggiornamento delle frequenze. Per via del principio ''Privacy by Design'', infatti, aggiornando la frequenza per la entry del cognome di una persona, indirettamente si sarebbe tenuto traccia di un dato sensibile, specialmente nel caso in cui il cognome risulti &amp;quot;raro&amp;quot;. &lt;br /&gt;
Una valutazione rilevante da fare è sulle implicazioni relative agli accessi concorrenti al dizionario, dovute all'introduzione dell'algoritmo appena spiegato, che esegue scrittura di &amp;quot;frequenza&amp;quot; e ''ultimo utilizzo'' sul database. Si osserva che non sono problematiche le &amp;quot;letture sporche&amp;quot;, poichè, se si verificano, al più risulta alterato l'ordine di qualche nome; inoltre nemmeno un &amp;quot;lost update&amp;quot; risulta eccessivamente problematico, poichè l'ultimo utilizzo risulta sempre aggiornato e la perdita di un incremento delle frequenza di un nome non rappresenta in linea di massima un problema. Questi scenari presentati vanno valutati complessivamente, però, una volta che si realizza il reale carico del sistema: perdere molti update risulta critico per l'ottimizzazione del processamento. Conviene in linea precauzionale prevedere una semantica transazionale per l'interazione tra modulo Java e database. Per inciso, eseguire l'update finale con una transazione non influenza il tempo di attesa dell'utente, poichè il documento è stato già elaborato per intero. &lt;br /&gt;
&lt;br /&gt;
Si fa infine un'ultima osservazione che consente di abbattere i tempi di attesa enormemente, a costo di perdere dell'accuratezza nel processamento automatico: ridurre il numero di nomi del dizionario processato, elaborando solo quelli in cima. &lt;br /&gt;
Si osserva che questa soluzione è ancor più efficace se i nomi contenuti nel documento sono pochi. In questo caso, infatti, il processamento dei nomi durante la fase di &amp;quot;transitorio iniziale&amp;quot; richiede lo stesso tempo del processamento di nomi &amp;quot;a regime&amp;quot;, ossia dopo l'avvenuta riduzione del numero di sotto-stringhe da elaborare. Nei documenti &amp;quot;ricchi&amp;quot; di nominativi, come già spiegato, ciò non avviene.&lt;br /&gt;
Per concludere, si usano i risultati dei test sperimentali precedentemente misurati per stimare il tempo di processamento complessivo, supponendo di:&lt;br /&gt;
* applicare la tecnica di &amp;quot;pre-filtraggio&amp;quot;&lt;br /&gt;
* usare i primi 1.500 nomi di un dizionario ordinato per frequenza&lt;br /&gt;
&lt;br /&gt;
Caso A:&lt;br /&gt;
* documento contenente 10 nominativi ed un totale di 5.000 parole&lt;br /&gt;
* processamento medio della ''regex'' di &amp;quot;pre-filtraggio&amp;quot; di circa 36 ms&lt;br /&gt;
* individuazione di 31 sotto-stringhe totali&lt;br /&gt;
* durata elaborazione in media per nome di circa 2 ms&lt;br /&gt;
&lt;br /&gt;
Durata esecuzione senza troncamento: 29 secondi circa&lt;br /&gt;
Durata esecuzione con troncamento: 3 secondi circa&lt;br /&gt;
&lt;br /&gt;
Caso B:&lt;br /&gt;
* documento contenente 100 nominativi ed un totale di 5.000 parole&lt;br /&gt;
* processamento medio della ''regex'' di &amp;quot;pre-filtraggio&amp;quot; di circa 48 ms&lt;br /&gt;
* individuazione di 200 sotto-stringhe totali&lt;br /&gt;
* durata elaborazione in media per nome di circa 8 ms per prime 50 iterazioni&lt;br /&gt;
* durata elaborazione in media per nome di circa 5 ms per successive&lt;br /&gt;
&lt;br /&gt;
Durata esecuzione con solo &amp;quot;pre-filtraggio&amp;quot; : 1 minuto e 27 secondi&lt;br /&gt;
Durata esecuzione senza troncamento: 61 secondi circa&lt;br /&gt;
Durata esecuzione con troncamento: 7.7 secondi circa&lt;br /&gt;
&lt;br /&gt;
I tempi a cui si giunge risultano soddisfacenti in entrambi i casi. Si prevede di lasciare all'utente la possibilità di scegliere di ricevere un servizio o più veloce o più accurato, in base alle sue esigenze.&lt;br /&gt;
&lt;br /&gt;
===Tecnologie complementari===&lt;br /&gt;
&lt;br /&gt;
La redazione di questa tesi è avvenuta su Mediawiki, la più importante fra le piattaforme wiki essendo il motore di Wikipedia.&lt;br /&gt;
&lt;br /&gt;
Le piattaforme wiki sono riconosciute come elemento caratterizzante dell’evoluzione Internet al Web 2.0, cioè al web nel quale gli utenti-navigatori, fino ad allora &amp;quot;''consumatori&amp;quot;'' (&amp;quot;''consumers&amp;quot;'') di contenuti si sono trasformati essi stessi in &amp;quot;''produttori&amp;quot;'' (&amp;quot;''producers&amp;quot;''), e cioè in &amp;quot;''prosumers&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
Un ''wiki'' è fondamentalmente un sito web che contiene informazioni e che consente agli utenti di editare facilmente il suo contenuto.&lt;br /&gt;
&lt;br /&gt;
Nel redigere una pagina wiki si utilizza ciò che è chiamato ''wikitext&amp;quot; per definire capitoli, paragrafi, hyperlinks, elementi di formattazione della pagina, etc.; sebbene il ''wikitext&amp;quot; risulti non difficile da apprendere, quasi ogni piattaforma wiki è corredata da editor di tipo visuale, che non richiede alcuna conoscenza della sintassi del ''wikitext&amp;quot;; tuttavia è esperienza comune che utilizzare direttamente il ''wikitext&amp;quot; induce a concentrarsi maggiormente sui contenuti e non sulla formattazione. Il linguaggio ''wikitext'' è strettamente correlato con il linguaggio HTML, infatti nella scrittura è possibile utilizzare tag come h1, span, div e così via, oltre che la sintassi esclusiva di ''wikitext''; simmetricamente una pagina prodotta da media wiki è costituita da HTML ben formato e direttamente importabile in ogni word processor. &lt;br /&gt;
&lt;br /&gt;
I wiki presentano una funzionalità di grande utilità nella redazione di documenti articolati: la tracciatura delle successive revisioni (&amp;quot;''Cronologia&amp;quot;''). La possibilità di ripercorrere l’evoluzione del testo è davvero d’aiuto quando si fissano idee originali in uno scritto, cercando di definirle, precisarle, chiarirle, come è avvenuto in effetti, anche nella redazione di questa tesi. Per curiosità, si segnala che, pur avendo redatto la maggior parte del testo off-line, la pagina wiki di questa tesi conta oltre 50 revisioni.&lt;br /&gt;
&lt;br /&gt;
Per inciso, si osserva che è stata molto utile la funzionalità di &amp;quot;ricerca nel codice&amp;quot; offerta dalla piattaforma di revisione online GitHub nella corretta comprensione della libreria Docx4j, il cui codice sorgente è ivi rilasciato. &lt;br /&gt;
&lt;br /&gt;
Si conclude infine dicendo che per ottimizzare le procedure di debug del codice sono stati realizzati utili tool a riga di comando per Linux per la rapida estrazione-modifica-ricompattazione di documenti ''OOXML''. Si propone in appendice un comando bash per questi scopi.&lt;br /&gt;
&lt;br /&gt;
==Sviluppi futuri==&lt;br /&gt;
&lt;br /&gt;
In questa sezione si fa cenno, senza poterle approfondire, ad alcune interessanti questioni emerse nello svolgimento della tesi.&lt;br /&gt;
&lt;br /&gt;
===Accesso al servizio web===&lt;br /&gt;
&lt;br /&gt;
In fase iniziale, il servizio web potrà essere reso accessibile in forma completamente aperta, senza richiedere cioè la registrazione dell’utente o l’autenticazione dell’utente già registrato. In questo modo, in effetti, si premia la facilità d’uso, ma si incorre nella nota problematica di un uso malevolo, costituito da accessi a raffica, finalizzati a saturare il server e generare una condizione di ''DoS – Denial of Service''. Diverse sono le tecniche che possono essere adottate per contrastare questo tipo di accessi malevoli, come richiedere di superare &amp;quot;''captcha''&amp;quot; e/o introdurre ritardi crescenti ed eventualmente blocchi in risposta ad accessi prevenienti con alta frequenza dallo stesso indirizzo IP.&lt;br /&gt;
È possibile anche pensare ad un accesso previa registrazione ed autenticazione dell’utente, penalizzando l’immediatezza di utilizzo del servizio, ma eventualmente ottenendo l’indirizzo email degli utenti che acconsentono a lasciarlo per successive finalità marketing.&lt;br /&gt;
È possibile, infine, un utilizzo misto, contando in un cookie il numero di accessi eseguiti e richiedendo all’utente di registrarsi per continuare ad utilizzare il servizio, dopo qualche accesso.&lt;br /&gt;
&lt;br /&gt;
===Ampliamento dinamico del dizionario===&lt;br /&gt;
&lt;br /&gt;
Nel restituire il documento elaborato all'utente, gli si da la possibilità di richiedere una nuova elaborazione, dopo aver indicato i nominativi che fossero sfuggiti; pare inesauribile, infatti, la &amp;quot;fantasia&amp;quot; dei genitori nel dare nome ai propri figlioli!&lt;br /&gt;
I nominativi indicati dall'utente sono sfuggiti al servizio perché non presenti nel dizionario: facilmente viene in mente l’idea di arricchire il dizionario con i nominativi indicati dall’utente. Va però considerato il caso che l’utente in malafede indichi nominativi fasulli al fine di inquinare il dizionario.&lt;br /&gt;
Il caso malevolo può essere affrontato attraverso una strategia che preveda non direttamente l'inserimento del nuovo nominativo nel dizionario, ma invece l'utilizzo di un concetto di &amp;quot;candidatura&amp;quot;: il nuovo nominativo viene registrato, ma si attende di avere un certo numero di utenti che lo propongono prima di approvarne l'inserimento nel dizionario.&lt;br /&gt;
Può anche essere utilizzato un concetto di &amp;quot;attendibilità&amp;quot; della candidatura di un nuovo nominativo, verificando ad esempio l'utente che lo propone scarichi effettivamente il file rielaborato.&lt;br /&gt;
Nel caso l'accesso avvenga con autenticazione, e cioè identificando gli utenti, si apre la possibilità di individuare e bannare gli utenti malevoli.&lt;br /&gt;
&lt;br /&gt;
===Natura del documento e ricorrenza del nominativo===&lt;br /&gt;
&lt;br /&gt;
Si coglie facilmente la differenza di formato fra un documento in forma di elenco (es. una graduatoria) da un documento in forma di relazione (es. una sentenza giudiziaria). Differenze di questo tipo potrebbero essere utilizzate per escludere o ammettere la ripetizione dei nominativi.&lt;br /&gt;
Per meglio dire: in un elenco la ripetizione di un nominativo è di fatto da escludersi o va trattata come omonimia. In una relazione, l’individuazione di un nominativo può essere utilizzata per ricercarlo direttamente in altri punti del documento stesso.&lt;br /&gt;
&lt;br /&gt;
===Altri dati personali===&lt;br /&gt;
&lt;br /&gt;
Altri dati personali sono trattabili con le stesse tecniche analizzate in questa tesi: date e luoghi di nascita, codici fiscali, indirizzi, email, numeri di telefono, sesso etc. In qualche caso, come per i codici fiscali, l’individuazione del pattern da trattare è persino più semplice.&lt;br /&gt;
Diversi studi ([0039]) hanno dimostrato che, utilizzando set di dati personali parziali, è possibile la re-identificazione dei soggetti, pur in documenti pseudonimizzati. È questo un altro motivo per estendere i trattamenti descritti anche agli altri dati personali richiamati.&lt;br /&gt;
&lt;br /&gt;
===Altri alfabeti===&lt;br /&gt;
&lt;br /&gt;
È possibile estendere il sotto-insieme di caratteri Unicode utilizzati nelle ''regex'' per elaborare documenti scritti in altri alfabeti non latini.&lt;br /&gt;
&lt;br /&gt;
==Conclusioni==&lt;br /&gt;
&lt;br /&gt;
Questa tesi è partita da un problema basilare, quasi scolastico, dell'informatica: la ricerca di un testo in un documento, al fine della sua cancellazione o modifica.&lt;br /&gt;
&lt;br /&gt;
Il problema si è subito discostato dalla sua formulazione basilare, principalmente perché, nei casi d'uso, il documento da ricercare non è un semplice testo (&amp;quot;''plain text''&amp;quot;) ma invece è il prodotto di un ''word-processor'': quindi è costituito da una struttura XML più o meno complessa, rappresentante formattazioni, riferimenti interni o esterni, note, etc. La ricerca deve avvenire nei soli nodi di puro testo, individuando ed escludendo dall'analisi lessicale gli elementi testuali di mark-up che non costituiscono contenuto informativo. Nell'approfondire le strutture ed i concetti XML ho potuto notare quanto essi siano ricorrenti in molti ambiti dell'informatica.&lt;br /&gt;
&lt;br /&gt;
Nell'analisi delle specifiche, un'altra complicazione si è presto aggiunta: l'usabilità del servizio cresce drasticamente se si evita di chiedere all'utente, come si era pensato in un primo tempo di fare, quali siano le stringhe (i nominativi) da ricercare e trattare; è nata allora l'idea di reperire queste stringhe in un dizionario di nomi ed in un dizionario di cognomi, considerando anche le permutazioni dei lemmi reperiti. Ho così dovuto approfondire alcuni problemi tipici dei dizionari, come il loro ampliamento automatico con tecniche oggi comprese nel ''machine-learning''. Non ho potuto &amp;quot;resistere&amp;quot; alla tentazione di ''formalizzare la matematica'' in base alla quale ho costruito le strategie di ricerca.&lt;br /&gt;
&lt;br /&gt;
Spunto per la tesi è stata la recente legislazione in materia di dati personali, il GDPR. Esaminandone gli articoli pertinenti, ho maturato una riflessione generale: sempre più il software dovrà essere progettato e realizzato anche alla luce di altre discipline, non solo di quelle informatiche, come le discipline giuridiche ed il diritto.&lt;br /&gt;
&lt;br /&gt;
Durante la fase iniziale della collaborazione con l'azienda mi sono dedicato alla messa a punto delle specifiche; ciò mi ha permesso di comprendere quanto questa fase sia importante e come completezza e precisione delle specifiche siano alla base di un progetto efficace.&lt;br /&gt;
&lt;br /&gt;
Molto importanti sono state la analisi relative al tipo e formato dei documenti da assumere come input ed alla presentazione ottimale del servizio rispetto all'usabilità. &lt;br /&gt;
&lt;br /&gt;
Centrale nel lavoro ed avvincente è stata la definizione della strategia per il riconoscimento dei lessemi attraverso la costruzione dinamica di ''regex'' idonee. In questo fase del lavoro, anche per passione personale, ho approfondito le questioni del riconoscimento &amp;quot;di testi nei testi&amp;quot; che legano, fin dalle origini, l'informatica e la linguistica.&lt;br /&gt;
&lt;br /&gt;
La fase di definizione dell'architettura del servizio mi ha permesso di ripercorrere molte le materie studiate nei tre anni del Corso di Ingegneria Informatica, affrontando argomenti  come il Single Responsibility Principle, il Dependency Inversion Principle, lo &amp;quot;stile&amp;quot; architetturale REST. Molto istruttiva è stata anche la riflessione sulla scomposizione del servizio in moduli software.&lt;br /&gt;
&lt;br /&gt;
Come sempre accade nell'affrontare un progetto nuovo, sono nate molte nuove idee; ho così immaginato numerosi sviluppi futuri, sia a perfezionamento funzionale dell'accesso web al servizio, sia ad estensione delle specifiche per coprire casi applicativi contigui (es. quando il dato che si vuole trattare è un codice fiscale). Dovendo necessariamente tener presente che questo lavoro è una tesi, verificherò con il supporto del mio relatore come poterne proseguire lo sviluppo.&lt;br /&gt;
&lt;br /&gt;
==Bibliografia==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0000]https://en.wikipedia.org/wiki/Comparison_of_Office_Open_XML_software&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0001]https://en.wikipedia.org/wiki/Comparison_of_OpenDocument_software&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0002]https://en.wikipedia.org/wiki/Standardization_of_Office_Open_XML&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0003]https://en.wikipedia.org/wiki/OpenDocument_standardization&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0004]https://support.apple.com/en-us/HT202227&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0005]https://en.wikipedia.org/wiki/Pages_(word_processor)&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0006]https://en.wikipedia.org/wiki/Comparison_of_word_processors&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0007]https://en.wikipedia.org/wiki/OpenDocument&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0008]https://en.wikipedia.org/wiki/Office_Open_XML_file_formats&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0009]https://en.wikipedia.org/wiki/Rich_Text_Format&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0010]https://www.ecma-international.org/publications/standards/Ecma-376.htm&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0011]https://www.iso.org/standard/51463.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0012]https://www.iso.org/standard/71691.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0013]https://en.wikipedia.org/wiki/Office_Open_XML&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0014]https://en.wikipedia.org/wiki/Open_Packaging_Conventions&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0015]https://en.wikipedia.org/wiki/LAMP_(software_bundle)&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0016]https://w3techs.com/blog/entry/debian_ubuntu_extend_the_dominance_in_the_linux_web_server_market_at_the_expense_of_red_hat_centos&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0017]https://news.netcraft.com/archives/2014/06/06/june-2014-web-server-survey.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0018]https://whatis.techtarget.com/definition/LAMP-Linux-Apache-MySQL-PHP&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0019]https://www.ibm.com/cloud/learn/lamp-stack-explained&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0020]https://en.wikipedia.org/wiki/Single_responsibility_principle&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0021]https://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0022]https://en.wikipedia.org/wiki/Latin_script_in_Unicode&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0023]https://it.wikipedia.org/wiki/ISO/IEC_8859-1&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0024]http://www.treccani.it/enciclopedia/uso-delle-maiuscole_%28La-grammatica-italiana%29/&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0025]https://en.wikipedia.org/wiki/Ambiguity#Linguistic_forms&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0026]Steven L. Small; Garrison W Cottrell; Michael K Tanenhaus (22 October 2013). Lexical Ambiguity Resolution: Perspective from Psycholinguistics, Neuropsychology and Artificial Intelligence. Elsevier Science. ISBN 978-0-08-051013-2.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0027]http://www.treccani.it/vocabolario/disambiguazione/&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0028]R. Navigli, K. Litkowski, O. Hargraves. 2007. SemEval-2007 Task 07: Coarse-Grained English All-Words Task. Proc. of Semeval-2007 Workshop (SemEval), in the 45th Annual Meeting of the Association for Computational Linguistics (ACL 2007), Prague, Czech Republic, pp. 30–35 http://www.aclweb.org/anthology/S/S07/S07-1006.pdf&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0029]https://wordnet.princeton.edu/&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0030]R. Navigli, S. P. Ponzetto. BabelNet: Building a Very Large Multilingual Semantic Network. Proc. of the 48th Annual Meeting of the Association for Computational Linguistics (ACL 2010), Uppsala, Sweden, July 11-16, 2010, pp. 216-225. http://aclweb.org/anthology/P/P10/P10-1023.pdf&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0031]Roventini A., Alonge A., Calzolari N., Magnini B., Bertagna F. (2000), &amp;quot;ItalWordNet: a Large Semantic Database for Italian&amp;quot;, Proc. of the 2nd International Conference on Language Resources and Evaluation (LREC 2000), Athens, Greece, 2000, pp. 783-790.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0032]E. Pianta, L. Bentivogli, C. Girardi. MultiWordNet: developing an aligned multilingual database, Proc. of the First International Conference on Global WordNet, Mysore, India, January 21-25, 2002. http://multiwordnet.fbk.eu/paper/MWN-India-published.pdf&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0033]https://www.iso.org/standard/28245.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0034]https://www.gpdp.it/web/guest/regolamentoue&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0035]https://eur-lex.europa.eu/legal-content/IT/TXT/?uri=uriserv:OJ.L_.2016.119.01.0001.01.ITA&amp;amp;toc=OJ:L:2016:119:TOC&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0036]https://www.corriere.it/Primo_Piano/Cronache/2006/09_Settembre/15/cognomi.shtml&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0037]https://data.world/axtscz/italian-first-names&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0038]https://en.wikipedia.org/wiki/Dependency_inversion_principle&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0039]https://imperialcollegelondon.app.box.com/s/lqqcugie51pllz26uixjvx0uio8qxgo5/file/493461282808&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0040https://www.docx4java.org/trac/docx4j]&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0041]https://github.com/plutext/docx4j&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0042]https://docs.oracle.com/javase/9/docs/api/java/lang/String.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0043]https://github.com/php/php-src/blob/master/ext/session/session.c&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0044]https://github.com/plutext/docx4j/search?q=getJAXBNodesViaXPath+in%3Afile&amp;amp;type=Code&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0045]https://www.w3.org/TR/xpath-30/&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0046]https://www.istat.it/it/dati-analisi-e-prodotti/contenuti-interattivi/contanomi&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0047]&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0048]&lt;br /&gt;
&lt;br /&gt;
==Indice delle figure==&lt;br /&gt;
&lt;br /&gt;
[0F00]https://en.wikipedia.org/wiki/Latin_script&lt;br /&gt;
&amp;lt;!-- [[File:Latin alphabet world distribution.svg|thumb|upright=1.6|In verde scuro le nazioni dove è usato solo l'alfabeto latino; in verde chiaro quelle dove all'alfabeto latino è affiancato un altro alfabeto.]] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[0F01]Diagramma di Venn 1&lt;br /&gt;
&lt;br /&gt;
[0F02]Diagramma di Venn 2&lt;br /&gt;
&lt;br /&gt;
[0F03]Diagramma di Venn 3&lt;br /&gt;
&lt;br /&gt;
[0F04]Esito unit test regex (cartella immagini)&lt;br /&gt;
&lt;br /&gt;
[0F05]Inforgrafica GDPR&lt;br /&gt;
&lt;br /&gt;
[0F06]Diagramma di sequenza UML&lt;br /&gt;
&lt;br /&gt;
[0F07]Primo calcolo valutazione algoritmo&lt;br /&gt;
&lt;br /&gt;
[0F08]Secondo calcolo valutazione algoritmo&lt;br /&gt;
&lt;br /&gt;
[0F09]Terzo calcolo valutazione algoritmo&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Servizio_web_per_il_trattamento_dei_dati_personali_contenuti_in_documenti_OOXML_complessi&amp;diff=167</id>
		<title>Servizio web per il trattamento dei dati personali contenuti in documenti OOXML complessi</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Servizio_web_per_il_trattamento_dei_dati_personali_contenuti_in_documenti_OOXML_complessi&amp;diff=167"/>
		<updated>2019-09-30T01:11:21Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: /* Bibliografia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduzione==&lt;br /&gt;
&lt;br /&gt;
Il recente Regolamento Generale europeo sulla Protezione dei Dati (UE) 2016/679 ([0034], [0035]) o ''GDPR'' (''General Data Protection Regulation'', come nel seguito sarà chiamato) ha modernizzato significativamente la normativa in materia di protezione dei dati personali, rendendola omogenea fra tutti gli stati membri. È bene notare che, fin dal titolo, il ''GDPR'' non riduce gli spazi per i trattamenti di dati personali, ma anzi ne protegge la &amp;quot;libera circolazione&amp;quot;, dettando, però, regole definite e certe. Rinunciando ad una presentazione più completa del ''GDPR'', saranno riportati nei successivi capitoli i concetti necessari alla discussione dell'argomento.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Enti ed organizzazioni, aventi a che fare con documenti contenenti dati sensibili, devono operare in maniera conforme al ''GDPR''; potrebbero, di conseguenza, trarre beneficio da servizi specifici in grado di supportarli in queste esigenze.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
L'oggetto principale della tesi sarà dunque, come riportato dal titolo, la progettazione e la realizzazione di un servizio per la gestione di dati personali.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F05])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La larga maggioranza dei documenti testuali viene generata con strumenti cosiddetti di &amp;quot;produttività individuale&amp;quot;, cioè da ''word-processors''. L'osservazione, ovvia nella sua evidenza, consente di introdurre una riflessione: quando un documento è generato da un'elaborazione automatica, magari per composizione di ''template'' con dati estratti da un database, l'individuazione dei &amp;quot;dati personali&amp;quot; nel documento prodotto può avvenire in modo rigoroso e senza incertezze, sulla base degli elementi di composizione del documento; ad es.: i campi del documento estratti da una anagrafica di soggetti sono certamente dati personali e come tali possono essere opportunamente trattati nel processo di elaborazione automatica (ad es. cancellati).&lt;br /&gt;
&lt;br /&gt;
Ma, in quella larga maggioranza di documenti testuali generata con ''word-processors'' l'individuazione ed il trattamento dei dati personali vanno affrontati con altri approcci, discussi in questa tesi.&lt;br /&gt;
&lt;br /&gt;
==Scenario di lavoro==&lt;br /&gt;
&lt;br /&gt;
===Minimizzazione dei dati personali===&lt;br /&gt;
&lt;br /&gt;
Un concetto espresso in modo pervasivo dal ''GDPR'' è quello della &amp;quot;''minimizzazione''&amp;quot; dei dati personali trattati ed a maggior ragione dei dati personali pubblicati. In particolare l'Art. 5 ed il Considerando 39 prescrivono che i dati personali trattati siano &amp;quot;''adeguati, pertinenti e limitati a quanto necessario rispetto alle finalità per le quali sono trattati («minimizzazione dei dati»)''&amp;quot; ([0035]).&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Con questo fine, il GDPR delinea due possibilità organizzative e tecniche di &amp;quot;''minimizzazione''&amp;quot;: l'anonimizzazione e la psedonimizzazione.&lt;br /&gt;
&lt;br /&gt;
====Anonimizzazione====&lt;br /&gt;
&lt;br /&gt;
Sono anonimizzati i dati personali non (più) riferibili alle persone a cui sono appartenuti; si tratta di serie di dati, spesso ingenti, che sono stati definitivamente ed irreversibilmente separati da ogni riferimento alle persone che caratterizzavano. Sono le serie di dati utilizzate per fini statistici, scientifici, etc. E' importante notare che, come fissato dal Considerando 26 del ''GDPR'', il Regolamento non si applica al &amp;quot;''trattamento di tali informazioni anonime''&amp;quot; ([0035]). Per questo, sottoporre database e documenti ad un procedimento, cioè un trattamento, di anonimizzazione consente di non doversi più preoccupare del ''GDPR''.&lt;br /&gt;
&lt;br /&gt;
====Pseudonimizzazione====&lt;br /&gt;
&lt;br /&gt;
Fra le definizioni dell'Art. 4 del ''GDPR'', la &amp;quot;pseudonimizzazione&amp;quot; viene indicata come &amp;quot;''il trattamento tale che i dati personali non possano più essere attribuiti a un interessato specifico senza l’utilizzo di informazioni aggiuntive, a condizione che tali informazioni aggiuntive siano conservate separatamente''&amp;quot; ([0035]).&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Traducendo in termini &amp;quot;operativi&amp;quot;, si tratta del procedimento che, dal &amp;quot;record&amp;quot; dei dati di un interessato, separa i campi che caratterizzano l'interessato stesso da quelli che lo identificano, trasferendo questi ultimi in una nuova distinta tabella; nelle due tabelle vengono aggiunti i riferimenti che permettono la ricostruzione del record originario; il procedimento è completo quando la nuova tabella con gli identificativi viene archiviata separatamente ed eventualmente cifrata. In margine si annota che in molti casi, come molti studi dimostrano, è possibile identificare, quindi &amp;quot;riconoscere&amp;quot;, gli interessati utilizzando la sola tabella con i dati pseudonimizzati.&lt;br /&gt;
&lt;br /&gt;
====Altri trattamenti di &amp;quot;minimizzazione&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Un problema pratico che si incontra di frequente è quello di dover pubblicare documenti più o meno ampi che contengono dati personali. Spesso la pubblicazione è obbligatoria per legge: si pensi alle graduatorie relative a concorsi pubblici, alle sentenze dei tribunali, etc.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In questi frequenti casi, analizzando meglio le finalità per le quali sono pubblicati quei dati personali, si osserva che sono possibili e legittimi almeno due approcci per &amp;quot;minimizzare&amp;quot; il dato nel &amp;quot;trattamento di pubblicazione&amp;quot; e, dunque, per minimizzarne la propagazione, ad esempio attraverso motori di ricerca, ben oltre ogni ragionevole finalità. I contesti ed i corrispondenti approcci sono:&lt;br /&gt;
#  Situazioni in cui è necessario che l'interessato possa riconoscersi nel documento ed essere riconosciuto dagli altri soggetti menzionati nel contesto, ma non è plausibile la necessità di identificazione dell'interessato al di fuori di quel contesto specifico. A questo caso si riconducono le graduatorie di concorsi, gli elenchi per la formazione di classi, gli elenchi per convocazioni, etc. In tutti questi casi, nel processo di redazione del documento è più pratico trattare internamente i dati personali in forma completa; ma praticamente mai è necessario pubblicarli per intero, esponendo al pubblico accesso codici fiscali, indirizzi, recapiti telefonici etc. Per di più, nella maggior parte delle volte, è sufficiente pubblicare il solo cognome perché l'interessato conosca la sua posizione in graduatoria; ciò è spesso sufficiente anche a trasmettere l'informazione necessaria ai colleghi dell'interessato nella medesima graduatoria, o nella medesima classe, etc. Notare che, pubblicando il solo cognome, viene di fatto oscurato anche il sesso. Dunque, in questi casi è auspicabile cancellare una larga parte dei dati personali presenti nel documento.&lt;br /&gt;
# Situazioni in cui il documento deve essere pubblicato affinché siano rese note le motivazioni che lo hanno originato, senza che sia necessaria la precisa identificazione dei soggetti che vi compaiono. Questo è il caso della pubblicazione di sentenze giudiziarie di ogni grado. Le sentenze vengono notificate direttamente agli &amp;quot;aventi causa&amp;quot;; ma anche, come la legge prescrive, pubblicate al fine di costituire giurisprudenza. In questo secondo caso, risulta del tutto eccedente la pubblicazione dei reali nominativi degli interessati, che troverebbero verosimilmente la propria vicenda inutilmente indicizzata dai motori di ricerca negli anni a venire. Nella pubblicazione delle sentenze appare un approccio ottimale quello di sostituire con pseudonimi o con iniziali alterate i veri nominativi degli interessati presenti: il senso e le argomentazioni della sentenza restano pienamente comprensibili, come è necessario; il dato personale, del tutto superfluo ai fini della giurisprudenza, viene protetto.&lt;br /&gt;
In questi casi appare opportuno sostituire i dati identificativi dell'interessato, ed in particolare il nome e cognome, con pseudonimi o, ancora, con iniziali alterate, cioè non coincidenti con le iniziali reali. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Proprio questi tipi di trattamenti di &amp;quot;minimizzazione&amp;quot; sono l'oggetto di questa tesi.&lt;br /&gt;
&lt;br /&gt;
===Punti di partenza per la progettazione del servizio===&lt;br /&gt;
&lt;br /&gt;
La tesi è stata svolta in collaborazione con l'azienda AFA Systems (www.afasystems.it/gdpr) con la quale si sono discusse le problematiche di progettazione e realizzazione di un servizio generalizzato di minimizzazione dei dati personali presenti in un documento.&lt;br /&gt;
Con l'intenzione di fornire il servizio ad un bacino d'utenza il più vasto e variegato possibile, si è pensato ad un'applicazione ''web-based'', indipendente così dai singoli devices sui quali poi sarà utilizzata.&lt;br /&gt;
L'attenzione è stata concentrata sul trattamento dei nomi e dei cognomi (che da qui chiameremo nominativi), poiché sono quelli sempre presenti nei documenti (ad es. gli indirizzi sono presenti solo a volte), rappresentano gli elementi tramite i quali è immediato il riconoscimento della persone, non hanno formato predefinito (come ad es. i codici fiscali); altri dati personali (indirizzi, codici fiscali, etc.), potranno essere considerati in successive evoluzioni del progetto.&lt;br /&gt;
È utile notare che la parte iniziale della collaborazione con l'azienda è stata dedicata alla discussione delle specifiche, la cui più precisa definizione è parte rilevante di questa tesi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Tra i requisiti che necessitano di un opportuno studio troviamo ad esempio:&lt;br /&gt;
* L'individuazione di metodi efficaci per il riconoscimento dei nominativi nei documenti&lt;br /&gt;
* L'identificazione delle migliori procedure di interazione con l'utente&lt;br /&gt;
* La scelta dei formati da trattare&lt;br /&gt;
* I vincoli non funzionali legati al rispetto del ''GDPR''.&lt;br /&gt;
&lt;br /&gt;
==Definizione delle specifiche==&lt;br /&gt;
&lt;br /&gt;
===Riconoscimento dei nominativi===&lt;br /&gt;
&lt;br /&gt;
====Scelta della strategia di riconoscimento====&lt;br /&gt;
 &lt;br /&gt;
Le difficoltà principali con cui ci si imbatte nel processo di riconoscimento dei nominativi riguardano la complessità strutturale dei documenti di testo, ma soprattutto l'intrinseca ambiguità del linguaggio naturale. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Le variabili ed impredicibili strutture e formattazioni dei documenti introducono alcuni problemi significativi. Rendendo fortemente eterogeneo il contenuto dei documenti, infatti, esse non consentono di ricondurre il problema del riconoscimento dei nominativi ad uno o a pochi singoli casi, ma comportano lo studio di tutte le strutture e formattazioni possibili, rendendo quindi l'analisi molto generale. L'altra rilevante difficoltà presente sta nella complessità di effettuare il riconoscimento di una stringa testuale immersa in un insieme di elementi non tutti testuali. Ogni elemento di formattazione, che sia una tabella o una barra orizzontale, introduce infatti un proprio significato logico e semantico nel documento di cui bisogna tenere conto.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Il linguaggio naturale introduce anch'esso complessità: si pensi alle molteplici tipologie di proposizioni con cui possono essere articolati i periodi; ma i problemi principali derivano dalle sue ambiguità. Esse vengono classificate in diverse tipologie ([0025]); le principali sono le ambiguità sintattiche e lessicali.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si ha ambiguità sintattica quando la sintassi di una frase può essere interpretata in diversi modi e, di conseguenza, la frase stessa assume significati diversi. Essa è presente, ad esempio, nelle seguenti frasi:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
* &amp;quot;''Rapina in banca con rivoltella da centomila euro''&amp;quot;&lt;br /&gt;
* &amp;quot;''Luigi ha visto un uomo nel parco con il binocolo''&amp;quot;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
L'esasperazione massima della problematica delle ambiguità sintattiche si presenta con l'&amp;lt;i&amp;gt;antinomia&amp;lt;/i&amp;gt;, ossia un particolare tipo di paradosso che indica la compresenza di due affermazioni contraddittorie che possono essere entrambe dimostrate o giustificate.&lt;br /&gt;
L'antinomia di Epimenide o ''Paradosso del mentitore'', nota fin dal VI secolo, è probabilmente uno dei più noti esempi: &amp;quot;''il cretese Epimenide afferma che tutti i cretesi mentono''&amp;quot;. Se la proposizione è vera (i cretesi mentono) allora il suo significato implica che sia falsa (Epimenide mente e quindi i cretesi dicono la verità), ma se è falsa (i cretesi dicono la verità) ciò significa che è vera (Epimenide dice la verità e quindi i cretesi mentono). La proposizione appare contemporaneamente vera e falsa. A partire dagli anni venti del '900, sono state elaborate varie teorie per la risoluzione delle contraddizioni provocate dalle antinomie, soprattutto attraverso l'elaborazione di linguaggi multilivello o attraverso l'elaborazione di logiche polivalenti (quindi non-booleane).&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si ha ambiguità lessicale, invece, quando una parola possiede più di un significato nella lingua a cui appartiene ([0026]), in tal caso la parola è definita ''polisemica''. In italiano, alcuni termini soggetti a questo tipo di ambiguità sono, ad esempio &amp;quot;''acuto''&amp;quot; o &amp;quot;''venti''&amp;quot;. È questo genere di ambiguità che risulta critico per il riconoscimento dei nominativi. La difficoltà determinata dalle ambiguità sintattiche, infatti, riguarda l'individuazione corretta di soggetti, predicati e complementi di un periodo, mentre le ambiguità lessicali ostacolano la comprensione del significato del singolo lessema. Nel processo di riconoscimento è irrilevante determinare la funzione logica che il nominativo svolge nella frase, mentre è necessario essere certi che i termini che compongono il nominativo siano effettivamente dei nomi propri di persona o dei cognomi, non altri vocaboli del lessico comune. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In linguistica, l'intervento con cui si toglie ambiguità a una parola o a una frase prende il nome di &amp;quot;disambiguazione&amp;quot; ([0027]). Il problema della disambiguazione automatica (in inglese ''Word Sense Disambiguation'' o, abbreviato, ''WSD'') riveste particolare importanza nelle ricerche sull'intelligenza artificiale e, in particolare, nell'elaborazione del linguaggio naturale. Si prevedono benefici della disambiguazione, ad esempio, in programmi di traduzione automatica, recupero dell'informazione o estrazione automatica di informazioni. Nell'analisi delle soluzioni esistenti in letteratura per la risoluzione delle ambiguità, ci si sofferma specialmente sulle ricerche incentrate sul trattamento dell'ambiguità lessicale, essendo essa la più rilevante per i nostri interessi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
La ''WSD'' richiede due input necessariamente: un dizionario per specificare i sensi che devono essere disambiguati e un corpus di dati linguistici da disambiguare. Nello scenario più realistico, si trattano testi le cui parole non sono note a priori e risulta molto onerosa la produzione del corpus, essendo infatti necessaria la valutazione di un operatore umano per verificare la correttezza delle disambiguazioni effettuate dagli algoritmi (''supervised learning'').&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Uno tra i principali dizionari semantici-lessicali utilizzati della lingua inglese è ''WordNet'' ([0029]), mentre alcuni dei database equivalenti che trattano l'italiano sono ''BabelNet'' ([0030]), ''ItalWordNet'' ([0031]) e ''MultiWordNet'' ([0032]).&lt;br /&gt;
Un elemento importante da considerare è che le prestazioni di disambiguazione per la lingua inglese, impiegando ''WordNet'', risultano corrette tra l'80% e il 90% delle volte ([0028]), percentuali discrete ma non sufficienti per avere la totale garanzia.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
I fattori che ostacolano la realizzazione di algoritmi di intelligenza artificiale per la disambiguazione sono molteplici:&lt;br /&gt;
# Differenze tra dizionari impiegati: i database prima citati si basano su varie fonti che raggruppano semanticamente in maniera diversa i vocaboli, quindi programmi sviluppati con dizionari diversi generalmente hanno performance differenti.&lt;br /&gt;
# Complessità della codifica di parte del discorso: per poter disambiguare correttamente un termine è importante riuscire a comprendere correttamente il contesto in cui è inserito, operazione non banale.&lt;br /&gt;
# Varianza tra giudici: i supervisori dell'apprendimento degli algoritmi possono avere opinioni diverse, o semplicemente sbagliare, nella valutazione delle disambiguazioni, ciò porta ad algoritmi che hanno comportamenti diversi.&lt;br /&gt;
# Impossibilità di applicare la disciplina della ''pragmatica'', ossia la logica del ''buon senso'': per identificare correttamente il senso di alcune parole, ad esempio nella comprensioni di anafore e catafore, è necessario applicare il buon senso.&lt;br /&gt;
# Dipendenza del senso delle parole dai contesti: ogni scenario richiede la propria divisione del significato delle parole in sensi rilevanti. In un contesto informatico, ad esempio, il termine &amp;quot;''mouse''&amp;quot; deve essere ricondotto al dispositivo di puntamento, non al cognome del celebre personaggio Disney ''Mickey Mouse''; viceversa dovrà invece avvenire in un contesto di letteratura a fumetti.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Laddove la ''WSD'' è una tecnica molto generale e che mira a risolvere un'ambiguità riguardante una qualunque parola, per le finalità del servizio oggetto di questa tesi è sufficiente risolvere le ambiguità dei nomi e dei cognomi. &lt;br /&gt;
Uno dei difetti che il servizio presenterebbe adottando un approccio ''WDS'' è legato alla impredicibile formattazione dei documenti, che aggiunge informazione semantica al testo ma introduce complessità nella individuazione automatica delle parti che formano il contesto; un altro difetto dipende dalla vastità del lessico da elaborare, essendo i documenti da trattare forniti dai più disparati utenti, su qualunque genere di argomento e relativi ai più vari ambiti.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La strategia che sarà adottata per risolvere la problematica del riconoscimento dei nominativi sarà impostata attraverso un modello ''pattern-based'', impiegando le ''regular expressions'' (''regex''). Esse risultano comunemente usate per effettuare operazioni di ricerca o sostituzione in un testo, di conseguenza se si riesce ad individuare un pattern associato ad un nominativo dato, allora sarà possibile processare il documento ricercando le occorrenze del nominativo e &amp;quot;minimizzarlo&amp;quot; opportunamente.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le ''regular expressions'' risultano particolarmente efficaci poiché, se opportunamente progettate, possono identificare un nominativo indipendentemente dal significato linguistico del contesto in cui è calato, basandosi piuttosto sui singoli caratteri che compongono i lessemi analizzati; permettono, di conseguenza, di effettuare una valutazione estremamente minuziosa, riducendo al minimo le possibilità di errori.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Un algoritmo di risoluzione ''pattern-based'' risulta, inoltre, più efficiente nell'esecuzione, in generale, di un algoritmo di intelligenza artificiale; per fornire la risposta il più velocemente possibile ad un utente, fruitore del servizio via web, l'approccio di riconoscimento tramite pattern è il più indicato.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Definizione dei pattern====&lt;br /&gt;
Nella progettazione del servizio si adotta, come detto, un approccio ''pattern-based'' per il riconoscimento dei nominativi. In linea di massima è opportuno che vengano riconosciuti più nominativi possibili e allo stesso tempo che la correttezza dell'identificazione di un nominativo sia garantita, quindi bisogna individuare dei pattern non troppo stringenti ma neppure troppo laschi. Per analizzare come i pattern devono essere strutturati si prende come caso di studio un generico nominativo, ad esempio ''Lorenzo Mario Amorosa''. Nel documento esso può comparire esattamente come appena indicato, ma anche in altre plausibili varianti, in cui l'ordine dei termini viene alterato, si pensi ad esempio ad &amp;quot;Amorosa Lorenzo Mario&amp;quot; o &amp;quot;Mario Lorenzo Amorosa&amp;quot;, o in altre varianti ancora in cui alcuni nomi non compaiono, come in &amp;quot;Lorenzo Amorosa&amp;quot;. Bisogna tuttavia supporre un limite alla variabilità: si osserva infatti che il cognome deve sempre comparire (il solo nome ''Lorenzo'' non è riconducibile a ''Lorenzo Mario Amorosa'') e che esso inoltre deve essere necessariamente anteposto o posposto, ma non interposto, ai nomi (è poco ragionevole ricondurre &amp;quot;Lorenzo Amorosa Mario&amp;quot; a &amp;quot;Lorenzo Mario Amorosa'').&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Questa prima specifica permette di ricondursi a una soluzione generale, sufficiente nella maggior parte dei casi, ma che non risolve alcune criticità. Un nominativo può, in alcuni documenti, comparire manifestandosi unicamente attraverso il cognome (riferendoci all'esempio precedente, ''Lorenzo Mario Amorosa'' apparirebbe nella forma ''Amorosa''). Sorge qui il problema che molti dei cognomi italiani hanno un significato proprio nel linguaggio comune; ad es., nella frase ''una relazione amorosa è bella'' è errato considerare la parola ''amorosa'' come cognome di un nominativo. Per risolvere questo genere di ambiguità si potrebbe pensare che per stabilire che il termine ''Amorosa'' sia un cognome sia sufficiente verificare che esso inizi con una lettera maiuscola, ma ciò può verificarsi anche perché la parola si trova ad inizio di frase. Inoltre, vari cognomi italiani possono iniziare con una lettera minuscola (''de Angelis'', ''d'Onofrio'', etc.), quindi basare l'identificazione di un cognome sul fatto che la sua prima lettera sia in maiuscolo non è in generale un metodo valido. Volendo in maniera prioritaria garantire il corretto funzionamento del servizio, e quindi attuare le procedure di anonimizzazione solo sui nominativi senza applicarle erroneamente ad altri termini, risulta necessario evitare il trattamento dei nominativi che si manifestano con i soli cognomi. Per via del contesto e dei significati che i cognomi possono assumere, infatti, risulta spesso impossibile distinguerli da parole del linguaggio comune. &lt;br /&gt;
&lt;br /&gt;
Ci si concentra, quindi, nello studio di nominativi composti da un cognome seguito o preceduto da uno o più nomi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si rappresenta dunque in formato di ''regular expression'' il pattern attualmente ideato. Per semplicità espositiva, si definisce il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; come l'insieme delle permutazioni di tutti i nomi del nominativo più l'insieme delle permutazioni di tutti i possibili sottoinsiemi di nomi del nominativo. Considerando il nominativo preso precedentemente come caso di studio, ad esempio, si avrebbe:&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt; &amp;lt;nomi&amp;gt; = Lorenzo Mario|Mario Lorenzo|Lorenzo|Mario&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Posto inoltre il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt; ad indicare il cognome contenuto nel nominativo e il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;regex&amp;gt;&amp;lt;/span&amp;gt; ad indicare la ''regular expression'' associata al nominativo, si ottiene:&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt; &amp;lt;regex&amp;gt; := &amp;lt;cognome&amp;gt; (&amp;lt;nomi&amp;gt;)|(&amp;lt;nomi&amp;gt;) &amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Una osservazione sottile ma di fondamentale importanza per la corretta progettazione delle ''regular expressions'' sta nella piena comprensione della semantica dell'operatore di scelta, espresso con il carattere ''pipe'' (&amp;quot;|&amp;quot;). Un qualunque ''engine'' di elaborazione delle ''regex'', infatti, interrompe la valutazione di una stringa non appena può stabilire se tale stringa fa match o meno con il pattern dato, senza quindi necessariamente valutarlo nella sua interezza, come parimenti avviene nelle valutazioni ''a corto circuito'' delle espressioni logiche nei linguaggi di programmazione. Ogni nominativo avrà a sè associato un pattern che lo rappresenta in più possibili sequenze di caratteri; per effettuare una corretta &amp;quot;minimizzazione&amp;quot; dei dati è necessario che le sequenze contenenti tutti i nomi sia poste per prime, mentre quelle contenenti un singolo nome per ultime.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In questa prima formulazione della ''regex'', inoltre, si è posto come separatore unicamente lo spazio bianco, ma alcuni documenti potrebbero contenere dei nominativi i cui termini sono separati da altri caratteri, come ad esempio una virgola nel caso di &amp;quot;Amorosa, Lorenzo Mario&amp;quot;. Per poter quindi identificare un nominativo anche in questi casi, si potrebbe considerare un qualunque carattere di interpunzione come possibile separatore dei termini del nominativo.&lt;br /&gt;
Adottando questa soluzione si ha però come effetto collaterale che risultano critici i casi in cui nel testo sono presenti dei nominativi soggetti ad omonimia. Si consideri una generica frase contenente una sequenza di nominativi, ad esempio ''Amorosa Lorenzo, Mario Giacomo e Fabio Rossi'', e si supponga che i nominativi da trattare siano ''Amorosa Lorenzo Mario'', ''Mario Giacomo'' (in cui la parola ''Mario'' è il cognome) e ''Fabio Rossi''. Gli ultimi due nominativi compaiono nella frase nella loro forma estesa, mentre il primo compare con il solo nome ''Lorenzo'' (eventualità possibile considerando la definizione del pattern precedentemente data). Considerando la virgola come carattere separatore dei termini del nominativo, la sequenza di parole ''Amorosa Lorenzo, Mario'' sarebbe ricondotta, venendo elaborata per prima, ad ''Amorosa Lorenzo Mario'', mentre rimarrebbe non trattata la parola ''Giacomo'', in quanto il cognome ''Mario'' che gli era associato è stato già identificato come un nome del nominativo ''Amorosa Lorenzo Mario'' ed il termine ''Giacomo'' preso singolarmente non rappresenta un nominativo.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Prima di valutare ulteriormente le problematiche relative alle omonimie, si possono scegliere due approcci per risolvere questo specifico caso:&lt;br /&gt;
# Si riconduce una sequenza di parole ad un nominativo se e solo se tutti i suoi nomi sono contenuti nella sequenza&lt;br /&gt;
# Si considerano come separatori dei termini contenuti nei nominativi solo spazi bianchi, tabulazioni e a capo, non gli altri segni di punteggiatura.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Entrambe le strategie sono valide, in quanto risolvono il problema garantendo la corretta identificazione dei nominativi, ma allo stesso tempo entrambe presentano lo svantaggio di ridurre le sequenze di parole riconducibili a dei nominativi, aumentando le possibilità che alcuni di essi non vengano trattati.&lt;br /&gt;
Si consideri nuovamente il nominativo preso come caso di studio ''Amorosa Lorenzo Mario'': applicando la prima strategia, non sarebbe possibile ricondurgli la sequenza ''Amorosa Lorenzo'', mentre applicando il secondo metodo non sarebbe riconducibile la sequenza ''Amorosa, Lorenzo Mario''.&lt;br /&gt;
Si decide di attuare la seconda strategia, in quanto è opportuno non imporre vincoli troppo stringenti sui nomi e poiché nella gran parte dei casi i termini dei nominativi nei documenti sono separati tra loro da caratteri quali spazi bianchi, tabulazioni ed a capo.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Un altro elemento su cui porre l'attenzione è la possibilità che i documenti da trattare contengano dei nominativi scritti interamente in maiuscolo o minuscolo, di conseguenza è conveniente che le ''regular expressions'' siano progettate ''case-insensitive''.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Un ulteriore punto su cui bisogna soffermarsi è la posizione all'interno di un periodo in cui un nominativo può comparire, in particolare si vogliono evitare quei casi critici in cui uno dei termini del nominativo è una sotto-stringa di un'altra parola del testo (si pensi ad ''amorosa'' in ''clamorosa''). Come regola generale si può stabilire che è sempre necessario che un nominativo sia preceduto e seguito da un ''carattere non alfabetico''. Un caso particolare si presenta quando il nominativo è posto ad inizio o a fine documento, situazione in cui quindi esso non è preceduto o non è seguito da alcun carattere: entrambe le posizioni sono da considerare corrette.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
È opportuno ora definire il concetto di ''carattere non alfabetico'', e ciò si può fare più facilmente ragionando sul problema in logica positiva; infatti risulta più semplice individuare quei caratteri che rappresentano lettere piuttosto che quelli che rappresentano segni di interpunzione ed individuare ogni altro carattere che non può mai comporre una parola.&lt;br /&gt;
&lt;br /&gt;
Inquadrando lo scenario di applicazione del servizio, molto probabilmente l'utente vorrà trattare un documento scritto nella lingua di uno dei paesi dell'Unione Europea, poiché il ''GDPR'' vige nei soli paesi membri dell'Unione.&lt;br /&gt;
Si può, quindi, ipotizzare che i documenti trattati possono sì contenere parole e nominativi stranieri, ma che i caratteri contenuti siano appartenenti all'alfabeto latino (''Latin script''), usato in molti stati nel mondo e da tutti i principali stati europei (fatta eccezione per la Grecia ed alcuni stati che scrivono in caratteri cirillici).&lt;br /&gt;
Inoltre, testi scritti in altri alfabeti, come esempio il cinese, l'arabo o il cirillico, vengono generalmente traslitterati. Considerare, quindi, ''caratteri non alfabetici'' tutti i caratteri diversi dalle lettere contenute nell'alfabeto latino sarebbe di conseguenza estremamente riduttivo ed inoltre in questo modo non si terrebbe conto delle lettere accentate, molto utilizzate anche nella lingua italiana.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(XXXX QUI IMG [0F00])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per risolvere il problema facciamo riferimento alla codifica standard Unicode dell'alfabeto latino ([0022]); in essa è possibile individuare, oltre ai caratteri rappresentanti le lettere nella codifica ''ASCII'' classica, i caratteri rappresentanti le lettere nella codifica standard ''ISO/IEC 8859-1'' ([0023]), encoding orientato principalmente alla rappresentazione delle lingue dell'Europa occidentale.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;i&amp;gt;Caratteri latini nei primi due blocchi dello standard Unicode&amp;lt;/i&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;nounderlines&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border-collapse:collapse&amp;quot;&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; &lt;br /&gt;
!style=&amp;quot;background:#ccf; text-align:center; font-weight: bold;&amp;quot;|U+&lt;br /&gt;
!style=&amp;quot;text-align:center; font-weight: bold;&amp;quot;|0||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|1||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|2||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|3||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|4||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|5||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|6||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|7||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|8||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|9||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|A||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|B||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|C||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|D||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|E||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|F||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|Block||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|#&lt;br /&gt;
|-&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|0040&lt;br /&gt;
|style=&amp;quot;background:#fff&amp;quot;|@||A||B||C||D||E||F||G||H||I||J||K||L||M||N||O&lt;br /&gt;
|rowspan=&amp;quot;4&amp;quot; style=&amp;quot;background:#fff&amp;quot; align:&amp;quot;center&amp;quot;|C0 Controls and Basic Latin&amp;lt;br&amp;gt;0000–007F&amp;lt;br&amp;gt;(identical to ASCII)&lt;br /&gt;
|rowspan=&amp;quot;4&amp;quot; style=&amp;quot;background:#fff&amp;quot;|52&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|0050&lt;br /&gt;
|P||Q||R||S||T||U||V||W||X||Y||Z||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#91;||style=&amp;quot;background:#fff&amp;quot;|\||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#93;||style=&amp;quot;background:#fff&amp;quot;|^||style=&amp;quot;background:#fff&amp;quot;|_&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|0060&lt;br /&gt;
|style=&amp;quot;background:#fff&amp;quot;|`||a||b||c||d||e||f||g||h||i||j||k||l||m||n||o&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|0070&lt;br /&gt;
|p||q||r||s||t||u||v||w||x||y||z||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#123;||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#124;||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#125;||style=&amp;quot;background:#fff&amp;quot;|~||style=&amp;quot;background:#fff; font-size:75%&amp;quot;|DEL&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;19&amp;quot;| &lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#fff&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00A0&lt;br /&gt;
|&amp;amp;nbsp;||¡||¢||£||¤||¥||¦||§||¨||©||ª||«||¬||||®||¯&lt;br /&gt;
|rowspan=&amp;quot;6&amp;quot; style=&amp;quot;background:#fff&amp;quot; align=&amp;quot;center&amp;quot;|C1 Controls and Latin-1 Supplement&amp;lt;br&amp;gt;0080–00FF&amp;lt;br&amp;gt;(identical to ISO/IEC 8859-1)&lt;br /&gt;
|rowspan=&amp;quot;6&amp;quot; style=&amp;quot;background:#fff&amp;quot;|62&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#fff&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00B0&lt;br /&gt;
|°||±||²||³||´||µ||¶||·||¸||¹||º||»||¼||½||¾||¿&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00C0&lt;br /&gt;
|À||Á||Â||Ã||Ä||Å||Æ||Ç||È||É||Ê||Ë||Ì||Í||Î||Ï&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00D0&lt;br /&gt;
|Ð||Ñ||Ò||Ó||Ô||Õ||Ö||style=&amp;quot;background:#fff&amp;quot;|×||Ø||Ù||Ú||Û||Ü||Ý||Þ||ß&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00E0&lt;br /&gt;
|à||á||â||ã||ä||å||æ||ç||è||é||ê||ë||ì||í||î||ï&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00F0&lt;br /&gt;
|ð||ñ||ò||ó||ô||õ||ö||style=&amp;quot;background:#fff&amp;quot;|÷||ø||ù||ú||û||ü||ý||þ||ÿ&lt;br /&gt;
|---- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I caratteri indicati in rosso nella tabella sono tutti i possibili ''caratteri alfabetici'' che compaiono nei documenti scritti in 29 lingue diverse ([0023]), tra le quali sono presenti l'italiano, l'inglese, lo spagnolo, il tedesco e il portoghese. &lt;br /&gt;
Aggiungendo pochi altri caratteri all'insieme dei ''caratteri alfabetici'' appena mostrati, si riesce a rappresentare ogni parola di altre 12 lingue ([0023]), tra cui il francese, l'olandese, il ceco e il turco.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
I caratteri mostrati in tabella corrispondono ad una parte dei primi due blocchi dello standard Unicode che codificano l'alfabeto latino e, come già accennato in precedenza, essi sono presenti negli standard ''ASCII'' e ''ISO/IEC 8859-1''. I rimanenti ''caratteri alfabetici'', invece, sono presenti in estensioni dello standard Unicode per il ''Latin script''. Queste estensioni sono state realizzate per fornire il massimo supporto a tutte le lingue e contenenti molti simboli ad uso speciale, come ad esempio per la rappresentazione dei fonemi. Si osserva, inoltre, che i ''caratteri alfabetici'' definiti nelle estensioni dello standard Unicode sono presenti anche nella codifica ''ISO/IEC 8859-2'' o nelle versioni successive ([0023]).&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Definiti i ''caratteri non alfabetici'' come elementi di separazione tra un nominativo ed il testo in cui esso è inserito, occorre definire opportunamente la ''regex'' che al nominativo è associata.&lt;br /&gt;
&lt;br /&gt;
Utili strumenti messi a disposizione dalle ''regular expressions'' sono i gruppi speciali ''lookahead'' e ''lookbehind''. Un pattern di un nominativo deve essere preceduto o seguito da una prestabilita sequenza di caratteri, la quale però non è parte del nominativo. Utilizzando i due costrutti citati, è possibile far sì che nell'elaborazione di una stringa facciano match solamente le parole effettivamente appartenenti al nominativo, non i caratteri che lo delimitano dal resto del testo, e allo stesso tempo che un nominativo faccia match se e solo se preceduto o seguito da una certa sequenza di caratteri. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per esprimere nella sintassi delle ''regex'' un carattere letterale in un qualunque alfabeto si può utilizzare il costrutto ''\p{L}'', che però risulta molto generale e troppo lasco per i requisiti considerati. Si può piuttosto valutare l'impiego del costrutto ''\p{Latin}'', il quale identifica un qualunque carattere alfabetico presente nell'alfabeto latino. Tra i caratteri corrispondenti al costrutto, però, ve ne sono alcuni che per le specifiche del servizio devono essere considerati ''caratteri non alfabetici'', come ad esempio i caratteri dei fonemi, i segni diacritici e gli indicatori ordinali; di conseguenza è necessario individuare una strategia ad hoc per risolvere questa problematica.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per chiarezza espositiva, si definisce il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;start&amp;gt;&amp;lt;/span&amp;gt;, per indicare un qualunque carattere non alfabetico o l'inizio stringa, il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;end&amp;gt;&amp;lt;/span&amp;gt;, per indicare un qualunque carattere non alfabetico o il fine stringa, ed il tag &amp;lt;extra&amp;gt;, per indicare i ''caratteri alfabetici'' non presenti negli standard ''ASCII'' o ''ISO/IEC 8859-1'':&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;extra&amp;gt; := ĿŀČčŘřŠšŽžĲĳŒœŸŐőŰűḂḃĊċḊḋḞḟĠġṀṁṠṡṪṫĀāĒēĪīŌōŪūİıĞğŞşẀẁẂẃŴŵŶŷǾǿẞ&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;start&amp;gt; := (?&amp;lt;=[^A-Za-zÀ-ÖØ-öø-ÿ&amp;lt;extra&amp;gt;]|^)&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;end&amp;gt; := (?=[^A-Za-zÀ-ÖØ-öø-ÿ&amp;lt;extra&amp;gt;]|$)&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva che si sono utilizzati i gruppi speciali prima descritti e che si sono inseriti i caratteri dello standard Unicode presentati in precedenza. Si definisce nuovamente la ''regular expression'' associata ad un generico nominativo. Applicando i tag appena definiti, il costrutto ''(?i)'' che rende il pattern ''case-insensitive'' ed il costrutto ''\s'' che rappresenta un carattere qualunque tra i separatori non visibili, ossia ''\r \n \t \f \v'' e lo spazio bianco, si ottiene:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;regex&amp;gt; := (?i)(&amp;lt;start&amp;gt;&amp;lt;cognome&amp;gt;\s+(&amp;lt;nomi&amp;gt;)|(&amp;lt;nomi&amp;gt;)\s+&amp;lt;cognome&amp;gt;&amp;lt;end&amp;gt;)&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva, inoltre, che in questa nuova formulazione della ''regular expression'' i nomi sono da intendersi separati tra loro da ''\s+''.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
A questo punto si è quasi giunti alla formulazione finale del pattern da associare ad un nominativo, rimangono solo da trattare alcuni casi critici non ancora risolti.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt; &lt;br /&gt;
Si è già presentato in precedenza il problema legato al fatto che alcuni cognomi possono avere un significato proprio nel lessico comune e che ciò costringeva, quindi, ad abbandonare l'idea di trattare nominativi formati dal solo cognome. Questa problematica di ambiguità si presenta anche con alcuni nomi (si pensi, ad esempio, al nome ''Gioia''). Ciò non rappresenta generalmente un problema, in quanto la coppia nome-cognome che forma il nominativo, presa complessivamente, non è soggetta ad ambiguità. Esistono, però, dei casi in cui questo non è vero. Si prenda in analisi il nominativo ''Gioia Grande'': risulta evidentemente soggetto a rischio di ambiguità. Una soluzione che si può adottare, per risolvere questo caso critico, si basa sull'associazione di un pattern più stringente ai nominativi. In particolare, si osserva che i nomi propri di persona compaiono sempre ed obbligatoriamente, in un documento grammaticalmente corretto, con la prima lettera maiuscola ([0024]). I cognomi, invece, non sono soggetti ad una regola così stringente: un cognome iniziante con una lettera minuscola (come ''de Rosa'') in alcuni casi, ad esempio se posto dopo un punto fermo, può comparire scritto con la prima lettera sia maiuscola che minuscola; naturalmente, in nessuna occorrenza un cognome che inizi con una lettera maiuscola potrà comparire con una minuscola. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Occorre quindi ridefinire, alla luce di queste osservazioni, la ''regex'' associata ad un nominativo, poiché precedentemente era stata posta interamente ''case-insensitive''. Nel pattern, in particolare, i nomi dovranno sempre iniziare con una maiuscola, mentre i cognomi avranno questo vincolo solo se nel nominativo compaiono con la prima lettera maiuscola. Si mostra quindi quali sono i tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; e &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt; associati a due nominativi, ad esempio ''Gioia Grande'' e ''Antonio de Rosa''. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per ''Gioia Grande'' si ha:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt; = G((?i)ioia)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt; = G((?i)rande)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per ''Antonio de Rosa'' si ha:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt; = A((?i)ntonio)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt; = (?i)de Rosa&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si presenta dunque la definizione finale del tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;regex&amp;gt;&amp;lt;/span&amp;gt;. Nella definizione il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; è definito il base al numero di nomi del nominativo ed il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt; è definito in base al carattere iniziale del cognome.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;regex&amp;gt; := &amp;lt;start&amp;gt;&amp;lt;cognome&amp;gt;\s+(&amp;lt;nomi&amp;gt;)|(&amp;lt;nomi&amp;gt;)\s+&amp;lt;cognome&amp;gt;&amp;lt;end&amp;gt;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Vengono inoltre mostrati i valori dei due tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; e &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt; per il nominativo preso come caso di studio in fase iniziale, ossia ''Amorosa Lorenzo Mario''. Si ottiene:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt; = L((?i)orenzo)\s+M((?i)ario)|M((?i)ario)\s+L((?i)orenzo)|L((?i)orenzo)|M((?i)ario)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt; = A((?i)morosa)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Infine, per completezza, viene mostrata la ''regular expression'', associata a quest'ultimo nominativo, risolvendo tutti i tag che la compongono:&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;regex&amp;gt; = (?&amp;lt;=[^A-Za-zÀ-ÖØ-öø-ÿĿŀČčŘřŠšŽžĲĳŒœŸŐőŰűḂḃĊċḊḋḞḟĠġṀṁṠṡṪṫĀāĒēĪīŌōŪūİıĞğŞşẀẁẂẃŴŵŶŷǾǿẞ]|^)(A((?i)morosa)\s+(L((?i)orenzo)\s+M((?i)ario)|M((?i)ario)\s+L((?i)orenzo)|L((?i)orenzo)|M((?i)ario))|(L((?i)orenzo)\s+M((?i)ario)|M((?i)ario)\s+L((?i)orenzo)|L((?i)orenzo)|M((?i)ario))\s+A((?i)morosa))(?=[^A-Za-zÀ-ÖØ-öø-ÿĿŀČčŘřŠšŽžĲĳŒœŸŐőŰűḂḃĊċḊḋḞḟĠġṀṁṠṡṪṫĀāĒēĪīŌōŪūİıĞğŞşẀẁẂẃŴŵŶŷǾǿẞ]|$)&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Gestione delle omonimie====&lt;br /&gt;
&lt;br /&gt;
Nei ragionamenti che hanno portato alla formulazione della ''regular expression'' associata ai nominativi, si è tenuto conto di possibili ambiguità con termini appartenenti al linguaggio comune, risolte con l'introduzione nel pattern di stringhe ''case-sensitive'', e di possibili nominativi posti in sequenza parzialmente omonimi (ossia aventi un nome o il cognome in comune tra loro), gestite con l'imposizione dei soli caratteri separatori non visibili come delimitatori delle parole componenti un nominativo. Per rendere l'analisi completa occorre valutare come ci si debba comportare in altri possibili casi di omonimia. Si osserva, per inciso, che nel pattern individuato nella sezione precedente il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; è stato l'unico non definito formalmente. La definizione di tale tag infatti dipende, oltre che dai nomi del nominativo, anche dall'insieme complessivo dei nominativi da trattare presenti nel documento.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Il caso più semplice di omonimia, che si verifica quando un solo nome o il solo cognome di un nominativo coincide con un nome o il cognome di un altro (come nel caso di ''Lorenzo Mario Amorosa'' e ''Stefano Amorosa''), risulta già ben gestito dall'attuale formulazione del pattern. Infatti, un riconoscimento è determinato quando almeno un nome e il cognome del nominativo appaiono in sequenza.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Il problema si complica quando un nominativo ha due o più componenti in comune con un altro. Si osserva che se l'omonimia riguarda solo i nomi dei nominativi, ciò non risulta problematico, in quanto il cognome, supposto sempre presente nel pattern, funge da elemento di disambiguazione. Si considera da ora, quindi, che i nominativi abbiano il medesimo cognome e si analizzano i casi in cui anche uno o più nomi risultano in comune, attraverso degli esempi: &lt;br /&gt;
* Nomi_A = {&amp;quot;Lorenzo&amp;quot;, &amp;quot;Mario&amp;quot;, &amp;quot;Luca&amp;quot;}; Nomi_B = {&amp;quot;Stefano&amp;quot;, &amp;quot;Mario&amp;quot;}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F01])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In questo caso sono elementi di disambiguazione i nomi ''Lorenzo'' e ''Luca'' per il primo nominativo e ''Stefano'' per il secondo, bisognerà quindi far sì che almeno uno tra tali nomi compaia sempre nelle ''regex'' associate ai nominativi in questione. L'occorrenza ''Mario &amp;lt;cognome&amp;gt;'' rimane ambigua e non può essere trattata.&lt;br /&gt;
* Nomi_A = {&amp;quot;Lorenzo&amp;quot;, &amp;quot;Mario&amp;quot;, &amp;quot;Luca&amp;quot;}; Nomi_B = {&amp;quot;Mario&amp;quot;, &amp;quot;Luca&amp;quot;}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F02])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
L'insieme Nomi_B risulta un sottoinsieme di Nomi_A, di conseguenza solo il primo nominativo presenta degli elementi utili per risolvere l'ambiguità. Nel pattern relativo al primo nominativo dovrà essere presente almeno un tra i nomi non in comune, mentre il pattern del secondo nominativo rappresenterà inevitabilmente espressioni ambigue poiché riconducibili all'altro. Le soluzioni possibili sono due: rifiutarsi di effettuare il trattamento del secondo nominativo oppure decretare che esso è riconosciuto se e solo se appare nella sua forma estesa, presentando quindi tutti i nomi. Quest'ultima soluzione è ragionevole e la si sceglie, poiché così si aumentano, per quanto possibile, le sequenze &amp;quot;minimizzabili&amp;quot;, e viene inoltre messo in conto di informare l'utente opportunamente sulla gestione di questo genere di omonimia per rendere le operazioni trasparenti.&lt;br /&gt;
* Nomi_A = Nomi_B = {&amp;quot;Lorenzo&amp;quot;, &amp;quot;Mario&amp;quot;, &amp;quot;Luca&amp;quot;}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F03])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Qualora l'insieme dei nomi dei due nominativi sia identico risulta impossibile distinguerli e non possono in alcun modo essere trattati, poiché l'ordine con cui compaiono i nomi di un nominativo non rappresenta un elemento di disambiguità. I dati appartenenti a persone completamente omonime contenuti in uno stesso documento, quindi, non sono &amp;quot;minimizzabili&amp;quot; distintamente.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva che è di fondamentale importanza che i documenti che gli utenti forniscono siano grammaticalmente corretti, in quanto un errato uso dei segni di interpunzione può rendere impossibile l'applicazione delle ''regular expression''. Si prenda ad esempio una sequenza anomala di caratteri in cui non è corretto l'uso delle virgole, come &amp;quot;''Amorosa Mario Rossi Giacomo''&amp;quot;: supponendo che nel documento si vogliano trattare i nominativi ''Amorosa Mario'', ''Rossi Mario'' e ''Rossi Giacomo'', risulta impossibile identificare quali tra questi siano rappresentatati nella sequenza.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In conclusione, risultano quindi individuate le strategie che permettono di formulare ''regular expressions'' anche per i nominativi soggetti ad omonimia.&lt;br /&gt;
&lt;br /&gt;
====Formattazione dei documenti====&lt;br /&gt;
 &lt;br /&gt;
I documenti prodotti in enti ed organizzazioni presentano generalmente formattazioni e non sono puramente testuali. Si vuole qui considerare quale debbano essere le interpretazioni più adatte da dare agli elementi grafici per rendere sempre efficace il riconoscimento dei nominativi. In particolare, quindi, non si tratteranno gli elementi di punteggiatura, come parentesi o virgolette, poiché già compresi nelle ''regex'', bensì tutti gli elementi che in un pattern composto da caratteri non sono espressi. Si inizia dunque la rassegna:&lt;br /&gt;
* Elementi di formattazione del testo&lt;br /&gt;
I font, la dimensione dei caratteri, il grassetto, il corsivo, l'evidenziazione e tutti i possibili elementi di modifica della apparizione grafica del testo non alterano il significato dei lessemi coinvolti. Se il cognome di un nominativo è posto in grassetto ed il nome no, ad esempio, la coppia nome-cognome rappresenta sempre il nominativo iniziale; lo stesso vale per gli altri elementi citati.&lt;br /&gt;
* Aree di comparizione del testo&lt;br /&gt;
In genere ogni documento è formato da più sezioni, ha un corpo principale ed eventuali titoli, note a piè pagina, intestazioni ed altre possibili aree. Il trattamento di &amp;quot;minimizzazione&amp;quot;, secondo il ''GDPR'', deve essere effettuato al documento in ogni sua parte, ma ogni sezione deve essere elaborata in maniera indipendente dalle altre sezioni in quanto rappresenta un blocco logico a sé. Ciò significa che, ad esempio, bisogna individuare eventuali nominativi presenti nel titolo, ma non bisogna considerare nominativo una sequenza di parole che è posta in parte nel titolo e in parte nel primo paragrafo del testo.&lt;br /&gt;
* Elementi blocco&lt;br /&gt;
Gli elementi blocco, come ad esempio le immagini, possono causare un'interruzione netta in un paragrafo, suddividendolo quindi in più blocchi logici, che devono essere analizzati separatamente; tuttavia nel caso in cui questi elementi siano posti ''fluttuanti'', ossia ancorati ai bordi della pagina, il testo scorre in un unico flusso e forma quindi un unico blocco logico.&lt;br /&gt;
* Divisione in sillabe&lt;br /&gt;
Un problema rilevante nella formattazione del documento è che spesso, per esigenze estetiche, contiene delle parole divise in sillabe poste su righe diverse e separate da un trattino. Ovviamente se un nome va a capo a fine linea non perde il suo significato semantico, bisognerà quindi continuare a riconoscerlo.&lt;br /&gt;
* Tabelle&lt;br /&gt;
Molti documenti, specialmente quelli contenenti ingenti quantità di nominativi, possono essere strutturati in forma tabellare. Trascurando una trattazione per esteso delle modalità con cui i nominativi potrebbero comparire nelle tabelle, si considera esclusivamente il caso di gran lunga più ricorrente. In genere, infatti, in una tabella contenente dei nominativi, essi sono presenti nella stessa colonna o in colonne contigue: l'una contenente i nomi, l'altra il cognome, o viceversa. Senza basarsi sull'intestazione delle colonne, si può valutare se il contenuto di due celle adiacenti poste su di una stessa riga faccia match con il pattern di un nominativo, ed in caso ciò accada si può affermare la coppia di celle individuata rappresenta un nominativo.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva che si sono fornite solamente le interpretazioni più plausibili e comuni a questi elementi grafici e non si è ideato alcun particolare algoritmo per la loro elaborazione. L'espressione di tali strutture, infatti, è fortemente determinata dal formato in cui il documento è redatto. Si rimanda, quindi, ai capitoli successivi per specificazioni ulteriori della soluzione. Occorre notare, infine, che gli elementi di formattazione non sono descritti da stringhe nel formato delle ''regular expressions'': bisognerà quindi integrare gli elementi presentati in questa sezione con l'approccio ''pattern-based'' adottato.&lt;br /&gt;
&lt;br /&gt;
===Analisi dell'usabilità===&lt;br /&gt;
&lt;br /&gt;
====Elenco dei nominativi da trattare esplicitamente espressi come dati in input====&lt;br /&gt;
&lt;br /&gt;
In questo caso, per usufruire del servizio, l'utente deve fornire un documento contenente una serie di nominativi da trattare. Una garanzia della corretta elaborazione del documento si ha richiedendo all'utente stesso quali siano i nominativi da trattare: in questo modo potranno essere &amp;quot;minimizzati&amp;quot; i dati (cioè i nominativi) di tutte e sole le persone espressamente richieste. In molti plausibili scenari, infatti, è necessario anonimizzare solo alcuni dei nominativi presenti nel documento; ad esempio in un atto giudiziario serve anonimizzare le parti in causa ma non i magistrati. &lt;br /&gt;
&lt;br /&gt;
Questa configurazione del servizio permette quindi all'utente di avere il massimo controllo possibile del risultato. Tuttavia questo approccio è poco pratico nel caso in cui i documenti da trattare contengano grandi quantità di nominativi diversi e, magari, l'utente che ne richiede il trattamento non li conosce; si pensi ad esempio a lunghe graduatorie di concorsi o altro. Si osserva inoltre che anche per pochi nominativi l'usabilità può degradare, se l'inserimento viene fatto con estemporanea digitazione, esposta anche al rischio di possibili errori di battitura, con conseguenti noiose ripetizioni delle operazioni.&lt;br /&gt;
&lt;br /&gt;
Si osserva, infine, che il sistema progettato è sufficientemente robusto nel trattare i nominativi in input espressi da un utente che ha digitato caratteri maiuscoli o minuscoli violando le convenzioni grammaticali. Supposto che il documento trattato debba essere grammaticalmente corretto, infatti, si ha la garanzia che i nomi ivi presenti comincino con una maiuscola; è sufficiente, quindi, forzare una conversione ''to-upper-case'' dei nomi inseriti dall'utente e le ''regex'' progettate funzionano correttamente. Un discorso a parte va fatto per i cognomi inseriti dall'utente, in quanto essi possono comparire con la prima lettera sia maiuscola che minuscola. L'inserimento di un cognome iniziante con una minuscola non crea grossi problemi, in quanto in tal caso la ''regex'' risultante sarebbe totalmente ''case-insensitive'' per il cognome, mentre l'aggiunta di un cognome cominciante con una maiuscola determina una ''regex'' ''case-insensitive'' per la prima lettera del cognome; qualora quindi un utente inserisse un nominativo tutto in maiuscolo, le occorrenze del cognome, presenti nel documento, inizianti con una lettera minuscola non verrebbero riconosciute.&lt;br /&gt;
Per le altre lettere dopo la prima, sia per i nomi che per i cognomi, il pattern è stato progettato ''case-insensitive'', quindi non emergono problemi. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In sintesi, il rischio che vengano introdotte delle ambiguità lessicali, incaricando l'utente dell'inserimento dei nominativi, è piuttosto basso ed il controllo che si ha sui nominativi è il massimo desiderabile, mentre i requisiti di usabilità risultano penalizzati.&lt;br /&gt;
&lt;br /&gt;
====Elenco dei nominativi da trattare dedotti automaticamente da un dizionario====&lt;br /&gt;
&lt;br /&gt;
Se si desidera privilegiare la tematica dell'usabilità nella progettazione del servizio, risulta necessario individuare delle strategie che semplifichino il più possibile i compiti che devono essere svolti dall'utente. L'unica operazione che inevitabilmente resta a suo carico è l'upload del documento da trattare; non è infatti necessario richiedergli l'elencazione dei nominativi dei nominativi da trattare, in quanto questi possono essere dedotti automaticamente impiegando dei dizionari, dei quali va quindi valutato il contenuto e le modalità di utilizzo. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si scarta subito l'ipotesi di dedurre automaticamente i nominativi basandosi unicamente sul fatto che le iniziali di nomi e cognomi siano maiuscole; come già argomentato infatti l'uso delle lettere maiuscole non è limitato solo a questi usi e, inoltre, non si può avere la certezza che un cognome inizi con una maiuscola.&lt;br /&gt;
&lt;br /&gt;
Sono disponibili fortunatamente alcuni dizionari di nomi ed altri di cognomi, in diverse lingue; si fa qui riferimento a quelli di &amp;quot;Data World&amp;quot; (un'azienda focalizzata sulla raccolta, produzione e pubblicazione di dataset: https://data.world) ([0037]).&lt;br /&gt;
&lt;br /&gt;
Si inizia l'analisi inquadrando le dimensioni che un dizionario contenente nomi o cognomi avrebbe. Risalta subito all'occhio la differenza tra il numero di termini contenuti nei due casi: facendo riferimento ai soli nomi e cognomi italiani, risultano esistenti circa 350.000 cognomi ([0036]) e circa 9.000 nomi, dei quale circa 5.000 maschili e circa 4.000 femminili ([0037]); il numero dei cognomi è quindi quasi 40 volte più grande del numero dei nomi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si ipotizza, per chiarire le idee, di applicare questi dizionari in uno scenario reale, in cui, ad esempio, si vuole trattare un documento di 10 pagine contenente 5.000 parole. Si trascurano inoltre i meccanismi che permettono di ricondurre un nome od un cognome ad un nominativo per concentrarsi unicamente sul numero di confronti necessari da effettuare nell'elaborazione. Nel peggiore dei casi possibili, ossia quando nessuna parola del documento compare tra i termini del dizionari, e dove occorre quindi confrontare ogni singola parola del documento con tutti i termini del dizionario, per semplice moltiplicazione si ottiene che l'impiego di un dizionario di nomi darebbe luogo a 45.000.000 confronti, mentre un dizionario di cognomi ben a 1.750.000.000 confronti. Se invece le parole nel documento fossero 50.000 si avrebbero 450.000.000 di confronti nel primo caso e 10.750.000.000 nel secondo. In sintesi, sebbene il rapporto tra il numero di confronti nei due casi rimanga sempre costante (circa 1:40) indipendentemente dalla lunghezza del documento, la differenza tra il numero di confronti cresce proporzionalmente al numero di parole che vengono sottoposte all'elaborazione. Per quantificare, infine, attraverso un unità di tempo, la differenza esistente tra l'impiego delle due diverse tipologie di dizionario, si realizza un semplice programma java, di cui si riporta qui sotto il contenuto del metodo principale, che realizza i confronti necessari attraverso l'uso di ''regular expression'':&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
final String regex = &amp;quot;\bLorenzo\b&amp;quot;;&amp;lt;br/&amp;gt;&lt;br /&gt;
final String string =  ... //testo di prova&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);&amp;lt;br/&amp;gt;&lt;br /&gt;
final Matcher matcher = pattern.matcher(string);&amp;lt;br/&amp;gt;&lt;br /&gt;
int start, total;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
start = System.currentTimeMillis();&lt;br /&gt;
while (matcher.find()) {&lt;br /&gt;
    System.out.println(&amp;quot;Full match: &amp;quot; + matcher.group(0));&lt;br /&gt;
    for (int i = 1; i &amp;lt;= matcher.groupCount(); i++) {&lt;br /&gt;
        System.out.println(&amp;quot;Group &amp;quot; + i + &amp;quot;: &amp;quot; + matcher.group(i));&lt;br /&gt;
    }&lt;br /&gt;
} &amp;lt;br/&amp;gt;&lt;br /&gt;
total = System.currentTimeMillis() - start;&lt;br /&gt;
System.out.println(&amp;quot;Total: &amp;quot; + total + &amp;quot; ms&amp;quot;);&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Eseguendo il test più volte, inserendo fino a 10 occorrenze della parola &amp;quot;Lorenzo&amp;quot; nel testo, si ha un tempo di elaborazione medio di circa 3 ms, con prestazioni di picco di 2 ms, ottenibili con poche occorrenze del nome presenti, e tempo di attesa massimo di 6 ms, dovuto alla presenza invece a una presenza più frequente del nome nel testo.&lt;br /&gt;
Questo fenomeno si comprende meglio ricordando che, come spiegato nel capitolo precedente, le ''regular expressions'' ottimizzano la ricerca, considerano le stringhe del testo trattato solo finché necessario, ossia fino a quando non vi è certezza che esse corrispondano o non corrispondano ad un match. Ogni volta che nel testo si presenta una parola che inizia con una lettera diversa dalla 'L' di &amp;quot;Lorenzo&amp;quot;, la ricerca procede direttamente con la valutazione della parola successiva, ignorando i rimanenti caratteri della parola. &lt;br /&gt;
&lt;br /&gt;
Risulta, invece, più onerosa la verifica della corrispondenza tra una stringa ed il pattern desiderato, poiché in questo caso vanno elaborati tutti i caratteri della parola. Come caso limite, si è posta come stringa da elaborare la sequenza di caratteri &amp;quot;Lorenzo &amp;quot; ripetuta 500 volte: il tempo di esecuzione medio del programma risultante, a parità di piattaforma, è stato di circa 25 ms.&lt;br /&gt;
&lt;br /&gt;
Un'altra diretta conseguenza di questo meccanismo di confronto è che all'aumentare del numero di parole nel documento non corrisponde un eccessivo aumento del tempo di esecuzione: considerando un documento di 5000 parole, con 0 occorrenze del nome &amp;quot;Lorenzo&amp;quot; il tempo di esecuzione medio risulta di 9 ms, con 10 occorrenze di 10 ms, con 100 occorrenze di 15 ms.&lt;br /&gt;
&lt;br /&gt;
Occorre precisare, prima di formulare ulteriori ragionamenti, che in documento di 5.000 parole potranno essere presenti al più 2500 coppie nome-cognome; in un dizionario con più di 2.500 termini almeno uno di questi non contribuirà nell'individuazione di un nominativo. Se poi sono presenti altre parole oltre ai nominativi nel documento, la percentuale di nomi che presenterà 0 occorrenze crescerà di conseguenza. Ad ogni modo, si sceglie di sviluppare i ragionamenti considerando necessario il tempo medio di 10 ms per individuare le occorrenze di un termine di un dizionario in un documento di 5.000 parole; questo tempo è sicuramente maggiore rispetto al caso reale, ma valutando per eccesso questo valore è possibile trascurare il tempo impiegato nelle altre operazioni di routine a supporto dell'algoritmo di ricerca.&lt;br /&gt;
&lt;br /&gt;
Ritornando all'esempio di partenza, considerando quindi necessari 10 ms per individuare le occorrenze di un termine di un dizionario in un documento di 5.000 parole, risulta che l'identificazione di tutti i cognomi contenuti nel testo richieda circa 3.500 secondi, (quasi un'ora!), mentre l'individuazione dei nomi &amp;quot;solo&amp;quot; 90 secondi.&lt;br /&gt;
I tempi di attesa che l'utente dovrebbe aspettare sono estremamente elevati e irragionevoli, specialmente se calati nel contesto nelle ''web application''. Come primo espediente per ovviare al problema si decide di abbandonare completamente l'idea di impiegare un dizionario di cognomi, in quanto, seppur si individuassero delle soluzioni in grado di effettuare il riconoscimento di tutte le occorrenze di un termine in un documento indipendentemente dalla lunghezza in solo 1 ms (irreale), sarebbero comunque necessari 3 minuti e 50 secondi per l'elaborazione. Non verranno quindi neppure trattate possibili soluzioni che prevedono l'applicazione di entrambi i dizionari.&lt;br /&gt;
&lt;br /&gt;
I 90 secondi richiesti dal dizionario di nomi, invece, risultano anch'essi eccessivi, ma attraverso opportune valutazioni si possono individuare delle strategie che consentono la minimizzazione del tempo necessario all'elaborazione dei documenti. Tali metodi di ottimizzazione saranno trattati in un successivo capitolo, mentre ora ci si continua a concentrare sulle modalità di impiego del dizionario.&lt;br /&gt;
&lt;br /&gt;
Per inciso, si osserva che i problemi di efficienza sono strettamente legati al riconoscimento automatico dei nominativi, in quanto in questo caso devono essere applicate quasi una decina di migliaia di ''regex'' diverse; nel caso in cui i nominativi da elaborare e le ''regex'' a loro associate siano noti, si ha a che fare con un numero esiguo di pattern da trattare e l'esecuzione del programma risulta infinitamente più rapida.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per migliorare l'efficacia del servizio sarebbe opportuno introdurre nel dizionario anche nomi stranieri, sempre più diffusi in una società sempre più globalizzata. Il tempo di esecuzione medio del riconoscimento, già critico, crescerebbe ulteriormente: si decide allora di introdurre nel dizionario i soli nomi inglesi, in totale quasi 5500 ([0037]). Considerando sempre un tempo medio di esecuzione di 10 ms per nome, con un dizionario di circa 14.500 termini si avrebbe un tempo di esecuzione medio complessivo di 145 secondi, ossia pari a 2 minuti e 25 secondi, e risulta ancora possibile effettuare alcune ottimizzazioni che lo riducono ad un livello accettabile.&lt;br /&gt;
&lt;br /&gt;
Una volta individuati i nomi contenuti nel documento occorre stabilire se essi fanno parte di un nominativo, progettando un'opportuna ''regular expression''. È importante notare che per conseguire questo scopo bisogna individuare la soluzione più efficiente possibile.&lt;br /&gt;
&lt;br /&gt;
Un nominativo, come già ripetuto più volte, è composto da uno o più nomi e da un cognome. Individuato un nome, la priorità che si ha è verificare se accanto ad esso sia presente un cognome. Finora i cognomi sono stati supposti non regolamentati da alcun pattern specifico, ma è necessario formularne almeno uno per consentirne il riconoscimento automatico. È ragionevole supporre che un cognome sia formato da massimo due parole, separate da spazio o apostrofo, sempre inizianti entrambe con una maiuscola, fatta eccezione per la prima parola laddove essa sia una preposizione semplice o articolata oppure un articolo, tenendo conto dei possibili troncamenti, come &amp;lt;i&amp;gt;d'&amp;lt;/i&amp;gt; e &amp;lt;i&amp;gt;dell'&amp;lt;/i&amp;gt;. Inoltre per verificare se un termine adiacente al nome trovato rappresenti un nome si evita di impiegare nuovamente il dizionario per non gravare ulteriormente sul tempo di esecuzione. Inoltre, si nota che avendo supposto un cognome composto da massimo due parole inizianti con una lettera maiuscola, un altro nome, oltre quello trovato dal dizionario, viene già automaticamente riconosciuto qualora il cognome sia composto da una sola parola. Rinunciando ad individuare nominativi composti da tre nomi o più, si formula una ''regular expression'' per il riconoscimento automatico in seguito al identificazione di un nome, qui indicato con il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nome&amp;gt;&amp;lt;/span&amp;gt;, supponendo il cognome come precedentemente indicato e ipotizzando la presenza di un ulteriore nominativo.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;prep&amp;gt; := d((a|e)(l(l[aeo]?)?|i|gli?)?|i)?|(ne|a|su)(l(l[aeo]?)?|i|gli)?|l[aeo]?|co[iln]?|i[ln]?|gli|per&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cognome&amp;gt; := (([A-Z][a-zA-ZÀ-ÖØ-öø-ÿ]*|&amp;lt;prep&amp;gt;)('|\s))?[A-Z][a-zA-ZÀ-ÖØ-öø-ÿ]+&lt;br /&gt;
&lt;br /&gt;
&amp;lt;second_name&amp;gt; := [A-Z][a-zA-ZÀ-ÖØ-öø-ÿ]+&lt;br /&gt;
&lt;br /&gt;
&amp;lt;regex&amp;gt; := (&amp;lt;second_name&amp;gt;\s)?(&amp;lt;nome&amp;gt;)\s&amp;lt;cognome&amp;gt;|&amp;lt;cognome&amp;gt;\s(&amp;lt;nome&amp;gt;)(\s&amp;lt;second_name&amp;gt;)?&lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Nella scrittura della ''regex'' si è prestata particolare attenzione all'utilizzo della simbologia per rendere l'espressione il più performante possibile, attraverso il massimo sfruttamento dei cortocircuiti logici e l'opportuno ordinamento dei caratteri (sono stati anteposti i caratteri comuni a più preposizioni od articoli). Inoltre, per alleggerire la ''regex'' si è rinunciato all'utilizzo dei caratteri dell'alfabeto latino non appartenenti ai primi due blocchi Unicode.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
È mostrata in figura la corretta elaborazione di 57 possibili casi di cognomi diversi&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F04])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva tuttavia che in alcune circostanze, come nella frase &amp;quot;''di Amorosa Lorenzo non si hanno notizie''&amp;quot;, accade che un parola (&amp;quot;''di''&amp;quot; in questo caso), non sia parte del cognome ma il programma non è in grado di riconoscerlo. Questa ambiguità è fortemente dipendente dal contesto e non è possibile trattarla senza significativi degradi delle performance; quindi è necessario rinunciare a trattarla, accettando riconoscimenti erronei. In altre situazioni, invece, dove magari si sta elaborando la stringa contenente il nominativo ''Mario Lorenzo'', risulta impossibile determinare quale tra i due termini sia il nome e quale il cognome; cioè significa che l'unico trattamento di &amp;quot;minimizzazione&amp;quot; automatico che risulta ragionevole applicare è la sostituzione del nominativo con uno pseudonimo, non il troncamento o l'alterazione dei nomi.&lt;br /&gt;
In conclusione, con il riconoscimento automatico dei nominativi si migliora complessivamente l'usabilità del servizio, in quanto l'utente non deve digitare i nominativi, ma la latenza introdotta è notevole, si è soggetti a rischi di ambiguità e non è in alcun modo esprimibile la preferenza su quali nominativi si desidera &amp;quot;minimizzare&amp;quot; o meno. La soluzione così ideata non risulta quindi adeguata.&lt;br /&gt;
&lt;br /&gt;
====Soluzione ibrida adottata====&lt;br /&gt;
Entrambe le tipologie di riconoscimento prima individuate hanno significativi problemi, si cerca quindi di sintetizzare una soluzione in grado di trarre i vantaggi dell'una e dell'altra. Risulta efficace, in particolare, che il documento venga inizialmente trattato tramite dizionari, evitando all'utente l'onere di specificare i nominativi, e che in seguito venga lasciata all'utente la possibilità di intervenire.&lt;br /&gt;
Infatti, esso potrebbe voler esprimere delle preferenze su quali nominativi debbano essere trattati tra quelli individuati e gestire gli eventuali errori di riconoscimento dovuti a richieste di trattamento di nominativi aventi un nome non presente nel dizionario o anche dovuti a casi di ambiguità lessicale già presentati.&lt;br /&gt;
&lt;br /&gt;
Una volta inserito il documento e terminata l'elaborazione tramite il dizionario, l'utente può sia richiedere l'immediato download del file ed effettuare le operazioni prima definite, attraverso un'opportuna interfaccia. Per fornire il supporto alle esigenze più disparate, si prevede la possibilità di:&lt;br /&gt;
# eseguire download del file trattato unicamente con il dizionario&lt;br /&gt;
# ripetere la &amp;quot;minimizzazione&amp;quot; del documento, specificando:&lt;br /&gt;
## nuovi nominativi&lt;br /&gt;
## quali nominativi tra quelli precedentemente individuati ''non'' si vogliono trattare&lt;br /&gt;
## quale parola/e dei nominativi individuati rappresenta il cognome (in tal caso, si possono utilizzare altri metodi, oltre alla sostituzione con pseudonimo, per il trattamento)&lt;br /&gt;
## quale parola/e dei nominativi individuati non compone il nominativo (situazione che si verifica quando ci si imbatte in una ambiguità).&lt;br /&gt;
&lt;br /&gt;
Senza soffermarsi in questo momento sull'intera sequenza concreta di interazioni tra utente e servizio, si osserva che l'unico vincolo non funzionale da valutare resta il tempo medio di attesa dell'utente. L'usabilità complessiva è molto buona ed i vincoli funzionali sono soddisfatti.&lt;br /&gt;
&lt;br /&gt;
===Scelta dei formati da trattare===&lt;br /&gt;
&lt;br /&gt;
Una considerazione intuitiva, ed una buona prassi, è che un documento contenente dati personali sia pseudonimizzato o anonimizzato quanto prima possibile e cioè quando è ancora solo nelle mani del suo autore: questo approccio scongiura che informazioni sensibili e dati personali in chiaro ''sfuggano'' in rete.&lt;br /&gt;
Si può per questo ragionevolmente ipotizzare che i naturali destinatari del servizio siano gli stessi autori (creatori) che redigono il documento. Nello scenario tipico di utilizzo, infatti, il fruitore del servizio procederà al trattamento dei dati non appena avrà finito di scrivere il documento del quale, essendone autore, potrà scegliere il formato. Si osserva che potrebbe accadere che il documento sia redatto da terzi: in tal caso l'utente che richiede il trattamento può scegliere il formato in maniera indiretta concordandolo con il redattore. Avendo quindi l'utente la possibilità di stabilire il formato del proprio documento, risulta ragionevole progettare un servizio che lavori su un solo formato.&lt;br /&gt;
A questo punto occorre individuare quale sia il formato che maggiormente si presta alle finalità del servizio.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Una possibilità è quella di richiedere all'utente di inserire come documento da trattare un semplice file di testo in formato ''txt'': in questo modo ci sarebbe il grande vantaggio di trattare file molto semplici, riducendo così al minimo la complessità realizzativa, e inoltre si avrebbe  l'indipendenza dagli editor di testo utilizzati, in quanto tutti supportano i file in formato ''txt''. &lt;br /&gt;
Risulta tuttavia sconveniente utilizzare questo formato, poiché non ha alcuna capacità espressiva per gestire elementi complessi come tabelle, modifiche allo stile del testo e così via. &lt;br /&gt;
Bisogna quindi optare per un formato in grado di gestire questi elementi, al costo di aumentare la complessità della progettazione, ricordando sempre che è necessario allo stesso tempo che tale formato sia supportato da tutti i principali editor di testo.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Con facilità è possibile individuare quali sono i formati di testo più comuni oltre al ''txt'': ''doc'', ''docx'', ''odt'', ''pdf'', ''pages'', ''rtf'', ''tex''. Si passa ora dunque a valutare quale tra questi formati potrebbe meglio soddisfare i requisiti prima enunciati. &lt;br /&gt;
Facendo una cernita iniziale sulla base delle finalità per le quali un formato è utilizzato, si può immediatamente escludere ''tex'', che trova impiego principalmente in ambito scientifico e matematico. In questo settore, infatti, non è richiesta generalmente l'applicazione delle procedura di trattamento dei dati. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt; &lt;br /&gt;
Si può inoltre abbandonare l'idea di trattare documenti con estensione ''pages'', formato proprietario di Apple, poiché utilizzati esclusivamente dall'omonimo editor di testo anch'esso proprietario, e i documenti con estensione ''rtf'', acronimo di ''Rich Text Format'', formato proprietario di Microsoft che supporta una formattazione avanzata, poiché, pur gestito da vari editor, è un formato decisamente datato (ultima versione 1.9.1 risalente a marzo 2008 ([0009])). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si esclude inoltre il formato ''pdf'' per motivi di usabilità: molti editor, infatti, consentono di esportare un documento in questo formato ma non permettono di importarlo. Un utente dopo aver effettuato l'anonimizzazione di un documento non può quindi proseguire modificandolo ulteriormente. Il ''Portable Document Format'', infatti, è ideato per realizzare dei documenti destinati alla sola lettura.&lt;br /&gt;
L'ultima esclusione, piuttosto immediata da effettuare, riguarda il formato ''doc'', binario e proprietario di Microsoft. Esso infatti risulta, a partire dal 2006, soppiantato dal formato ''docx'', sempre proprietario di Microsoft. &lt;br /&gt;
&lt;br /&gt;
Si giunge infine a valutare quale tra gli ultimi due possibili formati rimanenti, ossia ''docx'' e ''odt'', si presta meglio alle finalità del servizio. In via preliminare si osserva che entrambi i formati possiedono ottime capacità espressive, hanno una struttura interna di simile complessità e sono entrambi supportati dai principali editor di testo. È necessario quindi effettuare delle analisi più approfondite per poter sceglierne uno tra i due.&lt;br /&gt;
La struttura del formato ''docx'', sviluppato da Microsoft e formalmente denominato ''Office Open XML Document (OOXML Document)'', è costituita da un file compresso .zip contenente un insieme di file ''XML''. Il formato ''OOXML'' permette la rappresentazione, oltre che di documenti testuali, anche di fogli elettronici (formato ''OOXML 'Workbook'', noto anche come ''xslx'') e di presentazioni (formato ''OOXML Presentation'', noto anche come ''pptx'') ([0008], [0013]).&lt;br /&gt;
Il formato inoltre è stato inizialmente standardizzato nel 2006 dall'&amp;lt;i&amp;gt;ECMA&amp;lt;/i&amp;gt;  (come ''ECMA-376'') e successivamente nel 2008 dall'&amp;lt;i&amp;gt;ISO&amp;lt;/i&amp;gt; e dall'&amp;lt;i&amp;gt;IEC&amp;lt;/i&amp;gt; (come ''ISO/IEC 29500'') in una versione ''transitional'', retrocompatibile con alcune versioni precedenti del formato contenenti elementi deprecati, e in una versione ''strict'', dove tali elementi non sono ammessi. I due standard sono stati poi successivamente aggiornati e sono tutt'ora oggetto di revisioni ([0002]).&lt;br /&gt;
&lt;br /&gt;
Anche la struttura del formato open source ''odt'', sviluppato dall'&amp;lt;i&amp;gt;OASIS&amp;lt;/i&amp;gt; e formalmente denominato ''OpenDocument Text'', è basata su uno zip contenente un insieme di file ''XML''. Inoltre, il formato ''OpenDocument Format (ODF)'' permette di trattare fogli elettronici (formato ''OpenDocument Spreadsheet'', noto anche come ''ods'') e presentazioni (formato ''OpenDocument Presentation'', noto anche come ''odp'') ([0007]). Anche ''OpenDocument Text'' è stato standardizzato, in particolare dall'&amp;lt;i&amp;gt;OASIS&amp;lt;/i&amp;gt; stesso nel 2005 e dall'&amp;lt;i&amp;gt;ISO/IEC&amp;lt;/i&amp;gt; nel 2006, ed è soggetto a revisioni e aggiornamenti ([0003]).&lt;br /&gt;
&lt;br /&gt;
In sintesi, basandosi sulla struttura dei documenti e sulla standardizzazione dei formati, non è ancora possibile individuare quale sia il formato migliore. L'unico elemento che potrebbe portare punti a favore del formato ''odt'' è che esso, a differenza del formato ''docx'', è aperto, tuttavia, essendo le specifiche di entrambi i formati pubbliche, ciò non rappresenta un fattore determinante nell'elezione del formato.&lt;br /&gt;
Entrambi i formati, inoltre, sono largamente supportati dai word processors.&lt;br /&gt;
&lt;br /&gt;
Le seguenti tabelle riepilogano il supporto all'uno ed all'altro formato dei ''word-processors'' più usati, ossia ''Microsoft Office Word'', ''LibreOffice Writer'', ''OpenOffice Writer'' e ''Pages''. &lt;br /&gt;
Le tabelle sono tratte da wikipedia ([0000], [0001], [0006]). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;i&amp;gt;Supporto fornito dagli editor di testo al formato docx&amp;lt;/i&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  !! Microsoft Office Word !! LibreOffice Writer !! OpenOffice Writer !! Pages&lt;br /&gt;
|-&lt;br /&gt;
! Version&lt;br /&gt;
|| 2013, 2011 for Mac || All versions || 3.0 || '08&lt;br /&gt;
|-&lt;br /&gt;
! Operating systems&lt;br /&gt;
|| Windows, Mac OS X || Windows, OS X, Linux, Unix, Android || Windows, Linux, Unix, Mac OS X || Mac OS X&lt;br /&gt;
|-&lt;br /&gt;
! Office suite&lt;br /&gt;
|| Microsoft Office ||  || OpenOffice.org || iWork&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
|| Microsoft || The Document Foundation || Apache OpenOffice || Apple Inc.&lt;br /&gt;
|-&lt;br /&gt;
! License&lt;br /&gt;
|| proprietary || MPL || LGPL || proprietary&lt;br /&gt;
|-&lt;br /&gt;
! ECMA-376&lt;br /&gt;
|| yes || yes || yes || yes&lt;br /&gt;
|-&lt;br /&gt;
! ISO/IEC 29500:2008&lt;br /&gt;
|| yes || yes || || &lt;br /&gt;
|-&lt;br /&gt;
! Notes&lt;br /&gt;
||  ||  || Import only ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;i&amp;gt;Supporto fornito dagli editor di testo al formato odt&amp;lt;/i&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  !! Microsoft Office Word !! LibreOffice Writer !! OpenOffice Writer &lt;br /&gt;
|-&lt;br /&gt;
! Version&lt;br /&gt;
|| 2007 SP2 || 4.0.3 || 3.0.0&lt;br /&gt;
|-&lt;br /&gt;
! Operating systems&lt;br /&gt;
|| Windows || Unix-based systems, Mac OS X, Solaris || Windows, Linux, Unix-based systems, Mac OS X, Solaris&lt;br /&gt;
|-&lt;br /&gt;
! Office suite&lt;br /&gt;
|| Microsoft Office ||  || OpenOffice.org&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
|| Microsoft || The Document Foundation || Apache OpenOffice&lt;br /&gt;
|-&lt;br /&gt;
! License&lt;br /&gt;
|| Proprietary || MPL || LGPL&lt;br /&gt;
|-&lt;br /&gt;
! ISO/IEC 26300:2006&lt;br /&gt;
|| yes || yes || yes&lt;br /&gt;
|-&lt;br /&gt;
! Notes&lt;br /&gt;
|| some limitations || Multiple ODF versions supported (ISO/ODF 1.0/1.1/1.2/1.2 Extended) || adjustable ODF version (ISO/ODF 1.2) &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si possono effettuare le seguenti osservazioni:&lt;br /&gt;
* ''Microsoft Office Word'' è, in ambiente Microsoft, il word processor maggiormente usato; è molto usato anche in ambiente Apple Mac. Esso offre il pieno supporto al formato ''OOXML Document''; solo parzialmente invece gestisce il formato ''OpenDocument Text'': il processamento di file con estensione ''odt'' con questo editor comporta la perdita di alcune informazioni secondarie.&lt;br /&gt;
* ''LibreOffice Writer'', l'editor open source maggiormente utilizzato, supporta pienamente entrambi formati. Nato con lo scopo di gestire i file con formato ''OpenDocument Text'', attualmente supporta completamente anche il formato ''OOXML Document''. &lt;br /&gt;
* ''OpenOffice Writer'', un altro degli editor di testo tra i più utilizzati, supporta pienamente ''odt'', mentre è solo in grado di importare i file con estensione ''docx''.&lt;br /&gt;
* ''Pages'', il word process installato a default sui Mac della Apple e, di conseguenza anche maggiormente usato su questi dispositivi, non offre supporto al formato ''odt'', ma elabora correttamente i documenti con estensione ''docx'' ([0005],[0004]). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Queste osservazioni evidenziano che quindi è impossibile adottare un formato supportato da tutti gli editor; la scelta va allora indirizzata verso quello maggiormente supportato dai word processor più popolari.&lt;br /&gt;
Per avere un'indicazione di ''popolarità'', e quindi per poter comprendere meglio quali tra gli editor prima citati siano i più usati, si può fare un'analisi, tramite motori di ricerca, di quanti file con una certa estensione siano presenti in rete.&lt;br /&gt;
È possibile, ad esempio, ricercare su Google i file che contengono nel proprio nome una determinata sequenza di caratteri o aventi una certa estensione (''filetype''). Sono qui presentati i risultati delle interrogazioni riguardo ai file aventi formato ''docx'', ''doc'' e ''odt'' ed il cui nome contiene uno dei caratteri, fra i più frequenti, &amp;quot;1&amp;quot; o &amp;quot;a&amp;quot; o &amp;quot;e&amp;quot;. L'investigazione è stata effettuata inserendo nella barra di ricerca di Google le stringhe ''1 filetype:docx'', ''a filetype:docx'' e così via.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Formato cercato !! Documenti con &amp;quot;1&amp;quot; nel nome !! Documenti con &amp;quot;a&amp;quot; nel nome !! Documenti con &amp;quot;e&amp;quot; nel nome&lt;br /&gt;
|-&lt;br /&gt;
| docx || 16.900.000  || 12.800.000 || 8.730.000&lt;br /&gt;
|-&lt;br /&gt;
| odt || 736.000 || 667.000 || 507.000&lt;br /&gt;
|-&lt;br /&gt;
| doc || 32.300.000 || 26.300.000 || 21.500.000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Effettivamente il formato più diffuso è il ''doc''; tuttavia esso è supportato per retro-compatibilità anche dagli editor che supportano formati ''OOXML'', con i quali non si ha difficoltà nel convertire i documenti dal formato ''doc'' al ''docx''. In conclusione, quale che sia l'editor più diffuso, è ragionevole adottare il formato ''OOXML Document'' per le finalità del servizio, in quanto molto diffuso, ben supportato dagli editor e avente ottime capacità espressive. Di conseguenza i documenti che saranno elaborati dovranno essere forniti dall'utente in tale formato. In successive sezioni verrà approfondita la struttura dei documenti ''OOXML''.&lt;br /&gt;
&lt;br /&gt;
===Privacy by design===&lt;br /&gt;
&lt;br /&gt;
L'Art. 25 del ''GDPR'', con i Considerando 75 e 78, ha per titolo e per oggetto la &amp;quot;protezione dei dati fin dalla progettazione e protezione per impostazione predefinita&amp;quot; ([0035]), perfettamente in linea con i concetti di &amp;quot;minimizzazione&amp;quot;, già richiamati.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Il senso dell'Art. 25 viene spesso sintetizzato con l'espressione &amp;quot;''PbD - privacy by design, privacy by default''&amp;quot; ([0035]). Il principio fissato nell'Art. 25 dovrà sempre più essere tenuto ben presente nell'ambito dell'ingegneria del software, in quanto impone di adottare nuove cautele nella realizzazione delle applicazioni software.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Del principio ''PbD'' si è ben tenuto conto nella progettazione descritta in questa tesi. In particolare, relativamente alla ''privacy by design'', si è fatto in modo che nessun dato personale permanga registrato sul sistema di esecuzione, o altrove, al termine dell'applicazione. Anche laddove l'applicazione termini in modo anomale non vi sono strutture dati superstiti, che restano memorizzate sul sistema.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Marginale in questa tesi è la nozione di ''privacy by default'', giacché l'applicazione non offre all'utente alcuna opzione che possa indurlo in errore ed acconsentire a trattamenti dei dati personali, oltre quello realizzato dall'applicazione.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
È utile osservare quanto sia importante esprimere queste impostazioni di progettazione fra le condizioni d'uso presentate all'utente: esse costituiscono uno dei presupposti affinché l'utente abbia piena fiducia (''trust'') nel servizio, lo utilizzi, lo divulghi, lo renda un servizio di successo.&lt;br /&gt;
&lt;br /&gt;
==Architettura del servizio== &lt;br /&gt;
&lt;br /&gt;
===I componenti software nell'architettura LAMP===&lt;br /&gt;
&lt;br /&gt;
Il servizio è realizzato in forma di ''web-based application'' poiché, come già illustrato nell'introduzione, si intende renderlo disponibile per il massimo numero di utenti possibili. Nella progettazione e realizzazione dell'architettura web si adotta la piattaforma ''LAMP'', il cui nome deriva dall'acronimo dei componenti open source che la realizzano (il sistema operativo Linux, il server HTTP Apache, il sistema per la gestione di database relazionali MySQL ed il linguaggio di programmazione PHP). Poichè il modello è composto da quattro livelli, spesso si parla anche di ''stack LAMP''. Uno degli elementi di forza del modello ''LAMP'' è che i componenti dei vari ''layer'' sono sostituibili, a seconda delle esigenze, con dei componenti più adatti, tipicamente open source ([0015], [0018], [0019]). Basando la piattaforma su un sistema operativo della famiglia di Microsoft Windows, ad esempio, si ottiene uno ''stack WAMP'', mentre se si usa un sistema operativo Mac OS si realizza uno ''stack MAMP''. Un'architettura web basata sul modello ''LAMP'' può, inoltre, essere integrata con software open source che offre utili funzionalità, come, ad esempio, il monitoraggio (''Nagios''), il load balancing (''Linux Virtual Server''), la rilevazione di accessi illeciti (''Snort'') e il security testing (''netsniff-ng''). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si valutano ora brevemente la diffusione dei componenti tradizionali dello ''stack LAMP'' e le alternative maggiormente usate per i vari ''layer''.&lt;br /&gt;
Le distribuzioni Linux risultano essere la scelta più comune per l'ultimo ''layer'' dello ''stack''. Secondo W3Techs, infatti, nell'ottobre del 2013, il 58.5% dei web server a livello globale avevano come sistema operativo la distribuzione Debian o Ubuntu, mentre il 37.3% una tra RHEL, Fedora e CentOS([0016]). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Tra i web server, Apache risulta essere maggiormente usato. Secondo le stime fatte da Netcraft, a giugno del 2014 circa il 51.9% del milione di siti web più trafficati al mondo usavano un web server Apache, il 19.2% nginx ed il 12.4% Microsoft ([0017]). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
I principali ''DBMS'' relazionali, oltre a MySQL, che possono essere presenti nello ''stack LAMP'' sono MariaDB e PostgreSQL, mentre tra i ''DBMS NoSQL'' MongoDB risulta essere il più comune. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Nello stack, infine, il ruolo di linguaggio di programmazione, solitamente svolto dal linguaggio PHP, spesso è ricoperto dai linguaggi Perl o Python. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva, ad ogni modo, che le informazioni sulla diffusione delle tecnologie non rappresentano un fattore vincolante nella scelta delle stesse, in quanto la piattaforma ''LAMP'' è anche aperta verso molti altri componenti oltre quelli citati; di conseguenza la scelta delle tecnologie da impiegare può essere effettuata basandosi principalmente sui requisiti e sulle specifiche del servizio. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Principi di progettazione per l'architettura===&lt;br /&gt;
&lt;br /&gt;
====Single Responsibility Principle====&lt;br /&gt;
&lt;br /&gt;
Per rendere il servizio maggiormente manutenibile ed estensibile, si presta particolare attenzione al rispetto del ''Single Responsibility Principle'' (''SRP'') ([0020]). Si cerca, quindi, di fattorizzare il software in più moduli, suddividendo tra questi le elaborazioni da svolgere. Un altro importante beneficio che si ottiene dalla fattorizzazione del codice è la riusabilità dei componenti. Ogni singolo modulo, infatti, svolge il proprio compito in maniera indipendente dal resto della applicazione ed è, quindi, riutilizzabile in altri scenari simili senza dover essere re-implementato. Inquadrando meglio questa metodologia di progettazione con i requisiti del servizio e la piattaforma web ''LAMP'', si individuano i due principali compiti a carico dell'applicazione:&lt;br /&gt;
* La gestione dell'interazione web con l'utente per la trasmissione del documento e dei nominativi da trattare&lt;br /&gt;
* Il processamento del documento per effettuare la &amp;quot;minimizzazione&amp;quot; dei dati.&lt;br /&gt;
Questi due differenti ''task'' saranno, quindi, portate a termine da componenti diversi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Progettando la struttura dell'applicazione in questo modo, si disaccoppia completamente la logica di business del servizio dalle interfacce web di comunicazione con l'utente. In un futuro sviluppo sarà possibile, quindi, realizzare nuove interfacce utilizzando altre tecnologie senza dover modificare la logica applicativa. &lt;br /&gt;
&lt;br /&gt;
====Dependency Inversion Principle====&lt;br /&gt;
&lt;br /&gt;
Un altro principio di design architetturale che risulta importante nella progettazione è il ''Dependency Inversion Principle'' (''DIP'') ([0038]). Esso si traduce nella realizzazione di componenti che non dipendono dalle specifiche implementazioni degli altri moduli del sistema, bensì dalle loro ''astrazioni''. &lt;br /&gt;
In relazione all'estensibilità e manutenibilità del prodotto software, infatti, l'impiego di moduli dipendenti direttamente dalla definizione dei metodi presenti in altri componenti risulta problematica: il modulo dipendente deve essere re-implementato ad ogni variazione del modulo da cui dipende.&lt;br /&gt;
Nella programmazione orientata agli oggetti, per rispettare questo principio, si su può fare uso di classi astratte o interfacce, costrutti che definiscono i moduli senza implementarli completamente o senza implementarli affatto.  &lt;br /&gt;
&lt;br /&gt;
===Stile architetturale REST=== &lt;br /&gt;
&lt;br /&gt;
Il modello architetturale del servizio che si sta definendo presenta una serie di caratteristiche, come ad esempio l'indipendenza dei moduli, che permettono di realizzarlo secondo il paradigma delle ''RESTful API''. L'espressione &amp;quot;Representational State Transfer&amp;quot; e il suo acronimo &amp;quot;REST&amp;quot; furono introdotti nel 2000 nella tesi di dottorato di Roy Fielding ([0021]), uno dei principali autori delle specifiche dell'Hypertext Transfer Protocol (HTTP). Roy Fielding descrive il ''Representational State Transfer'' come uno stile architetturale (&amp;quot;''architectural style''&amp;quot;), ovvero un'astrazione degli elementi di un'architettura all'interno di un sistema hypermedia distribuito. ''REST'' non specifica i dettagli dell'implementazione dei componenti e della sintassi del protocollo, ma definisce i ruoli dei componenti, i vincoli sulla loro modalità di interazione e la loro interpretazione.&lt;br /&gt;
Riassumiamo quindi i principi che deve rispettare una architettura ''REST'':&lt;br /&gt;
# Architettura Client-Server &amp;lt;br/&amp;gt;In una architettura ''REST'' viene data particolare importanza ai principi ''SRP'' e ''DIP'' prima citati, più generale si può affermare che l'architettura sposi il paradigma noto con il termine di &amp;quot;''Separation of Concerns''&amp;quot;. Una ''Restful API'' applica questi principi in un architettura Client-Server, capace di supportare l'evoluzione indipendente della logica lato client e della logica lato server.&lt;br /&gt;
# Stateless &amp;lt;br/&amp;gt;La comunicazione tra utente e fornitore del servizio deve essere senza stato, quindi ogni richiesta del client deve contenere tutte le informazioni di cui il fornitore necessita per l'erogazione del servizio offerto. Questa ipotesi viene fatta per rendere una ''Restful API'' facilmente scalabile orizzontalmente.&lt;br /&gt;
# Uso della cache &amp;lt;br/&amp;gt;In un Architettura ''REST'' i messaggi di risposta inviati dal server devono esplicitamente indicare se possono essere memorizzati nella cache del client o di componenti middleware per il riutilizzo nelle richieste successive.&lt;br /&gt;
# Interfaccia uniforme &amp;lt;br/&amp;gt;I componenti devono essere in grado di comunicare attraverso un'interfaccia uniforme e le risorse devono essere trasferite in un formato standard. Inoltre l'utente deve poter effettuare la navigazione tra le risorse di suo interesse tramite collegamenti ipertestuali. Per inciso, si osserva che il protocollo HTTP usato correttamente rispetta i requisiti di un architettura ''REST'' e che nelle implementazioni delle ''RESTful API'' il formato più usato per la modellazione dei dati è JSON.&lt;br /&gt;
# Layered System &amp;lt;br/&amp;gt;In un sistema a livelli, componenti intermedi (come i proxy) possono essere collocati tra client e server per intercettare il traffico per scopi specifici; ad esempio il caching o la sicurezza. Una soluzione basata su ''REST'' può essere composta da più livelli architettonici, indipendenti l'uno dall'altro.&lt;br /&gt;
# Code on Demand &amp;lt;br/&amp;gt;Questo vincolo facoltativo è inteso principalmente a consentire aggiornamenti alla logica all'interno dei client (come i browser Web) indipendentemente dalla logica lato server. Una ''single page application'', ad esempio, rispetta in pieno questo punto.&lt;br /&gt;
&lt;br /&gt;
Un'applicazione progettata sul modello dell'architettura ''REST'' ha quindi gli indiscutibili vantaggi di:&lt;br /&gt;
* consentire l'evoluzione indipendente delle diverse componenti &lt;br /&gt;
* avere un'interfaccia utente portabile con altri tipi di piattaforme&lt;br /&gt;
* permettere agevolmente la replicazione delle macchine server&lt;br /&gt;
* non vincolare moduli server e client a linguaggi e tecnologie specifiche.&lt;br /&gt;
&lt;br /&gt;
L'architettura del servizio oggetto di questa tesi si trova già perfettamente in linea con alcuni dei vincoli discussi, ma sono necessarie alcune considerazioni. Il punto 1 (&amp;quot;architettura Client-Server&amp;quot;) è chiaramente soddisfatto. &lt;br /&gt;
Il punto 2 (&amp;quot;Stateless&amp;quot;), direttamente collegato con i punti 3 e 5 (&amp;quot;Uso della cache&amp;quot;, &amp;quot;Layered System&amp;quot;), può essere rispettato con facilità; a ogni richiesta di &amp;quot;minimizzazione&amp;quot; del client corrisponde la restituzione del documento trattato dal server, non c'è quindi necessita di avere uno stato nell'interazione. &lt;br /&gt;
&lt;br /&gt;
Analizzando le caratteristiche di una applicazione stateless in relazione al principio ''privacy by design'' illustrato in precedenza, si osserva che l'assenza di stato determina la semplificazione delle problematiche critiche relative al principio. Non vengono conservate, infatti, informazioni contenenti dati sensibili, poiché dopo aver effettuato l'invio della risposta, sarà subito eliminato sul server il file elaborato.&lt;br /&gt;
&lt;br /&gt;
Nei capitoli precedenti tuttavia si è detto che l'utente può ripetere più volte il trattamento di uno stesso documento nella stessa sessione di interazione; essendo il vincolo dell'efficienza già difficile da rispettare per via dell'elaborazione onerosa del documento, si può progettare una modalità alternativa del funzionamento con stato del servizio, applicabile in assenza di replicazione delle macchine server e sfruttando le ripetute richieste di trattamento per uno stesso documento. &lt;br /&gt;
Si può infatti memorizzare lato server il documento inviato dal client inizialmente e, alle successive richieste di trattamento del medesimo documento, evitarne la ritrasmissione da client a server. Per rispettare il ''PbD'', al termine della sessione di interazione il documento verrà rimosso dal server. Si nota, inoltre, che per predisporre il servizio alla gestione delle due diverse modalità di funzionamento si può utilizzare un parametro di configurazione a livello applicativo.&lt;br /&gt;
I punti 4 e 6 infine (&amp;quot;Interfaccia uniforme&amp;quot;, &amp;quot;Code on Demand&amp;quot;) si possono rispettare utilizzando il formato JSON per la trasmissione dei documenti e dei nominativi, e usando localmente sul client Javascript per offrire tutte le funzionalità del servizio in un'unica pagina html.&lt;br /&gt;
&lt;br /&gt;
===Moduli software del servizio===&lt;br /&gt;
&lt;br /&gt;
====Scelta dei componenti software====&lt;br /&gt;
&lt;br /&gt;
Si opera ora la scelta delle tecnologie da utilizzare per i componenti dei 4 layer dello ''stack LAMP''. Per i due layer inferiori risulta piuttosto immediato decidere di usare le tecnologie presenti per default. Un sistema operativo Linux ed un web server Apache sono adatti all'architettura del servizio.&lt;br /&gt;
Inoltre anche il linguaggio di programmazione PHP può essere usato senza significativi problemi, anche se verranno fatte in seguito, in una sezione di questo capitolo, alcune considerazioni sulle problematiche di esecuzioni concorrenti di script PHP. Il linguaggio sarà impiegato in particolare per la realizzazione della logica necessaria a gestire l'interazione web con il cliente, mentre l'elaborazione del documento OOXML lato server sarà effettuata da un programma Java. &lt;br /&gt;
&lt;br /&gt;
I due ''task'' principali del servizio sono delegati, quindi, a due programmi distinti realizzati con tecnologie diverse. Si concretizza in questo modo il principio ''SRP'' e, sfruttando l'&amp;lt;i&amp;gt;openness&amp;lt;/i&amp;gt; della piattaforma LAMP, le funzionalità necessarie vengono realizzate attraverso i linguaggi più adatti.&lt;br /&gt;
La scelta del linguaggio Java per l'implementazione del ''main core'' della logica di business è dovuta alla libreria open source in ambiente java Docx4j ([40],[41]). Questa libreria è realizzata per il processamento delle tre tipologie di formati OOXML (''docx'', ''xslx'', ''pptx'') e permette tutte le possibili operazioni di creazione, lettura e modifica su questo tipo di documenti. Anche questa libreria sarà approfondita in sezioni successive. Si osserva, per inciso, che esistono altre librerie equivalenti in ambiente .NET. &lt;br /&gt;
&lt;br /&gt;
Nella scelta del linguaggio di programmazione usato per elaborare i documenti ed effettuare i confronti tramite ''regular expressions'', un dato non di poco conto da considerare è l'encoding delle stringhe. In Java, in particolare, una stringa è rappresentata internamente come un array di char, ognuno codificato da 2 byte in formato UTF-16 ([0042]); la codifica esprime in 16 bit tutti i caratteri definiti dallo standard Unicode, quindi è possibile scegliere Java.&lt;br /&gt;
&lt;br /&gt;
Per il ''layer'' della persistenza, infine, l'impiego di un database MySql risulta una buona scelta. Si osserva che questo livello non verrà utilizzato nella tradizionale maniera prevista dallo ''stack LAMP''. Infatti, generalmente, la base di dati viene interrogata direttamente dal componente che si occupa dell'interazione con l'utente (PHP) per il reperimento delle informazioni utili da restituire al client; nel servizio, invece, la base di dati sarà a supporto unicamente del programma Java, poiché gli unici dati persistenti da gestire sono i nomi del dizionario (si ricordi sempre il ''PbD'') e solo i moduli dell'eseguibile Java devono utilizzarli. Se il dizionario contenessero unicamente i nomi (senza informazioni accessorie correlate) e fossero usati in sola lettura, un semplice file di testo poteva essere sufficiente per la rappresentazione. Tuttavia, poiché saranno individuate tecniche di ottimizzazione nell'impiego dei dizionari che richiedono operazioni di scrittura e ordinamento dei dati, risulta opportuno usare un database relazionale.&lt;br /&gt;
&lt;br /&gt;
====Logica di business e dinamiche di interazione====&lt;br /&gt;
&lt;br /&gt;
Vengono presentati in questa sezione gli aspetti principali dei funzionamenti dei moduli del servizio. Per mettere bene a fuoco quali siano le meccaniche di interazione e i flussi di esecuzione dei programmi, si propone il diagramma di sequenza del tipico scenario di utilizzo. In questo schema UML si descrive il caso d'uso dove un utente, dopo aver inserito un documento ed averlo ricevuto &amp;quot;minimizzato&amp;quot;, esprime delle preferenze e richiede poi un secondo trattamento.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F00])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si descrivono quindi ora le principali operazioni che vengono eseguite.&lt;br /&gt;
All'avvio dell'interazione viene presentata una pagina PHP di benvenuto contenente le informazioni su come i dati personali vengano elaborati ed un ''file-picker'' per consentire l'upload di un documento ''OOXML''; nel momento in cui l'utente confermerà il caricamento del documento, esso verrà trasferito sul server. &lt;br /&gt;
Bisogna prestare particolare attenzione al comportamento del sistema nel caso in cui più utenti richiedano contemporaneamente l'esecuzione del servizio, e cioè alle problematiche di esecuzioni concorrenti di script PHP; è necessario, in particolare, evitare situazioni in cui i nomi dei file inviati dagli utenti siano in conflitto. Analizzando più in dettaglio il problema, ogniqualvolta un web server Apache riceve una richiesta HTTP per una pagina PHP, si ha la generazione di un nuovo processo che esegue il codice presentato nella pagina PHP richiesta. Supponendo quindi che N utenti eseguano l'invio del file contemporaneamente, si avrebbe che sul server N processi diversi dovrebbero procedere con la scrittura di un file. Ovviamente se due o più file condividono il nome almeno uno di essi sarà sovrascritto. Per risolvere questo problema, supponendo di voler salvare tutti i documenti in una cartella temporanea, occorre modificare il filename dei documenti inviati dagli utenti per esser certi di non incorrere in sovrascritture o altri tipi di errori correlati.&lt;br /&gt;
Una valida possibilità è l'inserimento di un ''prefisso'' univoco nel filename. Per la generazione di una stringa univoca da anteporre al filename, che permetta di distinguere file caricati da utenti diversi, si può direttamente usare il ''session id'' dell'utente. In PHP esso è determinato casualmente combinando ([0043]): l'IP del cliente, orario di attribuzione dell'id, un numero pseudo-casuale (con il ''PHP Linear Congruence Generator'') e, se presente un &amp;quot;''random source''&amp;quot; sul sistema operativo del Client (spesso chiamato impropriamente &amp;quot;''seme''&amp;quot;), un ulteriore numero pseudo-casuale.&lt;br /&gt;
Per introdurre ulteriore alea, necessaria se, ad esempio, un utente tenti l'upload di file omonimi (con contenuto interno diverso) e mantenga il medesimo ''session id'', si utilizza un ulteriore generatore pseudo-casuale per produrre un altro numero con cui comporre il prefisso.&lt;br /&gt;
Concatenando i due numeri generati si ha praticamente certezza di aver individuato un numero univoco nel sistema per il tempo in cui il servizio sarà erogato al cliente.&lt;br /&gt;
&lt;br /&gt;
Una volta memorizzato il file, lo script PHP dovrà ricorrere all'invocazione del modulo Java, delegato al vero e proprio processamento del documento. Occorre quindi individuare un set di opzioni che consenta al modulo che gestisce l'interazione con il cliente di sfruttare al meglio il componente delegato all'elaborazione del documento, in qualunque circostanza; la totale indipendenza dei moduli, la loro sostituibilità e la replicazione possibile di macchine server sono solo alcuni dei fattori che rendono mutevole la configurazione del sistema. Va definito un protocollo di comunicazione, quindi, che astragga completamente dall'implementazione dei moduli o dalla locazione dei file.&lt;br /&gt;
&lt;br /&gt;
Valutando i possibili flussi logici, anche con l'ausilio del diagramma di sequenza, si ha che i tipi di esecuzione sono due:&lt;br /&gt;
* &amp;quot;minimizzazione&amp;quot; con dizionario&lt;br /&gt;
* &amp;quot;minimizzazione&amp;quot; di specifici nominativi&lt;br /&gt;
Il protocollo di comunicazione tra i due moduli è costituito in entrambi i casi di una singola richiesta a cui segue una singola risposta. Più in particolare, lo script PHP invoca il comando Java esprimendo obbligatoriamente il path del file da trattare e opzionalmente l'elenco dei nominativi. A suo volta, il modulo Java restituisce i nominativi trovati, qualora non espressamente richiesti dallo script, e segnala la corretta terminazione dell'elaborazione.&lt;br /&gt;
Si definiscono come canali di comunicazione standard del protocollo gli argomenti presi in input dal modulo di processamento del documento e lo standard output del processo che esegue tale programma. Inoltre è importante definire un formato standard per la comunicazione dei nominativi tra moduli; è necessario quindi scegliere un pattern che permetta di determinare univocamente la composizione dei nominativi. Un possibile formato, espresso tramite ''regex'', è il seguente:&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt; &amp;lt;nominativo&amp;gt; = ^(&amp;lt;nome&amp;gt;:)*&amp;lt;nome&amp;gt;;&amp;lt;cognome&amp;gt;$&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt; &amp;lt;nominativi&amp;gt; = ^(&amp;lt;nominativo&amp;gt;\s+)+$&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Dove nome e cognome sono una sequenza di caratteri Unicode come già discusso. Ulteriori opzioni importanti da definire nel protocollo per l'invocazione del programma che si occupa delle funzionalità di elaborazione sono le seguenti:&lt;br /&gt;
* path file da elaborare (opzione &amp;quot;-i &amp;lt;file_path&amp;gt;&amp;quot;, obbligatoria)&lt;br /&gt;
* path con cui salvare il file elaborato (opzione &amp;quot;-o &amp;lt;file_path&amp;gt;&amp;quot;, opzionale: per default viene creato un nuovo file automaticamente)&lt;br /&gt;
* abilitazione stampe verbose, da usare solo in fase di debug (opzione &amp;quot;-d&amp;quot;, opzionale)&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Una volta terminato il processamento, il modulo di gestione dell'interazione con l'utente dovrà accertarsi che l'&amp;lt;i&amp;gt;exit status&amp;lt;/i&amp;gt; sia 0 e leggere dallo standard output del processo appena terminato, qualora si sia stata eseguita la &amp;quot;minimizzazione&amp;quot; con dizionario, l'elenco dei nominativi trovati. Se invece la &amp;quot;minimimizzazione&amp;quot; ha avuto luogo con i nominativi già specificati non sarà scritto nulla sullo standard output.&lt;br /&gt;
A margine si osserva che l'impiego dell'opzione &amp;quot;-d&amp;quot; deve sempre consentire una semplice individuazione dei nominativi trovati; in particolare, se tale opzione è specificata, nello standard output i nominativi compariranno con un ''header'' riconoscibile (&amp;quot;''NOMINATIVO=''&amp;quot;).&lt;br /&gt;
Ritornando alla descrizione del flusso di esecuzione tipo, una volta che il modulo Java ha completato il trattamento del documento, lo script PHP ne effettuerà l'upload sul client e presenterà all'utente le opzioni già descritte nel capitolo sull'usabilità. &lt;br /&gt;
A questo punto l'interazione con client potrebbe concludersi, qualora si eseguisse il download e si chiudesse il browser, o continuare elaborando i ''suggerimenti'' dell'utente espressi dopo il primo trattamento. Le modalità di comunicazione dei moduli varierebbero leggermente come appena illustrato, mentre, a seconda della configurazione stateful o stateless del servizio, verrebbe eseguito o meno un nuovo upload del file dal client al server.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si osserva infine che, per predisporre a successivi studi di ottimizzazione il servizio e per agevolare tutti i possibili sviluppi futuri, si applica largamente nella progettazione del modulo di elaborazione Java il ''Dependency Inversion Principle'', in quanto si desidera realizzare classi estendibili ed intercambiabili.&lt;br /&gt;
In particolare, si introducono delle classi astratte per rappresentare in maniera generica il concetto di &amp;quot;''persona''&amp;quot; e &amp;quot;''minimizzatore''&amp;quot;. È possibile infatti realizzare successivi studi per trattare ulteriori dati personali oltre che ai nomi e cognomi; inoltre, in base ai tipi di documenti trattati o eventuali altri fattori utili, è possibile studiare differenti tecniche di &amp;quot;minimizzazione&amp;quot; realizzate da differenti algoritmi &amp;quot;''minimizzatori''&amp;quot;.&lt;br /&gt;
In particolare una &amp;quot;''persona''&amp;quot; dovrà sempre esporre un metodo &amp;quot;''minimizza''&amp;quot; che prende in input una stringa, la &amp;quot;minimizza&amp;quot; e la restituisce; il pattern con il quale si effettua la &amp;quot;minimizzazione&amp;quot; sarà fornito in implementazione a seconda dei dati sensibili di interesse.&lt;br /&gt;
Un &amp;quot;''minimizzatore''&amp;quot; esporrà sempre un metodo &amp;quot;''work''&amp;quot; che, presa in input una lista di persone ed un documento ''OXML'', con l'ausilio della libreria Docx4j, fornirà in output un documento del tutto &amp;quot;minimizzato&amp;quot;; la definizione delle modalità con cui si estrapolano le informazioni dal documento e con cui si invoca il metodo &amp;quot;''minimizza''&amp;quot; della classe persona sono confinate nell'implementazione.&lt;br /&gt;
Definendo delle classi astratte risulta, quindi, più veloce la realizzazione dei futuri componenti e si svincola il processo di &amp;quot;minimizzazione&amp;quot; dal tipo di dati che si &amp;quot;minimizzano&amp;quot; e viceversa.&lt;br /&gt;
&lt;br /&gt;
====Le classi principali del progetto====&lt;br /&gt;
Le classi principali del progetto vengono quindi presentate in appendice. Esse sono:&lt;br /&gt;
* App.java, contenente il main&lt;br /&gt;
* Elaborator.java, che presenta il metodo &amp;quot;''work''&amp;quot;&lt;br /&gt;
* Persona.java, che presenta il metodo &amp;quot;''minimizza''&amp;quot;&lt;br /&gt;
* Testing.java, contenente alcune funzioni usate in fase di debug.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gli script in PHP sono stati forniti dall'azienda come implementazione minimale e provvisoria, da perfezionare a seguito della eventuale definizione sulle modalità di presentazione del servizio su Internet.&lt;br /&gt;
&lt;br /&gt;
Una considerazione di implementazione comune a tutte le classi deriva del principio ''Privacy by Design'', indifferentemente dalla modalità di configurazione stateful o stateless del servizio: è di fondamentale importanza che nel sistema non siano memorizzati permanentemente in alcun caso i documenti inviati dagli utenti del servizio. &lt;br /&gt;
Per realizzare un sistema robusto, per fronteggiare crash improvvisi del client o congestioni della rete, è opportuno impostare dei timeout lato server che procedano automaticamente alla eliminazione dei documenti degli utenti dopo un periodo di inattività troppo prolungato. Qualora invece si dovesse verificare un interruzione critica del servizio a causa di un errore logico del server o semplicemente per via di un'interruzione dell'alimentazione della macchina server, bisogna considerare altri metodi; essendo il servizio realizzato con un sistema operativo Linux, si può configurare il demone ''crond'' per eseguire a ogni reboot e, per sicurezza, una volta al giorno l'eliminazione dei file usati dall'applicazione tutti contenuti all'interno della cartella temporanea.&lt;br /&gt;
&lt;br /&gt;
==Approfondimenti tecnologici==&lt;br /&gt;
&lt;br /&gt;
===Analisi della struttura del formato OOXML===&lt;br /&gt;
&lt;br /&gt;
Come argomentato, il formato dei documenti elaborati dal servizio progettato dovrà essere ''Office Open XML'', o ''OOXML''; si tratta di un formato ''XML-based'' per documenti di testo, fogli elettronici e presentazioni, in grado di rappresentare grafici, diagrammi, immagini e altro materiale grafico. La specifica fu sviluppata da Microsoft e adottata dall'&amp;lt;i&amp;gt;ECMA International&amp;lt;/i&amp;gt; come standard ''ECMA-376'' nel 2006. Una seconda versione fu rilasciata nel 2008, una terza nel 2011, una quarta nel 2012 ed una quinta tra il 2015 ed il 2016 ([0010]). La specifica è stata adottata, inoltre dall'&amp;lt;i&amp;gt;ISO&amp;lt;/i&amp;gt; e dall'&amp;lt;i&amp;gt;IEC&amp;lt;/i&amp;gt; come standard ''ISO/IEC 29500'' a partire dal 2008 ([0011], [0012]).&lt;br /&gt;
&lt;br /&gt;
====Linguaggi di markup====&lt;br /&gt;
&lt;br /&gt;
Lo standard ''ECMA-376'' ([0010]) include tre differenti specifiche di linguaggio per ognuna delle tre principali categorie di documenti:&lt;br /&gt;
* ''WordprocessingML'' per i documenti testuali&lt;br /&gt;
* ''SpreadsheetML'' per i fogli elettronici&lt;br /&gt;
* ''PresentationML'' per le presentazioni elettroniche&lt;br /&gt;
* ''DrawingML'' ed altri linguaggi di markup di supporto per la rappresentazione di disegni, forme e diagrammi.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
La specifica include sia gli schemi ''XML'' sia i vincoli espressi per iscritto. Ogni documento conforme al formato dovrà, quindi, rispettare gli schemi ''XML'' e dovrà essere codificato in ''UTF-8'' o ''UTF-16''. La specifica, inoltre, permette l'aggiunta di ''custom tag XML'' a supporto dei linguaggi di markup dati, per default nel formato ''OOXML'', consentendo quindi la libera personalizzazione dei documenti.&lt;br /&gt;
&lt;br /&gt;
====File packaging====&lt;br /&gt;
&lt;br /&gt;
Oltre alla specifiche relative ai linguaggi di markup, la seconda parte dell'&amp;lt;i&amp;gt;ECMA-376&amp;lt;/i&amp;gt; ([0010]) definisce la struttura gerarchica dei file del formato adottando le ''Open Packaging Conventions'' (''OPC''). ''OPC'', una tecnologia ''file-container'' basata sul comune formato compresso ''zip'', che stabilisce che tutti i file che riguardano una stessa entità devono essere raggruppati in un unico package ([0014]). Un documento ''OOXML'' è, infatti, un archivio ''zip'' contenente alcuni files ''XML'' (detti anche ''parti'') organizzati in un singolo package. Questa frammentazione dei dati in più files rende più semplice e veloce l'accesso ai dati stessi e riduce le possibilità di una loro corruzione. Le ''parti'' possono contenere qualsiasi tipo di dato; per tenere traccia della relazione tra una ''parte'' e la sua tipologia di contenuto, senza basarsi sull'estensione del file, è presente nel package, nella cartella radice della gerarchia, il file denominato ''[Content_Types].xml'', il quale mappa appunto queste associazioni. È mostrata qui ad esempio l'associazione tra la ''parte'' rappresentante il documento principale e il suo ''ContentType''.&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Override PartName=&amp;quot;/word/document.xml&amp;quot; ContentType=&amp;quot;application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Le informazioni relative alle relazioni che ogni ''parte'' ha con le altre ''parti'', con risorse esterne e con il package in sé sono mantenute separatamente dal contenuto della ''parte'' stessa. Tali informazioni sono presenti, infatti, all'interno delle cartelle denominate ''_rels'': ne esiste una per il package nel suo complesso e una per ogni sotto-cartella del package contenente delle ''parti'' coinvolte in delle relazioni. In questo modo i riferimenti che una ''parte'' ha verso altre ''parti'' o risorse sono salvati una sola volta e possono essere aggiornati con semplicità se necessario, senza dover modificare il contenuto stesso delle ''parti'' coinvolte. È mostrato qui un esempio di relazione contenuta in ''_rels/.rels'' relativa al documento principale e al suo schema.&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Relationship Id=&amp;quot;rId1&amp;quot; Type=&amp;quot;http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument&amp;quot; Target=&amp;quot;word/document.xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Il documento principale, ossia il file ''word/document.xml'', ha inoltre numerose relazioni con altre ''parti'', come ad esempio ''word/styles.xml'' e ''word/footer.xml'', e risorse esterne collegate con degli URI. Per descrivere queste relazioni si usa la cartella ''word/_rels''.&lt;br /&gt;
&lt;br /&gt;
====Parti di un Documento OOXML====&lt;br /&gt;
&lt;br /&gt;
Vengono qui presentate le ''parti'' che sono caratteristiche esclusive di un ''WordprocessingML package'', non presenti quindi negli altri due formati ''OOXML''. È importante osservare che alcune di esse sono facoltative e sono presenti nel package solo se necessario.&lt;br /&gt;
&lt;br /&gt;
Le ''parti'' relative al vero e proprio contenuto testuale sono:&lt;br /&gt;
* ''Main Document'', contiene le informazioni principali ed è salvata come ''word/document.xml''&lt;br /&gt;
* ''Header'', contiene i dati relativi alle intestazioni ed è salvata in ''word/header.xml''. Ogni sezione del documento può avere intestazioni diverse per la prima pagina, per le pagine pari e per le dispari, quindi possono esserci molteplici ''parti header''&lt;br /&gt;
* ''Footer'', contiene le informazione relative al piè pagina ed è salvata in ''word/footer.xml''. Può essere presente più volte, per motivi analoghi alla ''parte header''&lt;br /&gt;
* ''Footnotes'', contiene le eventuali note a piè pagina del documento ed è salvata come ''word/footnotes.xml''&lt;br /&gt;
* ''Endnotes'', contiene le note di chiusura del documento ed è salvata in ''word/endnotes.xml''.&lt;br /&gt;
&lt;br /&gt;
Sono presenti poi delle ''parti'' relative allo stile e alle impostazioni del documento:&lt;br /&gt;
* ''Style Definitions'', contiene la definizione di un insieme di stili usati dal documento, salvata in ''word/styles.xml''&lt;br /&gt;
* ''Font Table'', contiene informazioni riguardo i font usati, salvata in ''word/fontTable.xml''&lt;br /&gt;
* ''Numbering Definitions'', contiene le definizioni sulla struttura delle liste contenute nel documento, salvata in ''word/numbering.xml''&lt;br /&gt;
* ''Document Settings'', specifica come il word processor debba trattare il documento (spell checking, gestione delle revisioni, etc.), contenuta in ''word/settings.xml''&lt;br /&gt;
* ''Web Settings'', contiene informazioni su come il documento debba essere convertito in ''HTML'' se richiesto, contenuta in ''word/webSettings.xml''.&lt;br /&gt;
&lt;br /&gt;
Sono presenti anche delle ''parti'' che rappresentano testo secondario:&lt;br /&gt;
* ''Comments'', contiene i commenti sul documento inseriti attraverso un word processor&lt;br /&gt;
* ''Glossary'', contiene dati testuali aggiuntivi secondari, ne è permessa una sola. Tutte le ''parti'' prima elencate, tranne il ''Main Document'', possono comparire una seconda volta in relazione alla ''parte glossary''.&lt;br /&gt;
&lt;br /&gt;
====Analisi del Main Document====&lt;br /&gt;
&lt;br /&gt;
Il file ''document.xml'', elemento principale di un documento ''WordprocessingML'', è costituito da due tipi di informazioni:&lt;br /&gt;
* ''properties'', che definiscono lo stile e la formattazione del testo&lt;br /&gt;
* ''stories'', che rappresentano il contenuto testuale delle varie parti del documento.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le ''properties'' verranno trattate in misura minore. Queste informazioni sono espresse attraverso una struttura XML gerarchica che ha come elemento radice il nodo ''document''. Esso ha due nodi figli:&lt;br /&gt;
* ''background'', che contiene alcune ''properties'' che descrivono lo sfondo del documento&lt;br /&gt;
* ''body'', che contiene tutti i rimanenti contenuti ed è potenzialmente molto complesso.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si osserva che per le finalità del trattamento dei dati risultano di primario interesse le ''stories'' e che è opportuno effettuare un'analisi ''bottom-up'' del problema: anziché considerare la gerarchia a partire dal ''body'' (nodo padre) partiremo dalla rappresentazione più semplice del testo contenuta nel documento (nodi figli).&lt;br /&gt;
&lt;br /&gt;
Facendo direttamente riferimento allo standard ''ECMA-376'' ([0010]),  si evince che l'unico nodo che contiene puro testo ha il nome ''t'' (''Text''). Questo elemento contiene una stringa rappresentante gli esatti caratteri che vengono poi mostrati negli editor a video. Il nodo ''Text'' non presenta figli e l'unico nodo padre che può avere è ''r'' (''Run''). Quest'altro nodo definisce una regione di testo con comuni proprietà (ad esempio l'uso del grassetto). Attraverso l'uso di tag ''t'' ed ''r'' quindi si rappresenta una regione di testo formattata con differenti elementi stilistici.&lt;br /&gt;
Occorre però evidenziare che un nodo ''r'' può presentare molti altri figli oltre a ''t'', come ad esempio immagini, in quanto rappresenta un'area generica del documento.&lt;br /&gt;
Si supponga quindi di avere due nodi ''Text'' fratelli, ossia figli dello stesso nodo ''r'': essi rappresenteranno semanticamente un unico blocco logico se e solo se compariranno a video come una sequenza di parole continua. Questo fenomeno è facilmente identificabile anche nel file ''XML'' descrittivo: due sequenze di parole mostrate a video adiacenti compaiono infatti nel file ''XML'' in due righe consecutive; se invece due parti di testo dovessero essere intervallate ad es. da un'immagine nel documento ''XML'' ci sarebbe un tag ''drawing'' a dividere i due tag ''t''. Dalla consecutività dei nodi ''Text'' nel file ''document.xml'' si può determinare quali siano i blocchi logici da trattare.&lt;br /&gt;
Un insieme di ''Run'' infine può essere figlio di diversi nodi, ma ciò non è di rilevante importanza, in quanto ogni area di testo individuata dal nodo ''Run'' rappresenta già un blocco logico a sé e, di conseguenza, contiene sufficienti informazioni per la &amp;quot;minimizzazione&amp;quot;.&lt;br /&gt;
L'unico caso di rilievo nel quale bisogna valutare quale sia la gerarchia a monte di un nodo ''Run'' è nell'elaborazione di una tabella. In tal caso, in realtà, occorre verificare opportunamente la strutturazione della gerarchia processata. Per chiarezza espositiva viene mostrata la rappresentazione in formato ''OOXML'' di una tabella con una riga e due colonne (senza l'uso di ''properties'' per la formattazione stilistica).&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;w:tbl&amp;gt;&lt;br /&gt;
  &amp;lt;w:tr&amp;gt;&lt;br /&gt;
    &amp;lt;w:tc&amp;gt;&lt;br /&gt;
      &amp;lt;w:p&amp;gt;&lt;br /&gt;
        &amp;lt;w:r&amp;gt;&lt;br /&gt;
          &amp;lt;w:t&amp;gt;Cella A&amp;lt;/w:t&amp;gt;&lt;br /&gt;
        &amp;lt;/w:r&amp;gt;&lt;br /&gt;
      &amp;lt;/w:p&amp;gt;&lt;br /&gt;
    &amp;lt;/w:tc&amp;gt;&lt;br /&gt;
    &amp;lt;w:tc&amp;gt;&lt;br /&gt;
      &amp;lt;w:p&amp;gt;&lt;br /&gt;
        &amp;lt;w:r&amp;gt;&lt;br /&gt;
          &amp;lt;w:t&amp;gt;Cella B&amp;lt;/w:t&amp;gt;&lt;br /&gt;
        &amp;lt;/w:r&amp;gt;&lt;br /&gt;
      &amp;lt;/w:p&amp;gt;&lt;br /&gt;
    &amp;lt;/w:tc&amp;gt;&lt;br /&gt;
  &amp;lt;/w:tr&amp;gt;&lt;br /&gt;
&amp;lt;/w:tbl&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Come si osserva in figura, in una tabella il nodo ''r'' sarà figlio del nodo ''p'' (''Paragraph''), il quale a sua volta sarà contenuto in un noto ''tc'' (''Table Cell''). Celle di una tabella appartenenti ad una stessa riga saranno presenti all'interno dello stesso ''tr'' (''Table Row'') ed infine tutte le righe della tabella saranno inserite del tag ''tbl'' (''Table'').&lt;br /&gt;
&lt;br /&gt;
Per determinare quindi se due nodi ''Text'' sono scritti in due colonne adiacenti di una stessa riga (e quindi costituiscono un unico blocco logico) è necessario verificare che per i due nodi ''Text'':&lt;br /&gt;
# il nodo &amp;quot;padre&amp;quot;  '''non sia''' in comune&lt;br /&gt;
# il nodo &amp;quot;padre di 2° livello&amp;quot; sia ''Paragraph'' e '''non sia''' in comune&lt;br /&gt;
# il nodo &amp;quot;padre di 3° livello&amp;quot; sia ''Table Cell'' e '''non sia''' in comune&lt;br /&gt;
# il nodo &amp;quot;padre di 4° livello&amp;quot; sia ''Table Row'' e '''sia''' in comune&lt;br /&gt;
# i nodi &amp;quot;padre di 3° livello&amp;quot; '''siano''' consecutivi.&lt;br /&gt;
Se tutte queste ipotesi sono soddisfatte, le due celle vanno &amp;quot;minimizzate&amp;quot; come unico blocco logico.&lt;br /&gt;
&lt;br /&gt;
Si valutano infine gli ultimi vincoli emersi nell'analisi sull'interpretazione della formattazione di un documento.&lt;br /&gt;
In particolare, descrivendo le parti che compongo un documento ''OOXML'', era già emerso che alcune sezioni di testo, ossia note a piè pagina ed intestazioni, compaiono in altri file ''XML'' e non in ''document.xml''. Questi file (''header.xml'', ''footer.xml'', ''endnotes.xml'', etc.) sono tutti raccolti in un package (&amp;quot;''word''&amp;quot;) e la grammatica ''XML'' è la stessa usata per il Main Document.&lt;br /&gt;
Si conclude osservando che il problema della divisione in sillabe delle parole non si pone, in quanto la divisione sillabica mostrata a video dai word-processors è calcolata dinamicamente; in particolare, su una porzione di testo viene applicata la sillabazione (ove necessario) se è presente tra le ''properties'' di quella regione di documento il tag ''hyphenationZone''.&lt;br /&gt;
&lt;br /&gt;
====La libreria in ambiente java open source Docx4j====&lt;br /&gt;
&lt;br /&gt;
La libreria Docx4j offre completo supporto alla manipolazione di documenti ''docx'' (compressione e decompressione archivio zip, generazione file ''XML'' necessari, etc.). Offre inoltre un'utile mappatura in specifici oggetti Java della gerarchia ''XML'' presente nei vari file del formato.&lt;br /&gt;
Uno tra gli elementi più interessanti è la tecnica con cui vengono recuperati i nodi dai file ''XML'', in quanto si fa impiego del linguaggio standard W3C ''XPath'' ([0044], [0045]). Con ''XPath'' è possibile esprimere con una stringa un sottoinsieme di nodi presenti in una gerarchia ''XML'' non solo in base al loro nome o valore, ma anche in relazione alla posizione reciproca rispetto agli altri nodi. Riferendoci alle problematiche del servizio risulta, ad esempio, significativamente agevolato il trattamento di dati personali in forma tabellare.&lt;br /&gt;
Si osserva infine che la libreria attribuisce un id univoco ad ogni nodo del documento, di conseguenza se ne può trarre vantaggio nei confronti tra i nodi.&lt;br /&gt;
&lt;br /&gt;
===Ottimizzazioni del processo di minimizzazione===&lt;br /&gt;
&lt;br /&gt;
===Tecnologie complementari===&lt;br /&gt;
&lt;br /&gt;
La redazione di questa tesi è avvenuta su Mediawiki, la più importante fra le piattaforme wiki essendo il motore di Wikipedia.&lt;br /&gt;
&lt;br /&gt;
Le piattaforme wiki sono riconosciute come elemento caratterizzante dell’evoluzione Internet al Web 2.0, cioè al web nel quale gli utenti-navigatori, fino ad allora &amp;quot;''consumatori&amp;quot;'' (&amp;quot;''consumers&amp;quot;'') di contenuti si sono trasformati essi stessi in &amp;quot;''produttori&amp;quot;'' (&amp;quot;''producers&amp;quot;''), e cioè in &amp;quot;''prosumers&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
Un ''wiki'' è fondamentalmente un sito web che contiene informazioni e che consente agli utenti di editare facilmente il suo contenuto.&lt;br /&gt;
&lt;br /&gt;
Nel redigere una pagina wiki si utilizza ciò che è chiamato ''wikitext&amp;quot; per definire capitoli, paragrafi, hyperlinks, elementi di formattazione della pagina, etc.; sebbene il ''wikitext&amp;quot; risulti non difficile da apprendere, quasi ogni piattaforma wiki è corredata da editor di tipo visuale, che non richiede alcuna conoscenza della sintassi del ''wikitext&amp;quot;; tuttavia è esperienza comune che utilizzare direttamente il ''wikitext&amp;quot; induce a concentrarsi maggiormente sui contenuti e non sulla formattazione. Il linguaggio ''wikitext'' è strettamente correlato con il linguaggio HTML, infatti nella scrittura è possibile utilizzare tag come h1, span, div e così via, oltre che la sintassi esclusiva di ''wikitext''; simmetricamente una pagina prodotta da media wiki è costituita da HTML ben formato e direttamente importabile in ogni word processor. &lt;br /&gt;
&lt;br /&gt;
I wiki presentano una funzionalità di grande utilità nella redazione di documenti articolati: la tracciatura delle successive revisioni (&amp;quot;''Cronologia&amp;quot;''). La possibilità di ripercorrere l’evoluzione del testo è davvero d’aiuto quando si fissano idee originali in uno scritto, cercando di definirle, precisarle, chiarirle, come è avvenuto in effetti, anche nella redazione di questa tesi. Per curiosità, si segnala che, pur avendo redatto la maggior parte del testo off-line, la pagina wiki di questa tesi conta oltre 50 revisioni.&lt;br /&gt;
&lt;br /&gt;
Per inciso, si osserva che è stata molto utile la funzionalità di &amp;quot;ricerca nel codice&amp;quot; offerta dalla piattaforma di revisione online GitHub nella corretta comprensione della libreria Docx4j, il cui codice sorgente è ivi rilasciato. &lt;br /&gt;
&lt;br /&gt;
Si conclude infine dicendo che per ottimizzare le procedure di debug del codice sono stati realizzati utili tool a riga di comando per Linux per la rapida estrazione-modifica-ricompattazione di documenti ''OOXML''. Si propone in appendice un comando bash per questi scopi.&lt;br /&gt;
&lt;br /&gt;
==Sviluppi futuri==&lt;br /&gt;
&lt;br /&gt;
In questa sezione si fa cenno, senza poterle approfondire, ad alcune interessanti questioni emerse nello svolgimento della tesi.&lt;br /&gt;
&lt;br /&gt;
===Accesso al servizio web===&lt;br /&gt;
&lt;br /&gt;
In fase iniziale, il servizio web potrà essere reso accessibile in forma completamente aperta, senza richiedere cioè la registrazione dell’utente o l’autenticazione dell’utente già registrato. In questo modo, in effetti, si premia la facilità d’uso, ma si incorre nella nota problematica di un uso malevolo, costituito da accessi a raffica, finalizzati a saturare il server e generare una condizione di ''DoS – Denial of Service''. Diverse sono le tecniche che possono essere adottate per contrastare questo tipo di accessi malevoli, come richiedere di superare &amp;quot;''captcha''&amp;quot; e/o introdurre ritardi crescenti ed eventualmente blocchi in risposta ad accessi prevenienti con alta frequenza dallo stesso indirizzo IP.&lt;br /&gt;
È possibile anche pensare ad un accesso previa registrazione ed autenticazione dell’utente, penalizzando l’immediatezza di utilizzo del servizio, ma eventualmente ottenendo l’indirizzo email degli utenti che acconsentono a lasciarlo per successive finalità marketing.&lt;br /&gt;
È possibile, infine, un utilizzo misto, contando in un cookie il numero di accessi eseguiti e richiedendo all’utente di registrarsi per continuare ad utilizzare il servizio, dopo qualche accesso.&lt;br /&gt;
&lt;br /&gt;
===Ampliamento dinamico del dizionario===&lt;br /&gt;
&lt;br /&gt;
Nel restituire il documento elaborato all'utente, gli si da la possibilità di richiedere una nuova elaborazione, dopo aver indicato i nominativi che fossero sfuggiti; pare inesauribile, infatti, la &amp;quot;fantasia&amp;quot; dei genitori nel dare nome ai propri figlioli!&lt;br /&gt;
I nominativi indicati dall'utente sono sfuggiti al servizio perché non presenti nel dizionario: facilmente viene in mente l’idea di arricchire il dizionario con i nominativi indicati dall’utente. Va però considerato il caso che l’utente in malafede indichi nominativi fasulli al fine di inquinare il dizionario.&lt;br /&gt;
Il caso malevolo può essere affrontato attraverso una strategia che preveda non direttamente l'inserimento del nuovo nominativo nel dizionario, ma invece l'utilizzo di un concetto di &amp;quot;candidatura&amp;quot;: il nuovo nominativo viene registrato, ma si attende di avere un certo numero di utenti che lo propongono prima di approvarne l'inserimento nel dizionario.&lt;br /&gt;
Può anche essere utilizzato un concetto di &amp;quot;attendibilità&amp;quot; della candidatura di un nuovo nominativo, verificando ad esempio l'utente che lo propone scarichi effettivamente il file rielaborato.&lt;br /&gt;
Nel caso l'accesso avvenga con autenticazione, e cioè identificando gli utenti, si apre la possibilità di individuare e bannare gli utenti malevoli.&lt;br /&gt;
&lt;br /&gt;
===Natura del documento e ricorrenza del nominativo===&lt;br /&gt;
&lt;br /&gt;
Si coglie facilmente la differenza di formato fra un documento in forma di elenco (es. una graduatoria) da un documento in forma di relazione (es. una sentenza giudiziaria). Differenze di questo tipo potrebbero essere utilizzate per escludere o ammettere la ripetizione dei nominativi.&lt;br /&gt;
Per meglio dire: in un elenco la ripetizione di un nominativo è di fatto da escludersi o va trattata come omonimia. In una relazione, l’individuazione di un nominativo può essere utilizzata per ricercarlo direttamente in altri punti del documento stesso.&lt;br /&gt;
&lt;br /&gt;
===Altri dati personali===&lt;br /&gt;
&lt;br /&gt;
Altri dati personali sono trattabili con le stesse tecniche analizzate in questa tesi: date e luoghi di nascita, codici fiscali, indirizzi, email, numeri di telefono, sesso etc. In qualche caso, come per i codici fiscali, l’individuazione del pattern da trattare è persino più semplice.&lt;br /&gt;
Diversi studi ([0039]) hanno dimostrato che, utilizzando set di dati personali parziali, è possibile la re-identificazione dei soggetti, pur in documenti pseudonimizzati. È questo un altro motivo per estendere i trattamenti descritti anche agli altri dati personali richiamati.&lt;br /&gt;
&lt;br /&gt;
===Altri alfabeti===&lt;br /&gt;
&lt;br /&gt;
È possibile estendere il sotto-insieme di caratteri Unicode utilizzati nelle ''regex'' per elaborare documenti scritti in altri alfabeti non latini.&lt;br /&gt;
&lt;br /&gt;
==Conclusioni==&lt;br /&gt;
&lt;br /&gt;
Questa tesi è partita da un problema basilare, quasi scolastico, dell'informatica: la ricerca di un testo in un documento, al fine della sua cancellazione o modifica.&lt;br /&gt;
&lt;br /&gt;
Il problema si è subito discostato dalla sua formulazione basilare, principalmente perché, nei casi d'uso, il documento da ricercare non è un semplice testo (&amp;quot;''plain text''&amp;quot;) ma invece è il prodotto di un ''word-processor'': quindi è costituito da una struttura XML più o meno complessa, rappresentante formattazioni, riferimenti interni o esterni, note, etc. La ricerca deve avvenire nei soli nodi di puro testo, individuando ed escludendo dall'analisi lessicale gli elementi testuali di mark-up che non costituiscono contenuto informativo. Nell'approfondire le strutture ed i concetti XML ho potuto notare quanto essi siano ricorrenti in molti ambiti dell'informatica.&lt;br /&gt;
&lt;br /&gt;
Nell'analisi delle specifiche, un'altra complicazione si è presto aggiunta: l'usabilità del servizio cresce drasticamente se si evita di chiedere all'utente, come si era pensato in un primo tempo di fare, quali siano le stringhe (i nominativi) da ricercare e trattare; è nata allora l'idea di reperire queste stringhe in un dizionario di nomi ed in un dizionario di cognomi, considerando anche le permutazioni dei lemmi reperiti. Ho così dovuto approfondire alcuni problemi tipici dei dizionari, come il loro ampliamento automatico con tecniche oggi comprese nel ''machine-learning''. Non ho potuto &amp;quot;resistere&amp;quot; alla tentazione di ''formalizzare la matematica'' in base alla quale ho costruito le strategie di ricerca.&lt;br /&gt;
&lt;br /&gt;
Spunto per la tesi è stata la recente legislazione in materia di dati personali, il GDPR. Esaminandone gli articoli pertinenti, ho maturato una riflessione generale: sempre più il software dovrà essere progettato e realizzato anche alla luce di altre discipline, non solo di quelle informatiche, come le discipline giuridiche ed il diritto.&lt;br /&gt;
&lt;br /&gt;
Durante la fase iniziale della collaborazione con l'azienda mi sono dedicato alla messa a punto delle specifiche; ciò mi ha permesso di comprendere quanto questa fase sia importante e come completezza e precisione delle specifiche siano alla base di un progetto efficace.&lt;br /&gt;
&lt;br /&gt;
Molto importanti sono state la analisi relative al tipo e formato dei documenti da assumere come input ed alla presentazione ottimale del servizio rispetto all'usabilità. &lt;br /&gt;
&lt;br /&gt;
Centrale nel lavoro ed avvincente è stata la definizione della strategia per il riconoscimento dei lessemi attraverso la costruzione dinamica di ''regex'' idonee. In questo fase del lavoro, anche per passione personale, ho approfondito le questioni del riconoscimento &amp;quot;di testi nei testi&amp;quot; che legano, fin dalle origini, l'informatica e la linguistica.&lt;br /&gt;
&lt;br /&gt;
La fase di definizione dell'architettura del servizio mi ha permesso di ripercorrere molte le materie studiate nei tre anni del Corso di Ingegneria Informatica, affrontando argomenti  come il Single Responsibility Principle, il Dependency Inversion Principle, lo &amp;quot;stile&amp;quot; architetturale REST. Molto istruttiva è stata anche la riflessione sulla scomposizione del servizio in moduli software.&lt;br /&gt;
&lt;br /&gt;
Come sempre accade nell'affrontare un progetto nuovo, sono nate molte nuove idee; ho così immaginato numerosi sviluppi futuri, sia a perfezionamento funzionale dell'accesso web al servizio, sia ad estensione delle specifiche per coprire casi applicativi contigui (es. quando il dato che si vuole trattare è un codice fiscale). Dovendo necessariamente tener presente che questo lavoro è una tesi, verificherò con il supporto del mio relatore come poterne proseguire lo sviluppo.&lt;br /&gt;
&lt;br /&gt;
==Bibliografia==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0000]https://en.wikipedia.org/wiki/Comparison_of_Office_Open_XML_software&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0001]https://en.wikipedia.org/wiki/Comparison_of_OpenDocument_software&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0002]https://en.wikipedia.org/wiki/Standardization_of_Office_Open_XML&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0003]https://en.wikipedia.org/wiki/OpenDocument_standardization&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0004]https://support.apple.com/en-us/HT202227&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0005]https://en.wikipedia.org/wiki/Pages_(word_processor)&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0006]https://en.wikipedia.org/wiki/Comparison_of_word_processors&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0007]https://en.wikipedia.org/wiki/OpenDocument&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0008]https://en.wikipedia.org/wiki/Office_Open_XML_file_formats&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0009]https://en.wikipedia.org/wiki/Rich_Text_Format&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0010]https://www.ecma-international.org/publications/standards/Ecma-376.htm&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0011]https://www.iso.org/standard/51463.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0012]https://www.iso.org/standard/71691.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0013]https://en.wikipedia.org/wiki/Office_Open_XML&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0014]https://en.wikipedia.org/wiki/Open_Packaging_Conventions&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0015]https://en.wikipedia.org/wiki/LAMP_(software_bundle)&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0016]https://w3techs.com/blog/entry/debian_ubuntu_extend_the_dominance_in_the_linux_web_server_market_at_the_expense_of_red_hat_centos&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0017]https://news.netcraft.com/archives/2014/06/06/june-2014-web-server-survey.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0018]https://whatis.techtarget.com/definition/LAMP-Linux-Apache-MySQL-PHP&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0019]https://www.ibm.com/cloud/learn/lamp-stack-explained&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0020]https://en.wikipedia.org/wiki/Single_responsibility_principle&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0021]https://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0022]https://en.wikipedia.org/wiki/Latin_script_in_Unicode&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0023]https://it.wikipedia.org/wiki/ISO/IEC_8859-1&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0024]http://www.treccani.it/enciclopedia/uso-delle-maiuscole_%28La-grammatica-italiana%29/&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0025]https://en.wikipedia.org/wiki/Ambiguity#Linguistic_forms&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0026]Steven L. Small; Garrison W Cottrell; Michael K Tanenhaus (22 October 2013). Lexical Ambiguity Resolution: Perspective from Psycholinguistics, Neuropsychology and Artificial Intelligence. Elsevier Science. ISBN 978-0-08-051013-2.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0027]http://www.treccani.it/vocabolario/disambiguazione/&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0028]R. Navigli, K. Litkowski, O. Hargraves. 2007. SemEval-2007 Task 07: Coarse-Grained English All-Words Task. Proc. of Semeval-2007 Workshop (SemEval), in the 45th Annual Meeting of the Association for Computational Linguistics (ACL 2007), Prague, Czech Republic, pp. 30–35 http://www.aclweb.org/anthology/S/S07/S07-1006.pdf&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0029]https://wordnet.princeton.edu/&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0030]R. Navigli, S. P. Ponzetto. BabelNet: Building a Very Large Multilingual Semantic Network. Proc. of the 48th Annual Meeting of the Association for Computational Linguistics (ACL 2010), Uppsala, Sweden, July 11-16, 2010, pp. 216-225. http://aclweb.org/anthology/P/P10/P10-1023.pdf&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0031]Roventini A., Alonge A., Calzolari N., Magnini B., Bertagna F. (2000), &amp;quot;ItalWordNet: a Large Semantic Database for Italian&amp;quot;, Proc. of the 2nd International Conference on Language Resources and Evaluation (LREC 2000), Athens, Greece, 2000, pp. 783-790.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0032]E. Pianta, L. Bentivogli, C. Girardi. MultiWordNet: developing an aligned multilingual database, Proc. of the First International Conference on Global WordNet, Mysore, India, January 21-25, 2002. http://multiwordnet.fbk.eu/paper/MWN-India-published.pdf&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0033]https://www.iso.org/standard/28245.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0034]https://www.gpdp.it/web/guest/regolamentoue&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0035]https://eur-lex.europa.eu/legal-content/IT/TXT/?uri=uriserv:OJ.L_.2016.119.01.0001.01.ITA&amp;amp;toc=OJ:L:2016:119:TOC&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0036]https://www.corriere.it/Primo_Piano/Cronache/2006/09_Settembre/15/cognomi.shtml&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0037]https://data.world/axtscz/italian-first-names&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0038]https://en.wikipedia.org/wiki/Dependency_inversion_principle&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0039]https://imperialcollegelondon.app.box.com/s/lqqcugie51pllz26uixjvx0uio8qxgo5/file/493461282808&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0040https://www.docx4java.org/trac/docx4j]&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0041]https://github.com/plutext/docx4j&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0042]https://docs.oracle.com/javase/9/docs/api/java/lang/String.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0043]https://github.com/php/php-src/blob/master/ext/session/session.c&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0044]https://github.com/plutext/docx4j/search?q=getJAXBNodesViaXPath+in%3Afile&amp;amp;type=Code&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0045]https://www.w3.org/TR/xpath-30/&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0046]https://www.istat.it/it/dati-analisi-e-prodotti/contenuti-interattivi/contanomi&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0047]&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0048]&lt;br /&gt;
&lt;br /&gt;
==Indice delle figure==&lt;br /&gt;
&lt;br /&gt;
[0F00]https://en.wikipedia.org/wiki/Latin_script&lt;br /&gt;
&amp;lt;!-- [[File:Latin alphabet world distribution.svg|thumb|upright=1.6|In verde scuro le nazioni dove è usato solo l'alfabeto latino; in verde chiaro quelle dove all'alfabeto latino è affiancato un altro alfabeto.]] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[0F01]Diagramma di Venn 1&lt;br /&gt;
&lt;br /&gt;
[0F02]Diagramma di Venn 2&lt;br /&gt;
&lt;br /&gt;
[0F03]Diagramma di Venn 3&lt;br /&gt;
&lt;br /&gt;
[0F04]Esito unit test regex (cartella immagini)&lt;br /&gt;
&lt;br /&gt;
[0F05]Inforgrafica GDPR&lt;br /&gt;
&lt;br /&gt;
[0F06]Diagramma di sequenza UML&lt;br /&gt;
&lt;br /&gt;
[0F07]Primo calcolo valutazione algoritmo&lt;br /&gt;
&lt;br /&gt;
[0F08]Secondo calcolo valutazione algoritmo&lt;br /&gt;
&lt;br /&gt;
[0F09]Terzo calcolo valutazione algoritmo&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Servizio_web_per_il_trattamento_dei_dati_personali_contenuti_in_documenti_OOXML_complessi&amp;diff=166</id>
		<title>Servizio web per il trattamento dei dati personali contenuti in documenti OOXML complessi</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Servizio_web_per_il_trattamento_dei_dati_personali_contenuti_in_documenti_OOXML_complessi&amp;diff=166"/>
		<updated>2019-09-30T00:18:44Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: /* Indice delle figure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduzione==&lt;br /&gt;
&lt;br /&gt;
Il recente Regolamento Generale europeo sulla Protezione dei Dati (UE) 2016/679 ([0034], [0035]) o ''GDPR'' (''General Data Protection Regulation'', come nel seguito sarà chiamato) ha modernizzato significativamente la normativa in materia di protezione dei dati personali, rendendola omogenea fra tutti gli stati membri. È bene notare che, fin dal titolo, il ''GDPR'' non riduce gli spazi per i trattamenti di dati personali, ma anzi ne protegge la &amp;quot;libera circolazione&amp;quot;, dettando, però, regole definite e certe. Rinunciando ad una presentazione più completa del ''GDPR'', saranno riportati nei successivi capitoli i concetti necessari alla discussione dell'argomento.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Enti ed organizzazioni, aventi a che fare con documenti contenenti dati sensibili, devono operare in maniera conforme al ''GDPR''; potrebbero, di conseguenza, trarre beneficio da servizi specifici in grado di supportarli in queste esigenze.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
L'oggetto principale della tesi sarà dunque, come riportato dal titolo, la progettazione e la realizzazione di un servizio per la gestione di dati personali.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F05])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La larga maggioranza dei documenti testuali viene generata con strumenti cosiddetti di &amp;quot;produttività individuale&amp;quot;, cioè da ''word-processors''. L'osservazione, ovvia nella sua evidenza, consente di introdurre una riflessione: quando un documento è generato da un'elaborazione automatica, magari per composizione di ''template'' con dati estratti da un database, l'individuazione dei &amp;quot;dati personali&amp;quot; nel documento prodotto può avvenire in modo rigoroso e senza incertezze, sulla base degli elementi di composizione del documento; ad es.: i campi del documento estratti da una anagrafica di soggetti sono certamente dati personali e come tali possono essere opportunamente trattati nel processo di elaborazione automatica (ad es. cancellati).&lt;br /&gt;
&lt;br /&gt;
Ma, in quella larga maggioranza di documenti testuali generata con ''word-processors'' l'individuazione ed il trattamento dei dati personali vanno affrontati con altri approcci, discussi in questa tesi.&lt;br /&gt;
&lt;br /&gt;
==Scenario di lavoro==&lt;br /&gt;
&lt;br /&gt;
===Minimizzazione dei dati personali===&lt;br /&gt;
&lt;br /&gt;
Un concetto espresso in modo pervasivo dal ''GDPR'' è quello della &amp;quot;''minimizzazione''&amp;quot; dei dati personali trattati ed a maggior ragione dei dati personali pubblicati. In particolare l'Art. 5 ed il Considerando 39 prescrivono che i dati personali trattati siano &amp;quot;''adeguati, pertinenti e limitati a quanto necessario rispetto alle finalità per le quali sono trattati («minimizzazione dei dati»)''&amp;quot; ([0035]).&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Con questo fine, il GDPR delinea due possibilità organizzative e tecniche di &amp;quot;''minimizzazione''&amp;quot;: l'anonimizzazione e la psedonimizzazione.&lt;br /&gt;
&lt;br /&gt;
====Anonimizzazione====&lt;br /&gt;
&lt;br /&gt;
Sono anonimizzati i dati personali non (più) riferibili alle persone a cui sono appartenuti; si tratta di serie di dati, spesso ingenti, che sono stati definitivamente ed irreversibilmente separati da ogni riferimento alle persone che caratterizzavano. Sono le serie di dati utilizzate per fini statistici, scientifici, etc. E' importante notare che, come fissato dal Considerando 26 del ''GDPR'', il Regolamento non si applica al &amp;quot;''trattamento di tali informazioni anonime''&amp;quot; ([0035]). Per questo, sottoporre database e documenti ad un procedimento, cioè un trattamento, di anonimizzazione consente di non doversi più preoccupare del ''GDPR''.&lt;br /&gt;
&lt;br /&gt;
====Pseudonimizzazione====&lt;br /&gt;
&lt;br /&gt;
Fra le definizioni dell'Art. 4 del ''GDPR'', la &amp;quot;pseudonimizzazione&amp;quot; viene indicata come &amp;quot;''il trattamento tale che i dati personali non possano più essere attribuiti a un interessato specifico senza l’utilizzo di informazioni aggiuntive, a condizione che tali informazioni aggiuntive siano conservate separatamente''&amp;quot; ([0035]).&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Traducendo in termini &amp;quot;operativi&amp;quot;, si tratta del procedimento che, dal &amp;quot;record&amp;quot; dei dati di un interessato, separa i campi che caratterizzano l'interessato stesso da quelli che lo identificano, trasferendo questi ultimi in una nuova distinta tabella; nelle due tabelle vengono aggiunti i riferimenti che permettono la ricostruzione del record originario; il procedimento è completo quando la nuova tabella con gli identificativi viene archiviata separatamente ed eventualmente cifrata. In margine si annota che in molti casi, come molti studi dimostrano, è possibile identificare, quindi &amp;quot;riconoscere&amp;quot;, gli interessati utilizzando la sola tabella con i dati pseudonimizzati.&lt;br /&gt;
&lt;br /&gt;
====Altri trattamenti di &amp;quot;minimizzazione&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Un problema pratico che si incontra di frequente è quello di dover pubblicare documenti più o meno ampi che contengono dati personali. Spesso la pubblicazione è obbligatoria per legge: si pensi alle graduatorie relative a concorsi pubblici, alle sentenze dei tribunali, etc.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In questi frequenti casi, analizzando meglio le finalità per le quali sono pubblicati quei dati personali, si osserva che sono possibili e legittimi almeno due approcci per &amp;quot;minimizzare&amp;quot; il dato nel &amp;quot;trattamento di pubblicazione&amp;quot; e, dunque, per minimizzarne la propagazione, ad esempio attraverso motori di ricerca, ben oltre ogni ragionevole finalità. I contesti ed i corrispondenti approcci sono:&lt;br /&gt;
#  Situazioni in cui è necessario che l'interessato possa riconoscersi nel documento ed essere riconosciuto dagli altri soggetti menzionati nel contesto, ma non è plausibile la necessità di identificazione dell'interessato al di fuori di quel contesto specifico. A questo caso si riconducono le graduatorie di concorsi, gli elenchi per la formazione di classi, gli elenchi per convocazioni, etc. In tutti questi casi, nel processo di redazione del documento è più pratico trattare internamente i dati personali in forma completa; ma praticamente mai è necessario pubblicarli per intero, esponendo al pubblico accesso codici fiscali, indirizzi, recapiti telefonici etc. Per di più, nella maggior parte delle volte, è sufficiente pubblicare il solo cognome perché l'interessato conosca la sua posizione in graduatoria; ciò è spesso sufficiente anche a trasmettere l'informazione necessaria ai colleghi dell'interessato nella medesima graduatoria, o nella medesima classe, etc. Notare che, pubblicando il solo cognome, viene di fatto oscurato anche il sesso. Dunque, in questi casi è auspicabile cancellare una larga parte dei dati personali presenti nel documento.&lt;br /&gt;
# Situazioni in cui il documento deve essere pubblicato affinché siano rese note le motivazioni che lo hanno originato, senza che sia necessaria la precisa identificazione dei soggetti che vi compaiono. Questo è il caso della pubblicazione di sentenze giudiziarie di ogni grado. Le sentenze vengono notificate direttamente agli &amp;quot;aventi causa&amp;quot;; ma anche, come la legge prescrive, pubblicate al fine di costituire giurisprudenza. In questo secondo caso, risulta del tutto eccedente la pubblicazione dei reali nominativi degli interessati, che troverebbero verosimilmente la propria vicenda inutilmente indicizzata dai motori di ricerca negli anni a venire. Nella pubblicazione delle sentenze appare un approccio ottimale quello di sostituire con pseudonimi o con iniziali alterate i veri nominativi degli interessati presenti: il senso e le argomentazioni della sentenza restano pienamente comprensibili, come è necessario; il dato personale, del tutto superfluo ai fini della giurisprudenza, viene protetto.&lt;br /&gt;
In questi casi appare opportuno sostituire i dati identificativi dell'interessato, ed in particolare il nome e cognome, con pseudonimi o, ancora, con iniziali alterate, cioè non coincidenti con le iniziali reali. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Proprio questi tipi di trattamenti di &amp;quot;minimizzazione&amp;quot; sono l'oggetto di questa tesi.&lt;br /&gt;
&lt;br /&gt;
===Punti di partenza per la progettazione del servizio===&lt;br /&gt;
&lt;br /&gt;
La tesi è stata svolta in collaborazione con l'azienda AFA Systems (www.afasystems.it/gdpr) con la quale si sono discusse le problematiche di progettazione e realizzazione di un servizio generalizzato di minimizzazione dei dati personali presenti in un documento.&lt;br /&gt;
Con l'intenzione di fornire il servizio ad un bacino d'utenza il più vasto e variegato possibile, si è pensato ad un'applicazione ''web-based'', indipendente così dai singoli devices sui quali poi sarà utilizzata.&lt;br /&gt;
L'attenzione è stata concentrata sul trattamento dei nomi e dei cognomi (che da qui chiameremo nominativi), poiché sono quelli sempre presenti nei documenti (ad es. gli indirizzi sono presenti solo a volte), rappresentano gli elementi tramite i quali è immediato il riconoscimento della persone, non hanno formato predefinito (come ad es. i codici fiscali); altri dati personali (indirizzi, codici fiscali, etc.), potranno essere considerati in successive evoluzioni del progetto.&lt;br /&gt;
È utile notare che la parte iniziale della collaborazione con l'azienda è stata dedicata alla discussione delle specifiche, la cui più precisa definizione è parte rilevante di questa tesi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Tra i requisiti che necessitano di un opportuno studio troviamo ad esempio:&lt;br /&gt;
* L'individuazione di metodi efficaci per il riconoscimento dei nominativi nei documenti&lt;br /&gt;
* L'identificazione delle migliori procedure di interazione con l'utente&lt;br /&gt;
* La scelta dei formati da trattare&lt;br /&gt;
* I vincoli non funzionali legati al rispetto del ''GDPR''.&lt;br /&gt;
&lt;br /&gt;
==Definizione delle specifiche==&lt;br /&gt;
&lt;br /&gt;
===Riconoscimento dei nominativi===&lt;br /&gt;
&lt;br /&gt;
====Scelta della strategia di riconoscimento====&lt;br /&gt;
 &lt;br /&gt;
Le difficoltà principali con cui ci si imbatte nel processo di riconoscimento dei nominativi riguardano la complessità strutturale dei documenti di testo, ma soprattutto l'intrinseca ambiguità del linguaggio naturale. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Le variabili ed impredicibili strutture e formattazioni dei documenti introducono alcuni problemi significativi. Rendendo fortemente eterogeneo il contenuto dei documenti, infatti, esse non consentono di ricondurre il problema del riconoscimento dei nominativi ad uno o a pochi singoli casi, ma comportano lo studio di tutte le strutture e formattazioni possibili, rendendo quindi l'analisi molto generale. L'altra rilevante difficoltà presente sta nella complessità di effettuare il riconoscimento di una stringa testuale immersa in un insieme di elementi non tutti testuali. Ogni elemento di formattazione, che sia una tabella o una barra orizzontale, introduce infatti un proprio significato logico e semantico nel documento di cui bisogna tenere conto.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Il linguaggio naturale introduce anch'esso complessità: si pensi alle molteplici tipologie di proposizioni con cui possono essere articolati i periodi; ma i problemi principali derivano dalle sue ambiguità. Esse vengono classificate in diverse tipologie ([0025]); le principali sono le ambiguità sintattiche e lessicali.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si ha ambiguità sintattica quando la sintassi di una frase può essere interpretata in diversi modi e, di conseguenza, la frase stessa assume significati diversi. Essa è presente, ad esempio, nelle seguenti frasi:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
* &amp;quot;''Rapina in banca con rivoltella da centomila euro''&amp;quot;&lt;br /&gt;
* &amp;quot;''Luigi ha visto un uomo nel parco con il binocolo''&amp;quot;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
L'esasperazione massima della problematica delle ambiguità sintattiche si presenta con l'&amp;lt;i&amp;gt;antinomia&amp;lt;/i&amp;gt;, ossia un particolare tipo di paradosso che indica la compresenza di due affermazioni contraddittorie che possono essere entrambe dimostrate o giustificate.&lt;br /&gt;
L'antinomia di Epimenide o ''Paradosso del mentitore'', nota fin dal VI secolo, è probabilmente uno dei più noti esempi: &amp;quot;''il cretese Epimenide afferma che tutti i cretesi mentono''&amp;quot;. Se la proposizione è vera (i cretesi mentono) allora il suo significato implica che sia falsa (Epimenide mente e quindi i cretesi dicono la verità), ma se è falsa (i cretesi dicono la verità) ciò significa che è vera (Epimenide dice la verità e quindi i cretesi mentono). La proposizione appare contemporaneamente vera e falsa. A partire dagli anni venti del '900, sono state elaborate varie teorie per la risoluzione delle contraddizioni provocate dalle antinomie, soprattutto attraverso l'elaborazione di linguaggi multilivello o attraverso l'elaborazione di logiche polivalenti (quindi non-booleane).&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si ha ambiguità lessicale, invece, quando una parola possiede più di un significato nella lingua a cui appartiene ([0026]), in tal caso la parola è definita ''polisemica''. In italiano, alcuni termini soggetti a questo tipo di ambiguità sono, ad esempio &amp;quot;''acuto''&amp;quot; o &amp;quot;''venti''&amp;quot;. È questo genere di ambiguità che risulta critico per il riconoscimento dei nominativi. La difficoltà determinata dalle ambiguità sintattiche, infatti, riguarda l'individuazione corretta di soggetti, predicati e complementi di un periodo, mentre le ambiguità lessicali ostacolano la comprensione del significato del singolo lessema. Nel processo di riconoscimento è irrilevante determinare la funzione logica che il nominativo svolge nella frase, mentre è necessario essere certi che i termini che compongono il nominativo siano effettivamente dei nomi propri di persona o dei cognomi, non altri vocaboli del lessico comune. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In linguistica, l'intervento con cui si toglie ambiguità a una parola o a una frase prende il nome di &amp;quot;disambiguazione&amp;quot; ([0027]). Il problema della disambiguazione automatica (in inglese ''Word Sense Disambiguation'' o, abbreviato, ''WSD'') riveste particolare importanza nelle ricerche sull'intelligenza artificiale e, in particolare, nell'elaborazione del linguaggio naturale. Si prevedono benefici della disambiguazione, ad esempio, in programmi di traduzione automatica, recupero dell'informazione o estrazione automatica di informazioni. Nell'analisi delle soluzioni esistenti in letteratura per la risoluzione delle ambiguità, ci si sofferma specialmente sulle ricerche incentrate sul trattamento dell'ambiguità lessicale, essendo essa la più rilevante per i nostri interessi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
La ''WSD'' richiede due input necessariamente: un dizionario per specificare i sensi che devono essere disambiguati e un corpus di dati linguistici da disambiguare. Nello scenario più realistico, si trattano testi le cui parole non sono note a priori e risulta molto onerosa la produzione del corpus, essendo infatti necessaria la valutazione di un operatore umano per verificare la correttezza delle disambiguazioni effettuate dagli algoritmi (''supervised learning'').&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Uno tra i principali dizionari semantici-lessicali utilizzati della lingua inglese è ''WordNet'' ([0029]), mentre alcuni dei database equivalenti che trattano l'italiano sono ''BabelNet'' ([0030]), ''ItalWordNet'' ([0031]) e ''MultiWordNet'' ([0032]).&lt;br /&gt;
Un elemento importante da considerare è che le prestazioni di disambiguazione per la lingua inglese, impiegando ''WordNet'', risultano corrette tra l'80% e il 90% delle volte ([0028]), percentuali discrete ma non sufficienti per avere la totale garanzia.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
I fattori che ostacolano la realizzazione di algoritmi di intelligenza artificiale per la disambiguazione sono molteplici:&lt;br /&gt;
# Differenze tra dizionari impiegati: i database prima citati si basano su varie fonti che raggruppano semanticamente in maniera diversa i vocaboli, quindi programmi sviluppati con dizionari diversi generalmente hanno performance differenti.&lt;br /&gt;
# Complessità della codifica di parte del discorso: per poter disambiguare correttamente un termine è importante riuscire a comprendere correttamente il contesto in cui è inserito, operazione non banale.&lt;br /&gt;
# Varianza tra giudici: i supervisori dell'apprendimento degli algoritmi possono avere opinioni diverse, o semplicemente sbagliare, nella valutazione delle disambiguazioni, ciò porta ad algoritmi che hanno comportamenti diversi.&lt;br /&gt;
# Impossibilità di applicare la disciplina della ''pragmatica'', ossia la logica del ''buon senso'': per identificare correttamente il senso di alcune parole, ad esempio nella comprensioni di anafore e catafore, è necessario applicare il buon senso.&lt;br /&gt;
# Dipendenza del senso delle parole dai contesti: ogni scenario richiede la propria divisione del significato delle parole in sensi rilevanti. In un contesto informatico, ad esempio, il termine &amp;quot;''mouse''&amp;quot; deve essere ricondotto al dispositivo di puntamento, non al cognome del celebre personaggio Disney ''Mickey Mouse''; viceversa dovrà invece avvenire in un contesto di letteratura a fumetti.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Laddove la ''WSD'' è una tecnica molto generale e che mira a risolvere un'ambiguità riguardante una qualunque parola, per le finalità del servizio oggetto di questa tesi è sufficiente risolvere le ambiguità dei nomi e dei cognomi. &lt;br /&gt;
Uno dei difetti che il servizio presenterebbe adottando un approccio ''WDS'' è legato alla impredicibile formattazione dei documenti, che aggiunge informazione semantica al testo ma introduce complessità nella individuazione automatica delle parti che formano il contesto; un altro difetto dipende dalla vastità del lessico da elaborare, essendo i documenti da trattare forniti dai più disparati utenti, su qualunque genere di argomento e relativi ai più vari ambiti.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La strategia che sarà adottata per risolvere la problematica del riconoscimento dei nominativi sarà impostata attraverso un modello ''pattern-based'', impiegando le ''regular expressions'' (''regex''). Esse risultano comunemente usate per effettuare operazioni di ricerca o sostituzione in un testo, di conseguenza se si riesce ad individuare un pattern associato ad un nominativo dato, allora sarà possibile processare il documento ricercando le occorrenze del nominativo e &amp;quot;minimizzarlo&amp;quot; opportunamente.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le ''regular expressions'' risultano particolarmente efficaci poiché, se opportunamente progettate, possono identificare un nominativo indipendentemente dal significato linguistico del contesto in cui è calato, basandosi piuttosto sui singoli caratteri che compongono i lessemi analizzati; permettono, di conseguenza, di effettuare una valutazione estremamente minuziosa, riducendo al minimo le possibilità di errori.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Un algoritmo di risoluzione ''pattern-based'' risulta, inoltre, più efficiente nell'esecuzione, in generale, di un algoritmo di intelligenza artificiale; per fornire la risposta il più velocemente possibile ad un utente, fruitore del servizio via web, l'approccio di riconoscimento tramite pattern è il più indicato.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Definizione dei pattern====&lt;br /&gt;
Nella progettazione del servizio si adotta, come detto, un approccio ''pattern-based'' per il riconoscimento dei nominativi. In linea di massima è opportuno che vengano riconosciuti più nominativi possibili e allo stesso tempo che la correttezza dell'identificazione di un nominativo sia garantita, quindi bisogna individuare dei pattern non troppo stringenti ma neppure troppo laschi. Per analizzare come i pattern devono essere strutturati si prende come caso di studio un generico nominativo, ad esempio ''Lorenzo Mario Amorosa''. Nel documento esso può comparire esattamente come appena indicato, ma anche in altre plausibili varianti, in cui l'ordine dei termini viene alterato, si pensi ad esempio ad &amp;quot;Amorosa Lorenzo Mario&amp;quot; o &amp;quot;Mario Lorenzo Amorosa&amp;quot;, o in altre varianti ancora in cui alcuni nomi non compaiono, come in &amp;quot;Lorenzo Amorosa&amp;quot;. Bisogna tuttavia supporre un limite alla variabilità: si osserva infatti che il cognome deve sempre comparire (il solo nome ''Lorenzo'' non è riconducibile a ''Lorenzo Mario Amorosa'') e che esso inoltre deve essere necessariamente anteposto o posposto, ma non interposto, ai nomi (è poco ragionevole ricondurre &amp;quot;Lorenzo Amorosa Mario&amp;quot; a &amp;quot;Lorenzo Mario Amorosa'').&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Questa prima specifica permette di ricondursi a una soluzione generale, sufficiente nella maggior parte dei casi, ma che non risolve alcune criticità. Un nominativo può, in alcuni documenti, comparire manifestandosi unicamente attraverso il cognome (riferendoci all'esempio precedente, ''Lorenzo Mario Amorosa'' apparirebbe nella forma ''Amorosa''). Sorge qui il problema che molti dei cognomi italiani hanno un significato proprio nel linguaggio comune; ad es., nella frase ''una relazione amorosa è bella'' è errato considerare la parola ''amorosa'' come cognome di un nominativo. Per risolvere questo genere di ambiguità si potrebbe pensare che per stabilire che il termine ''Amorosa'' sia un cognome sia sufficiente verificare che esso inizi con una lettera maiuscola, ma ciò può verificarsi anche perché la parola si trova ad inizio di frase. Inoltre, vari cognomi italiani possono iniziare con una lettera minuscola (''de Angelis'', ''d'Onofrio'', etc.), quindi basare l'identificazione di un cognome sul fatto che la sua prima lettera sia in maiuscolo non è in generale un metodo valido. Volendo in maniera prioritaria garantire il corretto funzionamento del servizio, e quindi attuare le procedure di anonimizzazione solo sui nominativi senza applicarle erroneamente ad altri termini, risulta necessario evitare il trattamento dei nominativi che si manifestano con i soli cognomi. Per via del contesto e dei significati che i cognomi possono assumere, infatti, risulta spesso impossibile distinguerli da parole del linguaggio comune. &lt;br /&gt;
&lt;br /&gt;
Ci si concentra, quindi, nello studio di nominativi composti da un cognome seguito o preceduto da uno o più nomi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si rappresenta dunque in formato di ''regular expression'' il pattern attualmente ideato. Per semplicità espositiva, si definisce il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; come l'insieme delle permutazioni di tutti i nomi del nominativo più l'insieme delle permutazioni di tutti i possibili sottoinsiemi di nomi del nominativo. Considerando il nominativo preso precedentemente come caso di studio, ad esempio, si avrebbe:&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt; &amp;lt;nomi&amp;gt; = Lorenzo Mario|Mario Lorenzo|Lorenzo|Mario&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Posto inoltre il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt; ad indicare il cognome contenuto nel nominativo e il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;regex&amp;gt;&amp;lt;/span&amp;gt; ad indicare la ''regular expression'' associata al nominativo, si ottiene:&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt; &amp;lt;regex&amp;gt; := &amp;lt;cognome&amp;gt; (&amp;lt;nomi&amp;gt;)|(&amp;lt;nomi&amp;gt;) &amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Una osservazione sottile ma di fondamentale importanza per la corretta progettazione delle ''regular expressions'' sta nella piena comprensione della semantica dell'operatore di scelta, espresso con il carattere ''pipe'' (&amp;quot;|&amp;quot;). Un qualunque ''engine'' di elaborazione delle ''regex'', infatti, interrompe la valutazione di una stringa non appena può stabilire se tale stringa fa match o meno con il pattern dato, senza quindi necessariamente valutarlo nella sua interezza, come parimenti avviene nelle valutazioni ''a corto circuito'' delle espressioni logiche nei linguaggi di programmazione. Ogni nominativo avrà a sè associato un pattern che lo rappresenta in più possibili sequenze di caratteri; per effettuare una corretta &amp;quot;minimizzazione&amp;quot; dei dati è necessario che le sequenze contenenti tutti i nomi sia poste per prime, mentre quelle contenenti un singolo nome per ultime.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In questa prima formulazione della ''regex'', inoltre, si è posto come separatore unicamente lo spazio bianco, ma alcuni documenti potrebbero contenere dei nominativi i cui termini sono separati da altri caratteri, come ad esempio una virgola nel caso di &amp;quot;Amorosa, Lorenzo Mario&amp;quot;. Per poter quindi identificare un nominativo anche in questi casi, si potrebbe considerare un qualunque carattere di interpunzione come possibile separatore dei termini del nominativo.&lt;br /&gt;
Adottando questa soluzione si ha però come effetto collaterale che risultano critici i casi in cui nel testo sono presenti dei nominativi soggetti ad omonimia. Si consideri una generica frase contenente una sequenza di nominativi, ad esempio ''Amorosa Lorenzo, Mario Giacomo e Fabio Rossi'', e si supponga che i nominativi da trattare siano ''Amorosa Lorenzo Mario'', ''Mario Giacomo'' (in cui la parola ''Mario'' è il cognome) e ''Fabio Rossi''. Gli ultimi due nominativi compaiono nella frase nella loro forma estesa, mentre il primo compare con il solo nome ''Lorenzo'' (eventualità possibile considerando la definizione del pattern precedentemente data). Considerando la virgola come carattere separatore dei termini del nominativo, la sequenza di parole ''Amorosa Lorenzo, Mario'' sarebbe ricondotta, venendo elaborata per prima, ad ''Amorosa Lorenzo Mario'', mentre rimarrebbe non trattata la parola ''Giacomo'', in quanto il cognome ''Mario'' che gli era associato è stato già identificato come un nome del nominativo ''Amorosa Lorenzo Mario'' ed il termine ''Giacomo'' preso singolarmente non rappresenta un nominativo.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Prima di valutare ulteriormente le problematiche relative alle omonimie, si possono scegliere due approcci per risolvere questo specifico caso:&lt;br /&gt;
# Si riconduce una sequenza di parole ad un nominativo se e solo se tutti i suoi nomi sono contenuti nella sequenza&lt;br /&gt;
# Si considerano come separatori dei termini contenuti nei nominativi solo spazi bianchi, tabulazioni e a capo, non gli altri segni di punteggiatura.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Entrambe le strategie sono valide, in quanto risolvono il problema garantendo la corretta identificazione dei nominativi, ma allo stesso tempo entrambe presentano lo svantaggio di ridurre le sequenze di parole riconducibili a dei nominativi, aumentando le possibilità che alcuni di essi non vengano trattati.&lt;br /&gt;
Si consideri nuovamente il nominativo preso come caso di studio ''Amorosa Lorenzo Mario'': applicando la prima strategia, non sarebbe possibile ricondurgli la sequenza ''Amorosa Lorenzo'', mentre applicando il secondo metodo non sarebbe riconducibile la sequenza ''Amorosa, Lorenzo Mario''.&lt;br /&gt;
Si decide di attuare la seconda strategia, in quanto è opportuno non imporre vincoli troppo stringenti sui nomi e poiché nella gran parte dei casi i termini dei nominativi nei documenti sono separati tra loro da caratteri quali spazi bianchi, tabulazioni ed a capo.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Un altro elemento su cui porre l'attenzione è la possibilità che i documenti da trattare contengano dei nominativi scritti interamente in maiuscolo o minuscolo, di conseguenza è conveniente che le ''regular expressions'' siano progettate ''case-insensitive''.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Un ulteriore punto su cui bisogna soffermarsi è la posizione all'interno di un periodo in cui un nominativo può comparire, in particolare si vogliono evitare quei casi critici in cui uno dei termini del nominativo è una sotto-stringa di un'altra parola del testo (si pensi ad ''amorosa'' in ''clamorosa''). Come regola generale si può stabilire che è sempre necessario che un nominativo sia preceduto e seguito da un ''carattere non alfabetico''. Un caso particolare si presenta quando il nominativo è posto ad inizio o a fine documento, situazione in cui quindi esso non è preceduto o non è seguito da alcun carattere: entrambe le posizioni sono da considerare corrette.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
È opportuno ora definire il concetto di ''carattere non alfabetico'', e ciò si può fare più facilmente ragionando sul problema in logica positiva; infatti risulta più semplice individuare quei caratteri che rappresentano lettere piuttosto che quelli che rappresentano segni di interpunzione ed individuare ogni altro carattere che non può mai comporre una parola.&lt;br /&gt;
&lt;br /&gt;
Inquadrando lo scenario di applicazione del servizio, molto probabilmente l'utente vorrà trattare un documento scritto nella lingua di uno dei paesi dell'Unione Europea, poiché il ''GDPR'' vige nei soli paesi membri dell'Unione.&lt;br /&gt;
Si può, quindi, ipotizzare che i documenti trattati possono sì contenere parole e nominativi stranieri, ma che i caratteri contenuti siano appartenenti all'alfabeto latino (''Latin script''), usato in molti stati nel mondo e da tutti i principali stati europei (fatta eccezione per la Grecia ed alcuni stati che scrivono in caratteri cirillici).&lt;br /&gt;
Inoltre, testi scritti in altri alfabeti, come esempio il cinese, l'arabo o il cirillico, vengono generalmente traslitterati. Considerare, quindi, ''caratteri non alfabetici'' tutti i caratteri diversi dalle lettere contenute nell'alfabeto latino sarebbe di conseguenza estremamente riduttivo ed inoltre in questo modo non si terrebbe conto delle lettere accentate, molto utilizzate anche nella lingua italiana.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(XXXX QUI IMG [0F00])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per risolvere il problema facciamo riferimento alla codifica standard Unicode dell'alfabeto latino ([0022]); in essa è possibile individuare, oltre ai caratteri rappresentanti le lettere nella codifica ''ASCII'' classica, i caratteri rappresentanti le lettere nella codifica standard ''ISO/IEC 8859-1'' ([0023]), encoding orientato principalmente alla rappresentazione delle lingue dell'Europa occidentale.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;i&amp;gt;Caratteri latini nei primi due blocchi dello standard Unicode&amp;lt;/i&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;nounderlines&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border-collapse:collapse&amp;quot;&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; &lt;br /&gt;
!style=&amp;quot;background:#ccf; text-align:center; font-weight: bold;&amp;quot;|U+&lt;br /&gt;
!style=&amp;quot;text-align:center; font-weight: bold;&amp;quot;|0||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|1||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|2||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|3||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|4||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|5||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|6||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|7||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|8||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|9||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|A||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|B||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|C||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|D||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|E||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|F||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|Block||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|#&lt;br /&gt;
|-&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|0040&lt;br /&gt;
|style=&amp;quot;background:#fff&amp;quot;|@||A||B||C||D||E||F||G||H||I||J||K||L||M||N||O&lt;br /&gt;
|rowspan=&amp;quot;4&amp;quot; style=&amp;quot;background:#fff&amp;quot; align:&amp;quot;center&amp;quot;|C0 Controls and Basic Latin&amp;lt;br&amp;gt;0000–007F&amp;lt;br&amp;gt;(identical to ASCII)&lt;br /&gt;
|rowspan=&amp;quot;4&amp;quot; style=&amp;quot;background:#fff&amp;quot;|52&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|0050&lt;br /&gt;
|P||Q||R||S||T||U||V||W||X||Y||Z||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#91;||style=&amp;quot;background:#fff&amp;quot;|\||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#93;||style=&amp;quot;background:#fff&amp;quot;|^||style=&amp;quot;background:#fff&amp;quot;|_&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|0060&lt;br /&gt;
|style=&amp;quot;background:#fff&amp;quot;|`||a||b||c||d||e||f||g||h||i||j||k||l||m||n||o&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|0070&lt;br /&gt;
|p||q||r||s||t||u||v||w||x||y||z||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#123;||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#124;||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#125;||style=&amp;quot;background:#fff&amp;quot;|~||style=&amp;quot;background:#fff; font-size:75%&amp;quot;|DEL&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;19&amp;quot;| &lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#fff&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00A0&lt;br /&gt;
|&amp;amp;nbsp;||¡||¢||£||¤||¥||¦||§||¨||©||ª||«||¬||||®||¯&lt;br /&gt;
|rowspan=&amp;quot;6&amp;quot; style=&amp;quot;background:#fff&amp;quot; align=&amp;quot;center&amp;quot;|C1 Controls and Latin-1 Supplement&amp;lt;br&amp;gt;0080–00FF&amp;lt;br&amp;gt;(identical to ISO/IEC 8859-1)&lt;br /&gt;
|rowspan=&amp;quot;6&amp;quot; style=&amp;quot;background:#fff&amp;quot;|62&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#fff&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00B0&lt;br /&gt;
|°||±||²||³||´||µ||¶||·||¸||¹||º||»||¼||½||¾||¿&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00C0&lt;br /&gt;
|À||Á||Â||Ã||Ä||Å||Æ||Ç||È||É||Ê||Ë||Ì||Í||Î||Ï&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00D0&lt;br /&gt;
|Ð||Ñ||Ò||Ó||Ô||Õ||Ö||style=&amp;quot;background:#fff&amp;quot;|×||Ø||Ù||Ú||Û||Ü||Ý||Þ||ß&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00E0&lt;br /&gt;
|à||á||â||ã||ä||å||æ||ç||è||é||ê||ë||ì||í||î||ï&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00F0&lt;br /&gt;
|ð||ñ||ò||ó||ô||õ||ö||style=&amp;quot;background:#fff&amp;quot;|÷||ø||ù||ú||û||ü||ý||þ||ÿ&lt;br /&gt;
|---- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I caratteri indicati in rosso nella tabella sono tutti i possibili ''caratteri alfabetici'' che compaiono nei documenti scritti in 29 lingue diverse ([0023]), tra le quali sono presenti l'italiano, l'inglese, lo spagnolo, il tedesco e il portoghese. &lt;br /&gt;
Aggiungendo pochi altri caratteri all'insieme dei ''caratteri alfabetici'' appena mostrati, si riesce a rappresentare ogni parola di altre 12 lingue ([0023]), tra cui il francese, l'olandese, il ceco e il turco.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
I caratteri mostrati in tabella corrispondono ad una parte dei primi due blocchi dello standard Unicode che codificano l'alfabeto latino e, come già accennato in precedenza, essi sono presenti negli standard ''ASCII'' e ''ISO/IEC 8859-1''. I rimanenti ''caratteri alfabetici'', invece, sono presenti in estensioni dello standard Unicode per il ''Latin script''. Queste estensioni sono state realizzate per fornire il massimo supporto a tutte le lingue e contenenti molti simboli ad uso speciale, come ad esempio per la rappresentazione dei fonemi. Si osserva, inoltre, che i ''caratteri alfabetici'' definiti nelle estensioni dello standard Unicode sono presenti anche nella codifica ''ISO/IEC 8859-2'' o nelle versioni successive ([0023]).&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Definiti i ''caratteri non alfabetici'' come elementi di separazione tra un nominativo ed il testo in cui esso è inserito, occorre definire opportunamente la ''regex'' che al nominativo è associata.&lt;br /&gt;
&lt;br /&gt;
Utili strumenti messi a disposizione dalle ''regular expressions'' sono i gruppi speciali ''lookahead'' e ''lookbehind''. Un pattern di un nominativo deve essere preceduto o seguito da una prestabilita sequenza di caratteri, la quale però non è parte del nominativo. Utilizzando i due costrutti citati, è possibile far sì che nell'elaborazione di una stringa facciano match solamente le parole effettivamente appartenenti al nominativo, non i caratteri che lo delimitano dal resto del testo, e allo stesso tempo che un nominativo faccia match se e solo se preceduto o seguito da una certa sequenza di caratteri. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per esprimere nella sintassi delle ''regex'' un carattere letterale in un qualunque alfabeto si può utilizzare il costrutto ''\p{L}'', che però risulta molto generale e troppo lasco per i requisiti considerati. Si può piuttosto valutare l'impiego del costrutto ''\p{Latin}'', il quale identifica un qualunque carattere alfabetico presente nell'alfabeto latino. Tra i caratteri corrispondenti al costrutto, però, ve ne sono alcuni che per le specifiche del servizio devono essere considerati ''caratteri non alfabetici'', come ad esempio i caratteri dei fonemi, i segni diacritici e gli indicatori ordinali; di conseguenza è necessario individuare una strategia ad hoc per risolvere questa problematica.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per chiarezza espositiva, si definisce il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;start&amp;gt;&amp;lt;/span&amp;gt;, per indicare un qualunque carattere non alfabetico o l'inizio stringa, il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;end&amp;gt;&amp;lt;/span&amp;gt;, per indicare un qualunque carattere non alfabetico o il fine stringa, ed il tag &amp;lt;extra&amp;gt;, per indicare i ''caratteri alfabetici'' non presenti negli standard ''ASCII'' o ''ISO/IEC 8859-1'':&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;extra&amp;gt; := ĿŀČčŘřŠšŽžĲĳŒœŸŐőŰűḂḃĊċḊḋḞḟĠġṀṁṠṡṪṫĀāĒēĪīŌōŪūİıĞğŞşẀẁẂẃŴŵŶŷǾǿẞ&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;start&amp;gt; := (?&amp;lt;=[^A-Za-zÀ-ÖØ-öø-ÿ&amp;lt;extra&amp;gt;]|^)&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;end&amp;gt; := (?=[^A-Za-zÀ-ÖØ-öø-ÿ&amp;lt;extra&amp;gt;]|$)&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva che si sono utilizzati i gruppi speciali prima descritti e che si sono inseriti i caratteri dello standard Unicode presentati in precedenza. Si definisce nuovamente la ''regular expression'' associata ad un generico nominativo. Applicando i tag appena definiti, il costrutto ''(?i)'' che rende il pattern ''case-insensitive'' ed il costrutto ''\s'' che rappresenta un carattere qualunque tra i separatori non visibili, ossia ''\r \n \t \f \v'' e lo spazio bianco, si ottiene:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;regex&amp;gt; := (?i)(&amp;lt;start&amp;gt;&amp;lt;cognome&amp;gt;\s+(&amp;lt;nomi&amp;gt;)|(&amp;lt;nomi&amp;gt;)\s+&amp;lt;cognome&amp;gt;&amp;lt;end&amp;gt;)&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva, inoltre, che in questa nuova formulazione della ''regular expression'' i nomi sono da intendersi separati tra loro da ''\s+''.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
A questo punto si è quasi giunti alla formulazione finale del pattern da associare ad un nominativo, rimangono solo da trattare alcuni casi critici non ancora risolti.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt; &lt;br /&gt;
Si è già presentato in precedenza il problema legato al fatto che alcuni cognomi possono avere un significato proprio nel lessico comune e che ciò costringeva, quindi, ad abbandonare l'idea di trattare nominativi formati dal solo cognome. Questa problematica di ambiguità si presenta anche con alcuni nomi (si pensi, ad esempio, al nome ''Gioia''). Ciò non rappresenta generalmente un problema, in quanto la coppia nome-cognome che forma il nominativo, presa complessivamente, non è soggetta ad ambiguità. Esistono, però, dei casi in cui questo non è vero. Si prenda in analisi il nominativo ''Gioia Grande'': risulta evidentemente soggetto a rischio di ambiguità. Una soluzione che si può adottare, per risolvere questo caso critico, si basa sull'associazione di un pattern più stringente ai nominativi. In particolare, si osserva che i nomi propri di persona compaiono sempre ed obbligatoriamente, in un documento grammaticalmente corretto, con la prima lettera maiuscola ([0024]). I cognomi, invece, non sono soggetti ad una regola così stringente: un cognome iniziante con una lettera minuscola (come ''de Rosa'') in alcuni casi, ad esempio se posto dopo un punto fermo, può comparire scritto con la prima lettera sia maiuscola che minuscola; naturalmente, in nessuna occorrenza un cognome che inizi con una lettera maiuscola potrà comparire con una minuscola. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Occorre quindi ridefinire, alla luce di queste osservazioni, la ''regex'' associata ad un nominativo, poiché precedentemente era stata posta interamente ''case-insensitive''. Nel pattern, in particolare, i nomi dovranno sempre iniziare con una maiuscola, mentre i cognomi avranno questo vincolo solo se nel nominativo compaiono con la prima lettera maiuscola. Si mostra quindi quali sono i tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; e &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt; associati a due nominativi, ad esempio ''Gioia Grande'' e ''Antonio de Rosa''. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per ''Gioia Grande'' si ha:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt; = G((?i)ioia)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt; = G((?i)rande)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per ''Antonio de Rosa'' si ha:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt; = A((?i)ntonio)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt; = (?i)de Rosa&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si presenta dunque la definizione finale del tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;regex&amp;gt;&amp;lt;/span&amp;gt;. Nella definizione il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; è definito il base al numero di nomi del nominativo ed il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt; è definito in base al carattere iniziale del cognome.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;regex&amp;gt; := &amp;lt;start&amp;gt;&amp;lt;cognome&amp;gt;\s+(&amp;lt;nomi&amp;gt;)|(&amp;lt;nomi&amp;gt;)\s+&amp;lt;cognome&amp;gt;&amp;lt;end&amp;gt;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Vengono inoltre mostrati i valori dei due tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; e &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt; per il nominativo preso come caso di studio in fase iniziale, ossia ''Amorosa Lorenzo Mario''. Si ottiene:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt; = L((?i)orenzo)\s+M((?i)ario)|M((?i)ario)\s+L((?i)orenzo)|L((?i)orenzo)|M((?i)ario)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt; = A((?i)morosa)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Infine, per completezza, viene mostrata la ''regular expression'', associata a quest'ultimo nominativo, risolvendo tutti i tag che la compongono:&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;regex&amp;gt; = (?&amp;lt;=[^A-Za-zÀ-ÖØ-öø-ÿĿŀČčŘřŠšŽžĲĳŒœŸŐőŰűḂḃĊċḊḋḞḟĠġṀṁṠṡṪṫĀāĒēĪīŌōŪūİıĞğŞşẀẁẂẃŴŵŶŷǾǿẞ]|^)(A((?i)morosa)\s+(L((?i)orenzo)\s+M((?i)ario)|M((?i)ario)\s+L((?i)orenzo)|L((?i)orenzo)|M((?i)ario))|(L((?i)orenzo)\s+M((?i)ario)|M((?i)ario)\s+L((?i)orenzo)|L((?i)orenzo)|M((?i)ario))\s+A((?i)morosa))(?=[^A-Za-zÀ-ÖØ-öø-ÿĿŀČčŘřŠšŽžĲĳŒœŸŐőŰűḂḃĊċḊḋḞḟĠġṀṁṠṡṪṫĀāĒēĪīŌōŪūİıĞğŞşẀẁẂẃŴŵŶŷǾǿẞ]|$)&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Gestione delle omonimie====&lt;br /&gt;
&lt;br /&gt;
Nei ragionamenti che hanno portato alla formulazione della ''regular expression'' associata ai nominativi, si è tenuto conto di possibili ambiguità con termini appartenenti al linguaggio comune, risolte con l'introduzione nel pattern di stringhe ''case-sensitive'', e di possibili nominativi posti in sequenza parzialmente omonimi (ossia aventi un nome o il cognome in comune tra loro), gestite con l'imposizione dei soli caratteri separatori non visibili come delimitatori delle parole componenti un nominativo. Per rendere l'analisi completa occorre valutare come ci si debba comportare in altri possibili casi di omonimia. Si osserva, per inciso, che nel pattern individuato nella sezione precedente il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; è stato l'unico non definito formalmente. La definizione di tale tag infatti dipende, oltre che dai nomi del nominativo, anche dall'insieme complessivo dei nominativi da trattare presenti nel documento.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Il caso più semplice di omonimia, che si verifica quando un solo nome o il solo cognome di un nominativo coincide con un nome o il cognome di un altro (come nel caso di ''Lorenzo Mario Amorosa'' e ''Stefano Amorosa''), risulta già ben gestito dall'attuale formulazione del pattern. Infatti, un riconoscimento è determinato quando almeno un nome e il cognome del nominativo appaiono in sequenza.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Il problema si complica quando un nominativo ha due o più componenti in comune con un altro. Si osserva che se l'omonimia riguarda solo i nomi dei nominativi, ciò non risulta problematico, in quanto il cognome, supposto sempre presente nel pattern, funge da elemento di disambiguazione. Si considera da ora, quindi, che i nominativi abbiano il medesimo cognome e si analizzano i casi in cui anche uno o più nomi risultano in comune, attraverso degli esempi: &lt;br /&gt;
* Nomi_A = {&amp;quot;Lorenzo&amp;quot;, &amp;quot;Mario&amp;quot;, &amp;quot;Luca&amp;quot;}; Nomi_B = {&amp;quot;Stefano&amp;quot;, &amp;quot;Mario&amp;quot;}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F01])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In questo caso sono elementi di disambiguazione i nomi ''Lorenzo'' e ''Luca'' per il primo nominativo e ''Stefano'' per il secondo, bisognerà quindi far sì che almeno uno tra tali nomi compaia sempre nelle ''regex'' associate ai nominativi in questione. L'occorrenza ''Mario &amp;lt;cognome&amp;gt;'' rimane ambigua e non può essere trattata.&lt;br /&gt;
* Nomi_A = {&amp;quot;Lorenzo&amp;quot;, &amp;quot;Mario&amp;quot;, &amp;quot;Luca&amp;quot;}; Nomi_B = {&amp;quot;Mario&amp;quot;, &amp;quot;Luca&amp;quot;}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F02])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
L'insieme Nomi_B risulta un sottoinsieme di Nomi_A, di conseguenza solo il primo nominativo presenta degli elementi utili per risolvere l'ambiguità. Nel pattern relativo al primo nominativo dovrà essere presente almeno un tra i nomi non in comune, mentre il pattern del secondo nominativo rappresenterà inevitabilmente espressioni ambigue poiché riconducibili all'altro. Le soluzioni possibili sono due: rifiutarsi di effettuare il trattamento del secondo nominativo oppure decretare che esso è riconosciuto se e solo se appare nella sua forma estesa, presentando quindi tutti i nomi. Quest'ultima soluzione è ragionevole e la si sceglie, poiché così si aumentano, per quanto possibile, le sequenze &amp;quot;minimizzabili&amp;quot;, e viene inoltre messo in conto di informare l'utente opportunamente sulla gestione di questo genere di omonimia per rendere le operazioni trasparenti.&lt;br /&gt;
* Nomi_A = Nomi_B = {&amp;quot;Lorenzo&amp;quot;, &amp;quot;Mario&amp;quot;, &amp;quot;Luca&amp;quot;}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F03])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Qualora l'insieme dei nomi dei due nominativi sia identico risulta impossibile distinguerli e non possono in alcun modo essere trattati, poiché l'ordine con cui compaiono i nomi di un nominativo non rappresenta un elemento di disambiguità. I dati appartenenti a persone completamente omonime contenuti in uno stesso documento, quindi, non sono &amp;quot;minimizzabili&amp;quot; distintamente.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva che è di fondamentale importanza che i documenti che gli utenti forniscono siano grammaticalmente corretti, in quanto un errato uso dei segni di interpunzione può rendere impossibile l'applicazione delle ''regular expression''. Si prenda ad esempio una sequenza anomala di caratteri in cui non è corretto l'uso delle virgole, come &amp;quot;''Amorosa Mario Rossi Giacomo''&amp;quot;: supponendo che nel documento si vogliano trattare i nominativi ''Amorosa Mario'', ''Rossi Mario'' e ''Rossi Giacomo'', risulta impossibile identificare quali tra questi siano rappresentatati nella sequenza.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In conclusione, risultano quindi individuate le strategie che permettono di formulare ''regular expressions'' anche per i nominativi soggetti ad omonimia.&lt;br /&gt;
&lt;br /&gt;
====Formattazione dei documenti====&lt;br /&gt;
 &lt;br /&gt;
I documenti prodotti in enti ed organizzazioni presentano generalmente formattazioni e non sono puramente testuali. Si vuole qui considerare quale debbano essere le interpretazioni più adatte da dare agli elementi grafici per rendere sempre efficace il riconoscimento dei nominativi. In particolare, quindi, non si tratteranno gli elementi di punteggiatura, come parentesi o virgolette, poiché già compresi nelle ''regex'', bensì tutti gli elementi che in un pattern composto da caratteri non sono espressi. Si inizia dunque la rassegna:&lt;br /&gt;
* Elementi di formattazione del testo&lt;br /&gt;
I font, la dimensione dei caratteri, il grassetto, il corsivo, l'evidenziazione e tutti i possibili elementi di modifica della apparizione grafica del testo non alterano il significato dei lessemi coinvolti. Se il cognome di un nominativo è posto in grassetto ed il nome no, ad esempio, la coppia nome-cognome rappresenta sempre il nominativo iniziale; lo stesso vale per gli altri elementi citati.&lt;br /&gt;
* Aree di comparizione del testo&lt;br /&gt;
In genere ogni documento è formato da più sezioni, ha un corpo principale ed eventuali titoli, note a piè pagina, intestazioni ed altre possibili aree. Il trattamento di &amp;quot;minimizzazione&amp;quot;, secondo il ''GDPR'', deve essere effettuato al documento in ogni sua parte, ma ogni sezione deve essere elaborata in maniera indipendente dalle altre sezioni in quanto rappresenta un blocco logico a sé. Ciò significa che, ad esempio, bisogna individuare eventuali nominativi presenti nel titolo, ma non bisogna considerare nominativo una sequenza di parole che è posta in parte nel titolo e in parte nel primo paragrafo del testo.&lt;br /&gt;
* Elementi blocco&lt;br /&gt;
Gli elementi blocco, come ad esempio le immagini, possono causare un'interruzione netta in un paragrafo, suddividendolo quindi in più blocchi logici, che devono essere analizzati separatamente; tuttavia nel caso in cui questi elementi siano posti ''fluttuanti'', ossia ancorati ai bordi della pagina, il testo scorre in un unico flusso e forma quindi un unico blocco logico.&lt;br /&gt;
* Divisione in sillabe&lt;br /&gt;
Un problema rilevante nella formattazione del documento è che spesso, per esigenze estetiche, contiene delle parole divise in sillabe poste su righe diverse e separate da un trattino. Ovviamente se un nome va a capo a fine linea non perde il suo significato semantico, bisognerà quindi continuare a riconoscerlo.&lt;br /&gt;
* Tabelle&lt;br /&gt;
Molti documenti, specialmente quelli contenenti ingenti quantità di nominativi, possono essere strutturati in forma tabellare. Trascurando una trattazione per esteso delle modalità con cui i nominativi potrebbero comparire nelle tabelle, si considera esclusivamente il caso di gran lunga più ricorrente. In genere, infatti, in una tabella contenente dei nominativi, essi sono presenti nella stessa colonna o in colonne contigue: l'una contenente i nomi, l'altra il cognome, o viceversa. Senza basarsi sull'intestazione delle colonne, si può valutare se il contenuto di due celle adiacenti poste su di una stessa riga faccia match con il pattern di un nominativo, ed in caso ciò accada si può affermare la coppia di celle individuata rappresenta un nominativo.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva che si sono fornite solamente le interpretazioni più plausibili e comuni a questi elementi grafici e non si è ideato alcun particolare algoritmo per la loro elaborazione. L'espressione di tali strutture, infatti, è fortemente determinata dal formato in cui il documento è redatto. Si rimanda, quindi, ai capitoli successivi per specificazioni ulteriori della soluzione. Occorre notare, infine, che gli elementi di formattazione non sono descritti da stringhe nel formato delle ''regular expressions'': bisognerà quindi integrare gli elementi presentati in questa sezione con l'approccio ''pattern-based'' adottato.&lt;br /&gt;
&lt;br /&gt;
===Analisi dell'usabilità===&lt;br /&gt;
&lt;br /&gt;
====Elenco dei nominativi da trattare esplicitamente espressi come dati in input====&lt;br /&gt;
&lt;br /&gt;
In questo caso, per usufruire del servizio, l'utente deve fornire un documento contenente una serie di nominativi da trattare. Una garanzia della corretta elaborazione del documento si ha richiedendo all'utente stesso quali siano i nominativi da trattare: in questo modo potranno essere &amp;quot;minimizzati&amp;quot; i dati (cioè i nominativi) di tutte e sole le persone espressamente richieste. In molti plausibili scenari, infatti, è necessario anonimizzare solo alcuni dei nominativi presenti nel documento; ad esempio in un atto giudiziario serve anonimizzare le parti in causa ma non i magistrati. &lt;br /&gt;
&lt;br /&gt;
Questa configurazione del servizio permette quindi all'utente di avere il massimo controllo possibile del risultato. Tuttavia questo approccio è poco pratico nel caso in cui i documenti da trattare contengano grandi quantità di nominativi diversi e, magari, l'utente che ne richiede il trattamento non li conosce; si pensi ad esempio a lunghe graduatorie di concorsi o altro. Si osserva inoltre che anche per pochi nominativi l'usabilità può degradare, se l'inserimento viene fatto con estemporanea digitazione, esposta anche al rischio di possibili errori di battitura, con conseguenti noiose ripetizioni delle operazioni.&lt;br /&gt;
&lt;br /&gt;
Si osserva, infine, che il sistema progettato è sufficientemente robusto nel trattare i nominativi in input espressi da un utente che ha digitato caratteri maiuscoli o minuscoli violando le convenzioni grammaticali. Supposto che il documento trattato debba essere grammaticalmente corretto, infatti, si ha la garanzia che i nomi ivi presenti comincino con una maiuscola; è sufficiente, quindi, forzare una conversione ''to-upper-case'' dei nomi inseriti dall'utente e le ''regex'' progettate funzionano correttamente. Un discorso a parte va fatto per i cognomi inseriti dall'utente, in quanto essi possono comparire con la prima lettera sia maiuscola che minuscola. L'inserimento di un cognome iniziante con una minuscola non crea grossi problemi, in quanto in tal caso la ''regex'' risultante sarebbe totalmente ''case-insensitive'' per il cognome, mentre l'aggiunta di un cognome cominciante con una maiuscola determina una ''regex'' ''case-insensitive'' per la prima lettera del cognome; qualora quindi un utente inserisse un nominativo tutto in maiuscolo, le occorrenze del cognome, presenti nel documento, inizianti con una lettera minuscola non verrebbero riconosciute.&lt;br /&gt;
Per le altre lettere dopo la prima, sia per i nomi che per i cognomi, il pattern è stato progettato ''case-insensitive'', quindi non emergono problemi. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In sintesi, il rischio che vengano introdotte delle ambiguità lessicali, incaricando l'utente dell'inserimento dei nominativi, è piuttosto basso ed il controllo che si ha sui nominativi è il massimo desiderabile, mentre i requisiti di usabilità risultano penalizzati.&lt;br /&gt;
&lt;br /&gt;
====Elenco dei nominativi da trattare dedotti automaticamente da un dizionario====&lt;br /&gt;
&lt;br /&gt;
Se si desidera privilegiare la tematica dell'usabilità nella progettazione del servizio, risulta necessario individuare delle strategie che semplifichino il più possibile i compiti che devono essere svolti dall'utente. L'unica operazione che inevitabilmente resta a suo carico è l'upload del documento da trattare; non è infatti necessario richiedergli l'elencazione dei nominativi dei nominativi da trattare, in quanto questi possono essere dedotti automaticamente impiegando dei dizionari, dei quali va quindi valutato il contenuto e le modalità di utilizzo. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si scarta subito l'ipotesi di dedurre automaticamente i nominativi basandosi unicamente sul fatto che le iniziali di nomi e cognomi siano maiuscole; come già argomentato infatti l'uso delle lettere maiuscole non è limitato solo a questi usi e, inoltre, non si può avere la certezza che un cognome inizi con una maiuscola.&lt;br /&gt;
&lt;br /&gt;
Sono disponibili fortunatamente alcuni dizionari di nomi ed altri di cognomi, in diverse lingue; si fa qui riferimento a quelli di &amp;quot;Data World&amp;quot; (un'azienda focalizzata sulla raccolta, produzione e pubblicazione di dataset: https://data.world) ([0037]).&lt;br /&gt;
&lt;br /&gt;
Si inizia l'analisi inquadrando le dimensioni che un dizionario contenente nomi o cognomi avrebbe. Risalta subito all'occhio la differenza tra il numero di termini contenuti nei due casi: facendo riferimento ai soli nomi e cognomi italiani, risultano esistenti circa 350.000 cognomi ([0036]) e circa 9.000 nomi, dei quale circa 5.000 maschili e circa 4.000 femminili ([0037]); il numero dei cognomi è quindi quasi 40 volte più grande del numero dei nomi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si ipotizza, per chiarire le idee, di applicare questi dizionari in uno scenario reale, in cui, ad esempio, si vuole trattare un documento di 10 pagine contenente 5.000 parole. Si trascurano inoltre i meccanismi che permettono di ricondurre un nome od un cognome ad un nominativo per concentrarsi unicamente sul numero di confronti necessari da effettuare nell'elaborazione. Nel peggiore dei casi possibili, ossia quando nessuna parola del documento compare tra i termini del dizionari, e dove occorre quindi confrontare ogni singola parola del documento con tutti i termini del dizionario, per semplice moltiplicazione si ottiene che l'impiego di un dizionario di nomi darebbe luogo a 45.000.000 confronti, mentre un dizionario di cognomi ben a 1.750.000.000 confronti. Se invece le parole nel documento fossero 50.000 si avrebbero 450.000.000 di confronti nel primo caso e 10.750.000.000 nel secondo. In sintesi, sebbene il rapporto tra il numero di confronti nei due casi rimanga sempre costante (circa 1:40) indipendentemente dalla lunghezza del documento, la differenza tra il numero di confronti cresce proporzionalmente al numero di parole che vengono sottoposte all'elaborazione. Per quantificare, infine, attraverso un unità di tempo, la differenza esistente tra l'impiego delle due diverse tipologie di dizionario, si realizza un semplice programma java, di cui si riporta qui sotto il contenuto del metodo principale, che realizza i confronti necessari attraverso l'uso di ''regular expression'':&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
final String regex = &amp;quot;\bLorenzo\b&amp;quot;;&amp;lt;br/&amp;gt;&lt;br /&gt;
final String string =  ... //testo di prova&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);&amp;lt;br/&amp;gt;&lt;br /&gt;
final Matcher matcher = pattern.matcher(string);&amp;lt;br/&amp;gt;&lt;br /&gt;
int start, total;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
start = System.currentTimeMillis();&lt;br /&gt;
while (matcher.find()) {&lt;br /&gt;
    System.out.println(&amp;quot;Full match: &amp;quot; + matcher.group(0));&lt;br /&gt;
    for (int i = 1; i &amp;lt;= matcher.groupCount(); i++) {&lt;br /&gt;
        System.out.println(&amp;quot;Group &amp;quot; + i + &amp;quot;: &amp;quot; + matcher.group(i));&lt;br /&gt;
    }&lt;br /&gt;
} &amp;lt;br/&amp;gt;&lt;br /&gt;
total = System.currentTimeMillis() - start;&lt;br /&gt;
System.out.println(&amp;quot;Total: &amp;quot; + total + &amp;quot; ms&amp;quot;);&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Eseguendo il test più volte, inserendo fino a 10 occorrenze della parola &amp;quot;Lorenzo&amp;quot; nel testo, si ha un tempo di elaborazione medio di circa 3 ms, con prestazioni di picco di 2 ms, ottenibili con poche occorrenze del nome presenti, e tempo di attesa massimo di 6 ms, dovuto alla presenza invece a una presenza più frequente del nome nel testo.&lt;br /&gt;
Questo fenomeno si comprende meglio ricordando che, come spiegato nel capitolo precedente, le ''regular expressions'' ottimizzano la ricerca, considerano le stringhe del testo trattato solo finché necessario, ossia fino a quando non vi è certezza che esse corrispondano o non corrispondano ad un match. Ogni volta che nel testo si presenta una parola che inizia con una lettera diversa dalla 'L' di &amp;quot;Lorenzo&amp;quot;, la ricerca procede direttamente con la valutazione della parola successiva, ignorando i rimanenti caratteri della parola. &lt;br /&gt;
&lt;br /&gt;
Risulta, invece, più onerosa la verifica della corrispondenza tra una stringa ed il pattern desiderato, poiché in questo caso vanno elaborati tutti i caratteri della parola. Come caso limite, si è posta come stringa da elaborare la sequenza di caratteri &amp;quot;Lorenzo &amp;quot; ripetuta 500 volte: il tempo di esecuzione medio del programma risultante, a parità di piattaforma, è stato di circa 25 ms.&lt;br /&gt;
&lt;br /&gt;
Un'altra diretta conseguenza di questo meccanismo di confronto è che all'aumentare del numero di parole nel documento non corrisponde un eccessivo aumento del tempo di esecuzione: considerando un documento di 5000 parole, con 0 occorrenze del nome &amp;quot;Lorenzo&amp;quot; il tempo di esecuzione medio risulta di 9 ms, con 10 occorrenze di 10 ms, con 100 occorrenze di 15 ms.&lt;br /&gt;
&lt;br /&gt;
Occorre precisare, prima di formulare ulteriori ragionamenti, che in documento di 5.000 parole potranno essere presenti al più 2500 coppie nome-cognome; in un dizionario con più di 2.500 termini almeno uno di questi non contribuirà nell'individuazione di un nominativo. Se poi sono presenti altre parole oltre ai nominativi nel documento, la percentuale di nomi che presenterà 0 occorrenze crescerà di conseguenza. Ad ogni modo, si sceglie di sviluppare i ragionamenti considerando necessario il tempo medio di 10 ms per individuare le occorrenze di un termine di un dizionario in un documento di 5.000 parole; questo tempo è sicuramente maggiore rispetto al caso reale, ma valutando per eccesso questo valore è possibile trascurare il tempo impiegato nelle altre operazioni di routine a supporto dell'algoritmo di ricerca.&lt;br /&gt;
&lt;br /&gt;
Ritornando all'esempio di partenza, considerando quindi necessari 10 ms per individuare le occorrenze di un termine di un dizionario in un documento di 5.000 parole, risulta che l'identificazione di tutti i cognomi contenuti nel testo richieda circa 3.500 secondi, (quasi un'ora!), mentre l'individuazione dei nomi &amp;quot;solo&amp;quot; 90 secondi.&lt;br /&gt;
I tempi di attesa che l'utente dovrebbe aspettare sono estremamente elevati e irragionevoli, specialmente se calati nel contesto nelle ''web application''. Come primo espediente per ovviare al problema si decide di abbandonare completamente l'idea di impiegare un dizionario di cognomi, in quanto, seppur si individuassero delle soluzioni in grado di effettuare il riconoscimento di tutte le occorrenze di un termine in un documento indipendentemente dalla lunghezza in solo 1 ms (irreale), sarebbero comunque necessari 3 minuti e 50 secondi per l'elaborazione. Non verranno quindi neppure trattate possibili soluzioni che prevedono l'applicazione di entrambi i dizionari.&lt;br /&gt;
&lt;br /&gt;
I 90 secondi richiesti dal dizionario di nomi, invece, risultano anch'essi eccessivi, ma attraverso opportune valutazioni si possono individuare delle strategie che consentono la minimizzazione del tempo necessario all'elaborazione dei documenti. Tali metodi di ottimizzazione saranno trattati in un successivo capitolo, mentre ora ci si continua a concentrare sulle modalità di impiego del dizionario.&lt;br /&gt;
&lt;br /&gt;
Per inciso, si osserva che i problemi di efficienza sono strettamente legati al riconoscimento automatico dei nominativi, in quanto in questo caso devono essere applicate quasi una decina di migliaia di ''regex'' diverse; nel caso in cui i nominativi da elaborare e le ''regex'' a loro associate siano noti, si ha a che fare con un numero esiguo di pattern da trattare e l'esecuzione del programma risulta infinitamente più rapida.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per migliorare l'efficacia del servizio sarebbe opportuno introdurre nel dizionario anche nomi stranieri, sempre più diffusi in una società sempre più globalizzata. Il tempo di esecuzione medio del riconoscimento, già critico, crescerebbe ulteriormente: si decide allora di introdurre nel dizionario i soli nomi inglesi, in totale quasi 5500 ([0037]). Considerando sempre un tempo medio di esecuzione di 10 ms per nome, con un dizionario di circa 14.500 termini si avrebbe un tempo di esecuzione medio complessivo di 145 secondi, ossia pari a 2 minuti e 25 secondi, e risulta ancora possibile effettuare alcune ottimizzazioni che lo riducono ad un livello accettabile.&lt;br /&gt;
&lt;br /&gt;
Una volta individuati i nomi contenuti nel documento occorre stabilire se essi fanno parte di un nominativo, progettando un'opportuna ''regular expression''. È importante notare che per conseguire questo scopo bisogna individuare la soluzione più efficiente possibile.&lt;br /&gt;
&lt;br /&gt;
Un nominativo, come già ripetuto più volte, è composto da uno o più nomi e da un cognome. Individuato un nome, la priorità che si ha è verificare se accanto ad esso sia presente un cognome. Finora i cognomi sono stati supposti non regolamentati da alcun pattern specifico, ma è necessario formularne almeno uno per consentirne il riconoscimento automatico. È ragionevole supporre che un cognome sia formato da massimo due parole, separate da spazio o apostrofo, sempre inizianti entrambe con una maiuscola, fatta eccezione per la prima parola laddove essa sia una preposizione semplice o articolata oppure un articolo, tenendo conto dei possibili troncamenti, come &amp;lt;i&amp;gt;d'&amp;lt;/i&amp;gt; e &amp;lt;i&amp;gt;dell'&amp;lt;/i&amp;gt;. Inoltre per verificare se un termine adiacente al nome trovato rappresenti un nome si evita di impiegare nuovamente il dizionario per non gravare ulteriormente sul tempo di esecuzione. Inoltre, si nota che avendo supposto un cognome composto da massimo due parole inizianti con una lettera maiuscola, un altro nome, oltre quello trovato dal dizionario, viene già automaticamente riconosciuto qualora il cognome sia composto da una sola parola. Rinunciando ad individuare nominativi composti da tre nomi o più, si formula una ''regular expression'' per il riconoscimento automatico in seguito al identificazione di un nome, qui indicato con il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nome&amp;gt;&amp;lt;/span&amp;gt;, supponendo il cognome come precedentemente indicato e ipotizzando la presenza di un ulteriore nominativo.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;prep&amp;gt; := d((a|e)(l(l[aeo]?)?|i|gli?)?|i)?|(ne|a|su)(l(l[aeo]?)?|i|gli)?|l[aeo]?|co[iln]?|i[ln]?|gli|per&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cognome&amp;gt; := (([A-Z][a-zA-ZÀ-ÖØ-öø-ÿ]*|&amp;lt;prep&amp;gt;)('|\s))?[A-Z][a-zA-ZÀ-ÖØ-öø-ÿ]+&lt;br /&gt;
&lt;br /&gt;
&amp;lt;second_name&amp;gt; := [A-Z][a-zA-ZÀ-ÖØ-öø-ÿ]+&lt;br /&gt;
&lt;br /&gt;
&amp;lt;regex&amp;gt; := (&amp;lt;second_name&amp;gt;\s)?(&amp;lt;nome&amp;gt;)\s&amp;lt;cognome&amp;gt;|&amp;lt;cognome&amp;gt;\s(&amp;lt;nome&amp;gt;)(\s&amp;lt;second_name&amp;gt;)?&lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Nella scrittura della ''regex'' si è prestata particolare attenzione all'utilizzo della simbologia per rendere l'espressione il più performante possibile, attraverso il massimo sfruttamento dei cortocircuiti logici e l'opportuno ordinamento dei caratteri (sono stati anteposti i caratteri comuni a più preposizioni od articoli). Inoltre, per alleggerire la ''regex'' si è rinunciato all'utilizzo dei caratteri dell'alfabeto latino non appartenenti ai primi due blocchi Unicode.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
È mostrata in figura la corretta elaborazione di 57 possibili casi di cognomi diversi&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F04])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva tuttavia che in alcune circostanze, come nella frase &amp;quot;''di Amorosa Lorenzo non si hanno notizie''&amp;quot;, accade che un parola (&amp;quot;''di''&amp;quot; in questo caso), non sia parte del cognome ma il programma non è in grado di riconoscerlo. Questa ambiguità è fortemente dipendente dal contesto e non è possibile trattarla senza significativi degradi delle performance; quindi è necessario rinunciare a trattarla, accettando riconoscimenti erronei. In altre situazioni, invece, dove magari si sta elaborando la stringa contenente il nominativo ''Mario Lorenzo'', risulta impossibile determinare quale tra i due termini sia il nome e quale il cognome; cioè significa che l'unico trattamento di &amp;quot;minimizzazione&amp;quot; automatico che risulta ragionevole applicare è la sostituzione del nominativo con uno pseudonimo, non il troncamento o l'alterazione dei nomi.&lt;br /&gt;
In conclusione, con il riconoscimento automatico dei nominativi si migliora complessivamente l'usabilità del servizio, in quanto l'utente non deve digitare i nominativi, ma la latenza introdotta è notevole, si è soggetti a rischi di ambiguità e non è in alcun modo esprimibile la preferenza su quali nominativi si desidera &amp;quot;minimizzare&amp;quot; o meno. La soluzione così ideata non risulta quindi adeguata.&lt;br /&gt;
&lt;br /&gt;
====Soluzione ibrida adottata====&lt;br /&gt;
Entrambe le tipologie di riconoscimento prima individuate hanno significativi problemi, si cerca quindi di sintetizzare una soluzione in grado di trarre i vantaggi dell'una e dell'altra. Risulta efficace, in particolare, che il documento venga inizialmente trattato tramite dizionari, evitando all'utente l'onere di specificare i nominativi, e che in seguito venga lasciata all'utente la possibilità di intervenire.&lt;br /&gt;
Infatti, esso potrebbe voler esprimere delle preferenze su quali nominativi debbano essere trattati tra quelli individuati e gestire gli eventuali errori di riconoscimento dovuti a richieste di trattamento di nominativi aventi un nome non presente nel dizionario o anche dovuti a casi di ambiguità lessicale già presentati.&lt;br /&gt;
&lt;br /&gt;
Una volta inserito il documento e terminata l'elaborazione tramite il dizionario, l'utente può sia richiedere l'immediato download del file ed effettuare le operazioni prima definite, attraverso un'opportuna interfaccia. Per fornire il supporto alle esigenze più disparate, si prevede la possibilità di:&lt;br /&gt;
# eseguire download del file trattato unicamente con il dizionario&lt;br /&gt;
# ripetere la &amp;quot;minimizzazione&amp;quot; del documento, specificando:&lt;br /&gt;
## nuovi nominativi&lt;br /&gt;
## quali nominativi tra quelli precedentemente individuati ''non'' si vogliono trattare&lt;br /&gt;
## quale parola/e dei nominativi individuati rappresenta il cognome (in tal caso, si possono utilizzare altri metodi, oltre alla sostituzione con pseudonimo, per il trattamento)&lt;br /&gt;
## quale parola/e dei nominativi individuati non compone il nominativo (situazione che si verifica quando ci si imbatte in una ambiguità).&lt;br /&gt;
&lt;br /&gt;
Senza soffermarsi in questo momento sull'intera sequenza concreta di interazioni tra utente e servizio, si osserva che l'unico vincolo non funzionale da valutare resta il tempo medio di attesa dell'utente. L'usabilità complessiva è molto buona ed i vincoli funzionali sono soddisfatti.&lt;br /&gt;
&lt;br /&gt;
===Scelta dei formati da trattare===&lt;br /&gt;
&lt;br /&gt;
Una considerazione intuitiva, ed una buona prassi, è che un documento contenente dati personali sia pseudonimizzato o anonimizzato quanto prima possibile e cioè quando è ancora solo nelle mani del suo autore: questo approccio scongiura che informazioni sensibili e dati personali in chiaro ''sfuggano'' in rete.&lt;br /&gt;
Si può per questo ragionevolmente ipotizzare che i naturali destinatari del servizio siano gli stessi autori (creatori) che redigono il documento. Nello scenario tipico di utilizzo, infatti, il fruitore del servizio procederà al trattamento dei dati non appena avrà finito di scrivere il documento del quale, essendone autore, potrà scegliere il formato. Si osserva che potrebbe accadere che il documento sia redatto da terzi: in tal caso l'utente che richiede il trattamento può scegliere il formato in maniera indiretta concordandolo con il redattore. Avendo quindi l'utente la possibilità di stabilire il formato del proprio documento, risulta ragionevole progettare un servizio che lavori su un solo formato.&lt;br /&gt;
A questo punto occorre individuare quale sia il formato che maggiormente si presta alle finalità del servizio.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Una possibilità è quella di richiedere all'utente di inserire come documento da trattare un semplice file di testo in formato ''txt'': in questo modo ci sarebbe il grande vantaggio di trattare file molto semplici, riducendo così al minimo la complessità realizzativa, e inoltre si avrebbe  l'indipendenza dagli editor di testo utilizzati, in quanto tutti supportano i file in formato ''txt''. &lt;br /&gt;
Risulta tuttavia sconveniente utilizzare questo formato, poiché non ha alcuna capacità espressiva per gestire elementi complessi come tabelle, modifiche allo stile del testo e così via. &lt;br /&gt;
Bisogna quindi optare per un formato in grado di gestire questi elementi, al costo di aumentare la complessità della progettazione, ricordando sempre che è necessario allo stesso tempo che tale formato sia supportato da tutti i principali editor di testo.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Con facilità è possibile individuare quali sono i formati di testo più comuni oltre al ''txt'': ''doc'', ''docx'', ''odt'', ''pdf'', ''pages'', ''rtf'', ''tex''. Si passa ora dunque a valutare quale tra questi formati potrebbe meglio soddisfare i requisiti prima enunciati. &lt;br /&gt;
Facendo una cernita iniziale sulla base delle finalità per le quali un formato è utilizzato, si può immediatamente escludere ''tex'', che trova impiego principalmente in ambito scientifico e matematico. In questo settore, infatti, non è richiesta generalmente l'applicazione delle procedura di trattamento dei dati. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt; &lt;br /&gt;
Si può inoltre abbandonare l'idea di trattare documenti con estensione ''pages'', formato proprietario di Apple, poiché utilizzati esclusivamente dall'omonimo editor di testo anch'esso proprietario, e i documenti con estensione ''rtf'', acronimo di ''Rich Text Format'', formato proprietario di Microsoft che supporta una formattazione avanzata, poiché, pur gestito da vari editor, è un formato decisamente datato (ultima versione 1.9.1 risalente a marzo 2008 ([0009])). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si esclude inoltre il formato ''pdf'' per motivi di usabilità: molti editor, infatti, consentono di esportare un documento in questo formato ma non permettono di importarlo. Un utente dopo aver effettuato l'anonimizzazione di un documento non può quindi proseguire modificandolo ulteriormente. Il ''Portable Document Format'', infatti, è ideato per realizzare dei documenti destinati alla sola lettura.&lt;br /&gt;
L'ultima esclusione, piuttosto immediata da effettuare, riguarda il formato ''doc'', binario e proprietario di Microsoft. Esso infatti risulta, a partire dal 2006, soppiantato dal formato ''docx'', sempre proprietario di Microsoft. &lt;br /&gt;
&lt;br /&gt;
Si giunge infine a valutare quale tra gli ultimi due possibili formati rimanenti, ossia ''docx'' e ''odt'', si presta meglio alle finalità del servizio. In via preliminare si osserva che entrambi i formati possiedono ottime capacità espressive, hanno una struttura interna di simile complessità e sono entrambi supportati dai principali editor di testo. È necessario quindi effettuare delle analisi più approfondite per poter sceglierne uno tra i due.&lt;br /&gt;
La struttura del formato ''docx'', sviluppato da Microsoft e formalmente denominato ''Office Open XML Document (OOXML Document)'', è costituita da un file compresso .zip contenente un insieme di file ''XML''. Il formato ''OOXML'' permette la rappresentazione, oltre che di documenti testuali, anche di fogli elettronici (formato ''OOXML 'Workbook'', noto anche come ''xslx'') e di presentazioni (formato ''OOXML Presentation'', noto anche come ''pptx'') ([0008], [0013]).&lt;br /&gt;
Il formato inoltre è stato inizialmente standardizzato nel 2006 dall'&amp;lt;i&amp;gt;ECMA&amp;lt;/i&amp;gt;  (come ''ECMA-376'') e successivamente nel 2008 dall'&amp;lt;i&amp;gt;ISO&amp;lt;/i&amp;gt; e dall'&amp;lt;i&amp;gt;IEC&amp;lt;/i&amp;gt; (come ''ISO/IEC 29500'') in una versione ''transitional'', retrocompatibile con alcune versioni precedenti del formato contenenti elementi deprecati, e in una versione ''strict'', dove tali elementi non sono ammessi. I due standard sono stati poi successivamente aggiornati e sono tutt'ora oggetto di revisioni ([0002]).&lt;br /&gt;
&lt;br /&gt;
Anche la struttura del formato open source ''odt'', sviluppato dall'&amp;lt;i&amp;gt;OASIS&amp;lt;/i&amp;gt; e formalmente denominato ''OpenDocument Text'', è basata su uno zip contenente un insieme di file ''XML''. Inoltre, il formato ''OpenDocument Format (ODF)'' permette di trattare fogli elettronici (formato ''OpenDocument Spreadsheet'', noto anche come ''ods'') e presentazioni (formato ''OpenDocument Presentation'', noto anche come ''odp'') ([0007]). Anche ''OpenDocument Text'' è stato standardizzato, in particolare dall'&amp;lt;i&amp;gt;OASIS&amp;lt;/i&amp;gt; stesso nel 2005 e dall'&amp;lt;i&amp;gt;ISO/IEC&amp;lt;/i&amp;gt; nel 2006, ed è soggetto a revisioni e aggiornamenti ([0003]).&lt;br /&gt;
&lt;br /&gt;
In sintesi, basandosi sulla struttura dei documenti e sulla standardizzazione dei formati, non è ancora possibile individuare quale sia il formato migliore. L'unico elemento che potrebbe portare punti a favore del formato ''odt'' è che esso, a differenza del formato ''docx'', è aperto, tuttavia, essendo le specifiche di entrambi i formati pubbliche, ciò non rappresenta un fattore determinante nell'elezione del formato.&lt;br /&gt;
Entrambi i formati, inoltre, sono largamente supportati dai word processors.&lt;br /&gt;
&lt;br /&gt;
Le seguenti tabelle riepilogano il supporto all'uno ed all'altro formato dei ''word-processors'' più usati, ossia ''Microsoft Office Word'', ''LibreOffice Writer'', ''OpenOffice Writer'' e ''Pages''. &lt;br /&gt;
Le tabelle sono tratte da wikipedia ([0000], [0001], [0006]). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;i&amp;gt;Supporto fornito dagli editor di testo al formato docx&amp;lt;/i&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  !! Microsoft Office Word !! LibreOffice Writer !! OpenOffice Writer !! Pages&lt;br /&gt;
|-&lt;br /&gt;
! Version&lt;br /&gt;
|| 2013, 2011 for Mac || All versions || 3.0 || '08&lt;br /&gt;
|-&lt;br /&gt;
! Operating systems&lt;br /&gt;
|| Windows, Mac OS X || Windows, OS X, Linux, Unix, Android || Windows, Linux, Unix, Mac OS X || Mac OS X&lt;br /&gt;
|-&lt;br /&gt;
! Office suite&lt;br /&gt;
|| Microsoft Office ||  || OpenOffice.org || iWork&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
|| Microsoft || The Document Foundation || Apache OpenOffice || Apple Inc.&lt;br /&gt;
|-&lt;br /&gt;
! License&lt;br /&gt;
|| proprietary || MPL || LGPL || proprietary&lt;br /&gt;
|-&lt;br /&gt;
! ECMA-376&lt;br /&gt;
|| yes || yes || yes || yes&lt;br /&gt;
|-&lt;br /&gt;
! ISO/IEC 29500:2008&lt;br /&gt;
|| yes || yes || || &lt;br /&gt;
|-&lt;br /&gt;
! Notes&lt;br /&gt;
||  ||  || Import only ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;i&amp;gt;Supporto fornito dagli editor di testo al formato odt&amp;lt;/i&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  !! Microsoft Office Word !! LibreOffice Writer !! OpenOffice Writer &lt;br /&gt;
|-&lt;br /&gt;
! Version&lt;br /&gt;
|| 2007 SP2 || 4.0.3 || 3.0.0&lt;br /&gt;
|-&lt;br /&gt;
! Operating systems&lt;br /&gt;
|| Windows || Unix-based systems, Mac OS X, Solaris || Windows, Linux, Unix-based systems, Mac OS X, Solaris&lt;br /&gt;
|-&lt;br /&gt;
! Office suite&lt;br /&gt;
|| Microsoft Office ||  || OpenOffice.org&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
|| Microsoft || The Document Foundation || Apache OpenOffice&lt;br /&gt;
|-&lt;br /&gt;
! License&lt;br /&gt;
|| Proprietary || MPL || LGPL&lt;br /&gt;
|-&lt;br /&gt;
! ISO/IEC 26300:2006&lt;br /&gt;
|| yes || yes || yes&lt;br /&gt;
|-&lt;br /&gt;
! Notes&lt;br /&gt;
|| some limitations || Multiple ODF versions supported (ISO/ODF 1.0/1.1/1.2/1.2 Extended) || adjustable ODF version (ISO/ODF 1.2) &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si possono effettuare le seguenti osservazioni:&lt;br /&gt;
* ''Microsoft Office Word'' è, in ambiente Microsoft, il word processor maggiormente usato; è molto usato anche in ambiente Apple Mac. Esso offre il pieno supporto al formato ''OOXML Document''; solo parzialmente invece gestisce il formato ''OpenDocument Text'': il processamento di file con estensione ''odt'' con questo editor comporta la perdita di alcune informazioni secondarie.&lt;br /&gt;
* ''LibreOffice Writer'', l'editor open source maggiormente utilizzato, supporta pienamente entrambi formati. Nato con lo scopo di gestire i file con formato ''OpenDocument Text'', attualmente supporta completamente anche il formato ''OOXML Document''. &lt;br /&gt;
* ''OpenOffice Writer'', un altro degli editor di testo tra i più utilizzati, supporta pienamente ''odt'', mentre è solo in grado di importare i file con estensione ''docx''.&lt;br /&gt;
* ''Pages'', il word process installato a default sui Mac della Apple e, di conseguenza anche maggiormente usato su questi dispositivi, non offre supporto al formato ''odt'', ma elabora correttamente i documenti con estensione ''docx'' ([0005],[0004]). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Queste osservazioni evidenziano che quindi è impossibile adottare un formato supportato da tutti gli editor; la scelta va allora indirizzata verso quello maggiormente supportato dai word processor più popolari.&lt;br /&gt;
Per avere un'indicazione di ''popolarità'', e quindi per poter comprendere meglio quali tra gli editor prima citati siano i più usati, si può fare un'analisi, tramite motori di ricerca, di quanti file con una certa estensione siano presenti in rete.&lt;br /&gt;
È possibile, ad esempio, ricercare su Google i file che contengono nel proprio nome una determinata sequenza di caratteri o aventi una certa estensione (''filetype''). Sono qui presentati i risultati delle interrogazioni riguardo ai file aventi formato ''docx'', ''doc'' e ''odt'' ed il cui nome contiene uno dei caratteri, fra i più frequenti, &amp;quot;1&amp;quot; o &amp;quot;a&amp;quot; o &amp;quot;e&amp;quot;. L'investigazione è stata effettuata inserendo nella barra di ricerca di Google le stringhe ''1 filetype:docx'', ''a filetype:docx'' e così via.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Formato cercato !! Documenti con &amp;quot;1&amp;quot; nel nome !! Documenti con &amp;quot;a&amp;quot; nel nome !! Documenti con &amp;quot;e&amp;quot; nel nome&lt;br /&gt;
|-&lt;br /&gt;
| docx || 16.900.000  || 12.800.000 || 8.730.000&lt;br /&gt;
|-&lt;br /&gt;
| odt || 736.000 || 667.000 || 507.000&lt;br /&gt;
|-&lt;br /&gt;
| doc || 32.300.000 || 26.300.000 || 21.500.000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Effettivamente il formato più diffuso è il ''doc''; tuttavia esso è supportato per retro-compatibilità anche dagli editor che supportano formati ''OOXML'', con i quali non si ha difficoltà nel convertire i documenti dal formato ''doc'' al ''docx''. In conclusione, quale che sia l'editor più diffuso, è ragionevole adottare il formato ''OOXML Document'' per le finalità del servizio, in quanto molto diffuso, ben supportato dagli editor e avente ottime capacità espressive. Di conseguenza i documenti che saranno elaborati dovranno essere forniti dall'utente in tale formato. In successive sezioni verrà approfondita la struttura dei documenti ''OOXML''.&lt;br /&gt;
&lt;br /&gt;
===Privacy by design===&lt;br /&gt;
&lt;br /&gt;
L'Art. 25 del ''GDPR'', con i Considerando 75 e 78, ha per titolo e per oggetto la &amp;quot;protezione dei dati fin dalla progettazione e protezione per impostazione predefinita&amp;quot; ([0035]), perfettamente in linea con i concetti di &amp;quot;minimizzazione&amp;quot;, già richiamati.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Il senso dell'Art. 25 viene spesso sintetizzato con l'espressione &amp;quot;''PbD - privacy by design, privacy by default''&amp;quot; ([0035]). Il principio fissato nell'Art. 25 dovrà sempre più essere tenuto ben presente nell'ambito dell'ingegneria del software, in quanto impone di adottare nuove cautele nella realizzazione delle applicazioni software.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Del principio ''PbD'' si è ben tenuto conto nella progettazione descritta in questa tesi. In particolare, relativamente alla ''privacy by design'', si è fatto in modo che nessun dato personale permanga registrato sul sistema di esecuzione, o altrove, al termine dell'applicazione. Anche laddove l'applicazione termini in modo anomale non vi sono strutture dati superstiti, che restano memorizzate sul sistema.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Marginale in questa tesi è la nozione di ''privacy by default'', giacché l'applicazione non offre all'utente alcuna opzione che possa indurlo in errore ed acconsentire a trattamenti dei dati personali, oltre quello realizzato dall'applicazione.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
È utile osservare quanto sia importante esprimere queste impostazioni di progettazione fra le condizioni d'uso presentate all'utente: esse costituiscono uno dei presupposti affinché l'utente abbia piena fiducia (''trust'') nel servizio, lo utilizzi, lo divulghi, lo renda un servizio di successo.&lt;br /&gt;
&lt;br /&gt;
==Architettura del servizio== &lt;br /&gt;
&lt;br /&gt;
===I componenti software nell'architettura LAMP===&lt;br /&gt;
&lt;br /&gt;
Il servizio è realizzato in forma di ''web-based application'' poiché, come già illustrato nell'introduzione, si intende renderlo disponibile per il massimo numero di utenti possibili. Nella progettazione e realizzazione dell'architettura web si adotta la piattaforma ''LAMP'', il cui nome deriva dall'acronimo dei componenti open source che la realizzano (il sistema operativo Linux, il server HTTP Apache, il sistema per la gestione di database relazionali MySQL ed il linguaggio di programmazione PHP). Poichè il modello è composto da quattro livelli, spesso si parla anche di ''stack LAMP''. Uno degli elementi di forza del modello ''LAMP'' è che i componenti dei vari ''layer'' sono sostituibili, a seconda delle esigenze, con dei componenti più adatti, tipicamente open source ([0015], [0018], [0019]). Basando la piattaforma su un sistema operativo della famiglia di Microsoft Windows, ad esempio, si ottiene uno ''stack WAMP'', mentre se si usa un sistema operativo Mac OS si realizza uno ''stack MAMP''. Un'architettura web basata sul modello ''LAMP'' può, inoltre, essere integrata con software open source che offre utili funzionalità, come, ad esempio, il monitoraggio (''Nagios''), il load balancing (''Linux Virtual Server''), la rilevazione di accessi illeciti (''Snort'') e il security testing (''netsniff-ng''). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si valutano ora brevemente la diffusione dei componenti tradizionali dello ''stack LAMP'' e le alternative maggiormente usate per i vari ''layer''.&lt;br /&gt;
Le distribuzioni Linux risultano essere la scelta più comune per l'ultimo ''layer'' dello ''stack''. Secondo W3Techs, infatti, nell'ottobre del 2013, il 58.5% dei web server a livello globale avevano come sistema operativo la distribuzione Debian o Ubuntu, mentre il 37.3% una tra RHEL, Fedora e CentOS([0016]). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Tra i web server, Apache risulta essere maggiormente usato. Secondo le stime fatte da Netcraft, a giugno del 2014 circa il 51.9% del milione di siti web più trafficati al mondo usavano un web server Apache, il 19.2% nginx ed il 12.4% Microsoft ([0017]). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
I principali ''DBMS'' relazionali, oltre a MySQL, che possono essere presenti nello ''stack LAMP'' sono MariaDB e PostgreSQL, mentre tra i ''DBMS NoSQL'' MongoDB risulta essere il più comune. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Nello stack, infine, il ruolo di linguaggio di programmazione, solitamente svolto dal linguaggio PHP, spesso è ricoperto dai linguaggi Perl o Python. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva, ad ogni modo, che le informazioni sulla diffusione delle tecnologie non rappresentano un fattore vincolante nella scelta delle stesse, in quanto la piattaforma ''LAMP'' è anche aperta verso molti altri componenti oltre quelli citati; di conseguenza la scelta delle tecnologie da impiegare può essere effettuata basandosi principalmente sui requisiti e sulle specifiche del servizio. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Principi di progettazione per l'architettura===&lt;br /&gt;
&lt;br /&gt;
====Single Responsibility Principle====&lt;br /&gt;
&lt;br /&gt;
Per rendere il servizio maggiormente manutenibile ed estensibile, si presta particolare attenzione al rispetto del ''Single Responsibility Principle'' (''SRP'') ([0020]). Si cerca, quindi, di fattorizzare il software in più moduli, suddividendo tra questi le elaborazioni da svolgere. Un altro importante beneficio che si ottiene dalla fattorizzazione del codice è la riusabilità dei componenti. Ogni singolo modulo, infatti, svolge il proprio compito in maniera indipendente dal resto della applicazione ed è, quindi, riutilizzabile in altri scenari simili senza dover essere re-implementato. Inquadrando meglio questa metodologia di progettazione con i requisiti del servizio e la piattaforma web ''LAMP'', si individuano i due principali compiti a carico dell'applicazione:&lt;br /&gt;
* La gestione dell'interazione web con l'utente per la trasmissione del documento e dei nominativi da trattare&lt;br /&gt;
* Il processamento del documento per effettuare la &amp;quot;minimizzazione&amp;quot; dei dati.&lt;br /&gt;
Questi due differenti ''task'' saranno, quindi, portate a termine da componenti diversi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Progettando la struttura dell'applicazione in questo modo, si disaccoppia completamente la logica di business del servizio dalle interfacce web di comunicazione con l'utente. In un futuro sviluppo sarà possibile, quindi, realizzare nuove interfacce utilizzando altre tecnologie senza dover modificare la logica applicativa. &lt;br /&gt;
&lt;br /&gt;
====Dependency Inversion Principle====&lt;br /&gt;
&lt;br /&gt;
Un altro principio di design architetturale che risulta importante nella progettazione è il ''Dependency Inversion Principle'' (''DIP'') ([0038]). Esso si traduce nella realizzazione di componenti che non dipendono dalle specifiche implementazioni degli altri moduli del sistema, bensì dalle loro ''astrazioni''. &lt;br /&gt;
In relazione all'estensibilità e manutenibilità del prodotto software, infatti, l'impiego di moduli dipendenti direttamente dalla definizione dei metodi presenti in altri componenti risulta problematica: il modulo dipendente deve essere re-implementato ad ogni variazione del modulo da cui dipende.&lt;br /&gt;
Nella programmazione orientata agli oggetti, per rispettare questo principio, si su può fare uso di classi astratte o interfacce, costrutti che definiscono i moduli senza implementarli completamente o senza implementarli affatto.  &lt;br /&gt;
&lt;br /&gt;
===Stile architetturale REST=== &lt;br /&gt;
&lt;br /&gt;
Il modello architetturale del servizio che si sta definendo presenta una serie di caratteristiche, come ad esempio l'indipendenza dei moduli, che permettono di realizzarlo secondo il paradigma delle ''RESTful API''. L'espressione &amp;quot;Representational State Transfer&amp;quot; e il suo acronimo &amp;quot;REST&amp;quot; furono introdotti nel 2000 nella tesi di dottorato di Roy Fielding ([0021]), uno dei principali autori delle specifiche dell'Hypertext Transfer Protocol (HTTP). Roy Fielding descrive il ''Representational State Transfer'' come uno stile architetturale (&amp;quot;''architectural style''&amp;quot;), ovvero un'astrazione degli elementi di un'architettura all'interno di un sistema hypermedia distribuito. ''REST'' non specifica i dettagli dell'implementazione dei componenti e della sintassi del protocollo, ma definisce i ruoli dei componenti, i vincoli sulla loro modalità di interazione e la loro interpretazione.&lt;br /&gt;
Riassumiamo quindi i principi che deve rispettare una architettura ''REST'':&lt;br /&gt;
# Architettura Client-Server &amp;lt;br/&amp;gt;In una architettura ''REST'' viene data particolare importanza ai principi ''SRP'' e ''DIP'' prima citati, più generale si può affermare che l'architettura sposi il paradigma noto con il termine di &amp;quot;''Separation of Concerns''&amp;quot;. Una ''Restful API'' applica questi principi in un architettura Client-Server, capace di supportare l'evoluzione indipendente della logica lato client e della logica lato server.&lt;br /&gt;
# Stateless &amp;lt;br/&amp;gt;La comunicazione tra utente e fornitore del servizio deve essere senza stato, quindi ogni richiesta del client deve contenere tutte le informazioni di cui il fornitore necessita per l'erogazione del servizio offerto. Questa ipotesi viene fatta per rendere una ''Restful API'' facilmente scalabile orizzontalmente.&lt;br /&gt;
# Uso della cache &amp;lt;br/&amp;gt;In un Architettura ''REST'' i messaggi di risposta inviati dal server devono esplicitamente indicare se possono essere memorizzati nella cache del client o di componenti middleware per il riutilizzo nelle richieste successive.&lt;br /&gt;
# Interfaccia uniforme &amp;lt;br/&amp;gt;I componenti devono essere in grado di comunicare attraverso un'interfaccia uniforme e le risorse devono essere trasferite in un formato standard. Inoltre l'utente deve poter effettuare la navigazione tra le risorse di suo interesse tramite collegamenti ipertestuali. Per inciso, si osserva che il protocollo HTTP usato correttamente rispetta i requisiti di un architettura ''REST'' e che nelle implementazioni delle ''RESTful API'' il formato più usato per la modellazione dei dati è JSON.&lt;br /&gt;
# Layered System &amp;lt;br/&amp;gt;In un sistema a livelli, componenti intermedi (come i proxy) possono essere collocati tra client e server per intercettare il traffico per scopi specifici; ad esempio il caching o la sicurezza. Una soluzione basata su ''REST'' può essere composta da più livelli architettonici, indipendenti l'uno dall'altro.&lt;br /&gt;
# Code on Demand &amp;lt;br/&amp;gt;Questo vincolo facoltativo è inteso principalmente a consentire aggiornamenti alla logica all'interno dei client (come i browser Web) indipendentemente dalla logica lato server. Una ''single page application'', ad esempio, rispetta in pieno questo punto.&lt;br /&gt;
&lt;br /&gt;
Un'applicazione progettata sul modello dell'architettura ''REST'' ha quindi gli indiscutibili vantaggi di:&lt;br /&gt;
* consentire l'evoluzione indipendente delle diverse componenti &lt;br /&gt;
* avere un'interfaccia utente portabile con altri tipi di piattaforme&lt;br /&gt;
* permettere agevolmente la replicazione delle macchine server&lt;br /&gt;
* non vincolare moduli server e client a linguaggi e tecnologie specifiche.&lt;br /&gt;
&lt;br /&gt;
L'architettura del servizio oggetto di questa tesi si trova già perfettamente in linea con alcuni dei vincoli discussi, ma sono necessarie alcune considerazioni. Il punto 1 (&amp;quot;architettura Client-Server&amp;quot;) è chiaramente soddisfatto. &lt;br /&gt;
Il punto 2 (&amp;quot;Stateless&amp;quot;), direttamente collegato con i punti 3 e 5 (&amp;quot;Uso della cache&amp;quot;, &amp;quot;Layered System&amp;quot;), può essere rispettato con facilità; a ogni richiesta di &amp;quot;minimizzazione&amp;quot; del client corrisponde la restituzione del documento trattato dal server, non c'è quindi necessita di avere uno stato nell'interazione. &lt;br /&gt;
&lt;br /&gt;
Analizzando le caratteristiche di una applicazione stateless in relazione al principio ''privacy by design'' illustrato in precedenza, si osserva che l'assenza di stato determina la semplificazione delle problematiche critiche relative al principio. Non vengono conservate, infatti, informazioni contenenti dati sensibili, poiché dopo aver effettuato l'invio della risposta, sarà subito eliminato sul server il file elaborato.&lt;br /&gt;
&lt;br /&gt;
Nei capitoli precedenti tuttavia si è detto che l'utente può ripetere più volte il trattamento di uno stesso documento nella stessa sessione di interazione; essendo il vincolo dell'efficienza già difficile da rispettare per via dell'elaborazione onerosa del documento, si può progettare una modalità alternativa del funzionamento con stato del servizio, applicabile in assenza di replicazione delle macchine server e sfruttando le ripetute richieste di trattamento per uno stesso documento. &lt;br /&gt;
Si può infatti memorizzare lato server il documento inviato dal client inizialmente e, alle successive richieste di trattamento del medesimo documento, evitarne la ritrasmissione da client a server. Per rispettare il ''PbD'', al termine della sessione di interazione il documento verrà rimosso dal server. Si nota, inoltre, che per predisporre il servizio alla gestione delle due diverse modalità di funzionamento si può utilizzare un parametro di configurazione a livello applicativo.&lt;br /&gt;
I punti 4 e 6 infine (&amp;quot;Interfaccia uniforme&amp;quot;, &amp;quot;Code on Demand&amp;quot;) si possono rispettare utilizzando il formato JSON per la trasmissione dei documenti e dei nominativi, e usando localmente sul client Javascript per offrire tutte le funzionalità del servizio in un'unica pagina html.&lt;br /&gt;
&lt;br /&gt;
===Moduli software del servizio===&lt;br /&gt;
&lt;br /&gt;
====Scelta dei componenti software====&lt;br /&gt;
&lt;br /&gt;
Si opera ora la scelta delle tecnologie da utilizzare per i componenti dei 4 layer dello ''stack LAMP''. Per i due layer inferiori risulta piuttosto immediato decidere di usare le tecnologie presenti per default. Un sistema operativo Linux ed un web server Apache sono adatti all'architettura del servizio.&lt;br /&gt;
Inoltre anche il linguaggio di programmazione PHP può essere usato senza significativi problemi, anche se verranno fatte in seguito, in una sezione di questo capitolo, alcune considerazioni sulle problematiche di esecuzioni concorrenti di script PHP. Il linguaggio sarà impiegato in particolare per la realizzazione della logica necessaria a gestire l'interazione web con il cliente, mentre l'elaborazione del documento OOXML lato server sarà effettuata da un programma Java. &lt;br /&gt;
&lt;br /&gt;
I due ''task'' principali del servizio sono delegati, quindi, a due programmi distinti realizzati con tecnologie diverse. Si concretizza in questo modo il principio ''SRP'' e, sfruttando l'&amp;lt;i&amp;gt;openness&amp;lt;/i&amp;gt; della piattaforma LAMP, le funzionalità necessarie vengono realizzate attraverso i linguaggi più adatti.&lt;br /&gt;
La scelta del linguaggio Java per l'implementazione del ''main core'' della logica di business è dovuta alla libreria open source in ambiente java Docx4j ([40],[41]). Questa libreria è realizzata per il processamento delle tre tipologie di formati OOXML (''docx'', ''xslx'', ''pptx'') e permette tutte le possibili operazioni di creazione, lettura e modifica su questo tipo di documenti. Anche questa libreria sarà approfondita in sezioni successive. Si osserva, per inciso, che esistono altre librerie equivalenti in ambiente .NET. &lt;br /&gt;
&lt;br /&gt;
Nella scelta del linguaggio di programmazione usato per elaborare i documenti ed effettuare i confronti tramite ''regular expressions'', un dato non di poco conto da considerare è l'encoding delle stringhe. In Java, in particolare, una stringa è rappresentata internamente come un array di char, ognuno codificato da 2 byte in formato UTF-16 ([0042]); la codifica esprime in 16 bit tutti i caratteri definiti dallo standard Unicode, quindi è possibile scegliere Java.&lt;br /&gt;
&lt;br /&gt;
Per il ''layer'' della persistenza, infine, l'impiego di un database MySql risulta una buona scelta. Si osserva che questo livello non verrà utilizzato nella tradizionale maniera prevista dallo ''stack LAMP''. Infatti, generalmente, la base di dati viene interrogata direttamente dal componente che si occupa dell'interazione con l'utente (PHP) per il reperimento delle informazioni utili da restituire al client; nel servizio, invece, la base di dati sarà a supporto unicamente del programma Java, poiché gli unici dati persistenti da gestire sono i nomi del dizionario (si ricordi sempre il ''PbD'') e solo i moduli dell'eseguibile Java devono utilizzarli. Se il dizionario contenessero unicamente i nomi (senza informazioni accessorie correlate) e fossero usati in sola lettura, un semplice file di testo poteva essere sufficiente per la rappresentazione. Tuttavia, poiché saranno individuate tecniche di ottimizzazione nell'impiego dei dizionari che richiedono operazioni di scrittura e ordinamento dei dati, risulta opportuno usare un database relazionale.&lt;br /&gt;
&lt;br /&gt;
====Logica di business e dinamiche di interazione====&lt;br /&gt;
&lt;br /&gt;
Vengono presentati in questa sezione gli aspetti principali dei funzionamenti dei moduli del servizio. Per mettere bene a fuoco quali siano le meccaniche di interazione e i flussi di esecuzione dei programmi, si propone il diagramma di sequenza del tipico scenario di utilizzo. In questo schema UML si descrive il caso d'uso dove un utente, dopo aver inserito un documento ed averlo ricevuto &amp;quot;minimizzato&amp;quot;, esprime delle preferenze e richiede poi un secondo trattamento.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F00])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si descrivono quindi ora le principali operazioni che vengono eseguite.&lt;br /&gt;
All'avvio dell'interazione viene presentata una pagina PHP di benvenuto contenente le informazioni su come i dati personali vengano elaborati ed un ''file-picker'' per consentire l'upload di un documento ''OOXML''; nel momento in cui l'utente confermerà il caricamento del documento, esso verrà trasferito sul server. &lt;br /&gt;
Bisogna prestare particolare attenzione al comportamento del sistema nel caso in cui più utenti richiedano contemporaneamente l'esecuzione del servizio, e cioè alle problematiche di esecuzioni concorrenti di script PHP; è necessario, in particolare, evitare situazioni in cui i nomi dei file inviati dagli utenti siano in conflitto. Analizzando più in dettaglio il problema, ogniqualvolta un web server Apache riceve una richiesta HTTP per una pagina PHP, si ha la generazione di un nuovo processo che esegue il codice presentato nella pagina PHP richiesta. Supponendo quindi che N utenti eseguano l'invio del file contemporaneamente, si avrebbe che sul server N processi diversi dovrebbero procedere con la scrittura di un file. Ovviamente se due o più file condividono il nome almeno uno di essi sarà sovrascritto. Per risolvere questo problema, supponendo di voler salvare tutti i documenti in una cartella temporanea, occorre modificare il filename dei documenti inviati dagli utenti per esser certi di non incorrere in sovrascritture o altri tipi di errori correlati.&lt;br /&gt;
Una valida possibilità è l'inserimento di un ''prefisso'' univoco nel filename. Per la generazione di una stringa univoca da anteporre al filename, che permetta di distinguere file caricati da utenti diversi, si può direttamente usare il ''session id'' dell'utente. In PHP esso è determinato casualmente combinando ([0043]): l'IP del cliente, orario di attribuzione dell'id, un numero pseudo-casuale (con il ''PHP Linear Congruence Generator'') e, se presente un &amp;quot;''random source''&amp;quot; sul sistema operativo del Client (spesso chiamato impropriamente &amp;quot;''seme''&amp;quot;), un ulteriore numero pseudo-casuale.&lt;br /&gt;
Per introdurre ulteriore alea, necessaria se, ad esempio, un utente tenti l'upload di file omonimi (con contenuto interno diverso) e mantenga il medesimo ''session id'', si utilizza un ulteriore generatore pseudo-casuale per produrre un altro numero con cui comporre il prefisso.&lt;br /&gt;
Concatenando i due numeri generati si ha praticamente certezza di aver individuato un numero univoco nel sistema per il tempo in cui il servizio sarà erogato al cliente.&lt;br /&gt;
&lt;br /&gt;
Una volta memorizzato il file, lo script PHP dovrà ricorrere all'invocazione del modulo Java, delegato al vero e proprio processamento del documento. Occorre quindi individuare un set di opzioni che consenta al modulo che gestisce l'interazione con il cliente di sfruttare al meglio il componente delegato all'elaborazione del documento, in qualunque circostanza; la totale indipendenza dei moduli, la loro sostituibilità e la replicazione possibile di macchine server sono solo alcuni dei fattori che rendono mutevole la configurazione del sistema. Va definito un protocollo di comunicazione, quindi, che astragga completamente dall'implementazione dei moduli o dalla locazione dei file.&lt;br /&gt;
&lt;br /&gt;
Valutando i possibili flussi logici, anche con l'ausilio del diagramma di sequenza, si ha che i tipi di esecuzione sono due:&lt;br /&gt;
* &amp;quot;minimizzazione&amp;quot; con dizionario&lt;br /&gt;
* &amp;quot;minimizzazione&amp;quot; di specifici nominativi&lt;br /&gt;
Il protocollo di comunicazione tra i due moduli è costituito in entrambi i casi di una singola richiesta a cui segue una singola risposta. Più in particolare, lo script PHP invoca il comando Java esprimendo obbligatoriamente il path del file da trattare e opzionalmente l'elenco dei nominativi. A suo volta, il modulo Java restituisce i nominativi trovati, qualora non espressamente richiesti dallo script, e segnala la corretta terminazione dell'elaborazione.&lt;br /&gt;
Si definiscono come canali di comunicazione standard del protocollo gli argomenti presi in input dal modulo di processamento del documento e lo standard output del processo che esegue tale programma. Inoltre è importante definire un formato standard per la comunicazione dei nominativi tra moduli; è necessario quindi scegliere un pattern che permetta di determinare univocamente la composizione dei nominativi. Un possibile formato, espresso tramite ''regex'', è il seguente:&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt; &amp;lt;nominativo&amp;gt; = ^(&amp;lt;nome&amp;gt;:)*&amp;lt;nome&amp;gt;;&amp;lt;cognome&amp;gt;$&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt; &amp;lt;nominativi&amp;gt; = ^(&amp;lt;nominativo&amp;gt;\s+)+$&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Dove nome e cognome sono una sequenza di caratteri Unicode come già discusso. Ulteriori opzioni importanti da definire nel protocollo per l'invocazione del programma che si occupa delle funzionalità di elaborazione sono le seguenti:&lt;br /&gt;
* path file da elaborare (opzione &amp;quot;-i &amp;lt;file_path&amp;gt;&amp;quot;, obbligatoria)&lt;br /&gt;
* path con cui salvare il file elaborato (opzione &amp;quot;-o &amp;lt;file_path&amp;gt;&amp;quot;, opzionale: per default viene creato un nuovo file automaticamente)&lt;br /&gt;
* abilitazione stampe verbose, da usare solo in fase di debug (opzione &amp;quot;-d&amp;quot;, opzionale)&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Una volta terminato il processamento, il modulo di gestione dell'interazione con l'utente dovrà accertarsi che l'&amp;lt;i&amp;gt;exit status&amp;lt;/i&amp;gt; sia 0 e leggere dallo standard output del processo appena terminato, qualora si sia stata eseguita la &amp;quot;minimizzazione&amp;quot; con dizionario, l'elenco dei nominativi trovati. Se invece la &amp;quot;minimimizzazione&amp;quot; ha avuto luogo con i nominativi già specificati non sarà scritto nulla sullo standard output.&lt;br /&gt;
A margine si osserva che l'impiego dell'opzione &amp;quot;-d&amp;quot; deve sempre consentire una semplice individuazione dei nominativi trovati; in particolare, se tale opzione è specificata, nello standard output i nominativi compariranno con un ''header'' riconoscibile (&amp;quot;''NOMINATIVO=''&amp;quot;).&lt;br /&gt;
Ritornando alla descrizione del flusso di esecuzione tipo, una volta che il modulo Java ha completato il trattamento del documento, lo script PHP ne effettuerà l'upload sul client e presenterà all'utente le opzioni già descritte nel capitolo sull'usabilità. &lt;br /&gt;
A questo punto l'interazione con client potrebbe concludersi, qualora si eseguisse il download e si chiudesse il browser, o continuare elaborando i ''suggerimenti'' dell'utente espressi dopo il primo trattamento. Le modalità di comunicazione dei moduli varierebbero leggermente come appena illustrato, mentre, a seconda della configurazione stateful o stateless del servizio, verrebbe eseguito o meno un nuovo upload del file dal client al server.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si osserva infine che, per predisporre a successivi studi di ottimizzazione il servizio e per agevolare tutti i possibili sviluppi futuri, si applica largamente nella progettazione del modulo di elaborazione Java il ''Dependency Inversion Principle'', in quanto si desidera realizzare classi estendibili ed intercambiabili.&lt;br /&gt;
In particolare, si introducono delle classi astratte per rappresentare in maniera generica il concetto di &amp;quot;''persona''&amp;quot; e &amp;quot;''minimizzatore''&amp;quot;. È possibile infatti realizzare successivi studi per trattare ulteriori dati personali oltre che ai nomi e cognomi; inoltre, in base ai tipi di documenti trattati o eventuali altri fattori utili, è possibile studiare differenti tecniche di &amp;quot;minimizzazione&amp;quot; realizzate da differenti algoritmi &amp;quot;''minimizzatori''&amp;quot;.&lt;br /&gt;
In particolare una &amp;quot;''persona''&amp;quot; dovrà sempre esporre un metodo &amp;quot;''minimizza''&amp;quot; che prende in input una stringa, la &amp;quot;minimizza&amp;quot; e la restituisce; il pattern con il quale si effettua la &amp;quot;minimizzazione&amp;quot; sarà fornito in implementazione a seconda dei dati sensibili di interesse.&lt;br /&gt;
Un &amp;quot;''minimizzatore''&amp;quot; esporrà sempre un metodo &amp;quot;''work''&amp;quot; che, presa in input una lista di persone ed un documento ''OXML'', con l'ausilio della libreria Docx4j, fornirà in output un documento del tutto &amp;quot;minimizzato&amp;quot;; la definizione delle modalità con cui si estrapolano le informazioni dal documento e con cui si invoca il metodo &amp;quot;''minimizza''&amp;quot; della classe persona sono confinate nell'implementazione.&lt;br /&gt;
Definendo delle classi astratte risulta, quindi, più veloce la realizzazione dei futuri componenti e si svincola il processo di &amp;quot;minimizzazione&amp;quot; dal tipo di dati che si &amp;quot;minimizzano&amp;quot; e viceversa.&lt;br /&gt;
&lt;br /&gt;
====Le classi principali del progetto====&lt;br /&gt;
Le classi principali del progetto vengono quindi presentate in appendice. Esse sono:&lt;br /&gt;
* App.java, contenente il main&lt;br /&gt;
* Elaborator.java, che presenta il metodo &amp;quot;''work''&amp;quot;&lt;br /&gt;
* Persona.java, che presenta il metodo &amp;quot;''minimizza''&amp;quot;&lt;br /&gt;
* Testing.java, contenente alcune funzioni usate in fase di debug.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gli script in PHP sono stati forniti dall'azienda come implementazione minimale e provvisoria, da perfezionare a seguito della eventuale definizione sulle modalità di presentazione del servizio su Internet.&lt;br /&gt;
&lt;br /&gt;
Una considerazione di implementazione comune a tutte le classi deriva del principio ''Privacy by Design'', indifferentemente dalla modalità di configurazione stateful o stateless del servizio: è di fondamentale importanza che nel sistema non siano memorizzati permanentemente in alcun caso i documenti inviati dagli utenti del servizio. &lt;br /&gt;
Per realizzare un sistema robusto, per fronteggiare crash improvvisi del client o congestioni della rete, è opportuno impostare dei timeout lato server che procedano automaticamente alla eliminazione dei documenti degli utenti dopo un periodo di inattività troppo prolungato. Qualora invece si dovesse verificare un interruzione critica del servizio a causa di un errore logico del server o semplicemente per via di un'interruzione dell'alimentazione della macchina server, bisogna considerare altri metodi; essendo il servizio realizzato con un sistema operativo Linux, si può configurare il demone ''crond'' per eseguire a ogni reboot e, per sicurezza, una volta al giorno l'eliminazione dei file usati dall'applicazione tutti contenuti all'interno della cartella temporanea.&lt;br /&gt;
&lt;br /&gt;
==Approfondimenti tecnologici==&lt;br /&gt;
&lt;br /&gt;
===Analisi della struttura del formato OOXML===&lt;br /&gt;
&lt;br /&gt;
Come argomentato, il formato dei documenti elaborati dal servizio progettato dovrà essere ''Office Open XML'', o ''OOXML''; si tratta di un formato ''XML-based'' per documenti di testo, fogli elettronici e presentazioni, in grado di rappresentare grafici, diagrammi, immagini e altro materiale grafico. La specifica fu sviluppata da Microsoft e adottata dall'&amp;lt;i&amp;gt;ECMA International&amp;lt;/i&amp;gt; come standard ''ECMA-376'' nel 2006. Una seconda versione fu rilasciata nel 2008, una terza nel 2011, una quarta nel 2012 ed una quinta tra il 2015 ed il 2016 ([0010]). La specifica è stata adottata, inoltre dall'&amp;lt;i&amp;gt;ISO&amp;lt;/i&amp;gt; e dall'&amp;lt;i&amp;gt;IEC&amp;lt;/i&amp;gt; come standard ''ISO/IEC 29500'' a partire dal 2008 ([0011], [0012]).&lt;br /&gt;
&lt;br /&gt;
====Linguaggi di markup====&lt;br /&gt;
&lt;br /&gt;
Lo standard ''ECMA-376'' ([0010]) include tre differenti specifiche di linguaggio per ognuna delle tre principali categorie di documenti:&lt;br /&gt;
* ''WordprocessingML'' per i documenti testuali&lt;br /&gt;
* ''SpreadsheetML'' per i fogli elettronici&lt;br /&gt;
* ''PresentationML'' per le presentazioni elettroniche&lt;br /&gt;
* ''DrawingML'' ed altri linguaggi di markup di supporto per la rappresentazione di disegni, forme e diagrammi.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
La specifica include sia gli schemi ''XML'' sia i vincoli espressi per iscritto. Ogni documento conforme al formato dovrà, quindi, rispettare gli schemi ''XML'' e dovrà essere codificato in ''UTF-8'' o ''UTF-16''. La specifica, inoltre, permette l'aggiunta di ''custom tag XML'' a supporto dei linguaggi di markup dati, per default nel formato ''OOXML'', consentendo quindi la libera personalizzazione dei documenti.&lt;br /&gt;
&lt;br /&gt;
====File packaging====&lt;br /&gt;
&lt;br /&gt;
Oltre alla specifiche relative ai linguaggi di markup, la seconda parte dell'&amp;lt;i&amp;gt;ECMA-376&amp;lt;/i&amp;gt; ([0010]) definisce la struttura gerarchica dei file del formato adottando le ''Open Packaging Conventions'' (''OPC''). ''OPC'', una tecnologia ''file-container'' basata sul comune formato compresso ''zip'', che stabilisce che tutti i file che riguardano una stessa entità devono essere raggruppati in un unico package ([0014]). Un documento ''OOXML'' è, infatti, un archivio ''zip'' contenente alcuni files ''XML'' (detti anche ''parti'') organizzati in un singolo package. Questa frammentazione dei dati in più files rende più semplice e veloce l'accesso ai dati stessi e riduce le possibilità di una loro corruzione. Le ''parti'' possono contenere qualsiasi tipo di dato; per tenere traccia della relazione tra una ''parte'' e la sua tipologia di contenuto, senza basarsi sull'estensione del file, è presente nel package, nella cartella radice della gerarchia, il file denominato ''[Content_Types].xml'', il quale mappa appunto queste associazioni. È mostrata qui ad esempio l'associazione tra la ''parte'' rappresentante il documento principale e il suo ''ContentType''.&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Override PartName=&amp;quot;/word/document.xml&amp;quot; ContentType=&amp;quot;application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Le informazioni relative alle relazioni che ogni ''parte'' ha con le altre ''parti'', con risorse esterne e con il package in sé sono mantenute separatamente dal contenuto della ''parte'' stessa. Tali informazioni sono presenti, infatti, all'interno delle cartelle denominate ''_rels'': ne esiste una per il package nel suo complesso e una per ogni sotto-cartella del package contenente delle ''parti'' coinvolte in delle relazioni. In questo modo i riferimenti che una ''parte'' ha verso altre ''parti'' o risorse sono salvati una sola volta e possono essere aggiornati con semplicità se necessario, senza dover modificare il contenuto stesso delle ''parti'' coinvolte. È mostrato qui un esempio di relazione contenuta in ''_rels/.rels'' relativa al documento principale e al suo schema.&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Relationship Id=&amp;quot;rId1&amp;quot; Type=&amp;quot;http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument&amp;quot; Target=&amp;quot;word/document.xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Il documento principale, ossia il file ''word/document.xml'', ha inoltre numerose relazioni con altre ''parti'', come ad esempio ''word/styles.xml'' e ''word/footer.xml'', e risorse esterne collegate con degli URI. Per descrivere queste relazioni si usa la cartella ''word/_rels''.&lt;br /&gt;
&lt;br /&gt;
====Parti di un Documento OOXML====&lt;br /&gt;
&lt;br /&gt;
Vengono qui presentate le ''parti'' che sono caratteristiche esclusive di un ''WordprocessingML package'', non presenti quindi negli altri due formati ''OOXML''. È importante osservare che alcune di esse sono facoltative e sono presenti nel package solo se necessario.&lt;br /&gt;
&lt;br /&gt;
Le ''parti'' relative al vero e proprio contenuto testuale sono:&lt;br /&gt;
* ''Main Document'', contiene le informazioni principali ed è salvata come ''word/document.xml''&lt;br /&gt;
* ''Header'', contiene i dati relativi alle intestazioni ed è salvata in ''word/header.xml''. Ogni sezione del documento può avere intestazioni diverse per la prima pagina, per le pagine pari e per le dispari, quindi possono esserci molteplici ''parti header''&lt;br /&gt;
* ''Footer'', contiene le informazione relative al piè pagina ed è salvata in ''word/footer.xml''. Può essere presente più volte, per motivi analoghi alla ''parte header''&lt;br /&gt;
* ''Footnotes'', contiene le eventuali note a piè pagina del documento ed è salvata come ''word/footnotes.xml''&lt;br /&gt;
* ''Endnotes'', contiene le note di chiusura del documento ed è salvata in ''word/endnotes.xml''.&lt;br /&gt;
&lt;br /&gt;
Sono presenti poi delle ''parti'' relative allo stile e alle impostazioni del documento:&lt;br /&gt;
* ''Style Definitions'', contiene la definizione di un insieme di stili usati dal documento, salvata in ''word/styles.xml''&lt;br /&gt;
* ''Font Table'', contiene informazioni riguardo i font usati, salvata in ''word/fontTable.xml''&lt;br /&gt;
* ''Numbering Definitions'', contiene le definizioni sulla struttura delle liste contenute nel documento, salvata in ''word/numbering.xml''&lt;br /&gt;
* ''Document Settings'', specifica come il word processor debba trattare il documento (spell checking, gestione delle revisioni, etc.), contenuta in ''word/settings.xml''&lt;br /&gt;
* ''Web Settings'', contiene informazioni su come il documento debba essere convertito in ''HTML'' se richiesto, contenuta in ''word/webSettings.xml''.&lt;br /&gt;
&lt;br /&gt;
Sono presenti anche delle ''parti'' che rappresentano testo secondario:&lt;br /&gt;
* ''Comments'', contiene i commenti sul documento inseriti attraverso un word processor&lt;br /&gt;
* ''Glossary'', contiene dati testuali aggiuntivi secondari, ne è permessa una sola. Tutte le ''parti'' prima elencate, tranne il ''Main Document'', possono comparire una seconda volta in relazione alla ''parte glossary''.&lt;br /&gt;
&lt;br /&gt;
====Analisi del Main Document====&lt;br /&gt;
&lt;br /&gt;
Il file ''document.xml'', elemento principale di un documento ''WordprocessingML'', è costituito da due tipi di informazioni:&lt;br /&gt;
* ''properties'', che definiscono lo stile e la formattazione del testo&lt;br /&gt;
* ''stories'', che rappresentano il contenuto testuale delle varie parti del documento.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le ''properties'' verranno trattate in misura minore. Queste informazioni sono espresse attraverso una struttura XML gerarchica che ha come elemento radice il nodo ''document''. Esso ha due nodi figli:&lt;br /&gt;
* ''background'', che contiene alcune ''properties'' che descrivono lo sfondo del documento&lt;br /&gt;
* ''body'', che contiene tutti i rimanenti contenuti ed è potenzialmente molto complesso.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si osserva che per le finalità del trattamento dei dati risultano di primario interesse le ''stories'' e che è opportuno effettuare un'analisi ''bottom-up'' del problema: anziché considerare la gerarchia a partire dal ''body'' (nodo padre) partiremo dalla rappresentazione più semplice del testo contenuta nel documento (nodi figli).&lt;br /&gt;
&lt;br /&gt;
Facendo direttamente riferimento allo standard ''ECMA-376'' ([0010]),  si evince che l'unico nodo che contiene puro testo ha il nome ''t'' (''Text''). Questo elemento contiene una stringa rappresentante gli esatti caratteri che vengono poi mostrati negli editor a video. Il nodo ''Text'' non presenta figli e l'unico nodo padre che può avere è ''r'' (''Run''). Quest'altro nodo definisce una regione di testo con comuni proprietà (ad esempio l'uso del grassetto). Attraverso l'uso di tag ''t'' ed ''r'' quindi si rappresenta una regione di testo formattata con differenti elementi stilistici.&lt;br /&gt;
Occorre però evidenziare che un nodo ''r'' può presentare molti altri figli oltre a ''t'', come ad esempio immagini, in quanto rappresenta un'area generica del documento.&lt;br /&gt;
Si supponga quindi di avere due nodi ''Text'' fratelli, ossia figli dello stesso nodo ''r'': essi rappresenteranno semanticamente un unico blocco logico se e solo se compariranno a video come una sequenza di parole continua. Questo fenomeno è facilmente identificabile anche nel file ''XML'' descrittivo: due sequenze di parole mostrate a video adiacenti compaiono infatti nel file ''XML'' in due righe consecutive; se invece due parti di testo dovessero essere intervallate ad es. da un'immagine nel documento ''XML'' ci sarebbe un tag ''drawing'' a dividere i due tag ''t''. Dalla consecutività dei nodi ''Text'' nel file ''document.xml'' si può determinare quali siano i blocchi logici da trattare.&lt;br /&gt;
Un insieme di ''Run'' infine può essere figlio di diversi nodi, ma ciò non è di rilevante importanza, in quanto ogni area di testo individuata dal nodo ''Run'' rappresenta già un blocco logico a sé e, di conseguenza, contiene sufficienti informazioni per la &amp;quot;minimizzazione&amp;quot;.&lt;br /&gt;
L'unico caso di rilievo nel quale bisogna valutare quale sia la gerarchia a monte di un nodo ''Run'' è nell'elaborazione di una tabella. In tal caso, in realtà, occorre verificare opportunamente la strutturazione della gerarchia processata. Per chiarezza espositiva viene mostrata la rappresentazione in formato ''OOXML'' di una tabella con una riga e due colonne (senza l'uso di ''properties'' per la formattazione stilistica).&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;w:tbl&amp;gt;&lt;br /&gt;
  &amp;lt;w:tr&amp;gt;&lt;br /&gt;
    &amp;lt;w:tc&amp;gt;&lt;br /&gt;
      &amp;lt;w:p&amp;gt;&lt;br /&gt;
        &amp;lt;w:r&amp;gt;&lt;br /&gt;
          &amp;lt;w:t&amp;gt;Cella A&amp;lt;/w:t&amp;gt;&lt;br /&gt;
        &amp;lt;/w:r&amp;gt;&lt;br /&gt;
      &amp;lt;/w:p&amp;gt;&lt;br /&gt;
    &amp;lt;/w:tc&amp;gt;&lt;br /&gt;
    &amp;lt;w:tc&amp;gt;&lt;br /&gt;
      &amp;lt;w:p&amp;gt;&lt;br /&gt;
        &amp;lt;w:r&amp;gt;&lt;br /&gt;
          &amp;lt;w:t&amp;gt;Cella B&amp;lt;/w:t&amp;gt;&lt;br /&gt;
        &amp;lt;/w:r&amp;gt;&lt;br /&gt;
      &amp;lt;/w:p&amp;gt;&lt;br /&gt;
    &amp;lt;/w:tc&amp;gt;&lt;br /&gt;
  &amp;lt;/w:tr&amp;gt;&lt;br /&gt;
&amp;lt;/w:tbl&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Come si osserva in figura, in una tabella il nodo ''r'' sarà figlio del nodo ''p'' (''Paragraph''), il quale a sua volta sarà contenuto in un noto ''tc'' (''Table Cell''). Celle di una tabella appartenenti ad una stessa riga saranno presenti all'interno dello stesso ''tr'' (''Table Row'') ed infine tutte le righe della tabella saranno inserite del tag ''tbl'' (''Table'').&lt;br /&gt;
&lt;br /&gt;
Per determinare quindi se due nodi ''Text'' sono scritti in due colonne adiacenti di una stessa riga (e quindi costituiscono un unico blocco logico) è necessario verificare che per i due nodi ''Text'':&lt;br /&gt;
# il nodo &amp;quot;padre&amp;quot;  '''non sia''' in comune&lt;br /&gt;
# il nodo &amp;quot;padre di 2° livello&amp;quot; sia ''Paragraph'' e '''non sia''' in comune&lt;br /&gt;
# il nodo &amp;quot;padre di 3° livello&amp;quot; sia ''Table Cell'' e '''non sia''' in comune&lt;br /&gt;
# il nodo &amp;quot;padre di 4° livello&amp;quot; sia ''Table Row'' e '''sia''' in comune&lt;br /&gt;
# i nodi &amp;quot;padre di 3° livello&amp;quot; '''siano''' consecutivi.&lt;br /&gt;
Se tutte queste ipotesi sono soddisfatte, le due celle vanno &amp;quot;minimizzate&amp;quot; come unico blocco logico.&lt;br /&gt;
&lt;br /&gt;
Si valutano infine gli ultimi vincoli emersi nell'analisi sull'interpretazione della formattazione di un documento.&lt;br /&gt;
In particolare, descrivendo le parti che compongo un documento ''OOXML'', era già emerso che alcune sezioni di testo, ossia note a piè pagina ed intestazioni, compaiono in altri file ''XML'' e non in ''document.xml''. Questi file (''header.xml'', ''footer.xml'', ''endnotes.xml'', etc.) sono tutti raccolti in un package (&amp;quot;''word''&amp;quot;) e la grammatica ''XML'' è la stessa usata per il Main Document.&lt;br /&gt;
Si conclude osservando che il problema della divisione in sillabe delle parole non si pone, in quanto la divisione sillabica mostrata a video dai word-processors è calcolata dinamicamente; in particolare, su una porzione di testo viene applicata la sillabazione (ove necessario) se è presente tra le ''properties'' di quella regione di documento il tag ''hyphenationZone''.&lt;br /&gt;
&lt;br /&gt;
====La libreria in ambiente java open source Docx4j====&lt;br /&gt;
&lt;br /&gt;
La libreria Docx4j offre completo supporto alla manipolazione di documenti ''docx'' (compressione e decompressione archivio zip, generazione file ''XML'' necessari, etc.). Offre inoltre un'utile mappatura in specifici oggetti Java della gerarchia ''XML'' presente nei vari file del formato.&lt;br /&gt;
Uno tra gli elementi più interessanti è la tecnica con cui vengono recuperati i nodi dai file ''XML'', in quanto si fa impiego del linguaggio standard W3C ''XPath'' ([0044], [0045]). Con ''XPath'' è possibile esprimere con una stringa un sottoinsieme di nodi presenti in una gerarchia ''XML'' non solo in base al loro nome o valore, ma anche in relazione alla posizione reciproca rispetto agli altri nodi. Riferendoci alle problematiche del servizio risulta, ad esempio, significativamente agevolato il trattamento di dati personali in forma tabellare.&lt;br /&gt;
Si osserva infine che la libreria attribuisce un id univoco ad ogni nodo del documento, di conseguenza se ne può trarre vantaggio nei confronti tra i nodi.&lt;br /&gt;
&lt;br /&gt;
===Ottimizzazioni del processo di minimizzazione===&lt;br /&gt;
&lt;br /&gt;
===Tecnologie complementari===&lt;br /&gt;
&lt;br /&gt;
La redazione di questa tesi è avvenuta su Mediawiki, la più importante fra le piattaforme wiki essendo il motore di Wikipedia.&lt;br /&gt;
&lt;br /&gt;
Le piattaforme wiki sono riconosciute come elemento caratterizzante dell’evoluzione Internet al Web 2.0, cioè al web nel quale gli utenti-navigatori, fino ad allora &amp;quot;''consumatori&amp;quot;'' (&amp;quot;''consumers&amp;quot;'') di contenuti si sono trasformati essi stessi in &amp;quot;''produttori&amp;quot;'' (&amp;quot;''producers&amp;quot;''), e cioè in &amp;quot;''prosumers&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
Un ''wiki'' è fondamentalmente un sito web che contiene informazioni e che consente agli utenti di editare facilmente il suo contenuto.&lt;br /&gt;
&lt;br /&gt;
Nel redigere una pagina wiki si utilizza ciò che è chiamato ''wikitext&amp;quot; per definire capitoli, paragrafi, hyperlinks, elementi di formattazione della pagina, etc.; sebbene il ''wikitext&amp;quot; risulti non difficile da apprendere, quasi ogni piattaforma wiki è corredata da editor di tipo visuale, che non richiede alcuna conoscenza della sintassi del ''wikitext&amp;quot;; tuttavia è esperienza comune che utilizzare direttamente il ''wikitext&amp;quot; induce a concentrarsi maggiormente sui contenuti e non sulla formattazione. Il linguaggio ''wikitext'' è strettamente correlato con il linguaggio HTML, infatti nella scrittura è possibile utilizzare tag come h1, span, div e così via, oltre che la sintassi esclusiva di ''wikitext''; simmetricamente una pagina prodotta da media wiki è costituita da HTML ben formato e direttamente importabile in ogni word processor. &lt;br /&gt;
&lt;br /&gt;
I wiki presentano una funzionalità di grande utilità nella redazione di documenti articolati: la tracciatura delle successive revisioni (&amp;quot;''Cronologia&amp;quot;''). La possibilità di ripercorrere l’evoluzione del testo è davvero d’aiuto quando si fissano idee originali in uno scritto, cercando di definirle, precisarle, chiarirle, come è avvenuto in effetti, anche nella redazione di questa tesi. Per curiosità, si segnala che, pur avendo redatto la maggior parte del testo off-line, la pagina wiki di questa tesi conta oltre 50 revisioni.&lt;br /&gt;
&lt;br /&gt;
Per inciso, si osserva che è stata molto utile la funzionalità di &amp;quot;ricerca nel codice&amp;quot; offerta dalla piattaforma di revisione online GitHub nella corretta comprensione della libreria Docx4j, il cui codice sorgente è ivi rilasciato. &lt;br /&gt;
&lt;br /&gt;
Si conclude infine dicendo che per ottimizzare le procedure di debug del codice sono stati realizzati utili tool a riga di comando per Linux per la rapida estrazione-modifica-ricompattazione di documenti ''OOXML''. Si propone in appendice un comando bash per questi scopi.&lt;br /&gt;
&lt;br /&gt;
==Sviluppi futuri==&lt;br /&gt;
&lt;br /&gt;
In questa sezione si fa cenno, senza poterle approfondire, ad alcune interessanti questioni emerse nello svolgimento della tesi.&lt;br /&gt;
&lt;br /&gt;
===Accesso al servizio web===&lt;br /&gt;
&lt;br /&gt;
In fase iniziale, il servizio web potrà essere reso accessibile in forma completamente aperta, senza richiedere cioè la registrazione dell’utente o l’autenticazione dell’utente già registrato. In questo modo, in effetti, si premia la facilità d’uso, ma si incorre nella nota problematica di un uso malevolo, costituito da accessi a raffica, finalizzati a saturare il server e generare una condizione di ''DoS – Denial of Service''. Diverse sono le tecniche che possono essere adottate per contrastare questo tipo di accessi malevoli, come richiedere di superare &amp;quot;''captcha''&amp;quot; e/o introdurre ritardi crescenti ed eventualmente blocchi in risposta ad accessi prevenienti con alta frequenza dallo stesso indirizzo IP.&lt;br /&gt;
È possibile anche pensare ad un accesso previa registrazione ed autenticazione dell’utente, penalizzando l’immediatezza di utilizzo del servizio, ma eventualmente ottenendo l’indirizzo email degli utenti che acconsentono a lasciarlo per successive finalità marketing.&lt;br /&gt;
È possibile, infine, un utilizzo misto, contando in un cookie il numero di accessi eseguiti e richiedendo all’utente di registrarsi per continuare ad utilizzare il servizio, dopo qualche accesso.&lt;br /&gt;
&lt;br /&gt;
===Ampliamento dinamico del dizionario===&lt;br /&gt;
&lt;br /&gt;
Nel restituire il documento elaborato all'utente, gli si da la possibilità di richiedere una nuova elaborazione, dopo aver indicato i nominativi che fossero sfuggiti; pare inesauribile, infatti, la &amp;quot;fantasia&amp;quot; dei genitori nel dare nome ai propri figlioli!&lt;br /&gt;
I nominativi indicati dall'utente sono sfuggiti al servizio perché non presenti nel dizionario: facilmente viene in mente l’idea di arricchire il dizionario con i nominativi indicati dall’utente. Va però considerato il caso che l’utente in malafede indichi nominativi fasulli al fine di inquinare il dizionario.&lt;br /&gt;
Il caso malevolo può essere affrontato attraverso una strategia che preveda non direttamente l'inserimento del nuovo nominativo nel dizionario, ma invece l'utilizzo di un concetto di &amp;quot;candidatura&amp;quot;: il nuovo nominativo viene registrato, ma si attende di avere un certo numero di utenti che lo propongono prima di approvarne l'inserimento nel dizionario.&lt;br /&gt;
Può anche essere utilizzato un concetto di &amp;quot;attendibilità&amp;quot; della candidatura di un nuovo nominativo, verificando ad esempio l'utente che lo propone scarichi effettivamente il file rielaborato.&lt;br /&gt;
Nel caso l'accesso avvenga con autenticazione, e cioè identificando gli utenti, si apre la possibilità di individuare e bannare gli utenti malevoli.&lt;br /&gt;
&lt;br /&gt;
===Natura del documento e ricorrenza del nominativo===&lt;br /&gt;
&lt;br /&gt;
Si coglie facilmente la differenza di formato fra un documento in forma di elenco (es. una graduatoria) da un documento in forma di relazione (es. una sentenza giudiziaria). Differenze di questo tipo potrebbero essere utilizzate per escludere o ammettere la ripetizione dei nominativi.&lt;br /&gt;
Per meglio dire: in un elenco la ripetizione di un nominativo è di fatto da escludersi o va trattata come omonimia. In una relazione, l’individuazione di un nominativo può essere utilizzata per ricercarlo direttamente in altri punti del documento stesso.&lt;br /&gt;
&lt;br /&gt;
===Altri dati personali===&lt;br /&gt;
&lt;br /&gt;
Altri dati personali sono trattabili con le stesse tecniche analizzate in questa tesi: date e luoghi di nascita, codici fiscali, indirizzi, email, numeri di telefono, sesso etc. In qualche caso, come per i codici fiscali, l’individuazione del pattern da trattare è persino più semplice.&lt;br /&gt;
Diversi studi ([0039]) hanno dimostrato che, utilizzando set di dati personali parziali, è possibile la re-identificazione dei soggetti, pur in documenti pseudonimizzati. È questo un altro motivo per estendere i trattamenti descritti anche agli altri dati personali richiamati.&lt;br /&gt;
&lt;br /&gt;
===Altri alfabeti===&lt;br /&gt;
&lt;br /&gt;
È possibile estendere il sotto-insieme di caratteri Unicode utilizzati nelle ''regex'' per elaborare documenti scritti in altri alfabeti non latini.&lt;br /&gt;
&lt;br /&gt;
==Conclusioni==&lt;br /&gt;
&lt;br /&gt;
Questa tesi è partita da un problema basilare, quasi scolastico, dell'informatica: la ricerca di un testo in un documento, al fine della sua cancellazione o modifica.&lt;br /&gt;
&lt;br /&gt;
Il problema si è subito discostato dalla sua formulazione basilare, principalmente perché, nei casi d'uso, il documento da ricercare non è un semplice testo (&amp;quot;''plain text''&amp;quot;) ma invece è il prodotto di un ''word-processor'': quindi è costituito da una struttura XML più o meno complessa, rappresentante formattazioni, riferimenti interni o esterni, note, etc. La ricerca deve avvenire nei soli nodi di puro testo, individuando ed escludendo dall'analisi lessicale gli elementi testuali di mark-up che non costituiscono contenuto informativo. Nell'approfondire le strutture ed i concetti XML ho potuto notare quanto essi siano ricorrenti in molti ambiti dell'informatica.&lt;br /&gt;
&lt;br /&gt;
Nell'analisi delle specifiche, un'altra complicazione si è presto aggiunta: l'usabilità del servizio cresce drasticamente se si evita di chiedere all'utente, come si era pensato in un primo tempo di fare, quali siano le stringhe (i nominativi) da ricercare e trattare; è nata allora l'idea di reperire queste stringhe in un dizionario di nomi ed in un dizionario di cognomi, considerando anche le permutazioni dei lemmi reperiti. Ho così dovuto approfondire alcuni problemi tipici dei dizionari, come il loro ampliamento automatico con tecniche oggi comprese nel ''machine-learning''. Non ho potuto &amp;quot;resistere&amp;quot; alla tentazione di ''formalizzare la matematica'' in base alla quale ho costruito le strategie di ricerca.&lt;br /&gt;
&lt;br /&gt;
Spunto per la tesi è stata la recente legislazione in materia di dati personali, il GDPR. Esaminandone gli articoli pertinenti, ho maturato una riflessione generale: sempre più il software dovrà essere progettato e realizzato anche alla luce di altre discipline, non solo di quelle informatiche, come le discipline giuridiche ed il diritto.&lt;br /&gt;
&lt;br /&gt;
Durante la fase iniziale della collaborazione con l'azienda mi sono dedicato alla messa a punto delle specifiche; ciò mi ha permesso di comprendere quanto questa fase sia importante e come completezza e precisione delle specifiche siano alla base di un progetto efficace.&lt;br /&gt;
&lt;br /&gt;
Molto importanti sono state la analisi relative al tipo e formato dei documenti da assumere come input ed alla presentazione ottimale del servizio rispetto all'usabilità. &lt;br /&gt;
&lt;br /&gt;
Centrale nel lavoro ed avvincente è stata la definizione della strategia per il riconoscimento dei lessemi attraverso la costruzione dinamica di ''regex'' idonee. In questo fase del lavoro, anche per passione personale, ho approfondito le questioni del riconoscimento &amp;quot;di testi nei testi&amp;quot; che legano, fin dalle origini, l'informatica e la linguistica.&lt;br /&gt;
&lt;br /&gt;
La fase di definizione dell'architettura del servizio mi ha permesso di ripercorrere molte le materie studiate nei tre anni del Corso di Ingegneria Informatica, affrontando argomenti  come il Single Responsibility Principle, il Dependency Inversion Principle, lo &amp;quot;stile&amp;quot; architetturale REST. Molto istruttiva è stata anche la riflessione sulla scomposizione del servizio in moduli software.&lt;br /&gt;
&lt;br /&gt;
Come sempre accade nell'affrontare un progetto nuovo, sono nate molte nuove idee; ho così immaginato numerosi sviluppi futuri, sia a perfezionamento funzionale dell'accesso web al servizio, sia ad estensione delle specifiche per coprire casi applicativi contigui (es. quando il dato che si vuole trattare è un codice fiscale). Dovendo necessariamente tener presente che questo lavoro è una tesi, verificherò con il supporto del mio relatore come poterne proseguire lo sviluppo.&lt;br /&gt;
&lt;br /&gt;
==Bibliografia==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0000]https://en.wikipedia.org/wiki/Comparison_of_Office_Open_XML_software&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0001]https://en.wikipedia.org/wiki/Comparison_of_OpenDocument_software&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0002]https://en.wikipedia.org/wiki/Standardization_of_Office_Open_XML&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0003]https://en.wikipedia.org/wiki/OpenDocument_standardization&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0004]https://support.apple.com/en-us/HT202227&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0005]https://en.wikipedia.org/wiki/Pages_(word_processor)&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0006]https://en.wikipedia.org/wiki/Comparison_of_word_processors&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0007]https://en.wikipedia.org/wiki/OpenDocument&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0008]https://en.wikipedia.org/wiki/Office_Open_XML_file_formats&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0009]https://en.wikipedia.org/wiki/Rich_Text_Format&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0010]https://www.ecma-international.org/publications/standards/Ecma-376.htm&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0011]https://www.iso.org/standard/51463.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0012]https://www.iso.org/standard/71691.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0013]https://en.wikipedia.org/wiki/Office_Open_XML&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0014]https://en.wikipedia.org/wiki/Open_Packaging_Conventions&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0015]https://en.wikipedia.org/wiki/LAMP_(software_bundle)&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0016]https://w3techs.com/blog/entry/debian_ubuntu_extend_the_dominance_in_the_linux_web_server_market_at_the_expense_of_red_hat_centos&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0017]https://news.netcraft.com/archives/2014/06/06/june-2014-web-server-survey.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0018]https://whatis.techtarget.com/definition/LAMP-Linux-Apache-MySQL-PHP&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0019]https://www.ibm.com/cloud/learn/lamp-stack-explained&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0020]https://en.wikipedia.org/wiki/Single_responsibility_principle&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0021]https://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0022]https://en.wikipedia.org/wiki/Latin_script_in_Unicode&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0023]https://it.wikipedia.org/wiki/ISO/IEC_8859-1&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0024]http://www.treccani.it/enciclopedia/uso-delle-maiuscole_%28La-grammatica-italiana%29/&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0025]https://en.wikipedia.org/wiki/Ambiguity#Linguistic_forms&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0026]Steven L. Small; Garrison W Cottrell; Michael K Tanenhaus (22 October 2013). Lexical Ambiguity Resolution: Perspective from Psycholinguistics, Neuropsychology and Artificial Intelligence. Elsevier Science. ISBN 978-0-08-051013-2.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0027]http://www.treccani.it/vocabolario/disambiguazione/&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0028]R. Navigli, K. Litkowski, O. Hargraves. 2007. SemEval-2007 Task 07: Coarse-Grained English All-Words Task. Proc. of Semeval-2007 Workshop (SemEval), in the 45th Annual Meeting of the Association for Computational Linguistics (ACL 2007), Prague, Czech Republic, pp. 30–35 http://www.aclweb.org/anthology/S/S07/S07-1006.pdf&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0029]https://wordnet.princeton.edu/&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0030]R. Navigli, S. P. Ponzetto. BabelNet: Building a Very Large Multilingual Semantic Network. Proc. of the 48th Annual Meeting of the Association for Computational Linguistics (ACL 2010), Uppsala, Sweden, July 11-16, 2010, pp. 216-225. http://aclweb.org/anthology/P/P10/P10-1023.pdf&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0031]Roventini A., Alonge A., Calzolari N., Magnini B., Bertagna F. (2000), &amp;quot;ItalWordNet: a Large Semantic Database for Italian&amp;quot;, Proc. of the 2nd International Conference on Language Resources and Evaluation (LREC 2000), Athens, Greece, 2000, pp. 783-790.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0032]E. Pianta, L. Bentivogli, C. Girardi. MultiWordNet: developing an aligned multilingual database, Proc. of the First International Conference on Global WordNet, Mysore, India, January 21-25, 2002. http://multiwordnet.fbk.eu/paper/MWN-India-published.pdf&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0033]https://www.iso.org/standard/28245.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0034]https://www.gpdp.it/web/guest/regolamentoue&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0035]https://eur-lex.europa.eu/legal-content/IT/TXT/?uri=uriserv:OJ.L_.2016.119.01.0001.01.ITA&amp;amp;toc=OJ:L:2016:119:TOC&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0036]https://www.corriere.it/Primo_Piano/Cronache/2006/09_Settembre/15/cognomi.shtml&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0037]https://data.world/axtscz/italian-first-names&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0038]https://en.wikipedia.org/wiki/Dependency_inversion_principle&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0039]https://imperialcollegelondon.app.box.com/s/lqqcugie51pllz26uixjvx0uio8qxgo5/file/493461282808&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0040https://www.docx4java.org/trac/docx4j]&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0041]https://github.com/plutext/docx4j&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0042]https://docs.oracle.com/javase/9/docs/api/java/lang/String.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0043]https://github.com/php/php-src/blob/master/ext/session/session.c&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0044]https://github.com/plutext/docx4j/search?q=getJAXBNodesViaXPath+in%3Afile&amp;amp;type=Code&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0045]https://www.w3.org/TR/xpath-30/&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0046]&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0047]&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0048]&lt;br /&gt;
&lt;br /&gt;
==Indice delle figure==&lt;br /&gt;
&lt;br /&gt;
[0F00]https://en.wikipedia.org/wiki/Latin_script&lt;br /&gt;
&amp;lt;!-- [[File:Latin alphabet world distribution.svg|thumb|upright=1.6|In verde scuro le nazioni dove è usato solo l'alfabeto latino; in verde chiaro quelle dove all'alfabeto latino è affiancato un altro alfabeto.]] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[0F01]Diagramma di Venn 1&lt;br /&gt;
&lt;br /&gt;
[0F02]Diagramma di Venn 2&lt;br /&gt;
&lt;br /&gt;
[0F03]Diagramma di Venn 3&lt;br /&gt;
&lt;br /&gt;
[0F04]Esito unit test regex (cartella immagini)&lt;br /&gt;
&lt;br /&gt;
[0F05]Inforgrafica GDPR&lt;br /&gt;
&lt;br /&gt;
[0F06]Diagramma di sequenza UML&lt;br /&gt;
&lt;br /&gt;
[0F07]Primo calcolo valutazione algoritmo&lt;br /&gt;
&lt;br /&gt;
[0F08]Secondo calcolo valutazione algoritmo&lt;br /&gt;
&lt;br /&gt;
[0F09]Terzo calcolo valutazione algoritmo&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Servizio_web_per_il_trattamento_dei_dati_personali_contenuti_in_documenti_OOXML_complessi&amp;diff=165</id>
		<title>Servizio web per il trattamento dei dati personali contenuti in documenti OOXML complessi</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Servizio_web_per_il_trattamento_dei_dati_personali_contenuti_in_documenti_OOXML_complessi&amp;diff=165"/>
		<updated>2019-09-29T23:15:17Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: /* Indice delle figure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduzione==&lt;br /&gt;
&lt;br /&gt;
Il recente Regolamento Generale europeo sulla Protezione dei Dati (UE) 2016/679 ([0034], [0035]) o ''GDPR'' (''General Data Protection Regulation'', come nel seguito sarà chiamato) ha modernizzato significativamente la normativa in materia di protezione dei dati personali, rendendola omogenea fra tutti gli stati membri. È bene notare che, fin dal titolo, il ''GDPR'' non riduce gli spazi per i trattamenti di dati personali, ma anzi ne protegge la &amp;quot;libera circolazione&amp;quot;, dettando, però, regole definite e certe. Rinunciando ad una presentazione più completa del ''GDPR'', saranno riportati nei successivi capitoli i concetti necessari alla discussione dell'argomento.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Enti ed organizzazioni, aventi a che fare con documenti contenenti dati sensibili, devono operare in maniera conforme al ''GDPR''; potrebbero, di conseguenza, trarre beneficio da servizi specifici in grado di supportarli in queste esigenze.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
L'oggetto principale della tesi sarà dunque, come riportato dal titolo, la progettazione e la realizzazione di un servizio per la gestione di dati personali.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F05])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La larga maggioranza dei documenti testuali viene generata con strumenti cosiddetti di &amp;quot;produttività individuale&amp;quot;, cioè da ''word-processors''. L'osservazione, ovvia nella sua evidenza, consente di introdurre una riflessione: quando un documento è generato da un'elaborazione automatica, magari per composizione di ''template'' con dati estratti da un database, l'individuazione dei &amp;quot;dati personali&amp;quot; nel documento prodotto può avvenire in modo rigoroso e senza incertezze, sulla base degli elementi di composizione del documento; ad es.: i campi del documento estratti da una anagrafica di soggetti sono certamente dati personali e come tali possono essere opportunamente trattati nel processo di elaborazione automatica (ad es. cancellati).&lt;br /&gt;
&lt;br /&gt;
Ma, in quella larga maggioranza di documenti testuali generata con ''word-processors'' l'individuazione ed il trattamento dei dati personali vanno affrontati con altri approcci, discussi in questa tesi.&lt;br /&gt;
&lt;br /&gt;
==Scenario di lavoro==&lt;br /&gt;
&lt;br /&gt;
===Minimizzazione dei dati personali===&lt;br /&gt;
&lt;br /&gt;
Un concetto espresso in modo pervasivo dal ''GDPR'' è quello della &amp;quot;''minimizzazione''&amp;quot; dei dati personali trattati ed a maggior ragione dei dati personali pubblicati. In particolare l'Art. 5 ed il Considerando 39 prescrivono che i dati personali trattati siano &amp;quot;''adeguati, pertinenti e limitati a quanto necessario rispetto alle finalità per le quali sono trattati («minimizzazione dei dati»)''&amp;quot; ([0035]).&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Con questo fine, il GDPR delinea due possibilità organizzative e tecniche di &amp;quot;''minimizzazione''&amp;quot;: l'anonimizzazione e la psedonimizzazione.&lt;br /&gt;
&lt;br /&gt;
====Anonimizzazione====&lt;br /&gt;
&lt;br /&gt;
Sono anonimizzati i dati personali non (più) riferibili alle persone a cui sono appartenuti; si tratta di serie di dati, spesso ingenti, che sono stati definitivamente ed irreversibilmente separati da ogni riferimento alle persone che caratterizzavano. Sono le serie di dati utilizzate per fini statistici, scientifici, etc. E' importante notare che, come fissato dal Considerando 26 del ''GDPR'', il Regolamento non si applica al &amp;quot;''trattamento di tali informazioni anonime''&amp;quot; ([0035]). Per questo, sottoporre database e documenti ad un procedimento, cioè un trattamento, di anonimizzazione consente di non doversi più preoccupare del ''GDPR''.&lt;br /&gt;
&lt;br /&gt;
====Pseudonimizzazione====&lt;br /&gt;
&lt;br /&gt;
Fra le definizioni dell'Art. 4 del ''GDPR'', la &amp;quot;pseudonimizzazione&amp;quot; viene indicata come &amp;quot;''il trattamento tale che i dati personali non possano più essere attribuiti a un interessato specifico senza l’utilizzo di informazioni aggiuntive, a condizione che tali informazioni aggiuntive siano conservate separatamente''&amp;quot; ([0035]).&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Traducendo in termini &amp;quot;operativi&amp;quot;, si tratta del procedimento che, dal &amp;quot;record&amp;quot; dei dati di un interessato, separa i campi che caratterizzano l'interessato stesso da quelli che lo identificano, trasferendo questi ultimi in una nuova distinta tabella; nelle due tabelle vengono aggiunti i riferimenti che permettono la ricostruzione del record originario; il procedimento è completo quando la nuova tabella con gli identificativi viene archiviata separatamente ed eventualmente cifrata. In margine si annota che in molti casi, come molti studi dimostrano, è possibile identificare, quindi &amp;quot;riconoscere&amp;quot;, gli interessati utilizzando la sola tabella con i dati pseudonimizzati.&lt;br /&gt;
&lt;br /&gt;
====Altri trattamenti di &amp;quot;minimizzazione&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Un problema pratico che si incontra di frequente è quello di dover pubblicare documenti più o meno ampi che contengono dati personali. Spesso la pubblicazione è obbligatoria per legge: si pensi alle graduatorie relative a concorsi pubblici, alle sentenze dei tribunali, etc.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In questi frequenti casi, analizzando meglio le finalità per le quali sono pubblicati quei dati personali, si osserva che sono possibili e legittimi almeno due approcci per &amp;quot;minimizzare&amp;quot; il dato nel &amp;quot;trattamento di pubblicazione&amp;quot; e, dunque, per minimizzarne la propagazione, ad esempio attraverso motori di ricerca, ben oltre ogni ragionevole finalità. I contesti ed i corrispondenti approcci sono:&lt;br /&gt;
#  Situazioni in cui è necessario che l'interessato possa riconoscersi nel documento ed essere riconosciuto dagli altri soggetti menzionati nel contesto, ma non è plausibile la necessità di identificazione dell'interessato al di fuori di quel contesto specifico. A questo caso si riconducono le graduatorie di concorsi, gli elenchi per la formazione di classi, gli elenchi per convocazioni, etc. In tutti questi casi, nel processo di redazione del documento è più pratico trattare internamente i dati personali in forma completa; ma praticamente mai è necessario pubblicarli per intero, esponendo al pubblico accesso codici fiscali, indirizzi, recapiti telefonici etc. Per di più, nella maggior parte delle volte, è sufficiente pubblicare il solo cognome perché l'interessato conosca la sua posizione in graduatoria; ciò è spesso sufficiente anche a trasmettere l'informazione necessaria ai colleghi dell'interessato nella medesima graduatoria, o nella medesima classe, etc. Notare che, pubblicando il solo cognome, viene di fatto oscurato anche il sesso. Dunque, in questi casi è auspicabile cancellare una larga parte dei dati personali presenti nel documento.&lt;br /&gt;
# Situazioni in cui il documento deve essere pubblicato affinché siano rese note le motivazioni che lo hanno originato, senza che sia necessaria la precisa identificazione dei soggetti che vi compaiono. Questo è il caso della pubblicazione di sentenze giudiziarie di ogni grado. Le sentenze vengono notificate direttamente agli &amp;quot;aventi causa&amp;quot;; ma anche, come la legge prescrive, pubblicate al fine di costituire giurisprudenza. In questo secondo caso, risulta del tutto eccedente la pubblicazione dei reali nominativi degli interessati, che troverebbero verosimilmente la propria vicenda inutilmente indicizzata dai motori di ricerca negli anni a venire. Nella pubblicazione delle sentenze appare un approccio ottimale quello di sostituire con pseudonimi o con iniziali alterate i veri nominativi degli interessati presenti: il senso e le argomentazioni della sentenza restano pienamente comprensibili, come è necessario; il dato personale, del tutto superfluo ai fini della giurisprudenza, viene protetto.&lt;br /&gt;
In questi casi appare opportuno sostituire i dati identificativi dell'interessato, ed in particolare il nome e cognome, con pseudonimi o, ancora, con iniziali alterate, cioè non coincidenti con le iniziali reali. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Proprio questi tipi di trattamenti di &amp;quot;minimizzazione&amp;quot; sono l'oggetto di questa tesi.&lt;br /&gt;
&lt;br /&gt;
===Punti di partenza per la progettazione del servizio===&lt;br /&gt;
&lt;br /&gt;
La tesi è stata svolta in collaborazione con l'azienda AFA Systems (www.afasystems.it/gdpr) con la quale si sono discusse le problematiche di progettazione e realizzazione di un servizio generalizzato di minimizzazione dei dati personali presenti in un documento.&lt;br /&gt;
Con l'intenzione di fornire il servizio ad un bacino d'utenza il più vasto e variegato possibile, si è pensato ad un'applicazione ''web-based'', indipendente così dai singoli devices sui quali poi sarà utilizzata.&lt;br /&gt;
L'attenzione è stata concentrata sul trattamento dei nomi e dei cognomi (che da qui chiameremo nominativi), poiché sono quelli sempre presenti nei documenti (ad es. gli indirizzi sono presenti solo a volte), rappresentano gli elementi tramite i quali è immediato il riconoscimento della persone, non hanno formato predefinito (come ad es. i codici fiscali); altri dati personali (indirizzi, codici fiscali, etc.), potranno essere considerati in successive evoluzioni del progetto.&lt;br /&gt;
È utile notare che la parte iniziale della collaborazione con l'azienda è stata dedicata alla discussione delle specifiche, la cui più precisa definizione è parte rilevante di questa tesi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Tra i requisiti che necessitano di un opportuno studio troviamo ad esempio:&lt;br /&gt;
* L'individuazione di metodi efficaci per il riconoscimento dei nominativi nei documenti&lt;br /&gt;
* L'identificazione delle migliori procedure di interazione con l'utente&lt;br /&gt;
* La scelta dei formati da trattare&lt;br /&gt;
* I vincoli non funzionali legati al rispetto del ''GDPR''.&lt;br /&gt;
&lt;br /&gt;
==Definizione delle specifiche==&lt;br /&gt;
&lt;br /&gt;
===Riconoscimento dei nominativi===&lt;br /&gt;
&lt;br /&gt;
====Scelta della strategia di riconoscimento====&lt;br /&gt;
 &lt;br /&gt;
Le difficoltà principali con cui ci si imbatte nel processo di riconoscimento dei nominativi riguardano la complessità strutturale dei documenti di testo, ma soprattutto l'intrinseca ambiguità del linguaggio naturale. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Le variabili ed impredicibili strutture e formattazioni dei documenti introducono alcuni problemi significativi. Rendendo fortemente eterogeneo il contenuto dei documenti, infatti, esse non consentono di ricondurre il problema del riconoscimento dei nominativi ad uno o a pochi singoli casi, ma comportano lo studio di tutte le strutture e formattazioni possibili, rendendo quindi l'analisi molto generale. L'altra rilevante difficoltà presente sta nella complessità di effettuare il riconoscimento di una stringa testuale immersa in un insieme di elementi non tutti testuali. Ogni elemento di formattazione, che sia una tabella o una barra orizzontale, introduce infatti un proprio significato logico e semantico nel documento di cui bisogna tenere conto.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Il linguaggio naturale introduce anch'esso complessità: si pensi alle molteplici tipologie di proposizioni con cui possono essere articolati i periodi; ma i problemi principali derivano dalle sue ambiguità. Esse vengono classificate in diverse tipologie ([0025]); le principali sono le ambiguità sintattiche e lessicali.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si ha ambiguità sintattica quando la sintassi di una frase può essere interpretata in diversi modi e, di conseguenza, la frase stessa assume significati diversi. Essa è presente, ad esempio, nelle seguenti frasi:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
* &amp;quot;''Rapina in banca con rivoltella da centomila euro''&amp;quot;&lt;br /&gt;
* &amp;quot;''Luigi ha visto un uomo nel parco con il binocolo''&amp;quot;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
L'esasperazione massima della problematica delle ambiguità sintattiche si presenta con l'&amp;lt;i&amp;gt;antinomia&amp;lt;/i&amp;gt;, ossia un particolare tipo di paradosso che indica la compresenza di due affermazioni contraddittorie che possono essere entrambe dimostrate o giustificate.&lt;br /&gt;
L'antinomia di Epimenide o ''Paradosso del mentitore'', nota fin dal VI secolo, è probabilmente uno dei più noti esempi: &amp;quot;''il cretese Epimenide afferma che tutti i cretesi mentono''&amp;quot;. Se la proposizione è vera (i cretesi mentono) allora il suo significato implica che sia falsa (Epimenide mente e quindi i cretesi dicono la verità), ma se è falsa (i cretesi dicono la verità) ciò significa che è vera (Epimenide dice la verità e quindi i cretesi mentono). La proposizione appare contemporaneamente vera e falsa. A partire dagli anni venti del '900, sono state elaborate varie teorie per la risoluzione delle contraddizioni provocate dalle antinomie, soprattutto attraverso l'elaborazione di linguaggi multilivello o attraverso l'elaborazione di logiche polivalenti (quindi non-booleane).&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si ha ambiguità lessicale, invece, quando una parola possiede più di un significato nella lingua a cui appartiene ([0026]), in tal caso la parola è definita ''polisemica''. In italiano, alcuni termini soggetti a questo tipo di ambiguità sono, ad esempio &amp;quot;''acuto''&amp;quot; o &amp;quot;''venti''&amp;quot;. È questo genere di ambiguità che risulta critico per il riconoscimento dei nominativi. La difficoltà determinata dalle ambiguità sintattiche, infatti, riguarda l'individuazione corretta di soggetti, predicati e complementi di un periodo, mentre le ambiguità lessicali ostacolano la comprensione del significato del singolo lessema. Nel processo di riconoscimento è irrilevante determinare la funzione logica che il nominativo svolge nella frase, mentre è necessario essere certi che i termini che compongono il nominativo siano effettivamente dei nomi propri di persona o dei cognomi, non altri vocaboli del lessico comune. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In linguistica, l'intervento con cui si toglie ambiguità a una parola o a una frase prende il nome di &amp;quot;disambiguazione&amp;quot; ([0027]). Il problema della disambiguazione automatica (in inglese ''Word Sense Disambiguation'' o, abbreviato, ''WSD'') riveste particolare importanza nelle ricerche sull'intelligenza artificiale e, in particolare, nell'elaborazione del linguaggio naturale. Si prevedono benefici della disambiguazione, ad esempio, in programmi di traduzione automatica, recupero dell'informazione o estrazione automatica di informazioni. Nell'analisi delle soluzioni esistenti in letteratura per la risoluzione delle ambiguità, ci si sofferma specialmente sulle ricerche incentrate sul trattamento dell'ambiguità lessicale, essendo essa la più rilevante per i nostri interessi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
La ''WSD'' richiede due input necessariamente: un dizionario per specificare i sensi che devono essere disambiguati e un corpus di dati linguistici da disambiguare. Nello scenario più realistico, si trattano testi le cui parole non sono note a priori e risulta molto onerosa la produzione del corpus, essendo infatti necessaria la valutazione di un operatore umano per verificare la correttezza delle disambiguazioni effettuate dagli algoritmi (''supervised learning'').&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Uno tra i principali dizionari semantici-lessicali utilizzati della lingua inglese è ''WordNet'' ([0029]), mentre alcuni dei database equivalenti che trattano l'italiano sono ''BabelNet'' ([0030]), ''ItalWordNet'' ([0031]) e ''MultiWordNet'' ([0032]).&lt;br /&gt;
Un elemento importante da considerare è che le prestazioni di disambiguazione per la lingua inglese, impiegando ''WordNet'', risultano corrette tra l'80% e il 90% delle volte ([0028]), percentuali discrete ma non sufficienti per avere la totale garanzia.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
I fattori che ostacolano la realizzazione di algoritmi di intelligenza artificiale per la disambiguazione sono molteplici:&lt;br /&gt;
# Differenze tra dizionari impiegati: i database prima citati si basano su varie fonti che raggruppano semanticamente in maniera diversa i vocaboli, quindi programmi sviluppati con dizionari diversi generalmente hanno performance differenti.&lt;br /&gt;
# Complessità della codifica di parte del discorso: per poter disambiguare correttamente un termine è importante riuscire a comprendere correttamente il contesto in cui è inserito, operazione non banale.&lt;br /&gt;
# Varianza tra giudici: i supervisori dell'apprendimento degli algoritmi possono avere opinioni diverse, o semplicemente sbagliare, nella valutazione delle disambiguazioni, ciò porta ad algoritmi che hanno comportamenti diversi.&lt;br /&gt;
# Impossibilità di applicare la disciplina della ''pragmatica'', ossia la logica del ''buon senso'': per identificare correttamente il senso di alcune parole, ad esempio nella comprensioni di anafore e catafore, è necessario applicare il buon senso.&lt;br /&gt;
# Dipendenza del senso delle parole dai contesti: ogni scenario richiede la propria divisione del significato delle parole in sensi rilevanti. In un contesto informatico, ad esempio, il termine &amp;quot;''mouse''&amp;quot; deve essere ricondotto al dispositivo di puntamento, non al cognome del celebre personaggio Disney ''Mickey Mouse''; viceversa dovrà invece avvenire in un contesto di letteratura a fumetti.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Laddove la ''WSD'' è una tecnica molto generale e che mira a risolvere un'ambiguità riguardante una qualunque parola, per le finalità del servizio oggetto di questa tesi è sufficiente risolvere le ambiguità dei nomi e dei cognomi. &lt;br /&gt;
Uno dei difetti che il servizio presenterebbe adottando un approccio ''WDS'' è legato alla impredicibile formattazione dei documenti, che aggiunge informazione semantica al testo ma introduce complessità nella individuazione automatica delle parti che formano il contesto; un altro difetto dipende dalla vastità del lessico da elaborare, essendo i documenti da trattare forniti dai più disparati utenti, su qualunque genere di argomento e relativi ai più vari ambiti.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La strategia che sarà adottata per risolvere la problematica del riconoscimento dei nominativi sarà impostata attraverso un modello ''pattern-based'', impiegando le ''regular expressions'' (''regex''). Esse risultano comunemente usate per effettuare operazioni di ricerca o sostituzione in un testo, di conseguenza se si riesce ad individuare un pattern associato ad un nominativo dato, allora sarà possibile processare il documento ricercando le occorrenze del nominativo e &amp;quot;minimizzarlo&amp;quot; opportunamente.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le ''regular expressions'' risultano particolarmente efficaci poiché, se opportunamente progettate, possono identificare un nominativo indipendentemente dal significato linguistico del contesto in cui è calato, basandosi piuttosto sui singoli caratteri che compongono i lessemi analizzati; permettono, di conseguenza, di effettuare una valutazione estremamente minuziosa, riducendo al minimo le possibilità di errori.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Un algoritmo di risoluzione ''pattern-based'' risulta, inoltre, più efficiente nell'esecuzione, in generale, di un algoritmo di intelligenza artificiale; per fornire la risposta il più velocemente possibile ad un utente, fruitore del servizio via web, l'approccio di riconoscimento tramite pattern è il più indicato.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Definizione dei pattern====&lt;br /&gt;
Nella progettazione del servizio si adotta, come detto, un approccio ''pattern-based'' per il riconoscimento dei nominativi. In linea di massima è opportuno che vengano riconosciuti più nominativi possibili e allo stesso tempo che la correttezza dell'identificazione di un nominativo sia garantita, quindi bisogna individuare dei pattern non troppo stringenti ma neppure troppo laschi. Per analizzare come i pattern devono essere strutturati si prende come caso di studio un generico nominativo, ad esempio ''Lorenzo Mario Amorosa''. Nel documento esso può comparire esattamente come appena indicato, ma anche in altre plausibili varianti, in cui l'ordine dei termini viene alterato, si pensi ad esempio ad &amp;quot;Amorosa Lorenzo Mario&amp;quot; o &amp;quot;Mario Lorenzo Amorosa&amp;quot;, o in altre varianti ancora in cui alcuni nomi non compaiono, come in &amp;quot;Lorenzo Amorosa&amp;quot;. Bisogna tuttavia supporre un limite alla variabilità: si osserva infatti che il cognome deve sempre comparire (il solo nome ''Lorenzo'' non è riconducibile a ''Lorenzo Mario Amorosa'') e che esso inoltre deve essere necessariamente anteposto o posposto, ma non interposto, ai nomi (è poco ragionevole ricondurre &amp;quot;Lorenzo Amorosa Mario&amp;quot; a &amp;quot;Lorenzo Mario Amorosa'').&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Questa prima specifica permette di ricondursi a una soluzione generale, sufficiente nella maggior parte dei casi, ma che non risolve alcune criticità. Un nominativo può, in alcuni documenti, comparire manifestandosi unicamente attraverso il cognome (riferendoci all'esempio precedente, ''Lorenzo Mario Amorosa'' apparirebbe nella forma ''Amorosa''). Sorge qui il problema che molti dei cognomi italiani hanno un significato proprio nel linguaggio comune; ad es., nella frase ''una relazione amorosa è bella'' è errato considerare la parola ''amorosa'' come cognome di un nominativo. Per risolvere questo genere di ambiguità si potrebbe pensare che per stabilire che il termine ''Amorosa'' sia un cognome sia sufficiente verificare che esso inizi con una lettera maiuscola, ma ciò può verificarsi anche perché la parola si trova ad inizio di frase. Inoltre, vari cognomi italiani possono iniziare con una lettera minuscola (''de Angelis'', ''d'Onofrio'', etc.), quindi basare l'identificazione di un cognome sul fatto che la sua prima lettera sia in maiuscolo non è in generale un metodo valido. Volendo in maniera prioritaria garantire il corretto funzionamento del servizio, e quindi attuare le procedure di anonimizzazione solo sui nominativi senza applicarle erroneamente ad altri termini, risulta necessario evitare il trattamento dei nominativi che si manifestano con i soli cognomi. Per via del contesto e dei significati che i cognomi possono assumere, infatti, risulta spesso impossibile distinguerli da parole del linguaggio comune. &lt;br /&gt;
&lt;br /&gt;
Ci si concentra, quindi, nello studio di nominativi composti da un cognome seguito o preceduto da uno o più nomi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si rappresenta dunque in formato di ''regular expression'' il pattern attualmente ideato. Per semplicità espositiva, si definisce il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; come l'insieme delle permutazioni di tutti i nomi del nominativo più l'insieme delle permutazioni di tutti i possibili sottoinsiemi di nomi del nominativo. Considerando il nominativo preso precedentemente come caso di studio, ad esempio, si avrebbe:&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt; &amp;lt;nomi&amp;gt; = Lorenzo Mario|Mario Lorenzo|Lorenzo|Mario&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Posto inoltre il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt; ad indicare il cognome contenuto nel nominativo e il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;regex&amp;gt;&amp;lt;/span&amp;gt; ad indicare la ''regular expression'' associata al nominativo, si ottiene:&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt; &amp;lt;regex&amp;gt; := &amp;lt;cognome&amp;gt; (&amp;lt;nomi&amp;gt;)|(&amp;lt;nomi&amp;gt;) &amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Una osservazione sottile ma di fondamentale importanza per la corretta progettazione delle ''regular expressions'' sta nella piena comprensione della semantica dell'operatore di scelta, espresso con il carattere ''pipe'' (&amp;quot;|&amp;quot;). Un qualunque ''engine'' di elaborazione delle ''regex'', infatti, interrompe la valutazione di una stringa non appena può stabilire se tale stringa fa match o meno con il pattern dato, senza quindi necessariamente valutarlo nella sua interezza, come parimenti avviene nelle valutazioni ''a corto circuito'' delle espressioni logiche nei linguaggi di programmazione. Ogni nominativo avrà a sè associato un pattern che lo rappresenta in più possibili sequenze di caratteri; per effettuare una corretta &amp;quot;minimizzazione&amp;quot; dei dati è necessario che le sequenze contenenti tutti i nomi sia poste per prime, mentre quelle contenenti un singolo nome per ultime.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In questa prima formulazione della ''regex'', inoltre, si è posto come separatore unicamente lo spazio bianco, ma alcuni documenti potrebbero contenere dei nominativi i cui termini sono separati da altri caratteri, come ad esempio una virgola nel caso di &amp;quot;Amorosa, Lorenzo Mario&amp;quot;. Per poter quindi identificare un nominativo anche in questi casi, si potrebbe considerare un qualunque carattere di interpunzione come possibile separatore dei termini del nominativo.&lt;br /&gt;
Adottando questa soluzione si ha però come effetto collaterale che risultano critici i casi in cui nel testo sono presenti dei nominativi soggetti ad omonimia. Si consideri una generica frase contenente una sequenza di nominativi, ad esempio ''Amorosa Lorenzo, Mario Giacomo e Fabio Rossi'', e si supponga che i nominativi da trattare siano ''Amorosa Lorenzo Mario'', ''Mario Giacomo'' (in cui la parola ''Mario'' è il cognome) e ''Fabio Rossi''. Gli ultimi due nominativi compaiono nella frase nella loro forma estesa, mentre il primo compare con il solo nome ''Lorenzo'' (eventualità possibile considerando la definizione del pattern precedentemente data). Considerando la virgola come carattere separatore dei termini del nominativo, la sequenza di parole ''Amorosa Lorenzo, Mario'' sarebbe ricondotta, venendo elaborata per prima, ad ''Amorosa Lorenzo Mario'', mentre rimarrebbe non trattata la parola ''Giacomo'', in quanto il cognome ''Mario'' che gli era associato è stato già identificato come un nome del nominativo ''Amorosa Lorenzo Mario'' ed il termine ''Giacomo'' preso singolarmente non rappresenta un nominativo.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Prima di valutare ulteriormente le problematiche relative alle omonimie, si possono scegliere due approcci per risolvere questo specifico caso:&lt;br /&gt;
# Si riconduce una sequenza di parole ad un nominativo se e solo se tutti i suoi nomi sono contenuti nella sequenza&lt;br /&gt;
# Si considerano come separatori dei termini contenuti nei nominativi solo spazi bianchi, tabulazioni e a capo, non gli altri segni di punteggiatura.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Entrambe le strategie sono valide, in quanto risolvono il problema garantendo la corretta identificazione dei nominativi, ma allo stesso tempo entrambe presentano lo svantaggio di ridurre le sequenze di parole riconducibili a dei nominativi, aumentando le possibilità che alcuni di essi non vengano trattati.&lt;br /&gt;
Si consideri nuovamente il nominativo preso come caso di studio ''Amorosa Lorenzo Mario'': applicando la prima strategia, non sarebbe possibile ricondurgli la sequenza ''Amorosa Lorenzo'', mentre applicando il secondo metodo non sarebbe riconducibile la sequenza ''Amorosa, Lorenzo Mario''.&lt;br /&gt;
Si decide di attuare la seconda strategia, in quanto è opportuno non imporre vincoli troppo stringenti sui nomi e poiché nella gran parte dei casi i termini dei nominativi nei documenti sono separati tra loro da caratteri quali spazi bianchi, tabulazioni ed a capo.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Un altro elemento su cui porre l'attenzione è la possibilità che i documenti da trattare contengano dei nominativi scritti interamente in maiuscolo o minuscolo, di conseguenza è conveniente che le ''regular expressions'' siano progettate ''case-insensitive''.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Un ulteriore punto su cui bisogna soffermarsi è la posizione all'interno di un periodo in cui un nominativo può comparire, in particolare si vogliono evitare quei casi critici in cui uno dei termini del nominativo è una sotto-stringa di un'altra parola del testo (si pensi ad ''amorosa'' in ''clamorosa''). Come regola generale si può stabilire che è sempre necessario che un nominativo sia preceduto e seguito da un ''carattere non alfabetico''. Un caso particolare si presenta quando il nominativo è posto ad inizio o a fine documento, situazione in cui quindi esso non è preceduto o non è seguito da alcun carattere: entrambe le posizioni sono da considerare corrette.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
È opportuno ora definire il concetto di ''carattere non alfabetico'', e ciò si può fare più facilmente ragionando sul problema in logica positiva; infatti risulta più semplice individuare quei caratteri che rappresentano lettere piuttosto che quelli che rappresentano segni di interpunzione ed individuare ogni altro carattere che non può mai comporre una parola.&lt;br /&gt;
&lt;br /&gt;
Inquadrando lo scenario di applicazione del servizio, molto probabilmente l'utente vorrà trattare un documento scritto nella lingua di uno dei paesi dell'Unione Europea, poiché il ''GDPR'' vige nei soli paesi membri dell'Unione.&lt;br /&gt;
Si può, quindi, ipotizzare che i documenti trattati possono sì contenere parole e nominativi stranieri, ma che i caratteri contenuti siano appartenenti all'alfabeto latino (''Latin script''), usato in molti stati nel mondo e da tutti i principali stati europei (fatta eccezione per la Grecia ed alcuni stati che scrivono in caratteri cirillici).&lt;br /&gt;
Inoltre, testi scritti in altri alfabeti, come esempio il cinese, l'arabo o il cirillico, vengono generalmente traslitterati. Considerare, quindi, ''caratteri non alfabetici'' tutti i caratteri diversi dalle lettere contenute nell'alfabeto latino sarebbe di conseguenza estremamente riduttivo ed inoltre in questo modo non si terrebbe conto delle lettere accentate, molto utilizzate anche nella lingua italiana.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(XXXX QUI IMG [0F00])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per risolvere il problema facciamo riferimento alla codifica standard Unicode dell'alfabeto latino ([0022]); in essa è possibile individuare, oltre ai caratteri rappresentanti le lettere nella codifica ''ASCII'' classica, i caratteri rappresentanti le lettere nella codifica standard ''ISO/IEC 8859-1'' ([0023]), encoding orientato principalmente alla rappresentazione delle lingue dell'Europa occidentale.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;i&amp;gt;Caratteri latini nei primi due blocchi dello standard Unicode&amp;lt;/i&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;nounderlines&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border-collapse:collapse&amp;quot;&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; &lt;br /&gt;
!style=&amp;quot;background:#ccf; text-align:center; font-weight: bold;&amp;quot;|U+&lt;br /&gt;
!style=&amp;quot;text-align:center; font-weight: bold;&amp;quot;|0||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|1||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|2||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|3||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|4||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|5||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|6||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|7||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|8||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|9||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|A||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|B||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|C||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|D||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|E||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|F||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|Block||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|#&lt;br /&gt;
|-&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|0040&lt;br /&gt;
|style=&amp;quot;background:#fff&amp;quot;|@||A||B||C||D||E||F||G||H||I||J||K||L||M||N||O&lt;br /&gt;
|rowspan=&amp;quot;4&amp;quot; style=&amp;quot;background:#fff&amp;quot; align:&amp;quot;center&amp;quot;|C0 Controls and Basic Latin&amp;lt;br&amp;gt;0000–007F&amp;lt;br&amp;gt;(identical to ASCII)&lt;br /&gt;
|rowspan=&amp;quot;4&amp;quot; style=&amp;quot;background:#fff&amp;quot;|52&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|0050&lt;br /&gt;
|P||Q||R||S||T||U||V||W||X||Y||Z||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#91;||style=&amp;quot;background:#fff&amp;quot;|\||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#93;||style=&amp;quot;background:#fff&amp;quot;|^||style=&amp;quot;background:#fff&amp;quot;|_&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|0060&lt;br /&gt;
|style=&amp;quot;background:#fff&amp;quot;|`||a||b||c||d||e||f||g||h||i||j||k||l||m||n||o&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|0070&lt;br /&gt;
|p||q||r||s||t||u||v||w||x||y||z||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#123;||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#124;||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#125;||style=&amp;quot;background:#fff&amp;quot;|~||style=&amp;quot;background:#fff; font-size:75%&amp;quot;|DEL&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;19&amp;quot;| &lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#fff&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00A0&lt;br /&gt;
|&amp;amp;nbsp;||¡||¢||£||¤||¥||¦||§||¨||©||ª||«||¬||||®||¯&lt;br /&gt;
|rowspan=&amp;quot;6&amp;quot; style=&amp;quot;background:#fff&amp;quot; align=&amp;quot;center&amp;quot;|C1 Controls and Latin-1 Supplement&amp;lt;br&amp;gt;0080–00FF&amp;lt;br&amp;gt;(identical to ISO/IEC 8859-1)&lt;br /&gt;
|rowspan=&amp;quot;6&amp;quot; style=&amp;quot;background:#fff&amp;quot;|62&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#fff&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00B0&lt;br /&gt;
|°||±||²||³||´||µ||¶||·||¸||¹||º||»||¼||½||¾||¿&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00C0&lt;br /&gt;
|À||Á||Â||Ã||Ä||Å||Æ||Ç||È||É||Ê||Ë||Ì||Í||Î||Ï&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00D0&lt;br /&gt;
|Ð||Ñ||Ò||Ó||Ô||Õ||Ö||style=&amp;quot;background:#fff&amp;quot;|×||Ø||Ù||Ú||Û||Ü||Ý||Þ||ß&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00E0&lt;br /&gt;
|à||á||â||ã||ä||å||æ||ç||è||é||ê||ë||ì||í||î||ï&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00F0&lt;br /&gt;
|ð||ñ||ò||ó||ô||õ||ö||style=&amp;quot;background:#fff&amp;quot;|÷||ø||ù||ú||û||ü||ý||þ||ÿ&lt;br /&gt;
|---- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I caratteri indicati in rosso nella tabella sono tutti i possibili ''caratteri alfabetici'' che compaiono nei documenti scritti in 29 lingue diverse ([0023]), tra le quali sono presenti l'italiano, l'inglese, lo spagnolo, il tedesco e il portoghese. &lt;br /&gt;
Aggiungendo pochi altri caratteri all'insieme dei ''caratteri alfabetici'' appena mostrati, si riesce a rappresentare ogni parola di altre 12 lingue ([0023]), tra cui il francese, l'olandese, il ceco e il turco.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
I caratteri mostrati in tabella corrispondono ad una parte dei primi due blocchi dello standard Unicode che codificano l'alfabeto latino e, come già accennato in precedenza, essi sono presenti negli standard ''ASCII'' e ''ISO/IEC 8859-1''. I rimanenti ''caratteri alfabetici'', invece, sono presenti in estensioni dello standard Unicode per il ''Latin script''. Queste estensioni sono state realizzate per fornire il massimo supporto a tutte le lingue e contenenti molti simboli ad uso speciale, come ad esempio per la rappresentazione dei fonemi. Si osserva, inoltre, che i ''caratteri alfabetici'' definiti nelle estensioni dello standard Unicode sono presenti anche nella codifica ''ISO/IEC 8859-2'' o nelle versioni successive ([0023]).&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Definiti i ''caratteri non alfabetici'' come elementi di separazione tra un nominativo ed il testo in cui esso è inserito, occorre definire opportunamente la ''regex'' che al nominativo è associata.&lt;br /&gt;
&lt;br /&gt;
Utili strumenti messi a disposizione dalle ''regular expressions'' sono i gruppi speciali ''lookahead'' e ''lookbehind''. Un pattern di un nominativo deve essere preceduto o seguito da una prestabilita sequenza di caratteri, la quale però non è parte del nominativo. Utilizzando i due costrutti citati, è possibile far sì che nell'elaborazione di una stringa facciano match solamente le parole effettivamente appartenenti al nominativo, non i caratteri che lo delimitano dal resto del testo, e allo stesso tempo che un nominativo faccia match se e solo se preceduto o seguito da una certa sequenza di caratteri. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per esprimere nella sintassi delle ''regex'' un carattere letterale in un qualunque alfabeto si può utilizzare il costrutto ''\p{L}'', che però risulta molto generale e troppo lasco per i requisiti considerati. Si può piuttosto valutare l'impiego del costrutto ''\p{Latin}'', il quale identifica un qualunque carattere alfabetico presente nell'alfabeto latino. Tra i caratteri corrispondenti al costrutto, però, ve ne sono alcuni che per le specifiche del servizio devono essere considerati ''caratteri non alfabetici'', come ad esempio i caratteri dei fonemi, i segni diacritici e gli indicatori ordinali; di conseguenza è necessario individuare una strategia ad hoc per risolvere questa problematica.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per chiarezza espositiva, si definisce il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;start&amp;gt;&amp;lt;/span&amp;gt;, per indicare un qualunque carattere non alfabetico o l'inizio stringa, il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;end&amp;gt;&amp;lt;/span&amp;gt;, per indicare un qualunque carattere non alfabetico o il fine stringa, ed il tag &amp;lt;extra&amp;gt;, per indicare i ''caratteri alfabetici'' non presenti negli standard ''ASCII'' o ''ISO/IEC 8859-1'':&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;extra&amp;gt; := ĿŀČčŘřŠšŽžĲĳŒœŸŐőŰűḂḃĊċḊḋḞḟĠġṀṁṠṡṪṫĀāĒēĪīŌōŪūİıĞğŞşẀẁẂẃŴŵŶŷǾǿẞ&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;start&amp;gt; := (?&amp;lt;=[^A-Za-zÀ-ÖØ-öø-ÿ&amp;lt;extra&amp;gt;]|^)&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;end&amp;gt; := (?=[^A-Za-zÀ-ÖØ-öø-ÿ&amp;lt;extra&amp;gt;]|$)&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva che si sono utilizzati i gruppi speciali prima descritti e che si sono inseriti i caratteri dello standard Unicode presentati in precedenza. Si definisce nuovamente la ''regular expression'' associata ad un generico nominativo. Applicando i tag appena definiti, il costrutto ''(?i)'' che rende il pattern ''case-insensitive'' ed il costrutto ''\s'' che rappresenta un carattere qualunque tra i separatori non visibili, ossia ''\r \n \t \f \v'' e lo spazio bianco, si ottiene:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;regex&amp;gt; := (?i)(&amp;lt;start&amp;gt;&amp;lt;cognome&amp;gt;\s+(&amp;lt;nomi&amp;gt;)|(&amp;lt;nomi&amp;gt;)\s+&amp;lt;cognome&amp;gt;&amp;lt;end&amp;gt;)&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva, inoltre, che in questa nuova formulazione della ''regular expression'' i nomi sono da intendersi separati tra loro da ''\s+''.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
A questo punto si è quasi giunti alla formulazione finale del pattern da associare ad un nominativo, rimangono solo da trattare alcuni casi critici non ancora risolti.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt; &lt;br /&gt;
Si è già presentato in precedenza il problema legato al fatto che alcuni cognomi possono avere un significato proprio nel lessico comune e che ciò costringeva, quindi, ad abbandonare l'idea di trattare nominativi formati dal solo cognome. Questa problematica di ambiguità si presenta anche con alcuni nomi (si pensi, ad esempio, al nome ''Gioia''). Ciò non rappresenta generalmente un problema, in quanto la coppia nome-cognome che forma il nominativo, presa complessivamente, non è soggetta ad ambiguità. Esistono, però, dei casi in cui questo non è vero. Si prenda in analisi il nominativo ''Gioia Grande'': risulta evidentemente soggetto a rischio di ambiguità. Una soluzione che si può adottare, per risolvere questo caso critico, si basa sull'associazione di un pattern più stringente ai nominativi. In particolare, si osserva che i nomi propri di persona compaiono sempre ed obbligatoriamente, in un documento grammaticalmente corretto, con la prima lettera maiuscola ([0024]). I cognomi, invece, non sono soggetti ad una regola così stringente: un cognome iniziante con una lettera minuscola (come ''de Rosa'') in alcuni casi, ad esempio se posto dopo un punto fermo, può comparire scritto con la prima lettera sia maiuscola che minuscola; naturalmente, in nessuna occorrenza un cognome che inizi con una lettera maiuscola potrà comparire con una minuscola. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Occorre quindi ridefinire, alla luce di queste osservazioni, la ''regex'' associata ad un nominativo, poiché precedentemente era stata posta interamente ''case-insensitive''. Nel pattern, in particolare, i nomi dovranno sempre iniziare con una maiuscola, mentre i cognomi avranno questo vincolo solo se nel nominativo compaiono con la prima lettera maiuscola. Si mostra quindi quali sono i tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; e &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt; associati a due nominativi, ad esempio ''Gioia Grande'' e ''Antonio de Rosa''. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per ''Gioia Grande'' si ha:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt; = G((?i)ioia)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt; = G((?i)rande)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per ''Antonio de Rosa'' si ha:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt; = A((?i)ntonio)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt; = (?i)de Rosa&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si presenta dunque la definizione finale del tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;regex&amp;gt;&amp;lt;/span&amp;gt;. Nella definizione il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; è definito il base al numero di nomi del nominativo ed il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt; è definito in base al carattere iniziale del cognome.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;regex&amp;gt; := &amp;lt;start&amp;gt;&amp;lt;cognome&amp;gt;\s+(&amp;lt;nomi&amp;gt;)|(&amp;lt;nomi&amp;gt;)\s+&amp;lt;cognome&amp;gt;&amp;lt;end&amp;gt;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Vengono inoltre mostrati i valori dei due tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; e &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt; per il nominativo preso come caso di studio in fase iniziale, ossia ''Amorosa Lorenzo Mario''. Si ottiene:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt; = L((?i)orenzo)\s+M((?i)ario)|M((?i)ario)\s+L((?i)orenzo)|L((?i)orenzo)|M((?i)ario)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt; = A((?i)morosa)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Infine, per completezza, viene mostrata la ''regular expression'', associata a quest'ultimo nominativo, risolvendo tutti i tag che la compongono:&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;regex&amp;gt; = (?&amp;lt;=[^A-Za-zÀ-ÖØ-öø-ÿĿŀČčŘřŠšŽžĲĳŒœŸŐőŰűḂḃĊċḊḋḞḟĠġṀṁṠṡṪṫĀāĒēĪīŌōŪūİıĞğŞşẀẁẂẃŴŵŶŷǾǿẞ]|^)(A((?i)morosa)\s+(L((?i)orenzo)\s+M((?i)ario)|M((?i)ario)\s+L((?i)orenzo)|L((?i)orenzo)|M((?i)ario))|(L((?i)orenzo)\s+M((?i)ario)|M((?i)ario)\s+L((?i)orenzo)|L((?i)orenzo)|M((?i)ario))\s+A((?i)morosa))(?=[^A-Za-zÀ-ÖØ-öø-ÿĿŀČčŘřŠšŽžĲĳŒœŸŐőŰűḂḃĊċḊḋḞḟĠġṀṁṠṡṪṫĀāĒēĪīŌōŪūİıĞğŞşẀẁẂẃŴŵŶŷǾǿẞ]|$)&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Gestione delle omonimie====&lt;br /&gt;
&lt;br /&gt;
Nei ragionamenti che hanno portato alla formulazione della ''regular expression'' associata ai nominativi, si è tenuto conto di possibili ambiguità con termini appartenenti al linguaggio comune, risolte con l'introduzione nel pattern di stringhe ''case-sensitive'', e di possibili nominativi posti in sequenza parzialmente omonimi (ossia aventi un nome o il cognome in comune tra loro), gestite con l'imposizione dei soli caratteri separatori non visibili come delimitatori delle parole componenti un nominativo. Per rendere l'analisi completa occorre valutare come ci si debba comportare in altri possibili casi di omonimia. Si osserva, per inciso, che nel pattern individuato nella sezione precedente il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; è stato l'unico non definito formalmente. La definizione di tale tag infatti dipende, oltre che dai nomi del nominativo, anche dall'insieme complessivo dei nominativi da trattare presenti nel documento.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Il caso più semplice di omonimia, che si verifica quando un solo nome o il solo cognome di un nominativo coincide con un nome o il cognome di un altro (come nel caso di ''Lorenzo Mario Amorosa'' e ''Stefano Amorosa''), risulta già ben gestito dall'attuale formulazione del pattern. Infatti, un riconoscimento è determinato quando almeno un nome e il cognome del nominativo appaiono in sequenza.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Il problema si complica quando un nominativo ha due o più componenti in comune con un altro. Si osserva che se l'omonimia riguarda solo i nomi dei nominativi, ciò non risulta problematico, in quanto il cognome, supposto sempre presente nel pattern, funge da elemento di disambiguazione. Si considera da ora, quindi, che i nominativi abbiano il medesimo cognome e si analizzano i casi in cui anche uno o più nomi risultano in comune, attraverso degli esempi: &lt;br /&gt;
* Nomi_A = {&amp;quot;Lorenzo&amp;quot;, &amp;quot;Mario&amp;quot;, &amp;quot;Luca&amp;quot;}; Nomi_B = {&amp;quot;Stefano&amp;quot;, &amp;quot;Mario&amp;quot;}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F01])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In questo caso sono elementi di disambiguazione i nomi ''Lorenzo'' e ''Luca'' per il primo nominativo e ''Stefano'' per il secondo, bisognerà quindi far sì che almeno uno tra tali nomi compaia sempre nelle ''regex'' associate ai nominativi in questione. L'occorrenza ''Mario &amp;lt;cognome&amp;gt;'' rimane ambigua e non può essere trattata.&lt;br /&gt;
* Nomi_A = {&amp;quot;Lorenzo&amp;quot;, &amp;quot;Mario&amp;quot;, &amp;quot;Luca&amp;quot;}; Nomi_B = {&amp;quot;Mario&amp;quot;, &amp;quot;Luca&amp;quot;}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F02])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
L'insieme Nomi_B risulta un sottoinsieme di Nomi_A, di conseguenza solo il primo nominativo presenta degli elementi utili per risolvere l'ambiguità. Nel pattern relativo al primo nominativo dovrà essere presente almeno un tra i nomi non in comune, mentre il pattern del secondo nominativo rappresenterà inevitabilmente espressioni ambigue poiché riconducibili all'altro. Le soluzioni possibili sono due: rifiutarsi di effettuare il trattamento del secondo nominativo oppure decretare che esso è riconosciuto se e solo se appare nella sua forma estesa, presentando quindi tutti i nomi. Quest'ultima soluzione è ragionevole e la si sceglie, poiché così si aumentano, per quanto possibile, le sequenze &amp;quot;minimizzabili&amp;quot;, e viene inoltre messo in conto di informare l'utente opportunamente sulla gestione di questo genere di omonimia per rendere le operazioni trasparenti.&lt;br /&gt;
* Nomi_A = Nomi_B = {&amp;quot;Lorenzo&amp;quot;, &amp;quot;Mario&amp;quot;, &amp;quot;Luca&amp;quot;}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F03])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Qualora l'insieme dei nomi dei due nominativi sia identico risulta impossibile distinguerli e non possono in alcun modo essere trattati, poiché l'ordine con cui compaiono i nomi di un nominativo non rappresenta un elemento di disambiguità. I dati appartenenti a persone completamente omonime contenuti in uno stesso documento, quindi, non sono &amp;quot;minimizzabili&amp;quot; distintamente.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva che è di fondamentale importanza che i documenti che gli utenti forniscono siano grammaticalmente corretti, in quanto un errato uso dei segni di interpunzione può rendere impossibile l'applicazione delle ''regular expression''. Si prenda ad esempio una sequenza anomala di caratteri in cui non è corretto l'uso delle virgole, come &amp;quot;''Amorosa Mario Rossi Giacomo''&amp;quot;: supponendo che nel documento si vogliano trattare i nominativi ''Amorosa Mario'', ''Rossi Mario'' e ''Rossi Giacomo'', risulta impossibile identificare quali tra questi siano rappresentatati nella sequenza.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In conclusione, risultano quindi individuate le strategie che permettono di formulare ''regular expressions'' anche per i nominativi soggetti ad omonimia.&lt;br /&gt;
&lt;br /&gt;
====Formattazione dei documenti====&lt;br /&gt;
 &lt;br /&gt;
I documenti prodotti in enti ed organizzazioni presentano generalmente formattazioni e non sono puramente testuali. Si vuole qui considerare quale debbano essere le interpretazioni più adatte da dare agli elementi grafici per rendere sempre efficace il riconoscimento dei nominativi. In particolare, quindi, non si tratteranno gli elementi di punteggiatura, come parentesi o virgolette, poiché già compresi nelle ''regex'', bensì tutti gli elementi che in un pattern composto da caratteri non sono espressi. Si inizia dunque la rassegna:&lt;br /&gt;
* Elementi di formattazione del testo&lt;br /&gt;
I font, la dimensione dei caratteri, il grassetto, il corsivo, l'evidenziazione e tutti i possibili elementi di modifica della apparizione grafica del testo non alterano il significato dei lessemi coinvolti. Se il cognome di un nominativo è posto in grassetto ed il nome no, ad esempio, la coppia nome-cognome rappresenta sempre il nominativo iniziale; lo stesso vale per gli altri elementi citati.&lt;br /&gt;
* Aree di comparizione del testo&lt;br /&gt;
In genere ogni documento è formato da più sezioni, ha un corpo principale ed eventuali titoli, note a piè pagina, intestazioni ed altre possibili aree. Il trattamento di &amp;quot;minimizzazione&amp;quot;, secondo il ''GDPR'', deve essere effettuato al documento in ogni sua parte, ma ogni sezione deve essere elaborata in maniera indipendente dalle altre sezioni in quanto rappresenta un blocco logico a sé. Ciò significa che, ad esempio, bisogna individuare eventuali nominativi presenti nel titolo, ma non bisogna considerare nominativo una sequenza di parole che è posta in parte nel titolo e in parte nel primo paragrafo del testo.&lt;br /&gt;
* Elementi blocco&lt;br /&gt;
Gli elementi blocco, come ad esempio le immagini, possono causare un'interruzione netta in un paragrafo, suddividendolo quindi in più blocchi logici, che devono essere analizzati separatamente; tuttavia nel caso in cui questi elementi siano posti ''fluttuanti'', ossia ancorati ai bordi della pagina, il testo scorre in un unico flusso e forma quindi un unico blocco logico.&lt;br /&gt;
* Divisione in sillabe&lt;br /&gt;
Un problema rilevante nella formattazione del documento è che spesso, per esigenze estetiche, contiene delle parole divise in sillabe poste su righe diverse e separate da un trattino. Ovviamente se un nome va a capo a fine linea non perde il suo significato semantico, bisognerà quindi continuare a riconoscerlo.&lt;br /&gt;
* Tabelle&lt;br /&gt;
Molti documenti, specialmente quelli contenenti ingenti quantità di nominativi, possono essere strutturati in forma tabellare. Trascurando una trattazione per esteso delle modalità con cui i nominativi potrebbero comparire nelle tabelle, si considera esclusivamente il caso di gran lunga più ricorrente. In genere, infatti, in una tabella contenente dei nominativi, essi sono presenti nella stessa colonna o in colonne contigue: l'una contenente i nomi, l'altra il cognome, o viceversa. Senza basarsi sull'intestazione delle colonne, si può valutare se il contenuto di due celle adiacenti poste su di una stessa riga faccia match con il pattern di un nominativo, ed in caso ciò accada si può affermare la coppia di celle individuata rappresenta un nominativo.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva che si sono fornite solamente le interpretazioni più plausibili e comuni a questi elementi grafici e non si è ideato alcun particolare algoritmo per la loro elaborazione. L'espressione di tali strutture, infatti, è fortemente determinata dal formato in cui il documento è redatto. Si rimanda, quindi, ai capitoli successivi per specificazioni ulteriori della soluzione. Occorre notare, infine, che gli elementi di formattazione non sono descritti da stringhe nel formato delle ''regular expressions'': bisognerà quindi integrare gli elementi presentati in questa sezione con l'approccio ''pattern-based'' adottato.&lt;br /&gt;
&lt;br /&gt;
===Analisi dell'usabilità===&lt;br /&gt;
&lt;br /&gt;
====Elenco dei nominativi da trattare esplicitamente espressi come dati in input====&lt;br /&gt;
&lt;br /&gt;
In questo caso, per usufruire del servizio, l'utente deve fornire un documento contenente una serie di nominativi da trattare. Una garanzia della corretta elaborazione del documento si ha richiedendo all'utente stesso quali siano i nominativi da trattare: in questo modo potranno essere &amp;quot;minimizzati&amp;quot; i dati (cioè i nominativi) di tutte e sole le persone espressamente richieste. In molti plausibili scenari, infatti, è necessario anonimizzare solo alcuni dei nominativi presenti nel documento; ad esempio in un atto giudiziario serve anonimizzare le parti in causa ma non i magistrati. &lt;br /&gt;
&lt;br /&gt;
Questa configurazione del servizio permette quindi all'utente di avere il massimo controllo possibile del risultato. Tuttavia questo approccio è poco pratico nel caso in cui i documenti da trattare contengano grandi quantità di nominativi diversi e, magari, l'utente che ne richiede il trattamento non li conosce; si pensi ad esempio a lunghe graduatorie di concorsi o altro. Si osserva inoltre che anche per pochi nominativi l'usabilità può degradare, se l'inserimento viene fatto con estemporanea digitazione, esposta anche al rischio di possibili errori di battitura, con conseguenti noiose ripetizioni delle operazioni.&lt;br /&gt;
&lt;br /&gt;
Si osserva, infine, che il sistema progettato è sufficientemente robusto nel trattare i nominativi in input espressi da un utente che ha digitato caratteri maiuscoli o minuscoli violando le convenzioni grammaticali. Supposto che il documento trattato debba essere grammaticalmente corretto, infatti, si ha la garanzia che i nomi ivi presenti comincino con una maiuscola; è sufficiente, quindi, forzare una conversione ''to-upper-case'' dei nomi inseriti dall'utente e le ''regex'' progettate funzionano correttamente. Un discorso a parte va fatto per i cognomi inseriti dall'utente, in quanto essi possono comparire con la prima lettera sia maiuscola che minuscola. L'inserimento di un cognome iniziante con una minuscola non crea grossi problemi, in quanto in tal caso la ''regex'' risultante sarebbe totalmente ''case-insensitive'' per il cognome, mentre l'aggiunta di un cognome cominciante con una maiuscola determina una ''regex'' ''case-insensitive'' per la prima lettera del cognome; qualora quindi un utente inserisse un nominativo tutto in maiuscolo, le occorrenze del cognome, presenti nel documento, inizianti con una lettera minuscola non verrebbero riconosciute.&lt;br /&gt;
Per le altre lettere dopo la prima, sia per i nomi che per i cognomi, il pattern è stato progettato ''case-insensitive'', quindi non emergono problemi. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In sintesi, il rischio che vengano introdotte delle ambiguità lessicali, incaricando l'utente dell'inserimento dei nominativi, è piuttosto basso ed il controllo che si ha sui nominativi è il massimo desiderabile, mentre i requisiti di usabilità risultano penalizzati.&lt;br /&gt;
&lt;br /&gt;
====Elenco dei nominativi da trattare dedotti automaticamente da un dizionario====&lt;br /&gt;
&lt;br /&gt;
Se si desidera privilegiare la tematica dell'usabilità nella progettazione del servizio, risulta necessario individuare delle strategie che semplifichino il più possibile i compiti che devono essere svolti dall'utente. L'unica operazione che inevitabilmente resta a suo carico è l'upload del documento da trattare; non è infatti necessario richiedergli l'elencazione dei nominativi dei nominativi da trattare, in quanto questi possono essere dedotti automaticamente impiegando dei dizionari, dei quali va quindi valutato il contenuto e le modalità di utilizzo. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si scarta subito l'ipotesi di dedurre automaticamente i nominativi basandosi unicamente sul fatto che le iniziali di nomi e cognomi siano maiuscole; come già argomentato infatti l'uso delle lettere maiuscole non è limitato solo a questi usi e, inoltre, non si può avere la certezza che un cognome inizi con una maiuscola.&lt;br /&gt;
&lt;br /&gt;
Sono disponibili fortunatamente alcuni dizionari di nomi ed altri di cognomi, in diverse lingue; si fa qui riferimento a quelli di &amp;quot;Data World&amp;quot; (un'azienda focalizzata sulla raccolta, produzione e pubblicazione di dataset: https://data.world) ([0037]).&lt;br /&gt;
&lt;br /&gt;
Si inizia l'analisi inquadrando le dimensioni che un dizionario contenente nomi o cognomi avrebbe. Risalta subito all'occhio la differenza tra il numero di termini contenuti nei due casi: facendo riferimento ai soli nomi e cognomi italiani, risultano esistenti circa 350.000 cognomi ([0036]) e circa 9.000 nomi, dei quale circa 5.000 maschili e circa 4.000 femminili ([0037]); il numero dei cognomi è quindi quasi 40 volte più grande del numero dei nomi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si ipotizza, per chiarire le idee, di applicare questi dizionari in uno scenario reale, in cui, ad esempio, si vuole trattare un documento di 10 pagine contenente 5.000 parole. Si trascurano inoltre i meccanismi che permettono di ricondurre un nome od un cognome ad un nominativo per concentrarsi unicamente sul numero di confronti necessari da effettuare nell'elaborazione. Nel peggiore dei casi possibili, ossia quando nessuna parola del documento compare tra i termini del dizionari, e dove occorre quindi confrontare ogni singola parola del documento con tutti i termini del dizionario, per semplice moltiplicazione si ottiene che l'impiego di un dizionario di nomi darebbe luogo a 45.000.000 confronti, mentre un dizionario di cognomi ben a 1.750.000.000 confronti. Se invece le parole nel documento fossero 50.000 si avrebbero 450.000.000 di confronti nel primo caso e 10.750.000.000 nel secondo. In sintesi, sebbene il rapporto tra il numero di confronti nei due casi rimanga sempre costante (circa 1:40) indipendentemente dalla lunghezza del documento, la differenza tra il numero di confronti cresce proporzionalmente al numero di parole che vengono sottoposte all'elaborazione. Per quantificare, infine, attraverso un unità di tempo, la differenza esistente tra l'impiego delle due diverse tipologie di dizionario, si realizza un semplice programma java, di cui si riporta qui sotto il contenuto del metodo principale, che realizza i confronti necessari attraverso l'uso di ''regular expression'':&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
final String regex = &amp;quot;\bLorenzo\b&amp;quot;;&amp;lt;br/&amp;gt;&lt;br /&gt;
final String string =  ... //testo di prova&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);&amp;lt;br/&amp;gt;&lt;br /&gt;
final Matcher matcher = pattern.matcher(string);&amp;lt;br/&amp;gt;&lt;br /&gt;
int start, total;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
start = System.currentTimeMillis();&lt;br /&gt;
while (matcher.find()) {&lt;br /&gt;
    System.out.println(&amp;quot;Full match: &amp;quot; + matcher.group(0));&lt;br /&gt;
    for (int i = 1; i &amp;lt;= matcher.groupCount(); i++) {&lt;br /&gt;
        System.out.println(&amp;quot;Group &amp;quot; + i + &amp;quot;: &amp;quot; + matcher.group(i));&lt;br /&gt;
    }&lt;br /&gt;
} &amp;lt;br/&amp;gt;&lt;br /&gt;
total = System.currentTimeMillis() - start;&lt;br /&gt;
System.out.println(&amp;quot;Total: &amp;quot; + total + &amp;quot; ms&amp;quot;);&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Eseguendo il test più volte, inserendo fino a 10 occorrenze della parola &amp;quot;Lorenzo&amp;quot; nel testo, si ha un tempo di elaborazione medio di circa 3 ms, con prestazioni di picco di 2 ms, ottenibili con poche occorrenze del nome presenti, e tempo di attesa massimo di 6 ms, dovuto alla presenza invece a una presenza più frequente del nome nel testo.&lt;br /&gt;
Questo fenomeno si comprende meglio ricordando che, come spiegato nel capitolo precedente, le ''regular expressions'' ottimizzano la ricerca, considerano le stringhe del testo trattato solo finché necessario, ossia fino a quando non vi è certezza che esse corrispondano o non corrispondano ad un match. Ogni volta che nel testo si presenta una parola che inizia con una lettera diversa dalla 'L' di &amp;quot;Lorenzo&amp;quot;, la ricerca procede direttamente con la valutazione della parola successiva, ignorando i rimanenti caratteri della parola. &lt;br /&gt;
&lt;br /&gt;
Risulta, invece, più onerosa la verifica della corrispondenza tra una stringa ed il pattern desiderato, poiché in questo caso vanno elaborati tutti i caratteri della parola. Come caso limite, si è posta come stringa da elaborare la sequenza di caratteri &amp;quot;Lorenzo &amp;quot; ripetuta 500 volte: il tempo di esecuzione medio del programma risultante, a parità di piattaforma, è stato di circa 25 ms.&lt;br /&gt;
&lt;br /&gt;
Un'altra diretta conseguenza di questo meccanismo di confronto è che all'aumentare del numero di parole nel documento non corrisponde un eccessivo aumento del tempo di esecuzione: considerando un documento di 5000 parole, con 0 occorrenze del nome &amp;quot;Lorenzo&amp;quot; il tempo di esecuzione medio risulta di 9 ms, con 10 occorrenze di 10 ms, con 100 occorrenze di 15 ms.&lt;br /&gt;
&lt;br /&gt;
Occorre precisare, prima di formulare ulteriori ragionamenti, che in documento di 5.000 parole potranno essere presenti al più 2500 coppie nome-cognome; in un dizionario con più di 2.500 termini almeno uno di questi non contribuirà nell'individuazione di un nominativo. Se poi sono presenti altre parole oltre ai nominativi nel documento, la percentuale di nomi che presenterà 0 occorrenze crescerà di conseguenza. Ad ogni modo, si sceglie di sviluppare i ragionamenti considerando necessario il tempo medio di 10 ms per individuare le occorrenze di un termine di un dizionario in un documento di 5.000 parole; questo tempo è sicuramente maggiore rispetto al caso reale, ma valutando per eccesso questo valore è possibile trascurare il tempo impiegato nelle altre operazioni di routine a supporto dell'algoritmo di ricerca.&lt;br /&gt;
&lt;br /&gt;
Ritornando all'esempio di partenza, considerando quindi necessari 10 ms per individuare le occorrenze di un termine di un dizionario in un documento di 5.000 parole, risulta che l'identificazione di tutti i cognomi contenuti nel testo richieda circa 3.500 secondi, (quasi un'ora!), mentre l'individuazione dei nomi &amp;quot;solo&amp;quot; 90 secondi.&lt;br /&gt;
I tempi di attesa che l'utente dovrebbe aspettare sono estremamente elevati e irragionevoli, specialmente se calati nel contesto nelle ''web application''. Come primo espediente per ovviare al problema si decide di abbandonare completamente l'idea di impiegare un dizionario di cognomi, in quanto, seppur si individuassero delle soluzioni in grado di effettuare il riconoscimento di tutte le occorrenze di un termine in un documento indipendentemente dalla lunghezza in solo 1 ms (irreale), sarebbero comunque necessari 3 minuti e 50 secondi per l'elaborazione. Non verranno quindi neppure trattate possibili soluzioni che prevedono l'applicazione di entrambi i dizionari.&lt;br /&gt;
&lt;br /&gt;
I 90 secondi richiesti dal dizionario di nomi, invece, risultano anch'essi eccessivi, ma attraverso opportune valutazioni si possono individuare delle strategie che consentono la minimizzazione del tempo necessario all'elaborazione dei documenti. Tali metodi di ottimizzazione saranno trattati in un successivo capitolo, mentre ora ci si continua a concentrare sulle modalità di impiego del dizionario.&lt;br /&gt;
&lt;br /&gt;
Per inciso, si osserva che i problemi di efficienza sono strettamente legati al riconoscimento automatico dei nominativi, in quanto in questo caso devono essere applicate quasi una decina di migliaia di ''regex'' diverse; nel caso in cui i nominativi da elaborare e le ''regex'' a loro associate siano noti, si ha a che fare con un numero esiguo di pattern da trattare e l'esecuzione del programma risulta infinitamente più rapida.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per migliorare l'efficacia del servizio sarebbe opportuno introdurre nel dizionario anche nomi stranieri, sempre più diffusi in una società sempre più globalizzata. Il tempo di esecuzione medio del riconoscimento, già critico, crescerebbe ulteriormente: si decide allora di introdurre nel dizionario i soli nomi inglesi, in totale quasi 5500 ([0037]). Considerando sempre un tempo medio di esecuzione di 10 ms per nome, con un dizionario di circa 14.500 termini si avrebbe un tempo di esecuzione medio complessivo di 145 secondi, ossia pari a 2 minuti e 25 secondi, e risulta ancora possibile effettuare alcune ottimizzazioni che lo riducono ad un livello accettabile.&lt;br /&gt;
&lt;br /&gt;
Una volta individuati i nomi contenuti nel documento occorre stabilire se essi fanno parte di un nominativo, progettando un'opportuna ''regular expression''. È importante notare che per conseguire questo scopo bisogna individuare la soluzione più efficiente possibile.&lt;br /&gt;
&lt;br /&gt;
Un nominativo, come già ripetuto più volte, è composto da uno o più nomi e da un cognome. Individuato un nome, la priorità che si ha è verificare se accanto ad esso sia presente un cognome. Finora i cognomi sono stati supposti non regolamentati da alcun pattern specifico, ma è necessario formularne almeno uno per consentirne il riconoscimento automatico. È ragionevole supporre che un cognome sia formato da massimo due parole, separate da spazio o apostrofo, sempre inizianti entrambe con una maiuscola, fatta eccezione per la prima parola laddove essa sia una preposizione semplice o articolata oppure un articolo, tenendo conto dei possibili troncamenti, come &amp;lt;i&amp;gt;d'&amp;lt;/i&amp;gt; e &amp;lt;i&amp;gt;dell'&amp;lt;/i&amp;gt;. Inoltre per verificare se un termine adiacente al nome trovato rappresenti un nome si evita di impiegare nuovamente il dizionario per non gravare ulteriormente sul tempo di esecuzione. Inoltre, si nota che avendo supposto un cognome composto da massimo due parole inizianti con una lettera maiuscola, un altro nome, oltre quello trovato dal dizionario, viene già automaticamente riconosciuto qualora il cognome sia composto da una sola parola. Rinunciando ad individuare nominativi composti da tre nomi o più, si formula una ''regular expression'' per il riconoscimento automatico in seguito al identificazione di un nome, qui indicato con il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nome&amp;gt;&amp;lt;/span&amp;gt;, supponendo il cognome come precedentemente indicato e ipotizzando la presenza di un ulteriore nominativo.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;prep&amp;gt; := d((a|e)(l(l[aeo]?)?|i|gli?)?|i)?|(ne|a|su)(l(l[aeo]?)?|i|gli)?|l[aeo]?|co[iln]?|i[ln]?|gli|per&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cognome&amp;gt; := (([A-Z][a-zA-ZÀ-ÖØ-öø-ÿ]*|&amp;lt;prep&amp;gt;)('|\s))?[A-Z][a-zA-ZÀ-ÖØ-öø-ÿ]+&lt;br /&gt;
&lt;br /&gt;
&amp;lt;second_name&amp;gt; := [A-Z][a-zA-ZÀ-ÖØ-öø-ÿ]+&lt;br /&gt;
&lt;br /&gt;
&amp;lt;regex&amp;gt; := (&amp;lt;second_name&amp;gt;\s)?(&amp;lt;nome&amp;gt;)\s&amp;lt;cognome&amp;gt;|&amp;lt;cognome&amp;gt;\s(&amp;lt;nome&amp;gt;)(\s&amp;lt;second_name&amp;gt;)?&lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Nella scrittura della ''regex'' si è prestata particolare attenzione all'utilizzo della simbologia per rendere l'espressione il più performante possibile, attraverso il massimo sfruttamento dei cortocircuiti logici e l'opportuno ordinamento dei caratteri (sono stati anteposti i caratteri comuni a più preposizioni od articoli). Inoltre, per alleggerire la ''regex'' si è rinunciato all'utilizzo dei caratteri dell'alfabeto latino non appartenenti ai primi due blocchi Unicode.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
È mostrata in figura la corretta elaborazione di 57 possibili casi di cognomi diversi&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F04])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva tuttavia che in alcune circostanze, come nella frase &amp;quot;''di Amorosa Lorenzo non si hanno notizie''&amp;quot;, accade che un parola (&amp;quot;''di''&amp;quot; in questo caso), non sia parte del cognome ma il programma non è in grado di riconoscerlo. Questa ambiguità è fortemente dipendente dal contesto e non è possibile trattarla senza significativi degradi delle performance; quindi è necessario rinunciare a trattarla, accettando riconoscimenti erronei. In altre situazioni, invece, dove magari si sta elaborando la stringa contenente il nominativo ''Mario Lorenzo'', risulta impossibile determinare quale tra i due termini sia il nome e quale il cognome; cioè significa che l'unico trattamento di &amp;quot;minimizzazione&amp;quot; automatico che risulta ragionevole applicare è la sostituzione del nominativo con uno pseudonimo, non il troncamento o l'alterazione dei nomi.&lt;br /&gt;
In conclusione, con il riconoscimento automatico dei nominativi si migliora complessivamente l'usabilità del servizio, in quanto l'utente non deve digitare i nominativi, ma la latenza introdotta è notevole, si è soggetti a rischi di ambiguità e non è in alcun modo esprimibile la preferenza su quali nominativi si desidera &amp;quot;minimizzare&amp;quot; o meno. La soluzione così ideata non risulta quindi adeguata.&lt;br /&gt;
&lt;br /&gt;
====Soluzione ibrida adottata====&lt;br /&gt;
Entrambe le tipologie di riconoscimento prima individuate hanno significativi problemi, si cerca quindi di sintetizzare una soluzione in grado di trarre i vantaggi dell'una e dell'altra. Risulta efficace, in particolare, che il documento venga inizialmente trattato tramite dizionari, evitando all'utente l'onere di specificare i nominativi, e che in seguito venga lasciata all'utente la possibilità di intervenire.&lt;br /&gt;
Infatti, esso potrebbe voler esprimere delle preferenze su quali nominativi debbano essere trattati tra quelli individuati e gestire gli eventuali errori di riconoscimento dovuti a richieste di trattamento di nominativi aventi un nome non presente nel dizionario o anche dovuti a casi di ambiguità lessicale già presentati.&lt;br /&gt;
&lt;br /&gt;
Una volta inserito il documento e terminata l'elaborazione tramite il dizionario, l'utente può sia richiedere l'immediato download del file ed effettuare le operazioni prima definite, attraverso un'opportuna interfaccia. Per fornire il supporto alle esigenze più disparate, si prevede la possibilità di:&lt;br /&gt;
# eseguire download del file trattato unicamente con il dizionario&lt;br /&gt;
# ripetere la &amp;quot;minimizzazione&amp;quot; del documento, specificando:&lt;br /&gt;
## nuovi nominativi&lt;br /&gt;
## quali nominativi tra quelli precedentemente individuati ''non'' si vogliono trattare&lt;br /&gt;
## quale parola/e dei nominativi individuati rappresenta il cognome (in tal caso, si possono utilizzare altri metodi, oltre alla sostituzione con pseudonimo, per il trattamento)&lt;br /&gt;
## quale parola/e dei nominativi individuati non compone il nominativo (situazione che si verifica quando ci si imbatte in una ambiguità).&lt;br /&gt;
&lt;br /&gt;
Senza soffermarsi in questo momento sull'intera sequenza concreta di interazioni tra utente e servizio, si osserva che l'unico vincolo non funzionale da valutare resta il tempo medio di attesa dell'utente. L'usabilità complessiva è molto buona ed i vincoli funzionali sono soddisfatti.&lt;br /&gt;
&lt;br /&gt;
===Scelta dei formati da trattare===&lt;br /&gt;
&lt;br /&gt;
Una considerazione intuitiva, ed una buona prassi, è che un documento contenente dati personali sia pseudonimizzato o anonimizzato quanto prima possibile e cioè quando è ancora solo nelle mani del suo autore: questo approccio scongiura che informazioni sensibili e dati personali in chiaro ''sfuggano'' in rete.&lt;br /&gt;
Si può per questo ragionevolmente ipotizzare che i naturali destinatari del servizio siano gli stessi autori (creatori) che redigono il documento. Nello scenario tipico di utilizzo, infatti, il fruitore del servizio procederà al trattamento dei dati non appena avrà finito di scrivere il documento del quale, essendone autore, potrà scegliere il formato. Si osserva che potrebbe accadere che il documento sia redatto da terzi: in tal caso l'utente che richiede il trattamento può scegliere il formato in maniera indiretta concordandolo con il redattore. Avendo quindi l'utente la possibilità di stabilire il formato del proprio documento, risulta ragionevole progettare un servizio che lavori su un solo formato.&lt;br /&gt;
A questo punto occorre individuare quale sia il formato che maggiormente si presta alle finalità del servizio.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Una possibilità è quella di richiedere all'utente di inserire come documento da trattare un semplice file di testo in formato ''txt'': in questo modo ci sarebbe il grande vantaggio di trattare file molto semplici, riducendo così al minimo la complessità realizzativa, e inoltre si avrebbe  l'indipendenza dagli editor di testo utilizzati, in quanto tutti supportano i file in formato ''txt''. &lt;br /&gt;
Risulta tuttavia sconveniente utilizzare questo formato, poiché non ha alcuna capacità espressiva per gestire elementi complessi come tabelle, modifiche allo stile del testo e così via. &lt;br /&gt;
Bisogna quindi optare per un formato in grado di gestire questi elementi, al costo di aumentare la complessità della progettazione, ricordando sempre che è necessario allo stesso tempo che tale formato sia supportato da tutti i principali editor di testo.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Con facilità è possibile individuare quali sono i formati di testo più comuni oltre al ''txt'': ''doc'', ''docx'', ''odt'', ''pdf'', ''pages'', ''rtf'', ''tex''. Si passa ora dunque a valutare quale tra questi formati potrebbe meglio soddisfare i requisiti prima enunciati. &lt;br /&gt;
Facendo una cernita iniziale sulla base delle finalità per le quali un formato è utilizzato, si può immediatamente escludere ''tex'', che trova impiego principalmente in ambito scientifico e matematico. In questo settore, infatti, non è richiesta generalmente l'applicazione delle procedura di trattamento dei dati. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt; &lt;br /&gt;
Si può inoltre abbandonare l'idea di trattare documenti con estensione ''pages'', formato proprietario di Apple, poiché utilizzati esclusivamente dall'omonimo editor di testo anch'esso proprietario, e i documenti con estensione ''rtf'', acronimo di ''Rich Text Format'', formato proprietario di Microsoft che supporta una formattazione avanzata, poiché, pur gestito da vari editor, è un formato decisamente datato (ultima versione 1.9.1 risalente a marzo 2008 ([0009])). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si esclude inoltre il formato ''pdf'' per motivi di usabilità: molti editor, infatti, consentono di esportare un documento in questo formato ma non permettono di importarlo. Un utente dopo aver effettuato l'anonimizzazione di un documento non può quindi proseguire modificandolo ulteriormente. Il ''Portable Document Format'', infatti, è ideato per realizzare dei documenti destinati alla sola lettura.&lt;br /&gt;
L'ultima esclusione, piuttosto immediata da effettuare, riguarda il formato ''doc'', binario e proprietario di Microsoft. Esso infatti risulta, a partire dal 2006, soppiantato dal formato ''docx'', sempre proprietario di Microsoft. &lt;br /&gt;
&lt;br /&gt;
Si giunge infine a valutare quale tra gli ultimi due possibili formati rimanenti, ossia ''docx'' e ''odt'', si presta meglio alle finalità del servizio. In via preliminare si osserva che entrambi i formati possiedono ottime capacità espressive, hanno una struttura interna di simile complessità e sono entrambi supportati dai principali editor di testo. È necessario quindi effettuare delle analisi più approfondite per poter sceglierne uno tra i due.&lt;br /&gt;
La struttura del formato ''docx'', sviluppato da Microsoft e formalmente denominato ''Office Open XML Document (OOXML Document)'', è costituita da un file compresso .zip contenente un insieme di file ''XML''. Il formato ''OOXML'' permette la rappresentazione, oltre che di documenti testuali, anche di fogli elettronici (formato ''OOXML 'Workbook'', noto anche come ''xslx'') e di presentazioni (formato ''OOXML Presentation'', noto anche come ''pptx'') ([0008], [0013]).&lt;br /&gt;
Il formato inoltre è stato inizialmente standardizzato nel 2006 dall'&amp;lt;i&amp;gt;ECMA&amp;lt;/i&amp;gt;  (come ''ECMA-376'') e successivamente nel 2008 dall'&amp;lt;i&amp;gt;ISO&amp;lt;/i&amp;gt; e dall'&amp;lt;i&amp;gt;IEC&amp;lt;/i&amp;gt; (come ''ISO/IEC 29500'') in una versione ''transitional'', retrocompatibile con alcune versioni precedenti del formato contenenti elementi deprecati, e in una versione ''strict'', dove tali elementi non sono ammessi. I due standard sono stati poi successivamente aggiornati e sono tutt'ora oggetto di revisioni ([0002]).&lt;br /&gt;
&lt;br /&gt;
Anche la struttura del formato open source ''odt'', sviluppato dall'&amp;lt;i&amp;gt;OASIS&amp;lt;/i&amp;gt; e formalmente denominato ''OpenDocument Text'', è basata su uno zip contenente un insieme di file ''XML''. Inoltre, il formato ''OpenDocument Format (ODF)'' permette di trattare fogli elettronici (formato ''OpenDocument Spreadsheet'', noto anche come ''ods'') e presentazioni (formato ''OpenDocument Presentation'', noto anche come ''odp'') ([0007]). Anche ''OpenDocument Text'' è stato standardizzato, in particolare dall'&amp;lt;i&amp;gt;OASIS&amp;lt;/i&amp;gt; stesso nel 2005 e dall'&amp;lt;i&amp;gt;ISO/IEC&amp;lt;/i&amp;gt; nel 2006, ed è soggetto a revisioni e aggiornamenti ([0003]).&lt;br /&gt;
&lt;br /&gt;
In sintesi, basandosi sulla struttura dei documenti e sulla standardizzazione dei formati, non è ancora possibile individuare quale sia il formato migliore. L'unico elemento che potrebbe portare punti a favore del formato ''odt'' è che esso, a differenza del formato ''docx'', è aperto, tuttavia, essendo le specifiche di entrambi i formati pubbliche, ciò non rappresenta un fattore determinante nell'elezione del formato.&lt;br /&gt;
Entrambi i formati, inoltre, sono largamente supportati dai word processors.&lt;br /&gt;
&lt;br /&gt;
Le seguenti tabelle riepilogano il supporto all'uno ed all'altro formato dei ''word-processors'' più usati, ossia ''Microsoft Office Word'', ''LibreOffice Writer'', ''OpenOffice Writer'' e ''Pages''. &lt;br /&gt;
Le tabelle sono tratte da wikipedia ([0000], [0001], [0006]). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;i&amp;gt;Supporto fornito dagli editor di testo al formato docx&amp;lt;/i&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  !! Microsoft Office Word !! LibreOffice Writer !! OpenOffice Writer !! Pages&lt;br /&gt;
|-&lt;br /&gt;
! Version&lt;br /&gt;
|| 2013, 2011 for Mac || All versions || 3.0 || '08&lt;br /&gt;
|-&lt;br /&gt;
! Operating systems&lt;br /&gt;
|| Windows, Mac OS X || Windows, OS X, Linux, Unix, Android || Windows, Linux, Unix, Mac OS X || Mac OS X&lt;br /&gt;
|-&lt;br /&gt;
! Office suite&lt;br /&gt;
|| Microsoft Office ||  || OpenOffice.org || iWork&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
|| Microsoft || The Document Foundation || Apache OpenOffice || Apple Inc.&lt;br /&gt;
|-&lt;br /&gt;
! License&lt;br /&gt;
|| proprietary || MPL || LGPL || proprietary&lt;br /&gt;
|-&lt;br /&gt;
! ECMA-376&lt;br /&gt;
|| yes || yes || yes || yes&lt;br /&gt;
|-&lt;br /&gt;
! ISO/IEC 29500:2008&lt;br /&gt;
|| yes || yes || || &lt;br /&gt;
|-&lt;br /&gt;
! Notes&lt;br /&gt;
||  ||  || Import only ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;i&amp;gt;Supporto fornito dagli editor di testo al formato odt&amp;lt;/i&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  !! Microsoft Office Word !! LibreOffice Writer !! OpenOffice Writer &lt;br /&gt;
|-&lt;br /&gt;
! Version&lt;br /&gt;
|| 2007 SP2 || 4.0.3 || 3.0.0&lt;br /&gt;
|-&lt;br /&gt;
! Operating systems&lt;br /&gt;
|| Windows || Unix-based systems, Mac OS X, Solaris || Windows, Linux, Unix-based systems, Mac OS X, Solaris&lt;br /&gt;
|-&lt;br /&gt;
! Office suite&lt;br /&gt;
|| Microsoft Office ||  || OpenOffice.org&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
|| Microsoft || The Document Foundation || Apache OpenOffice&lt;br /&gt;
|-&lt;br /&gt;
! License&lt;br /&gt;
|| Proprietary || MPL || LGPL&lt;br /&gt;
|-&lt;br /&gt;
! ISO/IEC 26300:2006&lt;br /&gt;
|| yes || yes || yes&lt;br /&gt;
|-&lt;br /&gt;
! Notes&lt;br /&gt;
|| some limitations || Multiple ODF versions supported (ISO/ODF 1.0/1.1/1.2/1.2 Extended) || adjustable ODF version (ISO/ODF 1.2) &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si possono effettuare le seguenti osservazioni:&lt;br /&gt;
* ''Microsoft Office Word'' è, in ambiente Microsoft, il word processor maggiormente usato; è molto usato anche in ambiente Apple Mac. Esso offre il pieno supporto al formato ''OOXML Document''; solo parzialmente invece gestisce il formato ''OpenDocument Text'': il processamento di file con estensione ''odt'' con questo editor comporta la perdita di alcune informazioni secondarie.&lt;br /&gt;
* ''LibreOffice Writer'', l'editor open source maggiormente utilizzato, supporta pienamente entrambi formati. Nato con lo scopo di gestire i file con formato ''OpenDocument Text'', attualmente supporta completamente anche il formato ''OOXML Document''. &lt;br /&gt;
* ''OpenOffice Writer'', un altro degli editor di testo tra i più utilizzati, supporta pienamente ''odt'', mentre è solo in grado di importare i file con estensione ''docx''.&lt;br /&gt;
* ''Pages'', il word process installato a default sui Mac della Apple e, di conseguenza anche maggiormente usato su questi dispositivi, non offre supporto al formato ''odt'', ma elabora correttamente i documenti con estensione ''docx'' ([0005],[0004]). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Queste osservazioni evidenziano che quindi è impossibile adottare un formato supportato da tutti gli editor; la scelta va allora indirizzata verso quello maggiormente supportato dai word processor più popolari.&lt;br /&gt;
Per avere un'indicazione di ''popolarità'', e quindi per poter comprendere meglio quali tra gli editor prima citati siano i più usati, si può fare un'analisi, tramite motori di ricerca, di quanti file con una certa estensione siano presenti in rete.&lt;br /&gt;
È possibile, ad esempio, ricercare su Google i file che contengono nel proprio nome una determinata sequenza di caratteri o aventi una certa estensione (''filetype''). Sono qui presentati i risultati delle interrogazioni riguardo ai file aventi formato ''docx'', ''doc'' e ''odt'' ed il cui nome contiene uno dei caratteri, fra i più frequenti, &amp;quot;1&amp;quot; o &amp;quot;a&amp;quot; o &amp;quot;e&amp;quot;. L'investigazione è stata effettuata inserendo nella barra di ricerca di Google le stringhe ''1 filetype:docx'', ''a filetype:docx'' e così via.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Formato cercato !! Documenti con &amp;quot;1&amp;quot; nel nome !! Documenti con &amp;quot;a&amp;quot; nel nome !! Documenti con &amp;quot;e&amp;quot; nel nome&lt;br /&gt;
|-&lt;br /&gt;
| docx || 16.900.000  || 12.800.000 || 8.730.000&lt;br /&gt;
|-&lt;br /&gt;
| odt || 736.000 || 667.000 || 507.000&lt;br /&gt;
|-&lt;br /&gt;
| doc || 32.300.000 || 26.300.000 || 21.500.000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Effettivamente il formato più diffuso è il ''doc''; tuttavia esso è supportato per retro-compatibilità anche dagli editor che supportano formati ''OOXML'', con i quali non si ha difficoltà nel convertire i documenti dal formato ''doc'' al ''docx''. In conclusione, quale che sia l'editor più diffuso, è ragionevole adottare il formato ''OOXML Document'' per le finalità del servizio, in quanto molto diffuso, ben supportato dagli editor e avente ottime capacità espressive. Di conseguenza i documenti che saranno elaborati dovranno essere forniti dall'utente in tale formato. In successive sezioni verrà approfondita la struttura dei documenti ''OOXML''.&lt;br /&gt;
&lt;br /&gt;
===Privacy by design===&lt;br /&gt;
&lt;br /&gt;
L'Art. 25 del ''GDPR'', con i Considerando 75 e 78, ha per titolo e per oggetto la &amp;quot;protezione dei dati fin dalla progettazione e protezione per impostazione predefinita&amp;quot; ([0035]), perfettamente in linea con i concetti di &amp;quot;minimizzazione&amp;quot;, già richiamati.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Il senso dell'Art. 25 viene spesso sintetizzato con l'espressione &amp;quot;''PbD - privacy by design, privacy by default''&amp;quot; ([0035]). Il principio fissato nell'Art. 25 dovrà sempre più essere tenuto ben presente nell'ambito dell'ingegneria del software, in quanto impone di adottare nuove cautele nella realizzazione delle applicazioni software.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Del principio ''PbD'' si è ben tenuto conto nella progettazione descritta in questa tesi. In particolare, relativamente alla ''privacy by design'', si è fatto in modo che nessun dato personale permanga registrato sul sistema di esecuzione, o altrove, al termine dell'applicazione. Anche laddove l'applicazione termini in modo anomale non vi sono strutture dati superstiti, che restano memorizzate sul sistema.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Marginale in questa tesi è la nozione di ''privacy by default'', giacché l'applicazione non offre all'utente alcuna opzione che possa indurlo in errore ed acconsentire a trattamenti dei dati personali, oltre quello realizzato dall'applicazione.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
È utile osservare quanto sia importante esprimere queste impostazioni di progettazione fra le condizioni d'uso presentate all'utente: esse costituiscono uno dei presupposti affinché l'utente abbia piena fiducia (''trust'') nel servizio, lo utilizzi, lo divulghi, lo renda un servizio di successo.&lt;br /&gt;
&lt;br /&gt;
==Architettura del servizio== &lt;br /&gt;
&lt;br /&gt;
===I componenti software nell'architettura LAMP===&lt;br /&gt;
&lt;br /&gt;
Il servizio è realizzato in forma di ''web-based application'' poiché, come già illustrato nell'introduzione, si intende renderlo disponibile per il massimo numero di utenti possibili. Nella progettazione e realizzazione dell'architettura web si adotta la piattaforma ''LAMP'', il cui nome deriva dall'acronimo dei componenti open source che la realizzano (il sistema operativo Linux, il server HTTP Apache, il sistema per la gestione di database relazionali MySQL ed il linguaggio di programmazione PHP). Poichè il modello è composto da quattro livelli, spesso si parla anche di ''stack LAMP''. Uno degli elementi di forza del modello ''LAMP'' è che i componenti dei vari ''layer'' sono sostituibili, a seconda delle esigenze, con dei componenti più adatti, tipicamente open source ([0015], [0018], [0019]). Basando la piattaforma su un sistema operativo della famiglia di Microsoft Windows, ad esempio, si ottiene uno ''stack WAMP'', mentre se si usa un sistema operativo Mac OS si realizza uno ''stack MAMP''. Un'architettura web basata sul modello ''LAMP'' può, inoltre, essere integrata con software open source che offre utili funzionalità, come, ad esempio, il monitoraggio (''Nagios''), il load balancing (''Linux Virtual Server''), la rilevazione di accessi illeciti (''Snort'') e il security testing (''netsniff-ng''). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si valutano ora brevemente la diffusione dei componenti tradizionali dello ''stack LAMP'' e le alternative maggiormente usate per i vari ''layer''.&lt;br /&gt;
Le distribuzioni Linux risultano essere la scelta più comune per l'ultimo ''layer'' dello ''stack''. Secondo W3Techs, infatti, nell'ottobre del 2013, il 58.5% dei web server a livello globale avevano come sistema operativo la distribuzione Debian o Ubuntu, mentre il 37.3% una tra RHEL, Fedora e CentOS([0016]). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Tra i web server, Apache risulta essere maggiormente usato. Secondo le stime fatte da Netcraft, a giugno del 2014 circa il 51.9% del milione di siti web più trafficati al mondo usavano un web server Apache, il 19.2% nginx ed il 12.4% Microsoft ([0017]). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
I principali ''DBMS'' relazionali, oltre a MySQL, che possono essere presenti nello ''stack LAMP'' sono MariaDB e PostgreSQL, mentre tra i ''DBMS NoSQL'' MongoDB risulta essere il più comune. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Nello stack, infine, il ruolo di linguaggio di programmazione, solitamente svolto dal linguaggio PHP, spesso è ricoperto dai linguaggi Perl o Python. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva, ad ogni modo, che le informazioni sulla diffusione delle tecnologie non rappresentano un fattore vincolante nella scelta delle stesse, in quanto la piattaforma ''LAMP'' è anche aperta verso molti altri componenti oltre quelli citati; di conseguenza la scelta delle tecnologie da impiegare può essere effettuata basandosi principalmente sui requisiti e sulle specifiche del servizio. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Principi di progettazione per l'architettura===&lt;br /&gt;
&lt;br /&gt;
====Single Responsibility Principle====&lt;br /&gt;
&lt;br /&gt;
Per rendere il servizio maggiormente manutenibile ed estensibile, si presta particolare attenzione al rispetto del ''Single Responsibility Principle'' (''SRP'') ([0020]). Si cerca, quindi, di fattorizzare il software in più moduli, suddividendo tra questi le elaborazioni da svolgere. Un altro importante beneficio che si ottiene dalla fattorizzazione del codice è la riusabilità dei componenti. Ogni singolo modulo, infatti, svolge il proprio compito in maniera indipendente dal resto della applicazione ed è, quindi, riutilizzabile in altri scenari simili senza dover essere re-implementato. Inquadrando meglio questa metodologia di progettazione con i requisiti del servizio e la piattaforma web ''LAMP'', si individuano i due principali compiti a carico dell'applicazione:&lt;br /&gt;
* La gestione dell'interazione web con l'utente per la trasmissione del documento e dei nominativi da trattare&lt;br /&gt;
* Il processamento del documento per effettuare la &amp;quot;minimizzazione&amp;quot; dei dati.&lt;br /&gt;
Questi due differenti ''task'' saranno, quindi, portate a termine da componenti diversi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Progettando la struttura dell'applicazione in questo modo, si disaccoppia completamente la logica di business del servizio dalle interfacce web di comunicazione con l'utente. In un futuro sviluppo sarà possibile, quindi, realizzare nuove interfacce utilizzando altre tecnologie senza dover modificare la logica applicativa. &lt;br /&gt;
&lt;br /&gt;
====Dependency Inversion Principle====&lt;br /&gt;
&lt;br /&gt;
Un altro principio di design architetturale che risulta importante nella progettazione è il ''Dependency Inversion Principle'' (''DIP'') ([0038]). Esso si traduce nella realizzazione di componenti che non dipendono dalle specifiche implementazioni degli altri moduli del sistema, bensì dalle loro ''astrazioni''. &lt;br /&gt;
In relazione all'estensibilità e manutenibilità del prodotto software, infatti, l'impiego di moduli dipendenti direttamente dalla definizione dei metodi presenti in altri componenti risulta problematica: il modulo dipendente deve essere re-implementato ad ogni variazione del modulo da cui dipende.&lt;br /&gt;
Nella programmazione orientata agli oggetti, per rispettare questo principio, si su può fare uso di classi astratte o interfacce, costrutti che definiscono i moduli senza implementarli completamente o senza implementarli affatto.  &lt;br /&gt;
&lt;br /&gt;
===Stile architetturale REST=== &lt;br /&gt;
&lt;br /&gt;
Il modello architetturale del servizio che si sta definendo presenta una serie di caratteristiche, come ad esempio l'indipendenza dei moduli, che permettono di realizzarlo secondo il paradigma delle ''RESTful API''. L'espressione &amp;quot;Representational State Transfer&amp;quot; e il suo acronimo &amp;quot;REST&amp;quot; furono introdotti nel 2000 nella tesi di dottorato di Roy Fielding ([0021]), uno dei principali autori delle specifiche dell'Hypertext Transfer Protocol (HTTP). Roy Fielding descrive il ''Representational State Transfer'' come uno stile architetturale (&amp;quot;''architectural style''&amp;quot;), ovvero un'astrazione degli elementi di un'architettura all'interno di un sistema hypermedia distribuito. ''REST'' non specifica i dettagli dell'implementazione dei componenti e della sintassi del protocollo, ma definisce i ruoli dei componenti, i vincoli sulla loro modalità di interazione e la loro interpretazione.&lt;br /&gt;
Riassumiamo quindi i principi che deve rispettare una architettura ''REST'':&lt;br /&gt;
# Architettura Client-Server &amp;lt;br/&amp;gt;In una architettura ''REST'' viene data particolare importanza ai principi ''SRP'' e ''DIP'' prima citati, più generale si può affermare che l'architettura sposi il paradigma noto con il termine di &amp;quot;''Separation of Concerns''&amp;quot;. Una ''Restful API'' applica questi principi in un architettura Client-Server, capace di supportare l'evoluzione indipendente della logica lato client e della logica lato server.&lt;br /&gt;
# Stateless &amp;lt;br/&amp;gt;La comunicazione tra utente e fornitore del servizio deve essere senza stato, quindi ogni richiesta del client deve contenere tutte le informazioni di cui il fornitore necessita per l'erogazione del servizio offerto. Questa ipotesi viene fatta per rendere una ''Restful API'' facilmente scalabile orizzontalmente.&lt;br /&gt;
# Uso della cache &amp;lt;br/&amp;gt;In un Architettura ''REST'' i messaggi di risposta inviati dal server devono esplicitamente indicare se possono essere memorizzati nella cache del client o di componenti middleware per il riutilizzo nelle richieste successive.&lt;br /&gt;
# Interfaccia uniforme &amp;lt;br/&amp;gt;I componenti devono essere in grado di comunicare attraverso un'interfaccia uniforme e le risorse devono essere trasferite in un formato standard. Inoltre l'utente deve poter effettuare la navigazione tra le risorse di suo interesse tramite collegamenti ipertestuali. Per inciso, si osserva che il protocollo HTTP usato correttamente rispetta i requisiti di un architettura ''REST'' e che nelle implementazioni delle ''RESTful API'' il formato più usato per la modellazione dei dati è JSON.&lt;br /&gt;
# Layered System &amp;lt;br/&amp;gt;In un sistema a livelli, componenti intermedi (come i proxy) possono essere collocati tra client e server per intercettare il traffico per scopi specifici; ad esempio il caching o la sicurezza. Una soluzione basata su ''REST'' può essere composta da più livelli architettonici, indipendenti l'uno dall'altro.&lt;br /&gt;
# Code on Demand &amp;lt;br/&amp;gt;Questo vincolo facoltativo è inteso principalmente a consentire aggiornamenti alla logica all'interno dei client (come i browser Web) indipendentemente dalla logica lato server. Una ''single page application'', ad esempio, rispetta in pieno questo punto.&lt;br /&gt;
&lt;br /&gt;
Un'applicazione progettata sul modello dell'architettura ''REST'' ha quindi gli indiscutibili vantaggi di:&lt;br /&gt;
* consentire l'evoluzione indipendente delle diverse componenti &lt;br /&gt;
* avere un'interfaccia utente portabile con altri tipi di piattaforme&lt;br /&gt;
* permettere agevolmente la replicazione delle macchine server&lt;br /&gt;
* non vincolare moduli server e client a linguaggi e tecnologie specifiche.&lt;br /&gt;
&lt;br /&gt;
L'architettura del servizio oggetto di questa tesi si trova già perfettamente in linea con alcuni dei vincoli discussi, ma sono necessarie alcune considerazioni. Il punto 1 (&amp;quot;architettura Client-Server&amp;quot;) è chiaramente soddisfatto. &lt;br /&gt;
Il punto 2 (&amp;quot;Stateless&amp;quot;), direttamente collegato con i punti 3 e 5 (&amp;quot;Uso della cache&amp;quot;, &amp;quot;Layered System&amp;quot;), può essere rispettato con facilità; a ogni richiesta di &amp;quot;minimizzazione&amp;quot; del client corrisponde la restituzione del documento trattato dal server, non c'è quindi necessita di avere uno stato nell'interazione. &lt;br /&gt;
&lt;br /&gt;
Analizzando le caratteristiche di una applicazione stateless in relazione al principio ''privacy by design'' illustrato in precedenza, si osserva che l'assenza di stato determina la semplificazione delle problematiche critiche relative al principio. Non vengono conservate, infatti, informazioni contenenti dati sensibili, poiché dopo aver effettuato l'invio della risposta, sarà subito eliminato sul server il file elaborato.&lt;br /&gt;
&lt;br /&gt;
Nei capitoli precedenti tuttavia si è detto che l'utente può ripetere più volte il trattamento di uno stesso documento nella stessa sessione di interazione; essendo il vincolo dell'efficienza già difficile da rispettare per via dell'elaborazione onerosa del documento, si può progettare una modalità alternativa del funzionamento con stato del servizio, applicabile in assenza di replicazione delle macchine server e sfruttando le ripetute richieste di trattamento per uno stesso documento. &lt;br /&gt;
Si può infatti memorizzare lato server il documento inviato dal client inizialmente e, alle successive richieste di trattamento del medesimo documento, evitarne la ritrasmissione da client a server. Per rispettare il ''PbD'', al termine della sessione di interazione il documento verrà rimosso dal server. Si nota, inoltre, che per predisporre il servizio alla gestione delle due diverse modalità di funzionamento si può utilizzare un parametro di configurazione a livello applicativo.&lt;br /&gt;
I punti 4 e 6 infine (&amp;quot;Interfaccia uniforme&amp;quot;, &amp;quot;Code on Demand&amp;quot;) si possono rispettare utilizzando il formato JSON per la trasmissione dei documenti e dei nominativi, e usando localmente sul client Javascript per offrire tutte le funzionalità del servizio in un'unica pagina html.&lt;br /&gt;
&lt;br /&gt;
===Moduli software del servizio===&lt;br /&gt;
&lt;br /&gt;
====Scelta dei componenti software====&lt;br /&gt;
&lt;br /&gt;
Si opera ora la scelta delle tecnologie da utilizzare per i componenti dei 4 layer dello ''stack LAMP''. Per i due layer inferiori risulta piuttosto immediato decidere di usare le tecnologie presenti per default. Un sistema operativo Linux ed un web server Apache sono adatti all'architettura del servizio.&lt;br /&gt;
Inoltre anche il linguaggio di programmazione PHP può essere usato senza significativi problemi, anche se verranno fatte in seguito, in una sezione di questo capitolo, alcune considerazioni sulle problematiche di esecuzioni concorrenti di script PHP. Il linguaggio sarà impiegato in particolare per la realizzazione della logica necessaria a gestire l'interazione web con il cliente, mentre l'elaborazione del documento OOXML lato server sarà effettuata da un programma Java. &lt;br /&gt;
&lt;br /&gt;
I due ''task'' principali del servizio sono delegati, quindi, a due programmi distinti realizzati con tecnologie diverse. Si concretizza in questo modo il principio ''SRP'' e, sfruttando l'&amp;lt;i&amp;gt;openness&amp;lt;/i&amp;gt; della piattaforma LAMP, le funzionalità necessarie vengono realizzate attraverso i linguaggi più adatti.&lt;br /&gt;
La scelta del linguaggio Java per l'implementazione del ''main core'' della logica di business è dovuta alla libreria open source in ambiente java Docx4j ([40],[41]). Questa libreria è realizzata per il processamento delle tre tipologie di formati OOXML (''docx'', ''xslx'', ''pptx'') e permette tutte le possibili operazioni di creazione, lettura e modifica su questo tipo di documenti. Anche questa libreria sarà approfondita in sezioni successive. Si osserva, per inciso, che esistono altre librerie equivalenti in ambiente .NET. &lt;br /&gt;
&lt;br /&gt;
Nella scelta del linguaggio di programmazione usato per elaborare i documenti ed effettuare i confronti tramite ''regular expressions'', un dato non di poco conto da considerare è l'encoding delle stringhe. In Java, in particolare, una stringa è rappresentata internamente come un array di char, ognuno codificato da 2 byte in formato UTF-16 ([0042]); la codifica esprime in 16 bit tutti i caratteri definiti dallo standard Unicode, quindi è possibile scegliere Java.&lt;br /&gt;
&lt;br /&gt;
Per il ''layer'' della persistenza, infine, l'impiego di un database MySql risulta una buona scelta. Si osserva che questo livello non verrà utilizzato nella tradizionale maniera prevista dallo ''stack LAMP''. Infatti, generalmente, la base di dati viene interrogata direttamente dal componente che si occupa dell'interazione con l'utente (PHP) per il reperimento delle informazioni utili da restituire al client; nel servizio, invece, la base di dati sarà a supporto unicamente del programma Java, poiché gli unici dati persistenti da gestire sono i nomi del dizionario (si ricordi sempre il ''PbD'') e solo i moduli dell'eseguibile Java devono utilizzarli. Se il dizionario contenessero unicamente i nomi (senza informazioni accessorie correlate) e fossero usati in sola lettura, un semplice file di testo poteva essere sufficiente per la rappresentazione. Tuttavia, poiché saranno individuate tecniche di ottimizzazione nell'impiego dei dizionari che richiedono operazioni di scrittura e ordinamento dei dati, risulta opportuno usare un database relazionale.&lt;br /&gt;
&lt;br /&gt;
====Logica di business e dinamiche di interazione====&lt;br /&gt;
&lt;br /&gt;
Vengono presentati in questa sezione gli aspetti principali dei funzionamenti dei moduli del servizio. Per mettere bene a fuoco quali siano le meccaniche di interazione e i flussi di esecuzione dei programmi, si propone il diagramma di sequenza del tipico scenario di utilizzo. In questo schema UML si descrive il caso d'uso dove un utente, dopo aver inserito un documento ed averlo ricevuto &amp;quot;minimizzato&amp;quot;, esprime delle preferenze e richiede poi un secondo trattamento.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F00])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si descrivono quindi ora le principali operazioni che vengono eseguite.&lt;br /&gt;
All'avvio dell'interazione viene presentata una pagina PHP di benvenuto contenente le informazioni su come i dati personali vengano elaborati ed un ''file-picker'' per consentire l'upload di un documento ''OOXML''; nel momento in cui l'utente confermerà il caricamento del documento, esso verrà trasferito sul server. &lt;br /&gt;
Bisogna prestare particolare attenzione al comportamento del sistema nel caso in cui più utenti richiedano contemporaneamente l'esecuzione del servizio, e cioè alle problematiche di esecuzioni concorrenti di script PHP; è necessario, in particolare, evitare situazioni in cui i nomi dei file inviati dagli utenti siano in conflitto. Analizzando più in dettaglio il problema, ogniqualvolta un web server Apache riceve una richiesta HTTP per una pagina PHP, si ha la generazione di un nuovo processo che esegue il codice presentato nella pagina PHP richiesta. Supponendo quindi che N utenti eseguano l'invio del file contemporaneamente, si avrebbe che sul server N processi diversi dovrebbero procedere con la scrittura di un file. Ovviamente se due o più file condividono il nome almeno uno di essi sarà sovrascritto. Per risolvere questo problema, supponendo di voler salvare tutti i documenti in una cartella temporanea, occorre modificare il filename dei documenti inviati dagli utenti per esser certi di non incorrere in sovrascritture o altri tipi di errori correlati.&lt;br /&gt;
Una valida possibilità è l'inserimento di un ''prefisso'' univoco nel filename. Per la generazione di una stringa univoca da anteporre al filename, che permetta di distinguere file caricati da utenti diversi, si può direttamente usare il ''session id'' dell'utente. In PHP esso è determinato casualmente combinando ([0043]): l'IP del cliente, orario di attribuzione dell'id, un numero pseudo-casuale (con il ''PHP Linear Congruence Generator'') e, se presente un &amp;quot;''random source''&amp;quot; sul sistema operativo del Client (spesso chiamato impropriamente &amp;quot;''seme''&amp;quot;), un ulteriore numero pseudo-casuale.&lt;br /&gt;
Per introdurre ulteriore alea, necessaria se, ad esempio, un utente tenti l'upload di file omonimi (con contenuto interno diverso) e mantenga il medesimo ''session id'', si utilizza un ulteriore generatore pseudo-casuale per produrre un altro numero con cui comporre il prefisso.&lt;br /&gt;
Concatenando i due numeri generati si ha praticamente certezza di aver individuato un numero univoco nel sistema per il tempo in cui il servizio sarà erogato al cliente.&lt;br /&gt;
&lt;br /&gt;
Una volta memorizzato il file, lo script PHP dovrà ricorrere all'invocazione del modulo Java, delegato al vero e proprio processamento del documento. Occorre quindi individuare un set di opzioni che consenta al modulo che gestisce l'interazione con il cliente di sfruttare al meglio il componente delegato all'elaborazione del documento, in qualunque circostanza; la totale indipendenza dei moduli, la loro sostituibilità e la replicazione possibile di macchine server sono solo alcuni dei fattori che rendono mutevole la configurazione del sistema. Va definito un protocollo di comunicazione, quindi, che astragga completamente dall'implementazione dei moduli o dalla locazione dei file.&lt;br /&gt;
&lt;br /&gt;
Valutando i possibili flussi logici, anche con l'ausilio del diagramma di sequenza, si ha che i tipi di esecuzione sono due:&lt;br /&gt;
* &amp;quot;minimizzazione&amp;quot; con dizionario&lt;br /&gt;
* &amp;quot;minimizzazione&amp;quot; di specifici nominativi&lt;br /&gt;
Il protocollo di comunicazione tra i due moduli è costituito in entrambi i casi di una singola richiesta a cui segue una singola risposta. Più in particolare, lo script PHP invoca il comando Java esprimendo obbligatoriamente il path del file da trattare e opzionalmente l'elenco dei nominativi. A suo volta, il modulo Java restituisce i nominativi trovati, qualora non espressamente richiesti dallo script, e segnala la corretta terminazione dell'elaborazione.&lt;br /&gt;
Si definiscono come canali di comunicazione standard del protocollo gli argomenti presi in input dal modulo di processamento del documento e lo standard output del processo che esegue tale programma. Inoltre è importante definire un formato standard per la comunicazione dei nominativi tra moduli; è necessario quindi scegliere un pattern che permetta di determinare univocamente la composizione dei nominativi. Un possibile formato, espresso tramite ''regex'', è il seguente:&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt; &amp;lt;nominativo&amp;gt; = ^(&amp;lt;nome&amp;gt;:)*&amp;lt;nome&amp;gt;;&amp;lt;cognome&amp;gt;$&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt; &amp;lt;nominativi&amp;gt; = ^(&amp;lt;nominativo&amp;gt;\s+)+$&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Dove nome e cognome sono una sequenza di caratteri Unicode come già discusso. Ulteriori opzioni importanti da definire nel protocollo per l'invocazione del programma che si occupa delle funzionalità di elaborazione sono le seguenti:&lt;br /&gt;
* path file da elaborare (opzione &amp;quot;-i &amp;lt;file_path&amp;gt;&amp;quot;, obbligatoria)&lt;br /&gt;
* path con cui salvare il file elaborato (opzione &amp;quot;-o &amp;lt;file_path&amp;gt;&amp;quot;, opzionale: per default viene creato un nuovo file automaticamente)&lt;br /&gt;
* abilitazione stampe verbose, da usare solo in fase di debug (opzione &amp;quot;-d&amp;quot;, opzionale)&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Una volta terminato il processamento, il modulo di gestione dell'interazione con l'utente dovrà accertarsi che l'&amp;lt;i&amp;gt;exit status&amp;lt;/i&amp;gt; sia 0 e leggere dallo standard output del processo appena terminato, qualora si sia stata eseguita la &amp;quot;minimizzazione&amp;quot; con dizionario, l'elenco dei nominativi trovati. Se invece la &amp;quot;minimimizzazione&amp;quot; ha avuto luogo con i nominativi già specificati non sarà scritto nulla sullo standard output.&lt;br /&gt;
A margine si osserva che l'impiego dell'opzione &amp;quot;-d&amp;quot; deve sempre consentire una semplice individuazione dei nominativi trovati; in particolare, se tale opzione è specificata, nello standard output i nominativi compariranno con un ''header'' riconoscibile (&amp;quot;''NOMINATIVO=''&amp;quot;).&lt;br /&gt;
Ritornando alla descrizione del flusso di esecuzione tipo, una volta che il modulo Java ha completato il trattamento del documento, lo script PHP ne effettuerà l'upload sul client e presenterà all'utente le opzioni già descritte nel capitolo sull'usabilità. &lt;br /&gt;
A questo punto l'interazione con client potrebbe concludersi, qualora si eseguisse il download e si chiudesse il browser, o continuare elaborando i ''suggerimenti'' dell'utente espressi dopo il primo trattamento. Le modalità di comunicazione dei moduli varierebbero leggermente come appena illustrato, mentre, a seconda della configurazione stateful o stateless del servizio, verrebbe eseguito o meno un nuovo upload del file dal client al server.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si osserva infine che, per predisporre a successivi studi di ottimizzazione il servizio e per agevolare tutti i possibili sviluppi futuri, si applica largamente nella progettazione del modulo di elaborazione Java il ''Dependency Inversion Principle'', in quanto si desidera realizzare classi estendibili ed intercambiabili.&lt;br /&gt;
In particolare, si introducono delle classi astratte per rappresentare in maniera generica il concetto di &amp;quot;''persona''&amp;quot; e &amp;quot;''minimizzatore''&amp;quot;. È possibile infatti realizzare successivi studi per trattare ulteriori dati personali oltre che ai nomi e cognomi; inoltre, in base ai tipi di documenti trattati o eventuali altri fattori utili, è possibile studiare differenti tecniche di &amp;quot;minimizzazione&amp;quot; realizzate da differenti algoritmi &amp;quot;''minimizzatori''&amp;quot;.&lt;br /&gt;
In particolare una &amp;quot;''persona''&amp;quot; dovrà sempre esporre un metodo &amp;quot;''minimizza''&amp;quot; che prende in input una stringa, la &amp;quot;minimizza&amp;quot; e la restituisce; il pattern con il quale si effettua la &amp;quot;minimizzazione&amp;quot; sarà fornito in implementazione a seconda dei dati sensibili di interesse.&lt;br /&gt;
Un &amp;quot;''minimizzatore''&amp;quot; esporrà sempre un metodo &amp;quot;''work''&amp;quot; che, presa in input una lista di persone ed un documento ''OXML'', con l'ausilio della libreria Docx4j, fornirà in output un documento del tutto &amp;quot;minimizzato&amp;quot;; la definizione delle modalità con cui si estrapolano le informazioni dal documento e con cui si invoca il metodo &amp;quot;''minimizza''&amp;quot; della classe persona sono confinate nell'implementazione.&lt;br /&gt;
Definendo delle classi astratte risulta, quindi, più veloce la realizzazione dei futuri componenti e si svincola il processo di &amp;quot;minimizzazione&amp;quot; dal tipo di dati che si &amp;quot;minimizzano&amp;quot; e viceversa.&lt;br /&gt;
&lt;br /&gt;
====Le classi principali del progetto====&lt;br /&gt;
Le classi principali del progetto vengono quindi presentate in appendice. Esse sono:&lt;br /&gt;
* App.java, contenente il main&lt;br /&gt;
* Elaborator.java, che presenta il metodo &amp;quot;''work''&amp;quot;&lt;br /&gt;
* Persona.java, che presenta il metodo &amp;quot;''minimizza''&amp;quot;&lt;br /&gt;
* Testing.java, contenente alcune funzioni usate in fase di debug.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gli script in PHP sono stati forniti dall'azienda come implementazione minimale e provvisoria, da perfezionare a seguito della eventuale definizione sulle modalità di presentazione del servizio su Internet.&lt;br /&gt;
&lt;br /&gt;
Una considerazione di implementazione comune a tutte le classi deriva del principio ''Privacy by Design'', indifferentemente dalla modalità di configurazione stateful o stateless del servizio: è di fondamentale importanza che nel sistema non siano memorizzati permanentemente in alcun caso i documenti inviati dagli utenti del servizio. &lt;br /&gt;
Per realizzare un sistema robusto, per fronteggiare crash improvvisi del client o congestioni della rete, è opportuno impostare dei timeout lato server che procedano automaticamente alla eliminazione dei documenti degli utenti dopo un periodo di inattività troppo prolungato. Qualora invece si dovesse verificare un interruzione critica del servizio a causa di un errore logico del server o semplicemente per via di un'interruzione dell'alimentazione della macchina server, bisogna considerare altri metodi; essendo il servizio realizzato con un sistema operativo Linux, si può configurare il demone ''crond'' per eseguire a ogni reboot e, per sicurezza, una volta al giorno l'eliminazione dei file usati dall'applicazione tutti contenuti all'interno della cartella temporanea.&lt;br /&gt;
&lt;br /&gt;
==Approfondimenti tecnologici==&lt;br /&gt;
&lt;br /&gt;
===Analisi della struttura del formato OOXML===&lt;br /&gt;
&lt;br /&gt;
Come argomentato, il formato dei documenti elaborati dal servizio progettato dovrà essere ''Office Open XML'', o ''OOXML''; si tratta di un formato ''XML-based'' per documenti di testo, fogli elettronici e presentazioni, in grado di rappresentare grafici, diagrammi, immagini e altro materiale grafico. La specifica fu sviluppata da Microsoft e adottata dall'&amp;lt;i&amp;gt;ECMA International&amp;lt;/i&amp;gt; come standard ''ECMA-376'' nel 2006. Una seconda versione fu rilasciata nel 2008, una terza nel 2011, una quarta nel 2012 ed una quinta tra il 2015 ed il 2016 ([0010]). La specifica è stata adottata, inoltre dall'&amp;lt;i&amp;gt;ISO&amp;lt;/i&amp;gt; e dall'&amp;lt;i&amp;gt;IEC&amp;lt;/i&amp;gt; come standard ''ISO/IEC 29500'' a partire dal 2008 ([0011], [0012]).&lt;br /&gt;
&lt;br /&gt;
====Linguaggi di markup====&lt;br /&gt;
&lt;br /&gt;
Lo standard ''ECMA-376'' ([0010]) include tre differenti specifiche di linguaggio per ognuna delle tre principali categorie di documenti:&lt;br /&gt;
* ''WordprocessingML'' per i documenti testuali&lt;br /&gt;
* ''SpreadsheetML'' per i fogli elettronici&lt;br /&gt;
* ''PresentationML'' per le presentazioni elettroniche&lt;br /&gt;
* ''DrawingML'' ed altri linguaggi di markup di supporto per la rappresentazione di disegni, forme e diagrammi.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
La specifica include sia gli schemi ''XML'' sia i vincoli espressi per iscritto. Ogni documento conforme al formato dovrà, quindi, rispettare gli schemi ''XML'' e dovrà essere codificato in ''UTF-8'' o ''UTF-16''. La specifica, inoltre, permette l'aggiunta di ''custom tag XML'' a supporto dei linguaggi di markup dati, per default nel formato ''OOXML'', consentendo quindi la libera personalizzazione dei documenti.&lt;br /&gt;
&lt;br /&gt;
====File packaging====&lt;br /&gt;
&lt;br /&gt;
Oltre alla specifiche relative ai linguaggi di markup, la seconda parte dell'&amp;lt;i&amp;gt;ECMA-376&amp;lt;/i&amp;gt; ([0010]) definisce la struttura gerarchica dei file del formato adottando le ''Open Packaging Conventions'' (''OPC''). ''OPC'', una tecnologia ''file-container'' basata sul comune formato compresso ''zip'', che stabilisce che tutti i file che riguardano una stessa entità devono essere raggruppati in un unico package ([0014]). Un documento ''OOXML'' è, infatti, un archivio ''zip'' contenente alcuni files ''XML'' (detti anche ''parti'') organizzati in un singolo package. Questa frammentazione dei dati in più files rende più semplice e veloce l'accesso ai dati stessi e riduce le possibilità di una loro corruzione. Le ''parti'' possono contenere qualsiasi tipo di dato; per tenere traccia della relazione tra una ''parte'' e la sua tipologia di contenuto, senza basarsi sull'estensione del file, è presente nel package, nella cartella radice della gerarchia, il file denominato ''[Content_Types].xml'', il quale mappa appunto queste associazioni. È mostrata qui ad esempio l'associazione tra la ''parte'' rappresentante il documento principale e il suo ''ContentType''.&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Override PartName=&amp;quot;/word/document.xml&amp;quot; ContentType=&amp;quot;application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Le informazioni relative alle relazioni che ogni ''parte'' ha con le altre ''parti'', con risorse esterne e con il package in sé sono mantenute separatamente dal contenuto della ''parte'' stessa. Tali informazioni sono presenti, infatti, all'interno delle cartelle denominate ''_rels'': ne esiste una per il package nel suo complesso e una per ogni sotto-cartella del package contenente delle ''parti'' coinvolte in delle relazioni. In questo modo i riferimenti che una ''parte'' ha verso altre ''parti'' o risorse sono salvati una sola volta e possono essere aggiornati con semplicità se necessario, senza dover modificare il contenuto stesso delle ''parti'' coinvolte. È mostrato qui un esempio di relazione contenuta in ''_rels/.rels'' relativa al documento principale e al suo schema.&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Relationship Id=&amp;quot;rId1&amp;quot; Type=&amp;quot;http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument&amp;quot; Target=&amp;quot;word/document.xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Il documento principale, ossia il file ''word/document.xml'', ha inoltre numerose relazioni con altre ''parti'', come ad esempio ''word/styles.xml'' e ''word/footer.xml'', e risorse esterne collegate con degli URI. Per descrivere queste relazioni si usa la cartella ''word/_rels''.&lt;br /&gt;
&lt;br /&gt;
====Parti di un Documento OOXML====&lt;br /&gt;
&lt;br /&gt;
Vengono qui presentate le ''parti'' che sono caratteristiche esclusive di un ''WordprocessingML package'', non presenti quindi negli altri due formati ''OOXML''. È importante osservare che alcune di esse sono facoltative e sono presenti nel package solo se necessario.&lt;br /&gt;
&lt;br /&gt;
Le ''parti'' relative al vero e proprio contenuto testuale sono:&lt;br /&gt;
* ''Main Document'', contiene le informazioni principali ed è salvata come ''word/document.xml''&lt;br /&gt;
* ''Header'', contiene i dati relativi alle intestazioni ed è salvata in ''word/header.xml''. Ogni sezione del documento può avere intestazioni diverse per la prima pagina, per le pagine pari e per le dispari, quindi possono esserci molteplici ''parti header''&lt;br /&gt;
* ''Footer'', contiene le informazione relative al piè pagina ed è salvata in ''word/footer.xml''. Può essere presente più volte, per motivi analoghi alla ''parte header''&lt;br /&gt;
* ''Footnotes'', contiene le eventuali note a piè pagina del documento ed è salvata come ''word/footnotes.xml''&lt;br /&gt;
* ''Endnotes'', contiene le note di chiusura del documento ed è salvata in ''word/endnotes.xml''.&lt;br /&gt;
&lt;br /&gt;
Sono presenti poi delle ''parti'' relative allo stile e alle impostazioni del documento:&lt;br /&gt;
* ''Style Definitions'', contiene la definizione di un insieme di stili usati dal documento, salvata in ''word/styles.xml''&lt;br /&gt;
* ''Font Table'', contiene informazioni riguardo i font usati, salvata in ''word/fontTable.xml''&lt;br /&gt;
* ''Numbering Definitions'', contiene le definizioni sulla struttura delle liste contenute nel documento, salvata in ''word/numbering.xml''&lt;br /&gt;
* ''Document Settings'', specifica come il word processor debba trattare il documento (spell checking, gestione delle revisioni, etc.), contenuta in ''word/settings.xml''&lt;br /&gt;
* ''Web Settings'', contiene informazioni su come il documento debba essere convertito in ''HTML'' se richiesto, contenuta in ''word/webSettings.xml''.&lt;br /&gt;
&lt;br /&gt;
Sono presenti anche delle ''parti'' che rappresentano testo secondario:&lt;br /&gt;
* ''Comments'', contiene i commenti sul documento inseriti attraverso un word processor&lt;br /&gt;
* ''Glossary'', contiene dati testuali aggiuntivi secondari, ne è permessa una sola. Tutte le ''parti'' prima elencate, tranne il ''Main Document'', possono comparire una seconda volta in relazione alla ''parte glossary''.&lt;br /&gt;
&lt;br /&gt;
====Analisi del Main Document====&lt;br /&gt;
&lt;br /&gt;
Il file ''document.xml'', elemento principale di un documento ''WordprocessingML'', è costituito da due tipi di informazioni:&lt;br /&gt;
* ''properties'', che definiscono lo stile e la formattazione del testo&lt;br /&gt;
* ''stories'', che rappresentano il contenuto testuale delle varie parti del documento.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le ''properties'' verranno trattate in misura minore. Queste informazioni sono espresse attraverso una struttura XML gerarchica che ha come elemento radice il nodo ''document''. Esso ha due nodi figli:&lt;br /&gt;
* ''background'', che contiene alcune ''properties'' che descrivono lo sfondo del documento&lt;br /&gt;
* ''body'', che contiene tutti i rimanenti contenuti ed è potenzialmente molto complesso.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si osserva che per le finalità del trattamento dei dati risultano di primario interesse le ''stories'' e che è opportuno effettuare un'analisi ''bottom-up'' del problema: anziché considerare la gerarchia a partire dal ''body'' (nodo padre) partiremo dalla rappresentazione più semplice del testo contenuta nel documento (nodi figli).&lt;br /&gt;
&lt;br /&gt;
Facendo direttamente riferimento allo standard ''ECMA-376'' ([0010]),  si evince che l'unico nodo che contiene puro testo ha il nome ''t'' (''Text''). Questo elemento contiene una stringa rappresentante gli esatti caratteri che vengono poi mostrati negli editor a video. Il nodo ''Text'' non presenta figli e l'unico nodo padre che può avere è ''r'' (''Run''). Quest'altro nodo definisce una regione di testo con comuni proprietà (ad esempio l'uso del grassetto). Attraverso l'uso di tag ''t'' ed ''r'' quindi si rappresenta una regione di testo formattata con differenti elementi stilistici.&lt;br /&gt;
Occorre però evidenziare che un nodo ''r'' può presentare molti altri figli oltre a ''t'', come ad esempio immagini, in quanto rappresenta un'area generica del documento.&lt;br /&gt;
Si supponga quindi di avere due nodi ''Text'' fratelli, ossia figli dello stesso nodo ''r'': essi rappresenteranno semanticamente un unico blocco logico se e solo se compariranno a video come una sequenza di parole continua. Questo fenomeno è facilmente identificabile anche nel file ''XML'' descrittivo: due sequenze di parole mostrate a video adiacenti compaiono infatti nel file ''XML'' in due righe consecutive; se invece due parti di testo dovessero essere intervallate ad es. da un'immagine nel documento ''XML'' ci sarebbe un tag ''drawing'' a dividere i due tag ''t''. Dalla consecutività dei nodi ''Text'' nel file ''document.xml'' si può determinare quali siano i blocchi logici da trattare.&lt;br /&gt;
Un insieme di ''Run'' infine può essere figlio di diversi nodi, ma ciò non è di rilevante importanza, in quanto ogni area di testo individuata dal nodo ''Run'' rappresenta già un blocco logico a sé e, di conseguenza, contiene sufficienti informazioni per la &amp;quot;minimizzazione&amp;quot;.&lt;br /&gt;
L'unico caso di rilievo nel quale bisogna valutare quale sia la gerarchia a monte di un nodo ''Run'' è nell'elaborazione di una tabella. In tal caso, in realtà, occorre verificare opportunamente la strutturazione della gerarchia processata. Per chiarezza espositiva viene mostrata la rappresentazione in formato ''OOXML'' di una tabella con una riga e due colonne (senza l'uso di ''properties'' per la formattazione stilistica).&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;w:tbl&amp;gt;&lt;br /&gt;
  &amp;lt;w:tr&amp;gt;&lt;br /&gt;
    &amp;lt;w:tc&amp;gt;&lt;br /&gt;
      &amp;lt;w:p&amp;gt;&lt;br /&gt;
        &amp;lt;w:r&amp;gt;&lt;br /&gt;
          &amp;lt;w:t&amp;gt;Cella A&amp;lt;/w:t&amp;gt;&lt;br /&gt;
        &amp;lt;/w:r&amp;gt;&lt;br /&gt;
      &amp;lt;/w:p&amp;gt;&lt;br /&gt;
    &amp;lt;/w:tc&amp;gt;&lt;br /&gt;
    &amp;lt;w:tc&amp;gt;&lt;br /&gt;
      &amp;lt;w:p&amp;gt;&lt;br /&gt;
        &amp;lt;w:r&amp;gt;&lt;br /&gt;
          &amp;lt;w:t&amp;gt;Cella B&amp;lt;/w:t&amp;gt;&lt;br /&gt;
        &amp;lt;/w:r&amp;gt;&lt;br /&gt;
      &amp;lt;/w:p&amp;gt;&lt;br /&gt;
    &amp;lt;/w:tc&amp;gt;&lt;br /&gt;
  &amp;lt;/w:tr&amp;gt;&lt;br /&gt;
&amp;lt;/w:tbl&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Come si osserva in figura, in una tabella il nodo ''r'' sarà figlio del nodo ''p'' (''Paragraph''), il quale a sua volta sarà contenuto in un noto ''tc'' (''Table Cell''). Celle di una tabella appartenenti ad una stessa riga saranno presenti all'interno dello stesso ''tr'' (''Table Row'') ed infine tutte le righe della tabella saranno inserite del tag ''tbl'' (''Table'').&lt;br /&gt;
&lt;br /&gt;
Per determinare quindi se due nodi ''Text'' sono scritti in due colonne adiacenti di una stessa riga (e quindi costituiscono un unico blocco logico) è necessario verificare che per i due nodi ''Text'':&lt;br /&gt;
# il nodo &amp;quot;padre&amp;quot;  '''non sia''' in comune&lt;br /&gt;
# il nodo &amp;quot;padre di 2° livello&amp;quot; sia ''Paragraph'' e '''non sia''' in comune&lt;br /&gt;
# il nodo &amp;quot;padre di 3° livello&amp;quot; sia ''Table Cell'' e '''non sia''' in comune&lt;br /&gt;
# il nodo &amp;quot;padre di 4° livello&amp;quot; sia ''Table Row'' e '''sia''' in comune&lt;br /&gt;
# i nodi &amp;quot;padre di 3° livello&amp;quot; '''siano''' consecutivi.&lt;br /&gt;
Se tutte queste ipotesi sono soddisfatte, le due celle vanno &amp;quot;minimizzate&amp;quot; come unico blocco logico.&lt;br /&gt;
&lt;br /&gt;
Si valutano infine gli ultimi vincoli emersi nell'analisi sull'interpretazione della formattazione di un documento.&lt;br /&gt;
In particolare, descrivendo le parti che compongo un documento ''OOXML'', era già emerso che alcune sezioni di testo, ossia note a piè pagina ed intestazioni, compaiono in altri file ''XML'' e non in ''document.xml''. Questi file (''header.xml'', ''footer.xml'', ''endnotes.xml'', etc.) sono tutti raccolti in un package (&amp;quot;''word''&amp;quot;) e la grammatica ''XML'' è la stessa usata per il Main Document.&lt;br /&gt;
Si conclude osservando che il problema della divisione in sillabe delle parole non si pone, in quanto la divisione sillabica mostrata a video dai word-processors è calcolata dinamicamente; in particolare, su una porzione di testo viene applicata la sillabazione (ove necessario) se è presente tra le ''properties'' di quella regione di documento il tag ''hyphenationZone''.&lt;br /&gt;
&lt;br /&gt;
====La libreria in ambiente java open source Docx4j====&lt;br /&gt;
&lt;br /&gt;
La libreria Docx4j offre completo supporto alla manipolazione di documenti ''docx'' (compressione e decompressione archivio zip, generazione file ''XML'' necessari, etc.). Offre inoltre un'utile mappatura in specifici oggetti Java della gerarchia ''XML'' presente nei vari file del formato.&lt;br /&gt;
Uno tra gli elementi più interessanti è la tecnica con cui vengono recuperati i nodi dai file ''XML'', in quanto si fa impiego del linguaggio standard W3C ''XPath'' ([0044], [0045]). Con ''XPath'' è possibile esprimere con una stringa un sottoinsieme di nodi presenti in una gerarchia ''XML'' non solo in base al loro nome o valore, ma anche in relazione alla posizione reciproca rispetto agli altri nodi. Riferendoci alle problematiche del servizio risulta, ad esempio, significativamente agevolato il trattamento di dati personali in forma tabellare.&lt;br /&gt;
Si osserva infine che la libreria attribuisce un id univoco ad ogni nodo del documento, di conseguenza se ne può trarre vantaggio nei confronti tra i nodi.&lt;br /&gt;
&lt;br /&gt;
===Ottimizzazioni del processo di minimizzazione===&lt;br /&gt;
&lt;br /&gt;
===Tecnologie complementari===&lt;br /&gt;
&lt;br /&gt;
La redazione di questa tesi è avvenuta su Mediawiki, la più importante fra le piattaforme wiki essendo il motore di Wikipedia.&lt;br /&gt;
&lt;br /&gt;
Le piattaforme wiki sono riconosciute come elemento caratterizzante dell’evoluzione Internet al Web 2.0, cioè al web nel quale gli utenti-navigatori, fino ad allora &amp;quot;''consumatori&amp;quot;'' (&amp;quot;''consumers&amp;quot;'') di contenuti si sono trasformati essi stessi in &amp;quot;''produttori&amp;quot;'' (&amp;quot;''producers&amp;quot;''), e cioè in &amp;quot;''prosumers&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
Un ''wiki'' è fondamentalmente un sito web che contiene informazioni e che consente agli utenti di editare facilmente il suo contenuto.&lt;br /&gt;
&lt;br /&gt;
Nel redigere una pagina wiki si utilizza ciò che è chiamato ''wikitext&amp;quot; per definire capitoli, paragrafi, hyperlinks, elementi di formattazione della pagina, etc.; sebbene il ''wikitext&amp;quot; risulti non difficile da apprendere, quasi ogni piattaforma wiki è corredata da editor di tipo visuale, che non richiede alcuna conoscenza della sintassi del ''wikitext&amp;quot;; tuttavia è esperienza comune che utilizzare direttamente il ''wikitext&amp;quot; induce a concentrarsi maggiormente sui contenuti e non sulla formattazione. Il linguaggio ''wikitext'' è strettamente correlato con il linguaggio HTML, infatti nella scrittura è possibile utilizzare tag come h1, span, div e così via, oltre che la sintassi esclusiva di ''wikitext''; simmetricamente una pagina prodotta da media wiki è costituita da HTML ben formato e direttamente importabile in ogni word processor. &lt;br /&gt;
&lt;br /&gt;
I wiki presentano una funzionalità di grande utilità nella redazione di documenti articolati: la tracciatura delle successive revisioni (&amp;quot;''Cronologia&amp;quot;''). La possibilità di ripercorrere l’evoluzione del testo è davvero d’aiuto quando si fissano idee originali in uno scritto, cercando di definirle, precisarle, chiarirle, come è avvenuto in effetti, anche nella redazione di questa tesi. Per curiosità, si segnala che, pur avendo redatto la maggior parte del testo off-line, la pagina wiki di questa tesi conta oltre 50 revisioni.&lt;br /&gt;
&lt;br /&gt;
Per inciso, si osserva che è stata molto utile la funzionalità di &amp;quot;ricerca nel codice&amp;quot; offerta dalla piattaforma di revisione online GitHub nella corretta comprensione della libreria Docx4j, il cui codice sorgente è ivi rilasciato. &lt;br /&gt;
&lt;br /&gt;
Si conclude infine dicendo che per ottimizzare le procedure di debug del codice sono stati realizzati utili tool a riga di comando per Linux per la rapida estrazione-modifica-ricompattazione di documenti ''OOXML''. Si propone in appendice un comando bash per questi scopi.&lt;br /&gt;
&lt;br /&gt;
==Sviluppi futuri==&lt;br /&gt;
&lt;br /&gt;
In questa sezione si fa cenno, senza poterle approfondire, ad alcune interessanti questioni emerse nello svolgimento della tesi.&lt;br /&gt;
&lt;br /&gt;
===Accesso al servizio web===&lt;br /&gt;
&lt;br /&gt;
In fase iniziale, il servizio web potrà essere reso accessibile in forma completamente aperta, senza richiedere cioè la registrazione dell’utente o l’autenticazione dell’utente già registrato. In questo modo, in effetti, si premia la facilità d’uso, ma si incorre nella nota problematica di un uso malevolo, costituito da accessi a raffica, finalizzati a saturare il server e generare una condizione di ''DoS – Denial of Service''. Diverse sono le tecniche che possono essere adottate per contrastare questo tipo di accessi malevoli, come richiedere di superare &amp;quot;''captcha''&amp;quot; e/o introdurre ritardi crescenti ed eventualmente blocchi in risposta ad accessi prevenienti con alta frequenza dallo stesso indirizzo IP.&lt;br /&gt;
È possibile anche pensare ad un accesso previa registrazione ed autenticazione dell’utente, penalizzando l’immediatezza di utilizzo del servizio, ma eventualmente ottenendo l’indirizzo email degli utenti che acconsentono a lasciarlo per successive finalità marketing.&lt;br /&gt;
È possibile, infine, un utilizzo misto, contando in un cookie il numero di accessi eseguiti e richiedendo all’utente di registrarsi per continuare ad utilizzare il servizio, dopo qualche accesso.&lt;br /&gt;
&lt;br /&gt;
===Ampliamento dinamico del dizionario===&lt;br /&gt;
&lt;br /&gt;
Nel restituire il documento elaborato all'utente, gli si da la possibilità di richiedere una nuova elaborazione, dopo aver indicato i nominativi che fossero sfuggiti; pare inesauribile, infatti, la &amp;quot;fantasia&amp;quot; dei genitori nel dare nome ai propri figlioli!&lt;br /&gt;
I nominativi indicati dall'utente sono sfuggiti al servizio perché non presenti nel dizionario: facilmente viene in mente l’idea di arricchire il dizionario con i nominativi indicati dall’utente. Va però considerato il caso che l’utente in malafede indichi nominativi fasulli al fine di inquinare il dizionario.&lt;br /&gt;
Il caso malevolo può essere affrontato attraverso una strategia che preveda non direttamente l'inserimento del nuovo nominativo nel dizionario, ma invece l'utilizzo di un concetto di &amp;quot;candidatura&amp;quot;: il nuovo nominativo viene registrato, ma si attende di avere un certo numero di utenti che lo propongono prima di approvarne l'inserimento nel dizionario.&lt;br /&gt;
Può anche essere utilizzato un concetto di &amp;quot;attendibilità&amp;quot; della candidatura di un nuovo nominativo, verificando ad esempio l'utente che lo propone scarichi effettivamente il file rielaborato.&lt;br /&gt;
Nel caso l'accesso avvenga con autenticazione, e cioè identificando gli utenti, si apre la possibilità di individuare e bannare gli utenti malevoli.&lt;br /&gt;
&lt;br /&gt;
===Natura del documento e ricorrenza del nominativo===&lt;br /&gt;
&lt;br /&gt;
Si coglie facilmente la differenza di formato fra un documento in forma di elenco (es. una graduatoria) da un documento in forma di relazione (es. una sentenza giudiziaria). Differenze di questo tipo potrebbero essere utilizzate per escludere o ammettere la ripetizione dei nominativi.&lt;br /&gt;
Per meglio dire: in un elenco la ripetizione di un nominativo è di fatto da escludersi o va trattata come omonimia. In una relazione, l’individuazione di un nominativo può essere utilizzata per ricercarlo direttamente in altri punti del documento stesso.&lt;br /&gt;
&lt;br /&gt;
===Altri dati personali===&lt;br /&gt;
&lt;br /&gt;
Altri dati personali sono trattabili con le stesse tecniche analizzate in questa tesi: date e luoghi di nascita, codici fiscali, indirizzi, email, numeri di telefono, sesso etc. In qualche caso, come per i codici fiscali, l’individuazione del pattern da trattare è persino più semplice.&lt;br /&gt;
Diversi studi ([0039]) hanno dimostrato che, utilizzando set di dati personali parziali, è possibile la re-identificazione dei soggetti, pur in documenti pseudonimizzati. È questo un altro motivo per estendere i trattamenti descritti anche agli altri dati personali richiamati.&lt;br /&gt;
&lt;br /&gt;
===Altri alfabeti===&lt;br /&gt;
&lt;br /&gt;
È possibile estendere il sotto-insieme di caratteri Unicode utilizzati nelle ''regex'' per elaborare documenti scritti in altri alfabeti non latini.&lt;br /&gt;
&lt;br /&gt;
==Conclusioni==&lt;br /&gt;
&lt;br /&gt;
Questa tesi è partita da un problema basilare, quasi scolastico, dell'informatica: la ricerca di un testo in un documento, al fine della sua cancellazione o modifica.&lt;br /&gt;
&lt;br /&gt;
Il problema si è subito discostato dalla sua formulazione basilare, principalmente perché, nei casi d'uso, il documento da ricercare non è un semplice testo (&amp;quot;''plain text''&amp;quot;) ma invece è il prodotto di un ''word-processor'': quindi è costituito da una struttura XML più o meno complessa, rappresentante formattazioni, riferimenti interni o esterni, note, etc. La ricerca deve avvenire nei soli nodi di puro testo, individuando ed escludendo dall'analisi lessicale gli elementi testuali di mark-up che non costituiscono contenuto informativo. Nell'approfondire le strutture ed i concetti XML ho potuto notare quanto essi siano ricorrenti in molti ambiti dell'informatica.&lt;br /&gt;
&lt;br /&gt;
Nell'analisi delle specifiche, un'altra complicazione si è presto aggiunta: l'usabilità del servizio cresce drasticamente se si evita di chiedere all'utente, come si era pensato in un primo tempo di fare, quali siano le stringhe (i nominativi) da ricercare e trattare; è nata allora l'idea di reperire queste stringhe in un dizionario di nomi ed in un dizionario di cognomi, considerando anche le permutazioni dei lemmi reperiti. Ho così dovuto approfondire alcuni problemi tipici dei dizionari, come il loro ampliamento automatico con tecniche oggi comprese nel ''machine-learning''. Non ho potuto &amp;quot;resistere&amp;quot; alla tentazione di ''formalizzare la matematica'' in base alla quale ho costruito le strategie di ricerca.&lt;br /&gt;
&lt;br /&gt;
Spunto per la tesi è stata la recente legislazione in materia di dati personali, il GDPR. Esaminandone gli articoli pertinenti, ho maturato una riflessione generale: sempre più il software dovrà essere progettato e realizzato anche alla luce di altre discipline, non solo di quelle informatiche, come le discipline giuridiche ed il diritto.&lt;br /&gt;
&lt;br /&gt;
Durante la fase iniziale della collaborazione con l'azienda mi sono dedicato alla messa a punto delle specifiche; ciò mi ha permesso di comprendere quanto questa fase sia importante e come completezza e precisione delle specifiche siano alla base di un progetto efficace.&lt;br /&gt;
&lt;br /&gt;
Molto importanti sono state la analisi relative al tipo e formato dei documenti da assumere come input ed alla presentazione ottimale del servizio rispetto all'usabilità. &lt;br /&gt;
&lt;br /&gt;
Centrale nel lavoro ed avvincente è stata la definizione della strategia per il riconoscimento dei lessemi attraverso la costruzione dinamica di ''regex'' idonee. In questo fase del lavoro, anche per passione personale, ho approfondito le questioni del riconoscimento &amp;quot;di testi nei testi&amp;quot; che legano, fin dalle origini, l'informatica e la linguistica.&lt;br /&gt;
&lt;br /&gt;
La fase di definizione dell'architettura del servizio mi ha permesso di ripercorrere molte le materie studiate nei tre anni del Corso di Ingegneria Informatica, affrontando argomenti  come il Single Responsibility Principle, il Dependency Inversion Principle, lo &amp;quot;stile&amp;quot; architetturale REST. Molto istruttiva è stata anche la riflessione sulla scomposizione del servizio in moduli software.&lt;br /&gt;
&lt;br /&gt;
Come sempre accade nell'affrontare un progetto nuovo, sono nate molte nuove idee; ho così immaginato numerosi sviluppi futuri, sia a perfezionamento funzionale dell'accesso web al servizio, sia ad estensione delle specifiche per coprire casi applicativi contigui (es. quando il dato che si vuole trattare è un codice fiscale). Dovendo necessariamente tener presente che questo lavoro è una tesi, verificherò con il supporto del mio relatore come poterne proseguire lo sviluppo.&lt;br /&gt;
&lt;br /&gt;
==Bibliografia==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0000]https://en.wikipedia.org/wiki/Comparison_of_Office_Open_XML_software&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0001]https://en.wikipedia.org/wiki/Comparison_of_OpenDocument_software&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0002]https://en.wikipedia.org/wiki/Standardization_of_Office_Open_XML&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0003]https://en.wikipedia.org/wiki/OpenDocument_standardization&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0004]https://support.apple.com/en-us/HT202227&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0005]https://en.wikipedia.org/wiki/Pages_(word_processor)&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0006]https://en.wikipedia.org/wiki/Comparison_of_word_processors&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0007]https://en.wikipedia.org/wiki/OpenDocument&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0008]https://en.wikipedia.org/wiki/Office_Open_XML_file_formats&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0009]https://en.wikipedia.org/wiki/Rich_Text_Format&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0010]https://www.ecma-international.org/publications/standards/Ecma-376.htm&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0011]https://www.iso.org/standard/51463.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0012]https://www.iso.org/standard/71691.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0013]https://en.wikipedia.org/wiki/Office_Open_XML&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0014]https://en.wikipedia.org/wiki/Open_Packaging_Conventions&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0015]https://en.wikipedia.org/wiki/LAMP_(software_bundle)&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0016]https://w3techs.com/blog/entry/debian_ubuntu_extend_the_dominance_in_the_linux_web_server_market_at_the_expense_of_red_hat_centos&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0017]https://news.netcraft.com/archives/2014/06/06/june-2014-web-server-survey.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0018]https://whatis.techtarget.com/definition/LAMP-Linux-Apache-MySQL-PHP&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0019]https://www.ibm.com/cloud/learn/lamp-stack-explained&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0020]https://en.wikipedia.org/wiki/Single_responsibility_principle&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0021]https://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0022]https://en.wikipedia.org/wiki/Latin_script_in_Unicode&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0023]https://it.wikipedia.org/wiki/ISO/IEC_8859-1&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0024]http://www.treccani.it/enciclopedia/uso-delle-maiuscole_%28La-grammatica-italiana%29/&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0025]https://en.wikipedia.org/wiki/Ambiguity#Linguistic_forms&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0026]Steven L. Small; Garrison W Cottrell; Michael K Tanenhaus (22 October 2013). Lexical Ambiguity Resolution: Perspective from Psycholinguistics, Neuropsychology and Artificial Intelligence. Elsevier Science. ISBN 978-0-08-051013-2.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0027]http://www.treccani.it/vocabolario/disambiguazione/&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0028]R. Navigli, K. Litkowski, O. Hargraves. 2007. SemEval-2007 Task 07: Coarse-Grained English All-Words Task. Proc. of Semeval-2007 Workshop (SemEval), in the 45th Annual Meeting of the Association for Computational Linguistics (ACL 2007), Prague, Czech Republic, pp. 30–35 http://www.aclweb.org/anthology/S/S07/S07-1006.pdf&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0029]https://wordnet.princeton.edu/&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0030]R. Navigli, S. P. Ponzetto. BabelNet: Building a Very Large Multilingual Semantic Network. Proc. of the 48th Annual Meeting of the Association for Computational Linguistics (ACL 2010), Uppsala, Sweden, July 11-16, 2010, pp. 216-225. http://aclweb.org/anthology/P/P10/P10-1023.pdf&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0031]Roventini A., Alonge A., Calzolari N., Magnini B., Bertagna F. (2000), &amp;quot;ItalWordNet: a Large Semantic Database for Italian&amp;quot;, Proc. of the 2nd International Conference on Language Resources and Evaluation (LREC 2000), Athens, Greece, 2000, pp. 783-790.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0032]E. Pianta, L. Bentivogli, C. Girardi. MultiWordNet: developing an aligned multilingual database, Proc. of the First International Conference on Global WordNet, Mysore, India, January 21-25, 2002. http://multiwordnet.fbk.eu/paper/MWN-India-published.pdf&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0033]https://www.iso.org/standard/28245.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0034]https://www.gpdp.it/web/guest/regolamentoue&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0035]https://eur-lex.europa.eu/legal-content/IT/TXT/?uri=uriserv:OJ.L_.2016.119.01.0001.01.ITA&amp;amp;toc=OJ:L:2016:119:TOC&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0036]https://www.corriere.it/Primo_Piano/Cronache/2006/09_Settembre/15/cognomi.shtml&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0037]https://data.world/axtscz/italian-first-names&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0038]https://en.wikipedia.org/wiki/Dependency_inversion_principle&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0039]https://imperialcollegelondon.app.box.com/s/lqqcugie51pllz26uixjvx0uio8qxgo5/file/493461282808&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0040https://www.docx4java.org/trac/docx4j]&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0041]https://github.com/plutext/docx4j&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0042]https://docs.oracle.com/javase/9/docs/api/java/lang/String.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0043]https://github.com/php/php-src/blob/master/ext/session/session.c&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0044]https://github.com/plutext/docx4j/search?q=getJAXBNodesViaXPath+in%3Afile&amp;amp;type=Code&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0045]https://www.w3.org/TR/xpath-30/&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0046]&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0047]&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0048]&lt;br /&gt;
&lt;br /&gt;
==Indice delle figure==&lt;br /&gt;
&lt;br /&gt;
[0F00]https://en.wikipedia.org/wiki/Latin_script&lt;br /&gt;
&amp;lt;!-- [[File:Latin alphabet world distribution.svg|thumb|upright=1.6|In verde scuro le nazioni dove è usato solo l'alfabeto latino; in verde chiaro quelle dove all'alfabeto latino è affiancato un altro alfabeto.]] --&amp;gt;&lt;br /&gt;
[0F01]Diagramma di Venn 1&lt;br /&gt;
&lt;br /&gt;
[0F02]Diagramma di Venn 2&lt;br /&gt;
&lt;br /&gt;
[0F03]Diagramma di Venn 3&lt;br /&gt;
&lt;br /&gt;
[0F04]Esito unit test regex (cartella immagini)&lt;br /&gt;
&lt;br /&gt;
[0F05]Inforgrafica GDPR&lt;br /&gt;
&lt;br /&gt;
[0F06]Diagramma di sequenza UML&lt;br /&gt;
&lt;br /&gt;
[0F07]Formula unicità valore elementi in un insieme &lt;br /&gt;
&lt;br /&gt;
[0F08]Primo calcolo valutazione algoritmo&lt;br /&gt;
&lt;br /&gt;
[0F09]Secondo calcolo valutazione algoritmo&lt;br /&gt;
&lt;br /&gt;
[0F10]Terzo calcolo valutazione algoritmo&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
	<entry>
		<id>http://wikis.primomiglio.it/index.php?title=Servizio_web_per_il_trattamento_dei_dati_personali_contenuti_in_documenti_OOXML_complessi&amp;diff=164</id>
		<title>Servizio web per il trattamento dei dati personali contenuti in documenti OOXML complessi</title>
		<link rel="alternate" type="text/html" href="http://wikis.primomiglio.it/index.php?title=Servizio_web_per_il_trattamento_dei_dati_personali_contenuti_in_documenti_OOXML_complessi&amp;diff=164"/>
		<updated>2019-09-29T21:15:37Z</updated>

		<summary type="html">&lt;p&gt;Lorenzo.amorosa: /* Introduzione */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduzione==&lt;br /&gt;
&lt;br /&gt;
Il recente Regolamento Generale europeo sulla Protezione dei Dati (UE) 2016/679 ([0034], [0035]) o ''GDPR'' (''General Data Protection Regulation'', come nel seguito sarà chiamato) ha modernizzato significativamente la normativa in materia di protezione dei dati personali, rendendola omogenea fra tutti gli stati membri. È bene notare che, fin dal titolo, il ''GDPR'' non riduce gli spazi per i trattamenti di dati personali, ma anzi ne protegge la &amp;quot;libera circolazione&amp;quot;, dettando, però, regole definite e certe. Rinunciando ad una presentazione più completa del ''GDPR'', saranno riportati nei successivi capitoli i concetti necessari alla discussione dell'argomento.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Enti ed organizzazioni, aventi a che fare con documenti contenenti dati sensibili, devono operare in maniera conforme al ''GDPR''; potrebbero, di conseguenza, trarre beneficio da servizi specifici in grado di supportarli in queste esigenze.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
L'oggetto principale della tesi sarà dunque, come riportato dal titolo, la progettazione e la realizzazione di un servizio per la gestione di dati personali.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F05])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La larga maggioranza dei documenti testuali viene generata con strumenti cosiddetti di &amp;quot;produttività individuale&amp;quot;, cioè da ''word-processors''. L'osservazione, ovvia nella sua evidenza, consente di introdurre una riflessione: quando un documento è generato da un'elaborazione automatica, magari per composizione di ''template'' con dati estratti da un database, l'individuazione dei &amp;quot;dati personali&amp;quot; nel documento prodotto può avvenire in modo rigoroso e senza incertezze, sulla base degli elementi di composizione del documento; ad es.: i campi del documento estratti da una anagrafica di soggetti sono certamente dati personali e come tali possono essere opportunamente trattati nel processo di elaborazione automatica (ad es. cancellati).&lt;br /&gt;
&lt;br /&gt;
Ma, in quella larga maggioranza di documenti testuali generata con ''word-processors'' l'individuazione ed il trattamento dei dati personali vanno affrontati con altri approcci, discussi in questa tesi.&lt;br /&gt;
&lt;br /&gt;
==Scenario di lavoro==&lt;br /&gt;
&lt;br /&gt;
===Minimizzazione dei dati personali===&lt;br /&gt;
&lt;br /&gt;
Un concetto espresso in modo pervasivo dal ''GDPR'' è quello della &amp;quot;''minimizzazione''&amp;quot; dei dati personali trattati ed a maggior ragione dei dati personali pubblicati. In particolare l'Art. 5 ed il Considerando 39 prescrivono che i dati personali trattati siano &amp;quot;''adeguati, pertinenti e limitati a quanto necessario rispetto alle finalità per le quali sono trattati («minimizzazione dei dati»)''&amp;quot; ([0035]).&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Con questo fine, il GDPR delinea due possibilità organizzative e tecniche di &amp;quot;''minimizzazione''&amp;quot;: l'anonimizzazione e la psedonimizzazione.&lt;br /&gt;
&lt;br /&gt;
====Anonimizzazione====&lt;br /&gt;
&lt;br /&gt;
Sono anonimizzati i dati personali non (più) riferibili alle persone a cui sono appartenuti; si tratta di serie di dati, spesso ingenti, che sono stati definitivamente ed irreversibilmente separati da ogni riferimento alle persone che caratterizzavano. Sono le serie di dati utilizzate per fini statistici, scientifici, etc. E' importante notare che, come fissato dal Considerando 26 del ''GDPR'', il Regolamento non si applica al &amp;quot;''trattamento di tali informazioni anonime''&amp;quot; ([0035]). Per questo, sottoporre database e documenti ad un procedimento, cioè un trattamento, di anonimizzazione consente di non doversi più preoccupare del ''GDPR''.&lt;br /&gt;
&lt;br /&gt;
====Pseudonimizzazione====&lt;br /&gt;
&lt;br /&gt;
Fra le definizioni dell'Art. 4 del ''GDPR'', la &amp;quot;pseudonimizzazione&amp;quot; viene indicata come &amp;quot;''il trattamento tale che i dati personali non possano più essere attribuiti a un interessato specifico senza l’utilizzo di informazioni aggiuntive, a condizione che tali informazioni aggiuntive siano conservate separatamente''&amp;quot; ([0035]).&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Traducendo in termini &amp;quot;operativi&amp;quot;, si tratta del procedimento che, dal &amp;quot;record&amp;quot; dei dati di un interessato, separa i campi che caratterizzano l'interessato stesso da quelli che lo identificano, trasferendo questi ultimi in una nuova distinta tabella; nelle due tabelle vengono aggiunti i riferimenti che permettono la ricostruzione del record originario; il procedimento è completo quando la nuova tabella con gli identificativi viene archiviata separatamente ed eventualmente cifrata. In margine si annota che in molti casi, come molti studi dimostrano, è possibile identificare, quindi &amp;quot;riconoscere&amp;quot;, gli interessati utilizzando la sola tabella con i dati pseudonimizzati.&lt;br /&gt;
&lt;br /&gt;
====Altri trattamenti di &amp;quot;minimizzazione&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Un problema pratico che si incontra di frequente è quello di dover pubblicare documenti più o meno ampi che contengono dati personali. Spesso la pubblicazione è obbligatoria per legge: si pensi alle graduatorie relative a concorsi pubblici, alle sentenze dei tribunali, etc.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In questi frequenti casi, analizzando meglio le finalità per le quali sono pubblicati quei dati personali, si osserva che sono possibili e legittimi almeno due approcci per &amp;quot;minimizzare&amp;quot; il dato nel &amp;quot;trattamento di pubblicazione&amp;quot; e, dunque, per minimizzarne la propagazione, ad esempio attraverso motori di ricerca, ben oltre ogni ragionevole finalità. I contesti ed i corrispondenti approcci sono:&lt;br /&gt;
#  Situazioni in cui è necessario che l'interessato possa riconoscersi nel documento ed essere riconosciuto dagli altri soggetti menzionati nel contesto, ma non è plausibile la necessità di identificazione dell'interessato al di fuori di quel contesto specifico. A questo caso si riconducono le graduatorie di concorsi, gli elenchi per la formazione di classi, gli elenchi per convocazioni, etc. In tutti questi casi, nel processo di redazione del documento è più pratico trattare internamente i dati personali in forma completa; ma praticamente mai è necessario pubblicarli per intero, esponendo al pubblico accesso codici fiscali, indirizzi, recapiti telefonici etc. Per di più, nella maggior parte delle volte, è sufficiente pubblicare il solo cognome perché l'interessato conosca la sua posizione in graduatoria; ciò è spesso sufficiente anche a trasmettere l'informazione necessaria ai colleghi dell'interessato nella medesima graduatoria, o nella medesima classe, etc. Notare che, pubblicando il solo cognome, viene di fatto oscurato anche il sesso. Dunque, in questi casi è auspicabile cancellare una larga parte dei dati personali presenti nel documento.&lt;br /&gt;
# Situazioni in cui il documento deve essere pubblicato affinché siano rese note le motivazioni che lo hanno originato, senza che sia necessaria la precisa identificazione dei soggetti che vi compaiono. Questo è il caso della pubblicazione di sentenze giudiziarie di ogni grado. Le sentenze vengono notificate direttamente agli &amp;quot;aventi causa&amp;quot;; ma anche, come la legge prescrive, pubblicate al fine di costituire giurisprudenza. In questo secondo caso, risulta del tutto eccedente la pubblicazione dei reali nominativi degli interessati, che troverebbero verosimilmente la propria vicenda inutilmente indicizzata dai motori di ricerca negli anni a venire. Nella pubblicazione delle sentenze appare un approccio ottimale quello di sostituire con pseudonimi o con iniziali alterate i veri nominativi degli interessati presenti: il senso e le argomentazioni della sentenza restano pienamente comprensibili, come è necessario; il dato personale, del tutto superfluo ai fini della giurisprudenza, viene protetto.&lt;br /&gt;
In questi casi appare opportuno sostituire i dati identificativi dell'interessato, ed in particolare il nome e cognome, con pseudonimi o, ancora, con iniziali alterate, cioè non coincidenti con le iniziali reali. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Proprio questi tipi di trattamenti di &amp;quot;minimizzazione&amp;quot; sono l'oggetto di questa tesi.&lt;br /&gt;
&lt;br /&gt;
===Punti di partenza per la progettazione del servizio===&lt;br /&gt;
&lt;br /&gt;
La tesi è stata svolta in collaborazione con l'azienda AFA Systems (www.afasystems.it/gdpr) con la quale si sono discusse le problematiche di progettazione e realizzazione di un servizio generalizzato di minimizzazione dei dati personali presenti in un documento.&lt;br /&gt;
Con l'intenzione di fornire il servizio ad un bacino d'utenza il più vasto e variegato possibile, si è pensato ad un'applicazione ''web-based'', indipendente così dai singoli devices sui quali poi sarà utilizzata.&lt;br /&gt;
L'attenzione è stata concentrata sul trattamento dei nomi e dei cognomi (che da qui chiameremo nominativi), poiché sono quelli sempre presenti nei documenti (ad es. gli indirizzi sono presenti solo a volte), rappresentano gli elementi tramite i quali è immediato il riconoscimento della persone, non hanno formato predefinito (come ad es. i codici fiscali); altri dati personali (indirizzi, codici fiscali, etc.), potranno essere considerati in successive evoluzioni del progetto.&lt;br /&gt;
È utile notare che la parte iniziale della collaborazione con l'azienda è stata dedicata alla discussione delle specifiche, la cui più precisa definizione è parte rilevante di questa tesi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Tra i requisiti che necessitano di un opportuno studio troviamo ad esempio:&lt;br /&gt;
* L'individuazione di metodi efficaci per il riconoscimento dei nominativi nei documenti&lt;br /&gt;
* L'identificazione delle migliori procedure di interazione con l'utente&lt;br /&gt;
* La scelta dei formati da trattare&lt;br /&gt;
* I vincoli non funzionali legati al rispetto del ''GDPR''.&lt;br /&gt;
&lt;br /&gt;
==Definizione delle specifiche==&lt;br /&gt;
&lt;br /&gt;
===Riconoscimento dei nominativi===&lt;br /&gt;
&lt;br /&gt;
====Scelta della strategia di riconoscimento====&lt;br /&gt;
 &lt;br /&gt;
Le difficoltà principali con cui ci si imbatte nel processo di riconoscimento dei nominativi riguardano la complessità strutturale dei documenti di testo, ma soprattutto l'intrinseca ambiguità del linguaggio naturale. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Le variabili ed impredicibili strutture e formattazioni dei documenti introducono alcuni problemi significativi. Rendendo fortemente eterogeneo il contenuto dei documenti, infatti, esse non consentono di ricondurre il problema del riconoscimento dei nominativi ad uno o a pochi singoli casi, ma comportano lo studio di tutte le strutture e formattazioni possibili, rendendo quindi l'analisi molto generale. L'altra rilevante difficoltà presente sta nella complessità di effettuare il riconoscimento di una stringa testuale immersa in un insieme di elementi non tutti testuali. Ogni elemento di formattazione, che sia una tabella o una barra orizzontale, introduce infatti un proprio significato logico e semantico nel documento di cui bisogna tenere conto.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Il linguaggio naturale introduce anch'esso complessità: si pensi alle molteplici tipologie di proposizioni con cui possono essere articolati i periodi; ma i problemi principali derivano dalle sue ambiguità. Esse vengono classificate in diverse tipologie ([0025]); le principali sono le ambiguità sintattiche e lessicali.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si ha ambiguità sintattica quando la sintassi di una frase può essere interpretata in diversi modi e, di conseguenza, la frase stessa assume significati diversi. Essa è presente, ad esempio, nelle seguenti frasi:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
* &amp;quot;''Rapina in banca con rivoltella da centomila euro''&amp;quot;&lt;br /&gt;
* &amp;quot;''Luigi ha visto un uomo nel parco con il binocolo''&amp;quot;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
L'esasperazione massima della problematica delle ambiguità sintattiche si presenta con l'&amp;lt;i&amp;gt;antinomia&amp;lt;/i&amp;gt;, ossia un particolare tipo di paradosso che indica la compresenza di due affermazioni contraddittorie che possono essere entrambe dimostrate o giustificate.&lt;br /&gt;
L'antinomia di Epimenide o ''Paradosso del mentitore'', nota fin dal VI secolo, è probabilmente uno dei più noti esempi: &amp;quot;''il cretese Epimenide afferma che tutti i cretesi mentono''&amp;quot;. Se la proposizione è vera (i cretesi mentono) allora il suo significato implica che sia falsa (Epimenide mente e quindi i cretesi dicono la verità), ma se è falsa (i cretesi dicono la verità) ciò significa che è vera (Epimenide dice la verità e quindi i cretesi mentono). La proposizione appare contemporaneamente vera e falsa. A partire dagli anni venti del '900, sono state elaborate varie teorie per la risoluzione delle contraddizioni provocate dalle antinomie, soprattutto attraverso l'elaborazione di linguaggi multilivello o attraverso l'elaborazione di logiche polivalenti (quindi non-booleane).&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si ha ambiguità lessicale, invece, quando una parola possiede più di un significato nella lingua a cui appartiene ([0026]), in tal caso la parola è definita ''polisemica''. In italiano, alcuni termini soggetti a questo tipo di ambiguità sono, ad esempio &amp;quot;''acuto''&amp;quot; o &amp;quot;''venti''&amp;quot;. È questo genere di ambiguità che risulta critico per il riconoscimento dei nominativi. La difficoltà determinata dalle ambiguità sintattiche, infatti, riguarda l'individuazione corretta di soggetti, predicati e complementi di un periodo, mentre le ambiguità lessicali ostacolano la comprensione del significato del singolo lessema. Nel processo di riconoscimento è irrilevante determinare la funzione logica che il nominativo svolge nella frase, mentre è necessario essere certi che i termini che compongono il nominativo siano effettivamente dei nomi propri di persona o dei cognomi, non altri vocaboli del lessico comune. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In linguistica, l'intervento con cui si toglie ambiguità a una parola o a una frase prende il nome di &amp;quot;disambiguazione&amp;quot; ([0027]). Il problema della disambiguazione automatica (in inglese ''Word Sense Disambiguation'' o, abbreviato, ''WSD'') riveste particolare importanza nelle ricerche sull'intelligenza artificiale e, in particolare, nell'elaborazione del linguaggio naturale. Si prevedono benefici della disambiguazione, ad esempio, in programmi di traduzione automatica, recupero dell'informazione o estrazione automatica di informazioni. Nell'analisi delle soluzioni esistenti in letteratura per la risoluzione delle ambiguità, ci si sofferma specialmente sulle ricerche incentrate sul trattamento dell'ambiguità lessicale, essendo essa la più rilevante per i nostri interessi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
La ''WSD'' richiede due input necessariamente: un dizionario per specificare i sensi che devono essere disambiguati e un corpus di dati linguistici da disambiguare. Nello scenario più realistico, si trattano testi le cui parole non sono note a priori e risulta molto onerosa la produzione del corpus, essendo infatti necessaria la valutazione di un operatore umano per verificare la correttezza delle disambiguazioni effettuate dagli algoritmi (''supervised learning'').&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Uno tra i principali dizionari semantici-lessicali utilizzati della lingua inglese è ''WordNet'' ([0029]), mentre alcuni dei database equivalenti che trattano l'italiano sono ''BabelNet'' ([0030]), ''ItalWordNet'' ([0031]) e ''MultiWordNet'' ([0032]).&lt;br /&gt;
Un elemento importante da considerare è che le prestazioni di disambiguazione per la lingua inglese, impiegando ''WordNet'', risultano corrette tra l'80% e il 90% delle volte ([0028]), percentuali discrete ma non sufficienti per avere la totale garanzia.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
I fattori che ostacolano la realizzazione di algoritmi di intelligenza artificiale per la disambiguazione sono molteplici:&lt;br /&gt;
# Differenze tra dizionari impiegati: i database prima citati si basano su varie fonti che raggruppano semanticamente in maniera diversa i vocaboli, quindi programmi sviluppati con dizionari diversi generalmente hanno performance differenti.&lt;br /&gt;
# Complessità della codifica di parte del discorso: per poter disambiguare correttamente un termine è importante riuscire a comprendere correttamente il contesto in cui è inserito, operazione non banale.&lt;br /&gt;
# Varianza tra giudici: i supervisori dell'apprendimento degli algoritmi possono avere opinioni diverse, o semplicemente sbagliare, nella valutazione delle disambiguazioni, ciò porta ad algoritmi che hanno comportamenti diversi.&lt;br /&gt;
# Impossibilità di applicare la disciplina della ''pragmatica'', ossia la logica del ''buon senso'': per identificare correttamente il senso di alcune parole, ad esempio nella comprensioni di anafore e catafore, è necessario applicare il buon senso.&lt;br /&gt;
# Dipendenza del senso delle parole dai contesti: ogni scenario richiede la propria divisione del significato delle parole in sensi rilevanti. In un contesto informatico, ad esempio, il termine &amp;quot;''mouse''&amp;quot; deve essere ricondotto al dispositivo di puntamento, non al cognome del celebre personaggio Disney ''Mickey Mouse''; viceversa dovrà invece avvenire in un contesto di letteratura a fumetti.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Laddove la ''WSD'' è una tecnica molto generale e che mira a risolvere un'ambiguità riguardante una qualunque parola, per le finalità del servizio oggetto di questa tesi è sufficiente risolvere le ambiguità dei nomi e dei cognomi. &lt;br /&gt;
Uno dei difetti che il servizio presenterebbe adottando un approccio ''WDS'' è legato alla impredicibile formattazione dei documenti, che aggiunge informazione semantica al testo ma introduce complessità nella individuazione automatica delle parti che formano il contesto; un altro difetto dipende dalla vastità del lessico da elaborare, essendo i documenti da trattare forniti dai più disparati utenti, su qualunque genere di argomento e relativi ai più vari ambiti.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La strategia che sarà adottata per risolvere la problematica del riconoscimento dei nominativi sarà impostata attraverso un modello ''pattern-based'', impiegando le ''regular expressions'' (''regex''). Esse risultano comunemente usate per effettuare operazioni di ricerca o sostituzione in un testo, di conseguenza se si riesce ad individuare un pattern associato ad un nominativo dato, allora sarà possibile processare il documento ricercando le occorrenze del nominativo e &amp;quot;minimizzarlo&amp;quot; opportunamente.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le ''regular expressions'' risultano particolarmente efficaci poiché, se opportunamente progettate, possono identificare un nominativo indipendentemente dal significato linguistico del contesto in cui è calato, basandosi piuttosto sui singoli caratteri che compongono i lessemi analizzati; permettono, di conseguenza, di effettuare una valutazione estremamente minuziosa, riducendo al minimo le possibilità di errori.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Un algoritmo di risoluzione ''pattern-based'' risulta, inoltre, più efficiente nell'esecuzione, in generale, di un algoritmo di intelligenza artificiale; per fornire la risposta il più velocemente possibile ad un utente, fruitore del servizio via web, l'approccio di riconoscimento tramite pattern è il più indicato.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Definizione dei pattern====&lt;br /&gt;
Nella progettazione del servizio si adotta, come detto, un approccio ''pattern-based'' per il riconoscimento dei nominativi. In linea di massima è opportuno che vengano riconosciuti più nominativi possibili e allo stesso tempo che la correttezza dell'identificazione di un nominativo sia garantita, quindi bisogna individuare dei pattern non troppo stringenti ma neppure troppo laschi. Per analizzare come i pattern devono essere strutturati si prende come caso di studio un generico nominativo, ad esempio ''Lorenzo Mario Amorosa''. Nel documento esso può comparire esattamente come appena indicato, ma anche in altre plausibili varianti, in cui l'ordine dei termini viene alterato, si pensi ad esempio ad &amp;quot;Amorosa Lorenzo Mario&amp;quot; o &amp;quot;Mario Lorenzo Amorosa&amp;quot;, o in altre varianti ancora in cui alcuni nomi non compaiono, come in &amp;quot;Lorenzo Amorosa&amp;quot;. Bisogna tuttavia supporre un limite alla variabilità: si osserva infatti che il cognome deve sempre comparire (il solo nome ''Lorenzo'' non è riconducibile a ''Lorenzo Mario Amorosa'') e che esso inoltre deve essere necessariamente anteposto o posposto, ma non interposto, ai nomi (è poco ragionevole ricondurre &amp;quot;Lorenzo Amorosa Mario&amp;quot; a &amp;quot;Lorenzo Mario Amorosa'').&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Questa prima specifica permette di ricondursi a una soluzione generale, sufficiente nella maggior parte dei casi, ma che non risolve alcune criticità. Un nominativo può, in alcuni documenti, comparire manifestandosi unicamente attraverso il cognome (riferendoci all'esempio precedente, ''Lorenzo Mario Amorosa'' apparirebbe nella forma ''Amorosa''). Sorge qui il problema che molti dei cognomi italiani hanno un significato proprio nel linguaggio comune; ad es., nella frase ''una relazione amorosa è bella'' è errato considerare la parola ''amorosa'' come cognome di un nominativo. Per risolvere questo genere di ambiguità si potrebbe pensare che per stabilire che il termine ''Amorosa'' sia un cognome sia sufficiente verificare che esso inizi con una lettera maiuscola, ma ciò può verificarsi anche perché la parola si trova ad inizio di frase. Inoltre, vari cognomi italiani possono iniziare con una lettera minuscola (''de Angelis'', ''d'Onofrio'', etc.), quindi basare l'identificazione di un cognome sul fatto che la sua prima lettera sia in maiuscolo non è in generale un metodo valido. Volendo in maniera prioritaria garantire il corretto funzionamento del servizio, e quindi attuare le procedure di anonimizzazione solo sui nominativi senza applicarle erroneamente ad altri termini, risulta necessario evitare il trattamento dei nominativi che si manifestano con i soli cognomi. Per via del contesto e dei significati che i cognomi possono assumere, infatti, risulta spesso impossibile distinguerli da parole del linguaggio comune. &lt;br /&gt;
&lt;br /&gt;
Ci si concentra, quindi, nello studio di nominativi composti da un cognome seguito o preceduto da uno o più nomi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si rappresenta dunque in formato di ''regular expression'' il pattern attualmente ideato. Per semplicità espositiva, si definisce il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; come l'insieme delle permutazioni di tutti i nomi del nominativo più l'insieme delle permutazioni di tutti i possibili sottoinsiemi di nomi del nominativo. Considerando il nominativo preso precedentemente come caso di studio, ad esempio, si avrebbe:&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt; &amp;lt;nomi&amp;gt; = Lorenzo Mario|Mario Lorenzo|Lorenzo|Mario&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Posto inoltre il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt; ad indicare il cognome contenuto nel nominativo e il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;regex&amp;gt;&amp;lt;/span&amp;gt; ad indicare la ''regular expression'' associata al nominativo, si ottiene:&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt; &amp;lt;regex&amp;gt; := &amp;lt;cognome&amp;gt; (&amp;lt;nomi&amp;gt;)|(&amp;lt;nomi&amp;gt;) &amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Una osservazione sottile ma di fondamentale importanza per la corretta progettazione delle ''regular expressions'' sta nella piena comprensione della semantica dell'operatore di scelta, espresso con il carattere ''pipe'' (&amp;quot;|&amp;quot;). Un qualunque ''engine'' di elaborazione delle ''regex'', infatti, interrompe la valutazione di una stringa non appena può stabilire se tale stringa fa match o meno con il pattern dato, senza quindi necessariamente valutarlo nella sua interezza, come parimenti avviene nelle valutazioni ''a corto circuito'' delle espressioni logiche nei linguaggi di programmazione. Ogni nominativo avrà a sè associato un pattern che lo rappresenta in più possibili sequenze di caratteri; per effettuare una corretta &amp;quot;minimizzazione&amp;quot; dei dati è necessario che le sequenze contenenti tutti i nomi sia poste per prime, mentre quelle contenenti un singolo nome per ultime.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In questa prima formulazione della ''regex'', inoltre, si è posto come separatore unicamente lo spazio bianco, ma alcuni documenti potrebbero contenere dei nominativi i cui termini sono separati da altri caratteri, come ad esempio una virgola nel caso di &amp;quot;Amorosa, Lorenzo Mario&amp;quot;. Per poter quindi identificare un nominativo anche in questi casi, si potrebbe considerare un qualunque carattere di interpunzione come possibile separatore dei termini del nominativo.&lt;br /&gt;
Adottando questa soluzione si ha però come effetto collaterale che risultano critici i casi in cui nel testo sono presenti dei nominativi soggetti ad omonimia. Si consideri una generica frase contenente una sequenza di nominativi, ad esempio ''Amorosa Lorenzo, Mario Giacomo e Fabio Rossi'', e si supponga che i nominativi da trattare siano ''Amorosa Lorenzo Mario'', ''Mario Giacomo'' (in cui la parola ''Mario'' è il cognome) e ''Fabio Rossi''. Gli ultimi due nominativi compaiono nella frase nella loro forma estesa, mentre il primo compare con il solo nome ''Lorenzo'' (eventualità possibile considerando la definizione del pattern precedentemente data). Considerando la virgola come carattere separatore dei termini del nominativo, la sequenza di parole ''Amorosa Lorenzo, Mario'' sarebbe ricondotta, venendo elaborata per prima, ad ''Amorosa Lorenzo Mario'', mentre rimarrebbe non trattata la parola ''Giacomo'', in quanto il cognome ''Mario'' che gli era associato è stato già identificato come un nome del nominativo ''Amorosa Lorenzo Mario'' ed il termine ''Giacomo'' preso singolarmente non rappresenta un nominativo.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Prima di valutare ulteriormente le problematiche relative alle omonimie, si possono scegliere due approcci per risolvere questo specifico caso:&lt;br /&gt;
# Si riconduce una sequenza di parole ad un nominativo se e solo se tutti i suoi nomi sono contenuti nella sequenza&lt;br /&gt;
# Si considerano come separatori dei termini contenuti nei nominativi solo spazi bianchi, tabulazioni e a capo, non gli altri segni di punteggiatura.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Entrambe le strategie sono valide, in quanto risolvono il problema garantendo la corretta identificazione dei nominativi, ma allo stesso tempo entrambe presentano lo svantaggio di ridurre le sequenze di parole riconducibili a dei nominativi, aumentando le possibilità che alcuni di essi non vengano trattati.&lt;br /&gt;
Si consideri nuovamente il nominativo preso come caso di studio ''Amorosa Lorenzo Mario'': applicando la prima strategia, non sarebbe possibile ricondurgli la sequenza ''Amorosa Lorenzo'', mentre applicando il secondo metodo non sarebbe riconducibile la sequenza ''Amorosa, Lorenzo Mario''.&lt;br /&gt;
Si decide di attuare la seconda strategia, in quanto è opportuno non imporre vincoli troppo stringenti sui nomi e poiché nella gran parte dei casi i termini dei nominativi nei documenti sono separati tra loro da caratteri quali spazi bianchi, tabulazioni ed a capo.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Un altro elemento su cui porre l'attenzione è la possibilità che i documenti da trattare contengano dei nominativi scritti interamente in maiuscolo o minuscolo, di conseguenza è conveniente che le ''regular expressions'' siano progettate ''case-insensitive''.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Un ulteriore punto su cui bisogna soffermarsi è la posizione all'interno di un periodo in cui un nominativo può comparire, in particolare si vogliono evitare quei casi critici in cui uno dei termini del nominativo è una sotto-stringa di un'altra parola del testo (si pensi ad ''amorosa'' in ''clamorosa''). Come regola generale si può stabilire che è sempre necessario che un nominativo sia preceduto e seguito da un ''carattere non alfabetico''. Un caso particolare si presenta quando il nominativo è posto ad inizio o a fine documento, situazione in cui quindi esso non è preceduto o non è seguito da alcun carattere: entrambe le posizioni sono da considerare corrette.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
È opportuno ora definire il concetto di ''carattere non alfabetico'', e ciò si può fare più facilmente ragionando sul problema in logica positiva; infatti risulta più semplice individuare quei caratteri che rappresentano lettere piuttosto che quelli che rappresentano segni di interpunzione ed individuare ogni altro carattere che non può mai comporre una parola.&lt;br /&gt;
&lt;br /&gt;
Inquadrando lo scenario di applicazione del servizio, molto probabilmente l'utente vorrà trattare un documento scritto nella lingua di uno dei paesi dell'Unione Europea, poiché il ''GDPR'' vige nei soli paesi membri dell'Unione.&lt;br /&gt;
Si può, quindi, ipotizzare che i documenti trattati possono sì contenere parole e nominativi stranieri, ma che i caratteri contenuti siano appartenenti all'alfabeto latino (''Latin script''), usato in molti stati nel mondo e da tutti i principali stati europei (fatta eccezione per la Grecia ed alcuni stati che scrivono in caratteri cirillici).&lt;br /&gt;
Inoltre, testi scritti in altri alfabeti, come esempio il cinese, l'arabo o il cirillico, vengono generalmente traslitterati. Considerare, quindi, ''caratteri non alfabetici'' tutti i caratteri diversi dalle lettere contenute nell'alfabeto latino sarebbe di conseguenza estremamente riduttivo ed inoltre in questo modo non si terrebbe conto delle lettere accentate, molto utilizzate anche nella lingua italiana.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(XXXX QUI IMG [0F00])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per risolvere il problema facciamo riferimento alla codifica standard Unicode dell'alfabeto latino ([0022]); in essa è possibile individuare, oltre ai caratteri rappresentanti le lettere nella codifica ''ASCII'' classica, i caratteri rappresentanti le lettere nella codifica standard ''ISO/IEC 8859-1'' ([0023]), encoding orientato principalmente alla rappresentazione delle lingue dell'Europa occidentale.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;i&amp;gt;Caratteri latini nei primi due blocchi dello standard Unicode&amp;lt;/i&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;nounderlines&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;border-collapse:collapse&amp;quot;&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; &lt;br /&gt;
!style=&amp;quot;background:#ccf; text-align:center; font-weight: bold;&amp;quot;|U+&lt;br /&gt;
!style=&amp;quot;text-align:center; font-weight: bold;&amp;quot;|0||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|1||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|2||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|3||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|4||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|5||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|6||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|7||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|8||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|9||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|A||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|B||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|C||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|D||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|E||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|F||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|Block||style=&amp;quot;text-align: center; font-weight: bold;&amp;quot;|#&lt;br /&gt;
|-&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|0040&lt;br /&gt;
|style=&amp;quot;background:#fff&amp;quot;|@||A||B||C||D||E||F||G||H||I||J||K||L||M||N||O&lt;br /&gt;
|rowspan=&amp;quot;4&amp;quot; style=&amp;quot;background:#fff&amp;quot; align:&amp;quot;center&amp;quot;|C0 Controls and Basic Latin&amp;lt;br&amp;gt;0000–007F&amp;lt;br&amp;gt;(identical to ASCII)&lt;br /&gt;
|rowspan=&amp;quot;4&amp;quot; style=&amp;quot;background:#fff&amp;quot;|52&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|0050&lt;br /&gt;
|P||Q||R||S||T||U||V||W||X||Y||Z||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#91;||style=&amp;quot;background:#fff&amp;quot;|\||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#93;||style=&amp;quot;background:#fff&amp;quot;|^||style=&amp;quot;background:#fff&amp;quot;|_&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|0060&lt;br /&gt;
|style=&amp;quot;background:#fff&amp;quot;|`||a||b||c||d||e||f||g||h||i||j||k||l||m||n||o&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|0070&lt;br /&gt;
|p||q||r||s||t||u||v||w||x||y||z||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#123;||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#124;||style=&amp;quot;background:#fff&amp;quot;|&amp;amp;#125;||style=&amp;quot;background:#fff&amp;quot;|~||style=&amp;quot;background:#fff; font-size:75%&amp;quot;|DEL&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;19&amp;quot;| &lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#fff&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00A0&lt;br /&gt;
|&amp;amp;nbsp;||¡||¢||£||¤||¥||¦||§||¨||©||ª||«||¬||||®||¯&lt;br /&gt;
|rowspan=&amp;quot;6&amp;quot; style=&amp;quot;background:#fff&amp;quot; align=&amp;quot;center&amp;quot;|C1 Controls and Latin-1 Supplement&amp;lt;br&amp;gt;0080–00FF&amp;lt;br&amp;gt;(identical to ISO/IEC 8859-1)&lt;br /&gt;
|rowspan=&amp;quot;6&amp;quot; style=&amp;quot;background:#fff&amp;quot;|62&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#fff&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00B0&lt;br /&gt;
|°||±||²||³||´||µ||¶||·||¸||¹||º||»||¼||½||¾||¿&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00C0&lt;br /&gt;
|À||Á||Â||Ã||Ä||Å||Æ||Ç||È||É||Ê||Ë||Ì||Í||Î||Ï&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00D0&lt;br /&gt;
|Ð||Ñ||Ò||Ó||Ô||Õ||Ö||style=&amp;quot;background:#fff&amp;quot;|×||Ø||Ù||Ú||Û||Ü||Ý||Þ||ß&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00E0&lt;br /&gt;
|à||á||â||ã||ä||å||æ||ç||è||é||ê||ë||ì||í||î||ï&lt;br /&gt;
|----- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#fff; text-align:center; font-weight: bold;&amp;quot;|00F0&lt;br /&gt;
|ð||ñ||ò||ó||ô||õ||ö||style=&amp;quot;background:#fff&amp;quot;|÷||ø||ù||ú||û||ü||ý||þ||ÿ&lt;br /&gt;
|---- align=&amp;quot;center&amp;quot; style=&amp;quot;background:#f66&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I caratteri indicati in rosso nella tabella sono tutti i possibili ''caratteri alfabetici'' che compaiono nei documenti scritti in 29 lingue diverse ([0023]), tra le quali sono presenti l'italiano, l'inglese, lo spagnolo, il tedesco e il portoghese. &lt;br /&gt;
Aggiungendo pochi altri caratteri all'insieme dei ''caratteri alfabetici'' appena mostrati, si riesce a rappresentare ogni parola di altre 12 lingue ([0023]), tra cui il francese, l'olandese, il ceco e il turco.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
I caratteri mostrati in tabella corrispondono ad una parte dei primi due blocchi dello standard Unicode che codificano l'alfabeto latino e, come già accennato in precedenza, essi sono presenti negli standard ''ASCII'' e ''ISO/IEC 8859-1''. I rimanenti ''caratteri alfabetici'', invece, sono presenti in estensioni dello standard Unicode per il ''Latin script''. Queste estensioni sono state realizzate per fornire il massimo supporto a tutte le lingue e contenenti molti simboli ad uso speciale, come ad esempio per la rappresentazione dei fonemi. Si osserva, inoltre, che i ''caratteri alfabetici'' definiti nelle estensioni dello standard Unicode sono presenti anche nella codifica ''ISO/IEC 8859-2'' o nelle versioni successive ([0023]).&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Definiti i ''caratteri non alfabetici'' come elementi di separazione tra un nominativo ed il testo in cui esso è inserito, occorre definire opportunamente la ''regex'' che al nominativo è associata.&lt;br /&gt;
&lt;br /&gt;
Utili strumenti messi a disposizione dalle ''regular expressions'' sono i gruppi speciali ''lookahead'' e ''lookbehind''. Un pattern di un nominativo deve essere preceduto o seguito da una prestabilita sequenza di caratteri, la quale però non è parte del nominativo. Utilizzando i due costrutti citati, è possibile far sì che nell'elaborazione di una stringa facciano match solamente le parole effettivamente appartenenti al nominativo, non i caratteri che lo delimitano dal resto del testo, e allo stesso tempo che un nominativo faccia match se e solo se preceduto o seguito da una certa sequenza di caratteri. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per esprimere nella sintassi delle ''regex'' un carattere letterale in un qualunque alfabeto si può utilizzare il costrutto ''\p{L}'', che però risulta molto generale e troppo lasco per i requisiti considerati. Si può piuttosto valutare l'impiego del costrutto ''\p{Latin}'', il quale identifica un qualunque carattere alfabetico presente nell'alfabeto latino. Tra i caratteri corrispondenti al costrutto, però, ve ne sono alcuni che per le specifiche del servizio devono essere considerati ''caratteri non alfabetici'', come ad esempio i caratteri dei fonemi, i segni diacritici e gli indicatori ordinali; di conseguenza è necessario individuare una strategia ad hoc per risolvere questa problematica.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per chiarezza espositiva, si definisce il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;start&amp;gt;&amp;lt;/span&amp;gt;, per indicare un qualunque carattere non alfabetico o l'inizio stringa, il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;end&amp;gt;&amp;lt;/span&amp;gt;, per indicare un qualunque carattere non alfabetico o il fine stringa, ed il tag &amp;lt;extra&amp;gt;, per indicare i ''caratteri alfabetici'' non presenti negli standard ''ASCII'' o ''ISO/IEC 8859-1'':&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;extra&amp;gt; := ĿŀČčŘřŠšŽžĲĳŒœŸŐőŰűḂḃĊċḊḋḞḟĠġṀṁṠṡṪṫĀāĒēĪīŌōŪūİıĞğŞşẀẁẂẃŴŵŶŷǾǿẞ&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;start&amp;gt; := (?&amp;lt;=[^A-Za-zÀ-ÖØ-öø-ÿ&amp;lt;extra&amp;gt;]|^)&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;end&amp;gt; := (?=[^A-Za-zÀ-ÖØ-öø-ÿ&amp;lt;extra&amp;gt;]|$)&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva che si sono utilizzati i gruppi speciali prima descritti e che si sono inseriti i caratteri dello standard Unicode presentati in precedenza. Si definisce nuovamente la ''regular expression'' associata ad un generico nominativo. Applicando i tag appena definiti, il costrutto ''(?i)'' che rende il pattern ''case-insensitive'' ed il costrutto ''\s'' che rappresenta un carattere qualunque tra i separatori non visibili, ossia ''\r \n \t \f \v'' e lo spazio bianco, si ottiene:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;regex&amp;gt; := (?i)(&amp;lt;start&amp;gt;&amp;lt;cognome&amp;gt;\s+(&amp;lt;nomi&amp;gt;)|(&amp;lt;nomi&amp;gt;)\s+&amp;lt;cognome&amp;gt;&amp;lt;end&amp;gt;)&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva, inoltre, che in questa nuova formulazione della ''regular expression'' i nomi sono da intendersi separati tra loro da ''\s+''.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
A questo punto si è quasi giunti alla formulazione finale del pattern da associare ad un nominativo, rimangono solo da trattare alcuni casi critici non ancora risolti.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt; &lt;br /&gt;
Si è già presentato in precedenza il problema legato al fatto che alcuni cognomi possono avere un significato proprio nel lessico comune e che ciò costringeva, quindi, ad abbandonare l'idea di trattare nominativi formati dal solo cognome. Questa problematica di ambiguità si presenta anche con alcuni nomi (si pensi, ad esempio, al nome ''Gioia''). Ciò non rappresenta generalmente un problema, in quanto la coppia nome-cognome che forma il nominativo, presa complessivamente, non è soggetta ad ambiguità. Esistono, però, dei casi in cui questo non è vero. Si prenda in analisi il nominativo ''Gioia Grande'': risulta evidentemente soggetto a rischio di ambiguità. Una soluzione che si può adottare, per risolvere questo caso critico, si basa sull'associazione di un pattern più stringente ai nominativi. In particolare, si osserva che i nomi propri di persona compaiono sempre ed obbligatoriamente, in un documento grammaticalmente corretto, con la prima lettera maiuscola ([0024]). I cognomi, invece, non sono soggetti ad una regola così stringente: un cognome iniziante con una lettera minuscola (come ''de Rosa'') in alcuni casi, ad esempio se posto dopo un punto fermo, può comparire scritto con la prima lettera sia maiuscola che minuscola; naturalmente, in nessuna occorrenza un cognome che inizi con una lettera maiuscola potrà comparire con una minuscola. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Occorre quindi ridefinire, alla luce di queste osservazioni, la ''regex'' associata ad un nominativo, poiché precedentemente era stata posta interamente ''case-insensitive''. Nel pattern, in particolare, i nomi dovranno sempre iniziare con una maiuscola, mentre i cognomi avranno questo vincolo solo se nel nominativo compaiono con la prima lettera maiuscola. Si mostra quindi quali sono i tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; e &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt; associati a due nominativi, ad esempio ''Gioia Grande'' e ''Antonio de Rosa''. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per ''Gioia Grande'' si ha:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt; = G((?i)ioia)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt; = G((?i)rande)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Per ''Antonio de Rosa'' si ha:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt; = A((?i)ntonio)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt; = (?i)de Rosa&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si presenta dunque la definizione finale del tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;regex&amp;gt;&amp;lt;/span&amp;gt;. Nella definizione il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; è definito il base al numero di nomi del nominativo ed il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt; è definito in base al carattere iniziale del cognome.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;regex&amp;gt; := &amp;lt;start&amp;gt;&amp;lt;cognome&amp;gt;\s+(&amp;lt;nomi&amp;gt;)|(&amp;lt;nomi&amp;gt;)\s+&amp;lt;cognome&amp;gt;&amp;lt;end&amp;gt;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Vengono inoltre mostrati i valori dei due tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; e &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt;&amp;lt;/span&amp;gt; per il nominativo preso come caso di studio in fase iniziale, ossia ''Amorosa Lorenzo Mario''. Si ottiene:&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt; = L((?i)orenzo)\s+M((?i)ario)|M((?i)ario)\s+L((?i)orenzo)|L((?i)orenzo)|M((?i)ario)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;cognome&amp;gt; = A((?i)morosa)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Infine, per completezza, viene mostrata la ''regular expression'', associata a quest'ultimo nominativo, risolvendo tutti i tag che la compongono:&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;regex&amp;gt; = (?&amp;lt;=[^A-Za-zÀ-ÖØ-öø-ÿĿŀČčŘřŠšŽžĲĳŒœŸŐőŰűḂḃĊċḊḋḞḟĠġṀṁṠṡṪṫĀāĒēĪīŌōŪūİıĞğŞşẀẁẂẃŴŵŶŷǾǿẞ]|^)(A((?i)morosa)\s+(L((?i)orenzo)\s+M((?i)ario)|M((?i)ario)\s+L((?i)orenzo)|L((?i)orenzo)|M((?i)ario))|(L((?i)orenzo)\s+M((?i)ario)|M((?i)ario)\s+L((?i)orenzo)|L((?i)orenzo)|M((?i)ario))\s+A((?i)morosa))(?=[^A-Za-zÀ-ÖØ-öø-ÿĿŀČčŘřŠšŽžĲĳŒœŸŐőŰűḂḃĊċḊḋḞḟĠġṀṁṠṡṪṫĀāĒēĪīŌōŪūİıĞğŞşẀẁẂẃŴŵŶŷǾǿẞ]|$)&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Gestione delle omonimie====&lt;br /&gt;
&lt;br /&gt;
Nei ragionamenti che hanno portato alla formulazione della ''regular expression'' associata ai nominativi, si è tenuto conto di possibili ambiguità con termini appartenenti al linguaggio comune, risolte con l'introduzione nel pattern di stringhe ''case-sensitive'', e di possibili nominativi posti in sequenza parzialmente omonimi (ossia aventi un nome o il cognome in comune tra loro), gestite con l'imposizione dei soli caratteri separatori non visibili come delimitatori delle parole componenti un nominativo. Per rendere l'analisi completa occorre valutare come ci si debba comportare in altri possibili casi di omonimia. Si osserva, per inciso, che nel pattern individuato nella sezione precedente il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nomi&amp;gt;&amp;lt;/span&amp;gt; è stato l'unico non definito formalmente. La definizione di tale tag infatti dipende, oltre che dai nomi del nominativo, anche dall'insieme complessivo dei nominativi da trattare presenti nel documento.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Il caso più semplice di omonimia, che si verifica quando un solo nome o il solo cognome di un nominativo coincide con un nome o il cognome di un altro (come nel caso di ''Lorenzo Mario Amorosa'' e ''Stefano Amorosa''), risulta già ben gestito dall'attuale formulazione del pattern. Infatti, un riconoscimento è determinato quando almeno un nome e il cognome del nominativo appaiono in sequenza.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Il problema si complica quando un nominativo ha due o più componenti in comune con un altro. Si osserva che se l'omonimia riguarda solo i nomi dei nominativi, ciò non risulta problematico, in quanto il cognome, supposto sempre presente nel pattern, funge da elemento di disambiguazione. Si considera da ora, quindi, che i nominativi abbiano il medesimo cognome e si analizzano i casi in cui anche uno o più nomi risultano in comune, attraverso degli esempi: &lt;br /&gt;
* Nomi_A = {&amp;quot;Lorenzo&amp;quot;, &amp;quot;Mario&amp;quot;, &amp;quot;Luca&amp;quot;}; Nomi_B = {&amp;quot;Stefano&amp;quot;, &amp;quot;Mario&amp;quot;}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F01])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In questo caso sono elementi di disambiguazione i nomi ''Lorenzo'' e ''Luca'' per il primo nominativo e ''Stefano'' per il secondo, bisognerà quindi far sì che almeno uno tra tali nomi compaia sempre nelle ''regex'' associate ai nominativi in questione. L'occorrenza ''Mario &amp;lt;cognome&amp;gt;'' rimane ambigua e non può essere trattata.&lt;br /&gt;
* Nomi_A = {&amp;quot;Lorenzo&amp;quot;, &amp;quot;Mario&amp;quot;, &amp;quot;Luca&amp;quot;}; Nomi_B = {&amp;quot;Mario&amp;quot;, &amp;quot;Luca&amp;quot;}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F02])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
L'insieme Nomi_B risulta un sottoinsieme di Nomi_A, di conseguenza solo il primo nominativo presenta degli elementi utili per risolvere l'ambiguità. Nel pattern relativo al primo nominativo dovrà essere presente almeno un tra i nomi non in comune, mentre il pattern del secondo nominativo rappresenterà inevitabilmente espressioni ambigue poiché riconducibili all'altro. Le soluzioni possibili sono due: rifiutarsi di effettuare il trattamento del secondo nominativo oppure decretare che esso è riconosciuto se e solo se appare nella sua forma estesa, presentando quindi tutti i nomi. Quest'ultima soluzione è ragionevole e la si sceglie, poiché così si aumentano, per quanto possibile, le sequenze &amp;quot;minimizzabili&amp;quot;, e viene inoltre messo in conto di informare l'utente opportunamente sulla gestione di questo genere di omonimia per rendere le operazioni trasparenti.&lt;br /&gt;
* Nomi_A = Nomi_B = {&amp;quot;Lorenzo&amp;quot;, &amp;quot;Mario&amp;quot;, &amp;quot;Luca&amp;quot;}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F03])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Qualora l'insieme dei nomi dei due nominativi sia identico risulta impossibile distinguerli e non possono in alcun modo essere trattati, poiché l'ordine con cui compaiono i nomi di un nominativo non rappresenta un elemento di disambiguità. I dati appartenenti a persone completamente omonime contenuti in uno stesso documento, quindi, non sono &amp;quot;minimizzabili&amp;quot; distintamente.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva che è di fondamentale importanza che i documenti che gli utenti forniscono siano grammaticalmente corretti, in quanto un errato uso dei segni di interpunzione può rendere impossibile l'applicazione delle ''regular expression''. Si prenda ad esempio una sequenza anomala di caratteri in cui non è corretto l'uso delle virgole, come &amp;quot;''Amorosa Mario Rossi Giacomo''&amp;quot;: supponendo che nel documento si vogliano trattare i nominativi ''Amorosa Mario'', ''Rossi Mario'' e ''Rossi Giacomo'', risulta impossibile identificare quali tra questi siano rappresentatati nella sequenza.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In conclusione, risultano quindi individuate le strategie che permettono di formulare ''regular expressions'' anche per i nominativi soggetti ad omonimia.&lt;br /&gt;
&lt;br /&gt;
====Formattazione dei documenti====&lt;br /&gt;
 &lt;br /&gt;
I documenti prodotti in enti ed organizzazioni presentano generalmente formattazioni e non sono puramente testuali. Si vuole qui considerare quale debbano essere le interpretazioni più adatte da dare agli elementi grafici per rendere sempre efficace il riconoscimento dei nominativi. In particolare, quindi, non si tratteranno gli elementi di punteggiatura, come parentesi o virgolette, poiché già compresi nelle ''regex'', bensì tutti gli elementi che in un pattern composto da caratteri non sono espressi. Si inizia dunque la rassegna:&lt;br /&gt;
* Elementi di formattazione del testo&lt;br /&gt;
I font, la dimensione dei caratteri, il grassetto, il corsivo, l'evidenziazione e tutti i possibili elementi di modifica della apparizione grafica del testo non alterano il significato dei lessemi coinvolti. Se il cognome di un nominativo è posto in grassetto ed il nome no, ad esempio, la coppia nome-cognome rappresenta sempre il nominativo iniziale; lo stesso vale per gli altri elementi citati.&lt;br /&gt;
* Aree di comparizione del testo&lt;br /&gt;
In genere ogni documento è formato da più sezioni, ha un corpo principale ed eventuali titoli, note a piè pagina, intestazioni ed altre possibili aree. Il trattamento di &amp;quot;minimizzazione&amp;quot;, secondo il ''GDPR'', deve essere effettuato al documento in ogni sua parte, ma ogni sezione deve essere elaborata in maniera indipendente dalle altre sezioni in quanto rappresenta un blocco logico a sé. Ciò significa che, ad esempio, bisogna individuare eventuali nominativi presenti nel titolo, ma non bisogna considerare nominativo una sequenza di parole che è posta in parte nel titolo e in parte nel primo paragrafo del testo.&lt;br /&gt;
* Elementi blocco&lt;br /&gt;
Gli elementi blocco, come ad esempio le immagini, possono causare un'interruzione netta in un paragrafo, suddividendolo quindi in più blocchi logici, che devono essere analizzati separatamente; tuttavia nel caso in cui questi elementi siano posti ''fluttuanti'', ossia ancorati ai bordi della pagina, il testo scorre in un unico flusso e forma quindi un unico blocco logico.&lt;br /&gt;
* Divisione in sillabe&lt;br /&gt;
Un problema rilevante nella formattazione del documento è che spesso, per esigenze estetiche, contiene delle parole divise in sillabe poste su righe diverse e separate da un trattino. Ovviamente se un nome va a capo a fine linea non perde il suo significato semantico, bisognerà quindi continuare a riconoscerlo.&lt;br /&gt;
* Tabelle&lt;br /&gt;
Molti documenti, specialmente quelli contenenti ingenti quantità di nominativi, possono essere strutturati in forma tabellare. Trascurando una trattazione per esteso delle modalità con cui i nominativi potrebbero comparire nelle tabelle, si considera esclusivamente il caso di gran lunga più ricorrente. In genere, infatti, in una tabella contenente dei nominativi, essi sono presenti nella stessa colonna o in colonne contigue: l'una contenente i nomi, l'altra il cognome, o viceversa. Senza basarsi sull'intestazione delle colonne, si può valutare se il contenuto di due celle adiacenti poste su di una stessa riga faccia match con il pattern di un nominativo, ed in caso ciò accada si può affermare la coppia di celle individuata rappresenta un nominativo.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva che si sono fornite solamente le interpretazioni più plausibili e comuni a questi elementi grafici e non si è ideato alcun particolare algoritmo per la loro elaborazione. L'espressione di tali strutture, infatti, è fortemente determinata dal formato in cui il documento è redatto. Si rimanda, quindi, ai capitoli successivi per specificazioni ulteriori della soluzione. Occorre notare, infine, che gli elementi di formattazione non sono descritti da stringhe nel formato delle ''regular expressions'': bisognerà quindi integrare gli elementi presentati in questa sezione con l'approccio ''pattern-based'' adottato.&lt;br /&gt;
&lt;br /&gt;
===Analisi dell'usabilità===&lt;br /&gt;
&lt;br /&gt;
====Elenco dei nominativi da trattare esplicitamente espressi come dati in input====&lt;br /&gt;
&lt;br /&gt;
In questo caso, per usufruire del servizio, l'utente deve fornire un documento contenente una serie di nominativi da trattare. Una garanzia della corretta elaborazione del documento si ha richiedendo all'utente stesso quali siano i nominativi da trattare: in questo modo potranno essere &amp;quot;minimizzati&amp;quot; i dati (cioè i nominativi) di tutte e sole le persone espressamente richieste. In molti plausibili scenari, infatti, è necessario anonimizzare solo alcuni dei nominativi presenti nel documento; ad esempio in un atto giudiziario serve anonimizzare le parti in causa ma non i magistrati. &lt;br /&gt;
&lt;br /&gt;
Questa configurazione del servizio permette quindi all'utente di avere il massimo controllo possibile del risultato. Tuttavia questo approccio è poco pratico nel caso in cui i documenti da trattare contengano grandi quantità di nominativi diversi e, magari, l'utente che ne richiede il trattamento non li conosce; si pensi ad esempio a lunghe graduatorie di concorsi o altro. Si osserva inoltre che anche per pochi nominativi l'usabilità può degradare, se l'inserimento viene fatto con estemporanea digitazione, esposta anche al rischio di possibili errori di battitura, con conseguenti noiose ripetizioni delle operazioni.&lt;br /&gt;
&lt;br /&gt;
Si osserva, infine, che il sistema progettato è sufficientemente robusto nel trattare i nominativi in input espressi da un utente che ha digitato caratteri maiuscoli o minuscoli violando le convenzioni grammaticali. Supposto che il documento trattato debba essere grammaticalmente corretto, infatti, si ha la garanzia che i nomi ivi presenti comincino con una maiuscola; è sufficiente, quindi, forzare una conversione ''to-upper-case'' dei nomi inseriti dall'utente e le ''regex'' progettate funzionano correttamente. Un discorso a parte va fatto per i cognomi inseriti dall'utente, in quanto essi possono comparire con la prima lettera sia maiuscola che minuscola. L'inserimento di un cognome iniziante con una minuscola non crea grossi problemi, in quanto in tal caso la ''regex'' risultante sarebbe totalmente ''case-insensitive'' per il cognome, mentre l'aggiunta di un cognome cominciante con una maiuscola determina una ''regex'' ''case-insensitive'' per la prima lettera del cognome; qualora quindi un utente inserisse un nominativo tutto in maiuscolo, le occorrenze del cognome, presenti nel documento, inizianti con una lettera minuscola non verrebbero riconosciute.&lt;br /&gt;
Per le altre lettere dopo la prima, sia per i nomi che per i cognomi, il pattern è stato progettato ''case-insensitive'', quindi non emergono problemi. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
In sintesi, il rischio che vengano introdotte delle ambiguità lessicali, incaricando l'utente dell'inserimento dei nominativi, è piuttosto basso ed il controllo che si ha sui nominativi è il massimo desiderabile, mentre i requisiti di usabilità risultano penalizzati.&lt;br /&gt;
&lt;br /&gt;
====Elenco dei nominativi da trattare dedotti automaticamente da un dizionario====&lt;br /&gt;
&lt;br /&gt;
Se si desidera privilegiare la tematica dell'usabilità nella progettazione del servizio, risulta necessario individuare delle strategie che semplifichino il più possibile i compiti che devono essere svolti dall'utente. L'unica operazione che inevitabilmente resta a suo carico è l'upload del documento da trattare; non è infatti necessario richiedergli l'elencazione dei nominativi dei nominativi da trattare, in quanto questi possono essere dedotti automaticamente impiegando dei dizionari, dei quali va quindi valutato il contenuto e le modalità di utilizzo. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si scarta subito l'ipotesi di dedurre automaticamente i nominativi basandosi unicamente sul fatto che le iniziali di nomi e cognomi siano maiuscole; come già argomentato infatti l'uso delle lettere maiuscole non è limitato solo a questi usi e, inoltre, non si può avere la certezza che un cognome inizi con una maiuscola.&lt;br /&gt;
&lt;br /&gt;
Sono disponibili fortunatamente alcuni dizionari di nomi ed altri di cognomi, in diverse lingue; si fa qui riferimento a quelli di &amp;quot;Data World&amp;quot; (un'azienda focalizzata sulla raccolta, produzione e pubblicazione di dataset: https://data.world) ([0037]).&lt;br /&gt;
&lt;br /&gt;
Si inizia l'analisi inquadrando le dimensioni che un dizionario contenente nomi o cognomi avrebbe. Risalta subito all'occhio la differenza tra il numero di termini contenuti nei due casi: facendo riferimento ai soli nomi e cognomi italiani, risultano esistenti circa 350.000 cognomi ([0036]) e circa 9.000 nomi, dei quale circa 5.000 maschili e circa 4.000 femminili ([0037]); il numero dei cognomi è quindi quasi 40 volte più grande del numero dei nomi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si ipotizza, per chiarire le idee, di applicare questi dizionari in uno scenario reale, in cui, ad esempio, si vuole trattare un documento di 10 pagine contenente 5.000 parole. Si trascurano inoltre i meccanismi che permettono di ricondurre un nome od un cognome ad un nominativo per concentrarsi unicamente sul numero di confronti necessari da effettuare nell'elaborazione. Nel peggiore dei casi possibili, ossia quando nessuna parola del documento compare tra i termini del dizionari, e dove occorre quindi confrontare ogni singola parola del documento con tutti i termini del dizionario, per semplice moltiplicazione si ottiene che l'impiego di un dizionario di nomi darebbe luogo a 45.000.000 confronti, mentre un dizionario di cognomi ben a 1.750.000.000 confronti. Se invece le parole nel documento fossero 50.000 si avrebbero 450.000.000 di confronti nel primo caso e 10.750.000.000 nel secondo. In sintesi, sebbene il rapporto tra il numero di confronti nei due casi rimanga sempre costante (circa 1:40) indipendentemente dalla lunghezza del documento, la differenza tra il numero di confronti cresce proporzionalmente al numero di parole che vengono sottoposte all'elaborazione. Per quantificare, infine, attraverso un unità di tempo, la differenza esistente tra l'impiego delle due diverse tipologie di dizionario, si realizza un semplice programma java, di cui si riporta qui sotto il contenuto del metodo principale, che realizza i confronti necessari attraverso l'uso di ''regular expression'':&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
final String regex = &amp;quot;\bLorenzo\b&amp;quot;;&amp;lt;br/&amp;gt;&lt;br /&gt;
final String string =  ... //testo di prova&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);&amp;lt;br/&amp;gt;&lt;br /&gt;
final Matcher matcher = pattern.matcher(string);&amp;lt;br/&amp;gt;&lt;br /&gt;
int start, total;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
start = System.currentTimeMillis();&lt;br /&gt;
while (matcher.find()) {&lt;br /&gt;
    System.out.println(&amp;quot;Full match: &amp;quot; + matcher.group(0));&lt;br /&gt;
    for (int i = 1; i &amp;lt;= matcher.groupCount(); i++) {&lt;br /&gt;
        System.out.println(&amp;quot;Group &amp;quot; + i + &amp;quot;: &amp;quot; + matcher.group(i));&lt;br /&gt;
    }&lt;br /&gt;
} &amp;lt;br/&amp;gt;&lt;br /&gt;
total = System.currentTimeMillis() - start;&lt;br /&gt;
System.out.println(&amp;quot;Total: &amp;quot; + total + &amp;quot; ms&amp;quot;);&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Eseguendo il test più volte, inserendo fino a 10 occorrenze della parola &amp;quot;Lorenzo&amp;quot; nel testo, si ha un tempo di elaborazione medio di circa 3 ms, con prestazioni di picco di 2 ms, ottenibili con poche occorrenze del nome presenti, e tempo di attesa massimo di 6 ms, dovuto alla presenza invece a una presenza più frequente del nome nel testo.&lt;br /&gt;
Questo fenomeno si comprende meglio ricordando che, come spiegato nel capitolo precedente, le ''regular expressions'' ottimizzano la ricerca, considerano le stringhe del testo trattato solo finché necessario, ossia fino a quando non vi è certezza che esse corrispondano o non corrispondano ad un match. Ogni volta che nel testo si presenta una parola che inizia con una lettera diversa dalla 'L' di &amp;quot;Lorenzo&amp;quot;, la ricerca procede direttamente con la valutazione della parola successiva, ignorando i rimanenti caratteri della parola. &lt;br /&gt;
&lt;br /&gt;
Risulta, invece, più onerosa la verifica della corrispondenza tra una stringa ed il pattern desiderato, poiché in questo caso vanno elaborati tutti i caratteri della parola. Come caso limite, si è posta come stringa da elaborare la sequenza di caratteri &amp;quot;Lorenzo &amp;quot; ripetuta 500 volte: il tempo di esecuzione medio del programma risultante, a parità di piattaforma, è stato di circa 25 ms.&lt;br /&gt;
&lt;br /&gt;
Un'altra diretta conseguenza di questo meccanismo di confronto è che all'aumentare del numero di parole nel documento non corrisponde un eccessivo aumento del tempo di esecuzione: considerando un documento di 5000 parole, con 0 occorrenze del nome &amp;quot;Lorenzo&amp;quot; il tempo di esecuzione medio risulta di 9 ms, con 10 occorrenze di 10 ms, con 100 occorrenze di 15 ms.&lt;br /&gt;
&lt;br /&gt;
Occorre precisare, prima di formulare ulteriori ragionamenti, che in documento di 5.000 parole potranno essere presenti al più 2500 coppie nome-cognome; in un dizionario con più di 2.500 termini almeno uno di questi non contribuirà nell'individuazione di un nominativo. Se poi sono presenti altre parole oltre ai nominativi nel documento, la percentuale di nomi che presenterà 0 occorrenze crescerà di conseguenza. Ad ogni modo, si sceglie di sviluppare i ragionamenti considerando necessario il tempo medio di 10 ms per individuare le occorrenze di un termine di un dizionario in un documento di 5.000 parole; questo tempo è sicuramente maggiore rispetto al caso reale, ma valutando per eccesso questo valore è possibile trascurare il tempo impiegato nelle altre operazioni di routine a supporto dell'algoritmo di ricerca.&lt;br /&gt;
&lt;br /&gt;
Ritornando all'esempio di partenza, considerando quindi necessari 10 ms per individuare le occorrenze di un termine di un dizionario in un documento di 5.000 parole, risulta che l'identificazione di tutti i cognomi contenuti nel testo richieda circa 3.500 secondi, (quasi un'ora!), mentre l'individuazione dei nomi &amp;quot;solo&amp;quot; 90 secondi.&lt;br /&gt;
I tempi di attesa che l'utente dovrebbe aspettare sono estremamente elevati e irragionevoli, specialmente se calati nel contesto nelle ''web application''. Come primo espediente per ovviare al problema si decide di abbandonare completamente l'idea di impiegare un dizionario di cognomi, in quanto, seppur si individuassero delle soluzioni in grado di effettuare il riconoscimento di tutte le occorrenze di un termine in un documento indipendentemente dalla lunghezza in solo 1 ms (irreale), sarebbero comunque necessari 3 minuti e 50 secondi per l'elaborazione. Non verranno quindi neppure trattate possibili soluzioni che prevedono l'applicazione di entrambi i dizionari.&lt;br /&gt;
&lt;br /&gt;
I 90 secondi richiesti dal dizionario di nomi, invece, risultano anch'essi eccessivi, ma attraverso opportune valutazioni si possono individuare delle strategie che consentono la minimizzazione del tempo necessario all'elaborazione dei documenti. Tali metodi di ottimizzazione saranno trattati in un successivo capitolo, mentre ora ci si continua a concentrare sulle modalità di impiego del dizionario.&lt;br /&gt;
&lt;br /&gt;
Per inciso, si osserva che i problemi di efficienza sono strettamente legati al riconoscimento automatico dei nominativi, in quanto in questo caso devono essere applicate quasi una decina di migliaia di ''regex'' diverse; nel caso in cui i nominativi da elaborare e le ''regex'' a loro associate siano noti, si ha a che fare con un numero esiguo di pattern da trattare e l'esecuzione del programma risulta infinitamente più rapida.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per migliorare l'efficacia del servizio sarebbe opportuno introdurre nel dizionario anche nomi stranieri, sempre più diffusi in una società sempre più globalizzata. Il tempo di esecuzione medio del riconoscimento, già critico, crescerebbe ulteriormente: si decide allora di introdurre nel dizionario i soli nomi inglesi, in totale quasi 5500 ([0037]). Considerando sempre un tempo medio di esecuzione di 10 ms per nome, con un dizionario di circa 14.500 termini si avrebbe un tempo di esecuzione medio complessivo di 145 secondi, ossia pari a 2 minuti e 25 secondi, e risulta ancora possibile effettuare alcune ottimizzazioni che lo riducono ad un livello accettabile.&lt;br /&gt;
&lt;br /&gt;
Una volta individuati i nomi contenuti nel documento occorre stabilire se essi fanno parte di un nominativo, progettando un'opportuna ''regular expression''. È importante notare che per conseguire questo scopo bisogna individuare la soluzione più efficiente possibile.&lt;br /&gt;
&lt;br /&gt;
Un nominativo, come già ripetuto più volte, è composto da uno o più nomi e da un cognome. Individuato un nome, la priorità che si ha è verificare se accanto ad esso sia presente un cognome. Finora i cognomi sono stati supposti non regolamentati da alcun pattern specifico, ma è necessario formularne almeno uno per consentirne il riconoscimento automatico. È ragionevole supporre che un cognome sia formato da massimo due parole, separate da spazio o apostrofo, sempre inizianti entrambe con una maiuscola, fatta eccezione per la prima parola laddove essa sia una preposizione semplice o articolata oppure un articolo, tenendo conto dei possibili troncamenti, come &amp;lt;i&amp;gt;d'&amp;lt;/i&amp;gt; e &amp;lt;i&amp;gt;dell'&amp;lt;/i&amp;gt;. Inoltre per verificare se un termine adiacente al nome trovato rappresenti un nome si evita di impiegare nuovamente il dizionario per non gravare ulteriormente sul tempo di esecuzione. Inoltre, si nota che avendo supposto un cognome composto da massimo due parole inizianti con una lettera maiuscola, un altro nome, oltre quello trovato dal dizionario, viene già automaticamente riconosciuto qualora il cognome sia composto da una sola parola. Rinunciando ad individuare nominativi composti da tre nomi o più, si formula una ''regular expression'' per il riconoscimento automatico in seguito al identificazione di un nome, qui indicato con il tag &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;lt;nome&amp;gt;&amp;lt;/span&amp;gt;, supponendo il cognome come precedentemente indicato e ipotizzando la presenza di un ulteriore nominativo.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;prep&amp;gt; := d((a|e)(l(l[aeo]?)?|i|gli?)?|i)?|(ne|a|su)(l(l[aeo]?)?|i|gli)?|l[aeo]?|co[iln]?|i[ln]?|gli|per&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cognome&amp;gt; := (([A-Z][a-zA-ZÀ-ÖØ-öø-ÿ]*|&amp;lt;prep&amp;gt;)('|\s))?[A-Z][a-zA-ZÀ-ÖØ-öø-ÿ]+&lt;br /&gt;
&lt;br /&gt;
&amp;lt;second_name&amp;gt; := [A-Z][a-zA-ZÀ-ÖØ-öø-ÿ]+&lt;br /&gt;
&lt;br /&gt;
&amp;lt;regex&amp;gt; := (&amp;lt;second_name&amp;gt;\s)?(&amp;lt;nome&amp;gt;)\s&amp;lt;cognome&amp;gt;|&amp;lt;cognome&amp;gt;\s(&amp;lt;nome&amp;gt;)(\s&amp;lt;second_name&amp;gt;)?&lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Nella scrittura della ''regex'' si è prestata particolare attenzione all'utilizzo della simbologia per rendere l'espressione il più performante possibile, attraverso il massimo sfruttamento dei cortocircuiti logici e l'opportuno ordinamento dei caratteri (sono stati anteposti i caratteri comuni a più preposizioni od articoli). Inoltre, per alleggerire la ''regex'' si è rinunciato all'utilizzo dei caratteri dell'alfabeto latino non appartenenti ai primi due blocchi Unicode.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
È mostrata in figura la corretta elaborazione di 57 possibili casi di cognomi diversi&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F04])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva tuttavia che in alcune circostanze, come nella frase &amp;quot;''di Amorosa Lorenzo non si hanno notizie''&amp;quot;, accade che un parola (&amp;quot;''di''&amp;quot; in questo caso), non sia parte del cognome ma il programma non è in grado di riconoscerlo. Questa ambiguità è fortemente dipendente dal contesto e non è possibile trattarla senza significativi degradi delle performance; quindi è necessario rinunciare a trattarla, accettando riconoscimenti erronei. In altre situazioni, invece, dove magari si sta elaborando la stringa contenente il nominativo ''Mario Lorenzo'', risulta impossibile determinare quale tra i due termini sia il nome e quale il cognome; cioè significa che l'unico trattamento di &amp;quot;minimizzazione&amp;quot; automatico che risulta ragionevole applicare è la sostituzione del nominativo con uno pseudonimo, non il troncamento o l'alterazione dei nomi.&lt;br /&gt;
In conclusione, con il riconoscimento automatico dei nominativi si migliora complessivamente l'usabilità del servizio, in quanto l'utente non deve digitare i nominativi, ma la latenza introdotta è notevole, si è soggetti a rischi di ambiguità e non è in alcun modo esprimibile la preferenza su quali nominativi si desidera &amp;quot;minimizzare&amp;quot; o meno. La soluzione così ideata non risulta quindi adeguata.&lt;br /&gt;
&lt;br /&gt;
====Soluzione ibrida adottata====&lt;br /&gt;
Entrambe le tipologie di riconoscimento prima individuate hanno significativi problemi, si cerca quindi di sintetizzare una soluzione in grado di trarre i vantaggi dell'una e dell'altra. Risulta efficace, in particolare, che il documento venga inizialmente trattato tramite dizionari, evitando all'utente l'onere di specificare i nominativi, e che in seguito venga lasciata all'utente la possibilità di intervenire.&lt;br /&gt;
Infatti, esso potrebbe voler esprimere delle preferenze su quali nominativi debbano essere trattati tra quelli individuati e gestire gli eventuali errori di riconoscimento dovuti a richieste di trattamento di nominativi aventi un nome non presente nel dizionario o anche dovuti a casi di ambiguità lessicale già presentati.&lt;br /&gt;
&lt;br /&gt;
Una volta inserito il documento e terminata l'elaborazione tramite il dizionario, l'utente può sia richiedere l'immediato download del file ed effettuare le operazioni prima definite, attraverso un'opportuna interfaccia. Per fornire il supporto alle esigenze più disparate, si prevede la possibilità di:&lt;br /&gt;
# eseguire download del file trattato unicamente con il dizionario&lt;br /&gt;
# ripetere la &amp;quot;minimizzazione&amp;quot; del documento, specificando:&lt;br /&gt;
## nuovi nominativi&lt;br /&gt;
## quali nominativi tra quelli precedentemente individuati ''non'' si vogliono trattare&lt;br /&gt;
## quale parola/e dei nominativi individuati rappresenta il cognome (in tal caso, si possono utilizzare altri metodi, oltre alla sostituzione con pseudonimo, per il trattamento)&lt;br /&gt;
## quale parola/e dei nominativi individuati non compone il nominativo (situazione che si verifica quando ci si imbatte in una ambiguità).&lt;br /&gt;
&lt;br /&gt;
Senza soffermarsi in questo momento sull'intera sequenza concreta di interazioni tra utente e servizio, si osserva che l'unico vincolo non funzionale da valutare resta il tempo medio di attesa dell'utente. L'usabilità complessiva è molto buona ed i vincoli funzionali sono soddisfatti.&lt;br /&gt;
&lt;br /&gt;
===Scelta dei formati da trattare===&lt;br /&gt;
&lt;br /&gt;
Una considerazione intuitiva, ed una buona prassi, è che un documento contenente dati personali sia pseudonimizzato o anonimizzato quanto prima possibile e cioè quando è ancora solo nelle mani del suo autore: questo approccio scongiura che informazioni sensibili e dati personali in chiaro ''sfuggano'' in rete.&lt;br /&gt;
Si può per questo ragionevolmente ipotizzare che i naturali destinatari del servizio siano gli stessi autori (creatori) che redigono il documento. Nello scenario tipico di utilizzo, infatti, il fruitore del servizio procederà al trattamento dei dati non appena avrà finito di scrivere il documento del quale, essendone autore, potrà scegliere il formato. Si osserva che potrebbe accadere che il documento sia redatto da terzi: in tal caso l'utente che richiede il trattamento può scegliere il formato in maniera indiretta concordandolo con il redattore. Avendo quindi l'utente la possibilità di stabilire il formato del proprio documento, risulta ragionevole progettare un servizio che lavori su un solo formato.&lt;br /&gt;
A questo punto occorre individuare quale sia il formato che maggiormente si presta alle finalità del servizio.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Una possibilità è quella di richiedere all'utente di inserire come documento da trattare un semplice file di testo in formato ''txt'': in questo modo ci sarebbe il grande vantaggio di trattare file molto semplici, riducendo così al minimo la complessità realizzativa, e inoltre si avrebbe  l'indipendenza dagli editor di testo utilizzati, in quanto tutti supportano i file in formato ''txt''. &lt;br /&gt;
Risulta tuttavia sconveniente utilizzare questo formato, poiché non ha alcuna capacità espressiva per gestire elementi complessi come tabelle, modifiche allo stile del testo e così via. &lt;br /&gt;
Bisogna quindi optare per un formato in grado di gestire questi elementi, al costo di aumentare la complessità della progettazione, ricordando sempre che è necessario allo stesso tempo che tale formato sia supportato da tutti i principali editor di testo.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Con facilità è possibile individuare quali sono i formati di testo più comuni oltre al ''txt'': ''doc'', ''docx'', ''odt'', ''pdf'', ''pages'', ''rtf'', ''tex''. Si passa ora dunque a valutare quale tra questi formati potrebbe meglio soddisfare i requisiti prima enunciati. &lt;br /&gt;
Facendo una cernita iniziale sulla base delle finalità per le quali un formato è utilizzato, si può immediatamente escludere ''tex'', che trova impiego principalmente in ambito scientifico e matematico. In questo settore, infatti, non è richiesta generalmente l'applicazione delle procedura di trattamento dei dati. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt; &lt;br /&gt;
Si può inoltre abbandonare l'idea di trattare documenti con estensione ''pages'', formato proprietario di Apple, poiché utilizzati esclusivamente dall'omonimo editor di testo anch'esso proprietario, e i documenti con estensione ''rtf'', acronimo di ''Rich Text Format'', formato proprietario di Microsoft che supporta una formattazione avanzata, poiché, pur gestito da vari editor, è un formato decisamente datato (ultima versione 1.9.1 risalente a marzo 2008 ([0009])). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si esclude inoltre il formato ''pdf'' per motivi di usabilità: molti editor, infatti, consentono di esportare un documento in questo formato ma non permettono di importarlo. Un utente dopo aver effettuato l'anonimizzazione di un documento non può quindi proseguire modificandolo ulteriormente. Il ''Portable Document Format'', infatti, è ideato per realizzare dei documenti destinati alla sola lettura.&lt;br /&gt;
L'ultima esclusione, piuttosto immediata da effettuare, riguarda il formato ''doc'', binario e proprietario di Microsoft. Esso infatti risulta, a partire dal 2006, soppiantato dal formato ''docx'', sempre proprietario di Microsoft. &lt;br /&gt;
&lt;br /&gt;
Si giunge infine a valutare quale tra gli ultimi due possibili formati rimanenti, ossia ''docx'' e ''odt'', si presta meglio alle finalità del servizio. In via preliminare si osserva che entrambi i formati possiedono ottime capacità espressive, hanno una struttura interna di simile complessità e sono entrambi supportati dai principali editor di testo. È necessario quindi effettuare delle analisi più approfondite per poter sceglierne uno tra i due.&lt;br /&gt;
La struttura del formato ''docx'', sviluppato da Microsoft e formalmente denominato ''Office Open XML Document (OOXML Document)'', è costituita da un file compresso .zip contenente un insieme di file ''XML''. Il formato ''OOXML'' permette la rappresentazione, oltre che di documenti testuali, anche di fogli elettronici (formato ''OOXML 'Workbook'', noto anche come ''xslx'') e di presentazioni (formato ''OOXML Presentation'', noto anche come ''pptx'') ([0008], [0013]).&lt;br /&gt;
Il formato inoltre è stato inizialmente standardizzato nel 2006 dall'&amp;lt;i&amp;gt;ECMA&amp;lt;/i&amp;gt;  (come ''ECMA-376'') e successivamente nel 2008 dall'&amp;lt;i&amp;gt;ISO&amp;lt;/i&amp;gt; e dall'&amp;lt;i&amp;gt;IEC&amp;lt;/i&amp;gt; (come ''ISO/IEC 29500'') in una versione ''transitional'', retrocompatibile con alcune versioni precedenti del formato contenenti elementi deprecati, e in una versione ''strict'', dove tali elementi non sono ammessi. I due standard sono stati poi successivamente aggiornati e sono tutt'ora oggetto di revisioni ([0002]).&lt;br /&gt;
&lt;br /&gt;
Anche la struttura del formato open source ''odt'', sviluppato dall'&amp;lt;i&amp;gt;OASIS&amp;lt;/i&amp;gt; e formalmente denominato ''OpenDocument Text'', è basata su uno zip contenente un insieme di file ''XML''. Inoltre, il formato ''OpenDocument Format (ODF)'' permette di trattare fogli elettronici (formato ''OpenDocument Spreadsheet'', noto anche come ''ods'') e presentazioni (formato ''OpenDocument Presentation'', noto anche come ''odp'') ([0007]). Anche ''OpenDocument Text'' è stato standardizzato, in particolare dall'&amp;lt;i&amp;gt;OASIS&amp;lt;/i&amp;gt; stesso nel 2005 e dall'&amp;lt;i&amp;gt;ISO/IEC&amp;lt;/i&amp;gt; nel 2006, ed è soggetto a revisioni e aggiornamenti ([0003]).&lt;br /&gt;
&lt;br /&gt;
In sintesi, basandosi sulla struttura dei documenti e sulla standardizzazione dei formati, non è ancora possibile individuare quale sia il formato migliore. L'unico elemento che potrebbe portare punti a favore del formato ''odt'' è che esso, a differenza del formato ''docx'', è aperto, tuttavia, essendo le specifiche di entrambi i formati pubbliche, ciò non rappresenta un fattore determinante nell'elezione del formato.&lt;br /&gt;
Entrambi i formati, inoltre, sono largamente supportati dai word processors.&lt;br /&gt;
&lt;br /&gt;
Le seguenti tabelle riepilogano il supporto all'uno ed all'altro formato dei ''word-processors'' più usati, ossia ''Microsoft Office Word'', ''LibreOffice Writer'', ''OpenOffice Writer'' e ''Pages''. &lt;br /&gt;
Le tabelle sono tratte da wikipedia ([0000], [0001], [0006]). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;i&amp;gt;Supporto fornito dagli editor di testo al formato docx&amp;lt;/i&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  !! Microsoft Office Word !! LibreOffice Writer !! OpenOffice Writer !! Pages&lt;br /&gt;
|-&lt;br /&gt;
! Version&lt;br /&gt;
|| 2013, 2011 for Mac || All versions || 3.0 || '08&lt;br /&gt;
|-&lt;br /&gt;
! Operating systems&lt;br /&gt;
|| Windows, Mac OS X || Windows, OS X, Linux, Unix, Android || Windows, Linux, Unix, Mac OS X || Mac OS X&lt;br /&gt;
|-&lt;br /&gt;
! Office suite&lt;br /&gt;
|| Microsoft Office ||  || OpenOffice.org || iWork&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
|| Microsoft || The Document Foundation || Apache OpenOffice || Apple Inc.&lt;br /&gt;
|-&lt;br /&gt;
! License&lt;br /&gt;
|| proprietary || MPL || LGPL || proprietary&lt;br /&gt;
|-&lt;br /&gt;
! ECMA-376&lt;br /&gt;
|| yes || yes || yes || yes&lt;br /&gt;
|-&lt;br /&gt;
! ISO/IEC 29500:2008&lt;br /&gt;
|| yes || yes || || &lt;br /&gt;
|-&lt;br /&gt;
! Notes&lt;br /&gt;
||  ||  || Import only ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;i&amp;gt;Supporto fornito dagli editor di testo al formato odt&amp;lt;/i&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  !! Microsoft Office Word !! LibreOffice Writer !! OpenOffice Writer &lt;br /&gt;
|-&lt;br /&gt;
! Version&lt;br /&gt;
|| 2007 SP2 || 4.0.3 || 3.0.0&lt;br /&gt;
|-&lt;br /&gt;
! Operating systems&lt;br /&gt;
|| Windows || Unix-based systems, Mac OS X, Solaris || Windows, Linux, Unix-based systems, Mac OS X, Solaris&lt;br /&gt;
|-&lt;br /&gt;
! Office suite&lt;br /&gt;
|| Microsoft Office ||  || OpenOffice.org&lt;br /&gt;
|-&lt;br /&gt;
! Developer&lt;br /&gt;
|| Microsoft || The Document Foundation || Apache OpenOffice&lt;br /&gt;
|-&lt;br /&gt;
! License&lt;br /&gt;
|| Proprietary || MPL || LGPL&lt;br /&gt;
|-&lt;br /&gt;
! ISO/IEC 26300:2006&lt;br /&gt;
|| yes || yes || yes&lt;br /&gt;
|-&lt;br /&gt;
! Notes&lt;br /&gt;
|| some limitations || Multiple ODF versions supported (ISO/ODF 1.0/1.1/1.2/1.2 Extended) || adjustable ODF version (ISO/ODF 1.2) &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si possono effettuare le seguenti osservazioni:&lt;br /&gt;
* ''Microsoft Office Word'' è, in ambiente Microsoft, il word processor maggiormente usato; è molto usato anche in ambiente Apple Mac. Esso offre il pieno supporto al formato ''OOXML Document''; solo parzialmente invece gestisce il formato ''OpenDocument Text'': il processamento di file con estensione ''odt'' con questo editor comporta la perdita di alcune informazioni secondarie.&lt;br /&gt;
* ''LibreOffice Writer'', l'editor open source maggiormente utilizzato, supporta pienamente entrambi formati. Nato con lo scopo di gestire i file con formato ''OpenDocument Text'', attualmente supporta completamente anche il formato ''OOXML Document''. &lt;br /&gt;
* ''OpenOffice Writer'', un altro degli editor di testo tra i più utilizzati, supporta pienamente ''odt'', mentre è solo in grado di importare i file con estensione ''docx''.&lt;br /&gt;
* ''Pages'', il word process installato a default sui Mac della Apple e, di conseguenza anche maggiormente usato su questi dispositivi, non offre supporto al formato ''odt'', ma elabora correttamente i documenti con estensione ''docx'' ([0005],[0004]). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Queste osservazioni evidenziano che quindi è impossibile adottare un formato supportato da tutti gli editor; la scelta va allora indirizzata verso quello maggiormente supportato dai word processor più popolari.&lt;br /&gt;
Per avere un'indicazione di ''popolarità'', e quindi per poter comprendere meglio quali tra gli editor prima citati siano i più usati, si può fare un'analisi, tramite motori di ricerca, di quanti file con una certa estensione siano presenti in rete.&lt;br /&gt;
È possibile, ad esempio, ricercare su Google i file che contengono nel proprio nome una determinata sequenza di caratteri o aventi una certa estensione (''filetype''). Sono qui presentati i risultati delle interrogazioni riguardo ai file aventi formato ''docx'', ''doc'' e ''odt'' ed il cui nome contiene uno dei caratteri, fra i più frequenti, &amp;quot;1&amp;quot; o &amp;quot;a&amp;quot; o &amp;quot;e&amp;quot;. L'investigazione è stata effettuata inserendo nella barra di ricerca di Google le stringhe ''1 filetype:docx'', ''a filetype:docx'' e così via.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Formato cercato !! Documenti con &amp;quot;1&amp;quot; nel nome !! Documenti con &amp;quot;a&amp;quot; nel nome !! Documenti con &amp;quot;e&amp;quot; nel nome&lt;br /&gt;
|-&lt;br /&gt;
| docx || 16.900.000  || 12.800.000 || 8.730.000&lt;br /&gt;
|-&lt;br /&gt;
| odt || 736.000 || 667.000 || 507.000&lt;br /&gt;
|-&lt;br /&gt;
| doc || 32.300.000 || 26.300.000 || 21.500.000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Effettivamente il formato più diffuso è il ''doc''; tuttavia esso è supportato per retro-compatibilità anche dagli editor che supportano formati ''OOXML'', con i quali non si ha difficoltà nel convertire i documenti dal formato ''doc'' al ''docx''. In conclusione, quale che sia l'editor più diffuso, è ragionevole adottare il formato ''OOXML Document'' per le finalità del servizio, in quanto molto diffuso, ben supportato dagli editor e avente ottime capacità espressive. Di conseguenza i documenti che saranno elaborati dovranno essere forniti dall'utente in tale formato. In successive sezioni verrà approfondita la struttura dei documenti ''OOXML''.&lt;br /&gt;
&lt;br /&gt;
===Privacy by design===&lt;br /&gt;
&lt;br /&gt;
L'Art. 25 del ''GDPR'', con i Considerando 75 e 78, ha per titolo e per oggetto la &amp;quot;protezione dei dati fin dalla progettazione e protezione per impostazione predefinita&amp;quot; ([0035]), perfettamente in linea con i concetti di &amp;quot;minimizzazione&amp;quot;, già richiamati.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Il senso dell'Art. 25 viene spesso sintetizzato con l'espressione &amp;quot;''PbD - privacy by design, privacy by default''&amp;quot; ([0035]). Il principio fissato nell'Art. 25 dovrà sempre più essere tenuto ben presente nell'ambito dell'ingegneria del software, in quanto impone di adottare nuove cautele nella realizzazione delle applicazioni software.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Del principio ''PbD'' si è ben tenuto conto nella progettazione descritta in questa tesi. In particolare, relativamente alla ''privacy by design'', si è fatto in modo che nessun dato personale permanga registrato sul sistema di esecuzione, o altrove, al termine dell'applicazione. Anche laddove l'applicazione termini in modo anomale non vi sono strutture dati superstiti, che restano memorizzate sul sistema.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Marginale in questa tesi è la nozione di ''privacy by default'', giacché l'applicazione non offre all'utente alcuna opzione che possa indurlo in errore ed acconsentire a trattamenti dei dati personali, oltre quello realizzato dall'applicazione.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
È utile osservare quanto sia importante esprimere queste impostazioni di progettazione fra le condizioni d'uso presentate all'utente: esse costituiscono uno dei presupposti affinché l'utente abbia piena fiducia (''trust'') nel servizio, lo utilizzi, lo divulghi, lo renda un servizio di successo.&lt;br /&gt;
&lt;br /&gt;
==Architettura del servizio== &lt;br /&gt;
&lt;br /&gt;
===I componenti software nell'architettura LAMP===&lt;br /&gt;
&lt;br /&gt;
Il servizio è realizzato in forma di ''web-based application'' poiché, come già illustrato nell'introduzione, si intende renderlo disponibile per il massimo numero di utenti possibili. Nella progettazione e realizzazione dell'architettura web si adotta la piattaforma ''LAMP'', il cui nome deriva dall'acronimo dei componenti open source che la realizzano (il sistema operativo Linux, il server HTTP Apache, il sistema per la gestione di database relazionali MySQL ed il linguaggio di programmazione PHP). Poichè il modello è composto da quattro livelli, spesso si parla anche di ''stack LAMP''. Uno degli elementi di forza del modello ''LAMP'' è che i componenti dei vari ''layer'' sono sostituibili, a seconda delle esigenze, con dei componenti più adatti, tipicamente open source ([0015], [0018], [0019]). Basando la piattaforma su un sistema operativo della famiglia di Microsoft Windows, ad esempio, si ottiene uno ''stack WAMP'', mentre se si usa un sistema operativo Mac OS si realizza uno ''stack MAMP''. Un'architettura web basata sul modello ''LAMP'' può, inoltre, essere integrata con software open source che offre utili funzionalità, come, ad esempio, il monitoraggio (''Nagios''), il load balancing (''Linux Virtual Server''), la rilevazione di accessi illeciti (''Snort'') e il security testing (''netsniff-ng''). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si valutano ora brevemente la diffusione dei componenti tradizionali dello ''stack LAMP'' e le alternative maggiormente usate per i vari ''layer''.&lt;br /&gt;
Le distribuzioni Linux risultano essere la scelta più comune per l'ultimo ''layer'' dello ''stack''. Secondo W3Techs, infatti, nell'ottobre del 2013, il 58.5% dei web server a livello globale avevano come sistema operativo la distribuzione Debian o Ubuntu, mentre il 37.3% una tra RHEL, Fedora e CentOS([0016]). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Tra i web server, Apache risulta essere maggiormente usato. Secondo le stime fatte da Netcraft, a giugno del 2014 circa il 51.9% del milione di siti web più trafficati al mondo usavano un web server Apache, il 19.2% nginx ed il 12.4% Microsoft ([0017]). &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
I principali ''DBMS'' relazionali, oltre a MySQL, che possono essere presenti nello ''stack LAMP'' sono MariaDB e PostgreSQL, mentre tra i ''DBMS NoSQL'' MongoDB risulta essere il più comune. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Nello stack, infine, il ruolo di linguaggio di programmazione, solitamente svolto dal linguaggio PHP, spesso è ricoperto dai linguaggi Perl o Python. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si osserva, ad ogni modo, che le informazioni sulla diffusione delle tecnologie non rappresentano un fattore vincolante nella scelta delle stesse, in quanto la piattaforma ''LAMP'' è anche aperta verso molti altri componenti oltre quelli citati; di conseguenza la scelta delle tecnologie da impiegare può essere effettuata basandosi principalmente sui requisiti e sulle specifiche del servizio. &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Principi di progettazione per l'architettura===&lt;br /&gt;
&lt;br /&gt;
====Single Responsibility Principle====&lt;br /&gt;
&lt;br /&gt;
Per rendere il servizio maggiormente manutenibile ed estensibile, si presta particolare attenzione al rispetto del ''Single Responsibility Principle'' (''SRP'') ([0020]). Si cerca, quindi, di fattorizzare il software in più moduli, suddividendo tra questi le elaborazioni da svolgere. Un altro importante beneficio che si ottiene dalla fattorizzazione del codice è la riusabilità dei componenti. Ogni singolo modulo, infatti, svolge il proprio compito in maniera indipendente dal resto della applicazione ed è, quindi, riutilizzabile in altri scenari simili senza dover essere re-implementato. Inquadrando meglio questa metodologia di progettazione con i requisiti del servizio e la piattaforma web ''LAMP'', si individuano i due principali compiti a carico dell'applicazione:&lt;br /&gt;
* La gestione dell'interazione web con l'utente per la trasmissione del documento e dei nominativi da trattare&lt;br /&gt;
* Il processamento del documento per effettuare la &amp;quot;minimizzazione&amp;quot; dei dati.&lt;br /&gt;
Questi due differenti ''task'' saranno, quindi, portate a termine da componenti diversi.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Progettando la struttura dell'applicazione in questo modo, si disaccoppia completamente la logica di business del servizio dalle interfacce web di comunicazione con l'utente. In un futuro sviluppo sarà possibile, quindi, realizzare nuove interfacce utilizzando altre tecnologie senza dover modificare la logica applicativa. &lt;br /&gt;
&lt;br /&gt;
====Dependency Inversion Principle====&lt;br /&gt;
&lt;br /&gt;
Un altro principio di design architetturale che risulta importante nella progettazione è il ''Dependency Inversion Principle'' (''DIP'') ([0038]). Esso si traduce nella realizzazione di componenti che non dipendono dalle specifiche implementazioni degli altri moduli del sistema, bensì dalle loro ''astrazioni''. &lt;br /&gt;
In relazione all'estensibilità e manutenibilità del prodotto software, infatti, l'impiego di moduli dipendenti direttamente dalla definizione dei metodi presenti in altri componenti risulta problematica: il modulo dipendente deve essere re-implementato ad ogni variazione del modulo da cui dipende.&lt;br /&gt;
Nella programmazione orientata agli oggetti, per rispettare questo principio, si su può fare uso di classi astratte o interfacce, costrutti che definiscono i moduli senza implementarli completamente o senza implementarli affatto.  &lt;br /&gt;
&lt;br /&gt;
===Stile architetturale REST=== &lt;br /&gt;
&lt;br /&gt;
Il modello architetturale del servizio che si sta definendo presenta una serie di caratteristiche, come ad esempio l'indipendenza dei moduli, che permettono di realizzarlo secondo il paradigma delle ''RESTful API''. L'espressione &amp;quot;Representational State Transfer&amp;quot; e il suo acronimo &amp;quot;REST&amp;quot; furono introdotti nel 2000 nella tesi di dottorato di Roy Fielding ([0021]), uno dei principali autori delle specifiche dell'Hypertext Transfer Protocol (HTTP). Roy Fielding descrive il ''Representational State Transfer'' come uno stile architetturale (&amp;quot;''architectural style''&amp;quot;), ovvero un'astrazione degli elementi di un'architettura all'interno di un sistema hypermedia distribuito. ''REST'' non specifica i dettagli dell'implementazione dei componenti e della sintassi del protocollo, ma definisce i ruoli dei componenti, i vincoli sulla loro modalità di interazione e la loro interpretazione.&lt;br /&gt;
Riassumiamo quindi i principi che deve rispettare una architettura ''REST'':&lt;br /&gt;
# Architettura Client-Server &amp;lt;br/&amp;gt;In una architettura ''REST'' viene data particolare importanza ai principi ''SRP'' e ''DIP'' prima citati, più generale si può affermare che l'architettura sposi il paradigma noto con il termine di &amp;quot;''Separation of Concerns''&amp;quot;. Una ''Restful API'' applica questi principi in un architettura Client-Server, capace di supportare l'evoluzione indipendente della logica lato client e della logica lato server.&lt;br /&gt;
# Stateless &amp;lt;br/&amp;gt;La comunicazione tra utente e fornitore del servizio deve essere senza stato, quindi ogni richiesta del client deve contenere tutte le informazioni di cui il fornitore necessita per l'erogazione del servizio offerto. Questa ipotesi viene fatta per rendere una ''Restful API'' facilmente scalabile orizzontalmente.&lt;br /&gt;
# Uso della cache &amp;lt;br/&amp;gt;In un Architettura ''REST'' i messaggi di risposta inviati dal server devono esplicitamente indicare se possono essere memorizzati nella cache del client o di componenti middleware per il riutilizzo nelle richieste successive.&lt;br /&gt;
# Interfaccia uniforme &amp;lt;br/&amp;gt;I componenti devono essere in grado di comunicare attraverso un'interfaccia uniforme e le risorse devono essere trasferite in un formato standard. Inoltre l'utente deve poter effettuare la navigazione tra le risorse di suo interesse tramite collegamenti ipertestuali. Per inciso, si osserva che il protocollo HTTP usato correttamente rispetta i requisiti di un architettura ''REST'' e che nelle implementazioni delle ''RESTful API'' il formato più usato per la modellazione dei dati è JSON.&lt;br /&gt;
# Layered System &amp;lt;br/&amp;gt;In un sistema a livelli, componenti intermedi (come i proxy) possono essere collocati tra client e server per intercettare il traffico per scopi specifici; ad esempio il caching o la sicurezza. Una soluzione basata su ''REST'' può essere composta da più livelli architettonici, indipendenti l'uno dall'altro.&lt;br /&gt;
# Code on Demand &amp;lt;br/&amp;gt;Questo vincolo facoltativo è inteso principalmente a consentire aggiornamenti alla logica all'interno dei client (come i browser Web) indipendentemente dalla logica lato server. Una ''single page application'', ad esempio, rispetta in pieno questo punto.&lt;br /&gt;
&lt;br /&gt;
Un'applicazione progettata sul modello dell'architettura ''REST'' ha quindi gli indiscutibili vantaggi di:&lt;br /&gt;
* consentire l'evoluzione indipendente delle diverse componenti &lt;br /&gt;
* avere un'interfaccia utente portabile con altri tipi di piattaforme&lt;br /&gt;
* permettere agevolmente la replicazione delle macchine server&lt;br /&gt;
* non vincolare moduli server e client a linguaggi e tecnologie specifiche.&lt;br /&gt;
&lt;br /&gt;
L'architettura del servizio oggetto di questa tesi si trova già perfettamente in linea con alcuni dei vincoli discussi, ma sono necessarie alcune considerazioni. Il punto 1 (&amp;quot;architettura Client-Server&amp;quot;) è chiaramente soddisfatto. &lt;br /&gt;
Il punto 2 (&amp;quot;Stateless&amp;quot;), direttamente collegato con i punti 3 e 5 (&amp;quot;Uso della cache&amp;quot;, &amp;quot;Layered System&amp;quot;), può essere rispettato con facilità; a ogni richiesta di &amp;quot;minimizzazione&amp;quot; del client corrisponde la restituzione del documento trattato dal server, non c'è quindi necessita di avere uno stato nell'interazione. &lt;br /&gt;
&lt;br /&gt;
Analizzando le caratteristiche di una applicazione stateless in relazione al principio ''privacy by design'' illustrato in precedenza, si osserva che l'assenza di stato determina la semplificazione delle problematiche critiche relative al principio. Non vengono conservate, infatti, informazioni contenenti dati sensibili, poiché dopo aver effettuato l'invio della risposta, sarà subito eliminato sul server il file elaborato.&lt;br /&gt;
&lt;br /&gt;
Nei capitoli precedenti tuttavia si è detto che l'utente può ripetere più volte il trattamento di uno stesso documento nella stessa sessione di interazione; essendo il vincolo dell'efficienza già difficile da rispettare per via dell'elaborazione onerosa del documento, si può progettare una modalità alternativa del funzionamento con stato del servizio, applicabile in assenza di replicazione delle macchine server e sfruttando le ripetute richieste di trattamento per uno stesso documento. &lt;br /&gt;
Si può infatti memorizzare lato server il documento inviato dal client inizialmente e, alle successive richieste di trattamento del medesimo documento, evitarne la ritrasmissione da client a server. Per rispettare il ''PbD'', al termine della sessione di interazione il documento verrà rimosso dal server. Si nota, inoltre, che per predisporre il servizio alla gestione delle due diverse modalità di funzionamento si può utilizzare un parametro di configurazione a livello applicativo.&lt;br /&gt;
I punti 4 e 6 infine (&amp;quot;Interfaccia uniforme&amp;quot;, &amp;quot;Code on Demand&amp;quot;) si possono rispettare utilizzando il formato JSON per la trasmissione dei documenti e dei nominativi, e usando localmente sul client Javascript per offrire tutte le funzionalità del servizio in un'unica pagina html.&lt;br /&gt;
&lt;br /&gt;
===Moduli software del servizio===&lt;br /&gt;
&lt;br /&gt;
====Scelta dei componenti software====&lt;br /&gt;
&lt;br /&gt;
Si opera ora la scelta delle tecnologie da utilizzare per i componenti dei 4 layer dello ''stack LAMP''. Per i due layer inferiori risulta piuttosto immediato decidere di usare le tecnologie presenti per default. Un sistema operativo Linux ed un web server Apache sono adatti all'architettura del servizio.&lt;br /&gt;
Inoltre anche il linguaggio di programmazione PHP può essere usato senza significativi problemi, anche se verranno fatte in seguito, in una sezione di questo capitolo, alcune considerazioni sulle problematiche di esecuzioni concorrenti di script PHP. Il linguaggio sarà impiegato in particolare per la realizzazione della logica necessaria a gestire l'interazione web con il cliente, mentre l'elaborazione del documento OOXML lato server sarà effettuata da un programma Java. &lt;br /&gt;
&lt;br /&gt;
I due ''task'' principali del servizio sono delegati, quindi, a due programmi distinti realizzati con tecnologie diverse. Si concretizza in questo modo il principio ''SRP'' e, sfruttando l'&amp;lt;i&amp;gt;openness&amp;lt;/i&amp;gt; della piattaforma LAMP, le funzionalità necessarie vengono realizzate attraverso i linguaggi più adatti.&lt;br /&gt;
La scelta del linguaggio Java per l'implementazione del ''main core'' della logica di business è dovuta alla libreria open source in ambiente java Docx4j ([40],[41]). Questa libreria è realizzata per il processamento delle tre tipologie di formati OOXML (''docx'', ''xslx'', ''pptx'') e permette tutte le possibili operazioni di creazione, lettura e modifica su questo tipo di documenti. Anche questa libreria sarà approfondita in sezioni successive. Si osserva, per inciso, che esistono altre librerie equivalenti in ambiente .NET. &lt;br /&gt;
&lt;br /&gt;
Nella scelta del linguaggio di programmazione usato per elaborare i documenti ed effettuare i confronti tramite ''regular expressions'', un dato non di poco conto da considerare è l'encoding delle stringhe. In Java, in particolare, una stringa è rappresentata internamente come un array di char, ognuno codificato da 2 byte in formato UTF-16 ([0042]); la codifica esprime in 16 bit tutti i caratteri definiti dallo standard Unicode, quindi è possibile scegliere Java.&lt;br /&gt;
&lt;br /&gt;
Per il ''layer'' della persistenza, infine, l'impiego di un database MySql risulta una buona scelta. Si osserva che questo livello non verrà utilizzato nella tradizionale maniera prevista dallo ''stack LAMP''. Infatti, generalmente, la base di dati viene interrogata direttamente dal componente che si occupa dell'interazione con l'utente (PHP) per il reperimento delle informazioni utili da restituire al client; nel servizio, invece, la base di dati sarà a supporto unicamente del programma Java, poiché gli unici dati persistenti da gestire sono i nomi del dizionario (si ricordi sempre il ''PbD'') e solo i moduli dell'eseguibile Java devono utilizzarli. Se il dizionario contenessero unicamente i nomi (senza informazioni accessorie correlate) e fossero usati in sola lettura, un semplice file di testo poteva essere sufficiente per la rappresentazione. Tuttavia, poiché saranno individuate tecniche di ottimizzazione nell'impiego dei dizionari che richiedono operazioni di scrittura e ordinamento dei dati, risulta opportuno usare un database relazionale.&lt;br /&gt;
&lt;br /&gt;
====Logica di business e dinamiche di interazione====&lt;br /&gt;
&lt;br /&gt;
Vengono presentati in questa sezione gli aspetti principali dei funzionamenti dei moduli del servizio. Per mettere bene a fuoco quali siano le meccaniche di interazione e i flussi di esecuzione dei programmi, si propone il diagramma di sequenza del tipico scenario di utilizzo. In questo schema UML si descrive il caso d'uso dove un utente, dopo aver inserito un documento ed averlo ricevuto &amp;quot;minimizzato&amp;quot;, esprime delle preferenze e richiede poi un secondo trattamento.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;(QUI IMG [0F00])&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Si descrivono quindi ora le principali operazioni che vengono eseguite.&lt;br /&gt;
All'avvio dell'interazione viene presentata una pagina PHP di benvenuto contenente le informazioni su come i dati personali vengano elaborati ed un ''file-picker'' per consentire l'upload di un documento ''OOXML''; nel momento in cui l'utente confermerà il caricamento del documento, esso verrà trasferito sul server. &lt;br /&gt;
Bisogna prestare particolare attenzione al comportamento del sistema nel caso in cui più utenti richiedano contemporaneamente l'esecuzione del servizio, e cioè alle problematiche di esecuzioni concorrenti di script PHP; è necessario, in particolare, evitare situazioni in cui i nomi dei file inviati dagli utenti siano in conflitto. Analizzando più in dettaglio il problema, ogniqualvolta un web server Apache riceve una richiesta HTTP per una pagina PHP, si ha la generazione di un nuovo processo che esegue il codice presentato nella pagina PHP richiesta. Supponendo quindi che N utenti eseguano l'invio del file contemporaneamente, si avrebbe che sul server N processi diversi dovrebbero procedere con la scrittura di un file. Ovviamente se due o più file condividono il nome almeno uno di essi sarà sovrascritto. Per risolvere questo problema, supponendo di voler salvare tutti i documenti in una cartella temporanea, occorre modificare il filename dei documenti inviati dagli utenti per esser certi di non incorrere in sovrascritture o altri tipi di errori correlati.&lt;br /&gt;
Una valida possibilità è l'inserimento di un ''prefisso'' univoco nel filename. Per la generazione di una stringa univoca da anteporre al filename, che permetta di distinguere file caricati da utenti diversi, si può direttamente usare il ''session id'' dell'utente. In PHP esso è determinato casualmente combinando ([0043]): l'IP del cliente, orario di attribuzione dell'id, un numero pseudo-casuale (con il ''PHP Linear Congruence Generator'') e, se presente un &amp;quot;''random source''&amp;quot; sul sistema operativo del Client (spesso chiamato impropriamente &amp;quot;''seme''&amp;quot;), un ulteriore numero pseudo-casuale.&lt;br /&gt;
Per introdurre ulteriore alea, necessaria se, ad esempio, un utente tenti l'upload di file omonimi (con contenuto interno diverso) e mantenga il medesimo ''session id'', si utilizza un ulteriore generatore pseudo-casuale per produrre un altro numero con cui comporre il prefisso.&lt;br /&gt;
Concatenando i due numeri generati si ha praticamente certezza di aver individuato un numero univoco nel sistema per il tempo in cui il servizio sarà erogato al cliente.&lt;br /&gt;
&lt;br /&gt;
Una volta memorizzato il file, lo script PHP dovrà ricorrere all'invocazione del modulo Java, delegato al vero e proprio processamento del documento. Occorre quindi individuare un set di opzioni che consenta al modulo che gestisce l'interazione con il cliente di sfruttare al meglio il componente delegato all'elaborazione del documento, in qualunque circostanza; la totale indipendenza dei moduli, la loro sostituibilità e la replicazione possibile di macchine server sono solo alcuni dei fattori che rendono mutevole la configurazione del sistema. Va definito un protocollo di comunicazione, quindi, che astragga completamente dall'implementazione dei moduli o dalla locazione dei file.&lt;br /&gt;
&lt;br /&gt;
Valutando i possibili flussi logici, anche con l'ausilio del diagramma di sequenza, si ha che i tipi di esecuzione sono due:&lt;br /&gt;
* &amp;quot;minimizzazione&amp;quot; con dizionario&lt;br /&gt;
* &amp;quot;minimizzazione&amp;quot; di specifici nominativi&lt;br /&gt;
Il protocollo di comunicazione tra i due moduli è costituito in entrambi i casi di una singola richiesta a cui segue una singola risposta. Più in particolare, lo script PHP invoca il comando Java esprimendo obbligatoriamente il path del file da trattare e opzionalmente l'elenco dei nominativi. A suo volta, il modulo Java restituisce i nominativi trovati, qualora non espressamente richiesti dallo script, e segnala la corretta terminazione dell'elaborazione.&lt;br /&gt;
Si definiscono come canali di comunicazione standard del protocollo gli argomenti presi in input dal modulo di processamento del documento e lo standard output del processo che esegue tale programma. Inoltre è importante definire un formato standard per la comunicazione dei nominativi tra moduli; è necessario quindi scegliere un pattern che permetta di determinare univocamente la composizione dei nominativi. Un possibile formato, espresso tramite ''regex'', è il seguente:&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt; &amp;lt;nominativo&amp;gt; = ^(&amp;lt;nome&amp;gt;:)*&amp;lt;nome&amp;gt;;&amp;lt;cognome&amp;gt;$&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt; &amp;lt;nominativi&amp;gt; = ^(&amp;lt;nominativo&amp;gt;\s+)+$&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Dove nome e cognome sono una sequenza di caratteri Unicode come già discusso. Ulteriori opzioni importanti da definire nel protocollo per l'invocazione del programma che si occupa delle funzionalità di elaborazione sono le seguenti:&lt;br /&gt;
* path file da elaborare (opzione &amp;quot;-i &amp;lt;file_path&amp;gt;&amp;quot;, obbligatoria)&lt;br /&gt;
* path con cui salvare il file elaborato (opzione &amp;quot;-o &amp;lt;file_path&amp;gt;&amp;quot;, opzionale: per default viene creato un nuovo file automaticamente)&lt;br /&gt;
* abilitazione stampe verbose, da usare solo in fase di debug (opzione &amp;quot;-d&amp;quot;, opzionale)&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Una volta terminato il processamento, il modulo di gestione dell'interazione con l'utente dovrà accertarsi che l'&amp;lt;i&amp;gt;exit status&amp;lt;/i&amp;gt; sia 0 e leggere dallo standard output del processo appena terminato, qualora si sia stata eseguita la &amp;quot;minimizzazione&amp;quot; con dizionario, l'elenco dei nominativi trovati. Se invece la &amp;quot;minimimizzazione&amp;quot; ha avuto luogo con i nominativi già specificati non sarà scritto nulla sullo standard output.&lt;br /&gt;
A margine si osserva che l'impiego dell'opzione &amp;quot;-d&amp;quot; deve sempre consentire una semplice individuazione dei nominativi trovati; in particolare, se tale opzione è specificata, nello standard output i nominativi compariranno con un ''header'' riconoscibile (&amp;quot;''NOMINATIVO=''&amp;quot;).&lt;br /&gt;
Ritornando alla descrizione del flusso di esecuzione tipo, una volta che il modulo Java ha completato il trattamento del documento, lo script PHP ne effettuerà l'upload sul client e presenterà all'utente le opzioni già descritte nel capitolo sull'usabilità. &lt;br /&gt;
A questo punto l'interazione con client potrebbe concludersi, qualora si eseguisse il download e si chiudesse il browser, o continuare elaborando i ''suggerimenti'' dell'utente espressi dopo il primo trattamento. Le modalità di comunicazione dei moduli varierebbero leggermente come appena illustrato, mentre, a seconda della configurazione stateful o stateless del servizio, verrebbe eseguito o meno un nuovo upload del file dal client al server.&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si osserva infine che, per predisporre a successivi studi di ottimizzazione il servizio e per agevolare tutti i possibili sviluppi futuri, si applica largamente nella progettazione del modulo di elaborazione Java il ''Dependency Inversion Principle'', in quanto si desidera realizzare classi estendibili ed intercambiabili.&lt;br /&gt;
In particolare, si introducono delle classi astratte per rappresentare in maniera generica il concetto di &amp;quot;''persona''&amp;quot; e &amp;quot;''minimizzatore''&amp;quot;. È possibile infatti realizzare successivi studi per trattare ulteriori dati personali oltre che ai nomi e cognomi; inoltre, in base ai tipi di documenti trattati o eventuali altri fattori utili, è possibile studiare differenti tecniche di &amp;quot;minimizzazione&amp;quot; realizzate da differenti algoritmi &amp;quot;''minimizzatori''&amp;quot;.&lt;br /&gt;
In particolare una &amp;quot;''persona''&amp;quot; dovrà sempre esporre un metodo &amp;quot;''minimizza''&amp;quot; che prende in input una stringa, la &amp;quot;minimizza&amp;quot; e la restituisce; il pattern con il quale si effettua la &amp;quot;minimizzazione&amp;quot; sarà fornito in implementazione a seconda dei dati sensibili di interesse.&lt;br /&gt;
Un &amp;quot;''minimizzatore''&amp;quot; esporrà sempre un metodo &amp;quot;''work''&amp;quot; che, presa in input una lista di persone ed un documento ''OXML'', con l'ausilio della libreria Docx4j, fornirà in output un documento del tutto &amp;quot;minimizzato&amp;quot;; la definizione delle modalità con cui si estrapolano le informazioni dal documento e con cui si invoca il metodo &amp;quot;''minimizza''&amp;quot; della classe persona sono confinate nell'implementazione.&lt;br /&gt;
Definendo delle classi astratte risulta, quindi, più veloce la realizzazione dei futuri componenti e si svincola il processo di &amp;quot;minimizzazione&amp;quot; dal tipo di dati che si &amp;quot;minimizzano&amp;quot; e viceversa.&lt;br /&gt;
&lt;br /&gt;
====Le classi principali del progetto====&lt;br /&gt;
Le classi principali del progetto vengono quindi presentate in appendice. Esse sono:&lt;br /&gt;
* App.java, contenente il main&lt;br /&gt;
* Elaborator.java, che presenta il metodo &amp;quot;''work''&amp;quot;&lt;br /&gt;
* Persona.java, che presenta il metodo &amp;quot;''minimizza''&amp;quot;&lt;br /&gt;
* Testing.java, contenente alcune funzioni usate in fase di debug.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gli script in PHP sono stati forniti dall'azienda come implementazione minimale e provvisoria, da perfezionare a seguito della eventuale definizione sulle modalità di presentazione del servizio su Internet.&lt;br /&gt;
&lt;br /&gt;
Una considerazione di implementazione comune a tutte le classi deriva del principio ''Privacy by Design'', indifferentemente dalla modalità di configurazione stateful o stateless del servizio: è di fondamentale importanza che nel sistema non siano memorizzati permanentemente in alcun caso i documenti inviati dagli utenti del servizio. &lt;br /&gt;
Per realizzare un sistema robusto, per fronteggiare crash improvvisi del client o congestioni della rete, è opportuno impostare dei timeout lato server che procedano automaticamente alla eliminazione dei documenti degli utenti dopo un periodo di inattività troppo prolungato. Qualora invece si dovesse verificare un interruzione critica del servizio a causa di un errore logico del server o semplicemente per via di un'interruzione dell'alimentazione della macchina server, bisogna considerare altri metodi; essendo il servizio realizzato con un sistema operativo Linux, si può configurare il demone ''crond'' per eseguire a ogni reboot e, per sicurezza, una volta al giorno l'eliminazione dei file usati dall'applicazione tutti contenuti all'interno della cartella temporanea.&lt;br /&gt;
&lt;br /&gt;
==Approfondimenti tecnologici==&lt;br /&gt;
&lt;br /&gt;
===Analisi della struttura del formato OOXML===&lt;br /&gt;
&lt;br /&gt;
Come argomentato, il formato dei documenti elaborati dal servizio progettato dovrà essere ''Office Open XML'', o ''OOXML''; si tratta di un formato ''XML-based'' per documenti di testo, fogli elettronici e presentazioni, in grado di rappresentare grafici, diagrammi, immagini e altro materiale grafico. La specifica fu sviluppata da Microsoft e adottata dall'&amp;lt;i&amp;gt;ECMA International&amp;lt;/i&amp;gt; come standard ''ECMA-376'' nel 2006. Una seconda versione fu rilasciata nel 2008, una terza nel 2011, una quarta nel 2012 ed una quinta tra il 2015 ed il 2016 ([0010]). La specifica è stata adottata, inoltre dall'&amp;lt;i&amp;gt;ISO&amp;lt;/i&amp;gt; e dall'&amp;lt;i&amp;gt;IEC&amp;lt;/i&amp;gt; come standard ''ISO/IEC 29500'' a partire dal 2008 ([0011], [0012]).&lt;br /&gt;
&lt;br /&gt;
====Linguaggi di markup====&lt;br /&gt;
&lt;br /&gt;
Lo standard ''ECMA-376'' ([0010]) include tre differenti specifiche di linguaggio per ognuna delle tre principali categorie di documenti:&lt;br /&gt;
* ''WordprocessingML'' per i documenti testuali&lt;br /&gt;
* ''SpreadsheetML'' per i fogli elettronici&lt;br /&gt;
* ''PresentationML'' per le presentazioni elettroniche&lt;br /&gt;
* ''DrawingML'' ed altri linguaggi di markup di supporto per la rappresentazione di disegni, forme e diagrammi.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
La specifica include sia gli schemi ''XML'' sia i vincoli espressi per iscritto. Ogni documento conforme al formato dovrà, quindi, rispettare gli schemi ''XML'' e dovrà essere codificato in ''UTF-8'' o ''UTF-16''. La specifica, inoltre, permette l'aggiunta di ''custom tag XML'' a supporto dei linguaggi di markup dati, per default nel formato ''OOXML'', consentendo quindi la libera personalizzazione dei documenti.&lt;br /&gt;
&lt;br /&gt;
====File packaging====&lt;br /&gt;
&lt;br /&gt;
Oltre alla specifiche relative ai linguaggi di markup, la seconda parte dell'&amp;lt;i&amp;gt;ECMA-376&amp;lt;/i&amp;gt; ([0010]) definisce la struttura gerarchica dei file del formato adottando le ''Open Packaging Conventions'' (''OPC''). ''OPC'', una tecnologia ''file-container'' basata sul comune formato compresso ''zip'', che stabilisce che tutti i file che riguardano una stessa entità devono essere raggruppati in un unico package ([0014]). Un documento ''OOXML'' è, infatti, un archivio ''zip'' contenente alcuni files ''XML'' (detti anche ''parti'') organizzati in un singolo package. Questa frammentazione dei dati in più files rende più semplice e veloce l'accesso ai dati stessi e riduce le possibilità di una loro corruzione. Le ''parti'' possono contenere qualsiasi tipo di dato; per tenere traccia della relazione tra una ''parte'' e la sua tipologia di contenuto, senza basarsi sull'estensione del file, è presente nel package, nella cartella radice della gerarchia, il file denominato ''[Content_Types].xml'', il quale mappa appunto queste associazioni. È mostrata qui ad esempio l'associazione tra la ''parte'' rappresentante il documento principale e il suo ''ContentType''.&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Override PartName=&amp;quot;/word/document.xml&amp;quot; ContentType=&amp;quot;application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Le informazioni relative alle relazioni che ogni ''parte'' ha con le altre ''parti'', con risorse esterne e con il package in sé sono mantenute separatamente dal contenuto della ''parte'' stessa. Tali informazioni sono presenti, infatti, all'interno delle cartelle denominate ''_rels'': ne esiste una per il package nel suo complesso e una per ogni sotto-cartella del package contenente delle ''parti'' coinvolte in delle relazioni. In questo modo i riferimenti che una ''parte'' ha verso altre ''parti'' o risorse sono salvati una sola volta e possono essere aggiornati con semplicità se necessario, senza dover modificare il contenuto stesso delle ''parti'' coinvolte. È mostrato qui un esempio di relazione contenuta in ''_rels/.rels'' relativa al documento principale e al suo schema.&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Relationship Id=&amp;quot;rId1&amp;quot; Type=&amp;quot;http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument&amp;quot; Target=&amp;quot;word/document.xml&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Il documento principale, ossia il file ''word/document.xml'', ha inoltre numerose relazioni con altre ''parti'', come ad esempio ''word/styles.xml'' e ''word/footer.xml'', e risorse esterne collegate con degli URI. Per descrivere queste relazioni si usa la cartella ''word/_rels''.&lt;br /&gt;
&lt;br /&gt;
====Parti di un Documento OOXML====&lt;br /&gt;
&lt;br /&gt;
Vengono qui presentate le ''parti'' che sono caratteristiche esclusive di un ''WordprocessingML package'', non presenti quindi negli altri due formati ''OOXML''. È importante osservare che alcune di esse sono facoltative e sono presenti nel package solo se necessario.&lt;br /&gt;
&lt;br /&gt;
Le ''parti'' relative al vero e proprio contenuto testuale sono:&lt;br /&gt;
* ''Main Document'', contiene le informazioni principali ed è salvata come ''word/document.xml''&lt;br /&gt;
* ''Header'', contiene i dati relativi alle intestazioni ed è salvata in ''word/header.xml''. Ogni sezione del documento può avere intestazioni diverse per la prima pagina, per le pagine pari e per le dispari, quindi possono esserci molteplici ''parti header''&lt;br /&gt;
* ''Footer'', contiene le informazione relative al piè pagina ed è salvata in ''word/footer.xml''. Può essere presente più volte, per motivi analoghi alla ''parte header''&lt;br /&gt;
* ''Footnotes'', contiene le eventuali note a piè pagina del documento ed è salvata come ''word/footnotes.xml''&lt;br /&gt;
* ''Endnotes'', contiene le note di chiusura del documento ed è salvata in ''word/endnotes.xml''.&lt;br /&gt;
&lt;br /&gt;
Sono presenti poi delle ''parti'' relative allo stile e alle impostazioni del documento:&lt;br /&gt;
* ''Style Definitions'', contiene la definizione di un insieme di stili usati dal documento, salvata in ''word/styles.xml''&lt;br /&gt;
* ''Font Table'', contiene informazioni riguardo i font usati, salvata in ''word/fontTable.xml''&lt;br /&gt;
* ''Numbering Definitions'', contiene le definizioni sulla struttura delle liste contenute nel documento, salvata in ''word/numbering.xml''&lt;br /&gt;
* ''Document Settings'', specifica come il word processor debba trattare il documento (spell checking, gestione delle revisioni, etc.), contenuta in ''word/settings.xml''&lt;br /&gt;
* ''Web Settings'', contiene informazioni su come il documento debba essere convertito in ''HTML'' se richiesto, contenuta in ''word/webSettings.xml''.&lt;br /&gt;
&lt;br /&gt;
Sono presenti anche delle ''parti'' che rappresentano testo secondario:&lt;br /&gt;
* ''Comments'', contiene i commenti sul documento inseriti attraverso un word processor&lt;br /&gt;
* ''Glossary'', contiene dati testuali aggiuntivi secondari, ne è permessa una sola. Tutte le ''parti'' prima elencate, tranne il ''Main Document'', possono comparire una seconda volta in relazione alla ''parte glossary''.&lt;br /&gt;
&lt;br /&gt;
====Analisi del Main Document====&lt;br /&gt;
&lt;br /&gt;
Il file ''document.xml'', elemento principale di un documento ''WordprocessingML'', è costituito da due tipi di informazioni:&lt;br /&gt;
* ''properties'', che definiscono lo stile e la formattazione del testo&lt;br /&gt;
* ''stories'', che rappresentano il contenuto testuale delle varie parti del documento.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le ''properties'' verranno trattate in misura minore. Queste informazioni sono espresse attraverso una struttura XML gerarchica che ha come elemento radice il nodo ''document''. Esso ha due nodi figli:&lt;br /&gt;
* ''background'', che contiene alcune ''properties'' che descrivono lo sfondo del documento&lt;br /&gt;
* ''body'', che contiene tutti i rimanenti contenuti ed è potenzialmente molto complesso.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si osserva che per le finalità del trattamento dei dati risultano di primario interesse le ''stories'' e che è opportuno effettuare un'analisi ''bottom-up'' del problema: anziché considerare la gerarchia a partire dal ''body'' (nodo padre) partiremo dalla rappresentazione più semplice del testo contenuta nel documento (nodi figli).&lt;br /&gt;
&lt;br /&gt;
Facendo direttamente riferimento allo standard ''ECMA-376'' ([0010]),  si evince che l'unico nodo che contiene puro testo ha il nome ''t'' (''Text''). Questo elemento contiene una stringa rappresentante gli esatti caratteri che vengono poi mostrati negli editor a video. Il nodo ''Text'' non presenta figli e l'unico nodo padre che può avere è ''r'' (''Run''). Quest'altro nodo definisce una regione di testo con comuni proprietà (ad esempio l'uso del grassetto). Attraverso l'uso di tag ''t'' ed ''r'' quindi si rappresenta una regione di testo formattata con differenti elementi stilistici.&lt;br /&gt;
Occorre però evidenziare che un nodo ''r'' può presentare molti altri figli oltre a ''t'', come ad esempio immagini, in quanto rappresenta un'area generica del documento.&lt;br /&gt;
Si supponga quindi di avere due nodi ''Text'' fratelli, ossia figli dello stesso nodo ''r'': essi rappresenteranno semanticamente un unico blocco logico se e solo se compariranno a video come una sequenza di parole continua. Questo fenomeno è facilmente identificabile anche nel file ''XML'' descrittivo: due sequenze di parole mostrate a video adiacenti compaiono infatti nel file ''XML'' in due righe consecutive; se invece due parti di testo dovessero essere intervallate ad es. da un'immagine nel documento ''XML'' ci sarebbe un tag ''drawing'' a dividere i due tag ''t''. Dalla consecutività dei nodi ''Text'' nel file ''document.xml'' si può determinare quali siano i blocchi logici da trattare.&lt;br /&gt;
Un insieme di ''Run'' infine può essere figlio di diversi nodi, ma ciò non è di rilevante importanza, in quanto ogni area di testo individuata dal nodo ''Run'' rappresenta già un blocco logico a sé e, di conseguenza, contiene sufficienti informazioni per la &amp;quot;minimizzazione&amp;quot;.&lt;br /&gt;
L'unico caso di rilievo nel quale bisogna valutare quale sia la gerarchia a monte di un nodo ''Run'' è nell'elaborazione di una tabella. In tal caso, in realtà, occorre verificare opportunamente la strutturazione della gerarchia processata. Per chiarezza espositiva viene mostrata la rappresentazione in formato ''OOXML'' di una tabella con una riga e due colonne (senza l'uso di ''properties'' per la formattazione stilistica).&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;w:tbl&amp;gt;&lt;br /&gt;
  &amp;lt;w:tr&amp;gt;&lt;br /&gt;
    &amp;lt;w:tc&amp;gt;&lt;br /&gt;
      &amp;lt;w:p&amp;gt;&lt;br /&gt;
        &amp;lt;w:r&amp;gt;&lt;br /&gt;
          &amp;lt;w:t&amp;gt;Cella A&amp;lt;/w:t&amp;gt;&lt;br /&gt;
        &amp;lt;/w:r&amp;gt;&lt;br /&gt;
      &amp;lt;/w:p&amp;gt;&lt;br /&gt;
    &amp;lt;/w:tc&amp;gt;&lt;br /&gt;
    &amp;lt;w:tc&amp;gt;&lt;br /&gt;
      &amp;lt;w:p&amp;gt;&lt;br /&gt;
        &amp;lt;w:r&amp;gt;&lt;br /&gt;
          &amp;lt;w:t&amp;gt;Cella B&amp;lt;/w:t&amp;gt;&lt;br /&gt;
        &amp;lt;/w:r&amp;gt;&lt;br /&gt;
      &amp;lt;/w:p&amp;gt;&lt;br /&gt;
    &amp;lt;/w:tc&amp;gt;&lt;br /&gt;
  &amp;lt;/w:tr&amp;gt;&lt;br /&gt;
&amp;lt;/w:tbl&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Come si osserva in figura, in una tabella il nodo ''r'' sarà figlio del nodo ''p'' (''Paragraph''), il quale a sua volta sarà contenuto in un noto ''tc'' (''Table Cell''). Celle di una tabella appartenenti ad una stessa riga saranno presenti all'interno dello stesso ''tr'' (''Table Row'') ed infine tutte le righe della tabella saranno inserite del tag ''tbl'' (''Table'').&lt;br /&gt;
&lt;br /&gt;
Per determinare quindi se due nodi ''Text'' sono scritti in due colonne adiacenti di una stessa riga (e quindi costituiscono un unico blocco logico) è necessario verificare che per i due nodi ''Text'':&lt;br /&gt;
# il nodo &amp;quot;padre&amp;quot;  '''non sia''' in comune&lt;br /&gt;
# il nodo &amp;quot;padre di 2° livello&amp;quot; sia ''Paragraph'' e '''non sia''' in comune&lt;br /&gt;
# il nodo &amp;quot;padre di 3° livello&amp;quot; sia ''Table Cell'' e '''non sia''' in comune&lt;br /&gt;
# il nodo &amp;quot;padre di 4° livello&amp;quot; sia ''Table Row'' e '''sia''' in comune&lt;br /&gt;
# i nodi &amp;quot;padre di 3° livello&amp;quot; '''siano''' consecutivi.&lt;br /&gt;
Se tutte queste ipotesi sono soddisfatte, le due celle vanno &amp;quot;minimizzate&amp;quot; come unico blocco logico.&lt;br /&gt;
&lt;br /&gt;
Si valutano infine gli ultimi vincoli emersi nell'analisi sull'interpretazione della formattazione di un documento.&lt;br /&gt;
In particolare, descrivendo le parti che compongo un documento ''OOXML'', era già emerso che alcune sezioni di testo, ossia note a piè pagina ed intestazioni, compaiono in altri file ''XML'' e non in ''document.xml''. Questi file (''header.xml'', ''footer.xml'', ''endnotes.xml'', etc.) sono tutti raccolti in un package (&amp;quot;''word''&amp;quot;) e la grammatica ''XML'' è la stessa usata per il Main Document.&lt;br /&gt;
Si conclude osservando che il problema della divisione in sillabe delle parole non si pone, in quanto la divisione sillabica mostrata a video dai word-processors è calcolata dinamicamente; in particolare, su una porzione di testo viene applicata la sillabazione (ove necessario) se è presente tra le ''properties'' di quella regione di documento il tag ''hyphenationZone''.&lt;br /&gt;
&lt;br /&gt;
====La libreria in ambiente java open source Docx4j====&lt;br /&gt;
&lt;br /&gt;
La libreria Docx4j offre completo supporto alla manipolazione di documenti ''docx'' (compressione e decompressione archivio zip, generazione file ''XML'' necessari, etc.). Offre inoltre un'utile mappatura in specifici oggetti Java della gerarchia ''XML'' presente nei vari file del formato.&lt;br /&gt;
Uno tra gli elementi più interessanti è la tecnica con cui vengono recuperati i nodi dai file ''XML'', in quanto si fa impiego del linguaggio standard W3C ''XPath'' ([0044], [0045]). Con ''XPath'' è possibile esprimere con una stringa un sottoinsieme di nodi presenti in una gerarchia ''XML'' non solo in base al loro nome o valore, ma anche in relazione alla posizione reciproca rispetto agli altri nodi. Riferendoci alle problematiche del servizio risulta, ad esempio, significativamente agevolato il trattamento di dati personali in forma tabellare.&lt;br /&gt;
Si osserva infine che la libreria attribuisce un id univoco ad ogni nodo del documento, di conseguenza se ne può trarre vantaggio nei confronti tra i nodi.&lt;br /&gt;
&lt;br /&gt;
===Ottimizzazioni del processo di minimizzazione===&lt;br /&gt;
&lt;br /&gt;
===Tecnologie complementari===&lt;br /&gt;
&lt;br /&gt;
La redazione di questa tesi è avvenuta su Mediawiki, la più importante fra le piattaforme wiki essendo il motore di Wikipedia.&lt;br /&gt;
&lt;br /&gt;
Le piattaforme wiki sono riconosciute come elemento caratterizzante dell’evoluzione Internet al Web 2.0, cioè al web nel quale gli utenti-navigatori, fino ad allora &amp;quot;''consumatori&amp;quot;'' (&amp;quot;''consumers&amp;quot;'') di contenuti si sono trasformati essi stessi in &amp;quot;''produttori&amp;quot;'' (&amp;quot;''producers&amp;quot;''), e cioè in &amp;quot;''prosumers&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
Un ''wiki'' è fondamentalmente un sito web che contiene informazioni e che consente agli utenti di editare facilmente il suo contenuto.&lt;br /&gt;
&lt;br /&gt;
Nel redigere una pagina wiki si utilizza ciò che è chiamato ''wikitext&amp;quot; per definire capitoli, paragrafi, hyperlinks, elementi di formattazione della pagina, etc.; sebbene il ''wikitext&amp;quot; risulti non difficile da apprendere, quasi ogni piattaforma wiki è corredata da editor di tipo visuale, che non richiede alcuna conoscenza della sintassi del ''wikitext&amp;quot;; tuttavia è esperienza comune che utilizzare direttamente il ''wikitext&amp;quot; induce a concentrarsi maggiormente sui contenuti e non sulla formattazione. Il linguaggio ''wikitext'' è strettamente correlato con il linguaggio HTML, infatti nella scrittura è possibile utilizzare tag come h1, span, div e così via, oltre che la sintassi esclusiva di ''wikitext''; simmetricamente una pagina prodotta da media wiki è costituita da HTML ben formato e direttamente importabile in ogni word processor. &lt;br /&gt;
&lt;br /&gt;
I wiki presentano una funzionalità di grande utilità nella redazione di documenti articolati: la tracciatura delle successive revisioni (&amp;quot;''Cronologia&amp;quot;''). La possibilità di ripercorrere l’evoluzione del testo è davvero d’aiuto quando si fissano idee originali in uno scritto, cercando di definirle, precisarle, chiarirle, come è avvenuto in effetti, anche nella redazione di questa tesi. Per curiosità, si segnala che, pur avendo redatto la maggior parte del testo off-line, la pagina wiki di questa tesi conta oltre 50 revisioni.&lt;br /&gt;
&lt;br /&gt;
Per inciso, si osserva che è stata molto utile la funzionalità di &amp;quot;ricerca nel codice&amp;quot; offerta dalla piattaforma di revisione online GitHub nella corretta comprensione della libreria Docx4j, il cui codice sorgente è ivi rilasciato. &lt;br /&gt;
&lt;br /&gt;
Si conclude infine dicendo che per ottimizzare le procedure di debug del codice sono stati realizzati utili tool a riga di comando per Linux per la rapida estrazione-modifica-ricompattazione di documenti ''OOXML''. Si propone in appendice un comando bash per questi scopi.&lt;br /&gt;
&lt;br /&gt;
==Sviluppi futuri==&lt;br /&gt;
&lt;br /&gt;
In questa sezione si fa cenno, senza poterle approfondire, ad alcune interessanti questioni emerse nello svolgimento della tesi.&lt;br /&gt;
&lt;br /&gt;
===Accesso al servizio web===&lt;br /&gt;
&lt;br /&gt;
In fase iniziale, il servizio web potrà essere reso accessibile in forma completamente aperta, senza richiedere cioè la registrazione dell’utente o l’autenticazione dell’utente già registrato. In questo modo, in effetti, si premia la facilità d’uso, ma si incorre nella nota problematica di un uso malevolo, costituito da accessi a raffica, finalizzati a saturare il server e generare una condizione di ''DoS – Denial of Service''. Diverse sono le tecniche che possono essere adottate per contrastare questo tipo di accessi malevoli, come richiedere di superare &amp;quot;''captcha''&amp;quot; e/o introdurre ritardi crescenti ed eventualmente blocchi in risposta ad accessi prevenienti con alta frequenza dallo stesso indirizzo IP.&lt;br /&gt;
È possibile anche pensare ad un accesso previa registrazione ed autenticazione dell’utente, penalizzando l’immediatezza di utilizzo del servizio, ma eventualmente ottenendo l’indirizzo email degli utenti che acconsentono a lasciarlo per successive finalità marketing.&lt;br /&gt;
È possibile, infine, un utilizzo misto, contando in un cookie il numero di accessi eseguiti e richiedendo all’utente di registrarsi per continuare ad utilizzare il servizio, dopo qualche accesso.&lt;br /&gt;
&lt;br /&gt;
===Ampliamento dinamico del dizionario===&lt;br /&gt;
&lt;br /&gt;
Nel restituire il documento elaborato all'utente, gli si da la possibilità di richiedere una nuova elaborazione, dopo aver indicato i nominativi che fossero sfuggiti; pare inesauribile, infatti, la &amp;quot;fantasia&amp;quot; dei genitori nel dare nome ai propri figlioli!&lt;br /&gt;
I nominativi indicati dall'utente sono sfuggiti al servizio perché non presenti nel dizionario: facilmente viene in mente l’idea di arricchire il dizionario con i nominativi indicati dall’utente. Va però considerato il caso che l’utente in malafede indichi nominativi fasulli al fine di inquinare il dizionario.&lt;br /&gt;
Il caso malevolo può essere affrontato attraverso una strategia che preveda non direttamente l'inserimento del nuovo nominativo nel dizionario, ma invece l'utilizzo di un concetto di &amp;quot;candidatura&amp;quot;: il nuovo nominativo viene registrato, ma si attende di avere un certo numero di utenti che lo propongono prima di approvarne l'inserimento nel dizionario.&lt;br /&gt;
Può anche essere utilizzato un concetto di &amp;quot;attendibilità&amp;quot; della candidatura di un nuovo nominativo, verificando ad esempio l'utente che lo propone scarichi effettivamente il file rielaborato.&lt;br /&gt;
Nel caso l'accesso avvenga con autenticazione, e cioè identificando gli utenti, si apre la possibilità di individuare e bannare gli utenti malevoli.&lt;br /&gt;
&lt;br /&gt;
===Natura del documento e ricorrenza del nominativo===&lt;br /&gt;
&lt;br /&gt;
Si coglie facilmente la differenza di formato fra un documento in forma di elenco (es. una graduatoria) da un documento in forma di relazione (es. una sentenza giudiziaria). Differenze di questo tipo potrebbero essere utilizzate per escludere o ammettere la ripetizione dei nominativi.&lt;br /&gt;
Per meglio dire: in un elenco la ripetizione di un nominativo è di fatto da escludersi o va trattata come omonimia. In una relazione, l’individuazione di un nominativo può essere utilizzata per ricercarlo direttamente in altri punti del documento stesso.&lt;br /&gt;
&lt;br /&gt;
===Altri dati personali===&lt;br /&gt;
&lt;br /&gt;
Altri dati personali sono trattabili con le stesse tecniche analizzate in questa tesi: date e luoghi di nascita, codici fiscali, indirizzi, email, numeri di telefono, sesso etc. In qualche caso, come per i codici fiscali, l’individuazione del pattern da trattare è persino più semplice.&lt;br /&gt;
Diversi studi ([0039]) hanno dimostrato che, utilizzando set di dati personali parziali, è possibile la re-identificazione dei soggetti, pur in documenti pseudonimizzati. È questo un altro motivo per estendere i trattamenti descritti anche agli altri dati personali richiamati.&lt;br /&gt;
&lt;br /&gt;
===Altri alfabeti===&lt;br /&gt;
&lt;br /&gt;
È possibile estendere il sotto-insieme di caratteri Unicode utilizzati nelle ''regex'' per elaborare documenti scritti in altri alfabeti non latini.&lt;br /&gt;
&lt;br /&gt;
==Conclusioni==&lt;br /&gt;
&lt;br /&gt;
Questa tesi è partita da un problema basilare, quasi scolastico, dell'informatica: la ricerca di un testo in un documento, al fine della sua cancellazione o modifica.&lt;br /&gt;
&lt;br /&gt;
Il problema si è subito discostato dalla sua formulazione basilare, principalmente perché, nei casi d'uso, il documento da ricercare non è un semplice testo (&amp;quot;''plain text''&amp;quot;) ma invece è il prodotto di un ''word-processor'': quindi è costituito da una struttura XML più o meno complessa, rappresentante formattazioni, riferimenti interni o esterni, note, etc. La ricerca deve avvenire nei soli nodi di puro testo, individuando ed escludendo dall'analisi lessicale gli elementi testuali di mark-up che non costituiscono contenuto informativo. Nell'approfondire le strutture ed i concetti XML ho potuto notare quanto essi siano ricorrenti in molti ambiti dell'informatica.&lt;br /&gt;
&lt;br /&gt;
Nell'analisi delle specifiche, un'altra complicazione si è presto aggiunta: l'usabilità del servizio cresce drasticamente se si evita di chiedere all'utente, come si era pensato in un primo tempo di fare, quali siano le stringhe (i nominativi) da ricercare e trattare; è nata allora l'idea di reperire queste stringhe in un dizionario di nomi ed in un dizionario di cognomi, considerando anche le permutazioni dei lemmi reperiti. Ho così dovuto approfondire alcuni problemi tipici dei dizionari, come il loro ampliamento automatico con tecniche oggi comprese nel ''machine-learning''. Non ho potuto &amp;quot;resistere&amp;quot; alla tentazione di ''formalizzare la matematica'' in base alla quale ho costruito le strategie di ricerca.&lt;br /&gt;
&lt;br /&gt;
Spunto per la tesi è stata la recente legislazione in materia di dati personali, il GDPR. Esaminandone gli articoli pertinenti, ho maturato una riflessione generale: sempre più il software dovrà essere progettato e realizzato anche alla luce di altre discipline, non solo di quelle informatiche, come le discipline giuridiche ed il diritto.&lt;br /&gt;
&lt;br /&gt;
Durante la fase iniziale della collaborazione con l'azienda mi sono dedicato alla messa a punto delle specifiche; ciò mi ha permesso di comprendere quanto questa fase sia importante e come completezza e precisione delle specifiche siano alla base di un progetto efficace.&lt;br /&gt;
&lt;br /&gt;
Molto importanti sono state la analisi relative al tipo e formato dei documenti da assumere come input ed alla presentazione ottimale del servizio rispetto all'usabilità. &lt;br /&gt;
&lt;br /&gt;
Centrale nel lavoro ed avvincente è stata la definizione della strategia per il riconoscimento dei lessemi attraverso la costruzione dinamica di ''regex'' idonee. In questo fase del lavoro, anche per passione personale, ho approfondito le questioni del riconoscimento &amp;quot;di testi nei testi&amp;quot; che legano, fin dalle origini, l'informatica e la linguistica.&lt;br /&gt;
&lt;br /&gt;
La fase di definizione dell'architettura del servizio mi ha permesso di ripercorrere molte le materie studiate nei tre anni del Corso di Ingegneria Informatica, affrontando argomenti  come il Single Responsibility Principle, il Dependency Inversion Principle, lo &amp;quot;stile&amp;quot; architetturale REST. Molto istruttiva è stata anche la riflessione sulla scomposizione del servizio in moduli software.&lt;br /&gt;
&lt;br /&gt;
Come sempre accade nell'affrontare un progetto nuovo, sono nate molte nuove idee; ho così immaginato numerosi sviluppi futuri, sia a perfezionamento funzionale dell'accesso web al servizio, sia ad estensione delle specifiche per coprire casi applicativi contigui (es. quando il dato che si vuole trattare è un codice fiscale). Dovendo necessariamente tener presente che questo lavoro è una tesi, verificherò con il supporto del mio relatore come poterne proseguire lo sviluppo.&lt;br /&gt;
&lt;br /&gt;
==Bibliografia==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0000]https://en.wikipedia.org/wiki/Comparison_of_Office_Open_XML_software&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0001]https://en.wikipedia.org/wiki/Comparison_of_OpenDocument_software&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0002]https://en.wikipedia.org/wiki/Standardization_of_Office_Open_XML&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0003]https://en.wikipedia.org/wiki/OpenDocument_standardization&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0004]https://support.apple.com/en-us/HT202227&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0005]https://en.wikipedia.org/wiki/Pages_(word_processor)&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0006]https://en.wikipedia.org/wiki/Comparison_of_word_processors&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0007]https://en.wikipedia.org/wiki/OpenDocument&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0008]https://en.wikipedia.org/wiki/Office_Open_XML_file_formats&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0009]https://en.wikipedia.org/wiki/Rich_Text_Format&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0010]https://www.ecma-international.org/publications/standards/Ecma-376.htm&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0011]https://www.iso.org/standard/51463.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0012]https://www.iso.org/standard/71691.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0013]https://en.wikipedia.org/wiki/Office_Open_XML&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0014]https://en.wikipedia.org/wiki/Open_Packaging_Conventions&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0015]https://en.wikipedia.org/wiki/LAMP_(software_bundle)&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0016]https://w3techs.com/blog/entry/debian_ubuntu_extend_the_dominance_in_the_linux_web_server_market_at_the_expense_of_red_hat_centos&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0017]https://news.netcraft.com/archives/2014/06/06/june-2014-web-server-survey.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0018]https://whatis.techtarget.com/definition/LAMP-Linux-Apache-MySQL-PHP&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0019]https://www.ibm.com/cloud/learn/lamp-stack-explained&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0020]https://en.wikipedia.org/wiki/Single_responsibility_principle&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0021]https://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0022]https://en.wikipedia.org/wiki/Latin_script_in_Unicode&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0023]https://it.wikipedia.org/wiki/ISO/IEC_8859-1&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0024]http://www.treccani.it/enciclopedia/uso-delle-maiuscole_%28La-grammatica-italiana%29/&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0025]https://en.wikipedia.org/wiki/Ambiguity#Linguistic_forms&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0026]Steven L. Small; Garrison W Cottrell; Michael K Tanenhaus (22 October 2013). Lexical Ambiguity Resolution: Perspective from Psycholinguistics, Neuropsychology and Artificial Intelligence. Elsevier Science. ISBN 978-0-08-051013-2.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0027]http://www.treccani.it/vocabolario/disambiguazione/&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0028]R. Navigli, K. Litkowski, O. Hargraves. 2007. SemEval-2007 Task 07: Coarse-Grained English All-Words Task. Proc. of Semeval-2007 Workshop (SemEval), in the 45th Annual Meeting of the Association for Computational Linguistics (ACL 2007), Prague, Czech Republic, pp. 30–35 http://www.aclweb.org/anthology/S/S07/S07-1006.pdf&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0029]https://wordnet.princeton.edu/&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0030]R. Navigli, S. P. Ponzetto. BabelNet: Building a Very Large Multilingual Semantic Network. Proc. of the 48th Annual Meeting of the Association for Computational Linguistics (ACL 2010), Uppsala, Sweden, July 11-16, 2010, pp. 216-225. http://aclweb.org/anthology/P/P10/P10-1023.pdf&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0031]Roventini A., Alonge A., Calzolari N., Magnini B., Bertagna F. (2000), &amp;quot;ItalWordNet: a Large Semantic Database for Italian&amp;quot;, Proc. of the 2nd International Conference on Language Resources and Evaluation (LREC 2000), Athens, Greece, 2000, pp. 783-790.&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0032]E. Pianta, L. Bentivogli, C. Girardi. MultiWordNet: developing an aligned multilingual database, Proc. of the First International Conference on Global WordNet, Mysore, India, January 21-25, 2002. http://multiwordnet.fbk.eu/paper/MWN-India-published.pdf&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0033]https://www.iso.org/standard/28245.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0034]https://www.gpdp.it/web/guest/regolamentoue&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0035]https://eur-lex.europa.eu/legal-content/IT/TXT/?uri=uriserv:OJ.L_.2016.119.01.0001.01.ITA&amp;amp;toc=OJ:L:2016:119:TOC&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0036]https://www.corriere.it/Primo_Piano/Cronache/2006/09_Settembre/15/cognomi.shtml&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0037]https://data.world/axtscz/italian-first-names&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0038]https://en.wikipedia.org/wiki/Dependency_inversion_principle&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0039]https://imperialcollegelondon.app.box.com/s/lqqcugie51pllz26uixjvx0uio8qxgo5/file/493461282808&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0040https://www.docx4java.org/trac/docx4j]&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0041]https://github.com/plutext/docx4j&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0042]https://docs.oracle.com/javase/9/docs/api/java/lang/String.html&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0043]https://github.com/php/php-src/blob/master/ext/session/session.c&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0044]https://github.com/plutext/docx4j/search?q=getJAXBNodesViaXPath+in%3Afile&amp;amp;type=Code&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0045]https://www.w3.org/TR/xpath-30/&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0046]&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0047]&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;[0048]&lt;br /&gt;
&lt;br /&gt;
==Indice delle figure==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
[0F00]https://en.wikipedia.org/wiki/Latin_script&lt;br /&gt;
&amp;lt;!-- [[File:Latin alphabet world distribution.svg|thumb|upright=1.6|In verde scuro le nazioni dove è usato solo l'alfabeto latino; in verde chiaro quelle dove all'alfabeto latino è affiancato un altro alfabeto.]] --&amp;gt;&lt;br /&gt;
[0F01]Diagramma di Venn 1&lt;br /&gt;
[0F02]Diagramma di Venn 2&lt;br /&gt;
[0F03]Diagramma di Venn 3&lt;br /&gt;
[0F04]Esito unit test regex (cartella immagini)&lt;br /&gt;
[0F05]Inforgrafica GDPR&lt;br /&gt;
[0F06]Diagramma di sequenza UML&lt;br /&gt;
[0F07]&lt;br /&gt;
[0F08]&lt;br /&gt;
[0F09]&lt;/div&gt;</summary>
		<author><name>Lorenzo.amorosa</name></author>
		
	</entry>
</feed>