Messages recommandés

PeterRabbit    371

atelier.png.8b1406a54cdae533d46a13ce18fac32f.pngATELIER #2

Où les choses vont légèrement se compliquer...

 

 

 

 

A la fin du premier atelier, je vous ai laissés sur une impression insatisfaisante : "Pourquoi nous enseigner quelque chose pour nous dire après que ce à quoi nous sommes laborieusement parvenus n'est pas la bonne méthode ? " – Pour préparer progressivement les compétences nécessaires à l'atelier #3 à venir...

Mais pour l'instant nous n'en sommes qu'à l'atelier #2 : apprendre quelques rudiments de PHP pour réécrire ponctuellement les fichiers au lieu de les écraser, sans toucher au reste du code.


Grâce à Google pour mes recherches et à l'incontournable volumineux manuel officiel de PHP, j'ai peu à peu appris à remplacer une ligne de code par une autre en utilisant ces quelques instructions :

$file="core/layout/main.php"; 
$filecontent=file_get_contents($file);
$replace=str_replace('<header', '<header class="img<?php echo rand(1, 6);?>"', $filecontent);
file_put_contents($file, $replace);

Ne vous laissez pas impressionner par le code de la troisième ligne, c'est juste pour vous donner un vrai exemple.

 

Je vous commente les instructions :

$file="core/layout/main.php";

 On associe le fichier que l'on veut modifier à la variable $file.

 

$filecontent=file_get_contents($file);

On ouvre le fichier $file, on lit son contenu et on le place dans la variable $filecontent.

 

$replace=str_replace('<header', '<header class="img<?php echo rand(1, 6);?>"', $filecontent);

On remplace le code d'origine par le nouveau code dans $filecontent et on associe le contenu modifié à la variable $replace.
La syntaxe de cette instruction est simple : str_replace('code à remplacer', 'modification à apporter', $filecontent);

 

file_put_contents($file, $replace);

On écrit le contenu modifié dans le fichier $file et on le referme.

Et on répète cette opération autant de fois qu'il le faut en fonction du nombre de modifications à apporter et du nombre de fichiers concernés.


NB : Il existe des techniques plus sophistiquées et plus condensées qui relèvent de ce qu'on appelle "codage" – merci à @EBS01 pour l'exemple qu'il me fournit très à propos ! ;)

Mais puisque celle-ci donne de bons résultats, pourquoi la compliquer, d'autant que le débutant s'y retrouvera plus facilement et qu'on peut faire du copier-coller à partir d'une maquette qu'on conservera dans un coin de son disque dur ?

 

tip.png.6c956d7271888518213ec3750735762d.pngMise en pratique
Cette technique de remplacement peut être utilisée pour corriger un code. Nous aurions pu ainsi corriger le bug d'encodage de cette façon au lieu de remplacer les fichiers. Mais on peut aussi l'employer pour ajouter du code à certains endroits. C'est ce que nous allons voir.
Je vous propose de partir du travail pratique que je vous avais demandé et que @Thispy m'a envoyé. Nous allons ajouter une police aux 27 dont dispose Zwii. Bien sûr, il suffirait d'expliquer comment faire, vu qu'il n'y a qu'une ligne à ajouter. Mais ce n'est pas notre propos et  comme l'exemple est simple, il sera plus parlant.

 

display.jpg.930d22d6737b0b0317814ba8769b5245.jpg


Une étude de l'arborescence de Zwii (cf ; "README.md") vous amènerait à constater la présence d'un répertoire "theme" parmi les "modules du cœur" de Zwii ("core/module") : vous vous doutez que c'est là que se définissent les différents paramètres qui entreront dans la composition de la feuille de style qui définit l'apparence de Zwii  ("site/data/theme.css").

 

Rendez-vous dans ce répertoire et éditez le fichier "core/module/theme/theme.php".

 

Il va s'agir d'ajouter la police "Display" par ordre alphabétique (@Thispy xD) entre les polices "Dancing script" et "Droid sans".

 

Procédons pas à pas :

  • Créez un nouveau fichier texte sur votre bureau et copiez-collez le code que j'ai commenté :
$file="core/layout/main.php"; 
$filecontent=file_get_contents($file);
$replace=str_replace('<header', '<header class="img<?php echo rand(1, 6);?>"', $filecontent);
file_put_contents($file, $replace);

