Le World Wide Ouèbe Conférence de Thierry Boudet <101355.2112@compuserve.com> Les informations contenues dans ce document ne sont probablement pas exactes à 100%, ni même à 80, et je m'en excuse. On ne peut pas tout savoir. Mais je me tiens à votre disposition pour les éventuelles corrections. Vous savez où me trouver. Les chapitres sont classés dans un ordre aléatoire, c'est normal, je les ait écrits sans avoir fait de plan. D'autre part, les marques citées sont la propriété de qui vous savez, ou de qui vous pensez savoir, mais en fait non. A ce propos, les fautes d'orthographe n'engagent que ceux qui les lisent. 1) Historique Bon, je ne vais pas m'éterniser des heures sur l'histoire de l'Internet, quoique c'est un sujet extraordinaire. Il existe (pour ceux qui lisent l'américain) un très bon livre: "Casting the Net, from Arpanet to Internet, and beyond ...", écrit par Peter H. Salus et publié par Addison-Wesley. Je vous en conseille la lecture à tous. Quand j'aurais quelques mois devant moi, j'en ferais peut-être la traduction en français :-) Vous savez tous que l'ancètre d'Internet était Arpanet, projet lancé et financé par l'armée américaine, qui désirais un moyen de communication à l'épreuve d'une guerre nucléaire: ce qui implique l'abscence de centralisation et le re-routage automatique des liaisons. Aussi, je vous laisse méditer cette reflexion: "Internet a été inventé pour résister à la guerre nucléaire. Curieusement, pour le mettre à genoux, il a suffit qu'un physicien nucléaire invente le Web." 2) Le langage HTML HTML est l'acronyme de "HyperText Markup Language". Actuellement dans une version que tous le monde s'accorde à trouver proche de 3.2 +/- epsilon. Mais ça peut changer du jour au lendemain. Rappellez vous le tapage gigantesque autour de HTML v3.0 qui n'a jamais officiellement existé. Html, il ne faut pas en faire un plat. Les notions de base sont apprises en une demi-journée, et ces notions sont amplement suffisantes pour une utilisation 'conventionnelle'. Il suffit de suivre les quelques recettes que je vais vous expliquer maintenant. Bien entendu, avec ces recettes, vous ne pourrez pas faire la véritable 'official home page of Pamela Anderson', mais vous saurez vous exprimer de façon décente dans le ouèbe. Je laisse à d'autres le soin de faire des pages à gadgets. a) La structure d'une page: Une page est constituée de deux parties, l'en-tete et le corps. L'en-tete contient le titre de la page. Ce titre sera affiché à un autre endroit que le reste de la page, en général dans la barre de titre de la fenètre. D'après mon expérience personnelle, il est bon d'eviter les caractères accentués, c'est plus poli. Le corps de la page contient vos élucubrations. Exemple: 1 2 3 Ma page a moi 4 5 6 Ouba Ouba, je suis dans la toile mondiale ! 7 8 Le langage Html utilise des "tags" pour s'exprimer. Un tag est un mot-clef placé entre < et >. Beaucoup de ces tags sont des tags englobants, c'est à dire qu'ils marchent par paire, le premier 'ouvre' et le second 'ferme'. Ils peuvent être imbriqués. Dans notre exemple les tags 1 et 8 délimitent la page, les tags 2 et 4 l'en-tête, les tags 5 et 7 le corps et les deux tags sur la ligne 3 englobent le titre. Voilà. b) Un petit peu de mise en forme: Pour donner du relief à vos élucubrations, voici les quelques tags vraiment nécessaires. A une exception près, ils sont tous englobants. Les titres (à ne surtout pas confondre avec le 'title' de l'en-tête) utilisent les tags 'heading'. Ceux-ci sont au nombre de 6 et de la forme xxx. Dans 99% des cas,

est le plus gros et

le plus petit. Dans les courriers electroniques, vous savez tous qu'écrire en majuscules équivaut à CRIER. Html est plus nuancé: nous avons les tags emphasis et strong qui mettent en valeur plus ou moins fortement leur contenu. Dans les environnements graphiques, le texte est affiché avec une police à espacement proportionnel, et c'est parfois inadapté. le tag télétype force le butineur à utiliser une police à largeur fixe. Enfin, pour terminer par quelque chose de simple, le tag
, celui qui n'est pas englobant, trace une ligne horizontale qui traverse l'écran, on appelle ça une 'horizontal rule'. Maintenant, on se calme, c'est fini. c) Les Hyper-liens: Voyons maintenant ce qui fait la force du ouèbe: le GOTO ! Certaines parties de votre page (texte et/ou image) peuvent être rendues réactives. C'est à dire qu'une action sur cette partie de la page (eg: un bon cliquettement de souris) va demander au butineur de charger une nouvelle page. Cette page est désignée par son URL ou Uniform Ressource Locator. En gros, c'est son emplacement dans l'Internet. Le tag utilisé pour les hyper-liens est un tag englobant. Il a cette forme: LIEN. Par exemple, si nous désirons rajouter un lien à notre première page, nous pouvons remplacer la ligne numéro 6 par ceci: J'aime beaucoup Pamela A partir de maintenant, quand cette page s'affichera dans votre butineur, le mot Pamela sera mis en valeur (non, on n'a aucun moyen de supprimer le soulignement des liens ;-) d'une façon quelconque. Il est devenu réactif. Donc, activons-le. Notre butineur va décoder le HREF: il trouve qu'il doit demander le document 'ouba.html' au serveur 'pam.ander.son', en utilisant le protocole 'http'. Il va donc le faire, et dans ce nouveau document il va y avoir d'autres liens et ainsi de suite. 3) Le protocole HTTP HTTP est l'acronyme de "HyperText Transfer Protocol". Actuellement dans sa version 1.0 mais la 1.1 est en bonne voie. Si j'ai le temps, je vais y jeter un coup d'oeil pour vous en parler, car elle apporte des avantages incontestables. Ce protocole régit les communications entre le serveur ouèbe et le client butineur. Il serait en théorie indépendant de la 'couche transport', mais en pratique, on ne le trouve que sur TCP/IP. Bien qu'à une époque, certains hackers furieux de chez Novell aient implémenté HTTP sur SPX/IPX, l'équivalent Novell de TCP/IP. C'était au temps de l'UnixWare (ex AT&T, ex USL, now SCO). Comme quoi, tout peut arriver. La première chose à savoir sur HTTP, et surement la plus surprenante pour les habitués des mainframes et/ou du videotext, c'est que HTTP est un protocole "state-less" ou "sans état". D'une requète à l'autre, ni le client ni le serveur ne mémorisent d'informations sur la ou les requètes passées. Pour la simple consultation de Pamela Anderson, ce n'est pas sâle. Par contre, nous verrons plus tard tous les problèmes que cela pose pour les applications interactives (interactive, Pamela :-). Bien entendu, un certain nombre de 'truandes' et/ou d'améliorations permettent de corriger cette déficience. Pour voir le déroulement des opérations, c'est très simple: puisque HTTP est posé sur TCP et utilise l'Ascii, un petit coup de telnet et vous allez comprendre. DEMO. Vous voyez, il n'y a rien de compliqué ? $ telnet machin.ici 80 commande unix Trying 193.30.30.30 ... telnet ... Connected to machin.ici ... nous ... escape char is '^]' ... parle GET /foobar.html HTTP/1.0 nous tapons la requete, puis une ligne vide. et la, maintenant, le serveur nous envoie le document... Quand c'est fini, la connexion est coupée. $ Une requète complète est constituée d'une ou plusieurs lignes de texte en ascii NVT, c.a.d. théoriquement terminées par la séquence CR/LF. La fin de la requète est marquée par une ligne vide. La première ligne d'une requète est décomposable en trois champs séparés par un espace. Le 1er champ est un mot-clef, le second est la référence du document et le troisième champ indique le protocole utilisé et son numéro de version. Les différents mot-clefs du protocole http 1.0 sont: GET obtenir un document (infos et contenu) HEAD obtenir des infos sur un document POST envoyer des données au serveur PUT envoyer un document au serveur DELETE effacer un document du serveur TRACE demande des renseignements aux proxies OPTIONS pour negocier les options. En première approche, HEAD, GET et POST sont les trois requètes les plus utiles. GET demande la page. HEAD permet d'obtenir quelques informations sur une page, sans avoir à la charger en entier. POST permet d'envoyer des informations de taille quelconque (et surtout importante) vers un serveur: contenu d'un formulaire comprenant de nombreux champs, par exemple. PUT permet d'envoyer un fichier dans le serveur et DELETE permet de boire le café. Quand aux deux dernières, je ne sais pas vraiment à quoi ça sert ... 4) Les serveurs Bon, là, je suis un peu embèté car je n'ai pas grand chose à dire. Dans ma carrière de ouèbeur, j'ai utilisé essentiellement trois serveurs, deux sous Unix et un sous Windows 3.11, ne riez pas, il y a aussi de très bons softs pour Fenètres de MiniDoux ! A l'heure actuelle, si vous devez apprendre un serveur, je vous conseille de choisir Apache. Si plus de 45% des serveurs ouèbes du monde sont des Apaches, il y a peut-etre une raison. Par contre, si la malchance vous a collé a Windaube95, je pense ne pas me tromper en vous suggérant Website de O'Reilly. Et si vous êtes en 'never terminated', patientez encore quelques semaines, vous allez bientôt avoir un Apache aussi ! 5) Les Nano-serveurs Le nano-serveur est une "invention" que j'ai faite il y a déja deux ans, alors que je travaillais dans une boite de gestion, sur le système UnixWare. Je ne pense pas être le seul à avoir découvert ce concept, mais le terme nano-serveur me plait beaucoup, et j'en revendique la paternité. Le principe est simple: il consiste à utiliser le protocole HTPP de façon classique. Par contre le nano-serveur n'utilise pas la partie 'path' de l'URL pour chercher des fichiers, mais comme des arguments, un peu à la façon d'argv[]. Après décodage de cette 'ligne de commande', il peut executer l'action spécifique pour laquelle il a été écrit. On a donc des périphériques d'affichage performants et offerts gracieusement par MickeySoft pour faire plein de choses avec nos Linucses. Il suffit de respecter le protocole HTTP, et la partie qui nous interesse n'est pas énorme, et d'écrire du HTML pour piloter l'affichage. Autre possibilité, plus subversive, de l'architecture nano- serveur: espionner les butineurs. Nous avons vu un peu plus haut qu'une requète HTTP était constitué de lignes de texte et terminée par une ligne vide. D'habitude, personne, en dehors de l'indien, ne voie ces lignes. Un nano-serveur spécialisé peut, par contre, les stocker et vous les resservir gentiment enrobées dans du HTML. Je l'ai déja fait, c'est très instructif. Et je considèrerais oeuvre de salubrité publique l'installation de ce type de nano-serveur sur la machine Excalibur. Signature de la pétition à la sortie. 6) Les butineurs En avant, voici le sujet le plus sensible de la conférence. Qui n'a pas vu ces fantastiques 'flame-wars' dans les newsgroups ? "mon Netscape est mieux que ton Arena", "Vous n'y comprenez rien, le meilleur c'est MSIE 11.01 sur Windaube eNTi", "Moi, je dis qu'il n'y a que Lynx de valable, le reste c'est que des trucs de gonzesse", etc... etc... Pour ajouter au débat, sachez que je suis en train d'essayer de faire marcher Net-Tamer (e-mail, news, www, ftp, telnet, ping, daytime, etc...) sur mon pécé 286. Ce soft n'est pas encore au point, mais l'auteur semble très motivé. Affaire à suivre. Un butineur (browser pour les non-québécois) est la partie 'cliente' du ouèbe. Sa première fonction est d'aller chercher par HTTP une page à partir de son URL, d'extraire de cette page les hyper-liens et d'afficher le tout sur votre écran/synthétiseur de parole/tablette Braille. Il doit également vous permettre de 'pointer' un des liens de la page courante afin de prélever la page désignée. goto début. Le reste n'est que de l'enrobage. 7) Les scripts CGI CGI est l'acronyme de "Common Gateway Interface", que l'on peut traduire approximativement par "Interface de Porte Commune". C'est pas très beau, et puis ça donne IPC, qui est l'acronyme de "Inter Process Communication", ce qui peut prèter à confusion, quoique... Cette interface, dans sa forme actuelle, a été mise au point par le NCSA, National Center for Supercomputing Application, (plus connu comme étant le créateur de Mosaic, ancètre commun de Netscape et MSIE). Elle est actuellement standardisée sour la forme du rfcXXXX. Le but de cette interface est de définir la communication entre le serveur httpd et un programme externe afin que le serveur fasse 'relais' dans les deux sens entre un butineur/client et ce programme, exécuté sous le controle du serveur. Lequel programme devant pouvoir être écrit dans n'importe quel langage à peu près civilisé. Dans les systèmes Unix (et dérivés) cela signifie trois choses: entrée et sortie standard, accès aux variables d'environnement. Pour une classe un peu particulière de CGI (ceux qui gèrent les cf. mon article dans le numéro 3 de go@elfix) il faut aussi avoir accès à la ligne de commande (argc, argv). Commençons par un exemple très simple: l'affichage des variables d'environnement sans aucune mise en forme. Il y a des numéros de lignes car c'est un CGI vraiment très basique. 1 #!/bin/sh 2 echo "Content-type: text/plain" 3 echo 4 printenv La ligne 1 indique au système l'interpreteur à utiliser. La ligne 2 envoie un type MIME, qui servira au butineur pour selectionner la façon d'afficher ce qu'il va recevoir. Cette ligne fait partie de l'en-tète de la réponse HTTP. La ligne 3 est vide et signale la fin de l'en-tete. Le butineur sait donc qu'il va recevoir du texte à afficher tel quel (plain). Et finalement, la ligne 4 affiche toute les variables. Cela semble rien du tout, mais vous venez de découvrir la puissance du tandem ouèbe/CGI. Exercice: essayer de trouver toutes les commandes Unix qui pourraient prendre la place de printenv. Il y en a beaucoup [ps|who|free|netstat]. Combiné avec une page qui liste tous ces petits CGI, vous avez de quoi surveiller votre machine dans un confort quasi Billgateux. 8) Les CGI vu du coté administration. Mettre un CGI dans une page ouèbe, si vous ètes relié à l'Internet, c'est laissez à 100 millions de personnes la possibilité d'executer un programme dans _votre_ machine. Tous le monde n'est pas net dans l'Internet. Et même si vous êtes dans un contexte fermé, une bêtise est toujours possible. Il faut donc prendre des précautions. En général, on fait tourner le logiciel serveur avec un couple UID/GID muni du minimum de privilèges nécessaires. Ce qui implique que les processus enfants du serveur, donc vos scripts CGI, utiliseront aussi cette identité. Un script qui fonctionne correctement depuis le prompt, donc avec votre uid/gid habituel, ne marchera pas forcément quand il sera exécuté depuis le serveur ouebe. 10) Les visualiseurs externes. Nous avons vu qu'à chacun des types de données stockées dans ou produite par un serveur était associé un "type mime" que l'on retrouve dans le champ "Content-type" de la réponse http. En général, le serveur ouèbe possède une table de correspondance extension de fichier vers type mime. Pour chacun des documents envoyés vers le butineur, le type mime associé est également envoyé et le butineur dispose d'une table de correspondance entre les types mime et la méthode d'exploitation des données de ce type. Par exemple, dans le serveur de mon bureau, j'ai un soft qui fabrique des images au format PCX. Dans le fichier srm.conf d'Apache, j'ai rajouté une directive "AddType image/pcx pcx" pour les documents statiques, et j'utilise "Content-type: image/pcx" dans les scripts. Coté Windaube 95, j'ai rajouté l'association "image/pcx=PBRUSH.EXE" dans la configuration de Mosaic, et celui-ci lance Paintbrush dès qu'arrive un PCX. Inutile de vous dire que c'est beaucoup plus difficile avec IE :-) On peut utiliser cette possibilité pour beaucoup de choses... On retrouve le même principe pour les modules 'plugs-in' de Netscape, mais je n'ai pas encore eu le temps d'étudier la chose. 14) Les Images dans le Ouèbe Nous avons vu que le tag permettait d'include une image au sein d'une page Ouèbe. Les formats de fichier reconnus par la grande majorité des browsers sont: XBM (monochrome), GIF (256 couleurs) et Jpeg (2^24 couleurs). En configurant des visualiseurs externes, on peut bien entendu accéder à d'autres formats, mais ce n'est plus de l'image en ligne. La source de l'image est une URL, on peut donc avoir un fichier en local ou un fichier qui provient d'un autre serveur: . D'autre part, le fichier image peut être fabriqué par un programme. Par exemple, notre exemple peut être facilement transformé en CGI: 1 #!/bin/sh 2 echo "Content-type: image/gif" 3 echo 4 cat foobar.gif Quel est l'intérèt de cette façon de faire ? Absolument aucun pour le moment, mais rajoutons une ligne à ce script, et les choses changent: 5 echo $HTTP_REMOTE_ADDR >> remote.log Et nous avons un enregistrement des adresses des 'hosts' qui ont chargé cette image. Vous voyez, le Ouèbe, c'est vraiment des principes simples, mais la mise en oeuvre est un peu plus compliquée dans la réalité. N'oublions pas que _plusieurs_ clients peuvent charger en même temps cette image, et donc il faut regler les conflits d'accès au fichier 'remote.log'. Mon expérience personnelle m'a néammoins montré que dans ce cas précis, et à des niveaux de charge raisonnable, ça marche correctement. Bien entendu, la méthode orthodoxe pour éviter ces conflits nécessite de mettre un 'lock' sur le fichier, mais cela est assez délicat à faire en bash. 15) Les sons et la musique dans le Ouèbe Tout d'abord, allez relire le passage sur les visualiseurs externes car c'est exactement les mêmes principes qui seront utilisés. 17) Ecrire des CGI en Fortran/f2c. Quoi ? le Fortrash ! mais c'est un langage obsolète, complètement ringard, pourquoi pas en Cobol ? Parce que je n'ai pas de Cobol dans mon Linux. Plus sérieusement, c'est en lisant les news que cette idée m'est venue. Je voyais passer de temps en temps des messages demandant si cela était possible, et les réponses étaient assez "ironiques". Je me suis donc penché sur la chose. Il faut essentiellement écrire une librairie C pour récuperer les variables d'environnement et décoder les requètes de formulaires. Je ne pense pas que le boulot soit énorme, il faut juste trouvé comment f2c gère ses variables de type texte. Je commence à avoir quelques trucs qui fonctionnent, mais ce n'est pas encore assez 'fini' pour être diffusé. Si il y a des personnes interessées, contactez-moi pour avoir plus de détails. 21) Les compteurs de "hits" Ahhh, que voilà un beau sujet de controverse. Tous ces petits chiffres rigoureusement inutiles, obstinéments imprécis, sagement rangés en bas des pages, qui essayent de se camoufler en s'encadrant d'une phrase humoristique. Imaginez-vous les giga-octets de bande passante dépensée par le futile égo humain ? Surtout avec les compteurs qui s'incrémentent à chaque 'reload'. Ceux-là, des fois, je me les fait à grand coup de TrashBrowser. Ce qui est très bon pour mon égo à moi. Voyons plutôt comment c'est réalise. On peut distinguer 3 étapes dans la vie du compteur de 'hits': le déclenchement, l'addition et l'affichage. Je passerais brièvement sur l'addition, tout le monde sait faire une addition (en général, c'est sur des nombres entiers, c'est pas trop dur). La gestion des accès concurrents à la base de données sous-jacente ne doit pas vous poser de problèmes non plus. Examinons plutôt le reste de l'opération. Il existe deux grandes variétés de compteurs de hits, les "graphiques" et les "textes". Cette distinction a une influence sur le déclenchement, l'architecture et l'affichage. a) les compteurs graphiques: Ils sont déclenchés lors d'une requète de chargement d'image activée par un tag du genre: et génèrent en sortie un fichier graphique (xbm, gif, jpeg, peu importe). Ce fichier est donc fabriqué indépendemment de la page texte, et peut-être par un serveur différent. Cette catégorie peut être subdivisée en deux branches: le compteur peut être un script CGI conventionnel, ou un serveur spécialisé, un gros nano- serveur en quelque sorte :-) b) les compteurs textes: On les trouve dans les pages de la catégorie "Serveur Side Include" ou "Parsed HTML". Un marquage spécifique doit être dissimulé dans un commentaire HTML: Le serveur, au moment d'envoyer cette page dans le tuyau, la parcours, cherche ces marquages, les decodes, exécute le programme correspondant, en récupère 'stdout' et insère ce texte à la volée dans ce qui est envoyé au butineur. C'est donc le même serveur qui fournit le compteur et la page. En dehors de la différence visuelle, quels sont les avantages et les inconvénients des deux méthodes ? Euh, voilà, là, je sais pas trop quoi répondre pour le moment. Tout d'abord, commençons par un _réel_ inconvénient des compteurs textes: ils déclenchent presque systématiquement les "surveilleurs de pages" du genre de Netmind/URL- minder. 24) Notions avancées en HTML. Je suis très désolé, mais je n'ai pas eu le temps de faire ce chapitre. 30) La génération de page automatique. En dehors de la fabrication manuelle et des scripts CGI, il existe une troisième méthode: la fabrication automatique de pages à partir d'informations diverses et variées. Nos Unicses sont munis d'un petit esclave méconnu: 'cron', qui peut déclencher à intervalles réguliers l'exécution d'un programme. Et ce programme peut confectionner une page Ouèbe. J'ai choisi comme exemple une statistique sur les utilisateurs d'un système. Il y aura en fait deux programmes: le premier va échantillonner les données à intervalle régulier (15 minutes), et le second, de périodicité plus faible (24 heures ou une semaine), fera l'analyse et l'écriture de la page. #!/bin/sh /usr/bin/who | /usr/bin/awk '{ print $1; }' >> sample.who Ce script shell collecte la première colonne de la sortie de la commande 'who' dans un fichier texte. Cette première colonne contient le nom de login. Il doit être lancé à intervalle suffisamment rapproché pour avoir un échantillonnage correct. Ensuite, il faut analyser les données collectées. Deux scripts sont utilisés. Le premier, en shell, va construire la page HTML. Il commence par écrire l'en-tête, puis passe la main à un programme awk qui fait les calculs, et enfin, il écrit la fin de la page. Pour finir, il mémorise les echantillons de la dernière période et des trois précédentes afin de 'lisser' les résultats. Que les matheux de l'assistance me pardonne si ma démarche manque de rigueur :-) #!/bin/sh cat <<__EOF__ Statistique des utilisateur

