Ce premier TP est destiné à vous initier aux technologies de base qu'on utilisera ensuite. Il ne sera pas évalué, mais les deux suivants le seront. Le TP comporte plusieurs exercices de difficultés variables (indiquées). Il n'est pas conçu pour être "terminé" mais pour que vous puissiez vous familiariser ou progresser, et combler vos lacunes.
Vous pouvez demander de l'aide, mais essayez de chercher par vous-même avant. Les liens disponibles dans la section documentation et les paragraphes "Hint" sont prévus pour ça. Les Hints proposent des pistes d'aide, mais vous pouvez trouver une autre méthode qui ne les utilise pas. Les paragraphes de "contexte" donnent quelques indications de culture informatique générale liée à l'exercice du TP, que vous pouvez creuser pour mieux comprendre les tenants et aboutissants des questions posées.
Le TP se déroule sous Linux à la fois :
Vous devrez utiliser un éditeur de texte adapté à la programmation (vim, Gedit, Atom, etc.)
Vous utiliserez vos machines personnelles pour effectuer le TP. L'enseignant ne fournira aucune aide "système" sur les machines personnelles. Vous devez installer les dépendances nécessaires à l'avance et vous assurer que toutes les composantes fonctionnent.
Les paquets (Debian ou Ubuntu) à installer :
apache2
, libapache2-mod-php
, php-cli
,php-curl
, php-mbstring
,unicode
.Selon l'ancienneté de votre système, les paquets PHP seront en version 5.6, 7.0 ou 7.1, mais cela n'a aucun impact sur la suite.
Vérifiez que http://localhost sert bien la page d'accueil par défaut d'Apache.
Activez les messages d'erreur dans votre configuration PHP/Apache :
Dans le fichier /etc/php/7.0/apache2/php.ini
(ou équivalent) configurez les lignes suivantes selon leur valeur de Développement (et non de production) :
error_reporting = E_ALL
display_errors = On
display_startup_errors = On
log_errors = On
Puis redémarrez Apache et examinez le fichier de log : /var/log/apache2/error.log
, qui contient
Si vous n'avez pas le droit de modifier la configuration Apache/PHP (cas très peu probable), vous mettrez en début de chaque fichier php les deux directives :
ini_set('display_errors', 1);
ini_set('error_reporting', E_ALL);
Pour lier Apache à votre répertoire local, la façon la plus simple est de créer un lien symbolique dans le répertoire racine d'Apache, généralement /var/www/html
(sous Debian/Ubuntu). Cela se fait par exemple avec les commandes (à adapter) :
mkdir ~/MMDO
cd /var/www/html
sudo ln -s ~/MMDO
Notez que le tilda ~ sous un shell unix représente le chemin de votre répertoire personnel. Puis visualisez dans un navigateur l'url http://localhost/MMDO
.
Une archive de modèles modeles.tgz
est disponible dans l'espace de cours Moodle ou éventuellement dans le répertoire polytech silecs. Récupérer l'archive et décompressez-la (tar -zxf
en ligne de commande).
info.php
dans l'environnement web (Apache et navigateur). Elle repose sur la fonction de diagnostic phpinfo()
.php -i
en ligne de commande (CLI), notamment pour Server API
..debogage.php
dans les deux environnements, et modifiez-le pour mener vos propres tests.Le but est de proposer une calculatrice d'intérêts composés très simple.
calcul.html
comportant un formulaire à 3 champs : somme, taux (en pourcentage), duree (en années), traité dans une deuxième page "resultat.php" affichant la décomposition du calcul et le résultat
formulaire.html
,resultat.php
, vous utiliserez la variable superglobale (typée tableau associatif) $_GET
ou $_POST
,pow()
ou l'opérateur exposant **
$ php monscript.php (arg1) (arg2)...
$argv
(similaire au C)require_once()
) pour structurer le calcul :
cumul($somme, $taux, $duree)
dans une bibliothèque libcalcul.php
,calcul.html
et resultat.php
pour l'interface web,clicalcul.php
en ligne de commande.On va maintenant se servir de la norme CSS pour améliorer un peu l'affichage HTML. On va se baser sur les fichiers elements.html
et elements.css
.
elements.html
pour le modifier. Commencez par visualiser l'arbre html (Ctrl + Shift + I > Inspecteur). Quel est l'élément de niveau le plus profond ? à quel niveau cela correspond-t-il ? (en comptant <html>
à 0).<ul>
table, tr, td
puis li
et a
seront utiles (seuls ou combinés).border
, color
et background-color
pourront servir.La hiérarchie de l'arbre html est importante. Elle sert aussi bien pour les sélecteurs CSS que pour les requêtes DOM (Document Object Model), en PHP ou en JavaScript. L'Inspecteur intégré à chaque navigateur (ou presque) vous permet de l'explorer facilement.
for ()
est votre amie.border
et padding
seront utilesisset()
pourra être utilesurlignee
) pour gérer proprement la mise en évidence.<style type="text/css">...</style>
, avec la directive background-color
.Le but est d'afficher une analyse "Unicode" des caractères tapés dans un formulaire ou en ligne de commande. Par exemple "A" a pour codepoint "U+0041" (41 en hexadécimal ou 65 en décimal). En utilisant les deux bibliothèques données (libunicodega.php
et portable-utf8.php
),
mb_substr()
et mb_internal_encoding()
de l'extension php-mbstring
si on a des caractères non ASCII (ce qui est l'intérêt de l'exercice). MB signifie "multi-bytes".font-size
unicode
(à installer) et l'appel système PHP exec(), ajoutez au rollover le nom normalisé du caractère pointé."
title
, par exemple dans <span title="message d'aide">support</span>
.
@ U+0040 |
A U+0041 |
B U+0042 |
C U+0043 |
D U+0044 |
E U+0045 |
F U+0046 |
G U+0047 |
H U+0048 |
I U+0049 |
J U+004a |
K U+004b |
L U+004c |
M U+004d |
N U+004e |
O U+004f |
Le codage des caractères en informatique a évolué ces dernières années. Initialement basé sur le code ASCII (pour l'anglais seulement), puis étendu pour correspondre à plusieurs langues européennes, il ne permettait pas de stocker des documents multilingues ou contenant plus de 256 caractères (chinois, coréen, japonais...). On utilise maintenant le standard Unicode qui permet notamment de cataloguer quasiment tous les caractères de toutes les langues sur Terre (y compris certaines langues antiques). Le point important est qu'en Unicode, chaque caractère a un code (de 4 à 6 chiffres hexadécimaux), et un nom normalisé en anglais. Par exemple, le caractère "A" est codé U+0041 et nommé LATIN CAPITAL LETTER A ; le caractère "Ω" est codé U+03A9 et nommé GREEK CAPITAL LETTER OMEGA. Même des symboles et des emojis sont inclus ; par exemple 💻 est normalisé en U+1F4BB PERSONAL COMPUTER.
Unicode permet lui-même plusieurs encodages mais le seul réellement utilisé sur le web est l'UTF-8, au point que certains logiciels confondent parfois Unicode et UTF-8.
On cherche à récupérer automatiquement les grands titres (h2
) d'un document html distant, par exemple un article de Wikipédia, avec comme entrée une adresse URL.
h2
en utilisant les fonctions DOM de PHP
DOMDocument::getElementsByTagName()
et DOMNode::textContent()
feront l'affaire.h2
et h3
, bien sûr en respectant l'ordre de la hiérarchie. Est-ce plus difficile, et pourquoi ?preg_match
). Qu'en pensez-vous ?L'exercice constitue un exemple simple de web scraping. C'est une méthode qui consiste à parcourir automatiquement le contenu d'un site classique (ie prévu pour la lecture humaine) et d'en extraire une synthèse, pour indexation, analyse locale ou autre. Il faut que le contenu soit raisonnablement structuré, ce qui est possible grâce aux éléments h1, h2, h3
... très communs. Pour des sites très "sales" (peu respectueux des standards), le scraping
peut être très pénible, et obliger à écrire beaucoup de code de nettoyage.
Plusieurs techniques différentes d'analyse sont autorisés en scraping. Pour du html raisonnablement propre, c'est souvent l'analyse DOM qui est le plus efficace. Dans d'autres cas, on recourt aussi aux expressions régulières (regexp), mais c'est bien plus délicat à manier pour des traitements complexes.
Pour la communication "machine" on prévoit plutôt d'utiliser des API web et des formats très structurés (XML, json ou autres), ce qui fera l'objet du prochain TP.