|
|
| << | < | > | >> |IndicePrefazione xix Introduzione xxiii A chi è rivolto questo libro? xxiii Che cosa troverete in questo libro xxiii Gli standard web xxiv Di quali tecnologie stiamo parlando? xxv Chi è al timone e dove stiamo andando? xxvi A che cosa servono gli standard? xxviii Che cosa ne pensano gli sviluppatori di browser? xxx Qualche parola sulle ultime versioni xxxi Che cos'è il Web 2.0? xxxii Panoramica: capitolo per capitolo xxxiv Parte I - Dare vita alle pagine xxxiv Parte II - AJAX o l'arte del sussurro xxxiv Parte III - Interagire con il resto del mondo xxxv Appendici per i principianti e gli esperti xxxv Approfondimenti xxxv Gli esempi di codice xxxvi Ringraziamenti xxxvi Capitolo 1 Come e perché accettare la sfida del Web 2.0 1 Prima e dopo: alcune situazioni sorprendenti 1 Digitazione assistita: completamento automatico del testo 1 Caricamento al volo 4 La conferma automatica 10 Imparare a utilizzare gli strumenti chiave: XHTML, CSS, JS, DOM e AJAX 11 Per iniziare: AJAX, di che cosa si tratta? 12 Piano d'azione per due obiettivi: metodo ed esperienza 14 Parte I Dare vita alle pagine 17 In questa parte 17 Capitolo 2 Non scambiate JavaScript per quello che non è 19 Miti e leggende su JavaScript 19 JavaScript è una versione "light" di Java 20 JavaScript non si basa su alcuno standard 20 JavaScript è lento 21 JavaScript è un linguaggio-giocattolo, poco potente 21 Che cosa sono JavaScript, EcmaScript, JScript e ActiveScript 21 Tutto ciò che non sospettate: i piccoli dettagli del linguaggio 22 Le variabili: dichiarate o non dichiarate? 22 Tipi di dati 24 Funzioni e valori disponibili ovunque 25 I misteri di parseFloat e parseInt 25 Indicate sempre la base, se no... 25 Una conversione poco convinta 27 Riepilogo sulle strutture di controllo 29 I grandi classici 29 Etichette nei cicli 29 Il ciclo for... in 30 Semplificare l'accesso ripetitivo a un oggetto con with 31 Operatori misconosciuti 32 Ripasso rapido sui grandi classici 32 Operatori esotici 32 Comportamenti particolari 33 Implementazione delle eccezioni 33 I tipi di eccezioni predefiniti 33 Catturare un'eccezione: try/catch 34 Estensione: catch multipli e condizionali 35 Garantire una gestione delle eccezioni: finally 36 Lanciare la propria esecuzione 37 Migliorare gli oggetti esistenti 37 Un po' di teoria sui linguaggi a prototipi 38 In pratica 38 Estendere le stringhe 39 Gli array e le iniezioni 39 Gli argomenti delle funzioni 40 Binding fra funzioni: che cosa significa "this"? 43 Costrutti interessanti 46 Inizializzazione e valori predefiniti con || 47 Selezionare una proprietà (e pertanto un metodo) condizionale 47 Verificare l'assenza di una proprietà in un oggetto 48 Funzioni anonime: mai usare new Function! 48 Oggetti anonimi come hash di opzioni 49 Simulare gli spazi dei nomi 50 "JavaScript non intrusivo": associare correttamente il codice JavaScript e la pagina web 50 Trucchi per la scrittura del codice 51 Evitare le trappole più comuni 51 Migliorare la leggibilità 53 Tecniche di debugging JavaScript 55 La console JavaScript 55 Mozilla Firefox 56 Opera 57 Safari 57 Konqueror 58 Internet Explorer 59 Venkman, il debugger di JavaScript 59 Firebug, il coltellino svizzero degli sviluppatori web 2.0 64 Approfondimenti 67 Libri 67 Siti 68 Capitolo 3 Manipolare dinamicamente la pagina con il DOM 69 [...] Capitolo 4 Prototype: semplice, comodo, elegante e portatile! 117 [...] Parte II AJAX o l'arte del sussurro 169 In questa parte 169 Capitolo 5 I meccanismi interni: l'oggetto XMLHttpRequest 171 [...] Capitolo 6 AJAX: in tutta scioltezza con Prototype 221 [...] Capitolo 7 Un'ergonomia da sogno con script.aculo.us 233 [...] Parte III Interagire con il resto del mondo 297 In questa parte 297 Capitolo 8 Web servite e REST: non siamo più soli 299 [...] Capitolo 9 Informazioni "à la carte": i feed di dati RSS e Atom 371 [...] Parte IV Appendici 401 Appendice A Gestire correttamente i contenuti: XHTML semantico 403 [...] Appendice B Un look impeccabile e flessibile: CSS 2.1 429 [...] Appendice C I "must" dell'esperto: saper leggere le specifiche 449 [...] Appendice D Sviluppare con il browser 471 [...] Indice analitico 477 |
| << | < | > | >> |Pagina xxiiiIntroduzione
Prima di entrare nel vivo, facciamo il punto sugli argomenti trattati in
questo libro, su ciò che contiene e su ciò che abbiamo scelto di omettere oltre
che sulla sua struttura generale. Vedremo in particolare come si articolano i
vari temi.
A chi è rivolto questo libro? Tutti coloro che sono interessati direttamente o indirettamente alle tecnologie web troveranno elementi di interesse in quest'opera. Precisiamo che è preferibile una certa conoscenza delle tecnologie relative ai contenuti web statici: in particolare, HTML (meglio, XHTML) e CSS. Queste conoscenze vengono qui attualizzate e sono pertanto conformi agli standard (XHTML Strict, CSS 2.1) e ben approfondite, in particolare per quanto riguarda l'uso semantico dei tag. I lettori che ritengono di avere lacune in queste tecnologie potranno trovare nelle Appendici A e B una breve introduzione ai principi fondamentali ma anche numerose risorse (cartacee e online) per affinare le proprie conoscenze.
Per il resto non è necessario avere competenze specifiche in JavaScript o
DOM, in quanto questi argomenti verranno approfonditi all'interno dell'opera.
Insomma questo libro può essere utile sia per i professionisti esperti,
desiderosi di aggiornarsi, sia per gli studenti che vogliono andare al di là
delle nozioni apprese nei corsi di tecnologie web, spesso troppo sommari ed
empirici, per non dire obsoleti.
Che cosa troverete in questo libro Il libro è suddiviso in tre parti, precedute da questa introduzione e da un capitolo introduttivo che presenta il Web 2.0 e le sue tecnologie. Per il resto, l'opera è sviluppata su due piani: un piano tematico e un piano metodologico e qualitativo. Il primo delinea gli obiettivi del volume, mentre il secondo è trasversale. • La prima parte presenta in dettaglio le tecnologie che "danno vita" a una pagina web, spesso poco e mal conosciute: JavaScript, il DOM e, per ottenere una maggiore agilità e potenza, l'eccellente libreria Prototype. • La seconda parte esplora le potenzialità dello sviluppo AJAX, a partire dall'oggetto XMLHttpRequest, il motore delle richieste asincrone, per proseguire con i framework più affermati nell'universo Web 2.0, in particolare Prototype e script.aculo.us. • La terza parte si spinge oltre, aprendo le pagine ai contenuti e ai servizi esterni, tramite i web service, le API REST, i feed di dati e i formati RSS e Atom. L'opera si conclude con quattro Appendici. • Le Appendici A e B forniscono le basi delle due principali tecnologie relative ai contenuti: XHTML e CSS, nelle loro versioni più recenti. • L'Appendice C, rappresenta un "must" irrinunciabile in quanto descrive chiaramente come sfruttare al meglio i documenti di riferimento per il Web (RFC, DTD, raccomandazioni W3C e così via), offrendovi la possibilità di accedere a conoscenze aggiornate e autorevoli. • Infine l'Appendice D, pur essendo collocata alla fine del libro, dovrebbe essere letta prima dei capitoli in quanto fornisce le chiavi per sviluppare in modo più produttivo con il browser, evitando, per esempio, di lottare contro la cache mentre provate gli esempi di questo libro.
In tutti questi capitoli, l'obiettivo costante è stato quello della massima
qualità, sia in termini di tecnica sia in termini di metodologia di lavoro. Che
si tratti di codice
JavaScript non intrusivo
(concetto che affronteremo in dettaglio nel Capitolo 2), di uso semantico dei
tag, di CSS efficaci, di accessibilità o di scelta corretta del formato per un
flusso di syndication o del risultato di una richiesta AJAX, abbiamo cercato di
realizzare un'opera di alto livello, differenziata, tale da offrire al lettore
un reale vantaggio competitivo, in un momento in cui nessuno esita a scrivere
nel proprio curriculum "Esperto sviluppatore web".
Gli standard web Tutti accolgono favorevolmente gli standard web e affermano che è importante rispettarli. Ma pochi sanno veramente che cosa sono, perché è opportuno adottarli nel proprio lavoro e dove rivolgersi per una voce autorevole.
Oggi che la maggior parte degli sviluppatori web più esperti e dei giovani
diplomati credono di "conoscere lo sviluppo web", ma non sanno che cos'è il
W3C, non sanno parlare dell'ultima versione di HTML, sono vaghi sulle differenze
fra XHTML e HTML e pensano che CSS si limiti a inserire dei tag div e degli
attributi class e style qua e là, possiamo misurare il cammino da percorrere in
termini di evangelizzazione e di educazione in generale.
Di quali tecnologie stiamo parlando? Iniziamo ricordando le tecnologie che rappresentano oggi gli standard web. Ci limiteremo alle tecnologie legate in particolare all'argomento del libro, per evitare di dover dedicare all'argomento troppe pagine. • HTML (HyperText Markup Language) è il linguaggio per la descrizione dei contenuti all'interno di una pagina web. Derivato da SGML, la sua sintassi è un po' troppo permissiva e ricca di ambiguità per permettere un'elaborazione automatizzata veramente efficace. • XML (eXtensible Markup Language) offre una sintassi più formale dei tag per i contenuti e ciò garantisce l'elaborazione automatica del documento senza rischiare ambiguità, problemi sui set di caratteri o limiti di tipo e dimensioni dei contenuti. • XHTML consiste sostanzialmente nell'applicare ad HTML tutti i vincoli sintattici di XML, aprendo così la porta a un'elaborazione affidabile dei contenuti delle pagine web. • CSS (Cascading Style Sheets) è una tecnologia di presentazione che permette un'impaginazione estremamente avanzata dei contenuti compatibili XML (ma anche HTML grazie alla sua flessibilità). Le possibilità di questi fogli stile sono enormi, ben al di là di ciò che consentono i tag di presentazione di HTML. • DOM (Document Object Model) descrive una serie di strumenti destinati ai programmatori (si parla più precisamente di interfacce) che permettono di rappresentare e manipolare in memoria un documento compatibile XML. Queste manipolazioni sono praticamente illimitate e costituiscono uno dei pilastri di una pagina web veramente "viva". Fra le sottoparti del DOM si citerà in particolare Core che fornisce le basi comuni a tutti i tipi di documenti; HTML è specializzata nelle pagine web; infine Events governa l'elaborazione degli eventi associati agli elementi del documento. • JavaScript è un linguaggio per script, dinamico, orientato agli oggetti che dispone di numerose funzionalità avanzate, oggi disponibile sotto una forma o l'altra in tutti i browser, anche se poco conosciuti. Senza JavaScript, niente pagine vive, niente Web 2.0 e niente AJAX! • XMLHttpRequest è un oggetto in grado di inviare richieste asincrone tramite HTTP (ecco una frase che forse non vi dice nulla; nessun problema, l'argomento verrà trattato nel Capitolo 5). Utilizzato in JavaScript, rappresenta il cuore di AJAX. • RSS 1.0 (RDF Site Summary) è un formato per flussi di syndication, definito in modo molto più formale rispetto ai suoi omonimi nelle versioni 0.9x o 2.0 (dove l'abbreviazione significa Really Simple Syndication), i quali sono più diffusi ma meno potenti. Si basa su RDF (Resource Description Framework), una grammatica formale di rappresentazione della conoscenza attorno alla quale gravita l'universo del Web semantico (per ulteriori informazioni sull'argomento, consultate la pagina http://www.w3.org/2001/sw/ ). • Atom è il formato più recente per feed di syndication, senza dubbio il più potente e il più efficace, senza però essere troppo complesso. Fra gli standard web si trovano ancora numerose tecnologie molto utilizzate, come PNG (per le immagini), SOAP e i web service, XSL e XSLT e altre ancora troppo poco utilizzate, per esempio SVG (per le immagini vettoriali), MathML (per le formule matematiche), SMIL (per i formati multimediali), XForms (per i moduli web) e così via. | << | < | > | >> |Pagina xxxiiChe cos'è il Web 2.0?Il termine "Web 2.0", tanto amato dalla stampa e dai siti specializzati, descrive in realtà due fenomeni distinti. Da una parte si ha un'evoluzione profonda delle interfacce utente proposte nel Web, simili per comportamento e interattività alle applicazioni più classiche (applicazione desktop, normalmente in esecuzione locale sulla macchina dell'utente) e fruibili anche su periferiche "leggere" (SmartPhone, computer palmari e così via). Trascinamenti, completamenti automatici, creazione dinamica delle immagini, personalizzazione al volo dell'interfaccia, esecuzione in parallelo: tutti comportamenti che siamo ormai abituati a trovare nelle applicazioni e che purtroppo mancavano (almeno fino a poco tempo fa) nei browser. I browser sono stati finora ridotti a ruoli subalterni, offrendo un sottoinsieme ridicolo di funzionalità ormai ben definite. Ma i browser non sono affatto programmi meno evoluti rispetto agli altri; semplicemente finora li abbiamo impiegati poco e male. L'altra faccia del Web 2.0 è quella che potremmo chiamare "il Web nelle mani degli utenti". Fino poco tempo fa, consultare una pagina web garantiva un'esperienza simile alla lettura di una pagina stampata in una rivista: non era possibile intervenire troppo sull'aspetto. Quella barra di navigazione sulla destra riduce l'area utile? Quella barra pubblicitaria vi innervosisce? Il testo è troppo piccolo o il contrasto troppo scarso? Tanto peggio per voi! Il progettista del sito ha voluto la pagina in questo modo e... "sia fatta la sua volontà". Infatti, consultare una pagina web era in realtà un'esperienza peggiore della lettura di una rivista: su quest'ultima, almeno, si ha il vantaggio dell'eccellente risoluzione di stampa, del fatto che i testi di piccole dimensioni sono comunque ben leggibili. Certamente, molti browser permettono di disattivare CSS o di utilizzare un foglio stile personale o ancora di eseguire uno zoom per ingrandire tutti gli elementi della pagina (immagini comprese) ma era solo una magra consolazione. Ecco dunque che compaiono nuovi utilizzi, che danno finalmente all'utente il controllo sull'aspetto finale della pagina sul proprio browser. Basta con le parti superflue e irritanti! Ingrandiamo il testo principale, scritto con caratteri troppo piccoli! E già ché ci siamo, aumentiamo il margine fra i paragrafi e diamo più "aria" al testo cambiando l'interlinea! Grazie a strumenti dedicati, come le estensioni GreaseMonkey (http://www.greasespot.net/) e Platypus (http://platypus.mozdev.org) per Firefox, l'utente può regolare come desidera l'aspetto di una pagina e rendere queste modifiche automatiche in previsione delle successive visite. Per il resto, gli utenti possono ora contribuire a migliorare la qualità del Web, grazie alla facilità di pubblicazione che offrono strumenti come i blog e tramite raccolte di pagine molto dinamiche basate su voti di popolarità (per esempio Digg). Il principio è semplice: questi siti permettono a chiunque di "votare" una qualsiasi pagina web. Quindi conservano un elenco, ordinato per popolarità, delle pagine segnalate in questo modo. Se un numero massiccio di utenti vota per una determinata pagina, questa comparirà in un'eccellente posizione nel sito che ha raccolto i voti. Il risultato è seducente: i siti che compaiono in prima posizione nell'elenco offrono contenuti interessanti, divertenti o comunque apprezzati e votati da molti. Statisticamente avranno pertanto maggiori probabilità di interessare anche voi. Sotto un'ottica più politica, questo significa che i "grandi titoli" non sono più confinati in una redazione, così facile da strumentalizzare. Per acquisire questa visibilità, seppure effimera, la pagina non ha altra scelta se non quella di piacere al maggior numero possibile di persone. È un sistema molto democratico. I principali siti di questo tipo, del.icio.us (http://del.icio.us/) e Digg (http: //www.digg.com, più orientato alle tecnologie) per citarne solo due, sono già estremamente visitati (più di decine di milioni di visitatori al giorno). Improvvisamente, molti blog, varie riviste online e anche altri siti dotati di contenuti dinamici hanno sistematicamente iniziato a presentare sulle proprie pagine dei link grafici facilmente riconoscibili per facilitare (e dunque incoraggiare) il voto degli utenti. I siti Technorati e del.icio.us sono fra i pionieri di un nuovo utilizzo che si diffonde rapidamente: il tagging. Si tratta di permettere agli utenti di qualificare una pagina in base a parole chiave, per ottenere un sistema ricco di riferimenti incrociati e di categorie, ben più flessibile delle gerarchie di categorie abituali. Alcuni strumenti per blog, come Typo (http://trac.typosphere.org/) o Dotclear 2 (http://www.dotclear.net) , propongono già l'assegnazione di tag (etichette) agli articoli. Il Web 2.0, esattamente come Firefox alla sua nascita, vi invita finalmente a riappropriarvi del Web. | << | < | > | >> |Pagina xxxivPanoramica: capitolo per capitoloPer concludere questa lunga introduzione, vi propongo un'occhiata generale alla struttura dell'opera, sottolineando la sua articolazione e il ruolo di ciascun capitolo.
Il Capitolo 1,
Come e perché accettare la sfida del Web 2.0,
definisce la problematica e la posta in gioco. Si tratta di imparare a
distinguere fra i siti classici e quelli Web 2.0; dopo aver presentato vari
esempi illustrati e dopo aver collocato le principali tecnologie
nell'architettura globale dello sviluppo, il capitolo svela il significato di
AJAX e si conclude delineando un piano d'azione che ha lo scopo di aiutarvi a
trarre i maggiori benefici da questa lettura.
Parte I - Dare vita alle pagine I tre capitoli di questa parte hanno lo scopo di definire i pilastri ormai classici sui quali si regge oggi AJAX. A meno che non siate grandi esperti di JavaScript e del DOM, perfettamente rispettosi degli standard che li governano, evitate di saltare questi capitoli, supponendo di conoscere già l'argomento trattato. Con ogni probabilità questi capitoli risulteranno utili per apprendere qualche nuovo argomento. • Il Capitolo 2, Non scambiate JavaScript per quello che non è, presenta in dettaglio questo linguaggio mal conosciuto, maltrattato e spesso mal impiegato. Questo capitolo, molto ricco di consigli e trucchi metodologici, vi aiuta a realizzare i "comportamenti" nel modo più corretto ed elegante. Viene dedicata particolare attenzione al debugging. • Il Capitolo 3, Manipolare dinamicamente la pagina con il DOM, apre la strada verso la realizzazione di pagine veramente dinamiche, il cui contenuto evolve rapidamente, interamente sul lato client. Vengono realizzati numerosi esempi che rispondono a esigenze concrete. Vengono inoltre forniti consigli preziosi facendo il punto sui residui problemi di compatibilità.
• Il Capitolo 4,
Prototype: semplice, comodo, elegante e portatile!,
presenta la quasi totalità di Prototype, senza dubbio la più utile delle
librerie JavaScript. Grazie ad essa possiamo realizzare codice JavaScript che,
nonostante sia più portatile rispetto ai nostri precedenti tentativi, sarà anche
più elegante, più conciso, più espressivo e in generale molto più comodo da
scrivere.
Parte II - AJAX o l'arte del sussurro Una volta stabilite in modo solido e confortevole le basi tecniche, potete dedicarvi a quella che, secondo molti, rappresenta la parte visibile di AJAX: le richieste asincrone in background. E grazie a queste che le pagine sembrano in grado di fare "più cose contemporaneamente" e pertanto non hanno più bisogno di ricaricarsi integralmente. • Il Capitolo 5, I meccanismi interni: l'oggetto XMLHttpRequest, approfondisce la tecnologia responsabile delle richieste asincrone. È l'occasione di scoprire un'altra tecnologia di punta, anch'essa molto confortevole: il linguaggio Ruby che utilizzeremo per creare, con una sconcertante facilità, un server web per contenuti dinamici per i nostri test. • Il Capitolo 6, AJAX in tutta scioltezza con Prototype, ci consente di cambiare marcia. Poiché ormai conosciamo gli ingranaggi, possiamo sfruttare gli strumenti disponibili per fare un balzo spettacolare in termini di produttività, grazie alle funzionalità AJAX di Prototype (ancora lui).
• Il Capitolo 7,
Un'ergonomia da sogno con script.aculo.us,
esplora l'incredibile libreria di effetti visuali e di comportamenti avanzati
rappresentata da script.aculo.us. Questo capitolo vi aiuterà ad approfondire
ulteriormente il discorso sugli utilizzi pertinenti e scorretti di AJAX,
spingendovi fino ai limiti del suo utilizzo.
Parte III - Interagire con il resto del mondo È un po' una parte aggiuntiva che va al di là della tecnologia AJAX per esplorarne alcuni utilizzi concreti sempre più frequenti. L'idea è che le nostre pagine non hanno alcun motivo di limitarsi al nostro server e possono discutere con la stessa facilità con qualsiasi sito e qualsiasi servizio. • Il Capitolo 8, Web servite e REST: non siamo più soli, illustra questa idea presentando queste due tecnologie per sfruttare nelle nostre pagine le funzionalità di ricerca di Amazon, le previsioni meteorologiche di The Weather Channel e le librerie di immagini di Flickr.
• Il Capitolo 9,
Informazioni "à la carte": i feed di dati RSS e Atom,
presenta i due principali formati di feed per attivare una visualizzazione di
contenuti (blog e di altro tipo) direttamente sulle nostre pagine.
Appendici per i principianti e gli esperti Delle quattro appendici previste, due hanno lo scopo di venire incontro alle esigenze dei lettori ai quali mancano alcune basi, mentre le ultime due forniscono competenze utili per tutti. • L'Appendice A, Gestire correttamente i contenuti: XHTML semantico, introduce le basi di XHTML e insiste fortemente sull'importanza di un utilizzo non solo corretto ma soprattutto semantico dei tag. Dopo aver elencato brevemente i tag disponibili, fornisce alcuni casi concreti di uso impeccabile dei tag, corrispondenti ad alcuni bisogni ricorrenti. • L'Appendice B, Un look impeccabile e flessibile: CSS 2.1, svolge la stessa operazione per CSS e dunque per l'impaginazione. Prima di iniziare con i fondamentali, viene definito un vocabolario: struttura delle regole, principio di cascata e box model. Un elenco conciso dei selettori e delle proprietà permette di chiarire meglio gli esempi impiegati nel resto del libro. • L'Appendice C, I "must" dell'esperto: saper leg ere le specifiche, ha lo scopo di insegnarvi a leggere i principali formati delle specifiche per gli standard web, per navigare senza problema all'interno di questi documenti talvolta complessi, che spesso impiegano sintassi particolari. Essere a proprio agio con questi documenti offre numerosi vantaggi e rappresenta una competenza ancora troppo rara.
• L'Appendice D,
Sviluppare con il browser,
fa infine il punto sulle possibilità più o meno ricche per migliorare la vostra
produttività di sviluppatori web con i principali browser: gestione della cache,
estensioni, strumenti complementari di debugging e test. Da leggere
assolutamente, preferibilmente prima ancora di iniziare a leggere questo libro.
Approfondimenti Non lo si ripeterà mai abbastanza, tutta quest'opera tenta di rispondere a esigenze costanti di qualità, eleganza, efficacia, tramite numerosi consigli metodologici e scelte tecniche saggiamente orientate. L'obiettivo che si prefigge è solo quello di migliorare la vostra preparazione!
Con lo stesso spirito, la maggior parte dei capitoli si conclude con un
paragrafo di approfondimenti che elenca le opere e le risorse online di qualità
che permettono di approfondire gli argomenti esplorati.
Gli esempi di codice Il codice sorgente di tutti gli esempi presentati nei vari capitoli di questo libro è disponibile in un archivio presente sul sito web di Apogeo (raggiungibile tramite la pagina http://www.apogeonline.com/libri/88-503-2659-9/scheda ). In alcuni capitoli (per esempio nel Capitolo 4 riguardante Prototype), sono stati infatti presentati solo alcuni brevi estratti, mentre l'archivio fornisce sempre i listati completi.
Questi esempi sono stati collaudati su Firefox 1.5, Safari 2, Internet
Explorer 6, Opera 9 e Konqueror 3.5.2. Quando alcuni vincoli sono inevitabili,
l'impatto viene specificato nel testo del libro.
|