Statistiques des utilisateurs

          __EOH__
      
          /bin/cat sample.who sample.1 sample.2 sample.3 |
                    ./cumul.awk >> page.html
      
          cat <<__EOF__
          
__EOF__ /bin/cp sample.2 sample.3 /bin.cp sample.1 sample.2 /bin/cp sample.who sample.1 /bin/rm sample.who La partie calcul est écrite en awk (ah, que voilà un langage bien intuité !) qui permet facilement ce genre de manipulations. Notez la concision de la première partie du script: l'indice de la table qui sert à compter est vraiment le nom d'utilisateur ! #!/usr/bin/awk -f { table[$1]++; total++; } END { for (i in table) printf "%-12s %4d %7.3f\n", i, table[i], (table[i]/total)*100.0; printf "nbre echantillons %d\n", total; } Voila, ce n'est qu'un exemple d'une utilité somme toute limitée, mais cette méthode peut s'applique à beaucoup de choses. Elle permet surtout de découpler la création de la page de sa consultation. 42) Conclusion Pourquoi ce chapitre est-il numéroté 42 ? Parce que 42 est la réponse à la question universelle sur la Vie, l'Univers et le Reste. J'espère que cette modeste conférence vous aura donné envie d'aller plus avant dans l'étude des techniques Ouèbes. Au sein de l'association, nous pourrions envisager une étude commune, par exemple la construction d'un nano-serveur, (nom de code "Cassoulet") et qui contiendrais toutes les idées plus ou moins farfelues qui ne vont pas tarder à naitre dans vos cerveaux surchauffés par l'été.