Regole e Gruppi

Gli elaborati possono essere svolti singolarmente o in gruppi di 2 persone. Gruppi più ampi non sono possibili. E' previsto che lo stesso gruppo lavori sia sul progetto in Java che su quello in PHP.

L'esame si svolgerà in ogni caso singolarmente. I componenti di un gruppo possono sostenere l'esame in sessioni diverse, ma è necessario che il gruppo venga preventivamente registrato (contattare il docente).

Ciascun gruppo, completati gli elaborati dovrà preparare una breve relazione che commenti il lavoro svolto. Per quanto rigurda l'elaborato Java, è sufficiente la documentazione Javadoc prodotta automaticamente.

Il codice DEVE essere opportunamente indentato e commentato.

Comunicazioni riguardanti le consegne e l'esame avverranno anche mediante posta elettronica e pubblicazione di avvisi sulla pagina comunicazioni.htm.

Tracce elaborati Java

CONSIDERAZIONI GENERALI

Rudimentale Client POP3

POP3 (Post Office Protocol - Version 3) è il protocollo comunemente utilizzato da molti internet provider per fornire agli utenti una casella di posta in arrivo. Il progetto consiste nel preparare un semplice client che permetta all'utente di leggere i propri messaggi di posta ed eventualmente scaricarli in files locali . Il progetto, oltre a permettere di approfondire minimamente l'utilizzo dei socket in Java, permette l'approfondimento di un protocollo molto diffuso.

Per prima cosa è necessario leggere la parte introduttiva delle specifiche del protocollo: rfc1939. Inoltre è meglio esercitarsi utilizzando il programma telnet da linea di comando. Esempio di sessione:

C:\>telnet mailserver.dti.unimi.it 110
+OK CommuniGate Pro POP3 Server 4.0.6 ready &kt;219733.1103287239@dti.unimi.it>
USER sassi
+OK please send the PASS
PASS *******************
+OK 2 messages (15879 bytes)
LIST
+OK 2 messages
1 8443
2 7436
.
STAT
+OK 2 15879
RETR 1
+OK 8443 bytes will follow
Return-Path: <sassi@dti.unimi.it>
Received: from [159.149.71.47] (HELO DONDOLO)
  by dti.unimi.it (CommuniGate Pro SMTP 4.0.6)
  with SMTP id 1474511 for sassi@dti.unimi.it; Fri, 17 Dec 2004 13:39:39 +0100
Message-ID: <055001c4e433$cb2681e0$f4451897@DONDOLO>
...
...
DELE 1
+OK marked deleted
DELE 2
+OK marked deleted
RETR 3
-ERR no such message
QUIT
+OK CommuniGate Pro POP3 Server connection closed
C:\>

I comandi POP3 che possono tornarvi utili sono:

USER
PASS
STAT
LIST
RETR
DELE
NOOP
RSET
QUIT

Il programma, deve leggere dal file di configurazione "RCconf.ini" il nome del server da contattare, username e password (fare il login utilizzando i comandi USER e PASS). Potete utilizzare un qualunque server POP3 dove abbiate un account (Libero, Tin, ...); alternativamente, il server POP3 della vostra casella email all'università va benone (ganimede.crema.unimi.it).