tip.png.6c956d7271888518213ec3750735762d.pngCopier-coller minimise les risques de "fautes d'orthographe" : si vous oubliez la moindre virgule, c'est fichu...
Nous ne mettrons qu'une instruction par ligne pour que le code soit plus facile à lire et surtout à relire.

 

 

 

 

  • Adaptons maintenant ces lignes à ce que nous voulons faire. Il suffit juste de changer le chemin et le nom du fichier (ligne 1) ainsi que le code à remplacer et la modification à apporter (ligne 3). Je vous montre, vous appliquerez ensuite :
$file="core/module/theme/theme.php"; 
$filecontent=file_get_contents($file);
$replace=str_replace(''Dancing+Script' => 'Dancing Script',', ''Dancing+Script' => 'Dancing Script',
        'Display' => 'Display',', $filecontent);
file_put_contents($file, $replace);

La ligne 1 ne soulevant pas de questions, je vous explique le principe de la ligne 3.
En fait, pour ajouter la police "Display" à cet endroit précis, on remplace la ligne de la police précédente ("Dancing script") par deux lignes : la ligne de la police "Dancing script" à laquelle on ajoute celle de la nouvelle police "Display", sans oublier le passage à la ligne entre les deux. J'ai aussi ajouté un espace au début de la nouvelle ligne pour respecter la présentation du code.

 

Si j'ai été clair, vous avez compris qu'il faut chercher dans le script des repères précis pour s'en servir comme de points d'ancrage pour les modifications. C'est le principe des hooks (crochets) dans des CMS conçus pour recevoir de vrais plugins. On aurait d'ailleurs pu prendre appui sur la ligne suivante, celle de la police "Droid sans".

 

tp.png.ac800e9aa7e03d2d46f12080d2bd5295.pngExercice : Réécrivez la ligne 3 pour faire ce que je viens de dire !

 

 

 

 

 

Voilà, votre script est prêt !

C'est bien joli tout ça, me direz-vous, mais comment faire pour l'exécuter ?
On pourrait le placer dans un fichier spécifique, "display.php" par exemple, qu'on placerait sur le site et qu'on appellerait depuis son navigateur, mais je me suis dit que ce serait plus élégant de l'ajouter au fichier "index.php" à la racine du site de façon qu'il s'exécute juste avant que Zwii ne se lance.

 

Mise en pratique

  • Faites une copie du fichier "index.php" à la racine de la 8.45 que vous avez téléchargée pour cet atelier (on continue à travailler sur cette version) et placez-la sur votre bureau (elle s'appellera toujours "index.php").
  • Éditez-la.
  • Copiez-collez vos quatre lignes de code au niveau de la ligne 22, juste après la vérification de la version de PHP.
  • Faites-les précéder d'un petit commentaire. Vous avez le choix de la syntaxe :
/* Ceci est un commentaire dans un fichier PHP ou dans une feuille de style css */
// Ceci est un commentaire dans un fichier PHP

Comme ceci :

<?php

/**
 * This file is part of Zwii.
 *
 * For full copyright and license information, please see the LICENSE
 * file that was distributed with this source code.
 *
 * @author Rémi Jean <remi.jean@outlook.com>
 * @copyright Copyright (C) 2008-2018, Rémi Jean
 * @license GNU General Public License, version 3
 * @link http://zwiicms.com/
 */

/**
 * Vérification de la version de PHP
 */
if(version_compare(PHP_VERSION, '5.6.0', '<')) {
    exit('PHP 5.6+ required.');
}

/* Installation de la police Display */
Vos quatre lignes de code
[...]
  • Enregistrez votre fichier et copiez-le à la racine de votre site d'essais.
  • Validez le remplacement que vous propose Filezilla.
  • Tatatan ! Le verdict va tomber : connectez-vous à votre site ou rafraîchissez la page d'accueil.

 

En fait, c'est plutôt le couperet qui est tombé :S
Parse error: syntax error, unexpected 'Dancing' (T_STRING) in /home/thgfrfo/public_html/8.45tp/index.php on line 25
Une erreur d'interprétation du code due à une faute de syntaxe a bloqué le lancement de Zwii.

 

Ne vous fiez pas aux explications des messages d'erreur, elles n'identifient pas toujours/souvent la cause première du problème. Dans le cas présent, ce n'est pas le "Dancing" qui est responsable du blocage, mais une erreur d'interprétation du code due à un petit détail que je vais vous expliquer.

 

tip.png.6c956d7271888518213ec3750735762d.pngJ'en profite pour vous conseiller d'utiliser un éditeur à coloration syntaxique (NotePad++ sur Windows ou Linux, ou Geany sur Linux par exemple – désolé, je n'ai pas croqué la pomme... xD

 

 

 

 

Ce qui aurait dû attirer votre regard, c'est que les parties de la ligne comprises entre des apostrophes sont en noir (sur Geany), couleur réservée aux instructions PHP. C'est donc là qu'est le problème.
En effet, pour certains caractères, il faut expliquer à l'interpréteur PHP qu'il doit les considérer comme des caractères à écrire dans un fichier, et pas comme une partie d'une instruction à exécuter. Suis-je clair ? 
Pour cela, il faut les faire précéder d'un antislash (Alt Gr 8). En jargon, on appelle cela "échapper" un caractère.

Parmi ces caractères, il y a justement l'apostrophe dont votre ligne 3 fait un grand usage.
Vous allez donc "échapper" ces apostrophes, mais pas toutes ! Celles qui encadrent la ligne à remplacer ou les deux lignes de remplacement appartiennent au script !

 

Pour cette tâche, vous pouvez travailler indifféremment sur votre bureau ou en éditant le fichier en ligne.

  • Faites précéder la première apostrophe 'Dancing d'un antislash, comme ceci : \'Dancing. Miracle, la suite se colore en orange... mais le problème se décale d'une apostrophe...
  • Échappez donc une à une les 11 apostrophes restantes. 

Cette fois, la ligne a une couleur plus homogène et vous voyez bien les deux virgules qui structurent le code.

$replace=str_replace('\'Dancing+Script\' => \'Dancing Script\',', '\'Dancing+Script\' => \'Dancing Script\',
        \'Display\' => \'Display\',', $filecontent);

tip.png.6c956d7271888518213ec3750735762d.pngAu passage, ce travail de bénédictin vous a peut-être fait prendre conscience qu'il aurait été plus rapide d'échapper les apostrophes du code à remplacer, de copier ce code "échappé", puis d'ajouter la seconde ligne...

 

 

 

 

  • Opérez le remplacement du fichier "index.php" de votre site, soit en le copiant à nouveau, soit en enregistrant les modifications avec Filezilla.
  • Rafraîchissez la page. Ça marche, Zwii se lance !

 

Et si nous allions vérifier la bonne exécution de notre réécriture ?
Éditez le fichier "core/module/theme/theme.php" de votre site.
Bravo, la police "Display" apparaît à la ligne 44, entre "Dancing script" et "Droid Sans" ! :)
Et mince ! Elle y est deux fois ! O.o
Eh oui, aussi bizarre que ça puisse paraître, même si votre erreur de syntaxe avait bloqué le lancement de Zwii, le script s'était pourtant exécuté et le remplacement avait été fait !

 

Vous voyez donc que notre technique n'est pas parfaite  : si nous avions corrigé une ligne de code,  à la seconde exécution le script n'aurait plus trouvé le texte à remplacer. Mais dans le cas présent, la ligne qui sert d'ancrage est toujours là, et on la multiplierait à chaque connexion au site.

 

La solution au prochain épisode ?

Nous avons bien travaillé.

 

tp.png.ac800e9aa7e03d2d46f12080d2bd5295.pngJ'ai oublié de donner le travail à faire !

Envoyez-moi par MP un fichier "index.php" qui installe la police "Permanent Marker" en utiisant la technique que vous avez apprise.

Indice : Zwii se fait livrer ses polices par Google Fonts.

in_progress.png.6c1b958481a8a424bcc5549404e253d1.png

Modifié par PeterRabbit
  • Thanks 1

Partager ce message


Lien à poster
Partager sur d’autres sites
Thispy    53

Oups...

Tu n'avais pas demandé de mettre à jour notre zwii @PeterRabbit

Moi je suis à la version 8.4.8

 

Faites une copie du fichier "index.php" à la racine de la 8.45 que vous avez téléchargée pour cet atelier (on continue à travailler sur cette version) et placez-la sur votre bureau (elle s'appellera toujours "index.php").

Partager ce message


Lien à poster
Partager sur d’autres sites
PeterRabbit    371

Désolé @Thispy, il faut des mots et des phrases pour expliquer. C'est pour ça qu'il faut une semaine pour les digérer. xD

L'inconvénient de la semaine de battement, c'est que les choses me sortent de la tête à force d'en faire tout plein d'autres. Je ne sais plus ce que j'avais dit. Pour ma part, j'ai gardé une 8.45 pour ces TP. Mais peu importe, l'index de ta version ira très bien.

Partager ce message


Lien à poster
Partager sur d’autres sites
Thispy    53
Il y a 8 heures, PeterRabbit a dit :

atelier.png.8b1406a54cdae533d46a13ce18fac32f.png

Et si nous allions vérifier la bonne exécution de notre réécriture ?
Éditez le fichier "core/module/theme/theme.php" de votre site.
Bravo, la police "Display" apparaît à la ligne 44, entre "Dancing script" et "Droid Sans" ! :)
Et mince ! Elle y est deux fois ! O.o
Eh oui, aussi bizarre que ça puisse paraître, même si votre erreur de syntaxe avait bloqué le lancement de Zwii, le script s'était pourtant exécuté et le remplacement avait été fait !

 

 

 

Humm,

 

Bon voici mon fichier themes.php

Display n'apparaît pas deux fois chez moi comme tu le dis.. (ou j'ai mal vu !)

Tout mon fichier est décalé au niveau des lignes.

Voir ligne 85, 86  et 87

 

Où est mon erreur, pourquoi ce décalage...

 

theme.php

Modifié par Thispy
modification

Partager ce message


Lien à poster
Partager sur d’autres sites
PeterRabbit    371

Je vois, mais ce qu'il faudrait, c'est ton "index.php", @Thispy, sinon je ne sais pas, vu que je n'ai jamais vu ça. :beer:

Pour le reste, j'ai fait exactement ce que je vous ai dit, et j'ai même été surpris que sur ce code-ci, l'erreur n'empêche pas la réécriture.

 

PS : Je croyais qu'il te fallait une semaine pour méditer ?

Je crois que tu es bien parti pour nous proposer des "plugins".

Vas-y fonce ! 

Modifié par PeterRabbit

Partager ce message


Lien à poster
Partager sur d’autres sites
PeterRabbit    371

Je n'avais jamais pensé que je corrigerais ce genre de copies ! xD

Rien à redire. Je ne comprends pas que tout ton code se retrouve ainsi espacé -- sauf la ligne que tu as corrigée. Mais ça fonctionne tout de même, non ?

 

Puisque tu es lancé, remets un fichier "theme.php" d'origine sur ton serveur pour voir, et fais l'exercice en prenant pour appui la ligne suivante ("Droid sans").

Modifié par PeterRabbit

Partager ce message


Lien à poster
Partager sur d’autres sites
PeterRabbit    371

Désolé, @Thispy, mais l'orthographe ou la précision, c'est essentiel : relis-toi ! Si le script ne trouve pas exactement la partie à remplacer, il ne fera rien. Ce n'est pas comme les instits et les profs qui disent gentiment : "Tu as fait une petite faute, mais ce n'est pas grave, je te comprends." :|

Partager ce message


Lien à poster
Partager sur d’autres sites
PeterRabbit    371

@herve Des goûts et des couleurs... xD De toute façon, ce n'est pas le propos. 

Je t'ai envoyé ma réponse en MP pour le saut de ligne, mais autant préciser pour les autres : tu le fais au clavier !

Si j'avais montré le code, il y en a qui auraient pris peur. Mais on en parlera la prochaine fois, promis.

Merci à toi !

En attendant lundi prochain, réfléchis à ton projet : je compte sur toi.

Modifié par PeterRabbit

Partager ce message


Lien à poster
Partager sur d’autres sites
Thispy    53

Et bien, je sèche… @PeterRabbit
J'ai tourné dans tous les sens le truc sans succès !

Je n'arrive pas à installer "display" avec le "droit sans"

Un indice ?

 

	<?php	/**
 * This file is part of Zwii.
 *
 * For full copyright and license information, please see the LICENSE
 * file that was distributed with this source code.
 *
 * @author Rémi Jean <remi.jean@outlook.com>
 * @copyright Copyright (C) 2008-2018, Rémi Jean
 * @license GNU General Public License, version 3
 * @link http://zwiicms.com/
 */	/**
 * Vérification de la version de PHP
 */
if(version_compare(PHP_VERSION, '5.6.0', '<')) {
 exit('PHP 5.6+ required.');
}	/* Installation de la police Display */
$file="core/module/theme/theme.php";
$filecontent=file_get_contents($file);
$replace=str_replace('\'Droid+sans\' => \'Droid sans\',', '\'Droid+sans\' => \'Droid sans\',
        \'Display\' => \'Display\',', $filecontent);
file_put_contents($file, $replace);	/* Set locale to French */
date_default_timezone_set('Europe/Paris');
setlocale (LC_TIME, 'fra_fra', 'french');	/**
 * Initialisation de Zwii
 */
session_start();
require 'core/core.php';
$core = new core;
spl_autoload_register('core::autoload');
echo $core->router();	

Partager ce message


Lien à poster
Partager sur d’autres sites
Thispy    53
Il y a 12 heures, PeterRabbit a dit :

PS : Je croyais qu'il te fallait une semaine pour méditer ?

Je crois que tu es bien parti pour nous proposer des "plugins".

Vas-y fonce ! 

 

Je ne trouve pas, une semaine me convient très bien. (emploi du temps plus que chargé)
J'étais bien parti, mais là je bug et je n'aime pas ne pas comprendre ce qui ne va pas, donc je veux pouvoir installer "display" avec ta position de police "Droit sans"

Partager ce message


Lien à poster
Partager sur d’autres sites
PeterRabbit    371
il y a 51 minutes, Thispy a dit :

 

Je ne trouve pas, une semaine me convient très bien. (emploi du temps plus que chargé)
J'étais bien parti, mais là je bug et je n'aime pas ne pas comprendre ce qui ne va pas, donc je veux pouvoir installer "display" avec ta position de police "Droit sans"

 

Rappelle-toi, @Thispy, au début, tu m'as reproché de de pas vous laisser réfléchir ! xD

Ne te laisse pas embrumer les connexions neuronales : ce n'est pas du PHP (tu as tout ce qu'il faut pour le faire) mais de la simple déduction : qu'avons-nous fait pour installer "Display" après "Dancing script" ? Que faut-il donc faire pour installer "Display" avant "DroId sans" ? Tu m'as demandé un indice, je ne t'en dirai donc pas davantage.

 

