Pagine

martedì 19 maggio 2015

La tabella ASCII (parte I - il problema della codifica)

Premessa


Ragazzi, oggi parliamo della tabella ASCII. Cominciamo dalle cose semplici: la tabella ASCII fa corrispondere una combinazione di bit ad ogni carattere tipografico. L'acronimo ASCII sta per American Standard Code for Information Interchange.

Se seguite questo link alla voce di wikipedia dedicata all'ASCII, e quest'altro relativo allo standard che lo ha sostituito, l'UTF-8, trovate molte informazioni tecniche di grande importanza. Devo tuttavia ricordarvi che l'informatica è una disciplina particolare che richiede la conoscenza di una grandissima quantità di concetti come linguaggi, standard, architetture, sistemi operativi, nonché dispositivi hardware e molto altro, ragion per cui è necessario non solo operare qualche scelta che limiti il campo di interesse, ma anche organizzare il percorso di apprendimento in modo da non disperdere eccessivamente le proprie risorse intellettuali e di tempo, nel vano tentativo di approfondire ogni argomento in dettaglio.

La strategia che ogni buon informatico adotta è quella di:
  • avere un quadro concettuale (dicasi: concettuale) completo di tutte le tecnologie in gioco
  • apprendere ad un livello sufficiente una parte di esse
  • approfondire, di volta in volta, quelle che sono necessarie per svolgere un determinato compito
Poiché queste note sono indirizzate a studenti del primo anno di informatica di un istituto tecnico, i quali sono del tutto all'oscuro delle più semplici nozioni che non siano quelle di pigiare su uno smartphone, siamo obbligati a fare il primo passo muovendoci quasi esclusivamente sul piano dei concetti di base e trascurando gli approfondimenti, come ad esempio un'esposizione dettagliata delle soluzioni adottate nello standard UTF-8 rispetto all'ASCII classico.

Il problema della codifica


La parola "codifica" è uno dei termini usati dagli informatici, e in generale da chi si occupa di tecnologia e scienza, per indicare i termini di un accordo. Altre parole molto usate sono "standard" e "protocollo". In generale la parola "codifica" è usata dagli informatici e dagli elettronici per indicare un tipo di accordo relativo al funzionamento di base di un computer, ad esempio quale combinazione di bit usare per indicare un determinato colore, oppure quale livello di tensione elettrica usare per indicare un bit posto a 1 o a 0. Il termine "standard" è più frequentemente usato per indicare un accordo relativo alle architetture dei sistemi, mentre il il termine "protocollo" è quello preferito dagli ingegneri che si occupano di telecomunicazioni (protocolli di comunicazione), come pure dai medici per indicare procedure terapeutiche (protocolli di cura), dai diplomatici per indicare un cerimoniale nei rapporti tra Stati, e altro ancora.

Nel caso della tabella ASCII si parla di "codifica ASCII" perché si tratta di un accordo, ormai condiviso a livello mondiale, in base al quale si è stabilito di indicare ogni lettera dell'alfabeto, e ogni segno di punteggiatura (più qualcos'altro di cui diremo) con una ben precisa combinazione di bit. Ad esempio, in ASCII la parola "ciao" è indicata con la seguente combinazione di 32 bit, 8 per ogni carattere:

01100011 01101001 01100001 01101111
      c                i               a               o

In realtà, all'inizio la tabella ASCII usava 7 bit per ogni carattere, ma in seguito si è passati ad 8, ed oggi se ne usano 16 o 32. Ma di ciò parleremo più avanti. Prima è necessario parlare in generale del concetto di "codifica" (o standard, o protocollo, o termini simili).

Adottare una codifica significa stabilire un accordo sul significato di un segnale. Ciò presuppone l'esistenza di almeno due soggetti dotati di capacità intellettive: dalle più semplici, possedute anche dagli animali, a quelle più evolute che caratterizzano l'uomo. Un gesto, o un suono, sono esempi di segnali elementari. Quando il significato di un gesto, o di un suono, è condiviso da almeno due soggetti dotati di intelletto, allora siamo di fronte a un "codice", o "codifica". Possiamo dunque affermare che l'esistenza di un codice è indice della presenza di una qualche capacità intellettiva, cioè di coscienza.

