<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Toki Rak</title>
    <description>The latest articles on Forem by Toki Rak (@tokirak).</description>
    <link>https://forem.com/tokirak</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3764861%2F2284f619-8108-4c4b-8e41-91794d4063d2.png</url>
      <title>Forem: Toki Rak</title>
      <link>https://forem.com/tokirak</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/tokirak"/>
    <language>en</language>
    <item>
      <title>J'utilise Git comme un checkpoint dans les jeux vidéo</title>
      <dc:creator>Toki Rak</dc:creator>
      <pubDate>Fri, 20 Mar 2026 22:34:38 +0000</pubDate>
      <link>https://forem.com/tokirak/jutilise-git-comme-un-checkpoint-dans-les-jeux-video-2phb</link>
      <guid>https://forem.com/tokirak/jutilise-git-comme-un-checkpoint-dans-les-jeux-video-2phb</guid>
      <description>&lt;h3&gt;
  
  
  L'idée derrière tout ça
&lt;/h3&gt;

&lt;p&gt;Quand je travaille sur plusieurs tâches en parallèle, j'oublie facilement où j'en suis. Surtout quand une urgence tombe et que je dois tout lâcher.&lt;/p&gt;

&lt;p&gt;Étant passionné de jeux vidéo, j'ai remarqué un truc : avant d'affronter un boss, on sauvegarde. Si on meurt, on reprend au checkpoint, pas au début du jeu.&lt;/p&gt;

&lt;p&gt;J'ai appliqué ce principe à Git. Résultat : je ne perds plus jamais le fil de mes développements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mon workflow en pratique
&lt;/h3&gt;

&lt;p&gt;Imaginons que je dois créer une page détail produit e-commerce avec :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Les infos du produit&lt;/li&gt;
&lt;li&gt;Les avis clients&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Étape 1 : Créer la structure de base&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Je crée ma route et j'affiche une page statique.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nt"&gt;-A&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"step 1: créer page produit avec données statiques"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Étape 2 : Rendre la page dynamique&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Je récupère les vraies données depuis la base.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nt"&gt;-A&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"step 2: récupérer données produit et rendre dynamique"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Les cheat codes (aka les mocks)
&lt;/h3&gt;

&lt;p&gt;Comme dans les jeux vidéo où on utilise des cheat codes, j'utilise des données mockées pour avancer sans attendre les vraies données.&lt;/p&gt;

&lt;p&gt;Dans notre exemple, on n'a pas encore d'avis clients. Je mock donc les données et je marque clairement ce commit :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nt"&gt;-A&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"WIP - mock avis clients (ne pas merger)"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Sauvegarder avant de changer de partie
&lt;/h3&gt;

