diff --git a/docs/learn/devops/2026-02-16.md b/docs/learn/devops/2026-02-16.md new file mode 100644 index 0000000..9f2a9eb --- /dev/null +++ b/docs/learn/devops/2026-02-16.md @@ -0,0 +1,81 @@ +# Django en gros (16/02/2026) + +## Commencer un projet Django + +Pour commencer un projet Django, c'est super simple : + +-> D'abord, créer un dossier de projet + `mkdir projet` + +-> Ensuite créer un environnement virtuel Python puis installer Django via pip + `python3 -m venv "projetvenv" && source projetvenv/bin/activate && pip install django` + +-> Maintenant, créer le projet Django dans ce dossier (le point à la fin indique que l'on crée dans ce dossier le projet) + `django-admin startproject config .` + +-> On peut maintenant travailler dans notre projet Django + +## Projet et applications + +Django fonctionne sur l'utilisations de petits modules appelés "Applications", ceux-ci composent un projet Django. Elles peuvent être des composants gèrant une API qui prend des données JSON pour les mettre dans une BDD SQL comme dans le projet Grabber ou encore plein d'autres cas... + +!!! note + + En gros, on a un projet (dossier "config") dans lequel on gère les réglages généraux de Django (serveur, adresses, ect...) et des applications (dans leurs dossiers propres) qui gèrent leurs tâches propres à elles + +Pour créer une Application on utilise cette commande -> `python manage.py startapp api` + +## Fonctionnement d'une Application + +Une application se divise avec un fonctionnement en 3 parties + +Modèle <--> Vue -> Template + +### Modèle + +Le Modèle sera la partie manipulation d'objets (comme en PhP), dans le projet Grabber, Django s'occupera de créer la DB sql via ce module + +!!! warning + + Quand on travaille sur le fichier models.py (généralement celui qui s'occupe de ce module) on doit utiliser deux commandes qui construisent le modèle + + ```python + python manage.py makemigrations + python manage.py migrate + ``` + +### Vue + +La Vue ici, c'est un peu le cerveau du projet, il reçoit les requêtes (par exemple, l'utilisateur qui demande une URL ou alors un fichier bash qui envoie des données comme avec Grabber) et peut renvoyer ces requêtes au Modèle pour avoir un résultat, etc... + +### Template + +Le template, c'est l'interface, par exemple des fichiers HTML. Il reçoit les données brutes de la Vue et les affiche proprement dans une jolie page web. + +!!! note "Utiliser les données brutes dans une template" + + Pour se faire, on doit utiliser cette balise `{{ ... }}` dans le HTML, cela veut dire pour Django que l'on récupère les données d'une clé spécifique + + ```html + + {{ data.hostname }} - Grabber + ``` + +### URLs + +Un autre composant très important dans Django, c'est les URLs. C'est un fichier dans lequel on doit router ce que telle url dans le navigateur doit effectuer. + +!!! note "Par exemple" + + Appeler la racine (localhost:5000/) doit être routé comme ceci : + + ```python + from django.urls import path + from api import views + + urlpatterns = [ + # Route de la racine qui appelle la fonction computers_list + path('', views.computers_list, name='computers'), + ] + ``` + diff --git a/docs/projects/2025-12-05.md b/docs/projects/2025-12-05.md index e1894c9..750fc24 100644 --- a/docs/projects/2025-12-05.md +++ b/docs/projects/2025-12-05.md @@ -19,7 +19,7 @@ Pour fonctionner, grabber a plusieures tâches réparties par différents élém - Bash -> Script qui fetch et lance la console admin - Python - - uvicorn -> pour host le site admin en local + - Django -> pour host le site admin en local ## Avancement diff --git a/mkdocs.yml b/mkdocs.yml index c761d36..15392c1 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -57,6 +57,7 @@ nav: - learn/devops/2025-12-12.md - learn/devops/2026-01-16.md - learn/devops/2026-01-22.md + - learn/devops/2026-02-16.md - ☕ Javascript: - learn/javascript/2026-01-30.md - learn/javascript/2026-02-06.md diff --git a/site/404.html b/site/404.html index 6caf4c7..15b7b2d 100644 --- a/site/404.html +++ b/site/404.html @@ -556,6 +556,34 @@ + + + + + + +
  • + + + + + + + + Django en gros (16/02/2026) + + + + + + + + +
  • + + + + diff --git a/site/index.html b/site/index.html index 23de7c6..2d7ea6b 100644 --- a/site/index.html +++ b/site/index.html @@ -622,6 +622,34 @@ + + + + + + +
  • + + + + + + + + Django en gros (16/02/2026) + + + + + + + + +
  • + + + + diff --git a/site/learn/devops/2025-10-30/index.html b/site/learn/devops/2025-10-30/index.html index 9f563f7..66c8925 100644 --- a/site/learn/devops/2025-10-30/index.html +++ b/site/learn/devops/2025-10-30/index.html @@ -628,6 +628,34 @@ + + + + + + +
  • + + + + + + + + Django en gros (16/02/2026) + + + + + + + + +
  • + + + + diff --git a/site/learn/devops/2025-11-28/index.html b/site/learn/devops/2025-11-28/index.html index 8871b44..546b2da 100644 --- a/site/learn/devops/2025-11-28/index.html +++ b/site/learn/devops/2025-11-28/index.html @@ -678,6 +678,34 @@ + + + + + + +
  • + + + + + + + + Django en gros (16/02/2026) + + + + + + + + +
  • + + + + diff --git a/site/learn/devops/2025-12-12/index.html b/site/learn/devops/2025-12-12/index.html index 1071def..ccaea00 100644 --- a/site/learn/devops/2025-12-12/index.html +++ b/site/learn/devops/2025-12-12/index.html @@ -728,6 +728,34 @@ + + + + + + +
  • + + + + + + + + Django en gros (16/02/2026) + + + + + + + + +
  • + + + + diff --git a/site/learn/devops/2026-01-16/index.html b/site/learn/devops/2026-01-16/index.html index 4f7f21b..4150fef 100644 --- a/site/learn/devops/2026-01-16/index.html +++ b/site/learn/devops/2026-01-16/index.html @@ -639,6 +639,34 @@ + + + + + + +
  • + + + + + + + + Django en gros (16/02/2026) + + + + + + + + +
  • + + + + diff --git a/site/learn/devops/2026-01-22/index.html b/site/learn/devops/2026-01-22/index.html index 9864741..cfc9318 100644 --- a/site/learn/devops/2026-01-22/index.html +++ b/site/learn/devops/2026-01-22/index.html @@ -12,7 +12,7 @@ - + @@ -700,6 +700,34 @@ + + + + + + +
  • + + + + + + + + Django en gros (16/02/2026) + + + + + + + + +
  • + + + + diff --git a/site/learn/devops/2026-02-16/index.html b/site/learn/devops/2026-02-16/index.html new file mode 100644 index 0000000..bc39d86 --- /dev/null +++ b/site/learn/devops/2026-02-16/index.html @@ -0,0 +1,1291 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Django en gros (16/02/2026) - Les incroyables notes de devops + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + Skip to content + + +
    +
    + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    + +
    + + + +
    + +
    + + + + + + +

    Django en gros (16/02/2026)

    +

    Commencer un projet Django

    +

    Pour commencer un projet Django, c'est super simple :

    +

    -> D'abord, créer un dossier de projet + mkdir projet

    +

    -> Ensuite créer un environnement virtuel Python puis installer Django via pip + python3 -m venv "projetvenv" && source projetvenv/bin/activate && pip install django

    +

    -> Maintenant, créer le projet Django dans ce dossier (le point à la fin indique que l'on crée dans ce dossier le projet) + django-admin startproject config .

    +

    -> On peut maintenant travailler dans notre projet Django

    +

    Projet et applications

    +

    Django fonctionne sur l'utilisations de petits modules appelés "Applications", ceux-ci composent un projet Django. Elles peuvent être des composants gèrant une API qui prend des données JSON pour les mettre dans une BDD SQL comme dans le projet Grabber ou encore plein d'autres cas...

    +
    +

    Note

    +

    En gros, on a un projet (dossier "config") dans lequel on gère les réglages généraux de Django (serveur, adresses, ect...) et des applications (dans leurs dossiers propres) qui gèrent leurs tâches propres à elles

    +
    +

    Pour créer une Application on utilise cette commande -> python manage.py startapp api

    +

    Fonctionnement d'une Application

    +

    Une application se divise avec un fonctionnement en 3 parties

    +

    Modèle <--> Vue -> Template

    +

    Modèle

    +

    Le Modèle sera la partie manipulation d'objets (comme en PhP), dans le projet Grabber, Django s'occupera de créer la DB sql via ce module

    +
    +

    Warning

    +

    Quand on travaille sur le fichier models.py (généralement celui qui s'occupe de ce module) on doit utiliser deux commandes qui construisent le modèle

    +
    python manage.py makemigrations
    +python manage.py migrate
    +
    +
    +

    Vue

    +

    La Vue ici, c'est un peu le cerveau du projet, il reçoit les requêtes (par exemple, l'utilisateur qui demande une URL ou alors un fichier bash qui envoie des données comme avec Grabber) et peut renvoyer ces requêtes au Modèle pour avoir un résultat, etc...

    +

    Template

    +

    Le template, c'est l'interface, par exemple des fichiers HTML. Il reçoit les données brutes de la Vue et les affiche proprement dans une jolie page web.

    +
    +

    Utiliser les données brutes dans une template

    +

    Pour se faire, on doit utiliser cette balise {{ ... }} dans le HTML, cela veut dire pour Django que l'on récupère les données d'une clé spécifique

    +
    <!-- Dans les crochets, on appelle la donnée "hostname" de la table "data"-->
    +<title>{{ data.hostname }} - Grabber</title>
    +
    +
    +

    URLs

    +

    Un autre composant très important dans Django, c'est les URLs. C'est un fichier dans lequel on doit router ce que telle url dans le navigateur doit effectuer.

    +
    +

    Par exemple

    +

    Appeler la racine (localhost:5000/) doit être routé comme ceci :

    +
    from django.urls import path
    +from api import views
    +
    +urlpatterns = [
    +    # Route de la racine qui appelle la fonction computers_list
    +    path('', views.computers_list, name='computers'),
    +]
    +
    +
    + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + + \ No newline at end of file diff --git a/site/learn/javascript/2026-01-30/index.html b/site/learn/javascript/2026-01-30/index.html index 7b1a0aa..307d7e7 100644 --- a/site/learn/javascript/2026-01-30/index.html +++ b/site/learn/javascript/2026-01-30/index.html @@ -9,7 +9,7 @@ - + @@ -567,6 +567,34 @@ + + + + + + +
  • + + + + + + + + Django en gros (16/02/2026) + + + + + + + + +
  • + + + + diff --git a/site/learn/javascript/2026-02-06/index.html b/site/learn/javascript/2026-02-06/index.html index f4e642c..8d6d757 100644 --- a/site/learn/javascript/2026-02-06/index.html +++ b/site/learn/javascript/2026-02-06/index.html @@ -567,6 +567,34 @@ + + + + + + +
  • + + + + + + + + Django en gros (16/02/2026) + + + + + + + + +
  • + + + + diff --git a/site/learn/javascript/2026-02-09/index.html b/site/learn/javascript/2026-02-09/index.html index 8ccc2a3..bcb14c0 100644 --- a/site/learn/javascript/2026-02-09/index.html +++ b/site/learn/javascript/2026-02-09/index.html @@ -567,6 +567,34 @@ + + + + + + +
  • + + + + + + + + Django en gros (16/02/2026) + + + + + + + + +
  • + + + + diff --git a/site/links/index.html b/site/links/index.html index 3070638..da3fbc0 100644 --- a/site/links/index.html +++ b/site/links/index.html @@ -563,6 +563,34 @@ + + + + + + +
  • + + + + + + + + Django en gros (16/02/2026) + + + + + + + + +
  • + + + + diff --git a/site/projects/2025-12-05/index.html b/site/projects/2025-12-05/index.html index 5ba74f0..ce7baeb 100644 --- a/site/projects/2025-12-05/index.html +++ b/site/projects/2025-12-05/index.html @@ -565,6 +565,34 @@ + + + + + + +
  • + + + + + + + + Django en gros (16/02/2026) + + + + + + + + +
  • + + + + @@ -1079,7 +1107,7 @@ diff --git a/site/projects/2026-01-23/index.html b/site/projects/2026-01-23/index.html index 62d2e2d..15d7e38 100644 --- a/site/projects/2026-01-23/index.html +++ b/site/projects/2026-01-23/index.html @@ -565,6 +565,34 @@ + + + + + + +
  • + + + + + + + + Django en gros (16/02/2026) + + + + + + + + +
  • + + + + diff --git a/site/projects/2026-02-13/index.html b/site/projects/2026-02-13/index.html index 174e785..a6be022 100644 --- a/site/projects/2026-02-13/index.html +++ b/site/projects/2026-02-13/index.html @@ -565,6 +565,34 @@ + + + + + + +
  • + + + + + + + + Django en gros (16/02/2026) + + + + + + + + +
  • + + + + @@ -847,7 +875,7 @@ - Faire un portfolio en JS avec React/Vite + Faire un portfolio en JS moderne @@ -865,7 +893,7 @@ - Faire un portfolio en JS avec React/Vite + Faire un portfolio en JS moderne diff --git a/site/search.json b/site/search.json index 6a7530c..b55532d 100644 --- a/site/search.json +++ b/site/search.json @@ -1 +1 @@ -{"config":{"separator":"[\\s\\-_,:!=\\[\\]()\\\\\"`/]+|\\.(?!\\d)"},"items":[{"location":"","level":1,"title":"Bienvenue dans mes notes de devops","text":"

    avant le 28/11 y'a rien a gratter, j'installais linux pour la 9387e fois

    ","path":["Bienvenue dans mes notes de devops"],"tags":[]},{"location":"#bienvenue-dans-mes-notes-de-devops","level":1,"title":"Bienvenue dans mes notes de devops","text":"","path":["Bienvenue dans mes notes de devops"],"tags":[]},{"location":"#structure","level":2,"title":"Structure","text":"

    -> cours (Notes sur les cours)

    -> projects (Notes sur des nouveaux projets)

    -> liens cools (mes sites favoris)

    ","path":["Bienvenue dans mes notes de devops"],"tags":[]},{"location":"links/","level":1,"title":"Liens cools de ma poche","text":"","path":["Liens cools de ma poche"],"tags":[]},{"location":"links/#liens-cools-de-ma-poche","level":1,"title":"Liens cools de ma poche","text":"","path":["Liens cools de ma poche"],"tags":[]},{"location":"links/#design","level":2,"title":"🎨 Design","text":"","path":["Liens cools de ma poche"],"tags":[]},{"location":"links/#developpement","level":2,"title":"💽 Developpement","text":"","path":["Liens cools de ma poche"],"tags":[]},{"location":"learn/devops/2025-10-30/","level":1,"title":"C'est quoi linux ? (30/10/25)","text":"","path":["Cours","🔌 DevOps","C'est quoi linux ? (30/10/25)"],"tags":["Linux","UNIX","Distributions"]},{"location":"learn/devops/2025-10-30/#cest-quoi-linux-301025","level":1,"title":"C'est quoi linux ? (30/10/25)","text":"

    Warning

    Page en travaux, doit être finie avec toutes les informations que j'ai sur Linux en général

    ","path":["Cours","🔌 DevOps","C'est quoi linux ? (30/10/25)"],"tags":["Linux","UNIX","Distributions"]},{"location":"learn/devops/2025-10-30/#arborescence-type-sur-unix","level":2,"title":"Arborescence type sur UNIX","text":"

    Unix a généralement cette arborescence que ce soit sur n'importe quelle distro Linux également Android pour les téléphones et même quelques similitudes sur macOS.

    /               # Racine du disque\n├── /bin/       # Contient les commandes de base\n├── /boot/      # Fichiers de demarrage\n├── /dev/       # Tout ce qui est lié aux périphériques\n├── /etc/       # Fichiers de configuration\n├── /home/      # Répertoires utilisateurs\n├── /lib/       # Bibliothèques logicielles\n├── /mnt/       # Point de montage pour les systèmes de fichier temporaires\n├── /media/     # Point de montage pour les disques temporaires\n├── /opt/       # Logiciels optionnels, la ou on installera des programmes maison\n├── /root/      # Répertoire du user root\n├── /var/       # Variable, contient des logs, ect...\n├── /usr/       # Contient sensiblement la même chose que la racine mais sans être utile au fonctionnement du système\n├── /srv/       # Services hébergés sur le systèmes (FTP, HTTP, ect...)\n├── /run/       # Emplacement mémoire des programmes\n└── /tmp/       # Temporaire\n
    source de l'arbo.

    ","path":["Cours","🔌 DevOps","C'est quoi linux ? (30/10/25)"],"tags":["Linux","UNIX","Distributions"]},{"location":"learn/devops/2025-11-28/","level":1,"title":"Commandes *sh pour les idiots (28/11/25)","text":"

    mon big ass qui fait sudo rm -rf / sans réfléchir

    ","path":["Cours","🔌 DevOps","Commandes *sh pour les idiots (28/11/25)"],"tags":["Bash","UNIX"]},{"location":"learn/devops/2025-11-28/#commandes-sh-pour-les-idiots-281125","level":1,"title":"Commandes *sh pour les idiots (28/11/25)","text":"","path":["Cours","🔌 DevOps","Commandes *sh pour les idiots (28/11/25)"],"tags":["Bash","UNIX"]},{"location":"learn/devops/2025-11-28/#cheatsheet-de-plein-de-commandes","level":2,"title":"Cheatsheet de plein de commandes","text":"

    Depuis le début, beaucoup de commandes on été utilisées, du coup je note ici les commandes utilisées depuis le début et a quoi elles servent en gros

    ","path":["Cours","🔌 DevOps","Commandes *sh pour les idiots (28/11/25)"],"tags":["Bash","UNIX"]},{"location":"learn/devops/2025-11-28/#commandes-de-base","level":3,"title":"Commandes de base","text":"
    1. sudo : lance une commande avec les superdroits, peut manipuler tout le pc avec en gros

      sudo [commande]\n

    2. ls : liste les fichiers d'un dossier

      # -a pour afficher les fichiers cachés / -l pour afficher en liste avec plus d'infos\nls [options] [fichier|dir]\n

    3. cd : changer de dossier

      # ~ pour aller au répertoire home / .. pour revenir en arriere\ncd [dir]\n

    4. pwd : affiche le répertoire actuel

      pwd\n

    5. touch : affiche le contenu d'un fichier

      touch [fichier]\n

    6. nano : éditeur de texte

      nano [fichier]\n

    7. mkdir : supprime ce qu'on lui donne

      mkdir [options] [fichier|dir]\n

    8. rm : supprime ce qu'on lui donne

      # -r pour supprimer un dossier et son contenu (recursive) (`rmdir` le fait aussi)\n# -f force la commande\nrm [options] [fichier|dir]\n

    9. cp : copie...

      cp [options] [source] [destination]\n

    10. mv : ...et déplace

      mv [options] [source] [destination]\n

    ","path":["Cours","🔌 DevOps","Commandes *sh pour les idiots (28/11/25)"],"tags":["Bash","UNIX"]},{"location":"learn/devops/2025-11-28/#les-caracteres-dassociations","level":3,"title":"Les caractères d'associations","text":"

    | (le pipe) -> prend le résultat de la commande de gauche et le donne à celle de droite

    exemple : liste tout un répertoire, mais n'affiche que les résultats qui sont \"feur\"

    ls -la | grep \"feur\"\n

    > et >>

    ","path":["Cours","🔌 DevOps","Commandes *sh pour les idiots (28/11/25)"],"tags":["Bash","UNIX"]},{"location":"learn/devops/2025-11-28/#permissions-et-utilisateurs","level":3,"title":"Permissions et Utilisateurs","text":"

    chmod [droits] [fichier] - change les permissions d'un fichier (qui peut lire/écrire/exécuter) - chmod +x [fichier] rend un script exécutable (très important) - chmod 777 [fichier] donne tous les droits à tout le monde (dangereux mais ça dépanne)

    chown [user]:[groupe] [fichier] - change le propriétaire du fichier (si t'as copié un truc en sudo et que tu peux plus le toucher)

    ","path":["Cours","🔌 DevOps","Commandes *sh pour les idiots (28/11/25)"],"tags":["Bash","UNIX"]},{"location":"learn/devops/2025-11-28/#lecture-et-recherche-dans-les-fichiers","level":3,"title":"Lecture et recherche dans les fichiers","text":"

    cat [fichier] - affiche tout le contenu d'un fichier d'un coup dans le terminal - utile pour les petits fichiers, sinon ça inonde l'écran

    less [fichier] - affiche le contenu page par page (on peut scroller) - appuyer sur q pour quitter

    head [fichier] / tail [fichier] - affiche juste le début (head) ou la fin (tail) d'un fichier - tail -f [fichier] hyper utile pour voir les logs en direct (ça attend les nouvelles lignes)

    grep [mot] [fichier] - cherche un mot ou une phrase spécifique dans un fichier (le ctrl+f du terminal) - -r pour chercher dans tous les dossiers (recursive) / -i pour ignorer les majuscules

    ","path":["Cours","🔌 DevOps","Commandes *sh pour les idiots (28/11/25)"],"tags":["Bash","UNIX"]},{"location":"learn/devops/2025-12-12/","level":1,"title":"Git pour les neuilles (12/12/25)","text":"

    completement zehef pcq t'as pas git push

    ","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#git-pour-les-neuilles-121225","level":1,"title":"Git pour les neuilles (12/12/25)","text":"","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#creer-un-git","level":2,"title":"Créer un git","text":"","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#-si-le-projet-existe-deja","level":3,"title":"-> Si le projet existe deja","text":"","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#-sinon-creer-le-projet","level":3,"title":"-> Sinon créer le projet","text":"","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#ignorer-des-fichiersdossiers","level":2,"title":"Ignorer des fichiers/dossiers","text":"

    echo gbvenv/ >> .gitignore <- on indique via un echo qui écrira dans le fichier .gitignore qu'on ne veut pas push le dossier \"gbvenv\" ici, un fichier on ne mettera pas le slash (logique en amont)

    ","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#une-fois-que-de-fichiers-sont-dispos-empaqueter","level":2,"title":"Une fois que de fichiers sont dispos, empaqueter !","text":"

    Pour envoyer un projet git, c'est comme envoyer un colis à la poste, d'abord, on met nos affaires dans le colis

    Plusieures possibilités ☝️

    ","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#etiqueter-le-paquet","level":2,"title":"Etiqueter le paquet","text":"

    Ensuite, on rempli l'étiquette du colis et on la colle au colis

    ","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#deposer-le-colis","level":2,"title":"Déposer le colis","text":"

    Enfin pour push, c'est a dire déposer le colis au bureau de poste pour l'envoi, on fait :

    Info

    -u veut dire ce que dit la doc en gros

    ","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#-si-erreur","level":3,"title":"-> SI ERREUR","text":"

    Dans le cas ou un fichier/dossier a été supprimé autre part avant de push nos modifs

    ","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#utiliser-deux-branches-differentes","level":2,"title":"Utiliser deux branches différentes","text":"

    Dans le cas ou l'on veut travailler avec une seconde branche

    ","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2026-01-16/","level":1,"title":"pip et environnements virtuels pour les quoicoubenks (16/01/26)","text":"

    7alouf ouvre grabber apres 9h brainrot tsunami

    ","path":["Cours","🔌 DevOps","pip et environnements virtuels pour les quoicoubenks (16/01/26)"],"tags":["Python","pip","Environnements Virtuels"]},{"location":"learn/devops/2026-01-16/#pip-et-environnements-virtuels-pour-les-quoicoubenks-160126","level":1,"title":"pip et environnements virtuels pour les quoicoubenks (16/01/26)","text":"","path":["Cours","🔌 DevOps","pip et environnements virtuels pour les quoicoubenks (16/01/26)"],"tags":["Python","pip","Environnements Virtuels"]},{"location":"learn/devops/2026-01-16/#python-et-ses-environnements-virtuels","level":2,"title":"Python et ses environnements virtuels","text":"

    Utile de créer donc un environnement pour chaque projet afin de en pas perturber d'autres projets avec des milliers de packages inutiles en gros

    python3 -m venv gbvenv <- permet de créer un environnement (venv crée l'environnement \"gbvenv\")

    source gbvenv/bin/activate <- lance cet environnement pour travailler dedans

    pip est le packages manager de python, en l'appelant, on peut installer des packages comme uvicorn par exemple, utile pour grabber

    pip install --upgrade pip <- update les packages

    python -m pip install *** <- installe le package qu'on notera a la place des ***

    pip freeze >> requirements.txt <- commande super utile pour partager les dependances necessaires pour faire fonctionner son projet sur un autre environnement

    deactivate <- désactive l'environnement virtuel

    ","path":["Cours","🔌 DevOps","pip et environnements virtuels pour les quoicoubenks (16/01/26)"],"tags":["Python","pip","Environnements Virtuels"]},{"location":"learn/devops/2026-01-16/#script-de-roi-qui-automatise-le-process","level":2,"title":"Script de roi qui automatise le process","text":"

    bash <(curl -fsSL https://raw.githubusercontent.com/buchtioof/venv-setup/main/venvsetup.sh)

    Pour en apprendre plus : le git du projet

    ","path":["Cours","🔌 DevOps","pip et environnements virtuels pour les quoicoubenks (16/01/26)"],"tags":["Python","pip","Environnements Virtuels"]},{"location":"learn/devops/2026-01-22/","level":1,"title":"SQL pour les tung tung tung sahur (22/01/26)","text":"

    florian quand je lui demande de l'aide

    ","path":["Cours","🔌 DevOps","SQL pour les tung tung tung sahur (22/01/26)"],"tags":["SQL"]},{"location":"learn/devops/2026-01-22/#sql-pour-les-tung-tung-tung-sahur-220126","level":1,"title":"SQL pour les tung tung tung sahur (22/01/26)","text":"","path":["Cours","🔌 DevOps","SQL pour les tung tung tung sahur (22/01/26)"],"tags":["SQL"]},{"location":"learn/devops/2026-01-22/#modele-mvc","level":2,"title":"Modèle MVC","text":"

    Le modèle MVC est une façon de concevoir un projet logiciel, en gros on sépare celui-ci en trois grandes parties distinctes séparant la logique de la vue et rend le travail plus facile.

    Modèle MVC en prenant celui de grabber par exemple :

    - Model = Base De Donnée (ex: EMPLOYEES, COMPUTERS)\n- View = Tableau de bord, Site\n- Controller = Cerveau qui dirige les deux parties Model et View (ex: app.py)\n
    ","path":["Cours","🔌 DevOps","SQL pour les tung tung tung sahur (22/01/26)"],"tags":["SQL"]},{"location":"learn/devops/2026-01-22/#tuto-comment-cr2er-une-bdd-sql-facilement-en-2-minutes-super-facile","level":2,"title":"TUTO : COMMENT CR2ER UNE BDD SQL FACILEMENT EN 2 MINUTES (SUPER FACILE)","text":"","path":["Cours","🔌 DevOps","SQL pour les tung tung tung sahur (22/01/26)"],"tags":["SQL"]},{"location":"learn/devops/2026-01-22/#structure-dune-base-de-donnees","level":3,"title":"Structure d'une Base De Données","text":"

    celle de grabber pour l'exemple

    BDD (Etape 1) - grabberman\n├── TABLES (Etape 2) - COMPUTERS\n│   ├── Colonne (Etape 3) - PcId, entier/clé primaire\n│   │   └── Donnée (Etape 4)\n│   ├── Colonne (Etape 3) - Hostname, chaîne de charactère\n│   └── Colonne (Etape 3) - MacAddress, chaîne de charactère\n└── TABLES (Etape 2) - EMPLOYEES\n    ├── Colonne (Etape 3) - UserId, entier/clé primaire\n    ├── Colonne (Etape 3) - Username, chaîne de charactère\n    └── Colonne (Etape 3) - PcId, clé secondaire\n
    ","path":["Cours","🔌 DevOps","SQL pour les tung tung tung sahur (22/01/26)"],"tags":["SQL"]},{"location":"learn/devops/2026-01-22/#etape-1-creer-une-bdd","level":3,"title":"Etape 1 : Créer une BDD","text":"

    sqlite3 grabberman.db <- Commande qui crée une DB qu'on appellera ici \"grabberman\"

    ","path":["Cours","🔌 DevOps","SQL pour les tung tung tung sahur (22/01/26)"],"tags":["SQL"]},{"location":"learn/devops/2026-01-22/#etape-2-creer-une-table","level":3,"title":"Etape 2 : Créer une table","text":"
    CREATE TABLE \"COMPUTERS\" \n(\n    PcId INTEGER PRIMARY KEY AUTOINCREMENT, \n    Hostname VARCHAR(50) NOT NULL, \n    MacAddress VARCHAR(50)\n);\n

    Note

    Ici on crée une table dans laquelle on stockera des données (des PC que l'on grab par exemple)

    ","path":["Cours","🔌 DevOps","SQL pour les tung tung tung sahur (22/01/26)"],"tags":["SQL"]},{"location":"learn/devops/2026-01-22/#etape-3-ajouter-des-donnees-dans-une-table","level":3,"title":"Etape 3 : Ajouter des données dans une table","text":"

    INSERT into COMPUTERS (Hostname, MacAddress) VALUES ('mypc', '1B:12:F0:FL:94');

    Note

    Pour ajouter une donnée dans une tableau, on INSERE dans le TABLEAU donné les VALEURS dans les Colonnes

    ","path":["Cours","🔌 DevOps","SQL pour les tung tung tung sahur (22/01/26)"],"tags":["SQL"]},{"location":"learn/devops/2026-01-22/#etape-4-creer-un-autre-tableau-avec-une-cle-liee-foreign-key","level":3,"title":"Etape 4 : Créer un autre tableau avec une clé liée (foreign key)","text":"
    CREATE TABLE \"EMPLOYEES\" \n(\n    UserId INTEGER PRIMARY KEY AUTOINCREMENT, \n    Username VARCHAR(50) NOT NULL, \n    FOREIGN KEY (PcId) REFERENCES COMPUTERS(PcId)\n);\n

    Note

    On recommence comme à l'étape 2, en ajoutant une clé étrangère foreign key, qui lie une clé extérieure, PcId ici, dans notre second Tableau

    ","path":["Cours","🔌 DevOps","SQL pour les tung tung tung sahur (22/01/26)"],"tags":["SQL"]},{"location":"learn/javascript/2026-01-30/","level":1,"title":"Javascript (30/01/26)","text":"

    celui qui pete fort dans la classe jv te grabber

    ","path":["Cours","☕ Javascript","Javascript (30/01/26)"],"tags":["Javascript"]},{"location":"learn/javascript/2026-01-30/#javascript-300126","level":1,"title":"Javascript (30/01/26)","text":"","path":["Cours","☕ Javascript","Javascript (30/01/26)"],"tags":["Javascript"]},{"location":"learn/javascript/2026-02-06/","level":1,"title":"Asynchrone et promesses (06/02/26)","text":"","path":["Cours","☕ Javascript","Asynchrone et promesses (06/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-06/#asynchrone-et-promesses-060226","level":1,"title":"Asynchrone et promesses (06/02/26)","text":"

    Info

    Pour le TP, on a besoin de manipuler des fichiers. Mais avant d'utiliser le module file system dit \"fs\" (qui s'occupe de ce besoin), il faut comprendre un fonctionnement de base en informatique, essentielle aux modules faisant des requêtes a des systemes externes comme fs, l'asynchrone.

    ","path":["Cours","☕ Javascript","Asynchrone et promesses (06/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-06/#cest-quoi-asynchrone","level":2,"title":"C'est quoi Asynchrone ?","text":"

    Asynchrone permet de ne pas bloquer le code même si il n'a pas de résultat mais avec promesse, il laisse le code continuer pour trouver une réponse et la rapporter comme promis.

    Rien de mieux qu'un exemple concret et gourmand en amont et en aval.

    ","path":["Cours","☕ Javascript","Asynchrone et promesses (06/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-06/#1-sans-asynchrone","level":3,"title":"1. SANS Asynchrone","text":"
    1. Tu commandes un Tasty Crousty.
    2. Ce neuille de caissier part en cuisine.
    3. Il fait cuire le riz lui-même.
    4. Il coupe les tenders.
    5. Il met tout dans la barquette puis sauce.
    6. Et revient pour te donner le Tasty Crousty 67 doro party.
    7. SEULEMENT MAINTENANT, il prend la commande du gwer suivant.

    Résultat : La file d'attente sort du restaurant. Si la cuisson prend 10 minutes, tout le restaurant est bloqué pendant 10 minutes. Bien guez.

    ","path":["Cours","☕ Javascript","Asynchrone et promesses (06/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-06/#2-avec-asynchrone","level":3,"title":"2. AVEC Asynchrone","text":"
    1. Tu commandes un Tasty Crouspy.
    2. La caissière crie en cuisine \"Un Crousty piquant sucré supplément poulet !\".
    3. Elle te donne un bipeur, faisant donc la promesse de te servir un délicieux Crouspy Tasty.
    4. Puis elle passe directement au client suivant.
    5. Toi, tu vas t'asseoir et tu attends.
    ","path":["Cours","☕ Javascript","Asynchrone et promesses (06/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-06/#mais-cest-quoi-cette-promesse-promise","level":2,"title":"Mais c'est quoi cette promesse ? (Promise)","text":"

    Note

    ☝️🤓 Node.js fonctionne sur un principe de thread unique (monothread)... En gros, il ne peut effectuer qu'une seule tâche à la fois.

    Alors pour éviter de bloquer le programme pendant de longues opérations (comme lire des données au fin fond du disque dur), il délègue ces tâches a l'ordinateur et utilise un mécanisme de Promesses.

    Dans notre exemple, la Promise, c'est le bipeur.

    Ce boîtier est une promesse. Le restaurant te dit : \"Je n'ai pas ton crousty tout de suite, mais je te promets que je te préviendrai dès qu'il y a du nouveau.\"

    Une Promise a toujours 3 états possibles, et seulement 3 :

    1. En attente (Pending) : Le boîtier ne fait rien. Le cuisinier travaille. Tu attends.
    2. Succès (Resolved) : Le boîtier vibre ! La promesse est tenue, tu as ton chicken (la donnée est arrivée).
    3. Échec (Rejected) : Le manager arrive et te dit \"Désolé, la cuisine a pris feu, pas de délicieux crousty pour ce soir\". La promesse est rompue (il y a une erreur).
    ","path":["Cours","☕ Javascript","Asynchrone et promesses (06/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-06/#exemples-async-et-await","level":2,"title":"Exemples async et await","text":"","path":["Cours","☕ Javascript","Asynchrone et promesses (06/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-06/#exemple-dun-async-exo-du-tp-2-de-js","level":3,"title":"Exemple d'un async (exo du TP 2 de JS)","text":"
    files.forEach((fileName) => {\n    fs.readFile(fileName, 'utf8').then((content) => {\n        ...\n    })\n});\n
    ","path":["Cours","☕ Javascript","Asynchrone et promesses (06/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-06/#exemple-concret-await-exo-du-tp-2-de-js","level":3,"title":"Exemple concret await (exo du TP 2 de JS)","text":"

    On peut également demander spécifiquement d'attendre le retour d'une promesse avec await

    const stats = await fs.stat(filename);\n
    ","path":["Cours","☕ Javascript","Asynchrone et promesses (06/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-09/","level":1,"title":"fetch des APIs et serveur HTTP (09/02/26)","text":"","path":["Cours","☕ Javascript","fetch des APIs et serveur HTTP (09/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-09/#fetch-des-apis-et-serveur-http-090226","level":1,"title":"fetch des APIs et serveur HTTP (09/02/26)","text":"","path":["Cours","☕ Javascript","fetch des APIs et serveur HTTP (09/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-09/#fetch-et-apis","level":2,"title":"Fetch et APIs","text":"

    Dans le cadre d'un TP, on a fait des appels à des APIs externes comme celle du CNAM ou encore openweathermap pour intégrer les données actuelles dans un script JS.

    Pour faire des appels, on utlise la méthode Asynchrone du cours précédent qui nous permettra de faire des appels des APIs sans arrêter le programme en attendant la réponse. Une fonction nous permet de faire cet appel : fetch()

    ","path":["Cours","☕ Javascript","fetch des APIs et serveur HTTP (09/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-09/#fetch-le-coursier","level":3,"title":"fetch() (Le coursier)","text":"

    fetch à le rôle de coursier, c'est lui qui effectuera la requête HTTP (GET par défaut).

    Pour traiter nos réponses proprement, on combine nos fetch avec le module json()

    ","path":["Cours","☕ Javascript","fetch des APIs et serveur HTTP (09/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-09/#json-le-traducteur","level":3,"title":"json() (Le traducteur)","text":"

    Quand fetch revient, il te ramène un gros paquet brut (un Response object).

    ","path":["Cours","☕ Javascript","fetch des APIs et serveur HTTP (09/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-09/#exemple-du-tp","level":3,"title":"Exemple du TP","text":"

    Dans une fonction async fetchCityInfo(), on essayera de fetch via cette fonction :

    // Attend de fetch les données d'une ville donnée par l'utilisateur via la variable cityName\nconst geoRes = await fetch(`https://geoservice.cnam.fr/api/cities?name=${encodeURIComponent(cityName)}`);\n

    Puis on encode les données brutes reçues dans un joli tableau JSON :

    // La constante cities récupère le résultat geoRes et le range en JSON\nconst cities = await geoRes.json();\n

    Plus tard, on refait un fetch de données avec une clé API pour openweathermap (cas concret en gros) :

    //Comme tout à l'heure, on fetch les données de l'API et on attend la réponse via await\nconst weatherRes = await fetch(`http://api.weatherapi.com/v1/current.json?q=${encodeURIComponent(cityName)}&key=****`);\n

    Bravo, tu as fait un appel d'API et l'a rangé dans un beau tableau JSON.

    ","path":["Cours","☕ Javascript","fetch des APIs et serveur HTTP (09/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-09/#serveur-http","level":2,"title":"Serveur HTTP","text":"","path":["Cours","☕ Javascript","fetch des APIs et serveur HTTP (09/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"projects/2025-12-05/","level":1,"title":"Grabber docs","text":"","path":["Projets","Grabber docs"],"tags":["Projets","Bash","Docs"]},{"location":"projects/2025-12-05/#grabber-docs","level":1,"title":"Grabber docs","text":"","path":["Projets","Grabber docs"],"tags":["Projets","Bash","Docs"]},{"location":"projects/2025-12-05/#but-du-projet","level":2,"title":"But du projet","text":"

    Grabber est un hub admin pour fetch les données hardware d'un parc informatique via un script qui fetch les ordinateurs (d'abord sur linux, plus tard intégration d'autres OS), lie les ordinateurs a des utilisateurs (ex. employés pour administration en entreprise) et de check d'un coup d'oeil les updates disponibles + état du software

    ","path":["Projets","Grabber docs"],"tags":["Projets","Bash","Docs"]},{"location":"projects/2025-12-05/#fonctionnement","level":2,"title":"Fonctionnement","text":"

    Pour fonctionner, grabber a plusieures tâches réparties par différents éléments dans le projet : -> Cerveau : Coordonne les différentes tâches du programme comme lancer le serveur admin, fetch les données d'un ordinateur dans une BDD (grabber.sh) -> Corps : Serveur admin python qui affichera les données stockées dans une BDD type sqlite

    ","path":["Projets","Grabber docs"],"tags":["Projets","Bash","Docs"]},{"location":"projects/2025-12-05/#technologies","level":2,"title":"Technologies","text":"","path":["Projets","Grabber docs"],"tags":["Projets","Bash","Docs"]},{"location":"projects/2025-12-05/#avancement","level":2,"title":"Avancement","text":"","path":["Projets","Grabber docs"],"tags":["Projets","Bash","Docs"]},{"location":"projects/2026-01-23/","level":1,"title":"Docs et notes avec Zensical","text":"","path":["Projets","Docs et notes avec Zensical"],"tags":["Projets","Docs"]},{"location":"projects/2026-01-23/#docs-et-notes-avec-zensical","level":1,"title":"Docs et notes avec Zensical","text":"

    Note

    Pendant la création de cette note j'ai migré de mkdocs à Zensicle (maj de mkdocs en meilleur) et donc j'utilise une config qui réutilise les fichiers et la structure mkdocs.

    ","path":["Projets","Docs et notes avec Zensical"],"tags":["Projets","Docs"]},{"location":"projects/2026-01-23/#pourquoi-faire","level":2,"title":"Pourquoi faire ?","text":"","path":["Projets","Docs et notes avec Zensical"],"tags":["Projets","Docs"]},{"location":"projects/2026-01-23/#comment-zensicle-marche","level":2,"title":"Comment Zensicle marche","text":"","path":["Projets","Docs et notes avec Zensical"],"tags":["Projets","Docs"]},{"location":"projects/2026-01-23/#hebergement-via-github-github-actions","level":2,"title":"Hébergement via Github (Github Actions)","text":"

    Pour héberger mon site de documentation en ligne, j'utilise Github via Github Actions qui est la solution parfaite pour un projet léger comme celui-ci.

    Docs pour host sur Github

    ","path":["Projets","Docs et notes avec Zensical"],"tags":["Projets","Docs"]},{"location":"projects/2026-02-13/","level":1,"title":"Faire un portfolio en JS moderne","text":"","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#faire-un-portfolio-en-js-moderne","level":1,"title":"Faire un portfolio en JS moderne","text":"","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#but-du-projet","level":2,"title":"But du projet","text":"

    Ce projet est un moyen de toucher concrètement au JavaScript avec l'utilisation de React, pour faire un site portfolio personnel dans le but de promouvoir mes compétences personnelles et professionnelles ainsi que mes projets et hobbies à destination des professionnels.

    ","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#stack-de-travail","level":2,"title":"Stack de travail","text":"

    On doit choisir quelle stack, c'est à dire quel combo d'outils on utilisera pour faire fonctionner le tout. Dans une stack de projet Web moderne, on doit choisir un Moteur, un Framework et le compilateur. Mais à quoi servent-ils ?

    ","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#le-moteur-build-tool","level":3,"title":"Le Moteur (Build tool)","text":"

    Souvent appelé \"moteur\" par abus de langage, c'est l'outil qui fait tourner tout l'écosystème. Il coordonne le compilateur, le serveur et les fichiers.

    ","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#le-framework","level":3,"title":"Le Framework","text":"

    Le framework est un ensemble d'outils et de règles de construction. Au lieu de partir d'une page blanche, on utilise des blocs déjà prêtes et ça évite de recréer du code que la communauté aurait déjà écrit.

    ","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#le-compilateur","level":3,"title":"Le Compilateur","text":"

    C'est le même principe que dans plein d'autres languages comme le C par exemple, il reprend notre code, ici le JSX (un JavaScript mélangé à du HTML) en JS et HTML standard pour qu'un navigateur comprenne correctement.

    ","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#choix","level":3,"title":"Choix","text":"

    Il existe donc plusieurs Moteurs (Vite, Next.JS, ...), Frameworks (React, Vue, Svelte, ...) et Compilateurs (Babel, SWC, ...) mais pour ce projet on retiendra une stack simple pour un débutant et efficace pour tester et déployer.

    Stack choisie

    ","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#points-importants-du-projet","level":2,"title":"Points importants du projet","text":"","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#creation-du-projet","level":3,"title":"Création du projet","text":"","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#packages-npm","level":3,"title":"Packages npm","text":"","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#hebergement-avec-vercel","level":3,"title":"Hébergement avec Vercel","text":"","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#cles-denvironnements","level":3,"title":"Clés d'environnements","text":"","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]}]} \ No newline at end of file +{"config":{"separator":"[\\s\\-_,:!=\\[\\]()\\\\\"`/]+|\\.(?!\\d)"},"items":[{"location":"","level":1,"title":"Bienvenue dans mes notes de devops","text":"

    avant le 28/11 y'a rien a gratter, j'installais linux pour la 9387e fois

    ","path":["Bienvenue dans mes notes de devops"],"tags":[]},{"location":"#bienvenue-dans-mes-notes-de-devops","level":1,"title":"Bienvenue dans mes notes de devops","text":"","path":["Bienvenue dans mes notes de devops"],"tags":[]},{"location":"#structure","level":2,"title":"Structure","text":"

    -> cours (Notes sur les cours)

    -> projects (Notes sur des nouveaux projets)

    -> liens cools (mes sites favoris)

    ","path":["Bienvenue dans mes notes de devops"],"tags":[]},{"location":"links/","level":1,"title":"Liens cools de ma poche","text":"","path":["Liens cools de ma poche"],"tags":[]},{"location":"links/#liens-cools-de-ma-poche","level":1,"title":"Liens cools de ma poche","text":"","path":["Liens cools de ma poche"],"tags":[]},{"location":"links/#design","level":2,"title":"🎨 Design","text":"","path":["Liens cools de ma poche"],"tags":[]},{"location":"links/#developpement","level":2,"title":"💽 Developpement","text":"","path":["Liens cools de ma poche"],"tags":[]},{"location":"learn/devops/2025-10-30/","level":1,"title":"C'est quoi linux ? (30/10/25)","text":"","path":["Cours","🔌 DevOps","C'est quoi linux ? (30/10/25)"],"tags":["Linux","UNIX","Distributions"]},{"location":"learn/devops/2025-10-30/#cest-quoi-linux-301025","level":1,"title":"C'est quoi linux ? (30/10/25)","text":"

    Warning

    Page en travaux, doit être finie avec toutes les informations que j'ai sur Linux en général

    ","path":["Cours","🔌 DevOps","C'est quoi linux ? (30/10/25)"],"tags":["Linux","UNIX","Distributions"]},{"location":"learn/devops/2025-10-30/#arborescence-type-sur-unix","level":2,"title":"Arborescence type sur UNIX","text":"

    Unix a généralement cette arborescence que ce soit sur n'importe quelle distro Linux également Android pour les téléphones et même quelques similitudes sur macOS.

    /               # Racine du disque\n├── /bin/       # Contient les commandes de base\n├── /boot/      # Fichiers de demarrage\n├── /dev/       # Tout ce qui est lié aux périphériques\n├── /etc/       # Fichiers de configuration\n├── /home/      # Répertoires utilisateurs\n├── /lib/       # Bibliothèques logicielles\n├── /mnt/       # Point de montage pour les systèmes de fichier temporaires\n├── /media/     # Point de montage pour les disques temporaires\n├── /opt/       # Logiciels optionnels, la ou on installera des programmes maison\n├── /root/      # Répertoire du user root\n├── /var/       # Variable, contient des logs, ect...\n├── /usr/       # Contient sensiblement la même chose que la racine mais sans être utile au fonctionnement du système\n├── /srv/       # Services hébergés sur le systèmes (FTP, HTTP, ect...)\n├── /run/       # Emplacement mémoire des programmes\n└── /tmp/       # Temporaire\n
    source de l'arbo.

    ","path":["Cours","🔌 DevOps","C'est quoi linux ? (30/10/25)"],"tags":["Linux","UNIX","Distributions"]},{"location":"learn/devops/2025-11-28/","level":1,"title":"Commandes *sh pour les idiots (28/11/25)","text":"

    mon big ass qui fait sudo rm -rf / sans réfléchir

    ","path":["Cours","🔌 DevOps","Commandes *sh pour les idiots (28/11/25)"],"tags":["Bash","UNIX"]},{"location":"learn/devops/2025-11-28/#commandes-sh-pour-les-idiots-281125","level":1,"title":"Commandes *sh pour les idiots (28/11/25)","text":"","path":["Cours","🔌 DevOps","Commandes *sh pour les idiots (28/11/25)"],"tags":["Bash","UNIX"]},{"location":"learn/devops/2025-11-28/#cheatsheet-de-plein-de-commandes","level":2,"title":"Cheatsheet de plein de commandes","text":"

    Depuis le début, beaucoup de commandes on été utilisées, du coup je note ici les commandes utilisées depuis le début et a quoi elles servent en gros

    ","path":["Cours","🔌 DevOps","Commandes *sh pour les idiots (28/11/25)"],"tags":["Bash","UNIX"]},{"location":"learn/devops/2025-11-28/#commandes-de-base","level":3,"title":"Commandes de base","text":"
    1. sudo : lance une commande avec les superdroits, peut manipuler tout le pc avec en gros

      sudo [commande]\n

    2. ls : liste les fichiers d'un dossier

      # -a pour afficher les fichiers cachés / -l pour afficher en liste avec plus d'infos\nls [options] [fichier|dir]\n

    3. cd : changer de dossier

      # ~ pour aller au répertoire home / .. pour revenir en arriere\ncd [dir]\n

    4. pwd : affiche le répertoire actuel

      pwd\n

    5. touch : affiche le contenu d'un fichier

      touch [fichier]\n

    6. nano : éditeur de texte

      nano [fichier]\n

    7. mkdir : supprime ce qu'on lui donne

      mkdir [options] [fichier|dir]\n

    8. rm : supprime ce qu'on lui donne

      # -r pour supprimer un dossier et son contenu (recursive) (`rmdir` le fait aussi)\n# -f force la commande\nrm [options] [fichier|dir]\n

    9. cp : copie...

      cp [options] [source] [destination]\n

    10. mv : ...et déplace

      mv [options] [source] [destination]\n

    ","path":["Cours","🔌 DevOps","Commandes *sh pour les idiots (28/11/25)"],"tags":["Bash","UNIX"]},{"location":"learn/devops/2025-11-28/#les-caracteres-dassociations","level":3,"title":"Les caractères d'associations","text":"

    | (le pipe) -> prend le résultat de la commande de gauche et le donne à celle de droite

    exemple : liste tout un répertoire, mais n'affiche que les résultats qui sont \"feur\"

    ls -la | grep \"feur\"\n

    > et >>

    ","path":["Cours","🔌 DevOps","Commandes *sh pour les idiots (28/11/25)"],"tags":["Bash","UNIX"]},{"location":"learn/devops/2025-11-28/#permissions-et-utilisateurs","level":3,"title":"Permissions et Utilisateurs","text":"

    chmod [droits] [fichier] - change les permissions d'un fichier (qui peut lire/écrire/exécuter) - chmod +x [fichier] rend un script exécutable (très important) - chmod 777 [fichier] donne tous les droits à tout le monde (dangereux mais ça dépanne)

    chown [user]:[groupe] [fichier] - change le propriétaire du fichier (si t'as copié un truc en sudo et que tu peux plus le toucher)

    ","path":["Cours","🔌 DevOps","Commandes *sh pour les idiots (28/11/25)"],"tags":["Bash","UNIX"]},{"location":"learn/devops/2025-11-28/#lecture-et-recherche-dans-les-fichiers","level":3,"title":"Lecture et recherche dans les fichiers","text":"

    cat [fichier] - affiche tout le contenu d'un fichier d'un coup dans le terminal - utile pour les petits fichiers, sinon ça inonde l'écran

    less [fichier] - affiche le contenu page par page (on peut scroller) - appuyer sur q pour quitter

    head [fichier] / tail [fichier] - affiche juste le début (head) ou la fin (tail) d'un fichier - tail -f [fichier] hyper utile pour voir les logs en direct (ça attend les nouvelles lignes)

    grep [mot] [fichier] - cherche un mot ou une phrase spécifique dans un fichier (le ctrl+f du terminal) - -r pour chercher dans tous les dossiers (recursive) / -i pour ignorer les majuscules

    ","path":["Cours","🔌 DevOps","Commandes *sh pour les idiots (28/11/25)"],"tags":["Bash","UNIX"]},{"location":"learn/devops/2025-12-12/","level":1,"title":"Git pour les neuilles (12/12/25)","text":"

    completement zehef pcq t'as pas git push

    ","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#git-pour-les-neuilles-121225","level":1,"title":"Git pour les neuilles (12/12/25)","text":"","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#creer-un-git","level":2,"title":"Créer un git","text":"","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#-si-le-projet-existe-deja","level":3,"title":"-> Si le projet existe deja","text":"","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#-sinon-creer-le-projet","level":3,"title":"-> Sinon créer le projet","text":"","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#ignorer-des-fichiersdossiers","level":2,"title":"Ignorer des fichiers/dossiers","text":"

    echo gbvenv/ >> .gitignore <- on indique via un echo qui écrira dans le fichier .gitignore qu'on ne veut pas push le dossier \"gbvenv\" ici, un fichier on ne mettera pas le slash (logique en amont)

    ","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#une-fois-que-de-fichiers-sont-dispos-empaqueter","level":2,"title":"Une fois que de fichiers sont dispos, empaqueter !","text":"

    Pour envoyer un projet git, c'est comme envoyer un colis à la poste, d'abord, on met nos affaires dans le colis

    Plusieures possibilités ☝️

    ","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#etiqueter-le-paquet","level":2,"title":"Etiqueter le paquet","text":"

    Ensuite, on rempli l'étiquette du colis et on la colle au colis

    ","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#deposer-le-colis","level":2,"title":"Déposer le colis","text":"

    Enfin pour push, c'est a dire déposer le colis au bureau de poste pour l'envoi, on fait :

    Info

    -u veut dire ce que dit la doc en gros

    ","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#-si-erreur","level":3,"title":"-> SI ERREUR","text":"

    Dans le cas ou un fichier/dossier a été supprimé autre part avant de push nos modifs

    ","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2025-12-12/#utiliser-deux-branches-differentes","level":2,"title":"Utiliser deux branches différentes","text":"

    Dans le cas ou l'on veut travailler avec une seconde branche

    ","path":["Cours","🔌 DevOps","Git pour les neuilles (12/12/25)"],"tags":["Git","Bash"]},{"location":"learn/devops/2026-01-16/","level":1,"title":"pip et environnements virtuels pour les quoicoubenks (16/01/26)","text":"

    7alouf ouvre grabber apres 9h brainrot tsunami

    ","path":["Cours","🔌 DevOps","pip et environnements virtuels pour les quoicoubenks (16/01/26)"],"tags":["Python","pip","Environnements Virtuels"]},{"location":"learn/devops/2026-01-16/#pip-et-environnements-virtuels-pour-les-quoicoubenks-160126","level":1,"title":"pip et environnements virtuels pour les quoicoubenks (16/01/26)","text":"","path":["Cours","🔌 DevOps","pip et environnements virtuels pour les quoicoubenks (16/01/26)"],"tags":["Python","pip","Environnements Virtuels"]},{"location":"learn/devops/2026-01-16/#python-et-ses-environnements-virtuels","level":2,"title":"Python et ses environnements virtuels","text":"

    Utile de créer donc un environnement pour chaque projet afin de en pas perturber d'autres projets avec des milliers de packages inutiles en gros

    python3 -m venv gbvenv <- permet de créer un environnement (venv crée l'environnement \"gbvenv\")

    source gbvenv/bin/activate <- lance cet environnement pour travailler dedans

    pip est le packages manager de python, en l'appelant, on peut installer des packages comme uvicorn par exemple, utile pour grabber

    pip install --upgrade pip <- update les packages

    python -m pip install *** <- installe le package qu'on notera a la place des ***

    pip freeze >> requirements.txt <- commande super utile pour partager les dependances necessaires pour faire fonctionner son projet sur un autre environnement

    deactivate <- désactive l'environnement virtuel

    ","path":["Cours","🔌 DevOps","pip et environnements virtuels pour les quoicoubenks (16/01/26)"],"tags":["Python","pip","Environnements Virtuels"]},{"location":"learn/devops/2026-01-16/#script-de-roi-qui-automatise-le-process","level":2,"title":"Script de roi qui automatise le process","text":"

    bash <(curl -fsSL https://raw.githubusercontent.com/buchtioof/venv-setup/main/venvsetup.sh)

    Pour en apprendre plus : le git du projet

    ","path":["Cours","🔌 DevOps","pip et environnements virtuels pour les quoicoubenks (16/01/26)"],"tags":["Python","pip","Environnements Virtuels"]},{"location":"learn/devops/2026-01-22/","level":1,"title":"SQL pour les tung tung tung sahur (22/01/26)","text":"

    florian quand je lui demande de l'aide

    ","path":["Cours","🔌 DevOps","SQL pour les tung tung tung sahur (22/01/26)"],"tags":["SQL"]},{"location":"learn/devops/2026-01-22/#sql-pour-les-tung-tung-tung-sahur-220126","level":1,"title":"SQL pour les tung tung tung sahur (22/01/26)","text":"","path":["Cours","🔌 DevOps","SQL pour les tung tung tung sahur (22/01/26)"],"tags":["SQL"]},{"location":"learn/devops/2026-01-22/#modele-mvc","level":2,"title":"Modèle MVC","text":"

    Le modèle MVC est une façon de concevoir un projet logiciel, en gros on sépare celui-ci en trois grandes parties distinctes séparant la logique de la vue et rend le travail plus facile.

    Modèle MVC en prenant celui de grabber par exemple :

    - Model = Base De Donnée (ex: EMPLOYEES, COMPUTERS)\n- View = Tableau de bord, Site\n- Controller = Cerveau qui dirige les deux parties Model et View (ex: app.py)\n
    ","path":["Cours","🔌 DevOps","SQL pour les tung tung tung sahur (22/01/26)"],"tags":["SQL"]},{"location":"learn/devops/2026-01-22/#tuto-comment-cr2er-une-bdd-sql-facilement-en-2-minutes-super-facile","level":2,"title":"TUTO : COMMENT CR2ER UNE BDD SQL FACILEMENT EN 2 MINUTES (SUPER FACILE)","text":"","path":["Cours","🔌 DevOps","SQL pour les tung tung tung sahur (22/01/26)"],"tags":["SQL"]},{"location":"learn/devops/2026-01-22/#structure-dune-base-de-donnees","level":3,"title":"Structure d'une Base De Données","text":"

    celle de grabber pour l'exemple

    BDD (Etape 1) - grabberman\n├── TABLES (Etape 2) - COMPUTERS\n│   ├── Colonne (Etape 3) - PcId, entier/clé primaire\n│   │   └── Donnée (Etape 4)\n│   ├── Colonne (Etape 3) - Hostname, chaîne de charactère\n│   └── Colonne (Etape 3) - MacAddress, chaîne de charactère\n└── TABLES (Etape 2) - EMPLOYEES\n    ├── Colonne (Etape 3) - UserId, entier/clé primaire\n    ├── Colonne (Etape 3) - Username, chaîne de charactère\n    └── Colonne (Etape 3) - PcId, clé secondaire\n
    ","path":["Cours","🔌 DevOps","SQL pour les tung tung tung sahur (22/01/26)"],"tags":["SQL"]},{"location":"learn/devops/2026-01-22/#etape-1-creer-une-bdd","level":3,"title":"Etape 1 : Créer une BDD","text":"

    sqlite3 grabberman.db <- Commande qui crée une DB qu'on appellera ici \"grabberman\"

    ","path":["Cours","🔌 DevOps","SQL pour les tung tung tung sahur (22/01/26)"],"tags":["SQL"]},{"location":"learn/devops/2026-01-22/#etape-2-creer-une-table","level":3,"title":"Etape 2 : Créer une table","text":"
    CREATE TABLE \"COMPUTERS\" \n(\n    PcId INTEGER PRIMARY KEY AUTOINCREMENT, \n    Hostname VARCHAR(50) NOT NULL, \n    MacAddress VARCHAR(50)\n);\n

    Note

    Ici on crée une table dans laquelle on stockera des données (des PC que l'on grab par exemple)

    ","path":["Cours","🔌 DevOps","SQL pour les tung tung tung sahur (22/01/26)"],"tags":["SQL"]},{"location":"learn/devops/2026-01-22/#etape-3-ajouter-des-donnees-dans-une-table","level":3,"title":"Etape 3 : Ajouter des données dans une table","text":"

    INSERT into COMPUTERS (Hostname, MacAddress) VALUES ('mypc', '1B:12:F0:FL:94');

    Note

    Pour ajouter une donnée dans une tableau, on INSERE dans le TABLEAU donné les VALEURS dans les Colonnes

    ","path":["Cours","🔌 DevOps","SQL pour les tung tung tung sahur (22/01/26)"],"tags":["SQL"]},{"location":"learn/devops/2026-01-22/#etape-4-creer-un-autre-tableau-avec-une-cle-liee-foreign-key","level":3,"title":"Etape 4 : Créer un autre tableau avec une clé liée (foreign key)","text":"
    CREATE TABLE \"EMPLOYEES\" \n(\n    UserId INTEGER PRIMARY KEY AUTOINCREMENT, \n    Username VARCHAR(50) NOT NULL, \n    FOREIGN KEY (PcId) REFERENCES COMPUTERS(PcId)\n);\n

    Note

    On recommence comme à l'étape 2, en ajoutant une clé étrangère foreign key, qui lie une clé extérieure, PcId ici, dans notre second Tableau

    ","path":["Cours","🔌 DevOps","SQL pour les tung tung tung sahur (22/01/26)"],"tags":["SQL"]},{"location":"learn/devops/2026-02-16/","level":1,"title":"Django en gros (16/02/2026)","text":"","path":["Cours","🔌 DevOps","Django en gros (16/02/2026)"],"tags":[]},{"location":"learn/devops/2026-02-16/#commencer-un-projet-django","level":2,"title":"Commencer un projet Django","text":"

    Pour commencer un projet Django, c'est super simple :

    -> D'abord, créer un dossier de projet mkdir projet

    -> Ensuite créer un environnement virtuel Python puis installer Django via pip python3 -m venv \"projetvenv\" && source projetvenv/bin/activate && pip install django

    -> Maintenant, créer le projet Django dans ce dossier (le point à la fin indique que l'on crée dans ce dossier le projet) django-admin startproject config .

    -> On peut maintenant travailler dans notre projet Django

    ","path":["Cours","🔌 DevOps","Django en gros (16/02/2026)"],"tags":[]},{"location":"learn/devops/2026-02-16/#projet-et-applications","level":2,"title":"Projet et applications","text":"

    Django fonctionne sur l'utilisations de petits modules appelés \"Applications\", ceux-ci composent un projet Django. Elles peuvent être des composants gèrant une API qui prend des données JSON pour les mettre dans une BDD SQL comme dans le projet Grabber ou encore plein d'autres cas...

    Note

    En gros, on a un projet (dossier \"config\") dans lequel on gère les réglages généraux de Django (serveur, adresses, ect...) et des applications (dans leurs dossiers propres) qui gèrent leurs tâches propres à elles

    Pour créer une Application on utilise cette commande -> python manage.py startapp api

    ","path":["Cours","🔌 DevOps","Django en gros (16/02/2026)"],"tags":[]},{"location":"learn/devops/2026-02-16/#fonctionnement-dune-application","level":2,"title":"Fonctionnement d'une Application","text":"

    Une application se divise avec un fonctionnement en 3 parties

    Modèle <--> Vue -> Template

    ","path":["Cours","🔌 DevOps","Django en gros (16/02/2026)"],"tags":[]},{"location":"learn/devops/2026-02-16/#modele","level":3,"title":"Modèle","text":"

    Le Modèle sera la partie manipulation d'objets (comme en PhP), dans le projet Grabber, Django s'occupera de créer la DB sql via ce module

    Warning

    Quand on travaille sur le fichier models.py (généralement celui qui s'occupe de ce module) on doit utiliser deux commandes qui construisent le modèle

    python manage.py makemigrations\npython manage.py migrate\n
    ","path":["Cours","🔌 DevOps","Django en gros (16/02/2026)"],"tags":[]},{"location":"learn/devops/2026-02-16/#vue","level":3,"title":"Vue","text":"

    La Vue ici, c'est un peu le cerveau du projet, il reçoit les requêtes (par exemple, l'utilisateur qui demande une URL ou alors un fichier bash qui envoie des données comme avec Grabber) et peut renvoyer ces requêtes au Modèle pour avoir un résultat, etc...

    ","path":["Cours","🔌 DevOps","Django en gros (16/02/2026)"],"tags":[]},{"location":"learn/devops/2026-02-16/#template","level":3,"title":"Template","text":"

    Le template, c'est l'interface, par exemple des fichiers HTML. Il reçoit les données brutes de la Vue et les affiche proprement dans une jolie page web.

    Utiliser les données brutes dans une template

    Pour se faire, on doit utiliser cette balise {{ ... }} dans le HTML, cela veut dire pour Django que l'on récupère les données d'une clé spécifique

    <!-- Dans les crochets, on appelle la donnée \"hostname\" de la table \"data\"-->\n<title>{{ data.hostname }} - Grabber</title>\n
    ","path":["Cours","🔌 DevOps","Django en gros (16/02/2026)"],"tags":[]},{"location":"learn/devops/2026-02-16/#urls","level":3,"title":"URLs","text":"

    Un autre composant très important dans Django, c'est les URLs. C'est un fichier dans lequel on doit router ce que telle url dans le navigateur doit effectuer.

    Par exemple

    Appeler la racine (localhost:5000/) doit être routé comme ceci :

    from django.urls import path\nfrom api import views\n\nurlpatterns = [\n    # Route de la racine qui appelle la fonction computers_list\n    path('', views.computers_list, name='computers'),\n]\n
    ","path":["Cours","🔌 DevOps","Django en gros (16/02/2026)"],"tags":[]},{"location":"learn/javascript/2026-01-30/","level":1,"title":"Javascript (30/01/26)","text":"

    celui qui pete fort dans la classe jv te grabber

    ","path":["Cours","☕ Javascript","Javascript (30/01/26)"],"tags":["Javascript"]},{"location":"learn/javascript/2026-01-30/#javascript-300126","level":1,"title":"Javascript (30/01/26)","text":"","path":["Cours","☕ Javascript","Javascript (30/01/26)"],"tags":["Javascript"]},{"location":"learn/javascript/2026-02-06/","level":1,"title":"Asynchrone et promesses (06/02/26)","text":"","path":["Cours","☕ Javascript","Asynchrone et promesses (06/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-06/#asynchrone-et-promesses-060226","level":1,"title":"Asynchrone et promesses (06/02/26)","text":"

    Info

    Pour le TP, on a besoin de manipuler des fichiers. Mais avant d'utiliser le module file system dit \"fs\" (qui s'occupe de ce besoin), il faut comprendre un fonctionnement de base en informatique, essentielle aux modules faisant des requêtes a des systemes externes comme fs, l'asynchrone.

    ","path":["Cours","☕ Javascript","Asynchrone et promesses (06/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-06/#cest-quoi-asynchrone","level":2,"title":"C'est quoi Asynchrone ?","text":"

    Asynchrone permet de ne pas bloquer le code même si il n'a pas de résultat mais avec promesse, il laisse le code continuer pour trouver une réponse et la rapporter comme promis.

    Rien de mieux qu'un exemple concret et gourmand en amont et en aval.

    ","path":["Cours","☕ Javascript","Asynchrone et promesses (06/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-06/#1-sans-asynchrone","level":3,"title":"1. SANS Asynchrone","text":"
    1. Tu commandes un Tasty Crousty.
    2. Ce neuille de caissier part en cuisine.
    3. Il fait cuire le riz lui-même.
    4. Il coupe les tenders.
    5. Il met tout dans la barquette puis sauce.
    6. Et revient pour te donner le Tasty Crousty 67 doro party.
    7. SEULEMENT MAINTENANT, il prend la commande du gwer suivant.

    Résultat : La file d'attente sort du restaurant. Si la cuisson prend 10 minutes, tout le restaurant est bloqué pendant 10 minutes. Bien guez.

    ","path":["Cours","☕ Javascript","Asynchrone et promesses (06/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-06/#2-avec-asynchrone","level":3,"title":"2. AVEC Asynchrone","text":"
    1. Tu commandes un Tasty Crouspy.
    2. La caissière crie en cuisine \"Un Crousty piquant sucré supplément poulet !\".
    3. Elle te donne un bipeur, faisant donc la promesse de te servir un délicieux Crouspy Tasty.
    4. Puis elle passe directement au client suivant.
    5. Toi, tu vas t'asseoir et tu attends.
    ","path":["Cours","☕ Javascript","Asynchrone et promesses (06/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-06/#mais-cest-quoi-cette-promesse-promise","level":2,"title":"Mais c'est quoi cette promesse ? (Promise)","text":"

    Note

    ☝️🤓 Node.js fonctionne sur un principe de thread unique (monothread)... En gros, il ne peut effectuer qu'une seule tâche à la fois.

    Alors pour éviter de bloquer le programme pendant de longues opérations (comme lire des données au fin fond du disque dur), il délègue ces tâches a l'ordinateur et utilise un mécanisme de Promesses.

    Dans notre exemple, la Promise, c'est le bipeur.

    Ce boîtier est une promesse. Le restaurant te dit : \"Je n'ai pas ton crousty tout de suite, mais je te promets que je te préviendrai dès qu'il y a du nouveau.\"

    Une Promise a toujours 3 états possibles, et seulement 3 :

    1. En attente (Pending) : Le boîtier ne fait rien. Le cuisinier travaille. Tu attends.
    2. Succès (Resolved) : Le boîtier vibre ! La promesse est tenue, tu as ton chicken (la donnée est arrivée).
    3. Échec (Rejected) : Le manager arrive et te dit \"Désolé, la cuisine a pris feu, pas de délicieux crousty pour ce soir\". La promesse est rompue (il y a une erreur).
    ","path":["Cours","☕ Javascript","Asynchrone et promesses (06/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-06/#exemples-async-et-await","level":2,"title":"Exemples async et await","text":"","path":["Cours","☕ Javascript","Asynchrone et promesses (06/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-06/#exemple-dun-async-exo-du-tp-2-de-js","level":3,"title":"Exemple d'un async (exo du TP 2 de JS)","text":"
    files.forEach((fileName) => {\n    fs.readFile(fileName, 'utf8').then((content) => {\n        ...\n    })\n});\n
    ","path":["Cours","☕ Javascript","Asynchrone et promesses (06/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-06/#exemple-concret-await-exo-du-tp-2-de-js","level":3,"title":"Exemple concret await (exo du TP 2 de JS)","text":"

    On peut également demander spécifiquement d'attendre le retour d'une promesse avec await

    const stats = await fs.stat(filename);\n
    ","path":["Cours","☕ Javascript","Asynchrone et promesses (06/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-09/","level":1,"title":"fetch des APIs et serveur HTTP (09/02/26)","text":"","path":["Cours","☕ Javascript","fetch des APIs et serveur HTTP (09/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-09/#fetch-des-apis-et-serveur-http-090226","level":1,"title":"fetch des APIs et serveur HTTP (09/02/26)","text":"","path":["Cours","☕ Javascript","fetch des APIs et serveur HTTP (09/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-09/#fetch-et-apis","level":2,"title":"Fetch et APIs","text":"

    Dans le cadre d'un TP, on a fait des appels à des APIs externes comme celle du CNAM ou encore openweathermap pour intégrer les données actuelles dans un script JS.

    Pour faire des appels, on utlise la méthode Asynchrone du cours précédent qui nous permettra de faire des appels des APIs sans arrêter le programme en attendant la réponse. Une fonction nous permet de faire cet appel : fetch()

    ","path":["Cours","☕ Javascript","fetch des APIs et serveur HTTP (09/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-09/#fetch-le-coursier","level":3,"title":"fetch() (Le coursier)","text":"

    fetch à le rôle de coursier, c'est lui qui effectuera la requête HTTP (GET par défaut).

    Pour traiter nos réponses proprement, on combine nos fetch avec le module json()

    ","path":["Cours","☕ Javascript","fetch des APIs et serveur HTTP (09/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-09/#json-le-traducteur","level":3,"title":"json() (Le traducteur)","text":"

    Quand fetch revient, il te ramène un gros paquet brut (un Response object).

    ","path":["Cours","☕ Javascript","fetch des APIs et serveur HTTP (09/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-09/#exemple-du-tp","level":3,"title":"Exemple du TP","text":"

    Dans une fonction async fetchCityInfo(), on essayera de fetch via cette fonction :

    // Attend de fetch les données d'une ville donnée par l'utilisateur via la variable cityName\nconst geoRes = await fetch(`https://geoservice.cnam.fr/api/cities?name=${encodeURIComponent(cityName)}`);\n

    Puis on encode les données brutes reçues dans un joli tableau JSON :

    // La constante cities récupère le résultat geoRes et le range en JSON\nconst cities = await geoRes.json();\n

    Plus tard, on refait un fetch de données avec une clé API pour openweathermap (cas concret en gros) :

    //Comme tout à l'heure, on fetch les données de l'API et on attend la réponse via await\nconst weatherRes = await fetch(`http://api.weatherapi.com/v1/current.json?q=${encodeURIComponent(cityName)}&key=****`);\n

    Bravo, tu as fait un appel d'API et l'a rangé dans un beau tableau JSON.

    ","path":["Cours","☕ Javascript","fetch des APIs et serveur HTTP (09/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"learn/javascript/2026-02-09/#serveur-http","level":2,"title":"Serveur HTTP","text":"","path":["Cours","☕ Javascript","fetch des APIs et serveur HTTP (09/02/26)"],"tags":["JavaScript","Node.JS"]},{"location":"projects/2025-12-05/","level":1,"title":"Grabber docs","text":"","path":["Projets","Grabber docs"],"tags":["Projets","Bash","Docs"]},{"location":"projects/2025-12-05/#grabber-docs","level":1,"title":"Grabber docs","text":"","path":["Projets","Grabber docs"],"tags":["Projets","Bash","Docs"]},{"location":"projects/2025-12-05/#but-du-projet","level":2,"title":"But du projet","text":"

    Grabber est un hub admin pour fetch les données hardware d'un parc informatique via un script qui fetch les ordinateurs (d'abord sur linux, plus tard intégration d'autres OS), lie les ordinateurs a des utilisateurs (ex. employés pour administration en entreprise) et de check d'un coup d'oeil les updates disponibles + état du software

    ","path":["Projets","Grabber docs"],"tags":["Projets","Bash","Docs"]},{"location":"projects/2025-12-05/#fonctionnement","level":2,"title":"Fonctionnement","text":"

    Pour fonctionner, grabber a plusieures tâches réparties par différents éléments dans le projet : -> Cerveau : Coordonne les différentes tâches du programme comme lancer le serveur admin, fetch les données d'un ordinateur dans une BDD (grabber.sh) -> Corps : Serveur admin python qui affichera les données stockées dans une BDD type sqlite

    ","path":["Projets","Grabber docs"],"tags":["Projets","Bash","Docs"]},{"location":"projects/2025-12-05/#technologies","level":2,"title":"Technologies","text":"","path":["Projets","Grabber docs"],"tags":["Projets","Bash","Docs"]},{"location":"projects/2025-12-05/#avancement","level":2,"title":"Avancement","text":"","path":["Projets","Grabber docs"],"tags":["Projets","Bash","Docs"]},{"location":"projects/2026-01-23/","level":1,"title":"Docs et notes avec Zensical","text":"","path":["Projets","Docs et notes avec Zensical"],"tags":["Projets","Docs"]},{"location":"projects/2026-01-23/#docs-et-notes-avec-zensical","level":1,"title":"Docs et notes avec Zensical","text":"

    Note

    Pendant la création de cette note j'ai migré de mkdocs à Zensicle (maj de mkdocs en meilleur) et donc j'utilise une config qui réutilise les fichiers et la structure mkdocs.

    ","path":["Projets","Docs et notes avec Zensical"],"tags":["Projets","Docs"]},{"location":"projects/2026-01-23/#pourquoi-faire","level":2,"title":"Pourquoi faire ?","text":"","path":["Projets","Docs et notes avec Zensical"],"tags":["Projets","Docs"]},{"location":"projects/2026-01-23/#comment-zensicle-marche","level":2,"title":"Comment Zensicle marche","text":"","path":["Projets","Docs et notes avec Zensical"],"tags":["Projets","Docs"]},{"location":"projects/2026-01-23/#hebergement-via-github-github-actions","level":2,"title":"Hébergement via Github (Github Actions)","text":"

    Pour héberger mon site de documentation en ligne, j'utilise Github via Github Actions qui est la solution parfaite pour un projet léger comme celui-ci.

    Docs pour host sur Github

    ","path":["Projets","Docs et notes avec Zensical"],"tags":["Projets","Docs"]},{"location":"projects/2026-02-13/","level":1,"title":"Faire un portfolio en JS moderne","text":"","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#faire-un-portfolio-en-js-moderne","level":1,"title":"Faire un portfolio en JS moderne","text":"","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#but-du-projet","level":2,"title":"But du projet","text":"

    Ce projet est un moyen de toucher concrètement au JavaScript avec l'utilisation de React, pour faire un site portfolio personnel dans le but de promouvoir mes compétences personnelles et professionnelles ainsi que mes projets et hobbies à destination des professionnels.

    ","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#stack-de-travail","level":2,"title":"Stack de travail","text":"

    On doit choisir quelle stack, c'est à dire quel combo d'outils on utilisera pour faire fonctionner le tout. Dans une stack de projet Web moderne, on doit choisir un Moteur, un Framework et le compilateur. Mais à quoi servent-ils ?

    ","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#le-moteur-build-tool","level":3,"title":"Le Moteur (Build tool)","text":"

    Souvent appelé \"moteur\" par abus de langage, c'est l'outil qui fait tourner tout l'écosystème. Il coordonne le compilateur, le serveur et les fichiers.

    ","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#le-framework","level":3,"title":"Le Framework","text":"

    Le framework est un ensemble d'outils et de règles de construction. Au lieu de partir d'une page blanche, on utilise des blocs déjà prêtes et ça évite de recréer du code que la communauté aurait déjà écrit.

    ","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#le-compilateur","level":3,"title":"Le Compilateur","text":"

    C'est le même principe que dans plein d'autres languages comme le C par exemple, il reprend notre code, ici le JSX (un JavaScript mélangé à du HTML) en JS et HTML standard pour qu'un navigateur comprenne correctement.

    ","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#choix","level":3,"title":"Choix","text":"

    Il existe donc plusieurs Moteurs (Vite, Next.JS, ...), Frameworks (React, Vue, Svelte, ...) et Compilateurs (Babel, SWC, ...) mais pour ce projet on retiendra une stack simple pour un débutant et efficace pour tester et déployer.

    Stack choisie

    ","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#points-importants-du-projet","level":2,"title":"Points importants du projet","text":"","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#creation-du-projet","level":3,"title":"Création du projet","text":"","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#packages-npm","level":3,"title":"Packages npm","text":"","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#hebergement-avec-vercel","level":3,"title":"Hébergement avec Vercel","text":"","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]},{"location":"projects/2026-02-13/#cles-denvironnements","level":3,"title":"Clés d'environnements","text":"","path":["Projets","Faire un portfolio en JS moderne"],"tags":["Javascript","React","HTML/CSS","Projet"]}]} \ No newline at end of file