Tuttavia c'è un problema: la distanza spazio-temporale. Se io voglio che l'informazione (il significato) associato a un gesto o a un suono duri nel tempo, oppure possa essere trasferita a distanza, devo ricorrere a un espediente: associare quel gesto o quel suono a un simbolo. Devo, cioè, imparare a scrivere. Per far ciò ho bisogno di un alfabeto, ovvero di un certo numero di simboli che rappresentino i segnali affinché, invece di trasferire questi nello spazio-tempo, cosa impossibile, io possa trasferire i simboli.

L'umanità ha adottato, nel corso della storia, due soluzioni diverse. La prima, più semplice da concepire ma meno efficiente, consiste nell'associare a ogni concetto un simbolo. Questa soluzione è più semplice perché, in un certo senso, "salta il segnale", codificando direttamente il messaggio con l'uso di uno o più simboli. Ad esempio: ho paura, dunque emetto un grido, ma, invece di "codificare il grido" (cioè il segnale), codifico direttamente l'idea di paura, con un disegno o un segno stilizzato. La soluzione alternativa, codificare il segnale che, a sua volta, "codifica" il concetto, sebbene apparentemente più complessa, alla fine è talmente più efficiente da risultare la più semplice.

Usando il primo metodo, si potrebbe usare un mucchietto di sassi, opportunamente disposti secondo le regole dell'alfabeto condiviso dalla tribù, per indicare una situazione di pericolo piuttosto che la presenza di un sentiero. Le più antiche forme di scrittura si sono conformate a questa impostazione, utilizzando disegni tracciati su una superficie (scrittura pittografica). Con il passare del tempo i disegni divennero segni stilizzati, che avevano il vantaggio di rendere meno equivocabile il loro significato.

A destra è riportato un esempio di simboli (ideogrammi) usati nell'alfabeto cinese e il metodo seguito per comporli al fine di esprimere concetti più complessi a partire da quelli più semplici. Nella seconda riga, ad esempio, con un simbolo, due simboli o tre si indica rispettivamente un albero, un bosco o una foresta. Gli ideogrammi riportati dal dizionario della lingua cinese moderna sono in totale 56000, sebbene sia sufficiente la conoscenza di circa 3500 segni per comprendere mediamente il 90% di un testo. Molte civiltà, oltre quella cinese, hanno adottato un metodo di scrittura ideografico. Si pensi, ad esempio, alle civiltà della valle dell'Indo.

La scrittura degli antichi egizi è un'evoluzione del metodo ideografico. Accanto ai segni ideografici, infatti, gli antichi egizi ne introdussero altri che indicavano suoni semplici (fonemi) e suoni composti (sillabe). I geroglifici egizi (dal greco ἱερογλυφικός - hieroglyphikós - che significa "segno sacro inciso") utilizzavano 24 segni di base i quali, combinati in modo diverso secondo regole anche complesse, conducevano a un totale di quasi 7000 segni diversi. Per approfondire potete visionare questo lavoro, svolto dai ragazzi della IV-D dell'Istituto Commerciale Santorre di Santarosa di Savigliano (Cuneo).

Il secondo metodo che gli uomini hanno sviluppato per scrivere consiste nell'associare un simbolo ad ogni suono elementare presente in una lingua. Questo è il metodo fonetico, lo stesso che avete appreso in prima elementare: in questo caso si codifica il segnale sonoro (la parola) che è associato al concetto che si intende trasferire nello spazio-tempo. La complessità, apparentemente, aumenta, perché si ha bisogno di una doppia codifica (concetto => suono => simbolo) ma alla fine l'efficienza è molto maggiore.