Mais t'inquiète, j'apprends moi aussi : grâce à @EBS01 et à ce qu'il m'a envoyé, mon codage niveau CP va singulièrement progresser ! :)

Modifié par PeterRabbit

Partager ce message


Lien à poster
Partager sur d’autres sites
Thispy    53

Je dois reproduire l'erreur suivante :

Parse error: syntax error, unexpected 'Dancing' (T_STRING) in /home/thgfrfo/public_html/8.45tp/index.php on line 25

Pour re modifier part après avec les " \ " pour que celui-ci s'installe...

Je ne te demande pas la réponse @PeterRabbit juste me dire si je suis dans la bonne direction ou pas ...
Donc un OUI (tu es dans la bonne direction.) ou un NON (cherche encore.)

Merci,

Partager ce message


Lien à poster
Partager sur d’autres sites
PeterRabbit    371

@Thispy Ne t'inquiète pas, j'ai compris ce que tu attends et je te laisse réfléchir. Mais c'est "Non" . Tu ne préférerais pas "Froid" ou "Chaud" ? Je pourrais nuancer. Mais là, c'est "Froid". :(

Partager ce message


Lien à poster
Partager sur d’autres sites
EBS01    14

Bonjour,

 

quelques axes d'améliorations pour la création de plugin :

 

1) Prévoir l'installation en "2 passes" :

  1. première passe sans faire réellement les modifications, juste vérifier que toutes les chaînes que l'on doit remplacer existent
  2. si tout est ok, effectuer réellement les modifications. Sinon afficher un message d'erreur

