Saturday 26 November 2016

La séance du 23 Nov. 2016.(Avancé tableau URLS)




Pour le deuxieme script, J'ai trouvé qu'il manque beaucoup de choses. 
D'abord, la syntaxe de if then else fi:
if [ expression ]
then
   Statement(s) to be executed if expression is true
else
   Statement(s) to be executed if expression is not true
fi



Aussi, Je trouve qu'on devrait ajouter ‘fi’ en bas de la synthase ‘echo ...’


En plus, Il faut ajouter quelquechose sur ‘else’ syntaxe dans le script..Ensuite, j’ai essayé de faire marcher le script:


Mais ca n’as pas marché pour la premiere fois, donc j’ai essayé encore une fois . Finalement, j’ai trouve l’autre probleme pour ce script, en fait le problème était que dans cette syntaxe il manquait "do" dans le script "la boucle for".


Ensuite il manque aussi "done" et "done", comme on peut le voir sur la capture d'écran.




J’ai essayé de tester le script encore une fois. (3 fichiers, 3 essais pour tester le script.)

Voici les resultat des tableaux.html.(anglais, Français, et mandarin:caractères traditionnels)





---Wei-Hsuan CHEN.


















Friday 4 November 2016

Exercices pour la séance du 19 Oct 2016.(UNIX)


Fonction du script:

Le script va parcourir chaque URL donné dans le dossier contenant les URLs, et va en extraire des données.  Les données qui sont implémentés pour le moment sont :
-Lien vers la page
-Code CURL
-Statut CURL
-Page Aspirée
-Encodage Initial
-DUMP UTF-8

Quelques mots d’explication:

Le Statut CURL est la première ligne du header HTTP. Quand un client envoie une requête vers le server qui contient le page web, le client envoie une requête HTTP. Quand le server répond, il répond avec une réponse HTTP. Cette réponse contient un « header HTTP », qui contient des informations pour le client, et un « HTTP body », qui va contenir le HTML du page web, s’il y en a. La première ligne du header HTTP contient un « code retour ». Ce code donne de l’information au client sur la page. Voici les explications des codes :
-2xx : OK (La page est retournée avec succès)
-3xx : Moved permanently (la page est déplacée vers un autre URL)
-4xx : Not found (erreur au côté du client)
-5xx :
      Server error (erreur au côté du server)

Le code CURL va simplement extraire ce code donné dans le HTTP header.

L’Encodage du page web est le format textuel dans lequel la page est montrée. « UTF-8 » est un des possibilités. 

Pour le DUMP UTF-8 on télécharge la page avec Lynx, on le converti vers l’encodage UTF-8 et on le sauvegarde dans un fichier txt. 

Maintenant, on va analyser le script en détail.
#!/bin/bash
read DOSSIERURLS;
read fichier_tableau;
echo "Le dossier d'URLS : $DOSSIERURLS " ;
echo "Le fichier contenant le tableau : $fichier_tableau" ;


Le #!/bin/bash signifie au shell que ce script doit être exécuté avec bash.
Les deux lignes suivantes avec ‘read’ vont lire l’input de l’utilisateur, et vont sauver cet input dans les variables DOSSIERURLS et fichier_tableau. Les deux lignes suivantes avec la commande ‘echo’ vont montrer la valeur des variables dans le shell.

Alternative :
On pourrait aussi directement écrire dans le script le nom du dossier contenant les URLS, et le nom du fichier dans lequel on écrit le tableau html. Lors que cette option ne demande pas d’input de l’utilisateur, elle nécessite de changer le script si on change le nom du dossier, ou du fichier, rendant le script moins flexible.
Il serait aussi mieux d’ajouter une ligne ‘echo’ avant chaque commande ‘read’, de cette façon si :
echo ‘’Donnez le nom du dossier contenant les URLS’’
read DOSSIERURLS;
echo ‘’Donnez le nom du fichier dans lequel le tableau html doit être sauvé’’
read fichier_tableau;