Una volta stabilita la connessione, il programma deve presentare all'utente una lista dei messaggi (potete utilizzare i comandi LIST e STAT, metterne gli output in una stringa e quindi offire all'utente le infomazioni ottenute opportunamente formattate). Per ciascun messaggio deve presentare il numero progressivo, il mittente, il soggetto e la dimensione in Kbytes. L'utente a questo punto può fare alcune cose (è di fatto un interprete di comandi):

  1. uscire dal programma: (dovete chiudere la connessione al server con il comando QUIT e quindi, una volta ottenuta conferma, uscire dal programma)
  2. leggere un messaggio: (utilizzare il comando RETR, il messaggio deve essere ben presentato. Non basta fare l'echo a monitor della risposta del server POP3)
  3. salvare un intero messaggio su file: (utilizzare RETR)
  4. segnare per la cancellazione un messaggio: (chiedere sempre conferma all'utente. Utilizzare il comando DELE)
  5. togliere il segno di cancellazione dai messaggi: utilizzare RSET).

In ogni caso, il programma deve sempre verificare la risposta del server (+OK o -ERR) e agire di conseguenza.

Il progetto può sembrare complesso, ma è solamente inusuale. La connessione con il server POP3 si ottiene attraverso la classe Socket contenuta nel pacchetto java.net, che quindi va importato all'inizio del programma.

import java.net.*;

Nel vostro programma, dovete istanziare un oggetto Socket e connetterlo al server POP3 sulla porta standard (110) semplicemente con:

webSocket = new Socket(nomeServer, 110);

dove nomeServer è semplicemente una stringa con l'indirizzo IP del server. La connessione potrebbe non riuscire; dovete preparvi a gestire le eccezioni sollevate. All'oggetto Socket sono connessi due Socket binari. E' possibile accedere ai due streams con i metodi getOutputStream() e getInputStream(). E' sempre conveniente "incartare" i due streams in modo da poterli manipolare più facilmente, come mostrato nell'esempio seguente:

webOut = new PrintWriter(webSocket.getOutputStream(), true);
webIn = new BufferedReader(new InputStreamReader(webSocket.getInputStream()));

Da questo punto in poi, lavorare sui due streams è pressoché identico a quanto visto per i files: potete scrivere sullo stream di uscita (cioè inviare comandi al server POP3) con il metodo print() e leggere da quello di ingresso (la risposta del server POP3) con il metodo realLine().

Prima di iniziare questo progetto:

Forza 4

Forza 4 è un gioco in cui due giocatori infilano a turno pedine colorate in una scacchiera verticale di 7 colonne per 6 righe:

 /---------------------------\
6|   |   |   |   |   |   |   |
 |---|---|---|---|---|---|---|
5|   |   |   |   |   |   |   |
 |---|---|---|---|---|---|---|
4|   |   |   |   | # |   |   |
 |---|---|---|---|---|---|---|
3|   |   |   | # | o |   |   |
 |---|---|---|---|---|---|---|
2|   |   | # | # | o |   |   |
 |---|---|---|---|---|---|---|
1|   | # | o | # | o | o |   |
 \---------------------------/
   A   B   C   D   E   F   G

Ciascun giocatore ha a disposizione 21 pedine e vince il giocatore che per primo ne riesce ad allineare 4 (in orizzontale, verticale o nella direzione diagonale). Le pedine vengono infilate dall'alto e cadono nella prima posizione libera. L'elaborato consiste nel preparare un programma in Java che permetta di giocare a forza 4 contro il computer (sembra difficile ma non lo è).

Il programma deve iniziare chiedendo all'utente se vuole iniziare per primo. L'utente specifica la mossa indicando la colonna in cui vuole lasciare cadere la pedina (il programma calcolerà la riga opportuna).

Dopo ogni mossa dell'utente il programma stampa la scacchiera, quindi decide la mossa del computer e ristampa la saccchiera con aggiunta la nuova pedina. La mossa del computer (la colonna) viene indicata sotto la scacchiera.

La logica secondo la quale il computer sceglie la mossa è la parte centrale del programma. Per quanto riguarda l'elaborato le regole da implementare sono:

  1. quando il computer apre la partita, sceglie la colonna centrale (d) con probabilità 0.5;
  2. il programma deve evitare, per quanto possibile, che l'avversario allinei 4 pedine (strategia di difesa);
  3. preferisce le colonne centrali a quelle laterali (strategia posizionale)
  4. prima di fare una mossa, prende in considerazione tutte le possibili mosse dell'avversario e decide di conseguenza (strategia d'attacco a 2 livelli).

Una schermata tipo deve essere simile a:

Pedine nella scacchiera: 5

'o'=umano;        '#'=computer

 /---------------------------\
6|   |   |   |   |   |   |   |
 |---|---|---|---|---|---|---|
5|   |   |   |   |   |   |   |
 |---|---|---|---|---|---|---|
4|   |   |   |   |   |   |   |
 |---|---|---|---|---|---|---|
3|   |   |   |   |   |   |   |
 |---|---|---|---|---|---|---|
2|   |   |   | o |   |   |   |
 |---|---|---|---|---|---|---|
1|   | # | # | # | o |   |   |
 \---------------------------/
   A   B   C   D   E   F   G

Ho messo la mia pedina nella colonna B

Umano, in quale colonna muovi? _

Dopo ogni mossa il programma deve verificare se uno dei due contendenti ha vinto (ci sono nella scacchiera 4 pedine allineate), nel qual caso lo indica sotto la scacchiera. Può accadere che i due contendenti arrivino ad una patta (la scacchiera è piena e nessuno ha vinto); anche questa eventualità va evidenziata sotto la scacchiera.

