{"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":"sudo : lance une commande avec les superdroits, peut manipuler tout le pc avec en gros
sudo [commande]\n 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 cd : changer de dossier
# ~ pour aller au répertoire home / .. pour revenir en arriere\ncd [dir]\n pwd : affiche le répertoire actuel
pwd\n touch : affiche le contenu d'un fichier
touch [fichier]\n nano : éditeur de texte
nano [fichier]\n mkdir : supprime ce qu'on lui donne
mkdir [options] [fichier|dir]\n 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 cp : copie...
cp [options] [source] [destination]\n mv : ...et déplace
mv [options] [source] [destination]\n | (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 >>
> écrase le fichier / >> ajoute à la fin sans effacerecho \"coucou\" > fichier.txtchmod [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)
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
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":"git clone (url du projet git)git init (dossier de travail)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)
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 âïž
Ajoute TOUS les fichiers du dossier via l'option -A ou --all -> git add -A
Ajoute SEULEMENT les modifications et suppressions (donc pas de nouveaux fichiers) -> git add -u
Ensuite, on rempli l'étiquette du colis et on la colle au colis
git commit -m \"(message du commit)\"Enfin pour push, c'est a dire déposer le colis au bureau de poste pour l'envoi, on fait :
git push -u origin (branche souhaitée)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
git config pull.rebase falseDans le cas ou l'on veut travailler avec une seconde branche
Pour switch de branche de travail -> git checkout (branche souhaitée)
Pour merge en ecrasant la branche souhaitĂ©e âŹïž
git merge -s ours main\ngit checkout main\ngit merge (branche Ă merge)\n 7alouf ouvre grabber apres 9h brainrot tsunami
","path":["Cours","đ DevOps","pip et environnements virtuels pour les caca (16/01/26)"],"tags":["Python","pip","Environnements Virtuels"]},{"location":"learn/devops/2026-01-16/#pip-et-environnements-virtuels-pour-les-caca-160126","level":1,"title":"pip et environnements virtuels pour les caca (16/01/26)","text":"","path":["Cours","đ DevOps","pip et environnements virtuels pour les caca (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
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 caca (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\"
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":"","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":"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":"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 :
files.forEach((fileName) => {\n fs.readFile(fileName, 'utf8').then((content) => {\n ...\n })\n});\n fs.readFile : Envoie le job de lire un fichier à l'ordinateur avec des parametres et quand c'est pret, enrengistre son résultat dans content.contentOn peut également demander spécifiquement d'attendre le retour d'une promesse avec await
const stats = await fs.stat(filename);\n fs.stat : Envoie le job de récupérer les stats d'un fichier à l'ordinateur et quand c'est pret, enrengistre son résultat dans stats.stats**await** : Tant que l'on a pas de résultat, on \"fige\" à cette ligne jusqu'à ce que la promesse est reçue.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()
fetch() (Le coursier)","text":"fetch Ă le rĂŽle de coursier, c'est lui qui effectuera la requĂȘte HTTP (GET par dĂ©faut).
Ce que ça fait : Ăa envoie un ping Ă une URL pour aller chercher des data.
Et ça renvoie une promesse en attendant la réponse de l'API
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).
Ce que ça fait : Ăa prend ce paquet et ça le transforme en Objet JavaScript utilisable (avec des accolades {} et tout).
Note : C'est aussi asynchrone, donc il faut un await devant aussi.
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":"celui qui pete fort dans la classe jv te grabber
","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":"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"]}]}