Valid XHTML     Valid CSS2    

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 
;
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 
;
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&nbsp;: " 
;
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.$dtdfintd() ;
00114       fintr
() ;
00115       tr
() ;
00116         td
() ; echo href("adn.xml")                                 ; fintd() ;
00117         td
() ; echo "fichier $xml invalide pour la grammaire id.$dtdfintd() ;
00118       fintr
() ;
00119       tr
() ;
00120         td
() ; echo href("id.dtd")                  ; fintd() ;
00121         td
() ; echo "fichier grammaire de type $dtdfintd() ;
00122       fintr
() ;
00123       tr
() ;
00124         td
() ; echo href("axv.xml")                               ; fintd() ;
00125         td
() ; echo "fichier $xml valide pour la grammaire id.$xsdfintd() ;
00126       fintr
() ;
00127       tr
() ;
00128         td
() ; echo href("axn.xml")                                 ; fintd() ;
00129         td
() ; echo "fichier $xml invalide pour la grammaire id.$xsdfintd() ;
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 .$xslfintd() ;
00138       fintr
() ;
00139       tr
() ;
00140         td
() ; echo href("cours.xsl")                            ; fintd() ;
00141         td
() ; echo "fichier $xml qui est une transformation $xslfintd() ;
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&nbsp;: " ;
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")."&nbsp;: " ;
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&nbsp;: " 
;
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&nbsp;: " 
;
00210     echo b
("iconv -f ISO_8859-15 -t UTF-8 fichier_original &gt; 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é&nbsp;? 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é&nbsp;? Si on nomme "
.s_span("numService","grouge")." cette donnée, comment l'implémenter&nbsp;? " ;
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&nbsp;? " 
;
00263     finp
() ;
00264     
00265     solution
($numExo) ;
00266     
00267     p
() ;
00268     echo "Voici les fichiers solutions&nbsp;: " 
;
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 &laquo;à la main&raquo; 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&nbsp;: il existe deux façons de coder des éléments auto-fermants et il vaut mieux utiliser toujours le m&ecirc;me " ;
00307     echo " m&ecirc;me codage à l'intérieur d'un m&ecirc;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&ecirc;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&ucirc;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 &laquo;panachée&raquo; 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&nbsp;? " ;
00355     finp
() ;
00356     
00357     p
("texte") ;
00358     echo "Y a-t-il une structuration meilleure qu'une autre pour cet exemple&nbsp;? " 
;
00359     finp
() ;
00360     
00361     p
("texte") ;
00362     echo "Qu'est-ce que "
.b("XCARD")."&nbsp;? Quel rapport avec ".b("VCARD")." et ".b("XML")."&nbsp;? " ;
00363     echo " Que sont  "
.rouge("RFC-6350")." et ".rouge("RFC-63511")."&nbsp;? " ;
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&ecirc;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"),"&laquo;appel à commentaires&raquo;")." 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&nbsp;: " 
;
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&nbsp;? " ;
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&nbsp;? Sous quelle forme, élément ou attribut&nbsp;? " 
;
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 &laquo;panachée&raquo; ("
.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")."&nbsp;:" ;
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&nbsp;? " ;
00498     finp
() ;
00499     
00500     p
("texte") ;
00501     echo "Ecrire le texte "
."&laquo;Bon ".b("courage")." à " ;
00502     echo s_span
("tous","bleu")." et à ".bleu("toutes")."&raquo; -- 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&ecirc;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&nbsp;? A quoi correspond le format "
.b(".FODT")."&nbsp;?" ;
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")."&nbsp;:" ;
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)&nbsp;:" ;
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 &ecirc;tre lus directement. Seul le format ".vert(".RTF") ;
00537     echo " est lisible, si l'on peut dire. En voici le contenu&nbsp;:" 
;
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&nbsp;: " ;
00555     finp
() ;
00556     
00557     pre_fichier
("boncourage.listes.txt","cadre") ;
00558     
00559     p
("texte") ;
00560     echo "Les &laquo;vrais&raquo; 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")."&nbsp;:" ;
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 &laquo;à plat&raquo; (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&nbsp;:" ;
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&ecirc;mes informations sur ce format&nbsp;:" 
;
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")."&nbsp;:" ;
00585     finp
() ;
00586     
00587     pre_fichier
("tableur_data.files.txt","cadre") ;
00588     
00589     p
("texte") ;
00590     echo "Pour "
.s_span("Open Office","gvert").", le &laquo;vrai&raquo; fichier est ".href("Ods/content.xml","content.xml") ;
00591     echo "&nbsp;; pour "
.s_span("Microsoft Office","gvert").", le &laquo;vrai&raquo; 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&nbsp;? " 
;
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("&laquo;Genpept&raquo;").") 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&nbsp;? " 
;
00619     echo " Et si on se focalise sur la séquence "
.b("Fasta")." (via le format ".b("&laquo;TinySeq&raquo;")."), que faut-il changer au niveau du script&nbsp;? " ;
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&nbsp;? " ;
00625     echo " Comment est stockée la séquence en acides aminés de la protéine correspondante&nbsp;? " 
;
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&nbsp;? " ;
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("&laquo;Protein&raquo;")." 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&ecirc;mes informations car elles correspondent à la m&ecirc;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&nbsp;: " 
;
00652     echo href
("http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=protein&amp;id=424143&amp;rettype=gp&amp;retmode=xml") ;
00653     echo " et " 
;
00654     echo href
("http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=protein&amp;id=424143&amp;rettype=fasta&amp;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]")."&nbsp;: " ;
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&nbsp;: " 
;
00674     echo href
("http://www.uniprot.org/uniprot/P14602.rdf") ;
00675     echo " et m&ecirc;me celle de son fichier FASTA si on en a besoin&nbsp;: " 
;
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é)&nbsp;: " ;
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")."&nbsp;? " ;
00712     finp
() ;
00713     
00714     p
("texte") ;
00715     echo "Application&nbsp;: 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("&lt;NOM&gt;")." 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 " &laquo;bien&raquo; 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&ecirc;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("&lt;fournisseur&gt;...&lt;f:nom&gt;")." 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&ecirc;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&nbsp;:" 
;
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&amp;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&nbsp;? " 
;
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&nbsp;? " ;
00942     echo " Et des fichiers 
$XML&nbsp;? " ;
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&nbsp;? " ;
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&nbsp;:" 
;
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 "&laquo;"
.href("https://cran.r-project.org/web/views/",em("Task View"))."&raquo;" ;
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&nbsp;:") ;
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&nbsp;? " 
;
01009     finp
() ;
01010     
01011     p
("texte") ;
01012     echo "Quel navigateur Web est le plus adapté à l'affichage de fichiers 
$XML&nbsp;? " ;
01013     finp
() ;
01014     
01015     p
("texte") ;
01016     echo "Quels éditeurs peut-on utiliser pour 
$XML, sous Linux, sous Windows&nbsp;? " ;
01017     finp
() ;
01018     
01019     p
("texte") ;
01020     echo "Qu'est-ce qu'une structure mixte&nbsp;? Pourquoi faut-il éviter les structures mixtes&nbsp;? " 
;
01021     finp
() ;
01022     
01023     p
("texte") ;
01024     echo "Une page Web est-elle un document 
$XML&nbsp;?  " ;
01025     finp
() ;
01026     
01027     p
("texte") ;
01028     echo "Une fichier "
.href("http://xulfr.org/xulplanet/mozsdk/rdfstart.html","RDF")." est-il un document $XML&nbsp;? " ;
01029     echo " Et une image "
.href("http://fr.wikipedia.org/wiki/Scalable_Vector_Graphics","SVG")."&nbsp;?  " ;
01030     finp
() ;
01031     
01032     p
("texte") ;
01033     echo "Pourquoi s'intéresser plus à 
$XML 1.0 qu'à $XML 1.1&nbsp;? Quelles sont les différences&nbsp;?" ;
01034     finp
() ;
01035     
01036     p
("texte") ;
01037     echo "Est-ce que HTML5 est un langage basé sur 
$XML&nbsp;? " ;
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&ecirc;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&ecirc;mes effets&nbsp;: " ;
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 gH    Retour à la page principale de   (gH)