From: Kim Nguyễn Date: Wed, 16 Sep 2015 09:27:59 +0000 (+0200) Subject: . X-Git-Url: http://git.nguyen.vg/gitweb/?p=hacks%2FsimpleWebSlides.git;a=commitdiff_plain;h=564cbcc2c27a723d2bdf12cf690a66eb7f36b813 . --- diff --git a/themes/uPsud.css b/themes/uPsud.css index d9d9904..a8ba435 100644 --- a/themes/uPsud.css +++ b/themes/uPsud.css @@ -25,12 +25,13 @@ h1 { background: white; padding: 0 0 0 0; margin: 0 0 0 0; - /* allows the canvas to cover the logo needed */ z-index:2; } +.sws-inner-canvas { /* allows the canvas to cover the logo if needed */ + z-index:2 } -.sws-canvas:after { +.sws-footer::before { position:absolute; bottom: 1vh; left:1vh; @@ -41,8 +42,9 @@ h1 { background-size: 100%; background-image: url("logo_psud_psay.png"); background-repeat: no-repeat; - z-index: -1; } +:root.sws-display .sws-footer::before { z-index: -1; } +/*:root.sws-print .sws-footer::before { z-index: 1; }*/ .sws-slide-num-sep:after { content: "/"; @@ -110,7 +112,7 @@ ul { list-style-type: square; } -ul,il { +ul, ol { list-style-position: inside; width: 92%; padding: 0 4% 0 4%; diff --git a/unix_prog_web/cours_4.svg b/unix_prog_web/cours_4.svg deleted file mode 100644 index d26b090..0000000 --- a/unix_prog_web/cours_4.svg +++ /dev/null @@ -1,399 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - Internet - Client(Navigateur Web) - - - Serveur(programme) - - Client(Machine) - Documents - Serveur(machine) - - PHP - Java - - HTMLCSS - Javascript - - Requêtes - Réponses(pages, images, vidéos, scripts, …) - - - - - - - - diff --git a/unix_prog_web/password.html b/unix_prog_web/password.html deleted file mode 100644 index 5d82e83..0000000 --- a/unix_prog_web/password.html +++ /dev/null @@ -1,10 +0,0 @@ - - -
- Username:
- Password:
- -
- - diff --git a/unix_prog_web/password2.php b/unix_prog_web/password2.php deleted file mode 100644 index e257b59..0000000 --- a/unix_prog_web/password2.php +++ /dev/null @@ -1,10 +0,0 @@ - - - - - diff --git a/unix_prog_web/pdf/unix_prog_web_01.pdf b/unix_prog_web/pdf/unix_prog_web_01.pdf deleted file mode 100644 index 22d276b..0000000 Binary files a/unix_prog_web/pdf/unix_prog_web_01.pdf and /dev/null differ diff --git a/unix_prog_web/pdf/unix_prog_web_01_print.pdf b/unix_prog_web/pdf/unix_prog_web_01_print.pdf deleted file mode 100644 index a3d0262..0000000 Binary files a/unix_prog_web/pdf/unix_prog_web_01_print.pdf and /dev/null differ diff --git a/unix_prog_web/pdf/unix_prog_web_02.pdf b/unix_prog_web/pdf/unix_prog_web_02.pdf deleted file mode 100644 index b77a498..0000000 Binary files a/unix_prog_web/pdf/unix_prog_web_02.pdf and /dev/null differ diff --git a/unix_prog_web/pdf/unix_prog_web_02_print.pdf b/unix_prog_web/pdf/unix_prog_web_02_print.pdf deleted file mode 100644 index c7de4cb..0000000 Binary files a/unix_prog_web/pdf/unix_prog_web_02_print.pdf and /dev/null differ diff --git a/unix_prog_web/pdf/unix_prog_web_03.pdf b/unix_prog_web/pdf/unix_prog_web_03.pdf deleted file mode 100644 index 6ee48f9..0000000 Binary files a/unix_prog_web/pdf/unix_prog_web_03.pdf and /dev/null differ diff --git a/unix_prog_web/pdf/unix_prog_web_03_print.pdf b/unix_prog_web/pdf/unix_prog_web_03_print.pdf deleted file mode 100644 index ee09e18..0000000 Binary files a/unix_prog_web/pdf/unix_prog_web_03_print.pdf and /dev/null differ diff --git a/unix_prog_web/pdf/unix_prog_web_04.pdf b/unix_prog_web/pdf/unix_prog_web_04.pdf deleted file mode 100644 index 312773d..0000000 Binary files a/unix_prog_web/pdf/unix_prog_web_04.pdf and /dev/null differ diff --git a/unix_prog_web/pdf/unix_prog_web_04_print.pdf b/unix_prog_web/pdf/unix_prog_web_04_print.pdf deleted file mode 100644 index 82e04d7..0000000 Binary files a/unix_prog_web/pdf/unix_prog_web_04_print.pdf and /dev/null differ diff --git a/unix_prog_web/pdf/unix_prog_web_05.pdf b/unix_prog_web/pdf/unix_prog_web_05.pdf deleted file mode 100644 index 218bd86..0000000 Binary files a/unix_prog_web/pdf/unix_prog_web_05.pdf and /dev/null differ diff --git a/unix_prog_web/pdf/unix_prog_web_05_print.pdf b/unix_prog_web/pdf/unix_prog_web_05_print.pdf deleted file mode 100644 index c570b37..0000000 Binary files a/unix_prog_web/pdf/unix_prog_web_05_print.pdf and /dev/null differ diff --git a/unix_prog_web/pdf/unix_prog_web_06.pdf b/unix_prog_web/pdf/unix_prog_web_06.pdf deleted file mode 100644 index 73bf2e5..0000000 Binary files a/unix_prog_web/pdf/unix_prog_web_06.pdf and /dev/null differ diff --git a/unix_prog_web/pdf/unix_prog_web_06_print.pdf b/unix_prog_web/pdf/unix_prog_web_06_print.pdf deleted file mode 100644 index 251df42..0000000 Binary files a/unix_prog_web/pdf/unix_prog_web_06_print.pdf and /dev/null differ diff --git a/unix_prog_web/pdf/unix_prog_web_07.pdf b/unix_prog_web/pdf/unix_prog_web_07.pdf deleted file mode 100644 index f86bd44..0000000 Binary files a/unix_prog_web/pdf/unix_prog_web_07.pdf and /dev/null differ diff --git a/unix_prog_web/pdf/unix_prog_web_07_print.pdf b/unix_prog_web/pdf/unix_prog_web_07_print.pdf deleted file mode 100644 index 4e22b61..0000000 Binary files a/unix_prog_web/pdf/unix_prog_web_07_print.pdf and /dev/null differ diff --git a/unix_prog_web/pdf/unix_prog_web_08.pdf b/unix_prog_web/pdf/unix_prog_web_08.pdf deleted file mode 100644 index 25230e0..0000000 Binary files a/unix_prog_web/pdf/unix_prog_web_08.pdf and /dev/null differ diff --git a/unix_prog_web/pdf/unix_prog_web_08_print.pdf b/unix_prog_web/pdf/unix_prog_web_08_print.pdf deleted file mode 100644 index aa068ae..0000000 Binary files a/unix_prog_web/pdf/unix_prog_web_08_print.pdf and /dev/null differ diff --git a/unix_prog_web/pdf/unix_prog_web_09.pdf b/unix_prog_web/pdf/unix_prog_web_09.pdf deleted file mode 100644 index 537ecbb..0000000 Binary files a/unix_prog_web/pdf/unix_prog_web_09.pdf and /dev/null differ diff --git a/unix_prog_web/pdf/unix_prog_web_09_print.pdf b/unix_prog_web/pdf/unix_prog_web_09_print.pdf deleted file mode 100644 index 0794b99..0000000 Binary files a/unix_prog_web/pdf/unix_prog_web_09_print.pdf and /dev/null differ diff --git a/unix_prog_web/radar.jpg b/unix_prog_web/radar.jpg deleted file mode 100644 index b4935e5..0000000 Binary files a/unix_prog_web/radar.jpg and /dev/null differ diff --git a/unix_prog_web/ssl-cert.png b/unix_prog_web/ssl-cert.png deleted file mode 100644 index 9810ad6..0000000 Binary files a/unix_prog_web/ssl-cert.png and /dev/null differ diff --git a/unix_prog_web/stat.php b/unix_prog_web/stat.php deleted file mode 100644 index 2b41efb..0000000 --- a/unix_prog_web/stat.php +++ /dev/null @@ -1,15 +0,0 @@ - - - 0) { - echo "Erreur lors de l'envoi du fichier
\n"; - - } else { - echo "\n"; -} -?> - - \ No newline at end of file diff --git a/unix_prog_web/test.php b/unix_prog_web/test.php deleted file mode 100644 index 728f971..0000000 --- a/unix_prog_web/test.php +++ /dev/null @@ -1,10 +0,0 @@ - - -
- - - - -
- \ No newline at end of file diff --git a/unix_prog_web/unix_prog_web_01.xhtml b/unix_prog_web/unix_prog_web_01.xhtml deleted file mode 100644 index 304a0d4..0000000 --- a/unix_prog_web/unix_prog_web_01.xhtml +++ /dev/null @@ -1,784 +0,0 @@ - - - - - Systèmes d'exploitation (1/2) - - - - - - - - - - - - - - - - - - - - -
-

Unix et Programmation Web

-

Cours 1

- kn@lri.fr -
- -
-

Contenu du cours

-
    -
  1. Comprendre les bases du Web -
      -
    • Fonctionnement des ordinateurs Unix (cours 1 et 2)
    • -
    • Notions de réseau (cours 3 et 4)
    • -
    -
  2. -
  3. Programmer (pour) le Web -
      -
    • Pages statiques (HTML & CSS cours 5)
    • -
    • Pages dynamiques avec PHP (cours 6, 7 et 8)
    • -
    • Notions de sécurité des sites Web (cours 9)
    • -
    • Bonus (cours 10)
    • -
    -
  4. -

    Cours disponible en ligne - sur https://www.lri.fr/~kn/teaching_fr.html. Les - supports de cours seront distribués à partir de la semaine prochaine.

    -
- -
-
-

Modalités de Contrôle des Connaissances (MCC)

-

2 sessions:

- -

Rappel: - La défaillance fait obstacle au calcul de la moyenne - et implique l'ajournement. - La présence de l'étudiant étant obligatoire en TP [...], plus - d'une absence injustiée dans un enseignement peut entraîner - la défaillance de l'étudiant dans l'enseignement concerné - -

-
- -
-

Organisation

- -
-
-

Plan

-
    -
  1. Systèmes d'exploitation -
      -
    • 1.1 Principes des systèmes - d'exploitation
    • -
    • 1.2 Système de gestion de fichiers
    • -
    • 1.3 Système de gestion de processus
    • -
    -
  2. -
-
- -
-

Système d'exploitation

-

Quelques systèmes:

- -
- -
-

Système d'exploitation

-

Qu'est-ce qu'un système d'exploitation ?

- -

Quelles sont les ressources d'une machine?

- -
-
-

Système d'exploitation

-
-
- Haut niveau
- ↓
- Bas niveau -
-
-
    -
  • Applications: navigateur Web, éditeur de - texte, anti-virus, jeu, compilateur, …
  • -
  • Système d'exploitation: -
      -
    • Gestion des ressources
    • -
    • Interface avec le matériel (pilotes)
    • -
    -
  • -
  • Matériel: CPU, mémoire, périphériques, …
  • -
-
-
-
-

Le système Unix

- - - - - - - - - - - -
1965 MultICS: Multiplexed Information and Computing Service (Bell & MIT)
1969 Unix: 1ère version en - assembleur (AT&T)
1972-73 Unix réécrit en C
1976 Invention de TCP/IP
1977 Berkeley Software Distribution - (BSD)
1985Unix System V
1988Minix
1992Linux
-
-
-
-

Unix : architecture

- - - - - - - - - - - - -
- Applications -
- Interface utilisateur - - Services -
- Noyau (kernel) -
- Micro-code -
- Matériel -
-
-
-
-

Zoom sur le noyau

- - - - - -
- Applications -
- - Bibliothèques - (libc, DirectX, OpenGL, …) -
-
- - - - - - - -
- Appels systèmes -
- Noyau
-
- pilotes de périphériques - ordonnanceur (gestion du temps CPU)
- gestionnaire de mémoire - système de fichier
-
-
- Matériel -
-
-
-

Le Shell Unix

- -
-
-

Le Shell Unix

-

Exemple de session shell:

-
- - $ ls - Documents Downloads Public Person - $ cd Documents - $ ls - compte_rendu.txt - $ mv compte_rendu.txt cr.txt - $ ls - cr.txt - -
-
- -
-

Plan

-
    -
  1. Systèmes d'exploitation -
      -
    • 1.1 Principes des systèmes - d'exploitation
    • -
    • 1.2 Système de gestion de fichiers
    • -
    • 1.3 Système de gestion de processus
    • -
    -
  2. -
-
-
-

Système de gestion de fichiers (filesystem)

- -
-
-

Le concept de fichier

-

- Un fichier est une collection d'infromations - numériques réunies sous un même nom et - enregistrée sur un support de stockage -

- -
-
-

Le concept de fichier

-

Ne pas confondre:

- -
-
-

Les attributs d'un fichier

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Nom -
Propriétaireutilisateur qui possède ce fichier
Groupegroupe d'utilisateurs qui possède ce fichier
Emplacementlocalisation du fichier sur le support physique
Tailleen octet (peut être la taille réelle ou la taille - occupée sur le support)
Permissions « qui a quel droit » sur le fichier (lecture, écriture, - exécution, …) -
Type -
Datesdernier accès, dernière modification, création, …
-
-
-

Organisation logique des fichiers

-

Usuellement, les fichiers sont regroupés en répertoires. Les -répertoires sont imbriqués les uns dans les autres de manière a former -une arborescence. -

-

- Sous Unix il y a un répertoire racine, « / » -(slash) qui contient toute l'arborescence du système.
-Chaque utilisateur possède aussi un répertoire personnel -

-
- -
-

Noms de fichiers et chemins

-

-Un chemin est une liste de répertoire à traverser pour -atteindre un fichier ou répertoire donné. -Sous Unix, le séparateur de chemin est le « / »
-Les chemins absolus commencent par un / et - dénotent des fichiers à partir de la racine. Exemple: - - /home/kim/Documents/ProgInternet/cours01.pdf - -Les chemins relatifs dénotent des fichiers à partir du - répertoire courant. Exemple:
- Documents/ProgInternet/cours01.pdf -si on se trouve dans le répertoire /home/kim -
-
-Les noms spéciaux: « . » dénote le répertoire - courant, - « .. » le répertoire parent, « ~ » le répertoire de - l'utilisateur et « ~toto » le répertoire de l'utilisateur - toto -

-
- -
-

Utilisation du Shell

-

- Le shell affiche un invite de commande - (prompt). Exemple:
- kim@machine $

- On peut alors saisir une commande:

- kim@machine $ ls *.txt

- Le shell affiche la sortie de la commande:

- fichier1.txt fichier2.txt

- Certains caractères doivent être précédés d'un « \ » (échappés):

- kim@machine $ ls mon\ fichier\#1.txt -

-
-
-

La ligne de commande

-

- Une ligne de commande a la forme:
- prog item1 item2 item3 item4 … -

-
    -
  1. Si prog est un chemin il doit - dénoter un fichier exécutable -
  2. -
  3. Si prog est un simple nom, il doit dénoter un fichier - exécutable se trouvant dans un des répertoires prédéfinis - (/bin, /usr/bin, …) -
  4. -
  5. Pour chaque itemi (séparés par un ou plusieurs espaces - non échappés) le shell fait une expansion de nom -
  6. -
  7. La liste de toutes les chaînes de caractères expansées est - passée comme argument au programme prog -
  8. -
-
-
-

Expansion des noms
Expressions régulières glob

-

- Certains caractères sont interprétés de manière spéciale par le - shell. Ces caractères sont « expansés » selon des - règles. Si la forme expansée correspond a un ou plusieurs fichiers - existants, alors leurs noms sont placés sur la ligne de commande. Sinon - la chaîne de caractère de départ garde sa valeur textuelle. -

-
-
-

Expressions régulières glob

-

Règles d'expansion: - * n'importe quelle chaîne
- ? n'importe quel caractère - [ab12…] un caractère dans la liste
- [^ab12…] un caractère absent de liste
- [a-z] un caractère dans l'intervalle
- [^a-z] un caractère absent de l'intervalle
- {m1, m2} - motif m1 ou m2
- ?(m1|…|mn) - - @(m1|…|mn) - - *(m1|…|mn) - - +(m1|…|mn)
- k motifs parmi mi
- ?: 0 ≤ k ≤ 1 - - @: k = 1 - - *: k ≥ 0 - - +: k ≥ 1 -
- !(m1|…|mn): - ni m1, …, ni mn -

-
-
-

Expressions régulières glob
Exemples

-

ls !(*[aeiouy]?) - La chaine « !(*[aeiouy]?) » est remplacée par la liste de tous - les fichiers dont l'avant dernière lettre du nom n'est pas une - voyelle. S'il n'y a pas de tel fichier, la chaîne - « !(*[aeiouy]?) » est passée à la commande ls.

- - ls [0-9]* affiche la liste des fichiers commençant par un - chiffre

- ls +(abc) affiche la liste des fichiers dont le nom est une - répétition de « abc Â». -
-

-
-
-

Commandes shell de base

- -
-
-

Droits et propriétés des fichiers

-

-Sous Unix un utilisateur est identifié par son login (ou nom -d'utilisateur). Chaque utilisateur est dans un groupe - principal.
-Chaque fichier appartient à un utilisateur et à un groupe.
-Chaque fichier possède 3 permissions pour son propriétaire, son groupe -et tous les autres. Les permissions sont lecture, écriture, exécution -(plus d'autres non abordées dans ce cours).
- - - - - - - - - -
Permission fichier répertoire
lecture (r) lire le contenu du - fichierlister le contenu du répertoire
écriture (w) écrire dans le fichiersupprimer/renommer/créer des - fichiers dans le répertoire
exécution - (x) exécuter le fichier - (si
- - c'est un programme)
rentrer dans le répertoire -
-$ ls -l -drwxr-x--- 9 kim prof 4096 Sep 7 21:31 Documents -

-
-
-

La commande chmod

- - chmod permissions chemin1 … cheminn - -

modifie les permissions des fichiers 1 à n. La chaîne -permissions est soit une suite de modifications de -permissions symbolique soit l'ensemble des permissions données -de manière numérique:
- - chmod 755 fichier.txt - chmod u-w,a+x,g=w fichier.txt - -

-
-
-

Permissions numériques

-

-On groupe les bits de permissions par trois puis on convertit -en décimal:
- - - - - - - - - - - - - - -
Utilisateur - GroupeAutres
r w x r w x r w x
1 1 0 1 0 0 0 0 0
6 - 40
-Le fichier est lisible et modifiable mais pas exécutable par son -propriétaire, lisible pour le groupe. Les autres ne peuvent ni le lire -ni le modifier.

-
-
-

Permissions symboliques

- - cible modifieur permission - - -

-Exemple:
- chmod u+rw,u-x,g+r,g-wx,o-rwx fichier.txt -

-
-
-

Liens symboliques (1)

-

Pour des raisons d'organisation, on veut pouvoir « voir » le même - fichier ou répertoire sous deux noms différents (ou à deux endroits - différents). Par exemple: -

- - $ ls -l Documents/Cours - total 8 - drwxr-xr-x 3 kim prof 4096 Sep 9 11:30 Licence - drwxr-xr-x 3 kim prof 4096 Sep 9 11:30 Master - - $ cd Documents/Cours/Master; ls - Compilation XMLProgInternet - - $ cd XML_Prog_Internet; ls - cours01 cours02 cours03 cours04 cours05 cours06 Prereq - - $ ls -l Prereq - lrwxrwxrwx 1 kim prof 28 Sep 9 11:30 Prereq -> ../../Licence/UnixProgWeb/ - - -
-
-

Liens symboliques (2)

-

La commande ln permet de créer des liens - symboliques. Un lien est un petit fichier qui contient - un chemin vers un fichier de destination. -

-

Exemple d'utilisation

- $ ln -s ../foo/bar/baz/toto.txt rep/titi.txt - -

crée un lien vers le fichier toto.txt - sous le nom titi.txt (chacun placé dans des sous/sur - répertoires) -

- -

Cela permet de créer l'illusion que la cible a été copiée à - l'identique, sans les inconvénients

-
-
-

À propos de la suppression

-

La commande rm fichier efface un fichier définitivement
- La commande rm -d rep efface un répertoire s'il est vide
- La commande rm -r rep efface un répertoire récursivement - mais demande confirmation avant d'effacer des éléments
- La commande rm -rf rep efface un répertoire - récursivement et sans confirmation

-

Toute suppression est définitive

-

Gag classique :

- $ mkdir \~ - ... - $ ls - Documents Photos Musique ~ - $ rm -rf ~ - ☠ ☠ ☠ ☠ ☠ ☠ - -
-
-

Obtenir de l'aide sur une commande

-

La commande man permet d'obtenir de l'aide sur - une commande. Lors qu'une page d'aide est affichée, on peut la faire - défiler avec les touches du clavier, la quitter avec « q » - et rechercher un mot avec la touch « / »

- -LS(1L) Manuel de l'utilisateur Linux LS(1L) - - -NOM - ls, dir, vdir - Afficher le contenu d'un répertoire. - -SYNOPSIS - ls [options] [fichier...] - - Options POSIX : [-1acdilqrtuCFR] - - Options GNU (forme courte) : [-1abcdfgiklmnopqrstuxABCD­ - FGLNQRSUX] [-w cols] [-T cols] [-I motif] [--full-time] - [--format={long,verbose,commas,across,vertical,single-col­ - umn}] [--sort={none,time,size,extension}] - [--time={atime,access,use,ctime,status}] - [--color[={none,auto,always}]] [--help] [--version] [--] - -DESCRIPTION - La commande ls affiche tout d'abord l'ensemble de ses - arguments fichiers autres que des répertoires. Puis ls - affiche l'ensemble des fichiers contenus dans chaque - répertoire indiqué. dir et vdir sont des versions de ls - affichant par défaut leurs résultats avec d'autres for­ - mats. - - - -
-
-

Recherche de fichiers

-

La commande find rep criteres permet de trouver - tous les fichiers se trouvant dans le répertoire rep (ou un - sous répertoire) et répondant à certains critères. Exemples de - critères :

- -

Comment trouver toutes les options de la commande find - ? man find

-
-
-

Quelques commandes utiles

- -

On verra comment composer ces commandes pour exécuter des - opérations complexes

-
- - diff --git a/unix_prog_web/unix_prog_web_02.xhtml b/unix_prog_web/unix_prog_web_02.xhtml deleted file mode 100644 index 8298226..0000000 --- a/unix_prog_web/unix_prog_web_02.xhtml +++ /dev/null @@ -1,1276 +0,0 @@ - - - - - Systèmes d'exploitation (2/2) - - - - - - - - - - - - - - - - - - - - -
-

Unix et Programmation Web

-

Cours 2

-
kn@lri.fr
- http://www.lri.fr/~kn -
-

Gestion des processus

- -
-

Définitions

- - - - - - - - - - - - - - - -
Programme séquences d'instructions effectuant - une tâche sur un ordinateur
Exécutable fichier binaire contenant des - instructions machines interprétables par le - microprocesseur
Thread plus petite unité de traitement (≡ - séquence d'instructions) pouvant être ordonnancée par - l'OS -
Processus instance d'un programme (≡ « un - programme en cours d'exécution »). Un processus est constitué - de un ou plusieurs threads.
-
- -
-

Exemple: programme

-

Dans un fichier « counter.c » - (attention c'est du pseudo - C)

-
- int count = 0; - int exit = 0; - void display() { - while (exit == 0) { - sleep (3); - printf("%i\n", count); - } - } - void listen() { - while (exit == 0) { - wait_connect(80); - count++; - } - } -
- void main () { - run_function(display); - run_function(listen); - while (getc () != '\n') { }; - exit = 1; - return; - } -
-
-
-

Exemple: programme

-

Compilation
- - gcc -o counter.exe counter.c -
- Le fichier « counter.exe » est un - exécutable (fichier binaire contenant du code machine)
- - ./counter.exe ← il faut la permission +x sur le fichier - -
- Le contenu de l'exécutable est copié en mémoire et le processeur - commence à exécuter la première instruction du programme. -

-
-
-

Exemple: threads

-
    -
  1. main
  2. -
  3. attente d'un évènement clavier - →←changement de thread -
  4. -
  5. listen
  6. -
  7. attente de connexion →←changement de thread -
  8. -
  9. display (affiche - 0 à l'écran)
  10. -
  11. attente pendant 3s → (les - 3 threads attendent un évènement externe)
    - nouvelle connexion sur le port 80 ← - réveil du thread listen -
  12. -
  13. listen - (incrémente count)
    - attente de connexion →
    - … fin des 3s
    - ← - réveil du thread display -
  14. -
  15. display (affiche - 1 à l'écran)
  16. -
-

Les threads partagent leur mémoire (variables communes)

-
-
-

Exemple: processus

-

(différence: les processus - ne partagent pas leur espace mémoire)

-
    -
  1. Exécution de counter.exe pendant 50㎲ -
  2. -
  3. Exécution - de firefox.exe - pendant 50㎲
  4. -
  5. Exécution du processus qui dessine le bureau pendant 50 - ㎲
    …
  6. - -
-

C'est le gestionnaire de processus qui décide quel - programme a la main et pour combien de temps (priorité aux - tâches critiques par exemple)
- Le système d'exploitation stocke pour chaque processus un - ensemble d'informations, le PCB (Process Control Block). -

-
-
-

Proccess Control Block

-

Le PCB contient:

- -
-
-

Opérations sur les processus

- -
-
-

États d'un processus

-

Un processus change d'état au cours de son exécution

- - - - - - -
Nouveau le processus est en cours de création
Exécution le processus s'exécute
En attente le processus attend un évènement - particulier (saisie au clavier, écriture sur le disque, - …)
Prêt le processus est prêt à reprendre son - exécution et attend que l'OS lui rende la main
terminé le processus a fini son exécution
-
-
-

États d'un processus

-

L'OS détermine et modifie l'état d'un processus:

- -
-
-

États d'un processus

- - - - - - - - - Nouveau - Prêt - En exécution - En attente - - - - - - - - - - Terminé - - - - - mise en routepar l'ordonnanceur - interruptionpar l'ordonnanceur - attente E/Sinterruption - fin E/Sint. traitée… - terminaisonnormale - terminaisonanormale - - - -
-
-

La commande ps

-

Permet d'avoir des informations sur les processus en cours - d'exécution (voir « man ps » pour les - options):
- $ ps -o user,pid,state,cmd x - USER PID S CMD - … - kim 27030 Z [chrome] <defunct> - kim 27072 S /opt/google/chrome/chrome --type=renderer - kim 29146 S bash - kim 29834 S evince - kim 29858 S emacs cours.xhtml - kim 29869 R ps -o user,pid,state,cmd x -
-

- -
-
-

États des processus (sous Linux)

- - - - - - -
R Running (en cours d'exécution)
S Interruptible sleep (en attente, - interruptible)
D Uninterruptible sleep (en attente, - non-interruptible)
T Stopped (interrompu)
Z Zombie (terminé mais toujours - listé par le système)
-
- -
-

Signaux

-

L'OS peut envoyer des signaux à un processus. Sur réception - d'un signal, un processus peut interrompre son comportement normal - et exécuter son gestionnaire de signal. Quelques signaux: -

- - - - - - - - - -
Nom Code Description
HUP 1 demande au processus de - s'interrompre
INT 2 demande au processus de se - terminer
ABRT 2 interrompt le processus et produit - un dump
KILL 9 interrompt le processus immédiatement -
SEGV 11 signale au processus une erreur mémoire -
STOP 24 suspend l'exécution du processus -
CONT 28 reprend l'exécution d'un processus suspendu -
-
-
-

Processus et terminal

-

Un processus est lié au terminal dans lequel il est - lancé. Si on exécute un programme dans un terminal et que le - processus ne rend pas la main, le terminal est bloqué - - - $ gedit - - - On peut envoyer au processus le signal STOP en - tapant ctrl-Z dans le terminal: - - - $ gedit - ^Z - [1]+ Stopped gedit - - - Le processus est suspendu, la fenêtre est gelée (ne répond plus). -

-
-
-

Processus et terminal

-

On peut reprendre l'exécution du programme de deux - manières:
- $ fg
- Reprend l'exécution du processus et le remet en avant plan (terminal - bloqué)

- $ bg
- Reprend l'exécution du processus et le remet en arrière plan (terminal -libre)

- On peut lancer un programme - directement en arrière plan en faisant:
- $ gedit &
- On peut envoyer un signal à un - processus avec la commande « kill [-signal] pid Â»
- $ kill -9 2345
-

-
-
-

Processus et entrées/sorties

-

Le terminal et le processus sont liés par trois fichiers - spéciaux:

-
    -
  1. L'entrée standard (stdin), reliée - au clavier
  2. -
  3. La sortie standard (stdout), reliée - à l'affichage
  4. -
  5. La sortie d'erreur (stderr), reliée - à l'affichage
  6. -
-

Dans le shell, on peut utiliser les - opérateurs <, > - et 2> pour récupérer le contenu - de stdin, stdout - et stderr:
- -$ sort < toto.txt -$ ls -l > liste_fichiers.txt -$ ls -l * 2> erreurs.txt - -

-
-
-

Processus et entrées/sorties

-

Dans le shell, l'opérateur | permet - d'enchaîner la sortie d'un programme avec l'entrée d'un - autre:
- $ ls -l *.txt | sort -n -r -k 5 | head -n 1 -

-
    -
  1. affiche la liste détaillée des - fichiers textes
  2. -
  3. trie (et affiche) l'entrée standard par ordre - numérique décroissant selon le 5ème champ
  4. -
  5. affiche la première ligne de - l'entrée standard
  6. -
-
- -rw-rw-r 1 kim kim 471 Sep 14 16:25 bd.txt - -rw-rw-r 1 kim kim 234 Sep 15 17:46 foo.txt - -rw-rw-r 1 kim kim 1048576 Sep 24 09:20 large.txt - -rw-rw-r 1 kim kim 1048576 Sep 24 09:20 large.txt - -rw-rw-r 1 kim kim 471 Sep 14 16:25 bd.txt - -rw-rw-r 1 kim kim 234 Sep 15 17:46 foo.txt - - -rw-rw-r 1 kim kim 1048576 Sep 24 09:20 large.txt - -
- -
- -

Écriture de script shell

-
-

Script shell

-

Mentalité Unix beaucoup de petits programmes spécifiques, - que l'on combine au moyen de scripts pour réaliser des actions - complexes. Exemple de fichier script: -

- - #!/bin/bash - - for i in img_*.jpg - do - base=$(echo "$i" | cut -f 2- -d '_') - nouveau=photo_"$base" - if test -f "$nouveau" - then - echo "Attention, le fichier $nouveau existe déjà" - continue - else - echo "Renommage de $i en $nouveau" - mv "$i" "$nouveau" - fi - done - -
-
-

Rendre un script exécutable

-

Si un fichier texte (quel que soit son extension), commence - par les caractères #!/chemin/vers/un/programme, on peut - rendre ce fichier exécutable (chmod +x). Si on l'exécute, - le contenu du fichier est passé comme argument à programme - (qui est généralement un interpréteur) -

-

#!/bin/bash signifie que le corps du fichier est passé au - programme bash qui est l'interprète de commande - (le shell). -

-
-
-

Que mettre dans un script

- -
-
-

Définitions de variables

-

On peut définir des variables au moyen de la notation -VARIABLE=contenu et on peut utiliser la variable -avec la notation $VARIABLE

- -

exemple de définition :

- i=123 - j="Ma super chaine" - TOTO=titi - echo $TOTO - -

exemple d'utilisation: echo $j $i $TOTO
-affiche « Ma super chaine 123 titi

-
-
-

Boucles for

-

Les boucles for ont la syntaxe: - - for VARIABLE in elem1 ... elemn - do - .... - done - -chaque elemi est expansé (comme une ligne de -commande) avant l'évaluation de la boucle: - - for i in *.txt - do - echo $i est un fichier texte - done - -On peut quitter une boucle prématurément en utilisant break -et passer directement au tour suivant avec continue -

-
-
-

Conditionnelle

-

La syntaxe est : - if commande - then - ... - else - ... - fi - -commande est évaluée. Si elle se termine avec succès, -la branche then est prise. Si elle se termine avec un code -d'erreur, la branche else est prise. On peut utiliser la -commande test qui permet de tester plusieurs conditions -(existance d'un fichier, égalités de deux nombres, ...) et se termine -par un succès si le teste est vrai et par un code d'erreur dans le -cas contraire

-
-
-

Conditionnelle (exemple)

-

On regarde tour à tour si fichier1.txt, fichier2.txt, ... existent : - - for i in 1 2 3 4 5 6 - do - if test -f "fichier$i".txt - then - echo le fichier "fichier$i".txt existe - fi - done - -

-
-
-

Sous-commandes et chaines

-

Il est pratique de pouvoir mettre l'affichage d'une commande - dans une variable. On utilise $( commande ... ): - - MESFICHIER=$(ls *.txt) - for i in $MESFICHIER - do - echo Fichier: $i - done - -Attention à la présence de guillemets autour des variables. S'il y a -f1.txt et f2.txt dans le répertoire courant:
- - MESFICHIER=$(ls *.txt) - for i in $MESFICHIER - do - echo Fichier: $i - done -affiche: - Fichier: f1.txt - Fichier: f2.txt - - - MESFICHIER=$(ls *.txt) - for i in "$MESFICHIER" - do - echo Fichier: $i - done -affiche: - Fichier: f1.txt f2.txt - -

-
-
-

Commandes utiles

- -
-

Programmes non interactifs

-
-

Processus de type daemon

-

- Un daemon (prononcé démon) est un processus - qui non-interactif qui tourne en tâche de fond (pas - d'entrée/sortie sur le terminal, pas d'interface graphique, …). On - communique avec ce processus via des signaux ou en lisant - ou écrivant dans des fichiers ou connexions réseau. Le plus souvent, - leur but est de fournir un service -

-

Exemple de scénario: « Les utilisateurs doivent interagir avec - le matériel. L'accès au matériel demande des droits - administrateur. » -

- -
-
-

Quelques daemons sous Linux

- - - - - - - - - - -
Nom Description
sshd shell distant sécurisé
crond exécution périodique de programmes
cupsd serveur d'impressions
pulseaudio serveur de son (mixe les sons des - différentes applications)
udevd détection de matériel hotplug
nfsd serveur de fichier réseau
smtpd livraison des e-mail
httpd serveur de pages Web
-
-
-

Architecture client-serveur

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Client - - - - - Serveur - - - - - - - - - Client - - - - - - - - - - - - - - Client - - - - - - Client - - - - - - - - - - Client - - - - - - Client - - - - - - - - - - - - - -

-

- Des processus clients communiquent - avec le serveur à travers le - réseau. Les clients sont indépendant et ne communiquent pas entre - eux. Attention plusieurs clients peuvent se trouver su la - même machine physique! -

-
-
-

Architecture client-serveur

- -

Exemples: serveur de bases de données, serveur mail, serveur Web, - terminal de carte bancaire, …

-
- - diff --git a/unix_prog_web/unix_prog_web_03.xhtml b/unix_prog_web/unix_prog_web_03.xhtml deleted file mode 100644 index b3dd771..0000000 --- a/unix_prog_web/unix_prog_web_03.xhtml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - Réseaux, TCP/IP - - - - - - - - - - - - - - - - - - - - -
-

Programmation Internet

-

Cours 2

-
kn@lri.fr
- http://www.lri.fr/~kn -
- - - - diff --git a/unix_prog_web/unix_prog_web_04.xhtml b/unix_prog_web/unix_prog_web_04.xhtml deleted file mode 100644 index 2d8f309..0000000 --- a/unix_prog_web/unix_prog_web_04.xhtml +++ /dev/null @@ -1,581 +0,0 @@ - - - - - Web et HTML - - - - - - - - - - - - - - - - - - - -
-

Unix et Programmation Web

-

Cours 4

-
kn@lri.fr
- http://www.lri.fr/~kn -
-

Internet et ses services

-
-

Bref historique d'Internet (1/2)

- - - - - - - - - - - - - - - -
1959-1968 ARPA - (Advanced Research Project Agency) crée un réseau - de quelques machines capable de résister à une attaque.
1969 ARPANET. Interconnexion des ordinateurs - centraux des grandes universités et institutions - américaines. Première utilisation du concept de paquet d'information.
1970-1982 Interconnexion avec la Norvège et le Royaume-Uni. -
1982 Passage au protocole TCP/IP. Naissance de l'Internet actuel.
-
-
-

Bref historique d'Internet (2/2)

- - - - - - - - - - - - - - - -
1986 « Autoroutes de - l'information ». Des super-ordinateurs et les premières - connexions à fibres optiques sont utilisées pour accélérer - le débit d'Internet.
1987-1992 Apparition des premiers fournisseurs - d'accès. Les entreprises se connectent.
1993-2000 Avènement du Web. Démocratisation du haut-débit (vers - 2000 pour la France). -
2000-présent Explosion des services en ligne, arrivée des réseaux - sociaux, internet mobile, Cloud (stockage et calcul - mutualisés accessible depuis internet).
-
- -
-

Internet

- -
-
-

Exemples de services

- - - - - - - - - - - - - - - - -
ServiceProtocolePortDescription
ftp File Transfer Protocol - 20,21 Transfert de fichiers
telnet Network Virtual - Terminal 23 Shell à distance
ssh Secure Shell 22Shell à - distance crypté
mailSimple Mail Transfer - Protocol 25 Envoi de mail
pop Post Office - Protocol 110Récupération de mail
imap Internet Message Access - Protocol 143Synchronisation de mails
nslookup Domain Name - System 42 Serveur de noms
http Hyper Text Transfer Protocole80Web
-
-
-

World Wide Web (1/2)

- -
- -
-

World Wide Web (2/2)

-

Concepts clé:

- - - - -
URL localisation d'une page Web (« adresse de - la page »)
HTTP protocole de communication entre un - client et un serveur Web
HTML langage de description des pages - Web
-

Évolutions récentes (Web 2.0, internet mobile, Cloud, …)

- -
- - -

Fonctionnement du Web

-
-

Fonctionnement du Web

-
- -
- -
- -
-

Côté client

-

Le navigateur :

- -
- -
-

Côté serveur

- -
- -

Adressage des documents Web

-
-

Adressage des documents Web (1/3)

- - -
URL Uniform Resource Locator - identifie un document sur internet
-

Une URL se décompose en 3 partie

- -

Syntaxe (simplifiée) :

- protocole://adresse/document -

Exemple :

- http://www.lri.fr/~kn/teach_fr.html -
- -
-

Adressage des documents Web (2/3)

-

On peut aussi préciser un numéro - de port, des paramètres - et un emplacement : -

- protocole://adresse:port/document?p1=v1&p2=v2#empl -

Exemple :

- http://www.youtube.com:80/results?search_query=tbbt#search-results -

Le serveur utilise les paramètres passés par le client dans - l'URL pour calculer le contenu de la page (changer la - chaîne « tbbt » ci-dessus et essayer)

-
-
-

Adressage des documents Web (3/3)

-

- La racine d'un site Web - (ex: http://www.lri.fr/) correspond - à un répertoire sur le disque du serveur - (ex: /var/www). Le fichier

- http://www.lri.fr/index.html -

se trouve à l'emplacement

- /var/www/index.html -

Le serveur Web peut aussi effectuer des réécritures - d'adresses :

- http://www.lri.fr/~kn/index.html -

devient

- /home/kn/public_html/index.html -
- -

Le protocole HTTP

-
-

Caractéristiques du protocole HTTP

- -
-
-

Format des messages HTTP

-

Les messages ont la forme suivante

- - -
-
-

Démo

-
-

HTML, le format des documents

-
-

HTML

-

- HyperText Markup Language : langage de mise en forme - de documents hypertextes (texte + liens vers d'autres - documents). Développé au CERN en 1989.
- 1991 : premier navigateur en mode texte
- 1993 : premier navigateur graphique (mosaic) - développé au NCSA (National Center for Supercomputing - Applications) -

-
-
-

Document HTML

- -
- - - - - - - - -
Exemple Rendu par défaut
en gras - ]]>Un - texte en gras
Un lien ]]>Un lien
-
  • Premièrement
  • -
  • Deuxièmement
  • - ]]>
      -
    • Premièrement
    • -
    • Deuxièmement
    • -
    -
    -
    -

    On dit que ]]> est une balise - ouvrante et ]]> une - balise fermante. On peut - écrire ]]> comme raccourci pour - ]]>. -

    -
    -
    -

    Historique du langage HTML

    - - - - - - - - -
    1973 GML, Generalised Markup Language développé chez -IBM. Introduction de la notion de balise.
    1980 SGML, Standardised GML, adopté par l'ISO
    1989 HTML, basé sur SGML. Plusieurs entreprises (microsoft, -netscape, ... ) interprètent le standard de manière -différente
    1996 XML, eXtensible Markup Language norme pour les -documents semi-structurés (SGML simplifié)
    2000 XHTML, version de HTML suivant les conventions - XML
    2008 Première proposition pour le nouveau standard, - HTML5
    2014Standardisation de HTML5
    -
    - -
    -

    XHTML vs HTML

    -

    On utilise XHTML dans le cours. Différences avec HTML:

    - -

    Les avantages sont les suivants

    - -
    -
    -

    Rôle d'(X)HTML

    -

    Séparer la structure du document de - son rendu. La structure donne une sémantique au - document :

    - -

    Cela permet au navigateur d'assurer un rendu en fonction de la - sémantique. Il existe différents types de rendus:

    - -
    -
    -

    Exemple de document

    -

    (liste des balises - données sur la feuille de TD 4!)

    -
    - - - - Un titre - - - -

    Titre de section

    -

    premier paragraphe de texte. On met - un lien ici. -

    - - - ]]>
    -
    -
    -
    -

    Structure d'un document XHTML

    -

    Pour être valide un document XHTML contient au - moins les balises suivantes :

    - -
    -

    Encodage des caractères (UTF-8) (digression)

    -
    -

    Représentation des textes

    -

    Avant de représenter des documents complexes, on s'intéresse - aux textes (sans structure particulière)

    -

    Problématique: comment représenter du texte - réaliste ?

    -

    Exemple de texte réaliste:
    - " و عليكم السلام,Здравей,¡Hola!, 你好,Góðan daginn,… - " -

    -
    -
    -

    Historiquement…

    -

    Encodage 1 caractère = 1 octet (8 bits) :

    - -
    -
    -

    … et pendant ce temps là, ailleur dans le monde

    -

    Encodage multi-octets:

    - -

    Impossibilité de mettre plusieurs « alphabets » dans un même - texte

    -

    Chaque logiciel « interprétait » les séquences d'octet de - manière prédéfinie

    -
    -
    -

    UTF-8

    -

    Universal (Character Set) Transformation Format 8 bit

    - -

    Encodage

    - - - - - - - - - - - -
    Nombre d'octetsOctet 1Octet - 2Octet 3Octet 4Octet 5Octet 6
    10xxxxxxx
    2110xxxxxx10xxxxxx
    31110xxxxx10xxxxxx10xxxxxx
    411110xxxx10xxxxxx10xxxxxx10xxxxxx
    5111110xxx10xxxxxx10xxxxxx10xxxxxx10xxxxxx
    61111110xx10xxxxxx10xxxxxx10xxxxxx10xxxxxx10xxxxxx
    -
    -
    -

    Exemples

    -

    A  ⟶  6510 -  ⟶  0100 10102 (représenté sur un - seul octet)

    - -

    ễ  ⟶  787710 -  ⟶  0001 1110 1100 01012 (représenté - 3 octets) :
    - 11100001 1011 10 - 11 1000 0101≡ 225 187 133 -

    -

    🐵 -  ⟶  12805310  ⟶  … - ≡ 240 237 220 181

    -

    Avantages

    - -

    Inconvénients

    - -
    - - diff --git a/unix_prog_web/unix_prog_web_05.xhtml b/unix_prog_web/unix_prog_web_05.xhtml deleted file mode 100644 index 29a7ce1..0000000 --- a/unix_prog_web/unix_prog_web_05.xhtml +++ /dev/null @@ -1,668 +0,0 @@ - - - - - CSS - - - - - - - - - - - - - - - - - - - - -
    -

    Unix et Programmation Web

    -

    Cours 5

    -
    kn@lri.fr
    - http://www.lri.fr/~kn -
    -

    Introduction

    -
    -

    Cascading Style Sheets (CSS)

    - - - - -
    CSS - Langage permettant de décrire le style graphique - d'une page HTML -
    -

    On peut appliquer un style CSS

    - -
    -
    -

    L'attribut style

    - color:redUn lien]]> - -

    Apperçu:

    -

    - Un lien -

    -

    Inconvénients :

    - -
    - -
    -

    L'élément style

    - - - … - - - - Lien 1 Lien 2 - - ]]> -

    Apperçu :

    -

    - Lien - 1 - Lien 2 - -

    -

    Inconvénient : local à une page

    -
    -
    -

    Fichier .css séparé

    -

    Fichier style.css:

    -

    - a { color: red; } -

    -

    Fichier test.html:

    -

    - - - … - ]]><link href="style.css" type="text/css" rel="stylesheet" /> - - … - ]]> -

    -

    Modifications & déploiement aisé

    -
    -
    -

    Syntaxe

    -

    Une propriété CSS est définie en utilisant la - syntaxe: -

    -

    nom_prop : val_prop - ;

    - -
    -

    Boîtes

    -
    -

    Unités de longueur

    -

    CSS permet de spécifier des longueurs comme valeurs de - certaines propriétés (position et taille des éléments, épaisseur - des bordures, …). Les longueurs doivent comporter une - unité. Les unités reconnues sont:

    - - - - - - - - - - - - -
    px pixel
    in pouce (2,54cm)
    cm centimètre
    mm millimètre
    pt point (1/72ème de pouce, 0,35mm)
    pc pica (12 points)
    em facteur de la largeur d'un caractère de la police - courante
    ex facteur de la hauteur d'un caractère « x » - de la police courante
    % pourcentage d'une valeur particulière - (définie par propriété)
    vh viewport height (% de la - hauteur de la partie visible de la page)
    vw viewport - width (% de la largeur de la partie visible de la - page)
    -
    - - -
    -

    Boîte

    - -

    Chaque élément de la page HTML possède une boîte - rectangulaire qui délimite le contenu de l'élément: -

    -
    - ← width →
    - margin (marge)
    - - border (bordure)
    - - padding (ajustement)
    - - Lien 1 - - -
    -
    -
    -
    ↑



    - height



    ↓ -
    -
    - -

    La taille t du contenu est calculée pour que:
    - (height|width) = padding + margin + border + t -

    -
    -
    -

    Marge, bordure, ajustement

    -

    On peut spécifier jusqu'à 4 valeurs:

    - - span { - padding:10pt 20pt 5pt 0pt; - margin:10pt 5pt; - border-width:3pt; - border-color:red blue green; - border-style:solid dotted; - } -
    Du texte dans une boite -
    -
    -
    -

    Modes d'affichage

    -

    La propriété display contrôle le mode - d'affichage d'un élément: -

    - - - - - - -
    nonel'élément n'est pas dessiné et n'occupe - pas d'espace
    inlinel'élément est placé sur la ligne - courante, dans le flot de texte. La taille du contenu (avec - les marges, ajustements et bordures) dicte la - taille de la boîte, height et width sont - ignorés (, , , , …]]> - sont inline par défaut).
    blockl'élément est placé seul sur sa - ligne. La taille est calculée automatiquement mais peut être - modifiée par width et height - (,

    ,

    , …]]> - sont block par défaut)

    inline-blockpositionné comme inline - mais la taille peut être modifiée comme pour block
    -
    -
    -

    Modes d'affichage (exemples)

    -
    -
    - a { display: inline; … } -
    -
    - Le lien 1, - le lien 2 et - le lien 3. -
    -
    -
    -
    - a { display: block; … } -
    -
    - Le lien 1, - le lien 2 et - le lien 3. -
    -
    -
    -
    - a { display: inline-block; - width: 4em; - height: 2em; - … } -
    -
    - Le lien 1, - le lien 2 et - le lien 3. -
    -
    -
    -
    -

    Positionnement

    -

    Le type de positionnement est donné par la - propriété position

    - - - - - -
    staticpositionnement « automatique - »
    fixedpositionnement par rapport à la fenêtre - du navigateur (la boîte est supprimée du flot)
    relativepositionnement « relatif » par - rapport à la position normale
    absolutepositionnement « absolu » par rapport - à l'ancêtre le plus proche qui n'est pas static
    -

    Pour fixed, relative et absolute, - les propriétés top, bottom, left - et right dénotent les décalages respectifs. -

    -
    -
    -fixed - (right:10pt,top:10pt) -

    Positionnement (exemple)

    -
    -
    - a { position: static; - … } - a { position: fixed; - right:10pt; - top: 10pt; - - } - -
    -
    - a { position: relative; - left: 10pt; - bottom: -5pt; - … } - a { position:absolute; - right:0pt; - bottom: 10pt; - } - -
    -
    -

  • …
  • …]]>

    - -
    -

    Autres propriétés

    -
    -

    Couleurs

    -

    Les couleurs peuvent être données:

    - -
    -
    -

    Propriétés du texte

    -

    Certaines propriétés permettent d'alterer le rendu du texte - d'un élément

    - - - - - - -
    directionltr ou rtl - (orientation du texte)
    text-transform capitalize, uppercase, lowercase -
    text-decoration underline, overline, line-through
    text-align left, right, center, justify
    text-indent longueur du retrait de paragraphe
    -
    -
    -

    Propriétés de la police

    - - - - - -
    font-familyliste de nom de polices séparées - par des virgules (Helvetica, sans, "Times New Roman")
    font-style normal, italic
    font-weight normal, lighter, bold, bolder
    font-size soit une longueur - soit xx-small, x-small, small, medium, - large, x-large, xx-large -
    -

    On peut aussi spécifier un descripteur de - police

    - - @font-face { - font-family: Toto; - src: url(toto.ttf); - } - a { font-family: Toto; } - -
    -

    Selecteurs

    -
    -

    Selecteurs

    -

    On peut sélectionner finement les éléments auxquels un style - s'applique

    - - - - - - - - - -
    xtous les éléments dont la balise - est x
    .foo tous les éléments dont - l'attribut class vaut foo
    #fool'élément dont l'attribut - id vaut foo (les id doivent être uniques)
    X Y tous les éléments - selectionnés par Y qui sont des descendants d'éléments - sélectionnés par X
    X > Y tous les éléments dont - selectionné par Y qui sont des fils d'éléments - sélectionnés par X
    a:visitedles liens déjà - visités
    a:linkles liens non - visités
    X:hoverélément selectionné - par X et survollé par la souris
    - div.foo ul li a:visited { color: red; } -
    - -
    -

    exemple : menu dépliable

    - -
  • Entrée 1 -
    • Sous-entrée 1.1
    • -
    • Sous-entrée 1.2
    • -
    • Sous-entrée 1.3
    • -
    -
  • -
  • Entrée 2 -
    • Sous-entrée 2.1
    • -
    • Sous-entrée 2.2
    • -
    • Sous-entrée 2.3
    • -
    -
  • - -]]>
    -
    -
    -

    Analyse

    -

    Pour que le ménu soit « dépliable » lors du survol de la souris, - on souhaite que :

    - -
    -
    -

    exemple : menu dépliable (démo)

    - - -
    -
    -

    Style CSS du menu

    -

    - li { padding: 10pt 0pt 10pt 0pt; - display:block; - background:orange; - color:blue; - } - .sous-menu { display : none; } - - ul.menu > li:hover ul.sous-menu { display: block; } - ul.menu > li:hover ul.sous-menu > li { - background:blue; - color:orange; - } - -

    -
    -
    -

    Priorité d'application des règles (cascade)

    -

    Les règles sont appliquées dans l'ordre suivant :

    - -
    -
    -

    z-index

    -

    Il arrive que certaines boites se recouvrent :

    -
    -
    - Du texte recouvert -
    -
    -
    -
    -

    On peut utiliser la propriété z-index pour définir l'ordre - d'empilement (plus elle est élevée, plus la boite est en avant plan) -

    -
    -
    - Du texte recouvert -
    -
    -
    -
    -
    -

    requête media-type

    -
    -

    Différents styles pour différents affichages

    -

    On peut charger un style CSS de manière conditionnelle grace à - l'attribut media de la balise link. - La valeur de l'attribut est une formule logique où l'on - peut tester le type de support d'affichage ainsi que ces - caractéristiques physiques : -

    - - - - - -]]> -

    Cela permet d'appliquer des styles spécifiques lors de l'impression - d'une page ou pour des terminaux mobiles (ayant une petite taille - d'écran) ou de changer de style si l'orientation de l'écran est modifiée.

    -
    -
    -

    Gestion du débordement

    -

    L'attribut overflow permet de gérer le débordement. Il - peut prendre les valeurs visible, hidden et auto - :

    -
    -Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do -eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad -minim veniam, quis nostrud exercitation ullamco laboris nisi ut -aliquip ex ea commodo consequat. Duis aute irure dolor in -reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla -pariatur. Excepteur sint occaecat cupidatat non proident, sunt in -culpa qui officia deserunt mollit anim id est laborum. -
    -
    -Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do -eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad -minim veniam, quis nostrud exercitation ullamco laboris nisi ut -aliquip ex ea commodo consequat. Duis aute irure dolor in -reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla -pariatur. Excepteur sint occaecat cupidatat non proident, sunt in -culpa qui officia deserunt mollit anim id est laborum. -
    -
    -Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do -eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad -minim veniam, quis nostrud exercitation ullamco laboris nisi ut -aliquip ex ea commodo consequat. Duis aute irure dolor in -reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla -pariatur. Excepteur sint occaecat cupidatat non proident, sunt in -culpa qui officia deserunt mollit anim id est laborum. -
    - -
    - - diff --git a/unix_prog_web/unix_prog_web_06.xhtml b/unix_prog_web/unix_prog_web_06.xhtml deleted file mode 100644 index ecdcfdc..0000000 --- a/unix_prog_web/unix_prog_web_06.xhtml +++ /dev/null @@ -1,708 +0,0 @@ - - - - - PHP : Introduction - - - - - - - - - - - - - - - - - - - - - - -
    -

    Unix et Programmation Web

    -

    Cours 6

    -
    kn@lri.fr
    - http://www.lri.fr/~kn -
    - -

    Introduction et généralités

    - -
    -

    Avant PHP

    -

    Constat: besoin de pages Web dynamiques (contenu - généré au chargement de la page)
    - Première solution: scripts (ou programmes) CGI
    - http://www.example.com/foo.cgi?sort=alpha -

    -
      -
    1. Programme écrit dans n'importe quel langage et exécuté par - le serveur Web
    2. -
    3. Le serveur passe les infos au programme par - des variables d'environnement et l'entrée - standard
    4. -
    5. Le programme génère une page Web par affichage sur la - sortie standard
    6. -
    -

    Inconvénients

    -
      -
    1. Communication difficile entre le serveur Web et le - programme
    2. -
    3. Les langages généralistes ne sont pas faits pour le - Web (pas de support d'HTML nativement par exemple)
    4. -
    -
    - -
    -

    PHP (Avantages)

    - -

    Exemple: fichier heure.php :

    - Heure - -

    L'heure

    -

    Il est ]]><?php echo date('H:i:s'); ?> - - ]]> -

    -
    -

    PHP

    - -
    -
    -

    Principe

    - -
    - - Heure - -

    L'heure

    -

    Il est ]]>15:53:00 - - ]]> -

    -
    - -
    -

    PHP (inconvénients)

    -
    1. Génère du HTML via echo (débuggage - difficile)
    2. -
    3. Interprété : problème de performances si beaucoup de - clients
    4. -
    5. NON TYPÉ : C'est - HORRIBLE
    6. -
    -

    Devinette : qu'affiche l'instruction suivante ? (on ne - connaît pas encore PHP mais on peut utiliser son intuition)

    - echo 013 + "013 c'est en fait 11 en base 8"; - -
    -
    -

    Un mot sur les langages de programmation (subjectif)

    -
      -
    1. Il n'y a pas d'excellent langage de programmation. Par - contre il y a d'excellents programmeurs
    2. -
    3. Connaître plusieurs langages aide à devenir un bon - programmeur (en particulier plusieurs paradigmes différents : - impératifs, objet, fonctionnel, logique, déclaratif, …). -
    4. -
    5. On ne peut pas vraiment se faire plaisir en informatique - en étant un mauvais programmeur
    6. -
    7. Il y a de très mauvais langages, le plus mauvais étant - PHP
    8. -
    -
    - - -

    Types de base et expressions simples

    -
    -

    Entiers (integer)

    -

    Les entiers ont une taille fixe (généralement 32bits) :

    - - - - - -
    Notation décimale10, 3444, -25, 42, - …
    Notation binaire0b10, -0b10001010, - …
    Notation octale0755, -01234567, …
    Notation hexadécimale0x12b, -0xb00b5, - 0xd34db33f, …
    -

    Opérateurs arithmétiques :

    - - - - -
    - « Moins » unaire
    +, -, *, % addition, soustraction, produit, modulo
    /Division. Si - x et y sont des entiers et que y - divise x alors x/y renvoie - un entier sinon x/y renvoie - un flottant! -
    -
    -
    -

    Booléens (boolean)

    - - -
    TRUE/FALSEvrai/faux (en majuscules)
    -

    Opérateurs logiques :

    - - - -
    ! négation (unaire)
    &&, || « et » logique, « ou » logique
    -
    -
    -

    Flottants (float)

    - - -
    Notation scientifique1.3, 0.99, 00.34e102, -2313.2313E-23, - …
    -

    Opérateurs arithmétiques :

    - - - - -
    - « Moins » unaire
    +, -, *, /, % opérations standard
    abs, sin, cos, sqrt, pow, …fonctions - mathématiques pré-définies
    -
    -
    -

    Variables, affectations

    - -

    Exemples :

    - $foo = 123; - $bar = 1323e99; - $_toto = $bar; - -
    -
    -

    Chaînes de caractères (string)

    - - - -
    Simples quotes 'foo', 'c\'est - moi', 'Un antislash : \\', …
    - Pas d'autre séquence d'échappement -
    Doubles quotes"foo", "c'est - moi", "Un retour chariot: \n", "La variable - \$toto contient: $toto"
    - Les séquences d'échapement sont: - \n, \t, \\, \", \$. Les variables (sous-chaînes - commençant par un $) sont remplacées par leur valeur. - -
    -

    Opérations sur les chaînes :

    - - - - - -
    $foo[10] accès au 11ème caractère
    $foo[10] = 'A'; mise à jour
    . concaténation
    strlenlongueur
    -
    -
    -

    Tableaux (array)

    -

    Les tableaux sont des tableaux associatifs :

    - - - - - - - - -
    array()crée un tableau vide
    array(k1 => v1, …, - kn => vn )créé un nouveau tableau pour lequel - l'entrée ki est associée à la - valeur vi -
    array(v1, …, vn )créé un nouveau tableau pour lequel - l'entier i-1 - valeur vi -
    -

    Quelques fonctions :

    - - - - - -
    count taille du tableau (nombre d'éléments)
    sort, rsort trie un tableau (rsort trie par - ordre décroissant) par valeurs. Les clés sont supprimées et - de nouvelles clées de 0 à longueur - 1 sont crées
    ksort, krsorttrie un tableau par - clés
    print_raffiche un tableau (ne pas utiliser echo)
    -
    -
    -

    Tableaux (exemples)

    - $tab1 = array(); //tableau vide - $tab2 = array("zero", "un", "deux", "trois"); - $tab3 = array("pi" => 3.14159, "e" => 2.71828; "phi" => 1.61803); - echo $tab2[0]; //affiche zero - echo $tab3["phi"]; //affiche 1.61803 - $tab1["dix"] = 10; //affectation - sort($tab2); - echo $tab2[0];//affiche deux - sort($tab3); - echo $tab3[0]; //affiche 1.61803 - echo $tab3[1]; //affiche 2.71828 - echo $tab3[2]; //affiche 3.14159 - echo count($tab2); //affiche 4 -
    -
    -

    NULL

    -

    NULL est une constante spéciale, de - type NULL. C'est la valeur d'une variable non déclarée - ou d'un accès invalide dans un tableau.

    - $a = $b; // $b n'est pas déclarée, $a reçoit NULL - $c = $tab["toto"]; // $tab existe mais n'a pas de valeur - // associée à la clé "toto", $c reçoit NULL - -
    -
    -

    Conversions de types

    -

    ☠☢☣☹ : -les conversions se - font implicitement, en fonction du - contexte. -

    - - - - - -
    Booléen 0, 0.0, "", "0", NULL, et le tableau - vide sont convertis en FALSE, le reste - en TRUE (en particulier "00" vaut TRUE - ☹)
    Entier FALSE ⇝ 0, TRUE ⇝ 1, - les flottants sont arrondis par partie entière (1.23242 ⇝ - 1). Les chaînes dont un préfixe - est un entier sont converties en cet entier, sinon en 0 ("123 - bonjour" ⇝ 123)
    Chaîne La chaîne contient la représentation - de la valeur ( 1 . "ABC" - ⇝ "1ABC"). FALSE et NULL sont - convertis en "", TRUE converti en "1"
    -

    La réponse à la devinette : 013 + "013 c'est 11 en octal" :

    - - -
    -
    -

    Comparaisons

    -

    Opérateurs de comparaisons

    - - - - - - - - - - -
    Opérateur Description
    $a == $b Égal, après conversion - de type
    $a != $b Différent, après conversion - de type -
    $a === $b Égal et de même type -
    $a !== $b Différent ou de type différent -
    $a < $b Strictement plus petit, - après conversion de type -
    $a > $b Strictement plus grand, - après conversion de type -
    $a <= $b Plus petit, - après conversion de type -
    $a >= $b Plus grand, - après conversion de type -
    -

    On comparera TOUJOURS des valeurs - de MÊME TYPE

    -
    -
    -

    Affichage

    -

    On utilise l'instruction echo pour écrire - du texte dans la page HTML résultante :

    - - - - - - - - - - - - - - - - - -
    Code PHPCode HTMLAffichage dans le navigateur
    echo "Hello";
    - echo "World";
    HelloWorldHelloWorld
    echo "Hello\n";
    - echo "World";
    Hello
    World
    Hello World
    echo "Hello<br/>";
    - echo "World";
    Hello<br/>WorldHello
    World
    -
    -

    Structures de contrôle

    -
    -

    Conditionnelle: if else

    - - if ( c ) { - // cas then - } else { - // cas else - }; - -

    Les parenthèses autour de la condition c sont - obligatoires. La branche else { … } est - optionnelle. Les accolades sont optionnelles pour les blocs - d'une seule instruction

    -
    -
    -

    Boucles

    -
    - while ( c ) { - //corps de la boucle while - }; -
    -
    - - do { - //corps de la boucle do - } while ( c ); -
    - -
    - - for(init ; test ; incr) { - //corps de la boucle for - }; -
    -
    - - foreach($tab as $key => $val) { - //corps de la boucle foreach - //$tab est un tableau, $key une clé et $val la valeur associée - }; -
    -

    Remarque: ksort et krsort influencent - l'ordre de parcours par une boucle foreach

    -
    -
    -

    break et continue

    - - - - - -
    breaksort de la boucle - immédiatement
    continue reprend à l'itération - suivante
    - - for($i = 0; $i < 10; $i = $i + 1){ - if ($i == 2 || $i == 4) continue; - if ($i == 7) break; - echo $i . ' '; - } - -

    Affiche 0 1 3 5 6

    -
    -

    Passage de paramètres depuis une page

    -
    -

    Formulaire HTML (version simple)

    -

    L'élément <form> permet de créer des formulaires HTML. Un -formulaire est constitué d'un ensemble de widgets (zones de saisies -de textes, boutons, listes déroulantes, cases à cocher, ... ) et d'un -bouton submit. Lorsque l'utilisateur appuie sur le bouton, les -données du formulaires sont envoyées au serveur. Exemple, fichier -age.html :

    - - -
    - Entrez votre année de naissance: - -
    - - - ]]>
    -
    -
    -

    Paramètres

    -

    - Les paramètres envoyés au serveur web par la méthode get, sont - accessibles en PHP dans la variable globale $_GET. C'est un tableau - qui associe au nom d'un input sa valeur. - Exemple : calcul.php

    - - - "; - echo date("Y") - ]]>$_GET["val_age"] ans"; - echo "
    "; - ?> - - - ]]>
    -
    - - -

    Définitions de fonctions

    - -
    -

    Fonctions

    -

    Les fonctions sont déclarées à l'aide du - mot-clé function. On renvoie des résultats à - l'aide du mot-clé return.

    - function double ($x) - { - return $x + $x; - } - - echo double(10); - ]]> - -
    - - -
    -

    Portée des variables locales et globales - -

    -
    -
    - <?php - $a = 42; - function add_a($x) - { - - return $x + $a; - } - echo add_a(10); - ?> - -
    -
    - <?php - $a = 42; - function add_a($x) - { - global $a; - return $x + $a; - } - echo add_a(10); - ?> - -
    -
    - - -

    Le code de gauche affiche 10 ! - Les variables ont une portée locale - par défaut. Si $a n'est pas définie dans le corps de la - fonction, sa valeur est NULL - (variable non définie). Pour référencer - des variables globales, on utilise le mot clé global. -

    -
    -
    -

    Fonction : définition

    -

    On peut utiliser une fonction « avant » de la définir :

    - <?php - echo next(10); - echo <br/>; - - function next($x) - { - return $x + 1; - } - ?> -

    On définira toujours des fonctions avant de - les utiliser. On ne peut pas définir deux fonctions avec le même - nom. -

    -
    -
    -

    Fonctions : passage par référence

    -
    -
    - <?php - function add_a($tab) - { - $tab["a"] = 42; - } - - $mytab = array(); - add_a($mytab); - echo $mytab["a"]; - //n'affiche rien (car NULL ⇝ "") -?> -
    -
    - <?php - function add_a(&$tab) - { - $tab["a"] = 42; - } - - $mytab = array(); - add_a($mytab); - echo $mytab["a"]; - //affiche 42 -?> -
    - -
    -
    -

    On utiliser le modificateur & devant - un paramètre de fonction pour indiquer que ce dernier est passé - par référence.

    - -

    Lorsque l'on veut modifier un argument de la - fonction (plutot que de renvoyer une version modifiée, par - ex. mise à jour d'un tableau, d'une chaîne, …), on doit le - passer par référence. -

    -
    - - - diff --git a/unix_prog_web/unix_prog_web_07.xhtml b/unix_prog_web/unix_prog_web_07.xhtml deleted file mode 100644 index c0762b9..0000000 --- a/unix_prog_web/unix_prog_web_07.xhtml +++ /dev/null @@ -1,645 +0,0 @@ - - - - - PHP : expressions régulières, fichiers, sessions - - - - - - - - - - - - - - - - - - - - -
    -

    Programmation Internet

    -

    Cours 7

    -
    kn@lri.fr
    - http://www.lri.fr/~kn -
    - -

    Manipulation des chaînes et expressions régulières

    -
    -

    Quelques fonctions utilitaires sur les chaînes

    -
    -
    explode($delim, $entree)
    -
    Découpe la chaîne $entre -e suivant la - sous-chaîne $delim et renvoie les morceaux dans un - tableau.
    -
    implode($delim, $tab)
    -
    Réunit les chaînes se trouvant dans le - tableau $tab en les séparant par la - chaîne $delim. -
    -
    ltrim($entree)
    -
    Retire les caractères blancs en début de chaîne.
    -
    rtrim($entree)
    -
    Retire les caractères blancs en fin de chaîne.
    -
    trim($entree)
    -
    Retire les caractères blancs en début et en fin de - chaîne.
    -
    htmlspecialchars($entree)
    -
    convertit les caractères &, ", - ', < et > en - &amp;, &quot;, - &apos;, &lt; et &gt;. -
    - -
    -
    -
    -

    Expressions régulières : syntaxe

    -

    Les expressions régulières de PHP sont au format PCRE (Perl - Common Regular Expressions) '/r/' - où r est une expression de la forme:

    - - - - - - - - - - - - - - - - - -
    r ::= a (un caractère)
    | . (n'importe quel caractère)
    | r1 | r2 (r1 ou r2)
    | r? (r répétée au plus 1 fois)
    | r* (r répétée 0 fois ou plus)
    | r+ (r répétée 1 fois ou plus)
    | [c1 … cn] (un caractère parmis c1, …, cn)
    | [c1-cn] (un caractère parmis c1, …, cn)
    | [^c1 … cn] (un caractère sauf c1, …, cn)
    | [^c1-cn] (un caractère sauf c1, …, cn)
    | ^ (début de texte)
    | $ (fin de texte)
    | (r) (r elle même)
    -
    -
    -
    -

    Expressions régulières : recherche

    - preg_match($regexp, $chaine) -

    renvoie 1 si une sous-chaine de $chaine - correspond à $regexp, 0 si aucune sous-chaine ne correspond - et FALSE en cas de problème (attention, - utiliser === pour tester le résultat). -

    -<?php - $chaine = "ABCDEFABCDEF"; - echo preg_match('/ABC/', $chaine); // affiche 1 - echo preg_match('/DEF/', $chaine); // affiche 1 - echo preg_match('/^ABC/', $chaine); // affiche 1 - echo preg_match('/^DEF/', $chaine); // affiche 0 - echo preg_match('/ABC$/', $chaine); // affiche 0 - echo preg_match('/DEF$/', $chaine); // affiche 1 - echo preg_match('/(ABC...)+/', $chaine); // affiche 1 - echo preg_match('/[^A-Z]+/', $chaine); // affiche 0 - echo preg_match('/[^A-Z]*/', $chaine); // affiche 1 ! - echo preg_match('/^[^A-Z]*$/', $chaine); // affiche 0 -?> -
    -
    -

    Expressions régulières : substitution

    - preg_replace($regexp, $motif, $chaine) -

    recherche toutes les sous-chaînes de $chaine reconnues - par $regexp et les remplace par $motif. Ce dernier - peut contenir $i pour référencer - le ième groupe de parenthèses

    - <?php - $chaine = "10-31-1981"; - $reg1 = "/([0-9]+)-([0-9]+)-([0-9]+)/"; - echo preg_replace($reg1, "$2/$1/$3", $chaine); - // affiche 31/10/1981 - - $reg2 = "/1/"; - echo preg_replace($reg2, "toto", $chaine); - // affiche toto0-3toto-toto98toto - - $reg3 = "/[0-9]([0-9]*)/" - echo preg_replace($reg3, "$1", $chaine); - // affiche 0-1-981 (* déplie la regexp le plus possible) -?> -
    -
    -

    Expressions régulières : séparation

    - preg_split($regexp, $chaine) -

    renvoie un tableau des sous-chaine de $chaine séparées - par $motif (équivalent à explode pour - des $regexp constantes).

    - <?php - $chaine = "Une phrase, c'est plusieurs mots."; - print_r (preg_split("/[ ,.']+/", $chaine)); - //Affiche: - //Array ( [0] => Une [1] => phrase [2] => c [3] => est - // [4] => plusieurs [5] => mots [6] => ) -?> -
    -
    -

    Expressions régulières : recherche exhaustive

    - - preg_match_all($regexp, $chaine, &$resultat) -

    &$resultat est un tableau passé par - référence. Après l'appel, $resultat[0] contient un - tableau avec toutes les sous-chaines reconnues - et $resultat[i] contient tous les résultats reconnus par le - ième groupe de parenthèses. Renvoie le nombre de chaines - trouvées (i.e. la longueur de $resultat[0]). -

    - <?php - $res = array(); - $chaine = "ABC ACD AEF AB DEF"; - echo preg_match_all("/A([A-Z]*)/", $chaine, $res); - //Affiche 4 - print_r ($res); - /*Affiche - Array ( [0] => - Array ( [0] => ABC [1] => ACD [2] => AEF [4] => AB) - [1] => - Array ( [0] => BC [1] => CD [2] => EF [4] => B) - ) -*/?> -
    -

    Manipulation de fichiers

    -
    -

    Envoi d'un fichier au serveur (1/2)

    -

    On utilise la méthode post pour les - formulaires. Les valeurs sont envoyées dans la requête HTTP (et non - pas encodées dans l'URL)

    - - <form action="cible.php" method="post" - enctype="multipart/form-data"> - <input type="file" name="fichier" size="20"/> - <button type="sumbit">Uploader le fichier</button> - </form> - -

    Apperçu:

    - - -
    -

    Coté serveur, la variable $_FILES est - définie. $_FILES["fichier"] contient un - tableau avec des informations sur le fichier envoyé. Les autres - champs (par exemple valeur d'un champ texte) sont stockés dans la - variable $_POST (au lieu de $_GET). -

    -
    -
    -

    Envoi d'un fichier au serveur (2/2)

    -

    Étant donné un formulaire avec un champ input de - type file et de nom "fichier" on a accès aux - information suivantes:

    -
    -
    $_FILES["fichier"]["error"]
    Code d'erreur - (0 si tout c'est bien passé, > 0 si une erreur s'est produite. Les - autres champs ne sont définis que si "error" vaut 0). -
    -
    $_FILES["fichier"]["tmp_name"]
    Nom du fichier - temporaire sur le serveur où a été sauvegardé le contenu du - fichier envoyé
    -
    $_FILES["fichier"]["name"]
    Nom original du fichier
    -
    $_FILES["fichier"]["size"]
    Taille du - fichier
    -
    $_FILES["fichier"]["type"]
    Le type MIME du fichier
    -
    -
    -
    -

    Ouverture d'un fichier

    - fopen($nomfichier, $mode) -

    Ouvre un fichier dont on donne le nom avec un mode - particulier. Les modes sont: "r" - (lecture), "r+" (lecture/écriture), - "w" (écriture), - "w+" (lecture/écriture, création si non-existant), - "a" (écriture, ajout à la fin si existant), - "a+" (lecture/écriture, création si non-existant, - ajout à la fin si existant). fopen renvoie un - descripteur de fichier que l'on peut utiliser pour manipuler le - fichier. -

    . -
    -
    -

    Lecture/écriture/fermeture d'un fichier

    - fread($desc, $taille) -

    Lit au maximum $taille caractères dans un fichier - dont le descripteur (renvoyé par fopen) - est $desc. La fonction renvoie un chaine d'au - plus $taille caractères ou FALSE en cas d'erreur. -

    - fwrite($desc, $chaine) -

    Écrit la chaine de caractères à la position courante dans le - fichier dont le descripteur est $desc. Renvoi le nombre - d'octets écrits ou FALSE en cas d'erreur. -

    - fclose($desc) -

    Ferme le fichier dont le descripteur est $desc -

    -
    -
    -

    Déplacement dans un fichier

    - fseek($desc, $offset, $orig) -

    Déplace le pointeur interne de position du fichier dont le - descripteur est $desc de $offset octets. Le - paramètre $orig donne l'origine: SEEK_CUR - (décalage à partir de la position courante), SEEK_SET - (position absolue dans le fichier), SEEK_END (décalage à - partir de la fin de fichier). -

    -
    -
    -

    Interface simplifiée

    - file_get_contents($nomfichier) -

    Ouvre un fichier dont on donne le nom et renvoie son contenu sous - forme d'une chaine de caractères

    - file($nomfichier) -

    Renvoie un tableau avec une case par ligne dans le fichier. Chaque - entrée contient le "\n" terminal.

    -
    -

    En-tête de requêtes HTTP

    - -
    -

    Retour sur le protocole HTTP

    - -
    - -
    -

    Retour sur le protocole HTTP (2)

    - -
    -
    -

    Modifier le content-type en PHP

    -

    Fichier notes_csv.php:

    - <?php - header('Content-type: application/csv'); - header('Content-Disposition: attachement; filename="notes.csv"'); - echo "Nom, Note\n"; - foreach ($NOTES as $nom => $note) - echo $nom . ", " . $note . "\n"; - - ?> -

    ⚠ Attention!

    - -
    - -
    -

    Quelques en-tête utiles

    -

    En tête utilisés par le serveur dans ses réponses

    -
    -
    Content-type
    type MIME du contenu envoyé par le - serveur
    -
    Content-Disposition
    permet de mentionner un nom de - fichier : attachment; filname="foobar.baz"
    -
    Cache-Control
    permet de forcer le client à - retélécharger la page: no-cache, must-revalidate -
    -
    Last-Modified
    date de dernière modification du - contenu demandé
    -
    -

    En tête utilisés par le client dans ses requêtes

    -
    -
    Range
    permet de ne récupérer qu'un intervale - d'octets donné dans un fichier: bytes=500-999 -
    - … -
    - -
    -
    -

    Retour sur le protocole HTTP (3)

    -

    On rappelle que HTTP est un protocole stateless - (sans état, i.e. le serveur Web ne conserve pas d'information - entre les connexions). Quel problème cela pose-t-il ?

    - -

    ⇒ difficle de réaliser une « application » - moderne répartie sur plusieurs pages

    -
    - -

    Cookies

    -
    -

    Cookies

    -

    Un cookie est un paquet de données envoyé par le - serveur, stocké par le client (navigateur Web) et renvoyé au serveur - lors d'une nouvelle connexion. Les propriétés d'un cookie sont: -

    -
    -
    Son nom
    une chaîne de caractères
    -
    Sa valeur
    une chaîne de caraceres
    -
    Sa durée de vie
    jusqu'à la fin de la « session » ou pour - une période donnée
    -
    Son domaine
    Le nom du site web émetteur du cookie
    -
    Son chemin
    Le sous-répertoire (par rapport à la racine - du site) pour lequel le cookie est valide
    -
    -

    ⚠ Attention! seul le domaine qui a - déposé le cookie est capable de le relire

    -
    -
    -

    Cookies en PHP

    -

    Créer ou mettre à jour un cookie sur le client:

    - - setcookie($nom, $val, $date); - -
    -
    $nom
    nom du cookie
    -
    $val
    valeur du cookie
    -
    $date
    date d'expiration en secondes - depuis epoch (1er janvier 1970 00:00:00) - ou NULL pour une expiration automatique.
    -
    -

    (on peut récupérer le nombre de secondes depuis epoch avec - la fonction time()).
    - Exemple: -

    - setcookie("mon_cookie", "42", time() + 3600 * 24 * 30); -
    -
    -

    Petite digression sur «epoch»

    -

    Représenter le temps (une date) dans un programme informatique est - quelque chose de compliqué. Quels problèmes cela pose-t-il ? -

    - -

    Ce n'est pas encore quelque chose de bien maîtrisé !

    -
    -
    -

    Cookies en PHP

    -

    On peut récupérer la valeur d'un cookie depuis PHP: -

    - $_COOKIE["mon_cookie"] -

    Un cookie "foo" existe (i.e. a été défini - auparavant) si une entrée correspondante existe dans le tableau - global $_COOKIE. On peut tester qu'une entrée - existe dans un tableau avec isset(). -

    -

    ⚠ Attention!

    - -
    - -
    -

    Avantages et inconvénients des cookies

    - -
    -

    Sessions

    -
    -

    Sessions

    -

    Une session HTTP est un ensemble de requêtes/réponses HTTP - entre un serveur et un même client.
    - Exemple d'un sondage en ligne: -

    -
    1. Le visiteur arrive sur la page q1.php en cliquant sur - le lien « commencer le sondage » (Début de session) -
    2. -
    3. Sur q1.php, l'utilisateur coche des choix dans un formulaire et appuie - sur un boutton de soumission qui l'envoie sur q2.php -
    4. -
    5. …
    6. -
    7. Sur q10.php, l'utilisateur coche des choix dans un - formulaire et appuie sur un bouton de soumission qui l'envoie - sur resultat.php
    8. -
    9. Sur resultat.php, le résultat global du sondage (% - par question, nombre de participants jusqu'à présent etc...) est - affiché (Fin de session) -
    10. -
    - -
    -
    -

    Variables de session

    -

    Pour programmer une application Web, on souhaîte avoir accès à - des variables de session c'est à dire des variables qui - sont: -

    - -

    Les variables de sessions sont donc propres à chaque client et - persistent le temp de la session (le temps de session est décidé par - le serveur)

    -
    -
    -

    Variables de session en PHP

    -

    On initie une session avec la fonction:

    - session_start(); -

    Une fois appelée, la variable $_SESSION - contient un tableau que l'on peut utiliser entre plusieurs - pages. Les valeurs contenues dans le tableau persistent jusqu'à la - fin de la session. Une session se termine: -

    - -

    ⚠ - Attention! session_start() doit être appelé - avant le premier echo du fichier.

    -
    -
    -

    Variables de session en PHP (2)

    - - <?php /* Fichier page1.php */ - session_start(); - $_SESSION["Valeur"] = 42; - ?> - - - Veuillez cliquer sur le "page2.php"lien - - -]]> - - - La valeur est echo $_SESSION["Valeur"]; - - - -]]> -
    -
    -

    Avantages et inconvénients des session

    - -
    -
    -

    Sessions PHP: détails d'implantation

    -
    -
    Coté client
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -Connexion à une page PHP (envoie du cookie ("php_ssid", "12345")) - - -
    -
    Coté serveur (PHP)
    - session_start();
    - - génération d'un ID unique "12345"
    - - dépot d'un cookie "php_ssid", valeur "12345", durée 10 minutes - - création dans un tableau global d'une entrée:
    - $_GLOBAL["12345"] = Array();
    -
    - $_SESSION = $_GLOBAL[$_COOKIE["php_ssid"]] -
    -
    -
    - -
    -

    Dans la vraie VieTM

    -

    Mélange de variables de sessions, cookies et bases de données.
    - Scénario réaliste: site de commerce en ligne -

    - -

    Pourquoi ?

    - - -
    - - - diff --git a/unix_prog_web/unix_prog_web_08.xhtml b/unix_prog_web/unix_prog_web_08.xhtml deleted file mode 100644 index 76dda71..0000000 --- a/unix_prog_web/unix_prog_web_08.xhtml +++ /dev/null @@ -1,280 +0,0 @@ - - - - - Formulaires - - - - - - - - - - - - - - - - - - - - -
    -

    Unix et Programmation Web

    -

    Cours 8

    -
    kn@lri.fr
    - http://www.lri.fr/~kn -
    - -

    Formulaires (utilisation avancée)

    -
    -

    Champs de texte

    -

    On peut placer un champ de texte dans un formulaire au moyen - de la balise <input type="text" - />. -

    - ]]> -

    Apperçu:

    - Attributs: -

    - -

    Accès à la valeur depuis PHP se fait - via $_GET["montexte"] ou $_POST["montexte"] - selon la valeur de l'attribut method de - l'élément form englobant.

    - -
    - -
    -

    Champs de texte long

    -

    Pour des textes multilignes, on utilise la - balise <textarea />. -

    - du texte! -]]> -

    Apperçu: - Attributs: -

    - -

    On peut pré-remplir la zone en mettant du texte entre la - balise ouvrante et fermante. - Accès à la valeur depuis PHP se fait - via $_GET["montexte"] ou $_POST["montexte"] - selon la valeur de l'attribut method de - l'élément form englobant.

    -
    -
    -

    Listes déroulantes

    -

    On peut définir une liste déroulante avec les - balises <select> et <option>

    - - - - - - -]]> -

    Apperçu: - Attributs: -

    - -

    Le contenu de chaque élément option est celui affiché dans la - liste. - Accès à la valeur depuis PHP se fait - via $_GET["maliste"] ou $_POST["maliste"] - selon la valeur de l'attribut method de - l'élément form englobant.

    -
    -
    -

    Boutons à choix unique

    -

    On peut définir un choix avec la balise - <input type="radio">

    - - 12h - 20h -]]> - -

    Apperçu : 8h -12h -20h -

    -

    - Accès à la valeur depuis PHP se fait - via $_GET["h"] ou $_POST["h"] - selon la valeur de l'attribut method de - l'élément form englobant.
    - Attention il faut réutiliser la même valeur de - l'attribut name pour les boutons du même groupe. - -

    -
    -
    -

    Cases à choix multiples

    -

    On peut définir des cases à cocher à choix multiple avec la balise - <input type="radio">

    - - 12h - 20h -]]> - -

    Apperçu: - 8h - 12h - 20h -

    -

    - Accès à la valeur depuis PHP se fait - via $_GET["tab"] ou $_POST["tab"] - selon la valeur de l'attribut method de - l'élément form englobant.
    - Attention il faut rajouter [] dans l'attribut name pour - que PHP crée un tableau. tab[i] contient la - valeur de la ième cases cochée (à partir de 0). - -

    -
    -

    Variables super-globales (rappels)

    -
    -

    Variables super-globales

    -

    PHP définit un certain nombre de variables dites - « super-globales Â». Ce sont des variables accessible - depuis n'importe où dans un programme PHP, y compris depuis des - fonctions, sans adjonction du mot clé global.

    - - $TOTO = 42; - function f() { - global $TOTO; // obligatoire, sinon $TOTO n'est pas visible - - echo $TOTO; - echo $_GET["champ"]; //fonctionne toujours, même sans 'global' - //au début de la fonction. - - } - - -
    -
    -

    Variable $_GET et $_POST

    -

    - Ces variables contiennent les valeurs des champs d'un formulaire. - Si l'attribut method de l'élément form - vaut get la variable $_GET contient les valeurs. - S'il vaut post la variable $_POST est à utiliser. -

    -
    -
    -

    Variable $_FILES

    -

    - Cette variable contient les informations relatives aux fichiers - envoyés par le client.
    Si le nom du champ est fichier, - alors: - -

    -
    -
    $_FILES["fichier"]["error"]
    Code d'erreur - (0 si tout c'est bien passé, > 0 si une erreur s'est produite. Les - autres champs ne sont définis que si "error" vaut 0). -
    -
    $_FILES["fichier"]["tmp_name"]
    Nom du fichier - temporaire sur le serveur où a été sauvegardé le contenu du - fichier envoyé
    -
    $_FILES["fichier"]["name"]
    Nom original du fichier
    -
    $_FILES["fichier"]["size"]
    Taille du - fichier
    -
    $_FILES["fichier"]["type"]
    Le type MIME du fichier
    -
    -
    -
    -

    Variable $_SESSION

    -

    Contient les variables de sessions. La variable n'est - accessible qu'après un appel à session_start(). Ces - le contenu de cette variable persiste durant toute la durée de la - session même sur des pages différentes. La - variable $_SESSION est un tableau. -

    -
    - -
    -

    Variable $_COOKIE

    -

    Contient les cookies que le client à envoyé au serveur. - La - variable $_COOKIE est un tableau. -

    -
    -

    Conception d'une application simple (étude de cas)

    -
    -

    Cahier des charges

    -

    On souhaite créer une application Web simple de gestion de QCM. - L'application doit répondre au contraintes suivantes : -

    - -
    -
    -

    But du jeu

    -

    Nous allons concevoir, le plus précisément possible l'application - (prenez des notes) : -

    - - -

    Vous devrez écrire le code correspondant en TP

    -
    - - - - - diff --git a/unix_prog_web/unix_prog_web_09.xhtml b/unix_prog_web/unix_prog_web_09.xhtml deleted file mode 100644 index c5267ae..0000000 --- a/unix_prog_web/unix_prog_web_09.xhtml +++ /dev/null @@ -1,564 +0,0 @@ - - - - - Notions de sécurité sur le Web - - - - - - - - - - - - - - - - - - - - -
    -

    Unix et Programmation Web

    -

    Cours 9

    -
    kn@lri.fr
    - http://www.lri.fr/~kn -
    - -

    Faiblesses d'HTTP

    - -
    -

    Disclaimer

    - -

    Ça ne va pas faire de vous des hackers, - juste vous sensibiliser aux problèmes de sécurité… -

    -
    - -
    -

    Élements de cryptographie (1)

    -

    Alice et Bob veulent échanger des données - confidentielles.

    -
      -
    1. 1. Chiffrement symétrique: -
        -
      • - Ils se mettent d'accord sur une clé commune -
      • -
      • Alice chiffre son message avec la clé et - l'envoie à Bob
      • -
      • Bob déchiffre le message avec la clé -
      • -
      -

      - Non sûr (Alice et Bob doivent se mettre d'accord sur une clé en - « clair », par email par exemple) ou non pratique - (ils doivent se rencontrer physiquement pour échanger la - clé).
      - Efficace: on peut implanter plusieurs algorithmes - de chiffrements en utilisant uniquement des opérations - logiques de bases - (AND, OR, XOR). Il est facile de - les implanter sur des puces dédiées (cartes de crédit, - processeurs mobiles). Ils sont « sûrs » tant que la clé - reste secrète. -

      -
    2. -
    -
    -
    -

    Élements de cryptographie (2)

    -

    Alice et Bob veulent échanger des données - confidentielles.

    -
      -
    1. 2.  Chiffrement assymétrique: -
        -
      • Bob crée une clé - publique KBpub - et une clé - secrète KBpriv, telle - que
        - ∀msg, KBpriv(KBpub(msg)) - = KBpub(KBpriv(msg)) - = msg -
        - Bob diffuse sa clé publique (sur sa page Web - par exemple, ou dans un annuaire de clé) et garde sa clé - privée secrète. -
      • -
      • Alice chiffre son message m avec la clé - publique de Bob - (KBpub(m)) et l'envoie à Bob -
      • -
      • Bob - déchiffre le message avec sa clé - privée: KBpriv(KBpub(m))=m -
      • -
      -

      - Sûr et pratique (Bob a généré une paire de clé, et a - déposé la clé publique sur une page Web)
      - Peu efficace: repose sur des problèmes - mathématiques difficiles (factorisation de grands entiers, - courbes eliptiques sur les corps finis). Chiffrer et - déchiffrer un message n'est pas réaliste pour des grands - messages (vidéo en streaming, requêtes Web, …). -

      -
    2. -
    -
    -
    -

    Élements de cryptographie (3)

    -

    On combine les deux méthodes. (Alice envoie un message à Bob)

    - -

    Ceci est à la base de protocoles tels que HTTPS

    -
    - -
    -

    Éléments de cryptographie (4)

    -

    Le chiffrement assymétrique permet aussi d'avoir la - preuve que quelqu'un est bien Bob!

    - -

    Comment garantir que la personne qui a généré - les clés au départ est bien Bob ? -

    -
    -
    -

    Une analogie

    -

    La cryptographie assymétrique fonctionne exactement comme - l'analogie de la boîte aux - lettres. Pourquoi ? -

    - - -
    -
    -

    HTTP: protocole texte « en clair »

    -

    HTTP est un protocole texte, les données ne sont - pas chiffrées (cf. TP3) et sans identification

    - -
    -
    -

    Espionnage de connexion

    -

    Alice représente le client, Bob le serveur et Eve (Eavesdropper) - l'attaquante

    -

    On suppose que Eve est root sur la - machine. Il suffit de lire les paquets qui transitent par la - carte réseau (tcpdump sous Linux). -

    - -

    Ce problème touche tous les protocoles en clair: HTTP, POP, - IMAP, FTP, …. Il peut être résolu grace au chiffrement - de toute la connexion.

    -
    -
    -

    Attaque Man in the middle

    -

    Mallory se place entre Alice (cliente) et Bob (banque), par exemple au - moyen d'un e-mail frauduleux en HTML:

    -
    1. L'émail contient: - - - Bonjour, - veuillez vous connecter à votre banque en cliquant ici: - www.bob.com - -]]> -
    2. -
    3. Alice, insouciante, clique sur le lien -

      - A M B -
      -
    4. -
    5. Mallory peut retransmettre les requêtes entre Bob et - Alice, en les modifiant au passage. Le problème est causé - par un manque d'authentification (Mallory n'a pas a - prouver à Alice qu'il est Bob) -
    6. -
    -
    -
    -

    Solution: HTTPS

    -

    HTTP Secure

    -
    1. Respose sur de la cryptographie assymétrique (pour - l'authentification et le partage de clé) et symétrique (pour le - chiffrement de connexion)
    2. -
    3. Permet d'authentifier les correspondants et de protéger - les données -
    4. -
    5. Suppose l'existence de tiers de confiance Alice - et Bob font confiance à Trent (Trusted Third - Party)
    6. -
    -

    Bob possède des clés publiques et privées - (KBpub - et KBpriv), Trent possède des clés - publiques et privées (KTpub - et KTpriv) -

    -
    -
    -

    HTTPS (détail du protocole)

    -

    Bob et Trent se rencontrent. Trent signe - la clé publique de Bob en calculant -

    - SB=KTpriv(KBpub) -
    - Comme Trent utilise sa clé privée on sait que seul - Trent a pu générer cette signature. De plus, Trent - a rencontré Bob donc il certifie que la - clé KBpub appartient bien à - quelqu'un nommé Bob. -

    -
      -
    1. Alice (client) veut se connecter à Bob. Bob fournit sa - clé publique KBpub et la - signature SB
    2. -
    3. Alice contacte Trent (en qui elle a confiance) et récupère sa clé - publique KTpub. Elle déchiffre la - signature: KTpub(SB) - et vérifie qu'elle retombe bien sur la clé publique de Bob. -
    4. -
    5. Elle peut alors choisir une clé symétrique, la chiffrer - avec KBpub et entammer une - communication chiffrée et authentifiée avec - Bob.
    6. -
    -
    -
    -

    Tiers de confiance

    -

    Les tiers de confiance sont des entités (états, associations, - compagnies privées) qui se chargent de vérifier les clés - publiques d'autres entitées. C'est une - vérification physique (documents administratifs, …). -

    -
    ssl -
    -

    Cette erreur s'affiche quand une signature n'est pas conforme - ou n'a pas pu être vérifiée

    -
    - -
    -

    Tiers de confiance

    -

    Attaques contre les authorités de certifications - (tiers de confiance): difficiles, mais pas impossible. Certains - tiers de confiance sont douteux (états voyous, compagnie - piratées dont les clées privées sont compromises,…)
    - Attaques d'implémentation (plus probables) : on - exploite un bug dans le code des serveurs web ou des - navigateurs
    - Autres faiblesses: HTTPS est en « haut » dans la pile - IP (application). On peut donc avoir connaissance du nombre de - paquet échangés, des adresses IP des participants, la taille - et la fréquence des paquets… (même si on n'en connait pas le - contenu). Cela permet certaines attaques statistiques ou de deni - de service (DoS). -

    -
    -
    -

    Bug dans HTTPS: Heartblead

    -

    Heartblead est un bug découvert en 2014 dans la - bibliothèque OpenSSL (Bibliothèque qui implémente toutes les - primitives cryptographiques de bas niveau nécessaire à HTTPS, - entre-autres, et utilisée par tout le monde). Cette attaque - touche la partie heartbeat du - protocole. Le heartbeat est un message périodique - envoyé par le client au serveur pour lui demander si la - connexion/session est toujours active (ou pour lui signaler de - ne pas la fermer). -

    -
      -
    • Serveur, es-tu vivant ? si oui répond 'Bonjour' (6 - lettres)
    • -
    • Bonjour
    • -
    • Serveur, es-tu vivant ? si oui répond - 'Je suis là' (10 lettres)
    • -
    • Je suis là
    • -
    • Serveur, es-tu vivant ? si oui répond - 'Oui' (1024 lettres)
    • -
    • Oui....Serveur, je suis l'admin, modifie le - mot de passe à '1023hasd834!' ... Tiens, autre client, je - t'envoie la page que tu m'as demandée ... <html><body ....
    • -
    -
    -

    Confidentialité, traîtement des cookies

    -
    -

    Traçage par cookies

    -

    Normalement, un cookie ne peut être - lu que que par le site émetteur (cf. cours 8). But:

    -
      -
    1. Empêcher un tiers de lire des données personnelles - (ok)
    2. -
    3. Empêcher un tiers de savoir quels sites ont été visités - (pas ok)
    4. -
    -
      -
    1. Un site B utilise des publicités pour se rémunérer. Le - site marchand M fournit du code HTML: - <script src="http://marchand.com/pub.js"/> -
    2. -
    3. A visite le site B. Le - code pub.js peut alors faire les choses suivantes: -
        -
      1. Scanner le contenu de la page de B. Possible car le - script est « inclus » dans une page fournie par B
      2. -
      3. Se connecter - àhttp://marchand.com/collecte.php et - passer en paramètre post ou get le - contenu de la récolte
      4. -
      5. http://marchand.com peut alors stocker un - cookie valide pour son domaine avec le contenu de - la récolte d'information -
      6. -
      -
    4. -
    5. - Lorsque A visite le site marchand M, ce dernier - relit son cookie et fait des propositions ciblées. -
    6. - -
    -
    -
    -

    Solutions

    -
      -
    • Désactiver les cookies de « tierce partie » (cookie dont - l'origine n'est pas celle de la page visitée) -
    • -
    • Effacer par défaut tous les cookies quand on quite le - navigateur
    • -
    • Rajouter des exceptions pour certains sites au cas par cas -
    • -
    -

    Nouveau standard du W3C en préparation pour signifier à un - site qu'on ne souhaite pas être suivi (méthode « volontariste - » qui suppose que les sites commerciaux sont gentils et - respectent le protocole)

    -
    -
    -

    Sécurité des cookies de session

    -

    On a vu que les sessions PHP (vrai aussi pour les autres - langages côté serveur) stockent dans un cookie un identifiant - unique. Que se passe-t-il si on vole ce cookie ? (démo) -

    -

    Pas d'autre solution que de faire confiance - au root (solutions partielles basées sur le chiffrement - des disques dur) -

    -
    -

    Attaques par injection de code

    -
    -

    Injection de code Javascript/HTML

    -

    Vulnérabilité: on exploite le fait qu'un site utilise - directement les entrées fournies par l'utilisateur.
    - Exemple: commentaires sur un blog. -

    -
      -
    1. Une page Web utilise un formulaire pour permettre de - poster des commentaires sur un blog: - - Commentaire:
      - ]]><textarea rows="20" cols="60" name="zonetexte"/> - -]]>
      -
    2. -
    3. Un bout de code PHP écrit le commentaire sur la page: - echo "Commentaire #$i: <p>"; - echo $_POST["zonetexte"]; - echo "</p>"; - -
    4. - - -
    -
    -
    -

    Injection de code Javascript/HTML

    - Problème tout ce qui est dans la zone de texte est copié - dans la page HTML de chaque client qui consulte la page - et interprété par son navigateur: - Debut du commentaire - <script type="text/javascript"> - ... //code javascript malicieux - </script> - Fin du commentaire - -
    -
    -

    Injection de code PHP

    -

    Problème lié à l'utilisation de la fonction - eval($code) - $code est une chaîne de caractères - considérée comme étant du code PHP et eval exécute - cette chaîne: -

    - - echo eval ("1 + 2 * 3"); // affiche 7 - echo eval ('$x = 4;'); // définit la variable $x - echo $x; // affiche 4 - -

    Il ne faut jamais donner une chaine de caractère de - l'utilisateur comme argument à eval (sauf durant le - TP 9)

    -
    -
    -

    Solutions

    -
      -
    • Ne jamais utiliser eval
    • -
    • Utiliser la fonction htmlspecialchars qui - échappe les - caractères <, >, &, ', "
    • -
    • Utiliser la fonction striptags qui supprime tout - ce qui est une balise
    • -
    • Toujours valider les entrées d'un utilisateur
    • -
    -
    -
    -

    Injection de code SHELL (en PHP)

    -

    Problème lié à l'utilisation de la fonction - exec($command, &$output) - Cette fonction exécute dans un SHELL la - commande $command. Les lignes de la sortie standard - de la commande sont placées dans le table $output - passé en référence. (Démo avec unzip -l).
    - Solutions: -

    -
      -
    • Ne jamais passer à exec directement une chaîne crée par - l'utilisateur
    • -
    • Recréer sois-même la chaîne de caractères, échapper les - caractères spéciaux et remettre le tout dans une chaîne pour - éviter les expansions du SHELL
    • -
    • Utiliser des fonctions de la bibliothèque standar quand - elle existes (par exemple rename plutot - que exec('mv ...')).
    • -
    -
    -
    -

    Injection de code SQL

    -

    SQL: language de requête permettant d'interroger des bases de - données. Utilisation classique depuis PHP (on suppose un - formulaire qui met dans le champ "nom" le nom d'un - étudiant): -

    - - $Q = "SELECT * FROM STUDENTS WHERE "; - $Q = $Q . "(NAME = '" . $_POST["nom"] . "');"; - mysql_query($Q); - -

    Si l'utilisateur donne comme nom « Toto », la requête envoyée - à la base est:

    - SELECT * FROM STUDENTS WHERE (NAME = 'Toto'); -

    Affiche toutes les lignes de la table STUDENTS pour - lesquel le nom est Toto

    -
    -
    -

    Jusqu'au jour où …

    -

    ©xkcd
    - -

    - SELECT * FROM STUDENTS WHERE (NAME ='Robert'); - DROP TABLE STUDENTS; --');' - - -
    -
    -

    Ou bien…

    -
    - -
    -
    - - diff --git a/unix_prog_web/xkcd.png b/unix_prog_web/xkcd.png deleted file mode 100644 index 530ddc0..0000000 Binary files a/unix_prog_web/xkcd.png and /dev/null differ diff --git a/xpi/factory_pattern_uml_diagram.jpg b/xpi/factory_pattern_uml_diagram.jpg deleted file mode 100644 index 5a7602d..0000000 Binary files a/xpi/factory_pattern_uml_diagram.jpg and /dev/null differ diff --git a/xpi/pdf/xpi_01.pdf b/xpi/pdf/xpi_01.pdf deleted file mode 100644 index fb5b7b1..0000000 Binary files a/xpi/pdf/xpi_01.pdf and /dev/null differ diff --git a/xpi/pdf/xpi_01_print.pdf b/xpi/pdf/xpi_01_print.pdf deleted file mode 100644 index ed95e89..0000000 Binary files a/xpi/pdf/xpi_01_print.pdf and /dev/null differ diff --git a/xpi/pdf/xpi_02.pdf b/xpi/pdf/xpi_02.pdf deleted file mode 100644 index 70fd9da..0000000 Binary files a/xpi/pdf/xpi_02.pdf and /dev/null differ diff --git a/xpi/pdf/xpi_02_print.pdf b/xpi/pdf/xpi_02_print.pdf deleted file mode 100644 index f7d6679..0000000 Binary files a/xpi/pdf/xpi_02_print.pdf and /dev/null differ diff --git a/xpi/pdf/xpi_03.pdf b/xpi/pdf/xpi_03.pdf deleted file mode 100644 index 5584f20..0000000 Binary files a/xpi/pdf/xpi_03.pdf and /dev/null differ diff --git a/xpi/pdf/xpi_03_print.pdf b/xpi/pdf/xpi_03_print.pdf deleted file mode 100644 index 8886900..0000000 Binary files a/xpi/pdf/xpi_03_print.pdf and /dev/null differ diff --git a/xpi/pdf/xpi_04.pdf b/xpi/pdf/xpi_04.pdf deleted file mode 100644 index e9ee460..0000000 Binary files a/xpi/pdf/xpi_04.pdf and /dev/null differ diff --git a/xpi/pdf/xpi_04_print.pdf b/xpi/pdf/xpi_04_print.pdf deleted file mode 100644 index 3f23392..0000000 Binary files a/xpi/pdf/xpi_04_print.pdf and /dev/null differ diff --git a/xpi/pdf/xpi_05.pdf b/xpi/pdf/xpi_05.pdf deleted file mode 100644 index 1465aea..0000000 Binary files a/xpi/pdf/xpi_05.pdf and /dev/null differ diff --git a/xpi/pdf/xpi_05_print.pdf b/xpi/pdf/xpi_05_print.pdf deleted file mode 100644 index 3763801..0000000 Binary files a/xpi/pdf/xpi_05_print.pdf and /dev/null differ diff --git a/xpi/pdf/xpi_06.pdf b/xpi/pdf/xpi_06.pdf deleted file mode 100644 index b53af97..0000000 Binary files a/xpi/pdf/xpi_06.pdf and /dev/null differ diff --git a/xpi/pdf/xpi_06_print.pdf b/xpi/pdf/xpi_06_print.pdf deleted file mode 100644 index f8530db..0000000 Binary files a/xpi/pdf/xpi_06_print.pdf and /dev/null differ diff --git a/xpi/pdf/xpi_07.pdf b/xpi/pdf/xpi_07.pdf deleted file mode 100644 index dfb5ea8..0000000 Binary files a/xpi/pdf/xpi_07.pdf and /dev/null differ diff --git a/xpi/pdf/xpi_07_print.pdf b/xpi/pdf/xpi_07_print.pdf deleted file mode 100644 index 444a427..0000000 Binary files a/xpi/pdf/xpi_07_print.pdf and /dev/null differ diff --git a/xpi/pdf/xpi_08.pdf b/xpi/pdf/xpi_08.pdf deleted file mode 100644 index 9b2289c..0000000 Binary files a/xpi/pdf/xpi_08.pdf and /dev/null differ diff --git a/xpi/pdf/xpi_08_print.pdf b/xpi/pdf/xpi_08_print.pdf deleted file mode 100644 index 071f142..0000000 Binary files a/xpi/pdf/xpi_08_print.pdf and /dev/null differ diff --git a/xpi/recette.xml b/xpi/recette.xml deleted file mode 100644 index ed5590f..0000000 --- a/xpi/recette.xml +++ /dev/null @@ -1,16 +0,0 @@ - -Tiramisú - - mascarpone - oeufs - sucre - café - biscuits - -2h - - Séparer les blancs des jaunes - … - … - - diff --git a/xpi/test.xsl b/xpi/test.xsl deleted file mode 100644 index 33f0db0..0000000 --- a/xpi/test.xsl +++ /dev/null @@ -1,21 +0,0 @@ - - - - - Foo - - - - - b - i - - - - Gras - - - - - diff --git a/xpi/tree.svg b/xpi/tree.svg deleted file mode 100644 index 2a22beb..0000000 --- a/xpi/tree.svg +++ /dev/null @@ -1,468 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - bibliography - book - book - title - author - author - year - publisher - title - author - year - publisher - "Foundations of Databases" - "Abiteboul" - "Hull" - "Vianu" - "Addison Wesley" - "1995" - - - - - - - "The Lord of the Rings" - "J. R. R. Tolkien" - "Houghton Mifflin" - "2001" - - - - - #document - - author - - diff --git a/xpi/xpi_01.xhtml b/xpi/xpi_01.xhtml deleted file mode 100644 index 0ca0c8a..0000000 --- a/xpi/xpi_01.xhtml +++ /dev/null @@ -1,506 +0,0 @@ - - - - - Introduction, UTF-8 et XML - - - - - - - - - - - - - - - - - - - -
    -
    -

    XML et Programmation Internet

    -

    Cours 1

    -
    kn@lri.fr -
    - -
    -

    Contenu du cours

    -
      -
    1. XML pour la représentation des données -
        -
      • Motivation, présentation d'XML sérialisé (cours 1)
      • -
      • Notions de schémas et de validation (cours 1)
      • -
      -
    2. -
    3. Interroger des - documents XML -
        -
      • XPath (cours 2-3)
      • -
      • XSLT (cours 3-4)
      • -
      -
    4. -
    5. Programmer - avec XML -
        -
      • Les modèles DOM et SAX (cours 5)
      • -
      • XML Avancé: encodage relationnel (cours 6)
      • -
      -
    6. - -
    - -
    -
    -

    Modalités de Contrôle des Connaissances (MCC)

    -

    2 sessions:

    - -

    Organisation:

    - -
    -

    Introduction

    -
    -

    Qu'est-ce qu'XML ?

    -

    XML (eXtensible Markup Language) est un standard de - représentation de données

    - -
    -
    -

    En a-t-on besoin ?

    -

    Quels sont les autres moyen de représenter les données ?

    - -

    Quels sont les désavantages des - représentations ci-dessus ?

    - - -
    - - -
    -

    Historique

    - -
    -
    -

    Exemples d'utilisation

    - - -
    -

    Le standard UTF-8

    -
    -

    Représentation des textes

    -

    Avant de représenter des documents complexes, on s'intéresse - aux textes (sans structure particulière)

    -

    Problématique: comment représenter du texte - réaliste ?

    -

    Exemple de texte réaliste:
    - " و عليكم السلام,Здравей,¡Hola!, 你好,Góðan daginn,… - " -

    -
    -
    -

    Historiquement…

    -

    Encodage 1 caractère = 1 octet (8 bits) :

    - -
    -
    -

    … et pendant ce temps là, ailleur dans le monde

    -

    Encodage multi-octets:

    - -

    Impossibilité de mettre plusieurs « alphabets » dans un même - texte

    -

    Chaque logiciel « interprétait » les séquences d'octet de - manière prédéfinie

    -
    -
    -

    UTF-8

    -

    Universal (Character Set) Transformation Format 8 bit

    - -

    Encodage

    - - - - - - - - - - - -
    Nombre d'octetsOctet 1Octet - 2Octet 3Octet 4Octet 5Octet 6
    10xxxxxxx
    2110xxxxxx10xxxxxx
    31110xxxxx10xxxxxx10xxxxxx
    411110xxxx10xxxxxx10xxxxxx10xxxxxx
    5111110xxx10xxxxxx10xxxxxx10xxxxxx10xxxxxx
    61111110xx10xxxxxx10xxxxxx10xxxxxx10xxxxxx10xxxxxx
    -
    -
    -

    Exemples

    -

    A  ⟶  6510 -  ⟶  0100 10102 (représenté sur un - seul octet)

    - -

    ễ  ⟶  787710 -  ⟶  0001 1110 1100 01012 (représenté - 3 octets) :
    - 11100001 1011 10 - 11 1000 0101≡ 225 187 133 -

    -

    🐵 -  ⟶  12805310  ⟶  … - ≡ 240 237 220 181

    -

    Avantages

    - -

    Inconvénients

    - -
    -

    XML

    -
    -

    Qu'est-ce qu'un document XML ? (1)

    - -

    Exemple

    - - ceci est la racine on peut y mettre des - balises imbriquées comme - on veut si - elles sont bien parenthésées -]]> - -
    -
    -

    Qu'est-ce qu'un document XML ? (2)

    - -

    Exemple

    - < - - Un autre exemple -]]> - - -
    -
    -

    Exemple complet (trouver toutes les erreurs)

    - - - On se donne cette fois un exemple complet, mais - - incorrect. En effet, il y a - - plusieurs erreurs dans - - dans ce document. - - Il n'est pas simple de toutes les trouver - - -En plus cet exemple est en deux parties -]]> -
    -
    -

    Utilisations d'XML (1)

    - -

    Un bon exemple est XHTML (XML pour les pages Web)

    - -

    Autre exemple: les flux RSS de mises à jour d'un blog

    - -
    -
    -

    Utilisation d'XML (2)

    - -

    En réalité, on ne manipule pratiquement jamais de XML tel que stocké - sur le disque

    - -

    Une application moderne mélange BD relationnelle et XML (et - aussi d'autres choses si besoin: JSON, YAML, …)

    -
    -
    -

    Étude de cas: journal en ligne

    -

    On se pose dans le cas du site internet d'un journal en - ligne

    - -
    -
    -

    Une solution possible

    - -
    -

    Validation de documents

    -
    -

    Schéma d'un document

    -

    Comme tout le monde peut définir son propre format XML, on - veut pouvoir être sûr que des données en entrées d'un - programme ont un certain - format (par exemple, c'est du XHTML valide, sans balise inconnue - des navigateurs) -

    -

    Il existe plusieurs manières de contraindre les balises d'un - document XML. On s'intéresse dans le cours à la plus simple. -

    -
    -
    -

    DTD

    -

    Document Type Definitions. Permet de définir le contenu d'un - document par des expressions régulières

    -

    Syntaxe particulière qui n'est pas du XML

    -

    Permet de définir:

    - -
    -
    -

    Syntaxe des DTD

    -

    Un fichier contenant une suite de directives de la forme suivantes:

    - - -
    -
    -

    Exemple de DTD

    - - - - - - - - - -]]> -

    Question: quel est la taille minimale d'un document valide ?

    -
    -
    -

    Utilisation d'une DTD (1)

    -

    Il suffit de référencer la DTD dans un élément - spécial
    <!DOCTYPE racine SYSTEM "fichier.dtd" >
    avant la racine du - document

    - - -Tiramisú - - mascarpone - oeufs - … - -2h - - Séparer les blancs des jaunes - … - … - - -]]> -
    -
    -

    Utilisation d'une DTD (2)

    - -
    - - diff --git a/xpi/xpi_02.xhtml b/xpi/xpi_02.xhtml deleted file mode 100644 index ce4fa3d..0000000 --- a/xpi/xpi_02.xhtml +++ /dev/null @@ -1,386 +0,0 @@ - - - - - XPath - - - - - - - - - - - - - - - - - - - - -
    -

    XML et Programmation Internet

    -

    Cours 2

    -
    kn@lri.fr -
    - -

    Modèle d'arbre

    -
    - -

    XML vu comme un arbre (1/2)

    - - -
    -
    -

    XML vu comme un arbre (2/2)

    -

    Un document XML peut être vu comme un arbre:

    - - - - Foundations of Databases - Abiteboul - Hull - Vianu - Addison Wesley - 1995 - - - - The Lord of the Rings - J. R. R. Tolkien - Houghton Mifflin - 2001 - - -]]> - -
    -
    -

    Sérialisation d'un arbre sous forme de document

    -

    Étant donné un arbre, comment peut ont produire - le document XML correspondant ?

    - //pseudo-code - void print(Node n) - { - if (n is text or comment) { output_text(n) } - else { - output_text ("<" + tag(n) + ">"); - for k in children(n) - print(k); - output_text ("</" + tag(n) + ">"); - } - - -
    -
    -

    Ordre du document, parcours préfixe

    -

    On appelle ordre du document un ordre total sur les - nœuds d'un document qui correspond à leur ordre dans un fichier - sérialisé. Il correspond aussi à la numérotation lors du parcours - préfixe

    -
      -
    1. #document
    2. -
    3. bibliography
    4. -
    5. book
    6. -
    7. title
    8. -
    9. "Foundations of Databases"
    10. -
    11. author
    12. -
    13. "Abiteboul"
    14. -
    15. author
    16. -
    17. "Hull"
    18. -
    19. author
    20. -
    21. "Vianu"
    22. -
    - - -
    -
    -

    Construction d'un arbre à partir d'un fichier XML ?

    -

    Pour simplifier on suppose un fichier sans texte, uniquement avec - des balises ouvrantes/fermantes

    - - type Node = { label : string; children : List<Node> } - Stack<Node> stack; - stack.push (new Node("#document"), [])); - while (true) { - - tag = read (); - if end_of_file () break; - if tag is opening { - parent = stack.peek(); - node = new Node(tag, []); - parent.addChild(node); - stack.push(node); - } - if tag is closing { - stack.pop(); - } - } - -

    En pratique, on utilise des bibliothèques toutes faites pour - lire/écrire des fichiers!

    -
    -

    XPath, introduction

    -
    -

    Intérogation de documents XML

    -

    Les documents représentant des données (semi-) structurées, on - souhaite en extraire de l'information

    -

    On va pouvoir écrire des requêtes sur des critères scalaires - ( -« renvoyer tous les livres publiés après 2000 Â»), mais aussi sur des - critères de structure (« renvoyer tous les éléments qui ont - un fils author Â»)

    -
    -
    -

    XPath

    -

    XPath est un langage de selection de nœud dans un document - XML. Il ne permet que de sélectionner des nœuds, pas d'en - construire de nouveaux. C'est un langage restreint qui ne contient - pas de fonctions, variables, … On peut le voir comme un équivalent - du SELECT de SQL

    -
    - -
    -

    XPath (exemple)

    -

    Sélectionner tous les titres du document (de manière compliquée)

    - /descendant::author/parent::book/child::title - - -
    -
    -

    XPath : syntaxe

    -

    La syntaxe d'une requête XPath est:

    - /axe1::test1[ pred1 ]/ … /axen::testn[ predn ] - - -
    -
    -

    XPath : sémantique

    -

    Étant donné la requête:

    - /axe1::test1[ pred1 ]/ … /axen::testn[ predn ] -
      -
    1. le nœud contexte au nœud document
    2. -
    3. on sélectionne l'ensemble A1 tous les nœuds qui sont dans - l'axe1 par rapport au nœud contexte
    4. -
    5. on sélectionne l'ensemble T1 des nœud de - A1 qui vérifient le test test1
    6. -
    7. on sélectionne l'ensemble P1 des nœud de - T1 qui vérifient pred1
    8. -
    9. On réapplique le pas 2 sur P1
    10. -
    11. …
    12. -
    -
    -
    -

    XPath : sémantique (exemple)

    -
    - /descendant::author/parent::book/child::title -
    1. On séléctionne le nœud document
    2. -
    3. On séléctionne tous les descendants
    4. -
    5. On filtre en ne gardant que les nœuds author - (T1 ≡ P1)
    6. -
    7. Sur chacun des author on prend le parent (on n'obtient que - 2 parents car on garde des ensembles de noeuds)
    8. -
    9. On filtre les parents pour ne garder que ceux qui - sont book
    10. -
    11. On sélectionne tous les fils de chacun des book
    12. -
    13. On ne garde que les fils qui ont le - tag title
    14. -
    -
    - - -
    -
    -

    XPath : axes

    -

    Le standard XPath définit un grand nombre d'axes

    - -
    -
    -

    XPath : les tests

    -

    On peut sélectionner des nœuds selon les critères suivants

    - -
    -
    -

    XPath : prédicats (syntaxe)

    - - p ::= p or p - | p and p - | not (p) - | count(…), contains(…), position(), … - | chemin XPath - | e1 op e2 - -

    e1 et e2 sont des - expressions arithmétiques, op peut être <, >, =, !=, - +, -, *, /, mod, …

    -
    -
    -

    XPath : prédicats (sémantique)

    -

    On évalue le prédicat et on converti son résultat en valeur de - vérité. Si la valeur vaut vrai, on garde le nœud courant, si elle - vaut faux, on ne le garde pas -

    -

    XPath connait 4 types de données pour les prédicats :

    - - -
    -
    -

    XPath : prédicats (exemples)

    - - -
    -
    -

    Caractéristiques d'XPath

    - -
    - - diff --git a/xpi/xpi_03.xhtml b/xpi/xpi_03.xhtml deleted file mode 100644 index 2e5d601..0000000 --- a/xpi/xpi_03.xhtml +++ /dev/null @@ -1,440 +0,0 @@ - - - - - XPath (suite) - - - - - - - - - - - - - - - - - - - - -
    -

    XML et Programmation Internet

    -

    Cours 3

    -
    kn@lri.fr -
    -

    Évaluation des prédicats

    -
    -

    Rappels de syntaxe

    - - p ::= p or p - | p and p - | not (p) - | count(…), contains(…), position(), … - | chemin XPath - | e1 op e2 - -

    On évalue le prédicat et on converti son résultat en valeur de - vérité. Si la valeur vaut vrai, on garde le nœud courant, si elle - vaut faux, on ne le garde pas -

    -

    XPath connait 4 types de données pour les prédicats :

    - -
    -
    -

    Comparaisons (e1 op e2)

    -

    Les opérateurs de comparaisons sont : =, !=, <, <=, - >, >= .
    - La manière de calculer de vérité de e1 op - e2 dépend du typed de e1 - et e2 : -

    - -
    -
    -

    Comparaisons des valeurs scalaires

    - v1 op v2 -

    Si op est != ou =, on applique les règles dans cet ordre:

    -
      -
    1. Si v1 (resp. v2) est - un booléen, alors v2 - (resp. v1) est converti en booléen et les deux - booléens sont comparés
    2. -
    3. Sinon si v1 (resp. v2) est - un nombre, alors v2 - (resp. v1) est converti en nombre et les deux - nombres sont comparés
    4. -
    5. Sinon, v1 et v2 sont des - chaines de caractères, on les compares
    6. -
    -

    Si op est <, <=, > ou - >=, on convertit v1 - et v2 en nombres et on les compare. -

    -
    -
    -

    Conversions

    -

    Conversion en booléen

    - -

    Conversion en nombre

    - -
    -
    -

    Conversions (suite)

    -

    Conversion en chaine de caractères

    - -
    - -
    -

    Appels de fonction

    -

    Il existe des fonctions prédéfinies (voir la spec XPath)

    - -

    Si les arguments ne sont pas du bon type, ils sont convertis en - utilisant les règles de conversion

    -
    -
    -

    Exemples

    -

    Dans la suite, on se donne un document de test ayant une - racine ... ]]> et une expression XPath qui - sélectionne la racine si et seulement si le prédicat vaut vrai -

    -
    -
    -

    Exemples

    - - 1 - 2 - ]]> -
    1. - /child::a[ child::*/child::text() ] - sélectionne la racine (l'ensemble de nœud - renvoyé par child::*/cild::text() est non vide, donc il est converti - en true)

    2. -
    3. - /child::a[ child::*/child::text() = "2" ] - sélectionne la racine (l'ensemble de nœud texte - renvoyé par child::*/child::text() est comparé à "2", et - il existe un élément dans cet ensemble pour lequel le test réussi - )

    4. -
    5. /child::a[ child::*/child::text() != "2" ] - sélectionne la racine (l'ensemble de nœud texte - renvoyé par child::*/child::text() est comparé à "2", et - il existe un élément dans cet ensemble pour lequel le test réussi - )

    6. -
    7. /child::a[ not(child::*/child::text() = "2") ] - ne sélectionne pas la racine (on - prend la négation du deuxième cas ci-dessus) -

    8. - -
    -
    -
    -

    Exemples

    - - 12 - 23 - ]]> -
      -
    1. - /child::a[ child::*/child::text() > 1.5 ] - sélectionne la racine (l'ensemble de nœud texte - renvoyé par child::*/child::text() est comparé à 1.5, et - il existe un élément dans cet ensemble pour lequel le test réussi - )

    2. -
    3. /child::a[ child::b/child::text() >= child::c/child::text() ] - sélectionne la racine (les deux - ensembles de nœuds sont convertis en ensmbles de nombres, car on - utilise >= et on a bien que 2 >= 2 - )

    4. -
    5. /child::a[ child::b/child::text() = child::c/child::text() ] - sélectionne la racine (les deux - ensembles de nœuds comportent un élément commun)

    6. -
    7. /child::a[ child::b/child::text() != child::c/child::text() ] - sélectionne la racine (les deux - comportent des éléments différents)

    8. -
    -
    -
    -

    Exemples

    - 1223 ]]> -
      -
    1. - /child::a[ contains(self::*, "22") ] - sélectionne la racine(l'ensemble de - nœud séléctionné par self::*, i.e. la racine est converti - en chaine. Pour ce faire, on colle toutes éléments textes - descendants et on obtient la chaine "1223" qui contient bien "22") -

    2. -
    3. - /child::a[ self::* > 442.38 ] - sélectionne la racine(l'ensemble de - nœud séléctionné par self::*, est converti en chaine puis - en nombre pour comparer 1223 à 442.38) -

    4. - -
    5. - /child::a[ sum(child::*) >= 7.5 ] - sélectionne la racine(la fonction - sum converti la liste de valeurs passée en argument en - liste de nombre et fait la somme de ces derniers) -

    6. -
    -
    - -
    -

    Exemples

    - 1toto23 ]]> -
      - -
    1. - /child::a[ sum(child::*) >= 7.5 ] - ne sélectionne pas la racine(la fonction - sum converti la liste de valeurs passée en argument en - liste de nombres, toto n'étant pas un nombre valide, il est - remplacé par NaN. La somme totale fait donc NaN, et une - comparaison avec NaN renvoie toujours faux) -

    2. -
    -
    -
    -

    Prédicat imbriqués

    -

    On peut imbriquer des prédicats de manière arbitraire:

    - Q1 ≡ /child::a[ child::b[ count(descendant::c) > 4 ] ] -

    Quelle différence avec :

    - Q2 ≡ /child::a[ count(child::b/descendant::c) > 4 ] -

    Il suffit de considérer le document : - - - - - ]]> - Q1 ne séléctionne rien car il n'y a - aucun b ayant plus de 4 - descendants c.
    Q2 séléctionne - la racine car le nombre de descendants c de - nœuds b est plus grand que 4. -

    -
    -
    -

    position() et last()

    -

    La fonction position() renvoie la position du nœud au - sein de l'ensemble de résultats en cours de filtrage. Last - renvoie le nombre d'éléments dans cet ensemble (ou l'indice du - dernier élément). Les indices commencent à 1 :

    - - AA - BB - CC - ]]> - - /child::a/child::b[ position() = 2 ] (renvoie BB]]>) - /child::a/child::b[ position() = last() ] (renvoie CC]]>) - /child::a/child::b[ position() mod 2 = 1 ] (renvoie AA - CC]]>) - -
    -

    Axes complexes

    -
    -

    L'axe attribute::

    -

    Permet d'accéder aux attributs d'un élément.Attention, les - attributs ne font pas partie des fils ni des descendants!

    - - AA - BB - CC - ]]> - - /descendant::b[ attribute::* = "y" ] (renvoie BB]]>) - /descendant::b[ attribute::id = "y" ] (ne renvoie rien) - -
    -
    -

    Les axes preceding:: et following::

    -

    L'axe preceding:: selectionne tous les nœuds arrivant - avant le nœud courant et qui ne sont pas des ancetres de ce - dernier.

    -

    L'axe following:: selectionne tous les nœuds arrivant - après le nœud courant et qui ne sont pas des descendants de ce dernier.

    - - - - - - - - - - - - ]]> - - /descendant::m/preceding::* (séléctionne l, i, h, b, c, d, e, f, g) - /descendant::d/following::* (sélectionne h, i, j, k, l, m) - -
    -
    -

    Autres opérateurs

    -

    On peut donner plusieurs prédicats à un chemin : - - /descendant::a [ descendant::b ][ position () > 4 ][ child::c ] - -Sélectionne l'ensemble des nœuds A1 ayant un - tag a et ayant un descendant b. Filtre - A1 pour ne garder que A2, l'ensemble des - nœuds de A1 étant en position supérieure à - 4. Filtre A2 pour ne - garder que les nœuds ayant un fils c. -

    -

    On peut prendre l'union de plusieurs chemins :

    - - /descendant::a/parent::b | /descendant::c/following-sibling::d - -
    -

    Syntaxe abrégée

    -
    -

    Abréviations

    -

    XPath étant très verbeux il existe une syntaxe abrégée pour - les situations les plus courantes :

    -
      -
    • un nom de tag foo est l'abréviation - de child::foo. Exemple : /a/b/c ≡ /child::a/child::b/child::c -
    • -
    • un // est l'abréviation - de /descendant-or-self::node()/. Exemple : - //a ≡ /descendant-or-self::node()/child::a - Prend tous les nœuds du document (y compris le - nœud fictif #document et exécute child::a sur - cet ensemble.
    • -
    • .. est un synonyme - pour parent::node()
    • -
    • @foo est un synonyme pour attribute::foo -
    • -
    -

    Exemple :

    - //book [ year > 2005 ]/title - - -
    - - diff --git a/xpi/xpi_04.xhtml b/xpi/xpi_04.xhtml deleted file mode 100644 index b436582..0000000 --- a/xpi/xpi_04.xhtml +++ /dev/null @@ -1,425 +0,0 @@ - - - - - XSLT - - - - - - - - - - - - - - - - - - - - - -

    Namespaces

    -
    -

    Utilisation des namespaces

    -

    Problème : comment mélanger au sein d'un même document des - balises venant de deux DTDs (ou schémas) différentes - ?
    Exemple : mettre du SVG (images vectorielles) dans - du XHTML (page web)

    - - - - ]]> - - - Mon image - - -

    Une image

    - - - - - ]]> -
    -

    Comment spécifier que certains éléments doivent êtres - interprétés ? (par exemple par le navigateur web) et que - d'autres font parties des données ?

    -
    -
    -

    L'attribut xmlns

    -

    On peut utiliser un attribut spécial, xmlns - qui est autorisé dans tous les documents XML - sur n'importe quel élément. La valeur de ce dernier est - un lien identifiant la DTD et indique tous les descendants de - l'élément en question sont valides par rapport à la - DTD.
    Exemple: -

    - xmlns="http://www.w3.org/1999/xhtml" - Mon image - -

    Mon image

    - xmlns="http://www.w3.org/2000/svg" - - - - - ]]> -
    - -
    -
    -

    L'attribut xmlns

    -

    On peut aussi donner un nom à un namespace particulier - et réutiliser ce nom dans les balises:

    - xmlns="http://www.w3.org/1999/xhtml" - xmlns:svg="http://www.w3.org/2000/svg" - Mon image - -

    Mon image

    - - - - ]]>
    -

    en utilisant l'attribut xmlns:toto="..." alors toutes la - balises de la forme <toto:nombalise> appartiennent au - namespace toto. Il ne faut pas oublier le namespace sur la - balise fermante !

    -
    -
    -

    Digression

    -

    L'exemple précédent ressemble à ça :

    -
    -

    Mon image

    - - - -
    -
    -

    XSLT, principes

    -
    -

    XSLT

    -

    eXtensible Stylesheet Language Transformations : est - un langage de transformation de documents XML. Il permet - d'extraire (au moyen d'XPath) des nœuds d'un document d'entrée - et de les ré-organiser et de les copier dans un document de - sortie. - Le document de sortie est souvent du XML lui-même mais peut - être aussi du texte, du PDF, … -

    -
      -
    • XSLT est standardisé par le W3C
    • -
    • Les programmes XSLT sont écrit eux-même en XML
    • -
    • Il existe plusieurs versions du standard (1.0, 2.0, - 3.0). Ce cours fait juste une introduction aux fonctionalités - les plus simples (1.0)
    • -
    -
    -
    -

    Un exemple simple

    -

    On réutilise un document de recette de cuisine - du cours 01. La DTD est:

    - - - - - - - - - -]]> -
    -
    -

    Un exemple simple (suite)

    -

    Un document valide par rapport à la DTD est le suivant

    - - -Tiramisú - - mascarpone - oeufs - sucre - café - biscuits - -2h - - Séparer les blancs des jaunes - … - … - - -]]> -
    -
    -

    Un exemple simple (suite)

    -

    On va extraire des informations du document et en faire une - page web :

    - - - - - Ingrédients du ]]><u><xsl:value-of select="descendant::title" /></u><![CDATA[ - - -

    Ingrédients du ]]><xsl:value-of select="descendant::title" /> -
      - ]]><xsl:for-each select="descendant::ingredient"> ]]><xsl:value-of select="child::text()" /> - ]]></xsl:for-each> - - - - -]]> -

    -
    -

    Comment exécuter un programme XSLT

    -
      -
    • En utilisant un moteur XSLT comment le - programme xsltproc
    • -
    • En référençant la feuille de style et en ouvrant le document XML - avec Firefox : - - ]]> - <?xml-stylesheet type="text/xsl" href="prog.xsl"?> - Tiramisú - - ...]]> -
    • -
    • En Java grace à la classe Transformer du package javax
    • -
    -
    -
    -

    Structure d'un programme XSLT

    -

    Un programme XSLT commence par la balise :]]> -et fini par la balise : ]]> -Le texte ainsi que les éléments qui ne sont pas dans - le namespace « xsl: » sont copiés à - l'identique dans la sortie.
    - Dans la balise principale <xsl:stylesheet> on trouve - un certain nombre de balises <xsl:template match="…" - >.
    - Les templates vont jouer le rôle de fonctions et vont être - appelées pour transformer des nœuds du document en nœuds de sortie. -

    -
    -

    Les templates XSLT

    -
    -

    Templates

    -

    Un template est délimité par une balise <xsl:template match="…" - > où le « â€¦ Â» est une expression XPath. Il peut y avoir - plusieurs templates dans un fichier XSLT.
    - Un template est appliqué à un ensemble de nœuds. Parmi cet - ensemble, tous les nœuds qui vérifient l'expression XPath de - l'attribut match sont passés en argument au template.
    - Initialement, tous les templates existants sont appliqués au nœud - fictif document. -

    -
    -
    -

    Retour sur l'exemple

    - - - - - Ingrédients du ]]><u><xsl:value-of select="descendant::title" /></u><![CDATA[ - - -

    Ingrédients du ]]><xsl:value-of select="descendant::title" /> -
      - ]]><xsl:for-each select="descendant::ingredient"> ]]><xsl:value-of select="child::text()" /> - ]]></xsl:for-each> - - - - -]]> -
      1. Initialement tous les templates (il n'y en a qu'un ici) sont - appliqués à la racine du document
      2. -
      3. Pour chacun d'entre eux, l'expression XPath dans - le match est contrôlée. Si elle réussit, alors le template - est appliqué au nœud
      4. -
      -

    -
    -

    Deuxième exemple, 2 templates

    -

    - - - - - Ingrédients du ]]><u><xsl:value-of select="descendant::title" /></u><![CDATA[ - - -

    Ingrédients du ]]><xsl:value-of select="descendant::title" /> -
      - ]]><xsl:apply-templates select="descendant::ingredient" /> - - - - -
    • ]]><xsl:value-of select="child::text()" /> - - ]]>

      -
      1. On applique tous les templates à la racine. Le - template match="/" réussit, le - template match="ingredient" échoue.
      2. -
      3. L'expression - ]]> - réapplique tous les templates à tous les nœuds sélectionnés - par l'expression XPath.
      4. -

    -
    -

    Priorité des templates

    -

    Que se passe-t-il si deux templates peuvent s'appliquer à un même - élément ? On applique les règles de priorité suivantes - (simplifiées) : -

    -
      -
    1. Si le match d'un template contient un | entre - plusieurs chemins, la priorité la plus élevée de ces chemins est choisie -
    2. -
    3. si le match est de la forme : child::foo - ou attribute:foo, sa priorité est 0
    4. -
    5. si le match est de la forme : child::* ou - ou attribute:*, sa priorité est -0.25
    6. -
    7. si le match est de la form : child::text() - ou child::node() (idem avec attribute), sa - priorité est -0.5
    8. -
    9. sinon (test complexe, par exemple foo[ count(child::bar) < - 4]), la priorité est 0.5
    10. -
    -

    Le template ayant la priorité la plus élevée est choisi. On peut - donner explicitement à un template une priorité avec - l'attribut priority="…"
    Le moteur XSLT lève une - erreur d'exécution si deux templates ont exactement la même - priorité.

    -
    -
    -

    Templates par défaut

    -

    Il existe 3 templates par défaut qui sont toujours - définis :

    - - - - - - - - - -]]> - -

    Ils ont des priorités inférieures aux templates présents dans le - fichier donc ne sont appliqués - que si aucun templates ne fonctionne. Ils permettent de « descendre - dans l'arbre » (jusqu'aux textes), si aucun template ne s'applique à - la racine. -

    -
    - - diff --git a/xpi/xpi_05.xhtml b/xpi/xpi_05.xhtml deleted file mode 100644 index aa49a92..0000000 --- a/xpi/xpi_05.xhtml +++ /dev/null @@ -1,410 +0,0 @@ - - - - - XSLT (suite) - - - - - - - - - - - - - - - - - - - - - -

    Structures de contrôle

    -
    -

    xsl:value-of

    -

    On peut récupérer des nœuds texte dans le document source au - moyen de la balise <xsl:value-of select="xpath - expr"/>. L'expression xpath expr est - évaluée et convertie en chaîne de caractères en suivant - les conversions d'XPath (voir cours 3). -

    -
    -
    -

    Itération avec xsl:for-each

    -

    La balise <xsl:for-each select="xpath expr"> - corp de boucle - </xsl:for-each> - évalue le corp de la boucle pour chaque nœud renvoyé par - l'expression xpath expr. À chaque itération - le nœud considéré devient le nœud contexte (i.e. celui - renvoyé par l'axe self::)

    -
    -
    -

    Itération ordonnée xsl:sort

    -

    On peut modifier l'ordre dans lequel les éléments sont - parcourus par une boucle xsl:for-each en utilisant - l'élément -]]> qui n'est valide que comme fils d'un xsl:for-each - ou xsl:apply-templates

    -
      -
    • select : expression XPath selon laquelle - trier
    • -
    • lang : code de la locale selon laquelle - trier (par exemple en français, é est - avant f)
    • -
    • data-type : types des données triées (text - (defaut), nombre ou élément XML (ordre du document utilisé - dans ce cas)
    • -
    • order : s'il faut trier en ordre croissant ou - décroissant
    • -
    • case-order : lors d'un tri text si les - majuscules sont avant les minuscules (defaut) ou inversement
    • -
    -
    -
    -

    Conditionnelle simple avec xsl:if

    -

    On peut évaluer conditionnellement une portion de code XSLT - en la plaçant dans une balise: - ... - ]]> Le résultat de l'expression est interprété - comme un booléen (selon les règles de conversion d'XPath). S'il - vaut vrai, le corp du xsl:if est exécuté.

    -
    -
    -

    Conditionnelle complexe avec xsl:choose

    -

    On peut écrire plusieurs portions de code, gardées par des - conditions distinctes - en les plaçant dans une balise: - code 1 - code 2 - code 3 - ... - code sinon - ]]> - Les conditions xsl:when sont évaluées dans l'ordre et - le corp de la première valant vrai est exécuté. Si aucune - condition n'est vérifiée, le corp de - l'instruction xsl:otherwise est exécuté. -

    -
    -
    -

    Exemple simple (génération d'une page Web)

    -

    On réutilise (encore) le fichier de recette:

    - - -Tiramisú - - mascarpone - oeufs - sucre - café - biscuits - -2h - - Séparer les blancs des jaunes - … - … - - -]]> -
    -
    - - - - - Ingrédients du ]]><u><xsl:value-of select="descendant::title" /></u><![CDATA[ - - -

    Ingrédients du ]]><xsl:value-of select="descendant::title" /> -
      - ]]><xsl:for-each select="descendant::ingredient"> - <xsl:sort select="child::text()" /> ]]><xsl:value-of select="child::text()" /> - ]]></xsl:for-each> -

      Étape]]><xsl:if test="count(descendant::e) &gt;1">s</xsl:if> -

        - ]]><xsl:apply-templates select="descendant::e"> - <xsl:sort select="@num" data-type="number"/> - </xsl:apply-templates> - - - - -
      1. -
        - -]]>
        -

    -

    Utilisation avancée

    -
    -

    Nom d'attributs ou d'éléments dynamiques

    -

    Il est fréquent de vouloir choisir dynamiquement les noms - des éléments. Par exemple :

    - - - - - - .... code complexe pour calculer le texte .... - - - - - ]]> - -

    code incorrect : les balises <b> -et <i> ne sont pas bien parenthésées

    -
    -
    -

    Solution naïve

    -

    On peut dupliquer le code de manière à respecter les balises - ouvrantes/fermantes :

    - - - - .... code complexe pour calculer le texte .... - - - - - .... code complexe pour calculer le texte .... - - - ]]> - -

    Inélégant et non-maintenable : si on a 10 cas, on copie cole - 10 fois le code complexe.

    -
    -
    -

    Nom d'attributs ou d'éléments dynamiques

    -

    On a besoin :

    -
      -
    • de pouvoir stocker dans des « variables » le résultat d'une - expression XSLT
    • -
    • de pouvoir créer des éléments ou des attributs dont le nom est - une expression
    • -
    -

    Problème : XPath ne permet pas de définir des variables

    -
    -
    -

    Variables en XSLT (xsl:variable)

    -

    Comme dans tout langage, on veut pouvoir évaluer une - expression et donner un nom au résultat pour - pouvoir le réutiliser plusieurs fois. En XSLT, on utilise la - balise xsl:variable :

    - - - Le document contient éléments foo. -]]> -
      -
    • L'attribut name est obligatoire et permet de définir le - nom de la variable
    • -
    • L'attribut select s'il est présent permet de définir le - contenu
    • -
    • Au sein d'une expression XPath, on peut utiliser la - notation $x pour référencer le contenu de la - variable x
    • -
    -
    -
    -

    Définitions complexes de variables

    -

    On peut aussi donner du contenu à l'élément xsl:variable, - pour définir la valeur de la variable :

    - - - b - i - - ]]> - -
    -
    -

    Portée des variables

    -

    Les variables sont non-modifiables une fois définies. Elles - sont visibles par tous les éléments suivant la balise - fermante </xsl:variable> se trouvant avant la - fermeture de l'élément contenant la variable. Exemple :

    - - - - - - -

    texte sur - : - -

    -
    - -]]> -
    -
    -
    -

    Création dynamique d'éléments ou d'attributs

    -

    On peut utiliser les instructions xsl:element - et xsl:attribute pour créer des éléments et des attributs - dont le nom est calculé dynamiquement : -

    - - baz - ... - -]]> -

    produira dans le document de sortie :

    - - ... - -]]> -
    -
    -

    Échappement d'expressions XPath dans les chaînes

    -

    À part les attributs select et test de - certaines balises XSLT, les autres attributs sont des chaines de - caractères. On peut cependant intégrer des expressions XPath au - moyen d'accolades { } -

    - Le site!]]> - -

    Dans le code ci-dessus, href étant un attribut non - interprété (ce n'est pas une balise XSLT), le chemin XPath - apparaîtra dans le résultat (ce qu'on ne veut pas). On peut écrire - :

    - Le site!]]> - -
    -
    -

    Retour sur notre exemple

    - - - b - i - - - - - .... code complexe pour calculer le texte .... - -]]> -

    Attention : il faut écrire {$nombalise} sinon le - processeur XSLT essayera de créer un - élément <$nombalise> ce qui est illégal (et - provoquera une erreur)

    -
    -

    Autres fonctionalités

    -
    -

    Spécifier le type de sortie

    -

    On peut placer une balise xsl:output dans la balise racine - de la feuille de style (xsl:stylesheet)

    - -]]> -
    • method : décrit le type de fichier généré (XML - (defaut), HTML (plus permissif sur les balises non fermées), - texte)
    • -
    • cdata-section-elements : liste de nom de balises - séparées par des espaces. Dans ces balises, le contenu du texte - n'est pas interprété (>, < peuvent êtres - écrits directement)
    • -
    • indent : si la sortie est du XML, indenter les balises - de manière lisible
    • -
    -
    -
    -

    Copie de texte et de nœuds

    -
      -
    • La balise <xsl:copy-of select='expression'> - copie le résultat de l'expression XPath (qui peut être un nœud) - dans la sortie, avec ses attributs et son contenu
    • -
    • La balise <xsl:text> ... </xsl:text> - copie le texte tel quel (sans toucher aux blancs) dans la sortie
    • -
    -
    - - diff --git a/xpi/xpi_06.xhtml b/xpi/xpi_06.xhtml deleted file mode 100644 index 0b97200..0000000 --- a/xpi/xpi_06.xhtml +++ /dev/null @@ -1,451 +0,0 @@ - - - - - DOM - - - - - - - - - - - - - - - - - - - - - -

    Le modèle DOM

    -
    -

    Programmer avec XML

    -

    La représentation textuelles de documents XML n'est pas - adaptée à la manipulation des données par un programme :

    -
      -
    • On ne veut pas lire le fichier « caractère par caractère »
    • -
    • On veut s'assurer que le fichier est bien formé et valide
    • -
    • On veut pouvoir manipuler la structure d'arbre que représente le - fichier
    • -
    - -
    -
    -

    Document Object Model

    -

    DOM est une spécification du W3C qui - explique comment représenter un document dans un - langage orienté objet.
    Avantages : -

    -
      -
    • N'est pas limité à un seul langage
    • -
    • Permet de spécifier une API unique : programmer en XML en - Java ou Python ne sera pas différent
    • -
    -

    Inconvénivents :

    -
      -
    • En pratique, orienté Java
    • -
    • Se focalise sur les lanages objets de manière arbitraire
    • -
    -
    -
    -

    Que définit le DOM ?

    -

    Le DOM définit des interfaces (c'est à dire, des noms - de classes auquels sont associés - des propriétés). Il définit aussi des types de bases - (chaînes de caractères, entiers, etc.) et des types - auxiliaires qui sont implantés par les types de bases du - langage. -

    -
    -
    -

    L'interface Node (1/4, constantes)

    - - //attention ce n'est pas du Java - interface Node { - - //constantes entières définissant les types de nœuds - const unsigned short ELEMENT_NODE = 1; - const unsigned short ATTRIBUTE_NODE = 2; - const unsigned short TEXT_NODE = 3; - const unsigned short CDATA_SECTION_NODE = 4; - const unsigned short ENTITY_REFERENCE_NODE = 5; - const unsigned short ENTITY_NODE = 6; - const unsigned short PROCESSING_INSTRUCTION_NODE = 7; - const unsigned short COMMENT_NODE = 8; - const unsigned short DOCUMENT_NODE = 9; - const unsigned short DOCUMENT_TYPE_NODE = 10; - const unsigned short DOCUMENT_FRAGMENT_NODE = 11; - const unsigned short NOTATION_NODE = 12; - - - -
    -
    -

    L'interface Node (2/4, valeur, nom et type)

    - - - - //nom et valeur du nœud - - readonly attribute DOMString nodeName; - attribute DOMString nodeValue; - -
      -
    • Pour les éléments nodeValue vaut null - et nodeName est le nom de la balise -
    • -
    • Pour les nœuds texte nodeValue est le texte - et nodeName est la chaine fixe #text -
    • -
    • Pour les attributs nodeValue vaut la valeur de - l'attribut et nodeName est son nom -
    • -
    - - //L'une des 12 constantes du slide précédent - readonly attribute unsigned short nodeType; - -
    -
    -

    L'interface Node (3/4, navigation)

    - - readonly attribute Node parentNode; - readonly attribute NodeList childNodes; - readonly attribute Node firstChild; - readonly attribute Node lastChild; - readonly attribute Node previousSibling; - readonly attribute Node nextSibling; - readonly attribute NamedNodeMap attributes; - -

    Utilise deux interfaces auxiliaires:

    - - interface NodeList { - Node item(in unsigned long index); - readonly attribute unsigned long length; - }; - interface NamedNodeMap { - Node getNamedItem(in DOMString name); - … - } - -
    -
    -

    L'interface Node (4/4, mise à jour)

    - - //Renvoie le document auquel appartient le nœud - readonly attribute Document ownerDocument; - - Node insertBefore(in Node newChild, - in Node refChild) - raises(DOMException); - - Node replaceChild(in Node newChild, - in Node oldChild) - raises(DOMException); - Node removeChild(in Node oldChild) - raises(DOMException); - Node appendChild(in Node newChild) - raises(DOMException); - boolean hasChildNodes(); - - //Nécessaire pour copier un nœud d'un document dans un autre - Node cloneNode(in boolean deep); - -
    -
    -

    Sous-interfaces de Node

    -

    L'interface Node est spécialisées en 12 - sous-interfaces différents (les 12 types de nœuds - possibles). Les principales sont: -

    -
      -
    • Document : l'interface du nœud « racine » du - document
    • -
    • Element : l'interface des nœuds - correspondant à des balises
    • -
    • Attr : l'interface des nœuds - correspondant à des attributs
    • -
    • Text : l'interface des nœuds - correspondants à des textes
    • -
    -
    -
    -

    L'interface Text

    - - interface Text : Node { - //renvoie vrai si le nœud ne contient que des espaces - readonly attribute boolean isElementContentWhitespace; - … - } - -

    (La spécification de DOM mentionne d'autres propriétés)

    -
    -
    -

    L'interface Attr

    - - interface Attr : Node { - readonly attribute DOMString name; - readonly attribute DOMString value; - - readonly attribute Element ownerElement; - … - }; - -
    -
    -

    L'interface Element

    - - interface Element : Node { - readonly attribute DOMString tagName; - //manipulation par chaine : - DOMString getAttribute(in DOMString name); - void setAttribute(in DOMString name, - in DOMString value) - raises(DOMException); - - void removeAttribute(in DOMString name) - raises(DOMException); - - //manipulation par nœud : - Attr getAttributeNode(in DOMString name); - Attr setAttributeNode(in Attr newAttr) - raises(DOMException); - Attr removeAttributeNode(in Attr oldAttr) - raises(DOMException); - - //renvoie tous les descendants avec un certain tag - NodeList getElementsByTagName(in DOMString name); - - } - -
    -
    -

    L'interface Document

    - - inteface Document : Node { - //L'élément racine - readonly attribute Element documentElement; - - //Création de nœuds pour ce document : - - Element createElement(in DOMString tagName) - raises(DOMException); - Text createTextNode(in DOMString data); - Attr createAttribute(in DOMString name) - raises(DOMException); - - //Les descendants avec un tag particulier - NodeList getElementsByTagName(in DOMString tagname); - - - //Copie un nœud, éventuellement avec ses descendants et - //en fait un nœud ajoutable au document : - Node importNode(in Node importedNode, - in boolean deep); - -
    -
    -

    Modèle mémoire

    -

    Un nœud (objet implémentant l'interface Node) - ne peut pas appartenir à deux documents. Exemple :

    - - Node noeud_a = document1.getElementByTagName("a").item(0); - - document2.appendChild(noeud_a);//Exception si document2 n'est - //pas le même objet que - document1 - //par contre ceci est ok: - document2.appendChild(document2.importNode(noeud_a, true)); - -
    -

    Java API for XML Processing

    -
    -

    Introduction à JAXP

    -

    API de la bibliothèque standard Java qui permet de manipuler - du XML. Elle comprend (entre autres) :

    -
      -
    • Lecture et écriture de documents en streaming - (cours 7)
    • -
    • Implémentation complète de la - spécification DOM
    • -
    • Moteur XSLT (et donc XPath)
    • -
    -

    Inconvénients : la bibliothèque essaye d'être très générique, - afin que n'importe qui puisse fournir son implémentation de DOM - en utilisant les interfaces fournies. Il faut donc parfois - passer par des grandes séquences d'incatations magiques pour - créer un objet

    -
    -
    -

    Structure de l'API

    -
      -
    • Les types et interfaces spécifiés par le w3C se trouvent - dans le packages org.w3c.*
    • -
    • Les types « usuels» pour XML sont - dans org.xml.*
    • -
    • Les classes concrètes java implémentant les - interfaces sont dans javax.xml.*
    • -
    -
    -
    -

    Factory design pattern

    -

    Comme toutes les API complexes en Java (et dans les langages - objets en général), Jaxp utilise le design pattern - de Factory.

    -

    Pour créer un objet de type Foo on ne fait pas - simplement new Foo(…); mais on utilise une - classe FooFactory qui possède une - méthode .createFoo(…) -

    -

    Dans quel cas est-ce intéressant ?

    -

    Quand Foo est une interface. On - ne peut pas faire new sur une interface. Il faut donc - une méthode pour appeler le constructeur de la classe - implémentant Foo puis qui le caste en Foo …

    - -
    -
    -

    Factory design pattern (exemple)

    - -
    -
    -

    Création d'un document : DocumentBuilder

    -

    La classe DocumentBuilder permet de créer un - document XML :

    -
    • Soit en le lisant depuis un fichier (avec la - méthode parse()
    • -
    • Soit vide, avec la méthode newDocument()
    • -
    -

    Pour obtenir un DocumentBuidler, il faut passer par - un DocumentBuilderFactory :

    - - //création de la Factory - DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); - - //On définit quelques options - dbf.setIgnoringElementContentWhitespace(true); // option - dbf.setValidating(false); // option - - //On crée le documentBuilder - DocumentBuilder db = dbf.newDocumentBuilder(); - - //On charge le document - Document doc = db.parse("fichier.xml"); - -
    -
    -

    DOM dans JAXP

    -

    Le DocumentBuilder permet d'obtenir - un Document (interface Java qui implémente l'interface DOM - du même nom)

    -

    Conventions de nommage : les propriétés des - interfaces DOM sont préfixées par get ou set - en Java. Les méthodes ont le même nom. Exemple :

    - - Node n = …; - n.getNodeType(); //DOM défini nodeType; - n.getFirstChild(); //DOM défini firstChild; - n.appendChild(m); //C'est une méthode en DOM donc même nom - -
    -
    -

    Conversions

    -

    On travaille la plupart du temps avec des objets ayant le - type Node. La manière correcte de les convertir est la - suivante : -

    - - switch (n.getNodeType()) { - - case Node.DOCUMENT_NODE: - Document d = (Document) n; - … - break; - case Node.ELEMENT_NODE: - Element e = (Element) n; - … - break; - case Node.TEXT_NODE: - Text t = (Text) n; - … - break; - } - -
    -
    -

    Rappels : classes et interfaces utiles en Java

    -

    Interface Map<K,V> permet d'associer des - clés de types K à des valeurs de type V - (K et V doivent être des Objects donc - pas int, bool , …)

    -

    Implémentations possibles - : TreeMap, HashMap

    - -
    - - diff --git a/xpi/xpi_07.xhtml b/xpi/xpi_07.xhtml deleted file mode 100644 index 6a523f3..0000000 --- a/xpi/xpi_07.xhtml +++ /dev/null @@ -1,434 +0,0 @@ - - - - - XPath et XSLT en Java - - - - - - - - - - - - - - - - - - - - - -

    Requêtes XPath en Java

    -
    -

    Moteur XPath en java

    -

    L'API JAXP contient un moteur XPath 1.0 complet. Outre les - classes nécessaires au chargement de fichier et à la - manipulation du DOM (voir cours 6), il faut charger les éléments - du package javax.xml.xpath. Comme pour le reste - de JAXP, on passe par un XPathFactory pour créer une - nouvelle instance du moteur XPath. -

    -
    -
    -

    Exemple : packages

    - //Pour les documents et DOM - import org.w3c.dom.*; - import javax.xml.namespace.QName; - import javax.xml.parsers.DocumentBuilder; - import javax.xml.parsers.DocumentBuilderFactory; - - //Pour le moteur XPath - import javax.xml.xpath.XPathFactory; - import javax.xml.xpath.XPath; - import javax.xml.xpath.XPathConstants; - - public class TestXPath { - //Deux attributs pour contenir le moteur XPath et le document builder - XPath xp_ = null; - DocumentBuilder db_ = null; - - -
    -
    -

    Exemple : constructeur

    - public TestXPath () { - try { - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - factory.setNamespaceAware(true); - db_ = factory.newDocumentBuilder(); - - XPathFactory xf = XPathFactory.newInstance(); - xp_ = xf.newXPath(); - - } catch (Exception e) { - //Peuvent être levées en cas d'erreur de création d'objet XPath - //DocumentBuilder, par exemple si des options passées sont - //non-supportées. - } - } - - -
    -
    -

    Exemple : méthode d'évaluation

    - - NodeList eval(String fichier, String chemin) throws Exception { - - //Création d'un DOM pour le fichier source - Document doc = db_.parse(fichier); - - NodeList nl = (NodeList) xp_.evaluate(chemin, - doc, - XPathConstants.NODESET); - - - } - - -
    -
    -

    Méthode XPath.evaluate()

    -

    La méthode XPath.evaluate(xpath, n, type) permet d'évaluer une - l'expression xpath (donnée sous-forme de chaîne de - caractères), à partir du nœud contexte n (qui doit - implémenter l'interface Node). Le résultat est de - type typ. La fonction renvoie un résultat de - type Object. L'argument typ peut avoir 5 valeurs - possibles, définies dans la class XPathConstants : -

    -
      -
    • XPathConstants.BOOLEAN: le résultat est de type java Boolean
    • -
    • XPathConstants.NUMBER: le résultat est de type java Double
    • -
    • XPathConstants.STRING: le résultat est de type java String
    • -
    • XPathConstants.NODE: le résultat est de type java Node
    • -
    • XPathConstants.NODESET: le résultat est de type java NodeList
    • -
    -

    En effet, une expression XPath peut avoir comme valeur un booléen, - un ensemble de noeuds ou une chaîne dépendant du contexte où - elle est utilisée. On peut demander à Jaxp d'évaluer la requête - XPath pour un certain contexte. -

    -
    -
    -

    Exemple

    - Document doc = ... - String chemin = "//descendant::year[position () = 1]"; - - - //Crée une NodeList à un élément - NodeList nl = (NodeList) xp_.evaluate(chemin, doc, XPathConstants.NODESET); - - //Renvoie le nœud correspondant ou null - Node n = (Node) xp_.evaluate(chemin, doc, XPathConstants.NODE); - - //Renvoie le double java correspondant à la valeur - Double d = (Double) xp_.evaluate(chemin, doc, XPathConstants.NUMBER); - - //Renvoie la chaine java correspondant au texte - String s = (String) xp_.evaluate(chemin, doc, XPathConstants.STRING); - - //Renvoie la valeur de vérité corresondant au chemin - Boolean b = (Boolean) xp_.evaluate(chemin, doc, XPathConstants.BOOLEAN); - -
    -
    -

    La classe XPathExpression

    -

    Cette classe est similaire à l'utilisation - de PreparedStatements en JDBC.
    -Utilité ? -compiler la requête XPath une fois pour toute - et donc éviter de re-parser la chaîne de caractère à chaque - appel.
    Exemple :
    -

    - - XPathExpression ex = xp_.compile("//movie/title"); - - NodeList nl1 = (NodeList) ex.evaluate(doc1, XPathConstants.NODESET); - NodeList nl2 = (NodeList) ex.evaluate(doc2, XPathConstants.NODESET); - NodeList nl3 = (NodeList) ex.evaluate(doc3, XPathConstants.NODESET); - … - - -
    -

    XSLT

    -
    -

    Applications de transformations XSLT

    -

    Appliquer une transformation XSLT est une opération complexe à - cause des différentes combinaisons possibles : -

    -
      -
    • Le fichier source (ex: movie.xml) peut être soit déjà - chargé comme un DOM, soit sous forme de fichier, soit sous - forme de chaîne de caractères,…
    • -
    • Le fichier destination (ex: resultat.xhtml) est - représenté par une DOM qui doit être - éventuellement sérialisé (i.e. retransformé en fichier XML). -
    • -
    • La transformation elle même (ex: style.xsl) peut être - sous forme diverse (fichier, URL, DOM, …) -
    • -

      On a donc une série de classes d'encapsulation (Source, - …), de factory, …

      -
    - - -
    -
    -

    Création d'une transformation

    -

    Pour créer une transformation XSLT, il faut les classes suivantes, - du package: javax.xml.transform

    - - //La classe permettant d'appliquer une transformation XSLT - //ainsi que sa factory - import javax.xml.transform.Transformer; - import javax.xml.transform.TransformerFactory; - - //La classe permettant de charger des transformations ou des - //arguments de transformation sous forme de fichiers - import javax.xml.transform.stream.StreamSource; - - //La classe permettant de charger des documents ou transformations - //sous forme de nœuds DOM - import javax.xml.transform.dom.DOMSource; - - -
    - -
    -

    Exemple

    - - - TransformerFactory tf = TransformerFactory.newInstance(); - //On crée un StreamSource à partir d'un nom de fichier contenant - //la feuille de style XSLT - Transformer tr = tf.newTransformer(new StreamSource("style.xsl")); - - -

    Le code ci-dessus crée un objet de type Transformer - représentant la transformation XSLT se trouvant dans le fichier - style.xsl.
    - Si on avait chargé le fichier sous forme d'un - arbre DOM: -

    - Document style_xsl = … ;//chargement de style.xsl - - TransformerFactory tf = TransformerFactory.newInstance(); - Transformer tr = tf.newTransformer(new DOMSource(style_xsl)); - - - -
    -
    -

    La méthode Transformer.transform()

    - transform(Source xmlSource, Result outputTarget) - -

    Les interfaces Source et Result permettent - d'abstraire le type de l'entrée et de la sortie. Ces dernières - peuvent être :

    -
      -
    • Des objets DOM : DOMSource et DOMResult
    • -
    • Des objets d'entrée sortie de la bibliothèque java standard - (File, Input/OutputStream, Reader/Writer, - chaîne de caractère représentant un nom de fichier - : StreamSource et StreamResult
    • -
    - -
    -
    -

    Exemple

    - - //On applique le transformer associé à style.xsl - //sur le fichier movie et on écrit le résultat sur - //la sortie standard : - - tr.transform(new StreamSource("movies.xml"), new StreamResult(System.out)); - -
    -
    -

    Sérialisation

    -

    La manière la plus simple de sérialiser un document est de - créer une transformation XSLT vide (i.e qui fait l'identité) et de - demander à ce que le résultat soit un fichier (ou la sortie - standard)

    - - Document doc = …; //l'objet DOM que l'on veut sauver dans un fichier - Transformer tr = tf.newTransformer(); - tr.transform(new DOMSource(doc), - new StreamResult(new FileOutputStream("fichier.xml"))); - -
    -

    Streaming avec SAX

    -
    -

    Streaming ?

    -

    Charger un document avec DOM permet d'accéder à l'arbre « en - entier » mais peut être couteux en mémoire (chaque nœud possède au - moins 4 pointeurs, 2 chaines de caractères, …). On veut pouvoir - effectuer certains types d'opération à la volée : -

    -
      -
    • Faire des statistiques sur les documents (compter le nombre - d'éléments, d'attributs, …)
    • -
    • Faire des transformations simples qui - préservent la structure (par exemple mettre les balises en - majuscules)
    • -
    • Valider vis à vis d'une DTD
    • -
    -
    -
    -

    Programmation évènementielle

    -

    Les parseurs SAX (Simple API for XML) reposent sur la programmation - évènementielle. Ils lisent le fichier d'entrée et génèrent un - certain nombre d'évènements, auxquels on peut réagir avec du code. - Les évènements sont : -

    -
      -
    • Début de document
    • -
    • Fin de document
    • -
    • Ouverture de balise (avec le nom et la liste des attributs)
    • -
    • Fermeture de balise (avec le nom)
    • -
    • Élément texte
    • -
    • Commentaire
    • -
    • …
    • -
    -
    -
    -

    L'API SAX

    - -import javax.xml.parsers.*; -import org.xml.sax.*; -import org.xml.sax.helpers.*; - -

    On doit étendre la classe par DefaultHandler

    -
    -
    -

    DefaultHandler

    - - //le parseur a lu length caractères qui se trouvent dans - //ch à partir de la position start - void characters(char[] ch, int start, int length) - - //le parseur a détécté la fin de document - void endDocument() - - //le parseur a détecté la fin d'un élément - void endElement(String uri, String localName, String qName) - - //le parseur a détecté du texte « ignorable » - void ignorableWhitespace(char[] ch, int start, int length) - - //le parseur a détecté le début du document - void startDocument() - //le parseur a detecté le début d'un élément - void startElement(String uri,String localName, String qName, - Attributes attributes) - -

    Attributes est une classe auxiliaire qui permet de - connaître le nom, le nombre et les valeurs des attributs pour cette - balise.

    -
    - -
    -

    Handler personnalisé

    -

    On étend la classe DefaultHandler :

    - -class MyHandler extends DefaultHandler { - private int nb_elems; - MyHandler() { - nb_elems = 0; - } - void startElement(String uri,String localName, String qName, - Attributes attributes) - throws SAXException { - nb_elems++; - - } - int getNbElems() { return nb_elems; }; -} - - - -
    -
    -

    Invocation du parseur

    -

    On utilise (encore) une factory :

    - - public static void main(String[] args) { - … - SAXParserFactory spf = SAXParserFactory.newInstance(); - spf.setNamespaceAware(true); - SAXParser saxParser = spf.newSAXParser(); - - MyHandler my = new MyHandler(); - XMLReader xmlReader = saxParser.getXMLReader(); - xmlReader.setContentHandler(my); - xmlReader.parse(filename); -} - - -
    - - diff --git a/xpi/xpi_08.xhtml b/xpi/xpi_08.xhtml deleted file mode 100644 index 6c4e24c..0000000 --- a/xpi/xpi_08.xhtml +++ /dev/null @@ -1,306 +0,0 @@ - - - - - JSP - - - - - - - - - - - - - - - - - - - - - -

    Principe

    -
    -

    Programmation Web coté serveur

    -

    (rappel) génération de pages-web dynamiques (i.e. dont - le contenu est calculé en fonction de la requête - HTTP). Plusieurs choix de langage côté serveur. -

    -
      -
    • PHP (déploiement de site très simple, - langage merdique - particulier) -
    • -
    • Python, Ruby (manque de standardisation, plusieurs - framework concurrents, problèmes de performances)
    • -
    • ASP .NET (microsoft)
    • -
    • Java/JSP (langage raisonnable, déploiement complexe)
    • -
    - -
    -
    -

    JSP

    -

    JSP (Java Server Pages) est un framework permettant de - créer des pages Web dynamiques en Java. Il fait partie de la - suite Java EE (Entreprise Edition). Rappel : -

    -
      -
    • Java Card (Java pour cartes de crédit, très peu de choses, - pas de GC)
    • -
    • Java ME (Micro Edition, pour les périphériques embarqués, - mobiles, etc.)
    • -
    • Java SE (Standard Edition, java « normal »)
    • -
    • Java EE (Entreprise Edition, SE + packages pour JSP, et autres)
    • -
    -
    -
    -

    Architecture

    -

    Nécessite un serveur Web particulier. Le standard est Apache Tomcat.

    -
      -
    • Le programmeur écrit des fichiers .jsp, contenant - du HTML + du java dans des balises spéciales
    • -
    • (Le programmeur déploie les fichiers sur le serveur - Tomcat)
    • -
    • L'utilisateur navigue vers une page foo.jsp
    • -
    • Le serveur Tomcat génère fooServlet.class
    • -
    • La classe est chargée dans la JVM java et (sa métode - principale) est exécutée, produisant une page HTML
    • -
    • La page HTML est envoyée au navigateur
    • -
    -
    -
    -

    Exemple

    - - - - - - test JSP - - - - Page created on - <%]]> - java.util.Date d = new java.util.Date(); - out.println(d.toString()); - - - ]]> -
    -
    -

    balises spéciales JSP

    -

    JSP introduit 4 balises spéciales qui sont interprétée par le - serveur Tomcat. -

    -
      -
    • Balise de configuration : <%@ … %> (options HTML, - import de packages, …)
    • -
    • Balise de déclarations : <%! … %> (déclarer des - attributs et des méthodes)
    • -
    • Balises d'instructions : <% … %> (permet de mettre - une suite d'instructions)
    • -
    • Balises d'expressions : <%= … %> (permet de mettre - une expression dont le résultat est converti en String)
    • -
    -
    -
    -

    Exemple complet

    - - <%@ page import="java.util.Date" %> - - - test JSP - - - <%! - Date maDate; - - Date maMethode() { - return new Date(); - } - %> - - <% - maDate = maMethode(); - %> - Page created on <%= maDate %> - - ]]> -
    -
    -

    Objets par défaut

    -

    Le code placé dans les balises spéciales a accès à certains objets - automatiquement déclarés. Parmi les principaux : -

    -
      -
    • out de type JspWrite - (comme System.out mais écrit dans la page Web générée -
    • -
    • session de type HttpSession : permet de - définir et récupérer des variables de sessions (i.e. Objets que l'on - stocke « globalement » et que l'on peut récupérer d'une page à - l'autre)
    • -
    • request de type HttpServletRequest : permet - de récupérer les paramètres passés dans une requête HTTP (par - exemple les valeurs d'un formulaire)
    • -
    • response de type HttpServletResponse : permet - de spécialiser la réponse envoyée au client (en-têtes HTTP, - cookies, …)
    • -
    -
    - -
    -

    Classe JspWriter

    -

    Fonctionne comme System.out (on peut donc - appeler .print/.println) mais correspond a un endroit - particulier de la page HTML

    -
    - -
    -

    Classe HttpSession

    -

    Propose plusieurs méthodes :

    - //Renvoie la valeur stockée sous le nom name - Object getAttribute(String name) - - //Stocke l'objet value sous le nom name - void setAttribute(String name, Object value) - - //Supprime l'association name value - void removeAttribute(String name) - - //Définit la durée (en secondes) d'inactivité d'une session - void setMaxInactiveInterval(int interval) - - //Renvoie la durée (en secondes) d'inactivité d'une session - int getMaxInactiveInterval() - - //Renvoie la date (en mili-secondes depuis EPOCH) de dernière utilisation - long getLastAccessedTime() - - //Détruit la session en cours - void invalidate() -
    -
    -

    Classe HttpServletRequest

    -

    Propose plusieurs méthodes :

    - //Récupère la valeur des cookies: - String[] getCookies() - - //Récupère les paramètres passés par un formulaire : - Map<String, String[]>getParameterMap() - - //Récupère un paramètre particulier - String[]getParameter(String name) - -
    -
    -

    Classe HttpServletResponse

    -

    Propose plusieurs méthodes :

    - //Renvoie une erreur HTTP (404 par exemple) - void sendError(int code) - - //Ajoute un cookie au site - void addCookie(Cookie c) - - //Effectue une redirection temporaire - void sendRedirect(String url) - -
    -
    -

    Classe Cookie

    -

    Propose plusieurs méthodes :

    - //Constructeur - Cookie(String name, String value) - - //Expiration en secondes - void setMaxAge(int a) - -
    -

    Spécificités de Tomcat

    -
    -

    Chemins par défaut

    -

    Par défaut le serveur Tomcat tourne sur le port 8080 (configurable)

    -
      -
    • /var/lib/tomcat/webapps/toto/ correspond à l'URL - http://domaine:8080/toto -
    • -
    • /var/lib/tomcat/webapps/toto/WEB-INF/ contient des - fichiers de configuration
    • -
    • /var/lib/tomcat/webapps/toto/WEB-INF/classes/ contient des - fichiers .class auxiliaires
    • -
    -

    (ce sera configuré légèrement différement au PUIO)

    -
    -

    Accès aux classes JSP

    -
    -

    Il faut avoir le fichier jsp-api.jar dans le - classpath

    - javac -cp /chemin/vers/jsp-api.jar MaClasse.java -

    On peut ensuite copier le .class - dans WEB-INF/classes

    -
    - -