NF1 - Arquitectures i tecnologies de la programació Web en entorn client

De wikiserver
Dreceres ràpides: navegació, cerca

Introducció Javascript

Abans de començar: Gens d'espantar-se per l'argot tècnic. Per a qui comença des de zero, aquestes coses són el primer que hagués de conèixer: Què és això de programa, llenguatge, scripts o guions....

El primer a aclarir què és el del programa, alguna cosa que realment no és exclusiu de la informàtica, tots hem programat alguna vegada: en posar el vídeo perquè gravi quan no estem a casa, quan posem el despertador,... En el cas d'un programa informàtic el que programem és un ordinador i els programes habitualment es fan escrivint-los en un cert llenguatge. Concretant, un programa no és mes que una sèrie d'instruccions que li donem a un sistema perquè faci coses. En altres paraules, i en el cas que ens concerneix, és dir-li a l'ordinador com fer una determinada tasca. Pot per tant ser alguna cosa tan simple com dir-li que sumeix dos nombres i ens digui el resultat fins a alguna cosa tan complex com dir-li que controli tot un edifici: temperatura, portes, il·luminació... En el nostre cas és alguna cosa bastant senzill, anem a dir-li a l'ordinador que quan presenti nostra pàgina web al visitant faci coses com posar a la pàgina la data del dia, fer que una imatge es mogui d'un costat a un altre, respondre d'una determinada forma a la pulsació del ratolí, etc.

Per escriure un programa no ens val ni el català, ni el castellà, ni l'anglès, ni cap dels llenguatges que habitualment usa l'home per comunicar-se. Per entendre'ns amb un ordinador s'utilitzen els llenguatges informàtics. Existeixen dos grans grups de llenguatges a l'hora d'escriure un programa: Els compilats i els interpretats.

Quan usem llenguatges compilats seguim els següents passos:

  1. Nosaltres escrivim el programa (codi font),
  2. Un programa ho tradueix al llenguatge intern de l'ordinador (es compilen)
  3. S'obté així un nou fitxer que és el que s'executa tantes vegades com es desitgi.

Els programes així obtinguts són els que s'emmagatzemen en fitxers amb un nom acabat en .exe o en .com, si treballem en els sistemes operatius DOS o Windows. Podríem resumir: Un programa compilat es tradueix una vegada i s'executa quantes vegades es desitgi. A aquest grup pertanyen els llenguatges tradicionals com a C, Pascal, Ada i uns altres.

L'altre grup és el dels llenguatges interpretats. En aquests el programa s'escriu (codi font), i l'ordinador va llegint cada instrucció, la tradueix i l'executa. O sigui, és necessari traduir el programa cada vegada que s'executa. Qui tradueix les instruccions del programa? Doncs molt senzill, un altre programa: el traductor o intèrpret. A aquest grup pertany el llegendari Basic, el Perl i els anomenats llenguatges de script com són Bash, Python, Javascript, Vbscript. Els programes escrits en aquests dos últims llenguatges són interpretats pels navegadors d'Internet com Mozilla Firefox, Chrome, IE.

Javascript

Escriure un programa per tant és simplement escriure instruccions perquè les executi l'ordinador, utilitzant per a això un cert llenguatge. És com escriure en anglès: necessites conèixer el vocabulari i la gramàtica de l'idioma de Shakespeare. En el nostre cas usem com a llenguatge el Javascript i necessites conèixer les seves regles i el seu vocabulari. Com ja saps es tracta d'un llenguatge interpretat i els programes escrits amb aquests llenguatges són coneguts com scripts o guions. Malgrat el seu nom no té res a veure amb Java, aquest últim és un llenguatge una mica més complex amb el qual es poden construir programes de propòsit general com podria fer-se amb C++ o Visual Basic (la particularitat que tenen els programes Java és que poden funcionar en qualsevol ordinador i amb qualsevol sistema operatiu). Les aplicacions escrites per a Internet en Java són conegudes com applets.

L'única raó de ser de Javascript són les pàgines web. Amb Javascript no poden construir-se programes independents, només poden escriure's scripts que funcionaran a l'entorn d'una pàgina Web, interpretat per un explorador, d'aquí la importància de conèixer para quin explorador escrivim els guions. I aquí ve el primer obstacle: no tots els exploradors integren en la mateixa forma els guions Javascript.

