Wikilivres frwikibooks https://fr.wikibooks.org/wiki/Accueil MediaWiki 1.39.0-wmf.21 first-letter Média Spécial Discussion Utilisateur Discussion utilisateur Wikilivres Discussion Wikilivres Fichier Discussion fichier MediaWiki Discussion MediaWiki Modèle Discussion modèle Aide Discussion aide Catégorie Discussion catégorie Transwiki Discussion Transwiki Wikijunior Discussion Wikijunior TimedText TimedText talk Module Discussion module Gadget Discussion gadget Définition de gadget Discussion définition de gadget Modèle:Ébauche 10 771 682220 680793 2022-07-23T09:00:10Z DavidL 1746 wikitext text/x-wiki {{Méta-bandeau-début|clear={{#if:{{{left|}}}|left|both}}|stylebandeau={{#if:{{{left|}}}|margin-left:0;|}}{{{style|}}}|class=noprint|image=OOjs UI icon edit-ltr-progressive.svg|titre=Ébauche <small>([[:Catégorie:Wikilivres:ébauches|Liste complète des ébauches]])</small>}} Cette page est considérée comme une [[Wikilivres:Ébauches à compléter|ébauche à compléter]] {{#if:{{{sujet|}}}|concernant {{{sujet|}}}}}. Si vous possédez quelques connaissances sur {{{sujet|le sujet}}}, vous pouvez les partager en éditant dès à présent cette page (en cliquant sur le lien <span class="plainlinks">'''«&nbsp;[{{fullurl:{{FULLPAGENAME}}|action=edit}} modifier]&nbsp;»'''</span>). Ressources suggérées : {{{ressources|{{{1|Aucune (vous pouvez indiquer les ressources que vous suggérez qui pourraient aider d'autres personnes à compléter cette page dans le paramètre « ressources » du modèle<sup>[[Aide:Modèles|?]]</sup> engendrant ce cadre)}}}}}} {{Méta-bandeau-fin}}<includeonly> {{#ifexpr:{{NAMESPACENUMBER}}=2 or {{NAMESPACENUMBER}}=3||{{#if:{{{nocat|}}}|| {{#if:{{{ressources|{{{1|}}}}}}||[[Catégorie:Ébauches sans ressources suggérées]]}} [[catégorie:À faire]][[Catégorie:Wikilivres:{{{cat|ébauches}}}]]}}}}</includeonly><noinclude>[[Catégorie:Modèles ébauche]] [[Catégorie:Exclure lors de l'impression]] [[Catégorie:Modèles bandeau]] </noinclude> 0k3wb4pyh2c8ilpm2jvvyczfox3k4ev 682234 682220 2022-07-23T11:52:42Z DavidL 1746 Plus adaptatif quand left=1 wikitext text/x-wiki {{Méta-bandeau-début|clear={{#if:{{{left|}}}|left|both}}|stylebandeau={{#if:{{{left|}}}|margin-left:0; width: unset; margin-right: 320px;|}}{{{style|}}}|class=noprint|image=OOjs UI icon edit-ltr-progressive.svg|titre=Ébauche <small>([[:Catégorie:Wikilivres:ébauches|Liste complète des ébauches]])</small>}} Cette page est considérée comme une [[Wikilivres:Ébauches à compléter|ébauche à compléter]] {{#if:{{{sujet|}}}|concernant {{{sujet|}}}}}. Si vous possédez quelques connaissances sur {{{sujet|le sujet}}}, vous pouvez les partager en éditant dès à présent cette page (en cliquant sur le lien <span class="plainlinks">'''«&nbsp;[{{fullurl:{{FULLPAGENAME}}|action=edit}} modifier]&nbsp;»'''</span>). Ressources suggérées : {{{ressources|{{{1|Aucune (vous pouvez indiquer les ressources que vous suggérez qui pourraient aider d'autres personnes à compléter cette page dans le paramètre « ressources » du modèle<sup>[[Aide:Modèles|?]]</sup> engendrant ce cadre)}}}}}} {{Méta-bandeau-fin}}<includeonly> {{#ifexpr:{{NAMESPACENUMBER}}=2 or {{NAMESPACENUMBER}}=3||{{#if:{{{nocat|}}}|| {{#if:{{{ressources|{{{1|}}}}}}||[[Catégorie:Ébauches sans ressources suggérées]]}} [[catégorie:À faire]][[Catégorie:Wikilivres:{{{cat|ébauches}}}]]}}}}</includeonly><noinclude>[[Catégorie:Modèles ébauche]] [[Catégorie:Exclure lors de l'impression]] [[Catégorie:Modèles bandeau]] </noinclude> 1cit74zxj75n44l1fi45mt3egkp4loy 682236 682234 2022-07-23T11:57:04Z DavidL 1746 wikitext text/x-wiki {{Méta-bandeau-début|clear={{#if:{{{left|}}}|left|both}}|stylebandeau={{{style|}}}|class=noprint {{#if:{{{left|}}}|bandeaugauche}}|image=OOjs UI icon edit-ltr-progressive.svg|titre=Ébauche <small>([[:Catégorie:Wikilivres:ébauches|Liste complète des ébauches]])</small>}} Cette page est considérée comme une [[Wikilivres:Ébauches à compléter|ébauche à compléter]] {{#if:{{{sujet|}}}|concernant {{{sujet|}}}}}. Si vous possédez quelques connaissances sur {{{sujet|le sujet}}}, vous pouvez les partager en éditant dès à présent cette page (en cliquant sur le lien <span class="plainlinks">'''«&nbsp;[{{fullurl:{{FULLPAGENAME}}|action=edit}} modifier]&nbsp;»'''</span>). Ressources suggérées : {{{ressources|{{{1|Aucune (vous pouvez indiquer les ressources que vous suggérez qui pourraient aider d'autres personnes à compléter cette page dans le paramètre « ressources » du modèle<sup>[[Aide:Modèles|?]]</sup> engendrant ce cadre)}}}}}} {{Méta-bandeau-fin}}<includeonly> {{#ifexpr:{{NAMESPACENUMBER}}=2 or {{NAMESPACENUMBER}}=3||{{#if:{{{nocat|}}}|| {{#if:{{{ressources|{{{1|}}}}}}||[[Catégorie:Ébauches sans ressources suggérées]]}} [[catégorie:À faire]][[Catégorie:Wikilivres:{{{cat|ébauches}}}]]}}}}</includeonly><noinclude>[[Catégorie:Modèles ébauche]] [[Catégorie:Exclure lors de l'impression]] [[Catégorie:Modèles bandeau]] </noinclude> aspzcz5r0llxuhl4cue6irzkf0r1nnr Le langage HTML/Images 0 1027 682233 658956 2022-07-23T09:10:23Z DavidL 1746 /* Image contenant des liens */ wikitext text/x-wiki <noinclude>{{Le langage HTML}}</noinclude> Une image est insérée avec la balise <code>img</code> en spécifiant avec l'attribut <code>src</code> ''(source)'' le chemin de l'image à inclure (sous la forme d'une adresse réticulaire, URL) et avec l'attribut <code>alt</code> l'éventuel texte de remplacement de l'image : ; HTML5/HTML <syntaxhighlight lang="html"> <img src="mon_image.png" alt="texte si l'image n'est pas affichée"> </syntaxhighlight> ; XHTML <syntaxhighlight lang="html"> <img src="mon_image.png" alt="texte si l'image n'est pas affichée" /> </syntaxhighlight> Par la suite, nous considérerons du HTML. Pour du XHTML, ajoutez simplement la barre de fraction avant la fermeture de la balise. La balise <code>img</code> peut avoir divers attributs facultatifs. Seuls les attributs <code>src</code> et <code>alt</code> sont obligatoires. * <code>align</code> : alignement de l'image (peut prendre les valeurs <code>top</code>, <code>bottom</code>, <code>middle</code>, <code>left</code> ou <code>right</code>) ; * <code>alt</code> : texte de remplacement (affiché si le navigateur ne peut afficher l'image) ; cet attribut est obligatoire, il permet notamment à un malvoyant de comprendre l'image qu'il ne peut voir (son logiciel lit le texte à voix haute ou le transforme en braille) ; * <code>title</code> : titre de l'image (s'affiche en info bulle dans le navigateur) ; * <code>border</code> : largeur de la bordure de l'image (valeur exprimée en pixels) ; * <code>height</code> : hauteur de l'image (si aucune valeur spécifiée, l'image garde sa hauteur normale) ; * <code>width</code> : largeur de l'image (si aucune valeur spécifiée, l'image garde sa largeur normale). == L'attribut <code>src</code> == L'attribut <code>src</code> contient donc l'adresse à laquelle on va chercher l'image (voir le chapitre ''[[Programmation HTML|Liens]]''). On peut utiliser une adresse absolue ou relative. Il faut cependant proscrire l'inclusion des objets (images, sons, vidéo) situés sur d'autres sites, ce que l'on appelle des « liens à chaud » ''(hot links)''. En effet, cela génère du trafic sur le serveur cible au lieu de son propre serveur, ce que le serveur cible peut considérer comme du « vol de [[w:bande passante|bande passante]] ». Par ailleurs, le fait que l'on utilise l'objet original n'implique pas un respect du [[w:droit d'auteur|droit d'auteur]] : certes on n'a pas fait de copie de l'objet, mais on utilise l'objet, et cela doit se faire avec l'accord de l'auteur et/ou de ses ayants droit. Donc, si par exemple notre page web est <code><nowiki>http://www.monsite.com/mapage.html</nowiki></code> et que l'on veut inclure l'image <code><nowiki>http://www.autresite.com/images/img1.png</nowiki></code>, les deux solutions acceptables sont : * demander l'autorisation au webmestre du site <code><nowiki>http://www.autresite.com/</nowiki></code>, importer l'image sur son propre site et l'exploiter en local, en affichant l'origine de l'image et les conditions d'utilisation imposées par le site d'origine ; : par exemple, si l'on place l'image en <code><nowiki>http://www.monsite.com/image/img1.png</nowiki></code>, on peut écrire <syntaxhighlight lang="html"> <img src="/image/img1.png" … > <br> Reproduit avec l'aimable autorisation de <a href="http://www.autresite.com/">Autresite.com</a>, tous droits réservés </syntaxhighlight> * ne pas inclure l'image mais faire le lien vers cette image, ou mieux vers la page Web contenant cette image ; par exemple <syntaxhighlight lang="html"> Voir l'illustration sur l'article dédié du site <a href="http://www.autresite.com/lapage.html">Autresite.com</a> </syntaxhighlight> == L'attribut <code>alt</code> == Il est nécessaire de donner, pour chaque image, un texte de remplacement pour les navigateurs ne supportant pas l'affichage d'images ou pour des raisons d'[[w:Accessibilité du Web|accessibilité des pages web]] (cf normes W3C). Le texte de remplacement est spécifié par l'attribut <code>alt</code> : <syntaxhighlight lang="html"> <img src="bienvenue.png" alt="Bienvenue !" > </syntaxhighlight> Lorsqu'une image ne véhicule pas d'information, ce texte doit être vide (n'oubliez pas que le <code>alt</code> est lu ou rendu en braille pour un malvoyant), l'attribut est alors présent sous la forme : <syntaxhighlight lang="html"> <img src="image_decorative.png" alt="" > </syntaxhighlight> ---- ; Note : Microsoft Internet Explorer affiche le texte alternatif dans une info-bulle ; ce comportement est erroné puisque c'est normalement le titre (voir ci-dessous) qui est affiché en info-bulle. ---- == L'attribut <code>title</code> == Il est possible d'attribuer un titre à chaque image en plus de l'information alternative ''(alt)''. L'attribut <code>title</code> doit contenir une information ''optionnelle'' sur l'image, ou reproduire l'attribut <code>alt</code>: Les navigateurs affichent cette information dans une info bulle : <syntaxhighlight lang="html"> <img src="renard.png" alt="Renard en promenade" title="Renard en promenade" > </syntaxhighlight> ; Remarque : Les attributs <code>alt</code> et <code>title</code> peuvent être cumulés. == Les attributs <code>height</code> et <code>width</code> == Si l'on omet ces attributs, l'image s'affiche en grandeur réelle (pixel pour pixel). Si l'on indique une des dimensions (la largeur ou la hauteur), l'autre dimension est calculée pour que l'image s'affiche avec ses proportions originales. Le fait d'indiquer les deux dimensions peut faciliter l'affichage : les images sont chargées après le texte, le navigateur peut ainsi réserver la place nécessaire, sinon, il doit décaler le texte au fur et à mesure que les images sont chargées. Il peut donc être intéressant d'indiquer les dimensions même si l'on utilise les dimensions originales de l'image. Cependant, l'auteur doit bien s'assurer que les proportions (rapport largeur/hauteur) sont respectées, sous peine que l'image s'affiche déformée. == Image contenant des liens == Une image elle-même peut être à l'intérieur d'une balise <code>&lt;a&gt;…&lt;/a&gt;</code> : on peut alors cliquer sur l'image pour accéder à la ressource désignée. Par exemple : <syntaxhighlight lang="html"> <a href="http://fr.wikibooks.org"> <img src="https://upload.wikimedia.org/wikipedia/commons/d/df/Wikibooks-logo-en-noslogan.svg" alt="Wikibooks" /> </a> </syntaxhighlight> {{loupe|../Liens}} <imagemap>File:JoshuaReynoldsParty.jpg|Exemple d'image découpée en zones menant vers différentes ressources. Les personnes représentées sont des membres du [[w:fr:Literary Club|Literary Club]] ; cliquer sur une personne pour accéder à l'article correspondant.|350px|thumb poly 133 343 124 287 159 224 189 228 195 291 222 311 209 343 209 354 243 362 292 466 250 463 [[w:fr:Samuel Johnson|Dr Johnson — lexicographe]] poly 76 224 84 255 43 302 62 400 123 423 121 361 137 344 122 290 111 234 96 225 [[w:fr:James Boswell|Boswell — biographe]] poly 190 276 208 240 229 228 247 238 250 258 286 319 282 323 223 323 220 301 200 295 [[w:fr:Joshua Reynolds|Sir Joshua Reynolds — peintre]] poly 308 317 311 270 328 261 316 246 320 228 343 227 357 240 377 274 366 284 352 311 319 324 [[w:fr:David Garrick|David Garrick — acteur]] poly 252 406 313 343 341 343 366 280 383 273 372 251 378 222 409 228 414 280 420 292 390 300 374 360 359 437 306 418 313 391 272 415 [[w:fr:Edmund Burke|Edmund Burke — homme d'État]] rect 418 220 452 287 [[w:fr:Pasquale Paoli|Pasqual Paoli — patriote corse]] poly 455 238 484 253 505 303 495 363 501 377 491 443 429 439 423 375 466 352 [[w:fr:Charles Burney|Charles Burney — historien de la musique]] poly 501 279 546 237 567 239 572 308 560 326 537 316 530 300 502 289 [[w:fr:Thomas Warton|Thomas Warton — poète]] poly 572 453 591 446 572 373 603 351 562 325 592 288 573 260 573 248 591 243 615 254 637 280 655 334 705 396 656 419 625 382 609 391 613 453 [[w:fr:Oliver Goldsmith|Oliver Goldsmith — écrivain]] rect 450 86 584 188 [[w:fr:Joshua Reynolds|prob. ''The Infant Academy'', 1782]] rect 286 87 376 191 [[w:fr:Joshua Reynolds|peinture inconnue]] circle 100 141 20 [[w:fr:Joshua Reynolds|portrait inconnu]] poly 503 192 511 176 532 176 534 200 553 219 554 234 541 236 525 261 506 261 511 220 515 215 [[w:fr:Francis Barber|serviteur — poss. Francis Barber]] rect 12 10 702 500 [[w:fr:Literary Club|Utilisez le bouton pour agrandir ou bien utilisé les hyperliens.]] desc bottom-left </imagemap> L'image peut également être découpée en zones cliquables menant vers des ressources différentes. Pour cela : * la balise <code>&lt;img&gt;</code> doit contenir un attribut <code>usemap</code> dont la valeur rst un nom, le nom de la carte définissant les zones ; * la carte est définie par une balise <code>&lt;map&gt;…&lt;map&gt;</code> qui contient des zones ; chaque zone est définie par une balise <code>&lt;area /&gt;</code>. Par exemple : <syntaxhighlight lang="html"> <img src="image.png" alt="Carte du site" usemap="#nomdelacarte" /> <map name="nomdelacarte"> <area shape="rect" coords="9,372,66,397" href="http://fr.wikipedia.org/" alt="Wikipédia" title="Wikipédia" > </map> </syntaxhighlight> Les attributs de la balise <code>&lt;area /&gt;</code> sont : * <code>shape</code> : définit la forme de la zone, ses valeurs peuvent être <code>"rect"</code> pour un rectangle, <code>"poly"</code> pour un polygone et <code>"circle"</code> pour un disque ; * <code>coords</code> : définit les coordonnées décrivant la zone, séparées par des virgules : ** pour un rectangle, il s'agit des coordonnées des coins en bas à gauche et en haut à droite, sous la forme <code>"x1, y1, x2, y2"</code>, ** pour un polygone, il s'agit de la liste des coordonnées des points, sous la forme <code>"x1, y1, x2, y2, …, xn, yn"</code>, ** pour un disquee, il s'agit des coordonnées du centre et du rayon, sous la forme <code>"xc, yc, r"</code> ; * les attributs classiques d'un lien : essentiellement <code>href</code> et <code>alt</code> == Image SVG == Le SVG étant du XML, comme le XHTML, il est possible de définir une image SVG directement à l'intérieur du code HTML. Par exemple : <syntaxhighlight lang="html"> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <title> Rectangle noir </title> </head> <body> <p>Voici un rectangle noir :</p> <svg width="3cm" height="2cm" version="1.1" xmlns="http://www.w3.org/2000/svg"> <rect x="0.5cm" y="0.5cm" width="2cm" height="1cm" /> </svg> </body> </html> </syntaxhighlight> {{loupe|Découvrir le SVG}} fgbapxvp8alnmxc66l92am8huaaq3j1 Le langage HTML/Balises complémentaires 0 3018 682232 673372 2022-07-23T09:07:34Z DavidL 1746 /* Éléments de phrase */ wikitext text/x-wiki <noinclude>{{ébauche}} {{Le langage HTML}}</noinclude> == Éléments de phrase == <div align="justify">Les éléments de phrase ont été mentionnés dans le chapitre ''[[Programmation HTML/Style de texte|Style de texte]]''. Il existe d'autres éléments « exotiques », dont la définition en HTML 4.01 est très vague et qui ne sont en pratique pas utilisés (mais on peut toujours les associer à une mise en forme particulière avec du [[Programmation CSS|CSS]]).</div> {| class="wikitable" |+ Éléments de phrase « exotiques » |- ! Style !! Balise !! Mnémotechnique !! Rendu par défaut |- | terme faisant l'objet d'une définition | <code>&lt;dfn&gt;</code>…<code>&lt;/dfn&gt;</code> | … | italiques |- | extrait de programme | <code>&lt;samp&gt;</code>…<code>&lt;/samp&gt;</code> | ''sample'' (échantillon) | ''idem'' <code>&lt;code&gt;</code> |- | variable ou paramètre d'un programme | <code>&lt;var&gt;</code>…<code>&lt;/var&gt;</code> | … | |} == Les balises multimédia == == Les scripts == La balise <code>&lt;script&gt;</code> permet d'insérer un script dans un langage spécifié par l'attribut <code>language</code>. Le type est également spécifié par l'attribut <code>type</code>. Cette balise peut être placée dans la partie <code>&lt;head&gt;</code> ou <code>&lt;body&gt;</code> de la page HTML. Exemple : <syntaxhighlight lang="html"> <script language="Javascript1.2" type="text/javascript"> var resultat = "aucun"; function clic_bouton() { alert("Résultat = " + resultat); } </script> </syntaxhighlight> Le langage du script peut être quelconque (VBScript, Javascript, ...), mais seul le [[Programmation JavaScript|Javascript]] est reconnu par la plupart des navigateurs. === Événements === Le script peut définir des fonctions appelées plus tard, lorsqu'un évènement particulier survient (clic d'un bouton par exemple). Les différentes balises HTML, en particulier les champs de formulaire, permettent de faire appel à une fonction javascript pour traiter certains évènements. L'appel se fait en ajoutant un attribut dont le nom commence par "<code>on</code>" suivi du nom de l'évènement. La valeur de l'attribut est un code javascript (souvent un appel de fonction), qui doit retourner une valeur booléenne. Si le code retourne faux (<code>false</code>), l'action par défaut associée à l'évènement est annulée. Exemple : <syntaxhighlight lang="html"> <script language="Javascript1.2" type="text/javascript"> function envoi_formulaire() { return confirm("Voulez-vous réellement envoyer les données au serveur ?"); } </script> <form action="/envoyer.cgi" onsubmit="return envoi_formulaire();"> <label> <input type="text" name="nom"></input> <br /> <input type="submit" value="Envoyer"></input> </form> </syntaxhighlight> === Script dans un lien === Un lien dont l'adresse commence par <code>"javascript:"</code> est en fait un code javascript. En général, il s'agit d'un appel de fonction. Exemple : <syntaxhighlight lang="html"> <a href="javascript:clic_bouton()">Appel à la fonction</a> </syntaxhighlight> ==Les applets== Une applet [[Programmation Java|Java]] est une application dont le code est sur le serveur. Il est téléchargé puis exécuté sur le navigateur de l'utilisateur, où il s'affiche dans une zone de la page HTML, définie par la balise <code>&lt;applet&gt;</code>. À cause des problèmes de sécurité qu'elles posent, les applets ont été retirés des fonctionnalités des navigateurs récents. Cette section n'est donc pas utile pour les sites web classiques, mais ces informations peuvent servir pour certaines plateformes embarquées. Cette balise possède les attributs suivants : ;<code>code</code>:(obligatoire) Nom de la classe principale de l'applet Java. ;<code>codebase</code>:(optionnel) URL du répertoire où trouver la classe, si elle ne se trouve pas dans le même répertoire que la page HTML. ;<code>archive</code>:(optionnel) Liste des archives JAR contenant les classes de l'applet. ;<code>width</code>:(obligatoire) Largeur de la zone d'affichage de l'applet. ;<code>height</code>:(obligatoire) Hauteur de la zone d'affichage de l'applet. ;<code>alt</code>:(recommandé) Texte alternatif quand les applets ne sont pas autorisées par le navigateur. Cette balise peut contenir des paramètres à transmettre à l'applet, en utilisant la balise <code>&lt;param&gt;</code>. Cette balise a pour attributs <code>name</code> pour le nom du paramètre et <code>value</code> pour sa valeur. Exemple : <syntaxhighlight lang="html"> <applet code="Graph.class" width="500" height="300" alt="Graphique du nombre de fichiers téléchargés dans les 5 derniers jours"> <param name="type" value="bar2D" /> <param name="data" value="0, 10, 15, 7, 16" /> <param name="labels" value="Lun, Mar, Mer, Jeu, Ven" /> </applet> </syntaxhighlight> ---- ;Note sur la sécurité des applets : Étant donné que le code s'exécute sur le navigateur de l'utilisateur, un programme malveillant pourrait faire n'importe quoi. Cependant la machine virtuelle Java n'autorise pas les applets à faire tout ce qu'elles veulent, à moins que l'utilisateur ne lui accorde plus de droits où que l'applet soit signée et acceptée par l'utilisateur. Les navigateurs permettent également d'empêcher toutes les applets de s'exécuter. :Malgré ces précautions, les applets Java posent toujours des problèmes de sécurité. Elles ne sont plus supportées, ni par les navigateurs récents, ni par les versions récentes de Java. Les dernières évolutions des standards du web (HTML5, CSS3, Javascript) permettent de remplacer cette technologie. ---- [[Catégorie:Le langage HTML (livre)]] anvfdq3jtfpb0uakp7967ofhrzw6qua Accueil/Sciences de la nature et sciences exactes 0 5615 682184 664460 2022-07-22T18:42:25Z DavidL 1746 + références CDU pour aider au classement des livres wikitext text/x-wiki __NOTOC__ <div style="padding:5px;margin-bottom:0.5em;background-color:#8080C040;text-align:center;font-size:large;">[[Image:Nuvola apps kalzium.svg|50px]][[Accueil|Wikilivres]]: L'étagère des sciences de la nature et des sciences exactes</div> Voir aussi [[Wikilivres:CDU/5|CDU 5 - Sciences exactes et naturelles]] <div class="flex-content"> <div class="flex-content-half"> == [[Image:Crystal Project konquest.png|40px]] Astronomie == [[Wikilivres:CDU/5/52|CDU 52 - Astronomie, astrophysique, recherche spatiale, géodésie]] * [[Celestia|Simulateur spatial]] [[Image:25%.svg]] == [[Image:AlphaHelixSection (blue).svg|30px]] Biologie et Médecine == [[Wikilivres:CDU/5/57|CDU 57 - Sciences biologiques]] === Biologie cellulaire et moléculaire === * [[Biologie cellulaire]] [[Image:25%.svg]] * [[Biochimie]] [[Image:100%.svg]] * [[Notions de biologie]] [[Image:25%.svg]] * [[Génétique]] [[Image:00%.svg]] === Médecine === * [[Anatomie]] [[Image:00%.svg]] * [[Biologie humaine]] [[Image:25%.svg]] * [[Embryologie]] [[Image:00%.svg]] * [[Histologie]] [[Image:00%.svg]] * [[Introduction à la pharmacologie|Pharmacologie]] [[Image:00%.svg]] * [[Physiologie]] [[Image:00%.svg]] * [[Physiologie de l'imagination et du langage]] [[Image:25%.svg]] * [[Pratique médicale en Afrique francophone]] [[Image:00%.svg]] * [[Médecine/Sémiologie|Sémiologie]] [[Image:00%.svg]] * [[Cours de physiologie]] [[Image:00%.svg]] === Microbiologie === * [[Analyse microbiologique des aliments]] [[Image:00%.svg]] === Paléontologie === * [[Les fossiles]] [[Image:00%.svg]] === Sciences cognitives === * [[Sciences cognitives]] [[Image:25%.svg]] === Zoologie === * [[Clés dichotomiques]] [[Image:00%.svg]] == [[Image:Gnome-applications-science.svg|30px]] Chimie == [[Wikilivres:CDU/5/54|CDU 54 - Chimie, minéralogie, cristallographie]] * [[Chimie générale]] [[Image:75%.svg]] * [[Chimie organique]] [[Image:25%.svg]] * [[Spectroscopie]] [[Image:00%.svg]] </div> <div class="flex-content-half"> == [[Image:Nuvola apps edu mathematics-p.svg|30px]] [[Wikilivres:Rechercher un livre/5/51|Mathématiques]] == [[Wikilivres:CDU/5/51|CDU 51 - Mathématiques]] === Cours de collège === *[[Cours de mathématiques collège]] (France){{25}} === Cours de lycée === * [[Mathématiques niveau seconde|Mathématiques niveau seconde (France)]] * [[Approfondissements de lycée]] [[Image:75%.svg]] === Cours de licence === * [[Algèbre de Boole]] [[Image:25%.svg]] * [[Algèbre]] [[Image:25%.svg]] * [[Analyse]] [[Image:25%.svg]] * [[Algèbre linéaire]] [[Image:25%.svg]] * [[Arithmétique élémentaire]] [[Image:00%.svg]] * [[Géométrie]] [[Image:25%.svg]] * [[Topologie]] [[Image:00%.svg]] * [[Statistiques]] {{00}} === Cours de master === * [[Fondements des mathématiques]] [[Image:50%.svg]] === Autres === * [[Calcul écrit]] [[Image:25%.svg]] * [[S'initier au boulier en 10 leçons|S'initier au boulier]] [[Image:100%.svg]] * [[Exercices de mathématiques]] === Logiciels de mathématiques === * [[Découvrir Scilab]] {{75}} * [[Programmation Octave|Octave]] {{25}} * [[Programmation LaTeX|LaTeX]] {{25}} == [[Image:Logo physics.svg|30px]] Sciences physiques == [[Wikilivres:CDU/5/53|CDU 53 - Physique]] * [[Calcul tensoriel]] [[Image:50%.svg]] * [[Électricité]] [[Image:25%.svg]] * [[Mécanique des fluides]] [[Image:25%.svg]] * [[Méthode des éléments finis|Mécanique numérique]] [[Image:25%.svg]] * [[Optique]] [[Image:25%.svg]] * [[Physique]] [[Image:25%.svg]] * [[Physique Subatomique]] [[Image:25%.svg]] * [[Problèmes de Physique]] [[Image:00%.svg]] * [[Thermodynamique]] [[Image:50%.svg]] * [[Tribologie]] [[Image:50%.svg]] == [[Image:Crystal128-browser.svg|30px]] Sciences de la Terre et de l'Univers == [[Wikilivres:CDU/5/55|CDU 55 - Géologie, géophysique, météorologie]] * [[Dynamique des enveloppes]] [[Image:00%.svg]] * [[Tectonique des plaques]] [[Image:00%.svg]] * [[Écologie]] [[Image:00%.svg]] * [[Géologie]] [[Image:00%.svg]] </div> </div> {{ÉtatDesWikilivres}} [[Catégorie:Classe 5 - Mathématique. Sciences exactes et naturelles|*]] [[Catégorie:Étagères de Wikilivres]] [[ja:自然科学]] lzcxk5sx8zz8oq7g6chpc1jucucampj Accueil/Informatique 0 5630 682183 681013 2022-07-22T18:35:59Z DavidL 1746 wikitext text/x-wiki __NOTOC__ <div style="padding:5px;margin-bottom:0.5em;background-color:#5bb1cd80;text-align:center;font-size:large;">L'étagère Informatique de [[Accueil|Wikilivres]]</div> Voir aussi [[Wikilivres:CDU/6/68/681/681.3/681.3.0|CDU 681.3.0]] <div class="flex-content"> <div class="flex-content-half"> {{Sous section|nom=Accueil/Informatique/Rayon_Enseignement|couleur=#F0F000|couleurbord=#AAAAAA}} {{Sous section|nom=Accueil/Informatique/Rayon_Programmation|couleur=#F0F000|couleurbord=#AAAAAA}} {{Sous section|nom=Accueil/Informatique/Rayon_BD|couleur=#F000F0|couleurbord=#AAAAAA}} {{Sous section|nom=Accueil/Informatique/Rayon_Logiciels_Libres|couleur=#00F0F0|couleurbord=#AAAAAA}} </div> <div class="flex-content-half"> {{Sous section|nom=Accueil/Informatique/Rayon_ASR|couleur=#0000F0|couleurbord=#AAAAAA}} {{Sous section|nom=Accueil/Informatique/Rayon_Administration|couleur=#F00000|couleurbord=#AAAAAA}} {{Sous section|nom=Accueil/Informatique/Rayon_Guides|couleur=darkblue|couleurbord=#AAAAAA}} {{Sous section|nom=Accueil/Informatique/Rayon_Format de données|couleur=darkblue|couleurbord=#AAAAAA}} {{Sous section|nom=Accueil/Informatique/Rayon_Jeu vidéo|couleur=darkgreen|couleurbord=#AAAAAA}} {{Sous section|nom=Accueil/Informatique/Rayon_Divers|couleur=#F0F0F0|couleurbord=#AAAAAA}} </div> </div> {{ÉtatDesWikilivres}} <noinclude> {{Réviser|autre1=tache|autre1texte=Refaire le classement des liens. Certaines pages entrent dans plusieurs catégories à la fois (ex : OpenOffice.org dans logiciels libres, guides, bureautique, base de données (Base)). Envisager une mise à jour automatique en Lua.}} [[Catégorie:Informatique|*]] [[Catégorie:Étagères de Wikilivres]] </noinclude> thycqb6xs872wogcfdgxxrjqf3jqq42 Wikijunior:Les civilisations anciennes 102 7140 682214 680924 2022-07-22T20:34:25Z 173.178.195.181 wikitext text/x-wiki Les civilisations anciennes sont des connues au travers des éléments écrits ou archéologiques restant. Elles avaient des spécificités en fonction des lieux où elles se sont développées. Elles avaient de systèmes de valeurs, ou de relations parfois sensiblement différents des notres. Sommaire : [[Fichier:Wikijunior Ancient Civlizations II.png|vignette|Les civilisations anciennes.]] *[[/Les Arméniens/]] (Moyen-Orient-Europe-Asie) *[[/L'Égypte/]] (Afrique) *[[/La Mésopotamie/]] (Asie) *[[/La Grèce antique/]] (Monde méditerranéen) *[[/La Rome antique/]] (Monde méditerranéen) *[[/La civilisation carthaginoise ou civilisation punique/]] (Monde méditerranéen) *[[/Les Mound Builders/]] (Amérique du Nord) *[[/Les Anasazis/]] (Amérique du Nord) *[[/Les Aztèques/]] (Amérique centrale) *[[/Les Mayas/]] (Amérique centrale) *[[/Les Incas/]] (Amérique du Sud) *[[/Les Vikings/]] (Europe) *[[/Les caravates/]] (France) [[Catégorie:Wikijunior|Civilisations anciennes}]] [[Catégorie:Livres en cours de rédaction]] [[Catégorie:Wikijunior:Les civilisations anciennes (livre)|!]] [[de:Wikijunior Alte Zivilisationen]] [[en:Wikijunior:Ancient Civilizations]] [[es:Wikichicos/Grandes Civilizaciones]] [[fi:Wikijunior Muinaiset kulttuurit]] malviwl7h7bfqkdgpmhh7tb2o1fgov7 682219 682214 2022-07-23T08:47:48Z DavidL 1746 Révocation des modifications de [[Special:Contributions/173.178.195.181|173.178.195.181]] ([[User talk:173.178.195.181|discussion]]) vers la dernière version créée par [[User:37.171.138.33|37.171.138.33]] wikitext text/x-wiki Les civilisations anciennes sont des connues au travers des éléments écrits ou archéologiques restant. Elles avaient des spécificités en fonction des lieux où elles se sont développées. Elles avaient de systèmes de valeurs, ou de relations parfois sensiblement différents des notres. Sommaire : [[Fichier:Wikijunior Ancient Civlizations II.png|vignette|Les civilisations anciennes.]] *[[/Les Arméniens/]] (Moyen-Orient-Europe-Asie) *[[/L'Égypte/]] (Afrique) *[[/La Mésopotamie/]] (Asie) *[[/La Grèce antique/]] (Monde méditerranéen) *[[/La Rome antique/]] (Monde méditerranéen) *[[/La civilisation carthaginoise ou civilisation punique/]] (Monde méditerranéen) *[[/Les Mound Builders/]] (Amérique du Nord) *[[/Les Anasazis/]] (Amérique du Nord) *[[/Les Aztèques/]] (Amérique centrale) *[[/Les Mayas/]] (Amérique centrale) *[[/Les Incas/]] (Amérique du Sud) *[[/Les Vikings/]] (Europe) [[Catégorie:Wikijunior|Civilisations anciennes}]] [[Catégorie:Livres en cours de rédaction]] [[Catégorie:Wikijunior:Les civilisations anciennes (livre)|!]] [[de:Wikijunior Alte Zivilisationen]] [[en:Wikijunior:Ancient Civilizations]] [[es:Wikichicos/Grandes Civilizaciones]] [[fi:Wikijunior Muinaiset kulttuurit]] 2sxwzp5ry4z3gwpc0qcefy01eaoomb9 Exercices en langage C/Fonctions 0 7373 682181 635544 2022-07-22T18:09:39Z DavidL 1746 wikitext text/x-wiki {{Exercices en langage C}} [[Catégorie:Exercices en langage C (livre)|Fonctions]] Ces exercices concernent l'utilisation des fonctions de la bibliothèque standard du langage C. ==Filtre qui passe le texte en majuscule== ===Problème à résoudre=== Écrivez un programme majuscule.c qui lit des données sur le flux stdin et écrits sur stdout après avoir transformé les caractères lus en majuscules. Vous utiliserez les fonctions <code>getchar</code>, <code>putchar</code> (stdio.h) et <code>toupper</code> (ctype.h). Vous testerez votre programme en lui faisant convertir son propre fichier source majuscule.c. : majuscule.exe < majuscule.c === Solution proposée === <div style="width:100%">{{Boîte déroulante|titre=Solution proposée|contenu = <syntaxhighlight lang="c"> /** * Programme . : majuscule * Rôle ...... : convertit les caractères lus sur stdin en majuscule. * Paramètres : Aucun * Compilation et EDL : gcc -Wall -o majuscule.exe majuscule.c * Auteur ...... : Thierry46 * Version ..... : 1.0 du 4/2/2008 * Licence ..... : GNU GPL. */ #include <stdio.h> #include <ctype.h> #include <stdlib.h> int main(void) { int c; while ((c=getchar()) != EOF) { (void)putchar(toupper(c)); } return EXIT_SUCCESS; } </syntaxhighlight> }} </div> ==Lire une ligne longue avec fgets== ===Problème à résoudre=== La fonction <code>fgets</code> de la bibliothèque standard du langage C permet de lire une chaîne de caractère de longueur limitée dans un flux. Vous allez compléter une fonction ''lire_ligne'' répondant au spécifications suivantes : * Retour d'une ligne lue dans un flux texte passé en paramètre. * Vous éliminerez les caractères de saut de ligne lus. * La longueur des lignes lues n'est pas limitée. * Contrôle des paramètres et retour des codes d'erreurs systèmes, détection de la fin du fichier. * Vous utiliserez au maximum les fonctions de la bibliothèque standard du langage C : allocation mémoire, chaînes de caractères... * Son prototype est donné par ''lire_ligne.h''. * Vous utiliserez le programme de ''main_lire_ligne.c'' pour lire_ligne. * Vous devrez traiter le fichier ''test_lire_ligne.txt'' fourni. * Les instructions de compilation et d'édition de lien sont dans les commentaires des fichiers fournis. ===Éléments fournis=== <div style="width:100%">{{Boîte déroulante|titre=lire_ligne.c à compléter|contenu = <syntaxhighlight lang="c"> /** * Fonction .. : lire_ligne * Rôle ...... : tente de lire une ligne entière depuis le flux. * - Le caractère de saut de ligne '\n' final est enlève. * - L’appelant doit se charger de la désallocation de la chaîne retournée. * * Paramètres : * - pChaine : adresse de retour de la chaîne * - tailleBufferLecture : taille du buffer de lecture, * dans la pratique on pourra choisir _POSIX_MAX_INPUT (ref limits.h). * - flux : un pointeur sur le descripteur du fichier a lire. * * - Valeur retournée : * - Si OK : EXIT_SUCCESS. * - Si Fin de fichier atteinte sans rencontrer \n : EOF, * - la chaîne retournée contient le début de la ligne longue. * - Si rien a lire, retour d'un pointeur NULL pour la chaîne. * - En cas de problème : Le code d'erreur système utilisable par perror. * et retour d'un pointeur NULL pour la chaîne. * * Auteur ...... : Votre nom * Version ..... : 1.0 du date * Licence ..... : GNU GPL. lire_ligne : Lecture d'une ligne longue dans un fichier texte Copyright (C) 2008 Thierry46 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. * * Compilation . : gcc -pedantic -Wall -std=c99 -c lire_ligne.c * Fichiers lies : main_lire_ligne.c, lire_ligne.h */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> #include <assert.h> #include <errno.h> #include "lire_ligne.h" /*@null@*/ char *lire_ligne(size_t tailleBufferLecture, FILE * restrict flux, int *pCodeRetour) { // Début partie à compléter... // Fin partie à compléter... } // char *lire_ligne(... </syntaxhighlight> }} </div> <div style="width:100%">{{Boîte déroulante|titre=lire_ligne.h|contenu = <syntaxhighlight lang="c"> /* * Nom .... : lire_ligne.h * Rôle ... : Définitions et prototype de lire_ligne.h * Auteur ...... : Thierry46 * Version ..... : 1.0 du 30/1/2008 * Licence ..... : GNU GPL. lire_ligne : Lecture d'une ligne longue dans un fichier texte Copyright (C) 2008 Thierry46 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. * * Fichier lie : lire_ligne.c */ #ifndef LIRE_LIGNE_H #define LIRE_LIGNE_H extern /*@null@*/ char *lire_ligne(size_t tailleBufferLecture, FILE * restrict flux, int *pCodeRetour); #endif </syntaxhighlight> }} </div> <div style="width:100%">{{Boîte déroulante|titre=main_lire_ligne.c|contenu = <syntaxhighlight lang="c"> /* * Nom ......... : main_lire_ligne.c * Rôle ........ : Tester la fonction lire_ligne * Paramètre ... : Aucun * Code retour . : EXIT_SUCESSS (0) * Auteur ...... : Thierry46 * Version ..... : 1.1 du 4/2/2008 * Licence ..... : GNU GPL. lire_ligne : Lecture d'une ligne longue dans un fichier texte Copyright (C) 2008 Thierry46 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. * * Compilation . : * Voir lire_ligne .c pour sa compilation * gcc -pedantic -Wall -std=c99 -o test_lire_ligne.exe main_lire_ligne.c lire_ligne.o * Exécution : ./test_lire_ligne.exe * Fichiers lies : lire_ligne.c, lire_ligne.h, test_lire_ligne.txt */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include "lire_ligne.h" #define FIC_TEST "test_lire_ligne.txt" // Valeur faible de TAILLE_BUFFER pour test débordements et lecture multiple. #define TAILLE_BUFFER (size_t)10 #define TAILLE_MAX_MESSAGE 256 int main(void) { FILE *hFicTest = NULL; char *chaine = NULL; int numLigne = 1; int retour = EXIT_SUCCESS; char message[TAILLE_MAX_MESSAGE]; hFicTest = fopen(FIC_TEST, "r"); if (hFicTest == NULL) { (void)printf("%s : le fichier %s n'a pas pu être ouvert !\n", __func__, FIC_TEST); // Je laisse poursuivre pour tester assertion dans lire_ligne. // } do { chaine = lire_ligne(TAILLE_BUFFER, hFicTest, &retour); if (retour == EXIT_SUCCESS) { (void)strncpy(message, "Pas d'erreur", sizeof(message) - 1); } else if (retour == EOF) { (void)strncpy(message, "Fin de fichier", sizeof(message) - 1); } else { (void)strncpy(message, strerror(retour), sizeof(message) - 1); } message[sizeof(message) - 1] = '\0'; (void)printf("Ligne %d : retour = %d (%s), chaîne lue = \"%s\".\n", numLigne, retour, message, (chaine == NULL) ? "! Pointeur NULL !" : chaine); free(chaine); chaine = NULL; } while (retour == EXIT_SUCCESS); if (hFicTest != NULL) { (void)fclose(hFicTest); } return EXIT_SUCCESS; } // int main(void) </syntaxhighlight> }} </div> <div style="width:100%">{{Boîte déroulante|titre=test test_lire_ligne.txt|contenu = <pre> 1 1234567880 ligne longue. 12345678901234567890123456789012345678901234567890 fin </pre> }} </div> ===Solution proposée=== <div style="width:100%">{{Boîte déroulante|titre=Voir la solution|contenu = <syntaxhighlight lang="c"> /** * Fonction .. : lire_ligne * Rôle ...... : tente de lire une ligne entière depuis le flux. * - Le caractère de saut de ligne '\n' final est enleve. * - L’appelant doit se charger de la désallocation de la chaîne retournée. * * Paramètres : * - pChaine : adresse de retour de la chaîne * - tailleBufferLecture : taille du buffer de lecture, * dans la pratique on pourra choisir _POSIX_MAX_INPUT (ref limits.h). * - flux : un pointeur sur le descripteur du fichier a lire. * * - Valeur retournée : * - Si OK : EXIT_SUCCESS. * - Si Fin de fichier atteinte sans rencontrer \n : EOF, * - la chaîne retournée contient le début de la ligne longue. * - Si rien a lire, retour d'un pointeur NULL pour la chaîne. * - En cas de problème : Le code d'erreur système utilisable * par perror et retour d'un pointeur NULL pour la chaîne. * * Auteur ...... : Thierry46 * Version ..... : 1.1 du 4/2/2008 * Licence ..... : GNU GPL. lire_ligne : Lecture d'une ligne longue dans un fichier texte Copyright (C) 2008 Thierry46 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. * * Compilation . : gcc -pedantic -Wall -std=c99 -c lire_ligne.c * Fichiers lies : main_lire_ligne.c, lire_ligne.h * * Remarques : * - Beaucoup de commentaires sont présents pour un usage didactique. * - Ce programme utilise une syntaxe specifique C99. * - Ce programme a ete controle avec l'outil de verification statique * - Splint v3.1.2 du 19 Jan 2008 : <http://www.splint.org/> */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> #include <assert.h> #include <errno.h> #include "lire_ligne.h" /*@null@*/ char *lire_ligne(size_t tailleBufferLecture, FILE * restrict flux, int *pCodeRetour) { // Declarations char *chaineRetour = NULL; bool litEncore = true; bool rienLu = true; int codeRetour = EXIT_SUCCESS; // Controle rapide des parametres. // Si quelque chose ne va pas, arret. assert(tailleBufferLecture > 0); assert(flux != NULL); // On reinitialise errno errno = 0; // Boucle de lecture d'une ligne eventuellement longue do { size_t positionEcriture; char *nouvelleChaine; litEncore = false; // Demande d'une nouvelle zone memoire positionEcriture = (chaineRetour == NULL) ? 0 : strlen(chaineRetour); nouvelleChaine = realloc(chaineRetour, positionEcriture + tailleBufferLecture); if (nouvelleChaine == NULL) // Si probleme d'allocation { codeRetour = errno; free(chaineRetour); chaineRetour = NULL; } else // Si le systeme a accorde la memoire { chaineRetour = nouvelleChaine; if (fgets(chaineRetour+positionEcriture, (int)tailleBufferLecture, flux) != NULL) { // Recherche si un \n a ete lu en fin de chaine. char *positionNewLine = strrchr(chaineRetour, '\n'); rienLu = false; if (positionNewLine != NULL) { // Suppression du caractere de fin de ligne \n, *positionNewLine = '\0'; } else // fgets n'a pas pu lire la ligne complete. { litEncore = true; } } else if (ferror(flux) != 0) { codeRetour = errno; free(chaineRetour); chaineRetour = NULL; } else if (feof(flux) != 0) { codeRetour = EOF; if (rienLu) { free(chaineRetour); chaineRetour = NULL; } } } // else if (nouvelleChaine == NULL) } while (litEncore); // Retour des resultats. *pCodeRetour = codeRetour; return chaineRetour; } // char *lire_ligne(... </syntaxhighlight> }} </div> ===Remarques sur l'exercice=== * Le test des paramètres dans la solution est expéditif. * Pour obtenir des programmes robustes, le langage C oblige à une gestion pénible des erreurs. Avec le langage Java par exemple, les mécanismes d'exception facilitent la tâche du programmeur. * L'utilisation de l'allocation dynamique de mémoire est risquée : fuite mémoire. Avec le langage Java par exemple, le ramasse miettes (Garbage collector) se charge de la libération de la mémoire. * En Java des classes comme String et StringBuffer prennent en charge les chaines de caractères longues. ==Test d'un générateur de nombre aléatoire== ===Problème à résoudre=== La bibliothèque standard du langage C offre au programmeur plusieurs fonctions pour générer des nombres aléatoires. La plus connue est <code>rand()</code>. Vous allez écrire un programme ''verifrand.c'' qui estime la répartition des nombres aléatoires générés : [[w:Moyenne arithmétique|moyenne]] et [[w:Critères de dispersion|dispersion]]. Nous allons traiter l'ensemble des nombres générés comme une série [[w:statistiques élémentaires discrètes|discrète]] regroupée. #Générez 1 million (NB_TIRAGE) notes (x<sub>i</sub>) entre 0 et 20 (N) comprises (NB_NOTE = 21) à l'aide de la fonction <code>rand()</code>. #Répartissez-les dans le tableau effectif (n) où n<sub>i</sub> représente l'effectif (nombre d'occurrences cumulées) de la note x<sub>i</sub>. #calculez et affichez la [[w:moyenne arithmétique|moyenne arithmétique]] : <math>\overline{x}=\frac{\sum_{i=0}^{N}(n_i*x_i)}{\sum_{i=0}^Nn_i}=\frac{\sum_{i=1}^{N}(n_i*i)}{NB\_TIRAGE}</math> #calculez et affichez l'[[w:Critères de dispersion#Ecart moyen|écart moyen]] de la série : <math>Em=\frac{\sum_{i=0}^N(n_i*|x_i-\overline{x}|)}{\sum_{i=0}^Nn_i}=\frac{\sum_{i=1}^N(n_i*|i-\overline{x}|)}{NB\_TIRAGE}</math> ===Solution proposée=== <div style="width:100%">{{Boîte déroulante|titre=Voir la solution|contenu = <syntaxhighlight lang="c"> /* Nom : verifrand.c Auteur : Thierry46 Role : Verifier generateur de nombre aleatoire Licence : GNU GPL Version : 1.0 du 17/2/2008 Compilation : gcc -Wall -pedantic -std=c99 -o verifrand.exe verifrand.c */ #include <stdio.h> #include <stdlib.h> #include <math.h> // NB_NOTE est appele N dans les formules // 20 notes : de 0 à 20 inclus #define NB_NOTE 21 #define NB_TIRAGE 1000000UL int main(void) { unsigned long effectif[NB_NOTE];// appele n dans les formules unsigned short note; // appelee i dans les formules, ici xi = i double moyenne; // appelee x barre dans les formules double ecartMoyen; unsigned long numTirage; unsigned short noteLaMoinsGeneree; unsigned short noteLaPlusGeneree; // Init a 0 du tableau des nombres d'occurence for (note=0; note<NB_NOTE; note++) { effectif[note] = 0; } // Generation des nombres aleatoires (void)printf("Generation et repartition %lu notes dans tableau effectif.\n", NB_TIRAGE); for (numTirage=0; numTirage<NB_TIRAGE; numTirage++) { effectif[rand()%NB_NOTE]++; } // Determination des notes les moins et les plus generees for (note=1, noteLaMoinsGeneree=0, noteLaPlusGeneree=0; note<NB_NOTE; note++) { if (effectif[note] < effectif[noteLaMoinsGeneree]) { noteLaMoinsGeneree = note; } if (effectif[note] > effectif[noteLaPlusGeneree]) { noteLaPlusGeneree = note; } } (void)printf("Note la moins generee : %hu (%lu fois)\n" "Note la plus generee : %hu (%lu fois)\n", noteLaMoinsGeneree, effectif[noteLaMoinsGeneree], noteLaPlusGeneree, effectif[noteLaPlusGeneree]); // Calcul de la moyenne de la série for (note=0, moyenne=0.0; note<NB_NOTE; note++) { moyenne += (double)effectif[note]*(double)note; } moyenne /= (double)NB_TIRAGE; (void)printf("La moyenne = %lf\n", moyenne); // Estimation de l'écart moyen de la série for (note=0, ecartMoyen=0; note<NB_NOTE; note++) { ecartMoyen += (double)effectif[note]*fabs((double)note - moyenne); } ecartMoyen /= (double)NB_TIRAGE; (void)printf("ecart moyen = %lf\n", ecartMoyen); return EXIT_SUCCESS; } // int main(void) </syntaxhighlight> '''Résultats obtenus :''' <PRE> MacMini-TM:~/Documents/c thierry$ ./verifrand.exe Generation et repartition des 1000000 notes dans tableau effectif. Note la moins generee : 14 (47263 fois) Note la plus generee : 6 (48047 fois) La moyenne = 9.991110 ecart moyen = 5.236995 </PRE> }} </div> ===Remarques sur l'exercice=== * La série générée avec <code>rand()</code> sur ma machine est bien centrée sur la moyenne théorique 10/20 : les nombres de notes en dessous et au dessus de 10 sont quasi-identiques. L'écart moyen de la série est proche de 5 ce qui indique que les notes sont bien réparties. * La fonction <code>rand()</code> est pseudo-aléatoire : deux exécutions du programme donnent exactement la même série de note. * Vous pouvez tester d'autres fonctions comme <code>random()</code> ou <code>arc4random()</code>. Cette dernière, de qualité cryptographique, utilise l'algorithme nommé [[w:RC4|ARC4]]. Elle est aléatoire. iu1pm7xh5aq5z542ff7jwjb5cdg48ta Programmation C++/Les références 0 7652 682179 668082 2022-07-22T18:05:46Z DavidL 1746 wikitext text/x-wiki <noinclude>{{Programmation C++}}</noinclude> == Présentation des références == Une référence peut être vue comme un alias d'une variable. C'est-à-dire qu'utiliser la variable, ou une référence à cette variable est équivalent. Ce qui signifie que l'on peut modifier le contenu de la variable en utilisant une référence. Une référence ne peut être initialisée qu'une seule fois : à la déclaration. Toute autre affectation modifie en fait la variable référencée. Une référence ne peut donc référencer qu'une seule variable tout au long de sa durée de vie. === Déclaration === La déclaration d'une variable de type référence doit inclure son initialisation : <syntaxhighlight lang="cpp"> type& identificateur=variable; // Syntaxe d'initialisation des variables // ou (strictement équivalent) type& identificateur(variable); // Syntaxe d'initialisation des objets </syntaxhighlight> Un paramètre de méthode ou de fonction de type référence est initialisé lors de l'appel à celle-ci : <syntaxhighlight lang="cpp"> type_retour nomFonctionOuMethode(type& identificateur) { // ... } // ... nomFonctionOuMethode(variable); </syntaxhighlight> === Sémantique === La variable <code>''identificateur''</code> est une référence vers la variable <code>''variable''</code>. La variable <code>''variable''</code> doit être de type <code>''type''</code>. === Exemple de programme === <syntaxhighlight lang="cpp"> #include <iostream> using namespace std; int main() { int a = 98, b = 78, c; int &x = a; c = x + 5; // équivaut à : c = a + 5; int &y = b; y = a + 10; // équivaut à : b = a + 10; cout << "La variable b vaut : " << b << endl; cout << "La variable c vaut : " << c << endl; return 0; } </syntaxhighlight> ==== Exécution ==== La variable b vaut : 108 La variable c vaut : 103 ==== Explications ==== * Dans ce programme, on définit 3 variables entières <code>a</code>, <code>b</code> et <code>c</code> et on initialise <code>a</code> à <code>98</code> et <code>b</code> à <code>78</code>. * <code>int &x=a;</code> permet de déclarer une référence <code>x</code> vers la variable <code>a</code>. <code>x+5</code> vaut donc la même chose que <code>a+5</code> donc <code>103</code>. * <code>c=x+5;</code> permet donc de transférer <code>103</code> dans la variable <code>c</code>. * <code>int &y=b;</code> permet de déclarer une référence <code>y</code> vers la variable <code>b</code>. <code>a+10</code> vaut <code>98+10</code> donc <code>108</code>. * <code>y=a+10;</code> permet de transférer <code>108</code> dans la variable <code>b</code>. * on affiche ensuite <code>b</code> et <code>c</code> c'est-à-dire respectivement <code>108</code> et <code>103</code>. === Pourquoi utiliser une référence ? === C'est la question qui peut se poser en regardant l'exemple ci-dessous, où il serait plus clair d'utiliser directement des variables. Les références sont principalement utilisées pour passer des paramètres aux fonctions. Voir le [[Programmation C plus plus Les fonctions|chapitre sur les fonctions]], section « [[Programmation C plus plus Les fonctions#Passage de paramètres par référence|passage de paramètres par référence]] ». Les références constantes sont également utilisées pour référencer des résultats de retour de fonctions afin d'éviter les copies. C'est particulièrement indiqué dans le cas d'objets retournés par des fonctions. Dans ce cas, la valeur ou objet temporaire retourné a une durée de vie aussi longue que la référence. '''Exemple :''' <syntaxhighlight lang="cpp"> class Retour { public: void g() const {} }; Retour f() { return Retour(); } int main(int argc, char *argv[]) { const Retour &retour = f(); retour.g(); return 0; } </syntaxhighlight> == Les références et leur lien avec les pointeurs == Une référence est un pointeur que l'on ne peut pas réaffecter (car le compilateur l'interdit), qui se déréférence automatiquement (à l'inverse d'un pointeur pour lequel on doit utiliser l'opérateur d'indirection), et dont à l'inverse d'un pointeur on ne peut connaître l'adresse car le compilateur ne le permet pas. En effet, si ''v'' est une référence alors ''&v'' donnera l'adresse de l'objet référencé par ''v'', et non l'adresse de la case mémoire où est stockée la référence. == Exercices == === Exercice 1 === Faites une fonction dont la déclaration sera <code>void échanger(int & a, int & b)</code> qui devra échanger les deux valeurs. {{Boîte déroulante|titre = Solution|contenu= <syntaxhighlight lang="cpp"> void échanger(int & a, int & b) { int c = a; a = b; b = c; } </syntaxhighlight>}} === Exercice 2 === Faites une fonction pour calculer la factorielle d'un nombre. Sa déclaration sera <code>int fact(int & n)</code>. La fonction sera récursive et la valeur de retour sera n. En cas de problèmes, consulter l'Aide 1. {{Boîte déroulante|titre = Aide 1|contenu= La factorielle (notée "!") est une fonction mathématique.<br /> Voici quelques exemple :<br /> 4! = 4 x 3 x 2 x 1 = 24<br /> 3! = 3 x 2 x 1 = 6<br /> 2! = 2 x 1 = 2<br /> 1! = 1<br /> Notez que :<br /> 4! = 4 x 3!<br /> 3! = 3 x 2!<br /> 2! = 2 x 1! = 2 x 1<br /> D'où :<br /> !n = n x !(n-1) si n > 1}} {{Boîte déroulante|titre = Solution|contenu= Voici un exemple de fonction récursive qui ne répond pas à la consigne d'avoir une déclaration int factorielle (int & n) et qui par conséquent ne peut être qualifiée de solution à l'exercice 2 : <syntaxhighlight lang="cpp"> #include <iostream> using namespace std; int factorielle(int n) { if(n == 1) return 1; return n * factorielle(n-1); } int main(void) { int y = factorielle(2); cout << "résultat : " << y << endl; } </syntaxhighlight> Une autre solution est (mais la fonction retourne factoriel n, pas n) : <syntaxhighlight lang="cpp"> #include <iostream> using namespace std; int factorielle(int& n) { if(n == 1) return 1; n--; return (n+1) * factorielle(n); } int main(void) { int n = 2; int y = factorielle(n); cout << "résultat : " << y << endl; } </syntaxhighlight> Une autre solution : <syntaxhighlight lang="cpp"> #include <iostream> int fact(int & n) { if (n == 0) { n = 1; return 0; } else if (n == 1) return 1; else { int t = n-1; int retVal = fact(t); n = t * n; return n/t; } } main() { int v = 4; int res = fact(v); std::cout << res << " et sa factorielle :" << v << std::endl; } </syntaxhighlight> }} == Tests == === Test 1 === Indiquez si la syntaxe est correcte ou non. ==== Cas 1 ==== <syntaxhighlight lang="cpp"> int b = n; int & ref = b; </syntaxhighlight> ==== Cas 2 ==== <syntaxhighlight lang="cpp"> int x = 5; int & var = x; </syntaxhighlight> ==== Cas 3 ==== <syntaxhighlight lang="cpp"> int n = 2; int & ref = n; if (*(ref) == 2) ref++; //ceci provoque une erreur car ref n'est pas un pointeur </syntaxhighlight> ==== Cas 4 ==== <syntaxhighlight lang = "cpp"> #include <iostream> using namespace std; void afficher_par_reference(int & a) { cout << a << endl; } </syntaxhighlight> ==== Cas 5 ==== <syntaxhighlight lang = "cpp"> int b = 2; int ref& = b; </syntaxhighlight> ==== Solution ==== {{Boîte déroulante|titre = Solutions|contenu = # vrai # vrai # faux # vrai # faux}} === Test 2 === Dans ces exemples, trouvez ce que le programme va afficher. ==== Cas 1 ==== <syntaxhighlight lang = "cpp"> #include <iostream> using namespace std; int main() { int b = 2; int a = 4; int & ref1 = b; int & ref2 = a; ref2 += ref1; ref1 -= ref2; cout << ref2 << " " << ref1 << endl; } </syntaxhighlight> {{Boîte déroulante|titre=Solution|contenu= <pre> 6 -4 </pre> }} {{AutoCat}} m81oubs52ihl8bp9jotyav15197itd4 Programmation Octave 0 8860 682187 662550 2022-07-22T18:48:22Z DavidL 1746 wikitext text/x-wiki {{Page de garde|image=Gnu-octave-logo.svg|description= ''Un livre appartenant à [[Accueil/Informatique|L'étagère Informatique]] et [[Accueil/Sciences de la nature et sciences exactes|Mathématiques]]. Ce livre est une introduction à l'utilisation des outils de calcul numériques Octave (et Matlab), qui se veut simple et illustrative par des exemples. |avancement=Avancé |cdu= * {{CDU item|5|51}} * {{CDU item|6/68/681|681.3/681.3.0}} |versions= {{wiki}} }} Il n'est pas envisagé que cela devienne un ouvrage complet et donc complexe. Un tel livre aurait bien sûr sa place comme le livre anglophone http://en.wikibooks.org/wiki/MATLAB_Programming (que nous espérons avec votre aide, traduire et adapter en français) et il devrait mettre en évidence le fait que la programmation MATLAB et Octave sont très similaires et peuvent donc pour l'essentiel être traitée dans un seul ouvrage. == Sommaire == {{/Sommaire}} == Auteurs == * [http://www.the-asw.com/articles/2005/11/11/54-scite-l-editeur-indispensable C Go] * [[Utilisateur:Npettiaux|Nicolas Pettiaux]] == Références == * [http://www.the-asw.com/articles/2005/11/11/54-scite-l-editeur-indispensable Utilisation de l'éditeur Scite] * [http://www.gnu.org/software/octave/docs.html Documentation Octave] [[Catégorie:Mathématiques|Octave]] [[Catégorie:Logiciels scientifiques|Octave]] [[Catégorie:Programmation Octave (livre)|!]] r4z9rmq4hzmzdyz7aeo9r5pb5wa4ubf 682209 682187 2022-07-22T19:03:36Z DavidL 1746 wikitext text/x-wiki {{Page de garde|image=Gnu-octave-logo.svg|description= ''Un livre appartenant à [[Accueil/Informatique|L'étagère Informatique]] et [[Accueil/Sciences de la nature et sciences exactes|Mathématiques]]. Ce livre est une introduction à l'utilisation des outils de calcul numériques Octave (et Matlab), qui se veut simple et illustrative par des exemples. |avancement=Avancé |cdu= * {{CDU item|5|51}} * {{CDU item|6/68/681|681.3/681.3.0}} |versions= {{Version imprimable}} {{wiki}} }} Il n'est pas envisagé que cela devienne un ouvrage complet et donc complexe. Un tel livre aurait bien sûr sa place comme le livre anglophone http://en.wikibooks.org/wiki/MATLAB_Programming (que nous espérons avec votre aide, traduire et adapter en français) et il devrait mettre en évidence le fait que la programmation MATLAB et Octave sont très similaires et peuvent donc pour l'essentiel être traitée dans un seul ouvrage. == Sommaire == {{/Sommaire}} == Auteurs == * [http://www.the-asw.com/articles/2005/11/11/54-scite-l-editeur-indispensable C Go] * [[Utilisateur:Npettiaux|Nicolas Pettiaux]] == Références == * [http://www.the-asw.com/articles/2005/11/11/54-scite-l-editeur-indispensable Utilisation de l'éditeur Scite] * [http://www.gnu.org/software/octave/docs.html Documentation Octave] [[Catégorie:Mathématiques|Octave]] [[Catégorie:Logiciels scientifiques|Octave]] [[Catégorie:Programmation Octave (livre)|!]] 93xl38gq566p7w311t8puyxfye9w51f 682210 682209 2022-07-22T19:04:42Z DavidL 1746 /* Sommaire */ wikitext text/x-wiki {{Page de garde|image=Gnu-octave-logo.svg|description= ''Un livre appartenant à [[Accueil/Informatique|L'étagère Informatique]] et [[Accueil/Sciences de la nature et sciences exactes|Mathématiques]]. Ce livre est une introduction à l'utilisation des outils de calcul numériques Octave (et Matlab), qui se veut simple et illustrative par des exemples. |avancement=Avancé |cdu= * {{CDU item|5|51}} * {{CDU item|6/68/681|681.3/681.3.0}} |versions= {{Version imprimable}} {{wiki}} }} Il n'est pas envisagé que cela devienne un ouvrage complet et donc complexe. Un tel livre aurait bien sûr sa place comme le livre anglophone http://en.wikibooks.org/wiki/MATLAB_Programming (que nous espérons avec votre aide, traduire et adapter en français) et il devrait mettre en évidence le fait que la programmation MATLAB et Octave sont très similaires et peuvent donc pour l'essentiel être traitée dans un seul ouvrage. == Sommaire == [[Fichier:Octave-v3.8.2-gui-fr.png|thumb|Interface graphique]] {{/Sommaire}} == Auteurs == * [http://www.the-asw.com/articles/2005/11/11/54-scite-l-editeur-indispensable C Go] * [[Utilisateur:Npettiaux|Nicolas Pettiaux]] == Références == * [http://www.the-asw.com/articles/2005/11/11/54-scite-l-editeur-indispensable Utilisation de l'éditeur Scite] * [http://www.gnu.org/software/octave/docs.html Documentation Octave] [[Catégorie:Mathématiques|Octave]] [[Catégorie:Logiciels scientifiques|Octave]] [[Catégorie:Programmation Octave (livre)|!]] q5td1b8dbiq9y6k2werw7dwmbzu2b8b MediaWiki:Common.css 8 8870 682167 680839 2022-07-22T15:30:29Z DavidL 1746 + classes CSS pour lettrine sans modèle css text/css .wgfrwikibooks_CommonCssVersion:after{content:"20220624003";} /* Le CSS placé ici sera appliqué à toutes les apparences. <indicator name="version"><span class="wgfrwikibooks_CommonCssVersion">Version courante : </span></indicator> Effectuez toujours un [http://jigsaw.w3.org/css-validator/validator?uri=http%3A%2F%2Ffr.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DMediaWiki%3ACommon.css%26action%3Draw%26ctype%3Dtext%2Fcss&usermedium=all test de validation CSS] après chaque modification et [http://validator.w3.org/ vérifiez] que les pages concernées par les modifications de cette feuille de style produise un code HTML valide. RECOMMANDÉ : * pour les couleurs, utiliser si possible l'une des 216 couleurs web standards (en hexadécimal pour chaque composante, n'utiliser que les chiffres multiples de 3 doublés: 00 33 66 99 cc ff) Voir aussi : - [[Mediawiki:Common.js]] - [[MediaWiki:Geshi.css]] - [[Mediawiki:Monobook.css]] - [[Mediawiki:Vector.css]] == CLASSES GÉNÉRALES == */ body.mediawiki .only_mobile { display:none; } .newbooks-0 { display:none; } body .mw-highlight { position: initial; } table { background: None; } .link-wikipedia { background: url("//upload.wikimedia.org/wikipedia/commons/8/85/Wikipedia-logo-14px.png") no-repeat center left !important; padding-left:17px !important; } .opaque { background-color: white; } /* Pour les catégories : clear avant les rubriques sous-catégorie, et pages */ #mw-subcategories, #mw-pages { clear:both; } /* Clear pour les bas de page */ .content-footer { clear:both; } /* Zone hachurée */ .hachure { background: linear-gradient(45deg, #ccc 1%, #0000 1%, #0000 49%, #ccc 49%, #ccc 51%, #0000 51%, #0000 99%, #ccc 99%); background-size: 6px 6px; } /* Affichage en fond transparent de <code></code> */ code { background-color: transparent; border: 0; } .mw-parser-output { position: relative; } /* DESCRIPTION DES GADGETS */ .gadget-new:before { content:"Nouveau ! "; color:red; font-weight:bold; font-style:italic; } .gadget-ext { background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAVklEQVR4Xn3PgQkAMQhDUXfqTu7kTtkpd5RA8AInfArtQ2iRXFWT2QedAfttj2FsPIOE1eCOlEuoWWjgzYaB/IkeGOrxXhqB+uA9Bfcm0lAZuh+YIeAD+cAqSz4kCMUAAAAASUVORK5CYII=") no-repeat scroll right center transparent; padding-right:13px; } .gadget-big { background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAACQSURBVDhPlZIBDoAgCEWpK3UnPVOdKc9UfeZ3jLn5c3PaBx4E2jNZVu6ZLGm7iWurza4mOMe0Zy/sb4WMA8sIhEgQTm7otMU77Q75/EcxEBgQgUyUtVh9LgAc72GVmrPuHzgOPMux9hY8wHEgeBmKqWJD5w/gxDdtMQd0r2s2ZenB9WFwBqPnanB+DXGykfECNY3C1VRyg0AAAAAASUVORK5CYII=") no-repeat scroll right center transparent; padding-right:23px; } /* CATÉGORIES CACHÉES */ /* Si toutes les catégories d'une page sont cachées, les afficher quand même (comme ça le script peut afficher le "+") */ .catlinks-allhidden { display: block; } /* Masquage du lien vers [[Special:Upload]], remplacement par un autre lien dans Monobook.js */ #t-upload { display:none } table.normale th, table.normale td { vertical-align: top; } /* cacher les crochets pour les notes par défaut */ .cite_crochet { display: none } /* pour lettrines */ .lettrine:first-letter { margin-right: 0.1em; float: left; font-size: 4em; font-weight: bold; } /* mise en valeur des références cliquées */ ol.references > li:target { background-color: #DDEEFF; } /* pour harmoniser les exposants */ /*.exposant { vertical-align: text-top; }*/ /* pour diminuer la taille des notes lorsqu'elles sont générées par le modèle "Références" */ .references-small { font-size: 90%;} /* dans special:allpages et special:watchlist, rendre plus visible les pages étant des redirects (allpagesredirect est déjà en italique par défaut) */ .allpagesredirect a, .watchlistredir a { color:green; } /* pour les petits liens en bas à droite des cadres */ .portailLienEdition, .SmallRightLink, .SmallRightText { display:block; font-size:x-small; text-align:right; clear:both; } /* cache le titre sur la page d'accueil */ .page-Accueil .firstHeading {display:none} /* MODÈLES DE COORDONNÉES */ /* Voir [[Modèle:Coord]] pour l'utilité de ces classes. Notez que les classes "geo", "longitude", et "latitude" ne sont pas simplement des styles mais servent aussi à l'export au Geo microformat, il ne faut pas les renommer. */ .geo-default { display:inline } .geo-nondefault { display:none } .geo-dms { display:inline } .geo-dec { display:inline } .geo-multi-punct { display:none } .longitude .latitude { white-space:nowrap } /* === Style de numérotation des listes ordonnées === Utiliser une balise &lt;div class="list-..."&gt; pour encadrer la liste. */ /* NIVEAU 1 */ .list-upper-roman li { list-style-type: upper-roman; } .list-lower-roman li { list-style-type: lower-roman; } .list-upper-latin li { list-style-type: upper-latin; } .list-lower-latin li { list-style-type: lower-latin; } /* NIVEAU 2 */ .list-upper-roman2 li li { list-style-type: upper-roman; } .list-lower-roman2 li li { list-style-type: lower-roman; } .list-upper-latin2 li li { list-style-type: upper-latin; } .list-lower-latin2 li li { list-style-type: lower-latin; } /* NIVEAU 3 */ .list-upper-roman3 li li li { list-style-type: upper-roman; } .list-lower-roman3 li li li { list-style-type: lower-roman; } .list-upper-latin3 li li li { list-style-type: upper-latin; } .list-lower-latin3 li li li { list-style-type: lower-latin; } /* === Tableau standard en utilisant class="wikitable" === */ table.wikitable { margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaaaaa solid; border-collapse: collapse; } table.wikitable > tbody > th, table.wikitable > tbody > td { border: 1px #aaaaaa solid; padding: 0.2em; } table.wikitable > tbody > th { background: #f2f2f2; text-align: center; } table.wikitable > caption { margin-left: inherit; margin-right: inherit; } /* === Tableau standard en utilisant class="charttable" === */ table.charttable { margin: 0; background: #ffffff; border: 1px #999999 solid; border-collapse: collapse; } table.charttable > tbody > th, table.charttable > tbody > td { padding: 0.2em; } table.charttable > tbody > th { background: #f2f2f2; text-align: center; } table.charttable > caption { margin-left: inherit; margin-right: inherit; } table.altlines1 > tbody > tr:nth-child(odd) {background: #f0f0f0} table.altlines2 > tbody > tr:nth-child(even) {background: #f0f0f0} /* == Messages systèmes == */ div.mw-lag-warn-normal, div.mw-lag-warn-high { text-align: left ! important; width: 50% ! important; } .mw-alerte { width:100%; clear:both; background-color:antiquewhite; border:2px solid darkorange; } /* Boites à outils, dans certains messages systèmes (Historique, Recherche, Contributions...) */ .mw-toolbox { font-size:90%; background-color:#F8F8F8; border:1px solid #B8B8B8; padding:0.25em 1em 0.25em 1em; clear:both; } /* Boite grisée, par exemple pour le renommage */ .mw-greybox { border:1px solid #ccd2d9; background-color:#f0f6fa; padding:0.25em 1em 0.25em 1em; clear:both; } .list-in ul, .list-in ol { list-style-position: inside; } /* Par défaut les listes non ordonnées ont une faible marge pour la puce devant les items, tandis que les listes ordonnées ont une marge plus grande pour le numéro potentiellement grand. Donc l'emploi de listes ordonnées et non ordonnées donnent des items non alignés par défaut. Uniformiser les marges des listes : - Pour les recettes de cuisine - Pour le contenu ayant la classe "unilist" */ .rootpage-Livre_de_cuisine .mw-content-ltr ul, .rootpage-Livre_de_cuisine .mw-content-rtl .mw-content-ltr ul, .rootpage-Livre_de_cuisine .mw-content-ltr ol, .rootpage-Livre_de_cuisine .mw-content-rtl .mw-content-ltr ol { margin-left: 2.4em; } .mw-content-ltr .unilist ul, .mw-content-rtl .mw-content-ltr .unilist ul, .mw-content-ltr .unilist ol, .mw-content-rtl .mw-content-ltr .unilist ol { margin-left: 2.4em; } .rootpage-Livre_de_cuisine .mw-content-rtl ul, .rootpage-Livre_de_cuisine .mw-content-ltr .mw-content-rtl ul, .rootpage-Livre_de_cuisine .mw-content-rtl ol, .rootpage-Livre_de_cuisine .mw-content-ltr .mw-content-rtl ol { margin-right: 2.4em; } .mw-content-rtl .unilist ul, .mw-content-ltr .mw-content-rtl .unilist ul, .mw-content-rtl .unilist ol, .mw-content-ltr .mw-content-rtl .unilist ol { margin-right: 2.4em; } /* == ÉLÉMENTS UNIQUES == Pour les id="..." */ #entete_accueil { width:80%; margin:0 auto; font-size:115%; line-height:1.3em; font-weight:bold; margin-bottom:0; text-align:center; } #browsebar { margin-top:-3px; margin-bottom:0.5em; font-variant: small-caps; text-align: center; font-size: 102%; } #browsebar ul, #browsebar li, #browsebar p { display:inline } #browsebar ul { margin-left:0; } #browsebar ul li:after { content: "\A0– " } #browsebar ul li:after { content: "" } /* == ÉLÉMENTS GÉNÉRIQUES == === Retrait des liens modifier === Pour supprimer le lien "modifier" à côté d'une section donnée, utiliser <div class="noeditsection"></div>. */ .noeditsection span.editsection { display: none; } /* == Pour [[Modèle:TopNav]] == */ #top-navigation { position:absolute; right: 1.15em; top: 3.0em; } /* == Coloration indentative == */ .ns-1 dd, .ns-3 dd, .ns-5 dd, .ns-7 dd, .ns-9 dd, .ns-11 dd, .ns-13 dd,.ns-15 dd, .colorationindentative dd { margin: 0; padding: 0; } .ns-1 dl, .ns-3 dl, .ns-5 dl, .ns-7 dl, .ns-9 dl, .ns-11 dl, .ns-13 dl, .ns-15 dl, .colorationindentative dl { border-top: solid 1px lightgrey; border-left: solid 1px lightgrey; padding-top: 0.5em; padding-left: 0.5em; margin-left: 1em; } /* == Boites déroulantes == */ div.BoxenVerschmelzen, div.NavFrame { margin: 0px; padding: 2px; border: 1px solid #aaaaaa; border-collapse: collapse; font-size: 95%; } div.BoxenVerschmelzen div.NavFrame { border-style: none; border-style: hidden; } div.NavFrame + div.NavFrame { border-top-style: none; border-top-style: hidden; } div.NavPic { background-color: #ffffff; margin: 0px; padding: 2px; float: left; } div.NavFrame div.NavHead { height: 1.6em; vertical-align: middle; font-weight: bold; font-size: 100%; background-color: #efefef; } div.NavHead p { margin: 0; vertical-align: middle; } div.NavFrame p { font-size: 100%; } div.NavFrame div.NavContent { font-size: 100%; } div.NavFrame div.NavContent p { font-size: 100%; } div.NavEnd { margin: 0px; padding: 0px; line-height: 1px; clear: both; } /* == Classes pour autoriser une centralisation des sommaires == Auteurs : [[w:user:Lachaume]], [[user:J.M. Tavernier]] Premièrement sont définis les identifiants séparés calqués sur l'apparence de #toc du thème monobook depuis /style/monobook/main.css définis séparément pour ne pas produire du code invalide au test http://validator.w3.org/ lorsque plusieurs types de sommaires sont utilisés dans une page. Puis la définition de la classe "linelist" qui permet de simuler une liste ordonnée plate à partir d'une liste ordonnée en colonne. Enfin la classe "numbersonly" qui est censée pouvoir n'afficher que les nombres, sans le texte dans un sommaire condensé destiné à être placé en bas des pages. Ces classes sont destinées à fonctionner en corrélation avec le [[Modèle:Sommaire]]. */ #sommaire_droite, #sommaire_haut, #sommaire_bas { border:1px solid #aaaaaa; background-color:#f9f9f9; padding:5px; font-size: 95%; } #sommaire_droite { width:200px; float:right; } #sommaire_prog { width:200px; float:right; background:white; border:3px blue solid; border-style: inset; margin:0; margin-left: 1em; border-spacing: 0; } #sommaire_prog th, #sommaire_prog td { padding:2px; } #sommaire_prog a, #sommaire_prog p { background:none; } #sommaire_prog h3, * #sommaire_prog h2 { font-size:small; margin:0; padding:0; border:none; text-align:center; background:#E0E0F0; font-weight:bold; } #sommaire .editsection { display:none } #sommaire ol { margin: 0.3em 0 0 2em; } #sommaire_prog ol { font-size:smaller; } .linelist ol { margin-left:0em ; counter-reset: item } .linelist ol li { display:inline ; white-space:normal ;} .linelist ol li:after { content: " · " } .linelist ol li:after { content: "" } .linelist ol li a:before { content: counter(item) ".\A0"; counter-increment: item } .linelist ol li .selflink:before { content: counter(item) ".\A0"; counter-increment: item } /* == EN-TÊTES == */ .headergris { background: url("//upload.wikimedia.org/wikipedia/commons/d/d7/Bookbar2.png") right; background-repeat: no-repeat; margin:0; background-color:#F0F0F0; font-size:120%; font-weight:bold; border:1px solid #a3b0bf; text-align:left; color:#000000; padding:0.2em 0.4em; } .headerbleu { background: url("//upload.wikimedia.org/wikipedia/commons/a/a2/Bookbar1.png") right; background-repeat: no-repeat; margin:0; background-color:#F0F0F0; font-size:120%; font-weight:bold; border:1px solid #a3b0bf; text-align:left; color:#000000; padding:0.2em 0.4em; } .headergris span.editsection, .headerbleu span.editsection, .headergris a.NavToggle, .headerbleu a.NavToggle { margin-right: 100px; } /* == ÉLÉMENTS À NE PAS AFFICHER DANS LA VERSION IMPRIMABLE == */ @media print { .firstHeading, .editlink, .noprint, .metadata, .dablink, #top-navigation, #contentSub, .toc, .bookInfobox, .catlinks, #privacy, #about, #disclaimer{ display: none !important; } a { margin: auto 1px; } } /* == Style des méta-bandeaux et des méta-étiquettes == voir [[Modèle:Méta-bandeau]] et voir [[Modèle:Méta-étiquette]] */ .bandeau { border: #cccccc solid 1px; margin-top: 5px; margin-bottom: 5px; margin-left: auto; margin-right: auto; border-left: solid 10px; padding: 0px; width: 70%; /* largeur par défaut : peut être modifiée en utilisant les classes suivantes */ border-left-color: #aaaaaa; /* couleur par défaut : peut être modifiée en utilisant les classes suivantes */ } .bandeautitre { font-weight: bold; margin: 0; padding: 2px 10px 0px 25px; background-color: inherit; } .etiquette { border: #cccccc solid 1px; background-color: white; border-left: solid 10px; padding: 5px; width: 250px; border-left-color: #aaaaaa; /* couleur par défaut, remplaçable */ margin-top: 0.5em; margin-bottom: 0.5em; } .etiquettedroite { clear: right; float: right; margin-left: 2em; } .etiquettegauche { clear: left; float: left; margin-right: 2em; } .bandeauvert, .etiquettevert { border-left-color: #228b22; } .bandeauvert .bandeautitre { background-color: #eeffee; } .bandeaurouge, .etiquetterouge { border-left-color: #c22222; } .bandeaurouge .bandeautitre { background-color: #ffeeee; } .bandeauorange, .etiquetteorange { border-left-color: #ffaa00; } .bandeauorange .bandeautitre { background-color: #ffefc6; } .bandeauviolet, .etiquetteviolet { border-left-color: #9932cc; } .bandeauviolet .bandeautitre { background-color: #f5d9ff; } .bandeaubleu, .etiquettebleu { border-left-color: #1e90ff; } .bandeaubleu .bandeautitre { background-color: #ccecff; } .bandeaujaune, .etiquettejaune { border-left-color: #fbe80f; } .bandeaujaune .bandeautitre { background-color: #ffffdd; } .bandeaupetit { width: 50%; } .bandeaumoyen { width: 60%; } .bandeaugrand { width: 90%; } /* == Icônes de titre == */ .icone_de_titre { margin-left: 0.4em; } /* LETTRINE Sans avoir besoin d'encadrer la première lettre. class="lettrine<H>" où <H> est la hauteur en nombre de lignes (1 à 4). */ .lettrine1 p:first-child:first-letter { float:left; text-shadow:3px 3px 3px silver; padding-right:.1em; line-height:80%; margin:0px; font-size:1.8em; } .lettrine2 p:first-child:first-letter { float:left; text-shadow:3px 3px 3px silver; padding-right:.1em; line-height:80%; margin:0px; font-size:3.6em; } .lettrine3 p:first-child:first-letter { float:left; text-shadow:3px 3px 3px silver; padding-right:.1em; line-height:80%; margin:0px; font-size:5.4em; } .lettrine4 p:first-child:first-letter { float:left; text-shadow:3px 3px 3px silver; padding-right:.1em; line-height:80%; margin:0px; font-size:7.2em; } /* == Corrections impression du code source == */ @media print { pre { font-size:100%; } } /* DÉBUT DES SCHÉMAS DE COULEUR DE "CADRE À ONGLETS" Fonctionnement du [[Modèle:Cadre à onglets]] Modèle implanté par User:Peleguer de //ca.wikipedia.org Actualisé par User:Joanjoc de //ca.wikipedia.org Traduction et adaptation User:Antaya de //fr.wikipedia.org Couleurs pour le [[Modèle:Cadre à onglets]] Configuration des couleurs par défaut Couleurs utilisées; 1; 8080ff 2; 9f9fff 3; c4c4ff 4; ddddff 5; eaeaff */ .mbBouton { background-color: #ddddff; border: 0.15em solid #000000; border-color: #eaeaff #c4c4ff #9f9fff #eaeaff; -moz-border-radius: .5em .5em 0em 0em; /* NE VALIDE PAS AU w3c VALIDATOR */ border-radius: .5em .5em 0em 0em; cursor:pointer; display: inline; margin-right: 0.1em; padding: 0.2em 0.3em 0.2em 0.3em; position: relative;} .mbBouton a, .mbBouton strong { background: none !important; color:#8080ff !important; /* 1 */ font-size: 90%; font-weight: bold; padding: 0 !important; text-decoration: none !important;} .mbBouton a:hover, .mbBouton strong:hover { color: black !important; text-decoration: underline !important;} .mbBoutonSel { background-color: #9f9fff; /* 2 */ border: 0.15em solid #000000; border-color: #c4c4ff #8080ff #9f9fff #c4c4ff; /* 3 1 2 3 */ -moz-border-radius: .5em .5em 0em 0em; border-radius: .5em .5em 0em 0em; cursor: default; display: inline; margin-right: 0.1em; padding: 0.2em 0.3em 0.2em 0.3em; position: relative; color:white;} .mbBoutonSel a { background: none !important; color:white !important; cursor: default; font-size: 90%; font-weight: bold; padding: 0 !important; text-decoration: none !important;} .mbContenu { background-color: #f8f8ff; border: 0.2em solid #9f9fff; /* 2 */ border-color: #9f9fff #8080ff #8080ff #9f9fff ; /* 2 1 1 2 */ -moz-border-radius: 0em .5em .5em 0em; border-radius: 0em .5em .5em 0em; padding: 1em; position: static; } .mbOnglet { background-color: #f8f8ff; border-color: #8080ff #c4c4ff #c4c4ff #8080ff; /* 1 3 3 1 */ width: 100%; } /* Configuration du Lilas 1;7050a0 2;9070c0 3;b090e0 4;d0b0ff 5;f0d0ff */ .mbLilas .mbBouton { background-color: #d0b0ff; /* 4 */ border-color: #f0d0ff #b090e0 #9070c0 #f0d0ff; /* 5 3 2 5 */} .mbLilas .mbBouton a, .mbLilas .mbBouton strong { color:#8080ff !important; /* 1 */ font-size:90%} .mbLilas .mbBouton a:hover, .mbLilas .mbBouton strong:hover { color: black !important; text-decoration: underline;} .mbLilas .mbBoutonSel { background-color: #9070c0; /* 2 */ border-color: #b090e0 #7050a0 #9070c0 #b090e0; /* 3 1 2 3 */} .mbLilas .mbContenu { background-color: #f5fffa; border-color: #9070c0 #7050a0 #7050a0 #9070c0 ; /* 2 1 1 2 */} .mbLilas .mbOnglet { background-color: #f5fffa; border-color: #7050a0 #b090e0 #b090e0 #7050a0; /* 1 3 3 1 */} /* Configuration du Vert 1;60b030 2;75c045 3;90d060 4;a5e085 5;c0f090 */ .mbVert .mbBouton { background-color: #a5e085; /* 4 */ border-color: #c0f090 #90d060 #75c045 #c0f090; /* 5 3 2 5 */} .mbVert .mbBouton a, .mbVert .mbBouton strong { color:#60b030 !important; /* 1 */ font-size:90%} .mbVert .mbBouton a:hover, .mbVert .mbBouton strong:hover { color: black !important; text-decoration: underline;} .mbVert .mbBoutonSel { background-color: #75c045; /* 2 */ border-color: #90d060 #60b030 #75c045 #90d060; /* 3 1 2 3 */} .mbVert .mbContenu { background-color: #f5fffa; border-color: #75c045 #60b030 #60b030 #75c045 ; /* 2 1 1 2 */} .mbVert .mbOnglet { background-color: #f5fffa; border-color: #60b030 #90d060 #90d060 #60b030; /* 1 3 3 1 */} /* Configuration du Bleu 1;3379de 2;5b8dd6 3;88abde 4;a7c1e6 5;c8d6e9 */ .mbBleu .mbBouton { background-color: #a7c1e6; /* 4 */ border-color: #c8d6e9 #88abde #5b8dd6 #c8d6e9; /* 5 3 2 5 */} .mbBleu .mbBouton a, .mbBleu .mbBouton strong { color:#3379de !important; /* 1 */ font-size:90%} .mbBleu .mbBouton a:hover .mbBleu .mbBouton strong:hover { color: black !important; text-decoration: underline;} .mbBleu .mbBoutonSel { background-color: #5b8dd6; /* 2 */ border-color: #88abde #3379de #5b8dd6 #88abde; /* 3 1 2 3 */} .mbBleu .mbContenu { background-color: #f0f8ff; border-color: #5b8dd6 #3379de #3379de #5b8dd6; /* 2 1 1 2 */} .mbBleu .mbOnglet { background-color: #f0f8ff; border-color: #3379de #88abde #88abde #3379de; /* 1 3 3 1 */} /* Configuration du Orange 1;ff820e 2;ff9d42 3;ffac5d 4;ffbd7f 5;ffd0a4 6;ffeedd */ .mbOrange .mbBouton { background-color: #ffbd7f; /* 4 */ border-color: #ffd0a4 #ffac5d #ff9d42 #ffd0a4; /* 5 3 2 5 */} .mbOrange .mbBouton a, .mbOrange .mbBouton strong { color:#ff820e !important; /* 1 */ font-size:90%} .mbOrange .mbBouton a:hover .mbOrange .mbBouton strong:hover { color: black !important; text-decoration: underline;} .mbOrange .mbBoutonSel { background-color: #ff9d42; /* 2 */ border-color: #ffac5d #ff820e #ff9d42 #ffac5d; /* 3 1 2 3 */} .mbOrange .mbContenu { background-color: #ffeedd; /* 6 */ border-color: #ff9d42 #ff820e #ff820e #ff9d42; /* 2 1 1 2 */} .mbOrange .mbOnglet { background-color: #ffeedd; /* 6 */ border-color: #ff820e #ffac5d #ffac5d #ff820e; /* 1 3 3 1 */} /* Configuration du Gris 1;666666 2;868686 3;9f9f9f 4;b9b9b9 5;cfcfcf */ .mbGris .mbBouton { background-color: #b9b9b9; /* 4 */ border-color: #cfcfcf #9f9f9f #868686 #cfcfcf; /* 5 3 2 5 */} .mbGris .mbBouton a, .mbGris .mbBouton strong { color:#666666 !important; /* 1 */ font-size:90%} .mbGris .mbBouton a:hover .mbGris .mbBouton strong:hover { color: black !important; text-decoration: underline;} .mbGris .mbBoutonSel { background-color: #868686; /* 2 */ border-color: #9f9f9f #666666 #868686 #9f9f9f; /* 3 1 2 3 */} .mbGris .mbContenu { background-color: #fffce8; border-color: #868686 #666666 #666666 #868686; /* 2 1 1 2 */} .mbGris .mbOnglet { background-color: #fffce8; border-color: #666666 #9f9f9f #9f9f9f #666666; /* 1 3 3 1 */} /* Configuration du Jaune 1;aa8800 2;eabb00 3;ffd52b 4;ffe16a 5;ffeeaa */ .mbJaune .mbBouton { background-color: #ffe16a; /* 4 */ border-color: #ffeeaa #ffd52b #eabb00 #ffeeaa; /* 5 3 2 5 */} .mbJaune .mbBouton a, .mbJaune .mbBouton strong { color:#aa8800!important; /* 1 */ font-size:90%} .mbJaune .mbBouton a:hover .mbJaune .mbBouton strong:hover { color: black !important; text-decoration: underline;} .mbJaune .mbBoutonSel { background-color: #eabb00; /* 2 */ border-color: #ffd52b #aa8800 #eabb00 #ffd52b; /* 3 1 2 3 */} .mbJaune .mbContenu { background-color: #fffce8; border-color: #eabb00 #aa8800 #aa8800 #eabb00; /* 2 1 1 2 */} .mbJaune .mbOnglet { background-color: #fffce8; border-color: #aa8800 #ffd52b #ffd52b #aa8800; /* 1 3 3 1 */} /* Configuration du Rouge 1;993300 2;ca4200 3;ff6215 4;ff9b6a 5;ffc6aa */ .mbRouge .mbBouton { background-color: #ff9b6a; /* 4 */ border-color: #ffc6aa #ff6215 #ca4200 #ffc6aa; /* 5 3 2 5 */} .mbRouge .mbBouton a, .mbRouge .mbBouton strong { color:#993300!important; /* 1 */ font-size:90%} .mbRouge .mbBouton a:hover .mbRouge .mbBouton strong:hover { color: black !important; text-decoration: underline;} .mbRouge .mbBoutonSel { background-color: #ca4200; /* 2 */ border-color: #ff6215 #993300 #ca4200 #ff6215; /* 3 1 2 3 */} .mbRouge .mbContenu { background-color: #fffce8; border-color: #ca4200 #993300 #993300 #ca4200; /* 2 1 1 2 */} .mbRouge .mbOnglet { background-color: #fffce8; border-color: #993300 #ff6215 #ff6215 #993300; /* 1 3 3 1 */} /* ^^^ plus de 50 classes */ /*FIN DES SCHÉMAS DE COULEUR DE "CADRE À ONGLETS"*/ /* Classe hlist comme Wikisource */ .skin-monobook .hlist dl, .skin-modern .hlist dl, .skin-vector .hlist dl { line-height: 1.5em; } .hlist dl, .hlist ol, .hlist ul { margin: 0; padding: 0; } .hlist dd, .hlist dt, .hlist li { margin: 0; display: inline; white-space: nowrap; } .hlist dl dl, .hlist dl ol, .hlist dl ul, .hlist ol dl, .hlist ol ol, .hlist ol ul, .hlist ul dl, .hlist ul ol, .hlist ul ul { display: inline; white-space: normal; } .hlist dt:after { content: ":"; } .hlist dd:after, .hlist li:after { content: " ·"; font-weight: bold; } .hlist dd:last-child:after, .hlist dt:last-child:after, .hlist li:last-child:after { content: none; } .hlist dd.hlist-last-child:after, .hlist dt.hlist-last-child:after, .hlist li.hlist-last-child:after { content: none; } .hlist dd dd:first-child:before, .hlist dd dt:first-child:before, .hlist dd li:first-child:before, .hlist dt dd:first-child:before, .hlist dt dt:first-child:before, .hlist dt li:first-child:before, .hlist li dd:first-child:before, .hlist li dt:first-child:before, .hlist li li:first-child:before { content: "("; font-weight: normal; } .hlist dd dd:last-child:after, .hlist dd dt:last-child:after, .hlist dd li:last-child:after, .hlist dt dd:last-child:after, .hlist dt dt:last-child:after, .hlist dt li:last-child:after, .hlist li dd:last-child:after, .hlist li dt:last-child:after, .hlist li li:last-child:after { content: ")"; font-weight: normal; } .hlist dd dd.hlist-last-child:after, .hlist dd dt.hlist-last-child:after, .hlist dd li.hlist-last-child:after, .hlist dt dd.hlist-last-child:after, .hlist dt dt.hlist-last-child:after, .hlist dt li.hlist-last-child:after, .hlist li dd.hlist-last-child:after, .hlist li dt.hlist-last-child:after, .hlist li li.hlist-last-child:after { content: ")"; font-weight: normal; } .hlist.hnum ol { counter-reset: list-item; } .hlist.hnum ol > li { counter-increment: list-item; } .hlist.hnum ol > li:before { content: counter(list-item) " "; } .hlist.hnum dd ol > li:first-child:before, .hlist.hnum dt ol > li:first-child:before, .hlist.hnum li ol > li:first-child:before { content: "(" counter(list-item) " "; } /** * [[Modèle:Remarque]] */ .remarque:before { content:"Remarque : "; font-weight:bold; } .remarque { margin:2ex auto 2ex 2em; } /* Classe pour les listes horizontales séparées par des puces. Adaptation de la classe 'hlist' de en:User:Edokter. (cf. [[mw:Snippets/Horizontal lists]]). */ .liste-horizontale ul, .liste-horizontale ol, .liste-horizontale li { margin-left: 0; display: inline; white-space: nowrap; *white-space: normal; /* be kind ie7 */ } .liste-horizontale li:after { content: " "; /* au cas ou Mediawiki supprime les retours ligne */ } .liste-horizontale li + li:before { white-space: normal; content: "· "; font-weight: bold; } .liste-horizontale li li:first-child:before { white-space: normal; content: " ("; } .liste-horizontale li ul:after, .liste-horizontale li ol:after{ content: ")"; margin-left: -0.28em; } .liste-horizontale ol { counter-reset: listitem; } .liste-horizontale ol > li { counter-increment: listitem; } .liste-horizontale ol > li:first-child:before { content: "1.\202F"; } .liste-horizontale li ol > li:first-child:before { content: " (1.\202F"; } .liste-horizontale ol > li + li:before { content: "· " counter(listitem) ".\202F"; font-weight: normal; } /* Boîtes à outils */ .mw-toolbox { font-size: 90%; background: #f8f8f8; border: 1px solid #b8b8b8; padding: .25em 1em .25em 1em; clear: both; } /* ----------------------------- */ /* Navigation */ /* Laisser une marge au dessus lors du clic sur une ancre : */ #content [id] { scroll-margin-top: 44px; } .nav-haut { position: sticky; top: 0px; min-height: 40px; opacity: 1; border-bottom: solid 1px #08c; margin-bottom: 0.5em; z-index: 100; } .nav-bas { min-height: 40px; width: 100%; } .pull-left { display: inline-block; } .pull-right { display: inline-block; right: 0; position: absolute; } .nav-chap { position: sticky; top: 41px; z-index: 100; margin-bottom: 0.2em; } .nav-chap-button { width: 48px; height: 48px; display: inline-block; left: calc(50% - 24px); position: absolute; } .nav-chap-open { background-image: url("https://upload.wikimedia.org/wikipedia/commons/5/5f/Ic_expand_more_48px.svg"); } .nav-chap-close { background-image: url("https://upload.wikimedia.org/wikipedia/commons/2/2c/Ic_expand_less_48px.svg"); } /* ----------------------------- */ .left-arrow, .right-arrow { box-shadow: 0 1px 2px rgba(0,0,0,0.15); transition: box-shadow 0.3s ease-in-out; } .left-arrow:hover, .right-arrow:hover { box-shadow: 0 5px 15px rgba(0,0,0,0.3); } /* Multiple colonnes (2 colonnes : half, 3 colonnes : third) affichées sur une seule colonne si la largeur n'est pas suffisante (appareil mobile par exemple). */ .flex-content { display:flex; flex-wrap:wrap; } .flex-content-half { width:48%; } .flex-content-third { width:30%; } .flex-content-half:nth-child(odd), .flex-content-third:nth-child(3n+1), .flex-content-third:nth-child(3n+2) { margin-right:2%; } .flex-content-half:nth-child(even), .flex-content-third:nth-child(3n+2), .flex-content-third:nth-child(3n) { margin-left:2%; } @media (max-width: 700px) { .flex-content-half, .flex-content-third, { width:100%; } .flex-content-half:nth-child(odd), .flex-content-third:nth-child(3n+1), .flex-content-third:nth-child(3n+2) { margin-right:0; } .flex-content-half:nth-child(even), .flex-content-third:nth-child(3n+2), .flex-content-third:nth-child(3n) { margin-left:0; } } hj0kea0xn60cehk7re0sx1ka7ehdb1a 682168 682167 2022-07-22T15:31:44Z DavidL 1746 css text/css .wgfrwikibooks_CommonCssVersion:after{content:"20220722001";} /* Le CSS placé ici sera appliqué à toutes les apparences. <indicator name="version"><span class="wgfrwikibooks_CommonCssVersion">Version courante : </span></indicator> Effectuez toujours un [http://jigsaw.w3.org/css-validator/validator?uri=http%3A%2F%2Ffr.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DMediaWiki%3ACommon.css%26action%3Draw%26ctype%3Dtext%2Fcss&usermedium=all test de validation CSS] après chaque modification et [http://validator.w3.org/ vérifiez] que les pages concernées par les modifications de cette feuille de style produise un code HTML valide. RECOMMANDÉ : * pour les couleurs, utiliser si possible l'une des 216 couleurs web standards (en hexadécimal pour chaque composante, n'utiliser que les chiffres multiples de 3 doublés: 00 33 66 99 cc ff) Voir aussi : - [[Mediawiki:Common.js]] - [[MediaWiki:Geshi.css]] - [[Mediawiki:Monobook.css]] - [[Mediawiki:Vector.css]] == CLASSES GÉNÉRALES == */ body.mediawiki .only_mobile { display:none; } .newbooks-0 { display:none; } body .mw-highlight { position: initial; } table { background: None; } .link-wikipedia { background: url("//upload.wikimedia.org/wikipedia/commons/8/85/Wikipedia-logo-14px.png") no-repeat center left !important; padding-left:17px !important; } .opaque { background-color: white; } /* Pour les catégories : clear avant les rubriques sous-catégorie, et pages */ #mw-subcategories, #mw-pages { clear:both; } /* Clear pour les bas de page */ .content-footer { clear:both; } /* Zone hachurée */ .hachure { background: linear-gradient(45deg, #ccc 1%, #0000 1%, #0000 49%, #ccc 49%, #ccc 51%, #0000 51%, #0000 99%, #ccc 99%); background-size: 6px 6px; } /* Affichage en fond transparent de <code></code> */ code { background-color: transparent; border: 0; } .mw-parser-output { position: relative; } /* DESCRIPTION DES GADGETS */ .gadget-new:before { content:"Nouveau ! "; color:red; font-weight:bold; font-style:italic; } .gadget-ext { background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAVklEQVR4Xn3PgQkAMQhDUXfqTu7kTtkpd5RA8AInfArtQ2iRXFWT2QedAfttj2FsPIOE1eCOlEuoWWjgzYaB/IkeGOrxXhqB+uA9Bfcm0lAZuh+YIeAD+cAqSz4kCMUAAAAASUVORK5CYII=") no-repeat scroll right center transparent; padding-right:13px; } .gadget-big { background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAACQSURBVDhPlZIBDoAgCEWpK3UnPVOdKc9UfeZ3jLn5c3PaBx4E2jNZVu6ZLGm7iWurza4mOMe0Zy/sb4WMA8sIhEgQTm7otMU77Q75/EcxEBgQgUyUtVh9LgAc72GVmrPuHzgOPMux9hY8wHEgeBmKqWJD5w/gxDdtMQd0r2s2ZenB9WFwBqPnanB+DXGykfECNY3C1VRyg0AAAAAASUVORK5CYII=") no-repeat scroll right center transparent; padding-right:23px; } /* CATÉGORIES CACHÉES */ /* Si toutes les catégories d'une page sont cachées, les afficher quand même (comme ça le script peut afficher le "+") */ .catlinks-allhidden { display: block; } /* Masquage du lien vers [[Special:Upload]], remplacement par un autre lien dans Monobook.js */ #t-upload { display:none } table.normale th, table.normale td { vertical-align: top; } /* cacher les crochets pour les notes par défaut */ .cite_crochet { display: none } /* pour lettrines */ .lettrine:first-letter { margin-right: 0.1em; float: left; font-size: 4em; font-weight: bold; } /* mise en valeur des références cliquées */ ol.references > li:target { background-color: #DDEEFF; } /* pour harmoniser les exposants */ /*.exposant { vertical-align: text-top; }*/ /* pour diminuer la taille des notes lorsqu'elles sont générées par le modèle "Références" */ .references-small { font-size: 90%;} /* dans special:allpages et special:watchlist, rendre plus visible les pages étant des redirects (allpagesredirect est déjà en italique par défaut) */ .allpagesredirect a, .watchlistredir a { color:green; } /* pour les petits liens en bas à droite des cadres */ .portailLienEdition, .SmallRightLink, .SmallRightText { display:block; font-size:x-small; text-align:right; clear:both; } /* cache le titre sur la page d'accueil */ .page-Accueil .firstHeading {display:none} /* MODÈLES DE COORDONNÉES */ /* Voir [[Modèle:Coord]] pour l'utilité de ces classes. Notez que les classes "geo", "longitude", et "latitude" ne sont pas simplement des styles mais servent aussi à l'export au Geo microformat, il ne faut pas les renommer. */ .geo-default { display:inline } .geo-nondefault { display:none } .geo-dms { display:inline } .geo-dec { display:inline } .geo-multi-punct { display:none } .longitude .latitude { white-space:nowrap } /* === Style de numérotation des listes ordonnées === Utiliser une balise &lt;div class="list-..."&gt; pour encadrer la liste. */ /* NIVEAU 1 */ .list-upper-roman li { list-style-type: upper-roman; } .list-lower-roman li { list-style-type: lower-roman; } .list-upper-latin li { list-style-type: upper-latin; } .list-lower-latin li { list-style-type: lower-latin; } /* NIVEAU 2 */ .list-upper-roman2 li li { list-style-type: upper-roman; } .list-lower-roman2 li li { list-style-type: lower-roman; } .list-upper-latin2 li li { list-style-type: upper-latin; } .list-lower-latin2 li li { list-style-type: lower-latin; } /* NIVEAU 3 */ .list-upper-roman3 li li li { list-style-type: upper-roman; } .list-lower-roman3 li li li { list-style-type: lower-roman; } .list-upper-latin3 li li li { list-style-type: upper-latin; } .list-lower-latin3 li li li { list-style-type: lower-latin; } /* === Tableau standard en utilisant class="wikitable" === */ table.wikitable { margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaaaaa solid; border-collapse: collapse; } table.wikitable > tbody > th, table.wikitable > tbody > td { border: 1px #aaaaaa solid; padding: 0.2em; } table.wikitable > tbody > th { background: #f2f2f2; text-align: center; } table.wikitable > caption { margin-left: inherit; margin-right: inherit; } /* === Tableau standard en utilisant class="charttable" === */ table.charttable { margin: 0; background: #ffffff; border: 1px #999999 solid; border-collapse: collapse; } table.charttable > tbody > th, table.charttable > tbody > td { padding: 0.2em; } table.charttable > tbody > th { background: #f2f2f2; text-align: center; } table.charttable > caption { margin-left: inherit; margin-right: inherit; } table.altlines1 > tbody > tr:nth-child(odd) {background: #f0f0f0} table.altlines2 > tbody > tr:nth-child(even) {background: #f0f0f0} /* == Messages systèmes == */ div.mw-lag-warn-normal, div.mw-lag-warn-high { text-align: left ! important; width: 50% ! important; } .mw-alerte { width:100%; clear:both; background-color:antiquewhite; border:2px solid darkorange; } /* Boites à outils, dans certains messages systèmes (Historique, Recherche, Contributions...) */ .mw-toolbox { font-size:90%; background-color:#F8F8F8; border:1px solid #B8B8B8; padding:0.25em 1em 0.25em 1em; clear:both; } /* Boite grisée, par exemple pour le renommage */ .mw-greybox { border:1px solid #ccd2d9; background-color:#f0f6fa; padding:0.25em 1em 0.25em 1em; clear:both; } .list-in ul, .list-in ol { list-style-position: inside; } /* Par défaut les listes non ordonnées ont une faible marge pour la puce devant les items, tandis que les listes ordonnées ont une marge plus grande pour le numéro potentiellement grand. Donc l'emploi de listes ordonnées et non ordonnées donnent des items non alignés par défaut. Uniformiser les marges des listes : - Pour les recettes de cuisine - Pour le contenu ayant la classe "unilist" */ .rootpage-Livre_de_cuisine .mw-content-ltr ul, .rootpage-Livre_de_cuisine .mw-content-rtl .mw-content-ltr ul, .rootpage-Livre_de_cuisine .mw-content-ltr ol, .rootpage-Livre_de_cuisine .mw-content-rtl .mw-content-ltr ol { margin-left: 2.4em; } .mw-content-ltr .unilist ul, .mw-content-rtl .mw-content-ltr .unilist ul, .mw-content-ltr .unilist ol, .mw-content-rtl .mw-content-ltr .unilist ol { margin-left: 2.4em; } .rootpage-Livre_de_cuisine .mw-content-rtl ul, .rootpage-Livre_de_cuisine .mw-content-ltr .mw-content-rtl ul, .rootpage-Livre_de_cuisine .mw-content-rtl ol, .rootpage-Livre_de_cuisine .mw-content-ltr .mw-content-rtl ol { margin-right: 2.4em; } .mw-content-rtl .unilist ul, .mw-content-ltr .mw-content-rtl .unilist ul, .mw-content-rtl .unilist ol, .mw-content-ltr .mw-content-rtl .unilist ol { margin-right: 2.4em; } /* == ÉLÉMENTS UNIQUES == Pour les id="..." */ #entete_accueil { width:80%; margin:0 auto; font-size:115%; line-height:1.3em; font-weight:bold; margin-bottom:0; text-align:center; } #browsebar { margin-top:-3px; margin-bottom:0.5em; font-variant: small-caps; text-align: center; font-size: 102%; } #browsebar ul, #browsebar li, #browsebar p { display:inline } #browsebar ul { margin-left:0; } #browsebar ul li:after { content: "\A0– " } #browsebar ul li:after { content: "" } /* == ÉLÉMENTS GÉNÉRIQUES == === Retrait des liens modifier === Pour supprimer le lien "modifier" à côté d'une section donnée, utiliser <div class="noeditsection"></div>. */ .noeditsection span.editsection { display: none; } /* == Pour [[Modèle:TopNav]] == */ #top-navigation { position:absolute; right: 1.15em; top: 3.0em; } /* == Coloration indentative == */ .ns-1 dd, .ns-3 dd, .ns-5 dd, .ns-7 dd, .ns-9 dd, .ns-11 dd, .ns-13 dd,.ns-15 dd, .colorationindentative dd { margin: 0; padding: 0; } .ns-1 dl, .ns-3 dl, .ns-5 dl, .ns-7 dl, .ns-9 dl, .ns-11 dl, .ns-13 dl, .ns-15 dl, .colorationindentative dl { border-top: solid 1px lightgrey; border-left: solid 1px lightgrey; padding-top: 0.5em; padding-left: 0.5em; margin-left: 1em; } /* == Boites déroulantes == */ div.BoxenVerschmelzen, div.NavFrame { margin: 0px; padding: 2px; border: 1px solid #aaaaaa; border-collapse: collapse; font-size: 95%; } div.BoxenVerschmelzen div.NavFrame { border-style: none; border-style: hidden; } div.NavFrame + div.NavFrame { border-top-style: none; border-top-style: hidden; } div.NavPic { background-color: #ffffff; margin: 0px; padding: 2px; float: left; } div.NavFrame div.NavHead { height: 1.6em; vertical-align: middle; font-weight: bold; font-size: 100%; background-color: #efefef; } div.NavHead p { margin: 0; vertical-align: middle; } div.NavFrame p { font-size: 100%; } div.NavFrame div.NavContent { font-size: 100%; } div.NavFrame div.NavContent p { font-size: 100%; } div.NavEnd { margin: 0px; padding: 0px; line-height: 1px; clear: both; } /* == Classes pour autoriser une centralisation des sommaires == Auteurs : [[w:user:Lachaume]], [[user:J.M. Tavernier]] Premièrement sont définis les identifiants séparés calqués sur l'apparence de #toc du thème monobook depuis /style/monobook/main.css définis séparément pour ne pas produire du code invalide au test http://validator.w3.org/ lorsque plusieurs types de sommaires sont utilisés dans une page. Puis la définition de la classe "linelist" qui permet de simuler une liste ordonnée plate à partir d'une liste ordonnée en colonne. Enfin la classe "numbersonly" qui est censée pouvoir n'afficher que les nombres, sans le texte dans un sommaire condensé destiné à être placé en bas des pages. Ces classes sont destinées à fonctionner en corrélation avec le [[Modèle:Sommaire]]. */ #sommaire_droite, #sommaire_haut, #sommaire_bas { border:1px solid #aaaaaa; background-color:#f9f9f9; padding:5px; font-size: 95%; } #sommaire_droite { width:200px; float:right; } #sommaire_prog { width:200px; float:right; background:white; border:3px blue solid; border-style: inset; margin:0; margin-left: 1em; border-spacing: 0; } #sommaire_prog th, #sommaire_prog td { padding:2px; } #sommaire_prog a, #sommaire_prog p { background:none; } #sommaire_prog h3, * #sommaire_prog h2 { font-size:small; margin:0; padding:0; border:none; text-align:center; background:#E0E0F0; font-weight:bold; } #sommaire .editsection { display:none } #sommaire ol { margin: 0.3em 0 0 2em; } #sommaire_prog ol { font-size:smaller; } .linelist ol { margin-left:0em ; counter-reset: item } .linelist ol li { display:inline ; white-space:normal ;} .linelist ol li:after { content: " · " } .linelist ol li:after { content: "" } .linelist ol li a:before { content: counter(item) ".\A0"; counter-increment: item } .linelist ol li .selflink:before { content: counter(item) ".\A0"; counter-increment: item } /* == EN-TÊTES == */ .headergris { background: url("//upload.wikimedia.org/wikipedia/commons/d/d7/Bookbar2.png") right; background-repeat: no-repeat; margin:0; background-color:#F0F0F0; font-size:120%; font-weight:bold; border:1px solid #a3b0bf; text-align:left; color:#000000; padding:0.2em 0.4em; } .headerbleu { background: url("//upload.wikimedia.org/wikipedia/commons/a/a2/Bookbar1.png") right; background-repeat: no-repeat; margin:0; background-color:#F0F0F0; font-size:120%; font-weight:bold; border:1px solid #a3b0bf; text-align:left; color:#000000; padding:0.2em 0.4em; } .headergris span.editsection, .headerbleu span.editsection, .headergris a.NavToggle, .headerbleu a.NavToggle { margin-right: 100px; } /* == ÉLÉMENTS À NE PAS AFFICHER DANS LA VERSION IMPRIMABLE == */ @media print { .firstHeading, .editlink, .noprint, .metadata, .dablink, #top-navigation, #contentSub, .toc, .bookInfobox, .catlinks, #privacy, #about, #disclaimer{ display: none !important; } a { margin: auto 1px; } } /* == Style des méta-bandeaux et des méta-étiquettes == voir [[Modèle:Méta-bandeau]] et voir [[Modèle:Méta-étiquette]] */ .bandeau { border: #cccccc solid 1px; margin-top: 5px; margin-bottom: 5px; margin-left: auto; margin-right: auto; border-left: solid 10px; padding: 0px; width: 70%; /* largeur par défaut : peut être modifiée en utilisant les classes suivantes */ border-left-color: #aaaaaa; /* couleur par défaut : peut être modifiée en utilisant les classes suivantes */ } .bandeautitre { font-weight: bold; margin: 0; padding: 2px 10px 0px 25px; background-color: inherit; } .etiquette { border: #cccccc solid 1px; background-color: white; border-left: solid 10px; padding: 5px; width: 250px; border-left-color: #aaaaaa; /* couleur par défaut, remplaçable */ margin-top: 0.5em; margin-bottom: 0.5em; } .etiquettedroite { clear: right; float: right; margin-left: 2em; } .etiquettegauche { clear: left; float: left; margin-right: 2em; } .bandeauvert, .etiquettevert { border-left-color: #228b22; } .bandeauvert .bandeautitre { background-color: #eeffee; } .bandeaurouge, .etiquetterouge { border-left-color: #c22222; } .bandeaurouge .bandeautitre { background-color: #ffeeee; } .bandeauorange, .etiquetteorange { border-left-color: #ffaa00; } .bandeauorange .bandeautitre { background-color: #ffefc6; } .bandeauviolet, .etiquetteviolet { border-left-color: #9932cc; } .bandeauviolet .bandeautitre { background-color: #f5d9ff; } .bandeaubleu, .etiquettebleu { border-left-color: #1e90ff; } .bandeaubleu .bandeautitre { background-color: #ccecff; } .bandeaujaune, .etiquettejaune { border-left-color: #fbe80f; } .bandeaujaune .bandeautitre { background-color: #ffffdd; } .bandeaupetit { width: 50%; } .bandeaumoyen { width: 60%; } .bandeaugrand { width: 90%; } /* == Icônes de titre == */ .icone_de_titre { margin-left: 0.4em; } /* LETTRINE Sans avoir besoin d'encadrer la première lettre. class="lettrine<H>" où <H> est la hauteur en nombre de lignes (1 à 4). */ .lettrine1 p:first-child:first-letter { float:left; text-shadow:3px 3px 3px silver; padding-right:.1em; line-height:80%; margin:0px; font-size:1.8em; } .lettrine2 p:first-child:first-letter { float:left; text-shadow:3px 3px 3px silver; padding-right:.1em; line-height:80%; margin:0px; font-size:3.6em; } .lettrine3 p:first-child:first-letter { float:left; text-shadow:3px 3px 3px silver; padding-right:.1em; line-height:80%; margin:0px; font-size:5.4em; } .lettrine4 p:first-child:first-letter { float:left; text-shadow:3px 3px 3px silver; padding-right:.1em; line-height:80%; margin:0px; font-size:7.2em; } /* == Corrections impression du code source == */ @media print { pre { font-size:100%; } } /* DÉBUT DES SCHÉMAS DE COULEUR DE "CADRE À ONGLETS" Fonctionnement du [[Modèle:Cadre à onglets]] Modèle implanté par User:Peleguer de //ca.wikipedia.org Actualisé par User:Joanjoc de //ca.wikipedia.org Traduction et adaptation User:Antaya de //fr.wikipedia.org Couleurs pour le [[Modèle:Cadre à onglets]] Configuration des couleurs par défaut Couleurs utilisées; 1; 8080ff 2; 9f9fff 3; c4c4ff 4; ddddff 5; eaeaff */ .mbBouton { background-color: #ddddff; border: 0.15em solid #000000; border-color: #eaeaff #c4c4ff #9f9fff #eaeaff; -moz-border-radius: .5em .5em 0em 0em; /* NE VALIDE PAS AU w3c VALIDATOR */ border-radius: .5em .5em 0em 0em; cursor:pointer; display: inline; margin-right: 0.1em; padding: 0.2em 0.3em 0.2em 0.3em; position: relative;} .mbBouton a, .mbBouton strong { background: none !important; color:#8080ff !important; /* 1 */ font-size: 90%; font-weight: bold; padding: 0 !important; text-decoration: none !important;} .mbBouton a:hover, .mbBouton strong:hover { color: black !important; text-decoration: underline !important;} .mbBoutonSel { background-color: #9f9fff; /* 2 */ border: 0.15em solid #000000; border-color: #c4c4ff #8080ff #9f9fff #c4c4ff; /* 3 1 2 3 */ -moz-border-radius: .5em .5em 0em 0em; border-radius: .5em .5em 0em 0em; cursor: default; display: inline; margin-right: 0.1em; padding: 0.2em 0.3em 0.2em 0.3em; position: relative; color:white;} .mbBoutonSel a { background: none !important; color:white !important; cursor: default; font-size: 90%; font-weight: bold; padding: 0 !important; text-decoration: none !important;} .mbContenu { background-color: #f8f8ff; border: 0.2em solid #9f9fff; /* 2 */ border-color: #9f9fff #8080ff #8080ff #9f9fff ; /* 2 1 1 2 */ -moz-border-radius: 0em .5em .5em 0em; border-radius: 0em .5em .5em 0em; padding: 1em; position: static; } .mbOnglet { background-color: #f8f8ff; border-color: #8080ff #c4c4ff #c4c4ff #8080ff; /* 1 3 3 1 */ width: 100%; } /* Configuration du Lilas 1;7050a0 2;9070c0 3;b090e0 4;d0b0ff 5;f0d0ff */ .mbLilas .mbBouton { background-color: #d0b0ff; /* 4 */ border-color: #f0d0ff #b090e0 #9070c0 #f0d0ff; /* 5 3 2 5 */} .mbLilas .mbBouton a, .mbLilas .mbBouton strong { color:#8080ff !important; /* 1 */ font-size:90%} .mbLilas .mbBouton a:hover, .mbLilas .mbBouton strong:hover { color: black !important; text-decoration: underline;} .mbLilas .mbBoutonSel { background-color: #9070c0; /* 2 */ border-color: #b090e0 #7050a0 #9070c0 #b090e0; /* 3 1 2 3 */} .mbLilas .mbContenu { background-color: #f5fffa; border-color: #9070c0 #7050a0 #7050a0 #9070c0 ; /* 2 1 1 2 */} .mbLilas .mbOnglet { background-color: #f5fffa; border-color: #7050a0 #b090e0 #b090e0 #7050a0; /* 1 3 3 1 */} /* Configuration du Vert 1;60b030 2;75c045 3;90d060 4;a5e085 5;c0f090 */ .mbVert .mbBouton { background-color: #a5e085; /* 4 */ border-color: #c0f090 #90d060 #75c045 #c0f090; /* 5 3 2 5 */} .mbVert .mbBouton a, .mbVert .mbBouton strong { color:#60b030 !important; /* 1 */ font-size:90%} .mbVert .mbBouton a:hover, .mbVert .mbBouton strong:hover { color: black !important; text-decoration: underline;} .mbVert .mbBoutonSel { background-color: #75c045; /* 2 */ border-color: #90d060 #60b030 #75c045 #90d060; /* 3 1 2 3 */} .mbVert .mbContenu { background-color: #f5fffa; border-color: #75c045 #60b030 #60b030 #75c045 ; /* 2 1 1 2 */} .mbVert .mbOnglet { background-color: #f5fffa; border-color: #60b030 #90d060 #90d060 #60b030; /* 1 3 3 1 */} /* Configuration du Bleu 1;3379de 2;5b8dd6 3;88abde 4;a7c1e6 5;c8d6e9 */ .mbBleu .mbBouton { background-color: #a7c1e6; /* 4 */ border-color: #c8d6e9 #88abde #5b8dd6 #c8d6e9; /* 5 3 2 5 */} .mbBleu .mbBouton a, .mbBleu .mbBouton strong { color:#3379de !important; /* 1 */ font-size:90%} .mbBleu .mbBouton a:hover .mbBleu .mbBouton strong:hover { color: black !important; text-decoration: underline;} .mbBleu .mbBoutonSel { background-color: #5b8dd6; /* 2 */ border-color: #88abde #3379de #5b8dd6 #88abde; /* 3 1 2 3 */} .mbBleu .mbContenu { background-color: #f0f8ff; border-color: #5b8dd6 #3379de #3379de #5b8dd6; /* 2 1 1 2 */} .mbBleu .mbOnglet { background-color: #f0f8ff; border-color: #3379de #88abde #88abde #3379de; /* 1 3 3 1 */} /* Configuration du Orange 1;ff820e 2;ff9d42 3;ffac5d 4;ffbd7f 5;ffd0a4 6;ffeedd */ .mbOrange .mbBouton { background-color: #ffbd7f; /* 4 */ border-color: #ffd0a4 #ffac5d #ff9d42 #ffd0a4; /* 5 3 2 5 */} .mbOrange .mbBouton a, .mbOrange .mbBouton strong { color:#ff820e !important; /* 1 */ font-size:90%} .mbOrange .mbBouton a:hover .mbOrange .mbBouton strong:hover { color: black !important; text-decoration: underline;} .mbOrange .mbBoutonSel { background-color: #ff9d42; /* 2 */ border-color: #ffac5d #ff820e #ff9d42 #ffac5d; /* 3 1 2 3 */} .mbOrange .mbContenu { background-color: #ffeedd; /* 6 */ border-color: #ff9d42 #ff820e #ff820e #ff9d42; /* 2 1 1 2 */} .mbOrange .mbOnglet { background-color: #ffeedd; /* 6 */ border-color: #ff820e #ffac5d #ffac5d #ff820e; /* 1 3 3 1 */} /* Configuration du Gris 1;666666 2;868686 3;9f9f9f 4;b9b9b9 5;cfcfcf */ .mbGris .mbBouton { background-color: #b9b9b9; /* 4 */ border-color: #cfcfcf #9f9f9f #868686 #cfcfcf; /* 5 3 2 5 */} .mbGris .mbBouton a, .mbGris .mbBouton strong { color:#666666 !important; /* 1 */ font-size:90%} .mbGris .mbBouton a:hover .mbGris .mbBouton strong:hover { color: black !important; text-decoration: underline;} .mbGris .mbBoutonSel { background-color: #868686; /* 2 */ border-color: #9f9f9f #666666 #868686 #9f9f9f; /* 3 1 2 3 */} .mbGris .mbContenu { background-color: #fffce8; border-color: #868686 #666666 #666666 #868686; /* 2 1 1 2 */} .mbGris .mbOnglet { background-color: #fffce8; border-color: #666666 #9f9f9f #9f9f9f #666666; /* 1 3 3 1 */} /* Configuration du Jaune 1;aa8800 2;eabb00 3;ffd52b 4;ffe16a 5;ffeeaa */ .mbJaune .mbBouton { background-color: #ffe16a; /* 4 */ border-color: #ffeeaa #ffd52b #eabb00 #ffeeaa; /* 5 3 2 5 */} .mbJaune .mbBouton a, .mbJaune .mbBouton strong { color:#aa8800!important; /* 1 */ font-size:90%} .mbJaune .mbBouton a:hover .mbJaune .mbBouton strong:hover { color: black !important; text-decoration: underline;} .mbJaune .mbBoutonSel { background-color: #eabb00; /* 2 */ border-color: #ffd52b #aa8800 #eabb00 #ffd52b; /* 3 1 2 3 */} .mbJaune .mbContenu { background-color: #fffce8; border-color: #eabb00 #aa8800 #aa8800 #eabb00; /* 2 1 1 2 */} .mbJaune .mbOnglet { background-color: #fffce8; border-color: #aa8800 #ffd52b #ffd52b #aa8800; /* 1 3 3 1 */} /* Configuration du Rouge 1;993300 2;ca4200 3;ff6215 4;ff9b6a 5;ffc6aa */ .mbRouge .mbBouton { background-color: #ff9b6a; /* 4 */ border-color: #ffc6aa #ff6215 #ca4200 #ffc6aa; /* 5 3 2 5 */} .mbRouge .mbBouton a, .mbRouge .mbBouton strong { color:#993300!important; /* 1 */ font-size:90%} .mbRouge .mbBouton a:hover .mbRouge .mbBouton strong:hover { color: black !important; text-decoration: underline;} .mbRouge .mbBoutonSel { background-color: #ca4200; /* 2 */ border-color: #ff6215 #993300 #ca4200 #ff6215; /* 3 1 2 3 */} .mbRouge .mbContenu { background-color: #fffce8; border-color: #ca4200 #993300 #993300 #ca4200; /* 2 1 1 2 */} .mbRouge .mbOnglet { background-color: #fffce8; border-color: #993300 #ff6215 #ff6215 #993300; /* 1 3 3 1 */} /* ^^^ plus de 50 classes */ /*FIN DES SCHÉMAS DE COULEUR DE "CADRE À ONGLETS"*/ /* Classe hlist comme Wikisource */ .skin-monobook .hlist dl, .skin-modern .hlist dl, .skin-vector .hlist dl { line-height: 1.5em; } .hlist dl, .hlist ol, .hlist ul { margin: 0; padding: 0; } .hlist dd, .hlist dt, .hlist li { margin: 0; display: inline; white-space: nowrap; } .hlist dl dl, .hlist dl ol, .hlist dl ul, .hlist ol dl, .hlist ol ol, .hlist ol ul, .hlist ul dl, .hlist ul ol, .hlist ul ul { display: inline; white-space: normal; } .hlist dt:after { content: ":"; } .hlist dd:after, .hlist li:after { content: " ·"; font-weight: bold; } .hlist dd:last-child:after, .hlist dt:last-child:after, .hlist li:last-child:after { content: none; } .hlist dd.hlist-last-child:after, .hlist dt.hlist-last-child:after, .hlist li.hlist-last-child:after { content: none; } .hlist dd dd:first-child:before, .hlist dd dt:first-child:before, .hlist dd li:first-child:before, .hlist dt dd:first-child:before, .hlist dt dt:first-child:before, .hlist dt li:first-child:before, .hlist li dd:first-child:before, .hlist li dt:first-child:before, .hlist li li:first-child:before { content: "("; font-weight: normal; } .hlist dd dd:last-child:after, .hlist dd dt:last-child:after, .hlist dd li:last-child:after, .hlist dt dd:last-child:after, .hlist dt dt:last-child:after, .hlist dt li:last-child:after, .hlist li dd:last-child:after, .hlist li dt:last-child:after, .hlist li li:last-child:after { content: ")"; font-weight: normal; } .hlist dd dd.hlist-last-child:after, .hlist dd dt.hlist-last-child:after, .hlist dd li.hlist-last-child:after, .hlist dt dd.hlist-last-child:after, .hlist dt dt.hlist-last-child:after, .hlist dt li.hlist-last-child:after, .hlist li dd.hlist-last-child:after, .hlist li dt.hlist-last-child:after, .hlist li li.hlist-last-child:after { content: ")"; font-weight: normal; } .hlist.hnum ol { counter-reset: list-item; } .hlist.hnum ol > li { counter-increment: list-item; } .hlist.hnum ol > li:before { content: counter(list-item) " "; } .hlist.hnum dd ol > li:first-child:before, .hlist.hnum dt ol > li:first-child:before, .hlist.hnum li ol > li:first-child:before { content: "(" counter(list-item) " "; } /** * [[Modèle:Remarque]] */ .remarque:before { content:"Remarque : "; font-weight:bold; } .remarque { margin:2ex auto 2ex 2em; } /* Classe pour les listes horizontales séparées par des puces. Adaptation de la classe 'hlist' de en:User:Edokter. (cf. [[mw:Snippets/Horizontal lists]]). */ .liste-horizontale ul, .liste-horizontale ol, .liste-horizontale li { margin-left: 0; display: inline; white-space: nowrap; *white-space: normal; /* be kind ie7 */ } .liste-horizontale li:after { content: " "; /* au cas ou Mediawiki supprime les retours ligne */ } .liste-horizontale li + li:before { white-space: normal; content: "· "; font-weight: bold; } .liste-horizontale li li:first-child:before { white-space: normal; content: " ("; } .liste-horizontale li ul:after, .liste-horizontale li ol:after{ content: ")"; margin-left: -0.28em; } .liste-horizontale ol { counter-reset: listitem; } .liste-horizontale ol > li { counter-increment: listitem; } .liste-horizontale ol > li:first-child:before { content: "1.\202F"; } .liste-horizontale li ol > li:first-child:before { content: " (1.\202F"; } .liste-horizontale ol > li + li:before { content: "· " counter(listitem) ".\202F"; font-weight: normal; } /* Boîtes à outils */ .mw-toolbox { font-size: 90%; background: #f8f8f8; border: 1px solid #b8b8b8; padding: .25em 1em .25em 1em; clear: both; } /* ----------------------------- */ /* Navigation */ /* Laisser une marge au dessus lors du clic sur une ancre : */ #content [id] { scroll-margin-top: 44px; } .nav-haut { position: sticky; top: 0px; min-height: 40px; opacity: 1; border-bottom: solid 1px #08c; margin-bottom: 0.5em; z-index: 100; } .nav-bas { min-height: 40px; width: 100%; } .pull-left { display: inline-block; } .pull-right { display: inline-block; right: 0; position: absolute; } .nav-chap { position: sticky; top: 41px; z-index: 100; margin-bottom: 0.2em; } .nav-chap-button { width: 48px; height: 48px; display: inline-block; left: calc(50% - 24px); position: absolute; } .nav-chap-open { background-image: url("https://upload.wikimedia.org/wikipedia/commons/5/5f/Ic_expand_more_48px.svg"); } .nav-chap-close { background-image: url("https://upload.wikimedia.org/wikipedia/commons/2/2c/Ic_expand_less_48px.svg"); } /* ----------------------------- */ .left-arrow, .right-arrow { box-shadow: 0 1px 2px rgba(0,0,0,0.15); transition: box-shadow 0.3s ease-in-out; } .left-arrow:hover, .right-arrow:hover { box-shadow: 0 5px 15px rgba(0,0,0,0.3); } /* Multiple colonnes (2 colonnes : half, 3 colonnes : third) affichées sur une seule colonne si la largeur n'est pas suffisante (appareil mobile par exemple). */ .flex-content { display:flex; flex-wrap:wrap; } .flex-content-half { width:48%; } .flex-content-third { width:30%; } .flex-content-half:nth-child(odd), .flex-content-third:nth-child(3n+1), .flex-content-third:nth-child(3n+2) { margin-right:2%; } .flex-content-half:nth-child(even), .flex-content-third:nth-child(3n+2), .flex-content-third:nth-child(3n) { margin-left:2%; } @media (max-width: 700px) { .flex-content-half, .flex-content-third, { width:100%; } .flex-content-half:nth-child(odd), .flex-content-third:nth-child(3n+1), .flex-content-third:nth-child(3n+2) { margin-right:0; } .flex-content-half:nth-child(even), .flex-content-third:nth-child(3n+2), .flex-content-third:nth-child(3n) { margin-left:0; } } nli1kgy0rdv2hlp8ch3srfink2wvujg 682235 682168 2022-07-23T11:55:56Z DavidL 1746 css text/css .wgfrwikibooks_CommonCssVersion:after{content:"20220722001";} /* Le CSS placé ici sera appliqué à toutes les apparences. <indicator name="version"><span class="wgfrwikibooks_CommonCssVersion">Version courante : </span></indicator> Effectuez toujours un [http://jigsaw.w3.org/css-validator/validator?uri=http%3A%2F%2Ffr.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DMediaWiki%3ACommon.css%26action%3Draw%26ctype%3Dtext%2Fcss&usermedium=all test de validation CSS] après chaque modification et [http://validator.w3.org/ vérifiez] que les pages concernées par les modifications de cette feuille de style produise un code HTML valide. RECOMMANDÉ : * pour les couleurs, utiliser si possible l'une des 216 couleurs web standards (en hexadécimal pour chaque composante, n'utiliser que les chiffres multiples de 3 doublés: 00 33 66 99 cc ff) Voir aussi : - [[Mediawiki:Common.js]] - [[MediaWiki:Geshi.css]] - [[Mediawiki:Monobook.css]] - [[Mediawiki:Vector.css]] == CLASSES GÉNÉRALES == */ body.mediawiki .only_mobile { display:none; } .newbooks-0 { display:none; } body .mw-highlight { position: initial; } table { background: None; } .link-wikipedia { background: url("//upload.wikimedia.org/wikipedia/commons/8/85/Wikipedia-logo-14px.png") no-repeat center left !important; padding-left:17px !important; } .opaque { background-color: white; } /* Pour les catégories : clear avant les rubriques sous-catégorie, et pages */ #mw-subcategories, #mw-pages { clear:both; } /* Clear pour les bas de page */ .content-footer { clear:both; } /* Zone hachurée */ .hachure { background: linear-gradient(45deg, #ccc 1%, #0000 1%, #0000 49%, #ccc 49%, #ccc 51%, #0000 51%, #0000 99%, #ccc 99%); background-size: 6px 6px; } /* Affichage en fond transparent de <code></code> */ code { background-color: transparent; border: 0; } .mw-parser-output { position: relative; } /* DESCRIPTION DES GADGETS */ .gadget-new:before { content:"Nouveau ! "; color:red; font-weight:bold; font-style:italic; } .gadget-ext { background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAVklEQVR4Xn3PgQkAMQhDUXfqTu7kTtkpd5RA8AInfArtQ2iRXFWT2QedAfttj2FsPIOE1eCOlEuoWWjgzYaB/IkeGOrxXhqB+uA9Bfcm0lAZuh+YIeAD+cAqSz4kCMUAAAAASUVORK5CYII=") no-repeat scroll right center transparent; padding-right:13px; } .gadget-big { background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAACQSURBVDhPlZIBDoAgCEWpK3UnPVOdKc9UfeZ3jLn5c3PaBx4E2jNZVu6ZLGm7iWurza4mOMe0Zy/sb4WMA8sIhEgQTm7otMU77Q75/EcxEBgQgUyUtVh9LgAc72GVmrPuHzgOPMux9hY8wHEgeBmKqWJD5w/gxDdtMQd0r2s2ZenB9WFwBqPnanB+DXGykfECNY3C1VRyg0AAAAAASUVORK5CYII=") no-repeat scroll right center transparent; padding-right:23px; } /* CATÉGORIES CACHÉES */ /* Si toutes les catégories d'une page sont cachées, les afficher quand même (comme ça le script peut afficher le "+") */ .catlinks-allhidden { display: block; } /* Masquage du lien vers [[Special:Upload]], remplacement par un autre lien dans Monobook.js */ #t-upload { display:none } table.normale th, table.normale td { vertical-align: top; } /* cacher les crochets pour les notes par défaut */ .cite_crochet { display: none } /* pour lettrines */ .lettrine:first-letter { margin-right: 0.1em; float: left; font-size: 4em; font-weight: bold; } /* mise en valeur des références cliquées */ ol.references > li:target { background-color: #DDEEFF; } /* pour harmoniser les exposants */ /*.exposant { vertical-align: text-top; }*/ /* pour diminuer la taille des notes lorsqu'elles sont générées par le modèle "Références" */ .references-small { font-size: 90%;} /* dans special:allpages et special:watchlist, rendre plus visible les pages étant des redirects (allpagesredirect est déjà en italique par défaut) */ .allpagesredirect a, .watchlistredir a { color:green; } /* pour les petits liens en bas à droite des cadres */ .portailLienEdition, .SmallRightLink, .SmallRightText { display:block; font-size:x-small; text-align:right; clear:both; } /* cache le titre sur la page d'accueil */ .page-Accueil .firstHeading {display:none} /* MODÈLES DE COORDONNÉES */ /* Voir [[Modèle:Coord]] pour l'utilité de ces classes. Notez que les classes "geo", "longitude", et "latitude" ne sont pas simplement des styles mais servent aussi à l'export au Geo microformat, il ne faut pas les renommer. */ .geo-default { display:inline } .geo-nondefault { display:none } .geo-dms { display:inline } .geo-dec { display:inline } .geo-multi-punct { display:none } .longitude .latitude { white-space:nowrap } /* === Style de numérotation des listes ordonnées === Utiliser une balise &lt;div class="list-..."&gt; pour encadrer la liste. */ /* NIVEAU 1 */ .list-upper-roman li { list-style-type: upper-roman; } .list-lower-roman li { list-style-type: lower-roman; } .list-upper-latin li { list-style-type: upper-latin; } .list-lower-latin li { list-style-type: lower-latin; } /* NIVEAU 2 */ .list-upper-roman2 li li { list-style-type: upper-roman; } .list-lower-roman2 li li { list-style-type: lower-roman; } .list-upper-latin2 li li { list-style-type: upper-latin; } .list-lower-latin2 li li { list-style-type: lower-latin; } /* NIVEAU 3 */ .list-upper-roman3 li li li { list-style-type: upper-roman; } .list-lower-roman3 li li li { list-style-type: lower-roman; } .list-upper-latin3 li li li { list-style-type: upper-latin; } .list-lower-latin3 li li li { list-style-type: lower-latin; } /* === Tableau standard en utilisant class="wikitable" === */ table.wikitable { margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaaaaa solid; border-collapse: collapse; } table.wikitable > tbody > th, table.wikitable > tbody > td { border: 1px #aaaaaa solid; padding: 0.2em; } table.wikitable > tbody > th { background: #f2f2f2; text-align: center; } table.wikitable > caption { margin-left: inherit; margin-right: inherit; } /* === Tableau standard en utilisant class="charttable" === */ table.charttable { margin: 0; background: #ffffff; border: 1px #999999 solid; border-collapse: collapse; } table.charttable > tbody > th, table.charttable > tbody > td { padding: 0.2em; } table.charttable > tbody > th { background: #f2f2f2; text-align: center; } table.charttable > caption { margin-left: inherit; margin-right: inherit; } table.altlines1 > tbody > tr:nth-child(odd) {background: #f0f0f0} table.altlines2 > tbody > tr:nth-child(even) {background: #f0f0f0} /* == Messages systèmes == */ div.mw-lag-warn-normal, div.mw-lag-warn-high { text-align: left ! important; width: 50% ! important; } .mw-alerte { width:100%; clear:both; background-color:antiquewhite; border:2px solid darkorange; } /* Boites à outils, dans certains messages systèmes (Historique, Recherche, Contributions...) */ .mw-toolbox { font-size:90%; background-color:#F8F8F8; border:1px solid #B8B8B8; padding:0.25em 1em 0.25em 1em; clear:both; } /* Boite grisée, par exemple pour le renommage */ .mw-greybox { border:1px solid #ccd2d9; background-color:#f0f6fa; padding:0.25em 1em 0.25em 1em; clear:both; } .list-in ul, .list-in ol { list-style-position: inside; } /* Par défaut les listes non ordonnées ont une faible marge pour la puce devant les items, tandis que les listes ordonnées ont une marge plus grande pour le numéro potentiellement grand. Donc l'emploi de listes ordonnées et non ordonnées donnent des items non alignés par défaut. Uniformiser les marges des listes : - Pour les recettes de cuisine - Pour le contenu ayant la classe "unilist" */ .rootpage-Livre_de_cuisine .mw-content-ltr ul, .rootpage-Livre_de_cuisine .mw-content-rtl .mw-content-ltr ul, .rootpage-Livre_de_cuisine .mw-content-ltr ol, .rootpage-Livre_de_cuisine .mw-content-rtl .mw-content-ltr ol { margin-left: 2.4em; } .mw-content-ltr .unilist ul, .mw-content-rtl .mw-content-ltr .unilist ul, .mw-content-ltr .unilist ol, .mw-content-rtl .mw-content-ltr .unilist ol { margin-left: 2.4em; } .rootpage-Livre_de_cuisine .mw-content-rtl ul, .rootpage-Livre_de_cuisine .mw-content-ltr .mw-content-rtl ul, .rootpage-Livre_de_cuisine .mw-content-rtl ol, .rootpage-Livre_de_cuisine .mw-content-ltr .mw-content-rtl ol { margin-right: 2.4em; } .mw-content-rtl .unilist ul, .mw-content-ltr .mw-content-rtl .unilist ul, .mw-content-rtl .unilist ol, .mw-content-ltr .mw-content-rtl .unilist ol { margin-right: 2.4em; } /* == ÉLÉMENTS UNIQUES == Pour les id="..." */ #entete_accueil { width:80%; margin:0 auto; font-size:115%; line-height:1.3em; font-weight:bold; margin-bottom:0; text-align:center; } #browsebar { margin-top:-3px; margin-bottom:0.5em; font-variant: small-caps; text-align: center; font-size: 102%; } #browsebar ul, #browsebar li, #browsebar p { display:inline } #browsebar ul { margin-left:0; } #browsebar ul li:after { content: "\A0– " } #browsebar ul li:after { content: "" } /* == ÉLÉMENTS GÉNÉRIQUES == === Retrait des liens modifier === Pour supprimer le lien "modifier" à côté d'une section donnée, utiliser <div class="noeditsection"></div>. */ .noeditsection span.editsection { display: none; } /* == Pour [[Modèle:TopNav]] == */ #top-navigation { position:absolute; right: 1.15em; top: 3.0em; } /* == Coloration indentative == */ .ns-1 dd, .ns-3 dd, .ns-5 dd, .ns-7 dd, .ns-9 dd, .ns-11 dd, .ns-13 dd,.ns-15 dd, .colorationindentative dd { margin: 0; padding: 0; } .ns-1 dl, .ns-3 dl, .ns-5 dl, .ns-7 dl, .ns-9 dl, .ns-11 dl, .ns-13 dl, .ns-15 dl, .colorationindentative dl { border-top: solid 1px lightgrey; border-left: solid 1px lightgrey; padding-top: 0.5em; padding-left: 0.5em; margin-left: 1em; } /* == Boites déroulantes == */ div.BoxenVerschmelzen, div.NavFrame { margin: 0px; padding: 2px; border: 1px solid #aaaaaa; border-collapse: collapse; font-size: 95%; } div.BoxenVerschmelzen div.NavFrame { border-style: none; border-style: hidden; } div.NavFrame + div.NavFrame { border-top-style: none; border-top-style: hidden; } div.NavPic { background-color: #ffffff; margin: 0px; padding: 2px; float: left; } div.NavFrame div.NavHead { height: 1.6em; vertical-align: middle; font-weight: bold; font-size: 100%; background-color: #efefef; } div.NavHead p { margin: 0; vertical-align: middle; } div.NavFrame p { font-size: 100%; } div.NavFrame div.NavContent { font-size: 100%; } div.NavFrame div.NavContent p { font-size: 100%; } div.NavEnd { margin: 0px; padding: 0px; line-height: 1px; clear: both; } /* == Classes pour autoriser une centralisation des sommaires == Auteurs : [[w:user:Lachaume]], [[user:J.M. Tavernier]] Premièrement sont définis les identifiants séparés calqués sur l'apparence de #toc du thème monobook depuis /style/monobook/main.css définis séparément pour ne pas produire du code invalide au test http://validator.w3.org/ lorsque plusieurs types de sommaires sont utilisés dans une page. Puis la définition de la classe "linelist" qui permet de simuler une liste ordonnée plate à partir d'une liste ordonnée en colonne. Enfin la classe "numbersonly" qui est censée pouvoir n'afficher que les nombres, sans le texte dans un sommaire condensé destiné à être placé en bas des pages. Ces classes sont destinées à fonctionner en corrélation avec le [[Modèle:Sommaire]]. */ #sommaire_droite, #sommaire_haut, #sommaire_bas { border:1px solid #aaaaaa; background-color:#f9f9f9; padding:5px; font-size: 95%; } #sommaire_droite { width:200px; float:right; } #sommaire_prog { width:200px; float:right; background:white; border:3px blue solid; border-style: inset; margin:0; margin-left: 1em; border-spacing: 0; } #sommaire_prog th, #sommaire_prog td { padding:2px; } #sommaire_prog a, #sommaire_prog p { background:none; } #sommaire_prog h3, * #sommaire_prog h2 { font-size:small; margin:0; padding:0; border:none; text-align:center; background:#E0E0F0; font-weight:bold; } #sommaire .editsection { display:none } #sommaire ol { margin: 0.3em 0 0 2em; } #sommaire_prog ol { font-size:smaller; } .linelist ol { margin-left:0em ; counter-reset: item } .linelist ol li { display:inline ; white-space:normal ;} .linelist ol li:after { content: " · " } .linelist ol li:after { content: "" } .linelist ol li a:before { content: counter(item) ".\A0"; counter-increment: item } .linelist ol li .selflink:before { content: counter(item) ".\A0"; counter-increment: item } /* == EN-TÊTES == */ .headergris { background: url("//upload.wikimedia.org/wikipedia/commons/d/d7/Bookbar2.png") right; background-repeat: no-repeat; margin:0; background-color:#F0F0F0; font-size:120%; font-weight:bold; border:1px solid #a3b0bf; text-align:left; color:#000000; padding:0.2em 0.4em; } .headerbleu { background: url("//upload.wikimedia.org/wikipedia/commons/a/a2/Bookbar1.png") right; background-repeat: no-repeat; margin:0; background-color:#F0F0F0; font-size:120%; font-weight:bold; border:1px solid #a3b0bf; text-align:left; color:#000000; padding:0.2em 0.4em; } .headergris span.editsection, .headerbleu span.editsection, .headergris a.NavToggle, .headerbleu a.NavToggle { margin-right: 100px; } /* == ÉLÉMENTS À NE PAS AFFICHER DANS LA VERSION IMPRIMABLE == */ @media print { .firstHeading, .editlink, .noprint, .metadata, .dablink, #top-navigation, #contentSub, .toc, .bookInfobox, .catlinks, #privacy, #about, #disclaimer{ display: none !important; } a { margin: auto 1px; } } /* == Style des méta-bandeaux et des méta-étiquettes == voir [[Modèle:Méta-bandeau]] et voir [[Modèle:Méta-étiquette]] */ .bandeau { border: #cccccc solid 1px; margin-top: 5px; margin-bottom: 5px; margin-left: auto; margin-right: auto; border-left: solid 10px; padding: 0px; width: 70%; /* largeur par défaut : peut être modifiée en utilisant les classes suivantes */ border-left-color: #aaaaaa; /* couleur par défaut : peut être modifiée en utilisant les classes suivantes */ } .bandeautitre { font-weight: bold; margin: 0; padding: 2px 10px 0px 25px; background-color: inherit; } .etiquette { border: #cccccc solid 1px; background-color: white; border-left: solid 10px; padding: 5px; width: 250px; border-left-color: #aaaaaa; /* couleur par défaut, remplaçable */ margin-top: 0.5em; margin-bottom: 0.5em; } .etiquettedroite { clear: right; float: right; margin-left: 2em; } .etiquettegauche { clear: left; float: left; margin-right: 2em; } .bandeauvert, .etiquettevert { border-left-color: #228b22; } .bandeauvert .bandeautitre { background-color: #eeffee; } .bandeaurouge, .etiquetterouge { border-left-color: #c22222; } .bandeaurouge .bandeautitre { background-color: #ffeeee; } .bandeauorange, .etiquetteorange { border-left-color: #ffaa00; } .bandeauorange .bandeautitre { background-color: #ffefc6; } .bandeauviolet, .etiquetteviolet { border-left-color: #9932cc; } .bandeauviolet .bandeautitre { background-color: #f5d9ff; } .bandeaubleu, .etiquettebleu { border-left-color: #1e90ff; } .bandeaubleu .bandeautitre { background-color: #ccecff; } .bandeaujaune, .etiquettejaune { border-left-color: #fbe80f; } .bandeaujaune .bandeautitre { background-color: #ffffdd; } .bandeaupetit { width: 50%; } .bandeaumoyen { width: 60%; } .bandeaugrand { width: 90%; } body .bandeaugauche { margin-left:0; width: unset; margin-right: 320px; } @media (max-width: 700px) { body .bandeaugauche { margin-right: 0px; } } /* == Icônes de titre == */ .icone_de_titre { margin-left: 0.4em; } /* LETTRINE Sans avoir besoin d'encadrer la première lettre. class="lettrine<H>" où <H> est la hauteur en nombre de lignes (1 à 4). */ .lettrine1 p:first-child:first-letter { float:left; text-shadow:3px 3px 3px silver; padding-right:.1em; line-height:80%; margin:0px; font-size:1.8em; } .lettrine2 p:first-child:first-letter { float:left; text-shadow:3px 3px 3px silver; padding-right:.1em; line-height:80%; margin:0px; font-size:3.6em; } .lettrine3 p:first-child:first-letter { float:left; text-shadow:3px 3px 3px silver; padding-right:.1em; line-height:80%; margin:0px; font-size:5.4em; } .lettrine4 p:first-child:first-letter { float:left; text-shadow:3px 3px 3px silver; padding-right:.1em; line-height:80%; margin:0px; font-size:7.2em; } /* == Corrections impression du code source == */ @media print { pre { font-size:100%; } } /* DÉBUT DES SCHÉMAS DE COULEUR DE "CADRE À ONGLETS" Fonctionnement du [[Modèle:Cadre à onglets]] Modèle implanté par User:Peleguer de //ca.wikipedia.org Actualisé par User:Joanjoc de //ca.wikipedia.org Traduction et adaptation User:Antaya de //fr.wikipedia.org Couleurs pour le [[Modèle:Cadre à onglets]] Configuration des couleurs par défaut Couleurs utilisées; 1; 8080ff 2; 9f9fff 3; c4c4ff 4; ddddff 5; eaeaff */ .mbBouton { background-color: #ddddff; border: 0.15em solid #000000; border-color: #eaeaff #c4c4ff #9f9fff #eaeaff; -moz-border-radius: .5em .5em 0em 0em; /* NE VALIDE PAS AU w3c VALIDATOR */ border-radius: .5em .5em 0em 0em; cursor:pointer; display: inline; margin-right: 0.1em; padding: 0.2em 0.3em 0.2em 0.3em; position: relative;} .mbBouton a, .mbBouton strong { background: none !important; color:#8080ff !important; /* 1 */ font-size: 90%; font-weight: bold; padding: 0 !important; text-decoration: none !important;} .mbBouton a:hover, .mbBouton strong:hover { color: black !important; text-decoration: underline !important;} .mbBoutonSel { background-color: #9f9fff; /* 2 */ border: 0.15em solid #000000; border-color: #c4c4ff #8080ff #9f9fff #c4c4ff; /* 3 1 2 3 */ -moz-border-radius: .5em .5em 0em 0em; border-radius: .5em .5em 0em 0em; cursor: default; display: inline; margin-right: 0.1em; padding: 0.2em 0.3em 0.2em 0.3em; position: relative; color:white;} .mbBoutonSel a { background: none !important; color:white !important; cursor: default; font-size: 90%; font-weight: bold; padding: 0 !important; text-decoration: none !important;} .mbContenu { background-color: #f8f8ff; border: 0.2em solid #9f9fff; /* 2 */ border-color: #9f9fff #8080ff #8080ff #9f9fff ; /* 2 1 1 2 */ -moz-border-radius: 0em .5em .5em 0em; border-radius: 0em .5em .5em 0em; padding: 1em; position: static; } .mbOnglet { background-color: #f8f8ff; border-color: #8080ff #c4c4ff #c4c4ff #8080ff; /* 1 3 3 1 */ width: 100%; } /* Configuration du Lilas 1;7050a0 2;9070c0 3;b090e0 4;d0b0ff 5;f0d0ff */ .mbLilas .mbBouton { background-color: #d0b0ff; /* 4 */ border-color: #f0d0ff #b090e0 #9070c0 #f0d0ff; /* 5 3 2 5 */} .mbLilas .mbBouton a, .mbLilas .mbBouton strong { color:#8080ff !important; /* 1 */ font-size:90%} .mbLilas .mbBouton a:hover, .mbLilas .mbBouton strong:hover { color: black !important; text-decoration: underline;} .mbLilas .mbBoutonSel { background-color: #9070c0; /* 2 */ border-color: #b090e0 #7050a0 #9070c0 #b090e0; /* 3 1 2 3 */} .mbLilas .mbContenu { background-color: #f5fffa; border-color: #9070c0 #7050a0 #7050a0 #9070c0 ; /* 2 1 1 2 */} .mbLilas .mbOnglet { background-color: #f5fffa; border-color: #7050a0 #b090e0 #b090e0 #7050a0; /* 1 3 3 1 */} /* Configuration du Vert 1;60b030 2;75c045 3;90d060 4;a5e085 5;c0f090 */ .mbVert .mbBouton { background-color: #a5e085; /* 4 */ border-color: #c0f090 #90d060 #75c045 #c0f090; /* 5 3 2 5 */} .mbVert .mbBouton a, .mbVert .mbBouton strong { color:#60b030 !important; /* 1 */ font-size:90%} .mbVert .mbBouton a:hover, .mbVert .mbBouton strong:hover { color: black !important; text-decoration: underline;} .mbVert .mbBoutonSel { background-color: #75c045; /* 2 */ border-color: #90d060 #60b030 #75c045 #90d060; /* 3 1 2 3 */} .mbVert .mbContenu { background-color: #f5fffa; border-color: #75c045 #60b030 #60b030 #75c045 ; /* 2 1 1 2 */} .mbVert .mbOnglet { background-color: #f5fffa; border-color: #60b030 #90d060 #90d060 #60b030; /* 1 3 3 1 */} /* Configuration du Bleu 1;3379de 2;5b8dd6 3;88abde 4;a7c1e6 5;c8d6e9 */ .mbBleu .mbBouton { background-color: #a7c1e6; /* 4 */ border-color: #c8d6e9 #88abde #5b8dd6 #c8d6e9; /* 5 3 2 5 */} .mbBleu .mbBouton a, .mbBleu .mbBouton strong { color:#3379de !important; /* 1 */ font-size:90%} .mbBleu .mbBouton a:hover .mbBleu .mbBouton strong:hover { color: black !important; text-decoration: underline;} .mbBleu .mbBoutonSel { background-color: #5b8dd6; /* 2 */ border-color: #88abde #3379de #5b8dd6 #88abde; /* 3 1 2 3 */} .mbBleu .mbContenu { background-color: #f0f8ff; border-color: #5b8dd6 #3379de #3379de #5b8dd6; /* 2 1 1 2 */} .mbBleu .mbOnglet { background-color: #f0f8ff; border-color: #3379de #88abde #88abde #3379de; /* 1 3 3 1 */} /* Configuration du Orange 1;ff820e 2;ff9d42 3;ffac5d 4;ffbd7f 5;ffd0a4 6;ffeedd */ .mbOrange .mbBouton { background-color: #ffbd7f; /* 4 */ border-color: #ffd0a4 #ffac5d #ff9d42 #ffd0a4; /* 5 3 2 5 */} .mbOrange .mbBouton a, .mbOrange .mbBouton strong { color:#ff820e !important; /* 1 */ font-size:90%} .mbOrange .mbBouton a:hover .mbOrange .mbBouton strong:hover { color: black !important; text-decoration: underline;} .mbOrange .mbBoutonSel { background-color: #ff9d42; /* 2 */ border-color: #ffac5d #ff820e #ff9d42 #ffac5d; /* 3 1 2 3 */} .mbOrange .mbContenu { background-color: #ffeedd; /* 6 */ border-color: #ff9d42 #ff820e #ff820e #ff9d42; /* 2 1 1 2 */} .mbOrange .mbOnglet { background-color: #ffeedd; /* 6 */ border-color: #ff820e #ffac5d #ffac5d #ff820e; /* 1 3 3 1 */} /* Configuration du Gris 1;666666 2;868686 3;9f9f9f 4;b9b9b9 5;cfcfcf */ .mbGris .mbBouton { background-color: #b9b9b9; /* 4 */ border-color: #cfcfcf #9f9f9f #868686 #cfcfcf; /* 5 3 2 5 */} .mbGris .mbBouton a, .mbGris .mbBouton strong { color:#666666 !important; /* 1 */ font-size:90%} .mbGris .mbBouton a:hover .mbGris .mbBouton strong:hover { color: black !important; text-decoration: underline;} .mbGris .mbBoutonSel { background-color: #868686; /* 2 */ border-color: #9f9f9f #666666 #868686 #9f9f9f; /* 3 1 2 3 */} .mbGris .mbContenu { background-color: #fffce8; border-color: #868686 #666666 #666666 #868686; /* 2 1 1 2 */} .mbGris .mbOnglet { background-color: #fffce8; border-color: #666666 #9f9f9f #9f9f9f #666666; /* 1 3 3 1 */} /* Configuration du Jaune 1;aa8800 2;eabb00 3;ffd52b 4;ffe16a 5;ffeeaa */ .mbJaune .mbBouton { background-color: #ffe16a; /* 4 */ border-color: #ffeeaa #ffd52b #eabb00 #ffeeaa; /* 5 3 2 5 */} .mbJaune .mbBouton a, .mbJaune .mbBouton strong { color:#aa8800!important; /* 1 */ font-size:90%} .mbJaune .mbBouton a:hover .mbJaune .mbBouton strong:hover { color: black !important; text-decoration: underline;} .mbJaune .mbBoutonSel { background-color: #eabb00; /* 2 */ border-color: #ffd52b #aa8800 #eabb00 #ffd52b; /* 3 1 2 3 */} .mbJaune .mbContenu { background-color: #fffce8; border-color: #eabb00 #aa8800 #aa8800 #eabb00; /* 2 1 1 2 */} .mbJaune .mbOnglet { background-color: #fffce8; border-color: #aa8800 #ffd52b #ffd52b #aa8800; /* 1 3 3 1 */} /* Configuration du Rouge 1;993300 2;ca4200 3;ff6215 4;ff9b6a 5;ffc6aa */ .mbRouge .mbBouton { background-color: #ff9b6a; /* 4 */ border-color: #ffc6aa #ff6215 #ca4200 #ffc6aa; /* 5 3 2 5 */} .mbRouge .mbBouton a, .mbRouge .mbBouton strong { color:#993300!important; /* 1 */ font-size:90%} .mbRouge .mbBouton a:hover .mbRouge .mbBouton strong:hover { color: black !important; text-decoration: underline;} .mbRouge .mbBoutonSel { background-color: #ca4200; /* 2 */ border-color: #ff6215 #993300 #ca4200 #ff6215; /* 3 1 2 3 */} .mbRouge .mbContenu { background-color: #fffce8; border-color: #ca4200 #993300 #993300 #ca4200; /* 2 1 1 2 */} .mbRouge .mbOnglet { background-color: #fffce8; border-color: #993300 #ff6215 #ff6215 #993300; /* 1 3 3 1 */} /* ^^^ plus de 50 classes */ /*FIN DES SCHÉMAS DE COULEUR DE "CADRE À ONGLETS"*/ /* Classe hlist comme Wikisource */ .skin-monobook .hlist dl, .skin-modern .hlist dl, .skin-vector .hlist dl { line-height: 1.5em; } .hlist dl, .hlist ol, .hlist ul { margin: 0; padding: 0; } .hlist dd, .hlist dt, .hlist li { margin: 0; display: inline; white-space: nowrap; } .hlist dl dl, .hlist dl ol, .hlist dl ul, .hlist ol dl, .hlist ol ol, .hlist ol ul, .hlist ul dl, .hlist ul ol, .hlist ul ul { display: inline; white-space: normal; } .hlist dt:after { content: ":"; } .hlist dd:after, .hlist li:after { content: " ·"; font-weight: bold; } .hlist dd:last-child:after, .hlist dt:last-child:after, .hlist li:last-child:after { content: none; } .hlist dd.hlist-last-child:after, .hlist dt.hlist-last-child:after, .hlist li.hlist-last-child:after { content: none; } .hlist dd dd:first-child:before, .hlist dd dt:first-child:before, .hlist dd li:first-child:before, .hlist dt dd:first-child:before, .hlist dt dt:first-child:before, .hlist dt li:first-child:before, .hlist li dd:first-child:before, .hlist li dt:first-child:before, .hlist li li:first-child:before { content: "("; font-weight: normal; } .hlist dd dd:last-child:after, .hlist dd dt:last-child:after, .hlist dd li:last-child:after, .hlist dt dd:last-child:after, .hlist dt dt:last-child:after, .hlist dt li:last-child:after, .hlist li dd:last-child:after, .hlist li dt:last-child:after, .hlist li li:last-child:after { content: ")"; font-weight: normal; } .hlist dd dd.hlist-last-child:after, .hlist dd dt.hlist-last-child:after, .hlist dd li.hlist-last-child:after, .hlist dt dd.hlist-last-child:after, .hlist dt dt.hlist-last-child:after, .hlist dt li.hlist-last-child:after, .hlist li dd.hlist-last-child:after, .hlist li dt.hlist-last-child:after, .hlist li li.hlist-last-child:after { content: ")"; font-weight: normal; } .hlist.hnum ol { counter-reset: list-item; } .hlist.hnum ol > li { counter-increment: list-item; } .hlist.hnum ol > li:before { content: counter(list-item) " "; } .hlist.hnum dd ol > li:first-child:before, .hlist.hnum dt ol > li:first-child:before, .hlist.hnum li ol > li:first-child:before { content: "(" counter(list-item) " "; } /** * [[Modèle:Remarque]] */ .remarque:before { content:"Remarque : "; font-weight:bold; } .remarque { margin:2ex auto 2ex 2em; } /* Classe pour les listes horizontales séparées par des puces. Adaptation de la classe 'hlist' de en:User:Edokter. (cf. [[mw:Snippets/Horizontal lists]]). */ .liste-horizontale ul, .liste-horizontale ol, .liste-horizontale li { margin-left: 0; display: inline; white-space: nowrap; *white-space: normal; /* be kind ie7 */ } .liste-horizontale li:after { content: " "; /* au cas ou Mediawiki supprime les retours ligne */ } .liste-horizontale li + li:before { white-space: normal; content: "· "; font-weight: bold; } .liste-horizontale li li:first-child:before { white-space: normal; content: " ("; } .liste-horizontale li ul:after, .liste-horizontale li ol:after{ content: ")"; margin-left: -0.28em; } .liste-horizontale ol { counter-reset: listitem; } .liste-horizontale ol > li { counter-increment: listitem; } .liste-horizontale ol > li:first-child:before { content: "1.\202F"; } .liste-horizontale li ol > li:first-child:before { content: " (1.\202F"; } .liste-horizontale ol > li + li:before { content: "· " counter(listitem) ".\202F"; font-weight: normal; } /* Boîtes à outils */ .mw-toolbox { font-size: 90%; background: #f8f8f8; border: 1px solid #b8b8b8; padding: .25em 1em .25em 1em; clear: both; } /* ----------------------------- */ /* Navigation */ /* Laisser une marge au dessus lors du clic sur une ancre : */ #content [id] { scroll-margin-top: 44px; } .nav-haut { position: sticky; top: 0px; min-height: 40px; opacity: 1; border-bottom: solid 1px #08c; margin-bottom: 0.5em; z-index: 100; } .nav-bas { min-height: 40px; width: 100%; } .pull-left { display: inline-block; } .pull-right { display: inline-block; right: 0; position: absolute; } .nav-chap { position: sticky; top: 41px; z-index: 100; margin-bottom: 0.2em; } .nav-chap-button { width: 48px; height: 48px; display: inline-block; left: calc(50% - 24px); position: absolute; } .nav-chap-open { background-image: url("https://upload.wikimedia.org/wikipedia/commons/5/5f/Ic_expand_more_48px.svg"); } .nav-chap-close { background-image: url("https://upload.wikimedia.org/wikipedia/commons/2/2c/Ic_expand_less_48px.svg"); } /* ----------------------------- */ .left-arrow, .right-arrow { box-shadow: 0 1px 2px rgba(0,0,0,0.15); transition: box-shadow 0.3s ease-in-out; } .left-arrow:hover, .right-arrow:hover { box-shadow: 0 5px 15px rgba(0,0,0,0.3); } /* Multiple colonnes (2 colonnes : half, 3 colonnes : third) affichées sur une seule colonne si la largeur n'est pas suffisante (appareil mobile par exemple). */ .flex-content { display:flex; flex-wrap:wrap; } .flex-content-half { width:48%; } .flex-content-third { width:30%; } .flex-content-half:nth-child(odd), .flex-content-third:nth-child(3n+1), .flex-content-third:nth-child(3n+2) { margin-right:2%; } .flex-content-half:nth-child(even), .flex-content-third:nth-child(3n+2), .flex-content-third:nth-child(3n) { margin-left:2%; } @media (max-width: 700px) { .flex-content-half, .flex-content-third, { width:100%; } .flex-content-half:nth-child(odd), .flex-content-third:nth-child(3n+1), .flex-content-third:nth-child(3n+2) { margin-right:0; } .flex-content-half:nth-child(even), .flex-content-third:nth-child(3n+2), .flex-content-third:nth-child(3n) { margin-left:0; } } lokjz89knbqpl3eym1uo1ofshhy41yj 682237 682235 2022-07-23T11:57:19Z DavidL 1746 css text/css .wgfrwikibooks_CommonCssVersion:after{content:"20220723001";} /* Le CSS placé ici sera appliqué à toutes les apparences. <indicator name="version"><span class="wgfrwikibooks_CommonCssVersion">Version courante : </span></indicator> Effectuez toujours un [http://jigsaw.w3.org/css-validator/validator?uri=http%3A%2F%2Ffr.wikibooks.org%2Fw%2Findex.php%3Ftitle%3DMediaWiki%3ACommon.css%26action%3Draw%26ctype%3Dtext%2Fcss&usermedium=all test de validation CSS] après chaque modification et [http://validator.w3.org/ vérifiez] que les pages concernées par les modifications de cette feuille de style produise un code HTML valide. RECOMMANDÉ : * pour les couleurs, utiliser si possible l'une des 216 couleurs web standards (en hexadécimal pour chaque composante, n'utiliser que les chiffres multiples de 3 doublés: 00 33 66 99 cc ff) Voir aussi : - [[Mediawiki:Common.js]] - [[MediaWiki:Geshi.css]] - [[Mediawiki:Monobook.css]] - [[Mediawiki:Vector.css]] == CLASSES GÉNÉRALES == */ body.mediawiki .only_mobile { display:none; } .newbooks-0 { display:none; } body .mw-highlight { position: initial; } table { background: None; } .link-wikipedia { background: url("//upload.wikimedia.org/wikipedia/commons/8/85/Wikipedia-logo-14px.png") no-repeat center left !important; padding-left:17px !important; } .opaque { background-color: white; } /* Pour les catégories : clear avant les rubriques sous-catégorie, et pages */ #mw-subcategories, #mw-pages { clear:both; } /* Clear pour les bas de page */ .content-footer { clear:both; } /* Zone hachurée */ .hachure { background: linear-gradient(45deg, #ccc 1%, #0000 1%, #0000 49%, #ccc 49%, #ccc 51%, #0000 51%, #0000 99%, #ccc 99%); background-size: 6px 6px; } /* Affichage en fond transparent de <code></code> */ code { background-color: transparent; border: 0; } .mw-parser-output { position: relative; } /* DESCRIPTION DES GADGETS */ .gadget-new:before { content:"Nouveau ! "; color:red; font-weight:bold; font-style:italic; } .gadget-ext { background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAVklEQVR4Xn3PgQkAMQhDUXfqTu7kTtkpd5RA8AInfArtQ2iRXFWT2QedAfttj2FsPIOE1eCOlEuoWWjgzYaB/IkeGOrxXhqB+uA9Bfcm0lAZuh+YIeAD+cAqSz4kCMUAAAAASUVORK5CYII=") no-repeat scroll right center transparent; padding-right:13px; } .gadget-big { background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAACQSURBVDhPlZIBDoAgCEWpK3UnPVOdKc9UfeZ3jLn5c3PaBx4E2jNZVu6ZLGm7iWurza4mOMe0Zy/sb4WMA8sIhEgQTm7otMU77Q75/EcxEBgQgUyUtVh9LgAc72GVmrPuHzgOPMux9hY8wHEgeBmKqWJD5w/gxDdtMQd0r2s2ZenB9WFwBqPnanB+DXGykfECNY3C1VRyg0AAAAAASUVORK5CYII=") no-repeat scroll right center transparent; padding-right:23px; } /* CATÉGORIES CACHÉES */ /* Si toutes les catégories d'une page sont cachées, les afficher quand même (comme ça le script peut afficher le "+") */ .catlinks-allhidden { display: block; } /* Masquage du lien vers [[Special:Upload]], remplacement par un autre lien dans Monobook.js */ #t-upload { display:none } table.normale th, table.normale td { vertical-align: top; } /* cacher les crochets pour les notes par défaut */ .cite_crochet { display: none } /* pour lettrines */ .lettrine:first-letter { margin-right: 0.1em; float: left; font-size: 4em; font-weight: bold; } /* mise en valeur des références cliquées */ ol.references > li:target { background-color: #DDEEFF; } /* pour harmoniser les exposants */ /*.exposant { vertical-align: text-top; }*/ /* pour diminuer la taille des notes lorsqu'elles sont générées par le modèle "Références" */ .references-small { font-size: 90%;} /* dans special:allpages et special:watchlist, rendre plus visible les pages étant des redirects (allpagesredirect est déjà en italique par défaut) */ .allpagesredirect a, .watchlistredir a { color:green; } /* pour les petits liens en bas à droite des cadres */ .portailLienEdition, .SmallRightLink, .SmallRightText { display:block; font-size:x-small; text-align:right; clear:both; } /* cache le titre sur la page d'accueil */ .page-Accueil .firstHeading {display:none} /* MODÈLES DE COORDONNÉES */ /* Voir [[Modèle:Coord]] pour l'utilité de ces classes. Notez que les classes "geo", "longitude", et "latitude" ne sont pas simplement des styles mais servent aussi à l'export au Geo microformat, il ne faut pas les renommer. */ .geo-default { display:inline } .geo-nondefault { display:none } .geo-dms { display:inline } .geo-dec { display:inline } .geo-multi-punct { display:none } .longitude .latitude { white-space:nowrap } /* === Style de numérotation des listes ordonnées === Utiliser une balise &lt;div class="list-..."&gt; pour encadrer la liste. */ /* NIVEAU 1 */ .list-upper-roman li { list-style-type: upper-roman; } .list-lower-roman li { list-style-type: lower-roman; } .list-upper-latin li { list-style-type: upper-latin; } .list-lower-latin li { list-style-type: lower-latin; } /* NIVEAU 2 */ .list-upper-roman2 li li { list-style-type: upper-roman; } .list-lower-roman2 li li { list-style-type: lower-roman; } .list-upper-latin2 li li { list-style-type: upper-latin; } .list-lower-latin2 li li { list-style-type: lower-latin; } /* NIVEAU 3 */ .list-upper-roman3 li li li { list-style-type: upper-roman; } .list-lower-roman3 li li li { list-style-type: lower-roman; } .list-upper-latin3 li li li { list-style-type: upper-latin; } .list-lower-latin3 li li li { list-style-type: lower-latin; } /* === Tableau standard en utilisant class="wikitable" === */ table.wikitable { margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaaaaa solid; border-collapse: collapse; } table.wikitable > tbody > th, table.wikitable > tbody > td { border: 1px #aaaaaa solid; padding: 0.2em; } table.wikitable > tbody > th { background: #f2f2f2; text-align: center; } table.wikitable > caption { margin-left: inherit; margin-right: inherit; } /* === Tableau standard en utilisant class="charttable" === */ table.charttable { margin: 0; background: #ffffff; border: 1px #999999 solid; border-collapse: collapse; } table.charttable > tbody > th, table.charttable > tbody > td { padding: 0.2em; } table.charttable > tbody > th { background: #f2f2f2; text-align: center; } table.charttable > caption { margin-left: inherit; margin-right: inherit; } table.altlines1 > tbody > tr:nth-child(odd) {background: #f0f0f0} table.altlines2 > tbody > tr:nth-child(even) {background: #f0f0f0} /* == Messages systèmes == */ div.mw-lag-warn-normal, div.mw-lag-warn-high { text-align: left ! important; width: 50% ! important; } .mw-alerte { width:100%; clear:both; background-color:antiquewhite; border:2px solid darkorange; } /* Boites à outils, dans certains messages systèmes (Historique, Recherche, Contributions...) */ .mw-toolbox { font-size:90%; background-color:#F8F8F8; border:1px solid #B8B8B8; padding:0.25em 1em 0.25em 1em; clear:both; } /* Boite grisée, par exemple pour le renommage */ .mw-greybox { border:1px solid #ccd2d9; background-color:#f0f6fa; padding:0.25em 1em 0.25em 1em; clear:both; } .list-in ul, .list-in ol { list-style-position: inside; } /* Par défaut les listes non ordonnées ont une faible marge pour la puce devant les items, tandis que les listes ordonnées ont une marge plus grande pour le numéro potentiellement grand. Donc l'emploi de listes ordonnées et non ordonnées donnent des items non alignés par défaut. Uniformiser les marges des listes : - Pour les recettes de cuisine - Pour le contenu ayant la classe "unilist" */ .rootpage-Livre_de_cuisine .mw-content-ltr ul, .rootpage-Livre_de_cuisine .mw-content-rtl .mw-content-ltr ul, .rootpage-Livre_de_cuisine .mw-content-ltr ol, .rootpage-Livre_de_cuisine .mw-content-rtl .mw-content-ltr ol { margin-left: 2.4em; } .mw-content-ltr .unilist ul, .mw-content-rtl .mw-content-ltr .unilist ul, .mw-content-ltr .unilist ol, .mw-content-rtl .mw-content-ltr .unilist ol { margin-left: 2.4em; } .rootpage-Livre_de_cuisine .mw-content-rtl ul, .rootpage-Livre_de_cuisine .mw-content-ltr .mw-content-rtl ul, .rootpage-Livre_de_cuisine .mw-content-rtl ol, .rootpage-Livre_de_cuisine .mw-content-ltr .mw-content-rtl ol { margin-right: 2.4em; } .mw-content-rtl .unilist ul, .mw-content-ltr .mw-content-rtl .unilist ul, .mw-content-rtl .unilist ol, .mw-content-ltr .mw-content-rtl .unilist ol { margin-right: 2.4em; } /* == ÉLÉMENTS UNIQUES == Pour les id="..." */ #entete_accueil { width:80%; margin:0 auto; font-size:115%; line-height:1.3em; font-weight:bold; margin-bottom:0; text-align:center; } #browsebar { margin-top:-3px; margin-bottom:0.5em; font-variant: small-caps; text-align: center; font-size: 102%; } #browsebar ul, #browsebar li, #browsebar p { display:inline } #browsebar ul { margin-left:0; } #browsebar ul li:after { content: "\A0– " } #browsebar ul li:after { content: "" } /* == ÉLÉMENTS GÉNÉRIQUES == === Retrait des liens modifier === Pour supprimer le lien "modifier" à côté d'une section donnée, utiliser <div class="noeditsection"></div>. */ .noeditsection span.editsection { display: none; } /* == Pour [[Modèle:TopNav]] == */ #top-navigation { position:absolute; right: 1.15em; top: 3.0em; } /* == Coloration indentative == */ .ns-1 dd, .ns-3 dd, .ns-5 dd, .ns-7 dd, .ns-9 dd, .ns-11 dd, .ns-13 dd,.ns-15 dd, .colorationindentative dd { margin: 0; padding: 0; } .ns-1 dl, .ns-3 dl, .ns-5 dl, .ns-7 dl, .ns-9 dl, .ns-11 dl, .ns-13 dl, .ns-15 dl, .colorationindentative dl { border-top: solid 1px lightgrey; border-left: solid 1px lightgrey; padding-top: 0.5em; padding-left: 0.5em; margin-left: 1em; } /* == Boites déroulantes == */ div.BoxenVerschmelzen, div.NavFrame { margin: 0px; padding: 2px; border: 1px solid #aaaaaa; border-collapse: collapse; font-size: 95%; } div.BoxenVerschmelzen div.NavFrame { border-style: none; border-style: hidden; } div.NavFrame + div.NavFrame { border-top-style: none; border-top-style: hidden; } div.NavPic { background-color: #ffffff; margin: 0px; padding: 2px; float: left; } div.NavFrame div.NavHead { height: 1.6em; vertical-align: middle; font-weight: bold; font-size: 100%; background-color: #efefef; } div.NavHead p { margin: 0; vertical-align: middle; } div.NavFrame p { font-size: 100%; } div.NavFrame div.NavContent { font-size: 100%; } div.NavFrame div.NavContent p { font-size: 100%; } div.NavEnd { margin: 0px; padding: 0px; line-height: 1px; clear: both; } /* == Classes pour autoriser une centralisation des sommaires == Auteurs : [[w:user:Lachaume]], [[user:J.M. Tavernier]] Premièrement sont définis les identifiants séparés calqués sur l'apparence de #toc du thème monobook depuis /style/monobook/main.css définis séparément pour ne pas produire du code invalide au test http://validator.w3.org/ lorsque plusieurs types de sommaires sont utilisés dans une page. Puis la définition de la classe "linelist" qui permet de simuler une liste ordonnée plate à partir d'une liste ordonnée en colonne. Enfin la classe "numbersonly" qui est censée pouvoir n'afficher que les nombres, sans le texte dans un sommaire condensé destiné à être placé en bas des pages. Ces classes sont destinées à fonctionner en corrélation avec le [[Modèle:Sommaire]]. */ #sommaire_droite, #sommaire_haut, #sommaire_bas { border:1px solid #aaaaaa; background-color:#f9f9f9; padding:5px; font-size: 95%; } #sommaire_droite { width:200px; float:right; } #sommaire_prog { width:200px; float:right; background:white; border:3px blue solid; border-style: inset; margin:0; margin-left: 1em; border-spacing: 0; } #sommaire_prog th, #sommaire_prog td { padding:2px; } #sommaire_prog a, #sommaire_prog p { background:none; } #sommaire_prog h3, * #sommaire_prog h2 { font-size:small; margin:0; padding:0; border:none; text-align:center; background:#E0E0F0; font-weight:bold; } #sommaire .editsection { display:none } #sommaire ol { margin: 0.3em 0 0 2em; } #sommaire_prog ol { font-size:smaller; } .linelist ol { margin-left:0em ; counter-reset: item } .linelist ol li { display:inline ; white-space:normal ;} .linelist ol li:after { content: " · " } .linelist ol li:after { content: "" } .linelist ol li a:before { content: counter(item) ".\A0"; counter-increment: item } .linelist ol li .selflink:before { content: counter(item) ".\A0"; counter-increment: item } /* == EN-TÊTES == */ .headergris { background: url("//upload.wikimedia.org/wikipedia/commons/d/d7/Bookbar2.png") right; background-repeat: no-repeat; margin:0; background-color:#F0F0F0; font-size:120%; font-weight:bold; border:1px solid #a3b0bf; text-align:left; color:#000000; padding:0.2em 0.4em; } .headerbleu { background: url("//upload.wikimedia.org/wikipedia/commons/a/a2/Bookbar1.png") right; background-repeat: no-repeat; margin:0; background-color:#F0F0F0; font-size:120%; font-weight:bold; border:1px solid #a3b0bf; text-align:left; color:#000000; padding:0.2em 0.4em; } .headergris span.editsection, .headerbleu span.editsection, .headergris a.NavToggle, .headerbleu a.NavToggle { margin-right: 100px; } /* == ÉLÉMENTS À NE PAS AFFICHER DANS LA VERSION IMPRIMABLE == */ @media print { .firstHeading, .editlink, .noprint, .metadata, .dablink, #top-navigation, #contentSub, .toc, .bookInfobox, .catlinks, #privacy, #about, #disclaimer{ display: none !important; } a { margin: auto 1px; } } /* == Style des méta-bandeaux et des méta-étiquettes == voir [[Modèle:Méta-bandeau]] et voir [[Modèle:Méta-étiquette]] */ .bandeau { border: #cccccc solid 1px; margin-top: 5px; margin-bottom: 5px; margin-left: auto; margin-right: auto; border-left: solid 10px; padding: 0px; width: 70%; /* largeur par défaut : peut être modifiée en utilisant les classes suivantes */ border-left-color: #aaaaaa; /* couleur par défaut : peut être modifiée en utilisant les classes suivantes */ } .bandeautitre { font-weight: bold; margin: 0; padding: 2px 10px 0px 25px; background-color: inherit; } .etiquette { border: #cccccc solid 1px; background-color: white; border-left: solid 10px; padding: 5px; width: 250px; border-left-color: #aaaaaa; /* couleur par défaut, remplaçable */ margin-top: 0.5em; margin-bottom: 0.5em; } .etiquettedroite { clear: right; float: right; margin-left: 2em; } .etiquettegauche { clear: left; float: left; margin-right: 2em; } .bandeauvert, .etiquettevert { border-left-color: #228b22; } .bandeauvert .bandeautitre { background-color: #eeffee; } .bandeaurouge, .etiquetterouge { border-left-color: #c22222; } .bandeaurouge .bandeautitre { background-color: #ffeeee; } .bandeauorange, .etiquetteorange { border-left-color: #ffaa00; } .bandeauorange .bandeautitre { background-color: #ffefc6; } .bandeauviolet, .etiquetteviolet { border-left-color: #9932cc; } .bandeauviolet .bandeautitre { background-color: #f5d9ff; } .bandeaubleu, .etiquettebleu { border-left-color: #1e90ff; } .bandeaubleu .bandeautitre { background-color: #ccecff; } .bandeaujaune, .etiquettejaune { border-left-color: #fbe80f; } .bandeaujaune .bandeautitre { background-color: #ffffdd; } .bandeaupetit { width: 50%; } .bandeaumoyen { width: 60%; } .bandeaugrand { width: 90%; } body .bandeaugauche { margin-left:0; width: unset; margin-right: 320px; } @media (max-width: 700px) { body .bandeaugauche { margin-right: 0px; } } /* == Icônes de titre == */ .icone_de_titre { margin-left: 0.4em; } /* LETTRINE Sans avoir besoin d'encadrer la première lettre. class="lettrine<H>" où <H> est la hauteur en nombre de lignes (1 à 4). */ .lettrine1 p:first-child:first-letter { float:left; text-shadow:3px 3px 3px silver; padding-right:.1em; line-height:80%; margin:0px; font-size:1.8em; } .lettrine2 p:first-child:first-letter { float:left; text-shadow:3px 3px 3px silver; padding-right:.1em; line-height:80%; margin:0px; font-size:3.6em; } .lettrine3 p:first-child:first-letter { float:left; text-shadow:3px 3px 3px silver; padding-right:.1em; line-height:80%; margin:0px; font-size:5.4em; } .lettrine4 p:first-child:first-letter { float:left; text-shadow:3px 3px 3px silver; padding-right:.1em; line-height:80%; margin:0px; font-size:7.2em; } /* == Corrections impression du code source == */ @media print { pre { font-size:100%; } } /* DÉBUT DES SCHÉMAS DE COULEUR DE "CADRE À ONGLETS" Fonctionnement du [[Modèle:Cadre à onglets]] Modèle implanté par User:Peleguer de //ca.wikipedia.org Actualisé par User:Joanjoc de //ca.wikipedia.org Traduction et adaptation User:Antaya de //fr.wikipedia.org Couleurs pour le [[Modèle:Cadre à onglets]] Configuration des couleurs par défaut Couleurs utilisées; 1; 8080ff 2; 9f9fff 3; c4c4ff 4; ddddff 5; eaeaff */ .mbBouton { background-color: #ddddff; border: 0.15em solid #000000; border-color: #eaeaff #c4c4ff #9f9fff #eaeaff; -moz-border-radius: .5em .5em 0em 0em; /* NE VALIDE PAS AU w3c VALIDATOR */ border-radius: .5em .5em 0em 0em; cursor:pointer; display: inline; margin-right: 0.1em; padding: 0.2em 0.3em 0.2em 0.3em; position: relative;} .mbBouton a, .mbBouton strong { background: none !important; color:#8080ff !important; /* 1 */ font-size: 90%; font-weight: bold; padding: 0 !important; text-decoration: none !important;} .mbBouton a:hover, .mbBouton strong:hover { color: black !important; text-decoration: underline !important;} .mbBoutonSel { background-color: #9f9fff; /* 2 */ border: 0.15em solid #000000; border-color: #c4c4ff #8080ff #9f9fff #c4c4ff; /* 3 1 2 3 */ -moz-border-radius: .5em .5em 0em 0em; border-radius: .5em .5em 0em 0em; cursor: default; display: inline; margin-right: 0.1em; padding: 0.2em 0.3em 0.2em 0.3em; position: relative; color:white;} .mbBoutonSel a { background: none !important; color:white !important; cursor: default; font-size: 90%; font-weight: bold; padding: 0 !important; text-decoration: none !important;} .mbContenu { background-color: #f8f8ff; border: 0.2em solid #9f9fff; /* 2 */ border-color: #9f9fff #8080ff #8080ff #9f9fff ; /* 2 1 1 2 */ -moz-border-radius: 0em .5em .5em 0em; border-radius: 0em .5em .5em 0em; padding: 1em; position: static; } .mbOnglet { background-color: #f8f8ff; border-color: #8080ff #c4c4ff #c4c4ff #8080ff; /* 1 3 3 1 */ width: 100%; } /* Configuration du Lilas 1;7050a0 2;9070c0 3;b090e0 4;d0b0ff 5;f0d0ff */ .mbLilas .mbBouton { background-color: #d0b0ff; /* 4 */ border-color: #f0d0ff #b090e0 #9070c0 #f0d0ff; /* 5 3 2 5 */} .mbLilas .mbBouton a, .mbLilas .mbBouton strong { color:#8080ff !important; /* 1 */ font-size:90%} .mbLilas .mbBouton a:hover, .mbLilas .mbBouton strong:hover { color: black !important; text-decoration: underline;} .mbLilas .mbBoutonSel { background-color: #9070c0; /* 2 */ border-color: #b090e0 #7050a0 #9070c0 #b090e0; /* 3 1 2 3 */} .mbLilas .mbContenu { background-color: #f5fffa; border-color: #9070c0 #7050a0 #7050a0 #9070c0 ; /* 2 1 1 2 */} .mbLilas .mbOnglet { background-color: #f5fffa; border-color: #7050a0 #b090e0 #b090e0 #7050a0; /* 1 3 3 1 */} /* Configuration du Vert 1;60b030 2;75c045 3;90d060 4;a5e085 5;c0f090 */ .mbVert .mbBouton { background-color: #a5e085; /* 4 */ border-color: #c0f090 #90d060 #75c045 #c0f090; /* 5 3 2 5 */} .mbVert .mbBouton a, .mbVert .mbBouton strong { color:#60b030 !important; /* 1 */ font-size:90%} .mbVert .mbBouton a:hover, .mbVert .mbBouton strong:hover { color: black !important; text-decoration: underline;} .mbVert .mbBoutonSel { background-color: #75c045; /* 2 */ border-color: #90d060 #60b030 #75c045 #90d060; /* 3 1 2 3 */} .mbVert .mbContenu { background-color: #f5fffa; border-color: #75c045 #60b030 #60b030 #75c045 ; /* 2 1 1 2 */} .mbVert .mbOnglet { background-color: #f5fffa; border-color: #60b030 #90d060 #90d060 #60b030; /* 1 3 3 1 */} /* Configuration du Bleu 1;3379de 2;5b8dd6 3;88abde 4;a7c1e6 5;c8d6e9 */ .mbBleu .mbBouton { background-color: #a7c1e6; /* 4 */ border-color: #c8d6e9 #88abde #5b8dd6 #c8d6e9; /* 5 3 2 5 */} .mbBleu .mbBouton a, .mbBleu .mbBouton strong { color:#3379de !important; /* 1 */ font-size:90%} .mbBleu .mbBouton a:hover .mbBleu .mbBouton strong:hover { color: black !important; text-decoration: underline;} .mbBleu .mbBoutonSel { background-color: #5b8dd6; /* 2 */ border-color: #88abde #3379de #5b8dd6 #88abde; /* 3 1 2 3 */} .mbBleu .mbContenu { background-color: #f0f8ff; border-color: #5b8dd6 #3379de #3379de #5b8dd6; /* 2 1 1 2 */} .mbBleu .mbOnglet { background-color: #f0f8ff; border-color: #3379de #88abde #88abde #3379de; /* 1 3 3 1 */} /* Configuration du Orange 1;ff820e 2;ff9d42 3;ffac5d 4;ffbd7f 5;ffd0a4 6;ffeedd */ .mbOrange .mbBouton { background-color: #ffbd7f; /* 4 */ border-color: #ffd0a4 #ffac5d #ff9d42 #ffd0a4; /* 5 3 2 5 */} .mbOrange .mbBouton a, .mbOrange .mbBouton strong { color:#ff820e !important; /* 1 */ font-size:90%} .mbOrange .mbBouton a:hover .mbOrange .mbBouton strong:hover { color: black !important; text-decoration: underline;} .mbOrange .mbBoutonSel { background-color: #ff9d42; /* 2 */ border-color: #ffac5d #ff820e #ff9d42 #ffac5d; /* 3 1 2 3 */} .mbOrange .mbContenu { background-color: #ffeedd; /* 6 */ border-color: #ff9d42 #ff820e #ff820e #ff9d42; /* 2 1 1 2 */} .mbOrange .mbOnglet { background-color: #ffeedd; /* 6 */ border-color: #ff820e #ffac5d #ffac5d #ff820e; /* 1 3 3 1 */} /* Configuration du Gris 1;666666 2;868686 3;9f9f9f 4;b9b9b9 5;cfcfcf */ .mbGris .mbBouton { background-color: #b9b9b9; /* 4 */ border-color: #cfcfcf #9f9f9f #868686 #cfcfcf; /* 5 3 2 5 */} .mbGris .mbBouton a, .mbGris .mbBouton strong { color:#666666 !important; /* 1 */ font-size:90%} .mbGris .mbBouton a:hover .mbGris .mbBouton strong:hover { color: black !important; text-decoration: underline;} .mbGris .mbBoutonSel { background-color: #868686; /* 2 */ border-color: #9f9f9f #666666 #868686 #9f9f9f; /* 3 1 2 3 */} .mbGris .mbContenu { background-color: #fffce8; border-color: #868686 #666666 #666666 #868686; /* 2 1 1 2 */} .mbGris .mbOnglet { background-color: #fffce8; border-color: #666666 #9f9f9f #9f9f9f #666666; /* 1 3 3 1 */} /* Configuration du Jaune 1;aa8800 2;eabb00 3;ffd52b 4;ffe16a 5;ffeeaa */ .mbJaune .mbBouton { background-color: #ffe16a; /* 4 */ border-color: #ffeeaa #ffd52b #eabb00 #ffeeaa; /* 5 3 2 5 */} .mbJaune .mbBouton a, .mbJaune .mbBouton strong { color:#aa8800!important; /* 1 */ font-size:90%} .mbJaune .mbBouton a:hover .mbJaune .mbBouton strong:hover { color: black !important; text-decoration: underline;} .mbJaune .mbBoutonSel { background-color: #eabb00; /* 2 */ border-color: #ffd52b #aa8800 #eabb00 #ffd52b; /* 3 1 2 3 */} .mbJaune .mbContenu { background-color: #fffce8; border-color: #eabb00 #aa8800 #aa8800 #eabb00; /* 2 1 1 2 */} .mbJaune .mbOnglet { background-color: #fffce8; border-color: #aa8800 #ffd52b #ffd52b #aa8800; /* 1 3 3 1 */} /* Configuration du Rouge 1;993300 2;ca4200 3;ff6215 4;ff9b6a 5;ffc6aa */ .mbRouge .mbBouton { background-color: #ff9b6a; /* 4 */ border-color: #ffc6aa #ff6215 #ca4200 #ffc6aa; /* 5 3 2 5 */} .mbRouge .mbBouton a, .mbRouge .mbBouton strong { color:#993300!important; /* 1 */ font-size:90%} .mbRouge .mbBouton a:hover .mbRouge .mbBouton strong:hover { color: black !important; text-decoration: underline;} .mbRouge .mbBoutonSel { background-color: #ca4200; /* 2 */ border-color: #ff6215 #993300 #ca4200 #ff6215; /* 3 1 2 3 */} .mbRouge .mbContenu { background-color: #fffce8; border-color: #ca4200 #993300 #993300 #ca4200; /* 2 1 1 2 */} .mbRouge .mbOnglet { background-color: #fffce8; border-color: #993300 #ff6215 #ff6215 #993300; /* 1 3 3 1 */} /* ^^^ plus de 50 classes */ /*FIN DES SCHÉMAS DE COULEUR DE "CADRE À ONGLETS"*/ /* Classe hlist comme Wikisource */ .skin-monobook .hlist dl, .skin-modern .hlist dl, .skin-vector .hlist dl { line-height: 1.5em; } .hlist dl, .hlist ol, .hlist ul { margin: 0; padding: 0; } .hlist dd, .hlist dt, .hlist li { margin: 0; display: inline; white-space: nowrap; } .hlist dl dl, .hlist dl ol, .hlist dl ul, .hlist ol dl, .hlist ol ol, .hlist ol ul, .hlist ul dl, .hlist ul ol, .hlist ul ul { display: inline; white-space: normal; } .hlist dt:after { content: ":"; } .hlist dd:after, .hlist li:after { content: " ·"; font-weight: bold; } .hlist dd:last-child:after, .hlist dt:last-child:after, .hlist li:last-child:after { content: none; } .hlist dd.hlist-last-child:after, .hlist dt.hlist-last-child:after, .hlist li.hlist-last-child:after { content: none; } .hlist dd dd:first-child:before, .hlist dd dt:first-child:before, .hlist dd li:first-child:before, .hlist dt dd:first-child:before, .hlist dt dt:first-child:before, .hlist dt li:first-child:before, .hlist li dd:first-child:before, .hlist li dt:first-child:before, .hlist li li:first-child:before { content: "("; font-weight: normal; } .hlist dd dd:last-child:after, .hlist dd dt:last-child:after, .hlist dd li:last-child:after, .hlist dt dd:last-child:after, .hlist dt dt:last-child:after, .hlist dt li:last-child:after, .hlist li dd:last-child:after, .hlist li dt:last-child:after, .hlist li li:last-child:after { content: ")"; font-weight: normal; } .hlist dd dd.hlist-last-child:after, .hlist dd dt.hlist-last-child:after, .hlist dd li.hlist-last-child:after, .hlist dt dd.hlist-last-child:after, .hlist dt dt.hlist-last-child:after, .hlist dt li.hlist-last-child:after, .hlist li dd.hlist-last-child:after, .hlist li dt.hlist-last-child:after, .hlist li li.hlist-last-child:after { content: ")"; font-weight: normal; } .hlist.hnum ol { counter-reset: list-item; } .hlist.hnum ol > li { counter-increment: list-item; } .hlist.hnum ol > li:before { content: counter(list-item) " "; } .hlist.hnum dd ol > li:first-child:before, .hlist.hnum dt ol > li:first-child:before, .hlist.hnum li ol > li:first-child:before { content: "(" counter(list-item) " "; } /** * [[Modèle:Remarque]] */ .remarque:before { content:"Remarque : "; font-weight:bold; } .remarque { margin:2ex auto 2ex 2em; } /* Classe pour les listes horizontales séparées par des puces. Adaptation de la classe 'hlist' de en:User:Edokter. (cf. [[mw:Snippets/Horizontal lists]]). */ .liste-horizontale ul, .liste-horizontale ol, .liste-horizontale li { margin-left: 0; display: inline; white-space: nowrap; *white-space: normal; /* be kind ie7 */ } .liste-horizontale li:after { content: " "; /* au cas ou Mediawiki supprime les retours ligne */ } .liste-horizontale li + li:before { white-space: normal; content: "· "; font-weight: bold; } .liste-horizontale li li:first-child:before { white-space: normal; content: " ("; } .liste-horizontale li ul:after, .liste-horizontale li ol:after{ content: ")"; margin-left: -0.28em; } .liste-horizontale ol { counter-reset: listitem; } .liste-horizontale ol > li { counter-increment: listitem; } .liste-horizontale ol > li:first-child:before { content: "1.\202F"; } .liste-horizontale li ol > li:first-child:before { content: " (1.\202F"; } .liste-horizontale ol > li + li:before { content: "· " counter(listitem) ".\202F"; font-weight: normal; } /* Boîtes à outils */ .mw-toolbox { font-size: 90%; background: #f8f8f8; border: 1px solid #b8b8b8; padding: .25em 1em .25em 1em; clear: both; } /* ----------------------------- */ /* Navigation */ /* Laisser une marge au dessus lors du clic sur une ancre : */ #content [id] { scroll-margin-top: 44px; } .nav-haut { position: sticky; top: 0px; min-height: 40px; opacity: 1; border-bottom: solid 1px #08c; margin-bottom: 0.5em; z-index: 100; } .nav-bas { min-height: 40px; width: 100%; } .pull-left { display: inline-block; } .pull-right { display: inline-block; right: 0; position: absolute; } .nav-chap { position: sticky; top: 41px; z-index: 100; margin-bottom: 0.2em; } .nav-chap-button { width: 48px; height: 48px; display: inline-block; left: calc(50% - 24px); position: absolute; } .nav-chap-open { background-image: url("https://upload.wikimedia.org/wikipedia/commons/5/5f/Ic_expand_more_48px.svg"); } .nav-chap-close { background-image: url("https://upload.wikimedia.org/wikipedia/commons/2/2c/Ic_expand_less_48px.svg"); } /* ----------------------------- */ .left-arrow, .right-arrow { box-shadow: 0 1px 2px rgba(0,0,0,0.15); transition: box-shadow 0.3s ease-in-out; } .left-arrow:hover, .right-arrow:hover { box-shadow: 0 5px 15px rgba(0,0,0,0.3); } /* Multiple colonnes (2 colonnes : half, 3 colonnes : third) affichées sur une seule colonne si la largeur n'est pas suffisante (appareil mobile par exemple). */ .flex-content { display:flex; flex-wrap:wrap; } .flex-content-half { width:48%; } .flex-content-third { width:30%; } .flex-content-half:nth-child(odd), .flex-content-third:nth-child(3n+1), .flex-content-third:nth-child(3n+2) { margin-right:2%; } .flex-content-half:nth-child(even), .flex-content-third:nth-child(3n+2), .flex-content-third:nth-child(3n) { margin-left:2%; } @media (max-width: 700px) { .flex-content-half, .flex-content-third, { width:100%; } .flex-content-half:nth-child(odd), .flex-content-third:nth-child(3n+1), .flex-content-third:nth-child(3n+2) { margin-right:0; } .flex-content-half:nth-child(even), .flex-content-third:nth-child(3n+2), .flex-content-third:nth-child(3n) { margin-left:0; } } 86s5nb19wsw1e4gxg6zj6o4cb23pw19 Programmation Octave/Sommaire 0 9019 682185 502205 2022-07-22T18:47:14Z DavidL 1746 Déplacement intro wikitext text/x-wiki Ce livre est une introduction à l'utilisation des outils de calcul numériques Octave (et Matlab), qui se veut simple et illustrative par des exemples. == Sommaire == * [[Programmation Octave/Introduction|Introduction]] * Chap 1 : [[Programmation Octave/Résoudre un Système d'équations linéaires|Résoudre un Système d'équations linéaires]] * Chap 2 : [[Programmation Octave/Algèbre linéaire|Algèbre linéaire]] * Chap 3 : [[Programmation Octave/Analyse réelle|Analyse réelle]] * Chap 4 : [[Programmation Octave/Dessiner des graphiques de fonctions|Dessiner des graphiques de fonctions]] * Chap 5 : [[Programmation Octave/Analyse Complexe|Analyse Complexe]] * Chap 6 : [[Programmation Octave/Scripts et fonctions|Scripts et fonctions]] * Chap 7 : [[Programmation Octave/Calcul numérique|Calcul numérique]] ** résolution d'équation non-linéaire ** résolution d'équation différentielle ordinaire ** minimisation de fonctions * Chap 8 : [[Programmation Octave/Traitement du son|Traitement du son]] = Annexes = *Annexe 1 : [[Programmation Octave/Installation octave|Installation de GNU Octave]] *Annexe 2 : [[Programmation Octave/Editeur scite|L'éditeur SciTE]] *Annexe 3 : [[Programmation Octave/Octave Forge|Octave Forge]] = Auteurs = * [http://www.the-asw.com/articles/2005/11/11/54-scite-l-editeur-indispensable C Go] * [[Utilisateur:Npettiaux|Nicolas Pettiaux]] = Références = * [http://www.the-asw.com/articles/2005/11/11/54-scite-l-editeur-indispensable Utilisation de l'éditeur Scite] * [http://www.gnu.org/software/octave/docs.html Documentation Octave] {{AutoCat}} e3v3rpqjcgz250m1e6ndpipp27weps8 682186 682185 2022-07-22T18:48:09Z DavidL 1746 wikitext text/x-wiki * [[Programmation Octave/Introduction|Introduction]] * Chap 1 : [[Programmation Octave/Résoudre un Système d'équations linéaires|Résoudre un Système d'équations linéaires]] * Chap 2 : [[Programmation Octave/Algèbre linéaire|Algèbre linéaire]] * Chap 3 : [[Programmation Octave/Analyse réelle|Analyse réelle]] * Chap 4 : [[Programmation Octave/Dessiner des graphiques de fonctions|Dessiner des graphiques de fonctions]] * Chap 5 : [[Programmation Octave/Analyse Complexe|Analyse Complexe]] * Chap 6 : [[Programmation Octave/Scripts et fonctions|Scripts et fonctions]] * Chap 7 : [[Programmation Octave/Calcul numérique|Calcul numérique]] ** résolution d'équation non-linéaire ** résolution d'équation différentielle ordinaire ** minimisation de fonctions * Chap 8 : [[Programmation Octave/Traitement du son|Traitement du son]] Annexes *Annexe 1 : [[Programmation Octave/Installation octave|Installation de GNU Octave]] *Annexe 2 : [[Programmation Octave/Editeur scite|L'éditeur SciTE]] *Annexe 3 : [[Programmation Octave/Octave Forge|Octave Forge]] {{AutoCat}} 95zxnz64f94nh2y812dp81ux0dfs0n3 682203 682186 2022-07-22T18:56:27Z DavidL 1746 wikitext text/x-wiki * [[Programmation Octave/Introduction|Introduction]] * Chap 1 : [[Programmation Octave/Résoudre un Système d'équations linéaires|Résoudre un Système d'équations linéaires]] * Chap 2 : [[Programmation Octave/Algèbre linéaire|Algèbre linéaire]] * Chap 3 : [[Programmation Octave/Analyse réelle|Analyse réelle]] * Chap 4 : [[Programmation Octave/Dessiner des graphiques de fonctions|Dessiner des graphiques de fonctions]] * Chap 5 : [[Programmation Octave/Analyse Complexe|Analyse Complexe]] * Chap 6 : [[Programmation Octave/Scripts et fonctions|Scripts et fonctions]] * Chap 7 : [[Programmation Octave/Calcul numérique|Calcul numérique]] ** résolution d'équation non-linéaire ** résolution d'équation différentielle ordinaire ** minimisation de fonctions * Chap 8 : [[Programmation Octave/Traitement du son|Traitement du son]] Annexes *Annexe 1 : [[Programmation Octave/Installation octave|Installation de GNU Octave]] *Annexe 2 : [[Programmation Octave/Éditeur scite|L'éditeur SciTE]] *Annexe 3 : [[Programmation Octave/Octave Forge|Octave Forge]] {{AutoCat}} atn9w5jr4igivu1c3g3nwi8n84g03ue Programmation Octave/Résoudre un Système d'équations linéaires 0 9020 682182 460042 2022-07-22T18:10:31Z DavidL 1746 wikitext text/x-wiki {{Octave}} Durant ce chapitre, nous utiliserons comme exemple la résolution du [[w:Système d'équations linéaires|système]] suivant : :<math>\left\{\begin{matrix} 2x_1+3x_2-x_3=-1 \\ x_1 - x_2 + 3x_3 = 4 \\2x_1-3x_2+x_3=3 \end{matrix}\right.</math> ou, sous forme matricielle: :<math>A \cdot x = b \;</math> == Définir un vecteur == Nous voulons définir le vecteur : <math>b =\begin{pmatrix}-1 \\ 4 \\ 3\end{pmatrix}</math> Pour cela il faut entrer: octave> b = [-1 ; 4 ; 3] b = -1 4 3 ou octave> b = [-1 4 3]' b = -1 4 3 L'opérateur " ' " transpose un vecteur ou une matrice, on crée un vecteur ligne et on le transpose. Il faut noter qu'on peut aussi définir un vecteur par une suite : octave:> x = 1:4 x = 1 2 3 4 octave> y = 10:-2:4 y = 10 8 6 4 Et, si on ajoute "'';''" à la fin de la ligne, Octave n'affiche pas le résultat. == Définir une matrice == Pour définir une [[w:Matrice (mathématiques)|matrice]], on procède comme pour le vecteur : octave> A = [2 3 -1; 1 -1 3; 2 -3 1] A = 2 3 -1 1 -1 3 2 -3 1 On peut aussi modifier une matrice ou un vecteur composante par composante : octave> A(2,2) = -10 A = 2 3 -1 1 -10 3 2 -1 3 == Résoudre le système == L'opérateur habituel pour résoudre un système linéaire est "\" : octave> x = A\b x = -1 1 2 On peut verifier que <math>A \cdot x = b</math> : octave> b2 = A*x b2 = -1 4 3 == Décomposition LU == Avant de résoudre le système, on peut décomposer la matrice avec la [[w:Décomposition LU|décomposition LU]] : octave> [L,U]= lu(A) L = 1.00000 0.00000 0.00000 0.50000 0.62500 1.00000 1.00000 1.00000 0.00000 U = 2 3 -1 0 -4 4 0 0 1 puis : octave> y = L\b y = -1 4 2 octave> x = U\y x = -1 1 2 == Décomposition de Cholesky == Nous pouvons aussi résoudre des systèmes linéaire avec la [[w:Factorisation de Cholesky|décomposition de Cholesky]] obtenue par la fonction "''chol(A)''" si la matrice du système est symétrique [[w:Matrice définie positive|définie positive]] : octave> A = [2 -1 0 0;-1 2 -1 0;0 -1 2 -1;0 0 -1 2] A = 2 -1 0 0 -1 2 -1 0 0 -1 2 -1 0 0 -1 2 octave> R = chol(A) R = 1.41421 -0.70711 0.00000 0.00000 0.00000 1.22474 -0.81650 0.00000 0.00000 0.00000 1.15470 -0.86603 0.00000 0.00000 0.00000 1.11803 Upper Triangular On peut vérifier que <math>A = R^{T}R \;</math> octave> B = R'*R B = 2.00000 -1.00000 0.00000 0.00000 -1.00000 2.00000 -1.00000 0.00000 0.00000 -1.00000 2.00000 -1.00000 0.00000 0.00000 -1.00000 2.00000 Puis on résout le système : octave>b = [1 -1 1 -1]' octave> y = R'\b; octave> x = R\y x = 0.40000 -0.20000 0.20000 -0.40000 Enfin on vérifie le calcul : octave> z = A*x z = 1.0000 -1.0000 1.0000 -1.0000 [[Catégorie:Programmation Octave (livre)]] nd4l48h3zbiji40euuz0cr25lt1dfyf 682192 682182 2022-07-22T18:53:48Z DavidL 1746 wikitext text/x-wiki <noinclude>{{Programmation Octave}}</noinclude> Durant ce chapitre, nous utiliserons comme exemple la résolution du [[w:Système d'équations linéaires|système]] suivant : :<math>\left\{\begin{matrix} 2x_1+3x_2-x_3=-1 \\ x_1 - x_2 + 3x_3 = 4 \\2x_1-3x_2+x_3=3 \end{matrix}\right.</math> ou, sous forme matricielle: :<math>A \cdot x = b \;</math> == Définir un vecteur == Nous voulons définir le vecteur : <math>b =\begin{pmatrix}-1 \\ 4 \\ 3\end{pmatrix}</math> Pour cela il faut entrer: octave> b = [-1 ; 4 ; 3] b = -1 4 3 ou octave> b = [-1 4 3]' b = -1 4 3 L'opérateur " ' " transpose un vecteur ou une matrice, on crée un vecteur ligne et on le transpose. Il faut noter qu'on peut aussi définir un vecteur par une suite : octave:> x = 1:4 x = 1 2 3 4 octave> y = 10:-2:4 y = 10 8 6 4 Et, si on ajoute "'';''" à la fin de la ligne, Octave n'affiche pas le résultat. == Définir une matrice == Pour définir une [[w:Matrice (mathématiques)|matrice]], on procède comme pour le vecteur : octave> A = [2 3 -1; 1 -1 3; 2 -3 1] A = 2 3 -1 1 -1 3 2 -3 1 On peut aussi modifier une matrice ou un vecteur composante par composante : octave> A(2,2) = -10 A = 2 3 -1 1 -10 3 2 -1 3 == Résoudre le système == L'opérateur habituel pour résoudre un système linéaire est "\" : octave> x = A\b x = -1 1 2 On peut verifier que <math>A \cdot x = b</math> : octave> b2 = A*x b2 = -1 4 3 == Décomposition LU == Avant de résoudre le système, on peut décomposer la matrice avec la [[w:Décomposition LU|décomposition LU]] : octave> [L,U]= lu(A) L = 1.00000 0.00000 0.00000 0.50000 0.62500 1.00000 1.00000 1.00000 0.00000 U = 2 3 -1 0 -4 4 0 0 1 puis : octave> y = L\b y = -1 4 2 octave> x = U\y x = -1 1 2 == Décomposition de Cholesky == Nous pouvons aussi résoudre des systèmes linéaire avec la [[w:Factorisation de Cholesky|décomposition de Cholesky]] obtenue par la fonction "''chol(A)''" si la matrice du système est symétrique [[w:Matrice définie positive|définie positive]] : octave> A = [2 -1 0 0;-1 2 -1 0;0 -1 2 -1;0 0 -1 2] A = 2 -1 0 0 -1 2 -1 0 0 -1 2 -1 0 0 -1 2 octave> R = chol(A) R = 1.41421 -0.70711 0.00000 0.00000 0.00000 1.22474 -0.81650 0.00000 0.00000 0.00000 1.15470 -0.86603 0.00000 0.00000 0.00000 1.11803 Upper Triangular On peut vérifier que <math>A = R^{T}R \;</math> octave> B = R'*R B = 2.00000 -1.00000 0.00000 0.00000 -1.00000 2.00000 -1.00000 0.00000 0.00000 -1.00000 2.00000 -1.00000 0.00000 0.00000 -1.00000 2.00000 Puis on résout le système : octave>b = [1 -1 1 -1]' octave> y = R'\b; octave> x = R\y x = 0.40000 -0.20000 0.20000 -0.40000 Enfin on vérifie le calcul : octave> z = A*x z = 1.0000 -1.0000 1.0000 -1.0000 [[Catégorie:Programmation Octave (livre)]] 5o5b0kbt1d9ulgcm3m08tlod641ze6g Programmation Octave/Algèbre linéaire 0 9021 682193 458195 2022-07-22T18:53:55Z DavidL 1746 wikitext text/x-wiki <noinclude>{{Programmation Octave}}</noinclude> == Opération sur les vecteurs == On peut calculer la norme d'un vecteur grâce à la commande "''norm()''": octave> x = [2 3 1 1 1]; octave> n = norm(x) n = 4 La commande "''dot(x,y)''" calcul le [[w:Produit scalaire|produit scalaire]] de deux vecteurs: octave> y = [-1 1 2] y = -1 1 2 octave> x = [1 1 1] x = 1 1 1 octave>z = dot(x,y) z = 2 La commande "''cross(x,y)'''" calcul le produit vectoriel de vecteur en trois dimensions: octave> z = cross(x,y) z = 1 -3 2 == Opérations sur les matrices == Nous avons déjà vu que nous pouvions multiplier des matrices et calculer leurs transposées. Mais Octave permet aussi de les élever à une puissance : octave> A = [-1 2;2 0] A = -1 2 2 0 octave>B = A^4 B = 29 -18 -18 20 La commande "''rank()''" calcul le [[w:Rang d'une matrice|rang]] d'une matrice: octave> r = rank(A) r = 2 La commande "''trace''" permet d'obtenir la [[w:Trace (algèbre)|trace]] d'une matrice: octave> t = trace(A) t = -1 On peut aussi, grâce à la commande "''expm()''", calculer l'exponentielle de la matrice: octave> E = expm(A) E = 0.36788 7.38906 7.38906 1.00000 == Matrices particulières == Octave fournit plusieurs fonctions pour créer des matrices particulières. === Matrice nulle === Pour créer une matrice nulle, il faut se servir de la fonction "''zeros''": octave> null = zeros(5, 3) null = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 === Matrice identité === La fonction "''eye''" crée une matrice identité. octave:13> I = eye(3) I = 1 0 0 0 1 0 0 0 1 === Matrice diagonale === La fonction "''diag()''" crée des matrices diagonales, sur-diagonales ou sous-diagonales à partir d'un vecteur: octave>A = diag([1 2 3],0) A = 1 0 0 0 2 0 0 0 3 octave>A = diag([1 2 3],2) A = 0 0 1 0 0 0 0 0 2 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 octave>A= diag([1 2 3],-1) A = 0 0 0 0 1 0 0 0 0 2 0 0 0 0 3 0 === Matrice aléatoire === La fonction "''rand()''" crée une matrice dont les coefficients sont des nombres choisis aléatoirement entre 0 et 1: octave> rand(2,3) ans = 0.871644 0.651894 0.563654 0.076660 0.790505 0.275381 === Matrice de Hilbert === La fonction "''hilb()''" permet de créer une [[w:Matrice_de_Hilbert|matrice de Hilbert]] : octave> hilb(3) ans = 1.00000 0.50000 0.33333 0.50000 0.33333 0.25000 0.33333 0.25000 0.20000 === Autre matrices particulières === Octave propose beaucoup de commandes pour créer des matrices spéciales : * ''hankel'' ([[w:Matrice de Hankel|Matrice de Hankel]]). * ''invhilb'' (Inverse de la [[w:Matrice de Hilbert|Matrice de Hilbert]]), * ''sylvester_matrix'' ([[w:Matrice de Sylvester|Matrice de Sylvester]]), * ''toeplitz'' ([[w:Matrice de Toeplitz|Matrice de Toeplitz]]), * ''vander'' ([[w:Matrice de Vandermonde|Matrice de Vandermonde]]). == Calcul du déterminant == Pour calculer un [[w:Déterminant (mathématiques)|determinant]] il suffit d'utiliser la commande "''det()''": octave> A = [1 -1 3; 4 -3 1; 2 -3 1] A = 1 -1 3 4 -3 1 2 -3 1 octave> d = det(A) d = -16 == Valeurs propres et vecteurs propres == Avant d'aborder le calcul de [[w:Valeur propre, vecteur propre et espace propre|valeurs propres]] et vecteurs propres, il faut savoir qu'on peut manipuler les vecteurs et les matrices composante par composante : octave> A = [2 -1; -1 1] A = 2 -1 -1 1 octave> a11 = A(1,1) a11 = 2 On peut même utiliser le vecteur d'une matrice grâce au caractère ":" : octave:18> a2 = A(:,2) a2 = -1 1 Donc la commande "''eig''" permet de calculer les vecteurs et valeurs propres d'une matrice : octave> [vecteursp , valeursp] = eig(A) vecteursp = -0.52573 -0.85065 -0.85065 0.52573 valeursp = 0.38197 0.00000 0.00000 2.61803 Les coefficients diagonaux de la matrice ''valeursp'' sont les valeurs propres. On peut vérifier que le calcul est juste : octave> x=A*vecteursp(:,1) x = -0.20081 -0.32492 octave> y = valeursp(1,1)*vecteursp(:,1) y = -0.20081 -0.32492 == Décomposition de matrice == Nous avons déjà vu la décomposition de Cholesky et LU d'une matrice dans le chapitre précédent, mais Octave permet d'effectuer d'autres décomposition. Par exemple on peut utiliser la [[w:Décomposition QR|décomposition QR]] : octave> A = [1 -1 2; 3 -2 1; -3 2 1] A = 1 -1 2 3 -2 1 -3 2 1 octave> [q r] = qr(A) q = -2.2942e-01 9.7333e-01 7.6411e-17 -6.8825e-01 -1.6222e-01 7.0711e-01 6.8825e-01 1.6222e-01 7.0711e-01 r = -4.35890 2.98240 -0.45883 0.00000 -0.32444 1.94666 0.00000 0.00000 1.41421 Ensuite on vérifie que <math> A = QR \,</math>: octave:8>B = q*r B = 1.00000 -1.00000 2.00000 3.00000 -2.00000 1.00000 -3.00000 2.00000 1.00000 On peut de même effectuer plusieurs autres décompositions grâve aux fonctions : * <code>qz</code> (decomposition QZ), * <code>qzhess</code> (decomposition de Hessenberg), * <code>schur</code> (decomposition de Schur), * <code>svd</code> (décomposition de la valeur singulière), * <code>housh</code> * <code>krylov</code> [[Catégorie:Programmation Octave (livre)]] rnyse38kjepyx95p718vbsqp6dj54ce 682194 682193 2022-07-22T18:54:27Z DavidL 1746 wikitext text/x-wiki <noinclude>{{Programmation Octave}}</noinclude> == Opération sur les vecteurs == On peut calculer la norme d'un vecteur grâce à la commande "''norm()''" : octave> x = [2 3 1 1 1]; octave> n = norm(x) n = 4 La commande "''dot(x,y)''" calcul le [[w:Produit scalaire|produit scalaire]] de deux vecteurs : octave> y = [-1 1 2] y = -1 1 2 octave> x = [1 1 1] x = 1 1 1 octave>z = dot(x,y) z = 2 La commande "''cross(x,y)'''" calcul le produit vectoriel de vecteur en trois dimensions : octave> z = cross(x,y) z = 1 -3 2 == Opérations sur les matrices == Nous avons déjà vu que nous pouvions multiplier des matrices et calculer leurs transposées. Mais Octave permet aussi de les élever à une puissance : octave> A = [-1 2;2 0] A = -1 2 2 0 octave>B = A^4 B = 29 -18 -18 20 La commande "''rank()''" calcul le [[w:Rang d'une matrice|rang]] d'une matrice : octave> r = rank(A) r = 2 La commande "''trace''" permet d'obtenir la [[w:Trace (algèbre)|trace]] d'une matrice : octave> t = trace(A) t = -1 On peut aussi, grâce à la commande "''expm()''", calculer l'exponentielle de la matrice : octave> E = expm(A) E = 0.36788 7.38906 7.38906 1.00000 == Matrices particulières == Octave fournit plusieurs fonctions pour créer des matrices particulières. === Matrice nulle === Pour créer une matrice nulle, il faut se servir de la fonction "''zeros''" : octave> null = zeros(5, 3) null = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 === Matrice identité === La fonction "''eye''" crée une matrice identité. octave:13> I = eye(3) I = 1 0 0 0 1 0 0 0 1 === Matrice diagonale === La fonction "''diag()''" crée des matrices diagonales, sur-diagonales ou sous-diagonales à partir d'un vecteur : octave>A = diag([1 2 3],0) A = 1 0 0 0 2 0 0 0 3 octave>A = diag([1 2 3],2) A = 0 0 1 0 0 0 0 0 2 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 octave>A= diag([1 2 3],-1) A = 0 0 0 0 1 0 0 0 0 2 0 0 0 0 3 0 === Matrice aléatoire === La fonction "''rand()''" crée une matrice dont les coefficients sont des nombres choisis aléatoirement entre 0 et 1 : octave> rand(2,3) ans = 0.871644 0.651894 0.563654 0.076660 0.790505 0.275381 === Matrice de Hilbert === La fonction "''hilb()''" permet de créer une [[w:Matrice_de_Hilbert|matrice de Hilbert]] : octave> hilb(3) ans = 1.00000 0.50000 0.33333 0.50000 0.33333 0.25000 0.33333 0.25000 0.20000 === Autre matrices particulières === Octave propose beaucoup de commandes pour créer des matrices spéciales : * ''hankel'' ([[w:Matrice de Hankel|Matrice de Hankel]]). * ''invhilb'' (Inverse de la [[w:Matrice de Hilbert|Matrice de Hilbert]]), * ''sylvester_matrix'' ([[w:Matrice de Sylvester|Matrice de Sylvester]]), * ''toeplitz'' ([[w:Matrice de Toeplitz|Matrice de Toeplitz]]), * ''vander'' ([[w:Matrice de Vandermonde|Matrice de Vandermonde]]). == Calcul du déterminant == Pour calculer un [[w:Déterminant (mathématiques)|determinant]] il suffit d'utiliser la commande "''det()''" : octave> A = [1 -1 3; 4 -3 1; 2 -3 1] A = 1 -1 3 4 -3 1 2 -3 1 octave> d = det(A) d = -16 == Valeurs propres et vecteurs propres == Avant d'aborder le calcul de [[w:Valeur propre, vecteur propre et espace propre|valeurs propres]] et vecteurs propres, il faut savoir qu'on peut manipuler les vecteurs et les matrices composante par composante : octave> A = [2 -1; -1 1] A = 2 -1 -1 1 octave> a11 = A(1,1) a11 = 2 On peut même utiliser le vecteur d'une matrice grâce au caractère ":" : octave:18> a2 = A(:,2) a2 = -1 1 Donc la commande "''eig''" permet de calculer les vecteurs et valeurs propres d'une matrice : octave> [vecteursp , valeursp] = eig(A) vecteursp = -0.52573 -0.85065 -0.85065 0.52573 valeursp = 0.38197 0.00000 0.00000 2.61803 Les coefficients diagonaux de la matrice ''valeursp'' sont les valeurs propres. On peut vérifier que le calcul est juste : octave> x=A*vecteursp(:,1) x = -0.20081 -0.32492 octave> y = valeursp(1,1)*vecteursp(:,1) y = -0.20081 -0.32492 == Décomposition de matrice == Nous avons déjà vu la décomposition de Cholesky et LU d'une matrice dans le chapitre précédent, mais Octave permet d'effectuer d'autres décomposition. Par exemple on peut utiliser la [[w:Décomposition QR|décomposition QR]] : octave> A = [1 -1 2; 3 -2 1; -3 2 1] A = 1 -1 2 3 -2 1 -3 2 1 octave> [q r] = qr(A) q = -2.2942e-01 9.7333e-01 7.6411e-17 -6.8825e-01 -1.6222e-01 7.0711e-01 6.8825e-01 1.6222e-01 7.0711e-01 r = -4.35890 2.98240 -0.45883 0.00000 -0.32444 1.94666 0.00000 0.00000 1.41421 Ensuite on vérifie que <math> A = QR \,</math>: octave:8>B = q*r B = 1.00000 -1.00000 2.00000 3.00000 -2.00000 1.00000 -3.00000 2.00000 1.00000 On peut de même effectuer plusieurs autres décompositions grâve aux fonctions : * <code>qz</code> (decomposition QZ), * <code>qzhess</code> (decomposition de Hessenberg), * <code>schur</code> (decomposition de Schur), * <code>svd</code> (décomposition de la valeur singulière), * <code>housh</code> * <code>krylov</code> [[Catégorie:Programmation Octave (livre)]] kgknk1utcfapbwc4kferakk79rgy9d3 Programmation Octave/Dessiner des graphiques de fonctions 0 9022 682196 618018 2022-07-22T18:54:44Z DavidL 1746 wikitext text/x-wiki <noinclude>{{Programmation Octave}}</noinclude> === Graphique en deux dimensions === Pour dessiner le graphique d'une fonction, il faut d'abord définir l'intervalle où la fonction va prendre ses valeurs. Ici, nous prenons <math>[0;2\pi]\;</math> et un pas de ''0.05'' entre chaque valeurs: octave> x = [0:0.05:2*pi]; Ensuite, grâce à la fonction "''plot()''", nous pouvons dessiner la fonction cosinus: octave> plot(x,cos(x)) On peut aussi créer des graphiques de fonction discrète avec la fonction "''stem''": octave> stem(x,cos(x)) Pour dessiner des fonctions il est possible d'utiliser la commande "''fplot''". On commence par définir la fonction que l'on veut tracer (ici <math>f(x)=e^{-\cos(x)}\,</math>): octave> function [y] = mafonction(x) > y = exp(-cos(x)); > endfunction Ensuite on utilise ''fplot'' en passant en argument le nom de la fonction et l'intervalle sur lequel on veut la tracer : octave> fplot("mafonction",[0,10]) === Dessiner une courbes en trois dimensions === Nous allons prendre comme exemple le dessin d'une spirale en trois dimension (un ressort). Il faut d'abord paramétrer la courbe : octave> t = 0:0.1:30; octave> x = t; octave> y = sin(t); octave> z = cos(t); Ensuite grâce à la commande "''plot3()''" on dessine la courbe: octave> plot3(x,y,z) On obtient le résultat suivant : [[Image:Spirale.png|thumb|300px|center|Exemple de tracé en 3D avec Octave]] === Dessiner une surface === Nous allons dessiner la surface d'équation <math>z = \sin(2.\sqrt{x^2 + y^2})</math> Dans un premier temps nous définissons la surface de départ avec la fonction "''meshgrid()''" ici nous prenons un carré de côté 5 et de 0.1 entre chaque point: octave> [x,y] = meshgrid(-5:0.1:5); Puis nous définissons ''z'': octave> z = sin(2.*(x.^2 + y.^2).^(1/2)); Enfin nous dessinons la surface: octave> mesh(z) [[Image:Octave surfave mesh.png|thumb|center|300px|Voici la surface obtenue]] [[Catégorie:Programmation Octave (livre)]] 83sdh9ip472imb8yv5ry1tfdy8neyqy Programmation Octave/Introduction 0 9023 682191 285750 2022-07-22T18:53:36Z DavidL 1746 wikitext text/x-wiki <noinclude>{{Programmation Octave}}</noinclude> '''Octave''' est à la fois un langage interprété et un logiciel de calcul numérique distribué sous licence [[w:Licence publique générale GNU|GPL]]. Le langage [[w:GNU Octave|Octave]] est compatible avec [[w:Matlab|Matlab]] pour la plupart des usages mathématiques. Ce livre devrait donc convenir comme introduction tant à [[w:GNU Octave|Octave]] qu'à [[w:Matlab|Matlab]]. == L'environnement de travail Octave == L'interpréteur [[w:GNU Octave|Octave]] se lance en ligne de commande en invoquant "''octave''" ou en activant le raccourci adéquat, qui est apparu lors de l'installation. Après avoir lancé le programme, celui-ci affiche une '''session de travail''' dans la '''fenêtre de commandes''' ('''command window''' en anglais), dans laquelle l'utilisateur est invité à entrer les commandes interactivement. Une autre manière d'entrer des commandes ou des suites de commandes regroupées dans des fichiers script ou des fonctions est abordée dans la section [[Programmation Octave/Scripts et fonctions|Scripts et fonctions]] Pour chaque commande, il est possible d'obtenir de l'aide en tapant "''help le_nom_de_la_commande''". La documentation qui apparaît alors est en anglais (en tout cas tant que nous n'aurons pas fait le travail de traduction de la documentation :-). Pour consulter la documentation, il est aussi possible, sous GNU/linux de taper "'''info:octave'''" dans la barre de navigation de [[w:Konqueror|Konqueror]] sous [[w:KDE|KDE]]. Nous verrons plus loin comment les utiliser mais, avec Octave, nous pouvons assigner des valeurs à des variable par exemple : octave> x = -3 x = -3 octave> y = 1 y = 1 octave> z = [1 -1] z = 1 -1 Ensuite nous pouvons voir à chaque instant quelles variables sont utilisées avec la commande "''whos''": octave> whos -variables *** local user variables: Prot Name Size Bytes Class ==== ==== ==== ===== ===== rw- __nargin__ 1x1 8 double rwd x 1x1 8 double rwd y 1x1 8 double rwd z 1x2 16 double Total is 5 elements using 40 bytes La commande "''clear''" suivie du nom de la variable permet de supprimer la variable ou toutes les variables définies si elle n'est pas suivie d'argument. La commande "''history''" permet de consulter l'historique de toutes les lignes tapées jusqu'à maintenant. == Liens == *[http://www.gnu.org/software/octave/ Site officiel]. [[Catégorie:Programmation Octave (livre)]] [[pt:GNU Octave/Básico]] tv5rz7wriuai9tgqdu27rtpo0b3r747 Modèle:Programmation Octave 10 9024 682188 448919 2022-07-22T18:52:39Z DavidL 1746 DavidL a déplacé la page [[Modèle:Octave]] vers [[Modèle:Programmation Octave]] : Nom du livre wikitext text/x-wiki {| style="border:3px blue solid; border-style: inset;" cellspacing="0" cellpadding="2px" align="right" | style="text-align:center;background:#E0E0F0;" | '''[[Programmation Octave|Octave]]''' |- | style="text-align:center;background:#E0E0F0;" | ''[[Accueil/Informatique|L'étagère Informatique]] <br>et<br> [[ Accueil/Sciences de la nature et sciences exactes|Mathématiques]].'' |- | style="text-align:center;background:white;" | [[Image:Wikibooks-logo-fr.png|150px|center|Octave]] |- | bgcolor="#E0E0F0" align="center" |'''Sommaire''' |- | bgcolor="white" | *<small>[[Programmation Octave/Introduction|Introduction]]</small> *<small>Chap. 1 - [[Programmation Octave/Résoudre un Système d'équations linéaires|Résoudre un système d'équations <br>linéaires]]</small> *<small>Chap. 2 - [[Programmation Octave/Algèbre linéaire|Algèbre linéaire]]</small> *<small>Chap. 3 - [[Programmation Octave/Analyse réelle|Analyse réelle]]</small> *<small>Chap. 4 - [[Programmation Octave/Dessiner des graphiques de fonctions|Dessiner des graphiques de fonctions]]</small> *<small>Chap. 5 - [[Programmation Octave/Analyse Complexe|Analyse Complexe]]</small> *<small>Chap. 6 - [[Programmation Octave/Scripts_et_fonctions|Scripts et fonctions]]</small> *<small>Chap. 7 - [[Programmation Octave/Calcul numérique|Calcul numérique]]</small> *<small>Chap. 8 - [[Programmation Octave/Traitement du son|Traitement du son]]</small> *<small>Annx. 1 - [[Programmation Octave/Installation_octave|Installation de Octave]]</small> *<small>Annx. 2 - [[Programmation Octave/Editeur_scite|L'éditeur Scite]]</small> |- | bgcolor="#E0E0F0" align="center" |'''Bibliographie''' |- | bgcolor="white" | |- | bgcolor="#E0E0F0" align="center" |'''Autres cours''' |- | bgcolor="white" | *<small>[[Scilab]]</small> |- | align="right" bgcolor="white" | <small>[{{fullurl:Modèle:Octave|action=edit}} Modifier ce modèle]</small> |}{{#if:{{{nocat|}}}||{{#ifeq:{{{1|}}}|nocat||[[Catégorie:Programmation Octave (livre)|{{SUBPAGENAME}}]]}}}}<noinclude>[[Catégorie:Modèles non imprimables spécifiques à un livre|Octave]]</noinclude> ggtg0qd7ytgrdm97sewsj6ss15cjmfc 682190 682188 2022-07-22T18:52:52Z DavidL 1746 Contenu remplacé par « {{ModèleLivre|2=Gnu-octave-logo.svg}}<noinclude>[[Catégorie:Modèles non imprimables spécifiques à un livre|{{SUBPAGENAME}}]]</noinclude> » wikitext text/x-wiki {{ModèleLivre|2=Gnu-octave-logo.svg}}<noinclude>[[Catégorie:Modèles non imprimables spécifiques à un livre|{{SUBPAGENAME}}]]</noinclude> 1g2gsstwe5d5gmgt411gx6283ziharj Programmation Octave/Analyse Complexe 0 9101 682197 515894 2022-07-22T18:54:52Z DavidL 1746 wikitext text/x-wiki <noinclude>{{Programmation Octave}}</noinclude> == Définir des nombres complexes == Octave permet de définir des nombres complexes de façon très simple car "''i''" est une constante prédéfinie d'Octave: octave> z = 1 + i z = 1 + 1i Ou des vecteurs complexes : octave> z = [1; 3; 1] + i*[2; -2; -1] z = 1 + 2i 3 - 2i 1 - 1i La lettre "''j''" peut aussi être utilisée au lieu de "''i''". == Fonctions de base == La commande "''real()''" donne la partie réelle d'un nombre complexe, la commande "''imag()''" en donne la partie imaginaire: octave> z = 3 + 4i z = 3 + 4i octave> R = real(z) R = 3 octave> I = imag(z) I = 4 La commande "''conj()''" calcul le conjugué d'un nombre complexe: octave> z2 = conj(z) z2 = 3 - 4i La commande "''abs()''" permet de calculer le module d'un nombre complexe: octave> r = abs(z) r = 5 La commande "''arg()''" calcul permet de calculer l'argument du nombre : octave> a = arg(z) a = 0.92730 [[Catégorie:Programmation Octave (livre)]] noqotxehprymnonf8kvk3wvei261jua Programmation Octave/Analyse réelle 0 9129 682195 518286 2022-07-22T18:54:35Z DavidL 1746 wikitext text/x-wiki <noinclude>{{Programmation Octave}}</noinclude> == Opérateur de base == Octave possède tous les opérateurs de base : "'''+''', '''-''', '''*''', '''/'''" cependant si on veut effectuer des calculs composantes par composantes et non matriciels il faut ajouter un point devant l'opérateur par exemple : octave> x = 3*ones(2,2) x = 3 3 3 3 octave>y = x*x y = 18 18 18 18 octave:14>z = x.*x z = 9 9 9 9 == Fonction de base == La fonction "''ceil''" permet d'obtenir le plus petit entier supérieur au nombre passé en argument: octave:> x = ceil(1.001) x = 2 La fonction "''round''" permet d'obtenir l'entier le plus proche du nombre passé en argument: octave> x = round(3.501) x = 4 == Trigonométrie == Octave propose plusieurs [[w:Fonction trigonométrique|fonctions trigonométriques]]: *Sinus : "''sin(x)''" *Cosinus : "''cos(x)''" *Tangente : "''tan(x)''" *Sécante : "''sec(x)''" *Arcsinus : "''asin(x)''" *Arccosinus : "''acos(x)''" *Arctangent : "''atan(x)''" *Cosecante : "''csc(x)''" == Fonction exponentielle, logarithme et puissance == On peut aussi calculer l'exponentielle d'un nombre avec la commande "''exp()''" ou en elevant à la puissance la constante "''e''", D'une façon générale on peut élever un nombre à une puissance avec l'opérateur "''^''": octave> x = 2 x = 2 octave> y = 2^10 y = 1024 octave>x = exp(2) x = 7.3891 octave>y = e^2 y = 7.3891 Il y a aussi la commande "log()" pour calculer le [[w:Logarithme|logarithme]] ainsi que "''log2()''" et "''log10()''" pour le logarithme en base 2 et 10: octave:18>z = log2(y) z = 10 == Fonctions hyperboliques == Voici les [[w:Fonctions hyperboliques|fonctions hyperboliques]] implémentées par Octave: *Sinus hyperbolique : "''sinh(x)''" *Cosinus hyperbolique : "''cosh(x)''" *Tangente hyperbolique : "''tanh(x)''" *Secante hyperbolique : "''sech(x)''" *Cotangente hyperbolique : "''coth(x)''" *Argument sinus hyperbolique : "''asinh(x)''" *Argument cosinus hyperbolique : "''acosh(x)''" *Argument tangente hyperbolique : "''atanh(x)''" == Fonctions spéciales == On peut aussi très simplement calculer des fonctions spéciales: *[[w:Factorielle|Factorielle]] : "''factorial(x)''" *[[w:Fonction Gamma d'Euler|Fonction Gamma]] : "''gamma(x)''" *[[w:Fonction d'erreur|Fonction d'erreur]] : "''erf(x)''" *[[w:Fonction Beta|Fonction Beta]] : "''beta(x,y)''" == Somme et Produit == Les commandes "''sum()''" et "''prod()''" permettent de calculer la somme ou le produit des composantes d'un vecteur ligne: octave> x = 1:5 x = 1 2 3 4 5 octave> s = sum(x) s = 15 octave> p = prod(x) p = 120 == Polynôme == Octave permet de manipuler des polynômes facilement. Par exemple le vecteur : octave> p = [-1 2 0 4]; Représente le polynôme <math> -x^3+2x^2+4</math>. Par afficher le polynôme de façon naturelle il faut utiliser la fonction "''polyout''" : octave> polyout(p,'x') -1*x^3 + 2*x^2 + 0*x^1 + 4 On peut aussi deriver ou integrer un polynôme avec les fonctions "''polyint''" et "''polyder''" : octave> polyder(p) ans = -3 4 0 octave> polyint(p) ans = -0.25000 0.66667 0.00000 4.00000 0.00000 Et enfin pour evaluer un polynôme en un point on utilise polyval : octave> polyval(p,1) ans = 5 == Définir des fonctions == Pour définir ses propres fonctions il faut utiliser une commande un peu différente de ce que nous avons déjà vu. Supposons que nous voulions utiliser la fonction: :<math>f(x) = \ln(1+x^2)- \sqrt{\cosh(x)}</math> Il faut procéder comme cela : octave> function [y] = f(x) > y = log(1+x.^2)-sqrt(cosh(x)) > endfunction Ensuite nous pouvons tester notre fonction: octave> y = f(0) y = -1 y = -1 octave> y = f(10) y = -100.33 y = -100.33 Une telle définition de fonction peut aussi être entrée dans un fichier spécifique qui contient exactement les mêmes caractères et qui porte comme nom, le nom de la fonction, sous la forme (ici) ''f.m'' [[Catégorie:Programmation Octave (livre)]] 0xwizcdx2024r4zn3nmeyqcoz06cop7 Programmation Octave/Scripts et fonctions 0 9155 682198 640195 2022-07-22T18:55:11Z DavidL 1746 wikitext text/x-wiki <noinclude>{{Programmation Octave}}</noinclude> Octave permet de créer des fichier "''.m''" qui peuvent s'exécuter comme des fonctions par la suite. Il suffit pour cela d'entrer des lignes de commande dans un éditeur de texte puis l'enregistrer avec l'extension "''.m''". === Un exemple de programme récursif === Par exemple nous créons le fichier "''factorielle.m''" qui contient : function[n] = factorielle(x) if(x <= 1) n = 1; else n = x*factorielle(x-1); x = x-1; endif endfunction Ensuite nous nous plaçons dans le répertoire où nous avons créé le fichier avec la commande "''cd''" car Octave connaît les commandes "''cd''" et "''ls''" (elles ont le même effet que si on les exécute dans un [[Programmation Bash|terminal]]). Et enfin on exécute le script en invoquant le nom de la fonction (qui est aussi le nom du fichier) : octave>f = factorielle(2) f = 2 octave> f = factorielle(10) f = 3628800 Comme le script le laissait voir cette fonction calcule bien la factorielle du nombre. == Script pour résoudre un système d'équations non-linéaires == Voici un deuxième exemple de script sous Octave, il permet de résoudre un petit système d'équations non-linéaires à 2 variables x et y : :<math>\begin{cases}\frac{\partial x}{\partial t}=rx(1 - x/k) - axy/(1 + bx)\\ \frac{\partial y}{\partial t}=caxy/(1 + bx) - dy \end{cases} </math> :<math>x(t=0)=1 \ et \ y(t=0)= 2</math> Il affiche aussi les courbes d'évolution des deux variables. À noter que d'une manière générale, un fichier de script d'Octave ne doit pas commencer par le mot-clé <code>function</code>. Les commentaires dans le script sont précédés d'un #. <pre> printf("Résolution d'un système d'équations et affichage.\n"); function xdot = f (x, t) # Paramètres des équations : r = 0.25; k = 1.4; a = 1.5; b = 0.16; c = 0.9; d = 0.8; # Définition du système à 2 équations : xdot(1) = r*x(1)*(1 - x(1)/k) - a*x(1)*x(2)/(1 + b*x(1)); xdot(2) = c*a*x(1)*x(2)/(1 + b*x(1)) - d*x(2); endfunction # Conditions initiales des deux variables : x0 = [1; 2]; # Définition du vecteur temps : t = linspace (0, 50, 200); # Résolution avec la routine lsode : x = lsode ("f", x0, t); # Affichage des deux courbes : plot (t, x); </pre> On l'appelle par exemple 'nonlin.m' et l'on exécute en tapant nonlin dans la ligne de commande Octave. == Boucles == Comme la plupart des langages de programmation le langage Octave est composé de plusieurs types de boucles. === While === La boucle ''while'' permet d'exécuter les instructions tant que la condition spécifiée est vraie. Par exemple : fib = ones (1, 10); i = 3; while (i <= 10) fib (i) = fib (i-1) + fib (i-2); i++; endwhile donne les dix premiers nombres de Fibbonacci : octave> fib = 1 1 2 3 5 8 13 21 34 55 === For === La boucle ''for'' permet d’exécuter une instruction ou une suite d'instructions à partir d'une valeur initiale jusqu’à une valeur finale: fib = ones (1, 10); for i = 3:10 fib (i) = fib (i-1) + fib (i-2); endfor Le script précédent donne le même résultat que l'exemple de la section précédente. [[Catégorie:Programmation Octave (livre)]] jjt5ksd9zbqq357kx0e3yokm434fs1z Programmation Octave/Calcul numérique 0 9190 682199 150957 2022-07-22T18:55:37Z DavidL 1746 wikitext text/x-wiki <noinclude>{{Programmation Octave}}</noinclude> = Résoudre des équations non-linéaires = La commande "''fsolve("f",x0)''" permet de donner une approximation de la solution à l'équation <math> f(x) = 0</math> en partant du nombre initiale "''x0''". Par exemple si on veut résoudre: :<math>x^3 - x^2 + 5x - 8 = 0\,</math> Il faut d'abord définir la fonction: octave> function [y] = f(x) > y = x.^3 - x.^2 + 5.*x -8 > endfunction Ensuite on dessine le graphique de la fonction pour voir approximativement ou se situe le zéro de la fonction: octave> x = -5:0.1:5; octave> plot(x,f(x)); On voit que le zéro se trouve entre ''0'' et ''2'' donc on peut choisir <math>x_0 = 1.5</math>: octave> z = fsolve("f",1.5) y = 0.62500 y = 0.62500 y = 0.017493 y = 5.0709e-04 y = 4.2678e-07 y = 1.0425e-11 y = 0 z = 1.4265 Ensuite on vérifie la solution: octave> y = f(z) y = 0 y = 0 = Résoudre des équations différentielles du premier ordre = La commande "''lsode''" permet de résoudre des équations du type: :<math>f'(t) = g(f(t),t)\,</math> Ou ''f'' est inconnue. = Minimiser une fonction = fmins permet de minimiser une fonction de plusieurs variables. Par exemple si on veut minimiser :<math>f(x_1,x_2) = (x_2-1)^2 + (x_1-3)^2 \,</math> avec le vecteur initial ''(1,0)''. il suffit de faire : octave> F = @(x) (x(2)-1)^2 + (x(1)-3)^2; octave> fmins(F,[1 0]) ans = 3 1 [[Catégorie:Programmation Octave (livre)]] jmb751rd4gpwliq83uulopy8jw9ieri Wikilivres:Maintenance/Redirections doubles 4 14214 682173 409372 2022-07-22T17:50:53Z DavidL 1746 wikitext text/x-wiki Liste des redirections doubles : [[Special:DoubleRedirects]] ---- Les redirections doubles sont des [[Aide:Jargon#Redirect, Redirection (u)|redirections]] qui pointent déjà sur des redirections. Très simples à résoudre. Il existe même un bot qui s'en charge automatiquement. Voir {{wp|Aide:Pywikipedia}}. Utilisez le script redirect.py avec l'argument « <code>-double</code> ». À la main, il faut faire en sorte que la redirection à gauche de chaque occurrence de liste pointe vers la page située à l’extrémité droite de chaque occurrence (la page cible qui contient le texte vers laquelle la redirection est censée pointer). [[Catégorie:Maintenance Wikilivres]] jzhq1fk7nvwiu2nm4o70f86xgfxs10m Wikilivres:CDU/6/68/681/681.3/681.3.0 4 14704 682206 681905 2022-07-22T18:58:30Z DavidL 1746 wikitext text/x-wiki <div style="position:sticky;top:0;background:white;" class="boite">{{Titre simple|681.3.0 - Systèmes d'exploitation, langages informatiques, logiciels}} {{sommaire alphabétique|[[#0-9|0-9]]}}</div> ---- {{Colonnes|taille=20|nombre=4|style=column-rule:solid 4px #99ccff;|1= == 0-9 == * [[Programmation 4GL|4GL]] == A == * [[À la découverte d'Unicode]] * [[Programmation Ada|Ada]] * [[Programmation Algol|Algol]] * [[Algorithmique impérative]] * [[Apache]] * [[Les ASCII de 0 à 127|ASCII de 0 à 127]] * [[Programmation Assembleur|Assembleur]] * [[Programmation Assembleur Z80|Assembleur Z80]] * [[Programmation Assembleur x86|Assembleur x86]] == B == * [[Programmation Bash|Bash]] * [[Programmation Basic|Basic]] * [[Programmation Basic Casio|Basic Casio]] * [[Programmation TI-Basic|Basic TI]] * [[Programmation Brainfuck|Brainfuck]] == C == * [[Programmation C|C]] * [[Mathc initiation|C inititiation]] * [[Mathc gnuplot|C et gnuplot]] * [[Mathc matrices|C et matrices]] * [[Mathc complexes|C et matrices complexes]] * [[Programmation C++|C++]] * [[Programmation C-C++|C-C++]] * [[C++ pour .NET]] * [[Programmation C sharp|C#]] * [[Cadriciel Dojo]] * [[Cobol ANS 74]] * [[Programmation Cobol ANS 75|Cobol ANS 75]] * [[Conception et VHDL]] * [[Programmation CSS|CSS]] == D == * [[Débutez dans IRC]] * [[Découverte de MySQL, PostgreSQL et Oracle]] * [[Découvrir Matlab]] * [[DOS]] * [[Drupal]] * [[Programmation .Net|.NET]] * [[Debian]] == E == * [[Exercices en langage C]] * [[Exercices en langage C++]] == F == * [[Firefox]] * [[Programmation Forth|Forth]] * [[Programmation Fortran|Fortran]] == G == * [[Programmation GTK2 en C|GTK2 en C]] * [[Programmation GTK2 en Pascal|GTK2 en Pascal]] * [[Guide d'utilisation de l'IRC]] == H == * [[Programmation Haskell|Haskell]] * [[Programmation HTML|HTML]] == I == * [[Initiation Labview|Initiation LabView]] * [[Introduction à LilyPond]] * [[Guide d'utilisation de l'IRC|IRC]] == J == * [[Programmation JEE|JEE]] * [[Programmation Java|Java]] * [[Programmation JavaFX|JavaFX]] * [[Programmation Java Swing|Java Swing]] * [[Programmation JavaScript|JavaScript]] == K == * [[Programmation Kylix]] == L == * [[Initiation Labview|LabView]] * [[LaTeX]] * [[Programmation LDA|LDA]] * [[Le langage de programmation LSE]] * [[Le système d'exploitation GNU-Linux]] * [[Introduction à LilyPond|LilyPond]] * [[Programmation Linotte|Linotte]] * [[Programmation Lisaac|Lisaac]] * [[LispWorks CAPI]] * [[Logiciels libres]] * [[Programmation Logo|Logo]] == M == * [[Programmation Mathematica|Mathematica]] * [[MediaWiki sémantique]] * [[Méthodes de génie logiciel avec Ada]] * [[Mkd (Extracteur de documents)]] * [[MusiXTeX]] == O == * [[Objective Caml]] * [[Programmation Octave|Octave]] * [[OpenRefine]] * [[Optimisation des compilateurs]] * [[OS X]] == P == * [[Patrons de conception]] (''Design Pattern'') * [[Pouvoir Accéder et Utiliser Writer]] * [[Programmation .NET]] * [[Programmation graphique]] * [[Programmation Java]] * [[Programmation JavaFX]] * [[Programmation Linux]] * [[Programmation Pascal|Pascal]] * [[Programmation Perl|Perl]] * [[Programmation PHP|PHP]] * [[Programmation POSIX|POSIX]] * [[Programmation Python|Python]] * [[Pygame]] * [[PyQt]] : Qt pour Python == Q == * [[Programmation Qt|Qt]] == R == * [[Programmer en R|R]] * [[Programmation Rebol|Rebol]] * [[Recherche d'information sur internet]] * [[Réseaux TCP/IP]] * [[Programmation RPG|RPG]] * [[Programmation Ruby|Ruby]] == S == * [[Se servir d'un ordinateur de A à Z]] * [[Programmation Scheme|Scheme]] * [[Le langage SGML|SGML]] * [[Programmation Shellscript|Shellscript]] * [[Programmation Smalltalk|Smalltalk]] * [[Soya]] * [[Programmation avec la SDL|SDL]] * [[Programmation SQL|SQL]] * [[Programmation SQL PL/SQL|SQL PL/SQL]] * [[Structures de données en C]] * [[Programmation Java Swing|Swing (Java)]] * [[Les systèmes d'exploitation]] == T == * [[Programmation Tcl|Tcl]] * [[Programmation TeX|TeX]] == U == * [[Ubuntu]] == V == * [[Programmation VBA|VBA]] * [[Programmation Visual Basic .NET|Visual Basic .NET]] == X == * [[Programmation XML|XML]] }} ---- {{sommaire alphabétique|[[#0-9|0-9]]}} [[Catégorie:Recherche CDU 681.3 – Informatique, appareils, matériels et techniques de traitement des données]] [[Catégorie:Recherche CDU niveau 5]] swypjsnckv29lv2ioa4uc5jy95movqw Wikilivres:CDU/5/51 4 14779 682207 642191 2022-07-22T18:59:05Z DavidL 1746 wikitext text/x-wiki {{Titre simple|51 - Mathématiques}} __NOTOC__ [[Fichier:CMAP - Centre de Mathématiques Appliquées de l'Ecole polytechnique (25911635211).jpg|thumb]] ==== Guides pratiques ==== * [[Abaques de calcul]] {{00}} : ** [[Tables trigonométriques]] {{75}}, * [[S'initier au boulier en 10 leçons]] {{100}} * [[Calcul écrit]] * [[Découvrir Scilab]] {{100}} * [[Découvrir Matlab]] {{25}} * [[Programmation Octave|Octave]] ==== Théorie ==== * [[Calcul différentiel et intégral pour débutants]] * [[Cours de mathématiques collège]] * [[Mathématiques niveau seconde]] * [[Algèbre]] * [[Analyse]] * [[Algèbre linéaire]] * [[Algèbre de Boole]] * [[Algèbre différentielle]] * [[Mathématiques/Arithmétique flottante|Arithmétique flottante]] * [[Calcul scientifique]] * [[Calcul tensoriel]] ==== Histoire ==== * [[Étude de l'œuvre mathématique de Lazare Carnot]] ==== Divers ==== * [[Curiosités mathématiques]] [[Catégorie:Recherche CDU 5 – Sciences pures et naturelles]] [[Catégorie:Recherche CDU niveau 2]] g7erotqftmtcjyhyj5zwe30zlrfjd4y Programmation Octave/Éditeur scite 0 15416 682202 677530 2022-07-22T18:56:16Z DavidL 1746 wikitext text/x-wiki <noinclude>{{Programmation Octave}}</noinclude> == Présentation == SciTE est un éditeur de textes très bien adapté à la programmation, libre et fonctionnant sur Microsoft Windows et GNU/linux. Dans le monde des éditeurs de texte, le choix est plutôt difficile. Les utilisateurs de Microsoft Windows en savent quelque chose, le Bloc-notes étant limité et WordPad peu adapté à l'écriture de programmes. SciTE, éditeur de texte libre, fonctionnant sous Windows et Linux entre autres, est léger, performant et offre plusieurs éléments de confort comme la coloration syntaxique. Il reconnaît aussi bien le HTML et le CSS, que le PHP, le Perl, le C ou encore le C++. SciTE signifie Scintilla Text Editor. Scintilla est un composant d'édition de code source aux fonctionnalités puissantes, utilisé dans des projets comme Anjuta ou Notepad2. Que permet-il de faire au juste ? SciTE permet d'éditer n'importe quel fichier texte (code source, fichier de configuration ou simple fichier texte), dans n'importe quel encodage (y compris l'UTF-8). Il offre de nombreuses fonctionnalités en terme d'édition pure (recherche et remplace à base de regexp, sélection en colonnes, ...) et se débrouille à merveille comme éditeur de code (coloration syntaxique, intégration des API des langages permettant l'autocomplétion des fonctions, possibilité de « replier » du code, de compiler et d'exécuter directement depuis l'éditeur, ...). En plus, il dispose d'onglets (tabs) et connaît autant de langages qu'on veut bien lui en définir. Si ce couteau suisse pour programmeur vous tente, passons à l'installation... = Installation = Les utilisateurs de Linux devraient trouver SciTE packagé dans leur distribution. Les utilisateurs de Windows pourront trouver sur la [http://scintilla.sourceforge.net/SciTEDownload.html page de download] plusieurs versions : * Les <i>Windows Executable</i> ne demandent pas d'installation, mais n'offrent pas toutes les fonctionnalités. À utiliser lorsqu'on n'est pas sur son ordinateur (surtout le single file executable vraiment pratique). * Les <i>Windows Installers</i> s'intègrent parfaitement à Windows (vous pourrez donc faire clic droit sur un fichier, puis « Éditer dans SciTE »). Je vous conseille l'[http://gisdeveloper.tripod.com/scite.html installeur de Bruce Dodson], léger et très complet. = Utilisation = SciTE fonctionne comme n'importe quel éditeur de texte (ou presque). Il peut ouvrir plusieurs fichiers simultanément grâce à la gestion des onglets (tabs). == Les raccourcis claviers standards == Ce sont pratiquement tous les mêmes que dans la plupart des autres logiciels, aussi bien sous Windows que sous Linux. {| class="wikitable altlines1" ! Combo ! Action |- | Ctrl + O | Ouvre un fichier. |- | Ctrl + W | Ferme le fichier en cours. |- | Ctrl + N | Nouveau fichier (nouvel onglet). |- | Ctrl + S | Enregistrer le fichier. |- | Ctrl + Shift + S | Enregistrer le fichier sous un autre nom. |- | Ctrl + Tab | Passer à l'onglet de droite. |- | Ctrl + Shift + Tab | Passer à l'onglet à gauche. |- | Ctrl + F | Rechercher (find). |- | F3 | Trouver le résultat suivant (après avoir commencé une recherche). |- | Shift + F3 | Trouver le résultat précédent (après avoir commencé une recherche). |- | Ctrl + H | Rechercher & Remplacer. |- | Ctrl + G | Aller à la ligne... (goto) |- | Ctrl + C | Copier. |- | Ctrl + X | Couper. |- | Ctrl + V | Coller. |- | Ctrl + Z | Annuler. |- | Ctrl + Y | Refaire (après une annulation ratée). |- | Ctrl + A | Sélectionner tout le contenu du fichier. |- | Ctrl + P | Imprimer. |- | Ctrl + R | Commenter un bloc (##) |} = Références = * L'essentiel de cette section provient de "[http://www.the-asw.com/articles/2005/11/11/54-scite-l-editeur-indispensable scite l'éditeur indispensable]" que l'auteur a permis de reprendre et adapter. 2z9x5whe2c2x1iduze439g7cr6xxtzq Programmation Octave/Installation octave 0 15417 682201 564667 2022-07-22T18:56:04Z DavidL 1746 wikitext text/x-wiki <noinclude>{{Programmation Octave}}</noinclude> = Installation de Octave-Forge sur GNU/Linux = Sur GNU/Linux, octave et ses composants sont en général disponible par défaut. L'installation est donc très simple en utilisant les outils de gestion des paquets logiciels. == Debian et ses dérivés (dont [[w:Ubuntu |Ubuntu]]) == On peut utiliser le logiciel graphique ''synaptics'' et installer les paquets '''octave''' et ceux liés comme '''octave-forge''' . Il est aussi possible de procéder de manière semblable en ligne de commande en tapant : sudo apt-get install octave Si aptitude est installé, on peut bien entendu également l'utiliser : sudo aptitude install octave == Fedora == À la ligne de commande, on peut taper : yum install octave == Gentoo == À la ligne de commande, on peut taper : emerge sync emerge octave = Installation de Octave-Forge sur OS X = Sur OS X (de Apple), il est assez facile d'installer une copie disponible sur Internet (FIXME) = Installation de Octave-Forge sur Microsoft Windows XP/Vista/7/8 = La procédure pour Windows en particulier était un peu moins simple, sans être complexe cependant, et a été grandement simplifiée ces derniers mois grâce au travail de nombreux membres de la [http://www.octave.org communauté octave]. Un manipulation utilisant des outils et compilations récents au moment de l'écriture de cette page est indiquée ici. Pour des précisions ou de l'actualité, merci de consulter [http://wiki.octave.org/wiki.pl?OctaveForWindows OctaveForWindows ] sur le wiki officiel d'Octave. Il faut installer octave-forge et ceci fait, utiliser l'éditeur scite inclus. Celui-ci peut être francisé (pour ce qui concerne l'interface). Comme elle concerne potentiellement beaucoup d'utilisateurs, c'est celle-ci qui sera d'abord décrite ici. La distribution <B>Octave pour Windows</B> de Michael Goffioul décrite ci-dessous est la plus aboutie actuellement et celle qui offre le plus haut degré de compatibilité avec MATLAB . Elle contient [http://octave.sourceforge.net/ Octave-Forge] dénommée ainsi car intégrant les extensions à Octave développée sur la célèbre plateforme open-source Web [http://sourceforge.net/ SourceForge]). == Procédure d'installation == Cette version d'Octave-Forge <B>intègre</B> les composants suivants : * GNU Octave, version 3.0.3 (i686-pc-msdosmsvc) et des versions plus récentes * extensions octave-forge 2008.04.28 * preversion de OctaveDE, un outil graphique en développement pour octave (alpha release encore en test) * [http://www.gnuplot.info/ Gnuplot] 4.2.2 spécialement préparée pour cette version de octave pour Windows * Jhandles permettant des graphiques avec une interface très puissante, plus compatible avec matlab, utilisant Java et OpenGL based * Msys 1.0.10 * NSIS Installation * l'éditeur [http://www.scintilla.org/SciTE.html SciTE] 1.68, multilingue et permettant la mise en évidence colorée du code, * la documentation en format PDF et HTML Cette version est maintenue par Michael Goffioul et la dernière version (au moment de la rédaction) date du 2008-05-05 Elle est téléchargeable sur http://sourceforge.net/project/showfiles.php?group_id=2888&package_id=40078 === Détails d'installation === * Télécharger le <U>kit d'installation</U> ''octave-3.0.3-setup.exe'' ou une version plus récente depuis le site [http://sourceforge.net/project/showfiles.php?group_id=2888&package_id=40078 SourceForge] * puis exécuter ''octave-3.0.3-setup.exe'' * choisir le moteur graphique ''jhandle'' par défaut. * si des paquets complémentaires de octave-forge doivent être installés, les sélectionner * déroulement de l'installation... en poussant plusieurs fois sur les boutons next ==== Raccourci de lancement ==== ''Octave'' et ''Octave UI'' (pour l'interface graphique OctaveDE) en développement se trouvant dans le menu Démarrer > Programmes > Octave == Interface de développement == Une interface de développement (IDE) semblable à Matlab est '''qtoctave''' téléchargeable à https://forja.rediris.es/frs/download.php/601/qtoctave0.7.2_octave3.0.0_Portable_win32.zip == Usage de Octave-Forge et degré de compatibilité par rapport à MATLAB == Depuis le menu Démarrer > Programme > Octave... vous accédez à la documentation Octave sous forme HTML et PDF. Dans l'un des répertoires pointé par la variable <code>PATH</code> Octave, vous pouvez définir un fichier <code>.octaverc</code> comme prologue de démarrage Octave. En quittant, Octave déposera, dans le dossier <code>HOME</code> Octave, son fichier historique '''.octave_hist''' Pour des précisions sur la compatibilité Octave-Forge par rapport à MATLAB, on consultera notamment les pages suivantes : * [http://octave.sourceforge.net/compatibility.html Octave Compatibility FAQ] * [http://wiki.octave.org/wiki.pl?MatlabOctaveCompatibility Matlab Octave Compatibility] * [http://users.powernet.co.uk/kienzle/octave/ Matlab/Octave compatibility packages] Pour une compatibilité maximum avec MATLAB, Octave devrait être démarré avec '''octave --traditional''' (à définir donc dans le script '''octave.sh'''). Cela positionne de la façon suivante un certain nombre de variables "builtins"/intégrées PS1 = '>> ' PS2 = ' ' beep_on_error = 1 crash_dumps_octave_core = 0 default_save_format = 'mat-binary' fixed_point_format = 1 page_screen_output = 0 print_empty_dimensions = 0 warn_function_name_clash = 0 = Auteurs = * Nicolas Pettiaux (surtout les adaptations pour Wikibooks et mise en forme), basé sur page web [http://enacit1.epfl.ch/cours_matlab/octave.html Jean-Daniel Bonjour] = Références = * [http://enacit1.epfl.ch/cours_matlab/octave.shtml Installation de Octave-Forge] [[pt:GNU Octave/Instalação]] 06q6atln3v4ei9nk6gsbxc49sli69hw Programmation Octave/Traitement du son 0 15926 682200 556599 2022-07-22T18:55:55Z DavidL 1746 wikitext text/x-wiki <noinclude>{{Programmation Octave}}</noinclude> == Jouer un son == Octave permet de jouer un son grâce à la commande <code> sound </code>. Cette commande se trouve dans le package <code>audio</code>. <code> sound </code> prend en argument un vecteur représentant l'échantillon à jouer et éventuellement la fréquence d'échantillonnage: octave> n = 1:10000; octave> s = 10*sin(2.*pi.*n./500); octave> sound(s); Input Filename : - Sample Size : 16-bits Sample Encoding: signed (2's complement) Channels : 1 Sample Rate : 8000 Time: 00:01.25 [4473:54.21] of 4473:55.46 ( 0.0%) Output Buffer: 59.80K Done. == Lire et écrire des WAV == Octave permet de lire et d'écrire des fichier son en .wav les fonctions sont <code> wavread </code> et <code> wavwrite </code>. Par exemple si on veut écrire le signal <code> s </code> : octave> wavwrite("test.wav",s); Et si maintenant on veut lire le signal : octave> x = wavread("test.wav"); == Transformées d'un signal == La commande <code> fft </code> calcule la [[w:Transformée de Fourier discrète|transformée de Fourier]] d'un signal : octave> x = [1 2 1]; octave> X = fft(x) X = 4.00000 + 0.00000i -0.50000 - 0.86603i -0.50000 + 0.86603i Et la commande <code> ifft </code> retourne la transformée inverse : octave> ifft(X) ans = 1 2 1 Les commandes <code> dct </code> et <code> idct </code> calculent la [[w:Transformée en cosinus discrète|transformée en cosinus discrète]] ainsi que sa transformée inverse : octave> X = dct(x) X = 2.30940 0.00000 -0.81650 octave> idct(X) ans = 1.0000 2.0000 1.0000 9cwgfcy98kyvbblejsjuv76s6tmvxfc Algorithmique impérative/Recherche 0 19538 682180 635389 2022-07-22T18:06:18Z DavidL 1746 wikitext text/x-wiki {{Algorithmique impérative}} == Problèmatique == Supposons que nous avons déclaré un tableau <code>tab</code> d'entiers comme suit : <syntaxhighlight lang="text"> Variables tab : tableau MIN à MAX de entiers </syntaxhighlight> Supposons que ce tableau est rempli d'entiers '''inconnus''' mais '''triés''' dans l'ordre croissant. Proposez un algorithme qui, étant donné un entier indiqué par l'utilisateur, trouve son indice dans le tableau. On supposera que l'entier indiqué par l'utilisateur est effectivement dans le tableau. == Aide == Vous remarquerez que ce problème s'apparente au problème de recherche d'un mot dans le dictionnaire. Pensez donc à la méthode que vous employez dans cette situation... == Solutions == === Solutions moyennes === Voici une solution, qui n'est pas celle attendue. L'algorithme parcourt le tableau du début à la fin et compare l'élément à l'entier indiqué par l'utilisateur. Il s'arrête lorsqu'il est trouvé. Remarquez que la faiblesse de cette algorithme provient du fait qu'il fonctionne même quand le tableau n'est pas trié, il n'exploite donc pas cet avantage trop important pour être négligé. <syntaxhighlight lang="text" line> Algorithme recherche Variables q : entier (* l'entier recherché *) i : entier (* ce sera l'indice de parcours *) Début Afficher("Donner l'entier à trouver") Lire(q) i ← MIN tantque tab[i] != q i ← i+1 ftq Afficher("L'indice où se trouve ", q ," est ", i) Fin </syntaxhighlight> L'algorithme suivant fonctionne mais à le défaut de continuer à parcourir le tableau même quand l'élément a été trouvé. <syntaxhighlight lang="text" line> Algorithme recherche_mauvais Variables q : entier (* l'entier recherché *) i : entier (* ce sera l'indice de parcours pour la boucle *) résultat : entier (* l'indice résultat sera stocké ici *) Début Afficher("Donner l'entier à trouver") Lire(q) i ← MIN pour i de MIN à MAX (* on parcourt tout le tableau *) si tab[i] = q alors résultat ← i (* si on a trouvé on mémorise l'indice *) ftq Afficher("L'indice où se trouve ", q ," est ", résultat) Fin </syntaxhighlight> === Solution attendue === Voici enfin la solution attendue. Vous étiez peut-être arrivé à cette déduction seul ou en consultant l'aide mais vous avez compris que ce problème s'apparente à celui de la recherche dans un dictionnaire. En effet, on cherche un mot dans un ensemble de mots inconnus mais triés. Si vous avez déjà cherché un mot dans le dictionnaire, vous avez certainement remarqué que lire le premier, regarder si c'est celui qu'on cherche, puis passer au suivant, et ainsi de suite n'est pas la solution la plus efficace... La solution est donc l'algorithme de [[w:Dichotomie|recherche dichotomique]] (du grec « dichotomie » : « couper en deux »). On ouvre le dictionnaire au milieu et un prend un mot au hasard, si le mot qu'on cherche est avant, recommence avec la première moitié du dictionnaire, s'il est après, avec la deuxième moitié. Dans la bonne moitié on prend un mot au milieu, etc... <syntaxhighlight lang="text" line> Algorithme recherche_dichotomique Variables q : entier (* l'entier recherché *) i : entier (* ce sera l'indice de parcours pour la boucle *) deb, fin : entiers (* deux entiers pour désigner le début et la fin de la zone dans laquelle on recherche *) Début Afficher("Donner l'entier à trouver") Lire(q) (* on commence en recherchant dans tout le tableau *) deb ← MIN fin ← MAX répéter i = arrondir((fin+deb)/2) (* on prend i entre deb et fin *) si tab[i] > q alors fin ← i (* on est tombé trop haut : on ramène la borne supérieure *) sinon si tab[i] < q alors deb ← i (* on est tombé trop bas : on ramène la borne inférieure *) jusqu'à tab[i]=q Afficher("L'indice où se trouve ", q ," est ", i) Fin </syntaxhighlight> ==== Traduction en Pascal ==== Voilà sa traduction en Pascal, le tableau étant rempli à la main : <syntaxhighlight lang="pascal" line> program recherche_dichotomique; Const MIN = 0; MAX = 10; Var tab : array [MIN..MAX] of integer; q : integer; (* l'entier recherché *) i : integer; (* ce sera l'indice de parcours pour la boucle *) deb, fin : integer; (* deux entiers pour désigner le début et la fin de la zone dans laquelle on recherche *) Begin tab[0] := 1; tab[1] := 4; tab[2] := 9; tab[3] := 10; tab[4] := 24; tab[5] := 24; tab[6] := 74; tab[7] := 75; tab[8] := 76; tab[9] := 90; tab[10] := 99; Writeln('Donner l''entier à trouver : '); Readln(q); (* on commence en recherchant dans tout le tableau *) deb := MIN; fin := MAX; repeat i := round((fin+deb)/2); (* on prend i entre deb et fin *) if tab[i] > q then fin := i (* on est tombé trop haut : on ramène la borne supérieure *) else if tab[i] < q then deb := i; (* on est tombé trop bas : on ramène la borne inférieure *) until tab[i]=q; Writeln('L''indice où se trouve ', q ,' est ', i); End. </syntaxhighlight> 6n7yoyuio4224gfpdk2a2t8l05qjb3w Programmation Octave/Octave Forge 0 20598 682204 150962 2022-07-22T18:56:58Z DavidL 1746 wikitext text/x-wiki <noinclude>{{Programmation Octave}}</noinclude> Si la version de base d' Octave ne contient pas toute les fonctions qu'il vous sont nécessaire, il existe [http://octave.sourceforge.net/ Octave Forge] qui vous permet de télécharger des fonctions supplémentaires en addition d'Octave. Les fonctions sont classées en différents ''packages'', il suffit de télécharger le package qu'il vous faut, par exemple Audio, ensuite vous lancez Octave dans le dossier qui contient le fichier ''tar.gz''. La commande Octave ''pkg'' permet de géré les différent packages. Par exemple la commande 'pkg install audio-1.0.2.tar.gz' installera le package Audio si il se trouve dans le dossier ou est lancé Octave. Voici une liste des principales option de la commande ''pkg'': * ''list'', liste les packages installés. * ''install', installe le package * ''uninstall'', désinstalle le package. * ''load'', charge le package, permet à Octave de l'utiliser. [[Catégorie:Programmation Octave (livre)]] 6r31acjqsn12du0mxzdmgcogx17wdy5 682205 682204 2022-07-22T18:57:06Z DavidL 1746 wikitext text/x-wiki <noinclude>{{Programmation Octave}}</noinclude> Si la version de base d' Octave ne contient pas toute les fonctions qu'il vous sont nécessaire, il existe [http://octave.sourceforge.net/ Octave Forge] qui vous permet de télécharger des fonctions supplémentaires en addition d'Octave. Les fonctions sont classées en différents ''packages'', il suffit de télécharger le package qu'il vous faut, par exemple Audio, ensuite vous lancez Octave dans le dossier qui contient le fichier ''tar.gz''. La commande Octave ''pkg'' permet de géré les différent packages. Par exemple la commande 'pkg install audio-1.0.2.tar.gz' installera le package Audio si il se trouve dans le dossier ou est lancé Octave. Voici une liste des principales option de la commande ''pkg'': * ''list'', liste les packages installés. * ''install', installe le package * ''uninstall'', désinstalle le package. * ''load'', charge le package, permet à Octave de l'utiliser. a25u4r4ypkux2m53s8b6qhc80oiky6g LispWorks CAPI/Créer une simple fenêtre/Affichage et saisie de texte/Zone d'édition 0 37774 682176 671314 2022-07-22T17:57:31Z DavidL 1746 wikitext text/x-wiki {{LispWorks CAPI}} Les zones d'édition peuvent être créé en utilisant l'élément '''''editor-pane'''''. Le logiciel Lispworks, qui est créé avec les éléments CAPI, utilise des '''''editor-pane'''''' pour son '''Listener''' et '''Editor'''. <pre> (setq editeur (make-instance 'editor-pane :text "Du texte qui est dans un editor-pane")) (contain editor) </pre> '''Note importante''': Lorsque vous donner un argument ''''':buffer-name''''' et/ou l'argument ''''':text''''' avec une longueur plus grande que zéro, l''''''editor-pane''''' vas créé un nouveau tampon. Si vous omettez de définir un des deux arguments, un tampon aléatoire sera choisi. <ref>Par expérience personnel, j'ai perdu mon code à deux reprise, car j'ai oublié de faire cette étape. Mon code était substitué avec le texte que j'avais écrit dans ma nouvelle application. Par chance j'avais une copie de sauvegarde de quelques heures plus tôt.</ref> Vous pouvez aussi faire clignoter le curseur à l'aide du mécanisme '''''editor-pane-blink-rate''''' Il est aussi possible de rendre un '''''editor-pane''' non-modifiable en définissant ''''':enabled :read-only''''' ou en le désactivant complètement à l'aide de ''''':enabled nil'''''. <ref>Il est possible de changer la couleur du texte pour revenir blanc en utilisant ''''':background :white'''''</ref> == Notes de l'auteur== <references /> [[Catégorie:LispWorks CAPI (livre)]] c0o695g07u7e5l3vpoziiec1uj8li6r 682177 682176 2022-07-22T17:58:06Z DavidL 1746 wikitext text/x-wiki {{LispWorks CAPI}} Les zones d'édition peuvent être créé en utilisant l'élément '''''editor-pane'''''. Le logiciel Lispworks, qui est créé avec les éléments CAPI, utilise des '''''editor-pane'''''' pour son '''Listener''' et '''Editor'''. <pre> (setq editeur (make-instance 'editor-pane :text "Du texte qui est dans un editor-pane")) (contain editor) </pre> '''Note importante''': Lorsque vous donner un argument ''''':buffer-name''''' et/ou l'argument ''''':text''''' avec une longueur plus grande que zéro, l''''''editor-pane''''' vas créé un nouveau tampon. Si vous omettez de définir un des deux arguments, un tampon aléatoire sera choisi. <ref>Par expérience personnelle, j'ai perdu mon code à deux reprises, car j'ai oublié de faire cette étape. Mon code était substitué avec le texte que j'avais écrit dans ma nouvelle application. Par chance j'avais une copie de sauvegarde de quelques heures plus tôt.</ref> Vous pouvez aussi faire clignoter le curseur à l'aide du mécanisme '''''editor-pane-blink-rate''''' Il est aussi possible de rendre un '''''editor-pane''' non-modifiable en définissant ''''':enabled :read-only''''' ou en le désactivant complètement à l'aide de ''''':enabled nil'''''. <ref>Il est possible de changer la couleur du texte pour revenir blanc en utilisant ''''':background :white'''''</ref> == Notes de l'auteur== <references /> [[Catégorie:LispWorks CAPI (livre)]] evdnuvq96tbvnlccqw5rp0ge9hgaj2b Le système d'exploitation GNU-Linux/Les annuaires LDAP 0 41951 682169 635153 2022-07-22T17:46:17Z DavidL 1746 wikitext text/x-wiki <noinclude>{{Linux}}</noinclude> == Configuration == Pour Debian Squeeze le fichier slapd.conf se situe dans '''/usr/share/doc/slapd/examples/slapd.conf'''. Il faut donc changer son emplacement avec '''cp /usr/share/doc/slapd/examples/slapd.conf /etc/ldap/'''. Puis modifier le fichier '''/etc/default/slapd''' et changer la ligne 'SLAPD_CONF=/etc/ldap/slapd.conf'. La configuration de OpenLDAP se situe dans le fichier '''/etc/ldap/slapd.conf''' : <syntaxhighlight lang="apache"> # more /etc/ldap/slapd.conf # Les schémas à inclure à l'annuaire include /etc/ldap/schema/core.schema include /etc/ldap/schema/cosine.schema include /etc/ldap/schema/nis.schema include /etc/ldap/schema/inetorgperson.schema # le fichier contenant le PID du processus pidfile /var/run/slapd/slapd.pid # Le fichier contenant les arguments argsfile /var/run/slapd/slapd.args # La facilité utilisée avec syslog loglevel none # Emplacement des modules modulepath /usr/lib/ldap # Chargement de modules permettant d'étendre les fonctionnalités de OpenLDAP moduleload back_hdb # Limites concernant les recherches sizelimit 500 tool-threads 1 ################################## # Définition du premier annuaire # ################################## # On utilise un stockage basé sur le format de fichier '''HDB''' backend hdb database hdb # On définit la ''racine'' de l'arbre (on parle de ''suffixe'' ou de ''basedn'') suffix "dc=domaine,dc=fr" # Répertoire stockant les données de l'annuaire, dans notre cas, des fichiers au format '''HDB''' directory "/var/lib/ldap" # L'administrateur de l'annuaire rootdn "cn=admin,dc=domaine,dc=fr" rootpw motdepasse # en clair ou généré via la commande '''slappasswd''' # Des paramêtres d'optimisation du format HDB dbconfig set_cachesize 0 2097152 0 dbconfig set_lk_max_objects 1500 dbconfig set_lk_max_locks 1500 dbconfig set_lk_max_lockers 1500 # Les attributs à indexer en vue d'améliorer drastiquement les recherches index objectClass eq # à commenter ... lastmod on checkpoint 512 30 # contrôle d'accès aux attributs sensibles access to attrs=userPassword,shadowLastChange by dn="cn=admin,dc=domaine,dc=fr" write by anonymous auth by self write by * none # Annuaire avec accès anonyme en lecture seule access to dn.base="" by * read access to * by dn="cn=admin,dc=domaine,dc=fr" write by * read </syntaxhighlight> Après chaque modification de ce fichier, on relance OpenLDAP avec la commande suivante : # /etc/init.d/slapd restart === Création de l'annuaire === On crée le fichier LDIF qui va initialiser le ''sommet'' de l'arbre : # cat cree_arbre.ldif dn: dc=domaine,dc=fr objectClass: top objectClass: dcObject objectClass: organization dc: domaine o: domaine On injecte le fichier LDIF dans l'annuaire via la commande '''ldapadd''' : # ldapadd -x -h localhost -W -D "cn=admin,dc=domaine,dc=fr" -f cree_arbre.ldif Enter LDAP Password: '''adding new entry "dc=domaine,dc=fr"''' Pour créer les autres entrées, on peut désormais utiliser '''PhpLdapAdmin'''. === Les commandes d'administration OpenLDAP === {{TODO|Parler des commandes : slapacl, slapcat, slapindex, slapadd, slappasswd, slapauth, slapdn te slaptest}} == Les programmes complémentaires == === Les outils en ligne de commande === NB : les commandes suivantes sont fournies par le paquet Debian '''ldap-utils'''. Elles disposent des options génériques suivantes : * '''-h <adresse IP ou nom>''' : permet d'indiquer le serveur hébergeant l'annuaire LDAP * '''-x''' : on utilise l'authentification simple et non l'authentification TLS/SSL. * '''-b <basedn>''' : permet d'indiquer l'annuaire à consulter (le basedn ou suffix) * '''-D <dn d'un objet>''' : permet de s'authentifier avec le DN indiqué * '''-W''' : demande la saisie du mot de passe du DN précédemment indiqué * '''-f <fichier LDIF>''' : permet d'indiquer un fichier LDIF ==== ldapadd ==== La commande '''ldapadd''' permet d'ajouter des entrées dans l'annuaire LDAP. Prenons par exemple le fichier LDIF suivant qui crée le suffixe (le basedn) de notre annuaire : # cat cree_arbre.ldif dn: dc=domaine,dc=fr objectClass: top objectClass: dcObject objectClass: organization dc: domaine o: domaine Pour injecter ce fichier LDIF dans notre annuaire : # ldapadd -x -h localhost -D "cn=admin,dc=domaine,dc=fr" -f cree_arbre.ldif -W Si tout se passe bien, vous devez voir des lignes : '''adding new entry "dc=domaine,dc=fr"''' ==== ldapsearch ==== La commande '''ldapsearch''' permet d'interroger l'annuaire LDAP. Affiche toutes les entrées de l'annuaire : # ldapsearch -x -h localhost -b "dc=domaine,dc=fr" Affiche les attributs de l'utilisateur ''bob'' via l'utilisation d'un filtre : # ldapsearch -LLL -x -h localhost -b "dc=domaine,dc=fr" "(cn=bob)" Affiche uniquement les attributs '''uid''' et '''homeDirectory''' de l'utilisateur ''bob'' : # ldapsearch -LLL -x -h localhost -b "dc=domaine,dc=fr" "(cn=bob)" uid homeDirectory ==== ldapdelete ==== La commande '''ldapdelete''' permet de supprimer une entrée de l'annuaire LDAP. On indique à cette commande le(s) dn(s) à supprimer. Supprime l'utilisateur bob : # ldapdelete -x -h localhost -D "cn=admin,dc=domaine,dc=fr" -W "cn=bob,ou=People,dc=domaine,dc=fr" ==== ldapmodify ==== La commande '''ldapmodify''' permet de modifier une entrée de l'annuaire LDAP. {{TODO|rajouter un exemple de la commande ldapmodify}} ==== ldapmodrdn ==== La commande '''ldapmodrdn''' permet de renommer une entrée de l'annuaire LDAP. Cette opération revient à changer le '''dn''' (distinguished name) d'une entrée. {{TODO|rajouter un exemple de la commande ldapmodrdn}} ==== ldapcompare ==== La commande '''ldapcompare''' permet de comparer des entrées de l'annuaire LDAP. {{TODO|rajouter un exemple de la commande ldapcompare}} ==== ldappasswd ==== La commande '''ldappasswd''' permet de changer le mot de passe d'une entrée de l'annuaire LDAP. {{TODO|rajouter un exemple de la commande ldappasswd}} ==== ldapwhoami ==== La commande '''ldapwhoami''' permet de connaître avec quelle identité on est connecté à l'annuaire LDAP, c'est l'équivalent de la commande Unix ''whoami''. {{TODO|rajouter un exemple de la commande ldapwhoami}} '''slapadd''' est utilisé pour ajouter des entrées spécifiées dans le format LDAP Directory Interchange Format (LDIF) dans une base de données slapd. '''slapcat''' est utilisé pour générer une sortie LDIF LDAP basé sur le contenu d'une base de données slapd. '''slapd''' est un serveur LDAP autonome. '''slapindex''' est utilisé pour regénérer les index de slapd suivant le contenu actuel d'une base de données. '''slurpd''' est un serveur réplicat autoname pour LDAP. === PhpLdapAdmin === '''PhpLdapAdmin''' est un logiciel qui permet d'administrer un annuaire LDAP via une interface Web. Installation : # apt-get install phpldapadmin Configuration : PhpLdapAdmin s'est configuré avec l'annuaire définit par défaut dans OpenLDAP. Si on a changé ce dernier, il faut modifier les deux lignes suivantes dans la configuration de PhpLdapAdmin : # vi /etc/phpldapadmin/config.php ... $ldapservers->SetValue($i,'server','base',array('dc=domaine,dc=fr')); $ldapservers->SetValue($i,'login','dn','cn=admin,dc=domaine,dc=fr'); ... À chaque modification de ce fichier, il est préférable de redémarrer apache : # /etc/init.d/apache2 restart Accès à PhpLdapAdmin : http://localhost/phpldapadmin/ == La réplication LDAP == === Configuration du provider LDAP === On modifie le fichier /etc/ldap/slapd.conf du provider LDAP pour indiquer l'annuaire à répliquer, on rajoute les lignes en '''gras''' dans la configuration de l'annuaire et on modifie les attributs à indexer : # vi /etc/ldap/slapd.conf ... # On indique à OpenLDAP de charger le module # permettant la réplication '''moduleload syncprov.la''' ... database bdb suffix dc=domaine,dc=fr rootdn dc=domaine,dc=fr directory /var/ldap/db index objectclass''',entryCSN,entryUUID''' eq '''overlay syncprov''' '''syncprov-checkpoint 100 10''' '''syncprov-sessionlog 100''' === Configuration du consumer LDAP === On modifie '''/etc/ldap/slapd.conf''' du second OpenLDAP (le '''consumer''') pour lui indiquer l'annuaire à répliquer et l'adresse du premier OpenLDAP (le '''provider'''). # vi /etc/ldap/slapd.conf ... database hdb suffix dc=domaine,dc=fr rootdn dc=domaine,dc=fr directory /var/lib/ldap2 index objectclass,entryCSN,entryUUID eq syncrepl rid=123 provider=ldap://'''<adresse IP ou nom du provider LDAP>''':389 type=refreshOnly interval=00:00:00:10 searchbase="dc=domaine,dc=fr" filter="(objectClass=*)" scope=sub attrs="*" schemachecking=off bindmethod=simple binddn="cn=admin,dc=domaine,dc=fr" credentials=admin Il faut ensuite créer le répertoire du nouvel annuaire et le donner à l'utilisateur et au groupe ''openldap'' : # mkdir /var/lib/ldap2 # chown openldap.openldap /var/lib/ldap2 Il ne reste plus qu'à relancer OpenLDAP : # /etc/init.d/slapd restart === Validation de la réplication === L'objectif est de constater la réplication des objets de l'annuaire. ==== Procédure n°1 : validation de l'ajout de données sur le réplicat ==== ===== Coté Provider ===== * on crée un fichier LDIF contenant l'utilisateur à rajouter # cat bob.ldif dn: cn=bob,ou=People,dc=domaine,dc=fr objectClass: inetOrgPerson objectClass: posixAccount objectClass: top givenName: Eponge sn: Eponge cn: bob uid: bob userPassword: {MD5}F7WfMlfPOGcecKZLEkmjTA== uidNumber: 1001 gidNumber: 1001 homeDirectory: /home/bob loginShell: /bin/sh mail: bob@domaine.fr * on injecte ce fichier LDIF dans notre annuaire # ldapadd -x -h localhost -D "cn=admin,dc=domaine,dc=fr" -f bob.ldif -W * on vérifie que l'utilisateur a bien été créé # ldapsearch -LLL -x -h localhost -b "dc=domaine,dc=fr" "(cn=bob)" ===== Coté Consumer ===== * on attend quelques secondes et on constate que l'utilisateur a bien été créé sur le réplicat # ldapsearch -LLL -x -h localhost -b "dc=domaine,dc=fr" "(cn=bob)" ==== Procédure n°2 : validation de la suppression de données sur le réplicat ==== ===== Coté Provider ===== * on supprime l'utilisateur de notre annuaire # ldapdelete -x -h localhost -D "cn=admin,dc=domaine,dc=fr" -W "cn=bob,ou=People,dc=domaine,dc=fr" * on vérifie que l'utilisateur a bien été supprimé # ldapsearch -LLL -x -h localhost -b "dc=domaine,dc=fr" "(cn=bob)" ===== Coté Consumer ===== * on attend quelques secondes et on constate que l'utilisateur a bien été supprimé sur le réplicat # ldapsearch -LLL -x -h localhost -b "dc=domaine,dc=fr" "(cn=bob)" e70m5yil3uikl0l12zpmh3xejl903cy 682170 682169 2022-07-22T17:46:46Z DavidL 1746 /* Configuration */ wikitext text/x-wiki <noinclude>{{Linux}}</noinclude> == Configuration == Pour Debian Squeeze le fichier slapd.conf se situe dans '''/usr/share/doc/slapd/examples/slapd.conf'''. Il faut donc changer son emplacement avec '''cp /usr/share/doc/slapd/examples/slapd.conf /etc/ldap/'''. Puis modifier le fichier '''/etc/default/slapd''' et changer la ligne 'SLAPD_CONF=/etc/ldap/slapd.conf'. La configuration de OpenLDAP se situe dans le fichier '''/etc/ldap/slapd.conf''' : <syntaxhighlight lang="apache"> # more /etc/ldap/slapd.conf # Les schémas à inclure à l'annuaire include /etc/ldap/schema/core.schema include /etc/ldap/schema/cosine.schema include /etc/ldap/schema/nis.schema include /etc/ldap/schema/inetorgperson.schema # le fichier contenant le PID du processus pidfile /var/run/slapd/slapd.pid # Le fichier contenant les arguments argsfile /var/run/slapd/slapd.args # La facilité utilisée avec syslog loglevel none # Emplacement des modules modulepath /usr/lib/ldap # Chargement de modules permettant d'étendre les fonctionnalités de OpenLDAP moduleload back_hdb # Limites concernant les recherches sizelimit 500 tool-threads 1 ################################## # Définition du premier annuaire # ################################## # On utilise un stockage basé sur le format de fichier '''HDB''' backend hdb database hdb # On définit la ''racine'' de l'arbre (on parle de ''suffixe'' ou de ''basedn'') suffix "dc=domaine,dc=fr" # Répertoire stockant les données de l'annuaire, dans notre cas, des fichiers au format '''HDB''' directory "/var/lib/ldap" # L'administrateur de l'annuaire rootdn "cn=admin,dc=domaine,dc=fr" rootpw motdepasse # en clair ou généré via la commande '''slappasswd''' # Des paramètres d'optimisation du format HDB dbconfig set_cachesize 0 2097152 0 dbconfig set_lk_max_objects 1500 dbconfig set_lk_max_locks 1500 dbconfig set_lk_max_lockers 1500 # Les attributs à indexer en vue d'améliorer drastiquement les recherches index objectClass eq # à commenter ... lastmod on checkpoint 512 30 # contrôle d'accès aux attributs sensibles access to attrs=userPassword,shadowLastChange by dn="cn=admin,dc=domaine,dc=fr" write by anonymous auth by self write by * none # Annuaire avec accès anonyme en lecture seule access to dn.base="" by * read access to * by dn="cn=admin,dc=domaine,dc=fr" write by * read </syntaxhighlight> Après chaque modification de ce fichier, on relance OpenLDAP avec la commande suivante : # /etc/init.d/slapd restart === Création de l'annuaire === On crée le fichier LDIF qui va initialiser le ''sommet'' de l'arbre : # cat cree_arbre.ldif dn: dc=domaine,dc=fr objectClass: top objectClass: dcObject objectClass: organization dc: domaine o: domaine On injecte le fichier LDIF dans l'annuaire via la commande '''ldapadd''' : # ldapadd -x -h localhost -W -D "cn=admin,dc=domaine,dc=fr" -f cree_arbre.ldif Enter LDAP Password: '''adding new entry "dc=domaine,dc=fr"''' Pour créer les autres entrées, on peut désormais utiliser '''PhpLdapAdmin'''. === Les commandes d'administration OpenLDAP === {{TODO|Parler des commandes : slapacl, slapcat, slapindex, slapadd, slappasswd, slapauth, slapdn te slaptest}} == Les programmes complémentaires == === Les outils en ligne de commande === NB : les commandes suivantes sont fournies par le paquet Debian '''ldap-utils'''. Elles disposent des options génériques suivantes : * '''-h <adresse IP ou nom>''' : permet d'indiquer le serveur hébergeant l'annuaire LDAP * '''-x''' : on utilise l'authentification simple et non l'authentification TLS/SSL. * '''-b <basedn>''' : permet d'indiquer l'annuaire à consulter (le basedn ou suffix) * '''-D <dn d'un objet>''' : permet de s'authentifier avec le DN indiqué * '''-W''' : demande la saisie du mot de passe du DN précédemment indiqué * '''-f <fichier LDIF>''' : permet d'indiquer un fichier LDIF ==== ldapadd ==== La commande '''ldapadd''' permet d'ajouter des entrées dans l'annuaire LDAP. Prenons par exemple le fichier LDIF suivant qui crée le suffixe (le basedn) de notre annuaire : # cat cree_arbre.ldif dn: dc=domaine,dc=fr objectClass: top objectClass: dcObject objectClass: organization dc: domaine o: domaine Pour injecter ce fichier LDIF dans notre annuaire : # ldapadd -x -h localhost -D "cn=admin,dc=domaine,dc=fr" -f cree_arbre.ldif -W Si tout se passe bien, vous devez voir des lignes : '''adding new entry "dc=domaine,dc=fr"''' ==== ldapsearch ==== La commande '''ldapsearch''' permet d'interroger l'annuaire LDAP. Affiche toutes les entrées de l'annuaire : # ldapsearch -x -h localhost -b "dc=domaine,dc=fr" Affiche les attributs de l'utilisateur ''bob'' via l'utilisation d'un filtre : # ldapsearch -LLL -x -h localhost -b "dc=domaine,dc=fr" "(cn=bob)" Affiche uniquement les attributs '''uid''' et '''homeDirectory''' de l'utilisateur ''bob'' : # ldapsearch -LLL -x -h localhost -b "dc=domaine,dc=fr" "(cn=bob)" uid homeDirectory ==== ldapdelete ==== La commande '''ldapdelete''' permet de supprimer une entrée de l'annuaire LDAP. On indique à cette commande le(s) dn(s) à supprimer. Supprime l'utilisateur bob : # ldapdelete -x -h localhost -D "cn=admin,dc=domaine,dc=fr" -W "cn=bob,ou=People,dc=domaine,dc=fr" ==== ldapmodify ==== La commande '''ldapmodify''' permet de modifier une entrée de l'annuaire LDAP. {{TODO|rajouter un exemple de la commande ldapmodify}} ==== ldapmodrdn ==== La commande '''ldapmodrdn''' permet de renommer une entrée de l'annuaire LDAP. Cette opération revient à changer le '''dn''' (distinguished name) d'une entrée. {{TODO|rajouter un exemple de la commande ldapmodrdn}} ==== ldapcompare ==== La commande '''ldapcompare''' permet de comparer des entrées de l'annuaire LDAP. {{TODO|rajouter un exemple de la commande ldapcompare}} ==== ldappasswd ==== La commande '''ldappasswd''' permet de changer le mot de passe d'une entrée de l'annuaire LDAP. {{TODO|rajouter un exemple de la commande ldappasswd}} ==== ldapwhoami ==== La commande '''ldapwhoami''' permet de connaître avec quelle identité on est connecté à l'annuaire LDAP, c'est l'équivalent de la commande Unix ''whoami''. {{TODO|rajouter un exemple de la commande ldapwhoami}} '''slapadd''' est utilisé pour ajouter des entrées spécifiées dans le format LDAP Directory Interchange Format (LDIF) dans une base de données slapd. '''slapcat''' est utilisé pour générer une sortie LDIF LDAP basé sur le contenu d'une base de données slapd. '''slapd''' est un serveur LDAP autonome. '''slapindex''' est utilisé pour regénérer les index de slapd suivant le contenu actuel d'une base de données. '''slurpd''' est un serveur réplicat autoname pour LDAP. === PhpLdapAdmin === '''PhpLdapAdmin''' est un logiciel qui permet d'administrer un annuaire LDAP via une interface Web. Installation : # apt-get install phpldapadmin Configuration : PhpLdapAdmin s'est configuré avec l'annuaire définit par défaut dans OpenLDAP. Si on a changé ce dernier, il faut modifier les deux lignes suivantes dans la configuration de PhpLdapAdmin : # vi /etc/phpldapadmin/config.php ... $ldapservers->SetValue($i,'server','base',array('dc=domaine,dc=fr')); $ldapservers->SetValue($i,'login','dn','cn=admin,dc=domaine,dc=fr'); ... À chaque modification de ce fichier, il est préférable de redémarrer apache : # /etc/init.d/apache2 restart Accès à PhpLdapAdmin : http://localhost/phpldapadmin/ == La réplication LDAP == === Configuration du provider LDAP === On modifie le fichier /etc/ldap/slapd.conf du provider LDAP pour indiquer l'annuaire à répliquer, on rajoute les lignes en '''gras''' dans la configuration de l'annuaire et on modifie les attributs à indexer : # vi /etc/ldap/slapd.conf ... # On indique à OpenLDAP de charger le module # permettant la réplication '''moduleload syncprov.la''' ... database bdb suffix dc=domaine,dc=fr rootdn dc=domaine,dc=fr directory /var/ldap/db index objectclass''',entryCSN,entryUUID''' eq '''overlay syncprov''' '''syncprov-checkpoint 100 10''' '''syncprov-sessionlog 100''' === Configuration du consumer LDAP === On modifie '''/etc/ldap/slapd.conf''' du second OpenLDAP (le '''consumer''') pour lui indiquer l'annuaire à répliquer et l'adresse du premier OpenLDAP (le '''provider'''). # vi /etc/ldap/slapd.conf ... database hdb suffix dc=domaine,dc=fr rootdn dc=domaine,dc=fr directory /var/lib/ldap2 index objectclass,entryCSN,entryUUID eq syncrepl rid=123 provider=ldap://'''<adresse IP ou nom du provider LDAP>''':389 type=refreshOnly interval=00:00:00:10 searchbase="dc=domaine,dc=fr" filter="(objectClass=*)" scope=sub attrs="*" schemachecking=off bindmethod=simple binddn="cn=admin,dc=domaine,dc=fr" credentials=admin Il faut ensuite créer le répertoire du nouvel annuaire et le donner à l'utilisateur et au groupe ''openldap'' : # mkdir /var/lib/ldap2 # chown openldap.openldap /var/lib/ldap2 Il ne reste plus qu'à relancer OpenLDAP : # /etc/init.d/slapd restart === Validation de la réplication === L'objectif est de constater la réplication des objets de l'annuaire. ==== Procédure n°1 : validation de l'ajout de données sur le réplicat ==== ===== Coté Provider ===== * on crée un fichier LDIF contenant l'utilisateur à rajouter # cat bob.ldif dn: cn=bob,ou=People,dc=domaine,dc=fr objectClass: inetOrgPerson objectClass: posixAccount objectClass: top givenName: Eponge sn: Eponge cn: bob uid: bob userPassword: {MD5}F7WfMlfPOGcecKZLEkmjTA== uidNumber: 1001 gidNumber: 1001 homeDirectory: /home/bob loginShell: /bin/sh mail: bob@domaine.fr * on injecte ce fichier LDIF dans notre annuaire # ldapadd -x -h localhost -D "cn=admin,dc=domaine,dc=fr" -f bob.ldif -W * on vérifie que l'utilisateur a bien été créé # ldapsearch -LLL -x -h localhost -b "dc=domaine,dc=fr" "(cn=bob)" ===== Coté Consumer ===== * on attend quelques secondes et on constate que l'utilisateur a bien été créé sur le réplicat # ldapsearch -LLL -x -h localhost -b "dc=domaine,dc=fr" "(cn=bob)" ==== Procédure n°2 : validation de la suppression de données sur le réplicat ==== ===== Coté Provider ===== * on supprime l'utilisateur de notre annuaire # ldapdelete -x -h localhost -D "cn=admin,dc=domaine,dc=fr" -W "cn=bob,ou=People,dc=domaine,dc=fr" * on vérifie que l'utilisateur a bien été supprimé # ldapsearch -LLL -x -h localhost -b "dc=domaine,dc=fr" "(cn=bob)" ===== Coté Consumer ===== * on attend quelques secondes et on constate que l'utilisateur a bien été supprimé sur le réplicat # ldapsearch -LLL -x -h localhost -b "dc=domaine,dc=fr" "(cn=bob)" tgz48wla2gtenvyxacz75kd28wb0iey L'économie de la téléphonie 0 54840 682212 663154 2022-07-22T19:22:42Z DavidL 1746 wikitext text/x-wiki {{Page de garde|image=Répartiteur cuivre - Blocs de réglettes et jarretières (1104739212).jpg|description= ''Un livre-guide appartenant à la série ''Économie'' tout comme à l'[[Accueil/Économie|étagère Économie]] de [[Accueil|Wikilivres]]''. Il s'adresse aux personnes désirant comprendre ce qui se cache derrière les offres des géants des Télécoms, et les subventions publiques, en leur offrant une compréhension de cette économie singulière nécessitant une réglementation et une autorité administrative spécifiques. |avancement=Ébauche |cdu= * {{CDU item|3|33}} * {{CDU item|6/65/654|654.1}} }} {{ébauche}} ==Introduction== L'objectif de ce livre est de fournir une compréhension de l'économie de la téléphonie. Ce livre est nécessaire dans une France, où l'actualité récente de 2012 a montré la perplexité face à la méconnaissance du fonctionnement de cette économie qui brassait environ trente milliards d'euros par an environ, pour la France seulement, entre 2005 et 2010 <ref>http://www.journaldunet.com/cc/21_telecoms/fixe_marche_fr.shtml</ref>. Les télécommunications intéressent non seulement les ingénieurs mais aussi les hauts fonctionnaires, les économistes, les juristes, les banquiers, les usagers et les journalistes<ref> http://www.itu.int/ITU-D/ict/material/handbook.pdf&sa=U&ei=XBAMUd6HG7GZ0QXPuIDQCg&ved=0CEQQFjAK&usg=AFQjCNHTcIyyE40BlEf6RiKS74_2mvRAYg </ref>. {{...}} == Révisions récentes == En raison de la nature interactive du site wikibooks, le livre peut être sujet à mise à jour. Les plus récentes de ces modifications peuvent être suivies par la page suivante qui donne les modifications récentes ayant eu lieu sur les deux derniers mois environ. [{{fullurl:Spécial:Suivi des liens|namespace=&target=L'économie%20de%20la%20téléphonie&tagfilter=&days=60&from=&limit=1000}} Révisions récentes] ==Sommaire== {{/Sommaire}} ==Références == <references /> ik9mnq70nadxe9k9li5wj0xxh0gj5qf L'économie de la téléphonie/Histoire du téléphone en France 0 54842 682230 651474 2022-07-23T09:04:26Z DavidL 1746 wikitext text/x-wiki {{L'économie de la téléphonie}} {{ébauche|left=1}} == Avant 1900 == * 1854 : [[w:Charles Bourseul|Charles Bourseul]], agent du [[w:Télégraphe|télégraphe]] pose le principe du téléphone. Un article de [[w:L'illustration|''l'Illustration'']] présente ses explications le [[w:26 août|26 août]] [[w:1854|1854]]. * 1879 : [[w:Paris|Paris]] profite de la tenue de l’[[w:Exposition universelle de 1878|Exposition universelle de 1878]] pour se doter du plus important réseau urbain. Le téléphone est exploité commercialement en France dès [[w:1879|1979]]. Le [[w:26 juin|26 juin]], le [[w:Postes, télégraphes et téléphones (France)|Ministère des Postes et Télégraphes]], créé en 1878, accorde trois concessions pour l’exploitation commerciale du téléphone. Premiers abonnés au téléphone en France. Les trois concessionnaires fusionnent en 1879 pour constituer la [[w:Société_industrielle_des_téléphones|Société Générale des Téléphones]]{{refnec}}<!--Pas clair du point de vue des dates ! -->. * mars 1880 : le téléphone fait ses premiers essais en France et dès 1881 les abonnés sont reliés au réseau. À noter que jusqu'en 1889 c’'est la ''Société Générale des Téléphones'', société privée, qui assurera la majorité du trafic. L’État n’ouvrira son réseau téléphonique, à [[w:|Reims|Reims]] dans la Marne, que le 1{{er}} avril 1883. * 1884 : Premières lignes inter-urbaines installées en France. * 1886 : Inauguration de la ligne téléphonique entre [[w:Paris|Paris]] et [[w:Bruxelles|Bruxelles]]. * 16 juillet 1889 loi nationalisant le téléphone en France et le réunissant aux Postes et Télégraphes. * 1890 : 10 000 abonnés au téléphone en France. * 1891 : Pose du premier câble téléphonique sous la Manche ([[w:Paris|Paris]]-[[w:Londres|Londres]]) * 1894 : Premières utilisations du téléphone par l’armée française au cours de grandes manœuvres. * 1897 : en raison du développement du téléphone, la direction des services téléphoniques de Paris a demandé aux usagers d’annoncer désormais à l’opératrice le numéro et non plus le nom du correspondant, ce qui souleva nombre de protestations contre ce procédé jugé assez cavalier{{refnec}}. == Entre 1900 et 1950 == * 1902 : un bateau scandinave, en route pour les [[w:États-Unis|États-Unis d'Amérique]], est pris dans une très forte tempête dans la [[w:Manche (mer)|Manche]]. Les très graves avaries subies contraignent le capitaine à faire escale à [[w:|Brest]]. Le bateau mis en [[w:|cale sèche]], et il nécessite entre quatre et six mois de réparations. Un ingénieur présent à bord prend alors une décision qui sera lourde de conséquences : il décide de décharger la cargaison et de tenter de la vendre sur place. C’est de cette manière que les quatre premiers [[w:|PABX|autocommutateurs]] (Ericsson) entrent sur le sol français. Ayant vendu ces « centraux téléphoniques » en un temps record, l’ingénieur en question commande alors d’autres exemplaires à sa maison-mère et crée une structure locale pour leur commercialisation et leur entretien. * 1904 : {{w|Édouard Estaunié}} créé le mot « télécommunication ». * 1908 : Seulement 182 000 abonnés au téléphone en France contre 838 000 en {{w|Allemagne}} et 574 000 en {{w|Grande-Bretagne}}. Le téléphone est encore perçu en France comme un gadget pour personne fortunée. * 1er octobre {{w|1912}} : remplacement du numéro du central par son nom ''(circulaire n°53 datée du 27 septembre 1912)''. Ainsi, à l’abonné 25 desservi par le 12{{e}} standard du central téléphonique Gutenberg, on a attribué le numéro Gutenberg 1225 au lieu du 11225. *Ainsi, les numéros de téléphone à Paris prennent la forme d’un indicatif de 3 premières lettres du nom du central téléphonique (exemple : « MON » pour [[w:|Montmartre]]) suivi d'un nombre correspondant tout simplement à l'ordre de la demande (la 100{{e}} personne qui demande à Montmartre sera MON-100). L'automatisation obligeant à une correspondance lettre/chiffre, apparaissent alors les 26 lettres de l'alphabet distribuées sur les touches chiffrées, « MON » devient 606). Cette correspondance existe toujours aujourd'hui (avec quelques variantes<ref>Les lettres O et Q étaient associées au chiffre 0 et la lettre Z souvent absente.</ref>).[[Image:Uniden EXAI3985 DTMF buttons.jpg|thumb|Exemple de correspondance lettre/chiffre sur un téléphone moderne.]] * 19 octobre 1913 à 7 heures : mise en service du premier central téléphonique automatique français à Nice en système STROWGER ''(Centre Téléphonique de Nice-Biscarra)''. Il s'agit de la date réelle du début du téléphone automatique en France. * Depuis 1901 et jusqu'à 1914, deux sortes d'abonnement existent: le forfait à conversations illimités, à 400 francs à Paris et 300 francs à Lyon, et les abonnements à conversation taxées et téléphones fournis par l'administration. À partir de 1913-1914, cette deuxième offre remplacera la première<ref>{{ouvrage |passage=page 9 |titre=Association des abonnés au téléphone. Bulletin mensuel |auteur=Association des abonnés au téléphone |éditeur=[s.n.?] (Paris) |année=1904-1911 |Source=Bibliothèque nationale de France, département Sciences et techniques, 4-V-6231 |présentation en ligne=http://catalogue.bnf.fr/ark:/12148/cb327046861 |lire en ligne=http://gallica.bnf.fr/ark:/12148/bpt6k5769877f/f20 }}</ref>. * 22 septembre 1928 à 22 heures : mise en service du premier central téléphonique automatique à Paris ''(au centre téléphonique Paris-Carnot)'' en système ROTARY 7A1. En cette occasion, l'on installe chez les abonnés reliés au téléphone automatique un poste à cadran avec dix trous ronds permettant de composer des numéros alpha-numériques qui commencent tous par les trois premières lettres du central. Ainsi « INV » pour le central « Invalides ». * 14 février 1933 : mise en service de l’horloge parlante automatique (ODEon 84.00), installée à l’{{w|Observatoire de Paris}}, par son directeur Ernest Esclangon. Cette horloge synchronisée sur l'Observatoire délivre ainsi l'heure officielle de la République Française. Elle dispose de 20 lignes groupées ; malgré ce nombre, important pour l’époque, seuls 20 000 appels sont traités sur les 40 000 présentés le premier jour. La voix qui donne l’heure est celle de Marcel Laporte, dit Radiolo, le plus célèbre speaker de {{w|Radio-Paris}}. == Entre 1950 et 2000 == * [[w:1953|'''1953''']] : les trois premières lettres du central téléphonique sont remplacées par les chiffres correspondants. * 1{{er}} octobre 1963 : on remplace à Paris les trois premières lettres du central téléphonique par les chiffres correspondant. Ainsi le numéro de l'horloge parlante ODE(on) 84.00 devient 033.84.00 (O et Q = zéro) *15 décembre 1979 : Le téléphone devient entièrement automatique en France ''(Guyane).'' * 25 octobre 1985 à 23 heures : Louis Mexandeau, Ministre des PTT, lance au central téléphonique « Murat » à Paris la '''numérotation téléphonique française à huit chiffres''' ''(contre six chiffres auparavant en province, et sept chiffres en Île-de-France et quelques grosses agglomérations telles que Lyon et Nancy-Metz).'' * 2 juillet 1990 : loi supprimant le ministère des PTT et créant, à compter du 1{{er}} janvier 1991, deux exploitants publics : La Poste et France-Télécom. * 18 octobre 1996 à 23h00 : François Fillon, Ministre délégué chargé de La Poste et des Télécommunications, lance au central téléphonique « Murat » à Paris la '''numérotation téléphonique française actuelle à dix chiffres'''. Ce numéro à 10 chiffres permettant d’accueillir mathématiquement cinq fois plus d’abonnés, car les deux premiers chiffres découpent la France métropolitaine en cinq zones, de 01 à 05. Le 19 est remplacé par le 00 pour joindre l'international. Pour laisser un temps d’adaptation, il fut possible pendant quelque temps de continuer à composer des numéros à 8 chiffres. [[Image:Indicatifs téléphonique France métropolitaine.png|thumb|Indicatifs téléphonique de la France métropolitaine.]] * 1{{er}} octobre 1998 : fin du monopole de France-Télécom, avec l'ouverture au public du « 7 » de Cegetel, en concurrence avec le « 8 » de France-Télécom. Le 0 est utilisé pour obtenir l'opérateur par défaut ; il devient possible quelques années plus tard d’utiliser Cegetel ou d'autres comme opérateur par défaut (la pré-sélection). On passe alors par Cegetel en composant le 0.<br/>En 1998, la minute de communication locale coûte 23 centimes de francs hors taxes<ref>http://www.senat.fr/questions/base/1997/qSEQ971204638.html</ref>. *Par la suite, d’autres indicatifs ont fait leur apparition, 06 pour les téléphones portables ; 07 est réservé ; 08 pour les services à tarification spéciale et 09 pour la téléphonie non géographique, via IP (ADSL et câble). ==Depuis 2000== *[[w:2006|'''2006''']] : Le 3 avril, le service des renseignements, le « 12 », est ouvert à la concurrence, des numéros au format [[w:Renseignements téléphoniques|118XXX]] apparaissent à grand renfort de publicité. Cette privatisation entraîne une hausse massive des tarifs et une opacification du coût du service nuisible au consommateur<ref>http://www.latribune.fr/opinions/20090518trib000377449/reviens-le-12-.html</ref>. * 3 mai 2010 : Devant la pénurie de numéros de portables commençant par 06, les opérateurs Orange et Bouygues Telecom débutent l'attribution de numéros commençant par 07. * En 2011, dans un concurrentiel de plus en plus concurrentiels, des opérateurs de téléphonie mobile comme Orange décident de procéder a des aménagements comme l'externalisation des points hauts <ref> « Le programme Chrysalid ne s'inscrit pas dans la lignée des plans d'économie passés » Les Echos n° 21060 du 17 Novembre 2011 • page 23 http://www.lesechos.fr/17/11/2011/LesEchos/21060-120-ECH_--le-programme-chrysalid-ne-s-inscrit-pas-dans-la-lignee-des-plans-d-economie-passes--.htm </ref>. == Notes et références == {{Références}} === Liens externes === * [http://www.l2l1.com/hist.htm Histoire illustrée du téléphone en France] * [http://www.alcatel-lucent.com/wps/portal/!ut/p/kcxml/04_Sj9SPykssy0xPLMnMz0vM0Y_QjzKLd4w3sfQGSYGYRq6m-pEoYgbxjggRX4_83FT9oLQifW_9AP2C3NCIckdHRQAtKYEc/delta/base64xml/L3dJdyEvd0ZNQUFzQUMvNElVRS82X0FfNUxJ Histoire d'Alcatel-Lucent] * [http://www.recherche-inverse.com/informations-renseignements-telephoniques/historique-renseignements-telephonique.php Historique et origines des renseignements téléphoniques] * [http://museedutelephone.narbonne.pagesperso-orange.fr/association.htm ARHISCOM : Association de Recherche Historique sur les techniques de Communication] <!--{{lien web|url=http://telephoniste.free.fr/historique/francetelecom/|titre=ARHISCOM : Association de Recherche HIStorique sur les techniques de COMmunication}}--> * [http://www.linternaute.com/histoire/categorie/102/a/1/1/histoire_des_telecommunications.shtml Histoire des Télécommunications] * ({{en}}) [http://www.whitepages.fr/h.html Histoire des Telecom en particulier des Annuaires] * [http://www.linternaute.com/histoire/motcle/128/a/1/1/telephone.shtml Jour par Jour, Téléphone] 21c32hvoa0blp01lelcuzz1r4t94wn2 L'économie de la téléphonie/Abonnement téléphonique 0 54843 682225 417006 2022-07-23T09:02:26Z DavidL 1746 wikitext text/x-wiki {{L'économie de la téléphonie}} Un '''abonnement téléphonique''' est souscrit par une [[personne morale]] ou physique auprès d'un [[opérateur de télécommunications]] afin de se voir attribuer un [[numéro de téléphone]] et une autorisation d'émettre et de recevoir des [[appel téléphonique|appels téléphoniques]], potentiellement dans une certaine limite. == Coût abonnement téléphonique == ''Il s'agit à priori d'informations données pour un mois, pour une ligne fixe d'un particulier client de l'[[opérateur historique]] national.'' Traditionnellement, le coût d'un abonnement téléphonique était un cout fixe décidé par l'opérateur national. Avec l'ouverture à la concurrence une pléthore d'offres téléphoniques sont apparues, dans la [[téléphonie fixe]] comme dans la [[téléphonie mobile]]. Ces offres se distinguant par le montant de l'abonnement, appelé forfait lorsque des communications y sont prépayées et/ou lorsqu'il finance le terminal, par la qualité de services, ainsi que par d'innombrables spécificités de tarifs en fonction des opérateurs destinataires, de l'ingénierie marketing et des zones géographiques et autres options. Les nouvelles technologies et la croissance des communications de données (internet) ont par ailleurs conduit à la réduction des coût par unité de donnée, alors que la concurrence sur les cout des communications a conduit à un renchérissement du cout des abonnements. ''' Coût d'un abonnement téléphonique résidentiel hors-taxes, en [[Europe]], en [[2003]] ''' {| class="wikitable sortable" |- ! Pays ! Prix de l'abonnement mensuel en 2003 |- | Irlande | {{unité|18.59|€}} |- | Luxembourg | {{unité|16.00|€}} |- | Pays-Bas | {{unité|14.94|€}} |- | Belgique | {{unité|13.63|€}} |- | Allemagne | {{unité|13.50|€}} |- | Autriche | {{unité|13.31|€}} |- | Danemark | {{unité|12.81|€}} |- | Portugal | {{unité|12.30|€}} |- | Italie | {{unité|12.14|€}} |- | Espagne | {{unité|11.66|€}} |- | Royaume-Uni | {{unité|11.54|€}} |- | France | {{unité|10.87|€}} |- |} - Source : Commission européenne, Tarification == Abonnement téléphonique en France == En France, début 1996, l'abonnement téléphonique était l'un des moins chers d'Europe à 45,76 francs mensuels, soit environ {{unité|7|€}} euros<ref>Larcher, Gérard [http://www.senat.fr/rap/r95-260/r95-260_mono.html L'avenir de France Télécom: un défi national] Rapport No 260/1995-1996 au nom de la Commission des Affaires économiques et du Plan, Sénat, mars 1996 : « Le 2 mars (''1996'') dernier, le prix de l'abonnement téléphonique mensuel est passé de 45,76 francs à 52,80 francs. Il restait toutefois l'un des moins chers d'Europe. Celui de Télia (Suède) s’élevait à 77,55 francs, celui de BT (Grande-Bretagne) à 63 francs et celui de Deutsche Telekom à 73 francs. »</ref>. La facturation et l'entretien des lignes fixes de fin de réseau ([[boucle locale]]) restait un [[monopole]] attribué à [[France Télécom]]. L'opérateur historique profite de cet avantage concurrentiel pour maintenir un abonnement téléphonique à un coût élevé pour l'usager. Ainsi le prix de l'abonnement téléphonique a doublé en 10 ans, passant à {{unité|16|euros}} T.T.C. le {{1er juillet}} [[2007]]. Les opérateurs alternatifs peuvent proposer à leur client de prendre en charge le coût de la [[boucle locale]], moyennant un prix de gros compris d'environ {{unité|9|euros}} H.T.{{refnec}} que l'opérateur paye chaque mois à France Telecom pour un [[dégroupage]] total de la ligne. Ils intègrent ce coût dans leurs offres liées au [[dégroupage|dégroupage total]], le ''[[Triple play (télécommunications)|triple play]]'' et l'[[ADSL nu]], rendant l'abonnement téléphonique à l'opérateur historique caduc. Une solution permettant d'économiser de l'argent sur ses factures téléphoniques{{refsou}} est de souscrire à une offre de [[présélection]]. Les minutes d'appels sont alors payées à un opérateur extérieur. Aujourd'hui, les services de téléphonie sont fournis au travers de différentes technologies : paire de cuivre, sans fil, câble coaxial/fibre en pied d'immeuble, fibre à domicile, démultipliant d'autant la concurrence et rendant les comparaisons plus complexes. == Notes et références == {{Références}} == Voir aussi == * [[Présélection]] * [[Triple play (télécommunications)|Triple play]] * [[Statistique économique]] 0yp51vs0lef4y2gzujriyzggeyvukln L'économie de la téléphonie/Autres lectures 0 54846 682229 417395 2022-07-23T09:03:49Z DavidL 1746 wikitext text/x-wiki {{L'économie de la téléphonie}} {{ébauche|left=1}} ==Livres== {{...}} ==Articles de fond== * http://www.sciencespo.fr/ceri/en/content/normalisation-et-regulation-des-marches-la-telephonie-mobile-en-europe-et-aux-etats-unis Normalisation et régulation des marchés : la téléphonie mobile en Europe et aux États-Unis ==Journaux spécialisés== * http://lecercle.lesechos.fr/economie-societe/politique-eco-conjoncture/politique-economique/221152041/telephonie-mobile-marche-i Téléphonie mobile : un marché impossible à réguler * La régulation dans les télécommunications:une approche croisée de l'économie et du droit. * France : Le marché des télécoms (10/05/2010) http://www.journaldunet.com/cc/21_telecoms/fixe_marche_fr.shtml * Le secteur des télécommunications a détruit 28 300 emplois en 10 ans http://www.telecoms-media-pouvoir.net/index.php/nos-analyses/le-secteur-des-telecommunications-a-detruit-28-300-emplois-en-10-ans/ * Orange va augmenter le prix de ses forfaits de 5 à 10 euros avec la 4G http://www.boursier.com/actualites/economie/orange-va-augmenter-le-prix-de-ses-forfaits-de-5-a-10-euros-avec-la-4g-18374.html * Le forfait 2€ rapporterait 6€ à Free Mobile. Explications http://www.universfreebox.com/article/19509/Le-forfait-2euro-rapporterait-6euro-a-Free-Mobile-Explications * Un sous-traitant de Free au cœur d’une polémique sur le travail des détenus http://www.freenews.fr/spip.php?article13058 * Les MVNO menacés de marginalisation dans la guerre des prix http://www.lesmobiles.com/actualite/9822-les-mvno-menaces-de-marginalisation-dans-la-guerre-des-prix.html * Rassemblements de salariés de SFR contre le plan de suppression de postes http://www.lemonde.fr/economie/article/2013/01/24/rassemblements-de-salaries-de-sfr-contre-le-plan-de-suppression-de-postes_1822391_3234.html * Télécoms : Free Mobile n’est pas « l’unique cause de la contraction du secteur » http://www.itespresso.fr/telecoms-free-mobile-pas-unique-cause-contraction-secteur-61611.html * Free : la filière télécoms négligée au profit du consommateur, selon un rapport http://www.latribune.fr/technos-medias/telecoms/20130207trib000747593/free-la-filiere-telecoms-negligee-au-profit-du-consommateur-selon-un-rapport.html ==Articles officiels== * ARCEP: La situation des MVNO sur le marché français de la téléphonie mobile : l'avis de l'ARCEP rendu dans le cadre de la saisine de l'Autorité de la concurrence par Alternative Mobile. http://www.arcep.fr/index.php?id=8571&tx_gsactualite_pi1[uid]=1583&tx_gsactualite_pi1[annee]=&tx_gsactualite_pi1[theme]=&tx_gsactualite_pi1[motscle]=&tx_gsactualite_pi1[backID]=26&cHash=78fcd9868f9af71e34a53997c748603f ==Livres an langue anglaise== books.google.fr./books?id=5WZKtdlbJCoC qs3aixqn3e9g9b8u0pas0lu2oa8lgd5 L'économie de la téléphonie/Les sociétés 0 54847 682221 603790 2022-07-23T09:01:17Z DavidL 1746 wikitext text/x-wiki {{L'économie de la téléphonie}} {{ébauche|left=1}} Historiquement, chaque État disposait d'une administration pour gérer la téléphonie. Lors de l'apparition de la dérégulation, on a créé plusieurs sociétés pour commercialiser ces services, et pour fournir les infrastructures et les services dont les opérateurs avaient besoin. En France, par exemple, certaines sociétés sont propriétaires d'une parti de réseau de certaines villes notamment le long des tramway, d'autres sociétés disposent de câbles couvrant de longues distances, notamment le long des autoroutes ou des chemins de fer. Certaines sociétés ont acquis le statut d'opérateur d'immeuble, d'autres commercialisent leurs services auprès du grand public ou de sociétés ou encore à d'autres opérateurs... Parmi les sociétés commercialisant es offres de téléphonie, on peut en particulier vouloir distinguer des opérateurs classiques, des opérateurs virtuels (MVNO), ou à mi chemin, des fulls-MVNO. ==Les opérateurs== === Les opérateurs de réseaux mobiles === ==== opérateurs de réseaux mobiles en France ==== Fin septembre 2012, on comptait en France, environ 69 millions d’abonnés mobiles actifs dont 11 % chez des MVNO, soit un taux de pénétration de la population légèrement supérieur à 100 %<ref name=arcep>[http://www.arcep.fr/index.php?id=35#13270 Les chiffres de pénétration du mobile en France] Arcep, novembre 2012</ref> ; certaines personnes ont plusieurs abonnements et ce chiffre inclut aussi les abonnements non téléphoniques ([[Tablette tactile |tablettes]] ou [[Clé 3G|clés 3G]] par exemple). La répartition en France métropolitaine était la suivante à la fin du troisième trimestre 2012<ref>[http://www.pcinpact.com/news/70921-abonnes-bilan-fai-operateurs-mobiles.htm Nombre d’abonnés Mobile en France, total au 31 mars 2012] Pcinpact.com, mai 2012</ref> : {|class="wikitable" width="635" |- ! Rang!! Opérateur (Marque et société)!! Technologie !! Abonnés au réseau mobile<br /><small> (en millions)</small> !! Part de marché !! Propriétaire (Groupe) !!Chiffre d'affaire (mobile) (trimestriel et/ou annuel) |- |align=right| 1 || [[Orange (entreprise)|Orange]] || [[Universal Mobile Telecommunications System|UMTS]], [[Global System for Mobile Communications|GSM]] || 27 <small>(septembre 2012)</small> || 39 % || [[France Télécom]] || en France: 2,6 milliards d'euros/trimestre (T3 2012) <ref>http://www.orange.com/fr/finance/investisseurs-et-analystes/tous-les-resultats-consolides</ref>. |- |align=right| 2 || [[SFR (opérateur)|SFR]] || [[Universal Mobile Telecommunications System|UMTS]], [[Global System for Mobile Communications|GSM]] || 21 <small>(septembre 2012)</small>|| 29 % || [[Vivendi]] |- |align=right| 3 || [[Bouygues Telecom]] || [[Universal Mobile Telecommunications System|UMTS]], [[Global System for Mobile Communications|GSM]] || 10,4 <small>(septembre 2012)</small> || 14 % || [[Bouygues Telecom|Bouygues]] |- |align=right| 4 || [[Free Mobile]] || [[Universal Mobile Telecommunications System|UMTS]] || 5,6 <small>(janvier 2013)</small>{{refsou}} || 7,8 % || [[Iliad]] || 237 millions d'euros par trimestre (T3 2012) |- |align=right| 5 || [[MVNO]] || [[Universal Mobile Telecommunications System|UMTS]], [[Global System for Mobile Communications|GSM]] || 7,8 <small>(septembre 2012)</small> || 11,3 %<ref name=arcep/> || divers || * Virgin mobile: 470 millions d'euros pour l'année 2011 |- | Total || || || Environ dans les soixante millions || || || * Le chiffre d'affaire total, tout opérateur confondu ets de 20,4 milliards en 2011 <ref> http://www.arcep.fr/fileadmin/reprise/publications/chiffres-cle/chiffres-cle-2011-juin2012.pdf </ref>. |} {{...}} == Les sociétés des gestions des points hauts == Dans un contexte de concurrence acérée, le marché des points haut est en mutation. Pour réduire les couts d’exploitations, les opérateurs externalisent les actifs-passifs de points hauts<ref>http://www.osiris.sn/Telecommunications-une-rude.html</ref>. En particulier, en Afrique, la fourniture en électricité a un caractère aléatoire et sporadique qui conduit les opérateurs à s’alimenter avec des groupes électrogènes Diesel, ou à l’énergie solaire exposée aux vols récurrents des panneaux photovoltaïques. Les deux sociétés les plus actives dans le marché de l’externalisation des points hauts, sont la société étasunienne ''American Towers'' et la société britannique ''Eaton Towers''. ''American Towers'' dispose d'un chiffre d'affaire d'environ deux milliards de dollars des États-Unis, et de deux milles employés à temps plein. == Les fournisseurs d'équipements == Les sociétés Alcatel-Lucent et Cisco se sont unies dans un syndicat ''FTTH Council Europe'' afin de défendre leurs intérêts <ref> http://www.latribune.fr/technos-medias/telecoms/20130211trib000748109/fibre-optique-les-telecoms-sacrifiees-dans-le-budget-europeen-.html</ref>. {{...}} ==Références == <references /> cbbfpsmkpw7ksvxlvp3l1it40mm9uaw L'économie de la téléphonie/Emploi 0 54848 682227 409878 2022-07-23T09:03:05Z DavidL 1746 wikitext text/x-wiki {{L'économie de la téléphonie}} {{ébauche|left=1}} ==France== En France, ce secteur fonctionne avec la Convention collective nationale du 26 avril 2000<ref> Convention collective nationale des télécommunications du 26 avril 2000 Télécommunications Brochure n° 3303</ref>. ==Références == <references /> jwoo45kgdsy6lre584mvaa1pfjlmoay L'économie de la téléphonie/Les technologies 0 54896 682222 674234 2022-07-23T09:01:33Z DavidL 1746 wikitext text/x-wiki {{L'économie de la téléphonie}} {{ébauche|left=1}} Les technologies de téléphonie ont beaucoup évolué entre les débuts où l'on a fait passer de la voix sur ligne télégraphique et aujourd'hui, où la voix est découpée en paquets et transmis sur des réseaux numériques parfois mobiles. Les principales technologies actuelles du point de vue de l'utilisateur sont les suivantes: * téléphonie fixe (dite paire de cuivre) * téléphonie mobile (type GSM) * Wi-Fi * téléphonie par Internet (ADSL/fibre optique) Sous-jacents à ces différents types de services existent également différentes technologies dans les cœurs de réseau qui peuvent avoir un impact économique (concurrence/baisse des prix). Ces technologies nécessitent en particulier une interconnexion des réseaux des différents opérateurs qui doivent coopérer en ce sens, et sur le plan technique, et sur le plan financier. {{...}} hn4f7ibjn9kyedxjtn0606rwt7ugffl L'économie de la téléphonie/La segmentation des offres commerciales 0 54897 682224 410157 2022-07-23T09:02:08Z DavidL 1746 wikitext text/x-wiki {{L'économie de la téléphonie}} {{ébauche|left=1}} Dans la téléphonie, les offres commerciales sont très diversifiées pour des services qui de prime abord semblent tous identiques en qualités. Les offres se différencient pourtant sur différents points: * abonnement/prépayés/forfait/forfait bloqué * prix des communications, locales, nationales, domiennes, internationales, reçues * prix en fonction des opérateurs appelés * heures creuses/heures pleines * subvention et/ou location du téléphone * facturation de services divers (présentation du numéro, répondeur, numéros préférés, etc.) * frais d'ouverture ou de fermeture de lignes * frais divers {{...}} ==Perspectives== Pour l'association ''Global Mobile Congress'' de Barcelone, d'ici 2018 les opérateurs de téléphonie mobile tireront plus de revenu de recettes avec l'ensemble des données des utilisateurs qu'avec les services traditionnels d'appels vocaux. <ref>http://www.atlantico.fr/decryptage/donnees-nouvelle-poule-aux-oeufs-or-telephonie-mobile-catherine-lejealle-655068.html</ref> k1lt62swfzdxo3fylk8qj7cy1pboqe3 L'économie de la téléphonie/Géographie de la téléphonie 0 54900 682231 409879 2022-07-23T09:05:02Z DavidL 1746 wikitext text/x-wiki {{L'économie de la téléphonie}} {{ébauche|left=1}} La téléphonie s'est avant tout développée dans les pays du nord. Le chiffre d'affaires du secteur des télécommunications, est d'environ 274,7 milliards d'euros en 2011, en Europe. Pour le quiquenat 2014-2020, une enveloppe de neuf milliards d'euros publics avait été évoquée, avant que l'enveloppe ne soit réduite à un seul milliard<ref> http://www.latribune.fr/technos-medias/telecoms/20130211trib000748109/fibre-optique-les-telecoms-sacrifiees-dans-le-budget-europeen-.html</ref>. La part de marché de l'Europe dans le secteur mondial est de 25%<ref> bfmtv http://www.bfmtv.com/economie/europe-chiffre-daffaires-telecoms-a-recule-3e-annee-consecutive-etno-384272.html </ref>. En France, le taux de pénétration moyen <ref>la population de référence est celle publiée (et donc estimée) par l'INSEE au 1er janvier de l'année considérée</ref> de la téléphonie mobile est de 112%. Ce taux varie régionalement; il est de 111% en métropole, et de 124 % outre-mer; de 82% en Bretagne et de 171% en Ile-de-France. Toutefois, ces disparités sont à relativiser par rapport aux imprécisions éventuelles des estimations de l'INSEE. Le nombre de tablettes, de smartphone, et des systèmes d'Android ou iOS en Chine a atteint fin février 2013, 246 millions d'exemplaires, contre 230 pour les Etats-Unis<ref> La Chine est devenue le plus important marché de smartphones et de tablettes http://french.peopledaily.com.cn/Economie/8136187.html cabinet d'analyse Flurry, </ref>. * Inde, Russie et Brésil: 19 millions en janvier 2013 ( neuvième position). * Grande-Bretagne ( troisième) 43 millions en janvier 2013. * La Corée du Sud et le Japon ( quatrième et cinquième) ( 30 et 29 millions). ==Références== <references /> f2zbvazebcg23yv7dx3z9p18nrq1cpf L'économie de la téléphonie/Performance 0 54901 682226 409886 2022-07-23T09:02:54Z DavidL 1746 wikitext text/x-wiki {{L'économie de la téléphonie}} {{ébauche|left=1}} Le performance peut être mesure de différentes manières. D'un point de vue financier, il peut être établi en regardant les gains des entreprises par rapport à leur capitalisation. D'un point de vue du consommateur, il peut être établi à partir d'indicateurs de qualité de service ou de couverture. ==Performance financière== En Europe, une baisse de la performance des opérateurs télécom est prévue entre 2011 et 2014, en raison d'une part de la hausse de la concurrence et d'autre part par la dissymétrie fiscale subie<ref> Les télécoms ont atteint la cote d'alerte http://www.lefigaro.fr/societes/2012/11/01/20005-20121101ARTFIG00452-les-telecoms-ont-atteint-la-cote-d-alerte.php </ref>. Toutefois, l'ARCEP a prévu d'augmenter le taux de rémunération du capital. Il est de 9,5% par an en 2013, contre 8,9% en 2012<ref>http://www.universfreebox.com/article/19573/article/19565/France-Telecom-augmente-ses-tarifs-de-gros-notamment-en-degroupage</ref>. ==Performance vue par le consommateur== ==Références== <references/> s379pf675b188simxcx2gjz9iui9q8a L'économie de la téléphonie/Les usages 0 54969 682223 409885 2022-07-23T09:01:42Z DavidL 1746 wikitext text/x-wiki {{L'économie de la téléphonie}} {{ébauche|left=1}} Pour la téléphonie mobile, la vidéo représente 51% des usages environ dans le monde en 2013 et terme de trafic<ref> http://www.journaldunet.com/ebusiness/internet-mobile/data-mobile-2012-video-0213.shtml</ref>. ==Références== <references/> q7xq3kmulb96buduoh798og81e8of67 L'économie de la téléphonie/Perspectives 0 54970 682228 409887 2022-07-23T09:03:14Z DavidL 1746 wikitext text/x-wiki {{L'économie de la téléphonie}} {{ébauche|left=1}} Le trafic mondial de données mobiles pourrait être multiplié par 13 entre 2012 et 2017<ref> http://www.silicon.fr/cisco-prevoit-une-explosion-du-trafic-mobile-fois-13-sur-5-ans-83360.html </ref>. ==Références== {{References}} 7d8cscbl5f1ggo30z9fmpzuhmmteeny Modèle:L'économie de la téléphonie 10 55171 682213 651485 2022-07-22T19:23:08Z DavidL 1746 Contenu remplacé par « {{ModèleLivre|2=Waehlscheibe-kurzwahlnummern.jpg}}<noinclude>[[Catégorie:Modèles non imprimables spécifiques à un livre|{{SUBPAGENAME}}]]</noinclude> » wikitext text/x-wiki {{ModèleLivre|2=Waehlscheibe-kurzwahlnummern.jpg}}<noinclude>[[Catégorie:Modèles non imprimables spécifiques à un livre|{{SUBPAGENAME}}]]</noinclude> gaz422lqly350cgakhfcg573nwgx0d3 Capitalisme/La notion de capital 0 55620 682175 668995 2022-07-22T17:55:54Z DavidL 1746 wikitext text/x-wiki {{ébauche}} {{Capitalisme}} Au XII°s. « capital » est un adjectif dérivé de la racine latine ''caput'' : la tête, signifiant « principal ». Dans le dictionnaire de Nicot publié en 1606, l'adjectif est transformé en substantif pour désigner "le capital d'un marchand". Par suite le terme va signifier la somme d'argent ou de biens dont on est à la tête. Aujourd'hui le Capital correspond au stock accumulé de biens ou de richesses que l'on utilise pour produire de nouveaux biens ou revenus. Attention toutefois à l'emploi de ce terme, couramment employé en sciences économiques, en finance, en comptabilité, en sociologie et en philosophie ! Les définitions et significations spécifiques ne sont pas forcément équivalentes. Dans cet ouvrage, on retient la définition communément admise selon laquelle le Capital correspond au stock accumulé de biens ou de richesses que l'on utilise pour produire de nouveaux biens ou revenus. En effet, cette définition ne semble pas incompatibles avec les autres et n'empêche pas d'aborder les autre sujets. == Comptabilisation du capital == Quelle que soit la définition retenue du capital, on évalue généralement celui-ci dans une unité de compte qui en générale est la monnaie d'une zone économique. {{...}} qw6urat80qazww4y305kilwjb9maixr Capitalisme/Propriétés du capital 0 55937 682174 415439 2022-07-22T17:55:09Z DavidL 1746 wikitext text/x-wiki {{ébauche}} {{Capitalisme}} Si le capital se compte dans une unité de compte, on le distingue de la monnaie qui sert à échanger des biens et des services. Dans la notion de capital et de capitalisme on retrouve l'idée selon laquelle le capital investit et/ou épargné devrait fructifier, c'est-à-dire rémunérer le propriétaire du dit capital. L'argument sous-jacent de cette rémunération est par exemple la rétribution du risque pris, le partage des bénéfices que le capital immobilisé a permis de produire, ou encore l'esprit d'entreprise de l'investisseur. Ceci reste assez théorique et ne trouve pas toujours d'écho dans la réalité. Cependant, l'idée est ancrée dans un certaine manière de penser qui veut que tout argent immobilisé sous forme d'action, d'obligation ou d'autre épargne donne droit à une rétribution, sous forme de coupon ou d'intérêt. Ainsi le lien entre la capital et la rente générée devient assez abstrait. Il peut s'en suivre une inversion des rôles dans laquelle l'intérêt n'est plus la récompense d'un investissement judicieux, mais un dû calculé sur des critères financiers, dû exigible sans tenir compte des réalités concrètes. fiapj0h3fxrtzuo112fidwklbvi50p1 Logiciel Pastèque/Scripts divers 0 58773 682171 672593 2022-07-22T17:47:48Z DavidL 1746 wikitext text/x-wiki == Pastèque Desktop == === Toute version === ==== Édition de facture A4 ==== Dans le dossier d’installation de Pastèque, créer un dossier reports/fr/pasteque/reports Mettez y 3 fichiers : * <code>invoice.jrxml</code>, * <code>ticket_lines.jrxml</code>, * <code>logo.png</code> (votre logo). Adaptez les fichiers à vos besoins (ils sont définis plus bas). Dans la configuration avancée, ajoutez la ligne suivante dans Ticket.Buttons, entre les balises <configuration> et </configuration> : <event key="ticket.close" code="code.printinvoice"/> Dans la configuration avancée, ajoutez une ressource appelée « code.printinvoice » et contenant la ligne suivante : sales.printReport("/fr/pasteque/reports/invoice"); =====invoice.jrxml===== <syntaxhighlight lang="xml"> <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN" "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd"> <jasperReport name="ticket" columnCount="1" printOrder="Vertical" orientation="Portrait" pageWidth="595" pageHeight="842" columnWidth="535" columnSpacing="0" leftMargin="30" rightMargin="30" topMargin="20" bottomMargin="20" whenNoDataType="NoPages" isTitleNewPage="false" isSummaryNewPage="false"> <property name="ireport.scriptlethandling" value="0" /> <property name="ireport.encoding" value="UTF-8" /> <import value="java.util.*" /> <import value="net.sf.jasperreports.engine.*" /> <import value="net.sf.jasperreports.engine.data.*" /> <parameter name="SUBREPORT_DIR" isForPrompting="true" class="java.lang.String"> <defaultValueExpression ><![CDATA["./"]]></defaultValueExpression> </parameter> <field name="TICKET" class="fr.pasteque.pos.ticket.TicketInfo"/> <field name="PLACE" class="java.lang.String"/> <field name="TAXESLOGIC" class="java.lang.Object"/> <background> <band height="0" isSplitAllowed="true" > </band> </background> <!-- HEADER --> <title> <band height="85" isSplitAllowed="true" > <staticText> <reportElement x="0" y="70" width="520" height="15" key="hautdepage-boutique" /> <textElement textAlignment="Center" /> <text><![CDATA[INFOS MAGASIN]]></text> </staticText> </band> </title> <pageHeader> <band height="0" isSplitAllowed="true" > </band> </pageHeader> <columnHeader> <band height="0" isSplitAllowed="true" > </band> </columnHeader> <!-- BODY --> <detail> <band height="555" isSplitAllowed="true" > <!-- LOGO --> <image scaleImage="RetainShape" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement x="0" y="0" width="115" height="80" key="logo" /> <box></box> <graphicElement stretchType="NoStretch"/> <imageExpression class="java.lang.String"><![CDATA["reports/fr/pasteque/reports/logo.png"]]></imageExpression> </image> <!-- TOP LEFT --> <rectangle> <reportElement x="120" y="7" width="180" height="77" key="rectangle-hautgauche"/> <graphicElement stretchType="NoStretch"/> </rectangle> <staticText> <reportElement x="130" y="11" width="109" height="21" key="staticText-3"/> <box></box> <textElement> <font pdfFontName="Helvetica-Bold" isBold="true"/> </textElement> <text><![CDATA[FACTURE N°]]></text> </staticText> <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement x="200" y="11" width="156" height="21" key="textField-2"/> <box></box> <textElement> <font pdfFontName="Helvetica-Bold" isBold="true"/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{TICKET}.printId()]]></textFieldExpression> </textField> <staticText> <reportElement x="130" y="32" width="109" height="21" key="staticText-4"/> <box></box> <textElement> <font pdfFontName="Helvetica-Bold" isBold="true"/> </textElement> <text><![CDATA[Date: ]]></text> </staticText> <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement x="165" y="32" width="156" height="21" key="textField-3"/> <box></box> <textElement> <font/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{TICKET}.printDate()]]></textFieldExpression> </textField> <staticText> <reportElement x="130" y="55" width="160" height="21" key="conditionsdepaiement"/> <box></box> <textElement> <font pdfFontName="Helvetica-Bold" isBold="true"/> </textElement> <text><![CDATA[CONDITIONS PAIEMENT]]></text> </staticText> <!-- TOP RIGHT --> <rectangle> <reportElement x="300" y="7" width="220" height="77" key="rectangle-hautdroite"/> <graphicElement stretchType="NoStretch"/> </rectangle> <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement x="310" y="15" width="188" height="19" key="textField-4"> <printWhenExpression><![CDATA[Boolean.valueOf($F{TICKET}.getCustomer() != null)]]></printWhenExpression> </reportElement> <box></box> <textElement> <font/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{TICKET}.getCustomer().getName()]]></textFieldExpression> </textField> <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement x="310" y="25" width="188" height="19" key="textField-CustInfo1"> <printWhenExpression><![CDATA[Boolean.valueOf($F{TICKET}.getCustomer() != null)]]></printWhenExpression> </reportElement> <box></box> <textElement> <font/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{TICKET}.getCustomer().getAddress()]]></textFieldExpression> </textField> <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement x="310" y="35" width="188" height="19" key="textField-CustInfo2"> <printWhenExpression><![CDATA[Boolean.valueOf($F{TICKET}.getCustomer() != null)]]></printWhenExpression> </reportElement> <box></box> <textElement> <font/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{TICKET}.getCustomer().getAddress2()]]></textFieldExpression> </textField> <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement x="310" y="45" width="188" height="19" key="textField-CustInfo3"> <printWhenExpression><![CDATA[Boolean.valueOf($F{TICKET}.getCustomer() != null)]]></printWhenExpression> </reportElement> <box></box> <textElement> <font/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{TICKET}.getCustomer().getPostal()]]></textFieldExpression> </textField> <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement x="345" y="45" width="188" height="19" key="textField-CustInfo4"> <printWhenExpression><![CDATA[Boolean.valueOf($F{TICKET}.getCustomer() != null)]]></printWhenExpression> </reportElement> <box></box> <textElement> <font/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{TICKET}.getCustomer().getCity()]]></textFieldExpression> </textField> <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement x="310" y="55" width="188" height="19" key="textField-CustInfo5"> <printWhenExpression><![CDATA[Boolean.valueOf($F{TICKET}.getCustomer() != null)]]></printWhenExpression> </reportElement> <box></box> <textElement> <font/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{TICKET}.getCustomer().getCountry()]]></textFieldExpression> </textField> <!-- TICKET LINES --> <rectangle> <reportElement x="10" y="100" width="520" height="270" key="rectangle-lines"/> <graphicElement stretchType="NoStretch"/> </rectangle> <subreport isUsingCache="true"> <reportElement x="10" y="100" width="520" height="65" key="subreport-1"/> <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource( $F{TICKET}.getLines() )]]></dataSourceExpression> <subreportExpression class="net.sf.jasperreports.engine.JasperReport"><![CDATA[JasperCompileManager.compileReport( net.sf.jasperreports.engine.xml.JRXmlLoader.load(getClass().getResourceAsStream( "/fr/pasteque/reports/ticket_lines.jrxml" )) )]]></subreportExpression> </subreport> <!-- TOTAL --> <rectangle> <reportElement x="10" y="370" width="520" height="120" key="rectangle-total"/> <graphicElement stretchType="NoStretch"/> </rectangle> <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement x="324" y="399" width="188" height="19" key="textField-6"/> <box></box> <textElement textAlignment="Right"> <font pdfFontName="Helvetica-Bold" size="12" isBold="true"/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{TICKET}.printTax()]]></textFieldExpression> </textField> <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement x="324" y="418" width="188" height="19" key="textField-7"/> <box></box> <textElement textAlignment="Right"> <font pdfFontName="Helvetica-Bold" size="12" isBold="true"/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{TICKET}.printTotal()]]></textFieldExpression> </textField> <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement x="324" y="380" width="188" height="19" key="textField-8"/> <box></box> <textElement textAlignment="Right"> <font pdfFontName="Helvetica-Bold" size="12" isBold="true"/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{TICKET}.printSubTotal()]]></textFieldExpression> </textField> <staticText> <reportElement x="164" y="380" width="160" height="19" key="staticText-6"/> <box></box> <textElement> <font pdfFontName="Helvetica-Bold" isBold="true"/> </textElement> <text><![CDATA[Total HT]]></text> </staticText> <staticText> <reportElement x="164" y="399" width="160" height="19" key="staticText-8"/> <box></box> <textElement> <font pdfFontName="Helvetica-Bold" isBold="true"/> </textElement> <text><![CDATA[TVA 20%]]></text> </staticText> <staticText> <reportElement x="164" y="418" width="160" height="19" key="staticText-9"/> <box></box> <textElement> <font pdfFontName="Helvetica-Bold" isBold="true"/> </textElement> <text><![CDATA[Total TTC]]></text> </staticText> </band> </detail> <columnFooter> <band height="0" isSplitAllowed="true" > </band> </columnFooter> <pageFooter> <band height="0" isSplitAllowed="true" > </band> </pageFooter> <summary> <band height="40" isSplitAllowed="true" > <staticText> <reportElement x="0" y="0" width="520" height="19" key="basdepage-TVA" /> <textElement textAlignment="Center" /> <text><![CDATA[N° T.V.A. INTRACOMMUNAUTAIRE : XXXXXXXXXXXXXX]]></text> </staticText> <staticText> <reportElement x="0" y="20" width="520" height="19" key="basdepage-societe" /> <textElement textAlignment="Center" /> <text><![CDATA[PIED de page]]></text> </staticText> </band> </summary> </jasperReport> </syntaxhighlight> =====ticket_liens.jrxml===== <syntaxhighlight lang="xml"> <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN" "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd"> <jasperReport name="ticket_lines" columnCount="1" printOrder="Vertical" orientation="Portrait" pageWidth="535" pageHeight="802" columnWidth="535" columnSpacing="0" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0" whenNoDataType="NoPages" isTitleNewPage="false" isSummaryNewPage="false"> <property name="ireport.scriptlethandling" value="0" /> <property name="ireport.encoding" value="UTF-8" /> <import value="java.util.*" /> <import value="net.sf.jasperreports.engine.*" /> <import value="net.sf.jasperreports.engine.data.*" /> <field name="productName" class="java.lang.String"/> <field name="_THIS" class="fr.pasteque.pos.ticket.TicketLineInfo"/> <background> <band height="31" isSplitAllowed="true" > </band> </background> <title> <band height="0" isSplitAllowed="true" > </band> </title> <pageHeader> <band height="24" isSplitAllowed="true" > <rectangle> <reportElement x="0" y="0" width="520" height="24" key="rectangle-haut"/> <graphicElement stretchType="NoStretch"/> </rectangle> <staticText> <reportElement x="12" y="5" width="149" height="14" key="staticText-1"/> <box></box> <textElement> <font pdfFontName="Helvetica-Bold" isBold="true"/> </textElement> <text><![CDATA[Name]]></text> </staticText> <staticText> <reportElement x="176" y="5" width="113" height="14" key="staticText-2"/> <box></box> <textElement textAlignment="Right"> <font pdfFontName="Helvetica-Bold" isBold="true"/> </textElement> <text><![CDATA[Price]]></text> </staticText> <staticText> <reportElement x="360" y="5" width="136" height="14" key="staticText-4"/> <box></box> <textElement textAlignment="Right"> <font pdfFontName="Helvetica-Bold" isBold="true"/> </textElement> <text><![CDATA[Total]]></text> </staticText> <staticText> <reportElement x="289" y="5" width="71" height="14" key="staticText-5"/> <box></box> <textElement textAlignment="Right"> <font pdfFontName="Helvetica-Bold" isBold="true"/> </textElement> <text><![CDATA[Units]]></text> </staticText> </band> </pageHeader> <columnHeader> <band height="0" isSplitAllowed="true" > </band> </columnHeader> <detail> <band height="20" isSplitAllowed="true" > <rectangle> <reportElement x="0" y="0" width="520" height="20" key="rectangle-bas"/> <graphicElement stretchType="NoStretch"/> </rectangle> <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement x="12" y="3" width="149" height="15" key="textField-1"/> <box></box> <textElement> <font/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{productName}]]></textFieldExpression> </textField> <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement x="360" y="3" width="136" height="15" key="textField-2"/> <box></box> <textElement textAlignment="Right"> <font/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{_THIS}.printValue()]]></textFieldExpression> </textField> <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement x="176" y="3" width="113" height="15" key="textField-3"/> <box></box> <textElement textAlignment="Right"> <font/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{_THIS}.printPriceTax()]]></textFieldExpression> </textField> <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement x="289" y="3" width="71" height="15" key="textField-4"/> <box></box> <textElement textAlignment="Right"> <font/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{_THIS}.printMultiply()]]></textFieldExpression> </textField> </band> </detail> <columnFooter> <band height="0" isSplitAllowed="true" > </band> </columnFooter> <pageFooter> <band height="37" isSplitAllowed="true" > </band> </pageFooter> <summary> <band height="0" isSplitAllowed="true" > </band> </summary> </jasperReport> </syntaxhighlight> ==== Rendu monnaie en pop-up ==== Créer un fichier ressource à partir du compte administrateur * Aller dans « maintenance » puis « ressources » * Créer une nouvelle ressource (icône blanche avec point jaune) * Nommer la ressource « ticket.close » * Ajouter le code suivant : <syntaxhighlight lang="java">import java.awt.Font; import javax.swing.plaf.FontUIResource; import com.openbravo.pos.payment.PaymentInfo; import javax.swing.JOptionPane; import javax.swing.JDialog; boolean isCash = false; String change = ""; PaymentInfo p = ticket.payments.getFirst(); if ("cash".equals(p.getName())) { isCash = true; change = p.printChange(); } JOptionPane pane = new JOptionPane(); Font originalFont=pane.getFont(); UIManager.put("OptionPane.buttonFont", new FontUIResource(new Font("ARIAL",Font.PLAIN,30))); message = "A RENDRE: " + change; JLabel FontText = new JLabel(message); FontText.setFont (new Font ( "Arial", Font.BOLD, 40) ); if(isCash) { JOptionPane pane = new JOptionPane(); pane.setMessage(FontText); pane.setPreferredSize( new Dimension(450,150)); JDialog dialog = pane.createDialog("Rendre la monnaie"); new Thread(new Runnable() { void run() { dialog.show(); } }).start(); } UIManager.put("OptionPane.buttonFont", new FontUIResource(new Font(originalFont.getName(),originalFont.getStyle(),originalFont.getSize())));</syntaxhighlight> * Sauvegarder via l’icône en forme de disquette Mettre en place le script pour que la fenêtre apparaisse à la fin de la vente * Dans la liste des ressources, choisir « Ticket.Buttons » * Sous la balise « configuration », ajouter : <code><event key="ticket.close" code="ticket.close"/></code> * Sauvegarder Relancez Pastèque pour que le changement soit pris en compte ==== Empêcher l’encaissement lors d’un pré-paiement si le client n’est pas défini ==== Ce script pour le logiciel Pastèque interdit de passer à l’encaissement si le client n’est pas sélectionné quand un des produits du ticket est un prépaiement. Dans Tickets.Buttons ajouter :     <event key="ticket.total" code="event.PrepaidRequiresCustomer"/> Créer une ressource event.PrepaidRequiresCustomer et mettre le code suivant : <syntaxhighlight lang="java"> import fr.pasteque.pos.forms.DataLogicSales; import fr.pasteque.pos.ticket.ProductInfoExt; import fr.pasteque.pos.ticket.TicketLineInfo; DataLogicSales logic = new DataLogicSales(); for( int i = 0; i < ticket.getLinesCount(); i++ ) {     line = ticket.getLine( i );     product = logic.getProductInfo( line.getProductID() );     productCategory = product.getCategoryID();     customer = ticket.getCustomer();     if(productCategory.equals("-1")) {         if(customer == null){             javax.swing.JOptionPane.showMessageDialog(null, "Vous devez choisir un client pour savoir à qui va le prépaiement", "Customer Warning", JOptionPane.WARNING_MESSAGE);             return "Revenir en arrière";         }     } } </syntaxhighlight> === Windows === ==== Sauvegarde ==== Ce script exporte une base de données MySQL (sous la forme d'un fichier dump .sql), la compresse et l’envoie vers un serveur FTP pour la sauvegarder <syntaxhighlight lang="winbatch"> @echo off REM 7za.exe et mysqldump.exe doivent se trouver a la racine du ftp pour pouvoir etre telecharges REM Definition du dossier dans lequel le script va travailler set Folder= REM Parametrage des informations de connexion au serveur FTP set FtpHost= set FtpUser= set FtpPass= REM Parametrage des informations de connexion à la base de donnée MySQL et de la base à sauvegarder set DatabaseUser= set DatabasePass= set DatabaseName= REM Creation de la variable DateTime et modification de celle-ci afin de pouvoir l utiliser dans un nom de fichier set DateTime=%date%_%time% set DateTime=%DateTime: =_% set DateTime=%DateTime::=% set DateTime=%DateTime:/=_% set DateTime=%DateTime:.=_% set DateTime=%DateTime:,=_% REM Definition des variables pour les differents repertoires et fichiers utilises par le script set TempFolder=%Folder%TEMP set DestinationFolder=%Folder%ToSend set LogFolder=%Folder%Log set SQLSave=%Tempfolder%%USERNAME%_%DatabaseName%_%DateTime%.sql set BakFile=%TempFolder%%USERNAME%_%DatabaseName%_%DateTime%.BAK set ZipFile=%TempFolder%%USERNAME%_%DatabaseName%_%DateTime%.7z set SevenExe=%TempFolder%7za.exe set SQLDump=%TempFolder%mysqldump.exe set LogSQL=%LogFolder%logsql.txt REM Vérification de l'existence des repertoires et fichiers necessaires et creation si besoin IF NOT EXIST %Folder% mkdir %Folder% IF NOT EXIST %TempFolder% mkdir %Folder%TEMP IF NOT EXIST %DestinationFolder% mkdir %Folder%ToSend IF NOT EXIST %LogFolder% mkdir %Folder%Log IF NOT EXIST %LogSQL% echo Fichier Log SQL > %LogFolder%logsql.txt REM Téléchargement de 7z + MySQLDump depuis le serveur FTP echo %SevenExe% IF EXIST "%SevenExe%" AND %SQLDump% GOTO 7zaExeExists echo open %FtpHost% > ftpcmd.txt echo user %FtpUser% %FtpPass% >> ftpcmd.txt echo lcd "%TempFolder%" >> ftpcmd.txt echo hash >> ftpcmd.txt echo bin >> ftpcmd.txt echo get 7za.exe >> ftpcmd.txt echo get mysqldump.exe >> ftpcmd.txt echo bye >> ftpcmd.txt ftp -i -n -v -s:ftpcmd.txt :7zaExeExists REM Export de la base @%SQLDump% --user %DatabaseUser% --password="%DatabasePass%" %DatabaseName% > "%SQLSave%" @if %ERRORLEVEL% EQU 0 echo Reussi_%DateTime% >> %LogSQL% @if %ERRORLEVEL% GEQ 1 echo Echec_%DateTime% >> %LogSQL% REM Compression "%SevenExe%" a -mx5 "%ZipFile%" "%DestinationFolder%" "%SQLSave%" REM Téléversement de la sauvegarde sur le serveur FTP echo open %FtpHost% > ftpcmd.txt echo user %FtpUser% %FtpPass% >> ftpcmd.txt echo hash >> ftpcmd.txt echo bin >> ftpcmd.txt echo put "%ZipFile%" >> ftpcmd.txt echo bye >> ftpcmd.txt ftp -i -n -v -s:ftpcmd.txt REM Ménage del ftpcmd.txt del "%SQLSave%" del "%ZipFile%" RD "%DestinationFolder%" /S /Q shutdown -s -t 00 </syntaxhighlight> === MacOS === === GNU/Linux === {{...}} {{AutoCat}} 6nsscb0bx7trq977j22g0ew71dktv4d 682172 682171 2022-07-22T17:48:50Z DavidL 1746 /* Sauvegarde */ wikitext text/x-wiki == Pastèque Desktop == === Toute version === ==== Édition de facture A4 ==== Dans le dossier d’installation de Pastèque, créer un dossier reports/fr/pasteque/reports Mettez y 3 fichiers : * <code>invoice.jrxml</code>, * <code>ticket_lines.jrxml</code>, * <code>logo.png</code> (votre logo). Adaptez les fichiers à vos besoins (ils sont définis plus bas). Dans la configuration avancée, ajoutez la ligne suivante dans Ticket.Buttons, entre les balises <configuration> et </configuration> : <event key="ticket.close" code="code.printinvoice"/> Dans la configuration avancée, ajoutez une ressource appelée « code.printinvoice » et contenant la ligne suivante : sales.printReport("/fr/pasteque/reports/invoice"); =====invoice.jrxml===== <syntaxhighlight lang="xml"> <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN" "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd"> <jasperReport name="ticket" columnCount="1" printOrder="Vertical" orientation="Portrait" pageWidth="595" pageHeight="842" columnWidth="535" columnSpacing="0" leftMargin="30" rightMargin="30" topMargin="20" bottomMargin="20" whenNoDataType="NoPages" isTitleNewPage="false" isSummaryNewPage="false"> <property name="ireport.scriptlethandling" value="0" /> <property name="ireport.encoding" value="UTF-8" /> <import value="java.util.*" /> <import value="net.sf.jasperreports.engine.*" /> <import value="net.sf.jasperreports.engine.data.*" /> <parameter name="SUBREPORT_DIR" isForPrompting="true" class="java.lang.String"> <defaultValueExpression ><![CDATA["./"]]></defaultValueExpression> </parameter> <field name="TICKET" class="fr.pasteque.pos.ticket.TicketInfo"/> <field name="PLACE" class="java.lang.String"/> <field name="TAXESLOGIC" class="java.lang.Object"/> <background> <band height="0" isSplitAllowed="true" > </band> </background> <!-- HEADER --> <title> <band height="85" isSplitAllowed="true" > <staticText> <reportElement x="0" y="70" width="520" height="15" key="hautdepage-boutique" /> <textElement textAlignment="Center" /> <text><![CDATA[INFOS MAGASIN]]></text> </staticText> </band> </title> <pageHeader> <band height="0" isSplitAllowed="true" > </band> </pageHeader> <columnHeader> <band height="0" isSplitAllowed="true" > </band> </columnHeader> <!-- BODY --> <detail> <band height="555" isSplitAllowed="true" > <!-- LOGO --> <image scaleImage="RetainShape" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement x="0" y="0" width="115" height="80" key="logo" /> <box></box> <graphicElement stretchType="NoStretch"/> <imageExpression class="java.lang.String"><![CDATA["reports/fr/pasteque/reports/logo.png"]]></imageExpression> </image> <!-- TOP LEFT --> <rectangle> <reportElement x="120" y="7" width="180" height="77" key="rectangle-hautgauche"/> <graphicElement stretchType="NoStretch"/> </rectangle> <staticText> <reportElement x="130" y="11" width="109" height="21" key="staticText-3"/> <box></box> <textElement> <font pdfFontName="Helvetica-Bold" isBold="true"/> </textElement> <text><![CDATA[FACTURE N°]]></text> </staticText> <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement x="200" y="11" width="156" height="21" key="textField-2"/> <box></box> <textElement> <font pdfFontName="Helvetica-Bold" isBold="true"/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{TICKET}.printId()]]></textFieldExpression> </textField> <staticText> <reportElement x="130" y="32" width="109" height="21" key="staticText-4"/> <box></box> <textElement> <font pdfFontName="Helvetica-Bold" isBold="true"/> </textElement> <text><![CDATA[Date: ]]></text> </staticText> <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement x="165" y="32" width="156" height="21" key="textField-3"/> <box></box> <textElement> <font/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{TICKET}.printDate()]]></textFieldExpression> </textField> <staticText> <reportElement x="130" y="55" width="160" height="21" key="conditionsdepaiement"/> <box></box> <textElement> <font pdfFontName="Helvetica-Bold" isBold="true"/> </textElement> <text><![CDATA[CONDITIONS PAIEMENT]]></text> </staticText> <!-- TOP RIGHT --> <rectangle> <reportElement x="300" y="7" width="220" height="77" key="rectangle-hautdroite"/> <graphicElement stretchType="NoStretch"/> </rectangle> <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement x="310" y="15" width="188" height="19" key="textField-4"> <printWhenExpression><![CDATA[Boolean.valueOf($F{TICKET}.getCustomer() != null)]]></printWhenExpression> </reportElement> <box></box> <textElement> <font/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{TICKET}.getCustomer().getName()]]></textFieldExpression> </textField> <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement x="310" y="25" width="188" height="19" key="textField-CustInfo1"> <printWhenExpression><![CDATA[Boolean.valueOf($F{TICKET}.getCustomer() != null)]]></printWhenExpression> </reportElement> <box></box> <textElement> <font/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{TICKET}.getCustomer().getAddress()]]></textFieldExpression> </textField> <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement x="310" y="35" width="188" height="19" key="textField-CustInfo2"> <printWhenExpression><![CDATA[Boolean.valueOf($F{TICKET}.getCustomer() != null)]]></printWhenExpression> </reportElement> <box></box> <textElement> <font/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{TICKET}.getCustomer().getAddress2()]]></textFieldExpression> </textField> <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement x="310" y="45" width="188" height="19" key="textField-CustInfo3"> <printWhenExpression><![CDATA[Boolean.valueOf($F{TICKET}.getCustomer() != null)]]></printWhenExpression> </reportElement> <box></box> <textElement> <font/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{TICKET}.getCustomer().getPostal()]]></textFieldExpression> </textField> <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement x="345" y="45" width="188" height="19" key="textField-CustInfo4"> <printWhenExpression><![CDATA[Boolean.valueOf($F{TICKET}.getCustomer() != null)]]></printWhenExpression> </reportElement> <box></box> <textElement> <font/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{TICKET}.getCustomer().getCity()]]></textFieldExpression> </textField> <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement x="310" y="55" width="188" height="19" key="textField-CustInfo5"> <printWhenExpression><![CDATA[Boolean.valueOf($F{TICKET}.getCustomer() != null)]]></printWhenExpression> </reportElement> <box></box> <textElement> <font/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{TICKET}.getCustomer().getCountry()]]></textFieldExpression> </textField> <!-- TICKET LINES --> <rectangle> <reportElement x="10" y="100" width="520" height="270" key="rectangle-lines"/> <graphicElement stretchType="NoStretch"/> </rectangle> <subreport isUsingCache="true"> <reportElement x="10" y="100" width="520" height="65" key="subreport-1"/> <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource( $F{TICKET}.getLines() )]]></dataSourceExpression> <subreportExpression class="net.sf.jasperreports.engine.JasperReport"><![CDATA[JasperCompileManager.compileReport( net.sf.jasperreports.engine.xml.JRXmlLoader.load(getClass().getResourceAsStream( "/fr/pasteque/reports/ticket_lines.jrxml" )) )]]></subreportExpression> </subreport> <!-- TOTAL --> <rectangle> <reportElement x="10" y="370" width="520" height="120" key="rectangle-total"/> <graphicElement stretchType="NoStretch"/> </rectangle> <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement x="324" y="399" width="188" height="19" key="textField-6"/> <box></box> <textElement textAlignment="Right"> <font pdfFontName="Helvetica-Bold" size="12" isBold="true"/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{TICKET}.printTax()]]></textFieldExpression> </textField> <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement x="324" y="418" width="188" height="19" key="textField-7"/> <box></box> <textElement textAlignment="Right"> <font pdfFontName="Helvetica-Bold" size="12" isBold="true"/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{TICKET}.printTotal()]]></textFieldExpression> </textField> <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement x="324" y="380" width="188" height="19" key="textField-8"/> <box></box> <textElement textAlignment="Right"> <font pdfFontName="Helvetica-Bold" size="12" isBold="true"/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{TICKET}.printSubTotal()]]></textFieldExpression> </textField> <staticText> <reportElement x="164" y="380" width="160" height="19" key="staticText-6"/> <box></box> <textElement> <font pdfFontName="Helvetica-Bold" isBold="true"/> </textElement> <text><![CDATA[Total HT]]></text> </staticText> <staticText> <reportElement x="164" y="399" width="160" height="19" key="staticText-8"/> <box></box> <textElement> <font pdfFontName="Helvetica-Bold" isBold="true"/> </textElement> <text><![CDATA[TVA 20%]]></text> </staticText> <staticText> <reportElement x="164" y="418" width="160" height="19" key="staticText-9"/> <box></box> <textElement> <font pdfFontName="Helvetica-Bold" isBold="true"/> </textElement> <text><![CDATA[Total TTC]]></text> </staticText> </band> </detail> <columnFooter> <band height="0" isSplitAllowed="true" > </band> </columnFooter> <pageFooter> <band height="0" isSplitAllowed="true" > </band> </pageFooter> <summary> <band height="40" isSplitAllowed="true" > <staticText> <reportElement x="0" y="0" width="520" height="19" key="basdepage-TVA" /> <textElement textAlignment="Center" /> <text><![CDATA[N° T.V.A. INTRACOMMUNAUTAIRE : XXXXXXXXXXXXXX]]></text> </staticText> <staticText> <reportElement x="0" y="20" width="520" height="19" key="basdepage-societe" /> <textElement textAlignment="Center" /> <text><![CDATA[PIED de page]]></text> </staticText> </band> </summary> </jasperReport> </syntaxhighlight> =====ticket_liens.jrxml===== <syntaxhighlight lang="xml"> <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN" "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd"> <jasperReport name="ticket_lines" columnCount="1" printOrder="Vertical" orientation="Portrait" pageWidth="535" pageHeight="802" columnWidth="535" columnSpacing="0" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0" whenNoDataType="NoPages" isTitleNewPage="false" isSummaryNewPage="false"> <property name="ireport.scriptlethandling" value="0" /> <property name="ireport.encoding" value="UTF-8" /> <import value="java.util.*" /> <import value="net.sf.jasperreports.engine.*" /> <import value="net.sf.jasperreports.engine.data.*" /> <field name="productName" class="java.lang.String"/> <field name="_THIS" class="fr.pasteque.pos.ticket.TicketLineInfo"/> <background> <band height="31" isSplitAllowed="true" > </band> </background> <title> <band height="0" isSplitAllowed="true" > </band> </title> <pageHeader> <band height="24" isSplitAllowed="true" > <rectangle> <reportElement x="0" y="0" width="520" height="24" key="rectangle-haut"/> <graphicElement stretchType="NoStretch"/> </rectangle> <staticText> <reportElement x="12" y="5" width="149" height="14" key="staticText-1"/> <box></box> <textElement> <font pdfFontName="Helvetica-Bold" isBold="true"/> </textElement> <text><![CDATA[Name]]></text> </staticText> <staticText> <reportElement x="176" y="5" width="113" height="14" key="staticText-2"/> <box></box> <textElement textAlignment="Right"> <font pdfFontName="Helvetica-Bold" isBold="true"/> </textElement> <text><![CDATA[Price]]></text> </staticText> <staticText> <reportElement x="360" y="5" width="136" height="14" key="staticText-4"/> <box></box> <textElement textAlignment="Right"> <font pdfFontName="Helvetica-Bold" isBold="true"/> </textElement> <text><![CDATA[Total]]></text> </staticText> <staticText> <reportElement x="289" y="5" width="71" height="14" key="staticText-5"/> <box></box> <textElement textAlignment="Right"> <font pdfFontName="Helvetica-Bold" isBold="true"/> </textElement> <text><![CDATA[Units]]></text> </staticText> </band> </pageHeader> <columnHeader> <band height="0" isSplitAllowed="true" > </band> </columnHeader> <detail> <band height="20" isSplitAllowed="true" > <rectangle> <reportElement x="0" y="0" width="520" height="20" key="rectangle-bas"/> <graphicElement stretchType="NoStretch"/> </rectangle> <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement x="12" y="3" width="149" height="15" key="textField-1"/> <box></box> <textElement> <font/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{productName}]]></textFieldExpression> </textField> <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement x="360" y="3" width="136" height="15" key="textField-2"/> <box></box> <textElement textAlignment="Right"> <font/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{_THIS}.printValue()]]></textFieldExpression> </textField> <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement x="176" y="3" width="113" height="15" key="textField-3"/> <box></box> <textElement textAlignment="Right"> <font/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{_THIS}.printPriceTax()]]></textFieldExpression> </textField> <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement x="289" y="3" width="71" height="15" key="textField-4"/> <box></box> <textElement textAlignment="Right"> <font/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{_THIS}.printMultiply()]]></textFieldExpression> </textField> </band> </detail> <columnFooter> <band height="0" isSplitAllowed="true" > </band> </columnFooter> <pageFooter> <band height="37" isSplitAllowed="true" > </band> </pageFooter> <summary> <band height="0" isSplitAllowed="true" > </band> </summary> </jasperReport> </syntaxhighlight> ==== Rendu monnaie en pop-up ==== Créer un fichier ressource à partir du compte administrateur * Aller dans « maintenance » puis « ressources » * Créer une nouvelle ressource (icône blanche avec point jaune) * Nommer la ressource « ticket.close » * Ajouter le code suivant : <syntaxhighlight lang="java">import java.awt.Font; import javax.swing.plaf.FontUIResource; import com.openbravo.pos.payment.PaymentInfo; import javax.swing.JOptionPane; import javax.swing.JDialog; boolean isCash = false; String change = ""; PaymentInfo p = ticket.payments.getFirst(); if ("cash".equals(p.getName())) { isCash = true; change = p.printChange(); } JOptionPane pane = new JOptionPane(); Font originalFont=pane.getFont(); UIManager.put("OptionPane.buttonFont", new FontUIResource(new Font("ARIAL",Font.PLAIN,30))); message = "A RENDRE: " + change; JLabel FontText = new JLabel(message); FontText.setFont (new Font ( "Arial", Font.BOLD, 40) ); if(isCash) { JOptionPane pane = new JOptionPane(); pane.setMessage(FontText); pane.setPreferredSize( new Dimension(450,150)); JDialog dialog = pane.createDialog("Rendre la monnaie"); new Thread(new Runnable() { void run() { dialog.show(); } }).start(); } UIManager.put("OptionPane.buttonFont", new FontUIResource(new Font(originalFont.getName(),originalFont.getStyle(),originalFont.getSize())));</syntaxhighlight> * Sauvegarder via l’icône en forme de disquette Mettre en place le script pour que la fenêtre apparaisse à la fin de la vente * Dans la liste des ressources, choisir « Ticket.Buttons » * Sous la balise « configuration », ajouter : <code><event key="ticket.close" code="ticket.close"/></code> * Sauvegarder Relancez Pastèque pour que le changement soit pris en compte ==== Empêcher l’encaissement lors d’un pré-paiement si le client n’est pas défini ==== Ce script pour le logiciel Pastèque interdit de passer à l’encaissement si le client n’est pas sélectionné quand un des produits du ticket est un prépaiement. Dans Tickets.Buttons ajouter :     <event key="ticket.total" code="event.PrepaidRequiresCustomer"/> Créer une ressource event.PrepaidRequiresCustomer et mettre le code suivant : <syntaxhighlight lang="java"> import fr.pasteque.pos.forms.DataLogicSales; import fr.pasteque.pos.ticket.ProductInfoExt; import fr.pasteque.pos.ticket.TicketLineInfo; DataLogicSales logic = new DataLogicSales(); for( int i = 0; i < ticket.getLinesCount(); i++ ) {     line = ticket.getLine( i );     product = logic.getProductInfo( line.getProductID() );     productCategory = product.getCategoryID();     customer = ticket.getCustomer();     if(productCategory.equals("-1")) {         if(customer == null){             javax.swing.JOptionPane.showMessageDialog(null, "Vous devez choisir un client pour savoir à qui va le prépaiement", "Customer Warning", JOptionPane.WARNING_MESSAGE);             return "Revenir en arrière";         }     } } </syntaxhighlight> === Windows === ==== Sauvegarde ==== Ce script exporte une base de données MySQL (sous la forme d'un fichier dump .sql), la compresse et l’envoie vers un serveur FTP pour la sauvegarder <syntaxhighlight lang="winbatch"> @echo off REM 7za.exe et mysqldump.exe doivent se trouver a la racine du ftp pour pouvoir être téléchargés REM Définition du dossier dans lequel le script va travailler set Folder= REM Paramétrage des informations de connexion au serveur FTP set FtpHost= set FtpUser= set FtpPass= REM Paramétrage des informations de connexion à la base de donnée MySQL et de la base à sauvegarder set DatabaseUser= set DatabasePass= set DatabaseName= REM Creation de la variable DateTime et modification de celle-ci afin de pouvoir l utiliser dans un nom de fichier set DateTime=%date%_%time% set DateTime=%DateTime: =_% set DateTime=%DateTime::=% set DateTime=%DateTime:/=_% set DateTime=%DateTime:.=_% set DateTime=%DateTime:,=_% REM Définition des variables pour les différents répertoires et fichiers utilises par le script set TempFolder=%Folder%TEMP set DestinationFolder=%Folder%ToSend set LogFolder=%Folder%Log set SQLSave=%Tempfolder%%USERNAME%_%DatabaseName%_%DateTime%.sql set BakFile=%TempFolder%%USERNAME%_%DatabaseName%_%DateTime%.BAK set ZipFile=%TempFolder%%USERNAME%_%DatabaseName%_%DateTime%.7z set SevenExe=%TempFolder%7za.exe set SQLDump=%TempFolder%mysqldump.exe set LogSQL=%LogFolder%logsql.txt REM Vérification de l'existence des répertoires et fichiers nécessaires et création si besoin IF NOT EXIST %Folder% mkdir %Folder% IF NOT EXIST %TempFolder% mkdir %Folder%TEMP IF NOT EXIST %DestinationFolder% mkdir %Folder%ToSend IF NOT EXIST %LogFolder% mkdir %Folder%Log IF NOT EXIST %LogSQL% echo Fichier Log SQL > %LogFolder%logsql.txt REM Téléchargement de 7z + MySQLDump depuis le serveur FTP echo %SevenExe% IF EXIST "%SevenExe%" AND %SQLDump% GOTO 7zaExeExists echo open %FtpHost% > ftpcmd.txt echo user %FtpUser% %FtpPass% >> ftpcmd.txt echo lcd "%TempFolder%" >> ftpcmd.txt echo hash >> ftpcmd.txt echo bin >> ftpcmd.txt echo get 7za.exe >> ftpcmd.txt echo get mysqldump.exe >> ftpcmd.txt echo bye >> ftpcmd.txt ftp -i -n -v -s:ftpcmd.txt :7zaExeExists REM Export de la base @%SQLDump% --user %DatabaseUser% --password="%DatabasePass%" %DatabaseName% > "%SQLSave%" @if %ERRORLEVEL% EQU 0 echo Reussi_%DateTime% >> %LogSQL% @if %ERRORLEVEL% GEQ 1 echo Echec_%DateTime% >> %LogSQL% REM Compression "%SevenExe%" a -mx5 "%ZipFile%" "%DestinationFolder%" "%SQLSave%" REM Téléversement de la sauvegarde sur le serveur FTP echo open %FtpHost% > ftpcmd.txt echo user %FtpUser% %FtpPass% >> ftpcmd.txt echo hash >> ftpcmd.txt echo bin >> ftpcmd.txt echo put "%ZipFile%" >> ftpcmd.txt echo bye >> ftpcmd.txt ftp -i -n -v -s:ftpcmd.txt REM Ménage del ftpcmd.txt del "%SQLSave%" del "%ZipFile%" RD "%DestinationFolder%" /S /Q shutdown -s -t 00 </syntaxhighlight> === MacOS === === GNU/Linux === {{...}} {{AutoCat}} 091woyff5wcn6hj385g3ldo2u0xq9c3 Modèle:Retour indentation/Documentation 10 63358 682165 540220 2022-07-22T12:19:32Z DavidL 1746 wikitext text/x-wiki <noinclude>{{Documentation}}</noinclude> == Utilisation == Ce modèle sert à marquer un retour à gauche lors d'une discussion. == Syntaxe == * <code><nowiki>{{</nowiki>Retour indentation<nowiki>|paramètre1}}</nowiki></code> ou <code><nowiki>{{</nowiki>RI<nowiki>|paramètre1}}</nowiki></code> == Paramètres == * '''paramètre1''' = niveau d'indentation (optionnel) == Exemples == <div style="border:thin blue solid; padding:8px; margin:4px"><pre> Bla bla ? : Bla bla ::Bla !? :::Bla bla bla. ::::Ceci est la dernière intervention, indentée de 4 niveaux {{Retour indentation|::::}}Début d'une nouvelle intervention</pre> '''affiche''' Bla bla ? : Bla bla ::Bla !? :::Bla bla bla. ::::Ceci est la dernière intervention, indentée de 4 niveaux {{Retour indentation|::::}}Début d'une nouvelle intervention</div> <div style="border:thin blue solid; padding:8px; margin:4px"><pre> Bla bla ? : Bla bla. ::Bla !? :::Bla bla bla. ::::Bla bla bla. Bla bla. :::::Bla bla. ::::::Ceci est la dernière intervention, indentée de 6 niveaux {{Retour indentation|6}}Début d'une nouvelle intervention</pre> '''affiche''' Bla bla ? : Bla bla. ::Bla !? :::Bla bla bla. ::::Bla bla bla. Bla bla. :::::Bla bla. ::::::Ceci est la dernière intervention, indentée de 6 niveaux {{Retour indentation|6}}Début d'une nouvelle intervention</div> <includeonly> <!-- Catégories et interwikis du modèle --> [[Catégorie:Modèles de formatage]] </includeonly> gxylar26cb14zjppqchgn1zzrowrpci 682166 682165 2022-07-22T12:20:20Z DavidL 1746 wikitext text/x-wiki <noinclude>{{Documentation}}</noinclude> <span id="transformeEnPageDeDiscussion" ><!-- Pour les exemples dans la documentation du modèle --></span> == Utilisation == Ce modèle sert à marquer un retour à gauche lors d'une discussion. == Syntaxe == * <code><nowiki>{{</nowiki>Retour indentation<nowiki>|paramètre1}}</nowiki></code> ou <code><nowiki>{{</nowiki>RI<nowiki>|paramètre1}}</nowiki></code> == Paramètres == * '''paramètre1''' = niveau d'indentation (optionnel) == Exemples == <div style="border:thin blue solid; padding:8px; margin:4px"><pre> Bla bla ? : Bla bla ::Bla !? :::Bla bla bla. ::::Ceci est la dernière intervention, indentée de 4 niveaux {{Retour indentation|::::}}Début d'une nouvelle intervention</pre> '''affiche''' Bla bla ? : Bla bla ::Bla !? :::Bla bla bla. ::::Ceci est la dernière intervention, indentée de 4 niveaux {{Retour indentation|::::}}Début d'une nouvelle intervention</div> <div style="border:thin blue solid; padding:8px; margin:4px"><pre> Bla bla ? : Bla bla. ::Bla !? :::Bla bla bla. ::::Bla bla bla. Bla bla. :::::Bla bla. ::::::Ceci est la dernière intervention, indentée de 6 niveaux {{Retour indentation|6}}Début d'une nouvelle intervention</pre> '''affiche''' Bla bla ? : Bla bla. ::Bla !? :::Bla bla bla. ::::Bla bla bla. Bla bla. :::::Bla bla. ::::::Ceci est la dernière intervention, indentée de 6 niveaux {{Retour indentation|6}}Début d'une nouvelle intervention</div> <includeonly> <!-- Catégories et interwikis du modèle --> [[Catégorie:Modèles de formatage]] </includeonly> b3g1uxhfy5i934bca3q03y85t71dlvc Programmation Python/Exceptions 0 69035 682178 635107 2022-07-22T18:05:18Z DavidL 1746 wikitext text/x-wiki <noinclude>{{Python}}</noinclude> == Principe == Une exception est un signal d'erreur associé à un type de données donnant des informations sur l'erreur. En Python, il s'agit d'un objet. La capture des ''exceptions'' permet l'exécution d'instructions par un interpréteur ou par le processeur (langage compilé) lorsqu'une erreur est détectée au cours de l'exécution d'un programme. En règle générale, lorsque l'erreur n'est pas capturée, l'exécution du programme est alors interrompue, et un message d'erreur plus ou moins explicite est affiché. Exemple en Python 2 : <syntaxhighlight lang="Python2"> >>> print 55/0 ZeroDivisionError: integer division or modulo </syntaxhighlight> Exemple en Python 3 : <syntaxhighlight lang="Python3"> >>> print(55/0) ZeroDivisionError: division by zero </syntaxhighlight> {{remarque|D'autres informations complémentaires sont affichées, qui indiquent notamment à quel endroit du script l'erreur a été détectée, mais nous ne les reproduisons pas ici.}} Le message d'erreur proprement dit comporte deux parties séparées par un double point : d'abord le type d'erreur, et ensuite une information spécifique de cette erreur. Dans de nombreux cas, il est possible de prévoir à l'avance certaines des erreurs qui risquent de se produire à tel ou tel endroit du programme, et d'inclure à cet endroit des instructions particulières, qui seront activées seulement si ces erreurs se produisent. Dans les langages de niveau élevé comme Python, il est également possible d'associer un mécanisme de surveillance à tout ''un ensemble d'instructions'', et donc de simplifier le traitement des erreurs qui peuvent se produire dans n'importe laquelle de ces instructions. == Syntaxe == Un mécanisme de ce type s'appelle en général ''mécanisme de traitement des exceptions''. Celui de Python utilise l'ensemble d'instructions <code>try - except – else</code>, qui permettent d'intercepter une erreur et d'exécuter une portion de script spécifique de cette erreur. Il fonctionne comme suit : Le bloc d'instructions qui suit directement une instruction <code>try</code> est exécuté par Python ''sous réserve''. Si une erreur survient pendant l'exécution de l'une de ces instructions, alors Python annule cette instruction fautive et exécute à sa place le code inclus dans le bloc qui suit l'instruction <code>except</code>. Si aucune erreur ne s'est produite dans les instructions qui suivent <code>try</code>, alors c'est le bloc qui suit l'instruction <code>else</code> qui est exécuté (si cette instruction est présente). Dans tous les cas, l'exécution du programme peut se poursuivre ensuite avec les instructions ultérieures. Considérons par exemple un script qui demande à l'utilisateur d'entrer un nom de fichier, lequel fichier étant destiné à être ouvert en lecture. Si le fichier n'existe pas, nous ne voulons pas que le programme se « plante ». Nous voulons qu'un avertissement soit affiché, et éventuellement que l'utilisateur puisse essayer d'entrer un autre nom. {{Exemple|Exemple|Exemple de gestion d'exception| <syntaxhighlight lang=python> try: # Code pouvant générer une exception except MonException: # Code en cas d'exception else: # Code en cas de non exception finally: #code dans tous les cas </syntaxhighlight> }} == Exemple == Exemple de gestion d'exception : intercepter une division par zéro. <syntaxhighlight lang=python> a = int(input("Veuillez saisir le numérateur : ")) b = int(input("Veuillez saisir le dénominateur : ")) try: c = a / b print(" Le résultat est :" + c) except ZeroDivisionError as e: print(e.status_code) print(str(e)) print(" Pas de division par zéro SVP") finally: print("Fin du script") </syntaxhighlight> Autre exemple avec un fichier : <syntaxhighlight lang="Python"> filename = raw_input("Veuillez entrer un nom de fichier : ") try: f = open(filename, "r") except: print "Le fichier", filename, "est introuvable" </syntaxhighlight> {{attention|C'est une mauvaise pratique de ne pas préciser d’exception pour tout attraper comme ci-dessus. Il faut plutôt utiliser la classe mère de toutes les exceptions : <code>BaseException</code>}} Si nous estimons que ce genre de test est susceptible de rendre service à plusieurs endroits d'un programme, nous pouvons aussi l'inclure dans une fonction : <syntaxhighlight lang="Python"> def existe(fname): try: f = open(fname,'r') f.close() return 1 except: return 0 filename = raw_input("Veuillez entrer le nom du fichier : ") if existe(filename): print "Ce fichier existe bel et bien." else: print "Le fichier", filename, "est introuvable." </syntaxhighlight> Il est également possible de faire suivre l'instruction "try" de plusieurs blocs "except", chacun d'entre eux traitant un type d'erreur spécifique. Pour attraper plusieurs exceptions : <syntaxhighlight lang="Python"> try: from lib import * except (ImportError, ModuleNotFoundError) as e: from src.lib import * </syntaxhighlight> == Lancer une exception == Un programme Python peut lancer une exception lorsqu'il détecte une erreur, en utilisant l'instruction <code>raise</code> : <syntaxhighlight lang="Python"> def construire_table(taille): if (taille < 1): raise Exception("La taille spécifiée est invalide.") # On peut continuer car taille est supérieur ou égal à 1 ... </syntaxhighlight> Testé dans l'interpréteur interactif de Python : <syntaxhighlight lang="Python"> >>> construire_table(1) >>> construire_table(2) >>> construire_table(0) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 3, in construire_table Exception: La taille spécifiée est invalide. </syntaxhighlight> == Créer une exception == Il est possible de définir un nouveau type d'exception pour un type d'erreur spécifique. Pour cela, il faut créer une nouvelle classe dérivant de la classe <code>BaseException</code> ou d'une de ses sous-classes (<code>Exception</code> par exemple). <syntaxhighlight lang="Python3"> class InvalidSizeException(Exception): def __init__(self, taille): Exception.__init__(self, f"Taille invalide : {taille}") def construire_table(taille): if (taille < 1): raise InvalidSizeException(taille) # On peut continuer car taille est supérieur ou égal à 1 ... </syntaxhighlight> Testé dans l'interpréteur interactif de Python : <syntaxhighlight lang="Python3"> >>> construire_table(2) >>> construire_table(1) >>> construire_table(0) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 3, in construire_table __main__.InvalidSizeException: Taille invalide : 0 >>> construire_table(-1) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 3, in construire_table __main__.InvalidSizeException: Taille invalide : -1 </syntaxhighlight> eglr7rwdso0d1pvxgj6ju35ly0i206c Fonctionnement d'un ordinateur/Le Translation Lookaside Buffer 0 78680 682215 682127 2022-07-22T21:04:06Z Mewtow 31375 /* La hiérarchie des TLB */ wikitext text/x-wiki Dans le chapitre sur la mémoire virtuelle, nous avions abordé la pagination. Nous avions vu que la traduction des adresses virtuelles en adresses physiques se fait grâce à une table des pages située en mémoire RAM, qui contient les correspondances entre adresses physiques et virtuelles. Pour éviter d'avoir à lire la table des pages en mémoire RAM à chaque accès mémoire, les concepteurs de processeurs ont décidé d'implanter un cache dédié, le '''''translation lookaside buffer''''', ou TLB. Il stocke les entrées de la page des tables les plus récemment accédées. [[File:MMU principle updated.png|centre|vignette|upright=2.0|MMU avec une TLB.]] Les caches consomment beaucoup d'énergie et la TLB ne fait pas exception. Diverses estimations montrent que les TLB sont très consommatrices en énergie. Près de 5 à 15% de la consommation d'énergie d'un processeur provient de sa TLB et des circuits associés. Pour réduire cette consommation tout en gardant des performances très importantes, la TLB est conçue avec ces contraintes en tête. Notamment, la TLB est généralement un cache associatif par voie ou directement adressé, et non un cache totalement associatif. Les caches totalement associatifs consomment en effet beaucoup plus d'énergie pour fonctionner que les autres types de caches, pour des performances légèrement meilleures. Le cout en énergie ne vaut pas les performances gagnées, pour une LTB. ==L'accès à la TLB : succès et défauts d'accès== À chaque accès mémoire, le processeur vérifie si le TLB contient l'adresse physique à laquelle accéder. Si c'est le cas, le processeur n'a pas à accéder à la table des pages en mémoire RAM et lit directement l'information nécessaire depuis ce TLB. On dit que l'on a un succès d'accès à la TLB. Si la TLb ne contient pas l'adresse physique demandée, on fait face à un '''défaut d'accès à la TLB'''. L'accès à la table des pages en mémoire RAM est alors inévitable. [[File:Translation Lookaside Buffer.png|centre|vignette|upright=2.0|Translation Lookaside Buffer]] La traduction d'une adresse avec une TLB a lieu comme suit. Premièrement, le processeur (sa MMU) interroge la TLB : il envoie l'adresse virtuelle et la TLB répond. Si la TLB contient l'adresse physique associée, elle la fournit diretcement et le processeur au cache ou à la RAM directement. Si ce n'est pas le cas, le processeur accède à la table des pages en mémoire RAM. Si la page est en RAM, alors la table des pages renvoie l'adresse physique voulue et la TLB est mise à jour. PAr contre, si la page n'est pas en RAM, mais a été swappée sur le disque dur, la page est recopiée en mémoire RAM, la table des pages est mise à jour, puis la TLB l'est ensuite. [[File:Steps In a Translation Lookaside Buffer.png|centre|vignette|upright=2.0|Steps In a Translation Lookaside Buffer]] ===Les ''page table walkers''=== Les défauts d'accès à la TLB sont gérés de deux façons : soit le processeur gère tout seul la situation, soit il délègue cette tâche au système d’exploitation. Sur les processeurs anciens, le système d'exploitation gère le défaut d'accès à la TLB. En cas de défaut, le processeur lever une exception matérielle spécialisée, qui exécute une routine d'interruption chargée de gérer le défaut. C'est cette routine qui accède à la table des pages en RAM et gère la traduction d'adresse. Mais cette solution logicielle n'a pas de bonnes performances. De nos jours, les processeurs gèrent eux-mêmes le défaut d'accès à la TLB et vont chercher d'eux-mêmes les informations nécessaires dans la table des pages. Ils disposent de circuits, les '''''page table walkers''''', qui s'occupent eux-mêmes du défaut. L'avantage en termes de performance est certain : plus besoin de lever une exception matérielle, plus besoin de faire une commutation de contexte pour exécuter la routine d'interruption, etc. De plus, ces circuits sont conçus pour gérer plusieurs défauts simultanés, ce qui a son utilité sur les processeurs superscalaires à exécution dans le désordre qu'on abordera dans quelques chapitres. [[File:Page table actions.svg|centre|vignette|upright=2.0|Page table actions]] ==La hiérarchie des TLB== Pour des raisons de performances, la TLB est parfois découpée en plusieurs sous-caches L1, L2, L3, etc. Sur les architectures Harvard et Harvard modifiées, on trouve parfois deux TLB séparés : un pour les accès aux instructions, et un pour les accès aux données. L'architecture standard pour les TLBs actuelles est la suivante : une TLB de niveau 1 (L1) pour les instructions, une autre TLB de niveau 1 (L1) pour les données, puis une TLB de niveaux 2 (L2) partagée entre instructions et données. D'autre structures matérielles sont présentes pour accélérer encore la traduction d'adresse ou la gestion de la TLB, comme des caches divers pour accélérer les défauts dans la TLB. [[File:Hiérarchie de TLB.png|centre|vignette|upright=2|Hiérarchie de TLB.]] La séparation en une TLB L1 pour les instructions et une pour les données est nécessaire sur les architectures à hautes performances. Les processeurs modernes peuvent exécuter plusieurs instructions simultanément, ce qui a des conséquences. Il n'est pas rare que ces processeurs cherchent à accéder à des données en même temps qu'ils chargent une ou plusieurs instructions. Le nombre de données et d'instructions accédées en même temps est généralement élevé et une TLB unique devrait gérer plusieurs dizaines d'accès en même temps. La TLB doit alors être une mémoire multiports avec beaucoup de ports, beaucoup trop de ports pour être performante ou implémentable. Utiliser deux TLB séparées élimine ce problème, en limitant le nombre de ports sur chaque TLB. Un autre problème est que le programme prend moins de place que les données, ce qui se marie mal avec une TLB unique mais colle assez bien avec deux TLB spécialisées. La solution idéale est d'avoir une TLB d'instruction plus petite que celle pour les données. ==Les pages larges et leur impact sur la TLB== Les processeurs actuels gèrent plusieurs tailles différentes pour les pages : 4 kibioctets par défaut, 2 mébioctets, voire 1 à 4 gibioctets pour les pages les plus larges. Les pages larges ont l'avantage d'utiliser la TLB de manière optimale. Pour une capacité de TLB identique, on peut adresser beaucoup plus de mémoire avec des pages larges, ce qui rend les défauts de TLB plus rares. Par contre, ces différentes tailles se marient mal avec une TLB unique. Un des problèmes est que les numéros de page physique n'ont pas le même nombre de bits suivant la taille des pages, ce qui pose des problèmes avec l'associativité de la TLB. Ce problème fait que l'usage d'une TLB unique est possible, mais pas forcément optimal. ===L'usage de plusieurs TLB, chacune dédiée à une taille de page=== L'usage d'une TLB unique pour toutes les tailles de page est possible et même courant pour la TLB de niveau 2 (L2). Mais les TLB de niveau 1 sont souvent séparées en plusieurs TLB, une par taille de page possible. Les TLB pour les pages larges sont souvent plus petites que la TLB pour les pages de 4 kibioctets, afin de profiter des économies de TLB liées aux pages larges. Un problème est que la taille de la page n'est connue du processeur qu'une fois la traduction d'adresse terminée, réalisée par la TLB. Pour résoudre ce problème, toutes les TLB L1 sont accédées en parallèle lors d'un accès mémoire et le processeur sélectionne ensuite le résultat de celle qui correspond à la taille de page voulue. ===L'usage d'une TLB unique pour toutes les tailles de page=== Les TLB de niveau 2 gèrent plusieurs tailles de page en même temps. Mais les techniques pour faire cela sont assez couteuses en circuits et en performances. Aussi, les techniques utilisées pour gérer plusieurs tailles de page sont couramment implémentées sur les TLB de niveau 2, mais sont impraticables sur les TLB de niveau 1. Les deux techniques qui permettent cela sont appelées le '''''hash-rehashing''''' et le '''''skewing'''''. Elles répondent à un problème assez simple à 'expliquer : la taille de la page n'est connue du processeur qu'une fois la traduction d'adresse terminée, réalisée par la TLB. On doit accéder à la TLB en postulant que la page a une certaine taille, donc en précisant un numéro de page d'une certaine taille, pour ensuite avoir un défaut ou un succès de TLB. ====Le ''hash-rehashing''==== La première technique, celle du ''hash-rehashing'', consiste simplement à accéder la TLB en supposant que la page voulue a la taille usuelle, à savoir 4 kibioctets. En cas de succès de TLB, la page avait bien la taille supposée. Dans le cas contraire, on effectue un second accès en supposant que sa taille est de 2 mébioctets, et rebelote pour une page de 1-2 gibioctets en cas de défaut de TLB. Une fois toutes les tailles essayées, on accède à la table des pages en mémoire RAM. C'était la technique utilisée sur les processeurs Intel d’architecture Skylake et Broadwell. L'inconvénient est que les accès aux pages larges subissent une perte de performance notable, leur temps d'accès étant allongé. Cela est contrebalancé par le fait que ces tailles de page ont été inventées pour réduire le nombre de défauts de TLB, mais ces défauts sont assez rares pour l'impact soit seulement mitigé, pas compensé. L'allongement du temps d'accès peut être compensé par diverses méthodes. La première méthode est celle des '''accès simultanés à la TLB'''. Les TLB sont des caches assez performants, qui sont conçus pour être capables d'effectuer plusieurs accès en parallèle. On peut alors profiter de cette particularité pour lancer plusieurs accès au TLB en même temps, un par taille de page. Avec cette technique, les accès se faisant en parallèle et non l'un après l'autre, le temps d'accès est presque le même que si la TLB ne gérait qu'une seule taille de page. Le désavantage est que les multiples accès consomment de l'énergie et du courant, ce qui augmente la consommation énergétique de la TLB, qui est déjà très importante. La seconde solution est la '''prédiction de taille de page'''. L'idée est que le processeur tente de prédire quelle sera la taille de page, afin de tomber directement sur la bonne taille de page. Au lieu de tenter d'abord pour une page de 4 kibioctets, puis 2 mébioctets et enfin 1-2 Gibioctets, le processeur testera la taille de page la plus probable, puis la seconde plus probable, avant de tester la dernière taille de page possible. Le problème est alors de concevoir un circuit capable de réaliser cette prédiction. * Une manière simple mais extrêmement inefficace de faire cela est de mémoriser la taille des pages récemment accédées dans un cache spécialisé, qui mémorise la correspondance entre le numéro de la page et sa taille. La taille de la page est mémorisée dans ce cache, après le premier accès à cette page. Mais le défaut que le temps d'accès à ce cache de prédiction s'ajoute au temps d'accès à la TLBL2, ce qui en ruine totalement l'intérêt. Aussi, il faut trouver une solution alternative. * Une autre solution n'utilise pas le numéro de page, mais l'instruction responsable de l'accès à la TLB. Un accès à la TLB signifie un accès en mémoire RAM, qui est réalisé par une instruction. Instruction qui est identifiée par une adresse, elle-même située dans le ''program counter''. L'idée est que si une instruction est exécutée plusieurs fois, elle a tendance à accéder aux données d'une même page (localité spatiale). Ce n'est pas systématique, mais c'est une bonne supposition. On peut donc associer cette instruction à la taille de la page accédée récemment. Le cache de prédiction mémorise donc l'association entre adresse de cette instruction et taille de la page. Lors de l'accès mémoire, le ''program counter'' est récupéré et envoyé au cache de prédiction. En cas de succès d'accès, on obtient la taille de la page prédite. Cette méthode a le défaut que si plusieurs instructions accèdent à la même page, elles prendront chacune une ligne de cache dans le cache de prédiction et rien ne sera mutualisé. * Une solution alternative est de récupérer lune adresse virtuelle proche de l'adresse lue/écrite avant que l'accès mémoire soit démarré. L'idée est que lors du décodage de l'instruction d'accès mémoire, on récupére les registres utilisés, et on y accéde pour lire en avance l'adresse virtuelle. Une dernière méthode consiste à '''amortir le temps d'accès en cas de défaut dans la TLB L2'''. L'idée est de démarrer un accès à la table des pages en RAM en parallèle de l'accès à la TLB L2. La raison est que le temps d'accès à la TLB L2, avec ''hash-rehashing'', est très long. Il est sensiblement proche du quart du temps de défaut de TLB. Si en plus il fallait rajouter le temps d'accès à la table des pages en cas de défaut, le temps d'accès total serait énorme. Mais en lançant une lecture spéculative de la table des pages, le temps d'accès en cas de défaut est partiellement amorti. Le temps d'accès en cas de succès de TLB L2 reste cependant le même. ====Le ''skewing''==== La technique du ''skewing'' est assez simple à comprendre pour qui se rappelle ce qu'est un cache associatif par voie, et encore plus un cache ''skew-associative''. L'idée est d'utiliser un cache associatif par voie, mais où chaque voie est dédiée à une taille de page bien définie. Un cache associatif à trois voie pourra ainsi avoir une voie pour les pages de 4 kibioctets, une voie pour les pages de 2 mébioctets et une dernière voie pour les pages de plusieurs gibioctets. Cette méthode est conceptuellement équivalente au fait d'utiliser un cache pour chaque taille, à quelques différences près. Notamment, cela permet de mutualiser des circuits qui auraient été dupliqués en utilisant des caches séparés. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Le préchargement | prevTextLe préchargement | next=Le pipeline | nextText=Le pipeline }} </noinclude> e5axr9hwou99lsn56jtuuvatfa5xz0o 682216 682215 2022-07-22T21:10:37Z Mewtow 31375 /* L'accès à la TLB : succès et défauts d'accès */ wikitext text/x-wiki Dans le chapitre sur la mémoire virtuelle, nous avions abordé la pagination. Nous avions vu que la traduction des adresses virtuelles en adresses physiques se fait grâce à une table des pages située en mémoire RAM, qui contient les correspondances entre adresses physiques et virtuelles. Pour éviter d'avoir à lire la table des pages en mémoire RAM à chaque accès mémoire, les concepteurs de processeurs ont décidé d'implanter un cache dédié, le '''''translation lookaside buffer''''', ou TLB. Il stocke les entrées de la page des tables les plus récemment accédées. [[File:MMU principle updated.png|centre|vignette|upright=2.0|MMU avec une TLB.]] Les caches consomment beaucoup d'énergie et la TLB ne fait pas exception. Diverses estimations montrent que les TLB sont très consommatrices en énergie. Près de 5 à 15% de la consommation d'énergie d'un processeur provient de sa TLB et des circuits associés. Pour réduire cette consommation tout en gardant des performances très importantes, la TLB est conçue avec ces contraintes en tête. Notamment, la TLB est généralement un cache associatif par voie ou directement adressé, et non un cache totalement associatif. Les caches totalement associatifs consomment en effet beaucoup plus d'énergie pour fonctionner que les autres types de caches, pour des performances légèrement meilleures. Le cout en énergie ne vaut pas les performances gagnées, pour une LTB. ==L'accès à la TLB : succès et défauts d'accès== À chaque accès mémoire, le processeur vérifie si le TLB contient l'adresse physique à laquelle accéder. Si c'est le cas, le processeur n'a pas à accéder à la table des pages en mémoire RAM et lit directement l'information nécessaire depuis ce TLB. On dit que l'on a un succès d'accès à la TLB. Si la TLb ne contient pas l'adresse physique demandée, on fait face à un '''défaut d'accès à la TLB'''. L'accès à la table des pages en mémoire RAM est alors inévitable. [[File:Translation Lookaside Buffer.png|centre|vignette|upright=2.0|Translation Lookaside Buffer]] [[File:Page table actions.svg|vignette|Page table actions]] La traduction d'une adresse avec une TLB a lieu comme suit. Premièrement, le processeur (sa MMU) interroge la TLB : il envoie l'adresse virtuelle et la TLB répond. Si la TLB contient l'adresse physique associée, elle la fournit directement et le processeur au cache ou à la RAM directement. Si ce n'est pas le cas, le processeur accède à la table des pages en mémoire RAM. Si la page est en RAM, alors la table des pages renvoie l'adresse physique voulue et la TLB est mise à jour. Par contre, si la page n'est pas en RAM, mais a été swappée sur le disque dur, la page est recopiée en mémoire RAM, la table des pages est mise à jour, puis la TLB l'est ensuite. [[File:Steps In a Translation Lookaside Buffer.png|centre|vignette|upright=2.0|Steps In a Translation Lookaside Buffer]] ===Les ''page table walkers''=== Les défauts d'accès à la TLB sont gérés de deux façons : soit le processeur gère tout seul la situation, soit il délègue cette tâche au système d’exploitation. Sur les processeurs anciens, le système d'exploitation gère le défaut d'accès à la TLB. En cas de défaut, le processeur lever une exception matérielle spécialisée, qui exécute une routine d'interruption chargée de gérer le défaut. C'est cette routine qui accède à la table des pages en RAM et gère la traduction d'adresse. Mais cette solution logicielle n'a pas de bonnes performances. De nos jours, les processeurs gèrent eux-mêmes le défaut d'accès à la TLB et vont chercher d'eux-mêmes les informations nécessaires dans la table des pages. Ils disposent de circuits, les '''''page table walkers''''', qui s'occupent eux-mêmes du défaut. L'avantage en termes de performance est certain : plus besoin de lever une exception matérielle, plus besoin de faire une commutation de contexte pour exécuter la routine d'interruption, etc. De plus, ces circuits sont conçus pour gérer plusieurs défauts simultanés, ce qui a son utilité sur les processeurs superscalaires à exécution dans le désordre qu'on abordera dans quelques chapitres. ==La hiérarchie des TLB== Pour des raisons de performances, la TLB est parfois découpée en plusieurs sous-caches L1, L2, L3, etc. Sur les architectures Harvard et Harvard modifiées, on trouve parfois deux TLB séparés : un pour les accès aux instructions, et un pour les accès aux données. L'architecture standard pour les TLBs actuelles est la suivante : une TLB de niveau 1 (L1) pour les instructions, une autre TLB de niveau 1 (L1) pour les données, puis une TLB de niveaux 2 (L2) partagée entre instructions et données. D'autre structures matérielles sont présentes pour accélérer encore la traduction d'adresse ou la gestion de la TLB, comme des caches divers pour accélérer les défauts dans la TLB. [[File:Hiérarchie de TLB.png|centre|vignette|upright=2|Hiérarchie de TLB.]] La séparation en une TLB L1 pour les instructions et une pour les données est nécessaire sur les architectures à hautes performances. Les processeurs modernes peuvent exécuter plusieurs instructions simultanément, ce qui a des conséquences. Il n'est pas rare que ces processeurs cherchent à accéder à des données en même temps qu'ils chargent une ou plusieurs instructions. Le nombre de données et d'instructions accédées en même temps est généralement élevé et une TLB unique devrait gérer plusieurs dizaines d'accès en même temps. La TLB doit alors être une mémoire multiports avec beaucoup de ports, beaucoup trop de ports pour être performante ou implémentable. Utiliser deux TLB séparées élimine ce problème, en limitant le nombre de ports sur chaque TLB. Un autre problème est que le programme prend moins de place que les données, ce qui se marie mal avec une TLB unique mais colle assez bien avec deux TLB spécialisées. La solution idéale est d'avoir une TLB d'instruction plus petite que celle pour les données. ==Les pages larges et leur impact sur la TLB== Les processeurs actuels gèrent plusieurs tailles différentes pour les pages : 4 kibioctets par défaut, 2 mébioctets, voire 1 à 4 gibioctets pour les pages les plus larges. Les pages larges ont l'avantage d'utiliser la TLB de manière optimale. Pour une capacité de TLB identique, on peut adresser beaucoup plus de mémoire avec des pages larges, ce qui rend les défauts de TLB plus rares. Par contre, ces différentes tailles se marient mal avec une TLB unique. Un des problèmes est que les numéros de page physique n'ont pas le même nombre de bits suivant la taille des pages, ce qui pose des problèmes avec l'associativité de la TLB. Ce problème fait que l'usage d'une TLB unique est possible, mais pas forcément optimal. ===L'usage de plusieurs TLB, chacune dédiée à une taille de page=== L'usage d'une TLB unique pour toutes les tailles de page est possible et même courant pour la TLB de niveau 2 (L2). Mais les TLB de niveau 1 sont souvent séparées en plusieurs TLB, une par taille de page possible. Les TLB pour les pages larges sont souvent plus petites que la TLB pour les pages de 4 kibioctets, afin de profiter des économies de TLB liées aux pages larges. Un problème est que la taille de la page n'est connue du processeur qu'une fois la traduction d'adresse terminée, réalisée par la TLB. Pour résoudre ce problème, toutes les TLB L1 sont accédées en parallèle lors d'un accès mémoire et le processeur sélectionne ensuite le résultat de celle qui correspond à la taille de page voulue. ===L'usage d'une TLB unique pour toutes les tailles de page=== Les TLB de niveau 2 gèrent plusieurs tailles de page en même temps. Mais les techniques pour faire cela sont assez couteuses en circuits et en performances. Aussi, les techniques utilisées pour gérer plusieurs tailles de page sont couramment implémentées sur les TLB de niveau 2, mais sont impraticables sur les TLB de niveau 1. Les deux techniques qui permettent cela sont appelées le '''''hash-rehashing''''' et le '''''skewing'''''. Elles répondent à un problème assez simple à 'expliquer : la taille de la page n'est connue du processeur qu'une fois la traduction d'adresse terminée, réalisée par la TLB. On doit accéder à la TLB en postulant que la page a une certaine taille, donc en précisant un numéro de page d'une certaine taille, pour ensuite avoir un défaut ou un succès de TLB. ====Le ''hash-rehashing''==== La première technique, celle du ''hash-rehashing'', consiste simplement à accéder la TLB en supposant que la page voulue a la taille usuelle, à savoir 4 kibioctets. En cas de succès de TLB, la page avait bien la taille supposée. Dans le cas contraire, on effectue un second accès en supposant que sa taille est de 2 mébioctets, et rebelote pour une page de 1-2 gibioctets en cas de défaut de TLB. Une fois toutes les tailles essayées, on accède à la table des pages en mémoire RAM. C'était la technique utilisée sur les processeurs Intel d’architecture Skylake et Broadwell. L'inconvénient est que les accès aux pages larges subissent une perte de performance notable, leur temps d'accès étant allongé. Cela est contrebalancé par le fait que ces tailles de page ont été inventées pour réduire le nombre de défauts de TLB, mais ces défauts sont assez rares pour l'impact soit seulement mitigé, pas compensé. L'allongement du temps d'accès peut être compensé par diverses méthodes. La première méthode est celle des '''accès simultanés à la TLB'''. Les TLB sont des caches assez performants, qui sont conçus pour être capables d'effectuer plusieurs accès en parallèle. On peut alors profiter de cette particularité pour lancer plusieurs accès au TLB en même temps, un par taille de page. Avec cette technique, les accès se faisant en parallèle et non l'un après l'autre, le temps d'accès est presque le même que si la TLB ne gérait qu'une seule taille de page. Le désavantage est que les multiples accès consomment de l'énergie et du courant, ce qui augmente la consommation énergétique de la TLB, qui est déjà très importante. La seconde solution est la '''prédiction de taille de page'''. L'idée est que le processeur tente de prédire quelle sera la taille de page, afin de tomber directement sur la bonne taille de page. Au lieu de tenter d'abord pour une page de 4 kibioctets, puis 2 mébioctets et enfin 1-2 Gibioctets, le processeur testera la taille de page la plus probable, puis la seconde plus probable, avant de tester la dernière taille de page possible. Le problème est alors de concevoir un circuit capable de réaliser cette prédiction. * Une manière simple mais extrêmement inefficace de faire cela est de mémoriser la taille des pages récemment accédées dans un cache spécialisé, qui mémorise la correspondance entre le numéro de la page et sa taille. La taille de la page est mémorisée dans ce cache, après le premier accès à cette page. Mais le défaut que le temps d'accès à ce cache de prédiction s'ajoute au temps d'accès à la TLBL2, ce qui en ruine totalement l'intérêt. Aussi, il faut trouver une solution alternative. * Une autre solution n'utilise pas le numéro de page, mais l'instruction responsable de l'accès à la TLB. Un accès à la TLB signifie un accès en mémoire RAM, qui est réalisé par une instruction. Instruction qui est identifiée par une adresse, elle-même située dans le ''program counter''. L'idée est que si une instruction est exécutée plusieurs fois, elle a tendance à accéder aux données d'une même page (localité spatiale). Ce n'est pas systématique, mais c'est une bonne supposition. On peut donc associer cette instruction à la taille de la page accédée récemment. Le cache de prédiction mémorise donc l'association entre adresse de cette instruction et taille de la page. Lors de l'accès mémoire, le ''program counter'' est récupéré et envoyé au cache de prédiction. En cas de succès d'accès, on obtient la taille de la page prédite. Cette méthode a le défaut que si plusieurs instructions accèdent à la même page, elles prendront chacune une ligne de cache dans le cache de prédiction et rien ne sera mutualisé. * Une solution alternative est de récupérer lune adresse virtuelle proche de l'adresse lue/écrite avant que l'accès mémoire soit démarré. L'idée est que lors du décodage de l'instruction d'accès mémoire, on récupére les registres utilisés, et on y accéde pour lire en avance l'adresse virtuelle. Une dernière méthode consiste à '''amortir le temps d'accès en cas de défaut dans la TLB L2'''. L'idée est de démarrer un accès à la table des pages en RAM en parallèle de l'accès à la TLB L2. La raison est que le temps d'accès à la TLB L2, avec ''hash-rehashing'', est très long. Il est sensiblement proche du quart du temps de défaut de TLB. Si en plus il fallait rajouter le temps d'accès à la table des pages en cas de défaut, le temps d'accès total serait énorme. Mais en lançant une lecture spéculative de la table des pages, le temps d'accès en cas de défaut est partiellement amorti. Le temps d'accès en cas de succès de TLB L2 reste cependant le même. ====Le ''skewing''==== La technique du ''skewing'' est assez simple à comprendre pour qui se rappelle ce qu'est un cache associatif par voie, et encore plus un cache ''skew-associative''. L'idée est d'utiliser un cache associatif par voie, mais où chaque voie est dédiée à une taille de page bien définie. Un cache associatif à trois voie pourra ainsi avoir une voie pour les pages de 4 kibioctets, une voie pour les pages de 2 mébioctets et une dernière voie pour les pages de plusieurs gibioctets. Cette méthode est conceptuellement équivalente au fait d'utiliser un cache pour chaque taille, à quelques différences près. Notamment, cela permet de mutualiser des circuits qui auraient été dupliqués en utilisant des caches séparés. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Le préchargement | prevTextLe préchargement | next=Le pipeline | nextText=Le pipeline }} </noinclude> eotw6adcn6ttm8oocxjiczq552ft3oh 682217 682216 2022-07-22T21:13:08Z Mewtow 31375 /* La hiérarchie des TLB */ wikitext text/x-wiki Dans le chapitre sur la mémoire virtuelle, nous avions abordé la pagination. Nous avions vu que la traduction des adresses virtuelles en adresses physiques se fait grâce à une table des pages située en mémoire RAM, qui contient les correspondances entre adresses physiques et virtuelles. Pour éviter d'avoir à lire la table des pages en mémoire RAM à chaque accès mémoire, les concepteurs de processeurs ont décidé d'implanter un cache dédié, le '''''translation lookaside buffer''''', ou TLB. Il stocke les entrées de la page des tables les plus récemment accédées. [[File:MMU principle updated.png|centre|vignette|upright=2.0|MMU avec une TLB.]] Les caches consomment beaucoup d'énergie et la TLB ne fait pas exception. Diverses estimations montrent que les TLB sont très consommatrices en énergie. Près de 5 à 15% de la consommation d'énergie d'un processeur provient de sa TLB et des circuits associés. Pour réduire cette consommation tout en gardant des performances très importantes, la TLB est conçue avec ces contraintes en tête. Notamment, la TLB est généralement un cache associatif par voie ou directement adressé, et non un cache totalement associatif. Les caches totalement associatifs consomment en effet beaucoup plus d'énergie pour fonctionner que les autres types de caches, pour des performances légèrement meilleures. Le cout en énergie ne vaut pas les performances gagnées, pour une LTB. ==L'accès à la TLB : succès et défauts d'accès== À chaque accès mémoire, le processeur vérifie si le TLB contient l'adresse physique à laquelle accéder. Si c'est le cas, le processeur n'a pas à accéder à la table des pages en mémoire RAM et lit directement l'information nécessaire depuis ce TLB. On dit que l'on a un succès d'accès à la TLB. Si la TLb ne contient pas l'adresse physique demandée, on fait face à un '''défaut d'accès à la TLB'''. L'accès à la table des pages en mémoire RAM est alors inévitable. [[File:Translation Lookaside Buffer.png|centre|vignette|upright=2.0|Translation Lookaside Buffer]] [[File:Page table actions.svg|vignette|Page table actions]] La traduction d'une adresse avec une TLB a lieu comme suit. Premièrement, le processeur (sa MMU) interroge la TLB : il envoie l'adresse virtuelle et la TLB répond. Si la TLB contient l'adresse physique associée, elle la fournit directement et le processeur au cache ou à la RAM directement. Si ce n'est pas le cas, le processeur accède à la table des pages en mémoire RAM. Si la page est en RAM, alors la table des pages renvoie l'adresse physique voulue et la TLB est mise à jour. Par contre, si la page n'est pas en RAM, mais a été swappée sur le disque dur, la page est recopiée en mémoire RAM, la table des pages est mise à jour, puis la TLB l'est ensuite. [[File:Steps In a Translation Lookaside Buffer.png|centre|vignette|upright=2.0|Steps In a Translation Lookaside Buffer]] ===Les ''page table walkers''=== Les défauts d'accès à la TLB sont gérés de deux façons : soit le processeur gère tout seul la situation, soit il délègue cette tâche au système d’exploitation. Sur les processeurs anciens, le système d'exploitation gère le défaut d'accès à la TLB. En cas de défaut, le processeur lever une exception matérielle spécialisée, qui exécute une routine d'interruption chargée de gérer le défaut. C'est cette routine qui accède à la table des pages en RAM et gère la traduction d'adresse. Mais cette solution logicielle n'a pas de bonnes performances. De nos jours, les processeurs gèrent eux-mêmes le défaut d'accès à la TLB et vont chercher d'eux-mêmes les informations nécessaires dans la table des pages. Ils disposent de circuits, les '''''page table walkers''''', qui s'occupent eux-mêmes du défaut. L'avantage en termes de performance est certain : plus besoin de lever une exception matérielle, plus besoin de faire une commutation de contexte pour exécuter la routine d'interruption, etc. De plus, ces circuits sont conçus pour gérer plusieurs défauts simultanés, ce qui a son utilité sur les processeurs superscalaires à exécution dans le désordre qu'on abordera dans quelques chapitres. ==La hiérarchie des TLB== Pour des raisons de performances, la TLB est parfois découpée en plusieurs sous-caches L1, L2, L3, etc. Sur les architectures Harvard et Harvard modifiées, on trouve parfois deux TLB séparés : un pour les accès aux instructions, et un pour les accès aux données. L'architecture standard pour les TLBs actuelles est la suivante : une TLB de niveau 1 pour les instructions, une autre TLB de niveau 1 pour les données, puis une TLB de niveaux 2 partagée entre instructions et données. D'autres structures matérielles sont présentes pour accélérer encore la traduction d'adresse ou la gestion de la TLB, comme des caches divers pour accélérer les défauts dans la TLB. [[File:Hiérarchie de TLB.png|centre|vignette|upright=2|Hiérarchie de TLB.]] La séparation en une TLB L1 pour les instructions et une pour les données est nécessaire sur les architectures à hautes performances. Les processeurs modernes peuvent exécuter plusieurs instructions simultanément, ce qui a des conséquences. Il n'est pas rare que ces processeurs cherchent à accéder à des données en même temps qu'ils chargent une ou plusieurs instructions. Le nombre de données et d'instructions accédées en même temps est généralement élevé et une TLB unique devrait gérer plusieurs dizaines d'accès en même temps. La TLB doit alors être une mémoire multiports avec beaucoup de ports, beaucoup trop de ports pour être performante ou implémentable. Utiliser deux TLB séparées élimine ce problème, en limitant le nombre de ports sur chaque TLB. Un autre problème est que le programme prend moins de place que les données, ce qui se marie mal avec une TLB unique mais colle assez bien avec deux TLB spécialisées. La solution idéale est d'avoir une TLB d'instruction plus petite que celle pour les données. ==Les pages larges et leur impact sur la TLB== Les processeurs actuels gèrent plusieurs tailles différentes pour les pages : 4 kibioctets par défaut, 2 mébioctets, voire 1 à 4 gibioctets pour les pages les plus larges. Les pages larges ont l'avantage d'utiliser la TLB de manière optimale. Pour une capacité de TLB identique, on peut adresser beaucoup plus de mémoire avec des pages larges, ce qui rend les défauts de TLB plus rares. Par contre, ces différentes tailles se marient mal avec une TLB unique. Un des problèmes est que les numéros de page physique n'ont pas le même nombre de bits suivant la taille des pages, ce qui pose des problèmes avec l'associativité de la TLB. Ce problème fait que l'usage d'une TLB unique est possible, mais pas forcément optimal. ===L'usage de plusieurs TLB, chacune dédiée à une taille de page=== L'usage d'une TLB unique pour toutes les tailles de page est possible et même courant pour la TLB de niveau 2 (L2). Mais les TLB de niveau 1 sont souvent séparées en plusieurs TLB, une par taille de page possible. Les TLB pour les pages larges sont souvent plus petites que la TLB pour les pages de 4 kibioctets, afin de profiter des économies de TLB liées aux pages larges. Un problème est que la taille de la page n'est connue du processeur qu'une fois la traduction d'adresse terminée, réalisée par la TLB. Pour résoudre ce problème, toutes les TLB L1 sont accédées en parallèle lors d'un accès mémoire et le processeur sélectionne ensuite le résultat de celle qui correspond à la taille de page voulue. ===L'usage d'une TLB unique pour toutes les tailles de page=== Les TLB de niveau 2 gèrent plusieurs tailles de page en même temps. Mais les techniques pour faire cela sont assez couteuses en circuits et en performances. Aussi, les techniques utilisées pour gérer plusieurs tailles de page sont couramment implémentées sur les TLB de niveau 2, mais sont impraticables sur les TLB de niveau 1. Les deux techniques qui permettent cela sont appelées le '''''hash-rehashing''''' et le '''''skewing'''''. Elles répondent à un problème assez simple à 'expliquer : la taille de la page n'est connue du processeur qu'une fois la traduction d'adresse terminée, réalisée par la TLB. On doit accéder à la TLB en postulant que la page a une certaine taille, donc en précisant un numéro de page d'une certaine taille, pour ensuite avoir un défaut ou un succès de TLB. ====Le ''hash-rehashing''==== La première technique, celle du ''hash-rehashing'', consiste simplement à accéder la TLB en supposant que la page voulue a la taille usuelle, à savoir 4 kibioctets. En cas de succès de TLB, la page avait bien la taille supposée. Dans le cas contraire, on effectue un second accès en supposant que sa taille est de 2 mébioctets, et rebelote pour une page de 1-2 gibioctets en cas de défaut de TLB. Une fois toutes les tailles essayées, on accède à la table des pages en mémoire RAM. C'était la technique utilisée sur les processeurs Intel d’architecture Skylake et Broadwell. L'inconvénient est que les accès aux pages larges subissent une perte de performance notable, leur temps d'accès étant allongé. Cela est contrebalancé par le fait que ces tailles de page ont été inventées pour réduire le nombre de défauts de TLB, mais ces défauts sont assez rares pour l'impact soit seulement mitigé, pas compensé. L'allongement du temps d'accès peut être compensé par diverses méthodes. La première méthode est celle des '''accès simultanés à la TLB'''. Les TLB sont des caches assez performants, qui sont conçus pour être capables d'effectuer plusieurs accès en parallèle. On peut alors profiter de cette particularité pour lancer plusieurs accès au TLB en même temps, un par taille de page. Avec cette technique, les accès se faisant en parallèle et non l'un après l'autre, le temps d'accès est presque le même que si la TLB ne gérait qu'une seule taille de page. Le désavantage est que les multiples accès consomment de l'énergie et du courant, ce qui augmente la consommation énergétique de la TLB, qui est déjà très importante. La seconde solution est la '''prédiction de taille de page'''. L'idée est que le processeur tente de prédire quelle sera la taille de page, afin de tomber directement sur la bonne taille de page. Au lieu de tenter d'abord pour une page de 4 kibioctets, puis 2 mébioctets et enfin 1-2 Gibioctets, le processeur testera la taille de page la plus probable, puis la seconde plus probable, avant de tester la dernière taille de page possible. Le problème est alors de concevoir un circuit capable de réaliser cette prédiction. * Une manière simple mais extrêmement inefficace de faire cela est de mémoriser la taille des pages récemment accédées dans un cache spécialisé, qui mémorise la correspondance entre le numéro de la page et sa taille. La taille de la page est mémorisée dans ce cache, après le premier accès à cette page. Mais le défaut que le temps d'accès à ce cache de prédiction s'ajoute au temps d'accès à la TLBL2, ce qui en ruine totalement l'intérêt. Aussi, il faut trouver une solution alternative. * Une autre solution n'utilise pas le numéro de page, mais l'instruction responsable de l'accès à la TLB. Un accès à la TLB signifie un accès en mémoire RAM, qui est réalisé par une instruction. Instruction qui est identifiée par une adresse, elle-même située dans le ''program counter''. L'idée est que si une instruction est exécutée plusieurs fois, elle a tendance à accéder aux données d'une même page (localité spatiale). Ce n'est pas systématique, mais c'est une bonne supposition. On peut donc associer cette instruction à la taille de la page accédée récemment. Le cache de prédiction mémorise donc l'association entre adresse de cette instruction et taille de la page. Lors de l'accès mémoire, le ''program counter'' est récupéré et envoyé au cache de prédiction. En cas de succès d'accès, on obtient la taille de la page prédite. Cette méthode a le défaut que si plusieurs instructions accèdent à la même page, elles prendront chacune une ligne de cache dans le cache de prédiction et rien ne sera mutualisé. * Une solution alternative est de récupérer lune adresse virtuelle proche de l'adresse lue/écrite avant que l'accès mémoire soit démarré. L'idée est que lors du décodage de l'instruction d'accès mémoire, on récupére les registres utilisés, et on y accéde pour lire en avance l'adresse virtuelle. Une dernière méthode consiste à '''amortir le temps d'accès en cas de défaut dans la TLB L2'''. L'idée est de démarrer un accès à la table des pages en RAM en parallèle de l'accès à la TLB L2. La raison est que le temps d'accès à la TLB L2, avec ''hash-rehashing'', est très long. Il est sensiblement proche du quart du temps de défaut de TLB. Si en plus il fallait rajouter le temps d'accès à la table des pages en cas de défaut, le temps d'accès total serait énorme. Mais en lançant une lecture spéculative de la table des pages, le temps d'accès en cas de défaut est partiellement amorti. Le temps d'accès en cas de succès de TLB L2 reste cependant le même. ====Le ''skewing''==== La technique du ''skewing'' est assez simple à comprendre pour qui se rappelle ce qu'est un cache associatif par voie, et encore plus un cache ''skew-associative''. L'idée est d'utiliser un cache associatif par voie, mais où chaque voie est dédiée à une taille de page bien définie. Un cache associatif à trois voie pourra ainsi avoir une voie pour les pages de 4 kibioctets, une voie pour les pages de 2 mébioctets et une dernière voie pour les pages de plusieurs gibioctets. Cette méthode est conceptuellement équivalente au fait d'utiliser un cache pour chaque taille, à quelques différences près. Notamment, cela permet de mutualiser des circuits qui auraient été dupliqués en utilisant des caches séparés. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Le préchargement | prevTextLe préchargement | next=Le pipeline | nextText=Le pipeline }} </noinclude> 9snrsdhsas27xpcfdlaqm6snwaeu09n 682218 682217 2022-07-23T00:21:13Z Mewtow 31375 /* L'usage de plusieurs TLB, chacune dédiée à une taille de page */ wikitext text/x-wiki Dans le chapitre sur la mémoire virtuelle, nous avions abordé la pagination. Nous avions vu que la traduction des adresses virtuelles en adresses physiques se fait grâce à une table des pages située en mémoire RAM, qui contient les correspondances entre adresses physiques et virtuelles. Pour éviter d'avoir à lire la table des pages en mémoire RAM à chaque accès mémoire, les concepteurs de processeurs ont décidé d'implanter un cache dédié, le '''''translation lookaside buffer''''', ou TLB. Il stocke les entrées de la page des tables les plus récemment accédées. [[File:MMU principle updated.png|centre|vignette|upright=2.0|MMU avec une TLB.]] Les caches consomment beaucoup d'énergie et la TLB ne fait pas exception. Diverses estimations montrent que les TLB sont très consommatrices en énergie. Près de 5 à 15% de la consommation d'énergie d'un processeur provient de sa TLB et des circuits associés. Pour réduire cette consommation tout en gardant des performances très importantes, la TLB est conçue avec ces contraintes en tête. Notamment, la TLB est généralement un cache associatif par voie ou directement adressé, et non un cache totalement associatif. Les caches totalement associatifs consomment en effet beaucoup plus d'énergie pour fonctionner que les autres types de caches, pour des performances légèrement meilleures. Le cout en énergie ne vaut pas les performances gagnées, pour une LTB. ==L'accès à la TLB : succès et défauts d'accès== À chaque accès mémoire, le processeur vérifie si le TLB contient l'adresse physique à laquelle accéder. Si c'est le cas, le processeur n'a pas à accéder à la table des pages en mémoire RAM et lit directement l'information nécessaire depuis ce TLB. On dit que l'on a un succès d'accès à la TLB. Si la TLb ne contient pas l'adresse physique demandée, on fait face à un '''défaut d'accès à la TLB'''. L'accès à la table des pages en mémoire RAM est alors inévitable. [[File:Translation Lookaside Buffer.png|centre|vignette|upright=2.0|Translation Lookaside Buffer]] [[File:Page table actions.svg|vignette|Page table actions]] La traduction d'une adresse avec une TLB a lieu comme suit. Premièrement, le processeur (sa MMU) interroge la TLB : il envoie l'adresse virtuelle et la TLB répond. Si la TLB contient l'adresse physique associée, elle la fournit directement et le processeur au cache ou à la RAM directement. Si ce n'est pas le cas, le processeur accède à la table des pages en mémoire RAM. Si la page est en RAM, alors la table des pages renvoie l'adresse physique voulue et la TLB est mise à jour. Par contre, si la page n'est pas en RAM, mais a été swappée sur le disque dur, la page est recopiée en mémoire RAM, la table des pages est mise à jour, puis la TLB l'est ensuite. [[File:Steps In a Translation Lookaside Buffer.png|centre|vignette|upright=2.0|Steps In a Translation Lookaside Buffer]] ===Les ''page table walkers''=== Les défauts d'accès à la TLB sont gérés de deux façons : soit le processeur gère tout seul la situation, soit il délègue cette tâche au système d’exploitation. Sur les processeurs anciens, le système d'exploitation gère le défaut d'accès à la TLB. En cas de défaut, le processeur lever une exception matérielle spécialisée, qui exécute une routine d'interruption chargée de gérer le défaut. C'est cette routine qui accède à la table des pages en RAM et gère la traduction d'adresse. Mais cette solution logicielle n'a pas de bonnes performances. De nos jours, les processeurs gèrent eux-mêmes le défaut d'accès à la TLB et vont chercher d'eux-mêmes les informations nécessaires dans la table des pages. Ils disposent de circuits, les '''''page table walkers''''', qui s'occupent eux-mêmes du défaut. L'avantage en termes de performance est certain : plus besoin de lever une exception matérielle, plus besoin de faire une commutation de contexte pour exécuter la routine d'interruption, etc. De plus, ces circuits sont conçus pour gérer plusieurs défauts simultanés, ce qui a son utilité sur les processeurs superscalaires à exécution dans le désordre qu'on abordera dans quelques chapitres. ==La hiérarchie des TLB== Pour des raisons de performances, la TLB est parfois découpée en plusieurs sous-caches L1, L2, L3, etc. Sur les architectures Harvard et Harvard modifiées, on trouve parfois deux TLB séparés : un pour les accès aux instructions, et un pour les accès aux données. L'architecture standard pour les TLBs actuelles est la suivante : une TLB de niveau 1 pour les instructions, une autre TLB de niveau 1 pour les données, puis une TLB de niveaux 2 partagée entre instructions et données. D'autres structures matérielles sont présentes pour accélérer encore la traduction d'adresse ou la gestion de la TLB, comme des caches divers pour accélérer les défauts dans la TLB. [[File:Hiérarchie de TLB.png|centre|vignette|upright=2|Hiérarchie de TLB.]] La séparation en une TLB L1 pour les instructions et une pour les données est nécessaire sur les architectures à hautes performances. Les processeurs modernes peuvent exécuter plusieurs instructions simultanément, ce qui a des conséquences. Il n'est pas rare que ces processeurs cherchent à accéder à des données en même temps qu'ils chargent une ou plusieurs instructions. Le nombre de données et d'instructions accédées en même temps est généralement élevé et une TLB unique devrait gérer plusieurs dizaines d'accès en même temps. La TLB doit alors être une mémoire multiports avec beaucoup de ports, beaucoup trop de ports pour être performante ou implémentable. Utiliser deux TLB séparées élimine ce problème, en limitant le nombre de ports sur chaque TLB. Un autre problème est que le programme prend moins de place que les données, ce qui se marie mal avec une TLB unique mais colle assez bien avec deux TLB spécialisées. La solution idéale est d'avoir une TLB d'instruction plus petite que celle pour les données. ==Les pages larges et leur impact sur la TLB== Les processeurs actuels gèrent plusieurs tailles différentes pour les pages : 4 kibioctets par défaut, 2 mébioctets, voire 1 à 4 gibioctets pour les pages les plus larges. Les pages larges ont l'avantage d'utiliser la TLB de manière optimale. Pour une capacité de TLB identique, on peut adresser beaucoup plus de mémoire avec des pages larges, ce qui rend les défauts de TLB plus rares. Par contre, ces différentes tailles se marient mal avec une TLB unique. Un des problèmes est que les numéros de page physique n'ont pas le même nombre de bits suivant la taille des pages, ce qui pose des problèmes avec l'associativité de la TLB. Ce problème fait que l'usage d'une TLB unique est possible, mais pas forcément optimal. ===L'usage de plusieurs TLB, chacune dédiée à une taille de page=== L'usage d'une TLB unique pour toutes les tailles de page est possible et même courant pour la TLB de niveau 2 (L2). Mais les TLB de niveau 1 sont souvent séparées en plusieurs TLB, une par taille de page possible. Les TLB pour les pages larges sont souvent plus petites que la TLB pour les pages de 4 kibioctets, afin de profiter des économies de TLB liées aux pages larges. Un problème est que la taille de la page n'est connue du processeur qu'une fois la traduction d'adresse terminée, réalisée par la TLB. Pour résoudre ce problème, toutes les TLB L1 sont accédées en parallèle lors d'un accès mémoire et le processeur sélectionne ensuite le résultat de celle qui correspond à la taille de page voulue. [[File:TLB pour plusieurs tailles de page.png|centre|vignette|upright=2|TLB pour plusieurs tailles de page]] ===L'usage d'une TLB unique pour toutes les tailles de page=== Les TLB de niveau 2 gèrent plusieurs tailles de page en même temps. Mais les techniques pour faire cela sont assez couteuses en circuits et en performances. Aussi, les techniques utilisées pour gérer plusieurs tailles de page sont couramment implémentées sur les TLB de niveau 2, mais sont impraticables sur les TLB de niveau 1. Les deux techniques qui permettent cela sont appelées le '''''hash-rehashing''''' et le '''''skewing'''''. Elles répondent à un problème assez simple à 'expliquer : la taille de la page n'est connue du processeur qu'une fois la traduction d'adresse terminée, réalisée par la TLB. On doit accéder à la TLB en postulant que la page a une certaine taille, donc en précisant un numéro de page d'une certaine taille, pour ensuite avoir un défaut ou un succès de TLB. ====Le ''hash-rehashing''==== La première technique, celle du ''hash-rehashing'', consiste simplement à accéder la TLB en supposant que la page voulue a la taille usuelle, à savoir 4 kibioctets. En cas de succès de TLB, la page avait bien la taille supposée. Dans le cas contraire, on effectue un second accès en supposant que sa taille est de 2 mébioctets, et rebelote pour une page de 1-2 gibioctets en cas de défaut de TLB. Une fois toutes les tailles essayées, on accède à la table des pages en mémoire RAM. C'était la technique utilisée sur les processeurs Intel d’architecture Skylake et Broadwell. L'inconvénient est que les accès aux pages larges subissent une perte de performance notable, leur temps d'accès étant allongé. Cela est contrebalancé par le fait que ces tailles de page ont été inventées pour réduire le nombre de défauts de TLB, mais ces défauts sont assez rares pour l'impact soit seulement mitigé, pas compensé. L'allongement du temps d'accès peut être compensé par diverses méthodes. La première méthode est celle des '''accès simultanés à la TLB'''. Les TLB sont des caches assez performants, qui sont conçus pour être capables d'effectuer plusieurs accès en parallèle. On peut alors profiter de cette particularité pour lancer plusieurs accès au TLB en même temps, un par taille de page. Avec cette technique, les accès se faisant en parallèle et non l'un après l'autre, le temps d'accès est presque le même que si la TLB ne gérait qu'une seule taille de page. Le désavantage est que les multiples accès consomment de l'énergie et du courant, ce qui augmente la consommation énergétique de la TLB, qui est déjà très importante. La seconde solution est la '''prédiction de taille de page'''. L'idée est que le processeur tente de prédire quelle sera la taille de page, afin de tomber directement sur la bonne taille de page. Au lieu de tenter d'abord pour une page de 4 kibioctets, puis 2 mébioctets et enfin 1-2 Gibioctets, le processeur testera la taille de page la plus probable, puis la seconde plus probable, avant de tester la dernière taille de page possible. Le problème est alors de concevoir un circuit capable de réaliser cette prédiction. * Une manière simple mais extrêmement inefficace de faire cela est de mémoriser la taille des pages récemment accédées dans un cache spécialisé, qui mémorise la correspondance entre le numéro de la page et sa taille. La taille de la page est mémorisée dans ce cache, après le premier accès à cette page. Mais le défaut que le temps d'accès à ce cache de prédiction s'ajoute au temps d'accès à la TLBL2, ce qui en ruine totalement l'intérêt. Aussi, il faut trouver une solution alternative. * Une autre solution n'utilise pas le numéro de page, mais l'instruction responsable de l'accès à la TLB. Un accès à la TLB signifie un accès en mémoire RAM, qui est réalisé par une instruction. Instruction qui est identifiée par une adresse, elle-même située dans le ''program counter''. L'idée est que si une instruction est exécutée plusieurs fois, elle a tendance à accéder aux données d'une même page (localité spatiale). Ce n'est pas systématique, mais c'est une bonne supposition. On peut donc associer cette instruction à la taille de la page accédée récemment. Le cache de prédiction mémorise donc l'association entre adresse de cette instruction et taille de la page. Lors de l'accès mémoire, le ''program counter'' est récupéré et envoyé au cache de prédiction. En cas de succès d'accès, on obtient la taille de la page prédite. Cette méthode a le défaut que si plusieurs instructions accèdent à la même page, elles prendront chacune une ligne de cache dans le cache de prédiction et rien ne sera mutualisé. * Une solution alternative est de récupérer lune adresse virtuelle proche de l'adresse lue/écrite avant que l'accès mémoire soit démarré. L'idée est que lors du décodage de l'instruction d'accès mémoire, on récupére les registres utilisés, et on y accéde pour lire en avance l'adresse virtuelle. Une dernière méthode consiste à '''amortir le temps d'accès en cas de défaut dans la TLB L2'''. L'idée est de démarrer un accès à la table des pages en RAM en parallèle de l'accès à la TLB L2. La raison est que le temps d'accès à la TLB L2, avec ''hash-rehashing'', est très long. Il est sensiblement proche du quart du temps de défaut de TLB. Si en plus il fallait rajouter le temps d'accès à la table des pages en cas de défaut, le temps d'accès total serait énorme. Mais en lançant une lecture spéculative de la table des pages, le temps d'accès en cas de défaut est partiellement amorti. Le temps d'accès en cas de succès de TLB L2 reste cependant le même. ====Le ''skewing''==== La technique du ''skewing'' est assez simple à comprendre pour qui se rappelle ce qu'est un cache associatif par voie, et encore plus un cache ''skew-associative''. L'idée est d'utiliser un cache associatif par voie, mais où chaque voie est dédiée à une taille de page bien définie. Un cache associatif à trois voie pourra ainsi avoir une voie pour les pages de 4 kibioctets, une voie pour les pages de 2 mébioctets et une dernière voie pour les pages de plusieurs gibioctets. Cette méthode est conceptuellement équivalente au fait d'utiliser un cache pour chaque taille, à quelques différences près. Notamment, cela permet de mutualiser des circuits qui auraient été dupliqués en utilisant des caches séparés. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Le préchargement | prevTextLe préchargement | next=Le pipeline | nextText=Le pipeline }} </noinclude> a6x1u3a1umk4wdf5ylbnms8vax7n2qq Modèle:Octave 10 78694 682189 2022-07-22T18:52:39Z DavidL 1746 DavidL a déplacé la page [[Modèle:Octave]] vers [[Modèle:Programmation Octave]] : Nom du livre wikitext text/x-wiki #REDIRECTION [[Modèle:Programmation Octave]] fo1pkvr11yaikum39j6ge1lv1rf1rc3 Programmation Octave/Version imprimable 0 78695 682208 2022-07-22T19:03:14Z DavidL 1746 [[WL:RD]] : Initialisation de la page wikitext text/x-wiki {{Imprimable}} l2nwppfyteqee2i8qgsnxvhyyecppad L'économie de la téléphonie/Sommaire 0 78696 682211 2022-07-22T19:06:30Z DavidL 1746 Page créée avec « * [[L'économie de la téléphonie/Histoire du téléphone en France|Histoire du téléphone en France]] <!--''(lire [[L'économie de la téléphonie/Histoire du téléphone en France|Histoire du téléphone en France]])''--> * [[L'économie de la téléphonie/Géographie de la téléphonie|Géographie de la téléphonie]] * [[L'économie de la téléphonie/Le droit|Le droit]] * [[L'économie de la téléphonie/La régulation|La régulation]] * L'économie de... » wikitext text/x-wiki * [[L'économie de la téléphonie/Histoire du téléphone en France|Histoire du téléphone en France]] <!--''(lire [[L'économie de la téléphonie/Histoire du téléphone en France|Histoire du téléphone en France]])''--> * [[L'économie de la téléphonie/Géographie de la téléphonie|Géographie de la téléphonie]] * [[L'économie de la téléphonie/Le droit|Le droit]] * [[L'économie de la téléphonie/La régulation|La régulation]] * [[L'économie de la téléphonie/Les sociétés|Les sociétés]] * [[L'économie de la téléphonie/Les technologies|Les technologies]] * [[L'économie de la téléphonie/Les usages|Les usages]] * [[L'économie de la téléphonie/Le marché de gros|Le marché de gros]] * [[L'économie de la téléphonie/Le marché de détail|Le marché de détail]] * [[L'économie de la téléphonie/La segmentation des offres commerciales|La segmentation des offres commerciales]] * [[L'économie de la téléphonie/Abonnement téléphonique|Abonnement téléphonique]] * [[L'économie de la téléphonie/Disponibilité de l'offre|Disponibilité de l'offre]] * [[L'économie de la téléphonie/Performance|Performance]] * [[L'économie de la téléphonie/Emploi|Emploi]] * [[L'économie de la téléphonie/Perspectives|Perspectives]] * [[L'économie de la téléphonie/Autres lectures|Autres lectures]] {{Autocat}} 1zg7wr4ql7cwi6xh9yyx4ffol24p29p