Pourquoi cela ?

Imaginons que l'utilisateur souhaite installer le plugin (nommé B) mais qu'il a auparavant installé un autre plugin (nommé A) ayant touché les mêmes fichiers; si le plugin modifie 3 fichiers et que la modification du dernier fichier ne peut se faire car il ne retrouve le texte à changer, l'installation ne dit rien (aucune erreur) mais le plugin n'est pas installé correctement.

 

2) La fonction "str_replace" est bien mais la chaîne recherchée doit être exacte; si dans le fichier à modifier, il y a une quelques modifications avec des espaces en plus, des tabulations, etc...le remplacement ne se fera pas.
Il est préférable d'utiliser des expressions régulières. C'est un peu plus complexe mais cela permet beaucoup de choses (petit outil en ligne pour tester des expressions régulières regex101.com)

 

3) il serait souhaitable de prévoir de stocker dans le fichier Json les informations des plugins installés.

Lors d'une mise à jour Zwii, ce dernier devrait au minimum indiquer que des plugins sont présents et qu'il faudra les réinstaller à la suite de la mise à jour (là c'est le développeur Zwii qui doit prévoir cela).

 

4) Dans Zwii, il devrait y avoir une page permettant de lister les plugins présents et leur version (un exemple de plugin à développer....) et donner la possibilité de le désinstaller directement via cette interface.
Cela sous-entend que le code de désinstallation doit être stocké dans un fichier permanent dans l'arborescence de Zwii qui serait déposé lors de l'installation (et non dans le fichier index.php comme maintenant)

 

