UNIVERSITÀ DEGLI STUDI DI PADOVA DIPARTIMENTO DI MATEMATICA CORSO DI LAUREA TRIENNALE IN INFORMATICA TESI DI LAUREA SVILUPPO DEL GIOCO GEISTER CON L’AUSILIO DI WEB SERVICE Relatore: Candidato: Prof. Claudio E. Palazzi Luca Semenzato Matricola: 540620 / SIN Anno Accademico: 2011/2012 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica 2 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica For long you live and high you fly and smiles you'll give and tears you'll cry and all your touch and all you see is all your life will ever be. Run, rabbit run. Dig that hole, forget the sun, And when at last the work is done Don't sit down it's time to dig another one. Pink Floyd – Breathe 3 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica Un ringraziamento speciale al prof. Palazzi e al prof. Aiolli: grazie per tutto l’aiuto, le indicazioni precise e la grande fiducia che avete riposto in me. Questo lavoro è stato per me fonte di grande esperienza, e per questo vi sarò sempre grato. 4 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica SOMMARIO ...................................................................................................................................9 Capitolo 1. INTRODUZIONE ............................................................................................. 11 1.1 IL GIOCO ............................................................................................................................................................ 12 1.2 DOMINIO ATTUALE ..................................................................................................................................... 13 1.3 OBIETTIVI ........................................................................................................................................................ 14 Capitolo 2. TECNOLOGIE COINVOLTE .......................................................................... 17 2.1 WEB SERVICE ................................................................................................................................................. 17 2.2 APACHE AXIS 2 E TOMCAT....................................................................................................................... 22 2.3 JAVA .................................................................................................................................................................... 22 2.4 MySQL ................................................................................................................................................................ 23 2.5 ECLIPSE ............................................................................................................................................................. 23 2.6 ANDROID .......................................................................................................................................................... 24 2.7 KSOAP2 PER ANDROID .............................................................................................................................. 25 2.8 TORTOISE SVN ............................................................................................................................................... 25 Capitolo 3. ANALISI DEI REQUISITI............................................................................... 27 3.1 LISTA DEI REQUISITI .................................................................................................................................. 27 3.1.1 Obbligatori ............................................................................................................................................... 27 3.1.2 Desiderabili .............................................................................................................................................. 28 3.1.3 Opzionali ................................................................................................................................................... 28 3.2 DIAGRAMMI USE-CASE .............................................................................................................................. 29 3.2.1 USE-CASE A: ACCESSO ......................................................................................................................... 29 3.2.2 Use-case A.1: Registrazione ............................................................................................................... 29 3.2.3 Use-case A.2: Login ............................................................................................................................... 30 3.2.4 Use-case A.3: Credits............................................................................................................................. 31 3.2.5 Use-case A.4: Manuale ......................................................................................................................... 31 3.2.6 USE-CASE B: PROFILO ......................................................................................................................... 32 3.2.7 Use-case B.1: GESTIONE ANAGRAFICA ......................................................................................... 32 3.2.8 Use-case B.2: POLLING SFIDATO ..................................................................................................... 33 3.2.9 Use-case B.3: GESTIONE AMICI ........................................................................................................ 33 3.2.10 Use-case B.4: LANCIA SFIDA ........................................................................................................... 34 3.2.11 USE-CASE C: GESTIONE AMICI ...................................................................................................... 35 3.2.12 Use-case C.1: VISUALIZZA AMICI .................................................................................................. 35 3.2.13 Use-case C.2: INSERISCI NUOVO AMICO .................................................................................... 35 3.2.14 Use-case C.3: ELIMINA AMICO ....................................................................................................... 37 3.2.15 USE-CASE D: LANCIA SFIDA ........................................................................................................... 38 3.2.16 Use-case D.1: SFIDA UTENTE REGISTRATO ............................................................................. 38 3.2.17 Use-case D.2: SFIDA INTELLIGENZA ARTIFICIALE ............................................................... 38 3.2.18 USE-CASE E: GESTIONE SFIDA A UTENTE REGISTRATO ................................................... 40 3.2.19 Use-case E.1: CREA SFIDA ............................................................................................................... 40 3.2.20 Use-case E.2: ACCETTA SFIDA ....................................................................................................... 41 5 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica 3.2.21 Use-case E.3: INSERISCI POSIZIONI INIZIALI .......................................................................... 41 3.2.22 Use-case E.4: VISUALIZZA POSIZIONI AVVERSARIO ............................................................. 42 3.2.23 Use-case E.5: INSERISCI MOSSE .................................................................................................... 43 3.2.24 Use-case E.6: VISUALIZZA MOSSE AVVERSARIO .................................................................... 43 3.2.25 Use-case E.7: CONTROLLO FINE SFIDA...................................................................................... 44 3.2.26 USE-CASE F: SFIDA INTELLIGENZA ARTIFICIALE ................................................................ 45 3.2.27 Use-case F.1: CREA SFIDA ................................................................................................................ 45 3.2.28 Use-case F.2: ACCETTA SFIDA IA .................................................................................................. 45 3.2.29 Use-case F.3: CREA SFIDA ................................................................................................................ 46 3.2.30 Use-case F.4: INSERISCI POSIZIONI IA ....................................................................................... 46 3.2.31 Use-case F.5: VISUALIZZA POSIZIONI AVVERSARIO ............................................................. 46 3.2.32 Use-case F.6: INSERISCI MOSSE .................................................................................................... 46 3.2.33 Use-case F.7: INSERISCI MOSSE IA .............................................................................................. 47 3.2.34 Use-case F.8: VISUALIZZA MOSSE AVVERSARIO .................................................................... 47 3.2.35 Use-case F.9: CONTROLLO FINE SFIDA ...................................................................................... 47 Capitolo 4. PROGETTAZIONE .......................................................................................... 49 4.1 DATABASE ....................................................................................................................................................... 51 4.1.1 utenti .......................................................................................................................................................... 52 4.1.2 sessioni ....................................................................................................................................................... 53 4.1.3 amici ........................................................................................................................................................... 53 4.1.4 partite ........................................................................................................................................................ 53 4.1.5 posizioni_iniziali .................................................................................................................................... 54 4.1.6 mosse .......................................................................................................................................................... 54 4.1.7 learners ..................................................................................................................................................... 54 4.1.8 rankers....................................................................................................................................................... 54 4.1.9 learners_rankers .................................................................................................................................... 55 4.1.10 profili_u_l_r ............................................................................................................................................ 55 4.1.11 log ............................................................................................................................................................. 55 4.2 WEB SERVICE - WSUtenti ......................................................................................................................... 56 4.3 WEB SERVICE - WSGame ......................................................................................................................... 57 4.4 WEB SERVICE - WSData ............................................................................................................................ 57 4.5 PROGETTAZIONE HARDWARE SERVIZI ........................................................................................... 58 4.6 PROGETTAZIONE SOFTWARE SERVIZI .............................................................................................. 59 4.7 AUTENTICAZIONE ........................................................................................................................................ 60 4.8 CLIENT ............................................................................................................................................................... 61 4.9 ALTRI MODULI COINVOLTI...................................................................................................................... 66 4.9.1 Stored Procedure ................................................................................................................................... 66 4.9.2 Algoritmi di Intelligenza Artificiale ............................................................................................... 66 Capitolo 5. SVILUPPO ......................................................................................................... 69 5.1 IMPLEMENTAZIONE WEB SERVICE..................................................................................................... 69 6 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica 5.2 WSDATA – MySkeleton.java ..................................................................................................................... 72 5.2.1 Dichiarazione classe e metodi: ......................................................................................................... 72 5.2.2 Metodi principali: .................................................................................................................................. 73 5.3 WSUTENTI – MySkeleton.java................................................................................................................. 74 5.3.1 Dichiarazione classe e metodi: ......................................................................................................... 74 5.3.2 Metodi principali: .................................................................................................................................. 74 5.4 WSGAME – MySkeleton.java .................................................................................................................... 75 5.4.1 Dichiarazione classe e metodi: ......................................................................................................... 75 5.4.2 Metodi principali: .................................................................................................................................. 75 5.5 TABELLA ERRORI WEB SERVICE .......................................................................................................... 75 5.6 USO DI STUB NEI CLIENT ......................................................................................................................... 76 5.7 CLIENT ANDROID ......................................................................................................................................... 77 5.7.1 Package Handler ................................................................................................................................... 78 5.7.2 Package Exception ................................................................................................................................ 78 5.7.3 Package polling ...................................................................................................................................... 79 5.7.4 Package android .................................................................................................................................... 80 5.8 CLIENT SCREENSHOT ................................................................................................................................. 87 5.9 INTEGRAZIONE INTELLIGENZA ARTIFICIALE ............................................................................... 90 5.9.1 Learner ...................................................................................................................................................... 91 5.9.2 LearnerServer ......................................................................................................................................... 91 5.9.3 Ranker........................................................................................................................................................ 93 5.10 TEST ................................................................................................................................................................. 93 Capitolo 6. CONCLUSIONI ................................................................................................. 99 6.1 CONSIDERAZIONI PERSONALI ............................................................................................................... 99 6.2 SVILUPPI FUTURI ...................................................................................................................................... 100 Capitolo 7. PIANO DI LAVORO ..................................................................................... 101 Capitolo 8. GLOSSARIO ................................................................................................... 105 Capitolo 9. BIBLIOGRAFIA ............................................................................................ 109 9.1 Libri .................................................................................................................................................................. 109 9.2 Siti ..................................................................................................................................................................... 109 Capitolo 10. RINGRAZIAMENTI................................................................................... 111 7 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica 8 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica SOMMARIO Con il continuo progresso delle tecnologie e dei mezzi di comunicazione anche il mondo dei giochi interattivi ha subito una forte spinta verso il cambiamento. Giochi una volta ritenuti solo “da tavolo” hanno conosciuto una nuova evoluzione significativa verso il loro riadattamento in chiave moderna, estendendo il concetto di tavolo all’idea di cerchia virtuale di conoscenze, promossa da Internet e da un approccio più social-oriented. Il ricorso al web ha permesso a tanti giochi classici di vivere una nuova fase creativa, mantenendo immutate le regole di base, ma proponendo un nuovo modo di associare il giocatore all’avversario, più rivolto alla creazione di una rete di contatti da sfidare, potenzialmente più grande e soddisfacente di un singolo tavolo da gioco. Il gioco Geister si inserisce in questo contesto, forte della sua ottima giocabilità, ma povero di strategie di accesso alla rete e di una piattaforma di sviluppo congruente alle aspettative di diffusione e raccolta dei dati. Il progetto punta alla creazione di questa piattaforma, scegliendo gli strumenti opportuni per gestire il gioco attraverso Internet, per assecondare il maggior numero possibile di utenti inter-connessi, e per raccogliere dati utili allo studio di algoritmi di Intelligenza Artificiale. L’intrinseco aspetto di gioco ad informazione incompleta rende Geister molto accattivante per l’analisi del comportamento tenuto dai giocatori, sempre spinti al raggiungimento della vittoria attraverso l’uso di tattiche di dissimulazione e di mascheramento delle condizioni delle proprie pedine. Il progetto pone le basi per un concreto utilizzo di algoritmi di Intelligenza Artificiale precedentemente creati in altre esperienze di stage, che sappiano catalogare il profilo di gioco di ogni giocatore, e ne stimino la disposizione dei pezzi in campo, adottando la giusta contro-strategia, mossa dopo mossa. A differenza dei giochi a informazione completa, Geister pone interessanti interrogativi sull’efficacia nell’uso di algoritmi standard di Intelligenza Artificiale in giochi ad alto grado di mascheramento. Grazie all’uso della piattaforma implementata sarà possibile avere delle prime risposte in questo senso. Ciò che ci si propone di fare in questo lavoro è di creare la piattaforma di gioco e raccolta dati, di integrare gli algoritmi di profilazione e generazione delle mosse per l’Intelligenza Artificiale precedentemente creati, e di dare una prima stima sul comportamento di tali algoritmi. 9 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica 10 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica Capitolo 1. INTRODUZIONE Il progetto di sviluppo software del gioco Geister è nato con il duplice obiettivo di creare una piattaforma interattiva accattivante e fruibile da tutti in maniera semplice, e di raccogliere i dati di gioco di tutti i giocatori per avviare una fase di studio sulle giocate mascherate, obiettivo molto importante dal punto di vista scientifico. Infatti, mentre è relativamente semplice creare algoritmi di Intelligenza Artificiale per giochi a informazione completa, diventa più complicato trattare quelli a informazione incompleta (ovvero quelli in cui il giocatore non ha a disposizione tutte le informazioni rispetto allo stato di gioco). In questi casi è interessante studiare quali tecniche si possano adottare per far comportare il sistema in modo simile a un giocatore reale includendo anche dissimulazione e mascheramento. Un’idea è quella di usare gli algoritmi di SVM (Support Vector Machine) per profilare i giocatori, e usare poi i profili ottenuti per generare le mosse dell’Intelligenza Artificiale, adattando così la strategia di gioco alle caratteristiche emerse nell’analisi del comportamento dei singoli giocatori. Questa strategia è già stata implementata in altre esperienze di stage, ma per poter verificarne l’efficacia serve un gioco che funga da banco di prova sperimentale per raccogliere dati su partite reali. Il gioco inoltre deve essere facilmente usufruibile e accattivante in modo da attrarre giocatori a partecipare a tante sessioni, così da avere a disposizione una quantità sufficiente di dati tali da poter essere usati in uno studio scientifico. Di qui nasce l’intrinseca necessità di un client facile da reperire, che sia attraente dal punto di vista della giocabilità e che sappia incentivare la propria diffusione, in modo da portare visibilità al progetto, ma soprattutto per stimolare la sfida, e quindi la raccolta di dati preziosi. La scarsa diffusione del gioco da tavolo ha reso arduo il compito di ampliare il bacino degli utenti che possono essere interessati. Per questo motivo, il progetto segue l’idea di poggiare la propria architettura su una piattaforma orientata al web, consentendo di creare dinamiche di rete sociale atte agli scopi preposti. La diffusione del gioco online porterà alla sua crescita sul profilo dei dati raccolti, grazie al passaparola, ma anche grazie alla possibilità di creare una rete di amicizie virtuali con cui confrontarsi e sfidarsi. Questa peculiarità sarà una novità per un gioco che altrimenti avrebbe necessariamente ospitato solo due giocatori e pochi spettatori attorno ad un tavolo. La capacità di Internet di essere prima di tutto rete di contatti offrirà nuova spinta verso la sua diffusione. Tutto questo viaggerà di pari passo con lo studio delle partite effettuate, e la possibilità di creare algoritmi di Intelligenza Artificiale sempre più raffinati e complessi, con cui gli utenti potranno confrontarsi in assenza di amici online. 11 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica 1.1 IL GIOCO Geister, il cui titolo originale è “Geister - Die guten und die bösen Geister” (in inglese Ghosts!, in italiano Fantasmi) è un gioco in scatola creato da Alex Randolph nel 1980.1 Ogni giocatore ha a disposizione 8 fantasmini, 4 dei quali con il pallino rosso (fantasmi cattivi) e 4 con il pallino blu (fantasmi buoni) da disporre su una scacchiera di 6x6 celle. L'identità in campo dei fantasmini dell'avversario è celata (i pallini rossi e blu colorano solo il lato del fantasmino visibile al giocatore che lo controlla) fino a che questi non vengono mangiati (ed eliminati). La disposizione iniziale dei fantasmini avviene nelle otto caselle centrali delle prime due righe, ed è a totale discrezione del giocatore, che potrà così prevedere la miglior strategia di partenza per attuare il suo mascheramento (vedi Figura 1.1). Nel proprio turno un giocatore deve muovere uno dei suoi fantasmini in una qualunque direzione (avanti, dietro, destra, sinistra, tranne in diagonale). Se nell’effettuare la propria mossa finisce su una casella occupata da un fantasma avversario, quest'ultimo viene "mangiato" ed eliminato. Solo a questo punto viene smascherata l’identità del fantasma, e si conosce l’esito della propria mangiata. Il gioco finisce in uno dei tre modi seguenti: - quando si mangiano tutti i 4 fantasmi buoni (blu) dell’ avversario; quando si costringe l’avversario a mangiare i 4 propri fantasmi cattivi (rossi); quando uno dei propri fantasmi buoni riesce ad "uscire" dalla plancia da uno dei due cancelli di uscita, posti negli angoli in alto a sinistra e destra rispetto alla propria visuale della scacchiera (e quindi posti come uscita “alle spalle” dell’avversario). Il terzo modo di uscita in particolare sfrutta l’idea di far passare ad uno dei propri fantasmi buoni la “barriera” composta dai fantasmi dell’avversario, e richiama a giochi ben più noti come la dama o gli scacchi. A differenza di questi ultimi però, dove le pedine non sono mascherate, e le mosse sono sempre chiare e visibili, tutto, in Geister, è basato su una serie di bluff, a partire dal posizionamento iniziale, fino allo studio di una strategia di vittoria che sposti i fantasmi nella scacchiera in modo da trarre in inganno l’avversario. Quanto più si riuscirà a mascherare l’identità dei propri fantasmi, tante più probabilità di successo si avranno. Inoltre, la triplice strategia di vittoria permessa, crea molte variabili di offuscamento aggiuntive, spostando continuamente l’attenzione dell’avversario tra la geometria dei pezzi in gioco e la loro identità (e quindi pericolosità). 1 2 Fonte: boardgamegeek.com Vedi tesi di Amir Gharaba: “Reingegnerizzazione del software Geister ed interfacciamento 12 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica Figura 1.1: Geister: pannello gioco e posizionamento iniziale. 1.2 DOMINIO ATTUALE Il tentativo di portare il gioco Geister su una piattaforma software ha già generato un notevole percorso di successo. Allo stato attuale, il progetto ha coinvolto diversi studenti che ne hanno aggiunto e raffinato il codice come attività di stage. La versione attuale, su cui è possibile giocare da soli o con un compagno, è stata sviluppata usando il linguaggio Java e ha prodotto un software standalone, giocabile in pc con Java Virtual Machine installata, alternando il giocatore e l’avversario sulla postazione stessa. La giocabilità è sufficiente agli scopi, ma non permette di diffondere agevolmente il progetto ad altri utenti. Il passaparola derivante dalla diffusione di questo tipo di gioco è prevedibilmente piuttosto scarso, e si limita ad una rete di utenti reali interessati allo stesso, non dissimile dal contesto del gioco in scatola prestato ad amici e parenti. Inoltre, i dati di gioco sono salvati in file di log nel computer stesso, cosa che rende difficoltosa la raccolta di tutte le partite per avviare la fase di studio dei profili. I vantaggi derivanti dall’aver creato il software del gioco sono notevoli, ma vanno indirizzati verso una miglior strategia di diffusione. Recentemente, una reingegnerizzazione del progetto2, ha portato ad una buona piattaforma di partenza, che va però adattata all’uso via Internet e ad una raccolta dati più efficace e meno dispersiva. La parte di gestione dei dati e di studio di una efficace Intelligenza Artificiale è in continua evoluzione, ma stenta ad entrare a pieno regime per mancanza di risultati effettivi con cui confrontarsi e su cui basare un’adeguata strategia. E’ basilare quindi poter contare su una buona piattaforma di gioco via Internet, impreziosita da meccanismi di incentivazione alla sfida e alla diffusione del programma. Inoltre andranno poggiate le basi per una piattaforma che sia sufficientemente consona agli scopi, che sopporti notevoli carichi di richieste potenzialmente contemporanee, e sappia far fronte a tutte le dinamiche inerenti il multitasking sia tra utenti che tra utenti e Intelligenza Artificiale. Vedi tesi di Amir Gharaba: “Reingegnerizzazione del software Geister ed interfacciamento con infrastruttura web”. 2 13 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica Figura 1.2 - Videata del programma standalone attuale. In Figura 1.2 possiamo vedere una videata del programma attuale, nella sua versione standalone scritta in linguaggio Java. 1.3 OBIETTIVI Dopo aver definito l’importanza della diffusione del gioco e della conseguente raccolta dei dati inerenti le partite giocate, è facile prevedere come gli obiettivi preposti siano legati allo sviluppo della piattaforma adeguata. L’obiettivo primario è quello di scegliere uno strumento atto alla gestione contemporanea di più richieste, alla raccolta di dati in una basi di dati unica, e alla gestione separata di logica di gioco e interfaccia con l’utente. Strettamente derivanti da ciò, emergono l’uso di un sistema client/server che utilizzi Internet come mezzo di trasmissione, e la raccolta dati tramite database relazionale. Le richieste server dovranno essere assecondate con strumenti fortemente orientati al web, facili da chiamare con svariati tipi di client e che possano garantire livelli sufficienti di performance e modularità. É importante scegliere strumenti che diano il giusto compromesso tra facilità di gestione e performance ottimali. I servizi che il lato server dovrà poter evadere devono far fronte a tutte le richieste riguardanti: - le informazioni relativi a tutti i giocatori che si iscrivono tramite i client (anagrafiche e relazioni di amicizie, disponibilità al gioco, ecc.) ; - le informazioni di gioco relative alle partite effettuate da coppie di giocatori o da singoli giocatori contro profili di Intelligenza Artificiale; - la logica di gioco delle partite, gestendo i turni delle mosse e le mosse possibili, registrando i valori e comunicando mosse ed eventi relativi al gioco. Sarà cura del lato server salvare tutti i dati in un opportuno database che sia accessibile a futuri scopi di studio per la creazione di algoritmi di Intelligenza Artificiale sempre più abili e complessi. Obiettivo auspicabile è quello di ottimizzare le trasmissioni di dati via rete, riducendo al minimo lo spreco della banda di 14 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica comunicazione al server. Ulteriore obiettivo è quello di creare un client di base che sia di moderna concezione, per poter “cavalcare” la diffusione di una piattaforma di gaming utile agli scopi; a questo proposito viene già prefissata la creazione di un client per dispositivi touch-screen in Android, vista la sua ampia diffusione commerciale. 15 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica 16 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica Capitolo 2. TECNOLOGIE COINVOLTE Il problema primario da risolvere è la scelta di una adeguata piattaforma client/server che possa fornire al tempo stesso affidabilità ed efficienza. La soluzione inizialmente studiata prevedeva l’utilizzo di trasmissioni dirette client/server tramite il protocollo TCP/IP. In particolare, si era pensato all’utilizzo di una trasmissione via socket e la creazione di un protocollo di comunicazione opportunamente studiato per gestire il dialogo tra client e server. Questa soluzione, per quanto vantaggiosa, si prestava ad una serie di accurate e dispendiose analisi per valutare il protocollo di comunicazione, e offriva lo svantaggio di una obbligata negoziazione nella gestione della porta di trasmissione che avrebbe potuto essere fonte di blocchi da parte di firewall interposti tra client e server. Si è deciso di passare quindi ad una architettura che garantisse il miglior compromesso tra velocità di trasmissione, gestione di molteplici chiamate contemporanee, capacità di trasmissione senza vincoli di rete particolari. La necessità di spostare la comunicazione ad un livello più alto, per non cadere in vincoli di porte e firewall, ha diretto l’attenzione verso l’uso di protocolli che sfruttino pienamente il web. La scelta è caduta ben presto sui web service. 2.1 WEB SERVICE Secondo la definizione del W3C un web service è un sistema software progettato per supportare l'interoperabilità tra diversi elaboratori su di una medesima rete. Un web service è un servizio (una funzionalità, un calcolo, ecc.) messo a disposizione da parte di un’applicazione sul web, che può essere utilizzato attraverso un colloquio instaurato tra web service e consumer (Service Requestor). In questo senso, i web service permettono l'interoperabilità tra diverse applicazioni software su diverse piattaforme hardware e consentono di condividere e riutilizzare ciò che è disponibile su altri siti senza conoscere la struttura interna del fornitore (Service Provider). Tecnicamente un web service è un sistema software in grado di mettersi al servizio di un’applicazione comunicando su di una medesima rete tramite un protocollo applicativo (solitamente HTTP). Quindi un web service si presta a tutti quegli scopi di interoperabilità attraverso la rete in un ambito “machine-tomachine”, consentendo alle applicazioni che vi si collegano di usufruire delle funzioni che mette a disposizione. Grande vantaggio dei web service risiede proprio nell’utilizzo di protocolli e standard definiti “aperti” e quindi sempre a disposizione degli sviluppatori. La filosofia che sta alla base dei Web Service richiama all’architettura SOA (Service-Oriented Architecture), che viene definita così dal gruppo OASIS (Organizzazione per lo sviluppo di standard sull'informazione strutturata): Un paradigma per l'organizzazione e l'utilizzazione delle risorse distribuite che possono essere sotto il controllo di domini di proprietà differenti. Fornisce un mezzo uniforme per offrire, scoprire, interagire ed usare le capacità di produrre gli effetti voluti consistentemente con presupposti e aspettative misurabili. Seguendo questa filosofia i web service non solo espongono dei servizi all’utilizzatore finale ma sono anche auto-descrittivi: sono in grado cioè di offrire sia il servizio, che la descrizione delle sue caratteristiche, come i punti di accesso al servizio, i protocolli utilizzati, le operazioni disponibili e l’elenco dei relativi 17 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica parametri, la tipologia di incapsulamento utilizzato, ecc. Tutto questo è gestito tramite file WSDL, che vedremo tra poco. Questa caratteristica dei web service è estremamente utile se si considera che possono essere richiamati senza conoscerne l’effettiva architettura interna. Inoltre, utilizzando l'UDDI3 (Universal Description, Discovery and Integration), un servizio di directory disponibile sul Web dove gli interessati possono registrare e cercare servizi web (Service Directory), sarà possibile cercare il servizio richiesto tra altri messi a disposizione dal singolo “registro”. Inizialmente si pensava di gestire tutti i descrittori di servizi istituendo una sola istituzione pubblica, l’Universal Business Registry. Il progetto si è arenato e attualmente i servizi UDDI sono relegati ad un ambiente Intranet come repository aziendale centralizzato dei WSDL, fornendo il vantaggio al client di una maggior indipendenza dall’indirizzo del server. Normalmente comunque il file WSDL è ospitato (e reso naturalmente disponibile online) nel server che ospita i web service. In Figura 2.1 vediamo uno schema di definizione dei web service secondo l’architettura SOA. In particolare possiamo notare come i servizi vengano esposti da un Provider, che ne mette a disposizione dell’UDDI la relativa descrizione. Il Requestor può recuperare la descrizione del servizio cercato tramite l’UDDI stesso, e potrà successivamente connettersi al Provider e ottenere le informazioni da esso, senza conoscere preventivamente l’architettura alla base del Provider, né l’implementazione dei servizi esposti. Figura 2.1 - Descrizione web service nella SOA. La forte aspettativa di interoperabilità propria dei web service viene garantita mediante l’uso di strategie quanto più possibili standard. La descrizione stessa dei servizi esposti viene gestita tramite un linguaggio basato su XML (eXtensible Markup Language): WSDL (Web Services Description Language). Questo linguaggio offre la possibilità di creare un’interfaccia alla quale i richiedenti si collegano per scoprire informazioni preziose del web service cercato. Il file di tipo WSDL può essere ospitato dall’UDDI, ed è composto da: - una parte astratta: descrive i messaggi che possono essere scambiati – e la loro composizione per la gestione di operazioni; - una parte concreta: per l’indirizzamento, mediante URI (URL o URN), e la modalità di trasporto. 3 UDDI: http://uddi.xml.org 18 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica Di seguito vediamo un estratto di file WSDL, relativo al servizio che gestisce la logica di gioco, nominato WSGame: <?XML VERSION="1.0" ENCODING="UTF-8"?> <WSDL:DEFINITIONS XMLNS:WSDL="HTTP://SCHEMAS.XMLSOAP.ORG/WSDL/" XMLNS:NS1="HTTP://ORG.APACHE.AXIS2/XSD" XMLNS:NS="HTTP://GAME" XMLNS:WSAW="HTTP://WWW.W3.ORG/2006/05/ADDRESSING/WSDL" XMLNS:HTTP="HTTP://SCHEMAS.XMLSOAP.ORG/WSDL/HTTP/" XMLNS:XS="HTTP://WWW.W3.ORG/2001/XMLSCHEMA" XMLNS:MIME="HTTP://SCHEMAS.XMLSOAP.ORG/WSDL/MIME/" XMLNS:SOAP="HTTP://SCHEMAS.XMLSOAP.ORG/WSDL/SOAP/" TARGETNAMESPACE="HTTP://GAME"> <WSDL:DOCUMENTATION> WS GAME – SERVIZIO LOGICA DI GIOCO – VER. 1.0 </WSDL:DOCUMENTATION> <WSDL:TYPES> <XS:SCHEMA ATTRIBUTEFORMDEFAULT="QUALIFIED" ELEMENTFORMDEFAULT="QUALIFIED" TARGETNAMESPACE="HTTP://GAME"> ... OMISSIS ... <XS:ELEMENT NAME="LISTAPOSIZIONIINIZIALI"> <XS:COMPLEXTYPE> <XS:SEQUENCE> <XS:ELEMENT MINOCCURS="0" NAME="IDTOKEN" NILLABLE="TRUE" TYPE="XS:STRING"/> <XS:ELEMENT MINOCCURS="0" NAME="USERNAME" NILLABLE="TRUE" TYPE="XS:STRING"/> <XS:ELEMENT MINOCCURS="0" NAME="NOMEPARTITA" NILLABLE="TRUE" TYPE="XS:STRING"/> </XS:SEQUENCE> </XS:COMPLEXTYPE> </XS:ELEMENT> <XS:ELEMENT NAME="LISTAPOSIZIONIINIZIALIRESPONSE"> <XS:COMPLEXTYPE> <XS:SEQUENCE> <XS:ELEMENT MINOCCURS="0" NAME="RETURN" NILLABLE="TRUE" TYPE="XS:STRING"/> </XS:SEQUENCE> </XS:COMPLEXTYPE> </XS:ELEMENT> ... OMISSIS ... <WSDL:MESSAGE NAME="LISTAPOSIZIONIINIZIALIREQUEST"> <WSDL:PART NAME="PARAMETERS" ELEMENT="NS:LISTAPOSIZIONIINIZIALI"/> </WSDL:MESSAGE> <WSDL:MESSAGE NAME="LISTAPOSIZIONIINIZIALIRESPONSE"> <WSDL:PART NAME="PARAMETERS" ELEMENT="NS:LISTAPOSIZIONIINIZIALIRESPONSE"/> </WSDL:MESSAGE> <WSDL:PORTTYPE NAME="WSGAMEPORTTYPE"> ... OMISSIS ... <WSDL:OPERATION NAME="LISTAPOSIZIONIINIZIALI"> <WSDL:INPUT MESSAGE="NS:LISTAPOSIZIONIINIZIALIREQUEST" WSAW:ACTION="URN:LISTAPOSIZIONIINIZIALI"/> <WSDL:OUTPUT MESSAGE="NS:LISTAPOSIZIONIINIZIALIRESPONSE" WSAW:ACTION="URN:LISTAPOSIZIONIINIZIALIRESPONSE"/> </WSDL:OPERATION> </WSDL:PORTTYPE> ... OMISSIS ... <WSDL:BINDING NAME="WSGAMESOAP11BINDING" TYPE="NS:WSGAMEPORTTYPE"> <SOAP:BINDING TRANSPORT="HTTP://SCHEMAS.XMLSOAP.ORG/SOAP/HTTP" STYLE="DOCUMENT"/> ... OMISSIS ... <WSDL:SERVICE NAME="WSGAME"> <WSDL:PORT NAME="WSGAMEHTTPSOAP11ENDPOINT" BINDING="NS:WSGAMESOAP11BINDING"> <SOAP:ADDRESS LOCATION="HTTP://LOCALHOST:8080/WSGAME/SERVICES/WSGAME.WSGAMEHTTPSOAP11ENDPOINT/"/> 19 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica </WSDL:PORT> </WSDL:SERVICE> </WSDL:DEFINITIONS> In questo estratto possiamo riconoscere le informazioni relative ad uno delle possibili operazioni richiamabili (listaPosizioniIniziali), ai parametri da inviare e ai relativi valori di ritorno, ai metodi di incapsulamento dei tipi (binding SOAP) al suo indirizzo URL, ecc. Dopo aver chiamato il servizio, la trasmissione delle comunicazioni tra client e server avviene attraverso il protocollo HTTP, tramite l’invio di messaggi incapsulati attraverso protocolli standard. Nel nostro caso è stato scelto l’invio di pacchetti SOAP (Simple Object Access Protocol). SOAP può operare su differenti protocolli di rete, ma HTTP è il più comunemente utilizzato e l'unico ad essere stato standardizzato dal W3C. SOAP si basa sul metalinguaggio XML e la sua struttura segue la configurazione Head-Body, analogamente ad HTML. Il segmento obbligatorio Body trasporta il contenuto informativo e talora viene detto carico utile, o payload. Questo deve seguire uno schema definito dal linguaggio XML Schema. Il segmento opzionale Header contiene meta-informazioni come quelle che riguardano il routing, la sicurezza, le transazioni e parametri per l'orchestration. Vediamo un esempio di pacchetto SOAP realmente inviato al servizio di gestione della logica di gioco, WSGame: <V:ENVELOPE XMLNS:I="HTTP://WWW.W3.ORG/2001/XMLSCHEMA-INSTANCE" XMLNS:D="HTTP://WWW.W3.ORG/2001/XMLSCHEMA" XMLNS:C="HTTP://SCHEMAS.XMLSOAP.ORG/SOAP/ENCODING/" XMLNS:V="HTTP://SCHEMAS.XMLSOAP.ORG/SOAP/ENVELOPE/"> <V:HEADER /> <V:BODY> <N0: LISTAPOSIZIONIINIZIALI XMLNS:N0="HTTP://GAME"> <IDTOKEN>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</IDTOKEN> <USERNAME>LUCASEME</USERNAME> <NOMEPARTITA>LUCASEME-PIPPO-XXXXX</NOMEPARTITA> </N0: LISTAPOSIZIONIINIZIALI> </V:BODY> </V:ENVELOPE> 20 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica In Figura 2.2 possiamo vedere la struttura del pacchetto SOAP, mentre in Figura 2.3 possiamo vedere il riassunto dell’architettura SOA applicata ai web service, con i relativi protocolli coinvolti e appena descritti. Figura 2.2 - Struttura pacchetto SOAP. Figura 2.3 - Web service e protocolli coinvolti. L’utilizzo di SOAP come standard per i messaggi permette di raggiungere il livello massimo di interoperabilità. Web service definiti con un linguaggio di programmazione possono comunicare con client definiti non solo con un altro linguaggio, ma potenzialmente residenti in architetture completamente differenti dal server. Inoltre, la garanzia di utilizzo di uno standard non dà spazio a errori di interpretazione dei dati, sia per la conversione dei tipi, sia per logica di invio. In Figura 2.4 è possibile vedere come i messaggi vengano incapsulati e trasportati via rete attraverso lo scambio di messaggi SOAP. Il Requestor e il Provider ignorano le reciproche implementazioni, ma raggiungono un efficace livello di comunicazione grazie all’uso di questo standard. Figura 2.4 - Incapsulamento e trasmissione con SOAP. 21 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica 2.2 APACHE AXIS 2 E TOMCAT Nelle intenzioni di IBM, che per prima propose nel 2000 il modello WSDL come linguaggio di interfaccia per la descrizione dei web service, c’era la volontà di utilizzare un sistema basato su XML che fosse rapidamente diffuso e accettato da tutti. Il W3C lo inserì successivamente tra gli standard di riferimento, ma quello che in teoria doveva essere un documento creato in un formato leggibile e facilmente modificabile dall’uomo, divenne nella pratica piuttosto verboso e complesso, tanto che attualmente la prassi consigliata è di approcciare alla generazione di questo file attraverso l’uso di tool specificamente costruiti. Uno di questi tool è Axis 2, distribuito da Apache Software Foundation, erede del progetto Apache Axis SOAP. Axis 2 è un tool completo di creazione, gestione e utilizzo di web service. Si utilizza via riga di comando e permette di generare un web service partendo dalla definizione (classe o interfaccia) delle operazioni da esporre. Recentemente Axis 2 è stato integrato come plugin dell’IDE di sviluppo Eclipse, rendendo più sicura e facile la gestione delle varie operazioni. Nonostante l’implementazione di Axis 2 fornisca librerie anche per il linguaggio C, la scelta fatta è stata quella di rimanere in un ambiente consono al linguaggio utilizzato nelle precedenti esperienze di stage, ponendo così le basi per un eventuale riutilizzo del codice già prodotto. La scelta è ricaduta quindi su Axis2/Java, utilizzato all’interno di Eclipse come plugin. Il prodotto finale del lavoro del tool è composto da una Web Application che ospita i web service all’interno di un servlet container. Quest’ultimo è appunto Apache Tomcat, scelta pressoché obbligata dal contesto, e altamente consigliata da Apache Software Foundation stessa. 2.3 JAVA Java è un linguaggio di programmazione orientato agli oggetti, creato da Sun Microsystems nel 1995. Attualmente il linguaggio è mantenuto e gestito da Oracle. La sintassi è simile al C++, ma con una filosofia completamente orientata agli oggetti. La sua ampia diffusione è dovuta ad una relativa semplicità d’uso, grazie a scelte progettuali atte a facilitare il lavoro del programmatore, e ad una politica di creazione di una ampia libreria di funzioni che permettano di scrivere programmi trasferibili in grado di scavalcare i sistemi operativi proprietari. La scelta di Java come linguaggio è stata condizionata dal codice finora prodotto per il progetto di ingegnerizzazione del gioco Geister nelle precedenti esperienze di stage fatte da altri studenti. In un’ottica di riuso del codice, è stato naturale proseguire il percorso indicato. La scelta è stata poi confermata in sedi di analisi dell’architettura, avendo trovato validi strumenti di contorno, tutti operanti in ambiente affine al linguaggio Java e agli eseguibile con esso generati. 22 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica 2.4 MYSQL MySQL è un RDBMS (Relational Data Base Management System) ovvero un Sistema per la Gestione di Basi Dati Relazionali. Come recita la home page del sito web ufficiale4 :“Il database MySQL® è diventato il database open source più conosciuto al mondo grazie a prestazioni veloci, elevata affidabilità e facilità d'uso”. Al di là di facili auto-sponsorizzazioni, la facile reperibilità di questo database, in abbinata con le ottime performance di lavoro, e la possibilità di gestire praticamente qualsiasi tipo di realizzazione di base di dati, ne hanno fatto uno strumento eccezionale per la raccolta di dati in database. Inoltre, MySQL, presentato con questo nome dal 1996, è stato rilevato da Sun Microsystem nel 2008, ed è ora mantenuto e gestito da Oracle. Come è facile intuire, è perfettamente integrato in tutti i pacchetti sviluppati prima da Sun e poi da Oracle, e questo l’ha reso lo strumento perfetto per lo sviluppo di lavori che coinvolgano Java. Inoltre, grazie alla stretta collaborazione con strumenti per lo sviluppo di applicazioni web, MySQL è la scelta migliore per la raccolta dei dati del progetto. L’interfacciamento con il database sarà reso possibile grazie ai Driver messi a disposizione da MySQL per Java (mysql-connector-java-5.1.7). In particolare la connessione avviene tramite l’utilizzo della libreria JDBC (Java DataBase Connectivity), una API che consente ad un qualsiasi programma scritto in java di accedere ad un qualsiasi DBMS (JDBC è simile a ODBC, JDBC è specifico per i programmi scritti in java mentre ODBC si può usare indipendentemente dal linguaggio utilizzato). 2.5 ECLIPSE Eclipse è un ambiente di sviluppo integrato multi-linguaggio e multipiattaforma. Eclipse può essere utilizzato per la produzione di software di vario genere, si passa infatti da un completo IDE per il linguaggio Java (JDT, "Java Development Tools") a un ambiente di sviluppo per il linguaggio C++ (CDT, "C/C++ Development Tools") e a plug-in che permettono di gestire XML, Javascript, PHP e persino di progettare graficamente una GUI per un'applicazione JAVA (Eclipse VE, "Visual Editor"), rendendo di fatto Eclipse un ambiente RAD (Rapid application development). Il programma è scritto in linguaggio Java, ma anziché basare la sua GUI su Swing, il toolkit grafico di Sun Microsystems, si appoggia a SWT, librerie di nuova concezione che conferiscono ad Eclipse un'elevata reattività. La piattaforma di sviluppo è incentrata sull'uso di plug-in, delle componenti software ideate per uno specifico scopo, per esempio la generazione di diagrammi UML, ed in effetti tutta la piattaforma è un insieme di plug-in, versione base compresa, e chiunque può sviluppare e modificare i vari plug-in. Nella versione base è possibile programmare in Java, usufruendo di comode funzioni di aiuto quali: completamento automatico (“Code completion”), suggerimento dei tipi di parametri dei metodi, possibilità di accesso diretto a CVS e riscrittura automatica del codice (funzionalità questa detta di Refactoring) in caso di cambiamenti nelle classi. Ad Eclipse è stato installato successivamente il plugin Axis 2 – Code Generator, sviluppato appositamente per aiutare nella generazione del file WSDL a partire da una classe scritta in JAVA. 4 www.mysql.com 23 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica 2.6 ANDROID Per quanto riguarda il client, la scelta è stata presa in fase preliminare con la richiesta di sviluppo su ambiente Android. Android è un sistema operativo per dispositivi mobili costituito da uno stack software che include un sistema operativo di base, i middleware per le comunicazioni e le applicazioni di base. Ha avuto successo perché alcune versioni sono state open source e perché è basato su kernel Linux. La piattaforma usa il database SQLite, la libreria dedicata SGL per la grafica bidimensionale e supporta lo standard OpenGL ES 2.0 per la grafica tridimensionale. Le applicazioni vengono eseguite tramite la Dalvik virtual machine, una macchina virtuale adattata per l'uso su dispositivi mobili. È ottimizzata per sfruttare la poca memoria presente nei dispositivi mobili, consente di far girare diverse istanze della macchina virtuale contemporaneamente e nasconde al sistema operativo sottostante la gestione della memoria e dei thread. Dalvik è spesso associato alla Macchina virtuale Java, perché le librerie utilizzate sono richiamabili in linguaggio Java, ma il bytecode con cui lavora non è Java. Altre differenze con la JVM tradizionale sono la diversa gestione delle eccezioni. Dalvik non esegue, come la Java Virtual Machine, byte code standard, ma il linguaggio DEX (Dalvik EXecutable). Eclipse integra completamente i tool di sviluppo per Android. Con l’Android SDK ed Eclipse sembrerà di utilizzare la regolare Java Virtual Machine perché l’ambiente di sviluppo provvede alla generazione del codice DEX, ri-compilando il byte code che a sua volta è frutto di una compilazione Java. Figura 2.5 - Architettura Android. 24 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica 2.7 KSOAP2 PER ANDROID A causa delle differenze strutturali tra Java Virtual Machine e Dalvik, non è possibile utilizzare il codice generato da Axis 2 per le chiamate ai web service dal client Android. In particolare, le classi generate da Axis 2, e utilizzabili perfettamente in ambiente Java (infatti saranno comunque usate per le chiamate interne tra web service e per i test effettuati a lato server), utilizzano classi di gestione delle interruzioni non incluse in Android SDK e non utilizzabili in alcun modo. Per questo motivo si è dovuto cercare una libreria opportuna per l’interfacciamento di Android con i web service esposti. Nonostante il disguido, questa scelta si è rivelata utile per esprimere le potenzialità di interoperabilità dell’architettura scelta, che si è adattata perfettamente alle esigenze iniziali. La scelta della libreria è ricaduta su KSOAP 2, un progetto open - source, esterno alle librerie standard di Android, che comunque non offre alcuna soluzione nativa. KSOAP2 deriva dal progetto originale KSOAP, una libreria SOAP per client web service utile per prodotti Java come Applet o applicazioni J2ME (CLDC / CDC / MIDP). KSOAP 2 è stato completamente riscritto sulla base degli errori trovati su KSOAP 1.x, e adattato per l’uso di in dispositivi moderni, compreso Android. 2.8 TORTOISE SVN Tortoise SVN è un client per Subversion, implementato come estensione della shell di Microsoft Windows. Si tratta di un software gratuito rilasciato sotto la GNU (General Public License). Subversion è un sistema di controllo del versionamento dei file, nato nel 2000 grazie a CollabNet Inc. ed utilizzato per mantenere versioni correnti e storiche di file come codici sorgenti, pagine web e documentazione. Subversion può essere utilizzato in un file server proprietario o ospitato in un servizio gratuito di project hosting, come ProjectLocker5, utilizzato in questo progetto. 5 www.projectlocker.com 25 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica 26 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica Capitolo 3. ANALISI DEI REQUISITI Dopo una prima fase di studio del progetto e del dominio attuale, sono stati individuati diversi requisiti. I requisiti sono stati suddivisi in varie classi a seconda della piattaforma di appartenenza (client, server o entrambi) e della priorità dei requisiti stessi. Sono stati individuati pertanto le seguenti categorie di requisiti: Obbligatori: requisiti che sono fondamentali per il successo del progetto. Comprendono le richieste esplicite del committente e tutti i requisiti impliciti che emergono dall'analisi e che sono necessari al soddisfacimento delle attese del cliente. Vengono indicati con le iniziali “Ob”. Desiderabili: requisiti richiesti dal committente che non compromettono le funzionalità del programma in caso di loro assenza. Ogni requisito desiderabile aggiunge valore al prodotto. Vengono indicati con le iniziali “De”. Opzionali: requisiti relativamente utili, richiesti o emersi durante l’analisi, aggiungono nuove caratteristiche al prodotto, anche se non sono necessari. Dettano una linea per sviluppi futuri, ma sono totalmente contrattabili. Vengono indicati con le iniziali “Op”. Ogni requisito viene identificato dalle iniziali della classe e da un numero intero progressivo. La coppia “iniziale – numero” rende univoco il requisito. Accanto alla descrizione del requisito viene esplicitato per chiarezza il dominio della piattaforma di appartenenza (client, server, client/server per entrambi) 3.1 LISTA DEI REQUISITI Vediamo ora la lista dei requisiti individuati: 3.1.1 OBBLIGATORI Ob01Ob02Ob03Ob04Ob05Ob06Ob07Ob08Ob09Ob10Ob11- Studio dei servizi da esporre come web service (server); Creazione di un client sviluppato per ambiente Android (client); Raccolta dati relativi ad utenti, partite e log in database (server); Gestione della logica di gioco nel server e risposta alle richieste di mossa del client (client/server); Visualizzare schermata di presentazione all’avvio della partita (client); Possibilità di login o creazione nuovo utente (client/server); Possibilità di sfidare gli amici (client); Mascheramento dei fantasmi avversari durante il match (client); Visualizzazione delle mosse permesse per il fantasma scelto (client); Visualizzazione dei fantasmi mangiati e relativo tipo (client); Presenza del manuale per spiegare il funzionamento del gioco (client); 27 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica 3.1.2 DESIDERABILI De01- Presenza di una breve sezione di credits con storia e sviluppi del gioco (client); De02- Possibilità di scelta dell’avversario tra umano e IA (client); De03- Possibilità di sfidare qualsiasi utente connesso (client); De04- Presenza di una pagina profilo con amici e statistiche (client); 3.1.3 OPZIONALI Op01- Possibilità di richiedere pareggio all’avversario (client); Op02- Possibilità di accettare o rifiutare sfida (client); Op03- Gestione di opportuni time-out per la chiusura della mossa o della partita (client/server); Op04- Suggerimenti di gioco per utente umano da IA (client/server); Op05- Visualizzazione di un indicatore di attesa mossa dell’avversario (client); Op06- Visualizzazione del countdown del timer per la mossa (client); Op07- Visualizzazione a fine partita di una schermata riassuntiva dei risultati (client); Op08- Studio di una strategia di incentivo al gioco (client/server); Op09- Creazione di un client con linguaggio a scelta, ma diverso da Android (client); 28 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica 3.2 DIAGRAMMI USE-CASE Di seguito sono esposti i principali diagrammi use-case per una miglior comprensione delle dinamiche intercorse tra il client e il server. Nei diagrammi sono presenti le seguenti tipologie di attori: - Utente generico: utente che accede al software client Geister ma non effettua la login, e quindi non è identificato dal sistema; Utente registrato: utente che accede al software client Geister ed effettua con successo la login; Server: entità astratta che identifica in maniera logica il Server che gestisce lo logica di gioco, la raccolta e distribuzione dei dati anagrafici e delle partite. 3.2.1 USE-CASE A: ACCESSO 3.2.2 USE-CASE A.1: REGISTRAZIONE Attori coinvolti: - Utente generico - Server Descrizione: Illustra la registrazione di un nuovo utente per poter accesso al sistema di gioco. Pre-condizioni: L’utente generico ha installato e avviato Geister su dispositivo Android. Flusso base di eventi: - L’utente generico inserisce i propri dati personali per la registrazione al sistema; - Il client fa un primo controllo sintattico dei dati inseriti per controllare se ve ne sono di mancanti e/o non corretti. 29 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica - Il server controlla se i dati sono corretti (ed univoci per e-mail e username), quindi li salva nel database. Flusso alternativo di eventi: - Il client trova errori sintattici o dati obbligatori mancanti, e manda un avviso di errore. - Il server restituisce un messaggio d’errore se i dati inseriti non sono accettabili, o se è intercorso un problema di connessione; - Dopo la visualizzazione del messaggio di errore, il client dà la possibilità di correggere gli errori e ritentare il salvataggio. Post-condizioni: L’utente generico è registrato e può accedere al sistema. 3.2.3 USE-CASE A.2: LOGIN Attori coinvolti: - Utente generico - Server Descrizione: Illustra l’accesso al proprio account personale tramite identificazione con username e password. Pre-condizioni: L’utente generico ha installato e avviato Geister su dispositivo Android. L’utente è in possesso di una login (coppia username + password) valida. Flusso base di eventi: - L’utente generico inserisce i propri username e password per l’accesso al sistema; - Il server controlla se i dati sono corretti, quindi restituisce la validazione del processo di login, fornendo un gettone (token) univoco per l’accesso al profilo dell’utente e alle altre funzioni del gioco. Flusso alternativo di eventi: - Il server restituisce un messaggio d’errore se i dati inseriti non trovano riscontro nel database degli utenti , o se è intercorso un problema di connessione; - Dopo la visualizzazione del messaggio di errore, il client dà la possibilità di correggere gli errori e ritentare la login. Post-condizioni: L’utente generico accede al proprio profilo e quindi alle altre funzioni del sistema. 30 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica 3.2.4 USE-CASE A.3: CREDITS Attori coinvolti: - Utente generico Descrizione: Illustra l’accesso alla sezione Credits del client. Pre-condizioni: L’utente generico ha installato e avviato Geister su dispositivo Android. Flusso base di eventi: L’utente generico clicca sul bottone “Credits” e accede alla sezione; Flusso alternativo di eventi: Non previsto. Post-condizioni: L’utente generico accede alla sezione Credits. 3.2.5 USE-CASE A.4: MANUALE Attori coinvolti: - Utente generico Descrizione: Illustra l’accesso alla sezione Manuale del client. Pre-condizioni: L’utente generico ha installato e avviato Geister su dispositivo Android. Flusso base di eventi: L’utente generico clicca sul bottone “Manuale” e accede alla sezione dove troverà un manuale d’uso del client step-by-step; Flusso alternativo di eventi: Non previsto. Post-condizioni: L’utente generico accede alla sezione Manuale. 31 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica 3.2.6 USE-CASE B: PROFILO 3.2.7 USE-CASE B.1: GESTIONE ANAGRAFICA Attori coinvolti: - Utente registrato - Server Descrizione: Illustra l’ingresso da parte dell’utente registrato nella sezione di gestione dei dati anagrafici . Pre-condizioni: L’utente registrato ha effettuato correttamente la login ed è entrato nel proprio profilo. Flusso base di eventi: - L’utente registrato visualizza i propri dati anagrafici, inseriti in fase di registrazione; - L’utente può modificare alcuni dati che lo riguardano. - L’utente salva le modifiche. - Il Client esegue un primo controllo di correttezza dei dati inseriti. - Il server controlla se i dati sono corretti, quindi li salva nel database. Flusso alternativo di eventi: - Il client trova errori sintattici, e manda un avviso di errore. - Il server restituisce un messaggio d’errore se i dati inseriti non sono accettabili, o se è intercorso un problema di connessione; - Dopo la visualizzazione del messaggio di errore, il client dà la possibilità di correggere gli errori e ritentare il salvataggio. Post-condizioni: L’utente registrato ha visualizzato e/o modificato correttamente i propri dati anagrafici. 32 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica 3.2.8 USE-CASE B.2: POLLING SFIDATO Attori coinvolti: - Utente registrato - Server Descrizione: Illustra il controllo dello stato di sfidato da parte dell’utente registrato, con chiamate temporizzate al server. Pre-condizioni: L’utente registrato ha effettuato correttamente la login ed è entrato nel proprio profilo. Flusso base di eventi: L’utente registrato, tramite il client di gioco, interroga il server a intervalli di tempo regolari per sapere se qualcuno richiede di sfidarlo; Flusso alternativo di eventi: Il processo di richiesta viene interrotto per chiusura del client o per fine dei termini temporali di controllo. Post-condizioni: L’utente sa se è stato sfidato da qualcuno o no. 3.2.9 USE-CASE B.3: GESTIONE AMICI Attori coinvolti: - Utente registrato Descrizione: Illustra la gestione dell’elenco degli amici dell’utente registrato, con possibilità di inserimento, ricerca e cancellazione. Pre-condizioni: L’utente registrato ha effettuato correttamente la login ed è entrato nel proprio profilo. Flusso base di eventi: L’utente registrato può gestire le relazioni di amicizia con altri utenti registrati. Flusso alternativo di eventi: Non previsto. Post-condizioni: L’utente registrato ha gestito le relazioni di amicizia con altri utenti registrati. 33 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica 3.2.10 USE-CASE B.4: LANCIA SFIDA Attori coinvolti: - Utente registrato Descrizione: Illustra il lancio di una sfida da parte dell’utente. Pre-condizioni: - L’utente registrato ha effettuato correttamente la login ed è entrato nel proprio profilo; - L’utente ha selezionato un utente amico da sfidare. Flusso base di eventi: - L’utente sfida l’amico; - L’utente entra nella schermata di gioco. Flusso alternativo di eventi: - L’utente amico non è online e la richiesta di sfida viene annullata. Post-condizioni: L’utente registrato è nella schermata di gioco e può giocare con l’avversario. 34 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica 3.2.11 USE-CASE C: GESTIONE AMICI 3.2.12 USE-CASE C.1: VISUALIZZA AMICI Attori coinvolti: - Utente registrato - Server Descrizione: Illustra il processo di visualizzazione da parte dell’utente, della sua lista di amici. Pre-condizioni: - L’utente registrato ha effettuato correttamente la login ed è entrato nel proprio profilo; - L’utente ha richiesto l’elenco degli amici. Flusso base di eventi: - L’utente registrato chiede l’elenco dei suoi amici al Server. - Il Server invia l’elenco richiesto. Flusso alternativo di eventi: Il Server non trova alcuna relazione di amicizia tra l’utente registrato e altri utenti, e invia una lista vuota. Post-condizioni: L’utente registrato visiona l’elenco dei suoi amici. 3.2.13 USE-CASE C.2: INSERISCI NUOVO AMICO Attori coinvolti: - Utente registrato - Server Descrizione: Illustra il processo di inserimento da parte dell’utente di un nuovo amico. Pre-condizioni: 35 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica - L’utente registrato ha effettuato correttamente la login ed è entrato nel proprio profilo. L’utente ha richiesto di inserire una nuova relazione di amicizia con un altro utente. L’utente richiesto esiste come utente già registrato. Flusso base di eventi: - L’utente registrato chiede l’inserimento del nuovo amico; - Il Server controlla l’esistenza dell’amico; - Il Server controlla che non esistano eventuali relazioni di amicizia tra i due utenti; - Il Server registra la nuova relazione di amicizia e comunica l’avvenuto inserimento. Flusso alternativo di eventi: - Il Server non trova nessun utente con le informazioni fornite dall’utente. - Il Server trova una precedente relazione tra i due utenti. Post-condizioni: L’utente registrato ha una nuova relazione di amicizia con un altro utente. 36 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica 3.2.14 USE-CASE C.3: ELIMINA AMICO Attori coinvolti: - Utente registrato - Server Descrizione: Illustra il processo di eliminazione da parte dell’utente registrato di una relazione di amicizia con un altro utente. Pre-condizioni: - L’utente registrato ha effettuato correttamente la login ed è entrato nel proprio profilo. - L’utente registrato ha richiesto di eliminare una relazione di amicizia con un altro utente. - L’utente richiesto esiste come utente già registrato. Flusso base di eventi: - L’utente registrato chiede l’eliminazione dell’utente dalla lista degli amici; - Il Server controlla l’esistenza dell’amico; - Il Server controlla l’esistenza della relazione di amicizia tra i due utenti; - Il Server elimina la relazione di amicizia e comunica il risultato positivo dell’operazione. Flusso alternativo di eventi: - Il Server non trova nessun utente con le informazioni fornite dall’utente. - Il Server non trova una precedente relazione tra i due utenti. Post-condizioni: L’utente registrato eliminato la relazione di amicizia con un altro utente. 37 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica 3.2.15 USE-CASE D: LANCIA SFIDA 3.2.16 USE-CASE D.1: SFIDA UTENTE REGISTRATO Attori coinvolti: - Utente registrato Descrizione: Illustra il processo di sfida ad un altro utente registrato. Pre-condizioni: - L’utente registrato ha effettuato correttamente la login ed è entrato nel proprio profilo. - L’utente registrato ha deciso di sfidare un altro utente registrato. Flusso base di eventi: - L’utente registrato chiede la creazione della sfida con un altro utente registrato, opportunamente scelto; Flusso alternativo di eventi: Non previsto. Post-condizioni: L’utente registrato ha generato una richiesta di sfida con un altro utente registrato. 3.2.17 USE-CASE D.2: SFIDA INTELLIGENZA ARTIFICIALE Attori coinvolti: - Utente registrato Descrizione: Illustra il processo di sfida all’Intelligenza Artificiale, sia essa espressione di un profilo di un utente registrato, o di un profilo astratto. Pre-condizioni: - L’utente registrato ha effettuato correttamente la login ed è entrato nel proprio profilo. - L’utente registrato ha deciso di sfidare l’Intelligenza Artificiale. 38 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica Flusso base di eventi: - L’utente registrato chiede la creazione della sfida con l’Intelligenza Artificiale, espressione di un profilo di un utente registrato, o di un profilo astratto; Flusso alternativo di eventi: Non previsto. Post-condizioni: L’utente registrato ha generato una richiesta di sfida con l’Intelligenza Artificiale. 39 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica 3.2.18 USE-CASE E: GESTIONE SFIDA A UTENTE REGISTRATO 3.2.19 USE-CASE E.1: CREA SFIDA Attori coinvolti: - Utente registrato 1: da considerare come l’utente che lancia la sfida, o utente sfidante. - Server Descrizione: Illustra il processo di creazione della sfida, con invio di partecipanti e dati ausiliari al Server e quindi al database. Pre-condizioni: - L’utente registrato ha effettuato correttamente la login ed è entrato nel proprio profilo. - L’utente registrato ha scelto chi sfidare e invia la richiesta di nuova sfida al Server. Flusso base di eventi: - L’utente sfidante chiede la creazione della sfida al Server; - Il Server verifica che non esista già una sfida ancora attiva tra i due giocatori; - Il Server salva i dati iniziali di sfida nel database e crea la sfida; - L’utente sfidante ottiene la conferma di creazione della sfida e attende risposta dall’utente sfidato. Flusso alternativo di eventi: 40 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica Il Server trova una precedente partita attiva tra i due sfidanti (anche con ruoli sfidante/sfidato invertiti) e annulla la creazione della sfida inviata. Post-condizioni: La partita tra i due giocatori è creata. L’utente sfidante rimane in attesa di risposta dall’utente sfidato, che a sua volta ora è in grado di vedere la sfida generata e decidere se accettare o meno. 3.2.20 USE-CASE E.2: ACCETTA SFIDA Attori coinvolti: - Utente registrato 2: da considerare come l’utente che risponde alla richiesta di sfida, o utente sfidato. - Server Descrizione: Illustra il processo di risposta ad una richiesta di sfida inviata dall’utente registrato sfidante. Pre-condizioni: - L’utente registrato ha effettuato correttamente la login ed è entrato nel proprio profilo. - L’utente registrato periodicamente richiede al Server se è stato sfidato da qualcuno (richiede 3.2.8 Use-case B.2: POLLING SFIDATO). Flusso base di eventi: - L’utente sfidato, dopo aver chiesto al Server se è in stato di sfida, decide se accettare o meno la sfida creata; - L’utente sfidato accetta la sfida e invia la propria decisione al Server; - Il Server cambia stato alla sfida, in modo che l’utente sfidante possa accorgersi della conferma di sfida da parte dell’utente sfidato. Flusso alternativo di eventi: - L’utente sfidato rifiuta la sfida e lo comunica al Server. - Il Server cambia stato alla sfida, in modo che l’utente sfidante possa accorgersi della rinuncia di sfida da parte dell’utente sfidato. - La sfida viene annullata. Post-condizioni: La partita tra i due giocatori è confermata. Entrambi i giocatori posso passare alla fase di inserimento delle pedine sulla scacchiera. 3.2.21 USE-CASE E.3: INSERISCI POSIZIONI INIZIALI Attori coinvolti: - Utente registrato 1 o 2. - Server Descrizione: Illustra il processo di inserimento delle pedine nelle posizioni iniziali. 41 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica Pre-condizioni: - L’utente registrato ha avuto conferma di sfida e può disporre le pedine sulla scacchiera. Flusso base di eventi: - L’utente registrato dispone le pedine sulla scacchiera secondo le sue preferenze; - Finita la fase di inserimento di tutte le pedine, conferma il posizionamento e chiede di salvare le pedine al Server; - Il Server controlla il posizionamento corretto delle pedine e salva la disposizione. Flusso alternativo di eventi: - Il Server valuta scorretto il posizionamento delle pedine e respinge la richiesta di salvataggio. - L’utente registrato può disporre nuovamente le pedine. Post-condizioni: L’utente registrato ha inserito correttamente le pedine nelle loro posizioni iniziali. 3.2.22 USE-CASE E.4: VISUALIZZA POSIZIONI AVVERSARIO Attori coinvolti: - Utente registrato 1 o 2. - Server Descrizione: Illustra il processo di visualizzazioni delle posizioni iniziali dell’avversario. Pre-condizioni: - L’utente registrato ha inserito correttamente le sue posizioni iniziali. - L’utente resta in attesa dell’inserimento delle posizioni avversarie. Flusso base di eventi: - L’utente registrato ottiene dal Server le posizioni delle pedine avversarie; - Le pedine vengono correttamente disposte sulla scacchiera; - Essendo le pedine proprie dell’avversario, viene offuscato il reale colore delle pedine; Flusso alternativo di eventi: - Il Server non ottiene in tempo utile le pedine dell’avversario (tempo limite di attesa superato) e marca la sfida come finita; - La sfida è annullata. Post-condizioni: L’utente registrato ha visualizzato correttamente le pedine dell’avversario e può ora iniziare la fase di gioco vero e proprio, con lo scambio di mosse tra utenti. 42 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica 3.2.23 USE-CASE E.5: INSERISCI MOSSE Attori coinvolti: - Utente registrato 1 o 2. - Server Descrizione: Illustra il processo di inserimento delle mosse dell’utente che ha il turno di gioco. Pre-condizioni: - L’utente registrato ha posizionato le pedine sul tavolo; - L’utente registrato ha visualizzato le pedine dell’avversario; - L’utente registrato detiene il turno di gioco; Flusso base di eventi: - L’utente registrato decide quale mossa effettuare e la esegue; - Il Server controlla che la mossa sia accettabile rispetto alle posizioni attuali e salva la disposizione. Flusso alternativo di eventi: - Il Server valuta scorretto il posizionamento delle pedine e respinge la richiesta di salvataggio della mossa. - L’utente registrato può tentare nuovamente la mossa. Post-condizioni: L’utente registrato ha inserito correttamente una mossa e rimane in attesa di quella dell’utente avversario. La mossa avversaria dovrà essere disegnata (estensione 3.2.24 Use-case E.6: VISUALIZZA MOSSE AVVERSARIO)e gestita per scoprire se si è raggiunta la fina della sfida (estensione 3.2.25 Use-case E.7: CONTROLLO FINE SFIDA). 3.2.24 USE-CASE E.6: VISUALIZZA MOSSE AVVERSARIO Attori coinvolti: - Utente registrato 1 o 2. - Server Descrizione: Illustra il processo di visualizzazioni delle mosse dell’avversario. Pre-condizioni: - L’utente registrato ha inserito correttamente la sua mossa. - L’utente resta in attesa dell’inserimento della mossa avversaria. Flusso base di eventi: - L’utente registrato ottiene dal Server la mossa effettuata dall’avversario; - Viene aggiornata la scacchiera con il posizionamento della mossa avversaria e gestite le mangiate; - Essendo le pedine proprie dell’avversario, viene offuscato il reale colore delle pedine; Flusso alternativo di eventi: 43 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica - Il Server non ottiene in tempo utile le pedine dell’avversario (tempo limite di attesa superato) e marca la sfida come finita; La sfida è annullata. Post-condizioni: L’utente registrato ha visualizzato correttamente le mosse dell’avversario, non è stato interrotto da errori o comunicazioni di fine sfida, può inserire una nuova mossa se è il suo turno, altrimenti attende. 3.2.25 USE-CASE E.7: CONTROLLO FINE SFIDA Attori coinvolti: - Utente registrato 1 o 2. - Server Descrizione: Illustra il processo di controllo e comunicazione di fine sfida. Pre-condizioni: - L’utente registrato ha inserito correttamente la sua mossa o ha ricevuto correttamente la mossa avversaria. Flusso base di eventi: - L’utente registrato controlla lo stato della scacchiera per vedere se ci sono i presupposti per terminare la sfida; - Viene trovato un criterio di fine sfida e assegnato un vincitore; - L’utente registrato comunica al server il fine sfida; - Il Server cambia stato alla sfida e la conclude. Flusso alternativo di eventi: - Non viene trovato un criterio di fine sfida. La sfida prosegue normalmente senza cambio stato da parte del Server. Post-condizioni: L’utente registrato ha concluso correttamente la sfida, e può conoscere se ha vinto o perso. 44 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica 3.2.26 USE-CASE F: SFIDA INTELLIGENZA ARTIFICIALE 3.2.27 USE-CASE F.1: CREA SFIDA Vedi 3.2.19 Use-case E.1: CREA SFIDA 3.2.28 USE-CASE F.2: ACCETTA SFIDA IA Attori coinvolti: - Server Descrizione: Illustra il processo di accettazione automatica di una sfida che coinvolga l’Intelligenza Artificiale. Pre-condizioni: - L’utente registrato ha sfidato l’Intelligenza Artificiale. Flusso base di eventi: - Il Server accetta automaticamente la sfida lanciata dall’utente registrato. Flusso alternativo di eventi: Non previsto. Post-condizioni: L’utente registrato ottiene la conferma di sfida e può posizionare le sue pedine sulla scacchiera. 45 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica 3.2.29 USE-CASE F.3: CREA SFIDA Vedi 3.2.21 Use-case E.3: INSERISCI POSIZIONI INIZIALI 3.2.30 USE-CASE F.4: INSERISCI POSIZIONI IA Attori coinvolti: - Server Descrizione: Illustra il processo di inserimento delle posizioni iniziali dell’Intelligenza Artificiale. Pre-condizioni: - L’utente registrato ha inserito correttamente le sue pedine iniziali e attende che venga fatto lo stesso per l’Intelligenza Artificiale. Flusso base di eventi: - Il Server genera le posizioni iniziali per l’Intelligenza Artificiale. Flusso alternativo di eventi: Non previsto. Post-condizioni: Vengono generate le posizioni iniziali per l’Intelligenza Artificiale. 3.2.31 USE-CASE F.5: VISUALIZZA POSIZIONI AVVERSARIO Vedi 3.2.22 Use-case E.4: VISUALIZZA POSIZIONI AVVERSARIO 3.2.32 USE-CASE F.6: INSERISCI MOSSE Vedi 3.2.23 Use-case E.5: INSERISCI MOSSE 46 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica 3.2.33 USE-CASE F.7: INSERISCI MOSSE IA Attori coinvolti: - Server Descrizione: Illustra il processo di inserimento delle mosse dell’Intelligenza Artificiale. Pre-condizioni: - L’utente registrato ha inserito correttamente la sua mossa e attende che venga fatto lo stesso per l’Intelligenza Artificiale. Flusso base di eventi: - Il Server genera la mossa opportuna per l’Intelligenza Artificiale. Flusso alternativo di eventi: Non previsto. Post-condizioni: Vengono generate le mosse per l’Intelligenza Artificiale. 3.2.34 USE-CASE F.8: VISUALIZZA MOSSE AVVERSARIO Vedi 3.2.24 Use-case E.6: VISUALIZZA MOSSE AVVERSARIO 3.2.35 USE-CASE F.9: CONTROLLO FINE SFIDA Vedi 3.2.25 Use-case E.7: CONTROLLO FINE SFIDA 47 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica 48 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica Capitolo 4. PROGETTAZIONE La prima parte della fase di progettazione è dedicata al disegno ad alto livello delle strutture che compongono la piattaforma informatica. L’obiettivo principale è quello di soddisfare i requisiti introdotti in analisi, mantenendo il più alto grado di interoperabilità possibile, in virtù delle proprietà architetturali esposte nella scelta dei web service. Inoltre, in un’ottica di sviluppo e mantenimento futuro, si è privilegiata una struttura che aumentasse quanto più possibile la modularità dei componenti usati, a scapito di una soluzione immediata, ma meno flessibile. A livello architetturale, l’entità definita come “Server” nella fase di analisi, ha subito un radicale cambiamento, frammentandosi in tre sotto-unità, che mantengono intrinseche le caratteristiche di esposizione di web service, ma che si specializzano ognuno in opportuni scopi, diventando espressione di uno specifico flusso di eventi e chiamate. Le tre unità create, corrispondenti a tre web service, sono: - WSUtenti; WSGame; WSData; La descrizione delle singole unità verrà affrontata a breve. La scelta progettuale aumenta la complessità di sviluppo del singolo pacchetto e delle chiamate client relative alle diverse funzioni, ma rende la piattaforma di sviluppo estremamente flessibile. Lo studio della separazione dei servizi è stato fatto in visione di una separazione ed evoluzione dei vari componenti coinvolti nel progetto. La modularità della piattaforma permetterà alle singole unità di ottimizzare e gestire autonomamente il proprio sviluppo, integrandosi con le altre strutture solo nei punti di integrazione tipici di un sistema a moduli. Le peculiarità intrinseche di ogni servizio esposto potranno così essere gestite indipendentemente dalle scelte effettuate dagli altri servizi, siano queste dovute a cambiamenti hardware o software. Inoltre, la separazione dei servizi esposti permetterà di bilanciare con estrema accuratezza il carico di lavoro sulle macchine coinvolte, per far fronte al potenziale numero elevato di client che accederanno ai servizi. Vediamo ora lo schema generale della piattaforma di gioco, e passiamo alla descrizione dei singoli componenti e della loro implementazione. 49 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica Figura 4.1: Schema piattaforma generale. 50 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica In Figura 4.1 è illustrato lo schema generale di funzionamento della piattaforma concepita. Il Client Geister, su cui verrà installata l’interfaccia di gioco, comunica attraverso Internet con i web service esposti. A seconda dell’operazione richiesta, i servizi chiamati saranno diversi: se l’operazione riguarda l’anagrafica utente, le relazioni di amicizia, o la fase di login, il servizio che si prenderà cura di gestire le richieste del client sarà WSUtenti; se invece, si tratterà di assecondare tutti gli aspetti del gioco (inizio sfida, posizionamento iniziale, inserimento mosse, controllo dello stato della sfida, comunicazione turno, comunicazione fine sfida, ecc.) allora ad essere chiamato sarà il servizio WSGame. Sarà comunque cura del Client interfacciarsi opportunamente con il giusto servizio a seconda degli eventi scatenati dall’interazione con l’utente. Il terzo servizio, WSData, non è direttamente coinvolto dalle chiamate del Client, ma funge da interfaccia da e verso il database per le richieste provenienti dai due servizi appena descritti. Alle spalle di WSData, direttamente collegato con esso, c’è il database, che raccoglie tutti i dati spediti da quest’ultimo, e ne asseconda le richieste. Infine, sono previsti anche alcune funzionalità di contorno, che per loro natura possono lavorare in maniera asincrona rispetto alle precedenti strutture, e che si occupano di mantenere l’integrità e la coerenza dei dati raccolti (stored procedure) o di analizzare i dati raccolti per la profilazione degli utenti (LearnerServer). 4.1 DATABASE Il database è la parte del sistema responsabile dello storage dei dati. Da esso il servizio WSData, e di riflesso gli altri servizi e il client, attingono i dati per la gestione degli accessi, i dati anagrafici degli utenti registrati, le relazioni di amicizia, i dati di gestione delle partite e i dati dei profili dei giocatori da utilizzare nella gestione delle mosse dell’Intelligenza Artificiale. Per quanto riguarda il RDBMS da usare, la scelta è ricaduta su MySQL per le seguenti principali motivazioni: - Buona integrazione con Java Prestazioni Semplicità Licenza di tipo Open Source Lo schema del database utilizzato è visibile in Figura 4.2. 51 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica Figura 4.2: Schema del database. Le tabelle del database sono: 4.1.1 UTENTI Contiene i dati anagrafici dell’utente registrato, i dati di ingresso al gioco e alcune variabili di sistema. I campi di questa tabella sono: - id: identificativo univoco dell’utente, intero, chiave primaria, auto-increment. nome: nome dell’utente, string. cognome: cognome dell’utente, string. email: e-mail dell’utente, stringa. Utilizzata per comunicazioni all’utente o, in chiave futura, per gestire la registrazione con invio conferma a e-mail valida. username: username univoca, string. password: password decisa dall’utente in fase di registrazione, string. is_ia: definisce se l’utente è l’espressione di una Intelligenza Artificiale, booleano. is_online: definisce se l’utente risulta essere online, boolean. 52 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica - - is_admin: in previsione futura, serve a definire se l’utente è amministratore, e potrà quindi avere accesso ad ulteriori servizi gestiti solo dagli administrator (servizi statistici, modifiche di anagrafiche altrui, ecc.), boolean. vinte, pareggiate, perse: campi contatore delle partite rispettivamente vinte, pareggiate e perse dall’utente, intero. data_creazione: data di generazione del record. 4.1.2 SESSIONI Contiene i dati di sessione generati dall’utente al momento della login. La sessione viene gestita dal token generato durante la login e dalla data di creazione del record, che serve a gestire la scadenza del token stesso: - id: identificativo univoco della sessione, intero, chiave primaria, autoincrement. idtoken: token generato per essere usato dall’utente nelle sue chiamate, string. id_utente: chiave esterna riferimento dell’utente, tabella utenti, intero. data_inizio: data/tempo di inizio sessione. Serve per decidere se la sessione è scaduta, e quindi il token va rinnovato. 4.1.3 AMICI Contiene le relazioni di amicizia tra i diversi utenti registrati. I campi di questa tabella sono: - id: identificativo univoco dell’amicizia, intero, chiave primaria, autoincrement. id_utente1: id dell’utente registrato che ha creato la relazione di amicizia, chiave esterna riferimento dell’utente, tabella utenti, intero. id_utente2: id dell’utente registrato che è stato coinvolto nella relazione di amicizia, chiave esterna riferimento dell’utente, tabella utenti, intero. data_creazione: data di generazione del record. 4.1.4 PARTITE Contiene tutte le partite create e i dati di intestazione delle partite stesse. I campi di questa tabella sono: - - id: identificativo univoco della partita, intero, chiave primaria, autoincrement. id_utente1: id dell’utente registrato che ha creato la partita (sfidante) – primo giocatore, chiave esterna riferimento dell’utente, tabella utenti, intero. id_utente2: id dell’utente registrato che ha accettato la sfida (sfidato) – secondo giocatore, chiave esterna riferimento dell’utente, tabella utenti, intero. n_giocatore_init: numero che identifica il giocatore che per primo inizia a muovere sulla scacchiera (1 per giocatore sfidante, 2 per giocatore sfidato), byte. livello1, livello2: livello delle intelligenze artificiali applicate rispettivamente al giocatore1 e al giocatore2. allenamento1, allenamento2: per futuri scopi, ad uso delle intelligenze artificiali applicate a giocatore1 e giocatore2 nel caso di allenamento o aiuti per l’utente. 53 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica - - tipo: serve per capire il tipo di sfida in corso (nuova, confermata, gestione posizioni iniziali, gestione mosse, annullata, finita…). Rappresenta lo stato parziale o finale di una sfida, intero. data_creazione: data di creazione della partita. 4.1.5 POSIZIONI_INIZIALI Contiene tutte le disposizioni delle pedine nelle posizioni iniziali. I campi di questa tabella sono: - id: identificativo univoco della posizione iniziale, intero, chiave primaria, auto-increment. id_partita: id della partita, chiave esterna riferimento della partita, tabella partite ,intero. pedina: identifica la pedina che da posizionare, string. posizione: identifica la posizione iniziale assunta dalla pedina, intero. data_creazione: data di generazione del record. 4.1.6 MOSSE Contiene tutte le mosse delle pedine effettuate durante le partite. I campi di questa tabella sono: - id: identificativo univoco della mossa, intero, chiave primaria, autoincrement. id_partita: della partita, chiave esterna riferimento della partita, tabella partite ,intero. id_utente: id dell’utente registrato che ha generato la mossa, chiave esterna riferimento dell’utente, tabella utenti, intero. pos_iniziale: identifica la posizione iniziale assunta dalla pedina, intero. pos_finale: identifica la posizione finale assunta dalla pedina nello spostamento, intero. mangia: identifica se nello spostamento c’è stata una mangiata e di che tipo, string. data_creazione: data di generazione del record. 4.1.7 LEARNERS Contiene i nomi dei learner usati nell’analisi dei profili di gioco del giocatore. Tengono un riferimento utile per la generazione della mossa dell’Intelligenza Artificiale. I campi di questa tabella sono: - id: identificativo univoco del learner, intero, chiave primaria, autoincrement. nome: campo che contiene il nome del Learner implementato e usato dal Learner Server per la creazione dei profili, text. 4.1.8 RANKERS Contiene i nomi dei ranker usati all’interno del servizio WSGame, nella generazione della mossa dell’Intelligenza Artificiale. Per offrire un’interfaccia usabile dall’utente, i vari ranker sono associati ad un utente di tipo Intelligenza Artificiale, associato tramite il campo id_IA. I campi di questa tabella sono: - id: identificativo univoco del learner, intero, chiave primaria, autoincrement. 54 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica - nome: campo che contiene il nome del Learner implementato e usato dal Learner Server per la creazione dei profili, text. Id_IA: id dell’utente fittizio Intelligenza Artificiale che fa da interfaccia agli altri utenti, chiave esterna riferimento dell’utente, tabella utenti, intero. 4.1.9 LEARNERS_RANKERS Contiene i campi di collegamento tra i learner ed i ranker e serve per esprimere una relazione N a N tra queste due tabelle. In questo modo è possibile associare opportuni analizzatori di profili (learner) ad opportuni valutatori di mosse (ranker), con il massimo grado di libertà di relazione. I campi di questa tabella sono: - id: identificativo univoco della relazione tra learner e ranker, intero, chiave primaria, auto-increment. nome: campo che contiene il nome del Learner implementato e usato dal Learner Server per la creazione dei profili, text. id_IA: id dell’utente fittizio Intelligenza Artificiale che fa da interfaccia agli altri utenti, chiave esterna riferimento dell’utente, tabella utenti, intero. 4.1.10 PROFILI_U_L_R Contiene tutti i profili utente generati dai learner usati come supporto per l’Intelligenza Artificiale. La relazione è tra un utente e la sua coppia learner/ranker. Attualmente la tabella può contenere dati ridondanti, in quanto il profilo è espressione dei soli learner, e quindi in caso di inserimento di valori multipli di learner con ranker diversi, i campi profilo saranno uguali per tuple diverse. In attesa di definire meglio l’uso di ulteriori ranker, si è preferito mantenere la ridondanza per non rischiare di avere dati non modificabili. I campi di questa tabella sono: - - id: identificativo univoco della relazione tra utente e coppia learner/ranker, intero, chiave primaria, auto-increment. id_utente: identificativo univoco dell’utente, intero, chiave primaria, chiave esterna riferimento dell’utente, tabella utenti, auto-increment. id_learner_ranker: identificativo univoco della coppia learner/ranker, intero, chiave primaria, chiave esterna riferimento della tabella learners_rankers, auto-increment. profilo: campo che contiene il profilo generato per quell’utente per quella coppia learner/ranker, text. 4.1.11 LOG Contiene tutti i log di errori o operazioni gestite dai server. I campi di questa tabella sono: - id: identificativo univoco della riga di log, intero, chiave primaria, autoincrement. log: testo del log generato, string. data_log: data/ora di immissione del log. function: richiamo testuale alla funzione (operazione, metodo, eccezione, ecc.) che ha generato il log, string. 55 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica 4.2 WEB SERVICE - WSUTENTI WSUtenti è il servizio che si occupa di rispondere a tutte le richieste che coinvolgono le anagrafiche utenti e le relazioni tra i vari giocatori. Il client chiama questo servizio per interrogare la piattaforma su dati anagrafici propri o di altri utenti registrati. Il servizio mette a disposizione diverse operazioni, illustrate in Figura 4.3. Figura 4.3: WSUtenti – interfaccia delle operazioni esposte. 56 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica 4.3 WEB SERVICE - WSGAME WSGame è il servizio che si occupa di rispondere a tutte le richieste che coinvolgono la sfida tra due giocatori, siano essi due giocatori registrati o un giocatore e un’Intelligenza Artificiale. WSGame viene coinvolto in una fase successiva, quando due giocatori sono intenzionati alla sfida. Dal momento di creazione della sfida alla fine della stessa, WSGame è a disposizione dei client per rispondere a tutte le operazioni di inserimento mosse, controllo delle stesse e recupero delle mosse dell’avversario. WSGame è responsabile per la logica di gioco e inoltre implementa le operazioni di generazione delle mosse per l’Intelligenza Artificiale. Le operazioni esposte da questo servizio sono visibili in Figura 4.4. Figura 4.4:WSGame - interfaccia delle operazioni esposte. 4.4 WEB SERVICE - WSDATA WSData è il servizio che si occupa di fare da interfaccia per l’immagazzinamento dei dati. E’ un servizio interno, pensato per essere chiamato direttamente dai due servizi precedenti per tutte le operazioni di inserimento, modifica, cancellazione dei dati nel database. Questo servizio vuole fornire un’interfaccia che nasconda l’implementazione e le scelte progettuali del database, in modo da rende il più possibile indipendente lo sviluppo nella gestione dei dati dallo sviluppo nella gestione della logica di gioco. Questo passaggio intermedio offre inoltre il vantaggio di coprire l’accesso diretto al database da un servizio esposto in Internet (WSUtenti e WSGame). In Figura 4.5 possiamo vedere l’interfaccia che esprime le operazioni esposte dal servizio. 57 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica Figura 4.5: WSData - interfaccia delle operazioni esposte. 4.5 PROGETTAZIONE HARDWARE SERVIZI La separazione della logica Server in tre diversi servizi permette anche una un’indubbia flessibilità nella gestione hardware. Ricordando che ogni servizio necessita di un web server che si occupi della sua esposizione (e che può contenere anche il file descrittivo del servizio stesso), la creazione di tre servizi separati offre l’opportunità di gestire i carichi di lavoro su server fisicamente separati, e potenzialmente posti in luoghi diversi l’uno dall’altro. Il servizio intermedio WSData, che fa da interfaccia per il database, è pensato per essere posto in una macchina differente dagli altri servizi, proprio per la sua peculiarità di offrire solo operazioni di back - end, che nulla hanno a che fare con il client. Inoltre questo servizio si presta anche a operazioni di protezione sulla rete: fermo restando che i dati tra client e servizio, e tra servizio e servizio, passano attraverso il web con chiamate HTTP, WSData può essere protetto a livello hardware, esponendo il suo servizio in una rete raggiungibile solo dai due servizi che lo utilizzano. La rete in questione potrebbe essere una intranet, nel caso di una logica server fisicamente alloggiata in una struttura unica, o una rete separata che faccia uso di regole firewall per limitarne l’accesso, nel caso di macchine server distribuite in luoghi diversi. La scelta di aumentare la modularità dei servizi esposti ha un costo in termini di quantità di dati scambiati in rete: tutti i passaggi da e per il database soffrono di un potenziale 58 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica rallentamento, dovuto alla minor velocità di trasmissione del dato. Altresì, macchine diverse hanno processori dedicati al singolo servizio, aumentando notevolmente la capacità di gestione di numerosi client. Questi ragionamenti rimandano ad una futura analisi del carico con la piattaforma a regime. Sono state individuate comunque, nei servizi WSUtenti e WSGame, delle operazioni disponibili all’uso di sistemi di caching, totalmente trasparenti al client, e quindi perfetti per la gestione separata auspicata. In particolare, possiamo ricavare esempi di uso di dati utilizzanti caching in: utenti disponibili, dati anagrafici raccolti e non modificati, dati di gioco parziali non modificati, o operazioni che non debbano esporre dati sempre aggiornati. Inizialmente i web service verranno ospitati in un unico server fornito di Apache + TomCat 6.x. La scelta della versione di TomCat è vincolante; tutti i servizi generati infatti sono ottimizzati per questa versione; è possibile scegliere una versione differente, ma bisognerà rifare il deploy dei servizi a partire dal codice sorgente. Il database MySQL non ha regole particolari di installazione, ma è stato scelta la versione 5.5. Il database potrà già essere ospitato in una macchina separata rispetto al web server; sarà comunque necessario cambiare l’indirizzo di connessione nei sorgenti di WSData, e ricostruire il pacchetto del servizio. 4.6 PROGETTAZIONE SOFTWARE SERVIZI Come illustrato precedentemente, l’uso di web service pone una serie di questioni aperte nella scelta dell’architettura opportuna. Molte scelte hanno coinvolto il lato progettuale del software. Il trasferimento dei dati, e il ciclo di vita degli stessi all’interno dei web service dipendono da una scelta ben precisa: l’utilizzo di pacchetti stateless o stateful. Per ottenere la miglior resa possibile in termini di performance nella gestione dei pacchetti, è altamente consigliato da Apache Software Foundation di sposare una filosofia quanto più possibile stateless. La differenza sostanziale tra i due approcci riconduce all’uso o meno di sessioni che mantengano in vita il dato anche dopo che il metodo sia stato chiuso e l’operazione evasa. I dati mantenuti tramite le sessioni sono poi richiamabili nei successivi accessi al servizio, ritrovando così in vita le istanze degli oggetti costruiti all’interno della sessione stessa. Questa filosofia, stateful, richiede l’uso intensivo di header nella costruzione e passaggio dei pacchetti SOAP, con conseguente rallentamenti e perdita di performance di rete (pacchetti più grandi da trasferire) e di processamento nel server (dati da conservare, tempo di vita delle sessioni da gestire). Inoltre, il sistema stateful è attualmente in continua evoluzione, e risulta ben lontano da uno standard che ne risolva tutti i problemi di interoperabilità (pietra miliare nell’uso dei web service). La filosofia stateful, nonostante l’approccio che avrebbe facilitato la gestione del dato, è stata quindi scartata e sostituita con la scelta di usare i web service in maniera stateless: con questa filosofia ogni chiamata alle operazioni è indipendente dalla precedente e genera potenzialmente un nuovo thread di gestione, completamente isolato dalla “storia” precedente del dato. La filosofia stateless è dichiarata come più performante dalla stessa Oracle6: “Stateless Beans Offer Performance and Scalability Advantages. Because stateless session beans are never written to secondary storage, they typically offer better 6 http://docs.oracle.com/cd/E14571_01/web.1111/e13719/design_best_practices.htm 59 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica performance than stateful beans. For applications that require large numbers of clients, stateless session beans offer better scalability than stateful session beans.” Questo approccio non è comunque esente da problematiche di gestione, una fra tutte, la più importante, è l’autenticazione: conoscere l’identità del chiamante è una problematica che riguarderà ogni singola chiamata ad operazioni di ogni singolo servizio. Per ridurre al minimo il passaggio di dati sensibili, e per ottenere comunque una soluzione efficace e leggera (in termini di byte passati tra client e web service), è stato deciso di gestire l’autenticazione con l’ausilio di token di sessione, ospitati nel database. 4.7 AUTENTICAZIONE L’autenticazione del client avviene tramite controllo di login e password attraverso il servizio WSData, che richiama il database ed effettua la comparazione. Successivamente il web service crea e salva nel database un token di sessione per l’utente autorizzato. Il token, generato con un hash opportuno, univoco per utente e per sessione, sostituisce login e password in ogni singola chiamata alle operazioni di tutti i web service. Ciò che viene richiesto ai web service è di implementare il controllo di esistenza del token, e il conseguente recupero dell’utente autorizzato, per svolgere le successive operazioni richieste. Per aumentare la sicurezza nella trasmissione dei dati, la password viene opportunamente mascherata in invio, come vediamo in Figura 4.6. Figura 4.6: Sequenza login e creazione Token. La fase di mascheramento della password è la seguente: il client chiama WSUtenti e passa login in chiaro, hash della password (applicazione dell’algoritmo SHA-1 di password+randomSeed) e randomSeed (intero random). Il servizio WSUtenti chiama il servizio WSData e passa i dati raccolti. WSData recupera i dati dal database, genera l’hash della password+randomSeed ricevuto dall’utente inviante e controlla se i dati passati sono uguali a quelli attesi. Se sono uguali, dà conferma e genera il token. Il servizio WSUtenti a sua volta propaga la risposta di WSData al client. L’utente potrò poi chiedere il Token. Quest’ultimo è generato come hash 60 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica prodotto dall’uso dell’algoritmo SHA-1 con input concatenato di: login, password, randomSeed, timestamp di data/ora della richiesta (in modo da generare sempre token differenti per utenti e momenti differenti). 4.8 CLIENT Il client si occupa di fornire un’interfaccia di gioco per l’utente. Inoltre, gestisce tutta la parte riguardante il profilo dell’utente registrato, la sua rete di contatti e la comunicazione delle informazioni da e per i servizi. Il client è coinvolto in tutte le fasi che riguardano l’approccio dell’utente al gioco. Per meglio individuare l’albero delle operazioni fornite all’utente, vediamo uno schema generale di approccio dell’utente a Geister. Figura 4.7: Diagramma attività Client. In Figura 4.7 possiamo vedere il flusso di attività generali che coinvolgono il Client. L’utente può scegliere di effettuare la registrazione come nuovo utente, o entrare attraverso la login, al client vero e proprio. Sono presenti pagine ausiliarie, come Credits o Manuale, per la consultazione anche da utente non registrato. Solo chi ha effettuato la login può entrare nel profilo. Da questo si possono gestire i dati anagrafici o visualizzare gli amici. L’elenco amici può essere modificato inserendo o eliminando le relazioni di amicizia con altri utenti. E’ possibile naturalmente scegliere un amico (fisico o Intelligenza Artificiale) e far partire la sfida. Sono stati indicati anche i web service coinvolti nelle attività, rispettivamente con le lettere: 61 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica - U: WSUtenti D: WSData G: WSGame Vediamo nel dettaglio la sequenza per la sotto-attività che descrive la fase di creazione di una sfida. Figura 4.8: Sequenza creazione sfida. L’utente registrato chiama il servizio WSUtenti per recuperare la lista degli utenti amici. WSUtenti gira la richiesta a WSData, che è l’unico ad avere accesso diretto al database. Dopo che i servizi ritornano la lista all’utente, quest’ultimo può scegliere l’amico da sfidare. L’utente chiede a WSGame di generare la sfida, passando come parametro l’amico scelto. WSGame chiama WSData e genera la sfida. Il successivo diagramma illustra la gestione di risposta dell’utente amico, che nel frattempo interroga il servizio WSGame per sapere se è nello stato di sfidato. 62 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica Figura 4.9: Sequenza dialogo utente sfidato. L’utente 2 è in attesa di essere sfidato, e interroga a intervalli regolari WSGame per sapere se esiste qualche sfida in cui lui sia stato coinvolto (polling a intervalli regolari). Quando utente 1 crea la sfida, all’ennesima domanda di utente 2, WSGame è pronto a rispondere positivamente. Utente 2 può decidere di sua iniziativa se confermare la sfida. Quando la sfida è nello stato di confermata, i due giocatori passano alla fase successiva e posso inserire le pedine nelle posizioni iniziali ed iniziare la fase di gioco vero e proprio. Se la sfida è annullata, Utente2 aspetta solo la conferma di annullamento, mentre utente1 verrà a conoscenza di questo stato solo nel momento in cui interrogherà il server per aver la conferma. Se la sfida avviene tra utente registrato e Intelligenza Artificiale, la sequenza è leggermente diversa, perché l’Intelligenza Artificiale si rende sempre disponibile alla creazione di una nuova sfida, e quindi l’utente che crea la sfida conosce subito l’esito della sua richiesta, non appena la sfida viene creata. WSGame si occuperà di rispondere all’istanza di richiesta di una nuova sfida contro l’Intelligenza Artificiale, e gestirà anche le successive fasi di inserimento mosse. Nel diagramma di sequenza in Figura 4.10 viene descritta la fase di sfida tra l’utente registrato e l’Intelligenza Artificiale. 63 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica Figura 4.10: Sequenza creazione sfida tra utente ed IA. Dopo aver creato la sfida, le successive fasi riguardano l’inserimento delle pedine nelle posizioni iniziali e la fase di gioco vero e proprio, con l’inserimento alternato delle mosse. La strategia alla base del dialogo tra utenti e servizi nella gestione delle mosse è la seguente: se l’utente ha il turno, può salvare la sua mossa, altrimenti deve attendere di avere il turno. Il turno viene gestito dal servizio WSGame, che chiede i dati delle mosse effettuate a WSData, controlla l’ultima mossa effettuata e decide di chi è il turno. In questo modo le mosse si alternano e il turno viene dato all’utente solo se l’ultimo inserimento è stato dell’avversario o se è il primo a muovere. 64 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica Figura 4.11: Sequenza inserimento mossa In Figura 4.11 possiamo vedere la sequenza di inserimento mossa da parte dell’utente registrato. WSGame chiede l’elenco delle mosse per decidere se l’utente ha il turno. Una volta che gli è stato assegnato il turno di gioco, l’utente può inserire la mossa. La validità della mossa viene controllata sia a livello di client (per filtrare mosse palesemente scorrette), sia a livello di servizio, per evitare sovrapposizioni con mosse dell’avversario o per inibire eventuali mosse scorrette forzate con un client qualsiasi. Se la mossa è ritenuta corretta, viene salvata nel database e confermata al client. A questo punto il Client attende di conoscere l’inserimento dell’avversario e chiede a WSGame il recupero della relativa mossa. A tal proposito si distinguono due casi: 1. L’utente registrato sta giocando contro un’Intelligenza Artificiale (single player): la mossa viene generata direttamente da WSGame tramite l’uso di opportuni algoritmi implementati al suo interno; il servizio poi si preoccupa di contattare WSData per salvare la mossa nel database, prima di comunicarla al Client. 2. L’utente registrato sta giocando contro un altro utente (multi player): la mossa viene chiesta ripetutamente a WSGame (tramite l’uso di chiamate temporizzate continue, polling), che chiede a WSData l’elenco delle mosse, ed estrapola l’ultima mossa effettuata; se la mossa è dell’avversario, la comunica al client. 65 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica 4.9 ALTRI MODULI COINVOLTI L’ultima parte della progettazione è dedicata a quei moduli ausiliari che completano l’architettura offrendo azioni di supporto al database, o di generazione di dati di profilazione, utili in fase di gioco. 4.9.1 STORED PROCEDURE Il database ha bisogno di operazioni di elaborazione temporizzata sui dati. Sono stati individuati possibili punti di interesse per la creazione di stored procedure che si occupino di aggiornare i dati per mantenere la coerenza e l’efficacia logica ad essi richiesta. In particolare le stored procedure implementate nel database possono rispondere ad esigenze come: - Far scadere a intervalli regolari le sessioni di gioco degli utenti, per costringere i client a rinnovare i token. Modificare il campo is_online dell’utente, che identifica se l’utente è connesso in quel momento, mettendo il valore a zero a intervalli regolari, per costringere il client a rinnovare questa informazione, in modo da mantenerla il più possibile coerente con la reale situazione dei client. 4.9.2 ALGORITMI DI INTELLIGENZA ARTIFICIALE Gli algoritmi per l’uso dell’Intelligenza Artificiale sono stati messi a disposizione da progetti derivanti da precedenti esperienze di stage. La filosofia derivante da questi algoritmi si compone di due azioni principali: - - Profilazione del comportamento di ogni utente, analizzando i log delle partite effettuate e facendo emergere le caratteristiche significative di strategia e dissimulazione (fase di learning); Classificazione dei pezzi (e generazione della mossa) per la partita in corso, confrontando i dati attuali con il comportamento salvato nel profilo utente (fase di ranking e generazione mossa). L’integrazione di questi algoritmi ha richiesto innanzitutto una attenta analisi per la collocazione fisica dei moduli necessari allo scopo: a differenza del software standalone, i dati coinvolti per l’uso dei suddetti algoritmi si trovano in aree diverse della piattaforma, cosa che ha comportato una fase di studio preliminare. Dall’analisi è emersa la necessità di separare le fasi di profilazione da quelle di generazione della mossa; questa separazione ha permesso non solo di collocare i moduli in aree diverse della piattaforma, ma di renderle indipendenti l’una dall’altra. Vediamo ora uno schema di integrazione dei moduli coinvolti nell’uso dell’Intelligenza Artificiale. 66 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica Figura 4.12: Schema di integrazione algoritmi di Intelligenza Artificiale. In Figura 4.12 vediamo uno schema della disposizione dei moduli di Intelligenza Artificiale all’interno della piattaforma, descrivendo anche il flusso di richieste e risposte coinvolte nelle operazioni di profilazione e generazione delle mosse dell’Intelligenza Artificiale: A) Gli utenti che accedono ad una sfida inviano i dati verso i web service coinvolti. Anche l’Intelligenza Artificiale è vista nel lato Client come un utente sempre sfidabile. Fisicamente i moduli principali di gestione dell’Intelligenza Artificiale si trovano all’interno del servizio WSGame, che risponde in automatico qualora un utente desiderasse giocare contro l’Intelligenza Artificiale ( IA); B) Sia che le partite coinvolgano due utenti, sia che si tratti di un utente contro l’IA, tutti i dati delle partite (utenti coinvolti, posizionamento pedine, mosse, stato della partita,…) vengono inviati dai web service al database; C) Un software separato, chiamato Learner Server si occupa dell’analisi di tutte le partite presenti nel database. Si tratta di un server standalone, creato in Java, direttamente collegato al database. L’uso di questo server permette di analizzare le partite secondo gli algoritmi sviluppati al suo interno, e di creare e salvare nel database (tabella utenti_profili) i profili di ogni singolo utente, per ogni singolo algoritmo implementato. L’avvio del server coincide con l’avvio delle analisi, quindi questo programma può essere usato periodicamente con uno scheduler di processi per raffinare i profili utente, sulla base delle partite svolte fino a quel momento. La fase di learning avviene in modo completamente asincrono rispetto all’esecuzione delle partite. Avviare o meno questo server permette di avere profili di utenti più o meno raffinati e precisi; D) Quando l’IA si trova coinvolta in una partita, il servizio WSGame si trova a dover generare le mosse in risposta a quelle effettuate da un utente umano. Il servizio richiama al suo interno i metodi di generazione dell’Intelligenza Artificiale, per effettuare la mossa opportuna. Questa decisione necessita innanzitutto della valutazione dei pezzi dell’avversario umano presenti sulla 67 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica scacchiera di gioco. Per fare ciò WSGame si serve del modulo Ranker, che utilizza i profili dell’utente avversario, salvati nel database dal Learner Server. Dai profili, il Ranker estrae le caratteristiche principali di strategia dell’avversario e, applicandole al tavolo della partita in corso, cerca di capire il colore di ogni fantasma avversario (fase di ranking). In caso di assenza di un profilo avversario valido (non esiste ancora, o non è utilizzabile per l’algoritmo in uso), il Ranker usa un profilo di default e applica usa scelta pseudo-casuale; E) Una volta ottenuta la presunta disposizione dei pezzi avversari, WSGame elabora la mossa migliore, cercando di uscire il prima possibile, o tentando di mangiare un pezzo avversario ritenuto blu, o cercando di scappare da una pericolosa situazione. Per i dettagli di implementazione dei moduli di integrazione dell’Intelligenza Artificiale, si rimanda al sotto-capitolo 5.9 INTEGRAZIONE INTELLIGENZA ARTIFICIALE). 68 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica Capitolo 5. SVILUPPO In questo capitolo illustriamo lo sviluppo concreto dei vari moduli progettati, e descriviamo l’implementazione completa delle classi, compresi i metodi principali. 5.1 IMPLEMENTAZIONE WEB SERVICE L’implementazione dei web service è strutturata nello stesso modo per tutti e tre i componenti esposti, e segue lo schema generale descritto da Apache Software Foundation e implementato nella pratica con l’uso di Axis2. Ad alto livello di progettazione Axis2 usa il modello ad Oggetti Distribuiti, che è uno dei modelli usati per la descrizione e l’implementazione dei sistemi distribuiti. Axis2 implementa le API di JAX-WS (javax.jws.*) per semplificare lo sviluppo e la distribuzione di Java Web Services (JWS) basati sul protocollo SOAP. Lo schema progettuale del modello, ad alto livello, si può vedere in Figura 5.1: Figura 5.1: Modello ad oggetti distribuiti in JAX-WS. La parte importante della gestione è data dalle sezioni Stub e Skeleton (Tie in figura). In particolare: Lo Stub: - rappresenta il Proxy del Server lato Client, cioè offre in locale all’applicazione Client gli stessi metodi del Server. - Nasconde i dettagli della comunicazione sulla rete all’applicazione Client. Lo Skeleton: - Riceve i dati dalla rete inviati dallo stub (il nome della funzionalità da invocare e i parametri necessari) Invoca il metodo sull’oggetto remoto che implementa anch’esso l’interfaccia remota. Restituisce il risultato allo Stub. Lo Stub e lo Skeleton rappresentano il middleware di tale sistema distribuito. 69 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica Axis2 è uno strumento molto versatile e permette non solo di esporre il servizio e il suo file descrittivo, ma anche di generare lo Skeleton lato server e lo Stub lato client per l’implementazione dei metodi decisi in fase di progettazione. Da notare che si parla di “metodi”, e non più di operazioni, proprio perché in questo contesto ci troviamo nella parte interna del servizio, che quindi verrà trattato come una classe, completa di variabili e metodi. Una volta che si genereranno le opportune strutture middleware e il servizio sarà esposto sul web service si parlerà di “operazioni del web service”. Axis2 permette di implementare il servizio con due approcci: Top - down - Partire creando il documento WSDL che descrive il Web Service WSDL > Java Genera per il lato server: Skeleton Java e file per l’esposizione del web service Bottom - up - Partire da una classe o interfaccia Java che contiene i metodi che il web service dovrà esporre Java > WSDL WSDL > Java (Come nel caso top-down) L’approccio usato in questo progetto è stato quello bottom-up, avendo già creato in fase di progettazione le interfacce descrittive dei singoli web service. Usando Eclipse con il plugin di Axis 2 è stato generato il web service7. Eclipse genera tutte le classi previste dal modello ADB (Axis Data Binding), ovvero: - <NOME SERVIZIO>SKELETON.JAVA: <NOME SERVIZIO>MESSAGGERECEIVERXY.JAVA: la classe “main” del servizio. da 1 a 4 classi che si occupano di gestire il trasporto nei 4 casi di MEP possibili (InOut, OutIn, In e Out). EXTENSIONMAPPER.JAVA: mappa le estensioni (es. i sotto elementi) dei messaggi XML nei relativi oggetti Java. Per risalire al nome del servizio dal nome di queste classi occorre fare attenzione alla capitalizzazione, ad esempio. WSUtentiSkeleton è la classe principale del servizio avente nome WSUtenti. Oltre a queste classi, Eclipse genera una classe per ogni complex type definito nel WSDL. Nel progetto sono stati evitati complex type nel passaggio dati, non tanto per la scalabilità (garantita da una buona trasformazione in xml del tipo complesso), quanto per cercare di ridurre la quantità di dati inviati (e quindi i byte di traffico) al minimo indispensabile. Non volendo interferire con il lavoro automatico di scrittura dei file di Axis 2, tutta l’implementazione del servizio è stata ospitata in una classe (MySkeleton.java) contenuta nel package Skeleton, i cui metodi venivano richiamati dai metodi omonimi nella classe automatica <nomeServizio>Skeleton.java. Tutorial di generazione: http://www.eclipse.org/webtools/community/tutorials/BottomUpAxis2WebService/bu_tut orial.html 7 70 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica Vediamo le dichiarazioni dei metodi nelle classi MySkeleton e una descrizione dei metodi principali. Per la descrizione completa si rimanda alla Javadoc presente all’interno dei codici sorgenti. 71 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica 5.2 WSDATA – MYSKELETON.JAVA 5.2.1 DICHIARAZIONE CLASSE E METODI: Figura 5.2: WSData - Descrizione classe MySkeleton. 72 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica 5.2.2 METODI PRINCIPALI : Metodi GET*(…) / SET*(…): restituiscono o settano le variabili visibili dal nome stesso del metodo (es. getNome, restituisce il nome dell’utente, setEmail setta l’email dell’utente,…). MODIFICAUTENTE(…), CANCELLAUTENTE(…): metodi di inserimento, modifica, cancellazione degli utenti nel database. In particolare NuovoUtente è chiamato per la registrazione di un nuovo utente. NUOVOUTENTE(…), metodo che genera il token di sessione per l’utente che comunica login e password cifrata+randomseed. Ritorna la stringa con il token o una stringa di errore GETIDTOKEN(…): CANCELLAAMICO(…), CANCELLAAMICI(…): metodi di inserimento e cancellazione delle relazioni di amicizia tra il chiamante e un altro utente. CANCELLAAMICI elimina in una sola chiamata, tutte le relazioni di amicizia del chiamante. NUOVOAMICO(…), INSERTPARTITA(…), DELETEPARTITA(…): metodi di inserimento, cancellazione delle partite nel database. UPDATETIPO(…):metodo che aggiorna il tipo della partita, modificando l’informazione utile per conoscere la fase attuale di gioco: partita iniziata, confermata, annullata, finita,ecc. INSERTPOSIZIONEINIZIALE(…), INSERTMOSSA(…): metodi di inserimento di singole posizioni iniziali e mosse. 73 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica 5.3 WSUTENTI – MYSKELETON.JAVA 5.3.1 DICHIARAZIONE CLASSE E METODI: Figura 5.3:WSUtenti - Descrizione classe MySkeleton. 5.3.2 METODI PRINCIPALI : Metodi GET*(…) / SET*(…): restituiscono o settano le variabili visibili dal nome stesso del metodo, richiamando i metodi di WSData per il recupero dei dati nel database (es. getNome, restituisce il nome dell’utente, setEmail setta l’email dell’utente,…). Metodi NUOVOUTENTE(…) / MODIFICAUTENTE(…): Creano un nuovo utente in fase di registrazione, e modificano i dati secondari se il client lo richiede, sempre richiamando i metodi opportuni in WSData. Metodo LOGIN(…): recupera il token da WSData passando i dati di login e password arrivati dall’utente e ritorna la stringa con il token di sessione. Metodi INSERTAMICO (…) / CANCELLAAMICO(…): si occupano del richiamo dei metodi opportuni di WSData per l’inserimento e la cancellazione di relazioni di amicizia tra utenti. Metodo GETLISTAMICI(…): ritorna una stringa concatenata di tutti gli username amici del chiamante. 74 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica 5.4 WSGAME – MYSKELETON.JAVA 5.4.1 DICHIARAZIONE CLASSE E METODI: Figura 5.4: WSGame - Descrizione classe MySkeleton. 5.4.2 METODI PRINCIPALI : Metodo INSERTPARTITADB(…), NUOVAPARTITA(…): si occupano dell’inserimento della partita, controllando che non vi siano partite in corso tra gli utenti, e che tutti i parametri siano correttamente assegnati. L’inserimento avviene richiamando il metodo opportuno in WSData. Metodo MODIFICATIPO(…): si occupa di modificare il tipo della partita, inserendo valori che identificano la fase di gioco (partita iniziata, confermata, posizioni iniziali inserite, fase di gioco, partita finita, partita annullata) richiamando il metodo opportuno in WSData. Metodi LISTAPOSIZIONIINIZIALI(…),LISTAMOSSE(…): ritornano le liste delle posizioni iniziali e le mosse di una partita, come stringhe opportunamente concatenate. Metodo ESEGUIMOSSA(…): metodo che controlla la validità della mossa passata e la salva, richiamando il metodo opportuno in WSData. Metodo GENERAMOSSAIA (…): metodo che genera la mossa opportuna per l’Intelligenza Artificiale e la salva, richiamando il metodo in WSData. 5.5 TABELLA ERRORI WEB SERVICE Nella comunicazione verso i client, ogni web service usa una codifica di stringhe create opportunamente per dare una rapida interpretazione dell’errore intercorso. Viene qui riportata la tabella completa delle stringhe di errore: 75 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica ERR: Errore generico, cattura di un’eccezione non prevista, serve per catturare eventuali eccezioni del sistema non controllate direttamente o non conosciute. ERR:NOCONN Errore di connessione, impossibile aprire una connessione al database. ERR:INVALIDTOKENREQUEST Errore del token. Token scaduto o inesistente. ERR:NOTOKEN Errore nella creazione del token, nessun utente o password errata. ERR:NOUSER Non esiste utente con quella username o, in caso di inserimento, l’utente è già stato creato. ERR:NOUPDATE Errore in modifica del record. Possibile errore da cercare nella query, infatti è usato in ultimo step. Usato in WSUtenti ERR:NODELETE Errore in cancellazione record. Possibile errore da cercare nella query, infatti è usato in ultimo step. Usato in WSUtenti. ERR:NOINSERT Errore in inserimento record. Possibile errore da cercare nella query, infatti è usato in ultimo step. Usato in WSUtenti. Usato in WSGame, inserimento mosse, pos iniziali ERR:NOFRIEND Errore in lista Amici. Non ci sono amici per l’utente. La lista è vuota. Usato in WSUtenti. ERR:INVALIDUSERS Utenti non validi per una partita. Usato in WSData, inserimento partita, controllo nome match. ERR:INVALIDMATCH Match già esistente tra due giocatori. Creazione di un nuovo match non valida. Usato in WSData, inserimento partita. Usato in WSGame, nuova partita. ERR:INVALIDMATCHNAME Nome del match già usato da altri. Usato in WSData, inserimento partita. ERR:NOMATCH Nessun match disponibile con le credenziali date. Usato in WSData, controllo nome match. ERR:INVALIDROUND Turno non valido per l’operazione richiesta. Usato in WSGame, inserimento mossa. 5.6 USO DI STUB NEI CLIENT Per meglio comprendere il livello di incapsulamento delle classi Stub e Skeleton, vediamo nel dettaglio una chiamata eseguita a livello client verso un metodo gestito da un servizio. WSDATASTUB STUB = NEW WSDATASTUB(); WSDATASTUB.GETNOMEPARTITA PARTITASTUB = NEW WSDATASTUB.GETNOMEPARTITA(); PARTITASTUB.SETIDTOKEN(IDTOKEN); PARTITASTUB.SETUSERNAME(USERNAME); PARTITASTUB.SETUSERNAME_SFIDATO(USERNAME_SFIDATO); WSDATASTUB.GETNOMEPARTITARESPONSE DATARESP=STUB.GETNOMEPARTITA(PARTITASTUB); 76 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica STRING RETURN=DATARESP.GET_RETURN(); Questa chiamata prepara i parametri nella classe intermedia GetNomePartita e chiama il metodo implementato nello Stub, che si occupa di contattare l’omonimo metodo nello Skeleton del Server (attraverso la chiamata SOAP, incapsulando il relativo envelope in un pacchetto HTTP) e restituire il valore di ritorno. Le chiamate Stub generate con Axis 2 sono ad uso dei client che vogliono interfacciarsi ai web service; nel progetto sono state usate anche all’interno dei web service stessi (WSUtenti e WSGame) per le chiamate al servizio WSData quando si doveva interagire con il database. 5.7 CLIENT ANDROID Il Client sviluppato in Android si occupa dell’interfaccia con l’utente. I package che compongono il Client sono visibili in Figura 5.5. Figura 5.5: Package del client Android. Il package principale è client, mentre gli altri sono importati da precedenti progetti per la generazione delle mosse dell’Intelligenza Artificiale. Il package client è a sua volta composto da ulteriori package, come si vede in Figura 5.6. Figura 5.6: Package 'client'. 77 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica Vediamo in dettaglio la descrizione dei package: 5.7.1 PACKAGE HANDLER Figura 5.7: Package Handler - classi. Il package handler contiene alcune classi che estendono le interfacce per la personalizzazione di alcuni aspetti grafici, legati alla digitazione di un area di inserimento testo o al cambio del focus tra un oggetto grafico e l’altro. Queste classi vengono usate nei componenti che compongono la parte grafica del gioco, e sono chiamati in più punti nelle finestre di gioco (Activity). 5.7.2 PACKAGE E XCEPTION Figura 5.8: Package Exception - Classi. In questo package è contenuta la classe EccezioneDialog, che viene lanciata per la gestione controllata di tutte le eccezioni catturate durante l’esecuzione delle varie fasi del gioco. Lo scopo principale di questa classe è quella di offrire un messaggio che interpreti l’errore occorso e lo presenti all’utente in maniera facile da leggere e da gestire. Laddove l’errore fosse grave, la classe ordinerà anche la chiusura dell’applicazione, altrimenti si limiterà alla sola visualizzazione dello stesso. La gestione dei vari errori e i messaggi da comunicare vengono gestiti grazie ad un oggetto di classe GestioneErrore, alla quale viene affidato il compito di analizzare il 78 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica testo dell’errore catturato, decidere il messaggio da restituire e decretare la gravità della situazione mediante una variabile intera. EccezioneDialog class Classe per la gestione controllata e visualizzazione degli errori catturati. Metodi principali: GETLIVELLOERRORE(): metodo che restituisce il livello di gravità dell’errore, dopo aver interpretato il messaggio lanciato dal server o dall’eccezione gestita. Se l’errore sarà grave, il valore di ritorno sarà >0, e decreterà la chiusura della finestra chiamante. In caso di errore sconosciuto, il livello è ritenuto sempre grave. metodo che disegna la finestra e mostra il messaggio di errore interpretato. La finestra contiene un bottone che scatena l’evento di chiusura della sola finestra (errore parziale o non grave), o anche della finestra chiamante (errore grave). DRAWDIALOG(MESSAGGIO:STRING, CONTESTO:CONTEXT): GestioneErrori class Questa classe si occupa di interpretare il messaggio d’errore e di valutarne la gravità, se possibile. Metodi principali: GETLIVELLOERRORE(): metodo che restituisce il livello dell’errore interpretato. SETLIVELLOERRORE(LIVELLO:INT): metodo che forza il livello dell’errore, in caso di interpretazione particolare. Viene usato se si vuole aumentare il livello di un errore in un contesto in cui si ritiene necessario. ANALIZZA(): metodo che interpreta l’errore arrivato e ne restituisce il messaggio opportuno da mostrare all’utente. 5.7.3 PACKAGE POLLING Figura 5.9: Package polling - classi. Il package polling contiene tutti i thread che effettuano operazioni di polling, cioè chiamate a intervalli regolari, verso il server. Le implementazioni delle chiamate ai server non sono inserite dentro il package polling, ma all’interno delle classi 79 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica chiamanti, come da specifiche dell’SDK. Il modello prevede un insieme di classi definite nel package android.os che implementa un meccanismo che comprende una coda di messaggi condivisa dal main e worker thread. Il worker thread in questo caso 'produce' i messaggi e il main thread li 'consuma'. Questi messaggi possono tradursi in azioni, cioè il worker thread invia un messaggio che indica di settare un valore ad un controllo grafico ed il main thread lo esegue. La classe principale che si occupa di gestire questo meccanismo è android.os.Handler: - Il main thread (Activity) crea un'istanza dell'Handler ridefinendo il metodo handleMessage(Message msg) dove vengono recapitati i messaggi; Il worker thread invece ha un riferimento all'Handler ed ogni qualvolta deve notificare un'azione invia un messaggio attraverso il metodo sendMessage(Message msg) dell'oggetto Handler. I thread contenuti nel package polling sono i worker thread: una volta avviati, generano a intervalli prestabiliti dei messaggi che devono essere intercettati e gestite all’interno della classe del chiamante. Il package contiene tre classi, che rappresentano le tre fasi di polling gestite nel client. Le classi sono: ThreadSfidaAvversario class Classe che genera il polling per sapere se si è stati sfidati da qualche altro utente registrato. Threadposizioniiniziali class Classe che genera il polling per sapere se sono state inserite tutte le posizioni iniziali, in modo da passare alla fase di gioco. Threadturnomossa class Classe che genera il polling per sapere se si possiede il turno per effettuare la mossa. Dentro le classi sono implementati i metodi di start e stop del thread, mentre il metodo NOTIFYMESSAGE(…) si occupa di generare il messaggio che verrà catturato dall’handler all’interno della classe chiamante. Tra le costanti, le più importanti sono TIME_POLLING, che gestisce l’intervallo di tempo (in millisecondi) tra l’invio di un messaggio e il successivo, e TIMEMAX_POLLING, che gestisce l’intervallo di tempo massimo (in millisecondi) di vita del Thread. 5.7.4 PACKAGE ANDROID Il package android contiene le classi principali di interfaccia del gioco con l’utente e gestione delle fasi di gioco. Le classi presenti in questo package rappresentano le finestre mostrate all’utente e richiamano i metodi del server per il recupero delle informazioni riguardanti l’utente e la partita. Ogni classe contiene le variabili e i metodi d’uso inerenti alla finestra presentata. 80 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica Figura 5.10: Package android - classi, prima parte. 81 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica Figura 5.11: Package android - classi, seconda parte. Le classi sono: MainActivity class Questa è la classe di avvio del gioco, contiene i bottoni per l’avvio delle azioni principali: - - Registrazione: con un click si crea una nuova Activity (REGISTRAZIONEACTIVITY) e si accede all’area di registrazione di un nuovo utente. Login: con un click si crea una nuova Activity (LOGINACTIVITY) e si accede all’area di login / logout dell’utente registrato. Profilo: con un click si crea una nuova Activity (PROFILOACTIVITY) e si accede all’area personale dell’utente registrato. Credits: con un click si crea una nuova Activity (CREDITSACTIVITY) e si accede all’area di visualizzazione dei Credits, con l’elenco delle persone coinvolte nel progetto. Manuale: con un click si crea una nuova activity (MANUALEACTIVITY) e si accede all’area contenente il manuale utente. Metodi principali: ONCREATE(…): lanciato automaticamente all’evento di creazione della classe, inizializza il layout grafico della finestra, compresi i bottoni inseriti e le immagini di sfondo, 82 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica inizializza le variabili principali e genera gli Handler per la gestione dei click sui bottoni. RegistrazioneActivity class Questa è la classe di registrazione di un nuovo utente, contiene tutti i campi per l’inserimento di un nuovo utente. Metodi principali: SALVADB(NOME:STRING, COGNOME:STRING, USERNAME:STRING, PASSWORD:STRING, EMAIL:STRING): lanciato alla pressione del bottone di salvataggio del record, invia i dati inseriti (e verificati) al servizio WSUtenti, che si occuperà di richiamare il servizio WSData per il salvataggio sul database del nuovo utente. CALLSERVER(SOAPACTION:STRING, METHOD:STRING, PARAMETRI:PROPERTYINFO[*], : metodo che si occupa di creare fisicamente il pacchetto SOAP per l’invio delle richieste al servizio richiesto. E’ un metodo generico, che viene usato anche in altre classi; fa uso delle chiamate alla libreria KSOAP 2. Richiede come parametri il nome del servizio e dell’operazione da contattare, e l’elenco dei parametri da inviare. Ritorna una stringa dei risultati recuperati dal pacchetto di ritorno SOAP. LOGHEADER:STRING) CreditsActivity class Questa è la classe che visualizza i Credits del gioco. Essendo una classe richiamabile dal menù principale, può essere vista anche da utenti non registrati. ManualeActivity class Questa è la classe che visualizza il manuale utente del gioco. Essendo una classe richiamabile dal menù principale, può essere vista anche da utenti non registrati. Istanzia una gallery a scorrimento di immagini con didascalie che illustrano le varie fasi del gioco. LoginActivity class Questa è la classe attraverso la quale l’utente può effettuare il login e il logout dal gioco. Vengono richiesti i parametri di username e password (nascosta). Una volta confermati, la classe richiama il servizio WSUtenti per la verifica dei dati. Se tutto è andato bene, l’utente ottiene un token di sessione, che viene salvato in una variabile ambientale, visibile da tutte le classi del gioco. Metodi principali: LOGIN(): lanciato al momento del click sul bottone di login, chiama il servizio WSUtenti, passando i dati immessi dall’utente per il controllo della validità della login, e il recupero del token di sessione. ProfiloActivity class Questa è la classe di gestione del profilo utente. Contiene i dati anagrafici dell’utente, inseriti in fase di registrazione, e richiamati dal servizio WSUtenti. Si occupa di visualizzare l’elenco degli amici dell’utente e permette di accedere a due altre sottosezioni: - Sfida: scegliendo un utente dall’elenco e cliccando il bottone, si accede all’activity che si occupa della sfida (SFIDAACTIVITY); 83 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica - Amici: si entra nella sezione di controllo dell’elenco amici, per poter inserire o eliminare altri utenti dalla propria cerchia di amicizia (CERCAAMICIACTIVITY). Inoltre, gestisce il polling con il servizio WSUtenti per sapere se l’utente è stato sfidato, lanciando un oggetto di classe THREADSFIDAAVVERSARIO. Metodi principali: CARICANOME(),CARICACOGNOME(),CARICAEMAIL(): metodi che recuperano i dati anagrafici dell’utente dal servizio WSUtenti. Metodo che recupera dal servizio WSUtenti l’informazione riguardante l’utente selezionato dall’elenco degli amici. Se è una Intelligenza Artificiale, predispone la richiesta di sfida all’Intelligenza Artificiale. CARICAISIA(): SALVANOMEDB(),SALVACOGNOMEDB(), SALVAEMAILDB (): metodi che inviano i dati modificati dell’anagrafica al servizio WSUtenti. POLLINGSFIDAAVVERSARIO():metodo che istanza l’oggetto thread per il controllo dello stato di sfidato. THRSFIDAAVVERSARIO e fa partire il CercaAmiciActivity class Questa è la classe di gestione delle amicizie dell’utente. Da questa classe è possibile inserire nuovi amici, conoscendone lo username o selezionandolo da un elenco di utenti online o preselezionati dal servizio WSUtenti. Metodi principali: CARICALISTAONLINE(): carica la lista degli utenti attualmente online e che possono essere aggiunti come amici. SALVAAMICODB(IN USERNAME_AMICO:STRING): salva la nuova relazione di amicizia con l’utente desiderato. Questo metodo viene lanciato al momento del click sul bottone di salvataggio. Di norma, si comporta in questo modo. Se trova uno username indicato nel box di testo, cerca di inserire quello, altrimenti cerca di inserire quello dell’elenco degli utenti online. Il salvataggio vero e proprio è naturalmente delegato al servizio WSUtenti (e di riflesso a WSData). SfidaActivity class Questa è la classe di interfaccia della sfida. In questa classe viene disegnato il tavolo da gioco, vengono richiamati i metodi di gestione dei turni di sfida e dei turni di gioco, vengono visualizzate le mosse sul tavolo, sia dell’utente che dell’avversario. Infine, viene gestita l’eventuale vincita o perdita, mostrando un opportuno messaggio e terminando la sfida. Questa classe viene chiamata quando si ha un utente valido da sfidare, o se si conferma di accettare la sfida, nel caso di utente sfidato. Metodi principali: NUOVASFIDA(): metodo che viene chiamato alla creazione della finestra per istanziare correttamente le variabili di gioco e preparare il tavolo. SALVANUOVAPARTITADB(IDTOKEN:STRING, NOMEPARTITA:STRING, GIOCATOREINIT:INT, USERNAME:STRING, USERNAME_SFIDATO:STRING, LIVELLO1:INT, LIVELLO2:INT, ALLENAMENTO1:BOOLEAN, ALLENAMENTO2:BOOLEAN): metodo chiama il servizio WSGame 84 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica chiedendo di inserire la nuova sfida in database. Questo metodo viene richiamato dallo sfidante, che per primo ha istanziato la sfida. Una volta che il record sarà creato, anche l’utente sfidato verrà a conoscenza della sfida. ABILITABOTTONI(),DISABILITABOTTONI(): Metodi che ripristinano lo stato dei bottoni e/o azzerano i rispettivi tag (informazione interna dello stato logico del bottone) e cambiano l’immagine impressa sul bottone. Vengono chiamati quando si deve bloccare l’uso del tavolo o ripristinarne la funzionalità. ABILITABOTTONEMOSSA(I:INT, J:INT),: abilita il bottone alla mossa, e quindi a essere cliccato. IMPOSTAPOSINIZIALE(IN RESID:INT, IN I:INT, IN J:INT): metodo che disegna nella gestione delle posizioni iniziali , il bottone i-esimo/j-esimo, la tipologia di fantasma scelto per il tipo di click effettuato o in base ai fantasmi già posizionati. DISEGNAPOSIZIONIAVVERSARIO(POS:STRING[*]): metodo che disegna le posizioni nel tavolo grafico tramite un parametro in ingresso di tipo array di String, rappresentante l’array delle pedine e delle relative posizioni. SALVAPOSIZIONIINIZIALIDB(ABILITAIA:BOOLEAN): metodo che salva le posizioni iniziali sul database, richiamando il servizio WSGame. Se abilita è settato a true, il salvataggio riguarda l’Intelligenza Artificiale. POLLINGTHREADPOSINI(): metodo che istanzia il thread per il controllo dell’avvenuto inserimento delle posizioni iniziali da parte dell’avversario. Questo metodo viene lanciato nel momento della conferma di inserimento delle proprie posizioni, e controlla lo stato dell’avversario. Nel frattempo l’utente è in attesa, e non potrà avanzare finché l’avversario non avrà affettivamente inserito i suoi dati. POLLINGTHREADTURNOMOSSA(): metodo che istanzia il thread per il controllo del turno della mossa. Questo metodo viene lanciato nel momento della conferma di inserimento della propria mossa, e controlla lo stato dell’avversario. Nel frattempo l’utente è in attesa, e non potrà avanzare finché l’avversario non avrà affettivamente inserito i suoi dati. CHECKTURNODB(): metodo che chiede al servizio WSGame di conoscere di chi è il turno. GESTISCIMOSSA(RESID:INT, I:INT, J:INT): metodo che controlla il tipo di click effettuato sul bottone e decidere se abilitare o meno la mossa. MUOVI(SETTAMANGIATA:STRING): metodo che muove la pedina da una posizione di partenza ad una posizione di arrivo, aggiornando i dati del tavolo e visualizzando lo spostamento. MUOVITAVOLOLOGICO(IN MOSSAPARTENZA:STRING, IN MOSSAARRIVO:STRING): metodo che esegue la mossa sul tavolo logico, cambiando le pedine che riguardano il punto di partenza e di arrivo della mossa. MANGIA(TAG:INT): metodo che effettua una mangiata del tipo definito dal tag, aggiornando il tavolo. MANGIA_AVV(TAG:INT): metodo che effettua una mangiata avversaria del tipo definito dal tag, aggiornando il tavolo. 85 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica SALVAMOSSADB(M1:STRING, M2:STRING, MANGIATA:STRING, MOSSAIA:BOOLEAN): metodo che salva la mossa effettuata nel database, richiamando il servizio WSGame. M1 rappresenta la mossa di partenza, M2 la mossa di arrivo, MANGIATA è la stringa che identifica se c’è stata la mangiata di una pedina nella mossa. GETMOSSEDB(): metodo che recupera dal servizio WSGame l’elenco delle mosse inserite nel database. DISEGNAMOSSAAVVERSARIO(): metodo che disegna la mossa dell’avversario sul tavolo grafico. PREPARATAVOLOLOGICO(): Metodo usato nella preparazione della richiesta della mossa dell’Intelligenza Artificiale. Prepara l’oggetto tavoloLogico, creando un “mapping” tra il tavolo attuale e il tavolo da passare al servizio WSGame per l’analisi delle mosse e la creazione di una mossa valida per l’Intelligenza Artificiale. PRINTTAVOLOLOGICO(): Restituisce una stringa che rappresenta l’attuale disposizione delle pedine nell’oggetto tavoloLogico. IAGENERAPOSIZIONIINIZIALI(): metodo che si occupa della generazione delle posizioni iniziali per l’Intelligenza Artificiale. GETMOSSAIADB(): richiama il servizio WSGame per ottenere la mossa valida per l’Intelligenza Artificiale, nel caso la sfida si stia giocando in single player. IAGENERAMOSSA(): metodo generale per la gestione della mossa da parte dell’Intelligenza Artificiale. Richiama altri metodi nel giusto ordine per preparare il tavolo logico, controllare il turno, chiamare la generazione della mossa ed eseguirla. SALVATIPODB(): metodo che salva il tipo di sfida nel database, chiamando il servizio WSGame. In base alla fase di gioco, o alle decisioni prese dall’utente, il tipo della sfida verrà cambiato con questo metodo. CHECKFINE(): metodo che controlla se lo stato attuale del tavolo identifica la fine del gioco. Il metodo è chiamato dopo l’inserimento di una mossa o l’arrivo di una mossa avversaria. PRINTMESSAGEBOARD(BOARDGIOCATORE:INT, MESSAGGIO:STRING): metodo che disegna un messaggio sulla Board del giocatore. 86 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica 5.8 CLIENT SCREENSHOT Vediamo ora una serie di screenshot del client Android, con una breve descrizione delle varie finestre. La tabella seguente può sostituire il manuale utente per il client, comunque presente all’interno del programma stesso sottoforma di immagini corredate da didascalie di aiuto. La finestra principale del Client Android presenta 6 bottoni: Nuovo Utente: permette di entrare nella sezione di registrazione di un nuovo utente; Login: permette di entrare nella sezione di login in cui inserire username e password di un utente già registrato; Gioca: si abilita solo dopo aver effettuato la login, permette di entrare nella fase di scelta dell’utente avversario e avvio della sfida; Profilo: si abilita solo dopo aver effettuato la login, permette di entrare nel profilo dell’utente e modificare i relativi dati anagrafici; Crediti: Visualizza una schermata con i dati di versione del client installato e i contatti degli autori; Manuale: Visualizza una finestra con una gallery di immagini complete di didascalie per una rapida comprensione delle principali funzionalità del client. La finestra Crediti contiene le informazioni relative alla versione del client installata e i contatti degli autori. E’ consigliato controllare questa finestra ogni volta che si installa una nuova versione del client, per avere conferma dell’avvenuta installazione. Il secondo passaggio consigliato è quello di aprire la finestra del Manuale Utente. Il Manuale contiene una serie di immagini di gioco accompagnate da brevi didascalie che aiutano l’utente nella navigazione tra le varie finestre di gioco. La gallery si può scorrere a destra e sinistra; ogni volta che si preme sopra una delle piccole immagini poste in alto, viene richiamata l’immagine ingrandita desiderata, completa di didascalie e descrizioni dei comandi principali. 87 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica Se non è mai stato creato l’utente, è possibile registrarne uno nuovo dal menù principale, premendo in Nuovo Utente. I dati richiesti riguardano il nome e cognome dell’utente, la username univoca scelta e la relativa password, utili per entrare nel sistema, ed una email a cui possono essere spedite comunicazioni riguardanti il gioco stesso. Una volta inserito l’utente è possibile effettuare la login, inserendo i dati negli appositi campi della finestra Login Utente. Sarà sempre possibile in seguito effettuare il logout per entrare con un altro username, e usare il device con un altro profilo. I dati inseriti con la login vengono comunque registrati e salvati nel client, per permettere di connettersi più facilmente ai successivi accessi al software. Una volta che sia stata validata la login, si può accedere al proprio profilo, dove sono ammesse alcune modifiche dell’anagrafica comunicata nella fase di registrazione. La finestra per l’introduzione al gioco viene abilitata solo a login effettuata. Premendo il tasto Gioca dal menù principale si entra nella finestra dove è possibile selezionare un amico e sfidarlo. Essendo necessario conoscere l’utente sfidato, è possibile aumentare l’elenco delle proprie conoscenze entrando nella sezione Amici. Una volta scelto il proprio avversario, si può avviare la sfida. L’elenco degli amici comprende anche le intelligenze artificiali messe a disposizione dal sistema, ed evidenziate nell’elenco con un’icona diversa (un omino per gli utenti umani, un piccolo monitor per le intelligenze artificiali). Di default, tutti gli utenti al primo accesso sono relazionati con l’intelligenza principale chiamata “MasterIA”, in modo che sia possibile iniziare a giocare anche se non si hanno ancora amici umani da sfidare. 88 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica Dal menù Amici è possibile aprire una finestra di gestione delle amicizie. E’ possibile cercare un amico se si conosce il relativo username esatto, oppure è possibile scegliere nell’elenco tra gli utenti proposti dal sistema. Inoltre, si possono eliminare relazioni di amicizia con utenti non più graditi. Essendo le intelligenze artificiali gestite come utenti veri e propri, è possibile inserire o eliminare relazioni di amicizia con esse, per giocare contro il computer secondo algoritmi di analisi diversi. Si ricorda infatti che gli utenti IA presentati, rappresentano in maniera intuitiva i vari algoritmi di analisi implementati all’interno del servizio di gioco. Una volta iniziata la sfida (per sfida creata, o in relazione ad una risposta di sfida) è possibile inserire gli 8 fantasmini nelle posizioni di partenza (4 rossi – cattivi, 4 blu - buoni). Per procedere si possono toccare solo i bottoni bianchi. Con un tocco si posiziona un fantasmino rosso, con due tocchi un fantasmino blu, con tre tocchi si annulla la scelta. Se si sono posizionati già quattro fantasmini dello stesso colore, gli altri bottoni saranno vincolati ai fantasmini del colore mancante. Una volta inseriti tutti i fantasmini è possibile confermare le posizioni, premendo sul bottone che comparirà a posizionamento completato. Posizionati i fantasmini, c’è una fase di attesa per il posizionamento dell’avversario. Quando tutti e due i contendenti sono pronti, si passa alla fase di gioco dove, alternativamente, ognuno dei giocatori può effettuare la mossa: si clicca sul fantasmino da muovere, poi si clicca su uno dei bottoni adiacenti e sottolineati in giallo. La mossa è possibile solo nelle posizioni a nord, sud, est, ovest rispetto al fantasmino, e comunque non sopra ai fantasmini della propria squadra. Se si vuole annullare la mossa basta cliccare una seconda volta sul fantasmini scelto. L’utente che ha il turno può controllare l’ultima mossa dell’avversario tenendo premuto il tasto con l’icona degli occhiali. Verranno evidenziate le due celle coinvolte dallo spostamento avversario precedente. Le celle saranno sottolineate di giallo se il movimento non ha comportato mangiate, oppure di rosso o blu se è stato mangiato un fantasmino proprio del rispettivo colore. Una volta effettuata la mossa si deve attendere che l’avversario faccia altrettanto e si prosegue a fasi alterne per il resto della gara. 89 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica A seconda del risultato della sfida viene mostrata una finestra che comunica il successo o l’insuccesso della gara. Premendo il tasto Esci si torna al menù di scelta del gioco o al proprio profilo. Se si vuole, si può premere il bottone con la freccia Indietro del proprio device per controllare lo stato finale della sfida. Non sarà più possibile interagire con essa, ma può essere utile per studiare l’ultima mossa che ha portato alla vittoria/sconfitta. 5.9 INTEGRAZIONE INTELLIGENZA ARTIFICIALE Come detto in precedenza, lo studio e la progettazione degli strumenti utili per l’integrazione di una Intelligenza Artificiale era stata portata avanti in precedenti esperienze di stage. Il lavoro eseguito è stato quindi focalizzato sull’adattare e riutilizzare il più possibile il codice a disposizione per non perdere la preziosa esperienza acquisita precedentemente. I problemi principali da affrontare si possono riassumere in questi punti: - - - Piattaforma originale molto diversa da quella attuale: il programma precedente permetteva una completa integrazione degli oggetti all’interno della logica di gioco, rendendo facile lo scambio dati tra parti client e parti server per il recupero di informazioni preziose che servissero allo scopo. Il sistema attuale, con una logica completamente separata e servizi stateless ha richiesto lo sforzo ulteriore di re-ingegnerizzare il passaggio dati attraverso la rete e verso i servizi di controllo, in modo da poter mantenere almeno i metodi di generazione della mossa; Dati salvati in log testuali: questa problematica non ha rappresentato uno sforzo enorme, perché sono stati aggiunti i metodi opportuni di uso del database all’interno del servizio WSGame. Il problema principale che si pone, e sarà oggetto di studio futuro, è sulla forma dei dati raccolti: i dati testuali infatti non avevano il problema di tabelle relazionate, ma in un’ottica di ottimizzazione, alcune funzionalità andranno riscritte e opportunamente legate a tabelle normalizzate. Sviluppo difficoltoso: le soluzioni adattate soffrono di una notevole complessità di analisi; la parte di lavoro sulle classi che integrano l’Intelligenza Artificiale è stata solo adattata nel suo schema di base, ma è sempre stata gestita come un prodotto prototipale, perché il suo sviluppo coincide con la messa a regime del progetto attuale. Lo studio e la raffinazione delle Intelligenze Artificiali (plurali in quanto legate alla definizione di più algoritmi di analisi) è strettamente legato all’aumento della raccolta delle partite tra giocatori. Perciò, il punto finale di questo progetto si lega con l’inizio di una nuova fase di analisi dei dati raccolti. 90 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica Le problematiche riscontrate non hanno impedito comunque di integrare nel progetto due strutture fondamentali all’analisi delle partite e alla generazione di mosse valide per l’Intelligenza Artificiale: il Learner e il Ranker. 5.9.1 LEARNER Il Learner si occupa di analizzare i log delle partite avvenute e di creare i profili degli utenti, caratterizzati da una serie di dati che rispecchiano le strategie intraprese dagli utenti rispetto a delle caratteristiche che descrivono il gioco (features). In particolare il software applica una serie di algoritmi di learning prestabiliti e genera un profilo per ogni utente, per ognuno degli algoritmi. Per la sua caratteristica intrinseca di asincronia rispetto al sistema client/server, la fase di learning si presta ad essere gestita con un modulo a parte, che viva esternamente alla piattaforma primaria e che possa essere implementata in maniera indipendente, legata solo al database delle partite. Per questo motivo, questa fase è stato separata dalle altre classi e inserita in un pacchetto standalone scritto in java, chiamato LearnerServer. La filosofia di questo pacchetto è quella di essere utilizzato solo nei momenti in cui si ha bisogno di analizzare i log delle partite, per raffinare i profili degli utenti rispetto alle partite pervenute. 5.9.2 LEARNER SERVER Questo pacchetto esterno è composto dai package precedentemente sviluppati, modificati opportunamente per l’integrazione con la piattaforma attuale. Il LearnerServer è composto dai package visibili in Figura 5.12. Figura 5.12: Package di LearnerServer. Il package principale è apprendimento, che contiene il main e le classi principali per l’analisi e la creazione dei profili. Il package utility contiene le classi di collegamento al database, mentre il package logica contiene gli oggetti astratti che compongono il gioco, dal tavolo ai pezzi, ai giocatori, ecc. Questa parte del lavoro è stata sviluppata in altre tesi, e non verrà trattata in dettaglio. Per capire il funzionamento del programma, vediamo uno scorcio delle classi che compongono il package apprendimento. 91 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica Figura 5.13: Package apprendimento - classi. Vediamo un estratto del main del LearnerServer: PUBLIC STATIC VOID MAIN(STRING[] ARGS) { FEATURECOLLECTOR FC = NEW FEATURECOLLECTOR(); FOR(INT I=0;I<18;I++){ FC.ADDFEATURE(NEW MOSSEAVANTI()); } LEARNER MEDIA=NEW MEDIAVETTORI(FC); LEARNER MEDIA2=NEW MEDIAVETTORI2(FC); LEARNEREXECUTOR L1=NEW LEARNEREXECUTOR(); L1.AGGIUNGILEARNER(MEDIA); L1.AGGIUNGILEARNER(MEDIA2); L1.EXECUTE(); } Il main richiama un oggetto di classe FeatureCollector, che si occupa di collezionare una serie di Feature da applicare agli algoritmi di learning. Successivamente vengono istanziati gli oggetti relativi alle classi di learning. Possono essere creati tanti algoritmi di analisi delle partite. Nel nostro caso viene creato un oggetto di classe MediaVettori, ed uno di classe MediaVettori2. Questi vengono passati al LearnerExecutor, che è la classe che “lancia” fisicamente l’analisi rispetto a tutte le partite presenti, per ogni algoritmo caricato, per ogni utente coinvolto nelle singole partite. Una volta lanciata l’analisi, la classe si collega al database per inserire nuovi Learner nella tabella learners. Viene poi creata un’associazione tra un learner e il ranker che dovrà usare i dati da esso prodotti, cercando prima il nome del ranker in tabella rankers e poi creando una relazione tra i due in tabella learners_rankers. Questa tabella esprime una relazione N a N tra i learner e i ranker, per poter avere massima libertà di inserimento: un learner potrà essere gestito da più ranker, e un ranker potrà analizzare più learner. A questo punto, per ogni utente presente nel database, vengono analizzate tutte le partite in cui l’utente ha giocato. Vengono scelte partite iniziate (con almeno una mossa effettuata), ma non necessariamente terminate. Per ogni partita vengono eseguiti gli algoritmi di analisi caricati, e preparati i vettori rappresentanti le caratteristiche di gioco del giocatore (a seconda delle features caricate in precedenza). Ad analisi ultimata vengono inseriti (o aggiornati) i record del profilo utente, per lo specifico learner, contenuti in tabella profili_u_l_r. 92 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica Il LearnerServer si presta molto bene ad una schedulazione di esecuzione che si applichi a intervalli prestabiliti, non necessariamente sincronizzati. 5.9.3 RANKER La classe Ranker è la classe adibita al ranking, ossia alla classificazione dei pezzi durante la partita, è cioè la parte dell'apprendimento che potrà comunicare all'Intelligenza Artificiale la previsione su quali siano i pezzi buoni e quali i pezzi cattivi, basandosi su quelli attualmente in gioco. La classe è stata integrata dentro il servizio WSGame, e viene richiamata quando un giocatore gioca contro l’Intelligenza Artificiale. Per rendere fruibili più ranker all’utente si è scelto di associare il ranker ad un utente fittizio, che una volta sfidato, richiamerà nel servizio la classe Ranker specifica. L’utente vedrà nell’elenco degli amici o degli utenti sfidabili, anche le varie Intelligenze Artificiali, che faranno da alias a classi Ranker costruite appositamente nel server. Attualmente è presente un solo ranker, e l’utente di riferimento è chiamato MasterIA. L’estratto di codice seguente mostra come la classe IntelligenzaArtificiale, implementata nel servizio WSGame dentro il metodo generaMossaIA(…) chiami il Ranker e passi i dati della partita e del tavolo attuale: PUBLIC INTELLIGENZAARTIFICIALE(TAVOLO T, DOUBLE LIV,DOUBLE LIVAVV, GIOCATORE GIOC_CORR, GIOCATORE AVV, VECTOR<STRING> EUR, LEARNER LEARNER,STRING NOMEPAR){ TAV = T; LIVELLO=LIV; LIVELLOAVVERSARIO=LIVAVV; GIOCATORE_CORRENTE = GIOC_CORR; AVVERSARIO = AVV; EURISTICHE=EUR; NOMEPARTITA=NOMEPAR; PROFILO = NEW RANKER(TAV,GIOC_CORR,AVV,LIVELLOAVVERSARIO,LEARNER,NOMEPARTITA); ATTIVAPROFILO(TRUE); } Il Ranker recupera le informazioni della partita dal chiamante, e successivamente estrae dal database il profilo dell’utente stesso(con il metodo OTTIENIPROFILO(…)). In base all’algoritmo da applicare, estrae dal profilo la stringa descrittiva dell’utente per l’algoritmo scelto, e poi applica l’algoritmo per generare la mossa da suggerire. 5.10 TEST Sono stati eseguiti test dinamici di funzionalità sia per la parte Server che per la parte Client. Per quanto riguarda i web service, per ogni operazione esposta è stato creato il relativo client Stub che chiama il servizio e ne testa la funzionalità passando direttamente i parametri opportuni e analizzando la risposta. I client Stub sono stati in parte usati per le chiamate dei servizi WSUtenti e WSGame a WSData, ma fanno parte comunque di pacchetti separati utilizzabili per ulteriori analisi. Non sono stati effettuati per problemi di tempo i test automatici con strumenti come JUnit. Per la parte Client i test si sono concentrati sull’uso delle interfacce e l’analisi dei log. E’ stato utilizzato lo strumento di emulazione di terminali Android (Android Virtual Device) fornito insieme all’SDK e richiamabile da Eclipse. 93 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica L’uso di due emulatori attivi in contemporanea ha permesso di testare efficacemente la simulazione di varie partite tra due utenti diversi. Inoltre, il vantaggioso ambiente di sviluppo ha permesso di seguire passo-passo ogni singola chiamata attraverso messaggi visibili nella console di debug. Si sono testate anche partite in single player contro l’Intelligenza Artificiale, e sono stati corretti i primi bug legati soprattutto all’interfaccia nel Client. I test di funzionalità non si possono definire conclusi: le molteplici soluzioni sviluppate portano alla luce una serie di problematiche software e hardware che vanno seguite con costanza. Nonostante questo, la realizzazione di un pacchetto client/server piuttosto stabile ha permesso di installare i web service in una macchina8 di testing, ospitata nei server del Dipartimento di Matematica, e configurata con Apache Tomcat 6 e MySQL 5.5. Il client a sua volta è stato distribuito ad un primo gruppo di utenti selezionati, che hanno testato il software su smartphone dotati di Android 2.3 e tablet dotati di Android 3.2, e hanno raccolto impressioni e bug in una mailing list9 comune. Per fornire loro un client sempre aggiornato con le ultime modifiche, si è scelto di esporre il pacchetto di installazione in un sito dedicato al progetto10, dove è possibile anche essere aggiornati sugli sviluppi e sulle informazioni generali dello stesso. Dopo un primo periodo di gioco, i dati raccolti nel database sono stati analizzati per determinare in modo tangibile l’efficacia degli algoritmi di learning e ranking applicati all’Intelligenza Artificiale. I dati si riferiscono allo studio di un campione di 30 partite, raccolte tra diversi utenti. I seguenti grafici espongono le percentuali di vittoria/sconfitta dell’Intelligenza Artificiale nelle partite analizzate, mostrando in percentuale, la quantità di partite vinte e perse rispetto al totale delle partite analizzate, e i relativi motivi di vittoria e sconfitta, sempre in percentuale. Performance Intelligenza Artificiale 56,7% 43,3% Vinte Perse Figura 5.14: Grafico performance Intelligenza Artificiale. Come si vede in Figura 5.14 l’Intelligenza Artificiale ha saputo tenere testa ai giocatori umani, arrivando per il 43% dei casi alla vittoria. Indirizzo Server di test: semenzato.math.unipd.it Mailing List: http://groups.google.com/group/geister-per-android 10 Sito del progetto: https://sites.google.com/site/geisterandroid/ 8 9 94 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica Analisi VITTORIA Intelligenza Artificiale 23,1% 23,1% ESCE DA CANCELLO MANGIA BLU AVVERSARI SI FA MANGIARE ROSSI 53,8% Figura 5.15: Grafico analisi vittoria Intelligenza Artificiale. Analisi SCONFITTA Intelligenza Artificiale 35,3% 64,7% AVVERSARIO ESCE DA CANCELLO MANGIA ROSSI AVVERSARI Figura 5.16: Grafico analisi sconfitta Intelligenza Artificiale. Nei due grafici precedenti vengono mostrati i motivi per cui l’Intelligenza Artificiale ha vinto (Figura 5.15) e perso (Figura 5.16): è possibile notare come le percentuali maggiori siano legate ad un atteggiamento dell’Intelligenza Artificiale volto a mangiare le pedine avversarie, sia in termini positivi che negativi. Nel tentativo di analizzare il comportamento dell’Intelligenza Artificiale nella fase di ranking, cioè nella fase di valutazione della bontà dei fantasmi avversari, si è proceduto con l’analisi delle singole mosse presenti in tutte le partite di un campione scelto. Per analizzare l’accuratezza nella valutazione dei pezzi, si è scelto un campione di partite di un singolo giocatore e si è proceduto alla simulazione di ogni singola mossa in ogni partita: è stato “chiesto” all’Intelligenza Artificiale di valutare ogni singola mossa, ripercorrendo passo-passo tutte le fasi della partita. Per ogni mossa, l’Intelligenza Artificiale ha estratto le informazioni riguardanti la bontà dei pezzi avversari residenti sul tavolo in quel momento. Ogni singola valutazione estratta è stata messa a confronto con le reali caratteristiche del pezzo in analisi, per scoprire se la valutazione fatta fosse corretta. Le partite sono state analizzate a gruppi di 5, 10, 15, 20, 25 e 30 alla volta. Per ogni gruppo sono state scelte n-1 partite per effettuare l’apprendimento e creare un profilo utente, grazie al quale si è provveduto ad analizzare l’n-esima partita (rimasta esclusa dal gruppo di apprendimento). Con questa strategia sono state testate a rotazione tutte le n partite del gruppo, e sono state prese le medie di 95 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica accuratezza nella valutazione dei pezzi buoni da parte dell’Intelligenza Artificiale. Il grafico in Figura 5.17 rispecchia l’andamento medio per ogni gruppo, esprimendo il tasso di errore nella valutazione dei pezzi (in numero di pezzi errati medio di una partita), rispetto al numero di partite usate per la creazione del profilo. Come si può vedere, aumentando il numero di partite nella fase di apprendimento e creazione del profilo (learning), si hanno meno errori nella valutazione della bontà dei singoli pezzi (ranking). 30,00 29,50 29,00 28,50 28,00 27,50 27,00 26,50 26,00 25,50 25,00 0 Errori valutazione pezzi buoni Grafico di accuratezza n° pezzi errati 5 10 15 20 25 30 n° partite usate 35 nella fase di learning Figura 5.17: Grafico accuratezza nella valutazione dell'IA della bontà dei pezzi avversari. La successiva analisi ha interessato la valutazione della resistenza al rumore presente nella gestione della fase di ranking. Sono state prese in considerazioni 30 partite di più giocatori, e valutate le singole mosse di ogni partita. A differenza dell’analisi precedente, qui il profilo era fisso per giocatore; ciò che invece variava era la quantità di rumore presente nella fase di ranking. Si è cercato di capire se l’applicazione del rumore nella valutazione dei pezzi potesse condizionarne la resa. Per fare questo, è stato ripetuta l’analisi in quattro casi diversi: - Profilo senza rumore: caso presunto ottimale, rumore assente e stima di bontà dei pezzi aderente alla bontà teorica prevista dall’algoritmo di ranking; Profilo con rumore medio: introduzione di un errore random di grado medio; Profilo con rumore massimo: introduzione di un errore random di grado massimo; Profilo assente: azzeramento totale delle informazioni del profilo. Simula la condizione iniziale di ogni giocatore, quando non ci sono partite presenti nel database e il profilo dell’utente non denota alcuna caratteristica emergente; in questo caso la bontà dei pezzi è una stima fortemente condizionata dalla casualità. L’analisi ha fatto emergere i risultati visibili nel grafico seguente. 96 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica n° pezzi errati Grafico resistenza al rumore 285 280 275 270 265 260 255 Profilo senza rumore Profilo con rumore medio Profilo con rumore massimo Profilo assente Figura 5.18: Grafico dell’errore medio nella valutazione di bontà dei pezzi avversari. Nel grafico in Figura 5.18 possiamo vedere l’errore medio di valutazione della bontà dei pezzi avversari (in numero di errori medio nel campione), suddiviso rispetto alle categorie sopra citate. E’ interessante notare come l’errore aumenti in maniera significativa all’aumentare del rumore applicato agli algoritmi di valutazione. L’ultima colonna, rispecchiante la valutazione senza profilo applicato, esprime la condizione di ingresso standard per tutti gli utenti, e risulta essere la peggiore in termini di efficacia. 97 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica 98 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica Capitolo 6. CONCLUSIONI In questo capitolo verranno illustrate le conclusioni del progetto, le impressioni personali e gli sviluppi futuri. 6.1 CONSIDERAZIONI PERSONALI Ho affrontato il progetto con entusiasmo sin dalle sue fasi iniziali. La sfida rappresentata dall’uso di strumenti per me assolutamente nuovi, come web service e Android, in un contesto di piattaforma per il gioco, mi ha coinvolto da subito. Il progetto ha offerto la possibilità di mettermi alla prova in un ambiente in cui non avevo esperienza, forzandomi a dare il massimo per raggiungere il risultato prefissato con i tempi stabili. Questa alchimia di variabili è stata la molla per affrontare intensamente il periodo di stage. Il lavoro si è articolato con una grossa fase di studio iniziale, indispensabile per mettere insieme le conoscenze e affinare gli strumenti per un buon prosieguo. L’analisi della complessa implementazione dei web service è andata a rilento. L’impressione che ho avuto è stata quella di studiare un campo ancora aperto a continui sviluppi: è capitato infatti di porre le basi per l’uso di strumenti che poi si sono rivelati già vecchi o abbandonati (Axis 1.x). I web service sono largamente usati, ma le continue modifiche e la frammentazione delle soluzioni proposte dalle varie aziende non facilitano lo studio dei concetti base. Nonostante questo devo dire che i pacchetti utilizzati si sono comportati secondo le aspettative, e gli errori fatti si possono inquadrare in un normale iter di apprendimento. Oggi mi sento più formato su questo campo e la cosa decisamente positiva è che confermerei le scelte fatte a inizio stage, quando il quadro della situazione non era ancora completo. Per quanto riguarda la scelta del client è stata per me una fonte di divertimento e di soddisfazione lavorare con Android e il suo SDK. Devo dire che ho apprezzato fin da subito la logica di lavoro e le librerie messe a disposizione. Tutto è andato per il meglio e l’ambiente integrato in Eclipse offre un strumento di sviluppo potente, ma facile da gestire. Il punto dolente riguarda la tempistica non ben distribuita: avendo investito più tempo nello studio e nell’implementazione dei web service, che comunque giustifico perché si tratta pur sempre del cuore del sistema, l’implementazione del client è stata forse un po’ frettolosa. Il client è migliorabile anche sotto il profilo grafico. Non mi sono trovato del tutto a mio agio con la creazione dei layout, anche se apprezzo molto che la costruzione degli stessi sia stata pensata con file XML. Per quanto concerne il riuso di codice proveniente dai lavori precedenti, mi sono trovato in difficoltà da subito. I lavori svolti sono stati eccellenti sotto tanti profili, ma l’interpretazione del codice scritto e lo studio dei pacchetti richiedeva una profondità di studio e di tempo che non avevo a disposizione. Ho deciso quindi di recuperare la logica di gioco, sposandone spesso la filosofia, ma magari riscrivendo il codice adattato per la piattaforma di gioco che stavo costruendo. A volte il tentativo di riuso si è rivelato semplicemente impossibile: la logica fortemente client/server di questo lavoro mi ha costretto a separare le chiamate e a dividere gli oggetti, che nel contesto precedente usufruivano di relazioni del tutto differenti. Ho 99 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica comunque fatto tesoro del lavoro dei colleghi, e ne ho approfittato ampiamente nella gestione dell’Intelligenza Artificiale, che altrimenti sarebbe stata impossibile da implementare, vista la vastità e la complessità degli algoritmi esposti. A conclusione di tutto posso dire di essere soddisfatto, ma ritengo questo lavoro ancora migliorabile e tuttora in fase di sviluppo. Quello che per me è fondamentale è aver gettato le basi per una piattaforma che possa essere specializzata in ogni sua parte in maniera autonoma, senza dover interferire troppo tra client e server o tra servizio e servizio. 6.2 SVILUPPI FUTURI Il progetto si trova in una fase abbastanza avanzata. Ciò nonostante, sono sorte in corso d’opera delle nuove problematiche che potrebbero permettere un futuro sviluppo dell’applicazione. L’obiettivo primario è dare continuità al progetto, usando le basi poste in questa fase per mettere in produzione una struttura stabile ed efficace. Per quanto riguarda gli strumenti creati, le potenzialità di sviluppo sono molteplici: - I web service sono completi, ma ne andranno testate le funzionalità nella piattaforma di test installata per l’occasione; Per la parte client, in ottica di mettere a disposizione un prodotto stabile e funzionante, e per questo accattivante, sarà necessario completare i test di funzionalità del pacchetto, gestire eventuali eccezioni, aumentare i feedback all’utente e migliorare la giocabilità. Inoltre, come si vedrà dal piano di lavoro, alcuni obiettivi sono stati trascurati. Bisognerà vedere se integrarli in questa prima fase, o se andare in testing con un prototipo stabile e inserire eventuali altre funzionalità in una seconda riprogettazione, seguendo il modello incrementale come ciclo di vita del software. Gli sviluppi futuri veramente auspicabili riguardano l’Intelligenza Artificiale. Come già detto, l’entrata a regime dell’attuale progetto coinciderà con l’inizio di una nuova fase, atta a implementare nuovi algoritmi di Intelligenza Artificiale a partire dalle partite svolte. In questo scenario, bisognerà dar seguito alle eventuali modifiche da apportare alla struttura server per accogliere i nuovi modelli di learning e di ranking. Ulteriori sviluppi possono coinvolgere la parte sociale del gioco, inserendo metodi di login ausiliari e più diffusi (utilizzando le login di social network come Facebook o Twitter), e creando nuovi obiettivi di sfida (classifiche generali, punti premio, diverse Intelligenze Artificiali a diversi livelli di difficoltà, ecc.). 100 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica Capitolo 7. PIANO DI LAVORO A conclusione dell’attività svolta, si va ora ad analizzare e valutare la distribuzione dell’orario nelle fasi di lavorazione: verranno evidenziate le principali di differenze riscontrate tra i risultati finali ottenuti e le aspettative iniziali. Vediamo in tabella un riepilogo dell’attività svolta: Attività Ricerca tecnologie utilizzabili Studio iniziale e apprendimento piattaforma web service Studio iniziale e apprendimento piattaforma Android Analisi dei requisiti Studio contesto e individuazione funzionalità da realizzare Progettazione e Realizzazione del Server Progettazione del database Progettazione del servizio Utenti Progettazione del servizio Dati Progettazione del servizio Gioco Realizzazione del database Realizzazione del servizio Utenti Realizzazione del servizio Dati Realizzazione del servizio Gioco Progettazione e Realizzazione del Client Progettazione finestre di gioco e grafica Progettazione eventi di chiamata ai servizi Progettazione logica di gioco lato client Realizzazione finestre di gioco e grafica Realizzazione eventi di chiamata ai servizi Realizzazione logica di gioco lato client Verifica e testing Documentazione aggiuntiva (client e documentazione ai servizi) Totale Ore preventivate Ore effettuate 30 30 40 30 20 20 10 10 10 20 10 20 20 30 10 15 15 25 8 20 20 30 10 10 10 10 5 10 25 30 320 10 10 8 8 5 8 20 25 327 Come evidenziato dal rendiconto in tabella, l’orario totale di lavoro effettivamente svolto è stato pressoché in linea con quanto preventivato, fatto salvo per una differenza di 7 ore in più. Ciò che invece è stato modificato è il bilanciamento delle fasi interne: la fase di analisi e sviluppo dei web service ha tolto risorse alle altre fasi, riducendo in maniera significativa la fase finale di test e produzione di documentazione, e coinvolgendo parzialmente anche lo sviluppo del client. Vediamo con il grafico in Figura 7.1 lo sbilanciamento delle varie fasi: 101 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica Distribuzione fasi Ore preventivate Ore effettuate 350 300 250 200 150 100 50 0 Figura 7.1: Grafico distribuzione delle fasi. 102 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica La parte conclusiva riporta l’elenco dei requisiti, evidenziando con una diversa colorazione i requisiti soddisfatti (colore verde – targhetta OK), parzialmente soddisfatti(arancio– targhetta ok) o disattesi (colore rosso – targhetta KO). Obbligatori Ob01Ob02Ob03Ob04Ob05Ob06Ob07Ob08Ob09Ob10Ob11- OK - Studio dei servizi da esporre come web service (server); OK - Creazione di un client sviluppato per ambiente Android (client); OK - Raccolta dati relativi ad utenti, partite e log in database (server); OK - Gestione logica di gioco server e risposta alle richieste di mossa del client (client/server); OK - Visualizzare schermata di presentazione all’avvio della partita (client); OK - Possibilità di login o creazione nuovo utente (client/server); OK - Possibilità di sfidare gli amici (client); OK - Mascheramento dei fantasmi avversari durante il match (client); OK - Visualizzazione delle mosse permesse per il fantasma scelto (client); OK - Visualizzazione dei fantasmi mangiati e relativo tipo (client); OK - Presenza del manuale per spiegare il funzionamento del gioco (client); Desiderabili De01De02De03De04- OK - Presenza di una breve sezione di credits con storia e sviluppi del gioco (client); OK - Possibilità di scelta dell’avversario tra umano e IA (client); OK - Possibilità di sfidare qualsiasi utente connesso (client); ok - Presenza di una pagina profilo con amici e statistiche (client); Opzionali Op01- KO - Possibilità di richiedere pareggio all’avversario (client); Op02- OK - Possibilità di accettare o rifiutare sfida (client); Op03- OK - Gestione di opportuni time-out per la chiusura della mossa o della partita (client/server); Op04- KO - Suggerimenti di gioco per utente umano da IA (client/server); Op05- OK - Visualizzazione di un indicatore di attesa mossa dell’avversario (client); Op06- KO - Visualizzazione del countdown del timer per la mossa (client); Op07- ok - Visualizzazione a fine partita di una schermata riassuntiva dei risultati (client); Op08- ok - Studio di una strategia di incentivo al gioco (client/server); Op09- KO - Creazione di un client con linguaggio a scelta, ma diverso da Android (client); Concludendo, il lavoro svolto è stato ridistribuito nelle sue fasi interne, ma ha prodotto i risultati attesi nei tempi richiesti. 103 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica 104 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica Capitolo 8. GLOSSARIO API Application Programming Interface API (Interfaccia di Programmazione di un'Applicazione) si indica ogni insieme di procedure disponibili al programmatore, di solito raggruppate a formare un set di strumenti specifici per l'espletamento di un determinato compito all'interno di un certo programma. HTTP HyperText Transfer Protocol (HTTP) (protocollo di trasferimento di un ipertesto) è usato come principale sistema per la trasmissione d'informazioni sul web. Le specifiche del protocollo sono gestite dal World Wide Web Consortium (W3C). Un Server HTTP generalmente resta in ascolto sulla porta 80 usando il protocollo TCP. JDBC (Java DataBase Connectivity)[1], è un connettore per database che consente l'accesso alle basi di dati da qualsiasi programma scritto con il linguaggio di programmazione Java, indipendentemente dal tipo di DBMS utilizzato. È costituita da una API, raggruppata nel package java.sql, che serve ai client per connettersi a un database. Fornisce metodi per interrogare e modificare i dati. È orientata ai database relazionali ed è Object Oriented. La piattaforma Java 2 Standard Edition contiene le API JDBC, insieme all'implementazione di un bridge JDBC-ODBC, che permette di connettersi a database relazionali che supportino ODBC. Questo driver è in codice nativo e non in Java. MIDDLEWARE Con il termine inglese middleware si intende un insieme di programmi informatici che fungono da intermediari tra diverse applicazioni e componenti software. Sono spesso utilizzati come supporto per sistemi distribuiti complessi. OASIS Organizzazione per lo sviluppo di standard sull'informazione strutturata. http://www.oasis-open.org/ PLUGIN Il plugin in campo informatico, è un programma non autonomo che interagisce con un altro programma per ampliarne le funzioni. La capacità di un software di supportare i plugin è generalmente un'ottima caratteristica, perché rende possibile l'ampliamento e la personalizzazione delle sue funzioni da parte di terzi, in maniera relativamente semplice e veloce. POLLING In ambito informatico il termine Polling viene utilizzato per riferirsi a quella richiesta, che viene fatta in un intervallo di tempo periodico, riguardante la disponibilità o la variazione di un componente con l'obiettivo di fare in modo che ci possa essere una eventuale interazione con lo stesso, in un momento successivo. In generale, questo termine è utilizzato come una metafora per la descrizione dell'azione di colui che tenta di mettersi in contatto in maniera ciclica con una entità per capire se è disponibile. 105 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica RDBMS Il termine Relational database management system (RDBMS) (sistema per la gestione di basi di dati relazionali) indica un database management system basato sul modello relazionale. SOA Nell'ambito dell'informatica, con la locuzione inglese di Service-Oriented Architecture (SOA) si indica generalmente un'architettura software adatta a supportare l'uso di servizi Web per garantire l'interoperabilità tra diversi sistemi così da consentire l'utilizzo delle singole applicazioni come componenti del processo di business e soddisfare le richieste degli utenti in modo integrato e trasparente. SOAP SOAP (inizialmente acronimo di Simple Object Access Protocol) è un protocollo leggero per lo scambio di messaggi tra componenti software, tipicamente nella forma di componentistica software. La parola object manifesta che l'uso del protocollo dovrebbe effettuarsi secondo il paradigma della programmazione orientata agli oggetti. SOAP è la struttura operativa (framework) estensibile e decentralizzata che può operare sopra varie pile protocollari per reti di computer. I richiami di procedure remote possono essere modellizzati come interazione di parecchi messaggi SOAP. SOAP dunque è uno dei protocolli che abilitano i servizi Web. SOCKET In informatica, nei sistemi operativi moderni, con il termine socket si indica un'astrazione software progettata per poter utilizzare delle API standard e condivise per la trasmissione e la ricezione di dati attraverso una rete oppure come meccanismo di IPC. È il punto in cui il codice applicativo di un processo accede al canale di comunicazione per mezzo di una porta, ottenendo una comunicazione tra processi che lavorano su due macchine fisicamente separate. Dal punto di vista di un programmatore un socket è un particolare oggetto sul quale leggere e scrivere i dati da trasmettere o ricevere. STORED PROCEDURE Una stored procedure è un programma scritto in SQL od in altri linguaggi, mantenuto nel database stesso, archiviato nel cosiddetto database data dictionary. Spesso è scritta in versioni proprietarie di SQL, che sono dei veri e propri linguaggi strutturati, come il PL/pgSQL di PostgreSQL o il PL/SQL di Oracle, all'interno dei quali è possibile scrivere codice SQL. TCP/IP In informatica e telecomunicazioni la suite di protocolli Internet è un insieme di protocolli di rete su cui si basa il funzionamento della rete Internet. A volte, per sineddoche, è chiamata suite di protocolli TCP/IP, in funzione dei due più importanti protocolli in essa definiti: il Transmission Control Protocol (TCP) e l'Internet Protocol (IP). UDDI L'UDDI (acronimo di Universal Description Discovery and Integration) è un registry (ovvero una base dati ordinata ed indicizzata), basato su XML ed indipendente dalla piattaforma hardware, che permette alle aziende la pubblicazione dei propri dati e dei servizi offerti su internet. UDDI, un'iniziativa 106 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica "open" sviluppata tra il 1999 ed il 2000 e sponsorizzata dall'Organization for the Advancement of Structured Information Standards (consorzio internazionale per lo sviluppo e l'adozione di standard nel campo dell'e-business e dei web service spesso indicato anche come OASIS), permette la scoperta e l'interrogazione dei servizi offerti sul web, delle aziende che li offrono e della maniera per usufruirne. URI (URN - URL) Un URL (Uniform Resource Locator) è un URI che, oltre a identificare una risorsa, fornisce mezzi per agire su o per ottenere una rappresentazione della risorsa descrivendo il suo meccanismo di accesso primario o la sua "ubicazione" ("location") in una rete. Per esempio, l'URL http://www.unipd.it/ è un URI che identifica una risorsa (l'home page di Unipd) e lascia intendere che una rappresentazione di tale risorsa (il codice HTML della versione corrente di tale home page) è ottenibile via HTTP da un host di rete chiamato www.unipd.it. Un URN (Uniform Resource Name) è un URI che identifica una risorsa mediante un "nome" in un particolare dominio di nomi ("namespace"). WSDL Il Web Services Description Language (WSDL) è un linguaggio formale in formato XML utilizzato per la creazione di "documenti" per la descrizione di web service. XML XML (sigla di eXtensible Markup Language) è un metalinguaggio di markup, ovvero un linguaggio marcatore che definisce un meccanismo sintattico che consente di estendere o controllare il significato di altri linguaggi marcatori. XML-SCHEMA L'XML Schema o Schema XML è l'unico linguaggio di descrizione del contenuto di un file XML che abbia per ora raggiunto la validazione (la 1.1) ufficiale del W3C. Come tutti i linguaggi di descrizione del contenuto XML, il suo scopo è delineare quali elementi sono permessi, quali tipi di dati sono ad essi associati e quale relazione gerarchica hanno fra loro gli elementi contenuti in un file XML. Ciò permette principalmente la convalida del file XML, ovvero la verifica che i suoi elementi siano in accordo con la descrizione in linguaggio XML Schema. 107 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica 108 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica Capitolo 9. BIBLIOGRAFIA 9.1 LIBRI Concetti di informatica e fondamenti di Java 2 – Cay S. Horstmann – Apogeo Developing Web Services with Apache CXF and Axis2 - Kent Ka Iok Tong – TipTec Development Android Programming – PuntoInformatico – Edizioni Master 9.2 SITI Homepage ufficiale Java http://www.java.com Riferimento italiano per guide e articoli http://www.html.it Articolo sull’uso di Dalvik http://www.redsend.org/2011/05/04/android-dalvik-virtual-machine/ Uso di KSOAP2 in Android http://people.unica.it/bart/2010/12/03/ksoap2-patch-for-user-defined-objects-andarrays/ Homepage progetto KSOAP2 http://code.google.com/p/ksoap2-android/ Articolo sull’uso di AXIS2 http://www.adriani.altervista.org/author/stuff/05_AXIS2_quick_start.pdf Articolo su hashing della password e relativo passaggio in rete http://phpsec.org/articles/2005/password-hashing.html Breve articolo sull’uso di web service stateless http://programmazione.html.it/guide/lezione/5241/stateless-autodefinizione-ecollegamenti-tra-risorse/ Slides e materiale su web service, approfondimenti su linguaggi e rete http://www.dis.uniroma1.it/~degiacom/ Slide introduttive ai web service http://www.slideshare.net/AndrewRiot/lezione-8-introduzione-ai-web-service 109 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica Articolo illustrativo su web service http://java.html.it/articoli/leggi/3017/tomcat-web-server-o-application-server Tutorial per l’utilizzo di Axis2 per la generazione di web service http://www.eclipse.org/webtools/community/tutorials/BottomUpAxis2WebService/bu_tut orial.html http://www.eclipse.org/webtools/jst/components/ws/1.5/tutorials/TopDownWebService /TopDownWebService.html Articolo sull’analisi architetturale di SOAP http://www.devx.com/java/Article/30459/1954 Articolo sull’approccio ai thread e alle GUI in Android http://www.simplesoft.it/android/gestire-thread-e-gui-nelle-applicazioni-android.html Vari link a comunità di sviluppo per Android http://androidforums.com http://www.anddev.it http://www.simplesoft.it/android 110 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica Capitolo 10. RINGRAZIAMENTI Il giorno in cui decisi di iscrivermi all’Università ero consapevole di affrontare un’avventura molto importante per la mia crescita. Si trattava di un ambizioso progetto di vita, le cui sorti dipendevano dalle mie capacità e i cui risultati avrebbero richiesto molto tempo e molta fatica. Mi sono sempre imposto una certa disciplina, impegnandomi un passo alla volta, a testa bassa, senza cedere, mettendo tutte le ore libere a disposizione per lo studio. Ho scoperto di potercela fare, ho dovuto credere di potercela fare, per andare oltre gli ostacoli e le paure, per lavorare sui miei limiti, e spostarli ogni volta un po’ più in là. A volte ho fantasticato sulla metafora della scalata, sulle fatiche di andare un passo alla volta verso la vetta, sorretto dalla voglia di vedere cosa il mondo mi offrirà una volta arrivato in cima. A differenza di uno scalatore però, io non sono mai stato solo. Il mio grazie va a chi mi ha accompagnato, a chi mi ha sorretto, a chi mi spronato, a chi mi ha sfidato, a chi non mi ha abbandonato. L’elenco dei miei grazie è infinito e poche parole non bastano a far capire quanto il mio sentimento sia vivo e ricolmo di amore incondizionato. Grazie con tutto il cuore a mamma e papà, sono un figlio fortunato. Ho avuto così tanto amore da loro che posso solo piangere di gioia mentre penso a quando siano stati genitori presenti e fantastici. Spero con queste parole di potervi restituire un po’ del mio infinito debito con voi. Sarete per sempre il mio modello di riferimento, le mie guide perfette, la mia Semenzlandia. Grazie a Niala, per essere la sorella adorabile che è. Sarà sicuramente perplessa nel leggere come io possa scrivere delle smancerie del genere, ma io so che dentro di lei batte un cuore dolcissimo e questo mi rende un fratello orgoglioso, pieno di miele e cuoricini. A lei devo aiuto e solidarietà, commenti acidi e pedate a cena. A lei devo soprattutto un abbraccio fortissimo. Grazie a Martina. Il significato della parola Amore ha per me preso forma grazie a lei. Vivo con la gioia immensa di poter costruire con lei ogni singolo istante. Sento il bisogno di essere lieve per non rovinare un sentimento molto forte, che non saprò mai spiegare a parole. Martina è il mio sole, è la mia roccia, è l’aria che respiro, la poesia nel mio cuore. Ogni giorno in più con lei, è un giorno per cui dire grazie. Grazie a Claire, cugina ormai scienziata a tutti gli effetti, pazzia compresa. Solo chi ha avuto il piacere di condividere l’avventura universitaria come abbiamo fatto noi, può capire il peso di ogni singolo ringraziamento, cosicché tutti gli sforzi vengano ricompensati alla fine, in un abbraccio rotante che ci faccia volare nell’Olimpo di chi alla fine ci è riuscito. Ti voglio bene. Un bacio anche al cuginone Diego… no vabbè dai, può bastare un abbraccio. E’ strano doverti ringraziare come cugino, quando la vita ci ha fatto crescere come fratelli. Grazie per i Lego, per le macchinette, per i giochi e le avventure. Grazie per avermi reso cugi-zio del piccolo Davide, e grazie a Margherita per aver compiuto il miracolo di fargli mettere la giacca. Un bacio enorme a nonna Imelda e nonno Bruno, spero di avervi fatto un regalo, spero di avervi resi orgogliosi di me. Non ci saranno mai dottori al mondo capaci di insegnare qualcosa a voi. Voi siete dottori da sempre, e il fatto che non ve ne rendiate conto, ne è la prova finale. Avrei voluto poter dire le stesse cose anche a nonna Adriana e nonno Livio, i miei secondi genitori. In qualche modo vorrei che queste parole arrivassero anche a loro, e so che così sarà. Un abbraccio fortissimo agli zii Paolo e Arianna, Sabrina e Alberto, Luca e Anna, Massimo e Patrizia: siete stati sempre con me, in qualunque contesto. Vi accumuna un incondizionato tifo nei miei confronti, mi avete spronato ad andare avanti e siete stati sempre presenti, la mia curva sud. Vi adoro. Un grazie anche ai cuginetti che ormai toccano il soffitto, Elia, Gioele e Giacomo. Non capirò mai perché fino a ieri vi tenevo in braccio e adesso potrebbe 111 Luca Semenzato Anno Accademico 2011/2012 Tesi di Laurea in Informatica benissimo accadere il contrario, ma tant’è… grazie per la compagnia e le partite a qualsiasi cosa. Ringrazio i miei amici di sempre, gli amici che non mi hanno abbandonato mai, neanche quando sentivo di non poter dare loro tutto quello che avrei voluto. Loro sono sempre stati lì, sempre in contatto nonostante la distanza: grazie ad Antonio per essere il fratello che non ho, la nostra capacità di essere amici telepatici mi sorprende sempre, gli devo molte esperienze e risate, gli sono debitore praticamente di tutti i momenti divertenti della mia vita; grazie a Davide per aver condiviso con me i pensieri più intimi, per essere stato spesso la mia coscienza inconsapevole, per avermi ascoltato, per avere discusso con me della vita e tutto il resto, per avermi mostrato la vera Arte, per essere presente ancora, nonostante le nostre vite procedano in luoghi diversi. Grazie al Fante, per avermi reso meno amaro il periodo scolastico, grazie perché sei inimitabile, grazie per la tua vitalità, per l’allegria di tante avventure insieme, per riuscire a scrollarmi di dosso la mia aria da musone pensieroso. Grazie per le feste, le grigliate, il sano divertimento neanche poi così tanto sano. Grazie per non aver mai mollato nell’invitarmi a mille eventi. Prima o poi saprò sdebitarmi. Grazie a Camilla per avergli fatto mettere la testa al posto giusto e per averlo reso papà, cosa su cui tutti non avremmo scommesso un euro! W il piccolo Tommy!!! Un grazie collettivo anche a tutti quegli amici incontrati nel corso di questi anni, non siete meno importanti, nessuno lo è, ma dovrei scrivere troppo, e comunque troppo poco: grazie a Fabio, Niccolò, Samuele, Andrea Cif, Andrea F., Carlo per aver condiviso lo studio con me, per gli appunti, per gli esercizi, le dritte, i libri, per la vostra infinita pazienza nell’aiutarmi. Siete stati generosi oltre il ripagabile. Grazie a Benny e Cate, ad Ale e Francesca, a Mattia, a Giorgia e Giuseppe: la vostra compagnia mi ha reso meno difficile il cammino, siete stati amici di mille serate importanti. Grazie a Paola, Annalisa e Paolo perché la Nutella è speciale, ma in vostra compagnia si gusta decisamente meglio. Grazie a tutti i ragazzi del volley: mi avete regalato la gioia del gioco, donandomi momenti di puro spettacolo; non sarò mai Giba, ma con voi tutto è possibile! Un ringraziamento va a tutti i miei colleghi, lontani e vicini, Tigran, Sara, Denis, Diego, Giuseppe, Mauro, Massimiliano, Stefano, Jacopo, Pietro: lavorare con voi è prima di tutto un piacere, e poi un onore. Siete stati sempre presenti, amici prima che colleghi, comprensivi e preparati; un pezzo di questa avventura vi appartiene. Un ringraziamento particolare a Sandro: quando anni fa hai scelto di darmi l’occasione di entrare nel vostro gruppo, hai dato il via a tutto questo, facendomi lavorare in ottime condizioni e permettendomi di portare avanti lavoro e studio insieme, un privilegio di cui ti sono debitore. Grazie anche a Giuliano, Marco, Mario, Maria Grazia, Ilaria, Marta, Veronica, Francesca, Matteo, Michele, Alberto: la vostra amicizia mi onora, siete persone eccezionali e non fate mai pesare la vostra enorme preparazione. L’ultimo ringraziamento va ad un amico speciale, inarrivabile nella sua bontà, insostituibile cane di pezza, sempre con me in tutti gli anni di studio, e comunque presente in ognuno di noi: questa laurea è per Brit. Sono in cima. Da qui vedo un paesaggio stupendo. Mi lascio andare un attimo al tenero abbraccio della vittoria. Della mia vittoria. In fondo, oltre il versante che non potevo vedere, altre cime ben più alte mi attendono, ma per un attimo volgo lo sguardo altrove, smetto di preoccuparmi, e alzo le mani al cielo. Per un momento. Solo per un momento. Oggi. Sono invincibile. Grazie. Luca 112