Si ritiene che il metodo fonetico si sia sviluppato, a partire dalla metà del secondo millennio a.c., come evoluzione dei geroglifici usati dagli egiziani e dagli abitanti della Mesopotamia (coincidente in gran parte con l'odierno Iraq).

Poiché presumo che le maestre e i maestri che vi hanno insegnato a leggere e scrivere abbiano fatto un buon lavoro, non perderò tempo per spiegarvi come funziona il metodo di scrittura fonetica. Tuttavia vi è un aspetto del metodo fonetico che è molto interessante, perché ha attinenza con la tabella ASCII; per essere più precisi con l'evoluzione di questa codifica da 7/8 bit per carattere fino ai 16/32 oggi utilizzati nella codifica UTF-8. 

L'alfabeto fonetico internazionale (IPA)


Vedete ragazzi, quando voi eravate alle elementari le maestre e i maestri vi hanno insegnato, per prima cosa, i simboli fonetici che rappresentano i suoni elementari della lingua italiana. I suoni elementari sono chiamati "fonemi", mentre i simboli usati per rappresentarli sono i "grafemi".

Vi è però un problema. Prendiamo il fonema rappresentato dal grafema "c", presente ad esempio nella parola "cane". Lo stesso fonema (suono) è presente però anche nella parola "chiesa", ma in questo caso è rappresentato da una coppia di grafemi, la "c" seguita dalla "h". A complicare le cose c'è il fatto che le lingue si evolvono, per cui oggi in italiano si usa anche il grafema "k" per indicare parole ormai accolte nel dizionario italiano, ad esempio "killer", che certamente nessuno di voi si sogna di scrivere "chiller"; anche perché un "chiller" è un tipo di frigorifero.

I linguisti, cioè coloro che studiano professionalmente i linguaggi scritti e parlati da tutte le civiltà di tutti i tempi, a un certo punto hanno sentito l'esigenza di un metodo universale, ovvero non legato a una lingua particolare, per denotare tutti i suoni presenti in tutte le lingue di tutti i tempi. Da questa esigenza è nato l'alfabeto fonetico internazionale (International Phonetic Alphabet - IPA), che è un sistema convenzionale di notazione standardizzata di carattere universale, poiché consente la codifica articolatoria dei suoni di tutte le lingue del mondo.

Avete sicuramente incontrato esempi di scrittura fonetica IPA, sfogliando un dizionario. Ad esempio, la pronuncia della parola "summertime" (estate) in IPA si scrive così:  /ˈsʌm.ə.taɪm/. Il suo suono è questo

Se avete la curiosità di approfondire l'IPA vi suggerisco, per incominciare, questi due video YT:

mercoledì 25 marzo 2015

XML DOM (1)

L'acronimo DOM sta per Document Object Model. L'XML DOM definisce uno standard per manipolare documenti xml. Oltre all'XML DOM è importante la conoscenza dell'HTML DOM. Quest'ultimo definisce gli oggetti e le proprietà di tutti i tags html, nonché i metodi per manipolarli. In questo post ci occuperemo dell'XML DOM.

Per il DOM ogni cosa in un documento xml è un nodo. Per il DOM:
  • L'intero documento xml è un "document node"
  • Ogni elemento xml è un "element node"
  • Il testo contenuto negli elementi xml è composto di "text nodes"
  • Ogni attributo è un "attribute node"
  • I commenti sono "comment nodes"

Nel seguito useremo come file xml di esempio il file books.xml.

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
  <book category="cooking">
    <title lang="en">Everyday Italian</title>
    <author>Giada De Laurentiis</author>
    <year>2005</year>
    <price>30.00</price>
  </book>
  <book category="children">
    <title lang="en">Harry Potter</title>
    <author>J K. Rowling</author>
    <year>2005</year>
    <price>29.99</price>
  </book>
  <book category="web">
    <title lang="en">XQuery Kick Start</title>
    <author>James McGovern</author>
    <author>Per Bothner</author>
    <author>Kurt Cagle</author>
    <author>James Linn</author>
    <author>Vaidyanathan Nagarajan</author>
    <year>2003</year>
    <price>49.99</price>
  </book>
  <book category="web" cover="paperback">
    <title lang="en">Learning XML</title>
    <author>Erik T. Ray</author>
    <year>2003</year>
    <price>39.95</price>
  </book>
</bookstore>


Il Parser


Tutti i moderni browser hanno un built-in parser, capace di manipolare documenti xml. Il parser converte un documento xml in un oggetto XML DOM al quale si può accedere usando il linguaggio javascript. Inoltre l'oggetto XML DOM contiene metodi per attraversare un albero xml, accedere ai nodi, inserire nodi, eliminare nodi. Prima di ciò è tuttavia necessario caricare in memoria il documento xml. Questo può essere fatto usando una funzione javascript standard, che nei nostri esempi chiameremo loadXMLDoc(filename). Eccola:

function loadXmlDoc(filename)
{
if (window.XMLHttpRequest)
  {
  xhttp=new XMLHttpRequest();
  }
else // code for IE5 and IE6  {
  xhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xhttp.open("GET",filename,false);
xhttp.send();
return xhttp.responseXML;
}

Conviene memorizzare questa funzione in un file esterno (che chiameremo "xmlFunctions.js"), al quale si farà riferimento inserendo un'apposita direttiva nella sezione <head> della pagina web (evidenziata in giallo).


<!DOCTYPE html>

<html>

<head>

<script src="xmlFunctions.js"></script>

</head>

<body>


</body>
</html>

A questo punto siamo pronti per il nostro primo esperimento: vogliamo caricare, leggere e scrivere in una pagina web tutti i titoli del file books.xml.

Scriviamo dunque una semplice pagina html con il seguente codice:

<!DOCTYPE html>
<html>

<head>
<script src="xmlFunctions.js"></script>
</head>
<body>
<div id="pippo"/>
<script type="text/javascript" language="javascript">
xmlDoc=loadXmlDoc("books.xml");
var htmTxt="";
x=xmlDoc.getElementsByTagName("title");
for (i=0;i<x.length;i++)
 { 
 htmTxt+=x[i].childNodes[0].nodeValue + "<br/>";
 }
document.getElementById("pippo").innerHTML=htmTxt;
</script>
</body>
</html>

Salviamo la pagina html con il nome "leggiNodi.html" e apriamola. Vengono visualizzati i titoli dei quattro libri descritti nel file books.xml.

Anche il codice javascript scritto nella pagina html può essere messo in un file apposito, che verrà referenziato nella sezione <head>. In tal modo il codice html della pagina web sarà più leggibile, oltre ad aprirsi alla possibilità che persone diverse lavorino alla realizzazione della stessa funzionalità. Chiamiamo il file esterno "pageCode.js". Operando in tal modo la nostra procedura sarà composta da tre files:
  1. il file xmlFunctions.js contenente il codice javascript, cioè la funzione loadXmlDoc(fileName), necessario per caricare il file books.xml. Questa funzione può essere usata per aprire un generico altro file xml semplicemente passandogli il nome.
  2. il file pageCode.js contenente il codice javascript necessario per navigare nell'oggetto xmlDocument restituito dalla chiamata alla funzione loadXmlDoc(filename). Per rendere questo codice riutilizzabile la funzione che esso contiene accetterà tre parametri: il nome del file xml da caricare, il nome del nodo da ricercare, il nome del tag html nel quale iniettare il risultato.
  3. La pagina html vera e propria, con il contenitore identificato dal tag <div> con identificativo "pippo".
Dopo queste modifiche il codice contenuto nel file xmlFunctions.js resta invariato, mentre cambia il codice contenuto nel file pageCode.js:

function fillDiv(xmlFile, nodeName, tagId)
{
try{
xmlDoc=loadXMLDoc(xmlFile);
}
catch (err){alert(err.message);}
var htmTxt="";

var x=xmlDoc.getElementsByTagName(nodeName);

 for (i=0;i<x.length;i++)
   {
   htmTxt+=x[i].childNodes[0].nodeValue + "<br/>";
   }
 document.getElementById(tagId).innerHTML=htmTxt;
}


Si noti, nel codice precedente, il blocco try-catch (evidenziato in giallo) del quale parleremo in altra occasione. Esso serve per intercettare eventuali errori e far comparire un messaggio che lo descrive.

A questo punto il codice della pagina html si riduce notevolmente:

<!DOCTYPE html>
<html>
<head>
<script src="xmlFunctions.js"></script>
<script src="pagecode.js"></script>
</head>
<body>
<div id="pippo"/>
<script type="text/javascript" language="javascript">fillDiv('books.xml','title','pippo');</script>
</body>
</html>

Considerazioni


Abbiamo separato tutta la procedura in tre blocchi per renderla più gestibile e consentire, eventualmente, a più persone di lavorare su di essa. 

Nel file xmlFunctions.js si mettono le funzioni di uso generale, cioè riusabili in molti altri casi. Queste sono in genere scritte da specialisti javascript che le rendono disponibili a moltissimi programmatori.

Nel file pageCode.js si mettono le funzioni usate dalla specifica pagina html su cui stiamo lavorando. Il suo codice può essere scritto dalla stessa persona che scrive anche la pagina html, come pure da un'altra persona.

Il file html vero e proprio deve contenere solo i riferimenti ai due precedenti files javascript, oltre naturalmente alla chiamata della/delle funzioni in esse contenute, con gli eventuali parametri da passare. Nel nostro caso tali parametri sono, come già detto:
  1. il file xml nel quale si trovano i dati (nel nostro caso books.xml)
  2. il nodo del file xml il cui contenuto si vuole visualizzare (nel nostro caso "title")
  3. l'identificativo del tag <div> nel quale si vuole iniettare il risultato. Nel nostro caso esso è "pippo" e la sintassi è <div id="pippo"/>
Ovviamente, nella pagina html deve essere presente il tag <div id="pippo"/>.

In particolare, questa suddivisione del lavoro consente al programmatore della pagina html di minimizzare le sue responsabilità e il suo carico di lavoro per concentrarsi solo ed esclusivamente sugli aspetti grafici e testuali. A titolo di esempio ho preparato questa seconda pagina html nella quale è presente, oltre alle quattro righe della prima (quelle evidenziate in giallo), molti altri contenuti, dei quali chi scrive l'html è responsabile. Basta, per visualizzare i dati del file xml in questa nuova pagina html, che egli si ricordi di inserire anche le suddette quattro righe.

martedì 24 marzo 2015

Il circuito RL in c.c.

Consideriamo il circuito in figura:

Sia Vg un generatore di tensione. Possiamo studiare tre casi:

Vg è costante
Vg è sinusoidale
Vg è un segnale qualsiasi

In questo post ci occuperemo del primo caso, in cui Vg è una tensione continua. Supporremo inoltre, per semplicità, che all'istante t=0 la corrente i nel circuito sia nulla.

Chiudendo il circuito in esso comincia a circolare corrente e si stabiliscono delle tensioni ai capi della resistenza R (cui ci riferiremo con il simbolo Vr) e dell'induttanza L (che indicheremo con Vn). Sia le tensioni che la corrente variano nel tempo. Noi vogliamo determinare il loro andamento.

Vale l'ovvia relazione:

Vg=Vr(t) + Vn(t)           [1]

il cui significato fisico è che, in ogni istante, la tensione esterna applicata Vg è uguale alla somma della caduta di tensione sulla resistenza (Vr) e della caduta di tensione sull'induttanza (Vn).

Sappiamo, dal corso di elettromagnetismo, che tra la corrente circolante in un'induttanza e la tensione ai suoi capi esiste la relazione:

Vn(t)= L*di(t)/dt           [2]

Gli studenti delle prime classi delle medie superiori ignorano il significato dell'espressione di(t)/dt, per cui è necessaria una spiegazione, almeno intuitiva. Essa indica il rapporto tra una variazione molto piccola della corrente che circola nell'induttanza, di(t), divisa per il piccolo tempo dt in cui tale variazione si verifica. E' ovvio che dobbiamo considerare la possibilità (ed in effetti in questo caso è così) che questo rapporto sia variabile con il tempo.

Ricordando la legge di ohm (la caduta di tensione ai capi di una resistenza è uguale al suo valore per la corrente che la attraversa), la [2] può dunque essere scritta così:

Vg= R * i(t) + L * di(t)/dt           [3]

Per risolvere questa equazione, che è detta differenziale ordinaria, i metodi algebrici conosciuti dagli studenti delle prime classi delle medie superiori non bastano. Possiamo procedere allora utilizzando due metodi.

Il primo, che scherzosamente mi piace chiamare "credere, obbedire, combattere" consiste nel fornire direttamente la soluzione; il secondo consiste nel risolvere l'equazione con il computer. Esaminiamoli entrambi.

Il metodo "credere, obbedire, combattere"


La soluzione della [3] è data dalla formula:

i(t) = Io * (1 - e-t/τ)       [4]

essendo:

Io=Vg/R        [5]

τ = L/R         [6]

Per la legge di ohm, Vr(t)=R * i(t), segue facilmente che:

Vr(t) = R * Io * (1 - e-t/τ      [7]


L'andamento di i(t) e Vr(t) è simile, ed è un esponenziale crescente.


Il metodo numerico


Esponiamo ora il metodo di risoluzione numerico, facendo uso di un foglio di calcolo. Il metodo consiste nel trovare il modo di calcolare il valore della corrente al tempo t+dt a partire dal valore della corrente al tempo t. Possiamo indicare la corrente al tempo t+dt con l'indice ik+1, e la corrente al tempo t con l'indice ik. Una volta trovata tale relazione, la si usa per calcolare la corrente dopo un tempo pari a 1 * dt a partire dalla corrente al tempo 0. Calcolata la corrente al tempo 1 * dt, si usa questo valore per calcolarla al tempo 2 * dt, e così via. Questo procedimento è detto iterativo.

Possiamo così scrivere:

di(t)/dt = (ik+1 -ik)/dt             [8]

e riscrivere la [3] di conseguenza:

Vg= R * ik + L *  (ik+1 -ik)/dt         [9]


Dopo qualche passaggio si ottiene:

ik+1 = ik + [(Vg - R * ik)/L] * dt                     [10]

Per dare inizio all'iterazione è necessario conoscere la corrente iniziale, quella al tempo t=o, che ha indice i0 (la quale, lo ricordiamo, è nulla). La [10] diventa così:

i1 = i0 + [(Vg - R * i0)/L] * dt = 0 + [(Vg - R * 0)/L] * dt  = Vg/L

Avviata l'iterazione si calcolano i valori successivi.

Il foglio excel con la simulazione è questo.

Nota del prof: il circuito in questione è di tipo derivativo (proverò a spiegarvi a voce cosa significa), ragion per cui la sua simulazione numerica presenta gravi problemi di instabilità, come si può verificare modificando i parametri R e L. 

mercoledì 18 marzo 2015

Telecomunicazioni: la relazione tra lunghezza d'onda, frequenza e velocità di un'onda.

Salve ragazzi. Questa è una leZZZioncina facile. Voglio diradare le nebbie su una formula semplice ma che, l'esperienza mi insegna, non è ben capita da voi giovani virgulti. E anche, se avanza il tempo (l'ora è tarda e fra un po' avrò sonno), fare qualche considerazione ulteriore sull'......eco. Un atto dovuto, visto che questo è il blog didattico dell'eco della rete.

Parliamo di onde sinusoidali.


Belle le onde sinusoidali, vero? Belle e morbide, fanno venire in mente pensierini celestiali. La distanza tra due picchi si chiama lunghezza d'onda. 

Ora immaginiamo di trovarci in mare aperto, su una barchetta piccola piccola, una specie di guscio microscopico, e che in lontananza ci sia un maremoto. Dopo un po' la nostra barchetta è investita dall'onda dello tsunami ma, siccome siamo in mare aperto, non veniamo travolti bensì sollevati in alto, fino ad un'altezza massima, poi cominciamo a scendere fino ad un minimo, poi risaliamo di nuovo alla massima altezza... e così via.

Stiamo sperimentando, è ovvio, un fenomeno periodico. Il tempo trascorso tra un istante e il successivo in cui ci troviamo in una stessa posizione, ad esempio l'altezza massima, si chiama periodo. Indichiamolo con la lettera T. 

Sappiamo che l'onda dello tsunami sta viaggiando. Con quale velocità? Per calcolarla possiamo misurare la distanza tra due picchi successivi (la lunghezza d'onda, che indichiamo con la lettera greca l). Deve valere l'ovvia relazione:

l = v * T = v/f    [1]

Nella [1] f è la frequenza, che è sempre l'inverso del periodo. La [1] ci dice che lo spazio percorso è uguale alla velocità per il tempo necessario a percorrerlo, oppure alla velovità diviso la frequenza. Dalla relazione precedente possiamo ricavare v:

v = l/T    [2]

Ricordando che il periodo è l'inverso della frequenza f, si conclude facilmente che:

v = l * f    [3]

La velocità è uguale al prodotto della lunghezza d'onda della pertubazione (distanza tra due picchi massimi) per la frequenza. Nel nostro caso la frequenza corrisponde al numero di volte al secondo in cui "vediamo il mondo dall'alto"... yeah!

Quanto detto vale per qualsiasi "perturbazione" che si propaghi nello spazio secondo una legge periodica, in particolare sinusoidale. Pertanto vale anche nel caso di "perturbazioni elettromagnetiche", altrimenti dette onde elettromagnetiche. Teniamolo a mente, ma torniamo al caso dell'onda dello tsunami.

Immaginiamo ora che, invece che su un piccolo guscio, noi siamo a bordo di una lunga canoa, di lunghezza paragonabile alla lunghezza d'onda dell'onda di tsunami. Il disegnino rende l'idea della differenza:



Dove vi sentireste più sicuri? Nel guscio o nella barca grande? 

Questo esempio dovrebbe farvi capire che il rapporto tra la lunghezza della barca su cui state, e la lunghezza d'onda della perturbazione, è un parametro essenziale. Indichiamo con L la lunghezza della barca. Il rapporto:

R = L/l          [4]
può essere molto minore di 1 (siete nel guscio) oppure circa 1 o addirittura maggiore. Se ricordiamo l'espressione della lunghezza d'onda, possiamo anche scrivere:

R = L/(v*T)           [5]

E siccome L/v è il tempo t che impiega l'onda a passare sotto la vostra barca, ecco che possiamo anche scrivere:

R = t/T             [6]

Quando R<<1, allora le dimensioni dell'oggetto "investito" dalla perturbazione sono molto minori della sua lunghezza d'onda. In tal caso lo studio del fenomeno è più semplice perché, con buona approssimazione, possiamo supporre che tutta sua la struttura sia soggetta alla stessa intensità di pertubazione. Quando ciò non è vero le cose si complicano.

Poiché, come già detto, le stesse considerazioni sono valide quale che sia la natura della "perturbazione", possiamo considerare il caso delle perturbazioni (onde) elettromagnetiche. Esaminiamo due casi tipici.

Impianto di distribuzione dell'energia elettrica in una civile abitazione.


In questo caso possiamo supporre che la lunghezza massima di un collegamento elettrico non superi i 50 metri. Sia dunque L=50 m.

La frequenza alla quale viene fornita l'energia elettrica è 50 hz. La velocità di propagazione nei cavi elettrici di rame v è circa 2*108 m/s. Ricordando la [1] abbiamo che:

l = v/f = 2*108/50 = 4000 km

Poiché 50 m rispetto a 4000 km sono un niente, siamo nella situazione del piccolo guscio. Tutta la struttura dell'impianto di alimentazione elettrica di una civile abitazione in ogni istante è sottoposta (salvo errori del tutto trascurabili) alla stessa intensità di perturbazione. Che è come dire, per capirci, che se ad un dato istante t la tensione al contatore ha un certo valore, ad esempio 180 volts, lo stesso valore lo si trova in qualsiasi presa, salvo un errore del tutto trascurabile.

Impianto per la distribuzione del segnale televisivo in un condominio.


Assumendo come lunghezza tipica dei cavi di collegamento L=100 m, ed essendo la frequenza di circa 10 Ghz, ripetendo il calcolo si ottiene:

l = v/f = 2*108/(1*1010) = 200 m

Questa volta la lunghezza d'onda e la lunghezza tipica dei collegamenti hanno valori confrontabili. Siamo dunque nella situazione della grande barca investita dall'onda di tsunami. Come se dice a Roma? So' cazzi!

Conclusione


La conclusione è che si è fatto tardi, ragion per cui le divagazioni sull'effetto eco le rimandiamo alla prossima. Studiate che prima o poi vi interrogo.

Nota: questo post, sebbene pubblicato, è in fase di compilazione e verrà ampliato al più presto. Lo pubblico perché mi serve già... da ieri.

martedì 17 marzo 2015

Informatica - Trasformazioni XSLT lato client

Nell'articolo Informatica - XML e trasformazioni XSLT abbiamo visto come sia possibile associare a un file dati in formato XML una trasformazione XSLT semplicemente aggiungendo una linea sotto la prima linea del file XML (quella che contiene la dichiarazione <?xml version="1.0"?>). La linea da aggiungere è (in rosso):

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="http://[percorso]/[nome del file]"?>

Ovviamente le parentesi quadre [ e ] vanno rimosse. Ad esempio potremmo scrivere:

<?xml-stylesheet type="text/xsl" href="http://www.w3schools.com/xsl/cdcatalog.xsl"?>

Molto spesso, tuttavia, è necessario decidere al volo (magari in base alle scelte dell'utente, o in funzione del tipo di dispositivo che richiede una pagina con i dati XML) la trasformazione XSLT più adatta. Questa trasformazione può essere eseguita sia lato server (elaborazione server-side) che lato client (elaborazione client-side). Oggi ci occuperemo del secondo caso, l'elaborazione client-side.

Nell'esempio che vi propongo, che potete testare a questo indirizzo, ho realizzato una semplice pagina html, contenente il seguente codice:

<html>
<head>

<script type="text/javascript" language="javascript" src="domXslt.js"></script>

</head>
<body>
<h2>La più grande collezione di dischi in vinile! Comprate peones, comprate! 
Acquisto con carta di credito prepagata.
</h2>

<select id="sel" onchange="displayResult(sel.value)">
  <option value="">Scegli il modello di formattazione</option>
  <option value="cdCatalog1.xsl">Modello ridotto</option>
  <option value="cdCatalog2.xsl">Modello esteso</option>
  <option value="cdCatalog3.xsl">Modello tabulare</option>
</select>

<div id="example"/>

</body>
</html>

Ho evidenziato in giallo tre parti della pagina che dobbiamo esaminare.

1) il tag "script".


Questo tag contiene un riferimento a un file (domXslt.js) che contiene il codice javascript che eseguirà la trasformazione. Questo codice viene richiamato dal browser nel momento in cui la pagina html viene caricata nella memoria del vostro dispositivo. Esso viene chiamato in esecuzione quando l'utente effettua una scelta tra le tre possibili che gli sono presentate (modello ridotto, modello esteso, modello tabulare).

2) il tag select


