<?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>DEV Community: Patrice Eon</title>
    <description>The latest articles on DEV Community by Patrice Eon (@patrice2).</description>
    <link>https://dev.to/patrice2</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%2F2455392%2F0eff1c70-29d9-4919-8f9b-fcb3062679e3.png</url>
      <title>DEV Community: Patrice Eon</title>
      <link>https://dev.to/patrice2</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/patrice2"/>
    <language>en</language>
    <item>
      <title>Guide d'apprentissage pour maîtriser GitHub Copilot</title>
      <dc:creator>Patrice Eon</dc:creator>
      <pubDate>Tue, 23 Dec 2025 11:37:36 +0000</pubDate>
      <link>https://dev.to/onepoint/guide-dapprentissage-pour-maitriser-github-copilot-283b</link>
      <guid>https://dev.to/onepoint/guide-dapprentissage-pour-maitriser-github-copilot-283b</guid>
      <description>&lt;p&gt;GitHub Copilot est le nouvel allié des développeurs pour coder plus vite et plus intelligemment.&lt;/p&gt;

&lt;p&gt;Mais soyons honnêtes : la plupart d'entre nous l'utilisent comme une simple autocomplétion augmentée. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Résultat ?&lt;/strong&gt; On exploite à peine 20 % de sa véritable puissance. C'est un peu comme avoir une Ferrari et ne jamais dépasser la deuxième vitesse. &lt;/p&gt;

&lt;p&gt;En effet &lt;strong&gt;en 2025, GitHub Copilot a pris du muscle&lt;/strong&gt;. Fini l'assistant timide qui suggère trois lignes de code. Place à un &lt;strong&gt;partenaire IA complet&lt;/strong&gt;, dopé aux modèles de pointe (Claude Sonnet 4.5, GPT-5, Gemini 3 Pro). Il comprend désormais votre code dans son ensemble, orchestre des tâches complexes en autonomie et s'intègre parfaitement à votre écosystème de développement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ce guide existe pour une raison simple&lt;/strong&gt; : vous faire passer de 20 % à 100 % d'utilisation. Grâce à &lt;strong&gt;10 techniques éprouvées&lt;/strong&gt; et des protocoles avancés, vous découvrirez comment transformer Copilot d'un simple assistant en &lt;strong&gt;copilote stratégique&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Parce qu'au final, l'objectif n'est pas juste de coder plus vite. C'est de coder &lt;strong&gt;plus intelligemment&lt;/strong&gt;, en laissant l'IA gérer la vitesse pendant que vous vous concentrez sur ce qui compte vraiment : l'intelligence de vos solutions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table des matières
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
Partie I : Installation et présentation des fondamentaux (démarrage en douceur)

&lt;ul&gt;
&lt;li&gt;1.1 GitHub Copilot dans votre IDE vs GitHub Copilot CLI&lt;/li&gt;
&lt;li&gt;1.2 Installer GitHub Copilot sur VS Code&lt;/li&gt;
&lt;li&gt;1.3 Installer GitHub Copilot sur IntelliJ IDEA&lt;/li&gt;
&lt;li&gt;1.4 Obtenir un compte GitHub avec accès Copilot&lt;/li&gt;
&lt;li&gt;1.5 Installer GitHub Copilot CLI&lt;/li&gt;
&lt;li&gt;
1.6 GitHub Copilot dans votre IDE : Aperçu des contrôles et fonctionnalités
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

Partie II : Maîtriser les leviers de productivité

&lt;ul&gt;
&lt;li&gt;2.1 Maîtriser les Commandes Slash&lt;/li&gt;
&lt;li&gt;2.2 Utiliser les Variables de Contexte&lt;/li&gt;
&lt;li&gt;2.3 Créer des Instructions Personnalisées&lt;/li&gt;
&lt;li&gt;2.4 Stratégie d'ouverture de Fichiers&lt;/li&gt;
&lt;li&gt;2.5 Commenter le flux de travail&lt;/li&gt;
&lt;li&gt;2.6 Le Dialogue itératif&lt;/li&gt;
&lt;li&gt;2.7 Fichiers de prompts personnalisés&lt;/li&gt;
&lt;li&gt;2.8 Glisser-Déposer de Contexte&lt;/li&gt;
&lt;li&gt;2.9 Stratégie de Nettoyage de Contexte&lt;/li&gt;
&lt;li&gt;
2.10 Maîtriser la Sélection de Code
&lt;/li&gt;
&lt;li&gt;2.11 Créer des issues à partir de captures d’écran&lt;/li&gt;
&lt;li&gt;2.12 Utiliser Github Copilot partout… Mais tirer le meilleur du plugin dans VS Code&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

Partie III : Écosystème et Agenticité Avancée

&lt;ul&gt;
&lt;li&gt;3.1 Le Protocole de Contexte Modèle (MCP)&lt;/li&gt;
&lt;li&gt;3.2 Qu’est‑ce que « Awesome GitHub Copilot » ?&lt;/li&gt;
&lt;li&gt;3.3 Custom agents&lt;/li&gt;
&lt;li&gt;3.4 Maîtriser le GitHub Copilot CLI&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

Partie IV : Qualité, sécurité et rôle humain (Les Pièges)

&lt;ul&gt;
&lt;li&gt;4.1 Prendre les suggestions de Copilot pour des vérités&lt;/li&gt;
&lt;li&gt;4.2 Ignorer la sécurité du code&lt;/li&gt;
&lt;li&gt;4.3 Utiliser Copilot comme béquille pour les fondamentaux&lt;/li&gt;
&lt;li&gt;4.4 Surcompliquer des solutions simples&lt;/li&gt;
&lt;li&gt;4.5 Ne pas fournir de contexte pour de meilleures suggestions&lt;/li&gt;
&lt;li&gt;4.6 Ne pas garder Copilot dans le bon scope&lt;/li&gt;
&lt;li&gt;4.7 Zapper les tests parce que « Copilot l’a écrit »&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Conclusion : Codez plus Intelligemment, pas seulement plus vite&lt;/li&gt;

&lt;/ul&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Partie I : Installation et présentation des fondamentaux (démarrage en douceur)
&lt;/h1&gt;

&lt;p&gt;Cette partie couvre l'installation, les accès, et la compréhension des modes d'interaction avec Github Copilot.&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1.1 GitHub Copilot dans votre IDE vs GitHub Copilot CLI 🖊️
&lt;/h2&gt;

&lt;p&gt;GitHub Copilot se déploie sur &lt;strong&gt;deux fronts stratégiques&lt;/strong&gt; : directement intégré à votre IDE préféré (VS Code, IntelliJ...) pour une assistance en temps réel, et en ligne de commande pour orchestrer vos workflows depuis le terminal.&lt;/p&gt;

&lt;h3&gt;
  
  
  GitHub Copilot dans votre IDE
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Fonctionnalités :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complétion de code en temps réel (ligne ou fonction complète)&lt;/li&gt;
&lt;li&gt;Copilot Chat intégré pour poser des questions ou générer des snippets&lt;/li&gt;
&lt;li&gt;Intégration IDE : coloration, prévisualisation, acceptation avec &lt;code&gt;Tab&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Support multi-langages : Python, Java, JS, C++, Go, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Usage typique :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Saisie de code et suggestions automatiques&lt;/li&gt;
&lt;li&gt;Idéal pour une &lt;strong&gt;assistance immédiate et interactive&lt;/strong&gt; dans l’éditeur&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  GitHub Copilot CLI
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Fonctionnalités :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Assistant IA dans le terminal, indépendant de l’éditeur&lt;/li&gt;
&lt;li&gt;Exploration de projet (fichiers, dépendances, structure)&lt;/li&gt;
&lt;li&gt;Génération et modification de code via prompts en langage naturel&lt;/li&gt;
&lt;li&gt;Exécution de commandes shell suggérées (avec confirmation)&lt;/li&gt;
&lt;li&gt;Refactoring et workflows multi-étapes automatisés&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Usage typique :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Travailler depuis le terminal, générer ou corriger du code&lt;/li&gt;
&lt;li&gt;Idéal pour &lt;strong&gt;workflows scriptables ou projets distants&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Comparaison rapide
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fonctionnalité&lt;/th&gt;
&lt;th&gt;Copilot VS Code&lt;/th&gt;
&lt;th&gt;Copilot CLI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Suggestions inline de code&lt;/td&gt;
&lt;td&gt;✅ Oui&lt;/td&gt;
&lt;td&gt;❌ Non&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chat intégré&lt;/td&gt;
&lt;td&gt;✅ Oui&lt;/td&gt;
&lt;td&gt;❌ Terminal-style&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modification de fichiers&lt;/td&gt;
&lt;td&gt;✅ Oui&lt;/td&gt;
&lt;td&gt;✅ Oui&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exécution commandes shell&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Oui&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Analyse globale du projet&lt;/td&gt;
&lt;td&gt;Limité&lt;/td&gt;
&lt;td&gt;✅ Oui&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Indépendant de l’éditeur&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Oui&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Automatisation &amp;amp; workflows complexes&lt;/td&gt;
&lt;td&gt;Moyen&lt;/td&gt;
&lt;td&gt;✅ Oui&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Résumé :&lt;/strong&gt; VS Code pour coder efficacement au quotidien, CLI pour gérer et transformer des projets depuis le terminal.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1.2 Installer GitHub Copilot sur VS Code 🧩
&lt;/h2&gt;

&lt;p&gt;La documentation officielle pour installer GitHub Copilot dans VS Code se trouve ici : &lt;a href="https://code.visualstudio.com/docs/copilot/setup?ref_product=copilot&amp;amp;ref_type=engagement&amp;amp;ref_style=text#_set-up-copilot-in-vs-code" rel="noopener noreferrer"&gt;Copilot VS Code extension&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ouvrir VS Code&lt;/li&gt;
&lt;li&gt;Aller dans la &lt;strong&gt;Marketplace des extensions&lt;/strong&gt; (&lt;code&gt;Ctrl+Shift+X&lt;/code&gt; ou &lt;code&gt;Cmd+Shift+X&lt;/code&gt; sur Mac)&lt;/li&gt;
&lt;li&gt;Rechercher &lt;strong&gt;GitHub Copilot&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Cliquer sur &lt;strong&gt;Installer&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Se connecter à GitHub quand demandé (OAuth)&lt;/li&gt;
&lt;li&gt;Les suggestions apparaissent automatiquement&lt;/li&gt;
&lt;li&gt;Pour activer/désactiver : &lt;code&gt;Ctrl+Shift+P&lt;/code&gt; / &lt;code&gt;Cmd+Shift+P&lt;/code&gt; → taper &lt;strong&gt;Copilot&lt;/strong&gt; → &lt;code&gt;Enable/Disable GitHub Copilot&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Astuce :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configurer les suggestions dans &lt;code&gt;Fichier → Préférences → Paramètres → GitHub Copilot&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Fonctionne avec Python, Java, JS, C++, Go, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1.3 Installer GitHub Copilot sur IntelliJ IDEA 🧩
&lt;/h2&gt;

&lt;p&gt;La documentation officielle pour installer GitHub Copilot dans IntelliJ (mais également les autres IDE supporté) se trouve ici : &lt;a href="https://docs.github.com/fr/copilot/how-tos/set-up/install-copilot-extension?tool=jetbrains" rel="noopener noreferrer"&gt;Copilot Jetbrains extension&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ouvrir IntelliJ IDEA&lt;/li&gt;
&lt;li&gt;Aller dans &lt;strong&gt;File → Settings → Plugins&lt;/strong&gt; (&lt;code&gt;Preferences → Plugins&lt;/code&gt; sur Mac)&lt;/li&gt;
&lt;li&gt;Cliquer sur &lt;strong&gt;Marketplace&lt;/strong&gt;, chercher &lt;strong&gt;GitHub Copilot&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Cliquer sur &lt;strong&gt;Installer&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Redémarrer IntelliJ&lt;/li&gt;
&lt;li&gt;Se connecter à GitHub pour activer Copilot&lt;/li&gt;
&lt;li&gt;Les suggestions apparaissent automatiquement lors de la saisie de code&lt;/li&gt;
&lt;/ol&gt;

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

&lt;ul&gt;
&lt;li&gt;Activer/désactiver : &lt;code&gt;Settings → GitHub Copilot&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Utilisable aussi dans le terminal intégré pour générer des snippets&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1.4 Obtenir un compte GitHub avec accès Copilot 📝
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Étape 1 : Créer un compte GitHub
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Aller sur &lt;a href="https://github.com/join" rel="noopener noreferrer"&gt;https://github.com/join&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Remplir le formulaire (nom d’utilisateur, email, mot de passe)&lt;/li&gt;
&lt;li&gt;Confirmer votre email&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Étape 2 : Activer GitHub Copilot
&lt;/h3&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%2Fkp2gq897vhsbt33c01ak.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%2Fkp2gq897vhsbt33c01ak.png" alt="GitHub Sign Up" width="634" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Type d’abonnement&lt;/th&gt;
&lt;th&gt;Coût&lt;/th&gt;
&lt;th&gt;Étapes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;0$&lt;/td&gt;
&lt;td&gt;1. Aller sur &lt;a href="https://github.com/features/copilot" rel="noopener noreferrer"&gt;https://github.com/features/copilot&lt;/a&gt;&lt;br&gt;2. Cliquer sur &lt;strong&gt;Free&lt;/strong&gt;&lt;br&gt;3. Suivre l’activation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;~10$/mois ou 100$/an&lt;/td&gt;
&lt;td&gt;Aller sur &lt;a href="https://github.com/settings/billing" rel="noopener noreferrer"&gt;https://github.com/settings/billing&lt;/a&gt; → entrer les informations de paiement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;Pro+&lt;/td&gt;
&lt;td&gt;~39$/mois ou 390$/an&lt;/td&gt;
&lt;td&gt;Aller sur &lt;a href="https://github.com/settings/billing" rel="noopener noreferrer"&gt;https://github.com/settings/billing&lt;/a&gt; → entrer les informations de paiement&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  Alternative : Abonnement Etudiant (gratuit)
&lt;/h4&gt;

&lt;p&gt;Aller sur &lt;a href="https://education.github.com/pack" rel="noopener noreferrer"&gt;GitHub Student Developer Pack&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Étape 3 : Vérifier l’accès
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Aller sur &lt;a href="https://github.com/features/copilot" rel="noopener noreferrer"&gt;https://github.com/features/copilot&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Vérifier le message &lt;strong&gt;“You have access”&lt;/strong&gt; ou la période d’essai en cours&lt;/li&gt;
&lt;li&gt;Installer l’extension dans VS Code ou IntelliJ et commencer à coder&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1.5 Installer GitHub Copilot CLI 🚀
&lt;/h2&gt;

&lt;p&gt;GitHub Copilot CLI, permet de déléguer une tâche à l'IA directement dans votre terminal — exit l'éditeur de code. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pourquoi l'installer maintenant ?&lt;/strong&gt; Parce que l'usage agentique avancé (détaillé plus loin dans ce guide) repose sur cette base. &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%2Fhg2tv85kml942q2vnyyd.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%2Fhg2tv85kml942q2vnyyd.png" alt="Interface CLI Github Copilot" width="549" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Prérequis
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Un compte GitHub avec accès à Copilot activé (voir section précédente)&lt;/li&gt;
&lt;li&gt;Node.js version 20 ou supérieure installé&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Étapes d'installation
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Ouvrir votre terminal&lt;/li&gt;
&lt;li&gt;Installer l'extension GitHub CLI si ce n'est pas déjà fait :
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Sur macOS/Linux avec Homebrew&lt;/span&gt;
brew &lt;span class="nb"&gt;install &lt;/span&gt;gh

&lt;span class="c"&gt;# Sur Windows avec winget&lt;/span&gt;
winget &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--id&lt;/span&gt; GitHub.cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Se connecter à GitHub :
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gh auth login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Installer l'extension Copilot CLI :
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gh extension &lt;span class="nb"&gt;install &lt;/span&gt;github/gh-copilot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Vérifier l'installation :
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gh copilot &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Utilisation basique
&lt;/h3&gt;

&lt;p&gt;Une fois installé, vous pouvez utiliser Copilot directement dans le terminal :&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;# Demander de l'aide sur une commande&lt;/span&gt;
gh copilot suggest &lt;span class="s2"&gt;"comment lister tous les fichiers modifiés dans les 7 derniers jours"&lt;/span&gt;

&lt;span class="c"&gt;# Expliquer une commande complexe&lt;/span&gt;
gh copilot explain &lt;span class="s2"&gt;"git rebase -i HEAD~3"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;La documentation complète est disponible sur : &lt;a href="https://docs.github.com/fr/copilot/using-github-copilot/using-github-copilot-in-the-command-line" rel="noopener noreferrer"&gt;GitHub Copilot CLI Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Utilisez &lt;code&gt;gh copilot --help&lt;/code&gt; pour voir toutes les commandes disponibles&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1.6 GitHub Copilot dans votre IDE : Aperçu des contrôles et fonctionnalités 🎛️
&lt;/h2&gt;

&lt;p&gt;N’utiliser qu’un prompt basique (comme ci‑dessous) sans exploiter les autres fonctionnalités utiles de GitHub Copilot peut sembler assez limitant.&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%2Fpvkw4v5n0wwhfzay60gx.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%2Fpvkw4v5n0wwhfzay60gx.png" alt="Prompt Chat Github Copilot" width="614" height="322"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;C’est pourquoi je partage une collection d’astuces pratiques; vous en reconnaîtrez certaines, mais j’espère que quelques‑unes vous inspireront à tirer pleinement parti de ce que Copilot peut offrir.&lt;/p&gt;




&lt;h3&gt;
  
  
  1.6.1 Les contrôles du panneau de chat
&lt;/h3&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%2F1kzfhnsrcgh85rf6ccq5.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%2F1kzfhnsrcgh85rf6ccq5.png" alt="Exemple prompt" width="390" height="122"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Configurer un nouveau contexte pour vos prompts. Utile pour repartir à zéro sur des tâches non liées.&lt;/li&gt;
&lt;li&gt; Réouvrir les contextes de prompts historiques utilisés auparavant. Utile pour basculer entre différents contextes.&lt;/li&gt;
&lt;li&gt; Générer des fichiers de prompt, des instructions, etc. (voir la section Meta Prompting ci‑dessous)&lt;/li&gt;
&lt;li&gt; Options supplémentaires de configuration de la fenêtre de chat (prompt)&lt;/li&gt;
&lt;li&gt; Maximiser votre fenêtre de chat (prompt)&lt;/li&gt;
&lt;li&gt; Masquer votre fenêtre de chat (prompt)&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  1.6.2 Modes Agent, Ask, Edit, Plan et Configure
&lt;/h3&gt;

&lt;p&gt;Choisissez comment vous voulez que GitHub Copilot vous aide. Dans beaucoup de cas, vous utiliserez simplement l’&lt;strong&gt;Agent&lt;/strong&gt;. Difficile de voir pourquoi on aurait encore besoin de &lt;strong&gt;Ask&lt;/strong&gt; ou &lt;strong&gt;Edit&lt;/strong&gt; une fois qu’on a l’&lt;strong&gt;Agent&lt;/strong&gt;, utilisé pour notre &lt;em&gt;Vibe Programming&lt;/em&gt; !&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%2Fhhf180gvsry09fvsaix3.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%2Fhhf180gvsry09fvsaix3.png" alt="Options chat Github Copilot" width="612" height="325"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En réalité, ces trois modes répondent à des &lt;strong&gt;intentions différentes&lt;/strong&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ask&lt;/strong&gt; est le mode &lt;em&gt;conversation et compréhension&lt;/em&gt;. Il sert à poser des questions, demander des explications, explorer une API, comprendre un bout de code ou valider une approche &lt;strong&gt;sans modifier votre code&lt;/strong&gt;. C’est idéal pour réfléchir, apprendre ou lever un doute rapidement.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Edit&lt;/strong&gt; est le mode &lt;em&gt;chirurgical&lt;/em&gt;. Vous sélectionnez du code et demandez une transformation précise : refactoriser, renommer, optimiser, traduire un commentaire, corriger un bug local. Copilot agit uniquement sur la zone ciblée, sans initiative au-delà de ce que vous avez demandé. Parfait quand vous voulez &lt;strong&gt;garder un contrôle strict&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Agent&lt;/strong&gt; est le mode &lt;em&gt;autonome et orienté objectif&lt;/em&gt;. Vous lui donnez une intention globale (« ajoute l’authentification », « implémente cette feature », « corrige les tests cassés ») et il explore le projet, crée ou modifie plusieurs fichiers, exécute des actions et itère. C’est le compagnon idéal pour le &lt;em&gt;Vibe Programming&lt;/em&gt;, quand vous voulez avancer vite et laisser Copilot prendre des décisions.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 En résumé :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ask&lt;/strong&gt; = comprendre et discuter
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edit&lt;/strong&gt; = modifier précisément
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent&lt;/strong&gt; = déléguer et construire
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Les trois sont complémentaires : &lt;strong&gt;Agent pour aller vite&lt;/strong&gt;, &lt;strong&gt;Edit pour ajuster&lt;/strong&gt;, &lt;strong&gt;Ask pour comprendre&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Passer par &lt;strong&gt;Configure custum Agents&lt;/strong&gt; est utile pour fournir de meilleures instructions à l’agent afin de permettre des prompts plus puissants. Vous pouvez en savoir plus loin dans l’article.&lt;/p&gt;




&lt;h3&gt;
  
  
  1.6.3 Sélection des modèles LLM
&lt;/h3&gt;

&lt;p&gt;Sélectionnez le modèle LLM que vous souhaitez utiliser. Certains modèles sont meilleurs que d’autres. D’après mon expérience, Claude Sonnet est plus pertinent que GPT.&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%2Fg1smdngj85ercnkww860.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%2Fg1smdngj85ercnkww860.png" alt="Options choix modèles Github Copilot" width="611" height="316"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mais attention, l’utilisation des modèles est limitée par le quota de requêtes indiqué par 0x, 1x et 3x. Ce sont des multiplicateurs appliqués à votre quota de requêtes premium.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;0x : utilisation illimitée&lt;/li&gt;
&lt;li&gt;1x : exactement votre quota de requêtes&lt;/li&gt;
&lt;li&gt;3x : 3× votre quota de requêtes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Donc, utilisez‑les avec parcimonie selon vos besoins.&lt;/p&gt;

&lt;p&gt;Le &lt;strong&gt;mode Agent&lt;/strong&gt; de GitHub Copilot est devenu l’un des meilleurs agents de code depuis quelques mois. &lt;br&gt;
Il peut analyser votre projet entier, traiter des issues GitHub, rédiger des pull requests, et même aider à écrire des tests.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quel modèle fonctionne réellement le mieux en mode Agent de Copilot ?&lt;/strong&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Gemini 3 Pro : Le débogueur UI
&lt;/h4&gt;

&lt;p&gt;Gemini 3 Pro de Google apportent quelque chose d’unique : un &lt;strong&gt;véritable raisonnement multimodal&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;Cela signifie qu’il peut comprendre &lt;strong&gt;code, texte, images et même diagrammes&lt;/strong&gt; en une seule passe.&lt;/p&gt;

&lt;p&gt;Idéal pour :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Débogage UI ou visuel&lt;/li&gt;
&lt;li&gt;Analyse code + documents&lt;/li&gt;
&lt;li&gt;Pipelines de données en entreprise&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;✅ Excellent pour le raisonnement visuel
&lt;/li&gt;
&lt;li&gt;✅ Rapide, économique et scalable
&lt;/li&gt;
&lt;li&gt;✅ Excelle dans le traitement parallèle et l’orchestration d’outils&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Inconvénients :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ Donne parfois des solutions génériques pour des tâches générales.
&lt;/li&gt;
&lt;li&gt;❌ Moins « réfléchi » que Claude pour le raisonnement profond.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  GPT-5 : Le penseur profond
&lt;/h4&gt;

&lt;p&gt;Si votre travail implique du &lt;strong&gt;raisonnement multi-étapes&lt;/strong&gt;, du &lt;strong&gt;débogage complexe&lt;/strong&gt; ou une &lt;strong&gt;analyse au niveau de l’architecture&lt;/strong&gt;, GPT-5 brille — mais il faut bien l’instruire avec des prompts. Ses capacités d’analyse surpassent de nombreux autres modèles, et il peut résoudre des bugs complexes tout en offrant une vue d’ensemble plus claire du scénario.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Idéal pour :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gros refactorings multi-fichiers&lt;/li&gt;
&lt;li&gt;Raisonnement et débogage profonds&lt;/li&gt;
&lt;li&gt;Projets nécessitant une compréhension contextuelle longue&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;✅ Très fort en raisonnement logique
&lt;/li&gt;
&lt;li&gt;✅ Gère texte + vision (excellent pour les diffs UI et captures d’écran [&lt;em&gt;pas encore testé&lt;/em&gt;])
&lt;/li&gt;
&lt;li&gt;✅ Modes de raisonnement contrôlables&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Inconvénients :&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ Plus lent que les modèles légers.
&lt;/li&gt;
&lt;li&gt;❌ Moins économique pour les petits projets&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Vous vous sentez bloqué ? Revenez au point de départ et expliquez tout le cas d’usage. &lt;em&gt;Boom&lt;/em&gt; — c’est probablement le meilleur modèle pour résoudre ces casse-têtes. Un peu lent, mais efficace.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;
  
  
  Claude Sonnet 4.5 : Le polyvalent raffiné
&lt;/h4&gt;