# 2. Affichage des tableaux
cpttableau=1;
echo "<html><head></head><body>"
  > $fichier_tableau ;

Chaque ligne qui commence avec un # est une ligne avec commentaire
on initialise un variable ‘cpttableau’ sur la valeur 1. Dans la boucle ‘for’ externe, cette variable sera augmentée avec 1 chaque fois que la boucle a complété une fois.
La troisième ligne va écrire quelques données dans le fichier_tableau.

for fichier in $(ls $DOSSIERURLS);
do # debut du premier for
Cette boucle ‘for’ va parcourir chaque fichier dans le dossier contenant les URLS (donc, dans le resultat de $(ls $DOSSIERURLS) ), et donnera cette valeur au variable ‘fichier’.
Dans le script original, la syntaxe du boucle ‘for’ était incorrecte. La syntaxe correcte est :
for [variable] in [liste] ; do [commande] ; done
 

# traitement d'un fichier d'URL
compteur=1; # initialisation d'un compteur pour compter les URLs
echo "<p align=\"center\"><hr color=\"blue\" width=\"80%\"/> </p>" >> $fichier_tableau ;
echo "<table align=\"center\" border=\"1\">" >> $fichier_tableau ;
echo "<tr><td colspan=\"8\" align=\"center\">tableau n&deg $cpttableau</td></tr>" >> $fichier_tableau ;
echo "<tr><td align=\"center\"><b>N&deg;</b></td><td align=\"center\"><b>Lien</b></td><td align=\"center\"><b>CODE CURL</b><td align=\"center\"><b>statut CURL</b></td><td align=\"center\"><b>Page Aspir&eacute;e</b></td><td align=\"center\"><b>Encodage Initial</b></td><td align=\"center\"><b>DUMP initial</b></td><td align=\"center\"><b>DUMP UTF-8</b></td></tr>" >> $fichier_tableau ;
On initialise un deuxième compteur, qui comptera les URLS dans chaque fichier. Ceci veut dire que, chaque fois quand la boucle ‘for’ extérieure commence, la valeur de ‘compteur’ est remise à 1.
Les commandes ‘echo’ qui suivent vont écrire des données pour le tableau html dans le fichier_tableau.
# traitement de chacun des URLs
for line in $(cat $DOSSIERURLS/$fichier);
#------------------------------------------------
# pour chacune des lignes du fichier d'URL traite (une URL)...
do
On entre le deuxième boucle for, qui va traiter chaque ligne du $fichier. Chaque ligne contient un URL.
Ici, la syntaxe du boucle ‘for’ était aussi incorrecte dans le script original.

# ==> ASPIRATION DE LA PAGE
echo "TELECHARGEMENT de $line vers ./PAGES-ASPIREES/$cpttableau-$compteur.html" ;
curl $line -o ./PAGES-ASPIREES/"$cpttableau-$compteur".html ;
echo "CODE RETOUR CURL : $?" ;

La commande curl va accéder le URL et en extraire des données. Dans ce cas-ci, l’option –o [nom du fichier] va dire à la commande de rédiger l’output vers le fichier spécifié.
Le variable $? est un variable particulier, qui va indiquer si la commande qu’on vient d’exécuter a été exécuté correctement ou non. Si la valeur de $? Est égale à 0, alors la commande a été terminé avec succès.
# RECUPERATION DU HEADER HTTP
status1=$(curl -sI $line | head -n 1);
# RECUPATION DU CODE RETOUR HTTP ET DE LA PAGE
status2=$(curl --silent --output ./PAGES-ASPIREES/"$cpttableau-$compteur".html --write-out "%{http_code}" $line) ;
echo "STATUT CURL : $status2" ;
L’option –s va dire à la commande de ne pas montrer le progrès, et de supprimer les messages d’erreur.
L’option –I dit à la commande seulement de retourner le header HTTP.
Avec head –n 1, on montre que la première ligne du header. (-n 2 montrerait les deux premières lignes, etc.). La valeur de cette ligne sera sauvé dans la variable ‘status1’.
Le deuxième curl va rédiger le html du page vers un fichier html, et va retourner le code http. Celui sera sauvé dans la variable status2.
Alternative :
On peut écrire le deuxième curl en deux fois :
curl --silent --output
 ./PAGES-ASPIREES/"$cpttableau-$compteur".html $line