Je m'arrête là pour aujourd'hui.

J'essaierai de déposer un plugin sur la proposition que j'ai évoquée dans ce message :

 

Jérôme

 

Modifié par EBS01
orthographe
  • Like 1
  • Confused 1

Partager ce message


Lien à poster
Partager sur d’autres sites
PeterRabbit    371

Merci pour ton implication, @EBS01 Jérôme, mais ce n'était qu'un petit atelier d’initiation et de motivation. :$

Je sais très bien que la technique est imparfaite, je l'ai d'ailleurs précisé et répété. Si j'avais une baraque, je te dirais que tu viens de me la casser. xD

Ça fait un moment que nous cherchons quelqu'un de compétent, mais la seule fois où il s'en est présenté un, il est parti en courant lorsqu'il s'est rendu compte qu'il était tombé dans une tanière de blaireaux -- je ne parle pas de @Rémi, le concepteur, cela va sans dire...

 

Resteras-tu ? Parce que j'aurais une question technique à te poser (en MP).

 

;)

 

 

Modifié par PeterRabbit

Partager ce message


Lien à poster
Partager sur d’autres sites
Thispy    53

@EBS01

 

Et bien si tu penses que nous allons arriver à ce que tu désires, je pense que tu seras pensionné ou malheureusement plus de ce monde.. :S