La primera versió de Javascript es deu a Netscape, que ho va introduir amb la versió 2.0 del seu explorador, posteriorment han anat sorgint noves versions havent estat estandarditzat per la European Computer Manufacturers Asociation (ECMA).http://www.ecma-international.org/ecma-262/5.1/

Posaríem preguntar-nos per què l'esforç d'aprendre Javascript, ja és bastant amb l'HTML per construir pàgines Web. En part això és cert, amb un bon programa editor podem obtenir una pàgina per publicar a la xarxa, però aquesta pàgina Web consistiria en: text, imatges i hipervíncles, amb els atributs com a colors, tipus de lletra i poc més sobre els quals l'autor pot actuar. Però i si volguéssim posar un menú desplegable?, i si volem que el visitant pugui moure una imatge per la pantalla? I si necessitem validar el text entrat per l'usuari en un formulari?... En resum, si volem anar més enllà de la simple presentació d'un document en pantalla, i volem controlar a l'explorador no hi ha mes remei que utilitzar un programa. Per què en Javascript? molt simple: és suportat per tots els exploradors, és senzill i és el que està sent contemplat pels organismes de normalització.

Execució de programes fets amb Javascript

Habitualment quan vols executar un programa n'hi ha prou amb buscar l'arxiu corresponent i fer un senzill clic de ratolí o prémer la tecla enter.

Però què passa amb els programes en Javascript?. El normal és que l'execució es realitzi de forma automàtica quan el navegador carrega una pàgina, o quan l'usuari passa el ratolí per una imatge, o quan prem el botó d'un formulari, etc. Aquests canvis provoquen els anomenats esdeveniments que són rebuts pel navegador que reaccionarà en la forma adequada: si fas clic en un enllaç es genera un esdeveniment i el navegador obre una nova pàgina. Aquests esdeveniments són els que s'aprofiten perquè s'executin les instruccions que nosaltres escrivim en Javascript. A cada esdeveniment se li pot associar una funció perquè faci alguna cosa predeterminat per nosaltres. Per exemple quan el navegador carrega una pàgina es produeix un esdeveniment que pot aprofitar-se per fer que s'obri una altra finestra (les conegudes com a finestres popup tan usades per a missatges publicitaris), o quan passem el ratolí per una enllaç es produeix un altre esdeveniment que pot aprofitar-se per cridar a una funció que modifiqui el color en què es mostra l'enllaç, o quan l'usuari prem una tecla.

Els esdeveniments tenen la naturalesa d'objectes, o sigui, posseeixen mètodes i propietats. Així quan es produeix un esdeveniment podem saber qui ho dispara, en què posició de la pantalla s'ha disparat i altres propietats depenents de cada esdeveniment en concret. I aquí ve un de les causes per als teus futurs maldecaps: cada navegador maneja els esdeveniments de manera alguna cosa diferent. Però seguim amb el tema de l'execució dels programes, vegem què és això del flux de programa. Quan el navegador comença a llegir el script per executar-ho ho fa en ordre seqüencial, o sigui, comença amb la primera instrucció, segueix per la segona i així fins a arribar al final. Això és el que es coneix com a execució seqüencial o lineal. Però de vegades és necessari saltar-se instruccions, per exemple, construeixes una pàgina a la qual només poden entrar determinades persones, hauràs d'escriure una funció que demani el nom de qui desitgi veure la pàgina, si és una persona autoritzada mostra la pàgina i si no ho és no la mostra. El teu programa no ha seguit un flux lineal, unes vegades executarà la part de mostrar la pàgina i unes altres no. Una altra situació bastant comuna: desitges que el teu programa recorri totes les imatges de la teva pàgina i vagi canviant el seu contingut, no vas a escriure el mateix codi una vegada i una altra, l'ideal seria escriure les instruccions i poder-les repetir.. Qualsevol llenguatge de programació té solucionat aquest assumpte mitjançant les anomenades sentències de control del flux de programa. Són sentències que permeten que s'executin condicionalment alguns passos (condicionals) o repetir una sèrie d'instruccions una vegada i una altra (bucles).

Variables, dades, objectes