Questo tag ha l'effetto di creare nella pagina un elenco di scelta a discesa. L'utente può così selezionare il tipo di formattazione desiderata. Ogni voce del tag select (le quattro voci "option") ha un "value" (che è nascosto all'utente) e un'etichetta visibile. La prima voce "option" ha un value nullo, ad indicare che l'utente non ha effettuato nessuna scelta. In tal caso il risultato sarà una pagina vuota.

Si noti il fatto che il tag ha un attributo "id", il cui valore è posto uguale a "sel". Questo attributo serve ad identificare il tag in modo che ci si possa riferire ad esso. Il valore dell'attributo può essere scelto a piacere.

Si noti infine la presenza dell'attributo "onchange". Esso rappresenta il nome di un evento che viene generato dal browser quando l'utente effettua una selezione. Quando ciò accade viene eseguito il codice contenuto nella funzione  displayResult, alla quale viene passato il parametro sel.value, contenente il nome del file XSLT con cui effettuare la trasformazione.

3) il tag div


Questo tag crea un contenitore vuoto (quindi invisibile finché resta tale) nel quale verrà iniettato il risultato della trasformazione dell'XML in HTML, utilizzando il codice contenuto nel file XSLT selezionato dall'utente.

Quello che accade


Quando l'utente seleziona un modello di formattazione viene eseguita la funzione displayResult con l'opportuno parametro, e il risultato appare a schermo. Vi ricordo che la funzione displayResult è scritta in linguaggio javascript ed è contenuta nel file domXslt.js. E' decisamente troppo presto per esaminare questa funzione, ne riparleremo al momento opportuno. Quello che è importante osservare è che la realizzazione dell'intera procedura è stata divisa in tre parti. 
  • La scrittura della pagina HTML, contenete i tag opportuni.
  • La scrittura della trasformazione XSLT
  • La scrittura del codice javascript.
Per realizzare ognuna di esse, posto che i dati in formato XML siano disponibili (ad esempio perché provengono da un data-server) serve una specifica professionalità. In genere la scrittura della pagina HTML è curata da un grafico, mentre due distinti programmatori si occupano di scrivere la trasformazione XSLT e il codice javascript. Il tutto viene supervisionato da un sistemista.


Nota per i miei studentelli: con tutto il lavoro che faccio per voi, non vi passi per la testa di trattarmi così (Professore vittima dei bulli in classe - Cestino in testa e insulti contro di lui)! Vi stronco la carriera... ;-)