&lt;p&gt;S’il y a un modèle qui se rapproche &lt;em&gt;le plus d’un ingénieur senior&lt;/em&gt;, c’est &lt;strong&gt;Claude Sonnet 4.5&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Développé par Anthropic, Claude est reconnu pour sa &lt;strong&gt;clarté, sa fiabilité&lt;/strong&gt; et sa capacité à gérer des &lt;strong&gt;immenses bases de code&lt;/strong&gt; — jusqu’à &lt;strong&gt;1 million de tokens&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Idéal pour :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dépôts de niveau entreprise&lt;/li&gt;
&lt;li&gt;Tâches autonomes de plusieurs heures&lt;/li&gt;
&lt;li&gt;Sorties sûres et à faible hallucination&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;✅ Gère d’énormes fenêtres de contexte
&lt;/li&gt;
&lt;li&gt;✅ Excellent pour les grands monorepos et les refactorings
&lt;/li&gt;
&lt;li&gt;✅ Faible taux d’hallucination et ton cohérent&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Inconvénients :&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ Limité par le débit sur les configurations gratuites ou partagées
&lt;/li&gt;
&lt;li&gt;❌ Tarification légèrement premium&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Avis personnel :&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Claude Sonnet génère généralement un code plus propre et plus fiable que les autres. Mais quand vous atteignez les limites de débit, c’est frustrant — surtout lors de longues sessions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Astuce :&lt;/strong&gt; Pour des agents longue durée (comme des migrations de données ou des audits de dépôt), Claude Sonnet 4.5 est le choix le plus sûr.&lt;/p&gt;


&lt;h2&gt;
  
  
  1.6.4 Tableau de bord d’utilisation de Copilot
&lt;/h2&gt;

&lt;p&gt;Vous pouvez voir combien vous avez utilisé de requêtes premium ce mois‑ci. Avec un abonnement PRO payant, vous avez un quota mensuel de 300 requêtes.&lt;/p&gt;

&lt;p&gt;Notez que l’allocation est réinitialisée le premier du mois prochain.&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%2Ftcws86ccw49799aniwe6.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%2Ftcws86ccw49799aniwe6.png" alt="Board Github Copilot" width="624" height="363"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  1.6.5 Contrôle de l’activité des prompts
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt; C’est ici que vous lancez le prompt ou l’arrêtez (s’il tourne)&lt;/li&gt;
&lt;li&gt; Après la réponse, vous pouvez garder les changements effectués par l’agent ou les annuler.&lt;/li&gt;
&lt;li&gt; Pour certaines étapes, il demandera votre permission avant d’agir (ex. exécuter une appli, installer, supprimer un fichier, etc.). Vous pouvez aussi le configurer pour toujours autoriser.&lt;/li&gt;
&lt;/ol&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%2Fp1bhak8qlkq1g0acp9o4.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%2Fp1bhak8qlkq1g0acp9o4.png" alt="Contrôle activité Copilot" width="536" height="563"&gt;&lt;/a&gt;&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%2Fxcab9f7brf23kpnbd0xq.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%2Fxcab9f7brf23kpnbd0xq.png" alt="Contrôle activité Copilot" width="514" height="330"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  1.6.6 Fichier de contexte pour l’agent
&lt;/h2&gt;

&lt;p&gt;Vous pouvez limiter votre agent à un contexte spécifique, qui peut être :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Un fichier ouvert&lt;/li&gt;
&lt;li&gt; Une partie du fichier ouvert (comme sur le schéma ci‑dessus, de la ligne 11 à 16)&lt;/li&gt;
&lt;li&gt; Ou joindre un nouveau fichier (ex. une image que l’agent lira, puis codera)&lt;/li&gt;
&lt;li&gt; Utiliser &lt;code&gt;#&lt;/code&gt; pour indiquer un fichier d’intérêt, &lt;code&gt;@&lt;/code&gt; pour accéder à l’extension et &lt;code&gt;/&lt;/code&gt; pour accéder à une commande ou un fichier de prompt.&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  1.6.7 Gestion de code (Source Control)
&lt;/h2&gt;

&lt;p&gt;Vous pouvez effectuer la gestion de code directement depuis VS Code.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Accéder à Source Control. S’il n’y en a pas, un bouton permet de l’initialiser ici&lt;/li&gt;
&lt;li&gt;Ajouter (au contrôle de source), retirer ou ouvrir les fichiers modifiés&lt;/li&gt;
&lt;li&gt;Écrire votre message de commit ici, ou utiliser l’IA (bouton étoile) pour le générer&lt;/li&gt;
&lt;li&gt;Valider vos changements ajoutés, et choisir &lt;em&gt;Amend&lt;/em&gt;, &lt;em&gt;Push&lt;/em&gt; ou &lt;em&gt;Sync&lt;/em&gt; avec le commit.&lt;/li&gt;
&lt;/ol&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%2Ffupe46zf4naspb9lkwo1.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%2Ffupe46zf4naspb9lkwo1.png" alt="Gestion de code" width="375" height="414"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  1.6.8 Paramètres de l’extension GitHub Copilot
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt; Ouvrir le panneau des Extensions&lt;/li&gt;
&lt;li&gt; Sélectionner les paramètres de Copilot&lt;/li&gt;
&lt;li&gt; Vous pouvez maintenant activer l’autocomplétion pour le Markdown ou le texte brut !!&lt;/li&gt;
&lt;/ol&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Partie II : Maîtriser les leviers de productivité
&lt;/h1&gt;

&lt;p&gt;Cette section est le cœur du guide, détaillant les stratégies pratiques pour améliorer la précision et l'efficacité.&lt;/p&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  2.1 Maîtriser les commandes Slash
&lt;/h2&gt;

&lt;p&gt;Les slash commandes sont des raccourcis intégrés qui évitent des prompts interminables. Tapez &lt;code&gt;/&lt;/code&gt; dans Copilot Chat pour débloquer une productivité instantanée.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Slash Commands essentielles :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/tests&lt;/code&gt; — Génère des tests unitaires complets pour le code sélectionné, avec cas limites et mocks
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/fix&lt;/code&gt; — Analyse les erreurs et propose des correctifs (null checks, refactors)
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/explain&lt;/code&gt; — Explique des snippets de code complexes
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/doc&lt;/code&gt; — Génère des commentaires de documentation pour fonctions et classes
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/refactor&lt;/code&gt; — Suggère des améliorations et optimisations de code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Astuce&lt;/strong&gt; : Combinez &lt;code&gt;/tests&lt;/code&gt; avec &lt;code&gt;#file:src/service.ts&lt;/code&gt; pour générer des tests spécifiques au service sans boilerplate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pourquoi c’est important :&lt;/strong&gt; Ces commandes fonctionnent en chat et en inline (Alt+/) et sont incluses dans l’offre basique. Commencez par &lt;code&gt;/tests&lt;/code&gt; et &lt;code&gt;/fix&lt;/code&gt; — des gains rapides pour tout codebase.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Impact réel :&lt;/strong&gt; Sur ce projet e‑commerce, &lt;code&gt;/tests&lt;/code&gt; m’a à lui seul économisé 8 à 10 heures d’écriture de tests manuels sur tous les services.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note gratuit vs payant&lt;/strong&gt; : la version gratuite limite vos requêtes mensuelles. En gratuit, je me cognais les limites en plein projet. D’où mon passage à l’abonnement payant (10 $/mois individuel). Si vous utilisez Copilot au quotidien, le payant vaut le coup rien que pour l’illimité.&lt;/p&gt;
&lt;/blockquote&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  2.2 Utiliser les Variables de Contexte 📦
&lt;/h2&gt;

&lt;p&gt;Copilot n’est pas devin. Plus vous lui donnez de contexte, mieux il vous aide.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Variables de contexte puissantes :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;#file&lt;/code&gt; — Référencez des fichiers précis : &lt;code&gt;#file:auth.service.ts&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;#codebase&lt;/code&gt; — Laissez Copilot fouiller toute votre base de code
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;#editor&lt;/code&gt; — Ajoute tous les fichiers ouverts au contexte
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@workspace&lt;/code&gt; — Posez des questions sur toute la structure du projet
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;#fetch&lt;/code&gt; — Récupère du contenu web ou de la doc&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Exemple en action :
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@workspace Sur notre serveur Node, quelles optimisations pour gérer 10 000 requêtes concurrentes ?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Astuce : surlignez le code pertinent avant de questionner. Copilot donne alors des suggestions ciblées et évite les suppositions.&lt;/p&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  2.3 Créer des instructions personnalisées ✍️
&lt;/h2&gt;

&lt;p&gt;Pour arrêtez de vous battre avec les suggestions : Définir les standards de codage de l'équipe (style, conventions, utilisation de const vs var) dans le fichier .instructions.md,. L'objectif est de garantir une cohérence permanente du code généré.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configurer les instructions personnalisées :&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Lancez &lt;code&gt;Chat: New Instructions File&lt;/code&gt; depuis la palette de commandes
&lt;/li&gt;
&lt;li&gt;Cela crée &lt;code&gt;.instructions.md&lt;/code&gt; dans le dossier &lt;code&gt;.github/instructions&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Définissez vos règles projet en Markdown&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Exemple de fichier d’instructions :&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;Custom instructions for Copilot

Project Context
This project is a React + Node.js e-commerce platform

Code Style
- Use TypeScript strict mode
- Prefer functional components with hooks
- Use camelCase for variables
- Write descriptive variable names (no single letters)

Testing
- Use Jest for unit tests
- Use Playwright for E2E tests
- Always include error handling tests

Indentation
We use 2 spaces, not tabs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pourquoi ça marche :&lt;/strong&gt; Copilot génère désormais du code conforme à VOTRE style, pas des patterns génériques. Temps d’édition réduit jusqu’à 40 %.&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2.4 Stratégie d'ouverture de fichiers 📂
&lt;/h2&gt;

