Valid XHTML     Valid CSS2    

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")."&nbsp;? " ;
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&ucirc;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&nbsp;:" ;
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 &laquo;repérages&raquo; 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&ecirc;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&nbsp;-a&nbsp; "###"&nbsp;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&ecirc;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&nbsp;-a&nbsp; "##"&nbsp;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é&nbsp;?" ;
00215     
finp() ;
00216     
00217     
p
("texte") ;
00218     echo
" Quel moteur de base de données serait le plus adapté&nbsp;?" ;
00219     
finp() ;
00220     
00221     
p
("texte") ;
00222     echo
" Seriez-vous capable de quantifier le temps nécessaire au développement de ce site&nbsp;?" ;
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 &nbsp;?) comme pour le tournoi de tennis de Roland-Garros&nbsp;?" ;
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 &ecirc;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&nbsp;???)") ;
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&ucirc;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&nbsp;?), 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 &ecirc;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&nbsp;?), une (deux&nbsp;?) 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 &ecirc;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&nbsp;?), " ;
00422     echo
" une adresse (deux, trois pour le stagiaire, adresse étudiante, des parents, durant le stage&nbsp;?). " ;
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 &ecirc;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&nbsp;:")." 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 &ecirc;tre modifiés et quels " ;
00537     echo
" fichiers devraient &ecirc;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)&nbsp;? " ;
00546     echo
" Comment pourrriez-vous y répondre technologiquement&nbsp;? " ;
00547     
finp() ;
00548     
00549     
p
("texte") ;
00550     echo
"Ce site est-il fonctionnel pour "
.b("$Php&nbsp;7")."&nbsp;?" ;
00551     echo
" Si non, quelles parties faudrait-il changer&nbsp;?" ;
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&nbsp;:" ;
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&ecirc;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&nbsp;:" ;
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").") &nbsp;:" ;
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&nbsp;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&ecirc;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&nbsp;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é&nbsp;:" ;
00632     
finp() ;
00633     
00634     
blockquote() ;
00635     
p() ;
00636     echo
"-&nbsp;"
.href("http://php.net/manual/en/migration5.php","entre $Php 4 et $Php 5") ;
00637     
finp() ;
00638     
p() ;
00639     echo
"-&nbsp;"
.href("http://php.net/manual/fr/migration53.deprecated.php","à partir de $Php 5.3") ;
00640     
finp() ;
00641     
p() ;
00642     echo
"-&nbsp;"
.href("http://php.net/manual/fr/migration55.deprecated.php","à partir de $Php 5.5") ;
00643     
finp() ;
00644     
p() ;
00645     echo
"-&nbsp;"
.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 &laquo;faire la chasse&raquo; 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
" --&nbsp;mais pas "
.href("http://php.net/manual/fr/function.explode.php","explode()")."&nbsp;--" ;
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&ecirc;me si "
.b("grep")." admet ".b('-e&nbsp;"a&nbsp;|&nbsp;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&ocirc;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&nbsp;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&nbsp;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 &laquo;"
.em("la chasse")."&raquo; aux lignes impliquées, il ne doit pas &ecirc;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&nbsp;:" ;
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&nbsp;=&nbsp;new&nbsp;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&ucirc;r, rajouté "
.b("\$bdd&nbsp;=&nbsp;connexion()&nbsp;;")."." ;
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&ecirc;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&nbsp;:" ;
00916     
finp() ;
00917     
00918     
pre
("cadrebleu") ;
00919     echo
'$gh> php index.php | grep -E "[0-9]+ proteins"'
."\n" ;
00920     echo
htmlentities
("&nbsp;<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&nbsp;%..." ;
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&nbsp;?" ;
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&nbsp;?" ;
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 gH    Retour à la page principale de   (gH)