Per començar a utilitzar Javascript (i qualsevol llenguatge de programació) és necessari conèixer alguns conceptes bàsics, no podem començar a fer una casa si no sabem que existeixen els maons. Un programa és una llista d'instruccions, però aquestes instruccions s'hauran d'executar sobre alguna cosa, si donem una instrucció escriure hem d'especificar què és el que cal escriure. És evident doncs que en les instruccions del programa també han de figurar les dades amb que treballar. Per exemple el nom d'una persona és Juan, aquesta paraula és una dada. El preu d'una poma és 0.5 euros, aquest nombre és una altra dada. Aquestes dades no solen usar-se tal qual sinó que s'emmagatzemen en uns elements amb nom denominats Variables. En els exemples previs usaria una variable, nom, per guardar Juan, o preu per guardar el 10. Si ara dic a l'ordinador que escrigui nom, l'ordinador escriurà el seu contingut, o sigui, Juan.

window.alert("El meu nom: "+nom).

Nota: Aquesta possibilitat ja no funciona en els navegadors moderns. Veure:

http://support.mozilla.org/ca/questions/885558

El codi mínim per fer aquest exercici és crear una pàgina web, per exemple: nom.html, i fer doble clic sobre ella:

<html>
     <script type="text/javascript">
        nombre="alex";
        window.alert(nombre); 
     </script> 
  </html>

Mitjançant el símbol + s'ha concatenat ambdues cadenes. S'ha usat un operador, alguna cosa que no és nou si has estudiat alguna vegada matemàtiques. Els operadors són símbols usats per realitzar operacions amb les dades, són els símbols +, -, /, *, respectivament sumar, restar, dividir i multiplicar. Com saps aquests operadors s'usen amb dades numèriques: 4 + 5 són 9. Aquestes dues instruccions que has escrit podrien tancar-se en un bloc amb un nom, per exemple mepresento() i tindries una funció. Podríem definir una funció anomenada quehoraes() que tanqui les instruccions necessàries perquè aparegui en pantalla l'hora actual. És a dir, mitjançant les funcions vam crear les ordres que després podrem donar-li al navegador perquè actuï segons el nostre desig.

Fins a aquí has vist els elements bàsics existents en qualsevol llenguatge de programació, però alguna vegada hauràs llegit que Javascript és un llenguatge que utilitza objectes, a diferència de Java que és un llenguatge orientat a objectes. I què és això d'objectes? Els objectes són com una extensió de les variables, una estructura que ens permet agrupar diferents valors i noms de funcions. Una variable numèrica només pot contenir això, un nombre: 10 o 20 o 2000, una cadena tipus només pot guardar una sèrie de caràcters ACAD, LI18P. Un objecte va mes allà, pot guardar diverses coses alhora. Sona rar?.

Vegem un exemple molt senzill: un rectangle es caracteritza per la longitud dels seus costats i per la forma de dibuixar-ho. En un programa el rectangle s'assimilaria a un objecte que tindria dues propietats: base i altura, i un mètode: com_dibuixar-ho. Aquest com_dibuixar-ho seria una funció que dibuixa rectangles. Si un programa defineix la variable mirectángulo com un objecte d'aquest tipus i conté la instrucció mirectangulo.com_dibuixar-ho, dibuixaria en pantalla un rectangle. La finestra de l'explorador que tens davant és un objecte amb propietats com: altura, amplària, nom... i mètodes com obrir, tancar, moure... Anem a fer alguna cosa amb un objecte que es diu window, per a això obre una altra finestra del teu navegador i escriu en la barra d'adreces:

javascript:window.close()

Has vist el que ocorre? Has usat el mètode close() de l'objecte window per tancar la finestra. Un altre exemple, escriu

javascript:window.alert(window.closed)

ara has usat el mètode alert de l'objecte window per mostrar una finestra amb el valor de la propietat closed, que diu si la finestra està tancada o oberta. Els objectes són bastant mes complicats que l'aquí exposem, però Javascript no és un llenguatge orientat a objectes, encara que pot crear-los i per descomptat manipular-los. Els scripts manipulen els objectes propis del llenguatge i els que li proporciona el navegador. I heus aquí la causa dels teus primers maldecaps com a programador en javaScript: els sistemes d'objectes dels diferents navegadors no coincideixen al 100%.

