Listing du fichier tp5.php
00001<?php
00002 # # (gH) -_- tp5.php ; TimeStamp (unix) : 27 Novembre 2020 vers 09:47
00003 error_reporting(E_ALL | E_NOTICE | E_STRICT ) ;
00004 header('Content-Type "text/html; charset=iso-8859-1"') ;
00005 ini_set( 'default_charset', 'ISO-8859-1' );
00006 include("decra-inc.php") ;
00007
00008 $numSerie = 5 ;
00009 debutTP($numSerie,"Fonctions, cahier des charges et modification d'un gros programme") ;
00010 ghAtAngers() ;
00011
00012 $R = ghRouge("R") ;
00013 $XML = ghRouge("XML") ;
00014 $Awk = ghRouge("AWK") ;
00015 $Php = ghVert("PHP") ;
00016 $Perl = ghVert("Perl") ;
00017 $Mysql = ghVert("MySql") ;
00018
00019 ## -------------------------------------------------------------------------------------------
00020
00021 pvide() ;
00022
00023 debutSection() ;
00024
00025 $tableauDesRubriques = array() ;
00026 $idr = 0 ;
00027 $idr++; $tableauDesRubriques[$idr] = "Gérer la liste des fonctions d'une application" ;
00028 $idr++; $tableauDesRubriques[$idr] = "Un cahier des charges pour la prise de rendez-vous" ;
00029 $idr++; $tableauDesRubriques[$idr] = "Modifier un \"gros\" programme" ;
00030 $idr++; $tableauDesRubriques[$idr] = "Réécrire un gros programme" ;
00031 $tdmCRLM = new tdm($tableauDesRubriques) ;
00032 $tdmCRLM->titre() ;
00033 $tdmCRLM->menu("oui","oui","nou") ;
00034
00035 pvide() ;
00036
00037 direAfficherSolutionsTP($numSerie) ;
00038
00039 finSection() ;
00040
00041 $numExo = 0 ;
00042
00043 ## -------------------------------------------------------------------------------------------
00044
00045 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Gérer la documentation d'une application
00046
00047 ## -------------------------------------------------------------------------------------------
00048
00049 blockquote() ;
00050
00051 blockquote() ;
00052
00053
00054 p("texte") ;
00055 echo "On trouvera dans l'archive ".href("shsp.zip")." une copie à peu près complète du site " ;
00056 echo href("../Shspdb/","sHSPdb")." qui recense des petites protéines " ;
00057 echo href("https://en.wikipedia.org/wiki/Heat_shock_protein","HSP").". " ;
00058 echo " Cette archive a une taille un peu inférieure à 8 Mo et contient 266 fichiers, " ;
00059 echo " dont 52 fichiers $Php (mais qui ne sont pas tous utilisés dans le site)." ;
00060 finp() ;
00061
00062 p("cadre demiLargeur" ) ;
00063 nbsp(15) ;
00064 $url = "../Shspdb/" ;
00065 $img = "shspdb.png" ;
00066 echo href($img,img($img,"",400,"shspdb","cadregris")) ;
00067 finp() ;
00068
00069 p("texte") ;
00070 echo "On se propose ici de fournir une aide au programmeur sous forme d'une liste des fonctions utilisées à partir du fichier ".b("index.php")."." ;
00071 echo " On voudrait produire dans un premier temps un fichier qui recense les fichiers inclus, les fonctions et l'endroit où elles sont définies, comme dans le " ;
00072 echo " fichier ".href("shspdb_fns.txt").". Ecrire pour cela un script qui utilise un fichier de départ (ici ".b("index.php").") passé en paramètre " ;
00073 echo " et qui construit une telle liste. " ;
00074 finp() ;
00075
00076 p() ;
00077 echo b("Fichier shspdb_fns.txt") ;
00078 finp() ;
00079
00080 p() ;
00081 textarea_fichier("index_php.txt","cadrejaune",50,100,"fonctions","index_php.txt") ;
00082 finp() ;
00083
00084 p("texte") ;
00085 echo "Quelle charge de travail supplémentaire serait requise si on voulait produire une interface de ces fonctions comme pour le " ;
00086 echo href("../internet/php_conceptuel.php","$Php conceptuel")." ? " ;
00087 echo " Pour mémoire, cette interface est ".href("../internet/stdphp.php","ici").". " ;
00088 finp() ;
00089
00090 p("texte") ;
00091 echo "On commencera bien sûr par se poser la question du langage de programmation à utiliser " ;
00092 echo " et par écrire un plan de développement." ;
00093 finp() ;
00094
00095 p("texte") ;
00096 echo "Pour cet exercice, on pourra définir un répertoire ".b("Shspdb")." et y rapatrier l'archive comme suit :" ;
00097 finp() ;
00098
00099 pre_fichier("tp2exo1_wget.txt","cadre") ;
00100
00101 p("texte") ;
00102 echo " Le plan de développement est présenté ".href("tp5exo1.php","ici").". " ;
00103 finp() ;
00104
00105
00106 finblockquote() ;
00107
00108 solutionTP($numExo,$numSerie) ;
00109
00110 $rub = 0 ;
00111
00112 $rub++ ; h3($numExo.".".$rub." Choix du langage") ;
00113
00114 blockquote() ;
00115 p("texte") ;
00116 echo "Un langage bien adapté serait sans doute $Awk ou $Perl. Toutefois, dans la mesure où peu de personnes dans la promotion connaissent " ;
00117 echo " ce langage, on propose ici une solution $Php. Les curieuses et curieux pourront lire la solution $Perl disponible " ;
00118 echo href("montresource.php?nomfic=ldfphp.pl","ici")."." ;
00119 finp() ;
00120 finblockquote() ;
00121
00122 $rub++ ; h3($numExo.".".$rub." Plan de développement") ;
00123
00124 blockquote() ;
00125 p("texte") ;
00126 echo " Il est sans doute raisonnable de faire quelques «repérages» dans les fichiers $Php fournis " ;
00127 echo " avant de programmer quoi que ce soit, car $Php est permissif et a de nombreuses syntaxes possibles pour la même action d'inclusion de fichiers. " ;
00128 echo " Ainsi, mettre un espace avant la parenthèse ouvrante dans une définition de fonction n'est pas une erreur. " ;
00129 echo " Il y a deux problèmes distincts ici : trouver les fichiers inclus et lister les fonctions dans ces fichiers. " ;
00130 echo " C'est pourquoi nous proposons un plan de développement nommé ".href("tp5exo1.php") ;
00131 echo " en 5 étapes, 2 sous Unix et 3 en $Php. ";
00132 finp() ;
00133 finblockquote() ;
00134
00135 $rub++ ; h3($numExo.".".$rub." Interface des fonctions") ;
00136
00137 blockquote() ;
00138 p("texte") ;
00139 echo " Ce n'est sans doute pas une bonne idée de produire une interface pour ces fonctions pour au moins deux raisons. " ;
00140 echo " Tout d'abord, il y a beaucoup trop de fichiers inclus et de fonctions en tout. Ensuite, certaines de ces fonctions ne sont pas " ;
00141 echo " génériques et ne servent qu'à fournir des parties facilement décomposables. " ;
00142 finp() ;
00143 finblockquote() ;
00144
00145 $rub++ ; h3($numExo.".".$rub." Détail des solutions") ;
00146
00147 blockquote() ;
00148 table(1,10,"collapse cadrejaune") ;
00149 entetesTableau("Etape Fichier__principal Fichier__inclus") ;
00150 for ($ietape=1;$ietape<=3;$ietape++) {
00151 tr() ;
00152 $nomMain = "listefnsV".$ietape.".php" ;
00153 $urlMain = "montresource.php?nomfic=$nomMain" ;
00154 $nomIncl = "listefnsV".$ietape."-inc.php" ;
00155 $urlIncl = "montresource.php?nomfic=$nomIncl" ;
00156 td("R") ; p() ; echo $ietape.s_nbsp(3) ; finp() ; fintd() ;
00157 td() ; p() ; echo href($urlMain,$nomMain,"bouton_fin nou bleu_pastel") ; finp() ; fintd() ;
00158 td() ; p() ; echo href($urlIncl,$nomIncl,"bouton_fin nou vert_pastel") ; finp() ; fintd() ;
00159 fintr() ;
00160 } ; # fin pour ietape
00161 fintable() ;
00162
00163 p("texte") ;
00164 echo " Les commentaires qui utilisent trois dièses successifs dans la version 3 indique les étapes principales. " ;
00165 echo " On peut les consulter via la commande " ;
00166 finp() ;
00167
00168 p("texte") ;
00169 nbsp(9) ;
00170 echo b('grep -a "###" listefnsV3.php').". " ;
00171 finp() ;
00172
00173 pre_fichier("etapes1.txt","cadre") ;
00174
00175 p("texte") ;
00176 echo " Les commentaires qui utilisent au moins deux dièses successifs dans cette même version 3 indique les étapes principales ou secondaires. " ;
00177 echo " On peut les consulter via la commande " ;
00178 finp() ;
00179
00180 p("texte") ;
00181 nbsp(9) ;
00182 echo b('grep -a "##" listefnsV3.php').". " ;
00183 finp() ;
00184
00185 pre_fichier("etapes2.txt","cadre") ;
00186
00187 finblockquote() ;
00188
00189 finsolution() ;
00190
00191 finblockquote() ;
00192
00193 ## -------------------------------------------------------------------------------------------
00194
00195 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Un cahier des charges pour la prise de rendez-vous
00196
00197 ## -------------------------------------------------------------------------------------------
00198
00199 blockquote() ;
00200
00201 blockquote() ;
00202
00203 p("texte") ;
00204 echo "On décide d'aider les enseignants à construire les oraux de présentation de rapport de stage. " ;
00205 echo " Ces oraux mettent en présence l'étudiant, le maitre de stage, l'enseignant référent et le directeur de la formation. " ;
00206 echo " Sachant que ces oraux se déroulent sur deux jours pour une plage horaire de 9 h à 12 h puis de 14 h à 18 h et que chaque oral occupe un créneau de 30 minutes " ;
00207 echo " (20 minutes d'exposé et questions plus 10 minutes de délibération), " ;
00208 echo " essayer de définir toutes les fonctionnalités qu'un site de réservation de créneaux devrait avoir, " ;
00209 echo " les classes d'objets et les tables de la base de données à créer. " ;
00210 echo " On justifiera les choix retenus." ;
00211 finp() ;
00212
00213 p("texte") ;
00214 echo " Quel langage serait le plus adapté ?" ;
00215 finp() ;
00216
00217 p("texte") ;
00218 echo " Quel moteur de base de données serait le plus adapté ?" ;
00219 finp() ;
00220
00221 p("texte") ;
00222 echo " Seriez-vous capable de quantifier le temps nécessaire au développement de ce site ?" ;
00223 finp() ;
00224
00225 p("cadre demiLargeur") ;
00226 nbsp(15) ;
00227 $url = "http://forge.info.univ-angers.fr/~gh/stages/propsout.php" ;
00228 $img = "oraux.png" ;
00229 echo href($url,img($img,"",400)) ;
00230 finp() ;
00231
00232 p("texte") ;
00233 echo "On essaiera aussi de choisir et de justifier les technologies à utiliser (serveur Lamp, architecture basée sur Node.js, application " ;
00234 echo " Django ou ROR...)." ;
00235 finp() ;
00236
00237 p("texte") ;
00238 echo "Pourrait-on envisager une solution ".b("SAAS")." ('qu'est-ce ?) comme pour le tournoi de tennis de Roland-Garros ?" ;
00239 finp() ;
00240
00241 finblockquote() ;
00242
00243 solutionTP($numExo,$numSerie) ;
00244
00245 $rub = 0 ;
00246
00247 p("texte") ;
00248 echo "Il est sans doute raisonnable de commencer par essayer de lister les actions à effectuer avant d'effectuer des choix. " ;
00249 echo " Dans la mesure où il y a plusieurs types d'acteurs différents (étudiant, maitre de stage, enseignant référent...), le mieux est de séparer " ;
00250 echo " les actions, quitte à voir ensuite ce qui peut être factorisé. " ;
00251 echo " Après, il faut définir les classes d'objets à construire et penser aux petites tables de données annexes liées " ;
00252 echo " à des qualités/modalités liées aux personnes, aux stages et aux entreprises..." ;
00253 finp() ;
00254
00255 $rub++ ; h3($numExo.".".$rub." Acteurs et actions associées") ;
00256
00257 blockquote() ;
00258 p("texte") ;
00259 echo b("Acteur étudiant") ;
00260 finp() ;
00261
00262 ul() ;
00263 debutli() ; p() ;
00264 echo "fixer une ou plusieurs dates de rendez-vous " ;
00265 finp() ; finli() ;
00266 debutli() ; p() ;
00267 echo "annuler un rendez-vous " ;
00268 finp() ; finli() ;
00269 debutli() ; p() ;
00270 echo "modifier un rendez-vous " ;
00271 finp() ; finli() ;
00272 debutli() ; p() ;
00273 echo "lister les rendez-vous " ;
00274 finp() ; finli() ;
00275 debutli() ; p() ;
00276 echo "recevoir une confirmation du rendez-vous dès la prise de rendez-vous" ;
00277 finp() ; finli() ;
00278 debutli() ; p() ;
00279 echo "recevoir un rappel du rendez-vous quelques jours avant la soutenance" ;
00280 finp() ; finli() ;
00281 debutli() ; p() ;
00282 echo "savoir où trouver toutes les informations sur les dates de rendez-vous, les fiches d'appréciation de stage" ;
00283 finp() ; finli() ;
00284 finul() ;
00285
00286 p("texte") ;
00287 echo b("Acteur maitre de stage") ;
00288 finp() ;
00289
00290 ul() ;
00291 debutli() ; p() ;
00292 echo "disposer/éditer/transmettre la fiche d'appréciation du stage, volet maitre de stage" ;
00293 finp() ; finli() ;
00294 debutli() ; p() ;
00295 echo "lister les rendez-vous " ;
00296 finp() ; finli() ;
00297 debutli() ; p() ;
00298 echo "recevoir une confirmation du rendez-vous dès la prise de rendez-vous" ;
00299 finp() ; finli() ;
00300 debutli() ; p() ;
00301 echo "recevoir un rappel du rendez-vous quelques jours avant la soutenance" ;
00302 finp() ; finli() ;
00303 finul() ;
00304
00305 p("texte") ;
00306 echo b("Acteur enseignant référent") ;
00307 finp() ;
00308
00309 ul() ;
00310 debutli() ; p() ;
00311 echo "accéder à la fiche détaillée du stage " ;
00312 finp() ; finli() ;
00313 debutli() ; p() ;
00314 echo "recevoir une confirmation du rendez-vous " ;
00315 finp() ; finli() ;
00316 debutli() ; p() ;
00317 echo "lister les rendez-vous " ;
00318 finp() ; finli() ;
00319 debutli() ; p() ;
00320 echo "recevoir un rappel du rendez-vous quelques jours avant la soutenance" ;
00321 finp() ; finli() ;
00322 debutli() ; p() ;
00323 echo "disposer/éditer/transmettre la fiche d'appréciation du stage, volet enseignant" ;
00324 finp() ; finli() ;
00325 finul() ;
00326
00327 p("texte") ;
00328 echo b("Acteur directeur de la formation") ;
00329 finp() ;
00330
00331 ul() ;
00332 debutli() ; p() ;
00333 echo "lister les rendez-vous " ;
00334 finp() ; finli() ;
00335 debutli() ; p() ;
00336 echo "imprimer une liste officielle des rendez-vous " ;
00337 finp() ; finli() ;
00338 debutli() ; p() ;
00339 echo "réinitialiser les rendez-vous " ;
00340 finp() ; finli() ;
00341 debutli() ; p() ;
00342 echo "lister/imprimer/archiver les fiches d'appréciation de stage" ;
00343 finp() ; finli() ;
00344 debutli() ; p() ;
00345 echo "réaliser des statistiques sur les stages de l'année, au fil des années, par catégorie de stage, d'entreprises..." ;
00346 finp() ; finli() ;
00347 finul() ;
00348
00349 p("texte") ;
00350 echo b("Acteur administrateur du site (et donc de la base de données ???)") ;
00351 finp() ;
00352
00353 ul() ;
00354 debutli() ; p() ;
00355 echo "relancer les partenaires pour disposer des nouvelles informations chaque année " ;
00356 finp() ; finli() ;
00357 debutli() ; p() ;
00358 echo "actualiser la base de données " ;
00359 finp() ; finli() ;
00360 debutli() ; p() ;
00361 echo "tester les nouvelles informations " ;
00362 finp() ; finli() ;
00363 finul() ;
00364
00365 finblockquote() ;
00366
00367 $rub++ ; h3($numExo.".".$rub." Choix et contraintes") ;
00368
00369 blockquote() ;
00370
00371 p("texte") ;
00372 echo b("Dates et heures") ;
00373 finp() ;
00374
00375 blockquote() ;
00376 p("texte") ;
00377 echo "Le nombre de jours et la plage horaire des soutenances n'est pas un gros problème à traiter. " ;
00378 echo " Il faut simplement que les jours et les heures soient bien paramétrés pour que ce soit facile à gérer." ;
00379 finp() ;
00380 finblockquote() ;
00381
00382 p("texte") ;
00383 echo b("Nombre de rendez-vous") ;
00384 finp() ;
00385
00386 blockquote() ;
00387 p("texte") ;
00388 echo "Le nombre de rendez-vous à autoriser est beaucoup plus problématique. " ;
00389 echo " La solution la plus simple et pratiquement toujours implémentée passe par un seul rendez-vous possible. " ;
00390 echo " Il n'est pas stupide d'essayer de penser à en mettre plusieurs, pour offrir plus de souplesse aux maitres de stage " ;
00391 echo " en entreprise. Cela suppose bien sûr de disposer de beaucoup de plages horaires, au moins deux fois plus " ;
00392 echo " que de stages. Il faudrait alors rajouter des relances s'il reste des rendez-vous multiples avant la date de publication " ;
00393 echo " des soutenances de stages." ;
00394 finp() ;
00395 finblockquote() ;
00396
00397 finblockquote() ;
00398
00399 $rub++ ; h3($numExo.".".$rub." Classes d'objets Stages, Personnes, Entreprises, Soutenances, Salles") ;
00400
00401 blockquote() ;
00402
00403 blockquote() ;
00404
00405 p("texte") ;
00406 echo "Un stage comporte " ;
00407 echo " un intitulé (court), un descriptif (long), une catégorie de stage (programmation, analyse... ou \"non détaillé\"), " ;
00408 echo " un stagiaire (plusieurs ?), un maitre de stage, une entreprise, " ;
00409 echo " un enseignant référent, un niveau d'étude, une année de stage." ;
00410 finp() ;
00411
00412 p("texte") ;
00413 echo "Une personne doit certainement être définie par un nom, un prénom et un code-sexe, " ;
00414 echo " un numéro de téléphone (deux pour un stagiaire, un maitre de stage ?), une (deux ?) adresse, un email. " ;
00415 echo " Pour le maitre de stage, il faudra rajouter un lien vers l'entreprise." ;
00416 echo " Il n'y aura sans doute rien à rajouter pour l'enseignant référent ni pour le responsable de la formation." ;
00417 finp() ;
00418
00419 p("texte") ;
00420 echo "Une entreprise doit certainement être définie ".em("via") ;
00421 echo " un numéro de téléphone (deux pour un stagiaire, un maitre de stage avec un fixe et un portable ?), " ;
00422 echo " une adresse (deux, trois pour le stagiaire, adresse étudiante, des parents, durant le stage ?). " ;
00423 echo " Pour le maitre de stage, il faudra rajouter un lien vers l'entreprise." ;
00424 echo " Il n'y aura sans doute rien à rajouter pour l'enseignant référent ni pour le responsable de la formation." ;
00425 finp() ;
00426
00427 p("texte") ;
00428 echo "Une soutenance est un objet qui doit être relié à un stage afin de disposer des ressources " ;
00429 echo " stagiaire, maitre de stage... " ;
00430 echo " Elle dispose en propre d'un lieu, d'une date et d'une heure. " ;
00431 echo "Si les soutenances doivent avoir lieu en parallèle, " ;
00432 echo " alors il faut associer une soutenance et une salle, après avoir défini une salle avec au minimum " ;
00433 echo " une localisation (description de batiment, numéro de salle, étage...) " ;
00434 echo " et éventuellement un numéro de téléphone de salle. " ;
00435 finp() ;
00436
00437 p("texte") ;
00438 echo b("Remarque :")." pour la base de données, tous les objets ont toujours un id, un numéro de référence, etc. " ;
00439 echo " Nous n'en avons pas parlé ici pour des raisons de simplicité. " ;
00440 finp() ;
00441
00442 finblockquote() ;
00443
00444 finblockquote() ;
00445
00446 $rub++ ; h3($numExo.".".$rub." Petites tables de données annexes") ;
00447
00448 blockquote() ;
00449
00450 p("texte") ;
00451 echo "Là encore, sans entrer dans le détail à moins de commencer à implémenter pour un type de stage particulier, " ;
00452 echo " il faut penser qu'il y aura à implémenter des listes de catégories pour le code-sexe, le type de stage, " ;
00453 echo " les différents cas de personnes et d'entreprises. En cas de soutenances multiples en parallèle, il faudra aussi " ;
00454 echo " une table de salles de soutenance. " ;
00455 finp() ;
00456
00457 finblockquote() ;
00458
00459 $rub++ ; h3($numExo.".".$rub." Choix technologiques") ;
00460
00461 blockquote() ;
00462
00463 p("texte") ;
00464 echo "Cette application est typique d'une technologie " ;
00465 echo href("https://doc.ubuntu-fr.org/lamp","LAMP") ;
00466 echo " classique. " ;
00467 finp() ;
00468
00469 p("texte") ;
00470 echo " Toutefois, rien n'interdit de passer par un " ;
00471 echo href("https://www.w3schools.com/nodejs/nodejs_http.asp","serveur Node") ;
00472 echo ", de développer le front-end et le back-end en Javascript avec " ;
00473 #echo href("https://www.eduonix.com/blog/web-programming-tutorials/12-must-know-angularjs-frameworks-to-develop-your-next-generation-apps/","Angular") ;
00474 echo href("https://fr.wikipedia.org/wiki/Angular","Angular") ;
00475 echo " et " ;
00476 echo href("https://daveceddia.com/create-react-app-express-backend/","Express") ;
00477 echo "." ;
00478 finp() ;
00479
00480 finblockquote() ;
00481
00482 $rub++ ; h3($numExo.".".$rub." Durée de développement") ;
00483
00484 blockquote() ;
00485
00486 p("texte") ;
00487 echo "On est clairement dans la gamme des petites et moyennes applications, pour réaliser une analogie avec les PME. " ;
00488 echo " Il n'y a aucune difficulté conceptuelle ni algorithmique (sauf à vouloir optimiser le taux de remplissage des salles " ;
00489 echo " en cas de soutenances multiples en parallèle), " ;
00490 echo " seulement des choix à paramétrer en fonction du nombre de stages. " ;
00491 echo " Ainsi, pour une école d'ingénieurs avec plusieurs centaines de stages et des soutenances en parallèle, il y a une " ;
00492 echo " programmation plus importante à réaliser que dans le cadre de soutenances universitaires avec " ;
00493 echo " une vingtaine ou une trentaine de soutenances à organiser. " ;
00494 finp() ;
00495 p("texte") ;
00496 echo "Il nous semble raisonnable de penser que pour une personne habituée à conceptualiser, modéliser, tester, documenter, " ;
00497 echo " une durée inférieure à une centaine d'heures est une durée acceptable. Ce qui signifie sans doute en temps réel plusieurs " ;
00498 echo " semaines de développement, notamment dans le cas d'allers et retours pour présentation, confirmation des choix et des " ;
00499 echo " interfaces." ;
00500 finp() ;
00501
00502 finblockquote() ;
00503
00504 $rub++ ; h3($numExo.".".$rub." Solution SAAS") ;
00505
00506 blockquote() ;
00507
00508 p("texte") ;
00509 echo " Il n'est sans doute pas utile de passer en " ;
00510 echo href("https://fr.wikipedia.org/wiki/Logiciel_en_tant_que_service","SAAS") ;
00511 echo " pour cette aplication. La première raison est que c'est une petite application qui demande peu de ressources. " ;
00512 echo " La seconde raison est qu'on aura sans doute besoin d'accéder aux données des stages des années précédentes en cours " ;
00513 echo " d'année. " ;
00514 finp() ;
00515
00516 finblockquote() ;
00517
00518 finsolution() ;
00519
00520 finblockquote() ;
00521
00522 ## -------------------------------------------------------------------------------------------
00523
00524 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Modifier un gros programme
00525
00526 ## -------------------------------------------------------------------------------------------
00527
00528 blockquote() ;
00529
00530 blockquote() ;
00531
00532 p("texte") ;
00533 echo "On décide de compléter le site ".href("../Shspdb/","sHSPdb")." avec l'ajout d'un menu ".b("Users") ;
00534 echo " afin de fédérer les utilisateurs du site et les personnes intéressées par les petites protéines " ;
00535 echo href("https://en.wikipedia.org/wiki/Heat_shock_protein","HSP").". " ;
00536 echo " Après avoir rapidement tracé les contours d'un tel menu, indiquez quels fichiers doivent être modifiés et quels " ;
00537 echo " fichiers devraient être ajoutés. " ;
00538 echo " On trouvera dans l'archive ".href("shsp.zip")." une copie à peu près complète du site à modifier." ;
00539 echo " Le fichier ".b("sql_hspdb_dump_16_06_06_janus.mysql")." de cette archive, une fois décompressé (20 Mo), " ;
00540 echo " permet de reconstruire la base de données et ses 13 tables." ;
00541 finp() ;
00542
00543 p("texte") ;
00544 echo "Si vous deviez implémenter une copie fonctionnelle du site sur votre ordinateur personnel, à quelles contraintes matérielles " ;
00545 echo " et techniques seriez-vous confronté(e) ? " ;
00546 echo " Comment pourrriez-vous y répondre technologiquement ? " ;
00547 finp() ;
00548
00549 p("texte") ;
00550 echo "Ce site est-il fonctionnel pour ".b("$Php 7")." ?" ;
00551 echo " Si non, quelles parties faudrait-il changer ?" ;
00552 finp() ;
00553
00554 finblockquote() ;
00555
00556 solutionTP($numExo,$numSerie) ;
00557
00558 $rub = 0 ;
00559
00560 p("texte") ;
00561 echo "Migrer une application n'est jamais simple. Heureusement la question 1 de ce T.P. nous a offert la possibilité de savoir comment le code est structuré. " ;
00562 finp() ;
00563
00564 $rub++ ; h3($numExo.".".$rub." Ajout d'utilisateurs recensés") ;
00565
00566 blockquote() ;
00567
00568 p("texte") ;
00569 echo "Pour créer une entrée de menu gauche nommée ".b("Users").", disons entre " ;
00570 echo b("Export")." et ".b("Submit").", il faut tout d'abord insérer un ".em("item")." de liste vers la ligne 265 du fichier ".ghRouge("design.php") ;
00571 echo " correspondant au code ".b("XHTML")." suivant :" ;
00572 finp() ;
00573
00574 finblockquote() ;
00575
00576 pre_fichier("users.txt","cadre") ;
00577
00578 p("texte") ;
00579 echo " Il faudra ensuite écrire les fonctions associées, sans doute dans le fichier ".ghRouge("action14.php") ;
00580 echo " puis réaliser un ".em("\"include\"")." de ce fichier dans ".ghRouge("index.php")." aux environs de la ligne 90 et enfin ajouter le cas 14 aux environs de la ligne 180 " ;
00581 echo " de ce même fichier ".ghRouge("index.php")."." ;
00582 finp() ;
00583
00584 pre_fichier("cas14.txt","cadre") ;
00585
00586 p("texte") ;
00587 echo "Ensuite, la fonction ".b("utilisateurs()")." du fichier ".ghRouge("action14.php")." peut prendre le relais, comme ci-dessous :" ;
00588 finp() ;
00589
00590 pre_fichier("action14.txt","cadre") ;
00591
00592 p("texte") ;
00593 echo " En voici le rendu (on vient juste de cliquer sur ".b("Users").") :" ;
00594 finp() ;
00595
00596 p() ;
00597 nbsp(10) ;
00598 $img ="users.png" ;
00599 echo href($img,img($img,"",600,"users","cadregris")) ;
00600 finp() ;
00601
00602 $rub++ ; h3($numExo.".".$rub." Contraintes matérielles et techniques") ;
00603
00604 blockquote() ;
00605 p("texte") ;
00606 echo "Une lecture des tailles de fichier mis en jeu, et notamment celui de la base de données ".b("HSP")." (20 Mo, avec 13 tables), " ;
00607 echo " montre qu'il n'y a pas besoin de beaucoup de ressources ".b("a priori")." pour afficher la page de départ. Par contre, si on " ;
00608 echo " rentre dans le détail de l'action ".b("Statistical analysis")." on voit qu'il faut exécuter du code $R après export des données, " ;
00609 echo " ce qui demande plus de puissance, voire même de changer la valeur du ".b("TIME_OUT")." pour indiquer la fin d'exécution d'une page Web." ;
00610 finp() ;
00611 finblockquote() ;
00612
00613 # taille base de données
00614
00615 $rub++ ; h3($numExo.".".$rub." Support de $Php 7") ;
00616
00617 blockquote() ;
00618
00619 p("texte") ;
00620 echo "Pour répondre à cette question, il faut rentrer dans le détail du code. Si on ne sait pas quelle version de $Php a été utilisée " ;
00621 echo " pour développer le code, on pourra penser qu'il s'agit de $Php 4 ou 5. " ;
00622 echo " Un tour sur le web avec les termes " ;
00623 echo href("http://www.google.fr/search?q=php+7+deprecated","php 7 deprecated") ;
00624 echo " permet de trouver la liste des fonctions qui ne sont plus supportées ainsi que les autres choses à prendre en considération pour " ;
00625 echo href("https://auth0.com/blog/migrating-a-php5-app-to-php7-part-one/","migrer") ;
00626 echo " et notamment le problème des " ;
00627 echo href("http://php.net/manual/fr/migration70.deprecated.php","constructeurs d'objets")."..." ;
00628 finp() ; # https://cweiske.de/tagebuch/php4-constructors-php7.htm
00629
00630 p("texte") ;
00631 echo "Au passage, on pourra aussi consulter ce qui est devenu ".b("deprecated")." et ce qui à changé :" ;
00632 finp() ;
00633
00634 blockquote() ;
00635 p() ;
00636 echo "- ".href("http://php.net/manual/en/migration5.php","entre $Php 4 et $Php 5") ;
00637 finp() ;
00638 p() ;
00639 echo "- ".href("http://php.net/manual/fr/migration53.deprecated.php","à partir de $Php 5.3") ;
00640 finp() ;
00641 p() ;
00642 echo "- ".href("http://php.net/manual/fr/migration55.deprecated.php","à partir de $Php 5.5") ;
00643 finp() ;
00644 p() ;
00645 echo "- ".href("http://php.net/manual/fr/migration56.deprecated.php","à partir de $Php 5.6") ;
00646 finp() ;
00647 finblockquote() ;
00648
00649 p("texte") ;
00650 echo "Donc on doit certainement «faire la chasse» aux problèmes liés aux constructeurs d'objets, aux fonctions comme " ;
00651 echo href("http://php.net/manual/fr/function.split.php","split()") ;
00652 echo " -- mais pas ".href("http://php.net/manual/fr/function.explode.php","explode()")." --" ;
00653 echo " et à la gestion des bases de données. " ;
00654 echo " Il est assez simple d'aller rechercher ces différents éléments en ligne de commandes à l'aide de " ;
00655 echo " l'instruction ".href("http://manpagesfr.free.fr/man/man1/grep.1.html","grep")." sans doute avec" ;
00656 echo " des paramètres comme -i, -l, -n dans un premier temps pour l'ensemble des fichiers $Php " ;
00657 echo " du site, disponibles dans l'archive ".href("shsp.zip").". " ;
00658 finp() ;
00659
00660 # grep pour rechercher une liste de mots dans un fichier ?
00661 # http://www.eila.univ-paris-diderot.fr/_media/user/alexandra_volanschi/linux/grep.pdf
00662
00663 p("texte") ;
00664 echo b("Partie objets et constructeurs") ;
00665 finp() ;
00666
00667 p("texte") ;
00668 echo "Il faut commencer par chercher quels fichiers sont suceptibles de contenir " ;
00669 echo " des problèmes liés aux objets. Une première commande comme" ;
00670 finp() ;
00671
00672 pre("cadre") ;
00673 echo " grep -i -l class *php" ;
00674 finpre() ;
00675
00676 p("texte") ;
00677 echo " est sans doute inadaptée car la chaine de caractères ".b("class")." est utilisée dans des balises XHTML pour définir des styles CSS. " ;
00678 finp() ;
00679
00680 p("texte") ;
00681 echo "Il vaut mieux utiliser la ou les commandes" ;
00682 finp() ;
00683
00684 pre("cadre") ;
00685 echo ' \grep -a -i -l -E "^\s*class " *php '."\n" ;
00686 echo ' grep -i -l "class " *php' ;
00687 finpre() ;
00688
00689 p("texte") ;
00690 echo " parce qu'elles fournissent la liste des fichiers dont au moins une ligne commence par (ou contient) le mot ".b("class").". " ;
00691 finp() ;
00692
00693 p("texte") ;
00694 echo " La bonne nouvelle (quoique...), c'est qu'il ne semble pas y avoir de classes d'objets dans les fichiers $Php." ;
00695 finp() ;
00696
00697 p("texte") ;
00698 echo b("Partie fonctions obsolètes") ;
00699 finp() ;
00700
00701 p("texte") ;
00702 echo "Rechercher si la fonction ".b("split()")." est utilisée ne pose aucun problème, il suffit d'exécuter la commande " ;
00703 finp() ;
00704
00705 pre("cadre") ;
00706 echo ' grep -a -i "split(" *php ' ;
00707 finpre() ;
00708
00709 p("texte") ;
00710 echo "Comme comme cette fonction renvoie aussi les lignes avec ".b("preg_split")." (qui est une fonction non obsolète), on écrira donc " ;
00711 finp() ;
00712
00713 pre("cadre") ;
00714 echo ' \grep -a -i "split(" *php | \grep -v preg_split ' ;
00715 finpre() ;
00716
00717 p("texte") ;
00718 echo " qui retire de cet affichage les lignes avec ".b("preg_split")."." ;
00719 finp() ;
00720
00721 ## https://patelmilap.wordpress.com/2011/09/07/list-of-deprecated-functions-php/
00722
00723 p("texte") ;
00724 echo "Maintenant, le problème est plus compliqué qu'il n'y parait parce qu'il a de nombreuses fonctions à tester, " ;
00725 echo " comme par exemple ".b("spliti()")." en plus de ".b("split()")." et aussi ".b("sql_regcase()").", ".b("ereg()")."..." ;
00726 echo " Même si ".b("grep")." admet ".b('-e "a | b"')." comme paramètre ce qui signifier rechercher ".b("a")." ou ".b("b") ;
00727 echo ", il resterait encore beaucoup de choses à rechercher vu la longue liste des fonctions obsolètes. ";
00728 finp() ;
00729
00730 p("texte") ;
00731 echo " Utiliser un docker ".b("$Php 7 + $Mysql")." ne résoud sans doute pas le problème car avec un interpréteur seul le code interprété " ;
00732 echo " est testé... il faudrait plutôt essayer de lister toutes les fonctions utilisées puis filtrer avec la liste de celles " ;
00733 echo " interdites... mais là encore cela demande beaucoup plus de travail qu'un simple T.P. de deux heures. " ;
00734 finp() ;
00735
00736 p("texte") ;
00737 echo "Une consultation de ".b("phpinfo()")." sur la machine ".b("janus")." disponible " ;
00738 echo href("http://forge.info.univ-angers.fr/~gh/phpinfo.php","ici")." semble indiquer que le site fonctionne actuellement sous $Php version 5.5.9, " ;
00739 echo " donc il n'y a sans doute pas grand chose à changer du coté de fonctions obsolètes, ce que montre aussi une recherche exhaustive " ;
00740 echo " des fonctions obsolètes (recherche non détaillée ici)." ;
00741 finp() ;
00742
00743 p("texte") ;
00744 echo b("Partie base de données") ;
00745 finp() ;
00746
00747 p("texte") ;
00748 echo "Ici, les ennuis commencent... Avec un système sous $Php 5, si on exécute la commande ".b("php index.php")." alors on obtient le " ;
00749 echo " message d'erreur suivant qui indique juste un problème de mot de passe" ;
00750 finp() ;
00751
00752 pre("cadrebleu") ;
00753 echo "SERVEUR HS Access denied for user 'root'@'localhost' (using password: YES)" ;
00754 finpre() ;
00755
00756 p("texte") ;
00757 echo "Avec un système sous $Php 7, si on exécute la commande ".b("php index.php")." alors on obtient le " ;
00758 echo " message d'erreur " ;
00759 finp() ;
00760
00761 pre("cadrebleu") ;
00762 echo "PHP Fatal error: Uncaught Error: Call to undefined function mysql_connect() in fonction.php:82 \n" ;
00763 echo "Stack trace:\n" ;
00764 echo "#0 action4.php(208): connexion() \n" ;
00765 echo "#1 index.php(134): shsp_checkLogin() \n" ;
00766 echo "#2 {main} \n" ;
00767 echo " thrown in /home/gh/public_html/tests/sh/fonction.php on line 82 \n" ;
00768 finpre() ;
00769
00770 p("texte") ;
00771 echo " Il semblerait donc que le site utilise l'ancienne interface de programmation entre $Php et $Mysql via des fonctions ".b("mysql_*").". " ;
00772 echo " Effectivement, une recherche de la chaine ".b("sql")." dans les fichiers ".b("*.php") ;
00773 echo " montre que seul ".b("$Mysql")." est utilisé, avec cette \"vieille\" interface. " ;
00774 echo " Après avoir fait «".em("la chasse")."» aux lignes impliquées, il ne doit pas être trop difficile de remplacer " ;
00775 echo " le code écrit par du ".href("http://php.net/manual/fr/book.pdo.php","PDO").". " ;
00776 finp() ;
00777
00778 p("texte") ;
00779 echo " A titre d'exemple, on peut facilement modifier le code de la page de départ pour afficher comme avant le nombre de protéines en haut et à " ;
00780 echo " gauche comme ci-dessous";
00781 finp() ;
00782
00783 p() ;
00784 nbsp(10) ;
00785 $img ="nbshsp.png" ;
00786 echo href($img,img($img,"",200,"nbp","cadregris")) ;
00787 finp() ;
00788
00789 p("texte") ;
00790 echo " à l'aide des changements suivants :" ;
00791 finp() ;
00792
00793 ol() ;
00794
00795 debutli() ; p("texte") ;
00796 echo " On modifie la fonction ".b("connexion()")." dans le fichier ".ghRouge("fonction.php") ;
00797 echo " aux environs de la ligne 85. " ;
00798 finp() ;
00799 p() ;
00800 echo " On utilise ".b("\$bdd = new PDO('mysql:...") ;
00801 echo " au lieu de ".b("mysql_connect()")." et on ajoute ".b("return(\$bdd)")."." ;
00802 finp() ; finli() ;
00803
00804 debutli() ; p("texte") ;
00805 echo " Pour les fonctions " ;
00806 finp() ;
00807
00808 table(0,10) ;
00809
00810 tr() ;
00811 td() ;
00812 p() ;
00813 echo "- ".b("sp_checkLogin()") ;
00814 finp() ;
00815 fintd() ;
00816 td() ;
00817 p() ;
00818 echo " dans le fichier ".ghRouge("action4.php") ;
00819 finp() ;
00820 fintd() ;
00821 td() ;
00822 p() ;
00823 echo " aux environs de la ligne 210," ;
00824 finp() ;
00825 fintd() ;
00826 fintr() ;
00827
00828 tr() ;
00829 td() ;
00830 p() ;
00831 echo "- ".b("forceClasseProteine()") ;
00832 finp() ;
00833 fintd() ;
00834 td() ;
00835 p() ;
00836 echo " dans le fichier ".ghRouge("action4.php") ;
00837 finp() ;
00838 fintd() ;
00839 td() ;
00840 p() ;
00841 echo " aux environs de la ligne 3085, " ;
00842 finp() ;
00843 fintd() ;
00844 fintr() ;
00845
00846 tr() ;
00847 td() ;
00848 p() ;
00849 echo "- ".b("forceClasse()") ;
00850 finp() ;
00851 fintd() ;
00852 td() ;
00853 p() ;
00854 echo " dans le fichier ".ghRouge("action4.php") ;
00855 finp() ;
00856 fintd() ;
00857 td() ;
00858 p() ;
00859 echo " aux environs de la ligne 3100," ;
00860 finp() ;
00861 fintd() ;
00862 fintr() ;
00863
00864 tr() ;
00865 td() ;
00866 p() ;
00867 echo "- ".b("compte_proteines()") ;
00868 finp() ;
00869 fintd() ;
00870 td() ;
00871 p() ;
00872 echo " dans le fichier ".ghRouge("fonction.php") ;
00873 finp() ;
00874 fintd() ;
00875 td() ;
00876 p() ;
00877 echo " aux environs de la ligne 135." ;
00878 finp() ;
00879 fintd() ;
00880 fintr() ;
00881
00882 fintable() ;
00883
00884 p("texte") ;
00885 echo " on remplace les instructions " ;
00886 finp() ;
00887 pre("cadre") ;
00888 echo " \$req = \"SELECT... \"\n" ; ;
00889 echo " \$res = mysql_query(\$req) \n" ; ;
00890 echo " \$tdr = mysql_fetch_array(\$res)\n "; ;
00891 finpre() ;
00892 p() ;
00893 echo " par des instructions " ;
00894 finp() ;
00895 pre("cadre") ;
00896 echo " \$req = \"SELECT... \"\n" ; ;
00897 echo " \$res = \$bdd->query(\$req) \n" ; ;
00898 echo " \$tdr = \$res->fetch()\n "; ;
00899 finpre() ;
00900 p() ;
00901 echo" après avoir, bien sûr, rajouté ".b("\$bdd = connexion() ;")."." ;
00902 finp() ; finli() ;
00903
00904 debutli() ; p("texte") ;
00905 echo " Dans la fonction ".b("affich_header()")." du fichier ".ghRouge("design.php") ;
00906 echo " aux environs de la ligne 145 " ;
00907 echo " et dans la fonction ".b("affich_menu_gauche()")." de ce même fichier " ;
00908 echo " aux environs de la ligne 200, au lieu d'affecter directement ".b("\$agent") ;
00909 echo " via ".b("\$_SERVER[\"HTTP_USER_AGENT\"]").", on ajoute un isset()." ;
00910 finp() ; finli() ;
00911
00912 finol() ;
00913
00914 p("texte") ;
00915 echo "Voici la vérification en ligne de commandes qu'au moins la page ".b("index.php")." fonctionne :" ;
00916 finp() ;
00917
00918 pre("cadrebleu") ;
00919 echo '$gh> php index.php | grep -E "[0-9]+ proteins"'."\n" ;
00920 echo htmlentities(" <span class='small bleuf'>6222 proteins</span>\n") ;
00921 finpre() ;
00922
00923 p("texte") ;
00924 echo "Nous avons écrit que ce n'est pas difficile de changer d'interface. Toutefois, on remarquera que c'est très long, car un ".b("grep") ;
00925 echo " et ".b("wc")." couplés montrent que la fonction ".b("mysql_query()")." est utilisée un peu plus de 200 fois dans l'ensemble du code. " ;
00926 echo " Cela signifie qu'en plus de 200 remplacements de code, il faudra sans doute exécuter au moins 200 tests pour vérifier que tous les cas " ;
00927 echo " d'utilisation ont bien été pris en compte. " ;
00928 echo " Donc armons-nous de patience et essayons d'atteindre une " ;
00929 echo href("https://fr.wikipedia.org/wiki/Couverture_de_code","couverture de code")." de 100 %..." ;
00930 finp() ;
00931
00932 finblockquote() ;
00933
00934 finsolution() ;
00935
00936 finblockquote() ;
00937
00938 ## -------------------------------------------------------------------------------------------
00939
00940 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Réécrire un gros programme
00941
00942 ## -------------------------------------------------------------------------------------------
00943
00944 blockquote() ; # tp
00945
00946 blockquote() ; # énoncé
00947
00948 p("texte") ;
00949 echo " Après réflexion, le site ".b("sHSP")." n'est pas bien conçu. On voudrait utiliser un framework $Php pour le réécrire." ;
00950 echo " Quel \"grand\" framework $Php pourrait-on utiliser ?" ;
00951 finp() ;
00952
00953 p("texte") ;
00954 echo " Réécrire le site ".b("sHSP")." avec le framework $Php de votre choix. " ;
00955 echo " A votre avis, combien de temps faut-il pour le faire ?" ;
00956 finp() ;
00957
00958 finblockquote() ; # énoncé
00959
00960 solutionTP($numExo,$numSerie) ; # contient un blockquote
00961
00962 p("texte") ;
00963 echo " Les grands frameworks de développement $Php qui suivent ".ghRouge("MVC")." ont été présentés en cours. " ;
00964 echo " La page wiki ".href("https://fr.wikipedia.org/wiki/Liste_de_frameworks_PHP","frameworks PHP")." liste les plus connus." ;
00965 finp() ;
00966
00967 p("texte") ;
00968 echo " Que ce soit " ;
00969 echo href("https://www.joomla.fr/","Joomla").", " ;
00970 echo href("https://laravel.com/","Laravel").", " ;
00971 echo href("https://cakephp.org/","CakePHP") ;
00972 echo " ou " ;
00973 echo href("https://codeigniter.com/","CodeIgniter").", par exemple, il faudra certainement compter " ;
00974 echo " de nombreux jours de travail, ne serait-ce que pour comprendre les termes métiers comme " ;
00975 echo " protéine, composition en acide aminés, alignement..." ;
00976 echo " De plus les fichiers scripts fournis ne contiennent aucun test, il sera difficile de savoir " ;
00977 echo " si ce qu'on programme est juste. Ce n'est pas parce qu'on affiche des données qu'elles correspondent à ce qu'il faut. " ;
00978 finp() ;
00979
00980 finsolution() ; # contient un blockquote
00981
00982 finblockquote() ; # tp
00983
00984 # chapitre 2 : http://french.railstutorial.org/chapters/a-demo-app#top
00985
00986 #############################################################################
00987
00988 finTP($numSerie) ;
00989 ?>
Pour ne pas voir les numéros de ligne, ajoutez &nl=non à la suite du nom du fichier.
Retour à la page principale de (gH)