Diario per Applicazioni Web, a.a. 2011/12

Matteo Vaccari > Applicazioni Web

Lezione 0: The Command-Line Web, 2011-11-29

Argomenti: HTTP, URI, REST

Esercizi

Per eseguire questi esercizi usa Linux oppure un Mac. Non Windows. Se non hai una macchina Linux, puoi usare una macchina virtuale: scarica VirtualBox e installaci sopra Ubuntu.

Altri esempi di domande d'esame

Da studiare

Materiali per approfondimenti facoltativi

Lezione 1: HTML, 2011-12-01

Argomenti: HTML, Web Standards, Character Encodings

Esercizi

Scrivere un documento HTML che nel browser abbia questo aspetto:

Rendering di una pagina HTML di esempio

(La url dell'immagine è http://www.ruby-lang.org/images/logo.gif)

Altri esempi di domande d'esame

Materiali da studiare

Studiare questi articoli:

Materiali per approfondimenti facoltativi

Lezione 2: CSS, 2011-12-06

Argomenti: Cascading Style Sheets

Esercizi

Realizzare un documento HTML stilizzato in CSS per ottenere l'effetto di questo bozzetto (png, 120KB).

Altri esempi di domande d'esame

Da studiare

Studiare questi articoli:

Non è necessario imparare a memoria tutte le proprietà e i loro possibili valori; ma è necessario sapere che esistono.

Approfondimenti facoltativi

Lezione 3: Web Servers, 2011-12-13

Argomenti: Il funzionamento dei Web Server; architettura di Apache HTTPD; cenni sulla configurazione di Apache. Generazione di contenuto dinamico tramite l'interfaccia CGI. Le form in HTML.

Esercizi

  1. Installa Apache sulla tua macchina Linux o Mac.
  2. Impara come fare partire e fermare il servizio Apache con "apache2ctl"
  3. Installa un file html nella DocumentRoot di Apache e verifica con il tuo browser che Apache lo restituisca.
  4. Trova ed esamina l'access_log e l'error_log di Apache sulla tua macchina.
  5. Installa in Apache e fai funzionare i due esempi di CGI visti a lezione: ora-del-giorno e scacchiera.
  6. Modifica l'esempio "scacchiera" per usare il parametro "size" (es. http://localhost/cgi-bin/scacchiera.cgi?size=3); deve produrre una scacchiera con lato di dimensione pari a quella passata nel parametro "size". Se il parametro "size" è assente oppure non è un numero, deve usare la dimensione di default che è 8.
  7. In aggiunta o in alternativa al precedente: riscrivi scacchiera.cgi in un altro linguaggio; ad esempio C o Java.
  8. Scrivi un comando CGI che restituisca un immagine. L'immagine non deve essere all'interno della DocumentRoot del server.
  9. Implementa in HTML questa form (png).
  10. Osserva con netcat i parametri restituiti dalla form dell'esercizio precedente. Prova a inviarli sia con GET che con POST.

Altri esempi di domande d'esame

Da studiare

Approfondimenti facoltativi

Lezione 4: Il linguaggio Ruby

Introduzione a Ruby: Array, hash, blocks, Symbols, string manipulation. Traduzione del programma scacchiera della lezione scorsa in Ruby. Parsing dei parametri della richiesta HTTP, sia nel caso di metodo GET che di metodo POST.

Esercizi

  1. Modifica il programma della scacchiera per prendere due argomenti, width e height, che specifichino separatamente la larghezza e l'altezza della scacchiera. Deve continuare a supportare però anche il parametro size, che deve continuare a funzionare come prima: scacchiera.cgi?size=3 equivale a scacchiera.cgi?width=3&height=3.
  2. Risolvi in Ruby il problema numero 1 del Progetto Euler

Da studiare

Approfondimenti facoltativi

Lezione 5: Come produrre documenti HTML dinamici, 20-12-2011

Incapsulare il codice in oggetti. Il linguaggio di templating Embedded Ruby. Codice dell'esercizio visto a lezione.

Esercizi

  1. Scrivere un programma CGI che gioca a tris. Usare la struttura del programma Scacchiera. Il template board.erb deve essere modificato per presentare la mappa del gioco di tris; ogni casella contiene inizialmente un `<input type="submit" name="?"/>` dove l'attributo `name` cambia da casella a casella; ad esempio si possono numerare le caselle da 0 a 8. Quando l'utente preme uno dei bottoni che stanno nelle caselle, il CGI risponde ridisegnando la mappa con una "X" o una "O" nella casella. Il programma deve fermarsi quando il gioco è finito.

    Una maniera alternativa di implementare la `form` che implementa la mappa è di usare gli `<input type="radio" name="?">`. Così facendo per giocare una mossa sono necessari due clic.

    Nella versione base, Tris.cgi permette a due esseri umani di giocare sulla stessa pagina web. Può essere interessante (ma esula dal programma di questo esame) estendere il programma per giocare contro l'essere umano.

Da studiare

La documentazione di Embedded Ruby fino a "Installing eruby in Apache" escluso.

Approfondimenti facoltativi

Il linguaggio di templating Markaby

Il linguaggio di templating HAML

Un articolo di David Heinemeier Hansson sui linguaggi di templating

Lezione 6: Progettare un'applicazione web 22-12-2011

Requisiti funzionali e non funzionali. Page flow. Modello dei dati. L'architettura Model-View-Controller (MVC). Virtual hosts. Uso delle regole di riscrittura per connettere tutte le URL della nostra applicazione a un singolo script CGI.

Iniziamo un ciclo di lezioni su come implementare un clone di tadalist.com. I dettagli si trovano nei lucidi, che pubblico per questa volta in via eccezionale.

Ho approntato un repository su github per il codice che vediamo a lezione. Per scaricarlo:

git clone https://github.com/xpmatteo/Web-Applications-2011-12.git

Per aggiornarlo dopo ogni lezione:

git pull

Esercizi

Imparare come fare partire e fermare Apache con "apache2ctl" o "apachectl"

Esercizio: creare un virtual host "pippo.com"

  1. Creare uno o più documenti HTML e salvarli nella directory /tmp/pippo.com
  2. Configurare www.pippo.com per puntare a 127.0.0.1 in /etc/hosts
  3. Creare un file di configurazione con le direttive necessarie per configurare www.pippo.com come un name-based virtual host. Questo file sia salvato come "pippo.conf"
  4. Includere pippo.conf nella configurazione di Apache. Su Ubuntu la maniera migliore è salvare pippo.conf in /etc/apache2/sites-available e poi abilitarlo con "a2ensite pippo"
  5. Verificare che aprendo "www.pippo.conf" nel browser si vedano i file creati al primo passo.

Configurare l'esercizio visto a lezione per funzionare sul tuo web server. Se digito http://todo-list/pippo/pluto Devo vedere Hello Ruby. Se digito http://todo-list/images/cards.jpg devo vedere un'immagine.

(Nota che questi esercizi non sono facoltativi)

Da studiare

Il manuale di Apache Httpd: Binding, Configuration Files, Configuration Sections (fino a "Virtual Hosts" incluso), Name-Based Virtual Hosts (eccetto la parte su "older browsers").

Lezione 7, 10-01-2012: Prima iterazione di todo-list

Inizio della implementazione del servizio web specificato nella lezione precedente. Progettazione ad oggetti della struttura della web application. Gli oggetti WebRequest, WebResponse, Router, TodoListRepository. Il codice visto a lezione si trova su github, per scaricarlo usare git pull (vedi lezione precedente.)

Esercizi

Ho aggiunto lesson06/README.md con le istruzioni dettagliate per l'installazione, e lesson07/README.md con le istruzioni per l'esercizio da fare a casa: implementare l'aggiunta di elementi a una todo-list (iniziato a lezione, da completare)

Altre domande che potrei fare durante l'esame

Spiegare in maniera dettagliata a che cosa serve e come funziona la WebRequest, o la WebResponse, il Router, il TodoListRepository....

Eseguire l'esercizio di questa lezione

Lezione 8, 12-01-2012: Seconda iterazione di todo-list

Abbiamo visto come usare form con elementi nascosti per conservare lo stato di una "conversazione" con l'applicazione. Abbiamo discusso la validazione. Abbiamo parlato del problema di mantenere DRY il codice.

Esercizi

Ho aggiornato il progetto su Github alla lezione 08. Ho risolto l'esercizio della volta scorsa e ho aggiunto la possibilità di marcare come "fatto" un item. Ci sono due esercizi nel README:

Da notare che continuiamo ad usare un Repository in memoria al posto del database vero. Con l'introduzione degli "item" l'uso di questo repository si è un po' complicato. Presto dovremo riscriverlo per usare un database.

Da studiare

Approfondimenti facoltativi

Lezione 9, 17-01-2012: validazione

Abbiamo visto il pattern base della validazione dei dati. Nell'esempio di codice che trovate su github, abbiamo implementato la validazione del nome della todo-list.

Abbiamo anche abbozzato un meccanismo generico per implementare oggetti di dominio adatti all'uso in un'applicazione web (ma non solo.) Si veda la classe User.

Esercizi

Lezione 10, 19-01-2012: accesso al database

Perché usiamo il database; pro e contro del DB rispetto all'uso del file system. Un meccanismo semplice per accedere ai dati del DB dal codice a oggetti: reimplementazione del repository usando un oggetto di interfaccia al database. (In progress... pubblicherò altro materiale)

Da studiare:

Studiare i capitoli 1, 2, 3 di Sql for web nerds di Philip Greenspun

Lezione 11, 26-01-2012: sessioni e autenticazione

Come implementare le sessioni sul protocollo HTTP. I cookie. Algoritmo di generazione delle sessioni. Utilizzo proprio e improprio dei dati in sessione. Salvataggio dei dati in sessione. Algoritmo di verifica della validità della sessione. Problemi di sicurezza delle sessioni. Autenticazione. Algoritmo di autenticazione.

(In progress... pubblicherò altro materiale)

Da studiare

Ripassare Greenspun, capitolo 2, Basics.

Studiare la mia dispensa sulle sessioni