Beneficis d'utilitzar javascript en les pàgines web

  • JavaScript millora l'experiència visual d'una pàgina web. Si una pàgina web estigués feta només amb codi HTML, tan sols seria text (i imatges estàtiques)
  • JavaScript permet múltiples efectes dins les pàgines, per exemple:
    • la hora del sistema en la pàgina
    • Popups i tooltips
    • text que col.lapsa
    • Page timeout
    • canvis de color i foses (fades)
    • Fontsizing i fades
    • Ultimate fader
    • Embedded audio
    • Print page/element
    • Scrolling banners
    • Flying text
    • News scroller
    • Automated popups
    • Image transitions
    • Toggle buttons
  • JavaScript afegeix interactivitat amb l'usuari
  • JavaScript proporciona integració amb d'altres plugins. JavaScript no proporciona només accés als objectes HTML, també proporciona accés a objectes específics del navegador com ara plugins (e.g. Adobe Acrobat, Media Player).
  • JavaScript permet validació dels formularis en el cantó del client. Una validació inicial dels formularis és possible per eliminar simples errors, como assegurar-se de que el format de data, DNI, mail o telefon són correctes,... Com a resultat, l'usuari té una resposta més ràpida que no pas si el control dels errors el fes el servidor.
  • JavaScript permet accedir a informació del sistema

http://ezinearticles.com/?What-Are-the-Benefits-of-JavaScript?&id=4743036

Client side vs. Server side

Client-server.jpg

Client-side

El client és el sistema on s'està executant el navegador web. JavaScript és el principal llenguatge de script pe a la web. Els scripts en el cantó de client (client-side scripts) són interpretats pel navegador.

  1. l'usuari fa una petició (request) d'una pàgina al servidor web
  2. el servidor troba la pàgina i l'envia a l'usuari
  3. la pàgina es carrega en el navegador client alhora que s'executen els scrips (Javascript) que aquesta conté. Els scripts s'executen durant o al final de la càrrega.


Server-side

El servidor és el sistema on la pàgina web i altre contingut viu (típicament un servidor Apache). El sevidor envia pàgines web a l'usuari/client després que aquest hagi fet una petició.

  1. L'usuari fa una petició al servidor.
  2. el script (típicament PHP) en la pàgina s'interpreta, creant o canviant contingut HTML, i produint una pàgina web final amb contingut HTML i amb el codi Javascript intacte.
  3. s'envia la forma final de la pàgina al client

http://www.yourwebskills.com/clientserver.php

Altres llenguatges en entorn client. Comparativa

Llegirem el fitxer de text ara_mateix.txt

Ara mateix,
enfilo aquesta agulla amb el fil d'un propòsit que no dic,
i em poso a apedaçar.
Cap dels prodigis que anunciaven taumaturgs insignes
no s'ha complert.
I els anys passen de pressa,
de res a poc, i sempre amb vent de cara.

utilitzant diferents llenguatges de script interpretats. Aquests normalment ens permetrant treballar de forma interactiva amb la consola, o bé executar totes les comandes en bloc cridant a un script que contingui totes les ordres.


Bash

Bash ja està instal.lat per defecte en els sistemes Linux. Amb Bash podem utilitzar qualsevol de les comandes pròpies del sistema:

$ cat ara_mateix.txt
Ara mateix,
enfilo aquesta agulla amb el fil d'un propòsit que no dic,
...

$ man cat

CAT(1)                          User Commands                          CAT(1)

NAME
cat - concatenate files and print on the standard output

SYNOPSIS
cat [OPTION]... [FILE]...
...

I si volem llegir el fitxer línia a línia, ho podem fer com a mínim d'aquestes tres maneres:

fitxer ara_mateix.sh:

#!/bin/bash

FILENAME=ara_mateix.txt
while read line
do
echo $line
done < $FILENAME

Donem permisos d'execució i executem el script:

$ sudo chmod a+x ara_mateix.sh
$ ./ara_mateix.sh
Ara mateix,
enfilo aquesta agulla amb el fil d'un propòsit que no dic,
i em poso a apedaçar.
Cap dels prodigis que anunciaven taumaturgs insignes
no s'ha complert.
I els anys passen de pressa,
de res a poc, i sempre amb vent de cara.

Hi ha altres maneres de fer-ho:

ara_mateix2.sh:

#!/bin/bash
cat ara_mateix.txt | while read a
do
echo $a
done

ara_mateix3.sh:

#!/bin/bash
for a in 'cat ara_mateix.txt'
do
echo $a
done

Python

http://es.wikipedia.org/wiki/Python

Evidentment, per utilitzar Python has de tenir instal.lat aquest llenguatge (tant per a Linux com Windows)

http://chuwiki.chuidiang.org/index.php?title=Leer_y_escribir_ficheros_en_python

Per executar comandes python invoquem al seu intèrpret de comandes:

$ python
Python 2.7.3 (default, Aug  1 2012, 05:16:07)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 

i ara ja podem introduir les comandes adequades:

>>> f = open("ara_mateix.txt")
>>> f
<open file 'ara_mateix.txt', mode 'r' at 0xb7323f40>
>>> f.read()
"Ara mateix,\nenfilo aquesta agulla amb 
el fil d'un prop\xc3\xb2sit que no dic,\ni em poso a apeda\xc3\xa7ar.\nCap
 dels prodigis que anunciaven taumaturgs insignes\nno s'ha complert.
\nI els anys passen de pressa,\nde res a poc,
 i sempre amb vent de cara.\n\n"
>>> f.close()
>>> quit()

Però és millor utilitzar un script Python (fitxer amb extensió .py que conté comandes python i executar totes les instruccions de forma desatesa:

fitxer ara_mateix.py:

import sys
fitxer = open('fitxer.txt','r')
for linia in fitxer:
print linia
$ python ara_mateix.py
Ara mateix,
enfilo aquesta agulla amb el fil d'un propòsit que no dic,
i em poso a apedaçar.
Cap dels prodigis que anunciaven taumaturgs insignes
no s'ha complert.
I els anys passen de pressa,
de res a poc, i sempre amb vent de cara.

Perl

http://es.wikipedia.org/wiki/Perl

ara_mateix.pl:

# Leer un fichero de texto
my $filename = 'ara_mateix.txt';
open INFILE,$filename;
my $linia;
while ( $linia = <INFILE>) {
chomp($linia);
# Incluir aquí debajo el código para procesar la línea
print $linia . "\n";
}
close INFILE;
$ perl ara_mateix.pl
Ara mateix,
enfilo aquesta agulla amb el fil d'un propòsit que no dic,
...

Javascript

http://www-archive.mozilla.org/js/js-file-object.html http://www.html5rocks.com/en/tutorials/file/dndfiles/

I amb Javascript també ho podem fer això de llegir un fitxer de text? En teoria si... però no és fàcil.

https://developer.mozilla.org/en-US/docs/SpiderMonkey/File_object

Com es comenta en l'enllaç:

Warning: This section describes the File component of the SpiderMonkey JavaScript interpreter.
File is non-standard, not generally compiled into distributions, is a potential source of
huge security holes, and not well tested.

Utilitzem el SpiderMonkey com a intèrpret de comandes. També l'utilitzarem en la següent pràctica.

El fitxer que volem testejar és el script ara_mateix.js:

var data;
var file = new File("/home/joan/M06_WEB/comparar_scripts/ara_mateix.txt");
file.open("read", "text");
data = file.readln();
file.close();

i l'executem però no funciona:

~/M06_WEC/js-1.8.5/js/src$ ./js /home/M06_WEC/comparar_scripts/ara_mateix.js
/home/M06_WEC/comparar_scripts/ara_mateix.js:2: ReferenceError: File is not defined

Es queixa de que no troba l'objecte File. Per tal de què conegui què és un objecte File, tal com es comenta en l'enllaç, hauríem de compilar el SpiderMonkey amb aquesta compatibilitat:

$ make -f Makefile.ref JS_HAS_FILE_OBJECT=1

però de totes maneres no compila... s'hauria d'estudiar amb més deteniment i trobar una solució que de totes maneres no seria compatible amb totes les plataformes.

Nota. En entorns Windows possiblement llegir un fitxer de text amb Javascript sigui més fàcil:

Set oFSO = CreateObject("Scripting.FileSystemObject")


PHP

Amb PHP es pot accedir a llegir un fitxer, però estem parlant de fitxers en el cantó del servidor, no del client. En aquest cas utilitzarem el PHP en línia de comandes, que evidentment és la manera no-habitual de treballar amb PHP. Amb això es vol recalcar que PHP és un llenguatge de script que no té perquè estar associat a un servidor web i un navegador web. Els usuaris de Windows hauran d'esbrinar quina possibilitat tenen d'utilitzar PHP en línia de comandes. En cas de què no fos possible o fos complicat, executaran el codi en un entorn web.

$ sudo apt-get install php5-common php5-cli

<?php
// archivo txt
$filas=file('ara_mateix.txt');
// iniciamos contador y la fila a cero
$i=0;
$numero_fila=0;
echo $filas[0];
while($filas[$i]!=NULL){
echo $filas[$i];
$i++;
}
?>

I executem el codi en línia de comandes:

$ php ara_mateix.php

Fixem-nos que no cal tenir instal.lat un servidor web. L'existència del llenguatge PHP és independent de què el servidor web Apache estigui present.