Oltre alle regole indicate potete implemetare quelle che ritenete opportune (contribuirà solo per il 30 e Lode).

La regola numero 4 implica che il programma verifichi ogni possibile mossa umana a fronte di una qualsiasi mossa del camputer. Cioè esplori tutte le combinazioni (che sono al più 49) "mossa computer" + "mossa umano".
Al termine di ogni coppia di mosse il computer avrà allineato num'#' pedine, mentre l'umano num'o'.
Per il computer, una possibile strategia è quella di scegliere la mossa che, rispettando le altre regole, massimizzi la differenza num'#'-num'o' (a patto che num'o' sia diverso da 4).

Prima di iniziare questo progetto:

Tracce elaborati PHP

Ai fini della valutazione verranno considerate la semplicità e la chiarezza del codice sviluppato per risolvere il problema. Parzioni di codice che implementino inutili complicazioni tolgono punti. Al contrario, eventuali integrazioni a quanto richiesto, quando concordate con il docente saranno valutate positivamente.

Per l'esame è necessario accompagnare il progetto con una breve relazione che spieghi sinteticamente le scelte fatte e la struttura del codice. E' importante essere sintetici (max 1 o 2 pagine).

Sito per i sondaggi online

Il polo di Crema vuole istituire un sito per i sondaggi online e ve ne affida l'incarico. Ciascun sondaggio è a risposta multipla e deve permettere un massimo di 5 alternative. Inoltre un sondaggio rimane attivo un mese a partire dal momento in cui è stato predisposto. Esempio:

  "Volete che vengano piantati più alberi nell'area dell'università?"
  1) No; 
  2) Si, ma solo alcuni lungo il viale;
  3) Si, ma solo alberi a basso fusto; 
  4) Sinceramente non mi interessa.

L'utente occasionale deve poter votare anche senza alcuna registrazione. Per evitare che lo stesso utente voti più di una volta, utilizzate un cookie.

Il file sondaggi.php sarà la homepage del sito e per i cinque sondaggi più votati (e non scaduti) deve presentare un istogramma delle preferenze (utilizzare una immagine di un pixel e deformatela, come abbiamo visto durante la lezione 13). Inoltre deve contenere un link alla pagina di registrazione degli utenti (registrazione.php) e alla pagina di inserimento di un nuovo sondaggio (inserisci.php). Infatti, Gli utenti che vogliono inserire un nuovo sondaggio devono registrarsi e scegliere una password. Ogni utente può creare un massimo di 3 sondaggi.

Infine, attraverso la pagina cerca.php, gli utenti devono poter controllare l'andamento dei sondaggi dopo averli cercati per parola chiave o attraverso il nome dell'utente che li ha inseriti.

Creare il database MySQL opportuno, contenente le tabelle degli utenti e quella dei sondaggi.

Ricetta a partire dalla lista degli ingredienti

La dieta degli studenti universitari non è spesso ottimale. Talvolta anche se si parte con la precisa intenzione di cucinare qualcosa di nuovo, ci si ferma, una volta aperto un ricettario, di fronte al fatto che gli ingredienti richiesti non coincidono con quanto contenuto nel frigorifero.

L'associazione degli studenti vi incarica di preparare un sito dove sia possibile indicare quanto disponibile nel frigorifero ed ottenere di conseguenza una serie di ricette che contengano tali ingredienti. Obiettivo di questo elaborato è quello di costruire il ricettario on-line.

Costruire per prima cosa il database delle ricette, che contenga, oltre al testo della ricetta vera e propria, una lista degli ingredienti (che verrà utilizzata per la ricerca). Inoltre costruire il database degli utenti che devono essere registrati per inserire nuove ricette.

Il progetto si compone dei file:

Sito di un piccolo editore

L'ufficio di un piccolo editore è pieno di bozze di libri. Infatti gli autori mandano per posta ordinaria le minute dei loro lavori, sperando di essere pubblicati. Il numero delle bozze è molto elevato e la loro gestione diventa via via più complessa. Talvolta una bozza scompare per giorni nel disordine dell'ufficio.

Per risolvere almeno parzialmente il problema, l'editore decide di invitare i futuri autori ad inviare bozze solo in formato elettronico. Incarica quindi voi di preparare il sito.

Il progetto prevede che prepariate il sito per la gestione delle bozze.

©2004 Roberto Sassi