status2=$(echo $status1 | awk ‘{print $2}’)
awk ‘{print $2}’ va sélectionner le deuxième domaine de status1, ce qui sera le code HTTP.
# ==> DETECTION DE L'ENCODAGE DE LA PAGE en ligne
echo
  "DETECTION encodage de $line ";
encodage=$(curl -sI $line | egrep -i "charset=" |cut -f2 -d= | tr -d "\r" | tr
      "[:upper:]" "[:lower:]") ;
echo "ENCODAGE $line : <$encodage>" ;
La partie ‘egrep’ va chercher pour l’expression "charset=" dans le header HTTP. L’option –i indique que la capitalisation des lettres n’est pas importante. Même ‘cHaRsEt=’ sera reconnu par le ‘egrep –i’. Cette commande retourne la ligne entière dans laquelle l’expression a été trouvée. Après ça, la commande ‘cut’ va couper la ligne au délimiteur spécifié (dans ce cas : ‘=’), et va sélectionner le deuxième domaine (-f2). Le bloc suivant, avec la commande ‘tr’ (traduire), va supprimer le reste de la ligne après l’encodage, et retournera celle-ci en lettres non-capitalisées.
if [[ $encodage == "utf-8" ]] ;
then
echo "DUMP de $line : via lynx" ;
lynx -dump -nolist -assume_charset=$encodage -display_charset=$encodage
$line> ./DUMP-TEXT/$cpttableau-$compteur.txt ;
echo "ECRITURE RESULTAT dans le tableau" ;
echo "<tr><td align=\"center\">$compteur</td><td align=\"center\"><a href=\"$line\">lien n&deg$compteur</a></td><td align=\"center\">$status2</td><td align=\"center\"><small>$status1</small></td><td align=\"center\"><a href=\"./PAGES-ASPIREES/$cpttableau-$compteur.html\">P.A n&deg $cpttableau-$compteur</a></td><td align=\"center\">$encodage</td><td align=\"center\">-</td><td align=\"center\"><a href=\"./DUMP-TEXT/$cpttableau-$compteur.txt\">DUMP n&deg $cpttableau-$compteur</a></td></tr>" >> $fichier_tableau ;
‘if’ est une commande qui va vérifier une déclaration (boolean). Si cette déclaration est juste (true), le script rentre dans la partie ‘then’. Si cette déclaration est fausse (false), le script rentre dans la partie ‘else’. Dans ce cas-ci, le script rentre dans la partie ‘then’ si l’encodage est égale à « utf-8 ». Si l’encodage est différent, on rentre dans la partie ‘else’.  
La commande ‘lynx’ n’est pas installé par défaut. Pour installer ce programme, j’ai dû tapper : ‘sudo apt-get install lynx’.
Lynx est un programme qui retourne la page web en format texte. Dans ce cas-ci, l’encodage est utf-8, donc il n’est pas nécessaire de convertir le résultat. Dans la ligne suivante, toutes les données seront écrites dans le fichier_tableau.

