# Programmazione Concorrente e Distribuita
*[Aggiornamento 24/09/2016: Aggiornati i risultati finali (in aggiornamento).]*
> **ATTENZIONE**: Il termine ultimo per la consegna del progetto corretto per A.A. 2015 / 2016 è il 23/09/2016. Oltre quella data non saranno più accetate ulteriori consegne. Invito inoltre a chiunque abbia passato lo scritto e consegnato un progetto corretto e che voglia registrare il voto a mandarmi un'email.
## Presentazione del corso
### Obiettivi formativi
Il corso presenta il linguaggio Java e la programmazione a diversi livelli di astrazione: la programmazione ad oggetti, la programmazione concorrente, e la programmazione distribuita.
L'esame consiste in una prova scritta seguita e da un progetto obbligatorio. Il progetto consiste in un'applicazione distribuita e concorrente.
La prova scritta valuta l'apprendimento del linguaggio Java e la capacita' di realizzare soluzioni corrette per problemi di natura concorrente. Il progetto valuta la capacita' dello studente di applicare ad un caso reale i concetti di concorrenza e distribuzione visti a lezione.
### Propedeuticità obbligatorie strette
Programmazione, Programmazione ad Oggetti
### Materiale didattico
Parte del materiale didattico presentato durante le lezioni sarà progressivamente pubblicato, in formato elettronico, tramite collegamento alla lezione corrispondente.
Sono altresì consigliati i seguenti testi:
+ [Oggetti, Concorrenza, Distribuzione. Programmare a diversi livelli di astrazione](http://www.editrice-esculapio.com/bookshop/Crafa-Oggetti-Concorrenza-Distribuzione-Programmare-a-diversi-livelli-di-astrazione#.VgBtBd_tmkp), Silvia Crafa, Editore Esculapio, 2014
+ [Core Java Volume I, Fundamentals (9th edition)](http://www.informit.com/store/core-java-volume-i-fundamentals-9780137081899), C. S. Horstmann, Prentice Hall (*disponibile in biblioteca*)
+ [Core Java Volume II, Advanced Features (9th edition)](http://www.informit.com/store/core-java-volume-ii-advanced-features-9780137081608), C. S. Horstmann, Prentice Hall (*disponibile in biblioteca*)
Gli esercizi ed esempi utilizzati dal docente durante le lezioni possono essere recuperati al repository **Github** [pcd-snippets](https://github.com/rcardin/pcd-snippets).
## Calendario delle lezioni e degli appelli di esame
Segue il calendario delle lezioni del corso e degli appelli d'esame.
| Data | Orario | Docente | Tema | Cap. libro |
| :---: | :----: | :---: | ---- |
| 6 ott. | 11:30 - 13:15 | Crafa | Piattaforma Java | 1 |
| 7 ott. | 11:30 - 13:15 | Crafa | Programmazione procedurale in Java | 2 |
| 13 ott. | 11:30 - 13:15 | Crafa | Classi e oggetti in java | 2 |
| 14 ott. | 11:30 - 13:15 | Crafa | Ereditarietà di classi | 3 |
| 20 ott. | 11:30 - 13:15 | Crafa | Classi astratte | 4 |
| 21 ott. | 11:30 - 13:15 | Crafa | Interfacce | 4 |
| 27 ott. | 11:30 - 13:15 | Crafa | Classi interne | 4 |
| 28 ott. | 11:30 - 13:15 | Crafa | Organizzazione delle classi in java | 4 |
| 03 nov. | 11:30 - 13:15 | Cardin | [Componenti delle interfacce (gerarchia). Cenni al Composite Pattern. I Layout](http://www.slideshare.net/RiccardoCardin/java-graphics-programming-54631803) ([pdf](pdf/pcd/Java%20-%20Graphics%20programming_4x4.pdf)) | 5 |
| 04 nov. | 11:30 - 13:15 | Cardin | [Programmazione ad eventi: componenti, visione di insieme. Cenni all'Adapter Pattern](http://www.slideshare.net/RiccardoCardin/java-graphics-programming-54631803) | 5 |
| 10 nov. | 11:30 - 13:15 | Cardin | [Gerarchia dei throwable. Meccanismi (throw, try, catch, finally). Sintassi try con chiusura. Eccezioni checked e unchecked](http://www.slideshare.net/RiccardoCardin/java-exception-handling-assertions-and-logging) ([pdf](pdf/pcd/Java%20-%20Exception%20handling,%20assertions%20and%20logging_4x4.pdf)) | 6 |
| 11 nov. | 11:30 - 13:15 | Cardin | [Thread e la sua API. Accenni ai diagrammi di sequenza. Cicli di vita del thread](http://www.slideshare.net/RiccardoCardin/java-concurrent-programming-threads-basics). ([pdf](pdf/pcd/Java%20-%20Concurrent%20programming%20-%20Thread%20basics_4x4.pdf)) | 7 |
| 18 nov. | 11:30 - 13:15 | Cardin | *Esercitazione* ([pdf](pdf/pcd/Java%20-%20Exercises%20(part%201)_4x4.pdf)) | -- |
| 24 nov. | 11:30 - 13:15 | Cardin | [Thread safety, race conditions, locking](http://www.slideshare.net/RiccardoCardin/java-concurrent-programming-synchronization-part-1) ([pdf](pdf/pcd/Java%20-%20Concurrent%20programming%20-%20Synchronization%20(part%201)_4x4.pdf))| 7 |
| 25 nov. | 11:30 - 13:15 | Cardin | [Conditional locking](http://www.slideshare.net/RiccardoCardin/java-concurrent-programming-synchronization-part-2) ([pdf](pdf/pcd/Java%20-%20Concurrent%20programming%20-%20Synchronization%20(part%202)_4x4.pdf)) | 7 |
| 01 dic. | 11:30 - 13:15 | Cardin | Thread confinement, atomics e immutable classes | 7 |
| 02 dic. | 11:30 - 13:15 | Cardin | [Executor / Futures / Promises](http://www.slideshare.net/RiccardoCardin/java-concurrent-programming-threads-advanced-concepts) ([pdf](pdf/pcd/Java%20-%20Concurrent%20programming%20-%20Thread's%20advanced%20concepts_4x4.pdf)) | 7 |
| 09 dic. | 11:30 - 13:15 | Cardin | **[Presentazione progetto didattico](https://github.com/rcardin/pcd-actors)** | -- |
| 15 dic. | 11:30 - 13:15 | Cardin | [Generic programming](http://www.slideshare.net/RiccardoCardin/java-generic-programming) ([pdf](pdf/pcd/Java%20-%20Generic%20programming_4x4.pdf)) | -- |
| 16 dic. | 11:30 - 13:15 | Cardin | Chiarimenti sul progetto didattico | -- |
| 08 gen. | 13:30 - 14:30 | Cardin | [Collection framework](http://www.slideshare.net/RiccardoCardin/java-collections-framework-56181924) ([pdf](pdf/pcd/Java%20-%20Collections%20framework_4x4.pdf)) in aula **1C/150** | -- |
| 12 gen. | 11:30 - 13:15 | Cardin | [Socket su TCP](http://www.slideshare.net/RiccardoCardin/java-sockets-56882815) ([pdf](pdf/pcd/Java%20-%20Sockets_4x4.pdf)) | 9 |
| 13 gen. | 11:30 - 13:15 | Cardin | [Remote procedure invocation (RMI). Cenni al Proxy Pattern](http://www.slideshare.net/RiccardoCardin/java-remote-method-invocation-56716760) ([pdf](pdf/pcd/Java%20-%20Remote%20Method%20Invocation_4x4.pdf)) | 9 |
| 19 gen. | 11:30 - 13:15 | Cardin | [Stream I/O e gerarchie. Accenni al Pattern Decorator](http://www.slideshare.net/RiccardoCardin/java-processing-input-and-output) ([pdf](pdf/pcd/Java%20-%20Processing%20Input%20and%20Output_4x4.pdf)) | 8 |
| 20 gen. | 11:30 - 13:15 | Cardin | Paths, Files e Directories. Serializzazione | 8 |
| -- | -- | -- | [Risultati del I appello del 25/01/2016](pcd/Risultati_20160125.pdf) | - |
| 01 feb. | 13:00 - 14:00 | Cardin | Visione dei compiti e correzione (aula **1C/150**) | - |
| -- | -- | -- | [Risultati del II appello del 17/02/2016](pcd/Risultati_20160217.pdf) | - |
| 25 feb. | 13:00 - 14:00 | Cardin | Visione dei compiti e correzione (aula **2BC60**) | - |
| -- | -- | -- | [Risultati del III appello del 30/06/2016](pcd/Risultati_20160630.pdf) | - |
| 15 lug. | 13:00 - 14:00 | Cardin | Visione dei compiti e correzione (aula **1C/150**) | - |
| -- | -- | -- | [Risultati del IV appello del 18/07/2016](pcd/Risultati_20160718.pdf) | - |
| -- | -- | -- | [Risultati del V appello del 15/09/2016](pcd/Risultati_20160915.pdf) | - |
| -- | -- | -- | [Prospetto risultati finali (in aggiornamento)](pcd/Risultati_Finali_2016.pdf) | - |
Le lezioni indicate in calendario si terranno nell'aula 1C/150 con l'orario seguente:
+ martedì, 11:30-13:15
+ mercoledì, 11:30-13:15
## Regole di partecipazione al progetto didattico
Il progetto didattico richiede la realizzazione di una libreria semplificata che implementa il modello di concorrenza / distribuzione ad attori.
La traccia per la realizzazione e le specifiche del sistema possono essere recuperate al seguente indirizzo: [GitHub pcd-actors](https://github.com/rcardin/pcd-actors).
Alla stessa pagina è presente una sezione [F.A.Q.](https://github.com/rcardin/pcd-actors#faq) dedicata alle domande poste dagli studenti del corso sulle specifiche del progetto. La sezione è in
costante aggiornamento.
Il progetto didattico vale 2 punti sul voto finale. Il restante viene deciso dall'esito dello scritto individuale, che deve essere **maggiore di 18**.
Il progetto può essere consegnato solo dopo il 25/01/2016. La consegna nella sessione di esami regolare (febbraio 2016) fornisce un punteggio aggiuntivo di 1 punto sul totale.
I progetti devono essere consegnati inviandoli alla casella di posta *pcd.progetto.2015@gmail.com*. Devono essere consegnati unicamente i sorgenti del programma,
ossia quanto presente all'interno della cartella `src` e il corrispondente file Maven delle dipendenze `pom.xml`. Il file zip da inviare al suddetto indirizzo
deve quindi avere al suo interno la seguente struttura
pcd-actors
|
|--src/
|--pom.xml
L'oggetto dell'email deve essere il seguente: **CONSEGNA PROGETTO PCD 2015 - NOME COGNOME MATRICOLA**
Il progetto è **individuale** e verranno applicate delle penalità a chiunque non segua pedissequamente questo vincolo.
## Esempio domande appello d'esame
I testi delgli appelli d'esame conterranno al proprio interno una serie di domande a risposta multipla e/o a risposta *secca*. In quest'ultimo caso lo studente dovrà eseguire
mentalmente il codice fornito e dare il risultato atteso.
Si riporta di seguito un insieme di domande simili a quelle che saranno utilizzate all'interno dei testi degli appelli d'esame. L'elenco è in *costante aggiornamento*.
**[Lista domande d'esempio](pcd/domande_esempio.txt)**
**[Lista risposte alle domande d'esempio](pcd/risposte_domande_esempio.txt)**
## Calendario degli appelli d'esame
Liste di iscrizione all'esame (del quale sono previsti 5 appelli, calendarizzati tra la fine del corso e la sessione di recupero estivo) verranno pubblicate sul sistema [UniWeb](https://uniweb.unipd.it/Home.do) nelle due settimane precedenti l'appello corrispondente.