&lt;p&gt;Petit secret : Copilot ne voit pas les fichiers fermés. Ouvrir 3 à 5 fichiers liés lui donne un contexte massif sur la structure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stratégie d’ouverture maligne :&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Avant d’écrire du nouveau code, ouvrez :  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Le fichier que vous éditez
&lt;/li&gt;
&lt;li&gt;Les utilitaires/helpers liés
&lt;/li&gt;
&lt;li&gt;Les fichiers de types
&lt;/li&gt;
&lt;li&gt;Les fichiers de config
&lt;/li&gt;
&lt;li&gt;Des implémentations similaires existantes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Exemple : écrire un nouvel endpoint API ? Ouvrez :&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;routes/user.routes.ts&lt;/code&gt; (là où vous travaillez)
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;controllers/user.controller.ts&lt;/code&gt; (patterns existants)
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;models/User.ts&lt;/code&gt; (structure de données)
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;middleware/auth.ts&lt;/code&gt; (contexte d'authentification)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Rappel critique :&lt;/strong&gt; fermez les fichiers hors sujet quand vous changez de tâche. Trop de fichiers non liés perturbent le contexte.&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2.5 Commenter le Flux de travail 🗨️
&lt;/h2&gt;

&lt;p&gt;Écrire des commentaires détaillés spécifiant l'architecture, le flux, le traitement des erreurs et les cas limites AVANT d'écrire le code. Cette planification augmente significativement la précision de la sortie de l'IA.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Objectif : Auth JWT + refresh tokens + reset password sécurisé
// Flux : signup -&amp;gt; email verify -&amp;gt; login -&amp;gt; refresh -&amp;gt; logout
// Exigences : rate limiting, CSRF, rotation de refresh tokens, IP logging
// Cas limites : token expiré, utilisateur désactivé, tentative brute force
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Voyez Copilot comme un dev junior. Plus vos consignes sont claires, meilleur est le résultat.&lt;/p&gt;

&lt;h3&gt;
  
  
  Workflow « comment-first »
&lt;/h3&gt;

&lt;p&gt;Plutôt que plonger direct dans le code, écrivez en tête de fichier un commentaire descriptif expliquant l’architecture et le flux.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Résultat :&lt;/strong&gt; Copilot génère un code qui suit vos spécifications, incluant la gestion d’erreurs et les cas limites.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Astuce :&lt;/strong&gt; incluez des exemples d’entrées/sorties dans les commentaires. La précision des suggestions augmente fortement.&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2.6 Le Dialogue itératif 🔄
&lt;/h2&gt;

&lt;p&gt;Ne pas accepter la première suggestion. Affiner les résultats par des follow-up prompts spécifiques pour garantir la validation côté client ou l'ajout de logique manquante.&lt;/p&gt;

&lt;p&gt;Gros morceau en 2025. Copilot CLI intègre Claude Sonnet 4.5 — et ce modèle est bluffant en code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fonctionnalités CLI puissantes :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/model&lt;/code&gt; — Changez de modèle IA à la volée
&lt;/li&gt;
&lt;li&gt;Exécution directe du shell avec le préfixe &lt;code&gt;!&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Support image via mentions &lt;code&gt;@&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Permissions d’outils améliorées avec des glob patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Exemple concret :&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;# Générer des commandes terminal complexes
gh copilot explain "How do I find all .js files modified in the last 7 days and run eslint on them?"

# Exécuter directement !
npm run test:unit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Astuce :&lt;/strong&gt; utilisez la commande &lt;code&gt;/usage&lt;/code&gt; pour suivre les requêtes premium et optimiser votre flux.&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2.7 Fichiers de prompts personnalisés 🗃️
&lt;/h2&gt;

&lt;p&gt;Créer des modèles réutilisables pour des requêtes complexes dans votre projet (.github/prompts/).&lt;/p&gt;

&lt;p&gt;Le mode Agent permet à Copilot de travailler de façon autonome — trouver des fichiers, éditer du code, et décider sans saisie constante.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quand utiliser le mode Agent :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Refactorings sur de grandes bases de code
&lt;/li&gt;
&lt;li&gt;Conversion entre frameworks
&lt;/li&gt;
&lt;li&gt;Implémentation de fonctionnalités à travers plusieurs fichiers
&lt;/li&gt;
&lt;li&gt;Débogage d’issues complexes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Comment activer :&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Ctrl+Shift+Alt+L&lt;/code&gt; (Windows) ou &lt;code&gt;Cmd+Shift+Alt+L&lt;/code&gt; (Mac)
&lt;/li&gt;
&lt;li&gt;Ou &lt;code&gt;/agent&lt;/code&gt; dans le chat&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Exemple de prompt :&lt;/strong&gt;&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%2F6ri2xm6w90i9ux7ffmd8.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%2F6ri2xm6w90i9ux7ffmd8.png" alt="une capture de mon VS Code, GitHub Copilot Chat" width="614" height="322"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Commande GitHub Copilot dans mon espace réel&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@workspace Objectif :
Créer une page web statique qui présente une estimation des résultats du FC Nantes (FCN) pour la fin de saison de Ligue 1.

Contraintes générales :
Page web en HTML, CSS et JavaScript vanilla
Design moderne, lisible et responsive

Couleurs officielles du FC Nantes :
Jaune : #FFD700
Vert : #006A3D

Typographie sportive et élégante
Aucun framework externe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Note de sécurité :&lt;/strong&gt; le mode Agent requiert votre validation avant exécution des changements. Relisez tout attentivement.&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2.8 Glisser-Déposer de Contexte 🖱️
&lt;/h2&gt;

&lt;p&gt;Contexte Visuel et Logistique : déposer des fichiers, des logs d'erreurs, des dossiers, et même des captures d'écran directement dans Copilot Chat pour une analyse immédiate. Utiliser le fichier &lt;code&gt;package.json&lt;/code&gt; pour informer l'IA des dépendances.&lt;/p&gt;

&lt;p&gt;Par ailleurs vous connaissez ce moment où vous êtes « dans la zone » et ne voulez pas changer de fenêtre ? L’inline chat est fait pour ça.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Raccourcis inline chat (je cherchais où l’ouvrir dans VS Code jusqu’à trouver ces raccourcis) :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Ctrl+I&lt;/code&gt; / &lt;code&gt;Cmd+I&lt;/code&gt; — Démarrer le chat inline directement dans l’éditeur
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Alt+/&lt;/code&gt; — Accès rapide aux slash commands en inline&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cas parfaits :&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Petites corrections en debug
&lt;/li&gt;
&lt;li&gt;Générer une fonction unique
&lt;/li&gt;
&lt;li&gt;Ajouter de la gestion d’erreurs à du code existant
&lt;/li&gt;
&lt;li&gt;Refactoriser un bloc précis&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Workflow pro :&lt;/strong&gt; surlignez le code problématique → &lt;code&gt;Ctrl+I&lt;/code&gt; → tapez &lt;code&gt;/fix&lt;/code&gt; → acceptez la suggestion → continuez à coder.&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2.9 Stratégie de nettoyage de contexte 🧹
&lt;/h2&gt;

&lt;p&gt;Supprimer les questions non pertinentes ou démarrer un nouveau fil de conversation pour éviter que l'historique ne dilue la qualité de la réponse (améliore la qualité de 30 %).&lt;/p&gt;

&lt;p&gt;Sauvez vos meilleurs prompts et partagez‑les avec l’équipe. Les fichiers de prompt sont des templates réutilisables pour les tâches courantes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Créer des fichiers de prompt :&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;Chat: New Prompt File&lt;/code&gt; via la palette
&lt;/li&gt;
&lt;li&gt;Enregistrez dans &lt;code&gt;.github/prompts/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Écrivez le prompt en Markdown avec métadonnées&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Exemple de fichier (.prompt.md) :&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;mode: 'agent'
tools: ['githubRepo', 'search/codebase']
description: 'Generate a new React component'
Your goal is to generate a new React component based on templates in #githubRepo yourcompany/design-system.
Requirements:
* Use TypeScript with strict types
* Follow design system patterns
* Include PropTypes
* Add Storybook story
* Include unit tests with React Testing Library
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Utilisation :&lt;/strong&gt; tapez &lt;code&gt;/your-prompt-name&lt;/code&gt; dans le chat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bénéfice équipe :&lt;/strong&gt; tout le monde suit les mêmes bonnes pratiques. Fini les styles incohérents.&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2.10 Maîtriser la sélection de Code 🔍
&lt;/h2&gt;

&lt;p&gt;Utiliser &lt;code&gt;@selection&lt;/code&gt; ou mettre en surbrillance un bloc de code précis avant de poser une question afin d'obtenir des suggestions plus rapides et plus pertinentes.&lt;/p&gt;

&lt;p&gt;Par ailleurs la fonction la plus simple mais sous‑utilisée : glissez des fichiers directement dans Copilot Chat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ce que vous pouvez glisser :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Plusieurs fichiers à la fois
&lt;/li&gt;
&lt;li&gt;Des dossiers entiers
&lt;/li&gt;
&lt;li&gt;Des captures et images (NOUVEAU en 2025 !)
&lt;/li&gt;
&lt;li&gt;Des logs d’erreurs du terminal
&lt;/li&gt;
&lt;li&gt;Des sorties d’échecs de tests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cas puissant — rapport de bug :&lt;/strong&gt;  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Prenez une capture du bug UI
&lt;/li&gt;
&lt;li&gt;Glissez la capture dans Copilot Chat
&lt;/li&gt;
&lt;li&gt;Tapez : « Crée un rapport de bug pour ce problème de rendu »
&lt;/li&gt;
&lt;li&gt;Copilot analyse l’image et génère une documentation de bug détaillée&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Astuce avancée :&lt;/strong&gt; glissez votre &lt;code&gt;package.json&lt;/code&gt; pour aider Copilot à comprendre vos dépendances et proposer du code compatible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BONUS :&lt;/strong&gt; stratégie « supprimer et redémarrer »&lt;/p&gt;

&lt;p&gt;Copilot utilise l’historique de conversation comme contexte. S’il donne des réponses hors sujet :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Supprimez les anciennes questions non pertinentes
&lt;/li&gt;
&lt;li&gt;Démarrez un nouveau thread via le bouton &lt;code&gt;+&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Utilisez les flèches haut/bas pour naviguer dans l’historique (comme dans le terminal)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cela garde la conversation ciblée et améliore la qualité des réponses d’environ 30 %.&lt;/p&gt;

&lt;h3&gt;
  
  
  Check‑list de gains rapides pour cette semaine
&lt;/h3&gt;

&lt;p&gt;Avant de fermer cet article, engagez‑vous à tester ces trois points :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ajoutez un fichier &lt;code&gt;.instructions.md&lt;/code&gt; dans le répertoire &lt;code&gt;instructions&lt;/code&gt; à la racine de votre projet principal, avec votre style de code
&lt;/li&gt;
&lt;li&gt;Installez Copilot CLI et essayez la commande &lt;code&gt;/model&lt;/code&gt; avec Claude Sonnet 4.5
&lt;/li&gt;
&lt;li&gt;Ouvrez 4 à 5 fichiers liés la prochaine fois que vous écrivez du nouveau code et regardez les suggestions s’améliorer&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2.11 Créer des issues à partir de captures d’écran 📸
&lt;/h2&gt;

&lt;p&gt;Vous avez un rapport de bug avec une capture d’écran ? Ne l’écrivez pas manuellement, laissez Copilot s’en charger. Voici comment :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Prenez une capture d’écran du bug (par ex., une icône mal alignée ou un problème de mise en page)&lt;/li&gt;
&lt;li&gt; Glissez-la dans la discussion Copilot sur &lt;a href="http://github.com/copilot" rel="noopener noreferrer"&gt;github.com/copilot&lt;/a&gt;. &lt;/li&gt;
&lt;li&gt; Ajoutez une consigne comme :
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Crée un nouveau ticket en utilisant le label 'bug'. Utilise cette capture et décris l’icône de flèche qui se chevauche. Applique le modèle de ticket UI de ce dépôt.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copilot lit l’image, génère un titre et une description clairs, applique les bons labels et utilise les modèles de tickets de votre dépôt. C’est plus rapide qu’une transcription manuelle et il repère souvent des détails que je pourrais manquer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Astuce :&lt;/strong&gt; Copilot peut déduire le contexte du ticket à partir de votre capture et de votre consigne ; pas besoin de tout expliciter.&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2.12 Utiliser Github Copilot partout… Mais tirer le meilleur du plugin dans VS Code 🌐
&lt;/h2&gt;

&lt;p&gt;Vous pouvez profiter de Github Copilot dans de nombreux IDE tels que Visual Studio Code, JetBrains, Visual Studio, Eclipse, XCode, Vim ou même Neovim. &lt;/p&gt;

&lt;p&gt;L’idée est de garder votre environnement familier tout en bénéficiant des fonctionnalités de Github Copilot.&lt;/p&gt;

&lt;p&gt;Néanmoins, les plugins VS Code pour Github Copilot sont souvent plus avancés et mis à jour plus fréquemment que pour les autres IDE.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Astuce :&lt;/strong&gt; installez les plugins VS Code compatibles avec votre IDE préféré, et installez également &lt;strong&gt;VS Code&lt;/strong&gt; en parallèle. Vous profitez ainsi du confort de votre environnement habituel tout en accédant facilement aux dernières nouveautés disponibles dans VS Code.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Partie III : Écosystème et Agenticité Avancée
&lt;/h1&gt;

&lt;p&gt;Cette partie explore l'interopérabilité et les outils de niveau professionnel qui étendent Copilot au-delà de l'IDE.&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3.1 Le Protocole de contexte Modèle (MCP) 🚀
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Le &lt;strong&gt;MCP&lt;/strong&gt; (&lt;em&gt;Model Context Protocol&lt;/em&gt;) est un protocole d'interopérabilité — un peu comme un « USB-C pour les intégrations d'IA » — conçu pour étendre les capacités des &lt;strong&gt;modèles d’IA&lt;/strong&gt; et leur permettre de se connecter &lt;strong&gt;de manière sécurisée et structurée&lt;/strong&gt; à des &lt;strong&gt;outils, données et services externes&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Concrètement avec un MCP : L’IA peut &lt;strong&gt;accéder à des données réelles&lt;/strong&gt;, &lt;strong&gt;appeler vos APIs&lt;/strong&gt;, &lt;strong&gt;lire vos fichiers&lt;/strong&gt; ou &lt;strong&gt;agir sur vos outils&lt;/strong&gt;, selon des règles explicites.&lt;/p&gt;

&lt;p&gt;Il existe plus de 30 intégrations MCP officielles, couvrant des domaines comme :&lt;/p&gt;

&lt;p&gt;GitHub MCP propose un hub central pour la découverte et l'installation de serveurs MCP de partenaires (Figma, Postman, Terraform) &lt;a href="https://github.com/mcp" rel="noopener noreferrer"&gt;Github hub central mcp server&lt;/a&gt;.&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%2Fn1hg1gxqa7xrmzzogq97.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%2Fn1hg1gxqa7xrmzzogq97.png" alt="Registre des MCP server central" width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Intégration/Produit&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Résumé&lt;/th&gt;
&lt;th&gt;Cas d'usage rapides&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Conversion fichiers → Markdown&lt;/td&gt;
&lt;td&gt;Utilitaire/Conversion&lt;/td&gt;
&lt;td&gt;Convertir PDF, Word, Excel, images, audio en Markdown.&lt;/td&gt;
&lt;td&gt;Markdown depuis PDF/Doc&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub (assistants IA)&lt;/td&gt;
&lt;td&gt;DevOps&lt;/td&gt;
&lt;td&gt;Gérer dépôts, issues, PR, workflows en langage naturel.&lt;/td&gt;
&lt;td&gt;Gérer issues/PR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chrome DevTools&lt;/td&gt;
&lt;td&gt;DevTools&lt;/td&gt;
&lt;td&gt;Serveur MCP pour Chrome DevTools.&lt;/td&gt;
&lt;td&gt;Inspecter runtime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notion (officiel)&lt;/td&gt;
&lt;td&gt;Productivité&lt;/td&gt;
&lt;td&gt;Serveur MCP officiel pour l’API Notion.&lt;/td&gt;
&lt;td&gt;Notes/DB Notion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure MCP Tools&lt;/td&gt;
&lt;td&gt;Cloud Integrations&lt;/td&gt;
&lt;td&gt;Outils Azure MCP pour connecter agents IA et services Azure.&lt;/td&gt;
&lt;td&gt;Azure services&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Terraform (HCP/Enterprise)&lt;/td&gt;
&lt;td&gt;IaC&lt;/td&gt;
&lt;td&gt;Générer Terraform plus précis et automatiser workflows.&lt;/td&gt;
&lt;td&gt;Infra as Code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure DevOps&lt;/td&gt;
&lt;td&gt;DevOps&lt;/td&gt;
&lt;td&gt;Dépôts, work items, builds, releases, tests, recherche de code.&lt;/td&gt;
&lt;td&gt;Repos/CI/CD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Elasticsearch&lt;/td&gt;
&lt;td&gt;Recherche/Analytics&lt;/td&gt;
&lt;td&gt;Requêtes de recherche, mappings, ES&lt;/td&gt;
&lt;td&gt;QL, shards via NL.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hugging Face&lt;/td&gt;
&lt;td&gt;IA/Modèles&lt;/td&gt;
&lt;td&gt;Accéder modèles, datasets, Spaces, articles, collections.&lt;/td&gt;
&lt;td&gt;Modèles/datasets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jira + Confluence (remote)&lt;/td&gt;
&lt;td&gt;Collaboration IT&lt;/td&gt;
&lt;td&gt;Connexion sécurisée Jira/Confluence avec LLM/IDE/plateformes d’agents.&lt;/td&gt;
&lt;td&gt;ITSM/Confluence&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Expérimenter avec GitHub MCP
&lt;/h3&gt;

&lt;p&gt;Je vous encourage à essayer GitHub MCP par vous-même. Voici comment configurer un serveur MCP localement :&lt;br&gt;
&lt;a href="https://docs.github.com/fr/copilot/how-tos/provide-context/use-mcp/set-up-the-github-mcp-server" rel="noopener noreferrer"&gt;setup github mcp server&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Une fois que GitHub MCP est lancé, vous pouvez le solliciter et l’utiliser.&lt;/p&gt;

&lt;p&gt;Dans mon cas, je veux ajouter un nouvel élément de technologie à &lt;a href="https://github.com/GoogleCloudPlatform/Template" rel="noopener noreferrer"&gt;https://github.com/GoogleCloudPlatform/Template&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Le prompt que j’utilise est le suivant :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use the GitHub MCP.
Refers to https://github.com/GoogleCloudPlatform/Template,
- Reads the contribution.md, and
- Create a technology item for Perplexity LLM Model, and
- Make a unique branch for the new Technology Item and
- Open a git issue and pull request
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Il va alors utiliser Get File, Create Branch, Update File, Open Issue, Open Pull Request, et effectuer toutes les tâches nécessaires disponibles dans &lt;strong&gt;MCP Server : GitHub&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Personnellement, j’interagis beaucoup avec les MCP suivants :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Azure DevOps MCP : Voir les éléments de travail, mettre à jour le statut des tâches (ex. : passer à "Code Review"), gérer les PR sans quitter VS Code, réduisant la commutation de contexte.&lt;/p&gt;

&lt;p&gt;Agent de Codage Teams : Déléguer des tâches à l'Agent via @GitHub  dans Microsoft Teams, qui exécute la tâche sur le dépôt et crée automatiquement une Pull Request.&lt;/p&gt;

&lt;p&gt;Chrome DevTools MCP : Utiliser l'Agent pour analyser la performance web (Largest Contentful Paint (LCP), Interaction to Next Paint (INP)) sur n'importe quelle URL.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3.2 🚀 Qu’est‑ce que « Awesome GitHub Copilot » ? 📡
&lt;/h2&gt;

&lt;p&gt;Ce dépôt fournit une boîte à outils complète pour enrichir GitHub Copilot avec :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;👉 &lt;a href="https://github.com/github/awesome-copilot/blob/main/docs/README.agents.md" rel="noopener noreferrer"&gt;Awesome Agents&lt;/a&gt;&lt;/strong&gt; — Agents GitHub Copilot spécialisés qui s’intègrent aux serveurs MCP pour offrir des capacités étendues pour des workflows et outils spécifiques&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;👉 &lt;a href="https://github.com/github/awesome-copilot/blob/main/docs/README.prompts.md" rel="noopener noreferrer"&gt;Awesome Prompts&lt;/a&gt;&lt;/strong&gt; — Prompts ciblés et spécifiques à une tâche pour générer du code, de la documentation et résoudre des problèmes précis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;👉 &lt;a href="https://github.com/github/awesome-copilot/blob/main/docs/README.instructions.md" rel="noopener noreferrer"&gt;Awesome Instructions&lt;/a&gt;&lt;/strong&gt; — Normes de codage et bonnes pratiques exhaustives applicables à des motifs de fichiers ou à des projets entiers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;👉 &lt;a href="https://github.com/github/awesome-copilot/blob/main/docs/README.collections.md" rel="noopener noreferrer"&gt;Awesome Collections&lt;/a&gt;&lt;/strong&gt; — Collections organisées de prompts, d’instructions et de modes de chat autour de thèmes et workflows spécifiques&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🎯 Pourquoi utiliser « Awesome GitHub Copilot » ?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Productivité&lt;/strong&gt; : des agents, prompts et instructions préconstruits font gagner du temps et assurent des résultats cohérents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bonnes pratiques&lt;/strong&gt; : bénéficiez de normes et patterns de codage sélectionnés par la communauté.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assistance spécialisée&lt;/strong&gt; : accédez à des conseils de niveau expert via des agents personnalisés spécialisés.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apprentissage continu&lt;/strong&gt; : restez à jour sur les derniers patterns et pratiques à travers les technologies.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📖 Structure du dépôt
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/github/awesome-copilot#-repository-structure" rel="noopener noreferrer"&gt;Structure du dépôt Awesome&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;├── prompts/          # Prompts spécifiques aux tâches (.prompt.md)
├── instructions/     # Normes de codage et bonnes pratiques (.instructions.md)
├── agents/           # Personas IA et modes spécialisés (.agent.md)
├── collections/      # Collections organisées d’éléments liés (.collection.yml)
└── scripts/          # Scripts utilitaires pour la maintenance
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🎯 Comment utiliser les ressources « Awesome GitHub Copilot » ?
&lt;/h3&gt;

&lt;h3&gt;
  
  
  🤖 Agents personnalisés
&lt;/h3&gt;

&lt;p&gt;Les agents personnalisés peuvent être utilisés dans Copilot Coding Agent (CCA), VS Code et Copilot CLI. Pour le CCA, lors de l’assignation d’un ticket à Copilot, sélectionnez l’agent personnalisé dans la liste fournie. Dans VS Code, vous pouvez activer l’agent personnalisé dans la session des agents, aux côtés des agents intégrés comme Plan et Agent.&lt;/p&gt;

&lt;h3&gt;
  
  
  🎯 Prompts
&lt;/h3&gt;

&lt;p&gt;Utilisez la commande &lt;code&gt;/&lt;/code&gt; dans GitHub Copilot Chat pour accéder aux prompts :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/awesome-copilot create-readme
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📋 Instructions
&lt;/h3&gt;

&lt;p&gt;Les instructions s’appliquent automatiquement aux fichiers selon leurs motifs et fournissent des conseils contextuels sur les normes de codage, les frameworks et les bonnes pratiques.&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3.3 Custom agents 🤖
&lt;/h2&gt;

&lt;p&gt;Un custom agent est un assistant IA personnalisé dans VS Code qui adopte une personnalité et un comportement spécifiques pour des tâches de développement précises. Par exemple, vous pouvez créer des agents pour :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Un planificateur de projet&lt;/li&gt;
&lt;li&gt;Un réviseur de code sécurisé&lt;/li&gt;
&lt;li&gt;Un architecte de solutions&lt;/li&gt;
&lt;li&gt;Un testeur automatique&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Chaque agent possède ses propres instructions, outils disponibles et comportements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pourquoi utiliser des Custom Agents ?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Spécialisation des tâches
&lt;/h3&gt;

&lt;p&gt;Différentes tâches nécessitent différentes capacités. Un agent de planification peut n'avoir accès qu'à des outils de lecture pour éviter les modifications accidentelles, tandis qu'un agent d'implémentation aura tous les outils d'édition.&lt;/p&gt;

&lt;h3&gt;
  
  
  Instructions personnalisées
&lt;/h3&gt;

&lt;p&gt;Chaque agent peut avoir des instructions spécifiques qui définissent comment l'IA doit fonctionner, garantissant des réponses cohérentes et adaptées à chaque fois.&lt;/p&gt;

&lt;h2&gt;
  
  
  Structure d'un fichier Custom Agent
&lt;/h2&gt;

&lt;p&gt;Les custom agents sont définis dans des fichiers &lt;code&gt;.agent.md&lt;/code&gt; (Markdown) avec cette structure :&lt;/p&gt;

&lt;h3&gt;
  
  
  En-tête (YAML frontmatter)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Générer un plan d'implémentation pour de nouvelles fonctionnalités&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Planificateur&lt;/span&gt;
&lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;fetch'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;githubRepo'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;search'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Claude Sonnet &lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;
&lt;span class="na"&gt;handoffs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Implémenter le plan&lt;/span&gt;
    &lt;span class="na"&gt;agent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;implementation&lt;/span&gt;
    &lt;span class="na"&gt;prompt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Implémente le plan ci-dessus&lt;/span&gt;
    &lt;span class="na"&gt;send&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Champs disponibles :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;description&lt;/code&gt; : Description brève de l'agent&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;name&lt;/code&gt; : Nom de l'agent&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tools&lt;/code&gt; : Liste des outils disponibles&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;model&lt;/code&gt; : Modèle IA à utiliser&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;handoffs&lt;/code&gt; : Transitions suggérées vers d'autres agents&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Corps du fichier
&lt;/h3&gt;

&lt;p&gt;Le corps contient les instructions en Markdown qui guident le comportement de l'agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Créer un Custom Agent
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Étape 1 : Créer le fichier
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Ouvrez la liste des agents dans le Chat&lt;/li&gt;
&lt;li&gt;Sélectionnez &lt;strong&gt;Configure Custom Agents&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Cliquez sur &lt;strong&gt;Create new custom agent&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Choisissez l'emplacement :

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Workspace&lt;/strong&gt; : dans &lt;code&gt;.github/agents&lt;/code&gt; (uniquement pour ce projet)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User profile&lt;/strong&gt; : pour tous vos projets&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Étape 2 : Définir l'agent
&lt;/h3&gt;

&lt;p&gt;Remplissez le fichier &lt;code&gt;.agent.md&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Génère un plan d'implémentation détaillé&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Plan&lt;/span&gt;
&lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;search'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;fetch'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;githubRepo'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# Instructions de planification&lt;/span&gt;

Tu es en mode planification. Ta tâche est de générer un plan d'implémentation 
pour une nouvelle fonctionnalité.

Le plan doit inclure :
&lt;span class="p"&gt;-&lt;/span&gt; Vue d'ensemble
&lt;span class="p"&gt;-&lt;/span&gt; Exigences
&lt;span class="p"&gt;-&lt;/span&gt; Étapes d'implémentation
&lt;span class="p"&gt;-&lt;/span&gt; Tests nécessaires

Ne fais aucune modification de code, génère uniquement un plan.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Les Handoffs : enchaîner les agents
&lt;/h2&gt;

&lt;p&gt;Les handoffs permettent de créer des workflows guidés entre agents avec des boutons de transition.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemple de workflow :&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Planification → Implémentation&lt;/strong&gt; : Générer un plan puis coder&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implémentation → Révision&lt;/strong&gt; : Coder puis vérifier la qualité&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tests échouants → Tests réussis&lt;/strong&gt; : Écrire les tests puis l'implémentation
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;handoffs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Commencer l'implémentation&lt;/span&gt;
    &lt;span class="na"&gt;agent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;implementation&lt;/span&gt;
    &lt;span class="na"&gt;prompt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Implémente maintenant le plan ci-dessus.&lt;/span&gt;
    &lt;span class="na"&gt;send&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;label&lt;/code&gt; : Texte du bouton&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;agent&lt;/code&gt; : Agent cible&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;prompt&lt;/code&gt; : Texte à envoyer&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;send&lt;/code&gt; : Envoyer automatiquement (true/false)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Outils disponibles
&lt;/h2&gt;

&lt;p&gt;Vous pouvez spécifier quels outils sont accessibles à chaque agent :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Outils VS Code intégrés : &lt;code&gt;'search'&lt;/code&gt;, &lt;code&gt;'fetch'&lt;/code&gt;, &lt;code&gt;'githubRepo'&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Outils MCP : tous les outils d'un serveur avec &lt;code&gt;'nom-serveur/*'&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Outils d'extensions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Exemple complet
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Agent de révision de code se concentrant sur la sécurité&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Réviseur Sécurité&lt;/span&gt;
&lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;search'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;fetch'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Claude Sonnet &lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;
&lt;span class="na"&gt;handoffs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Corriger les problèmes&lt;/span&gt;
    &lt;span class="na"&gt;agent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;implementation&lt;/span&gt;
    &lt;span class="na"&gt;prompt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Corrige les problèmes de sécurité identifiés ci-dessus.&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# Instructions de révision sécurité&lt;/span&gt;

Tu es un expert en sécurité applicative. Analyse le code pour :
&lt;span class="p"&gt;
1.&lt;/span&gt; &lt;span class="gs"&gt;**Vulnérabilités de sécurité**&lt;/span&gt;
&lt;span class="p"&gt;   -&lt;/span&gt; Injections SQL
&lt;span class="p"&gt;   -&lt;/span&gt; XSS
&lt;span class="p"&gt;   -&lt;/span&gt; CSRF
&lt;span class="p"&gt;   -&lt;/span&gt; Fuites de données sensibles
&lt;span class="p"&gt;
2.&lt;/span&gt; &lt;span class="gs"&gt;**Bonnes pratiques**&lt;/span&gt;
&lt;span class="p"&gt;   -&lt;/span&gt; Validation des entrées
&lt;span class="p"&gt;   -&lt;/span&gt; Gestion des erreurs
&lt;span class="p"&gt;   -&lt;/span&gt; Principe du moindre privilège

Pour chaque problème trouvé, fournis :
&lt;span class="p"&gt;-&lt;/span&gt; Description claire
&lt;span class="p"&gt;-&lt;/span&gt; Niveau de gravité
&lt;span class="p"&gt;-&lt;/span&gt; Suggestion de correction
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Partager les Custom Agents
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Au niveau de l'équipe
&lt;/h3&gt;

&lt;p&gt;Placez les fichiers dans &lt;code&gt;.github/agents&lt;/code&gt; de votre workspace.&lt;/p&gt;

&lt;h3&gt;
  
  
  Au niveau de l'organisation
&lt;/h3&gt;

&lt;p&gt;Les agents peuvent être définis au niveau GitHub Organization pour être disponibles dans tous les projets. Activez l'option dans les paramètres :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;github.copilot.chat.customAgents.showOrganizationAndEnterpriseAgents
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conseils pratiques
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Commencez simple&lt;/strong&gt; : Créez d'abord des agents avec des rôles clairs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limitez les outils&lt;/strong&gt; : Donnez uniquement les outils nécessaires à chaque agent&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instructions précises&lt;/strong&gt; : Plus les instructions sont claires, meilleurs sont les résultats&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Utilisez les handoffs&lt;/strong&gt; : Créez des workflows fluides entre agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testez et itérez&lt;/strong&gt; : Affinez vos agents au fil de l'utilisation&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3.4 Maîtriser le GitHub Copilot CLI 🚀
&lt;/h2&gt;

&lt;p&gt;La GitHub Copilot CLI apporte les capacités IA de Copilot directement dans votre ligne de commande.&lt;/p&gt;

&lt;p&gt;Plutôt que de jongler entre votre IDE et votre navigateur, vous pouvez faire appel à Copilot directement dans votre terminal pour les cas d'usage suivants :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Assistant IA dans le terminal, indépendant de l’éditeur
&lt;/li&gt;
&lt;li&gt;Exploration du projet (fichiers, dépendances, structure)
&lt;/li&gt;
&lt;li&gt;Génération et modification de code via des prompts en langage naturel
&lt;/li&gt;
&lt;li&gt;Exécution de commandes shell suggérées (avec confirmation)
&lt;/li&gt;
&lt;li&gt;Refactoring et automatisation de workflows multi-étapes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vous pouvez utiliser Copilot CLI de deux manières :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mode interactif&lt;/strong&gt; (mode par défaut) : démarrez une session avec la commande &lt;code&gt;copilot&lt;/code&gt; et conversez en aller‑retour, en affinant les tâches au fil de l’eau. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mode programmatique&lt;/strong&gt; : pour des prompts ponctuels. Passez une requête directement avec &lt;code&gt;-p&lt;/code&gt; ou &lt;code&gt;--prompt&lt;/code&gt;, et Copilot répond en ligne. Pour les tâches impliquant la modification ou l’exécution de fichiers, vous pouvez &lt;a href="https://docs.github.com/en/copilot/concepts/agents/about-copilot-cli#using-the-approval-options" rel="noopener noreferrer"&gt;activer les options d’approbation&lt;/a&gt; pour garder les choses &lt;a href="https://docs.github.com/en/copilot/concepts/agents/about-copilot-cli#security-implications-of-automatic-tool-approval" rel="noopener noreferrer"&gt;sûres&lt;/a&gt; et cohérentes. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Par exemple, vous pouvez demander :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;copilot "create a bash script to check for uncommitted changes and push if clean"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Ffpb0roin41orzrk88v0l.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%2Ffpb0roin41orzrk88v0l.png" alt="Prompt dans la CLI Github" width="800" height="313"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ou bien en mode programmatique :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;copilot -p "create a bash script to check for uncommitted changes and push if clean"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copilot CLI écrira le script, expliquera ce qu’il fait, et vous demandera de confirmer avant de l’exécuter.&lt;/p&gt;

&lt;p&gt;Copilot CLI demandera par défaut toujours une confirmation avant de lire, modifier ou exécuter des fichiers. Vous gardez ainsi donc le contrôle de votre environnement. (Note : Exception si vous choisissez « &lt;strong&gt;Yes, and remember this folder for future sessions&lt;/strong&gt; » ou « &lt;strong&gt;Yes, and approve TOOL for the rest of the session&lt;/strong&gt; » lorsque c’est demandé—Copilot suivra alors ces instructions au lieu de vous reposer la question. Plus de détails dans notre kit de démarrage ci‑dessous !)&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%2Fu405ew6y2xn18tqy6rkm.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%2Fu405ew6y2xn18tqy6rkm.png" alt="Résultat prompt dans la CLI Github" width="800" height="301"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;  Vous pouvez sélectionner l’une de ces options :&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Yes, proceed&lt;/strong&gt; : Copilot peut accéder et utiliser les fichiers de cet emplacement uniquement pour cette session.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Yes, and remember this folder for future sessions&lt;/strong&gt; : les fichiers de ce dossier sont approuvés pour les sessions en cours et futures. En démarrant Copilot CLI depuis ce dossier, cette question ne vous sera plus posée (ne choisissez cette option que si vous êtes sûr qu’il sera toujours sans risque pour Copilot de travailler avec ces fichiers).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No, exit (Esc)&lt;/strong&gt; : mettre fin à votre session Copilot CLI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cas d’usage de GitHub Copilot CLI, refactoring et automatisation de workflows multi-étapes avec un agent&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;L’option &lt;code&gt;--allow-all-tools&lt;/code&gt; dans GitHub Copilot CLI permet d'autoriser Copilot à utiliser automatiquement tous les outils disponibles sur votre système, sans vous demander confirmation à chaque fois.&lt;/p&gt;

&lt;p&gt;Exemple :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;copilot --allow-all-tools -p "create a bash script to check for uncommitted changes and push if clean"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Partie IV : Qualité, sécurité et rôle humain (Les pièges à éviter)
&lt;/h1&gt;

&lt;p&gt;Cette section est dédiée à la responsabilité du développeur et aux erreurs critiques à éviter ⚠️.&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4.1 Prendre les suggestions de Copilot pour des vérités 🤖
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;L’erreur :&lt;/strong&gt; Beaucoup de développeurs acceptent les suggestions de Copilot sans double vérification ✅❌.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pourquoi c’est un problème :&lt;/strong&gt; Le code généré par IA peut sembler correct mais contenir des bugs subtils 🐛, des problèmes de performance ⚡ ou des patterns obsolètes 📉.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Correctif :&lt;/strong&gt; Traitez la sortie de Copilot comme des extraits Stack Overflow : &lt;strong&gt;relisez, testez et refactorisez&lt;/strong&gt; avant de committer ✍️. Demandez-vous toujours : &lt;em&gt;« Est-ce que j’écrirais ceci si Copilot ne me l’avait pas suggéré ? »&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4.2 Ignorer la sécurité du code 🔒
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;L’erreur :&lt;/strong&gt; Copilot peut générer du code non sécurisé (ex. requêtes SQL sans paramétrage, regex dangereuses, gestion faible des mots de passe).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pourquoi c’est un problème :&lt;/strong&gt; L’IA ne priorise pas intrinsèquement les bonnes pratiques de sécurité 🚨. Copier-coller aveuglément peut conduire à des vulnérabilités.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Correctif :&lt;/strong&gt; Appliquez &lt;strong&gt;les pratiques de codage sécurisé&lt;/strong&gt; : validez les entrées ✅, échappez les requêtes 🛡️, nettoyez les sorties ✨. Lancez une analyse statique (ex. SonarQube, plugins de sécurité ESLint) sur le code généré par Copilot.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4.3 Utiliser Copilot comme béquille pour les fondamentaux 🏗️
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;L’erreur :&lt;/strong&gt; S’appuyer sur Copilot au lieu de comprendre le langage ou le framework sous-jacent 📚.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pourquoi c’est un problème :&lt;/strong&gt; Si vous ne savez pas &lt;em&gt;pourquoi&lt;/em&gt; le code fonctionne, vous aurez du mal à le déboguer 🔍 ou l’étendre plus tard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Correctif :&lt;/strong&gt; Utilisez Copilot comme &lt;strong&gt;assistant d’apprentissage&lt;/strong&gt; 🎓, pas comme substitut. Après avoir accepté une suggestion, faites une pause et expliquez-la (à vous-même ou en commentaire) avant de continuer.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4.4 Surcompliquer des solutions simples ✂️
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;L’erreur :&lt;/strong&gt; Copilot génère parfois des solutions verbeuses pour des problèmes qui pourraient être résolus en une ligne 📝.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pourquoi c’est un problème :&lt;/strong&gt; La sur-ingénierie alourdit votre codebase ⚖️ et rend la maintenance plus difficile.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Correctif :&lt;/strong&gt; Gardez &lt;strong&gt;le jugement du développeur&lt;/strong&gt; dans la boucle 👨‍💻. Si la suggestion semble trop longue, demandez-vous s’il existe une solution plus élégante. Less is more.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4.5 Ne pas fournir de contexte pour de meilleures suggestions 🗂️
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;L’erreur :&lt;/strong&gt; Écrire des noms de fonctions ou des commentaires vagues, puis s’attendre à ce que Copilot « sache » ce que vous voulez.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pourquoi c’est un problème :&lt;/strong&gt; L’IA se nourrit de contexte. Sans contexte, les suggestions peuvent être hors sujet ou déroutantes ❓.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Correctif :&lt;/strong&gt; Rédigez &lt;strong&gt;des signatures de fonctions, commentaires et docstrings clairs&lt;/strong&gt; ✏️. Exemple : au lieu de &lt;code&gt;function processData()&lt;/code&gt;, utilisez &lt;code&gt;function normalizeUserInput(userData: string[]): string[]&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4.6 Ne pas garder Copilot dans le bon scope 🎯
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;L’erreur :&lt;/strong&gt; Utiliser Copilot dans de grands fichiers encombrés sans contexte guide 🗃️.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pourquoi c’est un problème :&lt;/strong&gt; Copilot puise le contexte dans le code proche. Si votre fichier est chaotique, les suggestions deviennent moins précises ⚠️.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Correctif :&lt;/strong&gt; Refactorez en modules plus petits et ciblés 🧩. Plus votre code est propre, plus Copilot devient pertinent.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4.7 Zapper les tests parce que « Copilot l’a écrit » 🧪
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;L’erreur :&lt;/strong&gt; Supposer que la sortie de Copilot n’a pas besoin d’être testée en profondeur.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pourquoi c’est un problème :&lt;/strong&gt; Les suggestions de l’IA peuvent introduire des cas limites que vous n’aviez pas anticipés 🚫.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Correctif :&lt;/strong&gt; Écrivez &lt;strong&gt;des tests unitaires, des tests d’intégration et des vérifications de cas limites&lt;/strong&gt; pour tout code généré par Copilot. Bonus : Utilisez Copilot lui-même pour rédiger des cas de test — puis affinez-les manuellement 🛠️.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion : Codez plus intelligemment, pas seulement plus vite
&lt;/h1&gt;

&lt;p&gt;GitHub Copilot n’est plus une autocomplétion ✨ : c’est un partenaire de développement capable d’orchestrer des tâches, d’analyser votre codebase et de s’intégrer à vos outils.  &lt;/p&gt;

&lt;p&gt;En combinant les fondamentaux (IDE vs CLI), les leviers de précision (slash commands, contexte, instructions, sélection) et l'agentique avancée (mode Agent 🤖, MCP 🧩, agents personnalisés 🛠️), vous passez de « coder plus vite » à « livrer mieux, avec maîtrise ».  &lt;/p&gt;

&lt;p&gt;La clé reste humaine 🧠 : cadrer le besoin, donner le bon contexte, et garder un œil critique sur la qualité, la sécurité et les tests.  &lt;/p&gt;

&lt;p&gt;En 2026, la différence viendra de ceux qui standardisent, automatisent et mesurent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Plan d’actions immédiates
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.instructions.md&lt;/code&gt; : formalisez vos normes d’équipe pour des sorties cohérentes.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/tests&lt;/code&gt; et &lt;code&gt;/fix&lt;/code&gt; : sécurisez la qualité dès le flux quotidien.&lt;/li&gt;
&lt;li&gt;Commentaire‑d’abord : décrivez architecture et cas limites avant de coder.&lt;/li&gt;
&lt;li&gt;Contexte ciblé : ouvrez 3–5 fichiers pertinents, fermez le reste.&lt;/li&gt;
&lt;li&gt;Copilot CLI : installez‑le et utilisez‑le pour scripts, issues et PR.&lt;/li&gt;
&lt;li&gt;1 agent personnalisé : « Réviseur Sécurité » ou « Planificateur » + un handoff simple.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cap sur 2026 : standardisez, automatisez, mesurez. Faites de Copilot votre accélérateur — et de vos pratiques, votre avantage.&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%2Fg0ws4p3nh2xjtlt4dl0s.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%2Fg0ws4p3nh2xjtlt4dl0s.png" alt="Infographie bilan" width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Explorez plus de contenus sur GitHub et Copilot
&lt;/h2&gt;

&lt;p&gt;Tout ce dont vous avez besoin pour maîtriser GitHub Copilot :&lt;/p&gt;

&lt;h3&gt;
  
  
  Documentation officielle
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/copilot" rel="noopener noreferrer"&gt;Documentation GitHub Copilot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/" rel="noopener noreferrer"&gt;Documentation complète GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/copilot/concepts/agents/about-copilot-cli" rel="noopener noreferrer"&gt;GitHub Copilot CLI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  VS Code et Copilot
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://code.visualstudio.com/docs/copilot" rel="noopener noreferrer"&gt;VS Code Copilot Tips&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.visualstudio.com/docs/copilot/copilot-customization" rel="noopener noreferrer"&gt;Personnalisation de Copilot dans VS Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.visualstudio.com/docs/copilot/chat/copilot-chat" rel="noopener noreferrer"&gt;GitHub Copilot Chat dans VS Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.visualstudio.com/docs/copilot/chat/chat-modes" rel="noopener noreferrer"&gt;Modes de chat personnalisés&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.visualstudio.com/docs/getstarted/settings" rel="noopener noreferrer"&gt;Paramètres VS Code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ressources complémentaires
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.blog/changelog/" rel="noopener noreferrer"&gt;Copilot Chat Cheat Sheet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/customer-stories" rel="noopener noreferrer"&gt;Témoignages utilisateurs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://the-github-podcast.simplecast.com/" rel="noopener noreferrer"&gt;Le podcast GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
      <category>ai</category>
      <category>githubcopilot</category>
      <category>adventoftech2025</category>
    </item>
    <item>
      <title>Hibernate : l’art du tuning qui transforme une application Java lente en application ultra-performante</title>
      <dc:creator>Patrice Eon</dc:creator>
      <pubDate>Mon, 01 Dec 2025 19:11:39 +0000</pubDate>
      <link>https://dev.to/onepoint/hibernate-lart-du-tuning-qui-transforme-une-application-java-lente-en-application-1dnj</link>
      <guid>https://dev.to/onepoint/hibernate-lart-du-tuning-qui-transforme-une-application-java-lente-en-application-1dnj</guid>
      <description>&lt;p&gt;Optimiser l’accès à la base de données, c’est un peu le nerf de la guerre pour toute appli Java qui vise la haute performance. &lt;/p&gt;

&lt;p&gt;Et ça tombe bien : Hibernate est là pour nous simplifier la vie. Ce framework ORM évite de plonger les mains dans le SQL brut… mais attention : mal utilisé, il peut aussi plomber les performances !&lt;/p&gt;

&lt;p&gt;Dans cet article, je vous embarque dans les coulisses de l’optimisation Hibernate avec un guide complet, concret et efficace.... Enfin je l'espère 😃.&lt;/p&gt;

&lt;p&gt;Mon objectif est de faire de vous un expert en performance hibernate. Ne perdons pas de temps allons-y !&lt;/p&gt;

&lt;h1&gt;
  
  
  Table des matières
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;Qu’est-ce que Hibernate et quel est son rôle dans les applications Java ?&lt;/li&gt;
&lt;li&gt;Quels sont les optimisations essentielles de la configuration Hibernate ?&lt;/li&gt;
&lt;li&gt;Qu’elle est l’importance d’un mapping efficace des entités pour la performance ?&lt;/li&gt;
&lt;li&gt;Qu’est-ce que le Lazy &amp;amp; Eager Loading dans Hibernate ?&lt;/li&gt;
&lt;li&gt;Pourquoi la mise en cache est-elle cruciale avec Hibernate ?&lt;/li&gt;
&lt;li&gt;Qu’est-ce que HQL et Criteria API ?&lt;/li&gt;
&lt;li&gt;Pourquoi le traitement par lots est-il important pour la performance ?&lt;/li&gt;
&lt;li&gt;Quelle est l’importance d’une gestion efficace des connexions à la base de données ?&lt;/li&gt;
&lt;li&gt;Quelle est l’importance du profilage et du monitoring pour le tuning de performance ?&lt;/li&gt;
&lt;li&gt;Qu’est-ce que les Interceptors et Event Listeners Hibernate ?&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1 - Qu’est-ce que Hibernate et quel est son rôle dans les applications Java ?
&lt;/h2&gt;

&lt;p&gt;Hibernate est un framework open source qui fournit une solution complète pour la persistance des données dans des bases relationnelles.&lt;/p&gt;

&lt;p&gt;Concrètement ses apports principaux sont :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Persistence transparente : Hibernate gère de manière transparente le mapping des classes vers les tables, permettant aux développeurs d’effectuer des opérations CRUD sans écrire de SQL.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;HQL (Hibernate Query Language) : Un langage de requête puissant qui permet d’interroger la base de données en utilisant une syntaxe orientée objet.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Caching : Support intégré pour le cache de premier et de second niveau afin d’améliorer les performances.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lazy Loading : Chargement des données liées à la demande, réduisant ainsi les requêtes inutiles et améliorant l’efficacité.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Génération automatique des tables : Hibernate peut générer automatiquement les tables de la base de données en fonction des mappings d’entités.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dans la suite de cet article, nous allons explorer comment tirer le meilleur parti de ces différents apports en termes de performances.&lt;/p&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2 - Quels sont les optimisations essentielles de la configuration Hibernate ?
&lt;/h2&gt;

&lt;p&gt;Hibernate se configure a travers le fichier hibernate.cfg.xml de votre application java. &lt;/p&gt;

&lt;p&gt;Voici quelques conseils pour régler les paramètres clés :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pooling de connexions&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Minimiser les connexions inactives : Définir le nombre minimum de connexions inactives à une valeur basse pour réduire l’utilisation des ressources.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Maximiser les connexions actives : S’assurer que le nombre maximum de connexions actives est suffisant pour gérer les charges de pointe sans provoquer de contention.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Période de test des connexions inactives : Définir une période de test appropriée pour valider périodiquement les connexions et fermer celles qui ne sont pas utilisées.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Mise en cache&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Utiliser le second niveau de cache avec parcimonie : Activer le cache de second niveau uniquement pour les entités majoritairement en lecture pour réduire la fréquence des accès à la base de données.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Choisir le bon fournisseur de cache : Sélectionner un fournisseur de cache adapté aux exigences de performance et de scalabilité de l’application, comme EhCache ou Infinispan.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Stratégies de fetch&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Batch Fetching : Configurer le batch fetching pour les collections et les associations afin de réduire le nombre de requêtes SQL exécutées par Hibernate.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Utiliser le Lazy Loading : Préférer le lazy loading pour les associations afin de ne récupérer que les données nécessaires, réduisant ainsi le chargement de données inutiles.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Affichage SQL&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Désactiver en production : Désactiver l’enregistrement SQL dans les environnements de production pour éviter une surcharge de performance et des journaux encombrés.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Correspondre à la version de la base de données : S’assurer que le dialecte correspond à la version spécifique de la base de données pour tirer parti d’une génération SQL optimisée.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;📌 Voici un exemple de configuration dans hibernate.cfg.xml qui intègre les bonnes pratiques mentionnées ci-dessus&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"&amp;gt;
&amp;lt;hibernate-configuration&amp;gt;
  &amp;lt;session-factory&amp;gt;
    &amp;lt;!-- Paramètres de connexion --&amp;gt;
    &amp;lt;property name="hibernate.connection.driver_class"&amp;gt;com.ibm.as400.access.AS400JDBCDriver&amp;lt;/property&amp;gt;
    &amp;lt;property name="hibernate.connection.url"&amp;gt;jdbc:as400://u3reca42.recgroupement.systeme-u.fr/cobalt&amp;lt;/property&amp;gt;
    &amp;lt;property name="hibernate.connection.username"&amp;gt;user&amp;lt;/property&amp;gt;
    &amp;lt;property name="hibernate.connection.password"&amp;gt;password&amp;lt;/property&amp;gt;
    &amp;lt;!-- Dialecte --&amp;gt;
    &amp;lt;property name="hibernate.dialect"&amp;gt;org.hibernate.dialect.DB2400Dialect&amp;lt;/property&amp;gt;
    &amp;lt;!-- Pool de connexions (c3p0) --&amp;gt;
    &amp;lt;property name="hibernate.c3p0.min_size"&amp;gt;5&amp;lt;/property&amp;gt;
    &amp;lt;property name="hibernate.c3p0.max_size"&amp;gt;20&amp;lt;/property&amp;gt;
    &amp;lt;property name="hibernate.c3p0.timeout"&amp;gt;300&amp;lt;/property&amp;gt;
    &amp;lt;property name="hibernate.c3p0.max_statements"&amp;gt;50&amp;lt;/property&amp;gt;
    &amp;lt;property name="hibernate.c3p0.idle_test_period"&amp;gt;3000&amp;lt;/property&amp;gt;
    &amp;lt;!-- Cache second niveau --&amp;gt;
    &amp;lt;property name="hibernate.cache.use_second_level_cache"&amp;gt;true&amp;lt;/property&amp;gt;
    &amp;lt;property name="hibernate.cache.region.factory_class"&amp;gt;org.hibernate.cache.ehcache.EhCacheRegionFactory&amp;lt;/property&amp;gt;
    &amp;lt;!-- SQL --&amp;gt;
    &amp;lt;property name="hibernate.show_sql"&amp;gt;false&amp;lt;/property&amp;gt;
    &amp;lt;!-- Fetch --&amp;gt;
    &amp;lt;property name="hibernate.default_batch_fetch_size"&amp;gt;16&amp;lt;/property&amp;gt;
    &amp;lt;!-- Transactions --&amp;gt;
    &amp;lt;property name="hibernate.transaction.factory_class"&amp;gt;org.hibernate.transaction.JTATransactionFactory&amp;lt;/property&amp;gt;
    &amp;lt;property name="hibernate.transaction.manager_lookup_class"&amp;gt;org.hibernate.transaction.JBossTransactionManagerLookup&amp;lt;/property&amp;gt;
    &amp;lt;!-- Entités annotées --&amp;gt;
    &amp;lt;mapping class="com.example.YourEntityClass"/&amp;gt;
  &amp;lt;/session-factory&amp;gt;
&amp;lt;/hibernate-configuration&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3 - Qu’elle est l’importance d’un mapping efficace des entités pour la performance ?
&lt;/h2&gt;

&lt;p&gt;Une fois hibernate bien configurer, il est important de prévoir le bon mapping dans application java, entre vos données en base et votre code java. &lt;/p&gt;

&lt;p&gt;Celui-ci va permettre :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;De réduite la charge sur la base de données : Un mapping efficace minimise le nombre de requêtes et optimise le SQL généré par Hibernate.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Des requêtes améliorée : Des entités bien mappées permettent à Hibernate d’exécuter les requêtes plus efficacement, réduisant le temps nécessaire pour récupérer et mettre à jour les données. Cela est particulièrement important pour les requêtes complexes et les grands ensembles de données.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Une utilisation améliorée des ressources : Des mappings efficaces garantissent une meilleure utilisation des ressources système telles que la mémoire et le CPU, prévenant les goulots d’étranglement et améliorant la scalabilité.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Une cohérence et intégrité : Un mapping approprié aide à maintenir la cohérence et l’intégrité des données, réduisant ainsi la probabilité d’erreurs et de corruption des données.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;📌 &lt;strong&gt;Concrètement comment mettre en œuvre un bon mapping sur les entités aux tables de la base de données ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Utiliser les annotations appropriées&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;@Entity : Marque une classe comme une entité, qui sera mappée à une table de base de données.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;@Table : Spécifie le nom de la table s’il diffère du nom de l’entité.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/id"&gt;@id&lt;/a&gt; : Identifie la clé primaire de l’entité.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;@GeneratedValue : Définit la stratégie de génération de la clé primaire.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/column"&gt;@column&lt;/a&gt; : Personnalise le mapping entre les champs de l’entité et les colonnes de la base de données.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Définir explicitement les relations&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;@OneToOne : Mappe une relation un-à-un.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;@OneToMany : Mappe une relation un-à-plusieurs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;@ManyToOne : Mappe une relation plusieurs-à-un.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;@ManyToMany : Mappe une relation plusieurs-à-plusieurs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;@JoinColumn : Spécifie la colonne de clé étrangère dans une relation.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Optimiser les stratégies de fetch&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Lazy Loading : Utiliser le lazy loading pour ne charger les entités liées que lorsque cela est nécessaire, réduisant ainsi les requêtes inutiles à la base de données.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Eager Loading : Utiliser l’eager loading pour les relations toujours accédées ensemble afin d’optimiser les performances.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Indexer les colonnes fréquemment interrogées&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;@Index : Utiliser des index sur les colonnes fréquemment interrogées pour accélérer les opérations de recherche.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Utiliser le batch fetching&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Configurer le batch fetching pour réduire le nombre de requêtes SQL exécutées par Hibernate pour les collections et les associations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemple de mapping d’entité optimisé avec des annotations&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Considérons un exemple simple de mapping optimisé pour une relation User et Order dans une application de commerce électronique.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Entité User:&lt;/em&gt;&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;import javax.persistence.*;
import java.util.Set;

@Entity
@Table(name = "users")
public class User {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "user_id")
  private Long id;

  @Column(name = "username", nullable = false, unique = true)
  private String username;

  @Column(name = "email", nullable = false, unique = true)
  private String email;

  @OneToMany(mappedBy = "user", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
  private Set&amp;lt;Order&amp;gt; orders;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Entité Order:&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;import javax.persistence.*;
import java.util.Date;

@Entity
@Table(name = "orders")
public class Order {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "order_id")
  private Long id;

  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "user_id", nullable = false)
  private User user;

  @Column(name = "order_date", nullable = false)
  @Temporal(TemporalType.DATE)
  private Date orderDate;

  @Column(name = "total_amount", nullable = false)
  private Double totalAmount;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explication de l’exemple:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Annotations Entity &amp;amp; Table : Les classes User et Order sont marquées avec l’annotation @Entity, et l’annotation @Table spécifie les noms de table correspondants.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Génération de clé primaire : Les annotations &lt;a class="mentioned-user" href="https://dev.to/id"&gt;@id&lt;/a&gt; et @GeneratedValue définissent la clé primaire et sa stratégie de génération.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mappings de colonnes : L’annotation &lt;a class="mentioned-user" href="https://dev.to/column"&gt;@column&lt;/a&gt; personnalise le mapping entre les champs de l’entité et les colonnes de la base de données, y compris les contraintes telles que nullable et unique.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Relations : Les annotations @OneToMany et @ManyToOne définissent les relations entre User et Order. Le paramètre fetch = FetchType.LAZY dans l’annotation @OneToMany garantit que les entités liées ne sont chargées que lorsqu’elles sont accédées, optimisant ainsi les performances.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Opérations en cascade : Le paramètre cascade = CascadeType.ALL dans l’annotation @OneToMany garantit que toutes les entités Order liées sont automatiquement persistées lorsque l’entité User est persistée.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4- Qu’est-ce que le Lazy &amp;amp; Eager Loading dans Hibernate ?
&lt;/h2&gt;

&lt;p&gt;Le lazy et eager loading sont deux notions clés dans Hibernate qui déterminent quand et comment les données associées sont récupérées depuis la base de données. Comprendre ces stratégies est essentiel pour optimiser les performances de vos applications.&lt;/p&gt;

&lt;p&gt;Dans cette section, je vais :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Expliquer le lazy et l’eager loading&lt;/li&gt;
&lt;li&gt;Comparer leurs avantages et inconvénients&lt;/li&gt;
&lt;li&gt;Donner des bonnes pratiques pour choisir la stratégie adaptée&lt;/li&gt;
&lt;li&gt;Montrer un exemple concret de configuration&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;📌 &lt;strong&gt;Qu’est-ce que le Lazy Loading ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Le lazy loading charge une entité ou une collection uniquement lorsqu’elle est utilisée pour la première fois. Autrement dit, les données associées ne sont récupérées qu’à la demande, ce qui réduit le nombre de requêtes et la quantité de données chargées, améliorant ainsi les performances.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Entity
public class User {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
  private Set&amp;lt;Order&amp;gt; orders;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dans cet exemple, la collection orders de l’entité User est marquée avec fetch = FetchType.LAZY, ce qui signifie que les commandes ne seront chargées que lorsque la méthode getOrders() sera appelée.&lt;/p&gt;




&lt;p&gt;📌 &lt;strong&gt;Qu’est-ce que l’Eager Loading ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;L’eager loading charge toutes les données liées dès le départ, en même temps que l’entité principale — même si vous n’en avez pas besoin tout de suite. C’est pratique pour avoir toutes les infos sous la main, mais cela peut ralentir l’application si les données sont nombreuses.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Entity
public class User {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @OneToMany(mappedBy = "user", fetch = FetchType.EAGER)
  private Set&amp;lt;Order&amp;gt; orders;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dans cet exemple, la collection orders de l’entité User est marquée avec fetch = FetchType.EAGER, ce qui signifie que les commandes seront chargées dès que l’entité User sera récupérée.&lt;/p&gt;




&lt;p&gt;📌 &lt;strong&gt;Evaluation des avantages et les inconvénients de chaque stratégie de chargement ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Lazy Loading:&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Amélioration des performances de chargement initial : Réduit le temps de chargement initial en ne récupérant que les données nécessaires.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Réduction de l’utilisation de la mémoire : Charge les données liées uniquement lorsque cela est nécessaire, économisant ainsi de la mémoire.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Meilleure scalabilité : Améliore la scalabilité en minimisant la quantité de données transférées et traitées initialement.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Inconvénients&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Problème N+1 : Peut entraîner l’exécution de plusieurs requêtes si les collections chargées paresseusement sont accédées dans une boucle.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Complexité : Nécessite une gestion soigneuse pour éviter des exceptions inattendues d’initialisation paresseuse.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Eager Loading:&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Simplicité : Récupère toutes les données liées en une seule requête, simplifiant l’accès aux données.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Évite le problème N+1 : Garantit que toutes les données requises sont chargées en une seule fois, évitant ainsi plusieurs requêtes à la base de données.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Inconvénients&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Augmentation du temps de chargement initial : Peut augmenter le temps de chargement initial en récupérant toutes les données liées à l’avance, même si elles ne sont pas nécessaires immédiatement.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Utilisation plus élevée de la mémoire : Charge toutes les données liées en mémoire, ce qui peut être inefficace si les données ne sont pas accédées.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;📌 &lt;strong&gt;Comment choisir la stratégie de chargement appropriée ?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Analyser les patterns d’accès : Comprendre comment et quand les données liées sont accédées dans votre application. Utilisez le lazy loading pour les données rarement accédées et l’eager loading pour les données fréquemment utilisées.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Éviter le problème N+1 : Lors de l’utilisation du lazy loading, soyez conscient du problème N+1 et utilisez le batch fetching ou le join fetching pour optimiser les performances.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tester et surveiller : Testez et surveillez régulièrement les performances de votre application pour identifier l’impact des stratégies de chargement et apporter des ajustements si nécessaire.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Utiliser des fetch profiles : Hibernate permet de définir des profils de fetch pour ajuster dynamiquement les stratégies de chargement en fonction de cas d’utilisation spécifiques, offrant ainsi une flexibilité dans le chargement des données liées.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5 - Pourquoi la mise en cache est-elle cruciale avec Hibernate ?
&lt;/h2&gt;

&lt;p&gt;La mise en cache joue un rôle majeur dans Hibernate dans cette section, on va voir :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pourquoi la mise en cache est extrêmement importante,&lt;/li&gt;
&lt;li&gt;La différence entre le cache de premier niveau et le cache de second niveau,&lt;/li&gt;
&lt;li&gt;Comment les configurer efficacement,&lt;/li&gt;
&lt;li&gt;Et un exemple concret avec EhCache pour le cache de second niveau.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;📌 &lt;strong&gt;Pourquoi la mise en cache est-elle importante dans Hibernate pour la performance ?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Accès réduit à la base de données : La mise en cache stocke les données fréquemment accédées en mémoire, réduisant ainsi le besoin de requêtes répétées à la base de données. Cela minimise la charge sur la base de données et accélère la récupération des données.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Amélioration des performances de l’application : En servant les données à partir du cache, les applications peuvent répondre plus rapidement aux requêtes des utilisateurs, ce qui améliore les performances et l’expérience utilisateur.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Scalabilité améliorée : La mise en cache aide les applications à gérer des charges plus élevées en déchargeant le travail de la base de données vers le cache, facilitant ainsi la scalabilité de l’application.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Efficacité économique : La réduction du nombre de requêtes à la base de données peut diminuer les coûts opérationnels associés à l’utilisation de la base de données, tels que les coûts de licence et d’infrastructure.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;📌 &lt;strong&gt;Quelles sont les différences entre le cache de premier et de second niveau ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Cache de premier niveau (Session):&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Portée : Associé à l’objet Session d’Hibernate. Activé par défaut et existe uniquement pendant la durée de la session.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cycle de vie : Le cache est vidé lorsque la session est fermée, ce qui signifie que les entités mises en cache ne sont disponibles que dans la même session.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Granularité : Transactionnel, c’est-à-dire qu’il met en cache des objets par session.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mise en œuvre : Aucune configuration supplémentaire n’est requise car elle est intégrée à Hibernate.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Cache de second niveau (SessionFactory):&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Portée : Associé à l’objet SessionFactory d’Hibernate. Peut mettre en cache des entités entre plusieurs sessions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cycle de vie : Le cache persiste au-delà des sessions individuelles, permettant le partage des entités mises en cache à travers l’application.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Granularité: Peut mettre en cache des entités, des collections et des résultats de requêtes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mise en œuvre : Nécessite une configuration supplémentaire et un fournisseur de cache externe (par exemple, EhCache, Hazelcast, Infinispan).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;📌&lt;strong&gt;Comment configurer et utiliser efficacement la mise en cache ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Configuration du cache de premier niveau:&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Le cache de premier niveau est activé par défaut dans Hibernate, sans aucune configuration. Il met automatiquement en cache les entités au niveau de la session, ce qui permet d’éviter des requêtes répétées pendant celle-ci.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Configuration du cache de second niveau:&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Activer le cache de second niveau :&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dans le fichier hibernate.cfg.xml ou fichier de configuration équivalent, activer le cache de second niveau.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;property name="hibernate.cache.use_second_level_cache"&amp;gt;true&amp;lt;/property&amp;gt;
&amp;lt;property name="hibernate.cache.region.factory_class"&amp;gt;org.hibernate.cache.ehcache.EhCacheRegionFactory&amp;lt;/property&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Configurer le fournisseur de cache :&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Choisir un fournisseur de cache comme EhCache et le configurer dans le hibernate.cfg.xml.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;property name="hibernate.cache.region.factory_class"&amp;gt;org.hibernate.cache.ehcache.EhCacheRegionFactory&amp;lt;/property&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Configurer les régions de cache :&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Définir les régions de cache dans le fichier de configuration du fournisseur de cache (par exemple, ehcache.xml pour EhCache).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;ehcache&amp;gt;
  &amp;lt;cache name="com.example.entity.User" maxEntriesLocalHeap="1000" timeToLiveSeconds="3600"/&amp;gt;
  &amp;lt;cache name="com.example.entity.Order" maxEntriesLocalHeap="1000" timeToLiveSeconds="3600"/&amp;gt;
&amp;lt;/ehcache&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Annoter les entités pour la mise en cache :&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Utiliser les annotations Hibernate pour spécifier quelles entités doivent être mises en cache.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Entity
@Cacheable
@org.hibernate.annotations.Cache(usage = org.hibernate.annotations.CacheConcurrencyStrategy.READ_WRITE, region = "com.example.entity.User")
public class User {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Exemple de configuration d’EhCache pour le cache de second niveau&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Étape 1: Ajouter les dépendances&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;S’assurer que vous avez les dépendances nécessaires pour EhCache dans votre fichier pom.xml (pour Maven) ou build.gradle (pour Gradle).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
  &amp;lt;groupId&amp;gt;org.hibernate&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;hibernate-core&amp;lt;/artifactId&amp;gt;
  &amp;lt;version&amp;gt;5.4.0.Final&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
  &amp;lt;groupId&amp;gt;org.hibernate&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;hibernate-ehcache&amp;lt;/artifactId&amp;gt;
  &amp;lt;version&amp;gt;5.4.0.Final&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
  &amp;lt;groupId&amp;gt;net.sf.ehcache&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;ehcache&amp;lt;/artifactId&amp;gt;
  &amp;lt;version&amp;gt;2.10.6&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Étape 2: Configurer Hibernate pour utiliser EhCache&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Dans le fichier hibernate.cfg.xml, activer le cache de second niveau et spécifier EhCache comme fournisseur de cache.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;hibernate-configuration&amp;gt;
  &amp;lt;session-factory&amp;gt;
    &amp;lt;property name="hibernate.cache.use_second_level_cache"&amp;gt;true&amp;lt;/property&amp;gt;
    &amp;lt;property name="hibernate.cache.region.factory_class"&amp;gt;org.hibernate.cache.ehcache.EhCacheRegionFactory&amp;lt;/property&amp;gt;
  &amp;lt;/session-factory&amp;gt;
&amp;lt;/hibernate-configuration&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Étape 3: Créer le fichier de configuration d’EhCache&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Créer un fichier ehcache.xml dans le classpath et définir les régions de cache pour vos entités.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;ehcache&amp;gt;
  &amp;lt;defaultCache maxEntriesLocalHeap="1000" eternal="false" timeToLiveSeconds="120" timeToIdleSeconds="120" overflowToDisk="false"/&amp;gt;
  &amp;lt;cache name="com.example.entity.User" maxEntriesLocalHeap="1000" timeToLiveSeconds="3600"/&amp;gt;
  &amp;lt;cache name="com.example.entity.Order" maxEntriesLocalHeap="1000" timeToLiveSeconds="3600"/&amp;gt;
&amp;lt;/ehcache&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Étape 4: Annoter les entités pour la mise en cache&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Annoter les entités que vous souhaitez mettre en cache avec @Cacheable et spécifier la région de cache.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Entity
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "com.example.entity.User")
public class User {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;
}

@Entity
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "com.example.entity.Order")
public class Order {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "user_id")
  private User user;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6 - Qu’est-ce que HQL et Criteria API ?
&lt;/h2&gt;

&lt;p&gt;Hibernate propose deux façons principales de créer des requêtes : HQL (Hibernate Query Language) et Criteria API.&lt;/p&gt;

&lt;p&gt;Dans cette section, nous verrons :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;comment utiliser HQL et Criteria API,&lt;/li&gt;
&lt;li&gt;les bonnes pratiques pour écrire des requêtes efficaces,&lt;/li&gt;
&lt;li&gt;et des exemples concrets de requêtes optimisées avec les deux méthodes.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;📌 &lt;strong&gt;Qu’est-ce que HQL (Hibernate Query Language) ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;HQL est un langage de requête orienté objet, proche du SQL, mais qui travaille sur les entités Java plutôt que directement sur les tables. Hibernate traduit vos requêtes HQL en SQL, vous permettant de profiter pleinement des avantages de l’ORM.&lt;/p&gt;

&lt;p&gt;Caractéristiques de HQL:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Orienté objet : Opère sur des objets et leurs propriétés.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Indépendant de la base de données : Abstrait le SQL sous-jacent, rendant l’application plus portable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Supporte le polymorphisme : Permet des requêtes sur des classes et leurs sous-classes.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;📌 &lt;strong&gt;Qu’est-ce que Criteria API ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;La Criteria API permet de créer des requêtes de façon programmatique et sécurisée. Elle offre une approche orientée objet, idéale pour les requêtes dynamiques dont la structure peut changer selon certaines conditions.&lt;/p&gt;

&lt;p&gt;Caractéristiques de Criteria API :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Type-safe : Assure que les requêtes sont vérifiées pour leur exactitude au moment de la compilation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Création dynamique de requêtes : Facilite la création de requêtes de manière dynamique, basée sur l’entrée de l’utilisateur ou la logique de l’application.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Approche programmatique : Fournit une API pour construire des requêtes de manière programmatique.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;📌 &lt;strong&gt;Comment écrire des requêtes efficaces avec HQL et Criteria API ?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sélectionner uniquement les colonnes requises : Éviter d’utiliser SELECT *. Spécifier uniquement les colonnes nécessaires.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT u.username, u.email FROM User u
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Utiliser des fetch joins : Utiliser des fetch joins pour optimiser le chargement des entités liées.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT u FROM User u JOIN FETCH u.orders WHERE u.id = :userId
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Pagination : Implémenter la pagination pour les requêtes renvoyant de grands ensembles de résultats.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Query query = session.createQuery("FROM User");
query.setFirstResult(0);
query.setMaxResults(10);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Éviter le problème N+1 : Utiliser JOIN FETCH ou le batch fetching pour éviter le problème N+1.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT u FROM User u JOIN FETCH u.orders
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Indexation : S’assurer que les tables de la base de données sont correctement indexées pour les colonnes utilisées dans la clause WHERE.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mises à jour par lots : Utiliser des mises à jour par lots pour gérer efficacement de grands volumes de données.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Exemples de requêtes optimisées utilisant HQL&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Requête de base :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;String hql = "FROM User WHERE email = :email";
Query query = session.createQuery(hql);
query.setParameter("email", "example@example.com");
List results = query.list();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemple de fetch join :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;String hql = "SELECT u FROM User u JOIN FETCH u.orders WHERE u.id = :userId";
Query query = session.createQuery(hql);
query.setParameter("userId", 1L);
User user = (User) query.uniqueResult();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemple de pagination :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;String hql = "FROM User";
Query query = session.createQuery(hql);
query.setFirstResult(0);
query.setMaxResults(10);
List results = query.list();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Exemples de requêtes optimisées utilisant Criteria API&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Requête de base :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Session session = sessionFactory.openSession();
CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery&amp;lt;User&amp;gt; cq = cb.createQuery(User.class);
Root&amp;lt;User&amp;gt; root = cq.from(User.class);
cq.select(root).where(cb.equal(root.get("email"), "example@example.com"));
Query&amp;lt;User&amp;gt; query = session.createQuery(cq);
List&amp;lt;User&amp;gt; results = query.getResultList();
session.close();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemple de fetch join :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Session session = sessionFactory.openSession();
CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery&amp;lt;User&amp;gt; cq = cb.createQuery(User.class);
Root&amp;lt;User&amp;gt; root = cq.from(User.class);
root.fetch("orders", JoinType.LEFT);
cq.select(root).where(cb.equal(root.get("id"), 1L));
Query&amp;lt;User&amp;gt; query = session.createQuery(cq);
User user = query.getSingleResult();
session.close();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemple de pagination :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Session session = sessionFactory.openSession();
CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery&amp;lt;User&amp;gt; cq = cb.createQuery(User.class);
Root&amp;lt;User&amp;gt; root = cq.from(User.class);
cq.select(root);
Query&amp;lt;User&amp;gt; query = session.createQuery(cq);
query.setFirstResult(0);
query.setMaxResults(10);
List&amp;lt;User&amp;gt; results = query.getResultList();
session.close();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  7 - Pourquoi le traitement par lots est-il important pour la performance ?
&lt;/h2&gt;

&lt;p&gt;Hibernate permet de traiter les insertions, mises à jour et suppressions par lots.&lt;/p&gt;

&lt;p&gt;Dans cette section, nous verrons :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pourquoi le traitement par lots est important pour les performances,&lt;/li&gt;
&lt;li&gt;Comment configurer Hibernate pour le supporter,&lt;/li&gt;
&lt;li&gt;Et des exemples concrets d’opérations par lots.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;📌 &lt;strong&gt;Pourquoi le traitement par lots est-il important pour la performance ?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Réduction des allers-retours à la base de données : Le traitement par lots minimise le nombre d’allers-retours à la base de données en regroupant plusieurs opérations dans une seule transaction. Cela réduit le coût associé à chaque appel à la base de données et améliore les performances globales.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Amélioration du débit : En traitant plusieurs enregistrements dans un seul lot, le débit des opérations de base de données est considérablement augmenté, ce qui entraîne un traitement des données plus rapide.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Utilisation efficace des ressources : Le traitement par lots optimise l’utilisation des ressources de la base de données et du réseau, conduisant à de meilleures performances et à une charge réduite sur le serveur de base de données.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Gestion des transactions : Regrouper les opérations dans une seule transaction garantit la cohérence et l’intégrité des données, facilitant la gestion et le rollback des modifications si nécessaire.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;📌 &lt;strong&gt;Comment configurer Hibernate pour le traitement par lots ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pour activer le traitement par lots dans Hibernate, vous devez configurer la taille du lot dans le fichier hibernate.cfg.xml ou fichier de configuration équivalent.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;hibernate-configuration&amp;gt;
  &amp;lt;session-factory&amp;gt;
    &amp;lt;!-- Autres configurations --&amp;gt;
    &amp;lt;!-- Configurer la taille du lot --&amp;gt;
    &amp;lt;property name="hibernate.jdbc.batch_size"&amp;gt;50&amp;lt;/property&amp;gt;
  &amp;lt;/session-factory&amp;gt;
&amp;lt;/hibernate-configuration&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;Optimisation du traitement par lots&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Taille du lot : Choisir une taille de lot optimale qui équilibre performances et utilisation des ressources. Une taille de lot trop petite peut ne pas offrir d’avantages significatifs en termes de performances, tandis qu’une taille trop grande peut submerger la base de données.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mise en lot JDBC : S’assurer que le pilote JDBC prend en charge la mise en lot et est correctement configuré pour gérer les opérations par lots.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Flush &amp;amp; Clear : Vider et effacer périodiquement la session Hibernate pour éviter les problèmes de mémoire et garantir que les modifications sont persistées dans la base de données.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Exemples d’opérations d’insertion, de mise à jour et de suppression par lots&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;L’insertion par lots consiste à enregistrer des entités par groupes plutôt qu’une par une.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
int batchSize = 50;
for (int i = 0; i &amp;lt; users.size(); i++) {
  session.save(users.get(i));
  if (i % batchSize == 0) {
    session.flush();
    session.clear();
  }
}
transaction.commit();
session.close();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;Mise à jour par lots&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;La mise à jour par lots consiste à modifier plusieurs entités dans un seul lot.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Query&amp;lt;User&amp;gt; query = session.createQuery("FROM User", User.class);
List&amp;lt;User&amp;gt; users = query.getResultList();
for (int i = 0; i &amp;lt; users.size(); i++) {
  User user = users.get(i);
  user.setEmail(user.getUsername() + "@newdomain.com");
  session.update(user);
  if (i % 50 == 0) {
    session.flush();
    session.clear();
  }
}
transaction.commit();
session.close();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;Suppression par lots&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;La suppression par lots consiste à supprimer plusieurs entités dans un seul lot.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Query&amp;lt;User&amp;gt; query = session.createQuery("FROM User WHERE username LIKE 'User%'", User.class);
List&amp;lt;User&amp;gt; users = query.getResultList();
for (int i = 0; i &amp;lt; users.size(); i++) {
  User user = users.get(i);
  session.delete(user);
  if (i % 50 == 0) {
    session.flush();
    session.clear();
  }
}
transaction.commit();
session.close();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  8 - Quelle est l’importance d’une gestion efficace des connexions à la base de données ?
&lt;/h2&gt;

&lt;p&gt;Une gestion efficace des connexions est cruciale pour que les applications Hibernate restent rapides et scalables.&lt;/p&gt;

&lt;p&gt;Dans cette section, nous verrons :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pourquoi gérer correctement les connexions est important,&lt;/li&gt;
&lt;li&gt;Les bonnes pratiques pour configurer le pooling de connexions,&lt;/li&gt;
&lt;li&gt;Et un exemple concret avec HikariCP.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;📌 &lt;strong&gt;Pourquoi une gestion efficace des connexions à la base de données est-elle importante ?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Utilisation des ressources : Une gestion efficace des connexions garantit une utilisation optimale des ressources de la base de données. En réutilisant les connexions existantes au lieu d’en ouvrir de nouvelles, les applications peuvent réduire le coût associé à l’établissement et à la fermeture des connexions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Amélioration des performances : Des connexions correctement gérées minimisent le temps d’attente pour des connexions disponibles, réduisant ainsi la latence et améliorant les temps de réponse pour les opérations de base de données.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Scalabilité : Un pooling de connexions efficace permet aux applications de gérer un plus grand nombre d’utilisateurs et de transactions simultanés, améliorant ainsi la scalabilité.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Stabilité et fiabilité : Des pools de connexions bien configurés préviennent l’épuisement des ressources et garantissent que la base de données reste réactive sous des charges élevées, conduisant à des applications plus stables et fiables.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;📌 &lt;strong&gt;Comment configurer efficacement le pooling de connexions ?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Choisir la bonne taille de pool : La taille du pool doit être suffisamment grande pour gérer les charges de pointe, mais pas trop grande pour submerger le serveur de base de données. Un point de départ typique est de définir la taille du pool sur le nombre de cœurs CPU disponibles multiplié par 2.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Surveiller et ajuster les paramètres du pool : Surveiller régulièrement les métriques du pool de connexions telles que la taille du pool, les temps d’attente et l’utilisation des connexions pour ajuster les paramètres afin d’optimiser les performances.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Définir un délai d’expiration des connexions : Configurer un délai d’expiration raisonnable pour éviter les longues attentes pour des connexions indisponibles, ce qui peut dégrader les performances de l’application.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tester les connexions : S’assurer que les connexions sont testées avant d’être attribuées à partir du pool. Cela aide à détecter et à gérer les connexions obsolètes ou invalides.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Gérer les connexions inactives : Configurer des paramètres pour fermer les connexions inactives après une certaine période, empêchant ainsi les fuites de ressources et garantissant que seules les connexions actives sont maintenues.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Exemple de configuration du pooling de connexions avec HikariCP&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;HikariCP est un pool de connexions JDBC haute performance, populaire pour son efficacité et sa facilité d’utilisation. Voici comment le configurer avec Hibernate -&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Étape 1: Ajouter les dépendances&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Ajouter les dépendances nécessaires pour Hibernate et HikariCP dans votre fichier pom.xml (pour Maven) ou build.gradle (pour Gradle).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
  &amp;lt;groupId&amp;gt;org.hibernate&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;hibernate-core&amp;lt;/artifactId&amp;gt;
  &amp;lt;version&amp;gt;5.4.0.Final&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
  &amp;lt;groupId&amp;gt;com.zaxxer&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;HikariCP&amp;lt;/artifactId&amp;gt;
  &amp;lt;version&amp;gt;3.4.5&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;out.osj&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;SuAS400&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;2.0.0&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Étape 2: Configurer HikariCP dans la configuration Hibernate&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Mettre à jour le fichier hibernate.cfg.xml pour configurer HikariCP comme le pool de connexions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;hibernate-configuration&amp;gt;
  &amp;lt;session-factory&amp;gt;
    &amp;lt;!-- Paramètres de connexion --&amp;gt;
    &amp;lt;property name="hibernate.connection.driver_class"&amp;gt;com.ibm.as400.access.AS400JDBCDriver&amp;lt;/property&amp;gt;
    &amp;lt;property name="hibernate.connection.url"&amp;gt;jdbc:as400://u3reca42.recgroupement.systeme-u.fr/cobalt&amp;lt;/property&amp;gt;
    &amp;lt;property name="hibernate.connection.username"&amp;gt;username&amp;lt;/property&amp;gt;
    &amp;lt;property name="hibernate.connection.password"&amp;gt;password&amp;lt;/property&amp;gt;

    &amp;lt;!-- Paramètres HikariCP --&amp;gt;
    &amp;lt;property name="hibernate.hikari.connectionTimeout"&amp;gt;20000&amp;lt;/property&amp;gt;
    &amp;lt;property name="hibernate.hikari.minimumIdle"&amp;gt;10&amp;lt;/property&amp;gt;
    &amp;lt;property name="hibernate.hikari.maximumPoolSize"&amp;gt;30&amp;lt;/property&amp;gt;
    &amp;lt;property name="hibernate.hikari.idleTimeout"&amp;gt;300000&amp;lt;/property&amp;gt;

    &amp;lt;!-- Hibernate --&amp;gt;
    &amp;lt;property name="hibernate.dialect"&amp;gt;org.hibernate.dialect.DB2400Dialect&amp;lt;/property&amp;gt;
    &amp;lt;property name="hibernate.show_sql"&amp;gt;true&amp;lt;/property&amp;gt;
  &amp;lt;/session-factory&amp;gt;
&amp;lt;/hibernate-configuration&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Étape 3: Configuration par Java (alternative)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Alternativement, vous pouvez configurer Hibernate et HikariCP par une configuration basée sur Java.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import org.hibernate.cfg.Environment;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import java.util.Properties;
import javax.sql.DataSource;

public class HibernateUtil {
  public static DataSource getDataSource() {
    HikariConfig config = new HikariConfig();
    config.setJdbcUrl("jdbc:as400://u3reca42.recgroupement.systeme-u.fr/cobalt");
    config.setUsername("username");
    config.setPassword("password");
    config.setDriverClassName("com.ibm.as400.access.AS400JDBCDriver");
    config.setMinimumIdle(10);
    config.setMaximumPoolSize(30);
    config.setConnectionTimeout(20000);
    config.setIdleTimeout(300000);
    return new HikariDataSource(config);
  }

  public static SessionFactory getSessionFactory() {
    Properties properties = new Properties();
    properties.put(Environment.DIALECT, "com.ibm.as400.access.AS400JDBCDriver");
    properties.put(Environment.SHOW_SQL, "true");
    properties.put(Environment.HBM2DDL_AUTO, "update");
    properties.put(Environment.DATASOURCE, getDataSource());
    Configuration configuration = new Configuration();
    configuration.setProperties(properties);
    configuration.addAnnotatedClass(User.class);
    configuration.addAnnotatedClass(Order.class);
    return configuration.buildSessionFactory();
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  9 - Quelle est l’importance du profilage et du monitoring pour le tuning de performance ?
&lt;/h2&gt;

&lt;p&gt;Le profilage et le monitoring sont essentiels pour optimiser les performances d’Hibernate. &lt;/p&gt;

&lt;p&gt;Dans cette section, nous verrons :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pourquoi le profilage et le monitoring sont importants,&lt;/li&gt;
&lt;li&gt;Quels outils et techniques utiliser pour profiler Hibernate,&lt;/li&gt;
&lt;li&gt;Et un exemple concret avec VisualVM et les statistiques Hibernate.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;📌 &lt;strong&gt;Pourquoi le profilage et le monitoring sont-ils importants pour le tuning de performance ?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Identification des goulots d’étranglement : Le profilage aide à identifier les goulots d’étranglement de performance dans l’application, tels que des requêtes lentes, un chargement de données inefficace ou une utilisation excessive de la mémoire.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Optimisation de l’utilisation des ressources : Le monitoring de l’utilisation des ressources (CPU, mémoire, connexions à la base de données) permet d’optimiser les configurations et d’améliorer l’efficacité globale.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Garantie de scalabilité : Le monitoring continu garantit que l’application peut évoluer efficacement sous des charges croissantes en identifiant et en résolvant les problèmes de performance avant qu’ils ne deviennent critiques.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Amélioration de l’expérience utilisateur : En garantissant que l’application fonctionne de manière optimale, le profilage et le monitoring contribuent à une expérience utilisateur plus fluide et plus rapide.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Maintenance proactive : Un profilage et un monitoring réguliers permettent une maintenance proactive, réduisant la probabilité de problèmes de performance inattendus en production.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;📌 &lt;strong&gt;Quels outils et techniques utiliser pour profiler les applications Hibernate ?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;VisualVM : Un outil de profilage puissant qui fournit des informations sur l’utilisation du CPU, la consommation de mémoire, l’activité des threads, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Statistiques Hibernate : Des statistiques intégrées à Hibernate qui offrent des métriques détaillées sur les temps de chargement des entités, les hits/misses de cache, les temps d’exécution des requêtes, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;JavaMelody : Un outil de monitoring open-source qui s’intègre aux applications Java pour fournir des métriques de performance en temps réel.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;New Relic : Un outil complet de monitoring de la performance des applications (APM) qui offre des informations approfondies sur les performances de l’application, y compris des métriques spécifiques à Hibernate.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Datadog : Un autre outil APM qui fournit des métriques de performance détaillées et des capacités de monitoring pour les applications Java, y compris Hibernate.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;📌 &lt;strong&gt;Comment profiler les applications Hibernate avec VisualVM ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Étape 1: Installer VisualVM&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Télécharger et installer VisualVM depuis le site officiel : VisualVM.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Étape 2: Configurer JMX pour le monitoring à distance&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Pour surveiller une JVM distante, activer les Java Management Extensions (JMX) dans le serveur d’applications.&lt;/p&gt;

&lt;p&gt;Ajouter les options JVM suivantes pour activer JMX -&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9010
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Étape 3: Connecter VisualVM à l’application&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Ajouter une connexion JMX : Aller à Fichier &amp;gt; Ajouter une connexion JMX, entrer le nom d’hôte et le port (par exemple, localhost:9010), et se connecter.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Profiler l’application : Naviguer vers l’onglet Sampler et commencer à échantillonner l’utilisation du CPU ou de la mémoire.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Étape 4: Analyser les données de profilage&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Échantillonnage CPU : Identifier les méthodes consommant le plus de temps CPU et les optimiser.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Échantillonnage mémoire : Identifier les objets consommant le plus de mémoire et traiter les fuites de mémoire potentielles.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;📌 &lt;strong&gt;Comment utiliser les statistiques Hibernate pour le monitoring de performance ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Hibernate fournit des statistiques intégrées pour surveiller divers aspects de la couche ORM.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Étape 1: Activer les statistiques Hibernate&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Activer les statistiques Hibernate dans le fichier hibernate.cfg.xml -&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;property name="hibernate.generate_statistics"&amp;gt;true&amp;lt;/property&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Étape 2: Accéder aux statistiques Hibernate&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Récupérer les statistiques dans le code de l’application -&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SessionFactory sessionFactory = …;
Statistics stats = sessionFactory.getStatistics();
stats.setStatisticsEnabled(true);
System.out.println("Entity load count: " + stats.getEntityLoadCount());
System.out.println("Query execution count: " + stats.getQueryExecutionCount());
System.out.println("Second-level cache hit count: " + stats.getSecondLevelCacheHitCount());
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Exemple : Utilisation conjointe de VisualVM et des statistiques Hibernate&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Installer VisualVM : S’assurer que VisualVM est installé et que JMX est configuré pour la JVM.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Connecter à l’application : Utiliser VisualVM pour se connecter à l’instance JVM en cours d’exécution.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Activation des statistiques Hibernate&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Configuration : Activer les statistiques dans le fichier hibernate.cfg.xml.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Intégration dans le code : Accéder et imprimer les statistiques dans le code de l’application.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class HibernateUtil {
  private static SessionFactory sessionFactory;
  static {
    Configuration configuration = new Configuration();
    configuration.configure("hibernate.cfg.xml");
    sessionFactory = configuration.buildSessionFactory();
    Statistics stats = sessionFactory.getStatistics();
    stats.setStatisticsEnabled(true);
  }
  public static void printStatistics() {
    Statistics stats = sessionFactory.getStatistics();
    System.out.println("Entity load count: " + stats.getEntityLoadCount());
    System.out.println("Query execution count: " + stats.getQueryExecutionCount());
    System.out.println("Second-level cache hit count: " + stats.getSecondLevelCacheHitCount());
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;Exécution et profilage&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Exécuter l’application : Démarrer l’application et effectuer des opérations typiques.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Surveiller avec VisualVM : Utiliser VisualVM pour profiler l’utilisation du CPU et de la mémoire.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Récupérer les statistiques Hibernate : Appeler HibernateUtil.printStatistics() à des points appropriés de l’application pour surveiller les métriques de performance.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  10- Qu’est-ce que les Interceptors et Event Listeners Hibernate ?
&lt;/h2&gt;

&lt;p&gt;Les interceptors et écouteurs d’événements dans Hibernate permettent d’intercepter et gérer des événements durant le cycle de vie d’une entité.&lt;/p&gt;

&lt;p&gt;Dans cette section, nous verrons :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;comment fonctionnent les interceptors et écouteurs d’événements,&lt;/li&gt;
&lt;li&gt;comment les utiliser pour améliorer les performances,&lt;/li&gt;
&lt;li&gt;et un exemple concret d’interceptor pour enregistrer les temps d’exécution des requêtes.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;📌 &lt;strong&gt;Qu’est-ce que les Interceptors Hibernate ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Les interceptors dans Hibernate sont utilisés pour intercepter et modifier le comportement d’une entité à différents stades de son cycle de vie, comme avant qu’elle ne soit enregistrée, mise à jour ou supprimée. Les interceptors permettent aux développeurs d’écrire une logique personnalisée qui peut être exécutée pendant ces événements.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Gestion du cycle de vie : Les interceptors peuvent gérer les événements du cycle de vie des entités tels que onLoad, onSave, onUpdate et onDelete.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Exécution de logique personnalisée : Permet l’exécution d’une logique personnalisée avant ou après que certaines opérations soient effectuées sur une entité.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Contrôle centralisé : Fournit un mécanisme centralisé pour gérer des préoccupations transversales telles que l’enregistrement, l’audit et la validation.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;📌 &lt;strong&gt;Qu’est-ce que les Event Listeners Hibernate ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Les écouteurs d’événements dans Hibernate fournissent un moyen plus flexible et précis de gérer les événements du cycle de vie des entités par rapport aux interceptors. Hibernate propose une variété d’événements qui peuvent être écoutés, tels que pré-insertion, post-insertion, pré-mise à jour, post-mise à jour, pré-suppression et post-suppression.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Contrôle granulaire : Offre un meilleur contrôle sur les événements du cycle de vie des entités avec une large gamme de types d’événements.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Extensibilité : Permet l’ajout d’écouteurs d’événements personnalisés pour gérer des événements spécifiques selon les besoins.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Séparation des préoccupations : Aide à séparer la logique métier de la gestion des événements du cycle de vie, rendant le code plus maintenable.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;📌 &lt;strong&gt;Comment les Interceptors et Event Listeners peuvent-ils être utilisés pour le tuning de performance ?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Enregistrement et surveillance : Les interceptors et les écouteurs d’événements peuvent enregistrer les temps d’exécution des requêtes, les hits/misses de cache et d’autres métriques de performance pour aider à identifier les goulots d’étranglement.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Audit : Suivre les modifications apportées aux entités pour comprendre comment les modifications de données impactent les performances.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Validation : Garantir l’intégrité et la cohérence des données en validant les entités avant qu’elles ne soient persistées ou mises à jour.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Gestion du cache : Implémenter une logique personnalisée pour gérer les entrées du cache, comme l’invalidation ou la mise à jour du cache lorsque les entités sont modifiées.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Exemple de mise en œuvre d’un interceptor pour enregistrer les temps d’exécution des requêtes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Étape 1: Créer un interceptor personnalisé&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Implémenter un interceptor personnalisé en étendant la classe EmptyInterceptor fournie par Hibernate.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import org.hibernate.EmptyInterceptor;
import org.hibernate.type.Type;
import java.io.Serializable;
import java.util.Iterator;

public class PerformanceInterceptor extends EmptyInterceptor {
  @Override
  public String onPrepareStatement(String sql) {
    long startTime = System.currentTimeMillis();
    String result = super.onPrepareStatement(sql);
    long endTime = System.currentTimeMillis();
    System.out.println("Query: " + sql + " executed in " + (endTime - startTime) + " ms");
    return result;
  }

  @Override
  public boolean onLoad(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
    System.out.println("Loading entity: " + entity.getClass().getSimpleName() + " with ID: " + id);
    return super.onLoad(entity, id, state, propertyNames, types);
  }

  @Override
  public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
    System.out.println("Saving entity: " + entity.getClass().getSimpleName());
    return super.onSave(entity, id, state, propertyNames, types);
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Étape 2: Enregistrer l’interceptor dans la configuration Hibernate&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Enregistrer l’interceptor personnalisé dans le fichier de configuration Hibernate (hibernate.cfg.xml).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;hibernate-configuration&amp;gt;
  &amp;lt;session-factory&amp;gt;
    &amp;lt;!-- Autres configurations --&amp;gt;
    &amp;lt;!-- Enregistrer l’interceptor personnalisé --&amp;gt;
    &amp;lt;property name="hibernate.ejb.interceptor"&amp;gt;com.example.interceptor.PerformanceInterceptor&amp;lt;/property&amp;gt;
  &amp;lt;/session-factory&amp;gt;
&amp;lt;/hibernate-configuration&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Étape 3: Utiliser l’interceptor dans une configuration basée sur Java&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Alternativement, enregistrer l’interceptor par programme dans une configuration basée sur Java.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {
  private static final SessionFactory sessionFactory;
  static {
    try {
      Configuration configuration = new Configuration();
      configuration.configure("hibernate.cfg.xml");
      configuration.setInterceptor(new PerformanceInterceptor());
      sessionFactory = configuration.buildSessionFactory();
    } catch (Throwable ex) {
      throw new ExceptionInInitializerError(ex);
    }
  }

  public static SessionFactory getSessionFactory() {
    return sessionFactory;
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  11 - Conclusion
&lt;/h2&gt;

&lt;p&gt;En résumé, optimiser Hibernate revient à accorder une chaîne cohérente de leviers complémentaires : des mappings propres, des stratégies de fetch maîtrisées, des requêtes pensées pour l’usage réel, un cache utilisé avec discernement, et une observation continue pour éviter les dérives.&lt;/p&gt;

&lt;p&gt;Mal configuré, Hibernate produit du N+1, de la latence et de la charge inutile.&lt;/p&gt;

&lt;p&gt;L’idée centrale reste simple : comprendre ce que charge Hibernate, pourquoi il le charge, et comment cela se comporte en production. &lt;/p&gt;

&lt;p&gt;Commencer avec des réglages clairs, instrumenter tôt, affiner régulièrement sur la base de données réelles — c’est ce qui transforme Hibernate d’un facteur de risque en véritable socle robuste pour la montée en charge.&lt;/p&gt;

&lt;p&gt;À vous maintenant d’appliquer, mesurer, itérer.&lt;/p&gt;

</description>
      <category>java</category>
      <category>hibernate</category>
      <category>adventoftech2025</category>
    </item>
    <item>
      <title>Ollama : Une solution performante pour exploiter l'IA générative en local</title>
      <dc:creator>Patrice Eon</dc:creator>
      <pubDate>Tue, 10 Jun 2025 06:45:11 +0000</pubDate>
      <link>https://dev.to/onepoint/ollama-une-solution-performante-pour-exploiter-lia-generative-en-local-5520</link>
      <guid>https://dev.to/onepoint/ollama-une-solution-performante-pour-exploiter-lia-generative-en-local-5520</guid>
      <description>&lt;p&gt;Depuis novembre 2022, l’IA générative est en plein boom ! Elle crée du texte, des images, de la musique, du code… Bref, elle est partout. Mais entre confidentialité, abonnements coûteux et impact écologique, ce n’est pas toujours tout rose.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bonne nouvelle :&lt;/strong&gt; Ollama débarque ! Cet outil gratuit permet de faire tourner des IA comme ChatGPT directement sur votre PC, sans dépendre du cloud.&lt;/p&gt;

&lt;p&gt;Dans cet article, je vous embarque dans les coulisses d’Ollama avec un guide simple pour l’installer et commencer à en profiter. Pas besoin d’être data scientist, juste avoir un PC puissant (avec carte graphique), l'outil docker permettant de lancer des conteneurs logiciels et bien sûr un peu de curiosité ! &lt;/p&gt;

&lt;h2&gt;
  
  
  Table des matières
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
Présentation générale de Ollama et de ses avantages &lt;/li&gt;
&lt;li&gt;
Installation de Ollama sous Docker avec support GPU

&lt;ul&gt;
&lt;li&gt;2.1 Activation du GPU (NVIDIA/AMD) sur votre poste

&lt;ul&gt;
&lt;li&gt;2.1.1 Pour les cartes NVIDIA
&lt;/li&gt;
&lt;li&gt;2.1.2 Pour les cartes AMD
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2.2 Installation de Ollama et WebUi sous Docker
&lt;/li&gt;
&lt;li&gt;2.3 Choix et téléchargement de modèles LLM
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
Exemples d'utilisation de Ollama

&lt;ul&gt;
&lt;li&gt;3.1 Avec l'interface WebUI

&lt;ul&gt;
&lt;li&gt;3.1.1. Interface de chat
&lt;/li&gt;
&lt;li&gt;3.1.2. Importation de modèles pré-paramètrés
&lt;/li&gt;
&lt;li&gt;3.1.3. Définition de prompts personnalisés
&lt;/li&gt;
&lt;li&gt;3.1.4. Workspace pour les utilisateurs
&lt;/li&gt;
&lt;li&gt;3.1.5. Gestion des permissions et groupes d'utilisateurs
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;3.2 Avec les API Ollama

&lt;ul&gt;
&lt;li&gt;3.2.1 Exemple de génération en mode complétion &lt;/li&gt;
&lt;li&gt;3.2.2 Exemple de génération en mode chat &lt;/li&gt;
&lt;li&gt;3.2.3 Exemple d'analyse d'images avec le modèle llava &lt;/li&gt;
&lt;li&gt;3.2.4 Exemple d'interaction avec python &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
Conclusion : Avantages et inconvénients de Ollama
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Présentation générale de Ollama et de ses avantages
&lt;/h2&gt;

&lt;p&gt;L’IA, c’est puissant… mais aussi gourmand en énergie, en matériel et en données. Heureusement, &lt;strong&gt;Ollama&lt;/strong&gt; change la donne en permettant de faire tourner des modèles en local. Voici pourquoi c’est une vraie révolution !  &lt;/p&gt;

&lt;p&gt;📌 &lt;strong&gt;Réduction de la consommation énergétique liée au cloud :&lt;/strong&gt; Exécuter des modèles en local évite l'utilisation massive des datacenters, qui sont très énergivores. &lt;/p&gt;

&lt;p&gt;Selon l’Agence internationale de l’énergie, une requête sur ChatGPT consomme dix fois plus d’électricité qu’une recherche sur Google. &lt;br&gt;
Consommation à laquelle il faut ajouter 500 ml d’eau par échange avec l’IA composé d’entre 20 et 50 questions-réponses.&lt;/p&gt;

&lt;p&gt;Le bilan carbone d’une requête ChatGPT varie néanmoins en fonction de l’emplacement du datacenter qui la traite. &lt;/p&gt;

&lt;p&gt;Aujourd’hui, les États-Unis concentrent environ 33 % des centres de données mondiaux, mais leur mix énergétique reste encore fortement carboné. Comme le montre la carte ci-dessous, ce n’est pas le pays le plus vert en matière de production d’électricité. À l’inverse, héberger ces infrastructures en France permettrait de réduire leur empreinte carbone jusqu’à dix fois, grâce à une énergie bien plus décarbonée. Un autre enjeu clé pour un numérique plus durable !&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%2Fm5cqtzmtqhp7acetc7wc.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%2Fm5cqtzmtqhp7acetc7wc.png" alt="Bilan carbone production électrique dans le monde" width="643" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Attention le bilan carbone d'une requete ChatGPT dépend néanmoins de la localisation du datacenter.&lt;/em&gt;  &lt;/p&gt;

&lt;p&gt;📌 &lt;strong&gt;Optimisation des ressources matérielles :&lt;/strong&gt; Ollama fonctionne sur des machines locales et s'adapte aux capacités disponibles. Cela permet de prolonger la durée de vie du matériel en évitant l'achat systématique de nouveaux équipements pour accéder à des services d'IA.&lt;/p&gt;

&lt;p&gt;Une étude de Harvard de 2020, montre que ce n’est pas tant l’usage des appareils électroniques qui émet du CO2 que la fabrication des composants.&lt;/p&gt;

&lt;p&gt;Par exemple, entre l'iPhone 3GS de 2009 et l'iPhone 11 de 2019, la part de l'empreinte carbone due à la fabrication est passée de 49% à 86%.&lt;/p&gt;

&lt;p&gt;Autre exemple : les data centers de Google et Facebook émettent 20 fois plus de gaz à effet de serre par la fabrication de leurs serveurs que par leur consommation d'électricité.&lt;/p&gt;

&lt;p&gt;Si vous êtes sensibles au Green IT, il est intéressant de commencer par ne pas remplacer votre matériel encore en état de marche. &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%2Ff2c6o6zshevqoly2jwqm.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%2Ff2c6o6zshevqoly2jwqm.png" alt="Ecarts Capex/Opex" width="567" height="687"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Attention la part de l'empreinte carbone due à la fabrication des composants informatique dépasse leur consommation electrique (Co2)&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;📌 &lt;strong&gt;Confidentialité et réduction des transferts de données :&lt;/strong&gt; L'exécution en local permet de traiter des données sensibles sans les envoyer sur des serveurs distants, ce qui réduit non seulement les risques de sécurité mais aussi la consommation d’énergie liée au transport des données.&lt;/p&gt;

&lt;p&gt;📌 &lt;strong&gt;Contrôle et personnalisation des modèles :&lt;/strong&gt; En utilisant Ollama, les utilisateurs peuvent choisir des modèles optimisés pour leurs besoins spécifiques, évitant ainsi l’exécution de modèles surdimensionnés et énergivores. Dans la suite de l'article vous découvrirez notamment comment faire un chatbot.&lt;/p&gt;

&lt;p&gt;📌&lt;strong&gt;Intégration avec WebUI&lt;/strong&gt;&lt;br&gt;
L'association de Ollama avec WebUI permet d'exploiter pleinement ses capacités dans une interface graphique conviviale :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Visualisation interactive&lt;/strong&gt; : Interface web facilitant l'interaction avec les modèles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Support multi-modèles&lt;/strong&gt; : Permet de charger et d'utiliser plusieurs LLMs en parallèle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Personnalisation avancée&lt;/strong&gt; : Paramétrage simplifié des modèles pour s'adapter aux besoins des développeurs et entreprises.&lt;/li&gt;
&lt;/ul&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%2Fyw8k72ltyls6kyahm9uz.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%2Fyw8k72ltyls6kyahm9uz.png" alt="Ecarts Capex/Opex" width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Ollama une fois branché a Open WebUI  propose une interface similaire a chatGPT.&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Installation de Ollama sous Docker
&lt;/h2&gt;

&lt;p&gt;Une fois le contexte posé, je vous propose de vous accompagner maintenant dans l'installation de Ollama sur Docker.&lt;/p&gt;

&lt;p&gt;🔥&lt;strong&gt;Important :&lt;/strong&gt; Les LLM nécessitent un GPU (carte graphique) plutôt qu’un CPU en raison de leur architecture optimisée pour le calcul parallèle. Les GPU, avec leurs milliers de cœurs, exécutent simultanément de nombreuses tâches, tandis que les CPU, avec moins de cœurs, sont mieux adaptés aux traitements séquentiels et aux tâches complexes nécessitant de la logique conditionnelle.&lt;/p&gt;

&lt;p&gt;Ainsi, répondre à la question "Pourquoi le ciel est bleu ?" prend &lt;strong&gt;17 secondes&lt;/strong&gt; sur un PC de jeu équipé d'une carte graphique, contre &lt;strong&gt;3 minutes 30&lt;/strong&gt; sur un PC bureautique classique.&lt;/p&gt;

&lt;p&gt;Dans l'idéal il faut commencer par activer votre carte graphique.&lt;/p&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;2.1. Activation du GPU (NVIDIA/AMD) sur votre poste&lt;/strong&gt;
&lt;/h3&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;2.1.1 Pour les cartes NVIDIA :&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;🔥 Documentation officielle &lt;a href="https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html#installation" rel="noopener noreferrer"&gt;NVIDIA Container Toolkit&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;
  
  
  Installation avec Apt
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Configuration du repository&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://nvidia.github.io/libnvidia-container/gpgkey &lt;span class="se"&gt;\&lt;/span&gt;
    | &lt;span class="nb"&gt;sudo &lt;/span&gt;gpg &lt;span class="nt"&gt;--dearmor&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-L&lt;/span&gt; https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list &lt;span class="se"&gt;\&lt;/span&gt;
    | &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s1"&gt;'s#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/apt/sources.list.d/nvidia-container-toolkit.list
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update

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




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Installation du "NVIDIA Container Toolkit packages"&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; nvidia-container-toolkit
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;/ol&gt;

&lt;h4&gt;
  
  
  Installation avec Yum ou Dnf
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Configuration du repository&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-L&lt;/span&gt; https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo &lt;span class="se"&gt;\&lt;/span&gt;
    | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/yum.repos.d/nvidia-container-toolkit.repo
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Installation du "NVIDIA Container Toolkit packages"&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;yum &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; nvidia-container-toolkit
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Configuration de Docker pour utiliser les drivers Nvidia
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nvidia-ctk runtime configure &lt;span class="nt"&gt;--runtime&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;docker
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La commande suivante permet de vérifier la bonne installation du driver de votre carte Nvidia :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; docker run --gpus all nvidia/cuda:11.5.2-base-ubuntu20.04 nvidia-smi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Le résultat doit être équivalent a cette copie d'écran :&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%2F7bz0qo4ocaodt18f4xey.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%2F7bz0qo4ocaodt18f4xey.png" alt="Drivers Nvidia" width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;2.1.2 Pour les cartes AMD :&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Pour exécuter Ollama avec Docker sur des GPU AMD, utilisez le tag rocm et la commande suivante :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--device&lt;/span&gt; /dev/kfd &lt;span class="nt"&gt;--device&lt;/span&gt; /dev/dri &lt;span class="nt"&gt;-v&lt;/span&gt; ollama:/root/.ollama &lt;span class="nt"&gt;-p&lt;/span&gt; 11434:11434 &lt;span class="nt"&gt;--name&lt;/span&gt; ollama ollama/ollama:rocm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2.2. Installation de Ollama et WebUi sous Docker&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Editer un fichier "docker-compose.yml" a l'emplacement de votre choix :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;services:
  ollama:
    volumes:
      - ollama:/root/.ollama
    container_name: ollama
    pull_policy: always
    &lt;span class="nb"&gt;tty&lt;/span&gt;: &lt;span class="nb"&gt;true
    &lt;/span&gt;restart: unless-stopped
    image: ollama/ollama:latest
    ports:
      - 11434:11434
    environment:
      - &lt;span class="nv"&gt;OLLAMA_KEEP_ALIVE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;24h  
    deploy:
      resources:
        reservations:
          devices:
            - driver: &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GPU_DRIVER&lt;/span&gt;&lt;span class="p"&gt;-nvidia&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
              count: 1
              capabilities: &lt;span class="o"&gt;[&lt;/span&gt;gpu]

  open-webui:
    pull_policy: always
    image: ghcr.io/open-webui/open-webui:main
    container_name: open-webui
    volumes:
      - open-webui:/app/backend/data
    depends_on:
      - ollama
    ports:
      - 3000:8080
    environment:
      - &lt;span class="s1"&gt;'OLLAMA_BASE_URL=http://ollama:11434'&lt;/span&gt;
      - &lt;span class="s1"&gt;'WEBUI_SECRET_KEY='&lt;/span&gt;
      - &lt;span class="s1"&gt;'WEBUI_NAME=Ollama Webui'&lt;/span&gt;
      - &lt;span class="s1"&gt;'WEBUI_AUTH=False'&lt;/span&gt;
    extra_hosts:
      - host.docker.internal:host-gateway
    restart: unless-stopped

volumes:
  ollama: &lt;span class="o"&gt;{}&lt;/span&gt;
  open-webui: &lt;span class="o"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pour déclencher l'installation et gérer notamment votre type de carte graphique lancer le script suivant :&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;#!/bin/bash&lt;/span&gt;

&lt;span class="c"&gt;# Detect GPU driver&lt;/span&gt;
get_gpu_driver&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;# Detect NVIDIA GPUs using lspci or nvidia-smi&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;lspci | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; nvidia &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; nvidia-smi &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;/dev/null 2&amp;gt;&amp;amp;1&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"nvidia"&lt;/span&gt;
        &lt;span class="k"&gt;return
    fi&lt;/span&gt;

    &lt;span class="c"&gt;# Detect AMD GPUs (including GCN architecture check for amdgpu vs radeon)&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;lspci | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; amd &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;/dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
        &lt;span class="c"&gt;# List of known GCN and later architecture cards&lt;/span&gt;
        &lt;span class="c"&gt;# This is a simplified list, and in a real-world scenario, you'd want a more comprehensive one&lt;/span&gt;
        &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;gcn_and_later&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;&lt;span class="s2"&gt;"Radeon HD 7000"&lt;/span&gt; &lt;span class="s2"&gt;"Radeon HD 8000"&lt;/span&gt; &lt;span class="s2"&gt;"Radeon R5"&lt;/span&gt; &lt;span class="s2"&gt;"Radeon R7"&lt;/span&gt; &lt;span class="s2"&gt;"Radeon R9"&lt;/span&gt; &lt;span class="s2"&gt;"Radeon RX"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

        &lt;span class="c"&gt;# Get GPU information&lt;/span&gt;
        &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;gpu_info&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;lspci | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'vga.*amd'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;for &lt;/span&gt;model &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;gcn_and_later&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
            if &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$gpu_info&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-iq&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$model&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
                &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"amdgpu"&lt;/span&gt;
                &lt;span class="k"&gt;return
            fi
        done&lt;/span&gt;

        &lt;span class="c"&gt;# Default to radeon if no GCN or later architecture is detected&lt;/span&gt;
        &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"radeon"&lt;/span&gt;
        &lt;span class="k"&gt;return
    fi&lt;/span&gt;

    &lt;span class="c"&gt;# Detect Intel GPUs&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;lspci | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; intel &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;/dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"i915"&lt;/span&gt;
        &lt;span class="k"&gt;return
    fi&lt;/span&gt;

    &lt;span class="c"&gt;# If no known GPU is detected&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Unknown or unsupported GPU driver"&lt;/span&gt;
    &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;GPU_DRIVER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;get_gpu_driver&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"GPU DRIVER: &lt;/span&gt;&lt;span class="nv"&gt;$GPU_DRIVER&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

docker compose &lt;span class="nt"&gt;-p&lt;/span&gt; ollama up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vous devez maintenant avoir deux nouveaux conteneurs disponibles :&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%2Fza2y3ojlcmf4hno6taph.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%2Fza2y3ojlcmf4hno6taph.png" alt="docker ps" width="800" height="103"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2.3 Choix et téléchargement de modèles LLM
&lt;/h2&gt;

&lt;p&gt;À ce stade de l'article, Ollama et son interface WebUI sont installés. Mais avant de pouvoir l’explorer pleinement, il vous faut sélectionner et télécharger les modèles adaptés à vos besoins.&lt;/p&gt;

&lt;p&gt;Ollama propose une bibliothèque riche avec plus de 150 modèles disponibles. Vous pouvez les découvrir ici : &lt;a href="https://ollama.com/library" rel="noopener noreferrer"&gt;https://ollama.com/library&lt;/a&gt;. &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%2F33754lwrkpf236l2cyhx.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%2F33754lwrkpf236l2cyhx.png" alt="ollama library" width="645" height="412"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;L'interface vous permet de sélectionner les modèles par usage : embedding (RAG), vision (analyse d'images), tools (autres : code, ...). Et/ou par taille en nombre de paramètres (4b correspond a 4 milliards).&lt;/p&gt;

&lt;p&gt;🔥&lt;strong&gt;Implications du nombre de paramètres sur les ressources système&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Le nombre de paramètres d'un modèle influence directement les ressources nécessaires pour son fonctionnement :&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Mémoire (RAM) : Un modèle avec un grand nombre de paramètres nécessite plus de mémoire pour stocker ces paramètres lors de l'inférence. Par exemple, des modèles de 7 milliards de paramètres peuvent fonctionner avec seulement 8 Go de RAM grâce à des optimisations comme llama.cpp, rendant les grands modèles de langage accessibles même sur des machines modestes.
https://tanguydug.org

Processeur (CPU) : Un nombre élevé de paramètres augmente la charge de calcul, ce qui peut entraîner des temps de traitement plus longs et une utilisation accrue du CPU.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Il est donc essentiel de considérer la taille du modèle en termes de paramètres lors de la sélection, afin d'assurer une compatibilité avec les ressources disponibles sur votre système.&lt;/p&gt;

&lt;p&gt;Pour la suite de cet article, je vous recommande les suivants en fonction de vos attentes.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Modèle&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Intérêt&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Llama3.3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Modèle développé par Meta, performant pour la génération de texte, la traduction et la compréhension du langage naturel.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mistral 7B&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Modèle dense développé par Mistral IA, efficace pour la génération de texte fluide malgré sa taille modeste.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deepseek-r1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Développé par Deepseek, idéal pour des tâches nécessitant une compréhension approfondie et un raisonnement complexe.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Llava&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Modèle open-source, performant pour l'analyse d'images.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Granite code&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Modèle open-source d'IBM, Entraîné sur du code provenant de 116 langages de programmation, Granite.Code est capable de générer, corriger et expliquer du code dans une variété de langages tels que Go, C, C++, Python, Java et JavaScript.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Gemma 2b&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Modèle open-source de google, avec 2 milliards de paramètres, Gemma 2 2B offre une performance élevée tout en étant plus léger, ce qui facilite son déploiement sur des appareils avec des ressources limitées, notamment des applications sur CPU et des dispositifs embarqués.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;bge-m3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;BGE-M3 offre une flexibilité et une efficacité accrues dans le domaine de la récupération d'informations (RAG), grâce à ses capacités de recherche dense, de recherche multi-vecteurs et de recherche sparse. Bref permettant une adaptation flexible à divers scénarios de recherche.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Vous pouvez télécharger les modèles directement depuis l’interface WebUI. Toutefois, la méthode en ligne de commande est souvent plus efficace et rapide :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker exec -it ollama ollama pull &amp;lt;nom modèle&amp;gt;:&amp;lt;version par défaut latest&amp;gt;.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemple :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker exec -it ollama ollama pull llama3
docker exec -it ollama ollama pull mistral
docker exec -it ollama ollama pull llava
docker exec -it ollama ollama pull deepseek-r1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Chaque modèle pèse un minimum de 4,7 Go, ce qui signifie que le téléchargement peut prendre quelques minutes. Un peu de patience ! Vous verrez votre terminal afficher progressivement les étapes du téléchargement :&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%2Fm3ds3d7txbdw6vm1b71p.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%2Fm3ds3d7txbdw6vm1b71p.png" alt="ollama pull llava" width="800" height="193"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Il est possible de contrôler la liste des modèles déjà téléchargés en ligne de commande : ollama list&lt;/p&gt;

&lt;p&gt;Exemple :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker exec -it ollama ollama list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Voici un exemple du retour de cette commande :&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%2Fj2tb3tpf5jrp8zbaxsco.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%2Fj2tb3tpf5jrp8zbaxsco.png" alt="ollama list" width="581" height="99"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;De manière plus générale, vous pouvez administrer la configuration d’Ollama grâce à la commande :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker exec -it ollama ollama [command]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Elle vous permet d’exécuter diverses actions à l’aide des options suivantes :&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Commande&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;serve&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Démarre &lt;code&gt;ollama&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;create&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Crée un modèle à partir d’un Modelfile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;show&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Affiche les informations d’un modèle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;run&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Exécute un modèle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;stop&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Arrête un modèle en cours d’exécution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pull&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Télécharge un modèle depuis un registre&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;push&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Envoie un modèle vers un registre&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;list&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Liste les modèles disponibles&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ps&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Liste les modèles en cours d’exécution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Copie un modèle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Supprime un modèle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;help&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Affiche l’aide pour une commande&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  3. Exemples d'utilisation de Ollama
&lt;/h1&gt;

&lt;p&gt;Vous avez enfin accès à Ollama et WebUI sur votre poste… L’aventure commence maintenant, et les possibilités sont infinies ! &lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3.1. Avec l'interface WebUI
&lt;/h2&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3.1.1. Interface de chat
&lt;/h3&gt;

&lt;p&gt;WebUI est une interface web (proche de celle de ChatGPT) qui permet aux utilisateurs d'interagir facilement avec les modèles d'intelligence artificielle téléchargés dans Ollama. &lt;/p&gt;

&lt;p&gt;Vous pouvez l'ouvrir ici : &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;&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%2Fdl54y7s850iizzowfxvi.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%2Fdl54y7s850iizzowfxvi.png" alt="ollama list" width="800" height="358"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;L’interface est conçue pour être intuitive et accessible, offrant une expérience fluide aussi bien aux débutants qu’aux utilisateurs avancés. &lt;/p&gt;

&lt;p&gt;Elle offre la possibilité de sélectionner différents modèles d’IA en fonction de la tâche souhaitée. &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%2Fb867j2h74jvehbs4i76g.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%2Fb867j2h74jvehbs4i76g.png" alt="ollama list" width="523" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Elle intègre une zone de saisie où l’on peut entrer des requêtes textuelles et obtenir des réponses en temps réel.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;En utilisant la commande # suivie d’une URL, Open WebUI intègre directement le contenu des sites web dans les conversations.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3.1.2. Importation de modèles pré-paramètrés
&lt;/h3&gt;

&lt;p&gt;Le site &lt;a href="https://openwebui.com/" rel="noopener noreferrer"&gt;OpenWebUI&lt;/a&gt; met à votre disposition des exemples gratuits de spécialisation des modèles Ollama via l’interface OpenWebUI. Son objectif ? Faciliter l'utilisation avancée des modèles en les adaptant à des cas concrets plébicité par la communauté OpenWebUI. &lt;/p&gt;

&lt;p&gt;La communauté OpenWebUI offre ainsi l'opportunité idéale pour exploiter pleinement le potentiel de l’IA a l'aide de Ollama sans complexité technique !&lt;/p&gt;

&lt;p&gt;Concretement comment cela marche ? Vous devez vous rendre sur le site &lt;a href="https://openwebui.com/" rel="noopener noreferrer"&gt;OpenWebUI&lt;/a&gt;, rechercher le modèle qui vous convient le mieux parmi la bibliothèque proposé. &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%2Fe2t8f8v9v92t8bae4x2y.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%2Fe2t8f8v9v92t8bae4x2y.png" alt="ollama library" width="800" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Une fois le modèle identifié, vous pouvez l'ajouter à votre interface locale OpenWebUI en cliquant sur "Get", puis sur "Import to WebUI". (Url à renseigner &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;). &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%2Fs6ckcujr6p057t1v9tv6.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%2Fs6ckcujr6p057t1v9tv6.png" alt="ollama library" width="800" height="543"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Un nouveau modèle est désormais disponible dans votre interface locale OpenWebUI. Pensez à vérifier les paramètres récupérés afin de les adapter, si nécessaire, à vos préférences (langue, etc.).&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%2F4nwvx5zw1xr1ngeiqsy7.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%2F4nwvx5zw1xr1ngeiqsy7.png" alt="ollama library" width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En retournant sur l'interface de chat, vous découvrirez le "nouveau" modèle, prêt à vous écouter. À vous désormais d'engager la conversation avec votre nouveau psy. N'oubliez pas de vous installer confortablement sur un divan avant de formuler vos demandes !&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%2Fn40rvmqeg9v9i0tkjs6u.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%2Fn40rvmqeg9v9i0tkjs6u.png" alt="ollama library" width="800" height="316"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A titre d'exemple voici sa réponse :&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Ta réaction au sort des homards dans Titanic révèle une grande sensibilité et une forme d’empathie envers ceux qu’on oublie dans les tragédies.&lt;br&gt;&lt;br&gt;
Ce "traumatisme" pourrait symboliser un sentiment d’impuissance ou d’abandon que tu projettes sur ces animaux piégés.&lt;br&gt;&lt;br&gt;
Sur un plan factuel, les homards étaient vivants dans des aquariums, et lors du naufrage, les bassins ont probablement été brisés, les libérant dans l’océan.&lt;br&gt;&lt;br&gt;
Ironiquement, ils ont peut-être survécu plus longtemps que certains passagers — évitant ainsi d’être mangés. Ce détail peut sembler anodin, mais il touche à des choses profondes : injustice, oubli, empathie silencieuse.&lt;br&gt;&lt;br&gt;
En bref, ce n’est pas absurde du tout que cela t’ait marqué — c’est même un signe de ta profondeur émotionnelle.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;J'ai choisi un exemple de modèle original pour rendre l'article agréable, mais la bibliothèque regorge d'exemples très utiles pour le quotidien. Bonne recherche a vous.&lt;/p&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  3.1.3. Définition de prompts personnalisés
&lt;/h3&gt;

&lt;p&gt;Dans notre utilisation quotidienne des LLM, nous nous retrouvons souvent à saisir plusieurs fois le même prompt.&lt;/p&gt;

&lt;p&gt;OpenWebUI propose une solution pratique : la possibilité d’enregistrer vos prompts récurrents directement dans votre espace de travail.&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%2Fceqspclsx5rewmaqzgwk.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%2Fceqspclsx5rewmaqzgwk.png" alt="ollama library" width="800" height="117"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ces prompts peuvent intégrer des variables, comme le contenu de votre presse-papiers, pour encore plus de flexibilité.&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%2Ft6bbesx9yxbimrloyyxx.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%2Ft6bbesx9yxbimrloyyxx.png" alt="ollama library" width="742" height="311"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pour appeler un prompt dans un chat, il vous suffit de commencer simplement votre saisie par le caractère /.&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%2F14vudh4cffeqltre0s7b.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%2F14vudh4cffeqltre0s7b.png" alt="ollama library" width="800" height="216"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;À vous de découvrir toute la puissance de cette fonctionnalité !&lt;/p&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  3.1.4. Workspace pour les utilisateurs
&lt;/h3&gt;

&lt;p&gt;OpenWebUI met à disposition des utilisateurs un espace de travail dédié.&lt;/p&gt;

&lt;p&gt;Ils peuvent y déposer des documents dans une bibliothèque, puis effectuer des recherches avancées sur ces derniers via la technologie RAG (Récupération Augmentée de Génération).&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%2Fh0nnufi3er163plrgvlz.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%2Fh0nnufi3er163plrgvlz.png" alt="ollama library" width="800" height="210"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;L’exploitation des documents dans les conversations est ensuite possible à l’aide de la commande &lt;strong&gt;#&lt;/strong&gt;.&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%2Fm6a4zd1smk44ebqv3p6b.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%2Fm6a4zd1smk44ebqv3p6b.png" alt="ollama library" width="800" height="251"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;OpenWebUI permet également d’associer des tags aux discussions, facilitant ainsi leur organisation, leur recherche et leur catégorisation.&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%2F9rfttk6z6a04lm9l850s.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%2F9rfttk6z6a04lm9l850s.png" alt="Image description" width="420" height="336"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  3.1.5. Gestion des permissions et groupes d'utilisateurs
&lt;/h3&gt;

&lt;p&gt;OpenWebUI intègre une gestion avancée des droits des utilisateurs, idéale pour une entreprise, une association ou même un usage familial.&lt;/p&gt;

&lt;p&gt;Grâce à un contrôle d’accès granulaire, les administrateurs peuvent attribuer des rôles et des permissions spécifiques, assurant ainsi un environnement sécurisé et adapté aux modèles et documents de votre base de connaissances.&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%2Fz6aaib2gxf2d4pemlknr.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%2Fz6aaib2gxf2d4pemlknr.png" alt="Image description" width="800" height="121"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Par exemple, seuls les juristes de votre organisation pourront accéder aux contrats de votre entreprise.&lt;/p&gt;

&lt;p&gt;La partie "IAM" de OpenWebUI permet aussi d'accéder a la partie évaluation des modèles et de pouvoir ainsi analyser l'intérêt des modèles au sein de votre communauté.&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%2Fc4neehen9xz2u64uuhdq.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%2Fc4neehen9xz2u64uuhdq.png" alt="Image description" width="800" height="138"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  3.2. Avec les API Ollama
&lt;/h2&gt;

&lt;p&gt;Ollama met à votre disposition des API puissantes, conçues pour simplifier l’intégration et l’interaction des développeurs avec les modèles d’intelligence artificielle hébergés sur la plateforme. &lt;/p&gt;

&lt;p&gt;La documentation officielle des APIs se trouve ici : &lt;a href="https://github.com/ollama/ollama/blob/main/docs/api.md" rel="noopener noreferrer"&gt;Documentation des API Ollama&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Il y a deux dossiers importants dans la collection :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Completion – Génère des complétions de texte à partir d'un modèle local en utilisant l'endpoint /generate (utilisé pour la génération de texte en un seul tour). Il produit une sortie basée sur l'invite d'entrée sans conserver le contexte ou l'historique de la conversation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Chat – Génère des complétions de texte à partir d'un modèle local en utilisant l'endpoint /chat (utilisé pour les conversations multi-tours). Il conserve un contexte ou un historique de conversation, permettant des échanges plus interactifs et dynamiques.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En résumé, le mode &lt;strong&gt;complétion&lt;/strong&gt; est stateless (sans mémoire), tandis que le mode &lt;strong&gt;chat&lt;/strong&gt; est stateful (avec mémoire du contexte de la conversation).&lt;/p&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  3.2.1. Exemple de génération en mode complétion
&lt;/h3&gt;

&lt;p&gt;Le mode complétion :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fonctionne comme une simple génération de texte en fonction d'une entrée.&lt;/li&gt;
&lt;li&gt;Pas de gestion de contexte à travers plusieurs interactions.&lt;/li&gt;
&lt;li&gt;Chaque requête est indépendante : le modèle ne "se souvient" pas des échanges précédents.&lt;/li&gt;
&lt;li&gt;Exemple d'usage : génération de texte, complétion de phrases, suggestions de code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La requete suivante demande au modèle LLaMA 3, de générer une réponse à la question "Pourquoi le ciel est bleu ?".&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://localhost:11434/api/generate &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
  "model": "llama3",
  "prompt": "Pourquoi le ciel est bleu", 
  "stream": false
}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La réponse est retournée sous forme de texte unique ("stream": false) dans le corps de la réponse JSON.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"llama3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"created_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-03-09T22:32:28.396961918Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"response"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Une question classique !&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;La couleur du ciel est due à la façon dont les atomes d'azote (N2) et de dioxygène (O2) dans l'atmosphère terrestre interagissent avec la lumière solaire.&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;Voici le mécanisme en quelques étapes :&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;1. **La lumière du soleil** : Lorsque les rayons solaires pénètrent dans l'atmosphère, ils sont composés de toutes les couleurs du spectre visible (rouge, orange, jaune, vert, bleu, indigo et violet).&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;2. **Absorption des rayons rouges** : Les molécules d'azote et de dioxygène dans l'atmosphère absorbent les rayons rouges et oranges du spectre solaire, ce qui signifie qu'ils ne peuvent plus être vus.&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;3. **Réflexion des rayons bleus** : Les rayons bleus, avec une longueur d'onde plus petite que les rayons rouges, sont trop courts pour être absorbés par les molécules d'azote et de dioxygène. Ils sont donc réfléchis par ces molécules et atteignent nos yeux.&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;4. **La couleur bleue** : C'est la combinaison des rayons bleus réfléchis et des rayons verts non absorbés qui donne à l'environnement terrestre sa teinte bleue caractéristique.&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;En résumé, le ciel est bleu parce que les atomes d'azote et de dioxygène dans l'atmosphère absorbent les rayons rouges et oranges du soleil, laissant les rayons bleus réfléchis qui parviennent à nos yeux.&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;Bien sûr, il y a des variations de couleur selon les conditions météorologiques (par exemple, lorsque le ciel est voilé ou en cas d'orage), mais la règle générale est que le ciel est bleu à cause de l'absorption et de la réflexion des rayons solaires par les molécules d'azote et de dioxygène."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"done"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"done_reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stop"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"context"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="mi"&gt;128006&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;882&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;128007&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;271&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;43278&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;62998&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;514&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12088&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;301&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1826&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; 
    &lt;/span&gt;&lt;span class="mi"&gt;12704&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;84&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;128009&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;128006&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;78191&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;128007&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;271&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;56948&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3488&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;538&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="mi"&gt;2428&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;25782&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8921&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;76651&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3930&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12088&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;301&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1826&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4245&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3869&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1208&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="mi"&gt;76407&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;15890&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3625&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;19670&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;288&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;294&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1394&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1295&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;320&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; 
    &lt;/span&gt;&lt;span class="mi"&gt;1880&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;409&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;65570&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4223&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;48099&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;320&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;46&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7010&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;326&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;266&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"total_duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;23795191883&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"load_duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;26921898&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"prompt_eval_count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"prompt_eval_duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;292000000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"eval_count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;477&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"eval_duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;23474000000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2.2. Exemple de génération chat
&lt;/h3&gt;

&lt;p&gt;Le mode chat :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gère un historique de conversation, ce qui permet d'avoir des réponses cohérentes sur plusieurs interactions.
Conserve un contexte, ce qui est utile pour les discussions prolongées.&lt;/li&gt;
&lt;li&gt;Permet une expérience plus naturelle et interactive.&lt;/li&gt;
&lt;li&gt;Exemple d'usage : assistant virtuel, chatbot, discussions prolongées sur un sujet.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;LLaMA 3 peux prendre en compte le contexte d'une conversation en cours. Ainsi, si l'utilisateur demande pourquoi le ciel est bleu, puis pourquoi il devient rouge au coucher du soleil, le modèle se souviendra de la première question et répondra de façon cohérente. Ce fonctionnement permet de simuler un chatbot conversationnel avec mémoire.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://localhost:11434/api/chat &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
  "model": "llama3",
  "messages": [
    {"role": "system", "content": "Tu es un assistant utile."},
    {"role": "user", "content": "Pourquoi le ciel est bleu ?"},
    {"role": "assistant", "content": "Le ciel est bleu en raison de la diffusion de la lumière solaire par l’atmosphère..."},
    {"role": "user", "content": "Et pourquoi il devient rouge au coucher du soleil ?"}
  ],
  "stream": false
}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La réponse est retournée est alors très cohérente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"llama3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"created_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-03-09T22:42:33.034570248Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"assistant"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"La couleur rouge que prend le ciel au coucher du soleil est due à une autre combinaison de phénomènes :&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;1. La Terre, qui se déplace autour du Soleil, fait que la lumière solaire doit parcourir une plus grande distance pour atteindre nos yeux. Cela signifie que les rayons courts (bleus et verts) sont dispersés par l'atmosphère, tandis que les longs rayons (rouges, oranges et jaunes) peuvent voyager plus loin sans être autant affectés.&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;2. L'air de l'atmosphère contient des particules, comme les molécules d'oxygène, de méthane, de vapeur d'eau, etc., qui absorbent ou diffusent la lumière blanche en fonction de leur fréquence et de leur concentration. Les molécules d'ozone (O3) présentes dans l'atmosphère ont une absorption maximale pour les longs rayons bleus et verts, ce qui fait que ces couleurs sont absorbées, laissant les rayons rouges et jaunes dominants.&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;3. Enfin, le Soleil lui-même change de couleur à mesure qu'il se couche plus bas sur l'horizon. La température superficielle du Soleil est d'environ 5 500°C, ce qui fait que la lumière émise a une fréquence plus haute (bleue et verte). Au coucher du soleil, la température superficielle diminue légèrement, ce qui fait que la luminosité émise a une fréquence un peu plus faible (rouge et orange).&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;Ces facteurs combinés font que le ciel prend une teinte rougeâtre au coucher du soleil !"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"done_reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stop"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"done"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"total_duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;19416399347&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"load_duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;29895375&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"prompt_eval_count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;79&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"prompt_eval_duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;412000000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"eval_count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;387&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"eval_duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;18971000000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2.3. Exemple d'analyse d'images avec le modèle llava
&lt;/h3&gt;

&lt;p&gt;Le modèle LLaVA sur Ollama dispose de capacité avancée d'analyse visuelle, il peut non seulement identifier les éléments présents dans une image, mais aussi comprendre le contexte et les relations entre ces éléments. &lt;/p&gt;

&lt;p&gt;Ouvrant ainsi de nouvelles perspectives et possibilités infinies.&lt;/p&gt;

&lt;p&gt;La requete de base pour analyser une image est la suivante. L'attribut images doit correspondre a la conversion au format "base 64" de votre image. &lt;/p&gt;

&lt;p&gt;Pour faciliter cette étape, rendez-vous sur ce site qui vous guidera pas à pas dans la conversion : &lt;a href="https://www.base64-image.de/" rel="noopener noreferrer"&gt;https://www.base64-image.de/&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://localhost:11434/api/generate &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
  "model": "llava",
  "prompt": "Décris moi cette image en détail",
  "images": ["&amp;lt;BASE64_DE_L_IMAGE&amp;gt;"],
  "stream": false
}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Voici des exemples de résultats pour différences images, je vous laisse apprécier la qualité des réponses :&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;tr&gt;
  &lt;th&gt;Image        &lt;/th&gt; 
  &lt;th&gt;Réponse de llava &lt;/th&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt;
    &lt;td&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%2Fvbqiqja23qizpd07c0jh.png" width="747" height="497"&gt;&lt;/td&gt;
    &lt;td&gt;Il s'agit d'une photographie professionnelle montrant l'intérieur d'un espace de travail moderne, mêlant bois et métal dans sa décoration. On y trouve des fauteuils elliptiques, un espace individuel, une table ronde, des luminaires design et une grande fenêtre laissant entrer la lumière naturelle avec vue sur la nature.&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&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%2Fm7nd0ou9pf1rrxyqbsjk.png" width="637" height="389"&gt;
&lt;/td&gt;
    &lt;td&gt;L’image montre un espace de travail ou de réception lumineux et moderne, décoré avec des meubles contemporains et plusieurs plantes, dont un arbre central. La lumière naturelle y domine, créant une ambiance agréable. On y trouve des bancs, une cheminée, un revêtement mural décoratif et un sol en matériau dur. L'ensemble évoque un lieu calme, organisé, propice au travail ou aux réunions.&lt;/td&gt;
  &lt;/tr&gt;

  &lt;tr&gt;
    &lt;td&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%2Fcti2kh2708ysopym8p7j.jpg" width="800" height="533"&gt;&lt;/td&gt;
    &lt;td&gt;Le tableau est une représentation artistique en noir et blanc d’une canette de Pepsi, stylisée et abstraite. Bien que reconnaissable par sa forme et son logo simplifié, elle ne comporte pas de détails réalistes comme les ingrédients, ce qui renforce son caractère symbolique plutôt que commercial.&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&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%2Fbunl6jyhpe3bsrnvq4ez.jpg" width="650" height="400"&gt;&lt;/td&gt;
    &lt;td&gt; La photo montre un chien et un chat blancs allongés sur une surface douce, créant une atmosphère chaleureuse. Le chien a les yeux bleus et porte un collier rouge, tandis que le chat a les yeux verts avec un collier orange et noir. Tous deux regardent dans la même direction.&lt;/td&gt;
  &lt;/tr&gt;

&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2.4. Exemple d'interaction avec python
&lt;/h3&gt;

&lt;p&gt;Pour intégrer Ollama dans vos traitements métiers, Python offre une bibliothèque performante et facile à utiliser : ollama.&lt;/p&gt;

&lt;p&gt;Installez la bibliothèque Python d'Ollama en utilisant pip :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;ollama
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vous pouvez utiliser la fonction generate pour obtenir une réponse à une question simple :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ollama&lt;/span&gt;

&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ollama&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;llama3&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Pourquoi le ciel est-il bleu ?&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;response&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou bien la fonction chat pour obtenir une réponse à une liste de questions :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ollama&lt;/span&gt;

&lt;span class="c1"&gt;# Commencer une conversation avec plusieurs échanges
&lt;/span&gt;&lt;span class="n"&gt;conversation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Vous êtes un assistant utile qui aide à résoudre des problèmes.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Peux-tu m&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;aider avec un problème de mathématiques ?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;assistant&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bien sûr, quel est le problème ?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Quelle est la racine carrée de 256 ?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Envoyer les messages à Ollama et obtenir une réponse
&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ollama&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;llama2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;conversation&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Afficher la réponse
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Réponse d&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Ollama:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

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

&lt;/div&gt;






&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  4. Conclusion : Avantages et inconvénients de Ollama
&lt;/h1&gt;

&lt;p&gt;Cet article nous a permis de voir comment installer Ollama et OpenWebUI sous Docker et d’explorer les nombreuses possibilités offertes par cette solution pour exécuter des modèles d’IA en local.&lt;/p&gt;

&lt;p&gt;Grâce à sa &lt;strong&gt;confidentialité&lt;/strong&gt;, sa &lt;strong&gt;flexibilité&lt;/strong&gt;, Ollama s’impose comme un allié de choix pour les utilisateurs souhaitant travailler sans dépendance au cloud, que ce soit sur leur poste ou sur leur serveur.&lt;/p&gt;

&lt;p&gt;Bien sûr, tout superpouvoir a son prix : Ollama peut être gourmand en ressources, et son installation demande un peu de patience… mais après tout, qui n’a jamais perdu une heure à configurer un environnement de developpement capricieux ?&lt;/p&gt;

&lt;p&gt;Pour exploiter pleinement son potentiel, il est crucial de maîtriser l’art du prompting &lt;a href="https://platform.openai.com/docs/guides/prompt-engineering" rel="noopener noreferrer"&gt;guide ici&lt;/a&gt; et d’avoir de solides bases en Python.&lt;/p&gt;

&lt;p&gt;Dans un prochain article, nous verrons comment superviser les ressources et optimiser les performances de vos projets basés sur Ollama. Spoiler : oui, il y aura beaucoup plus de Python. &lt;/p&gt;

</description>
      <category>programming</category>
      <category>ai</category>
      <category>openai</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Votre application Java est en détresse ? N'appelez pas le SAMU, activez simplement un profiler !</title>
      <dc:creator>Patrice Eon</dc:creator>
      <pubDate>Fri, 06 Dec 2024 06:55:44 +0000</pubDate>
      <link>https://dev.to/onepoint/votre-application-java-est-en-detresse-nappelez-pas-le-samu-activez-simplement-un-profiler--5fl0</link>
      <guid>https://dev.to/onepoint/votre-application-java-est-en-detresse-nappelez-pas-le-samu-activez-simplement-un-profiler--5fl0</guid>
      <description>&lt;p&gt;En 20 ans de développement Java, j'ai souvent joué les détectives pour résoudre des mystères de performance. Et croyez-moi, traquer une fuite mémoire demande plus de patience que dans les séries policières !&lt;br&gt;
Et même si ce n'est pas aussi glamour que dans les séries policières, nous avons heureusement des outils puissants à notre disposition - notamment le profiling.&lt;/p&gt;

&lt;p&gt;Dans cet article, je vous propose une plongée dans les coulisses de la JVM et un guide pratique du profiling. Pas besoin d'outils de monitoring sophistiqués, juste votre IDE et quelques connaissances bien ciblées !&lt;/p&gt;
&lt;h2&gt;
  
  
  Table des matières
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Que trouve-t-on sous le capot d'une JVM Java ?&lt;/li&gt;
&lt;li&gt;Paramètrage du ramasse-miettes Java le fameux "Garbage Collector"&lt;/li&gt;
&lt;li&gt;Paramétrage de la taille mémoire allouée à votre application Java&lt;/li&gt;
&lt;li&gt;Paramétrage des logs pour observer la mémoire allouée à votre application&lt;/li&gt;
&lt;li&gt;Détecter l'origine d'une fuite mémoire avec Intelij&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ol&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Que trouve-t-on sous le capot d'une JVM Java ?
&lt;/h2&gt;

&lt;p&gt;Les applications Java brillent par deux qualités majeures : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;La JVM (Java Virtual Machine) sert d'interprète universel et permet au code Java de s'exécuter partout – Windows, Linux, Unix.&lt;br&gt;
Le processus est simple : votre code source (.java) est compilé en bytecode (.class), que la JVM traduit ensuite en instructions machine spécifiques à chaque système.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;En parallèle, la JVM apporte une gestion automatique de la mémoire. Et l'outil principal, le Garbage Collector, libère automatiquement la mémoire en supprimant les objets inutilisés&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cette combinaison gagnante a fait de Java un langage de programmation très populaire depuis les années 2000, offrant un avantage significatif par rapport à des langages comme C++ qui nécessitent une gestion manuelle de la mémoire.&lt;/p&gt;

&lt;p&gt;Concrètement voici le schéma d'architecture d'une JVM :&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%2Fyz19y3ege1d6qpi9o0kc.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%2Fyz19y3ege1d6qpi9o0kc.png" title="Schéma d'architecture d'une JVM" alt="Schéma d'architecture d'une JVM" width="800" height="496"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pour mémoire voici le rôle de chaque brique d'une JVM, au cours du reste de l'article nous nous concentrerons sur le fonctionnement du "Garbage Collector" qui se trouve être au coeur de la gestion des fuites mémoires possibles.&lt;/p&gt;
&lt;h3&gt;
  
  
  Class Loader Subsystem : Sous-système de chargement des classes
&lt;/h3&gt;

&lt;p&gt;Le sous-système de chargement des classes est principalement responsable de trois activités :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Loading&lt;/strong&gt; (Chargement) : Le chargeur de classes lit les fichiers .class, génère les données binaires correspondantes à l'OS et les enregistre dans la zone méthode (method area). &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Pour chaque fichier .class, la JVM stocke les informations suivantes :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Le nom complètement qualifié de la classe chargée et sa classe parente immédiate.&lt;/li&gt;
&lt;li&gt;Si le fichier .class concerne une classe, une interface ou une énumération.&lt;/li&gt;
&lt;li&gt;Les modificateurs, variables et informations sur les méthodes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Après avoir chargé le fichier .class, la JVM crée un objet de type Class pour représenter ce fichier en mémoire heap. Cet objet, défini dans le package java.lang, permet au programmeur d’obtenir des informations sur la classe (nom, méthodes, variables, etc.) via la méthode getClass() de la classe Object.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Linking&lt;/strong&gt; (Lien), cette étape comprend trois sous-étapes :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;S'assure que le fichier .class est correctement formaté et généré par un compilateur valide. En cas d'échec, une exception java.lang.VerifyError est levée.&lt;/li&gt;
&lt;li&gt;Alloue de la mémoire pour les variables statiques de classe et initialise cette mémoire à des valeurs par défaut.&lt;/li&gt;
&lt;li&gt;Remplace les références symboliques par des références directes en recherchant dans la zone méthode.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Initialization&lt;/strong&gt; (Initialisation), durant cette phase :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Les variables statiques reçoivent leurs valeurs définies dans le code.&lt;/li&gt;
&lt;li&gt;Les blocs statiques (le cas échéant) sont exécutés de haut en bas et selon la hiérarchie des classes (du parent à l'enfant).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Chargeurs de classes (Class Loaders)
&lt;/h3&gt;

&lt;p&gt;Il existe trois types principaux de chargeurs de classes :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Chargeur de classes bootstrap : Charge les classes de base de l’API Java depuis le répertoire JAVA_HOME/lib. Implémenté en code natif (C, C++).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Chargeur de classes d'extension : Charge les classes présentes dans le répertoire JAVA_HOME/jre/lib/ext ou tout autre répertoire spécifié par la propriété système java.ext.dirs. Implémenté en Java.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Chargeur de classes système/application : Charge les classes à partir du classpath de l'application, défini par la variable java.class.path. Implémenté en Java.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Zones mémoire de la JVM
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Method area (Zone méthode) : Stocke les informations des classes (nom, méthodes, variables statiques, etc.). Partagée entre tous les threads.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Heap area (Zone heap) : Contient les informations des objets. Partagée entre tous les threads.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Stack area (Zone pile) : Chaque thread a sa propre pile d'exécution, stockant les variables locales et les appels de méthodes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;PC Registers (Registres PC) : Contiennent l’adresse de l’instruction en cours d’exécution pour chaque thread.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Native method stacks (Piles de méthodes natives) : Contiennent les informations des méthodes natives pour chaque thread.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Moteur d’exécution (Execution Engine)
&lt;/h3&gt;

&lt;p&gt;Le moteur d’exécution exécute le bytecode .class. Il comprend :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Interpréteur : Interprète et exécute le bytecode ligne par ligne. Moins performant pour des appels fréquents de méthodes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Compilateur Just-In-Time (JIT) : Améliore l'efficacité en compilant le bytecode en code natif pour éviter des réinterprétations répétées.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Collecteur de déchets (Garbage Collector) : Détruit les objets non référencés.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Interface Java Native (JNI)
&lt;/h3&gt;

&lt;p&gt;Permet à la JVM d’interagir avec des bibliothèques natives (écrites en C/C++) pour exécuter des méthodes natives.&lt;/p&gt;
&lt;h3&gt;
  
  
  Bibliothèques de méthodes natives
&lt;/h3&gt;

&lt;p&gt;Collections de bibliothèques natives nécessaires pour exécuter des méthodes spécifiques au matériel.&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Paramètrage du ramasse-miettes Java le fameux "Garbage Collector"
&lt;/h2&gt;

&lt;p&gt;Dans ce chapitre, nous allons aborder &lt;em&gt;sérieusement&lt;/em&gt; les concepts et notions liés au Garbage Collector de Java, ou GC pour les intimes. 😊&lt;/p&gt;

&lt;p&gt;Le GC (Garbage Collector) est notre agent d'entretien virtuel : il libère la mémoire en supprimant les objets devenus inutiles. Fini les allocations et libérations manuelles à la C++ – en Java, le GC fait le ménage automatiquement.&lt;/p&gt;

&lt;p&gt;⚠️ Attention&lt;br&gt;
Cette automatisation a un coût : quand des fuites mémoire surviennent, le diagnostic est plus complexe car le GC travaille en coulisse.&lt;/p&gt;

&lt;p&gt;Nous allons voir comment ce mécanisme fonctionne et comment le configurer pour prévenir les fuites mémoire.&lt;/p&gt;
&lt;h3&gt;
  
  
  Principes de fonctionnement du "Garbage Collector"
&lt;/h3&gt;

&lt;p&gt;Les concepts de base du GC sont relativement simples, quatre principes sont à connaitre :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;En Java, les objets sont alloués dans le tas (heap) lorsque le mot clé &lt;strong&gt;new&lt;/strong&gt; est appelé.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;La JVM surveille les objets en mémoire pour déterminer lesquels ne sont plus accessibles à partir de n'importe quel thread actif ou variable accessible.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cette étape la plus importante est appelé le Balayage (Sweep) dans la litérature Java.&lt;/p&gt;

&lt;p&gt;Les objets sont stockés sous la forme de grappes nommé "racine GC".&lt;/p&gt;

&lt;p&gt;Les racines GC sont liées entre elles et contiennent :&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Les variables locales.
- Les références dans les piles des threads.
- Les références statiques des classes chargées.
- Les registres du processeur (si applicable).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Les objets inaccessibles (autrement dit isolé) sont considérés comme inutilisables et peuvent être collectés pour libérer de la mémoire.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lorsque la mémoire devient fragmentée à cause des suppressions, le compactage peut être effectué pour réorganiser les objets restants et maximiser l’espace libre contigu.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Attention&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Le GC est exécuté dans un processus autre que votre application ➡️ N'étant pas instantané, il peut entraîner des pauses de votre application. &lt;/li&gt;
&lt;li&gt;Les JVM modernes offrent plusieurs implémentations du GC ➡️ Il est important de les connaitres pour choisir le plus adapté.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h4&gt;
  
  
  Choisir le bon algorithme GC
&lt;/h4&gt;

&lt;p&gt;Pour activer un collecteur spécifique, vous pouvez fournir l’option -XX:+Use a la JVM lors du démarrage de votre application. &lt;/p&gt;

&lt;p&gt;Voici un exemple de ligne de commande :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;java &lt;span class="nt"&gt;-XX&lt;/span&gt;:+Use&amp;lt;GarbageCollectorName&amp;gt; &lt;span class="nt"&gt;-jar&lt;/span&gt; myapp.jar
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Le choix des garbages Collector dépend de la version de java que vous utilisez. Voici les algorithmes disponibles en java 21 avec leur avantages/inconvénients. &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Nom&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Caractéristiques&lt;/th&gt;
&lt;th&gt;Utilisation typique&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Serial GC&lt;/td&gt;
&lt;td&gt;Un ramasse-miettes simple et efficace, adapté aux petites applications à thread unique&lt;/td&gt;
&lt;td&gt;• Collecte séquentielle (un seul thread)&lt;br&gt;• Pause unique et longue pour l'application&lt;/td&gt;
&lt;td&gt;Idéal pour les applications simples, avec de faibles besoins en mémoire et un seul thread&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Parallel GC&lt;/td&gt;
&lt;td&gt;Conçu pour maximiser le débit global de l'application&lt;/td&gt;
&lt;td&gt;• Collecte parallèle des générations jeune et ancienne&lt;br&gt;• Optimise le temps total de collecte vs temps d'exécution&lt;/td&gt;
&lt;td&gt;Applications nécessitant un débit élevé et tolérant des pauses plus longues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;G1 GC&lt;/td&gt;
&lt;td&gt;Un collecteur équilibré entre faible latence et bon débit&lt;/td&gt;
&lt;td&gt;• Divise le tas en régions de taille fixe&lt;br&gt;• Collecte prioritaire des régions les plus chargées&lt;br&gt;• Pauses définies par l'utilisateur&lt;/td&gt;
&lt;td&gt;Applications interactives nécessitant des temps de pause prévisibles&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ZGC&lt;/td&gt;
&lt;td&gt;Un collecteur à très faible latence&lt;/td&gt;
&lt;td&gt;• Pauses &amp;lt;10 ms même sur grands tas&lt;br&gt;• Collecte principalement en arrière-plan&lt;/td&gt;
&lt;td&gt;Applications nécessitant une latence minimale (temps réel, systèmes critiques)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shenandoah GC&lt;/td&gt;
&lt;td&gt;Collecteur orienté faible latence, similaire à ZGC&lt;/td&gt;
&lt;td&gt;• Pauses courtes et prévisibles (&amp;lt;10 ms)&lt;br&gt;• Balayage et compactage concurrent&lt;/td&gt;
&lt;td&gt;Applications nécessitant des temps de réponse courts sur tas moyens à grands&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Epsilon GC&lt;/td&gt;
&lt;td&gt;Un collecteur qui ne collecte pas&lt;/td&gt;
&lt;td&gt;• Aucune gestion mémoire post-allocation&lt;br&gt;• Usage principalement pour tests&lt;/td&gt;
&lt;td&gt;Applications sans besoin de collecte ou pour benchmarking&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Comparaison rapide des collecteurs&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Collecteur&lt;/th&gt;
&lt;th&gt;Latence&lt;/th&gt;
&lt;th&gt;Débit&lt;/th&gt;
&lt;th&gt;Taille du tas idéale&lt;/th&gt;
&lt;th&gt;Caractéristique principale&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Serial&lt;/td&gt;
&lt;td&gt;Élevée&lt;/td&gt;
&lt;td&gt;Modéré&lt;/td&gt;
&lt;td&gt;Petite&lt;/td&gt;
&lt;td&gt;Simple et efficace pour applications basiques.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Parallel&lt;/td&gt;
&lt;td&gt;Moyenne&lt;/td&gt;
&lt;td&gt;Élevé&lt;/td&gt;
&lt;td&gt;Petite à grande&lt;/td&gt;
&lt;td&gt;Optimisé pour le débit.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;G1&lt;/td&gt;
&lt;td&gt;Basse&lt;/td&gt;
&lt;td&gt;Équilibré&lt;/td&gt;
&lt;td&gt;Petite à grande&lt;/td&gt;
&lt;td&gt;Prévisibilité des temps de pause.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ZGC&lt;/td&gt;
&lt;td&gt;Très basse&lt;/td&gt;
&lt;td&gt;Élevé&lt;/td&gt;
&lt;td&gt;Très grande (To)&lt;/td&gt;
&lt;td&gt;Pauses ultra-courtes.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shenandoah&lt;/td&gt;
&lt;td&gt;Très basse&lt;/td&gt;
&lt;td&gt;Équilibré&lt;/td&gt;
&lt;td&gt;Modérée à grande&lt;/td&gt;
&lt;td&gt;Latence minimale avec compactage.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Epsilon&lt;/td&gt;
&lt;td&gt;Aucune&lt;/td&gt;
&lt;td&gt;Aucun impact&lt;/td&gt;
&lt;td&gt;Variable&lt;/td&gt;
&lt;td&gt;Pas de gestion de mémoire.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Paramétrage de la taille mémoire alloué à votre application Java
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Configuration du tas Java et gestion de la mémoire
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Importance de la configuration
&lt;/h3&gt;

&lt;p&gt;La configuration du tas Java est cruciale pour les performances applicatives. Elle implique l'ajustement des tailles minimale et maximale de mémoire JVM pour une gestion efficace des objets.&lt;/p&gt;

&lt;h3&gt;
  
  
  Impact sur les performances
&lt;/h3&gt;

&lt;p&gt;Une configuration optimale permet d'éviter :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Des collectes mémoire trop fréquentes impactant les performances&lt;/li&gt;
&lt;li&gt;Des erreurs &lt;code&gt;OutOfMemoryError&lt;/code&gt; causant des interruptions de service&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Types d'erreurs OutOfMemoryError
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type d'erreur&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Message d'erreur&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Heap space&lt;/td&gt;
&lt;td&gt;Mémoire tas insuffisante pour les nouveaux objets&lt;/td&gt;
&lt;td&gt;&lt;code&gt;java.lang.OutOfMemoryError: Java heap space&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GC Overhead limit&lt;/td&gt;
&lt;td&gt;JVM consacre &amp;gt;98% du temps au Garbage Collector&lt;/td&gt;
&lt;td&gt;&lt;code&gt;java.lang.OutOfMemoryError: GC overhead limit exceeded&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Metaspace&lt;/td&gt;
&lt;td&gt;Espace saturé pour les métadonnées de classes (Java 8+)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;java.lang.OutOfMemoryError: Metaspace&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Liste des options du tas disponibles
&lt;/h3&gt;

&lt;p&gt;Afin d'éviter les &lt;code&gt;OutOfMemoryError&lt;/code&gt; les options du tas disponibles sont les suivantes :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;-Xms&lt;/code&gt;&lt;/strong&gt; : Définit la taille initiale du tas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;-Xmx&lt;/code&gt;&lt;/strong&gt; : Définit la taille maximale du tas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;-XX:NewSize&lt;/code&gt;&lt;/strong&gt; et &lt;strong&gt;&lt;code&gt;-XX:MaxNewSize&lt;/code&gt;&lt;/strong&gt; : Contrôlent la taille du jeune espace (Young Generation) dans le tas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;-XX:PermSize&lt;/code&gt;&lt;/strong&gt; et &lt;strong&gt;&lt;code&gt;-XX:MaxPermSize&lt;/code&gt;&lt;/strong&gt; (pour Java 7 et versions antérieures) : Définissent la taille de l'espace permanent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;-XX:MetaspaceSize&lt;/code&gt;&lt;/strong&gt; et &lt;strong&gt;&lt;code&gt;-XX:MaxMetaspaceSize&lt;/code&gt;&lt;/strong&gt; (pour Java 8 et versions ultérieures) : Contrôlent la taille du Metaspace.&lt;/li&gt;
&lt;/ul&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%2F0z441sixoai2dm2x32tu.jpg" 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%2F0z441sixoai2dm2x32tu.jpg" title="Liste des options du tas disponibles" alt="Liste des options du tas disponibles" width="593" height="321"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Transmettre les options nécessaire a votre JVM
&lt;/h3&gt;

&lt;p&gt;Pour configurer le tas Java, ajoutez a nouveau les options directement dans la ligne de commande utilisée pour lancer votre application Java.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;java &lt;span class="nt"&gt;-Xms256m&lt;/span&gt; &lt;span class="nt"&gt;-Xmx1024m&lt;/span&gt; &lt;span class="nt"&gt;-XX&lt;/span&gt;:MetaspaceSize&lt;span class="o"&gt;=&lt;/span&gt;128m &lt;span class="nt"&gt;-XX&lt;/span&gt;:MaxMetaspaceSize&lt;span class="o"&gt;=&lt;/span&gt;256m &lt;span class="nt"&gt;-jar&lt;/span&gt; MonApplication.jar
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Paramétrage des logs pour observer la mémoire allouée à votre application
&lt;/h2&gt;

&lt;p&gt;Les problèmes de mémoire peuvent mettre un certain temps à se manifester : plusieurs heures, jours, voire même semaines après le lancement de votre application.&lt;/p&gt;

&lt;p&gt;Il est donc essentiel d’activer et d’analyser régulièrement les journaux de collecte des déchets (logs GC) pour repérer des schémas récurrents, diagnostiquer des anomalies et ajuster les paramètres de collecte en conséquence.&lt;/p&gt;

&lt;p&gt;Les versions récentes de Java utilisent le système &lt;strong&gt;Unified Logging&lt;/strong&gt;, qui permet de configurer les logs liés à la mémoire et au garbage collector via l'option &lt;strong&gt;-Xlog&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Liste des options JVM pour obtenir les Logs Mémoire et Garbage Collector
&lt;/h3&gt;

&lt;p&gt;Liste des options JVM pour obtenir les Logs Mémoire et Garbage Collector :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;gc*&lt;/code&gt;&lt;/strong&gt; : Log des événements du garbage collector.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;heap*=debug&lt;/code&gt;&lt;/strong&gt; : Log des allocations et libérations de mémoire.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;debug&lt;/code&gt;&lt;/strong&gt; : Niveau de détail des logs.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;java &lt;span class="nt"&gt;-Xlog&lt;/span&gt;:gc&lt;span class="k"&gt;*&lt;/span&gt;,heap&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;debug &lt;span class="nt"&gt;-jar&lt;/span&gt; votre-application.jar
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Liste des options JVM pour écrire les Logs dans un Fichier :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;file=gc_logs.txt&lt;/code&gt;&lt;/strong&gt; : Redirige les logs vers le fichier spécifié.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;time,uptime,level&lt;/code&gt;&lt;/strong&gt; : Ajoute des informations comme le temps et le niveau de log.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;java &lt;span class="nt"&gt;-Xlog&lt;/span&gt;:gc&lt;span class="k"&gt;*&lt;/span&gt;,heap&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;debug:file&lt;span class="o"&gt;=&lt;/span&gt;gc_logs.txt:time,uptime,level &lt;span class="nt"&gt;-jar&lt;/span&gt; votre-application.jar
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si vous avez une application Spring Boot, vous pouvez simplement utiliser Actuator pour récupérer les heap dumps. Il faut rajouter ces deux dépendances à votre projet :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-actuator&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-web&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Détecter l'origine d'une fuite mémoire avec Intelij
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Fuites mémoire et Profiler IntelliJ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Définition :
&lt;/h3&gt;

&lt;p&gt;Une fuite mémoire est une consommation progressive et incontrôlée de mémoire causée par des objets devenus inutiles mais qui ne sont pas libérés correctement par le système.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solution
&lt;/h3&gt;

&lt;p&gt;IntelliJ fournit un profiler intégré qui permet de :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Détecter l'origine des fuites&lt;/li&gt;
&lt;li&gt;Analyser la consommation mémoire&lt;/li&gt;
&lt;li&gt;Valider les corrections apportées&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Le profiler offre une visualisation en temps réel de l'allocation mémoire, facilitant l'identification des objets problématiques.&lt;br&gt;
Il est sous-utilisé à mon avis surtout par manque de connaissance et de formation.&lt;/p&gt;
&lt;h3&gt;
  
  
  Développement d'une application générant une fuite mémoire
&lt;/h3&gt;

&lt;p&gt;Pour illustrer l'utilisation du profiler IntelliJ, je vous propose l'application Spring boot minimaliste suivante.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.onepoint.profiler&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.boot.SpringApplication&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.boot.autoconfigure.SpringBootApplication&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.scheduling.annotation.EnableScheduling&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.scheduling.annotation.Scheduled&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.stereotype.Service&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.crypto.NoSuchPaddingException&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.security.NoSuchAlgorithmException&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.ArrayList&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.List&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@SpringBootApplication&lt;/span&gt;
&lt;span class="nd"&gt;@EnableScheduling&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProfilerApplication&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

        &lt;span class="nc"&gt;SpringApplication&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ProfilerApplication&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;@Service&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MemoryLeakService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="c1"&gt;// Liste statique pour maintenir des références inutilisées&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;MEMORY_LEAK_LIST&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;// Tâche planifiée pour simuler une fuite mémoire en continu&lt;/span&gt;
    &lt;span class="nd"&gt;@Scheduled&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fixedRate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Exécution toutes les 5 secondes&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;simulateMemoryLeak&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;NoSuchPaddingException&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;NoSuchAlgorithmException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Ajout de blocs mémoire à la liste..."&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// FUITE MEMOIRE : Ajouter un bloc de 10 MB à chaque exécution&lt;/span&gt;
        &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;memoryBlock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;
        &lt;span class="no"&gt;MEMORY_LEAK_LIST&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;memoryBlock&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Imprimer la taille actuelle de la liste&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Taille actuelle de MEMORY_LEAK_LIST : "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="no"&gt;MEMORY_LEAK_LIST&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Utilisation du profiler
&lt;/h3&gt;

&lt;p&gt;Démarrer votre application.&lt;/p&gt;

&lt;p&gt;La fenètre Run doit alors apparaitre. &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%2F1zt5dvmveynxeawe07b6.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%2F1zt5dvmveynxeawe07b6.png" title="Utilisation du profiler InteliJ" alt="Utilisation du profiler InteliJ" width="494" height="222"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cliquer sur l'icone profiler qui ressemble a une gauge.&lt;/p&gt;

&lt;p&gt;Vous devez voir apparaitre la liste des processus en cours. &lt;br&gt;
Dans mon cas, mon application apparait en deuxième position.&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%2F2d9w4gvp41i0dstp7vil.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%2F2d9w4gvp41i0dstp7vil.png" title="Utilisation du profiler InteliJ" alt="Utilisation du profiler InteliJ" width="649" height="239"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Faire un clic droit sur la méthode. Puis choisir l'option "CPU and memory Live Charts".&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%2Fcdz8560pgptz4glxm8bp.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%2Fcdz8560pgptz4glxm8bp.png" title="Utilisation du profiler InteliJ" alt="Utilisation du profiler InteliJ" width="572" height="243"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Un graphe similaire au suivant doit apparaitre. La courbe "Heap Memory" augmente continuellement : on peut visualiser clairement la fuite mémoire.&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%2Fiyralq94qtvqpewgosrt.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%2Fiyralq94qtvqpewgosrt.png" title="Utilisation du profiler InteliJ" alt="Utilisation du profiler InteliJ" width="800" height="209"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Maintenant, nous savons que l'application génère une fuite mémoire sans savoir quelle ligne de code en est la cause. &lt;/p&gt;

&lt;p&gt;Pour la rechercher, nous allons lancer le profiler en phase d'analyse :&lt;br&gt;
Revenir sur l'onglet home du profiler. &lt;br&gt;
Puis faire un clic droit sur le processus de l'application. &lt;br&gt;
Puis choisir l'option "Attach Intellij Profiler".&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%2F7jt9lu2doxa6ghb9nkal.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%2F7jt9lu2doxa6ghb9nkal.png" title="Utilisation du profiler InteliJ" alt="Utilisation du profiler InteliJ" width="572" height="243"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;La page suivante doit alors apparaitre. Patienter alors quelques minutes. Puis stopper le profiling.&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%2Fa30hb0zqwiizhb2rv5i5.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%2Fa30hb0zqwiizhb2rv5i5.png" title="Utilisation du profiler InteliJ" alt="Utilisation du profiler InteliJ" width="800" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Un onglet résultat doit apparaitre avec notamment un "Flame graph".&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%2Fo3soujw2wds6ql0hzl61.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%2Fo3soujw2wds6ql0hzl61.png" title="Utilisation du profiler InteliJ" alt="Utilisation du profiler InteliJ" width="800" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Basculer sur la vue show "Memory Allocations".&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%2Fjs1cjyt7vd62mgeyw10l.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%2Fjs1cjyt7vd62mgeyw10l.png" title="Utilisation du profiler InteliJ" alt="Utilisation du profiler InteliJ" width="280" height="78"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sélectionner l'onglet "Call tree". La méthode posant problème apparait alors clairement car elle occupe 3,49 Go de mémoire.&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%2Fe8wyj7urr4nfjwrlmebn.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%2Fe8wyj7urr4nfjwrlmebn.png" title="Utilisation du profiler InteliJ" alt="Utilisation du profiler InteliJ" width="800" height="299"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aller voir le code de la méthode : une flame rouge est apposée sur la ligne 38 placée volontairement pour générer une fuite mémoire. &lt;br&gt;
! CQFD !&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%2Ffsvddtuafcwsq0b2zxz7.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%2Ffsvddtuafcwsq0b2zxz7.png" title="Utilisation du profiler InteliJ" alt="Utilisation du profiler InteliJ" width="800" height="244"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cet exercice nous a permit de découvrir comment identifier une fuite mémoire dans une application Java. &lt;br&gt;
Il peut également s'appliquer dans d'autres cas, comme en cas de surconsommation de CPU.&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;La JVM est le moteur central de vos applications Java, gérant automatiquement la mémoire et l'exécution des instructions. Tel un mécanisme de précision, chaque composant joue un rôle essentiel dans son fonctionnement optimal.&lt;/p&gt;

&lt;p&gt;Bien que sophistiquée, ce moteur nécessite parfois des ajustements manuels. La configuration de la mémoire et l'optimisation du Garbage Collector s'apparentent à un travail de mécanique fine, où chaque réglage impacte les performances globales.&lt;/p&gt;

&lt;p&gt;Les options de configuration et les logs sont vos outils de diagnostic, permettant d'identifier et résoudre les problèmes avant qu'ils n'affectent la production. Le profiler, quant à lui, agit comme la valise de diagnostic avancé, capable de détecter les anomalies les plus subtiles.&lt;/p&gt;

&lt;p&gt;Maîtriser la JVM s'apparente ainsi au pilotage d'une voiture de course : au-delà de la vitesse, il faut comprendre ses réglages, anticiper sa maintenance et savoir utiliser les outils d'optimisation pour éviter les pannes. À vous de prendre les commandes !&lt;/p&gt;

&lt;h3&gt;
  
  
  Rappel pour choisir le bon collecteur
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Pense-bête : les Garbage Collectors par cas d'usage
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Objectif&lt;/th&gt;
&lt;th&gt;Garbage Collector recommandé&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Faible latence&lt;/td&gt;
&lt;td&gt;ZGC ou Shenandoah&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Débit élevé&lt;/td&gt;
&lt;td&gt;Parallel GC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Équilibre latence/débit&lt;/td&gt;
&lt;td&gt;G1 GC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Simplicité&lt;/td&gt;
&lt;td&gt;Serial GC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tests et benchmarks&lt;/td&gt;
&lt;td&gt;Epsilon GC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Cet article fait partie du "Advent of Tech 2024 Onepoint", une série d'articles tech publiés par &lt;a href="https://dev.to/onepoint"&gt;Onepoint&lt;/a&gt; pour patienter jusqu'à Noël.&lt;br&gt;
Voir tous les articles du &lt;a href="https://dev.to/onepoint/advent-of-tech-2024-onepoint-le"&gt;Advent of Tech 2024&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Merci de votre lecture.&lt;/p&gt;

</description>
      <category>java</category>
      <category>devops</category>
      <category>intelij</category>
      <category>adventoftech2024</category>
    </item>
  </channel>
</rss>
