Rename prog_internet -> unix_prog_web
[hacks/simpleWebSlides.git] / unix_prog_web / unix_prog_web_07.xhtml
diff --git a/unix_prog_web/unix_prog_web_07.xhtml b/unix_prog_web/unix_prog_web_07.xhtml
new file mode 100644 (file)
index 0000000..73d92d1
--- /dev/null
@@ -0,0 +1,457 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
+          >
+<html xmlns="http://www.w3.org/1999/xhtml" >
+  <head>
+    <title>PHP : Fonctions</title>
+
+    <meta http-equiv="Content-Type"
+          content="text/html; charset=utf-8" />
+    <meta name="copyright"
+          content="Copyright &#169; 2013 Kim Nguyễn" />
+
+    <!-- Load jQuery -->
+    <script src="../jquery-2.0.3.min.js" type="text/javascript" ></script>
+    <script src="../libs/raphael-min.js" type="text/javascript" ></script>
+    <!-- Load the library -->
+    <script src="../simpleWebSlides.js" type="text/javascript" ></script>
+
+    <link rel="stylesheet" href="../simpleWebSlides.css" type="text/css"  media="all" />
+    <!-- Load a custom Theme, the class-element marks this style-sheet
+         a "theme" that can be swtiched dynamicaly -->
+    <link class="sws-theme" rel="stylesheet"  title="U-Psud style"  href="../themes/uPsud.css" type="text/css" />
+
+    <!-- Customize some templates and initialize -->
+
+    <script type="text/javascript">
+      SWS.Config['sws-slide-change'] = SWS.Effects.slideChangeFadeOutIn;
+      SWS.Config['sws-object-deactivate'] =  SWS.Effects.objectDeactivateFadeOut;
+      SWS.Config['sws-object-activate'] = SWS.Effects.objectActivateFadeIn;
+
+      //Ensures that we load SWS at the very end, after MathJax has
+      //been initialized
+
+      $(window).load(SWS.Presentation.init);
+    </script>
+  </head>
+  <body>
+    <a href="prog_internet_06.xhtml" class="sws-previous"/>
+    <div class="sws-slide sws-cover sws-option-nofooter">
+      <h1>Programmation Internet</h1>
+      <h1>Cours 7</h1>
+      <a href="mailto:kn@lri.fr">kn@lri.fr</a><br/>
+      <a href="http://www.lri.fr/~kn/">http://www.lri.fr/~kn</a>
+    </div>
+
+    <h1>Définitions de fonctions</h1>
+
+    <div class="sws-slide">
+      <h1>Fonctions</h1>
+      <p>Les fonctions sont déclarées à l'aide du
+      mot-clé <tt><em>function</em></tt>. On renvoie des résultats à
+      l'aide du mot-clé  <tt><em>return</em></tt>.</p>
+        <code><![CDATA[
+   <?php
+    ]]><em>function</em> double ($x)
+      <em>{</em>
+         <em>return</em> $x + $x;
+      <em>}</em>
+
+      echo double(10);
+  <![CDATA[?>]]>
+        </code>
+    </div>
+
+
+    <div class="sws-slide">
+      <h1>Portée des variables locales et globales
+        <b style="color:red">&#9888;</b>
+      </h1>
+      <div id="cont2" style="width:100%;position:relative;"
+           onresize="draw_arrows();" >
+        <div id="left2" style="display:inline-block;width:50%; position:relative;
+                               box-sizing:border-box;
+                               padding: 0 1em 0 2em;
+                               border-style:dashed;
+                               border-width: 0 1pt 0 0;
+                               border-color:gray; float:left;">
+<code>  &lt;?php
+  <em style="color:red">$a</em> = 42;
+  function add_a($x)
+  {
+        <span id="leftend" />
+    return $x + <em style="color:red">$a</em>;<span id="leftstart" />
+  }
+  echo add_a(10);
+  ?&gt;
+</code>
+        </div>
+        <div id="right2" style="display:inline-block;
+                                width:50%; position:relative;
+                                box-sizing:border-box;
+                                padding: 0 2em 0 1em;
+                                vertical-align:text-top;
+                                ">
+<code >  &lt;?php
+  <em>$a</em> = 42;<span id="rightend"/>
+  function add_a($x)
+  {
+    <em>global $a</em>;<span id="rightmid"/>
+    return $x + <em>$a</em>;<span id="rightstart"/>
+  }
+  echo add_a(10);
+  ?&gt;
+</code>
+        </div>
+      </div>
+
+      <script type="text/javascript">
+
+        function overlay(id) {
+        var w = $("#" + id)[0].offsetWidth;
+        var h = $("#" + id)[0].offsetHeight;
+        $("#svg_"+id).remove();
+        var paper = Raphael(id, w, h);
+        paper.canvas.id = "svg_" + id;
+        return paper;
+        };
+
+        function curve_to(paper, start, end, style) {
+        var x1 = $(start)[0].offsetLeft;
+        var y1 = $(start)[0].offsetTop;
+        var x2 = $(end)[0].offsetLeft;
+        var y2 = $(end)[0].offsetTop;
+
+        var path_cmd =
+        "M" + x1 + " " + y1 + " S" + x1 + " " + y2 + " " + x2 + " " +   y2;
+        var p1 = paper.path(path_cmd);
+        p1.attr(style);
+
+        };
+
+        function draw_arrows(x) {
+
+        var paper = overlay("left2");
+        $("#svg_left2").css ( { 'z-index': '2', 'top':'0', 'left':'0', 'position':'absolute' } );
+
+        curve_to (paper, "#leftstart", "#leftend", { 'stroke': "red",
+        'stroke-dasharray' : "-",
+        'stroke-width': 2,
+        'arrow-end' : "block-wide-long" });
+
+        var paper = overlay("right2");
+        $("#svg_right2").css({ 'z-index': '2', 'top':'0', 'right':'0', 'position':'absolute' });
+
+        curve_to (paper, "#rightstart", "#rightmid", { 'stroke': "green",
+        'stroke-width': 2,
+        'arrow-end' : "block-wide-long" });
+        curve_to (paper, "#rightmid", "#rightend", { 'stroke': "green",
+        'stroke-width': 2,
+        'arrow-end' : "block-wide-long" });
+        };
+        SWS.Presentation.registerCallback(0, draw_arrows);
+      </script>
+      <p>Le code de gauche <em style="color:red">affiche 10</em> !
+      Les variables ont une portée <em style="color:red">locale</em>
+      par défaut. Si <tt>$a</tt> n'est pas définie dans le corps de la
+      fonction, sa valeur est <tt style="color:red">NULL</tt>
+      (variable non définie). <span >Pour référencer
+      des variables globales, on utilise le mot clé <tt><em>global</em></tt>.</span>
+      </p>
+    </div>
+    <div class="sws-slide">
+      <h1>Fonction : définition <b style="color:red">&#9888;</b></h1>
+      <p>On peut utiliser une fonction <s>« avant »</s> de la définir :</p>
+      <code>   &lt;?php
+        echo next(10);
+        echo &lt;br/&gt;;
+
+        function next($x)
+        {
+          return $x + 1;
+        }
+   ?&gt;</code>
+      <p>On définira <em>toujours</em> des fonctions <em>avant</em> de
+      les utiliser. On ne peut pas définir deux fonctions avec le même
+      nom.
+      </p>
+    </div>
+    <div class="sws-slide">
+      <h1>Fonctions : passage par référence</h1>
+      <p>On utiliser le modificateur <tt><em>&amp;</em></tt> devant
+      un paramètre de fonction pour indiquer que ce dernier est passé
+      par référence.</p>
+      <div class="twocol">
+        <div>
+          <code>&lt;?php
+  function add_a($tab)
+  {
+    $tab["a"] = 42;
+  }
+
+  $mytab = array();
+  add_a($mytab);
+  echo $mytab["a"];
+  //<s>n'affiche rien (car NULL ⇝ "")</s>
+?&gt;</code>
+        </div>
+        <div>
+          <code>&lt;?php
+  function add_a(<em>&amp;</em>$tab)
+  {
+    $tab["a"] = 42;
+  }
+
+  $mytab = array();
+  add_a($mytab);
+  echo $mytab["a"];
+  //<em>affiche 42</em>
+?&gt;</code>
+        </div>
+
+      </div>
+      <p>Lorsque l'on veut <em>modifier</em> 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.
+      </p>
+    </div>
+    <h1>Manipulation des chaînes et expressions régulières</h1>
+    <div class="sws-slide">
+      <h1>Quelques fonctions utilitaires sur les chaînes</h1>
+      <dl>
+        <dt><tt>explode($delim, $entree)</tt></dt>
+        <dd>Découpe la chaîne <tt>$entre
+e</tt> suivant la
+        sous-chaîne <tt>$delim</tt> et renvoie les morceaux dans un
+        tableau.</dd>
+        <dt><tt>implode($delim, $tab)</tt></dt>
+        <dd>Réunit les chaînes se trouvant dans le
+        tableau <tt>$tab</tt> en les séparant par la
+        chaîne <tt>$delim</tt>.
+        </dd>
+        <dt><tt>ltrim($entree)</tt></dt>
+        <dd>Retire les caractères blancs en début de chaîne.</dd>
+        <dt><tt>rtrim($entree)</tt></dt>
+        <dd>Retire les caractères blancs en fin de chaîne.</dd>
+        <dt><tt>trim($entree)</tt></dt>
+        <dd>Retire les caractères blancs en début et en fin de
+        chaîne.</dd>
+        <dt><tt>htmlspecialchars($entree)</tt></dt>
+        <dd>converti les caractères <tt>&amp;</tt>, <tt>&quot;</tt>,
+          <tt>&apos;</tt>, <tt>&lt;</tt> et <tt>&gt;</tt> en
+          <tt>&amp;amp;</tt>, <tt>&amp;quot;</tt>,
+          <tt>&amp;apos;</tt>, <tt>&amp;lt;</tt> et <tt>&amp;gt;</tt>.
+        </dd>
+
+      </dl>
+    </div>
+    <div class="sws-slide">
+      <h1>Expressions régulières : syntaxe</h1>
+      <p>Les expressions régulières de PHP sont au format PCRE (Perl
+      Common Regular Expressions) <tt><em>'/r/'</em></tt>
+      où <tt>r</tt> est une expression de la forme:</p>
+<code>      <table style="margin:0em 2em">
+    <tr>
+      <td>r ::=</td>    <td>    <it>a</it>    </td>         <td>    (un caractère)</td></tr>
+    <tr><td>    |</td>     <td>    <em>.</em></td>        <td>    (n'importe quel caractère)</td></tr>
+    <tr><td>    |</td><td>    r<sub>1</sub> <em>|</em> r<sub>2</sub></td> <td>    (r<sub>1</sub> ou r<sub>2</sub>)</td></tr>
+    <tr><td>    |</td><td>    r<em>?</em></td><td>    (r répétée au plus 1 fois)</td></tr>
+    <tr><td>    |</td><td>    r<em>*</em></td><td>    (r répétée 0 fois ou plus)</td></tr>
+    <tr><td>    |</td><td>    r<em>+</em></td><td>    (r répétée 1 fois ou plus)</td></tr>
+    <tr><td>    |</td><td>    <em>[</em>c<sub>1</sub> … c<sub>n</sub><em>]</em></td> <td>    (un caractère parmis c<sub>1</sub>, …, c<sub>n</sub>)</td></tr>
+    <tr><td>    |</td><td>    <em>[</em>c<sub>1</sub><em>-</em>c<sub>n</sub><em>]</em></td> <td>    (un caractère parmis c<sub>1</sub>, …, c<sub>n</sub>)</td></tr>
+    <tr><td>    |</td><td>    <em>[^</em>c<sub>1</sub> … c<sub>n</sub><em>]</em></td> <td>    (un caractère sauf c<sub>1</sub>, …, c<sub>n</sub>)</td></tr>
+    <tr><td>    |</td><td>    <em>[^</em>c<sub>1</sub><em>-</em>c<sub>n</sub><em>]</em></td> <td>    (un caractère sauf c<sub>1</sub>, …, c<sub>n</sub>)</td></tr>
+    <tr><td>    |</td>     <td>    <em>^</em></td>        <td>    (début de texte)</td></tr>
+    <tr><td>    |</td>     <td>    <em>$</em></td>        <td>    (fin de texte)</td></tr>
+    <tr><td>    |</td>     <td>    <em>(</em>r<em>)</em></td>        <td>    (r elle même)</td></tr>
+
+<!--       |    <em>(</em>r<em>)</em>       (r elle même)
+-->
+</table>
+</code>
+    </div>
+<div class="sws-slide">
+  <h1>Expressions régulières : recherche</h1>
+  <code style="text-align:center"> <em>preg_match</em>($regexp, $chaine)</code>
+  <p>renvoie <em>1</em> si une sous-chaine de <tt>$chaine</tt>
+  correspond à <tt>$regexp</tt>, <em>0</em> si aucune sous-chaine ne correspond
+  et <s><tt>FALSE</tt></s> en cas de problème (attention,
+  utiliser <tt>===</tt> pour tester le résultat).
+</p>
+<code style="margin: 0em 2em">&lt;?php
+    $chaine = "ABCDEFABCDEF";
+    echo preg_match(<em>'/ABC/'</em>, $chaine);       // affiche 1
+    echo preg_match(<em>'/DEF/'</em>, $chaine);       // affiche 1
+    echo preg_match(<em>'/^ABC/'</em>, $chaine);      // affiche 1
+    echo preg_match(<em>'/^DEF/'</em>, $chaine);      // affiche 0
+    echo preg_match(<em>'/ABC$/'</em>, $chaine);      // affiche 0
+    echo preg_match(<em>'/DEF$/'</em>, $chaine);      // affiche 1
+    echo preg_match(<em>'/(ABC...)+/'</em>, $chaine); // affiche 1
+    echo preg_match(<em>'/[^A-Z]+/'</em>);            // affiche 0
+    echo preg_match(<em>'/[^A-Z]*/'</em>);            // affiche 1 !
+    echo preg_match(<em>'/^[^A-Z]*$/'</em>);          // affiche 0
+?&gt;</code>
+</div>
+<div class="sws-slide">
+  <h1>Expressions régulières : substitution</h1>
+  <code style="text-align:center"> <em>preg_replace</em>($regexp, $motif, $chaine)</code>
+  <p>recherche toutes les sous-chaînes de <tt>$chaine</tt> reconnues
+  par <tt>$regexp</tt> et les remplace par <tt>$motif</tt>. Ce dernier
+  peut contenir <tt>$<em>i</em></tt> pour référencer
+  le <em>i<sup>ème</sup></em> groupe de parenthèses</p>
+  <code style="margin: 0em 2em;background:white;">&lt;?php
+    $chaine = "<em>10</em>-<s>31</s>-<s style='color:blue'>1981</s>";
+    $reg1 = "/<em>(</em>[0-9]+<em>)</em>-<s>(</s>[0-9]+<s>)</s>-<s style='color:blue'>(</s>[0-9]+<s style='color:blue'>)</s>/";
+    echo preg_replace($reg1, "<em>$2</em>/<s>$1</s>/<s style='color:blue'>$3</s>", $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)
+?&gt;</code>
+</div>
+<div class="sws-slide">
+  <h1>Expressions régulières : séparation</h1>
+  <code style="text-align:center"> <em>preg_split</em>($regexp, $chaine)</code>
+  <p>renvoie un tableau des sous-chaine de <tt>$chaine</tt> séparées
+  par <tt>$motif</tt> (équivalent à <tt>explode</tt> pour
+  des <tt>$regexp</tt> constantes).</p>
+  <code style="margin: 0em 2em;background:white;">&lt;?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] => )
+?&gt;</code>
+</div>
+<div class="sws-slide">
+  <h1>Expressions régulières : recherche exhaustive</h1>
+
+  <code style="text-align:center"> <em>preg_match_all</em>($regexp, $chaine, &amp;$resultat)</code>
+  <p><tt><em>&amp;$resultat</em></tt> est un tableau <em>passé par
+  référence</em>. Après l'appel, <tt>$resultat[0]</tt> contient un
+  tableau avec <em>toutes</em> les sous-chaines reconnues
+  et <tt>$resultat[i]</tt> contient tous les résultats reconnus par le
+  i<sup>ème</sup> groupe de parenthèses. Renvoie le nombre de chaines
+  trouvées (<i>i.e.</i> la longueur de <tt>$resultat[0]</tt>).
+</p>
+  <code style="margin: 0em 2em;background:white;">&lt;?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)
+            )
+*/?&gt;</code>
+</div>
+<h1>Manipulation de fichiers</h1>
+<div class="sws-slide">
+  <h1>Envoi d'un fichier au serveur (1/2)</h1>
+  <p>On utilise la méthode <tt><em>post</em></tt> pour les
+  formulaires. Les valeurs sont envoyées dans la requête HTTP (et non
+  pas encodées dans l'URL)</p>
+  <code>
+       &lt;form action="cible.php" <em>method="post"</em>
+             <em>enctype="multipart/form-data"</em>&gt;
+             &lt;input <em>type="file" <s>name="fichier"</s></em> size="20"/&gt;
+             &lt;button type="sumbit"&gt;Uploader le fichier&lt;/button&gt;
+      &lt;/form&gt;
+</code>
+<p>Apperçu:</p><form style="margin: 0em 1em" action="" method="post"
+                     enctype="multipart/form-data">
+  <input type="file" name="fichier" size="20"/>
+  <button type="submit">Uploader le fichier</button>
+</form>
+<p>Coté serveur, la variable <tt><em>$_FILES</em></tt> est
+  définie.  <tt><em>$_FILES[<s>"fichier"</s>]</em></tt> 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 <tt>$_POST</tt> (au lieu de <tt>$_GET</tt>).
+</p>
+</div>
+<div class="sws-slide">
+  <h1>Envoi d'un fichier au serveur (2/2)</h1>
+  <p>Étant donné un formulaire avec un champ <i>input</i> de
+  type <i>file</i> et de nom <tt>"fichier"</tt> on a accès aux
+  information suivantes:</p>
+  <dl>
+    <dt><tt>$_FILES["fichier"]["error"]</tt></dt> <dd>Code d'erreur
+    (0 si tout c'est bien passé, <tt>></tt> 0 si une erreur s'est produite. Les
+    autres champs ne sont définis que si "error" vaut 0).
+    </dd>
+    <dt><tt>$_FILES["fichier"]["tmp_name"]</tt></dt><dd>Nom du fichier
+    temporaire sur le serveur où a été sauvegardé le contenu du
+    fichier envoyé</dd>
+    <dt><tt>$_FILES["fichier"]["name"]</tt></dt><dd>Nom original du fichier</dd>
+    <dt><tt>$_FILES["fichier"]["size"]</tt></dt><dd>Taille du
+    fichier</dd>
+    <dt><tt>$_FILES["fichier"]["type"]</tt></dt><dd>Le type MIME du fichier</dd>
+  </dl>
+</div>
+<div class="sws-slide">
+  <h1>Ouverture d'un fichier</h1>
+<code style="text-align:center"> <em>fopen</em>($nomfichier, $mode)</code>
+<p>Ouvre un fichier dont on donne le nom avec un <i>mode</i>
+  particulier. Les modes sont: <em><tt>"r"</tt></em>
+  (lecture), <em><tt>"r+"</tt></em> (lecture/écriture),
+  <em><tt>"w"</tt></em> (écriture),
+  <em><tt>"w+"</tt></em> (lecture/écriture, création si non-existant),
+  <em><tt>"a"</tt></em> (écriture, ajout à la fin si existant),
+  <em><tt>"a+"</tt></em> (lecture/écriture, création si non-existant,
+  ajout à la fin si existant). <em><tt>fopen</tt></em> renvoie un
+  descripteur de fichier que l'on peut utiliser pour manipuler le
+  fichier.
+</p>.
+</div>
+<div class="sws-slide">
+  <h1>Lecture/écriture/fermeture d'un fichier</h1>
+<code style="text-align:center"> <em>fread</em>($desc, $taille)</code>
+<p>Lit au maximum <em><tt>$taille</tt></em> caractères dans un fichier
+  dont le descripteur (renvoyé par <tt>fopen</tt>)
+  est <tt>$desc</tt>. La fonction renvoie un chaine d'au
+  plus <tt>$taille</tt> caractères ou <tt>FALSE</tt> en cas d'erreur.
+</p>
+<code style="text-align:center"> <em>fwrite</em>($desc, $chaine)</code>
+<p>Écrit la chaine de caractères à la position courante dans le
+  fichier dont le descripteur est <tt>$desc</tt>. Renvoi le nombre
+  d'octets écrits ou <tt>FALSE</tt> en cas d'erreur.
+</p>
+<code style="text-align:center"> <em>fclose</em>($desc)</code>
+<p>Ferme le fichier dont le descripteur est <tt>$desc</tt>
+</p>
+</div>
+<div class="sws-slide">
+  <h1>Déplacement dans un fichier</h1>
+  <code style="text-align:center"> <em>fseek</em>($desc, $offset, $orig)</code>
+  <p>Déplace le pointeur interne de position du fichier dont le
+  descripteur est <tt>$desc</tt> de <tt>$offset</tt> octets. Le
+  paramètre <tt>$orig</tt> donne l'origine: <tt>SEEK_CUR</tt>
+  (décalage à partir de la position courante), <tt>SEEK_SET</tt>
+  (position absolue dans le fichier), <tt>SEEK_END</tt> (décalage à
+  partir de la fin de fichier).
+</p>
+</div>
+<div class="sws-slide">
+<h1>Interface simplifiée</h1>
+<code style="text-align:center"> <em>file_get_contents</em>($nomfichier)</code>
+<p>Ouvre un fichier dont on donne le nom et renvoie son contenu sous
+  forme d'une chaine de caractères</p>
+<code style="text-align:center"> <em>file</em>($nomfichier)</code>
+<p>Renvoie un tableau avec une case par ligne dans le fichier. Chaque
+  entrée contient le "\n" terminal.</p>
+</div>
+  </body>
+
+</html>