Je ne savais même pas, c'était quoi un hook ! o.O
À part le capitaine hook :D


Soit bonne initiative pour l'atelier, mais ne soit pas pressé ! (Je suis nul dans le codage je ne comprend rien)
Enfin, si tu as besoin de quelque chose d'urgent, je suppose que tu vas mettre tes mains dans le cambouis et que tu feras le tout en deux temps trois mouvements !

 

J'arrive même pas à faire l'atelier 2 !

Après plus de 6 heures dessus, je vous dit pas comment j'en ai plein le postérieur...

Bienvenue à toi, ;)

 

 

  • Haha 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant

  • Contenu similaire

    • Par PeterRabbit
      Vous avez tous des tas d'idées pour apporter des petits plus à Zwii ou corriger ce que vous considérez comme des défauts.
      Certains ont même trouvé le moyen d'y parvenir.
      Plutôt qu'un tuto, pourquoi ne pas proposer un plugin, simple à installer, à désinstaller et facile à partager ?
      Cet atelier vous aidera à le confectionner.
      Venez avec votre projet, mais ne soyez pas trop ambitieux : il faudra que vous le meniez à bien pour l'offrir à la communauté des utilisateurs.
       
      A bientôt. 
       
      Inscrivez-vous pour participer à l'atelier ! Vous serez ainsi prévenus des nouveaux posts.
      On peut prendre le train en marche.