&lt;p&gt;Comme quand un pote débarque et veut jouer à un autre jeu, je sauvegarde ma progression avant de switcher de tâche :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nt"&gt;-A&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"WIP - mise en place cache (en cours)"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pour reprendre plus tard, je fais :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git reset &lt;span class="nt"&gt;--soft&lt;/span&gt; HEAD~1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Le commit est annulé mais mes fichiers restent indexés. Exactement comme je les ai laissés. (Plus pratique que &lt;code&gt;git stash&lt;/code&gt;)&lt;br&gt;
&lt;strong&gt;Une fois la tâche terminée, je fais un commit normal sans WIP.&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Le nettoyage final (avant d'affronter le boss)
&lt;/h3&gt;

&lt;p&gt;Avant de créer ma Pull Request, je nettoie mes commits :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Avant le rebase :&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HEAD → mise en cache des données (fini)
       WIP - mock avis clients  
       step 2: données dynamiques
       step 1: page produit statique
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;L'éditeur interactif qui s'ouvre :&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# git rebase -i HEAD~4&lt;/span&gt;

reword a1b2c3d step 1: créer page produit avec données statiques
fixup e4f5g6h step 2: récupérer données produit et rendre dynamique  
drop i7j8k9l WIP - mock avis clients &lt;span class="o"&gt;(&lt;/span&gt;ne pas merger&lt;span class="o"&gt;)&lt;/span&gt;
fixup m1n2o3p mise en place cache
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Actions :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Je renomme (&lt;code&gt;reword&lt;/code&gt;) le premier commit&lt;/li&gt;
&lt;li&gt;Je garde (&lt;code&gt;fixup&lt;/code&gt;) les autres commites non wip&lt;/li&gt;
&lt;li&gt;Je supprime (&lt;code&gt;drop&lt;/code&gt;) tous les commits WIP&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;L'éditeur interactif s'ouvre à nouveau :&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Je met le vrai nom conventionnée&lt;/span&gt;
feat: ajout page détail produit avec affichage avis clients
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Résultat final :&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git log &lt;span class="nt"&gt;--oneline&lt;/span&gt;
a1b2c3d feat: ajout page détail produit avec affichage avis clients

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Mes alias pour aller plus vite
&lt;/h2&gt;

&lt;p&gt;J'ai créé deux alias Git pour faciliter ce workflow :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sauvegarder rapidement :&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; alias.wip &lt;span class="s2"&gt;"commit -am 'WIP - git unwip pour reprendre'"&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Reprendre le chantier :&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; alias.unwip &lt;span class="s2"&gt;"reset --soft HEAD~1"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Maintenant je fais juste &lt;code&gt;git wip&lt;/code&gt; et &lt;code&gt;git unwip&lt;/code&gt;. Simple et efficace.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Ce workflow m'aide à jongler entre plusieurs projets et tâches sans me perdre. C'est pas une règle universelle, juste ce qui marche pour moi.&lt;/p&gt;

&lt;p&gt;Et vous, vous sauvegardez comment vos "parties" de dev ? 🎮&lt;/p&gt;

</description>
      <category>git</category>
      <category>workflow</category>
      <category>productivity</category>
      <category>tips</category>
    </item>
    <item>
      <title>Configuration Xdebug sur PHPSTORM + Windows + WSL + Docker</title>
      <dc:creator>Toki Rak</dc:creator>
      <pubDate>Sun, 15 Feb 2026 19:45:27 +0000</pubDate>
      <link>https://forem.com/tokirak/configuration-xdebug-sur-phpstorm-windows-wsl-docker-2ian</link>
      <guid>https://forem.com/tokirak/configuration-xdebug-sur-phpstorm-windows-wsl-docker-2ian</guid>
      <description>&lt;p&gt;Si vous développez en PHP sous &lt;strong&gt;Windows&lt;/strong&gt; avec &lt;strong&gt;WSL&lt;/strong&gt; et &lt;strong&gt;Docker&lt;/strong&gt;, vous avez probablement déjà galéré avec &lt;strong&gt;XDebug&lt;/strong&gt;. Entre les IP qui changent, les containers qui ne communiquent pas avec &lt;strong&gt;PHPStorm&lt;/strong&gt;, et les configs qui marchent un jour mais plus le lendemain... c'est frustrant.&lt;/p&gt;

&lt;p&gt;J'ai perdu pas mal d'heures à faire marcher ce setup. Voici la config qui fonctionne chez moi, et surtout, les pièges à éviter.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ce dont vous avez besoin:
&lt;/h3&gt;

&lt;p&gt;Docker compose qui utilise une image docker PHP et xdebug déjà installé et activé&lt;/p&gt;

&lt;h2&gt;
  
  
  Étape 1: Trouver votre IP windows (WSL)
&lt;/h2&gt;

&lt;p&gt;Ouvrir un terminal windows (ou powershell) et executer la commande:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ipconfig
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Récupérer l'adresse IP correspondant à la configuration: &lt;br&gt;
Carte Ethernet VEthernet(WSL (Hyper-V firewall))&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm7x3dhvibetiuuudrrz1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm7x3dhvibetiuuudrrz1.png" alt=" " width="606" height="120"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Étape 2: Créer le fichier Xdebug
&lt;/h2&gt;

&lt;p&gt;Créer un fichier de configuration xdebug.ini (pour ma part je l'ai mis sur la racine du projet) et y ajouter les paramètres nécessaires:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="py"&gt;zend_extension&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;xdebug.so&lt;/span&gt;
&lt;span class="py"&gt;xdebug.mode&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;debug&lt;/span&gt;
&lt;span class="py"&gt;xdebug.client_host&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;172.22.128.1  # Remplacez par votre IP WSL&lt;/span&gt;
&lt;span class="py"&gt;xdebug.discover_client_host&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;
&lt;span class="py"&gt;xdebug.start_with_request&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;
&lt;span class="py"&gt;xdebug.client_port&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;9003  &lt;/span&gt;
&lt;span class="py"&gt;xdebug.cli_color&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Étape 3: Monter le volume dans docker compose ou docker:
&lt;/h2&gt;

&lt;p&gt;Ajouter une ligne dans le sections &lt;strong&gt;volumes&lt;/strong&gt; de docker-compose.yaml pour surcharger le fichier de configuration de xdebug dans le container php&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./xdebug.ini:/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(Ou bien directement le copier dans le même chemin dans Dockerfile lors du build si vous n'utilisez pas docker compose)&lt;/p&gt;

&lt;h2&gt;
  
  
  Étape 4: Configurer PHPStorm:
&lt;/h2&gt;

&lt;p&gt;Relancer votre projet, puis dans PHPStorm:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Activer l'écoute du debugger en cliquant sur l'icône de téléphone en haut à droite &lt;br&gt;
(ou via Run &amp;gt; Start Listening for PHP Debug Connections) &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Chargez une page de votre application. PHPStorm devrait afficher une popup "Incoming Connection from Xdebug" → Acceptez&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Allez dans Settings &amp;gt; PHP &amp;gt; Servers et vérifiez les path mappings :&lt;br&gt;
Le path de votre projet local doit pointer vers la racine de votre projet dans le container &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Les pièges courants (et comment les éviter)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;L’IP qui change&lt;/strong&gt; : Si votre config ne fonctionne pas du jour au lendemain, vérifiez votre adresse IP et mettez à jour xdebug.ini&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Plusieurs cartes « VEthernet WSL »&lt;/strong&gt; : Si vous en avez plusieurs, testez chaque IP jusqu’à trouver la bonne. Oui c’est chiant, mais c’est rapide.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mapping incorrect&lt;/strong&gt; : Si des liens/fichiers fonctionnent et pas d’autres, verifier bien que le mapping entre le projet sur PHPStorm pointe bien que sur l’absolute path du serveur&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Voilà ! Avec cette config, Xdebug devrait fonctionner sans problème dans votre environnement Windows + WSL + Docker + PHPStorm.&lt;/p&gt;

&lt;p&gt;Bon débogage ! &lt;/p&gt;

</description>
      <category>docker</category>
      <category>phpstorm</category>
      <category>xdebug</category>
      <category>wsl</category>
    </item>
  </channel>
</rss>