else
# ... il faut transcoder le contenu de la page en UTF8
lynx -dump -nolist -assume_charset=$encodage -display_charset=$encodage $line | iconv -f $encodage -t "utf-8" > ./DUMP-TEXT/$cpttableau-$compteur.txt ;
echo "ECRITURE RESULTAT dans le tableau" ;
echo "<tr><td align=\"center\">$compteur</td><td align=\"center\"><a href=\"$line\">lien n&deg$compteur</a></td><td align=\"center\">$status2</td><td align=\"center\"><small>$status1</small></td><td align=\"center\"><a href=\"./PAGES-ASPIREES/$cpttableau-$compteur.html\">PA n&deg $cpttableau-$compteur</a></td><td align=\"center\">$encodage</td><td align=\"center\"></td><td align=\"center\"><a href=\"./DUMP-TEXT/$cpttableau-$compteur.txt\">DUMP n&deg $cpttableau-$compteur</a></td></tr>" >> $fichier_tableau ;
fi ;
Cette partie est presque identique à la partie ‘then’. La seule différence est qu’on a ajouté la partie avec ‘iconv’ :
| iconv -f $encodage -t "utf-8"
Cette commande prendra le résultat de la commande lynx, et transformera celui-ci en encodage utf-8.
‘fi’ signifie la fin du partie ‘if’
# il faut ajouter 1 au compteur de lignes
let "compteur=compteur+1" ; # let "compteur+=1";
done ;
#------------------------------------------------------
echo
  "</table>" >> $fichier_tableau ;
let "cpttableau=cpttableau+1";
done ;
echo "</body></html>" >> $fichier_tableau ;
Dans cette dernière partie, on augmente la valeur des compteurs de 1. On doit bien faire attention, car la variable ‘compteur’ est augmentée dans la boucle ‘for’ intérieure, lorsque la variable ‘cpttableau’ est augmentée en dehors de la boucle ‘for’ intérieure. Le script termine avec les tags de fermeture ‘</body></html>’, que le script ajoute au fichier_tableau. 
Voici le résultat du script :
Un example d’un des DUMPS de lynx. Dans ce cas il s’agit de la page www.lesoir.be :



---Wei-Hsuan CHEN.





Saturday 8 October 2016

Exercices pour la séance du 5 Oct 2016.


D'abord, j'ai créé un répertoire "Myhomework1" parce que ça me garde les choses plus facilement et de façon mieux organisé. Donc j'ai tapé :
Mkdir Homework1 (ça a créé un répertoire qui s'appelle Homework1), et puis, cd Homework1 (c'est pour changer le répertoire, ça veut dire que que je change ma localisation à ce répertoire.)


Et puis, cd TEST1 (ca veut dire qu'on à bougé le répertoire TEST1.)
 
Ensuite, on arrive à "command" 'touch+ filename', j'ai trouvé quelques choses d’important pour 'touch + filename'. Par exemple, 'touch WeiHsuanCHEN' va créer un fichier qui s'appelleWeiHsuanCHENdans le répertoire dans lequel je suis.
Et 'rm' va enlever n'importe quel fichiers que je veux enlever. Mais j'ai aussi trouvé que 'rm' ne peut pas enlever les répertoires, on doit taper 'rmdir' pour enlever les répertoires. Pour './TEST1/vide2.txt', j'ai l'impression que peut-être sans './' , j'obtient le même résultat comme 'TEST1/vide2.txt'.
Les commandes the ​'mv' ​et ​'cp'​ sont assez simples et rapides.  'mv' va déplacer un fichier ou un repertoire, lors que 'cp' va le copier. Chez les deux commandes, le premier paramètre est le fichier ou le répertoire que vous voulez ​déplacer​ et le second paramètre est le fichier ou le répertoire que vous voulez ​copier​.
Travail HTML:
Pour le ​HTML​, j’ai installé ​Brackets​ pour taper ce que j’ai a faire.  Donc j’ai écrit une structure basique en ​HTML​, comme ​<head> </head>, <title></title>,<body></body>​ , etc. J’ai essayé de mettre un ​ ‘style="border-style: solid; border-color: black"’​ dans la ​<table>​, et aussi mis un style="border-style: solid"​ dans le ​<td>​ dans le texte, comme le montre l’image.
Et je peux obtenir ce genre de résultats a la fin, comme ce qui a été demandé de faire.

---Wei-Hsuan CHEN.