Listing du fichier webrd01.php
00001 <?php
00002 error_reporting(E_ALL | E_NOTICE | E_STRICT) ;
00003 include("std.php") ;
00004 include("../xmlstd.php") ;
00005 include("webrd_inc.php") ;
00006
00007 # (gH) -_- webrd01.php ; TimeStamp (unix) : 04 Octobre 2012 vers 14:50
00008
00009 debutPageWrd(1) ;
00010
00011 $DTD = rouge("DTD") ;
00012 $XSD = rouge("XSD") ;
00013 $XML = rouge("XML") ;
00014 $xml = rouge("xml") ;
00015 $dtd = rouge("dtd") ;
00016 $xsd = rouge("xsd") ;
00017 $xsl = rouge("xsl") ;
00018 $VCARD = rouge("VCARD") ;
00019 $XCARD = rouge("XCARD") ;
00020 $Fasta = rouge("Fasta") ;
00021 $XSL = rouge("XSL") ;
00022 $HTML = bleu("HTML") ;
00023 $HTML5 = bleu("HTML5") ;
00024 $XHTML = bleu("XHTML") ;
00025
00026 ## -------------------------------------------------------------------------------------------
00027
00028 sdl(3) ; echo cmt(' pour afficher toutes les solutions : wedrd01.php?solutions=1') ; sdl(3) ;
00029
00030 ## -------------------------------------------------------------------------------------------
00031
00032 debutSection() ;
00033
00034 $tableauDesRubriques = array() ;
00035 $idr = 0 ;
00036 $idr++; $tableauDesRubriques[$idr] = "Installation des outils logiciels" ;
00037 $idr++; $tableauDesRubriques[$idr] = "Structuration de services" ;
00038 $idr++; $tableauDesRubriques[$idr] = "Structuration de personnes, $VCARD et $XCARD" ;
00039 $idr++; $tableauDesRubriques[$idr] = "Structuration de séquences $Fasta" ;
00040 $idr++; $tableauDesRubriques[$idr] = "Structuration de personnes et de services " ;
00041 $idr++; $tableauDesRubriques[$idr] = "Formats $XML usuels en bureautique" ;
00042 $idr++; $tableauDesRubriques[$idr] = "Formats $XML usuels en bioinformatique" ;
00043 $idr++; $tableauDesRubriques[$idr] = "Bases de données et $XML ; espaces de noms" ;
00044 $idr++; $tableauDesRubriques[$idr] = "Dessins et rendus $XML" ;
00045 $idr++; $tableauDesRubriques[$idr] = "Lecture de fichiers $XML sur Internet et logiciel $R" ;
00046 $idr++; $tableauDesRubriques[$idr] = "Questions diverses " ;
00047 $idr++; $tableauDesRubriques[$idr] =
00048 $tdmCRLM = new tdm($tableauDesRubriques) ;
00049 $tdmCRLM->titre() ;
00050 $tdmCRLM->menu("oui","oui","nou") ;
00051
00052 pvide() ;
00053
00054 p() ;
00055 echo "Il est possible d'afficher toutes les solutions via " ;
00056 echo href("webrd01.php?solutions=1","?solutions=1","bouton_fin jaune_pastel nou")." " ;
00057 echo " et de les masquer avec " ;
00058 echo href("webrd01.php?solutions=0","?solutions=0","bouton_fin vert_pastel nou").". " ;
00059 finp() ;
00060
00061 finSection() ;
00062
00063 debutSection() ;
00064 $numExo = 0 ;
00065
00066 ## -------------------------------------------------------------------------------------------
00067
00068 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Installation des outils logiciels
00069
00070 ## -------------------------------------------------------------------------------------------
00071
00072 blockquote() ;
00073
00074 p("texte") ;
00075 echo "Installer sous Linux les outils en ligne de commande nommés " ;
00076 echo vert("recode").", ".vert("rxp").", ".vert("xmllint") ;
00077 echo ", ".vert("xmlstarlet").", ".vert("xsltproc")." puis les modules ";
00078 echo rouge("XML::Parser").", " ;
00079 echo rouge("XML::Checker").", " ;
00080 echo rouge("XML::SAX").", " ;
00081 echo rouge("XML::Validator::Schema")." et " ;
00082 echo rouge("XML::XSLT")." pour ".href("../tuteurs/tutperl.htm","perl").". " ;
00083 finp() ;
00084
00085 p("texte") ;
00086 echo "Où sont les pages d'aides associées ? " ;
00087 finp() ;
00088
00089 p("texte") ;
00090 echo "Vérifier que le script ".href("montresource.php?nomfic=demoXml","demoXml") ;
00091 echo " fourni dans l'archive ".href("demoXml.zip")." fournit les mêmes résultats que dans le listing " ;
00092 echo " de sortie ".href("montresource.php?nomfic=demoXmlTxt.txt","demoXml.txt")." et que vous " ;
00093 echo " comprenez les affichages. On pourra essayer de retenir les principales options des outils en ligne de commande. " ;
00094 echo " On utilisera bien sûr les fichiers suivants : " ;
00095 finp() ;
00096
00097 blockquote() ;
00098 table(1,7,"collapse") ;
00099 tr() ;
00100 th() ; echo "Fichier" ; finth() ;
00101 th() ; echo "Explications" ; finth() ;
00102 fintr() ;
00103 tr() ;
00104 td() ; echo href("dbf.xml") ; fintd() ;
00105 td() ; echo "fichier $xml bien formé" ; fintd() ;
00106 fintr() ;
00107 tr() ;
00108 td() ; echo href("dmf.xml") ; fintd() ;
00109 td() ; echo "fichier $xml mal formé" ; fintd() ;
00110 fintr() ;
00111 tr() ;
00112 td() ; echo href("adv.xml") ; fintd() ;
00113 td() ; echo "fichier $xml valide pour la grammaire id.$dtd" ; fintd() ;
00114 fintr() ;
00115 tr() ;
00116 td() ; echo href("adn.xml") ; fintd() ;
00117 td() ; echo "fichier $xml invalide pour la grammaire id.$dtd" ; fintd() ;
00118 fintr() ;
00119 tr() ;
00120 td() ; echo href("id.dtd") ; fintd() ;
00121 td() ; echo "fichier grammaire de type $dtd" ; fintd() ;
00122 fintr() ;
00123 tr() ;
00124 td() ; echo href("axv.xml") ; fintd() ;
00125 td() ; echo "fichier $xml valide pour la grammaire id.$xsd" ; fintd() ;
00126 fintr() ;
00127 tr() ;
00128 td() ; echo href("axn.xml") ; fintd() ;
00129 td() ; echo "fichier $xml invalide pour la grammaire id.$xsd" ; fintd() ;
00130 fintr() ;
00131 tr() ;
00132 td() ; echo href("id.xsd") ; fintd() ;
00133 td() ; echo "fichier grammaire de type $xsd (schéma)" ; fintd() ;
00134 fintr() ;
00135 tr() ;
00136 td() ; echo href("cours.xml") ; fintd() ;
00137 td() ; echo "fichier $xml auquel appliquer la transformation .$xsl" ; fintd() ;
00138 fintr() ;
00139 tr() ;
00140 td() ; echo href("cours.xsl") ; fintd() ;
00141 td() ; echo "fichier $xml qui est une transformation $xsl" ; fintd() ;
00142 fintr() ;
00143 fintable() ;
00144 finblockquote() ;
00145
00146 p("texte") ;
00147 echo "Ecrire un script ".b("iso2utf")." et un script ".b("utf2iso")." pour convertir les accents à l'aide de recode (plutôt que iconv). " ;
00148 finp() ;
00149
00150 p("texte") ;
00151 echo " Tester ces scripts avec les fichiers " ;
00152 echo href("accentsIso.txt").", " ;
00153 echo href("accentsHtml.txt")." et " ;
00154 echo href("accentsUtf.txt").". " ;
00155 echo "Un fichier plus complet en iso est ".href("allcharIso.txt").". " ;
00156 finp() ;
00157
00158 solution($numExo) ;
00159
00160 p() ;
00161 echo "Pour ".b("rxp").", on peut exécuter ".b("sudo apt-get install rxp").". " ;
00162 br() ;
00163 echo "La page officielle pour rxp est " ;
00164 echo href("http://www.cogsci.ed.ac.uk/~richard/rxp.html").". " ;
00165 echo "La page d'aide (man) est ".href("http://www.cogsci.ed.ac.uk/~richard/rxp.txt")." dont " ;
00166 echo " une version un peu plus lisible est ".href("rxp_help.html","ici").". " ;
00167 echo " Une autre page d'aide est " ;
00168 echo href("https://www.spec.org/mpi/docs/specrxp.html","là") ;
00169 echo " (merci à M. Racine et R. Gaborieau de nous l'avoir signalée)." ;
00170 finp() ;
00171
00172 p() ;
00173 echo b("xmllint")." fait partie du package ".b("libxml2-utils").", installable aussi par ".b("apt-get")." ou via " ;
00174 echo href("http://xmlsoft.org").". " ;
00175 echo "La page d'aide est ".href("http://xmlsoft.org/xmllint.html").". " ;
00176 finp() ;
00177
00178 p() ;
00179 echo "On peut trouver " ;
00180 echo "la page d'aide pour ".b("xmlstarlet")." sur sourceforge : " ;
00181 echo href("http://xmlstar.sourceforge.net/doc/UG/xmlstarlet-ug.html","xmlstarlet-ug.html").". " ;
00182 finp() ;
00183
00184 p() ;
00185 echo "On peut trouver " ;
00186 echo "la page d'aide pour ".b("xsltproc")." sur le site ".b("xmlsoft")." : " ;
00187 echo href("http://xmlsoft.org/XSLT/xsltproc2.html","xsltproc2.html").". " ;
00188 finp() ;
00189
00190 p() ;
00191 echo "Pour perl, installer le module MMM peut se faire en ligne de commande via ".b("sudo perl -MCPAN -e 'install MODULE::MMM'").". " ; br() ;
00192 echo " Voir le détail des commentaires en haut du fichier " ;
00193 echo href("montresource.php?nomfic=demoXml","demoXml").". " ;
00194 finp() ;
00195
00196
00197 p() ;
00198 echo "La syntaxe de " ;
00199 echo href("recode_list.txt","recode").", " ;
00200 echo " qu'on installe par ".b("apt-get") ;
00201 echo " est la suivante : " ;
00202 echo b("recode ISO-8859-15..UTF8 fichier").". " ;
00203 finp() ;
00204
00205 p() ;
00206 echo "La syntaxe de " ;
00207 echo href("iconv_list.txt","iconv") ;
00208 echo " qu'on installe par ".b("sudo apt-get install libc-bin")." " ;
00209 echo " est la suivante : " ;
00210 echo b("iconv -f ISO_8859-15 -t UTF-8 fichier_original > fichier_modifié").". " ;
00211 finp() ;
00212
00213 p() ;
00214 echo "Le script " ;
00215 echo b("iso2utf") ;
00216 echo " est donc tout simplement le fichier qui contient " ;
00217 echo b("recode ISO-8859-15..UTF8 \$1")." rendu exécutable par " ;
00218 echo b("chmod +x").". " ;
00219 finp() ;
00220
00221 p() ;
00222 echo "Pour être sûr que tout est bien installé, il faut exécuter les commandes suivantes " ;
00223 finp() ;
00224
00225 pre_fichier("cmd_install.txt","cadre") ;
00226
00227 finsolution() ;
00228
00229 finblockquote() ;
00230
00231 ## -------------------------------------------------------------------------------------------
00232
00233 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Structuration de services
00234
00235 ## -------------------------------------------------------------------------------------------
00236
00237 blockquote() ;
00238
00239 p("texte") ;
00240 echo "On veut modéliser des services dans une entreprise comme " ;
00241 echo em("Achats").", " ;
00242 echo em("Direction").", " ;
00243 echo em("Courrier")."..." ;
00244 echo " Ecrire le fichier ".b("serv00.xml")." défini à l'aide des seuls éléments ".s_span("services","gbleu")." et ".s_span("service","gbleu")." ; " ;
00245 echo " les noms de services seront intégrés comme des contenus-texte d'éléments. Comment vérifier que " ;
00246 echo " le fichier est bien formé ? Ajouter le service ".em("Représentation")." après avoir remarqué qu'il " ;
00247 echo " y a un caractère accentué. On nommera ".b("serv01.xml")." le fichier avec accent. " ;
00248 finp() ;
00249
00250 p("texte") ;
00251 echo " Ecrire le fichier ".b("serv02.xml")." défini à l'aide des éléments ".s_span("services","gbleu")." et ".s_span("service","gbleu")." " ;
00252 echo " et du sous-élément ".s_span("nomDeService","gbleu")." dont le contenu-texte est un nom de service " ;
00253 echo " puis écrire le fichier ".b("serv03.xml")." défini à l'aide des éléments ".s_span("services","gbleu")." et ".s_span("service","gbleu")." " ;
00254 echo " et de l'attribut ".s_span("nomDeService","gvert")."." ;
00255 finp() ;
00256
00257 p("texte") ;
00258 echo "On décide maintenant d'ajouter un identifiant de service (comme pour une base de données). Faut-il utiliser " ;
00259 echo " l'initiale des services ou un entier auto-incrémenté ? Si on nomme ".s_span("numService","grouge")." cette donnée, comment l'implémenter ? " ;
00260 echo " Vous écrirez dans ".b("serv04.xml")." à partir de ".b("serv02.xml")." la solution avec sous-élément et " ;
00261 echo " dans ".b("serv05.xml")." la solution avec attribut. " ;
00262 echo " Y a-t-il pour l'instant une meilleure solution ? " ;
00263 finp() ;
00264
00265 solution($numExo) ;
00266
00267 p() ;
00268 echo "Voici les fichiers solutions : " ;
00269 finp() ;
00270
00271 $tabExpl = Array() ;
00272 $tabExpl[0] = "fichier sans accent et sans sous structure" ;
00273 $tabExpl[1] = "fichier avec accent et sans sous structure" ;
00274 $tabExpl[2] = "fichier avec sous-structure en élément" ;
00275 $tabExpl[3] = "fichier avec sous-structure en attribut" ;
00276 $tabExpl[4] = "complément de serv02.xml avec numéro de service en élément" ;
00277 $tabExpl[5] = "complément de serv02.xml avec numéro de service en attribut" ;
00278
00279 blockquote() ;
00280 table(1,7,"collapse") ;
00281 tr() ;
00282 th() ; echo "Fichier" ; finth() ;
00283 th() ; echo "Explications" ; finth() ;
00284 fintr() ;
00285 for ($ndf=0;$ndf<=5;$ndf++) {
00286 tr() ;
00287 td() ; echo href("serv0$ndf.xml") ; fintd() ;
00288 td() ; echo $tabExpl[$ndf] ; fintd() ;
00289 fintr() ;
00290 } ; # fin pour
00291 fintable() ;
00292 finblockquote() ;
00293
00294 montre(0,5,"serv","visu1") ;
00295
00296 p() ;
00297 echo b("Quelques remarques") ;
00298 finp() ;
00299
00300 p("texte") ;
00301 echo "Il est conseillé, lorsqu'on écrit un fichier $XML «à la main» sous éditeur, d'adopter un standard d'écriture. " ;
00302 echo " Ainsi, dans ".href("serv00.xml")." et ".href("serv02.xml").", il est maladroit de mettre des retours-charriot uniquement pour le service ".b("Courrier").". " ;
00303 finp() ;
00304
00305 p("texte") ;
00306 echo "L'écriture de ".href("serv03.xml")." est encore plus maladroite : il existe deux façons de coder des éléments auto-fermants et il vaut mieux utiliser toujours le même " ;
00307 echo " même codage à l'intérieur d'un même fichier. De plus il doit en principe y avoir un espace devant le symbole / si on utilise le codage court, ce qui " ;
00308 echo " n'est pas le cas pour le service ".b("Direction")." où le / est collé au symbole guillemet du nom de l'attribut. " ;
00309 finp() ;
00310
00311 p("texte") ;
00312 echo "Pour l'instant, le fichier ".href("serv04.xml")." est correct, mais il est clair qu'avoir utilisé ".b("3r")." comme numéro de service pour ".b("Courrier")." est sans doute " ;
00313 echo " une faute de frappe, non détectable sans typage des numéros de service, d'où l'utilité des grammaires. " ;
00314 echo " Par contre, le choix d'un numéro ou d'une lettre est ici peu important, même si une initiale risque d'apparaitre plusieurs fois, ce qui ne permettra pas d'en faire un " ;
00315 echo " index. On verra plus tard comment définir par grammaire des identifiants et des références à des identifiants. " ;
00316 echo " On remarquera que nous avons volontairement dupliqué le service ".b("Direction")." ce qui constitue une erreur, non détectable à ce niveau ; la cardinalité ".b("unique") ;
00317 echo " sera, elle aussi, prise en compte par les grammaires. " ;
00318 finp() ;
00319
00320 p("texte") ;
00321 echo "Pour vérifier que les fichiers $XML sont bien formés, on peut bien sûr utiliser rxp, xmllint, xmlstarlet ou se contenter de cliquer sur les liens fournis " ;
00322 echo " car les navigateurs vérifient les fichiers $XML (contrairement aux fichiers HTML, y compris XHTML) et ne les affichent que s'ils sont bien formés. " ;
00323 finp() ;
00324
00325 finsolution() ;
00326
00327 finblockquote() ;
00328
00329 ## -------------------------------------------------------------------------------------------
00330
00331 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Structuration de personnes
00332
00333 ## -------------------------------------------------------------------------------------------
00334
00335 blockquote() ;
00336
00337 p("texte") ;
00338 echo "On admettra qu'on peut définir sommairement une personne par " ;
00339 echo " un ".s_span("nom","grouge").", un ".s_span("prénom","grouge")." et une ".s_span("ddn","grouge")." (date de naissance) que l'on réduira pour l'instant " ;
00340 echo " à une année de naissance. Ecrire, à partir des éléments ".s_span("personnes","gbleu")." et ".s_span("personne","gbleu")." dans le fichier " ;
00341 echo b("pers01.xml") ;
00342 echo " une solution ".s_span("tout élément","gbleu")." puis dans " ;
00343 echo b("pers02.xml") ;
00344 echo " une solution ".s_span("tout attribut","gbleu").". Enfin, écrire dans " ;
00345 echo b("pers03.xml") ;
00346 echo " une solution «panachée» où ".eltb("nom")." et ".eltb("prénom")." sont des éléments et où ".attv("ddn")." est un attribut. " ;
00347 finp() ;
00348
00349 p("texte") ;
00350 echo "On insérera les personnes Isabelle DUPUIS, née en 1965, Jean DUPONT, né en 1963, Jack DUPONT, né en 1968. " ;
00351 finp() ;
00352
00353 p("texte") ;
00354 echo "Peut-on avoir à la fois un ".eltb("élément")." ddn et un ".attv("attribut")." ddn ? " ;
00355 finp() ;
00356
00357 p("texte") ;
00358 echo "Y a-t-il une structuration meilleure qu'une autre pour cet exemple ? " ;
00359 finp() ;
00360
00361 p("texte") ;
00362 echo "Qu'est-ce que ".b("XCARD")." ? Quel rapport avec ".b("VCARD")." et ".b("XML")." ? " ;
00363 echo " Que sont ".rouge("RFC-6350")." et ".rouge("RFC-63511")." ? " ;
00364 finp() ;
00365
00366 solution($numExo) ;
00367
00368 p() ;
00369 echo "Voici les fichiers demandés ; le quatrième fichier comporte un élément et un attribut de même nom, ce qui n'est pas recommandé." ;
00370 finp() ;
00371
00372 montre(1,4,"pers","visu2") ;
00373
00374 p("texte") ;
00375 echo "Pour cet exemple, il n'y a probablement pas de meilleure solution. On peut juste remarquer que la solution avec des " ;
00376 echo " attributs seulement est plus concise et sans doute plus facile à lire. " ;
00377 finp() ;
00378
00379 p("texte") ;
00380 echo "VCARD signifie Visit Card, soit carte de visite en français. Il s'agit d'un format ouvert de données sur des personnes, beaucoup plus " ;
00381 echo " complet que notre simple exemple avec nom, prénom et ddn. Une présentation courte en est fournie sur le wiki français " ;
00382 echo " à l'adresse ".href(wikifr("VCard"))." mais la version anglaise " ;
00383 echo href(wikien("VCard"))." est plus détaillée. On y apprend que " ;
00384 echo href("http://tools.ietf.org/html/rfc6350","RFC6350")." décrit ce que contient une VCARD et que " ;
00385 echo href("http://tools.ietf.org/html/rfc6351","XCARD")." est la version $XML de VCARD. " ;
00386 echo b("RFC6351")." est un ".href(wikifr("Request_for_comments"),"«appel à commentaires»")." qui décrit ce format XCARD. " ;
00387 finp() ;
00388
00389 p("texte") ;
00390 echo "En fait, XCARD permet d'avoir un carnet d'adresses, chaque personne étant représentée par sa carte de visite. L'élément racine est " ;
00391 echo " nommé ".bleu("vcards")." (noter le ".s_span("s","gvert")." à la fin) et chaque carte de visite correspond à un élément ".bleu("vcard")." (donc sans ".s_span("s","gvert")." en fin)." ;
00392 echo " On pourra remarquer que le nom, le surnom, etc. sont structurés en tant qu'".bleu("éléments").", pas en tant qu'".bleu("attributs").". " ;
00393 echo " Voici une partie d'un fichier XCARD extrait de la RFC6351 : " ;
00394 finp() ;
00395
00396 pre_fichier("xmpxcard.txt","cadre") ;
00397
00398 p("texte") ;
00399 echo b("RFC63511")." n'existe pas. Il s'agit d'un faute de frappe (volontaire) pour ". b("RFC6351")."." ;
00400 finp() ;
00401
00402 finsolution() ;
00403
00404 finblockquote() ;
00405
00406 ## -------------------------------------------------------------------------------------------
00407
00408 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Structuration de séquences Fasta
00409
00410 ## -------------------------------------------------------------------------------------------
00411
00412 blockquote() ;
00413
00414 p("texte") ;
00415 echo "Une ".href("http://fr.wikipedia.org/wiki/FASTA","séquence Fasta")." traditionnelle se compose d'un identifiant comme " ;
00416 echo href("http://www.ncbi.nlm.nih.gov/protein/159163650","1YYCA") ;
00417 echo " et d'une suite d'".href("http://fr.wikipedia.org/wiki/Acide_amin%C3%A9","acides aminés")." comme ".b("VKGFFAECKLA")." ou de " ;
00418 echo href("http://fr.wikipedia.org/wiki/Nucl%C3%A9otide","nucléotides")." comme ".b("TATAAGCCTGCCAAGC").". " ;
00419 echo " On se restreint pour ce qui suit aux protéines (définies comme des suites d'acides aminés). " ;
00420 echo " Si on nomme ".datar("id")." et ".datar("aa")." les données, " ;
00421 echo " comment structurer dans un fichier ".rouge("XML")." ces informations ? " ;
00422 echo " On pourra utiliser le fichier texte ".href("fasta_xmp.txt")." pour constituer un fichier ".rouge("XML")." de 3 séquences Fasta. " ;
00423 finp() ;
00424
00425 p() ;
00426 echo "Que peut-on ajouter comme aide à la vérification ? Sous quelle forme, élément ou attribut ? " ;
00427 finp() ;
00428
00429 solution($numExo) ;
00430
00431 p("texte") ;
00432 echo "A l'aide des exercices précédents, on peut raisonnablement implémenter une solution tout élément (".href("fasta01.xml")."), " ;
00433 echo " une solution tout attribut (".href("fasta02.xml")."), " ;
00434 echo " ou une solution «panachée» (".href("fasta03.xml")."). " ;
00435 echo " Ajouter un élément longueur (".href("fasta04.xml").") ou un attribut longueur (".href("fasta05.xml")."), " ;
00436 echo " pourrait constituter une vérification utile, quand on connait les longueurs usuelles des séquences Fasta, " ;
00437 echo " ce qui statistiquement n'est pas si simple que cela... " ;
00438 finp() ;
00439
00440 montre(1,5,"fasta","visu3") ;
00441
00442 finsolution() ;
00443
00444 finblockquote() ;
00445
00446 ## -------------------------------------------------------------------------------------------
00447
00448 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Structuration de personnes et de services
00449
00450 ## -------------------------------------------------------------------------------------------
00451
00452 blockquote() ;
00453
00454 p("texte") ;
00455 echo "Ecrire dans " ;
00456 echo b("agence01.xml") ;
00457 echo " une solution ".eltb("tout élément")." qui intégre un fichier ".rouge("XML")." de personnes (auquel on aura ajouté un numéro de service nommé ".datar("numService").")" ;
00458 echo " et un fichier ".rouge("XML")." de services puis fournir dans " ;
00459 echo b("agences02.xml") ;
00460 echo " une solution ".attv("tout attribut").". " ;
00461 echo "On pourra utiliser " ;
00462 echo href("pers06.xml")." et ".href("serv06.xml")." pour constituer ".href("agences01.xml") ;
00463 echo " puis " ;
00464 echo href("pers07.xml")." et ".href("serv07.xml")." pour constituer ".href("agences02.xml") ;
00465 echo ". " ;
00466 finp() ;
00467
00468 solution($numExo) ;
00469
00470 p("texte") ;
00471 echo "On peut bien évidemment faire un \"copier/coller\" les fichiers de personnes et de services dans un fichier agence " ;
00472 echo "(".href("agences01.xml").", ".href("agences02.xml")."), mais il est sans doute mieux de les inclure via une ".rouge("DTD").", soit les " ;
00473 echo " fichiers ".href("agences03.xml")." et ".href("agences04.xml").". " ;
00474 finp() ;
00475
00476 montre(1,4,"agences","visu4") ;
00477
00478 p("texte") ;
00479 echo "Il est possible de vérifier que les inclusions sont effectives et valides à l'aide de ".b("rxp").", ".b("xmllint")." ou ".b("xmlstarlet")." :" ;
00480 finp() ;
00481
00482 pre_fichier("agences.txt","cadre") ;
00483
00484 finsolution() ;
00485
00486 finblockquote() ;
00487
00488 ## -------------------------------------------------------------------------------------------
00489
00490 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Formats XML usuels en bureautique
00491
00492 ## -------------------------------------------------------------------------------------------
00493
00494 blockquote() ;
00495
00496 p("texte") ;
00497 echo "Dans quelle mesure peut-on dire qu'un fichier-archive, une base de données et un fichier ".rouge("XML")." sont des conteneurs ? " ;
00498 finp() ;
00499
00500 p("texte") ;
00501 echo "Ecrire le texte "."«Bon ".b("courage")." à " ;
00502 echo s_span("tous","bleu")." et à ".bleu("toutes")."» -- exactement comme cela, avec " ;
00503 echo em("courage")." en gras, ".em("tous")." en bleu et ".em("toutes")." en gras et bleu foncé -- " ;
00504 echo " dans un fichier Word au format ".b("DOCX").", puis au format ".b("RTF")." ; " ;
00505 echo " écrire le même texte dans un fichier Libre Office au format ".b("Texte ODT").". Si ce sont des fichiers ".bleu("XML").", pourquoi ne peut-on pas les " ;
00506 echo " ouvrir directement avec un éditeur de texte ? A quoi correspond le format ".b(".FODT")." ?" ;
00507 finp() ;
00508
00509 p("texte") ;
00510 echo " Reprendre avec les informations ci-dessous (fichier ".href("tableur_data.txt").") qu'on mettra dans les cellules d'un tableur, qu'on sauvegardera au format " ;
00511 echo vert("XLSX").", ".vert("CSV")." et ".vert("Classeur ODS")." :" ;
00512 finp() ;
00513
00514 pre_fichier("tableur_data.txt","cadre") ;
00515
00516 solution($numExo) ;
00517
00518 p("texte") ;
00519 echo " Un fichier-archive, " ;
00520 echo " une base de données ".vert("MySql").", un document ".rouge("XML").", un objet (au sens de la programmation objets) ou même un ".b("DVD")." du commerce sont des " ;
00521 echo " conteneurs dans la mesure où ils permettent de regrouper des contenus (données) hétérogènes : une base de données contient des tables qui elle-mêmes contiennent des champs, " ;
00522 echo " l'élément racine du document ".rouge("XML")." peut contenir d'autres éléments qui peuvent contenir eux-mêmes d'autres éléments, " ;
00523 echo " un objet en ".vert("PO")." peut contenir plusieurs variables-mémoires, voire plusieurs tableaux ou d'autres objets, " ;
00524 echo " un ".b("DVD")." du commerce contient des vidéos, des sous-titres, voire des menus, des images... " ;
00525 echo " Ce qu'apporte en plus ".rouge("XML")." et l'objet, c'est la possibilité d'agir sur leurs contenus... " ;
00526 finp() ;
00527
00528 p("texte") ;
00529 echo "On pourrait exporter une base de données en ".rouge("XML")." avec la structure suivante " ;
00530 echo " (".vert("MySql")." dispose d'une ".href("../internet/mysqlhlp.txt","option de sortie")." ".vert("HTML")." et d'une ".href("../internet/mysqlman.txt","option de sortie")." ".rouge("XML")." qui ressemble un peu à celle-ci) :" ;
00531 finp() ;
00532
00533 pre_fichier("mysqlEnXml.txt","cadre") ;
00534
00535 p("texte") ;
00536 echo "Les fichiers ".vert(".ODS")." et ".vert(".DOCX")." sont des documents compressés, c'est-à-dire des archives et ne peuvent donc pas être lus directement. Seul le format ".vert(".RTF") ;
00537 echo " est lisible, si l'on peut dire. En voici le contenu :" ;
00538 finp() ;
00539
00540 pre_fichier("boncourage.rtf","cadre") ;
00541
00542
00543 p("texte") ;
00544 echo "Un afffichage plus lisible pour un fichier similaire se trouve à l'adresse ".href("../internet/courage.rtfste","courage.rtfste") ;
00545 echo " qui correspond à l'exercice 9 de nos exercices PHP ".href("../internet/tds.php","série 1")." " ;
00546 echo "(".href("../internet/tds.php#cours1","énoncé") ;
00547 echo ", ".href("../internet/solutions.php#cours1","solution").")." ;
00548 echo " On pourra aussi consulter l'exercice 1 de notre cours " ;
00549 echo href("../Farcompr/sac.htm","FarCompr").", partie stockage " ;
00550 echo " (".href("../Farcompr/sacex.htm#p1","énoncé").",".href("../Farcompr/sacor.htm#p1","solution")."). " ;
00551 finp() ;
00552
00553 p("texte") ;
00554 echo "Pour retrouver les fichiers des archives, il suffit d'utiliser un décompresseur comme ".b("unzip")." par exemple : " ;
00555 finp() ;
00556
00557 pre_fichier("boncourage.listes.txt","cadre") ;
00558
00559 p("texte") ;
00560 echo "Les «vrais» fichiers pour ".b("Open Office")." et ".b("Microsoft Office") ;
00561 echo " sont nommés respectivement ".href("content.xml")." et ".href("word/document.xml","document.xml")." :" ;
00562 finp() ;
00563
00564 pre_fichier("boncourage.files.txt","cadre") ;
00565
00566 p("texte") ;
00567 echo " Si la ".href("http://fr.wikipedia.org/wiki/OpenDocument","documentation")." du Wiki français détaille ce que sont les fichiers ".b("Open Document").", ";
00568 echo " elle ne dit rien sur ce qu'est le format ".b(".FODT")." alors que la ".href("http://en.wikipedia.org/wiki/OpenDocument_technical_specification","documentation") ;
00569 echo " du Wiki anglais explique qu'il s'agit d'un format «à plat» (non compressé) monobloc (tout en un seul fichier). On pourra le vérifier en consultant " ;
00570 echo href("boncourage.fodt")." (judicieusement recopié en ".href("boncourage_fodt.xml").") dont le contenu est :" ;
00571 finp() ;
00572
00573 pre_fichier("boncourage.fodt.txt","cadre") ;
00574
00575 p("texte") ;
00576 echo "Le format ".b("CSV")." est un format texte délimité dont le séparateur par défaut est ".s_span("la virgule","gvert")." en mode EN et ".s_span("le point-virgule","gvert")." en modeFR. " ;
00577 echo "Le ".href("http://en.wikipedia.org/wiki/Comma-separated_values","wiki anglais")." et le ".href("http://fr.wikipedia.org/wiki/Comma-separated_values","wiki français") ;
00578 echo " ne fournissent pas exactement les mêmes informations sur ce format :" ;
00579 finp() ;
00580
00581 pre_fichier("tableur_data.csv.txt","cadre") ;
00582
00583 p("texte") ;
00584 echo "Là encore, les formats ".s_span("ODS","gvert")." et ".s_span("XLSX","gvert")." correspondent à des archives de fichiers ".s_span("XML","grouge")." :" ;
00585 finp() ;
00586
00587 pre_fichier("tableur_data.files.txt","cadre") ;
00588
00589 p("texte") ;
00590 echo "Pour ".s_span("Open Office","gvert").", le «vrai» fichier est ".href("Ods/content.xml","content.xml") ;
00591 echo " ; pour ".s_span("Microsoft Office","gvert").", le «vrai» fichier utilise ".href("Excel/xl/worksheets/sheet1.xml","sheet1.xml") ;
00592 echo " et ".href("Excel/xl/sharedStrings.xml","sharedStrings.xml")."." ;
00593 finp() ;
00594
00595 finsolution() ;
00596
00597 finblockquote() ;
00598
00599 ## -------------------------------------------------------------------------------------------
00600
00601
00602 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Formats XML usuels en bioinformatique
00603
00604 ## -------------------------------------------------------------------------------------------
00605
00606 blockquote() ;
00607
00608
00609 p("texte") ;
00610 echo "Le ".bleu("NCBI")." est un institut national américain qui fournit de nombreuses ressources en bioinformatique. " ;
00611 echo "Cherchez sur la page principale du site dans la base de données des protéines, le mot ".b("AAA18335")." puis le mot ".b("424143").". " ;
00612 echo "Comment est affichée la séquence en acides aminés de la protéine correspondante ? " ;
00613 finp() ;
00614
00615 p("texte") ;
00616 echo "Afin d'éviter d'encombrer les serveurs, le ".bleu("NCBI")." propose un script pour accéder aux protéines nommé ".b("efetch").". Après avoir lu " ;
00617 echo " la documentation correspondante, trouvez la syntaxe associée à la demande du fichier ".rouge("XML")." complet (".b("«Genpept»").") pour la protéine précédente. " ;
00618 echo " Comment est stockée la séquence en acides aminés de la protéine correspondante ? " ;
00619 echo " Et si on se focalise sur la séquence ".b("Fasta")." (via le format ".b("«TinySeq»")."), que faut-il changer au niveau du script ? " ;
00620 finp() ;
00621
00622 p("texte") ;
00623 echo bleu("UNIPROT")." est un un autre centre international dédié à la bioinformatique. Cherchez la protéine précédente dans la base de connaissances des protéines. " ;
00624 echo "Comment fait-on pour voir le fichier ".rouge("XML")." correspondant ? " ;
00625 echo " Comment est stockée la séquence en acides aminés de la protéine correspondante ? " ;
00626 echo " A quoi correspond le format ".b("RDF")." proposé en haut et à droite du format ".rouge("XML")." dans la page Web de visualisation de la protéine ? " ;
00627 finp() ;
00628
00629 solution($numExo) ;
00630
00631 p("texte") ;
00632 echo "L'adresse officielle du NCBI est ".href("http://www.ncbi.nlm.nih.gov/").". " ;
00633 echo "Il faut choisir la base de données ".b("«Protein»")." parmi celles proposées sur la page d'accueil pour faire l'exercice. " ;
00634 finp() ;
00635
00636 p("texte") ;
00637 echo " Il est aussi possible d'utiliser directement l'adresse ".href("http://www.ncbi.nlm.nih.gov/protein/")." pour restreindre la recherche aux protéines dans cette base de données. " ;
00638 echo " L'utilisation du panneau d'interrogation avec les deux références " ;
00639 echo b("AAA18335")." et ".b("424143")." fournit deux URL différentes, " ;
00640 echo href("http://www.ncbi.nlm.nih.gov/protein/AAA18335"). " et " ;
00641 echo href("http://www.ncbi.nlm.nih.gov/protein/424143")." mais qui contiennent exactement les mêmes informations car elles correspondent à la même protéine " ;
00642 echo b("HSP 27 [Mus musculus]").". " ;
00643 finp() ;
00644
00645 p("texte") ;
00646 echo "Si on cherche ".b("ncbi efetch")." avec Google, on obtient la page d'aide à l'adresse " ;
00647 #echo href("http://ww.ncbi.nlm.nih.gov/entrez/query/static/efetchseq_help.html").". " ;
00648 echo href("http://www.ncbi.nlm.nih.gov/books/NBK25499/#chapter4.EFetch").". " ;
00649 echo "Une lecture attentive de la page ciblée sur l'expression ".b("db=protein")." permet de voir qu'il y a deux appels possibles du script cgi, " ;
00650 echo " l'un nommé gp qui correspond au format complet Genpept et l'autre nommé fasta, qui correspond à TinySeq. " ;
00651 echo "Les URL correspondantes sont : " ;
00652 echo href("http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=protein&id=424143&rettype=gp&retmode=xml") ;
00653 echo " et " ;
00654 echo href("http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=protein&id=424143&rettype=fasta&retmode=xml").". " ;
00655 echo "On note bien évidemment que l'URL se termine par ".b("retmode=xml")." de façon à obtenir un fichier $XML." ;
00656 echo " La première URL renvoie un fichier ".b("sequence.gbx.xml")." de DTD ".bleu("GBSet") ;
00657 echo " dont le contenu est consultable ".href("Ncbi/AAA18335.sequence.gbx.xml","ici") ;
00658 echo " alors que la seconde renvoie un fichier ".b("sequence.fasta.xml")." de DTD ".bleu("TSeqSet") ;
00659 echo " dont le contenu est consultable ".href("Ncbi/AAA18335.sequence.fasta.xml","là").". " ;
00660 finp() ;
00661
00662 p("texte") ;
00663 echo "Pour Uniprot, dont le site officiel est ".href("http://www.uniprot.org/").", une recherche dans la PK (Protein KnowledgeBase) nommée UniProtKB " ;
00664 echo " ne donne aucune réponse satisfaisante pour 424143 " ;
00665 echo " (soit l'URL ".href("http://www.uniprot.org/uniprot/?query=424143")."). " ;
00666 echo " Par contre, avec AAA18335 nous pouvons retrouver la protéine " ;
00667 echo b("HSP 27 [Mus musculus]")." : " ;
00668 echo href("http://www.uniprot.org/uniprot/?query=AAA18335").". " ;
00669 echo " Son numéro de référence pour Uniprot est P14602, ce qui permet de construire l'URL de la page de visualisation " ;
00670 echo href("http://www.uniprot.org/uniprot/P14602").", " ;
00671 echo " celle de son fichier $XML " ;
00672 echo href("http://www.uniprot.org/uniprot/P14602.xml") ;
00673 echo ", celle de son fichier RDF : " ;
00674 echo href("http://www.uniprot.org/uniprot/P14602.rdf") ;
00675 echo " et même celle de son fichier FASTA si on en a besoin : " ;
00676 echo href("http://www.uniprot.org/uniprot/P14602.fasta") ;
00677 echo ". " ;
00678 finp() ;
00679
00680 p("texte") ;
00681 echo "Voici les structures utilisées pour stocker les séquences ".b("Fasta")." (des retours-charriot ont été ajoutés pour la lisibilité) : " ;
00682 finp() ;
00683
00684 pre_fichier("AAA18335.txt","cadre") ;
00685
00686 p("texte") ;
00687 echo "On peut remarquer que les suites d'acides aminés sont toujours stockées comme le contenu texte d'un élément, jamais comme un attribut. " ;
00688 echo " Pour Uniprot, des outils de vérification comme la longueur de la séquence et sa \"checksum\" sont fournies comme attribut. " ;
00689 finp() ;
00690
00691 p("texte") ;
00692 echo "Le fichier RDF associé à la protéine, soit " ;
00693 echo href("http://www.uniprot.org/uniprot/P14602.rdf") ;
00694 echo " permet d'appliquer les concepts du ".href("http://fr.wikipedia.org/wiki/Web_s%C3%A9mantique","web sémantique")." aux données d'Uniprot." ;
00695 finp() ;
00696
00697 finsolution() ;
00698
00699 finblockquote() ;
00700
00701 ## -------------------------------------------------------------------------------------------
00702
00703 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Bases de données et XML ; espaces de noms
00704
00705 ## -------------------------------------------------------------------------------------------
00706
00707
00708 blockquote() ;
00709
00710 p("texte") ;
00711 echo "Peut-on facilement exporter une base de données ".vert("MySQL")." en ".rouge("XML")." ? " ;
00712 finp() ;
00713
00714 p("texte") ;
00715 echo "Application : exporter la base ".b("GESTION")." qui contient les 4 tables ".b("FOUR, CLI, ART")." et ".b("CMD")." de notre ".href("../tuteurs/tutmysql.htm","tuteur MySql").". " ;
00716 echo " Un script qui permet de recréer les tables et leur contenu est ".href("BD_gestion_mysql.txt","BD_gestion_mysql").". " ;
00717 finp() ;
00718
00719 p("texte") ;
00720 echo "On peut imaginer qu'une mauvaise conception d'une base de données ait abouti " ;
00721 echo " à un champ ".b("NOM")." pour le nom d'un fournisseur, ";
00722 echo " à un champ ".b("NOM")." pour le nom d'un client " ;
00723 echo " et à un champ ".b("NOM")." pour le nom d'un article. " ;
00724 echo " Si on veut que ces trois noms soient désignés de façon différente, trouver une solution avec des attributs " ;
00725 echo " qui conserve la désignation ".b("<NOM>")." puis montrer comment les notions de " ;
00726 echo href("http://en.wikipedia.org/wiki/Namespace","namespace")." et de ".href("http://en.wikipedia.org/wiki/XML_namespace","XML namespace") ;
00727 echo " permettent de " ;
00728 echo " «bien» gérer cette mauvaise conception." ;
00729 echo " On pourra, pour tester la solution, utilisera comme point de départ le fichier de test ".href("noms.xml")."." ;
00730 finp() ;
00731
00732 solution($numExo) ;
00733
00734 p("texte") ;
00735 echo "Si on lit l'aide de la commande ".b("mysql_dump").", dont une copie est ".href("mysql_dump.txt","ici").", on peut voir qu'il existe une option de sortie nommé ".b("--xml").". " ;
00736 echo " Ainsi, la commande ".b("sqldump --xml --database gestion > BD_gestion_mysql.xml")." produit le fichier " ;
00737 echo href("BD_gestion_mysql.xml").". On remarquera que chaque table donne lieu à deux éléments nommés respectivement " ;
00738 echo s_span("table_structure","gbleu")." et ".s_span("table_data","gbleu").", eux-mêmes inclus dans un élément " ;
00739 echo s_span("database","gbleu").", ce qui montre qu'on pourrait \"dumper\" plusieurs bases de données d'un coup. " ;
00740 finp() ;
00741
00742 p("texte") ;
00743 echo " La structuration utilisée pour les tables, qui peut s'apliquer à n'importe quelle table puisqu'elle nomme les éléments " ;
00744 echo "ligne (".s_span("row","gbleu").") et champ (".s_span("field","gbleu")."), n'est sans doute pas la plus adaptée à un traitement efficace des données. " ;
00745 echo "Par exemple, au lieu de " ;
00746 finp() ;
00747
00748 pre_fichier("rowgestion1.txt","cadre") ;
00749
00750 p("texte") ;
00751 echo " il serait sans doute plus explicite d'utiliser " ;
00752 finp() ;
00753
00754 pre_fichier("rowgestion2.txt","cadre") ;
00755
00756 # namespace wiki français et doc w3c citée. détailler...
00757
00758 p("texte") ;
00759 echo "Pour utiliser des ".b("namespaces").", il suffit de définir leurs préfixes au niveau de l'élément racine et d'utiliser ensuite les préfixes là " ;
00760 echo " où on en a besoin. Le fichier ".href("nomsAvecNs.xml")." contient une solution avec des préfixes courts et " ;
00761 echo href("nomsAvecNsLongs.xml")." contient une solution avec des préfixes longs. Si le gain en lisibilité et en non-ambiguité n'est " ;
00762 echo " pas si flagrant que cela (après tout, ".b("<fournisseur>...<f:nom>")." est suffisamment explicite), l'utilité de la notion d'espace de " ;
00763 echo " de noms se comprend mieux quand, après une transformation, les différents éléments sont intégrés dans un seul et même fichier. Ainsi " ;
00764 echo " le fichier ".href("gestionSansNs.xml")." suivant " ;
00765 finp() ;
00766
00767 pre_fichier("gestionSansNs.xml","cadre") ;
00768
00769 p("texte") ;
00770 echo " comporte des ambiguités là où " ;
00771 echo " le fichier ".href("gestionAvecNs.xml")." dont le contenu est listé ci-dessous " ;
00772 finp() ;
00773
00774 pre_fichier("gestionAvecNs.xml","cadre") ;
00775
00776 p("texte") ;
00777 echo " n'en a aucune." ;
00778 finp() ;
00779
00780 finsolution() ;
00781
00782 finblockquote() ;
00783
00784 ## -------------------------------------------------------------------------------------------
00785
00786 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Dessins et XML
00787
00788 ## -------------------------------------------------------------------------------------------
00789
00790
00791 blockquote() ;
00792
00793 p("texte") ;
00794 echo "On structure un ".bleu("dessin 2D")." élémentaire selon les règles suivantes. " ;
00795 echo " Un dessin est un cercle, un rectangle ou un triangle. " ;
00796 echo " Un cercle est défini par un centre et un rayon, " ;
00797 echo " un rectangle par son ".em("csg")." (coin supérieur gauche), une longueur et une largeur, " ;
00798 echo " un triangle par trois points. " ;
00799 echo " Chaque élément graphique peut avoir une couleur parmi les mots prédéfinis bleu, rouge, jaune. " ;
00800 echo " Ecrire un fichier ".b("dessin.xml")." qui dans un " ;
00801 echo href(wikien("Viewport"),"viewport")." bleu de 500 pixels de large et 300 de haut, met un \"soleil\" jaune de rayon 15 pixels en (450,50), " ;
00802 echo " une plage rectangulaire verte qui fait toute la largeur et qui fait 100 pixels de haut. " ;
00803 echo " Pour les plus fort(e)s, rajouter une petite étoile de mer rouge en bas à gauche à l'aide de trois triangles bien choisis. " ;
00804 echo " A défaut, on placera juste un triangle plein et en rouge. " ;
00805 echo " On pourra s'inspirer du dessin ci-dessous et de la syntaxe ".href("http://www.w3.org/Graphics/SVG/IG/resources/svgprimer.html#examples","SVG")."." ;
00806 finp() ;
00807
00808 p() ;
00809 nbsp(30) ;
00810 echo href("dessin2.png",img("dessin2.png","",200)) ;
00811 finp() ;
00812
00813 p("texte") ;
00814 echo " Ecrire ensuite la \"vraie\" version en ".b("SVG")." de ce dessin. " ;
00815 finp() ;
00816
00817 p("texte") ;
00818 echo "Lister tous les éléments $XML distincts utilisés dans le ".href("Svg/firefox-logo.svg","logo du renard")." ci-dessous, puis " ;
00819 echo " compter tous les éléments avec leurs attributs. " ;
00820 finp() ;
00821
00822 p() ;
00823 nbsp(30) ;
00824 echo href("Svg/firefox.svg",img("firefox-logo.jpg","",200)) ;
00825 finp() ;
00826
00827 p("texte") ;
00828 echo "Expliquer comment on obtient un rendu \"propre et intéressant\" des horaires de " ;
00829 echo href("http://www.celcat.fr/","CELCAT")." par exemple pour les " ;
00830 echo href("http://celcat.univ-angers.fr/web/publi/etu/g141908.html","horaires")." de ce cours." ;
00831 finp() ;
00832
00833 p() ;
00834 nbsp(30) ;
00835 echo href("horairesM1.png",img("horairesM1.png","",250)) ;
00836 finp() ;
00837
00838 p("texte") ;
00839 echo "Expliquer comment on obtient un affichage dynamique de données hiérarchiques avec " ;
00840 echo href("http://krona.sourceforge.net/examples/du.krona.html","Krona").". " ;
00841 finp() ;
00842
00843 p() ;
00844 nbsp(30) ;
00845 $img = "krona_demo.svg" ;
00846 echo href($img,img($img,"",250)) ;
00847 finp() ;
00848 pvide() ;
00849
00850 solution($numExo) ;
00851
00852 p("texte") ;
00853 echo "Voici un fichier $XML possible pour le dessin avec une syntaxe en français adaptée de SVG, nommé ".href("dessin.xml") ;
00854 finp() ;
00855
00856 pre_fichier("dessin.xml","cadre") ;
00857
00858 p("texte") ;
00859 echo "La \"vraie\" version dont un rendu est dans ".href("Svg/dessin1.svg","dessin1.svg")." est la suivante " ;
00860 finp() ;
00861
00862 pre_fichier("Svg/dessin1.svg","cadrebleu") ;
00863
00864 p("texte") ;
00865 echo "Et pour le dessin avec l'étoile ".href("Svg/dessin2.svg","dessin2.svg")." on peut utiliser " ;
00866 finp() ;
00867
00868 pre_fichier("Svg/dessin2.svg","cadrejaune") ;
00869
00870 blockquote() ;
00871 table(1,15,"collapse") ;
00872 tr() ;
00873 td() ; echo "Rendu SVG (si le browser le permet)" ; fintd() ;
00874 td() ; echo "<object data='Svg/dessin1.svg' width='500' />\n" ; fintd() ;
00875 td() ; echo "<object data='Svg/dessin2.svg' width='500' />\n" ; fintd() ;
00876 fintr() ;
00877 tr() ;
00878 td() ; echo "Rendu PNG (copie d'écran)" ; fintd() ;
00879 td() ; echo img("dessin1.png","dessin1","500") ; fintd() ;
00880 td() ; echo img("dessin2.png","dessin2","500") ; fintd() ;
00881 fintr() ;
00882 fintable() ;
00883 finblockquote() ;
00884
00885 p("texte") ;
00886 echo "Il y a en fait assez peu d'éléments utilisés pour le renard. Ainsi la commande " ;
00887 echo b("xmlstarlet el -u firefox.svg")." renvoie une liste de 26 éléments distincts dans l'arbre, pour 348 éléments en tout. " ;
00888 echo "Si on retire les éléments égaux emboités comme g et g/g, il ne reste que 17 \"vrais\" éléments utilisés :" ;
00889 finp() ;
00890
00891 # manip pour produire firefox.elts :
00892 # xmlstarlet el -u > firefox.1
00893 # ménage à la main (sedit) pour produire firefox.2
00894 # numerote firefox.1 entete=1 > a
00895 # numerote firefox.2 entete=1 > b
00896 # fusionne a b 65 et voilà !
00897
00898 pre_fichier("firefox.elts","cadre") ;
00899
00900 p("texte") ;
00901 echo "Pour connaitre les attributs utilisés et pour compter chacun des éléments, il faut programmer le comptage des balises d'ouverture et de fermeture, " ;
00902 echo " ce que fait notre programme ".href("montresource.php?nomfic=eltatt_inc.php","eltattres.php")." dont l'interface de départ est ".href("../internet/eltatt.php","ici")."." ;
00903 echo " On pourra cliquer sur le lien ".href("../internet/eltattres.php?url=http://forge.info.univ-angers.fr/~gh/Webrd/Svg/firefox-logo.svg&envoi=envoi","elementsRenard") ;
00904 echo " pour le vérifier et lire les comptages." ;
00905 finp() ;
00906
00907 p("texte") ;
00908 echo "L'affichage fourni par ".b("CELCAT")." est un simple " ;
00909 echo href("http://fr.openclassrooms.com/informatique/cours/structurez-vos-donnees-avec-xml/mettez-en-forme-vos-documents-xml-avec-css","rendu de $XML avec CSS").". " ;
00910 finp() ;
00911
00912 p("texte") ;
00913 echo "Pour " ;
00914 echo href("http://sourceforge.net/p/krona/home/krona/","krona").", " ;
00915 echo " c'est un peu plus compliqué. " ;
00916 echo " Il y a du code Javascript " ;
00917 echo href("https://searchcode.com/codesearch/view/25755216/","krona.js") ;
00918 echo " qui lit la partie $XML de la page HTML et qui produit le graphique interactif " ;
00919 echo " dans un élément ".href("http://www.alsacreations.com/tuto/lire/1484-introduction.html","canvas").". " ;
00920 echo " L'export, lui, est un \"snapshot\" généré pour ".b("SVG").". " ;
00921 finp() ;
00922
00923 finsolution() ;
00924
00925 finblockquote() ;
00926
00927 ## -------------------------------------------------------------------------------------------
00928
00929 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # XML et le logiciel R
00930
00931 ## -------------------------------------------------------------------------------------------
00932
00933 blockquote() ;
00934
00935 p("texte") ;
00936 echo "Parmi les logiciels vus en ligne de commande, lesquel(s) savent lire des fichiers sur internet via une URL ? " ;
00937 finp() ;
00938
00939 p("texte") ;
00940 echo "Après avoir parcouru l'".href("../wstat/Introduction_R/","introduction non élémentaire au logiciel $R").", " ;
00941 echo " est-ce que le logiciel $R sait lire des fichiers sur internet via une URL ? " ;
00942 echo " Et des fichiers $XML ? " ;
00943 finp() ;
00944
00945 p("texte") ;
00946 echo " Comment faire avec $R pour récupérer le contenu d'un tableau dans une page Web ? " ;
00947 finp() ;
00948
00949 solution($numExo) ; # ------------------------------------------------------------------------
00950
00951 p("texte") ;
00952 echo b("rxp").", " ;
00953 echo b("xmllint").", " ;
00954 echo b("xmlstarlet")." et " ;
00955 echo b("xsltproc")." " ;
00956 echo " savent tous lire des fichiers sur internet via une URL. " ;
00957 finp() ;
00958
00959 p("texte") ;
00960 echo "La lecture des fichiers via une URL est une simple formalité en $R car elle est native." ;
00961 finp() ;
00962
00963 p("texte") ;
00964 echo "A l'aide du package nommé ".s_span("XML","gbleuf").", la lecture de fichiers $XML de pages Web est très facile. " ;
00965 echo " Consulter la solution de l'".href("../wstat/Introduction_R/intror2.php?solutions=1#tdm5","exercice 5")." dans " ;
00966 echo " l'".href("../wstat/Introduction_R/","introduction non élémentaire au logiciel $R")." pour voir cela par l'exemple. " ;
00967 finp() ;
00968
00969 $url = "http://www.springer.com/us/book/9781461478997" ;
00970 p("texte") ;
00971 echo " Pour vraiment plus de détails, on pourra lire les 650 pages de l'excellent ouvrage " ;
00972 echo " ".href($url,"XML and Web Technologies for Data Sciences with R") ;
00973 echo " de D. Nolan et D. Temple Lang :" ;
00974 finp() ;
00975
00976 $img = "lang.jpg" ;
00977 p("texte") ;
00978 echo href($url,img($img,$img,250)) ;
00979 finp() ;
00980
00981 p("texte") ;
00982 echo "Pour une vision précise des rapports entre $R et les technologies Web, le mieux est sans doute de lire la " ;
00983 echo "«".href("https://cran.r-project.org/web/views/",em("Task View"))."»" ;
00984 echo " nommée " ;
00985 echo href("https://cran.r-project.org/web/views/WebTechnologies.html","WebTechnologies.html")." " ;
00986 echo " et sa petite soeur sur l'".href("https://github.com/ropensci/opendata","opendata")." (sur Github)." ;
00987 finp() ;
00988
00989 p("texte") ;
00990 echo b("Remarque :") ;
00991 echo " il est possible d'apprendre à utiliser $R (et Python) sans installation logicielle via " ;
00992 echo href("https://www.getdatajoy.com/","DataJoy")."." ;
00993 finp() ;
00994
00995 finsolution() ;
00996
00997 finblockquote() ;
00998
00999 ## -------------------------------------------------------------------------------------------
01000
01001 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Questions diverses
01002
01003 ## -------------------------------------------------------------------------------------------
01004
01005 blockquote() ;
01006
01007 p("texte") ;
01008 echo "Faut-il indenter les fichiers ? " ;
01009 finp() ;
01010
01011 p("texte") ;
01012 echo "Quel navigateur Web est le plus adapté à l'affichage de fichiers $XML ? " ;
01013 finp() ;
01014
01015 p("texte") ;
01016 echo "Quels éditeurs peut-on utiliser pour $XML, sous Linux, sous Windows ? " ;
01017 finp() ;
01018
01019 p("texte") ;
01020 echo "Qu'est-ce qu'une structure mixte ? Pourquoi faut-il éviter les structures mixtes ? " ;
01021 finp() ;
01022
01023 p("texte") ;
01024 echo "Une page Web est-elle un document $XML ? " ;
01025 finp() ;
01026
01027 p("texte") ;
01028 echo "Une fichier ".href("http://xulfr.org/xulplanet/mozsdk/rdfstart.html","RDF")." est-il un document $XML ? " ;
01029 echo " Et une image ".href("http://fr.wikipedia.org/wiki/Scalable_Vector_Graphics","SVG")." ? " ;
01030 finp() ;
01031
01032 p("texte") ;
01033 echo "Pourquoi s'intéresser plus à $XML 1.0 qu'à $XML 1.1 ? Quelles sont les différences ?" ;
01034 finp() ;
01035
01036 p("texte") ;
01037 echo "Est-ce que HTML5 est un langage basé sur $XML ? " ;
01038 finp() ;
01039
01040 solution($numExo) ; # ------------------------------------------------------------------------
01041
01042 p("texte") ;
01043 echo "Il n'est pas conseillé d'indenter, dans la mesure où les espaces et les retours-charriots, les tabulations... " ;
01044 echo " désignés par l'appellation ".b("white spaces")." sont souvent mal gérés ou gérés différemment suivant " ;
01045 echo " les logiciels, et en particulier les navigateurs, certains créant des noeuds-texte pour contenir ces espaces et assimilés. " ;
01046 echo " On pourra s'en convaincre en ouvrant avec divers navigateurs les deux fichiers " ;
01047 echo href("whitespace1.xml","whitespace1")." et ".href("whitespace2.xml","whitespace2")." qui ne différent que par des espaces et des retours-charriots. " ;
01048 echo " Si on indente, par contre, il faut toujours indenter de la même façon." ;
01049 echo " Normaliser les espaces, les tabulations, les retours à la ligne, voire stocker les attributs par ordre alphabétique " ;
01050 echo " revient à utiliser une ".href("http://en.wikipedia.org/wiki/Canonical_XML","forme canonique")." pour les fichiers $XML." ;
01051 finp() ;
01052
01053
01054 p("texte") ;
01055 echo "Un fichier de ".href("http://fr.wikipedia.org/wiki/Resource_Description_Framework","description de ressources")." RDF n'est pas forcément un " ;
01056 echo " un fichier $XML, car RDF et le " ;
01057 echo href("http://fr.wikipedia.org/wiki/Web_s%C3%A9mantique","web sémantique")." utilisent de nombreux formats, parfois " ;
01058 echo " $XML et parfois non $XML comme les formats ".href("http://fr.wikipedia.org/wiki/Turtle_%28syntaxe%29","turtle")." et " ;
01059 echo href("http://fr.wikipedia.org/wiki/Notation3","Notation3").". " ;
01060 echo " On écrit RDF/XML lorsqu'on veut indiquer que les ressources sont écrites en format $XML. " ;
01061 echo " Une image SVG est aussi un fichier $XML mais qui est interprété dès son ouverture pour fournir un rendu graphique. " ;
01062 echo " Ainsi, ouvrir ".href("exemple.rdf")." et ".href("exemple.svg")." avec un navigateur ne produit pas les mêmes effets : " ;
01063 echo " le fichier RDF est affiché comme un fichier $XML classique, le fichier SVG est dessiné à l'écran. " ;
01064 finp() ;
01065
01066 p("texte") ;
01067 echo "Les notions vues et les explications fournies en cours " ;
01068 echo "(volontairement non reproduites ici) " ;
01069 echo " permettent de répondre aux questions liées à $XML 1.1 et HTML5." ;
01070 finp() ;
01071
01072 /*
01073 http://blog.adriaandejonge.eu/2008/08/differences-between-xml-10-and-11.html
01074 http://xmlfr.org/actualites/tech/080207-0001
01075 http://xmlfr.org/actualites/decid/021022-0001
01076 http://xmlfr.org/actualites/decid/040210-0002
01077 http://www.rapidprogramming.com/questions-answers/What-is-the-difference-between-XML-1-1-and-XML-1-0--471
01078 */
01079
01080 finsolution() ;
01081
01082 finblockquote() ;
01083
01084
01085 ## -------------------------------------------------------------------------------------------
01086
01087 finPageExercices(1) ; # contient finSection() et finPage() ; la fonction est dans webrd_inc.php
01088
01089 ?>
Retour à la page principale de (gH)