Listing du fichier crs5.php
00001<?php
00002 # # (gH) -_- crs4.php ; TimeStamp (unix) : 07 Septembre 2017 vers 13:48
00003 error_reporting(E_ALL | E_NOTICE ) ;
00004 header('Content-Type "text/html; charset=iso-8859-1"') ;
00005 ini_set( 'default_charset', 'ISO-8859-1' );
00006 include("decra-inc.php") ;
00007 $numCours = 5 ; debutCours($numCours,"Solutions classiques aux problèmes classiques") ;
00008
00009 #############################################################################
00010
00011 # la séquence saisie / calcul / affichage
00012 # la séquence initialisation / calcul / mise en forme ; ex. pourcentage
00013 # fichiers de données pour calculs statistiques et formats standards
00014 # tris et exports
00015 # tracés de graphes via plot
00016 # http et api rest, le modèle MVC
00017 # login/password
00018 # frameworks django et ror
00019
00020 #############################################################################
00021
00022 $tableauDesRubriques = array() ;
00023 $idr = 0 ;
00024 $idr++; $tableauDesRubriques[$idr] = "Un exemple classique : le couple login/password" ;
00025 $idr++; $tableauDesRubriques[$idr] = "Des framework bienvenus : Django et ROR" ;
00026 $idr++; $tableauDesRubriques[$idr] = "Le modèle MVC[2]" ;
00027 $idr++; $tableauDesRubriques[$idr] = "Formats standards de fichiers" ;
00028 $tdmCRLM = new tdm($tableauDesRubriques) ;
00029 $tdmCRLM->titre() ;
00030 $tdmCRLM->menu("oui","oui") ;
00031
00032 #############################################################################
00033
00034 $tdmCRLM->afficheRubrique("oui") ; # Exemple, instance, cas-type et cas problématique"
00035
00036 #############################################################################
00037
00038 blockquote() ;
00039
00040 p("texte") ;
00041 echo "Concevoir et développer des applications, ce n'est pas forcément concevoir et développer de nouveaux algorithmes, de " ;
00042 echo " nouvelles méthodes ou de de nouvelles solutions car beaucoup de composantes d'une application ont souvent déjà été programmées. " ;
00043 echo " Prenons l'exemple simple d'une application Web avec des utilisateurs qui doivent s'authentifier. Une technique classique aujourd'hui (2017) " ;
00044 echo " consiste à passer par un formulaire ".b("login/password")." avec souvent un ".b("login")." correspondant à une adresse mail." ;
00045 finp() ;
00046
00047 imgurl("login.png","https://www.primfx.com/forum/programmation/php/mini-tuto-creation-pages-add-users-login-980") ;
00048
00049 p("texte") ;
00050 echo "Il n'y a rien de très difficile techniquement, mais il y a quand même pas mal de travail à effectuer" ;
00051 echo " (voir par exemple, nos pages ".href("../internet/Lte/","LTE").") :" ;
00052 finp() ;
00053
00054 ul() ;
00055
00056 debutli() ; p() ;
00057 echo "il faut une créer puis administrer une base de données pour gérer les utilisateurs ;" ;
00058 finp() ; finli() ;
00059
00060 debutli() ; p() ;
00061 echo "il faut " ;
00062 echo href("https://openclassrooms.com/courses/apprenez-a-programmer-en-python/gestion-des-mots-de-passe","chiffrer les mots de passe") ;
00063 echo " à l'aide d'une ".href("https://fr.wikipedia.org/wiki/Injection_(math%C3%A9matiques)","fonction injective") ;
00064 echo " ;" ;
00065 finp() ; finli() ;
00066
00067 debutli() ; p() ;
00068 echo "il faut prévoir l'envoi de mail pour le fameux cas ".b("mot de passe oublié") ;
00069 echo " ;" ;
00070 finp() ; finli() ;
00071
00072 debutli() ; p() ;
00073 echo "il faut éventuellement prévoir de lister, comptabiliser, désactiver, réactiver, supprimer les utilisateurs..." ;
00074 finp() ; finli() ;
00075
00076 finul() ;
00077
00078 p("texte") ;
00079 echo "Tout cela étant très standard, de nombreuses solutions ont déjà été créées et pour divers langages. " ;
00080 echo " S'il est possible de concevoir ".b("from scratch")." de nouvelles applications et d'inclure ces solutions dans l'application, " ;
00081 echo " des solutions logicielles nommées " ;
00082 echo href("https://fr.wikipedia.org/wiki/Cat%C3%A9gorie:Framework_de_programmation","frameworks de programmation") ;
00083 echo " et " ;
00084 echo href("https://en.wikipedia.org/wiki/Comparison_of_web_frameworks","frameworks de développement") ;
00085 echo " sont apparues, qui proposent d'aider à développer de nouvelles applications à partir de modules génériques, qu'elles soient Web ou pas. " ;
00086 echo " Pour plus de détails, nous renvoyons à notre " ;
00087 echo href("../Scripts/","cours de master") ;
00088 echo " sur ces frameworks et leurs liens avec les langages de scripts. Nous allons présenter brièvement ici deux fameux frameworks " ;
00089 echo href("https://www.djangoproject.com/","django") ;
00090 echo " et " ;
00091 echo href("http://rubyonrails.org/","ror") ;
00092 echo "." ;
00093 finp() ;
00094
00095 $i1 = "python-django.png" ;
00096 $u1 = "https://fr.wikipedia.org/wiki/Django_(framework)" ;
00097 $i2 = "ruby-rails.png" ;
00098 $u2 = "https://fr.wikipedia.org/wiki/Ruby_on_Rails" ;
00099
00100 deuxImgurl($i1,$u1,$i2,$u2,200) ;
00101
00102 finblockquote() ;
00103
00104 #############################################################################
00105
00106 $tdmCRLM->afficheRubrique("oui") ; # Des framework bienvenus : Django et RO
00107
00108 #############################################################################
00109
00110 blockquote() ;
00111
00112 p("texte") ;
00113 echo "Les frameworks " ;
00114 echo href("https://www.djangoproject.com/","django") ;
00115 echo " et " ;
00116 echo href("http://rubyonrails.org/","ror") ;
00117 echo " sont des ensembles ".b("cohérents")." de composants qui permettent facilement de réaliser des applications Web s'exécutant " ;
00118 echo " dans un navigateur. Ce ne sont pas des ".href("https://fr.wikipedia.org/wiki/Framework","bibliothèques logicielles") ;
00119 echo " mais plutôt des modules génériques prêts à l'emploi qu'il faut configurer et combiner pour construire l'application." ;
00120 echo " Nous n'en dirons pas plus car ces deux frameworks ont de nombreuses documentations, tutoriels et vidéos, comme le montrent les liens " ;
00121 echo " ci-dessous." ;
00122 finp() ;
00123
00124 pvide() ;
00125
00126 blockquote() ;
00127 table(1,15,"collapse") ;
00128 entetesTableau("Type Rails Django","cadrebleu") ;
00129 tr("cadrejaune") ;
00130 td() ; echo "Tutoriel" ; fintd() ;
00131 td() ; echo href("https://www.railstutorial.org/book","rails tutorial") ; fintd() ;
00132 td() ; echo href("https://www.djangoproject.com/start/","django tutorial") ; fintd() ;
00133 fintr() ;
00134 tr("cadrejaune") ;
00135 td() ; echo "Vidéos" ; fintd() ;
00136 td() ; echo href("https://www.google.fr/search?q=rails+tutorial&&tbm=vid","video link 1") ; fintd() ;
00137 td() ; echo href("https://www.google.fr/search?q=django+tutorial&&tbm=vid","video link 2") ; fintd() ;
00138 fintr() ;
00139 tr("cadrejaune") ;
00140 td() ; echo "Livres" ; fintd() ;
00141 td() ; echo href("https://www.google.fr/search?q=bookss+ruby+rails","books link 1") ; fintd() ;
00142 td() ; echo href("https://www.google.fr/search?q=books+django+python","books link 2") ; fintd() ;
00143 fintr() ;
00144 fintable() ;
00145 finblockquote() ;
00146
00147 h3("2.1 Un mini-mini-mini framework en PHP") ;
00148
00149 blockquote() ;
00150
00151 p("texte") ;
00152 echo " Afin de montrer comment fonctionnent les ".em("frameworks").", nous avons fait écrire par nos étudiants de master " ;
00153 echo " une commande nommée ".b("minifp")." qui crée, remplit et visualise une base de données MySQL. " ;
00154 echo " Voici le fonctionnement de cette commande :" ;
00155 finp() ;
00156
00157 pre_fichier("minifp1.txt","cadrejaune") ;
00158
00159 p("texte") ;
00160 echo " Il est clair qu'on ne voit nulle part de code MySQL et pourtant, la table est bien gérée. " ;
00161 echo " Il ne serait pas compliqué d'utiliser un formulaire HTML pour proposer et exécuter les actions de création remplissage et visualisation. " ;
00162 finp() ;
00163
00164 p("texte") ;
00165 echo " Avec un paramètre debug, il serait facile de voir le code MySQL produit par la commande, comme ci-dessous :" ;
00166 finp() ;
00167
00168 pre_fichier("minifp2.txt","cadrejaune") ;
00169
00170 finblockquote() ;
00171
00172 h3("2.2 Un mini-mini exemple avec ".aname("Django","Django")) ;
00173
00174 blockquote() ;
00175
00176 p("texte") ;
00177 echo "Si tout est bien installé et configuré, une mini-version d'application peut-être créée via ".b("django-admin startproject loginp").". " ;
00178 echo " Ensuite, les commandes suivantes permettent d'activer les bases de données, de définir un super-utilisateur et de lancer l'application, " ;
00179 echo " accessible à l'adresse ".href("http://127.0.0.1:8000").", le système d'administration étant gérable à l'adresse ".href("http://127.0.0.1:8000/admin")."." ;
00180 finp() ;
00181
00182 table(0,20) ;
00183 tr() ;
00184 td("L","valigntop") ;
00185 pre_fichier("loginp-demo.txt","cadre") ;
00186 fintd() ;
00187 td() ;
00188 p() ;
00189 $img = "django-loginp.png" ;
00190 echo href($img,img($img,"",300)) ;
00191 finp() ;
00192 fintd() ;
00193 fintr() ;
00194 fintable() ;
00195
00196 p("texte") ;
00197 echo "On peut éventuellement aller consulter les base de données générées avec ".b("sqlitebrower")." ou directement en ".b("sqlite3")." si on en connait les commandes :" ;
00198 finp() ;
00199
00200 pre_fichier("loginp-bd.txt","cadrejaune") ;
00201
00202 p("texte") ;
00203 echo "Voici l'arborescence du projet créé :" ;
00204 finp() ;
00205
00206 pre_fichier("tree_loginp.txt","cadrebleu ") ;
00207
00208 finblockquote() ;
00209
00210 h3("2.3 Un mini-mini exemple avec Ruby on ".aname("rails","rails")) ;
00211
00212 blockquote() ;
00213
00214 p("texte") ;
00215 echo "Si tout est bien installé et configuré, une mini-version d'application peut-être créée via ".b("rails new loginr").". " ;
00216 echo " Ensuite, les commandes suivantes permettent de créer des utilisateurs avec un nom et un email, puis d'activer les bases de données et de lancer l'application, " ;
00217 echo " accessible à l'adresse ".href("http://127.0.0.1:3000").", le système d'administration étant gérable à l'adresse ".href("http://127.0.0.1:3000/users")."." ;
00218 finp() ;
00219
00220 pre_fichier("loginr-demo.txt","cadre") ;
00221
00222 p("texte") ;
00223 echo "Là encore, on peut éventuellement aller consulter les base de données générées avec ".b("sqlitebrower")." ou directement en ".b("sqlite3")." si on en connait les commandes, " ;
00224 echo " la base de données est dans ".b("loginr/db/development.sqlite3").", son schema en Ruby est ".b("schema.rb")."..." ;
00225 finp() ;
00226
00227 p("texte") ;
00228 echo "Voici l'arborescence du projet créé :" ;
00229 finp() ;
00230
00231 pre_fichier("tree_loginr.txt","cadrebleu ") ;
00232
00233 p("texte") ;
00234 echo "Et le schéma (minimaliste) de la base de données :" ;
00235 finp() ;
00236
00237 pre_fichier("schema.rb.txt","cadrejaune") ;
00238
00239 p("texte") ;
00240 echo "Il va sans dire que le paradigme d'";
00241 echo href("https://fr.wikipedia.org/wiki/Mapping_objet-relationnel","ORM") ;
00242 echo " prend tout son sens ici, qu'on le décline en " ;
00243 echo href("https://www.sqlalchemy.org/","SQLAchemy") ;
00244 echo " pour " ;
00245 echo href("https://www.djangoproject.com/","Python/Django") ;
00246 echo " ou en " ;
00247 echo href("https://fr.wikipedia.org/wiki/Active_record","ActiveRecord") ;
00248 echo " pour " ;
00249 echo href("https://api.rubyonrails.org/","Ruby on Rails")." et que le test des sites Web associés est " ;
00250 echo " très bien automatisé comme le montrent les pages " ;
00251 echo href("https://guides.rubyonrails.org/testing.html","rails testing") ;
00252 echo " et " ;
00253 echo href("https://docs.djangoproject.com/fr/3.1/topics/testing/","django testing").". " ;
00254 finp() ;
00255
00256 finblockquote() ;
00257
00258 pvide() ;
00259
00260 finblockquote() ;
00261
00262 #############################################################################
00263
00264 $tdmCRLM->afficheRubrique("oui") ; # Le modèle MVC[2]
00265
00266 #############################################################################
00267
00268 blockquote() ;
00269
00270 p("texte") ;
00271 echo " Le développement d'applications à l'aide d'un framework repose souvent sur le modèle " ;
00272 echo href("https://fr.wikipedia.org/wiki/Mod%C3%A8le-vue-contr%C3%B4leur","MVC") ;
00273 echo " autrement dit " ;
00274 $ug = "https://www.google.fr/search?q=Mod%C3%A8le+vue+contr%C3%B4leur&tbm=isch" ;
00275 echo href($ug,"modèle/vue/controleur") ;
00276 echo "." ;
00277 echo " On pourra consulter la page " ;
00278 echo href("https://perso.liris.cnrs.fr/lmedini/enseignement/M1IF03/CM/3_Outils_serveur.pdf","outils_serveur") ;
00279 echo" pour plus d'informations sur les frameworks." ;
00280 finp() ;
00281
00282 imgurl("mvc.png",$ug,"","cadreimage") ;
00283
00284 p("texte") ;
00285 echo ghRouge("Remarque :") ;
00286 echo " pour les applications Web, il s'agit plus souvent d'un modèle dérivé de " ;
00287 echo b("MVC2")." plutôt que de " ;
00288 echo b("MVC")." sachant que ces " ;
00289 echo href("https://fr.wikipedia.org/wiki/Architecture_logicielle","architectures logicielles") ;
00290 echo " étaient au début prévues pour des applications graphiques avant Internet." ;
00291 echo " On pourra comparer ce type d'architecture à celle nommée " ;
00292 echo href("https://www.google.fr/search?safe=off&tbm=isch&q=architecture+trois+tiers","trois tiers")."." ;
00293 finp() ;
00294
00295 finblockquote() ;
00296
00297 #############################################################################
00298
00299 $tdmCRLM->afficheRubrique("oui") ; # Formats standards de fichiers
00300
00301 #############################################################################
00302
00303 blockquote() ;
00304
00305 $uxml = "../Webrd" ;
00306 $ucsv = "https://fr.wikipedia.org/wiki/Comma-separated_values" ;
00307 $urtf = "https://en.wikipedia.org/wiki/Rich_Text_Format" ;
00308 $updf = "https://fr.wikipedia.org/wiki/Portable_Document_Format" ;
00309
00310 p("texte") ;
00311 echo "Si les entrées/sorties des applications Web se réduisent souvent à des formulaires et à du texte formaté rendu via un navigateur, " ;
00312 echo " les applications classiques, elles, ont besoin de fichiers en entrée et en sortie. A part les formatages " ;
00313 echo href($uxml,"XML").", il y a quelques standards assez simples à mettre en oeuvre pour que ces fichiers soient utilisables en bureautique. " ;
00314 echo " En particulier le format " ;
00315 echo href($ucsv,"CSV") ;
00316 echo " est très pratique si les données doivent être traitées sous Microsoft Excel ou équivalent et " ;
00317 echo " le format " ;
00318 echo href($urtf,"RTF") ;
00319 echo " est sans doute un bon choix si les données doivent être traitées sous Microsoft Word, " ;
00320 echo " de même que le format ";
00321 echo href($updf,"PDF")." est le choix qui s'impose au fil des années pour les documents à imprimer." ;
00322 finp() ;
00323
00324 blockquote() ;
00325 table(1,20,"collapse") ;
00326 tr() ;
00327 td("C") ; echo href($uxml,s_span(b("XML"),"gros_car grougef")) ; fintd() ;
00328 td("C") ; echo href($updf,s_span(b("PDF"),"gros_car grougef")) ; fintd() ;
00329 fintr() ;
00330 tr() ;
00331 td("C") ; echo href($ucsv,s_span(b("CSV"),"gros_car grougef")) ; fintd() ;
00332 td("C") ; echo href($urtf,s_span(b("RTF"),"gros_car grougef")) ; fintd() ;
00333 fintr() ;
00334 fintable() ;
00335 finblockquote() ;
00336
00337 p("texte") ;
00338 echo " On n'oubliera pas ici que " ;
00339 echo href("https://pandoc.org/","pandoc")." est une solution logicielle capable de convertir les différents formats textes de documents." ;
00340 echo " En ce qui concerne les feuilles de tableurs et les bases de données relationnelles, les formats CSV et DLM suffisent amplement " ;
00341 echo " puisque l'information est écrite sous forme de tableaux rectangulaires contenant des données." ;
00342 finp() ;
00343
00344 pvide() ;
00345
00346 finblockquote() ;
00347
00348 #############################################################################
00349
00350 finCours($numCours) ;
00351 ?>
Pour ne pas voir les numéros de ligne, ajoutez &nl=non à la suite du nom du fichier.
Retour à la page principale de (gH)