Compare commits

...

2 Commits

Author SHA1 Message Date
87177f13c4 1503save 2026-03-15 15:28:26 +01:00
930a470471 1503save 2026-03-15 13:38:04 +01:00
52 changed files with 13617 additions and 243 deletions

266
CONFIGURATION_SITE.md Normal file
View File

@ -0,0 +1,266 @@
# Configuration du Site Web - Documentation Complète
## 📋 Vue d'ensemble
Ce site utilise une architecture full-stack moderne avec :
- **Frontend** : Next.js avec TypeScript et Tailwind CSS
- **Backend CMS** : Strapi
- **API IA** : FastAPI avec intégration Ollama
- **Démarrage automatique** : Planificateur de tâches Windows
## 🏗️ Architecture
```
my-next-site/
├── app/ # Application Next.js
├── cmsbackend/ # Backend Strapi
├── llm-api/ # API FastAPI pour IA
├── start-my-site.ps1 # Script de démarrage
└── package.json # Dépendances frontend
```
## 🚀 Démarrage Rapide
### Script Automatique (Recommandé)
```powershell
cd J:\my-next-site
.\start-my-site.ps1
```
Ce script lance automatiquement les 3 services dans des fenêtres PowerShell séparées.
## 🔧 Commandes Manuelles
### 1. Frontend Next.js
```powershell
cd J:\my-next-site
npm run dev
```
- **URL** : http://localhost:3000
- **Mode** : Développement avec Turbopack
- **Rechargement** : Automatique
### 2. Backend Strapi (CMS)
```powershell
cd J:\my-next-site\cmsbackend
npm run develop
```
- **Interface Admin** : http://localhost:1337/admin
- **API** : http://localhost:1337/api
- **Mode** : Développement
### 3. API FastAPI (IA)
```powershell
cd J:\my-next-site\llm-api
uvicorn api:app --host 0.0.0.0 --port 8000 --reload
```
- **API** : http://localhost:8000
- **Endpoint IA** : http://localhost:8000/ask?q=votre_question
- **Documentation** : http://localhost:8000/docs
## 📊 Ports Utilisés
| Service | Port | URL |
|---------|------|-----|
| Next.js | 3000 | http://localhost:3000 |
| Strapi | 1337 | http://localhost:1337 |
| FastAPI | 8000 | http://localhost:8000 |
| Ollama | 11434 | http://localhost:11434 |
## 🔄 Démarrage Automatique
### Configuration Actuelle
- **Méthode** : Planificateur de tâches Windows
- **Nom de la tâche** : "Lancement site web dino"
- **État** : Ready (Prêt)
### Gestion de la Tâche Planifiée
#### Voir les détails
```powershell
Get-ScheduledTask -TaskName "Lancement site web dino" | Get-ScheduledTaskInfo
```
#### Démarrer manuellement
```powershell
Start-ScheduledTask -TaskName "Lancement site web dino"
```
#### Arrêter la tâche
```powershell
Stop-ScheduledTask -TaskName "Lancement site web dino"
```
#### Désactiver/Réactiver
```powershell
# Désactiver
Disable-ScheduledTask -TaskName "Lancement site web dino"
# Réactiver
Enable-ScheduledTask -TaskName "Lancement site web dino"
```
#### Interface Graphique
```
Win + R → taskschd.msc
```
Cherchez "Lancement site web dino" dans la liste.
## 🛠️ Dépannage
### Arrêter Tous les Processus
```powershell
# Arrêter Node.js
taskkill /f /im node.exe
# Arrêter Python/FastAPI
taskkill /f /im python.exe
```
### Nettoyer les Caches
```powershell
# Cache Next.js
cd J:\my-next-site
Remove-Item .next -Recurse -Force -ErrorAction SilentlyContinue
# Cache Strapi
cd J:\my-next-site\cmsbackend
Remove-Item .cache -Recurse -Force -ErrorAction SilentlyContinue
```
### Réinstaller les Dépendances
```powershell
# Frontend
cd J:\my-next-site
npm install
# Backend Strapi
cd J:\my-next-site\cmsbackend
npm install
# API Python (si environnement virtuel)
cd J:\my-next-site\llm-api
pip install fastapi uvicorn[standard] requests
```
## 🐍 Configuration Python/FastAPI
### Dépendances Requises
```txt
fastapi==0.115.8
uvicorn[standard]==0.38.0
requests==2.32.3
```
### Problèmes Courants
- **Erreur uvicorn** : Vérifiez l'installation avec `pip show uvicorn`
- **Port occupé** : Changez le port dans le script ou tuez le processus
- **Ollama non disponible** : Vérifiez que Ollama fonctionne sur le port 11434
### Installation Propre (Recommandée)
```powershell
cd J:\my-next-site\llm-api
python -m venv venv
venv\Scripts\activate
pip install fastapi uvicorn[standard] requests
```
## 📝 Scripts Disponibles
### Frontend (package.json)
```json
{
"dev": "next dev --turbopack",
"build": "next build",
"start": "next start",
"lint": "next lint"
}
```
### Backend Strapi (cmsbackend/package.json)
```json
{
"develop": "strapi develop",
"build": "strapi build",
"start": "strapi start"
}
```
## 🔍 Vérifications de Santé
### Vérifier que tous les services fonctionnent
```powershell
# Next.js
curl http://localhost:3000
# Strapi
curl http://localhost:1337/admin
# FastAPI
curl http://localhost:8000/docs
# Ollama
curl http://localhost:11434/api/generate
```
### Vérifier les processus actifs
```powershell
# Processus Node.js
Get-Process node -ErrorAction SilentlyContinue
# Processus Python
Get-Process python -ErrorAction SilentlyContinue
```
## 🌐 Configuration Réseau
### Accès Externe
Si vous voulez accéder au site depuis d'autres machines :
- **Next.js** : Modifier `next.config.ts` pour accepter les connexions externes
- **Strapi** : Configurer `config/server.ts`
- **FastAPI** : Déjà configuré avec `--host 0.0.0.0`
### Pare-feu Windows
Assurez-vous que les ports sont ouverts :
```powershell
# Ouvrir les ports dans le pare-feu
New-NetFirewallRule -DisplayName "Next.js" -Direction Inbound -Port 3000 -Protocol TCP -Action Allow
New-NetFirewallRule -DisplayName "Strapi" -Direction Inbound -Port 1337 -Protocol TCP -Action Allow
New-NetFirewallRule -DisplayName "FastAPI" -Direction Inbound -Port 8000 -Protocol TCP -Action Allow
```
## 📚 Ressources Utiles
- **Next.js Documentation** : https://nextjs.org/docs
- **Strapi Documentation** : https://docs.strapi.io
- **FastAPI Documentation** : https://fastapi.tiangolo.com
- **Ollama Documentation** : https://ollama.ai/docs
## 🔧 Maintenance
### Mise à jour des dépendances
```powershell
# Frontend
cd J:\my-next-site
npm update
# Backend
cd J:\my-next-site\cmsbackend
npm update
# Python packages
pip list --outdated
pip install --upgrade package_name
```
### Sauvegarde
Pensez à sauvegarder régulièrement :
- Base de données Strapi (`cmsbackend/database/`)
- Configuration (`cmsbackend/config/`)
- Assets (`app/assets/`)
---
**Dernière mise à jour** : $(Get-Date -Format "dd/MM/yyyy HH:mm")
**Version Cursor** : 2.0.77
**OS** : Windows Server 2025

View File

@ -105,3 +105,59 @@ Performance améliorée grâce au préchargement et à la mise en cache
Expérience utilisateur fluide avec des animations et une navigation rapide
[lien du site] [https://fernandgrascalvet.com]
Pour lancer uvicrn:
uvicorn api:app --host 0.0.0.0 --port 8000 --reload
📋 Commandes manuelles individuelles
1. Strapi (Backend CMS)
cd J:\my-next-site\cmsbackend
npm run develop
cd J:\my-next-site\cmsbackendnpm run develop
Interface admin : http://localhost:1337/admin
API : http://localhost:1337/api
2. Next.js (Frontend)
cd J:\my-next-site
npm run dev
cd J:\my-next-sitenpm run dev
Site web : http://localhost:3000
Utilise Turbopack pour un rechargement rapide
3. FastAPI (LLM API)
cd J:\my-next-site\llm-api
uvicorn api:app --host 0.0.0.0 --port 8000 --reload
cd J:\my-next-site\llm-apiuvicorn api:app --host 0.0.0.0 --port 8000 --reload
API IA : http://localhost:8000
Endpoint : http://localhost:8000/ask?q=votre_question
🔧 Commandes de dépannage
Arrêter tous les processus Node.js
taskkill /f /im node.exe
taskkill /f /im python.exe
taskkill /f /im node.exetaskkill /f /im python.exe
Nettoyer les caches
# Next.js
cd J:\my-next-site
rm -r .next -Force -ErrorAction SilentlyContinue
# Strapi
cd J:\my-next-site\cmsbackend
rm -r .cache -Force -ErrorAction SilentlyContinue
# Next.jscd J:\my-next-siterm -r .next -Force -ErrorAction SilentlyContinue# Strapicd J:\my-next-site\cmsbackendrm -r .cache -Force -ErrorAction SilentlyContinue
Réinstaller les dépendances
# Frontend
cd J:\my-next-site
npm install
# Backend
cd J:\my-next-site\cmsbackend
npm install
# Frontendcd J:\my-next-sitenpm install# Backendcd J:\my-next-site\cmsbackendnpm install
📊 Ports utilisés
Next.js : 3000
Strapi : 1337
FastAPI : 8000
Ollama : 11434

View File

@ -1,3 +1,4 @@
"use client";
import React, { useEffect, useState, useRef } from "react";
@ -6,7 +7,7 @@ import "./assets/main.css";
import "./globals.css";
import NavLink from "./components/NavLink";
export default function RootLayout({ children }) {
export default function RootLayout({ children }: { children: React.ReactNode }) {
const [visitCount, setVisitCount] = useState(0);
const [isMenuOpen, setIsMenuOpen] = useState(false);
const menuRef = useRef(null); // Référence pour le menu burger
@ -95,3 +96,4 @@ export default function RootLayout({ children }) {
</html>
);
}

View File

@ -7,17 +7,60 @@ import { getApiUrl } from "./utils/getApiUrl";
async function getHomepageData() {
const apiUrl = getApiUrl();
// Configuration avec timeout et retry
const fetchWithTimeout = async (url: string, options: RequestInit = {}) => {
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), 10000); // 10 secondes timeout
try {
const response = await fetch(`${apiUrl}/api/homepages?populate=*`);
if (!response.ok) {
throw new Error("Failed to fetch homepage content");
}
const data = await response.json();
return data.data?.[0] ?? null;
const response = await fetch(url, {
...options,
signal: controller.signal,
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
...options.headers,
},
});
clearTimeout(timeoutId);
return response;
} catch (error) {
console.error("Error fetching homepage:", error);
clearTimeout(timeoutId);
throw error;
}
};
// Tentative avec retry
for (let attempt = 1; attempt <= 3; attempt++) {
try {
console.log(`🔄 [getHomepageData] Tentative ${attempt}/3 - URL: ${apiUrl}/api/homepages?populate=*`);
const response = await fetchWithTimeout(`${apiUrl}/api/homepages?populate=*`);
if (!response.ok) {
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
}
const data = await response.json();
console.log("✅ [getHomepageData] Données récupérées avec succès");
return data.data?.[0] ?? null;
} catch (error) {
console.error(`❌ [getHomepageData] Erreur tentative ${attempt}:`, error);
if (attempt === 3) {
// Dernière tentative échouée
console.error("🚨 [getHomepageData] Toutes les tentatives ont échoué");
return null;
}
// Attendre avant la prochaine tentative
await new Promise(resolve => setTimeout(resolve, 1000 * attempt));
}
}
return null;
}
export default function HomePage() {
@ -35,7 +78,7 @@ export default function HomePage() {
const imageUrl = homepage.photo?.url ? `${apiUrl}${homepage.photo.url}` : null;
return (
<main className="w-full mx-auto flex flex-col items-center justify-center p-6 bg-white/55 rounded-lg mt-12 mb-3 max-w-7xl">
<main className="w-full mx-auto flex flex-col items-center justify-center p-6 bg-white/55 rounded-lg mt-12 mb-3 sm:max-w-2xl md:max-w-3xl lg:max-w-4xl xl:max-w-5xl">
<h1 className="text-3xl font-orbitron-24-bold-italic text-gray-800 mb-4">{title}</h1>
{imageUrl ? (

View File

@ -6,8 +6,22 @@ export function getApiUrl() {
window.location.hostname.startsWith("192.168.") ||
window.location.hostname.endsWith(".local");
console.log("🌍 [getApiUrl] Mode CLIENT détecté - URL :", isLocalhost ? "http://localhost:1337" : "https://api.fernandgrascalvet.com");
return isLocalhost ? "http://localhost:1337" : "https://api.fernandgrascalvet.com";
// URLs de fallback en cas de problème VPN
const localUrl = "http://localhost:1337";
const productionUrls = [
"https://api.fernandgrascalvet.com",
"https://fernandgrascalvet.com/api", // Fallback via proxy
];
if (isLocalhost) {
console.log("🌍 [getApiUrl] Mode LOCAL détecté - URL :", localUrl);
return localUrl;
}
// En production, utiliser l'URL principale
const primaryUrl = productionUrls[0];
console.log("🌍 [getApiUrl] Mode PRODUCTION détecté - URL :", primaryUrl);
return primaryUrl;
}
const apiUrl = process.env.NEXT_PUBLIC_API_URL || "https://api.fernandgrascalvet.com";

61
docker-compose.yaml Normal file
View File

@ -0,0 +1,61 @@
services:
caddy:
container_name: caddy
image: docker.io/library/caddy:2-alpine
network_mode: host
restart: unless-stopped
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy-data:/data:rw
- caddy-config:/config:rw
environment:
- SEARXNG_HOSTNAME=${SEARXNG_HOSTNAME:-http://localhost}
- SEARXNG_TLS=${LETSENCRYPT_EMAIL:-internal}
logging:
driver: "json-file"
options:
max-size: "1m"
max-file: "1"
redis:
container_name: redis
image: docker.io/valkey/valkey:8-alpine
command: valkey-server --save 30 1 --loglevel warning
restart: unless-stopped
networks:
- searxng
volumes:
- valkey-data2:/data
logging:
driver: "json-file"
options:
max-size: "1m"
max-file: "1"
searxng:
container_name: searxng
image: docker.io/searxng/searxng:latest
restart: unless-stopped
networks:
- searxng
ports:
- "127.0.0.1:8080:8080"
volumes:
- ./searxng:/etc/searxng:rw
- searxng-data:/var/cache/searxng:rw
environment:
- SEARXNG_BASE_URL=https://${SEARXNG_HOSTNAME:-localhost}/
logging:
driver: "json-file"
options:
max-size: "1m"
max-file: "1"
networks:
searxng:
volumes:
caddy-data:
caddy-config:
valkey-data2:
searxng-data:

View File

@ -11,13 +11,6 @@ const nextConfig = {
compress: false,
trailingSlash: false,
webpackDevMiddleware: (config: any) => {
config.watchOptions = {
poll: 1000,
aggregateTimeout: 300,
};
return config;
},
async rewrites() {
return [

485
package-lock.json generated
View File

@ -47,19 +47,29 @@
}
},
"node_modules/@emnapi/runtime": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz",
"integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==",
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz",
"integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==",
"license": "MIT",
"optional": true,
"dependencies": {
"tslib": "^2.4.0"
}
},
"node_modules/@img/colour": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz",
"integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==",
"license": "MIT",
"optional": true,
"engines": {
"node": ">=18"
}
},
"node_modules/@img/sharp-darwin-arm64": {
"version": "0.33.5",
"resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz",
"integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==",
"version": "0.34.5",
"resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz",
"integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==",
"cpu": [
"arm64"
],
@ -75,13 +85,13 @@
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-darwin-arm64": "1.0.4"
"@img/sharp-libvips-darwin-arm64": "1.2.4"
}
},
"node_modules/@img/sharp-darwin-x64": {
"version": "0.33.5",
"resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz",
"integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==",
"version": "0.34.5",
"resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz",
"integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==",
"cpu": [
"x64"
],
@ -97,13 +107,13 @@
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-darwin-x64": "1.0.4"
"@img/sharp-libvips-darwin-x64": "1.2.4"
}
},
"node_modules/@img/sharp-libvips-darwin-arm64": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz",
"integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==",
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz",
"integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==",
"cpu": [
"arm64"
],
@ -117,9 +127,9 @@
}
},
"node_modules/@img/sharp-libvips-darwin-x64": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz",
"integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==",
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz",
"integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==",
"cpu": [
"x64"
],
@ -133,9 +143,9 @@
}
},
"node_modules/@img/sharp-libvips-linux-arm": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz",
"integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==",
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz",
"integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==",
"cpu": [
"arm"
],
@ -149,9 +159,9 @@
}
},
"node_modules/@img/sharp-libvips-linux-arm64": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz",
"integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==",
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz",
"integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==",
"cpu": [
"arm64"
],
@ -164,10 +174,42 @@
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-libvips-linux-ppc64": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz",
"integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==",
"cpu": [
"ppc64"
],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
"linux"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-libvips-linux-riscv64": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz",
"integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==",
"cpu": [
"riscv64"
],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
"linux"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-libvips-linux-s390x": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz",
"integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==",
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz",
"integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==",
"cpu": [
"s390x"
],
@ -181,9 +223,9 @@
}
},
"node_modules/@img/sharp-libvips-linux-x64": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz",
"integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==",
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz",
"integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==",
"cpu": [
"x64"
],
@ -197,9 +239,9 @@
}
},
"node_modules/@img/sharp-libvips-linuxmusl-arm64": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz",
"integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==",
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz",
"integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==",
"cpu": [
"arm64"
],
@ -213,9 +255,9 @@
}
},
"node_modules/@img/sharp-libvips-linuxmusl-x64": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz",
"integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==",
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz",
"integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==",
"cpu": [
"x64"
],
@ -229,9 +271,9 @@
}
},
"node_modules/@img/sharp-linux-arm": {
"version": "0.33.5",
"resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz",
"integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==",
"version": "0.34.5",
"resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz",
"integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==",
"cpu": [
"arm"
],
@ -247,13 +289,13 @@
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linux-arm": "1.0.5"
"@img/sharp-libvips-linux-arm": "1.2.4"
}
},
"node_modules/@img/sharp-linux-arm64": {
"version": "0.33.5",
"resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz",
"integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==",
"version": "0.34.5",
"resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz",
"integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==",
"cpu": [
"arm64"
],
@ -269,13 +311,57 @@
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linux-arm64": "1.0.4"
"@img/sharp-libvips-linux-arm64": "1.2.4"
}
},
"node_modules/@img/sharp-linux-ppc64": {
"version": "0.34.5",
"resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz",
"integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==",
"cpu": [
"ppc64"
],
"license": "Apache-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linux-ppc64": "1.2.4"
}
},
"node_modules/@img/sharp-linux-riscv64": {
"version": "0.34.5",
"resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz",
"integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==",
"cpu": [
"riscv64"
],
"license": "Apache-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linux-riscv64": "1.2.4"
}
},
"node_modules/@img/sharp-linux-s390x": {
"version": "0.33.5",
"resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz",
"integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==",
"version": "0.34.5",
"resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz",
"integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==",
"cpu": [
"s390x"
],
@ -291,13 +377,13 @@
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linux-s390x": "1.0.4"
"@img/sharp-libvips-linux-s390x": "1.2.4"
}
},
"node_modules/@img/sharp-linux-x64": {
"version": "0.33.5",
"resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz",
"integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==",
"version": "0.34.5",
"resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz",
"integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==",
"cpu": [
"x64"
],
@ -313,13 +399,13 @@
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linux-x64": "1.0.4"
"@img/sharp-libvips-linux-x64": "1.2.4"
}
},
"node_modules/@img/sharp-linuxmusl-arm64": {
"version": "0.33.5",
"resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz",
"integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==",
"version": "0.34.5",
"resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz",
"integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==",
"cpu": [
"arm64"
],
@ -335,13 +421,13 @@
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linuxmusl-arm64": "1.0.4"
"@img/sharp-libvips-linuxmusl-arm64": "1.2.4"
}
},
"node_modules/@img/sharp-linuxmusl-x64": {
"version": "0.33.5",
"resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz",
"integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==",
"version": "0.34.5",
"resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz",
"integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==",
"cpu": [
"x64"
],
@ -357,20 +443,20 @@
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linuxmusl-x64": "1.0.4"
"@img/sharp-libvips-linuxmusl-x64": "1.2.4"
}
},
"node_modules/@img/sharp-wasm32": {
"version": "0.33.5",
"resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz",
"integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==",
"version": "0.34.5",
"resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz",
"integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==",
"cpu": [
"wasm32"
],
"license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
"optional": true,
"dependencies": {
"@emnapi/runtime": "^1.2.0"
"@emnapi/runtime": "^1.7.0"
},
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
@ -379,10 +465,29 @@
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-win32-arm64": {
"version": "0.34.5",
"resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz",
"integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==",
"cpu": [
"arm64"
],
"license": "Apache-2.0 AND LGPL-3.0-or-later",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-win32-ia32": {
"version": "0.33.5",
"resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz",
"integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==",
"version": "0.34.5",
"resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz",
"integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==",
"cpu": [
"ia32"
],
@ -399,9 +504,9 @@
}
},
"node_modules/@img/sharp-win32-x64": {
"version": "0.33.5",
"resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz",
"integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==",
"version": "0.34.5",
"resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz",
"integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==",
"cpu": [
"x64"
],
@ -483,15 +588,15 @@
}
},
"node_modules/@next/env": {
"version": "15.1.6",
"resolved": "https://registry.npmjs.org/@next/env/-/env-15.1.6.tgz",
"integrity": "sha512-d9AFQVPEYNr+aqokIiPLNK/MTyt3DWa/dpKveiAaVccUadFbhFEvY6FXYX2LJO2Hv7PHnLBu2oWwB4uBuHjr/w==",
"version": "15.5.9",
"resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.9.tgz",
"integrity": "sha512-4GlTZ+EJM7WaW2HEZcyU317tIQDjkQIyENDLxYJfSWlfqguN+dHkZgyQTV/7ykvobU7yEH5gKvreNrH4B6QgIg==",
"license": "MIT"
},
"node_modules/@next/swc-darwin-arm64": {
"version": "15.1.6",
"resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.1.6.tgz",
"integrity": "sha512-u7lg4Mpl9qWpKgy6NzEkz/w0/keEHtOybmIl0ykgItBxEM5mYotS5PmqTpo+Rhg8FiOiWgwr8USxmKQkqLBCrw==",
"version": "15.5.7",
"resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.7.tgz",
"integrity": "sha512-IZwtxCEpI91HVU/rAUOOobWSZv4P2DeTtNaCdHqLcTJU4wdNXgAySvKa/qJCgR5m6KI8UsKDXtO2B31jcaw1Yw==",
"cpu": [
"arm64"
],
@ -505,9 +610,9 @@
}
},
"node_modules/@next/swc-darwin-x64": {
"version": "15.1.6",
"resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.1.6.tgz",
"integrity": "sha512-x1jGpbHbZoZ69nRuogGL2MYPLqohlhnT9OCU6E6QFewwup+z+M6r8oU47BTeJcWsF2sdBahp5cKiAcDbwwK/lg==",
"version": "15.5.7",
"resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.7.tgz",
"integrity": "sha512-UP6CaDBcqaCBuiq/gfCEJw7sPEoX1aIjZHnBWN9v9qYHQdMKvCKcAVs4OX1vIjeE+tC5EIuwDTVIoXpUes29lg==",
"cpu": [
"x64"
],
@ -521,9 +626,9 @@
}
},
"node_modules/@next/swc-linux-arm64-gnu": {
"version": "15.1.6",
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.1.6.tgz",
"integrity": "sha512-jar9sFw0XewXsBzPf9runGzoivajeWJUc/JkfbLTC4it9EhU8v7tCRLH7l5Y1ReTMN6zKJO0kKAGqDk8YSO2bg==",
"version": "15.5.7",
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.7.tgz",
"integrity": "sha512-NCslw3GrNIw7OgmRBxHtdWFQYhexoUCq+0oS2ccjyYLtcn1SzGzeM54jpTFonIMUjNbHmpKpziXnpxhSWLcmBA==",
"cpu": [
"arm64"
],
@ -537,9 +642,9 @@
}
},
"node_modules/@next/swc-linux-arm64-musl": {
"version": "15.1.6",
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.1.6.tgz",
"integrity": "sha512-+n3u//bfsrIaZch4cgOJ3tXCTbSxz0s6brJtU3SzLOvkJlPQMJ+eHVRi6qM2kKKKLuMY+tcau8XD9CJ1OjeSQQ==",
"version": "15.5.7",
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.7.tgz",
"integrity": "sha512-nfymt+SE5cvtTrG9u1wdoxBr9bVB7mtKTcj0ltRn6gkP/2Nu1zM5ei8rwP9qKQP0Y//umK+TtkKgNtfboBxRrw==",
"cpu": [
"arm64"
],
@ -553,9 +658,9 @@
}
},
"node_modules/@next/swc-linux-x64-gnu": {
"version": "15.1.6",
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.1.6.tgz",
"integrity": "sha512-SpuDEXixM3PycniL4iVCLyUyvcl6Lt0mtv3am08sucskpG0tYkW1KlRhTgj4LI5ehyxriVVcfdoxuuP8csi3kQ==",
"version": "15.5.7",
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.7.tgz",
"integrity": "sha512-hvXcZvCaaEbCZcVzcY7E1uXN9xWZfFvkNHwbe/n4OkRhFWrs1J1QV+4U1BN06tXLdaS4DazEGXwgqnu/VMcmqw==",
"cpu": [
"x64"
],
@ -569,9 +674,9 @@
}
},
"node_modules/@next/swc-linux-x64-musl": {
"version": "15.1.6",
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.1.6.tgz",
"integrity": "sha512-L4druWmdFSZIIRhF+G60API5sFB7suTbDRhYWSjiw0RbE+15igQvE2g2+S973pMGvwN3guw7cJUjA/TmbPWTHQ==",
"version": "15.5.7",
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.7.tgz",
"integrity": "sha512-4IUO539b8FmF0odY6/SqANJdgwn1xs1GkPO5doZugwZ3ETF6JUdckk7RGmsfSf7ws8Qb2YB5It33mvNL/0acqA==",
"cpu": [
"x64"
],
@ -585,9 +690,9 @@
}
},
"node_modules/@next/swc-win32-arm64-msvc": {
"version": "15.1.6",
"resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.1.6.tgz",
"integrity": "sha512-s8w6EeqNmi6gdvM19tqKKWbCyOBvXFbndkGHl+c9YrzsLARRdCHsD9S1fMj8gsXm9v8vhC8s3N8rjuC/XrtkEg==",
"version": "15.5.7",
"resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.7.tgz",
"integrity": "sha512-CpJVTkYI3ZajQkC5vajM7/ApKJUOlm6uP4BknM3XKvJ7VXAvCqSjSLmM0LKdYzn6nBJVSjdclx8nYJSa3xlTgQ==",
"cpu": [
"arm64"
],
@ -601,9 +706,9 @@
}
},
"node_modules/@next/swc-win32-x64-msvc": {
"version": "15.1.6",
"resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.1.6.tgz",
"integrity": "sha512-6xomMuu54FAFxttYr5PJbEfu96godcxBTRk1OhAvJq0/EnmFU/Ybiax30Snis4vdWZ9LGpf7Roy5fSs7v/5ROQ==",
"version": "15.5.7",
"resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.7.tgz",
"integrity": "sha512-gMzgBX164I6DN+9/PGA+9dQiwmTkE4TloBNx8Kv9UiGARsr9Nba7IpcBRA1iTV9vwlYnrE3Uy6I7Aj6qLjQuqw==",
"cpu": [
"x64"
],
@ -672,12 +777,6 @@
"react-dom": "^18.0.0"
}
},
"node_modules/@swc/counter": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
"integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==",
"license": "Apache-2.0"
},
"node_modules/@swc/helpers": {
"version": "0.5.15",
"resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz",
@ -889,9 +988,9 @@
}
},
"node_modules/brace-expansion": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
@ -909,17 +1008,6 @@
"node": ">=8"
}
},
"node_modules/busboy": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
"integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
"dependencies": {
"streamsearch": "^1.1.0"
},
"engines": {
"node": ">=10.16.0"
}
},
"node_modules/call-bind-apply-helpers": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz",
@ -1076,20 +1164,6 @@
"integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
"license": "MIT"
},
"node_modules/color": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
"integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
"license": "MIT",
"optional": true,
"dependencies": {
"color-convert": "^2.0.1",
"color-string": "^1.9.0"
},
"engines": {
"node": ">=12.5.0"
}
},
"node_modules/color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@ -1108,17 +1182,6 @@
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"license": "MIT"
},
"node_modules/color-string": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
"integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
"license": "MIT",
"optional": true,
"dependencies": {
"color-name": "^1.0.0",
"simple-swizzle": "^0.2.2"
}
},
"node_modules/comma-separated-tokens": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
@ -1210,9 +1273,9 @@
}
},
"node_modules/detect-libc": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz",
"integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==",
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
"integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
"license": "Apache-2.0",
"optional": true,
"engines": {
@ -1478,9 +1541,9 @@
}
},
"node_modules/glob": {
"version": "10.4.5",
"resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
"integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
"version": "10.5.0",
"resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
"integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
"license": "ISC",
"dependencies": {
"foreground-child": "^3.1.0",
@ -1797,13 +1860,6 @@
"url": "https://github.com/sponsors/wooorm"
}
},
"node_modules/is-arrayish": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
"integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
"license": "MIT",
"optional": true
},
"node_modules/is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
@ -2252,9 +2308,9 @@
}
},
"node_modules/mdast-util-to-hast": {
"version": "13.2.0",
"resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz",
"integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==",
"version": "13.2.1",
"resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz",
"integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==",
"license": "MIT",
"dependencies": {
"@types/hast": "^3.0.0",
@ -2951,15 +3007,13 @@
}
},
"node_modules/next": {
"version": "15.1.6",
"resolved": "https://registry.npmjs.org/next/-/next-15.1.6.tgz",
"integrity": "sha512-Hch4wzbaX0vKQtalpXvUiw5sYivBy4cm5rzUKrBnUB/y436LGrvOUqYvlSeNVCWFO/770gDlltR9gqZH62ct4Q==",
"version": "15.5.9",
"resolved": "https://registry.npmjs.org/next/-/next-15.5.9.tgz",
"integrity": "sha512-agNLK89seZEtC5zUHwtut0+tNrc0Xw4FT/Dg+B/VLEo9pAcS9rtTKpek3V6kVcVwsB2YlqMaHdfZL4eLEVYuCg==",
"license": "MIT",
"dependencies": {
"@next/env": "15.1.6",
"@swc/counter": "0.1.3",
"@next/env": "15.5.9",
"@swc/helpers": "0.5.15",
"busboy": "1.6.0",
"caniuse-lite": "^1.0.30001579",
"postcss": "8.4.31",
"styled-jsx": "5.1.6"
@ -2971,19 +3025,19 @@
"node": "^18.18.0 || ^19.8.0 || >= 20.0.0"
},
"optionalDependencies": {
"@next/swc-darwin-arm64": "15.1.6",
"@next/swc-darwin-x64": "15.1.6",
"@next/swc-linux-arm64-gnu": "15.1.6",
"@next/swc-linux-arm64-musl": "15.1.6",
"@next/swc-linux-x64-gnu": "15.1.6",
"@next/swc-linux-x64-musl": "15.1.6",
"@next/swc-win32-arm64-msvc": "15.1.6",
"@next/swc-win32-x64-msvc": "15.1.6",
"sharp": "^0.33.5"
"@next/swc-darwin-arm64": "15.5.7",
"@next/swc-darwin-x64": "15.5.7",
"@next/swc-linux-arm64-gnu": "15.5.7",
"@next/swc-linux-arm64-musl": "15.5.7",
"@next/swc-linux-x64-gnu": "15.5.7",
"@next/swc-linux-x64-musl": "15.5.7",
"@next/swc-win32-arm64-msvc": "15.5.7",
"@next/swc-win32-x64-msvc": "15.5.7",
"sharp": "^0.34.3"
},
"peerDependencies": {
"@opentelemetry/api": "^1.1.0",
"@playwright/test": "^1.41.2",
"@playwright/test": "^1.51.1",
"babel-plugin-react-compiler": "*",
"react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
"react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
@ -3346,9 +3400,9 @@
}
},
"node_modules/qs": {
"version": "6.14.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
"integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
"version": "6.14.1",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz",
"integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==",
"license": "BSD-3-Clause",
"dependencies": {
"side-channel": "^1.1.0"
@ -3656,9 +3710,9 @@
}
},
"node_modules/semver": {
"version": "7.6.3",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
"integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
"version": "7.7.3",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
"integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
"license": "ISC",
"optional": true,
"bin": {
@ -3669,16 +3723,16 @@
}
},
"node_modules/sharp": {
"version": "0.33.5",
"resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz",
"integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==",
"version": "0.34.5",
"resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz",
"integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==",
"hasInstallScript": true,
"license": "Apache-2.0",
"optional": true,
"dependencies": {
"color": "^4.2.3",
"detect-libc": "^2.0.3",
"semver": "^7.6.3"
"@img/colour": "^1.0.0",
"detect-libc": "^2.1.2",
"semver": "^7.7.3"
},
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
@ -3687,25 +3741,30 @@
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-darwin-arm64": "0.33.5",
"@img/sharp-darwin-x64": "0.33.5",
"@img/sharp-libvips-darwin-arm64": "1.0.4",
"@img/sharp-libvips-darwin-x64": "1.0.4",
"@img/sharp-libvips-linux-arm": "1.0.5",
"@img/sharp-libvips-linux-arm64": "1.0.4",
"@img/sharp-libvips-linux-s390x": "1.0.4",
"@img/sharp-libvips-linux-x64": "1.0.4",
"@img/sharp-libvips-linuxmusl-arm64": "1.0.4",
"@img/sharp-libvips-linuxmusl-x64": "1.0.4",
"@img/sharp-linux-arm": "0.33.5",
"@img/sharp-linux-arm64": "0.33.5",
"@img/sharp-linux-s390x": "0.33.5",
"@img/sharp-linux-x64": "0.33.5",
"@img/sharp-linuxmusl-arm64": "0.33.5",
"@img/sharp-linuxmusl-x64": "0.33.5",
"@img/sharp-wasm32": "0.33.5",
"@img/sharp-win32-ia32": "0.33.5",
"@img/sharp-win32-x64": "0.33.5"
"@img/sharp-darwin-arm64": "0.34.5",
"@img/sharp-darwin-x64": "0.34.5",
"@img/sharp-libvips-darwin-arm64": "1.2.4",
"@img/sharp-libvips-darwin-x64": "1.2.4",
"@img/sharp-libvips-linux-arm": "1.2.4",
"@img/sharp-libvips-linux-arm64": "1.2.4",
"@img/sharp-libvips-linux-ppc64": "1.2.4",
"@img/sharp-libvips-linux-riscv64": "1.2.4",
"@img/sharp-libvips-linux-s390x": "1.2.4",
"@img/sharp-libvips-linux-x64": "1.2.4",
"@img/sharp-libvips-linuxmusl-arm64": "1.2.4",
"@img/sharp-libvips-linuxmusl-x64": "1.2.4",
"@img/sharp-linux-arm": "0.34.5",
"@img/sharp-linux-arm64": "0.34.5",
"@img/sharp-linux-ppc64": "0.34.5",
"@img/sharp-linux-riscv64": "0.34.5",
"@img/sharp-linux-s390x": "0.34.5",
"@img/sharp-linux-x64": "0.34.5",
"@img/sharp-linuxmusl-arm64": "0.34.5",
"@img/sharp-linuxmusl-x64": "0.34.5",
"@img/sharp-wasm32": "0.34.5",
"@img/sharp-win32-arm64": "0.34.5",
"@img/sharp-win32-ia32": "0.34.5",
"@img/sharp-win32-x64": "0.34.5"
}
},
"node_modules/shebang-command": {
@ -3813,16 +3872,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/simple-swizzle": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
"integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
"license": "MIT",
"optional": true,
"dependencies": {
"is-arrayish": "^0.3.1"
}
},
"node_modules/source-map-js": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
@ -3842,14 +3891,6 @@
"url": "https://github.com/sponsors/wooorm"
}
},
"node_modules/streamsearch": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
"integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
"engines": {
"node": ">=10.0.0"
}
},
"node_modules/string-width": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",

0
prompt.txt Normal file
View File

24
start-my-site.ps1 Normal file
View File

@ -0,0 +1,24 @@
# Configuration des variables d'environnement
$env:NEXT_PUBLIC_API_URL = "https://api.fernandgrascalvet.com"
$env:PUBLIC_URL = "https://api.fernandgrascalvet.com"
Write-Host "🚀 Démarrage du site avec configuration HTTPS..." -ForegroundColor Green
Write-Host "📡 API URL: $env:NEXT_PUBLIC_API_URL" -ForegroundColor Cyan
# Lancer Strapi avec configuration HTTPS
Write-Host "🔧 Démarrage de Strapi..." -ForegroundColor Yellow
Start-Process powershell -ArgumentList "cd 'J:\my-next-site\cmsbackend'; `$env:PUBLIC_URL='https://api.fernandgrascalvet.com'; npm run develop" -WindowStyle Normal
# Attendre un peu pour que Strapi démarre
Start-Sleep -Seconds 3
# Lancer Next.js
Write-Host "⚡ Démarrage de Next.js..." -ForegroundColor Yellow
Start-Process powershell -ArgumentList "cd 'J:\my-next-site'; `$env:NEXT_PUBLIC_API_URL='https://api.fernandgrascalvet.com'; npm run dev" -WindowStyle Normal
# Lancer FastAPI
Write-Host "🤖 Démarrage de FastAPI..." -ForegroundColor Yellow
Start-Process powershell -ArgumentList "cd 'J:\my-next-site\llm-api'; uvicorn api:app --host 0.0.0.0 --port 8000" -WindowStyle Normal
Write-Host "✅ Tous les services sont en cours de démarrage!" -ForegroundColor Green
Write-Host "🌐 Site accessible sur: http://localhost:3000" -ForegroundColor Cyan

View File

@ -0,0 +1,418 @@
const fs = require('fs');
const path = require('path');
// Configuration
const SITE_ROOT = '../'; // Depuis strapi_extraction vers la racine
const DOCS_DIR = './docs';
const OUTPUT_FILE = '99-site-architecture.md';
// Fonction pour lire récursivement les fichiers
function readDirectoryRecursive(dir, extensions = [], maxDepth = 3, currentDepth = 0) {
const files = [];
if (currentDepth >= maxDepth) return files;
try {
const items = fs.readdirSync(dir);
for (const item of items) {
const fullPath = path.join(dir, item);
const stat = fs.statSync(fullPath);
if (stat.isDirectory()) {
// Ignorer certains dossiers
if (['node_modules', '.next', '.git', 'raw-data', 'clean-data', 'docs'].includes(item)) {
continue;
}
files.push(...readDirectoryRecursive(fullPath, extensions, maxDepth, currentDepth + 1));
} else if (stat.isFile()) {
const ext = path.extname(item);
if (extensions.length === 0 || extensions.includes(ext)) {
files.push({
path: fullPath,
relativePath: path.relative(SITE_ROOT, fullPath),
name: item,
extension: ext,
size: stat.size
});
}
}
}
} catch (error) {
console.warn(`Impossible de lire le dossier ${dir}:`, error.message);
}
return files;
}
// Analyser les pages Next.js
function analyzePages() {
const pagesDir = path.join(SITE_ROOT, 'app');
const pages = [];
if (!fs.existsSync(pagesDir)) {
return pages;
}
// Rechercher les fichiers page.tsx/page.js
const pageFiles = readDirectoryRecursive(pagesDir, ['.tsx', '.ts', '.jsx', '.js'], 3)
.filter(file => file.name.startsWith('page.'));
pageFiles.forEach(file => {
try {
const content = fs.readFileSync(file.path, 'utf8');
const dirName = path.dirname(file.relativePath).replace('app', '').replace(/\\/g, '/');
const route = dirName === '' ? '/' : dirName;
// Extraire des informations du contenu
const hasGetData = content.includes('getHomepageData') || content.includes('getProjectsData') || content.includes('getCompetencesData');
const hasForm = content.includes('form') || content.includes('Form');
const hasCarousel = content.includes('carousel') || content.includes('Carousel');
const hasMarkdown = content.includes('ReactMarkdown') || content.includes('markdown');
pages.push({
route,
file: file.relativePath,
hasGetData,
hasForm,
hasCarousel,
hasMarkdown,
size: file.size
});
} catch (error) {
console.warn(`Erreur lors de l'analyse de ${file.path}:`, error.message);
}
});
return pages.sort((a, b) => a.route.localeCompare(b.route));
}
// Analyser les composants
function analyzeComponents() {
const componentsDir = path.join(SITE_ROOT, 'app/components');
const components = [];
if (!fs.existsSync(componentsDir)) {
return components;
}
const componentFiles = readDirectoryRecursive(componentsDir, ['.tsx', '.ts', '.jsx', '.js'], 2);
componentFiles.forEach(file => {
try {
const content = fs.readFileSync(file.path, 'utf8');
const componentName = path.basename(file.name, path.extname(file.name));
// Analyser le type de composant
const isLayout = content.includes('children') && (content.includes('header') || content.includes('nav'));
const isForm = content.includes('form') || content.includes('input') || content.includes('submit');
const isCarousel = content.includes('carousel') || content.includes('slide') || content.includes('swiper');
const isCard = content.includes('card') || componentName.toLowerCase().includes('card');
const usesStrapi = content.includes('apiUrl') || content.includes('populate');
components.push({
name: componentName,
file: file.relativePath,
isLayout,
isForm,
isCarousel,
isCard,
usesStrapi,
size: file.size
});
} catch (error) {
console.warn(`Erreur lors de l'analyse de ${file.path}:`, error.message);
}
});
return components.sort((a, b) => a.name.localeCompare(b.name));
}
// Analyser les utilitaires
function analyzeUtils() {
const utilsDir = path.join(SITE_ROOT, 'app/utils');
const utils = [];
if (!fs.existsSync(utilsDir)) {
return utils;
}
const utilFiles = readDirectoryRecursive(utilsDir, ['.tsx', '.ts', '.jsx', '.js'], 2);
utilFiles.forEach(file => {
try {
const content = fs.readFileSync(file.path, 'utf8');
const utilName = path.basename(file.name, path.extname(file.name));
// Analyser le type d'utilitaire
const isApiUtil = content.includes('fetch') || content.includes('api');
const isDataUtil = content.includes('populate') || content.includes('strapi');
const isHelperUtil = content.includes('export function') || content.includes('export const');
utils.push({
name: utilName,
file: file.relativePath,
isApiUtil,
isDataUtil,
isHelperUtil,
size: file.size
});
} catch (error) {
console.warn(`Erreur lors de l'analyse de ${file.path}:`, error.message);
}
});
return utils.sort((a, b) => a.name.localeCompare(b.name));
}
// Analyser la configuration
function analyzeConfig() {
const configs = [];
// Fichiers de configuration à analyser
const configFiles = [
'package.json',
'next.config.js',
'next.config.mjs',
'tailwind.config.js',
'tailwind.config.ts',
'tsconfig.json',
'web.config'
];
configFiles.forEach(configFile => {
const configPath = path.join(SITE_ROOT, configFile);
if (fs.existsSync(configPath)) {
try {
const content = fs.readFileSync(configPath, 'utf8');
let description = '';
switch (configFile) {
case 'package.json':
const pkg = JSON.parse(content);
description = `Dependencies: ${Object.keys(pkg.dependencies || {}).length}, DevDependencies: ${Object.keys(pkg.devDependencies || {}).length}`;
break;
case 'web.config':
description = 'Configuration IIS pour Windows Server';
break;
case 'next.config.js':
case 'next.config.mjs':
description = 'Configuration Next.js';
break;
case 'tailwind.config.js':
case 'tailwind.config.ts':
description = 'Configuration Tailwind CSS';
break;
case 'tsconfig.json':
description = 'Configuration TypeScript';
break;
}
configs.push({
file: configFile,
description,
size: fs.statSync(configPath).size
});
} catch (error) {
console.warn(`Erreur lors de l'analyse de ${configFile}:`, error.message);
}
}
});
return configs;
}
// Générer la documentation d'architecture
function generateArchitectureDoc() {
console.log('🏗️ Analyse de l\'architecture du site...\n');
const pages = analyzePages();
const components = analyzeComponents();
const utils = analyzeUtils();
const configs = analyzeConfig();
console.log(`📄 ${pages.length} pages trouvées`);
console.log(`🧩 ${components.length} composants trouvés`);
console.log(`🔧 ${utils.length} utilitaires trouvés`);
console.log(`⚙️ ${configs.length} fichiers de configuration trouvés`);
// Générer le contenu Markdown
let content = `# Architecture et Navigation - Site Fernand Gras-Calvet\n\n`;
content += `*Documentation générée automatiquement le ${new Date().toLocaleString('fr-FR')}*\n\n`;
content += `---\n\n`;
// Vue d'ensemble
content += `## 🏠 Vue d'ensemble du site\n\n`;
content += `**Site personnel et portfolio** de Fernand Gras-Calvet, étudiant à l'École 42 Perpignan.\n\n`;
content += `### Technologies principales\n`;
content += `- **Frontend :** Next.js, React, TypeScript, Tailwind CSS\n`;
content += `- **Backend :** Strapi (Headless CMS)\n`;
content += `- **Hébergement :** Windows Server 2025 + IIS\n`;
content += `- **Base de données :** PostgreSQL/MySQL\n\n`;
// Structure des pages
content += `## 📄 Structure des pages (${pages.length} pages)\n\n`;
if (pages.length > 0) {
content += `| Route | Fichier | Fonctionnalités |\n`;
content += `|-------|---------|----------------|\n`;
pages.forEach(page => {
const features = [];
if (page.hasGetData) features.push('📊 Données Strapi');
if (page.hasForm) features.push('📝 Formulaire');
if (page.hasCarousel) features.push('🎠 Carousel');
if (page.hasMarkdown) features.push('📝 Markdown');
content += `| \`${page.route}\` | ${page.file} | ${features.join(', ') || 'Page statique'} |\n`;
});
} else {
content += `*Aucune page trouvée dans le dossier app/*\n`;
}
content += `\n`;
// Navigation et UX
content += `## 🧭 Navigation et expérience utilisateur\n\n`;
content += `### Sections principales\n`;
content += `1. **Accueil** (\`/\`) - Présentation personnelle et CV\n`;
content += `2. **Projets** - Portfolio des projets École 42\n`;
content += `3. **Compétences** - Domaines d'expertise (IA, Web, 3D, Domotique)\n`;
content += `4. **Contact** - Formulaire de contact\n\n`;
content += `### Fonctionnalités interactives\n`;
const hasCarousel = pages.some(p => p.hasCarousel) || components.some(c => c.isCarousel);
const hasForm = pages.some(p => p.hasForm) || components.some(c => c.isForm);
if (hasCarousel) content += `- 🎠 **Carousel d'images** pour présenter les projets\n`;
if (hasForm) content += `- 📝 **Formulaire de contact** interactif\n`;
content += `- 🔍 **Glossaire interactif** avec détection automatique de mots-clés\n`;
content += `- 📱 **Design responsive** adaptatif\n`;
content += `- ⚡ **Chargement rapide** grâce à Next.js\n\n`;
// Composants
if (components.length > 0) {
content += `## 🧩 Composants React (${components.length} composants)\n\n`;
const layoutComponents = components.filter(c => c.isLayout);
const formComponents = components.filter(c => c.isForm);
const carouselComponents = components.filter(c => c.isCarousel);
const cardComponents = components.filter(c => c.isCard);
const strapiComponents = components.filter(c => c.usesStrapi);
if (layoutComponents.length > 0) {
content += `### 🏗️ Composants de mise en page\n`;
layoutComponents.forEach(comp => {
content += `- **${comp.name}** - Layout principal avec navigation\n`;
});
content += `\n`;
}
if (strapiComponents.length > 0) {
content += `### 📊 Composants connectés à Strapi\n`;
strapiComponents.forEach(comp => {
content += `- **${comp.name}** - Récupère et affiche des données du CMS\n`;
});
content += `\n`;
}
if (formComponents.length > 0) {
content += `### 📝 Composants de formulaire\n`;
formComponents.forEach(comp => {
content += `- **${comp.name}** - Gestion des saisies utilisateur\n`;
});
content += `\n`;
}
if (carouselComponents.length > 0) {
content += `### 🎠 Composants de carousel\n`;
carouselComponents.forEach(comp => {
content += `- **${comp.name}** - Affichage rotatif d'images\n`;
});
content += `\n`;
}
}
// Utilitaires
if (utils.length > 0) {
content += `## 🔧 Utilitaires et helpers (${utils.length} fichiers)\n\n`;
const apiUtils = utils.filter(u => u.isApiUtil);
const dataUtils = utils.filter(u => u.isDataUtil);
if (apiUtils.length > 0) {
content += `### 🌐 Utilitaires API\n`;
apiUtils.forEach(util => {
content += `- **${util.name}** - Gestion des appels API\n`;
});
content += `\n`;
}
if (dataUtils.length > 0) {
content += `### 📊 Utilitaires de données\n`;
dataUtils.forEach(util => {
content += `- **${util.name}** - Traitement des données Strapi\n`;
});
content += `\n`;
}
}
// Flux de données
content += `## 🔄 Flux de données\n\n`;
content += `### Architecture Headless CMS\n`;
content += `1. **Strapi** (Backend) stocke le contenu\n`;
content += `2. **API REST** expose les données (\`/api/projects\`, \`/api/competences\`, etc.)\n`;
content += `3. **Next.js** (Frontend) récupère et affiche les données\n`;
content += `4. **Génération statique** pour les performances\n\n`;
content += `### Endpoints Strapi utilisés\n`;
content += `- \`/api/homepages?populate=*\` - Contenu de la page d'accueil\n`;
content += `- \`/api/projects?populate=*\` - Liste des projets (17 projets)\n`;
content += `- \`/api/competences?populate=*\` - Compétences (4 domaines)\n`;
content += `- \`/api/messages\` - Messages du formulaire de contact\n\n`;
// Configuration
if (configs.length > 0) {
content += `## ⚙️ Configuration et déploiement\n\n`;
configs.forEach(config => {
content += `- **${config.file}** - ${config.description}\n`;
});
content += `\n`;
}
// Guide pour le chatbot
content += `## 🤖 Guide pour l'assistant IA\n\n`;
content += `### Comment guider les visiteurs\n`;
content += `- **Page d'accueil** : Présentation générale, CV, parcours\n`;
content += `- **Section Projets** : Portfolio technique, projets École 42\n`;
content += `- **Section Compétences** : Expertise IA, développement web, impression 3D, domotique\n`;
content += `- **Formulaire de contact** : Pour prendre contact directement\n\n`;
content += `### Phrases d'orientation suggérées\n`;
content += `- *"Vous pouvez consulter mes projets dans la section dédiée"*\n`;
content += `- *"Ma présentation complète se trouve sur la page d'accueil"*\n`;
content += `- *"Pour en savoir plus sur mes compétences en [domaine], consultez la section Compétences"*\n`;
content += `- *"N'hésitez pas à me contacter via le formulaire de contact"*\n\n`;
// Métadonnées techniques
content += `---\n\n`;
content += `*Analyse générée automatiquement - ${pages.length} pages, ${components.length} composants, ${utils.length} utilitaires analysés*`;
// Sauvegarder le fichier
const outputPath = path.join(DOCS_DIR, OUTPUT_FILE);
fs.writeFileSync(outputPath, content, 'utf8');
console.log(`\n✅ Documentation d'architecture générée : ${OUTPUT_FILE}`);
console.log(`📁 Sauvegardée dans : ${outputPath}`);
console.log(`📊 ${content.length} caractères de documentation générés`);
return {
pages: pages.length,
components: components.length,
utils: utils.length,
configs: configs.length,
outputFile: OUTPUT_FILE,
contentLength: content.length
};
}
// Exécuter l'analyse
generateArchitectureDoc().catch(console.error);

View File

@ -0,0 +1,164 @@
const fs = require('fs');
const path = require('path');
// Configuration
const RAW_DATA_DIR = './extract/raw';
const CLEAN_DATA_DIR = './extract/clean-data';
// Créer le dossier de sortie
if (!fs.existsSync(CLEAN_DATA_DIR)) {
fs.mkdirSync(CLEAN_DATA_DIR, { recursive: true });
}
// Fonctions de nettoyage par type de contenu
const cleaners = {
// Nettoyer les projets - garder seulement l'essentiel
projects: (data) => {
return data.data.map(project => ({
id: project.id,
name: project.name,
description: project.description,
slug: project.slug,
resum: project.Resum, // Contenu détaillé principal
link: project.link,
order: project.order,
// Garder seulement le nombre d'images (pour info)
imageCount: project.picture ? project.picture.length : 0
}));
},
// Nettoyer les compétences
competences: (data) => {
return data.data.map(competence => ({
id: competence.id,
name: competence.name,
content: competence.content, // Contenu principal
slug: competence.slug,
order: competence.order,
imageCount: competence.picture ? competence.picture.length : 0
}));
},
// Nettoyer les messages (optionnel pour documentation)
messages: (data) => {
return data.data.map(message => ({
id: message.id,
name: message.name,
email: message.email,
message: message.message,
// Extraire juste la date du message si présente
sentDate: extractDateFromMessage(message.message)
}));
}
};
// Fonction utilitaire pour extraire la date des messages
function extractDateFromMessage(messageText) {
const dateMatch = messageText.match(/📅 Envoyé le : (.+)/);
return dateMatch ? dateMatch[1] : null;
}
// Fonction principale de nettoyage
async function cleanAllData() {
console.log('🧹 Début du nettoyage des données...\n');
const results = [];
// Traiter chaque type de données
for (const [type, cleaner] of Object.entries(cleaners)) {
try {
const rawFile = path.join(RAW_DATA_DIR, `${type}-raw.json`);
// Vérifier si le fichier existe
if (!fs.existsSync(rawFile)) {
console.log(`⚠️ ${type}: fichier raw non trouvé, ignoré`);
continue;
}
console.log(`🔄 Nettoyage de ${type}...`);
// Lire les données brutes
const rawData = JSON.parse(fs.readFileSync(rawFile, 'utf8'));
// Nettoyer les données
const cleanData = cleaner(rawData);
// Calculer la réduction de taille
const rawSize = fs.statSync(rawFile).size;
const cleanJson = JSON.stringify(cleanData, null, 2);
const cleanSize = Buffer.byteLength(cleanJson, 'utf8');
const reduction = ((rawSize - cleanSize) / rawSize * 100).toFixed(1);
// Sauvegarder les données nettoyées
const cleanFile = path.join(CLEAN_DATA_DIR, `${type}-clean.json`);
fs.writeFileSync(cleanFile, cleanJson, 'utf8');
console.log(`${type}: ${cleanData.length} éléments nettoyés`);
console.log(` 📦 Taille réduite de ${reduction}% (${rawSize}${cleanSize} bytes)`);
results.push({
type,
success: true,
itemCount: cleanData.length,
rawSize,
cleanSize,
reduction: `${reduction}%`
});
} catch (error) {
console.error(`❌ Erreur lors du nettoyage de ${type}:`, error.message);
results.push({
type,
success: false,
error: error.message
});
}
}
// Résumé final
console.log('\n📊 Résumé du nettoyage:');
console.log('=========================');
let totalRawSize = 0;
let totalCleanSize = 0;
let successCount = 0;
results.forEach(result => {
if (result.success) {
console.log(`${result.type}: ${result.itemCount} éléments (${result.reduction} de réduction)`);
totalRawSize += result.rawSize;
totalCleanSize += result.cleanSize;
successCount++;
} else {
console.log(`${result.type}: ${result.error}`);
}
});
const totalReduction = ((totalRawSize - totalCleanSize) / totalRawSize * 100).toFixed(1);
console.log(`\n🎯 ${successCount}/${Object.keys(cleaners).length} types nettoyés avec succès`);
console.log(`📦 Réduction totale: ${totalReduction}% (${totalRawSize}${totalCleanSize} bytes)`);
console.log(`📁 Données nettoyées sauvegardées dans ${CLEAN_DATA_DIR}/`);
// Sauvegarder le résumé
const summary = {
cleanedAt: new Date().toISOString(),
results: results,
totalTypes: Object.keys(cleaners).length,
successfulTypes: successCount,
totalReduction: `${totalReduction}%`,
rawSize: totalRawSize,
cleanSize: totalCleanSize
};
fs.writeFileSync(
path.join(CLEAN_DATA_DIR, 'cleaning-summary.json'),
JSON.stringify(summary, null, 2),
'utf8'
);
console.log('📄 Résumé sauvegardé dans cleaning-summary.json');
}
// Exécuter le script
cleanAllData().catch(console.error);

View File

@ -0,0 +1,34 @@
# Projets de Fernand Gras-Calvet
Cette section présente les 17 projets réalisés dans le cadre de ma formation à l'École 42 et de mon parcours en développement.
## Liste des projets
1. **[push_swap](push-swap.md)** - Le projet push_swap de l'école 42 consiste à trier une liste d'entiers en utilisant uniquement un ensemble limité d'opérations sur deux piles (A et B). Lobjectif est de trouver lalgorithme de tri le plus efficace pour minimiser le nombre de mouvements. Ce projet permet dexplorer la gestion des structures de données (piles), loptimisation des algorithmes de tri, et la complexité algorithmique, tout en respectant des contraintes strictes dexécution.
2. **[minitalk](minitalk.md)** - Le projet Minitalk de l'école 42 consiste à établir une communication inter-processus (IPC) entre un serveur et un client en utilisant uniquement les signaux UNIX (SIGUSR1 et SIGUSR2). Le client envoie un message caractère par caractère sous forme binaire, tandis que le serveur le reçoit, le reconstruit et l'affiche. Ce projet permet dapprendre la gestion des signaux, la conversion binaire et la synchronisation des processus en C.
3. **[philosopher](philosopher.md)** - Le projet Philosopher de l'école 42 consiste à résoudre le problème des philosophes mangeurs, un exercice classique de programmation concurrente. Il met en œuvre des threads ou processus pour simuler des philosophes partageant des fourchettes et alternant entre les états manger, penser et dormir, tout en évitant les problèmes de deadlock et starvation. Ce projet permet dapprendre la gestion des threads (pthread), lutilisation des mutex et sémaphores, ainsi que la synchronisation des ressources partagées.
4. **[minishell](minishell.md)** - Le projet Minishell de l'école 42 consiste à coder un interpréteur de commandes minimaliste, inspiré de bash. Il permet dexécuter des commandes via un prompt interactif, en gérant les processus, les pipes (|), les redirections (<, >, >>, <<), et les signaux (Ctrl+C, Ctrl+D). Il inclut aussi des built-ins (echo, cd, pwd, export, env, unset, exit). Ce projet développe des compétences essentielles en programmation système, gestion de la mémoire et manipulation des processus sous Unix.
5. **[netpractice](netpractice.md)** - Le projet NetPractice est essentiel pour acquérir une compréhension pratique des réseaux informatiques, une compétence cruciale pour les administrateurs système et les ingénieurs réseau. Il offre une base solide pour des projets plus avancés impliquant la communication réseau et la gestion des infrastructures.
6. **[inception](inception.md)** - Le projet Inception de l'école 42 consiste à déployer une infrastructure basée sur Docker et Docker Compose, en isolant plusieurs services dans des conteneurs distincts. Il inclut la configuration d'un serveur web (Nginx), d'une base de données (MariaDB/MySQL) et d'une application web (WordPress), tout en assurant la sécurisation, la persistance des données et lautomatisation du déploiement. Ce projet permet dacquérir des compétences en virtualisation, gestion de conteneurs et administration système.
7. **[Born2beroot](born2beroot.md)** - Le projet Born2beroot de l'école 42 est une initiation à ladministration système sous Linux. L'objectif est de configurer un serveur sécurisé en installant une machine virtuelle sous Debian ou AlmaLinux, en mettant en place des politiques de sécurité strictes (gestion des utilisateurs, restrictions SSH, pare-feu UFW, Fail2ban) et en utilisant LVM pour la gestion des volumes de stockage. Les étudiants doivent également automatiser la surveillance du système avec un script monitoring.sh. Ce projet développe des compétences en sécurité informatique, gestion des serveurs et DevOps, essentielles pour les métiers dadministrateur système ou de cybersécurité.
8. **[Get_next_line](get-next-line.md)** - Le projet get_next_line de l'école 42 consiste à implémenter une fonction en C capable de lire une ligne à la fois depuis un descripteur de fichier, sans recharger tout le fichier en mémoire. Pour cela, il utilise une lecture par blocs (BUFFER_SIZE), des variables statiques pour conserver les données non traitées entre les appels, et une gestion efficace des descripteurs de fichiers multiples. Ce projet est essentiel pour apprendre la manipulation des fichiers en C, la gestion dynamique de la mémoire et l'optimisation des entrées/sorties
9. **[cpp-partie1](cpp-partie1.md)** - Les modules CPP 00 à 04 de l'école 42 sont une introduction progressive au langage C++ et à la programmation orientée objet (POO). Ils couvrent les bases du C++ (classes, objets, fonctions membres, références, mémoire), la surcharge d'opérateurs, l'héritage, et le polymorphisme. Ces modules permettent d'acquérir une compréhension solide du modèle objet du C++, essentielle pour le développement logiciel et les projets avancés en POO.
10. **[cpp-partie2](cpp-partie2.md)** - Les modules CPP 04 à 09 de l'école 42 approfondissent les concepts avancés du C++, notamment le polymorphisme, la gestion des exceptions, les casts, les templates génériques, et l'utilisation de la STL (Standard Template Library). Ils permettent d'acquérir des compétences essentielles en programmation orientée objet, conception modulaire et optimisation du code, préparant les étudiants à des projets logiciels complexes en C++.
11. **[cub3d](cub3d.md)** - Le projet Cub3D de l'école 42 consiste à coder un moteur graphique en C, inspiré de Wolfenstein 3D, utilisant la technique du raycasting pour afficher une vue en pseudo-3D à partir d'une carte 2D. Il intègre la gestion des mouvements du joueur, des textures, des redirections de caméra, et des événements clavier/souris via MiniLibX. Ce projet développe des compétences en programmation graphique, manipulation des fichiers de configuration et gestion des collisions
12. **[fract-ol](fract-ol.md)** - Le projet fract-ol de l'école 42 consiste à générer et afficher des fractales (Mandelbrot, Julia, etc.) en utilisant la bibliothèque graphique MiniLibX. Il permet dexplorer la programmation graphique en C, la manipulation des nombres complexes, et loptimisation des calculs pour le rendu dimages. Les utilisateurs peuvent interagir avec les fractales via le clavier et la souris pour zoomer, naviguer et modifier les paramètres en temps réel.
13. **[ft-irc](ft-irc.md)** - Le projet ft_irc de l'école 42 consiste à coder un serveur IRC (Internet Relay Chat) en C++, conforme à la RFC 2812. Il permet de gérer plusieurs connexions clients, d'implémenter des commandes IRC (JOIN, PART, PRIVMSG, NICK, etc.), de gérer des canaux de discussion, et dassurer lauthentification des utilisateurs. Ce projet développe des compétences en programmation réseau, gestion des sockets et protocoles de communication.
14. **[ft_transcendence](ft-transcendence.md)** - Le projet ft_transcendence de l'école 42 est une application web full-stack développée en équipe, combinant un jeu de Pong multijoueur et un chat en temps réel. Le frontend est conçu avec HTML, CSS et JavaScript, tandis que le backend repose sur Django et WebSockets pour gérer la logique du jeu et des interactions en temps réel. L'application est conteneurisée avec Docker, et utilise PostgreSQL pour la gestion des données. Vous avez principalement travaillé sur l'implémentation du chat en jeu, permettant aux joueurs de communiquer en direct, et l'infrastructure est surveillée via Elasticsearch et Kibana pour le monitoring.
15. **[Présentation école 42 ](presentation-ecole-42.md)** - L'École 42 Perpignan est un établissement d'enseignement en informatique, gratuit et ouvert à tous, basé sur une pédagogie innovante sans cours ni professeurs. Les étudiants y apprennent de manière collaborative et autonome à travers des projets pratiques, dans un environnement moderne et accessible 24h/24.
16. **[libft](libft.md)** - Le projet Libft de l'École 42 consiste à recréer une bibliothèque standard en C, comprenant des fonctions essentielles de manipulation de chaînes, de gestion de mémoire et de structures de données comme les listes chaînées. Ce projet vise à renforcer la maîtrise du langage C, à développer des compétences en gestion de mémoire dynamique, et à produire une bibliothèque modulaire et réutilisable pour des projets futurs.
17. **[Ft-printf](ft-printf.md)** - Le projet ft_printf de l'école 42 consiste à reproduire la fonction printf du langage C. Il permet aux étudiants de comprendre la manipulation des chaînes de formatage, et l'affichage de différents types de données (%d, %s, %p, %x…). Lobjectif est dimplémenter une fonction efficace, sans utiliser printf, en travaillant directement avec write. Ce projet développe des compétences essentielles en programmation bas niveau, gestion mémoire et optimisation du code C.
## Technologies et compétences développées
Ces projets couvrent plusieurs domaines clés :
- **Programmation système** : Gestion des processus, signaux UNIX, communication inter-processus
- **Algorithmes et structures de données** : Tri, piles, optimisation algorithmique
- **Programmation concurrente** : Threads, mutex, synchronisation
- **Développement web** : Next.js, React, API REST, hébergement
- **Réseaux** : TCP/IP, routage, configuration réseau

View File

@ -0,0 +1,10 @@
# Compétences de Fernand Gras-Calvet
Cette section présente mes 4 domaines de compétences principaux.
## Domaines d'expertise
1. **[Mon Exploration et Maîtrise de lIntelligence Artificielle](ia.md)**
2. **[Développement Web & Hébergement sur serveur Windows](developpement-web-and-hebergement-sur-serveur-windows.md)**
3. **[Mon parcours dans limpression 3D](impression-3d.md)**
4. **[Mon expérience dans la domotique](competence.md)**

View File

@ -0,0 +1,114 @@
# Architecture et Navigation - Site Fernand Gras-Calvet
*Documentation générée automatiquement le 15/03/2026 15:26:57*
---
## 🏠 Vue d'ensemble du site
**Site personnel et portfolio** de Fernand Gras-Calvet, étudiant à l'École 42 Perpignan.
### Technologies principales
- **Frontend :** Next.js, React, TypeScript, Tailwind CSS
- **Backend :** Strapi (Headless CMS)
- **Hébergement :** Windows Server 2025 + IIS
- **Base de données :** PostgreSQL/MySQL
## 📄 Structure des pages (7 pages)
| Route | Fichier | Fonctionnalités |
|-------|---------|----------------|
| `/` | app\page.tsx | 📊 Données Strapi, 📝 Formulaire, 📝 Markdown |
| `/admin/messages` | app\admin\messages\page.tsx | Page statique |
| `/competences` | app\competences\page.jsx | 📝 Formulaire, 🎠 Carousel |
| `/competences/[slug]` | app\competences\[slug]\page.tsx | Page statique |
| `/contact` | app\contact\page.js | 📝 Formulaire |
| `/portfolio` | app\portfolio\page.jsx | 📝 Formulaire, 🎠 Carousel |
| `/portfolio/[slug]` | app\portfolio\[slug]\page.tsx | Page statique |
## 🧭 Navigation et expérience utilisateur
### Sections principales
1. **Accueil** (`/`) - Présentation personnelle et CV
2. **Projets** - Portfolio des projets École 42
3. **Compétences** - Domaines d'expertise (IA, Web, 3D, Domotique)
4. **Contact** - Formulaire de contact
### Fonctionnalités interactives
- 🎠 **Carousel d'images** pour présenter les projets
- 📝 **Formulaire de contact** interactif
- 🔍 **Glossaire interactif** avec détection automatique de mots-clés
- 📱 **Design responsive** adaptatif
- ⚡ **Chargement rapide** grâce à Next.js
## 🧩 Composants React (10 composants)
### 📊 Composants connectés à Strapi
- **ContentSection** - Récupère et affiche des données du CMS
- **ContentSectionCompetences** - Récupère et affiche des données du CMS
- **ModalGlossaire** - Récupère et affiche des données du CMS
### 📝 Composants de formulaire
- **Carousel** - Gestion des saisies utilisateur
- **CarouselCompetences** - Gestion des saisies utilisateur
- **ChatBot** - Gestion des saisies utilisateur
- **ContactForm** - Gestion des saisies utilisateur
- **ContentSection** - Gestion des saisies utilisateur
- **ContentSectionCompetences** - Gestion des saisies utilisateur
- **ModalGlossaire** - Gestion des saisies utilisateur
### 🎠 Composants de carousel
- **Carousel** - Affichage rotatif d'images
- **CarouselCompetences** - Affichage rotatif d'images
## 🔧 Utilitaires et helpers (6 fichiers)
### 🌐 Utilitaires API
- **askAI** - Gestion des appels API
- **fetchData** - Gestion des appels API
- **fetchDataCompetences** - Gestion des appels API
- **getApiUrl** - Gestion des appels API
- **sendMessage** - Gestion des appels API
### 📊 Utilitaires de données
- **fetchData** - Traitement des données Strapi
- **fetchDataCompetences** - Traitement des données Strapi
## 🔄 Flux de données
### Architecture Headless CMS
1. **Strapi** (Backend) stocke le contenu
2. **API REST** expose les données (`/api/projects`, `/api/competences`, etc.)
3. **Next.js** (Frontend) récupère et affiche les données
4. **Génération statique** pour les performances
### Endpoints Strapi utilisés
- `/api/homepages?populate=*` - Contenu de la page d'accueil
- `/api/projects?populate=*` - Liste des projets (17 projets)
- `/api/competences?populate=*` - Compétences (4 domaines)
- `/api/messages` - Messages du formulaire de contact
## ⚙️ Configuration et déploiement
- **package.json** - Dependencies: 15, DevDependencies: 7
- **tailwind.config.ts** - Configuration Tailwind CSS
- **tsconfig.json** - Configuration TypeScript
- **web.config** - Configuration IIS pour Windows Server
## 🤖 Guide pour l'assistant IA
### Comment guider les visiteurs
- **Page d'accueil** : Présentation générale, CV, parcours
- **Section Projets** : Portfolio technique, projets École 42
- **Section Compétences** : Expertise IA, développement web, impression 3D, domotique
- **Formulaire de contact** : Pour prendre contact directement
### Phrases d'orientation suggérées
- *"Vous pouvez consulter mes projets dans la section dédiée"*
- *"Ma présentation complète se trouve sur la page d'accueil"*
- *"Pour en savoir plus sur mes compétences en [domaine], consultez la section Compétences"*
- *"N'hésitez pas à me contacter via le formulaire de contact"*
---
*Analyse générée automatiquement - 7 pages, 10 composants, 6 utilitaires analysés*

View File

@ -0,0 +1,26 @@
# Documentation complète - Fernand Gras-Calvet
Cette documentation a été générée automatiquement à partir des données Strapi.
**Généré le :** 15/03/2026 15:26:54
## Structure de la documentation
### Projects
- 17 éléments source
- 18 fichiers générés
- Fichiers : 01-projects-index.md, project-pushswap.md, project-minitalk.md, project-philosopher.md, project-minishell.md, project-netpractice.md, project-inception.md, project-born2beroot.md, project-getnextline.md, project-cpp-partie1.md, project-cpp-partie2.md, project-cub3d.md, project-fract-ol.md, project-ft-irc.md, project-fttranscendence.md, project-prsentation-cole-42-.md, project-libft.md, project-ft-printf.md
### Competences
- 4 éléments source
- 5 fichiers générés
- Fichiers : 02-competences-index.md, competence-ia.md, competence-developpement-web-and-hebergement-sur-serveur-windows.md, competence-impression-3d.md, competence-competence.md
## Utilisation pour base vectorielle
Ces fichiers Markdown sont optimisés pour l'intégration dans une base de connaissances vectorielle :
- Contenu textuel uniquement (pas d'images)
- Structure hiérarchique claire
- Métadonnées préservées
- Format Markdown standard

View File

@ -0,0 +1,20 @@
# Mon expérience dans la domotique
**Slug :** `competence`
**Ordre d'affichage :** 4
---
Depuis plusieurs années, la domotique a connu une évolution fulgurante, rendant accessible à tous des solutions permettant d'automatiser et d'optimiser son environnement quotidien. Fasciné par cet univers, jai entrepris dexplorer les différentes technologies permettant de connecter, centraliser et contrôler efficacement les objets intelligents au sein dun écosystème domestique unifié.
Convaincu que la domotique doit rester abordable et accessible, jai recherché des solutions qui allient simplicité dinstallation, compatibilité et flexibilité. Très rapidement, je me suis intéressé à lécosystème Tuya, qui offre une large gamme dappareils connectés tout en permettant une gestion centralisée. Bien que Tuya repose sur une architecture cloud, jai exploré des solutions open source permettant dintégrer et dinterconnecter ces appareils tout en optimisant lautonomie et la confidentialité des données.
Dans cette démarche, jai approfondi lutilisation de Home Assistant, une plateforme open-source puissante qui permet dagréger et de gérer un nombre considérable de dispositifs connectés. Lun de mes principaux objectifs a été de développer une solution de contrôle unifiée, permettant d'automatiser différents appareils et scénarios en fonction des besoins du quotidien (éclairage intelligent, gestion thermique, sécurité, capteurs environnementaux, etc.).
Jai également expérimenté les possibilités offertes par lauto-hébergement des serveurs domotiques, réduisant ainsi la dépendance aux plateformes cloud et garantissant une meilleure maîtrise des données personnelles. Lintégration de protocoles de communication ouverts tels que Zigbee, MQTT ou Matter ma permis dexplorer des alternatives plus résilientes, évolutives et personnalisables pour bâtir un environnement domotique intelligent, modulable et sécurisé.
Aujourdhui, je continue dapprofondir mes connaissances dans ce domaine en explorant les nouvelles générations dobjets connectés, loptimisation des scénarios dautomatisation avancés, ainsi que lintégration de solutions basées sur lintelligence artificielle afin daméliorer ladaptabilité et lefficacité des systèmes domotiques. Mon objectif est datteindre un équilibre entre simplicité dusage, interopérabilité et autonomie, tout en offrant une expérience fluide et intuitive pour un habitat véritablement intelligent et connecté.
---
*Cette compétence est illustrée par 12 images sur le site.*

View File

@ -0,0 +1,114 @@
# Développement Web & Hébergement sur serveur Windows
**Slug :** `developpement-web-and-hebergement-sur-serveur-windows`
**Ordre d'affichage :** 2
---
J'ai réalisé ce projet afin d'étendre mes compétences en développement Web.
Ce projet est un site web basé sur Next.js pour le frontend et Strapi pour le backend, hébergé sur un serveur Windows Server 2025 avec IIS comme serveur web. Il repose sur une architecture Headless CMS, où le contenu est géré via une API REST et affiché dynamiquement sur le frontend.
🔹 Technologies utilisées
Frontend (Client) :
Framework : Next.js (React, TypeScript, Server-Side Rendering & Static Generation)
Styling : Tailwind CSS
Gestion des requêtes API : Fetch API (avec qs pour structurer les requêtes)
SEO & Performance : Optimisation des images, pré-rendu des pages
Backend (Serveur) :
CMS : Strapi (Node.js, API REST)
Base de données : PostgreSQL ou MySQL
Hébergement : IIS sur Windows Server 2025
Sécurité : HTTPS activé via Win-ACME (Lets Encrypt)
Déploiement & Infrastructure :
Système dexploitation : Windows Server 2025
Serveur Web : IIS 10 (gestion des proxys et reverse proxy pour Next.js & Strapi)
Gestion des certificats SSL : Win-ACME pour le renouvellement automatique des certificats HTTPS
Monitoring : Logs IIS + Console Next.js & Strapi
🔹 Fonctionnalités du site
✅ Affichage dynamique des compétences (compétences récupérées via API Strapi)
✅ Glossaire interactif avec mots-clés détectés dynamiquement
✅ Carousel d'images pour présenter les compétences
✅ Navigation rapide et fluide grâce à Next.js
✅ SEO optimisé via les pages statiques et le rendu dynamique
Ce projet est toujours en développement, je l'agrémenterai de contenu au fil du temps.
Il m'a permis brièvement de me familiariser a plusieurs domaines.
1⃣ Développement Web 🌐
Ce projet est principalement un site web dynamique reposant sur Next.js et Strapi, ce qui le place dans la catégorie du développement web moderne.
Frontend (Next.js, React, TypeScript) → Développement web côté client
Backend (Strapi, Node.js, API REST) → Développement web côté serveur
API et Headless CMS → Gestion de contenu via une API
2⃣ Hébergement et Administration Systèmes 🖥️
Étant donné que le site est auto-hébergé sur un serveur Windows Server 2025 avec IIS, il appartient aussi à la catégorie administration système et hébergement web.
Configuration dun serveur web (IIS, Windows Server 2025)
Gestion des certificats SSL avec Win-ACME (HTTPS, sécurité)
Base de données (PostgreSQL ou MySQL)
Surveillance et gestion des performances (logs IIS, monitoring)
3⃣ Cloud & DevOps (partiellement) ☁️
Même si ce projet nutilise pas un service cloud public (Azure, AWS, GCP), il comporte des éléments liés à lautomatisation et à la gestion des déploiements.
Déploiement dune application Next.js & Strapi sur un serveur dédié
Gestion des certificats SSL automatisée (Win-ACME, Let's Encrypt)
Possibilité dextensions avec CI/CD pour automatiser les mises à jour
4⃣ Sécurité Informatique 🔒
Avec limplémentation du HTTPS, de lauthentification API et de la gestion des accès via Strapi et IIS, ce projet a aussi un aspect cybersécurité.
Chiffrement des connexions avec SSL/TLS (HTTPS activé)
Protection des API (Cors, Access-Control-Allow-Origin, JWT si activé dans Strapi)
Gestion des permissions et authentification des utilisateurs (Strapi)
5⃣ Expérience Utilisateur & SEO 📈
Le projet est conçu pour être rapide, interactif et optimisé pour le référencement.
SEO optimisé avec Next.js (Static Generation, Server-Side Rendering)
Performance améliorée grâce au préchargement et à la mise en cache
Expérience utilisateur fluide avec des animations et une navigation rapide
---
*Cette compétence est illustrée par 3 images sur le site.*

View File

@ -0,0 +1,20 @@
# Mon Exploration et Maîtrise de lIntelligence Artificielle
**Slug :** `ia`
**Ordre d'affichage :** 1
---
Comme beaucoup, jai découvert lintelligence artificielle grand public avec larrivée de ChatGPT, qui a marqué un tournant décisif dans laccessibilité et la démocratisation de cette technologie. En lespace de quelques mois, le domaine a connu une expansion fulgurante, avec lémergence dune multitude de solutions exploitant lIA sous diverses formes. Fasciné par ces avancées, jai rapidement développé un vif intérêt pour plusieurs applications, notamment la génération dimages, les chatbots intelligents et plus largement les modèles de langage avancés (LLMs).
Dans cette quête dexploration, jai expérimenté des solutions dIA locale, notamment avec Ollama, LLM Studio, et dautres outils permettant une plus grande maîtrise et personnalisation des modèles. Mon objectif a été de comprendre en profondeur les capacités dintégration de ces intelligences artificielles locales, en explorant lentraînement de modèles personnalisés, loptimisation des performances et laffinement des interactions par lingénierie des prompts (cliquez sur IA locale test mistral 7b sur mon serveur).
Actuellement, je suis en phase dinstallation et de déploiement de solutions dIA locale sur mon propre serveur, un projet en cours de développement qui me permet dexpérimenter les configurations avancées et dadapter ces modèles à des cas dusage spécifiques. Cette démarche sinscrit dans une volonté de maîtriser lIA en environnement auto-hébergé, offrant ainsi une meilleure compréhension de la gestion des ressources, du fine-tuning des modèles et des défis liés à linfrastructure.
Parallèlement, jai entrepris une spécialisation en Data Science et Intelligence Artificielle au sein de lÉcole 42, afin dapprofondir mes connaissances théoriques et pratiques dans ce domaine en perpétuelle évolution. Cette formation me permet daller encore plus loin dans lanalyse des algorithmes de machine learning et deep learning, dexplorer des approches avancées en traitement des données massives, et de perfectionner mes compétences en développement et intégration de solutions IA appliquées.
Animé par une passion pour lintelligence artificielle et ses innombrables possibilités, je continue de minformer, dexpérimenter et dappliquer ces technologies à des projets concrets. Mon objectif est dacquérir une expertise approfondie pour concevoir des systèmes intelligents performants, adaptables et innovants, tout en restant à la pointe des avancées technologiques.
---
*Cette compétence est illustrée par 9 images sur le site.*

View File

@ -0,0 +1,22 @@
# Mon parcours dans limpression 3D
**Slug :** `impression-3d`
**Ordre d'affichage :** 3
---
Jai découvert lunivers fascinant de limpression 3D en 2018, ce qui a immédiatement éveillé ma curiosité pour cette technologie en pleine expansion. Désireux den apprendre davantage, jai entrepris mes premières expérimentations en impression FDM (Fused Deposition Modeling) en utilisant une imprimante Alfawise U30. Cette première immersion ma permis de me familiariser avec les fondamentaux de limpression 3D, notamment la calibration de la machine, la compréhension des paramètres dimpression et loptimisation des premiers prototypes.
En 2020, jai enrichi mon expérience en intégrant à mon parc une Sidewinder X2, une imprimante plus performante qui ma offert la possibilité dexplorer davantage les subtilités des différents slicers disponibles sur le marché, tels que Ultimaker Cura, PrusaSlicer et OrcaSlicer. Parallèlement, jai approfondi mes compétences en modélisation 3D en me formant à lutilisation de logiciels spécialisés, en particulier Fusion 360, qui constitue aujourdhui un outil incontournable dans mon flux de travail.
Lapprentissage des différents firmwares, notamment Marlin et Klipper, a constitué une étape essentielle de mon évolution. Jai ainsi acquis des compétences approfondies dans la configuration et loptimisation des paramètres machines, ce qui ma permis de mieux comprendre leur fonctionnement, dassurer leur maintenance et dintervenir efficacement en cas de dysfonctionnement.
Aujourdhui, mon expertise sest consolidée grâce à lutilisation dimprimantes plus avancées telles que la Bambu Lab X1C et la P1P, qui me permettent de réaliser des impressions de haute précision avec une grande diversité de matériaux. En effet, je maîtrise désormais limpression avec divers filaments techniques et composites, notamment le PLA, ABS, ASA, Nylon, TPU, ainsi que des impressions en multi-matériaux nécessitant des paramètres dimpression spécifiques.
Grâce à ces expériences, jai développé une parfaite connaissance des conditions optimales requises pour chaque matériau, telles que la gestion des températures, ladhérence au plateau, lhygrométrie, la ventilation ou encore la gestion du warping. Mon parcours ma ainsi permis dacquérir une solide autonomie dans lexploitation des imprimantes 3D, tant sur le plan technique que logiciel, et dapprofondir ma compréhension des défis liés à limpression de pièces complexes ou fonctionnelles.
Aujourdhui passionné par limpression 3D, je continue dexplorer les innovations du secteur, de perfectionner mes compétences et dexpérimenter de nouvelles approches afin doptimiser la qualité et la fiabilité des impressions.
---
*Cette compétence est illustrée par 8 images sur le site.*

View File

@ -0,0 +1,48 @@
{
"generatedAt": "2026-03-15T14:26:54.969Z",
"results": [
{
"type": "projects",
"success": true,
"itemCount": 17,
"docCount": 18,
"files": [
"01-projects-index.md",
"project-pushswap.md",
"project-minitalk.md",
"project-philosopher.md",
"project-minishell.md",
"project-netpractice.md",
"project-inception.md",
"project-born2beroot.md",
"project-getnextline.md",
"project-cpp-partie1.md",
"project-cpp-partie2.md",
"project-cub3d.md",
"project-fract-ol.md",
"project-ft-irc.md",
"project-fttranscendence.md",
"project-prsentation-cole-42-.md",
"project-libft.md",
"project-ft-printf.md"
]
},
{
"type": "competences",
"success": true,
"itemCount": 4,
"docCount": 5,
"files": [
"02-competences-index.md",
"competence-ia.md",
"competence-developpement-web-and-hebergement-sur-serveur-windows.md",
"competence-impression-3d.md",
"competence-competence.md"
]
}
],
"totalTypes": 3,
"successfulTypes": 2,
"totalSourceItems": 21,
"totalDocuments": 24
}

View File

@ -0,0 +1,106 @@
# Born2beroot
**Slug :** `born2beroot`
**Lien GitHub :** [https://github.com/Ladebeze66/born2beroot](https://github.com/Ladebeze66/born2beroot)
---
## Description
Le projet Born2beroot de l'école 42 est une initiation à ladministration système sous Linux. L'objectif est de configurer un serveur sécurisé en installant une machine virtuelle sous Debian ou AlmaLinux, en mettant en place des politiques de sécurité strictes (gestion des utilisateurs, restrictions SSH, pare-feu UFW, Fail2ban) et en utilisant LVM pour la gestion des volumes de stockage. Les étudiants doivent également automatiser la surveillance du système avec un script monitoring.sh. Ce projet développe des compétences en sécurité informatique, gestion des serveurs et DevOps, essentielles pour les métiers dadministrateur système ou de cybersécurité.
## Détails du projet
Le projet Born2beroot de lécole 42 est un projet dinitiation à ladministration système, conçu pour familiariser les étudiants avec la gestion des serveurs Linux, la sécurisation du système, et les bonnes pratiques DevOps. Lobjectif est de comprendre comment un système fonctionne, dadopter les bonnes pratiques de sécurité et dautomatiser certaines tâches essentielles.
🏆 Objectifs Principaux du Projet
Ce projet vise à initier les étudiants à plusieurs concepts fondamentaux du sysadmin à travers une configuration minimale mais sécurisée d'un serveur basé sur Debian ou AlmaLinux.
1⃣ Création et Configuration dune Machine Virtuelle
Installation dun serveur sur une machine virtuelle (VirtualBox ou UTM selon lOS utilisé).
Utilisation dune image Debian (par défaut) ou AlmaLinux.
Apprentissage de la gestion dun serveur sans interface graphique.
2⃣ Gestion des Utilisateurs et Sécurisation du Système
Création et gestion des utilisateurs avec une structure bien définie.
Mise en place de règles de mot de passe strictes :
Expiration des mots de passe après un certain temps.
Interdiction de mots de passe trop faibles.
Rotation obligatoire des mots de passe.
Configuration de sudo et groupes restreints pour limiter les accès root.
Restriction des connexions SSH (pas de connexion en tant que root, utilisation de clés SSH).
3⃣ Renforcement de la Sécurité
Mise en place de UFW (Uncomplicated Firewall) pour filtrer le trafic réseau.
Installation et configuration de Fail2ban pour bloquer les tentatives de connexion frauduleuses.
Activation et gestion de SELinux ou AppArmor pour renforcer la sécurité du noyau.
Restriction des permissions et droits daccès pour éviter des failles potentielles.
4⃣ Gestion du Stockage avec LVM (Logical Volume Manager)
Partitionnement intelligent du disque avec LVM pour une gestion flexible de lespace disque.
Création et gestion de volumes logiques, permettant détendre le stockage facilement.
5⃣ Automatisation et Surveillance du Système
Écriture dun script de monitoring (monitoring.sh) affichant des informations essentielles :
Charge CPU
Utilisation mémoire et disque
Nombre dutilisateurs connectés
Journal des connexions SSH
Configuration de cron pour exécuter automatiquement des tâches répétitives.
Gestion des logs et journalisation des événements pour surveiller lactivité du serveur.
🚀 Livrables et Validation du Projet
Une machine virtuelle prête à lemploi avec tous les éléments configurés.
Un script monitoring.sh fonctionnel.
Une documentation claire expliquant les choix techniques et sécuritaires.
Une défense orale où létudiant devra expliquer et démontrer les configurations mises en place.
🎯 Compétences Développées
✔ Gestion des utilisateurs et permissions sur un système Linux.
✔ Configuration et administration dun serveur Debian.
✔ Mise en place de protocoles de sécurité pour un serveur en production.
✔ Automatisation et surveillance des services via des scripts shell.
✔ Maîtrise de LVM pour gérer dynamiquement lespace disque.
✔ Apprentissage des bases de DevOps et des bonnes pratiques dadministration système.
🔥 Pourquoi ce projet est important ?
Le projet Born2beroot prépare les étudiants à des postes en administration système et en cybersécurité. Il permet aussi de se familiariser avec les bases du DevOps, un domaine clé dans lindustrie informatique.
🎯 Conclusion
Born2beroot est un projet incontournable de l'école 42 qui permet aux étudiants de plonger dans l'administration système et la sécurisation dun serveur Linux. C'est une première étape essentielle pour ceux qui souhaitent s'orienter vers les métiers du DevOps, de la cybersécurité ou de l'administration système.
## Informations techniques
- **Langage principal :** C
- **École :** 42 Perpignan
- **Type :** Projet pédagogique
- **Illustrations :** 3 images disponibles

View File

@ -0,0 +1,45 @@
# cpp-partie1
**Slug :** `cpp-partie1`
**Lien GitHub :** [https://github.com/Ladebeze66/cpp-partie-1](https://github.com/Ladebeze66/cpp-partie-1)
---
## Description
Les modules CPP 00 à 04 de l'école 42 sont une introduction progressive au langage C++ et à la programmation orientée objet (POO). Ils couvrent les bases du C++ (classes, objets, fonctions membres, références, mémoire), la surcharge d'opérateurs, l'héritage, et le polymorphisme. Ces modules permettent d'acquérir une compréhension solide du modèle objet du C++, essentielle pour le développement logiciel et les projets avancés en POO.
## Détails du projet
Les modules CPP 00 à 04 de l'école 42 constituent une introduction progressive au langage C++ et à la programmation orientée objet (POO). Chaque module aborde des concepts clés du C++ pour fournir une compréhension solide des spécificités du langage par rapport au C.
🎯 Objectifs des Modules
Module 00 : Découverte des bases du C++, y compris les espaces de noms (namespaces), les classes, les fonctions membres, les flux d'entrée/sortie (stdio streams), les listes d'initialisation, ainsi que les mots-clés static et const.
Module 01 : Approfondissement de la gestion de la mémoire, des références, des pointeurs sur membres et de l'utilisation de l'instruction switch.
Module 02 : Introduction au polymorphisme ad hoc, à la surcharge des opérateurs et aux classes canoniques orthodoxes.
Module 03 : Étude de l'héritage en C++, permettant la création de hiérarchies de classes et la réutilisation du code.
Module 04 : Exploration du polymorphisme de sous-type, des classes abstraites et des interfaces, fondamentaux pour la conception de systèmes modulaires et extensibles.
🛠️ Approche Pédagogique
Chaque module est structuré pour introduire progressivement des concepts clés du C++ :
Lecture et Compréhension : Étudier les notions théoriques présentées dans le module.
Exercices Pratiques : Réaliser des exercices pour appliquer les concepts appris, tels que la création de classes, la gestion de la mémoire et l'implémentation de polymorphisme.
Projets d'Application : Développer des projets concrets qui intègrent plusieurs concepts, renforçant ainsi la compréhension et la maîtrise du langage.
Ces modules sont conçus pour fournir une base solide en C++ et en programmation orientée objet, préparant les étudiants à des projets plus complexes et à une compréhension approfondie du développement logiciel moderne.
## Informations techniques
- **Langage principal :** C
- **École :** 42 Perpignan
- **Type :** Projet pédagogique
- **Illustrations :** 7 images disponibles

View File

@ -0,0 +1,73 @@
# cpp-partie2
**Slug :** `cpp-partie2`
**Lien GitHub :** [https://github.com/Ladebeze66/cpp-partie-2](https://github.com/Ladebeze66/cpp-partie-2)
---
## Description
Les modules CPP 04 à 09 de l'école 42 approfondissent les concepts avancés du C++, notamment le polymorphisme, la gestion des exceptions, les casts, les templates génériques, et l'utilisation de la STL (Standard Template Library). Ils permettent d'acquérir des compétences essentielles en programmation orientée objet, conception modulaire et optimisation du code, préparant les étudiants à des projets logiciels complexes en C++.
## Détails du projet
Les modules CPP 04 à 09 de l'école 42 approfondissent les concepts avancés du langage C++ et de la programmation orientée objet (POO). Chaque module est conçu pour renforcer la compréhension et la maîtrise des aspects spécifiques du C++, préparant les étudiants à des projets complexes et à une utilisation efficace du langage dans des applications réelles.
🎯 Objectifs des Modules
Module 04 : Approfondir le polymorphisme de sous-type, les classes abstraites et les interfaces, permettant une conception modulaire et extensible des applications.
Module 05 : Maîtriser la gestion des exceptions en C++, en utilisant les blocs try et catch pour gérer les erreurs de manière élégante et robuste.
Module 06 : Comprendre les différents types de cast en C++, tels que static_cast, dynamic_cast, const_cast et reinterpret_cast, pour effectuer des conversions de types en toute sécurité.
Module 07 : Explorer les templates en C++, permettant la création de fonctions et de classes génériques pour une réutilisabilité accrue du code.
Module 08 : Se familiariser avec les conteneurs de la Standard Template Library (STL), les itérateurs et les algorithmes, essentiels pour une manipulation efficace des collections de données.
Module 09 : Intégrer les connaissances précédemment acquises pour résoudre des problèmes complexes, en mettant l'accent sur l'utilisation avancée de la STL et des concepts modernes du C++.
🛠️ Spécifications Techniques
Langage de Programmation : C++.
Concepts Clés :
Polymorphisme et héritage.
Gestion des exceptions.
Conversions de types sécurisées.
Programmation générique avec les templates.
Utilisation avancée de la STL.
Prérequis : Connaissance des bases du C++ et des principes de la programmation orientée objet.
🔧 Approche d'Implémentation
Étude Théorique :
Lire et comprendre les concepts avancés du C++ présentés dans chaque module.
Exercices Pratiques :
Réaliser des exercices ciblés pour appliquer les concepts appris, tels que l'implémentation de classes abstraites, la gestion des exceptions, et l'utilisation des templates.
Projets d'Application :
Développer des projets concrets intégrant plusieurs concepts, comme la création de conteneurs personnalisés ou l'implémentation d'algorithmes génériques.
Revue de Code :
Analyser et optimiser le code écrit, en mettant l'accent sur les bonnes pratiques de programmation et l'efficacité.
Ces modules sont conçus pour fournir une compréhension approfondie des aspects avancés du C++, préparant les étudiants à des défis de programmation complexes et à une utilisation efficace du langage dans des projets réels. Ils mettent l'accent sur la conception modulaire, la gestion des erreurs, la programmation générique et l'utilisation efficace des bibliothèques standard, des compétences essentielles pour tout développeur C++ moderne. 🚀
## Informations techniques
- **Langage principal :** C
- **École :** 42 Perpignan
- **Type :** Projet pédagogique
- **Illustrations :** 6 images disponibles

View File

@ -0,0 +1,100 @@
# cub3d
**Slug :** `cub3d`
**Lien GitHub :** [https://github.com/Ladebeze66/cub3D](https://github.com/Ladebeze66/cub3D)
---
## Description
Le projet Cub3D de l'école 42 consiste à coder un moteur graphique en C, inspiré de Wolfenstein 3D, utilisant la technique du raycasting pour afficher une vue en pseudo-3D à partir d'une carte 2D. Il intègre la gestion des mouvements du joueur, des textures, des redirections de caméra, et des événements clavier/souris via MiniLibX. Ce projet développe des compétences en programmation graphique, manipulation des fichiers de configuration et gestion des collisions
## Détails du projet
Le projet Cub3D de l'École 42 consiste à développer un moteur graphique en C, inspiré du jeu classique Wolfenstein 3D. L'objectif principal est d'implémenter une vue en trois dimensions à partir d'une carte en deux dimensions en utilisant la technique du raycasting. Ce projet permet aux étudiants de se familiariser avec les concepts fondamentaux de la programmation graphique et de la gestion des événements en temps réel.
🎯 Objectifs du Projet
Compréhension du Raycasting : Apprendre et implémenter la technique du raycasting pour simuler une perspective 3D à partir d'une carte 2D.
Manipulation de la MiniLibX : Utiliser la bibliothèque graphique minimaliste MiniLibX pour gérer l'affichage, les événements clavier et souris, ainsi que le rendu des images.
Gestion des Textures et des Couleurs : Appliquer des textures aux surfaces rendues et gérer les couleurs pour améliorer le réalisme de la scène.
Gestion des Collisions : Implémenter la détection des collisions pour empêcher le joueur de traverser les murs ou les obstacles.
Parsage de Fichiers de Configuration : Lire et interpréter des fichiers de configuration pour définir la carte du jeu, les positions de départ, les textures, etc.
🛠️ Spécifications Techniques
Langage de Programmation : C.
Bibliothèque Graphique : MiniLibX, une bibliothèque graphique simple fournie par l'École 42.
Fonctionnalités à Implémenter :
Affichage en 3D : Rendu en temps réel d'une scène 3D en utilisant le raycasting.
Mouvements du Joueur : Gestion des déplacements avant, arrière et latéraux, ainsi que la rotation de la vue.
Gestion des Textures : Application de textures sur les murs et autres surfaces.
Minicarte : Affichage d'une minicarte 2D pour représenter la position du joueur et la disposition de la carte.
Gestion des Événements : Réponse aux entrées clavier et souris pour le contrôle du joueur.
Parsage de la Carte : Lecture de fichiers de configuration pour générer la carte du jeu.
🔧 Approche d'Implémentation
Initialisation de la MiniLibX :
Configurer la fenêtre d'affichage et initialiser les paramètres nécessaires.
Parsage de la Carte :
Lire le fichier de configuration pour créer une représentation en mémoire de la carte, incluant les positions des murs, des espaces vides, et la position initiale du joueur.
Implémentation du Raycasting :
Calculer les intersections des rayons avec les murs pour déterminer les distances et les angles, afin de rendre la scène en 3D.
Gestion des Mouvements et des Collisions :
Mettre en place la logique pour déplacer le joueur tout en détectant et en empêchant les collisions avec les murs.
Application des Textures :
Charger les images des textures et les appliquer aux surfaces correspondantes lors du rendu.
Gestion des Événements :
Configurer les callbacks pour les entrées clavier et souris afin de permettre le contrôle du joueur.
Affichage de la Minicarte :
Dessiner une représentation 2D de la carte et de la position du joueur pour faciliter la navigation.
🧪 Tests et Validation
Tests Fonctionnels :
Vérifier que le rendu 3D est correct et que les murs apparaissent aux bonnes positions.
Tester les mouvements du joueur pour s'assurer qu'ils sont fluides et que les collisions sont correctement détectées.
Confirmer que les textures sont correctement appliquées aux surfaces correspondantes.
Tests de Performance :
Évaluer le taux de rafraîchissement pour s'assurer que le jeu fonctionne de manière fluide.
Optimiser le code pour réduire la charge processeur et améliorer les performances.
Tests d'Intégration :
S'assurer que tous les composants (parsing, rendu, gestion des entrées) fonctionnent ensemble de manière cohérente.
## Informations techniques
- **Langage principal :** C
- **École :** 42 Perpignan
- **Type :** Projet pédagogique
- **Illustrations :** 7 images disponibles

View File

@ -0,0 +1,101 @@
# fract-ol
**Slug :** `fract-ol`
**Lien GitHub :** [https://github.com/Ladebeze66/fractol](https://github.com/Ladebeze66/fractol)
---
## Description
Le projet fract-ol de l'école 42 consiste à générer et afficher des fractales (Mandelbrot, Julia, etc.) en utilisant la bibliothèque graphique MiniLibX. Il permet dexplorer la programmation graphique en C, la manipulation des nombres complexes, et loptimisation des calculs pour le rendu dimages. Les utilisateurs peuvent interagir avec les fractales via le clavier et la souris pour zoomer, naviguer et modifier les paramètres en temps réel.
## Détails du projet
Le projet fract-ol de l'École 42 est l'un des premiers projets graphiques du cursus, conçu pour initier les étudiants à la programmation 2D en générant des fractales. Une fractale est une figure géométrique fragmentée qui se répète infiniment à différentes échelles. Ce projet utilise la bibliothèque graphique MiniLibX fournie par l'école.
🎯 Objectifs du Projet
Manipulation d'une Bibliothèque Graphique Bas-Niveau : Apprendre à utiliser MiniLibX pour créer des fenêtres, gérer les événements clavier et souris, et dessiner des images.
Compréhension des Nombres Complexes : Utiliser les nombres complexes pour calculer et représenter des ensembles fractals tels que Mandelbrot et Julia.
Optimisation des Performances : Améliorer l'efficacité du rendu graphique, notamment en explorant l'utilisation de threads pour le calcul parallèle.
🛠️ Spécifications Techniques
Fractales à Générer :
Ensemble de Mandelbrot : Défini par l'itération de la fonction
𝑧𝑛+1=𝑧𝑛2+𝑐z n+1=z n2+c, où 𝑧z et 𝑐c sont des nombres complexes.
Ensemble de Julia : Similaire à Mandelbrot, mais avec une constante 𝑐c fixe et des valeurs initiales 𝑧z variant selon les pixels.
Ensemble Burning Ship : Variante de Mandelbrot utilisant la valeur absolue des parties réelle et imaginaire de 𝑧z à chaque itération.
Fonctionnalités du Programme :
Zoom et Déplacement : Permettre à l'utilisateur de zoomer et de se déplacer dans la fractale pour explorer différents niveaux de détail.
Modification des Paramètres : Changer dynamiquement les paramètres de la fractale, comme les constantes complexes pour l'ensemble de Julia.
Changement de Palette de Couleurs : Offrir différentes palettes pour améliorer la visualisation des fractales.
Contrôles Utilisateur :
Souris : Zoom avant/arrière avec la molette, déplacement en cliquant et en faisant glisser.
Clavier : Touches pour déplacer la vue, ajuster le niveau de zoom, modifier les paramètres de la fractale et changer les couleurs.
🔧 Approche d'Implémentation
Initialisation de MiniLibX :
Créer une fenêtre et initialiser une image pour le rendu des fractales.
Calcul des Fractales :
Pour chaque pixel de l'image, convertir les coordonnées en un nombre complexe.
Appliquer l'itération de la fonction fractale correspondante.
Déterminer la couleur du pixel en fonction du nombre d'itérations avant que la valeur ne diverge au-delà d'un seuil fixé.
Gestion des Entrées Utilisateur :
Implémenter des gestionnaires d'événements pour les entrées clavier et souris afin de permettre l'interaction en temps réel avec la fractale.
Optimisation :
Utiliser des techniques telles que le calcul en parallèle avec des threads pour améliorer la performance du rendu, surtout lors de zooms profonds nécessitant plus d'itérations.
Bibliothèques :
MiniLibX : Bibliothèque graphique utilisée pour le rendu et la gestion des entrées.
pthread : Bibliothèque pour la gestion des threads, si l'optimisation parallèle est implémentée.
🧪 Tests et Validation
Tests Fonctionnels :
Vérifier que chaque type de fractale est correctement généré et affiché.
Tester les fonctionnalités d'interaction utilisateur, comme le zoom, le déplacement et la modification des paramètres.
Tests de Performance :
Évaluer le temps de rendu pour différentes tailles de fenêtre et profondeurs de zoom.
Tester l'efficacité des optimisations, notamment l'utilisation de threads pour le calcul parallèle.
Tests de Robustesse :
Assurer la stabilité du programme lors d'entrées utilisateur rapides ou inattendues.
Vérifier la gestion appropriée des erreurs, comme des valeurs de paramètres invalides.
## Informations techniques
- **Langage principal :** C
- **École :** 42 Perpignan
- **Type :** Projet pédagogique
- **Illustrations :** 11 images disponibles

View File

@ -0,0 +1,83 @@
# ft-irc
**Slug :** `ft-irc`
**Lien GitHub :** [https://github.com/Ladebeze66/ft_irc](https://github.com/Ladebeze66/ft_irc)
---
## Description
Le projet ft_irc de l'école 42 consiste à coder un serveur IRC (Internet Relay Chat) en C++, conforme à la RFC 2812. Il permet de gérer plusieurs connexions clients, d'implémenter des commandes IRC (JOIN, PART, PRIVMSG, NICK, etc.), de gérer des canaux de discussion, et dassurer lauthentification des utilisateurs. Ce projet développe des compétences en programmation réseau, gestion des sockets et protocoles de communication.
## Détails du projet
Le projet ft_irc de l'école 42 consiste à développer un serveur IRC (Internet Relay Chat) en C++, conforme à la spécification RFC 2812. L'objectif est de comprendre les mécanismes des sockets et de la communication réseau en temps réel.
🎯 Objectifs du Projet
Gestion des Connexions Client : Permettre à plusieurs clients de se connecter simultanément au serveur via des sockets.
Implémentation des Commandes IRC : Supporter les commandes essentielles telles que JOIN, PART, PRIVMSG, NICK, et USER.
Gestion des Canaux : Permettre la création, la gestion et la suppression de canaux de discussion, avec des fonctionnalités comme les modes de canal et la liste des utilisateurs.
Authentification des Utilisateurs : Gérer l'enregistrement et l'authentification des utilisateurs, y compris la gestion des pseudonymes (nicks) et des mots de passe.
Gestion des Messages Privés et de Groupe : Assurer la transmission de messages privés entre utilisateurs et de messages de groupe au sein des canaux.
🛠️ Spécifications Techniques
Langage de Programmation : C++.
Protocoles : Utilisation du protocole TCP pour les communications réseau, conformément à la spécification IRC.
Conformité RFC : Le serveur doit être conforme à la RFC 2812, qui définit le protocole IRC.
Gestion des Sockets : Utilisation des sockets pour gérer les connexions réseau entrantes et sortantes.
Multi-threading : Gestion des connexions multiples, soit par multi-threading, soit par une approche asynchrone, pour permettre à plusieurs clients de se connecter simultanément.
🔧 Approche d'Implémentation
Initialisation du Serveur :
Création d'un socket serveur et liaison à un port spécifié.
Mise en place de l'écoute des connexions entrantes.
Gestion des Connexions Client :
Acceptation des nouvelles connexions et création de structures pour gérer chaque client connecté.
Gestion des entrées/sorties pour chaque client, en assurant la réception et l'envoi de messages.
Parsage et Traitement des Commandes :
Analyse des messages reçus des clients pour identifier les commandes IRC.
Exécution des commandes appropriées, telles que la connexion à un canal (JOIN), l'envoi de messages (PRIVMSG), ou le changement de pseudonyme (NICK).
Gestion des Canaux :
Création et suppression de canaux en fonction des besoins.
Gestion des listes d'utilisateurs pour chaque canal et des modes de canal (par exemple, canaux privés, protégés par mot de passe).
Authentification et Gestion des Utilisateurs :
Vérification des informations d'identification des utilisateurs lors de la connexion.
Gestion des conflits de pseudonymes et assurance de l'unicité des noms d'utilisateur sur le serveur.
Envoi de Messages :
Routage des messages privés directement aux destinataires concernés.
Diffusion des messages de canal à tous les membres du canal concerné.
## Informations techniques
- **Langage principal :** C
- **École :** 42 Perpignan
- **Type :** Projet pédagogique
- **Illustrations :** 7 images disponibles

View File

@ -0,0 +1,94 @@
# Ft-printf
**Slug :** `ft-printf`
**Lien GitHub :** [https://github.com/Ladebeze66/printf](https://github.com/Ladebeze66/printf)
---
## Description
Le projet ft_printf de l'école 42 consiste à reproduire la fonction printf du langage C. Il permet aux étudiants de comprendre la manipulation des chaînes de formatage, et l'affichage de différents types de données (%d, %s, %p, %x…). Lobjectif est dimplémenter une fonction efficace, sans utiliser printf, en travaillant directement avec write. Ce projet développe des compétences essentielles en programmation bas niveau, gestion mémoire et optimisation du code C.
## Détails du projet
Le projet ft_printf de l'École 42 consiste à recréer la fonction printf du langage C. Cette fonction permet d'afficher des chaînes de caractères formatées et est essentielle en programmation système et développement logiciel. Ce projet développe des compétences avancées en C, notamment la gestion des arguments variables, la manipulation des chaînes de formatage et lutilisation de fonctions bas niveau comme write.
🏆 Objectifs du Projet
Comprendre le fonctionnement de printf et ses spécificateurs.
Travailler avec les bases numériques (décimal, hexadécimal, etc.).
Optimiser la gestion de la mémoire et laffichage de caractères en C.
🛠️ Spécifications Techniques
Fonctionnalités Requises : ft_printf doit gérer les conversions suivantes :
%c → Caractère unique
%s → Chaîne de caractères
%p → Pointeur (adresse mémoire)
%d / %i → Entier signé
%u → Entier non signé
%x / %X → Hexadécimal (minuscule/majuscule)
%% → Affichage du symbole %
Gestion des Paramètres Variables :
Retour de la Fonction :
ft_printf doit retourner le nombre total de caractères affichés, comme la version standard.
🔧 Approche dImplémentation
Lecture de la Chaîne de Formatage → Identifier les spécificateurs (%).
Affichage des Caractères avec write → Pas de printf autorisé.
Retour du Nombre de Caractères Affichés → Compteur à incrémenter.
📂 Structure du Projet
ft_printf.c → Fonction principale et parsing des arguments.
ft_printf.h → Prototypes et #include nécessaires.
Fichiers auxiliaires :
ft_putchar_pf.c → Affiche un caractère.
ft_putstr_pf.c → Affiche une chaîne.
ft_putnbr_pf.c → Affiche un entier.
ft_puthex_pf.c → Affiche un nombre en hexadécimal.
ft_putptr_pf.c → Affiche une adresse mémoire.
Makefile → Automatisation de la compilation.
🧪 Tests et Validation
Comparaison avec printf standard.
Tests unitaires pour chaque spécificateur.
Gestion des cas limites : valeurs nulles, chaînes vides, grands nombres, etc.
🚀 Pourquoi ce projet est important ?
ft_printf permet de développer des compétences clés en C, en apprenant à manipuler des arguments
variadiques et en travaillant sur un projet bas niveau essentiel en programmation système et logicielle.
## Informations techniques
- **Langage principal :** C
- **École :** 42 Perpignan
- **Type :** Projet pédagogique
- **Illustrations :** 3 images disponibles

View File

@ -0,0 +1,135 @@
# ft_transcendence
**Slug :** `ft-transcendence`
**Lien GitHub :** [https://github.com/Ladebeze66/ft_transcendence](https://github.com/Ladebeze66/ft_transcendence)
---
## Description
Le projet ft_transcendence de l'école 42 est une application web full-stack développée en équipe, combinant un jeu de Pong multijoueur et un chat en temps réel. Le frontend est conçu avec HTML, CSS et JavaScript, tandis que le backend repose sur Django et WebSockets pour gérer la logique du jeu et des interactions en temps réel. L'application est conteneurisée avec Docker, et utilise PostgreSQL pour la gestion des données. Vous avez principalement travaillé sur l'implémentation du chat en jeu, permettant aux joueurs de communiquer en direct, et l'infrastructure est surveillée via Elasticsearch et Kibana pour le monitoring.
## Détails du projet
Le projet ft_transcendence est un projet full-stack web développé en groupe, combinant un jeu multijoueur de Pong et un chat en temps réel. L'objectif est dimplémenter une application web interactive, en utilisant HTML, CSS et JavaScript pour le frontend, et Django avec WebSockets pour le backend. Le projet est conteneurisé avec Docker, permettant une gestion efficace des services et une infrastructure modulaire.
🎯 Objectifs du Projet
Développement Collaboratif : Travailler en groupe pour concevoir une application web robuste et modulaire.
Architecture Full-Stack : Séparer le backend (Django) et le frontend (HTML/CSS/JS) pour une meilleure organisation du code.
Chat en Temps Réel (votre contribution) : Implémenter un chat intégré au jeu, permettant aux joueurs de communiquer en direct via WebSockets.
Déploiement Conteneurisé : Utiliser Docker et Docker Compose pour faciliter lexécution et le déploiement du projet.
Sécurisation des Connexions : Intégrer une authentification OAuth et gérer laccès des utilisateurs.
🛠️ Technologies Utilisées
Frontend (Interface Utilisateur - HTML/CSS/JS) :
HTML5 : Structure des pages et affichage du jeu.
CSS3 : Design et mise en page pour une interface utilisateur fluide.
JavaScript : Interactions dynamiques, gestion des WebSockets pour le chat.
Backend (Serveur & APIs - Django) :
Django : Framework backend pour gérer les utilisateurs et la logique métier.
Django Channels & WebSockets : Gestion de la communication en temps réel pour le chat et le jeu.
PostgreSQL : Base de données pour stocker les informations des joueurs et du chat.
Infrastructure & Déploiement :
Docker & Docker Compose : Isolation des services et déploiement facilité.
Elasticsearch, Logstash, Kibana (ELK Stack) : Monitoring des logs du serveur et des connexions.
OAuth : Authentification sécurisée des utilisateurs via un service externe (Google, GitHub…).
🏓 Fonctionnalités Principales
✅ Jeu de Pong Multijoueur :
Match en temps réel entre joueurs.
Gestion des scores et classement des joueurs.
✅ Chat en Jeu (ma contribution) :
Communication instantanée entre joueurs via WebSockets.
Interface dynamique mise à jour sans rechargement de la page.
Gestion des utilisateurs connectés et des messages persistants.
✅ Authentification OAuth :
Connexion des utilisateurs via Google, GitHub ou une autre plateforme OAuth.
Gestion des profils et des permissions d'accès.
✅ Dashboard Joueurs & Matchs :
Interface affichant les statistiques des joueurs.
Historique des matchs et leaderboard.
✅ Déploiement & Monitoring :
Gestion des logs système via ELK Stack.
Conteneurisation avec Docker pour un environnement de développement homogène.
🔧 Approche dImplémentation
1⃣ Déploiement de lInfrastructure
Configuration des conteneurs Docker pour PostgreSQL, Django et les services de monitoring.
Création de la base de données avec PostgreSQL.
2⃣ Développement du Backend (Django)
Implémentation des modèles dutilisateurs et des scores.
Création des routes API pour gérer les connexions des joueurs et les parties de Pong.
Mise en place du système de chat en temps réel via Django Channels et WebSockets.
3⃣ Développement du Frontend (HTML/CSS/JS)
Création des fichiers HTML pour structurer linterface du jeu et du chat.
Intégration du CSS pour améliorer le design et rendre l'interface utilisateur attrayante.
Ajout de JavaScript pour :
Gérer le chat en direct via WebSockets.
Mettre à jour dynamiquement l'interface du jeu.
Afficher les scores et létat des joueurs connectés.
4⃣ Mise en Place du Système de Logs et Monitoring
Intégration de Logstash pour la collecte des logs.
Visualisation des événements système avec Kibana.
Surveillance des connexions utilisateurs via Elasticsearch.
🚀 Pourquoi ce projet est important ?
Le projet ft_transcendence est une expérience complète de développement web full-stack. Il permet dacquérir des compétences en travail collaboratif, en gestion des conteneurs avec Docker, en développement backend avec Django, et en interaction utilisateur en temps réel via WebSockets.
## Informations techniques
- **Langage principal :** C
- **École :** 42 Perpignan
- **Type :** Projet pédagogique
- **Illustrations :** 2 images disponibles

View File

@ -0,0 +1,110 @@
# Get_next_line
**Slug :** `get-next-line`
**Lien GitHub :** [https://github.com/Ladebeze66/getnextline](https://github.com/Ladebeze66/getnextline)
---
## Description
Le projet get_next_line de l'école 42 consiste à implémenter une fonction en C capable de lire une ligne à la fois depuis un descripteur de fichier, sans recharger tout le fichier en mémoire. Pour cela, il utilise une lecture par blocs (BUFFER_SIZE), des variables statiques pour conserver les données non traitées entre les appels, et une gestion efficace des descripteurs de fichiers multiples. Ce projet est essentiel pour apprendre la manipulation des fichiers en C, la gestion dynamique de la mémoire et l'optimisation des entrées/sorties
## Détails du projet
Le projet get_next_line de l'École 42 vise à développer une fonction en C capable de lire et de retourner une ligne complète depuis un descripteur de fichier, à chaque appel. Ce projet est essentiel pour comprendre la gestion des entrées/sorties en C, la manipulation des descripteurs de fichiers, et l'utilisation des variables statiques.
🎯 Objectifs du Projet
Lecture Ligne par Ligne : Implémenter une fonction get_next_line qui lit une ligne complète depuis un descripteur de fichier donné.
Gestion des Descripteurs de Fichiers : Apprendre à manipuler les descripteurs de fichiers pour lire des données depuis différentes sources, telles que des fichiers ou l'entrée standard.
Utilisation des Variables Statiques : Comprendre et utiliser les variables statiques pour conserver l'état entre les appels de fonction, notamment pour gérer les données restantes entre les lectures.
🛠️ Spécifications Techniques
Prototype de la Fonction :
char *get_next_line(int fd);
Comportement Attendu :
La fonction doit lire une ligne complète depuis le descripteur de fichier fd et la retourner.
Une ligne est définie par une séquence de caractères se terminant par un saut de ligne ('\n') ou par la fin du fichier (EOF).
La fonction doit gérer les descripteurs de fichiers multiples, en conservant l'état de lecture pour chacun.
Gestion de la Mémoire :
Allouer dynamiquement la mémoire nécessaire pour chaque ligne lue.
Assurer la libération appropriée de la mémoire allouée pour éviter les fuites de mémoire.
Variables Statiques :
Utiliser des variables statiques pour stocker les données restantes entre les appels de la fonction, permettant ainsi de gérer correctement les lectures partielles.
🔧 Approche d'Implémentation
Lecture par Blocs :
Lire le contenu du descripteur de fichier par blocs de taille définie (BUFFER_SIZE).
Concaténer les blocs lus jusqu'à ce qu'une ligne complète soit obtenue.
Gestion des Lignes :
Identifier la position du caractère de saut de ligne ('\n') pour délimiter la fin de la ligne.
Extraire la ligne complète et conserver le reste des données pour les appels suivants.
Utilisation des Variables Statiques :
Stocker les données restantes après chaque lecture dans une variable statique, afin de les utiliser lors des appels ultérieurs de la fonction pour le même descripteur de fichier.
Gestion des Erreurs :
Gérer les cas où la lecture échoue, où la mémoire ne peut pas être allouée, ou où le descripteur de fichier est invalide.
📂 Structure du Projet
Fichiers Principaux :
get_next_line.c : Contient l'implémentation de la fonction principale get_next_line.
get_next_line.h : Déclare le prototype de la fonction et les inclusions nécessaires.
get_next_line_utils.c : Contient les fonctions utilitaires utilisées par get_next_line (par exemple, fonctions de manipulation de chaînes).
Compilation :
Utiliser un Makefile pour automatiser la compilation du projet.
Définir la macro BUFFER_SIZE lors de la compilation pour spécifier la taille des blocs de lecture.
🧪 Tests et Validation
Cas de Test :
Lire des fichiers de différentes tailles, y compris des fichiers vides et de très grands fichiers.
Tester la lecture depuis l'entrée standard (stdin).
Gérer les fichiers contenant des lignes sans saut de ligne final.
Gestion des Descripteurs Multiples :
Assurer que la fonction peut gérer plusieurs descripteurs de fichiers simultanément, en maintenant l'état de lecture pour chacun.
Vérification des Fuites de Mémoire :
Utiliser des outils tels que Valgrind pour détecter et corriger les fuites de mémoire potentielles.
En réalisant le projet get_next_line, les étudiants de l'École 42 acquièrent une compréhension approfondie de la gestion des entrées/sorties en C, de la manipulation des descripteurs de fichiers, et de l'utilisation des variables statiques pour conserver l'état entre les appels de fonction. Ce projet est une étape cruciale pour développer des compétences en programmation système et en gestion efficace de la mémoire en C.
## Informations techniques
- **Langage principal :** C
- **École :** 42 Perpignan
- **Type :** Projet pédagogique
- **Illustrations :** 4 images disponibles

View File

@ -0,0 +1,109 @@
# inception
**Slug :** `inception`
**Lien GitHub :** [https://github.com/Ladebeze66/Inception](https://github.com/Ladebeze66/Inception)
---
## Description
Le projet Inception de l'école 42 consiste à déployer une infrastructure basée sur Docker et Docker Compose, en isolant plusieurs services dans des conteneurs distincts. Il inclut la configuration d'un serveur web (Nginx), d'une base de données (MariaDB/MySQL) et d'une application web (WordPress), tout en assurant la sécurisation, la persistance des données et lautomatisation du déploiement. Ce projet permet dacquérir des compétences en virtualisation, gestion de conteneurs et administration système.
## Détails du projet
Le projet Inception de l'école 42 vise à approfondir les compétences en administration système et en virtualisation en utilisant Docker et Docker Compose. L'objectif est de configurer une infrastructure de conteneurs pour héberger plusieurs services, en respectant les bonnes pratiques de sécurité et d'architecture.
🎯 Objectifs du Projet
Maîtrise de Docker : Apprendre à créer et gérer des conteneurs pour isoler des applications et leurs dépendances.
Utilisation de Docker Compose : Définir et orchestrer des applications multi-conteneurs pour faciliter le déploiement et la gestion des services.
Sécurisation des Services : Mettre en place des mesures de sécurité pour protéger les services hébergés, notamment en configurant correctement les pare-feux, les utilisateurs et les permissions.
Automatisation du Déploiement : Automatiser le déploiement des services pour assurer une infrastructure reproductible et évolutive.
🛠️ Spécifications Techniques
Services à Héberger :
Un serveur web (par exemple, Nginx) pour servir du contenu statique et dynamique.
Une base de données relationnelle (par exemple, MySQL ou PostgreSQL) pour stocker les données des applications.
Une application web (par exemple, WordPress) connectée à la base de données.
Configuration des Conteneurs :
Chaque service doit être isolé dans son propre conteneur Docker.
Les conteneurs doivent pouvoir communiquer entre eux via un réseau Docker dédié.
Les données persistantes doivent être stockées dans des volumes Docker pour assurer la persistance des données entre les redémarrages.
Fichier Docker Compose :
Définir un fichier docker-compose.yml pour décrire les services, les réseaux et les volumes nécessaires à l'application.
Configurer les dépendances entre les services pour assurer un démarrage correct de l'application.
Sécurité :
Mettre en place des règles de pare-feu pour limiter l'accès aux services sensibles.
Utiliser des variables d'environnement pour gérer les informations sensibles, telles que les mots de passe de la base de données.
Assurer la mise à jour régulière des images Docker pour inclure les derniers correctifs de sécurité.
🔧 Approche d'Implémentation
Installation de Docker et Docker Compose :
Installer Docker et Docker Compose sur le système hôte.
Vérifier que les installations fonctionnent correctement en exécutant des conteneurs de test.
Création des Dockerfiles :
Pour chaque service, créer un Dockerfile définissant l'environnement nécessaire et les étapes d'installation de l'application.
Optimiser les Dockerfile pour réduire la taille des images et améliorer les performances.
Définition du Fichier Docker Compose :
Écrire le fichier docker-compose.yml en spécifiant les services, les images à utiliser, les ports exposés, les volumes et les réseaux.
Configurer les dépendances entre les services pour assurer un ordre de démarrage correct.
Configuration des Réseaux et Volumes :
Définir des réseaux Docker pour permettre la communication sécurisée entre les conteneurs.
Configurer des volumes pour la persistance des données, notamment pour la base de données et les fichiers de l'application web.
Mise en Place des Mesures de Sécurité :
Restreindre les ports exposés aux seuls nécessaires et configurer des règles de pare-feu appropriées.
Mettre en place des utilisateurs non-root dans les conteneurs lorsque cela est possible.
Gérer les secrets et les variables d'environnement de manière sécurisée.
Tests et Validation :
Démarrer l'ensemble des services à l'aide de Docker Compose et vérifier leur bon fonctionnement.
Tester la communication entre les services, par exemple, vérifier que l'application web peut interagir avec la base de données.
Assurer la persistance des données en redémarrant les conteneurs et en vérifiant l'intégrité des données.
Documentation :
Documenter le processus d'installation, de configuration et de déploiement des services.
Fournir des instructions pour la maintenance et la mise à jour de l'infrastructure.
## Informations techniques
- **Langage principal :** C
- **École :** 42 Perpignan
- **Type :** Projet pédagogique
- **Illustrations :** 5 images disponibles

View File

@ -0,0 +1,62 @@
# libft
**Slug :** `libft`
**Lien GitHub :** [https://github.com/Ladebeze66/libft](https://github.com/Ladebeze66/libft)
---
## Description
Le projet Libft de l'École 42 consiste à recréer une bibliothèque standard en C, comprenant des fonctions essentielles de manipulation de chaînes, de gestion de mémoire et de structures de données comme les listes chaînées. Ce projet vise à renforcer la maîtrise du langage C, à développer des compétences en gestion de mémoire dynamique, et à produire une bibliothèque modulaire et réutilisable pour des projets futurs.
## Détails du projet
Le **projet Libft** de l'École 42 consiste à recréer une bibliothèque standard en langage C, en implémentant un ensemble de fonctions essentielles utilisées couramment en programmation. Ce projet a pour but de consolider les bases du langage C, dapprofondir la compréhension des mécanismes bas niveau, et de développer des compétences en gestion de mémoire, en manipulation de pointeurs, et en création de structures de données personnalisées.
**Objectifs pédagogiques :**
**. Reproduire des fonctions standard de la bibliothèque C** (<stdlib.h>, <string.h>, etc.).
**. Comprendre les mécanismes internes du langage C**(allocation dynamique, manipulation de chaînes de caractères, gestion des tableaux).
**. Développer une approche rigoureuse** pour écrire un code modulaire, lisible et bien documenté.
**.Apprendre à gérer des projets complexes** avec une attention particulière au debugging et aux tests unitaires.
****Compétences acquises :****
**.Programmation en C :** Implémentation de fonctions basiques comme strlen, strcpy, atoi, etc.
**.Création et manipulation de structures de données comme les listes chaînées** (linked lists).
**.Gestion de mémoire :** Utilisation de fonctions telles que malloc, free, pour la gestion dynamique.
**.Prévention des fuites de mémoire** grâce à des tests rigoureux.
**.Écriture d'une bibliothèque réutilisable :** Organisation et modularité du code source pour faciliter la réutilisation.
**.Compilation et création dun fichier binaire** (libft.a) utilisable dans dautres projets.
**Debugging et tests unitaires :**
Identification et résolution des erreurs de segmentation ou de comportement inattendu.
Mise en place de tests pour valider le bon fonctionnement de chaque fonction.
**Points forts à valoriser :**
**.Approche méthodique :** La rigueur dans la mise en œuvre des fonctions standard permet de garantir un code robuste et performant.
**.Code réutilisable :** La bibliothèque libft.a constitue une base solide qui peut être intégrée dans de nombreux projets futurs.
**.Polyvalence :** Ce projet démontre une capacité à travailler sur des fonctions diverses allant de la manipulation de chaînes à la gestion des structures de données.
**Impact professionnel :**
La réalisation du projet Libft atteste dune maîtrise des fondamentaux en développement logiciel, dune capacité à écrire du code performant et maintenable, et dun intérêt marqué pour les bases techniques nécessaires à tout projet informatique avancé. Cette expérience est un atout clé pour des postes impliquant du développement bas niveau, de loptimisation logicielle ou encore des systèmes embarqués.
## Informations techniques
- **Langage principal :** C
- **École :** 42 Perpignan
- **Type :** Projet pédagogique
- **Illustrations :** 4 images disponibles

View File

@ -0,0 +1,153 @@
# minishell
**Slug :** `minishell`
**Lien GitHub :** [https://github.com/Ladebeze66/minishell](https://github.com/Ladebeze66/minishell)
---
## Description
Le projet Minishell de l'école 42 consiste à coder un interpréteur de commandes minimaliste, inspiré de bash. Il permet dexécuter des commandes via un prompt interactif, en gérant les processus, les pipes (|), les redirections (<, >, >>, <<), et les signaux (Ctrl+C, Ctrl+D). Il inclut aussi des built-ins (echo, cd, pwd, export, env, unset, exit). Ce projet développe des compétences essentielles en programmation système, gestion de la mémoire et manipulation des processus sous Unix.
## Détails du projet
Le projet Minishell de l'École 42 consiste à développer un interpréteur de commandes minimaliste, inspiré de bash. Ce projet vise à familiariser les étudiants avec le fonctionnement interne des shells, en mettant l'accent sur le parsing, la gestion des processus, la synchronisation et la gestion des signaux.
🎯 Objectifs du Projet
Compréhension des Shells Unix : Apprendre le fonctionnement des shells, qui fournissent une interface en ligne de commande pour interagir avec le système.
Gestion des Processus : Mettre en œuvre la création, la synchronisation et la terminaison des processus pour exécuter des commandes utilisateur.
Gestion des Signaux : Manipuler les signaux pour gérer les interruptions et les commandes intégrées, telles que Ctrl+C pour interrompre un processus.
Implémentation des Redirections et des Pipes : Gérer les redirections d'entrée/sortie (<, >, >>) et les pipes (|) pour permettre la communication entre processus.
🛠️ Spécifications Techniques
Fonctionnalités à Implémenter :
Affichage d'un Prompt : Afficher un prompt personnalisé en attente des commandes de l'utilisateur.
Historique des Commandes : Maintenir un historique des commandes exécutées pour permettre la navigation et la réexécution.
Exécution des Commandes : Localiser et exécuter les exécutables en se basant sur la variable d'environnement PATH ou via un chemin absolu.
Gestion des Citations Simples et Doubles : Gérer les guillemets simples (') et doubles (") pour empêcher ou permettre l'interprétation des métacaractères.
Redirections :
Entrée (<) : Rediriger l'entrée standard depuis un fichier.
**Sortie (>) : Rediriger la sortie standard vers un fichier, en écrasant le contenu existant.
**Append (>>) : Rediriger la sortie standard vers un fichier, en ajoutant au contenu existant.
**Heredoc (<<) : Lire l'entrée jusqu'à un délimiteur spécifié, sans mettre à jour l'historique.
Pipes (|) : Connecter la sortie d'une commande à l'entrée d'une autre, permettant la création de pipelines.
Variables d'Environnement : Gérer l'expansion des variables d'environnement ($VARIABLE) et de la variable $? pour le statut de sortie de la dernière commande exécutée.
Gestion des Signaux :
Ctrl+C : Afficher un nouveau prompt sur une nouvelle ligne.
Ctrl+D : Quitter le shell.
Ctrl+\ : Ne rien faire.
Built-ins à Implémenter :
echo : Avec l'option -n pour supprimer le saut de ligne final.
cd : Changer le répertoire de travail actuel.
pwd : Afficher le répertoire de travail actuel.
export : Définir des variables d'environnement.
unset : Supprimer des variables d'environnement.
env : Afficher les variables d'environnement actuelles.
exit : Quitter le shell.
🔧 Approche d'Implémentation
Lecture de l'Entrée :
Utiliser la fonction readline pour afficher le prompt et lire l'entrée de l'utilisateur.
Ajouter les commandes saisies à l'historique à l'aide de add_history.
Analyse Lexicale (Lexer) :
Diviser l'entrée en tokens pour identifier les commandes, arguments, opérateurs, etc.
Analyse Syntaxique (Parser) :
Construire une structure de données représentant la commande et ses composants, en tenant compte de la priorité des opérateurs et des parenthèses.
Expansion :
Gérer l'expansion des variables d'environnement et le traitement des guillemets.
Exécution :
Implémenter les built-ins directement dans le shell.
Pour les autres commandes, utiliser fork pour créer un processus enfant et execve pour exécuter la commande.
Gérer les redirections et les pipes en ajustant les descripteurs de fichiers à l'aide de dup2.
Gestion des Signaux :
Configurer des gestionnaires de signaux pour intercepter Ctrl+C, Ctrl+D et Ctrl+\ et appliquer le comportement approprié.
Bibliothèques Utilisées :
readline : Pour la gestion du prompt et de lhistorique des commandes.
unistd.h : Pour les appels système (fork, execve, dup2).
signal.h : Pour la gestion des signaux.
stdlib.h et string.h : Pour la manipulation des chaînes et allocation dynamique.
🧪 Tests et Validation
Tests Fonctionnels :
Vérifier que chaque commande interne (cd, pwd, etc.) fonctionne correctement.
Vérifier la gestion des redirections (<, >, >>) et des pipes (|).
Vérifier lexpansion des variables ($USER, $HOME, etc.).
Assurer la bonne gestion des erreurs (commandes inconnues, fichiers inexistants, etc.).
Tests de Robustesse :
Exécuter le shell avec des entrées non valides pour observer le comportement.
Tester la gestion des signaux (Ctrl+C, Ctrl+D) pour éviter les comportements indésirables.
Vérifier la gestion de la mémoire avec valgrind pour éviter les fuites.
Tests de Performance :
Exécuter un grand nombre de commandes en boucle pour évaluer la stabilité.
Tester lexécution simultanée de plusieurs processus avec des pipes.
🚀 Pourquoi ce projet est important ?
Le projet Minishell est un exercice clé pour comprendre comment fonctionne un shell Unix. Il permet d'acquérir des compétences avancées en gestion des processus, redirections dentrée/sortie, gestion de la mémoire, et synchronisation des tâches. Ces compétences sont essentielles pour les développeurs systèmes, DevOps et ingénieurs en logiciels bas niveau. 🔥
## Informations techniques
- **Langage principal :** C
- **École :** 42 Perpignan
- **Type :** Projet pédagogique
- **Illustrations :** 8 images disponibles

View File

@ -0,0 +1,104 @@
# minitalk
**Slug :** `minitalk`
**Lien GitHub :** [https://github.com/Ladebeze66/minitalk](https://github.com/Ladebeze66/minitalk)
---
## Description
Le projet Minitalk de l'école 42 consiste à établir une communication inter-processus (IPC) entre un serveur et un client en utilisant uniquement les signaux UNIX (SIGUSR1 et SIGUSR2). Le client envoie un message caractère par caractère sous forme binaire, tandis que le serveur le reçoit, le reconstruit et l'affiche. Ce projet permet dapprendre la gestion des signaux, la conversion binaire et la synchronisation des processus en C.
## Détails du projet
Le projet Minitalk de l'École 42 consiste à développer un programme de communication entre processus en utilisant les signaux UNIX. L'objectif est de créer un serveur capable de recevoir et d'afficher des messages envoyés par un client, en se servant exclusivement des signaux SIGUSR1 et SIGUSR2 pour transmettre les données.
🎯 Objectifs du Projet
Communication Inter-Processus (IPC) : Mettre en place une communication efficace entre deux processus distincts en utilisant les signaux UNIX.
Gestion des Signaux : Apprendre à manipuler et à gérer les signaux SIGUSR1 et SIGUSR2 pour transmettre des informations entre le client et le serveur.
Conversion des Données : Convertir les messages en une forme binaire afin de les transmettre bit par bit via les signaux, puis les reconstruire correctement du côté du serveur.
🛠️ Spécifications Techniques
Programmes à Développer :
Serveur :
Doit afficher son PID (Process ID) au lancement.
Attend de recevoir des messages du client et les affiche dès réception.
Client :
Prend en paramètres le PID du serveur et le message à envoyer.
Envoie le message au serveur en utilisant uniquement les signaux SIGUSR1 et SIGUSR2.
Contraintes :
Utilisation exclusive des signaux SIGUSR1 et SIGUSR2 pour la communication.
Gestion des erreurs, notamment la validation des PID et la vérification de la bonne réception des messages.
Respect des normes de codage de l'École 42.
🔧 Approche d'Implémentation
Initialisation du Serveur :
Le serveur démarre et affiche son PID, permettant au client de le cibler pour la communication.
Mise en place d'un gestionnaire de signaux pour traiter SIGUSR1 et SIGUSR2.
Envoi du Message par le Client :
Le client convertit chaque caractère du message en sa représentation binaire.
Pour chaque bit, le client envoie SIGUSR1 pour un bit à 0 et SIGUSR2 pour un bit à 1 au PID du serveur.
Réception et Reconstruction du Message par le Serveur :
Le serveur reçoit les signaux et reconstruit les caractères en assemblant les bits reçus.
Une fois le message complet, il l'affiche à l'écran.
Gestion des Cas Particuliers :
Assurer la synchronisation entre le client et le serveur pour éviter les pertes de données.
Gérer les interruptions et les erreurs potentielles lors de la transmission.
📂 Structure du Projet
Fichiers Principaux :
server.c : Contient le code du serveur, y compris l'initialisation, la gestion des signaux et l'affichage des messages reçus.
client.c : Contient le code du client, responsable de la conversion du message en signaux et de leur envoi au serveur.
Makefile : Automatise la compilation des programmes client et serveur.
Fonctions Autorisées :
malloc, free, write, getpid, signal, sigemptyset, sigaddset, sigaction, pause, kill, sleep, usleep, exit.
🧪 Tests et Validation
Tests Fonctionnels :
Vérifier que le client peut envoyer des messages de différentes longueurs au serveur.
Confirmer que le serveur affiche correctement les messages reçus.
Tests de Robustesse :
Tester la gestion des erreurs, comme l'envoi d'un message à un PID invalide.
Évaluer le comportement du système lors de l'envoi simultané de messages par plusieurs clients.
Tests de Performance :
Mesurer le temps de transmission pour des messages de grande taille.
Analyser l'utilisation des ressources système pendant la communication.
## Informations techniques
- **Langage principal :** C
- **École :** 42 Perpignan
- **Type :** Projet pédagogique
- **Illustrations :** 4 images disponibles

View File

@ -0,0 +1,65 @@
# netpractice
**Slug :** `netpractice`
**Lien GitHub :** [https://github.com/Ladebeze66/netpractice](https://github.com/Ladebeze66/netpractice)
---
## Description
Le projet NetPractice est essentiel pour acquérir une compréhension pratique des réseaux informatiques, une compétence cruciale pour les administrateurs système et les ingénieurs réseau. Il offre une base solide pour des projets plus avancés impliquant la communication réseau et la gestion des infrastructures.
## Détails du projet
Le projet NetPractice de l'école 42 est conçu pour initier les étudiants aux concepts fondamentaux des réseaux informatiques, en particulier l'adressage TCP/IP. Il se compose de 10 exercices pratiques où les étudiants doivent configurer de petits réseaux pour assurer la communication entre différentes machines. L'objectif principal est de comprendre comment les adresses IP et les masques de sous-réseau déterminent la connectivité entre les dispositifs.
🎯 Objectifs du Projet
Compréhension de l'adressage IP : Apprendre à attribuer des adresses IP correctes aux appareils pour assurer une communication efficace.
Masques de sous-réseau (Subnet Masks) : Comprendre comment les masques de sous-réseau définissent les parties réseau et hôte d'une adresse IP.
Routage de base : Apprendre à configurer des tables de routage pour permettre la communication entre différents sous-réseaux.
Reconnaissance des adresses privées et publiques : Identifier les plages d'adresses IP réservées aux réseaux privés et comprendre leurs limitations en matière d'accès à Internet.
🛠️ Spécifications Techniques
Exercices Progressifs : Le projet est structuré en 10 niveaux, chacun présentant des défis croissants en complexité.
Configuration des Appareils : Les étudiants doivent attribuer des adresses IP, des masques de sous-réseau et configurer des tables de routage pour assurer la connectivité.
Outils Simulés : Utilisation d'environnements simulés pour pratiquer la configuration réseau sans matériel physique.
🔧 Approche d'Implémentation
Analyse du Réseau :
Pour chaque exercice, examiner la topologie du réseau fourni.
Identifier les segments de réseau et les appareils impliqués.
Attribution des Adresses IP :
Assigner des adresses IP uniques à chaque appareil, en veillant à ce qu'elles appartiennent au même sous-réseau pour les appareils devant communiquer directement.
Configuration des Masques de Sous-Réseau :
Déterminer le masque de sous-réseau approprié pour chaque segment de réseau afin de définir correctement les parties réseau et hôte des adresses IP.
Mise en Place des Tables de Routage :
Configurer les tables de routage sur les routeurs pour permettre la communication entre différents sous-réseaux.
Vérification de la Connectivité :
Tester la configuration en s'assurant que toutes les machines peuvent communiquer selon les spécifications de l'exercice.
Le projet NetPractice est essentiel pour acquérir une compréhension pratique des réseaux informatiques, une compétence cruciale pour les administrateurs système et les ingénieurs réseau. Il offre une base solide pour des projets plus avancés impliquant la communication réseau et la gestion des infrastructures.
## Informations techniques
- **Langage principal :** C
- **École :** 42 Perpignan
- **Type :** Projet pédagogique
- **Illustrations :** 6 images disponibles

View File

@ -0,0 +1,86 @@
# philosopher
**Slug :** `philosopher`
**Lien GitHub :** [https://github.com/Ladebeze66/philosophers](https://github.com/Ladebeze66/philosophers)
---
## Description
Le projet Philosopher de l'école 42 consiste à résoudre le problème des philosophes mangeurs, un exercice classique de programmation concurrente. Il met en œuvre des threads ou processus pour simuler des philosophes partageant des fourchettes et alternant entre les états manger, penser et dormir, tout en évitant les problèmes de deadlock et starvation. Ce projet permet dapprendre la gestion des threads (pthread), lutilisation des mutex et sémaphores, ainsi que la synchronisation des ressources partagées.
## Détails du projet
Le projet Philosopher de l'École 42 est une implémentation du célèbre problème des philosophes mangeurs (ou Dining Philosophers Problem), conçu pour introduire les étudiants aux concepts fondamentaux de la programmation concurrente. Ce problème illustre les défis liés à la synchronisation et à la gestion des ressources partagées entre processus ou threads.
🎯 Objectifs du Projet
Compréhension de la Programmation Concurrente : Apprendre à gérer l'exécution simultanée de plusieurs threads ou processus au sein d'un programme.
Gestion des Ressources Partagées : Mettre en place des mécanismes pour synchroniser l'accès à des ressources communes, évitant ainsi les conditions de course et les blocages.
Utilisation des Mutex et Sémaphores : Implémenter des solutions utilisant des mutex et des sémaphores pour contrôler l'accès aux ressources partagées et assurer la synchronisation entre threads ou processus.
🛠️ Spécifications Techniques (Suite)
Contraintes (Suite) :
Le programme doit éviter les situations de deadlock (blocage mutuel) où aucun philosophe ne peut progresser.
Il doit également prévenir les situations de starvation où un philosophe ne peut jamais accéder aux fourchettes nécessaires pour manger.
Les actions des philosophes (prendre une fourchette, manger, dormir, penser) doivent être affichées avec un horodatage pour suivre l'évolution de la simulation.
🔧 Approche d'Implémentation
1⃣ Gestion des Threads et Synchronisation
Chaque philosophe est représenté par un thread.
Les fourchettes sont partagées et représentées par des mutex (pour la version multi-threads) ou sémaphores (pour la version multi-processus).
Chaque philosophe tente dacquérir les deux fourchettes adjacentes avant de commencer à manger.
2⃣ Éviter les Problèmes de Concurrence
Pour éviter un deadlock, une approche classique consiste à :
Faire en sorte que le dernier philosophe prenne dabord la fourchette droite, puis la gauche (contrairement aux autres).
Utiliser un sémaphore global pour limiter le nombre de philosophes mangeant simultanément.
Pour éviter la starvation, on sassure quaucun philosophe ne reste bloqué indéfiniment sans accès aux fourchettes.
3⃣ Gestion des États et Horodatage
Chaque action est enregistrée avec un timestamp.
Un thread de surveillance peut être utilisé pour vérifier si un philosophe na pas mangé depuis trop longtemps et signaler sa mort si nécessaire.
🧪 Tests et Validation
Tests Fonctionnels :
Vérifier que les philosophes prennent correctement les fourchettes et alternent entre les états.
Observer si la simulation empêche les deadlocks et starvation.
Tests de Performance :
Exécuter avec un nombre élevé de philosophes pour tester la stabilité et lefficacité du programme.
Cas Limites :
Philosophe unique (peut-il manger ?).
Temps à mourir très court.
Vérification des performances avec un grand nombre de philosophes.
🚀 Pourquoi ce projet est important ?
Le projet Philosopher est une introduction essentielle aux problèmes de concurrence en informatique. Il enseigne la gestion des threads et processus, la synchronisation avec mutex et sémaphores, et loptimisation des ressources partagées. Ces concepts sont fondamentaux pour le développement système, les bases de données et le multithreading en programmation avancée.
## Informations techniques
- **Langage principal :** C
- **École :** 42 Perpignan
- **Type :** Projet pédagogique
- **Illustrations :** 7 images disponibles

View File

@ -0,0 +1,38 @@
# Présentation école 42
**Slug :** `presentation-ecole-42`
**Lien GitHub :** [https://42perpignan.fr/](https://42perpignan.fr/)
---
## Description
L'École 42 Perpignan est un établissement d'enseignement en informatique, gratuit et ouvert à tous, basé sur une pédagogie innovante sans cours ni professeurs. Les étudiants y apprennent de manière collaborative et autonome à travers des projets pratiques, dans un environnement moderne et accessible 24h/24.
## Détails du projet
L'École 42 Perpignan est un établissement d'enseignement supérieur en informatique, reconnu pour son approche pédagogique innovante et collaborative.
Située dans le bâtiment emblématique des Dames de France, rue Pierre Curie à Perpignan, elle offre une formation gratuite, ouverte à tous dès 18 ans, sans exigence de diplôme préalable.
L'apprentissage y est basé sur des projets pratiques, favorisant l'autonomie et l'entraide entre étudiants. Le campus est accessible 24h/24 et 7j/7, disposant d'installations modernes pour soutenir les apprenants dans leur parcours.
Fondée en 2013, l'École 42 a rapidement gagné une réputation internationale pour sa méthode d'enseignement révolutionnaire, sans cours magistraux ni professeurs.
En février 2021, elle a inauguré son 46e campus à Perpignan, devenant ainsi l'un des six campus français aux côtés de Paris, Lyon, Nice, Mulhouse et Angoulême. Cette expansion vise à répondre à la demande croissante de professionnels qualifiés dans le domaine du numérique.
Le processus d'admission débute par une épreuve intensive appelée "la piscine", une immersion de 26 jours durant laquelle les candidats apprennent les bases du codage. Cette méthode permet d'évaluer leur motivation, leur capacité d'adaptation et leur esprit d'équipe. Le campus de Perpignan a accueilli sa deuxième promotion en octobre 2023, avec 113 étudiants âgés de 17 à 54 ans, issus de divers horizons.
Cependant, la parité reste un défi, avec seulement 10% de femmes dans cette cohorte. L'école s'efforce d'attirer davantage de profils féminins pour les prochaines sessions. L'École 42 Perpignan s'intègre dans un réseau mondial de campus, offrant aux étudiants des opportunités d'échanges et de collaborations internationales. Son modèle éducatif unique prépare les apprenants à relever les défis du secteur technologique, en mettant l'accent sur l'innovation, la créativité et la résolution de problèmes concrets.
Avec un taux d'employabilité de 100%, les diplômés sont très recherchés par les entreprises du numérique.
En choisissant l'École 42 Perpignan, les étudiants intègrent une communauté dynamique et engagée, prête à façonner l'avenir de la technologie.
## Informations techniques
- **Langage principal :** C
- **École :** 42 Perpignan
- **Type :** Projet pédagogique
- **Illustrations :** 5 images disponibles

View File

@ -0,0 +1,124 @@
# push_swap
**Slug :** `push-swap`
**Lien GitHub :** [https://github.com/Ladebeze66/pushswap](https://github.com/Ladebeze66/pushswap)
---
## Description
Le projet push_swap de l'école 42 consiste à trier une liste d'entiers en utilisant uniquement un ensemble limité d'opérations sur deux piles (A et B). Lobjectif est de trouver lalgorithme de tri le plus efficace pour minimiser le nombre de mouvements. Ce projet permet dexplorer la gestion des structures de données (piles), loptimisation des algorithmes de tri, et la complexité algorithmique, tout en respectant des contraintes strictes dexécution.
## Détails du projet
Le projet push_swap de l'École 42 est conçu pour approfondir la compréhension des algorithmes de tri et des structures de données, en particulier les piles (stacks). Les étudiants doivent développer un programme en C capable de trier une liste d'entiers en utilisant un ensemble limité d'opérations sur deux piles, tout en minimisant le nombre de mouvements effectués.
🎯 Objectifs du Projet
Implémentation d'Algorithmes de Tri : Concevoir et implémenter des algorithmes efficaces pour trier des nombres en utilisant des piles.
Gestion des Piles : Manipuler deux piles nommées a et b pour réaliser le tri, en appliquant des opérations spécifiques.
Optimisation des Opérations : Minimiser le nombre total d'opérations nécessaires pour trier la liste initiale.
🛠️ Spécifications Techniques
Programme Principal : Un exécutable nommé push_swap qui prend en entrée une liste d'entiers non triés et affiche les opérations nécessaires pour les trier.
Opérations Autorisées :
sa (swap a): Échange les deux premiers éléments de la pile a.
sb (swap b): Échange les deux premiers éléments de la pile b.
ss: Effectue sa et sb simultanément.
pa (push a): Prend le premier élément de b et le place sur a.
pb (push b): Prend le premier élément de a et le place sur b.
ra (rotate a): Fait pivoter tous les éléments de a vers le haut (le premier devient le dernier).
rb (rotate b): Fait pivoter tous les éléments de b vers le haut.
rr: Effectue ra et rb simultanément.
rra (reverse rotate a): Fait pivoter tous les éléments de a vers le bas (le dernier devient le premier).
rrb (reverse rotate b): Fait pivoter tous les éléments de b vers le bas.
rrr: Effectue rra et rrb simultanément.
Contraintes :
Le programme doit gérer les erreurs d'entrée, telles que les arguments non numériques ou les doublons.
Aucune fonction de tri prédéfinie n'est autorisée.
Le nombre d'opérations doit être optimisé pour obtenir le meilleur score possible lors de l'évaluation.
🔧 Approche d'Implémentation
Analyse des Entrées :
Vérifier la validité des arguments fournis (nombres entiers, absence de doublons).
Initialiser les piles a et b en conséquence.
Choix de l'Algorithme de Tri :
Pour un petit nombre d'éléments (par exemple, 3 ou 5), utiliser des algorithmes simples comme le tri par sélection ou le tri à bulles.
Pour un plus grand nombre d'éléments, implémenter des algorithmes plus complexes, tels que le tri par insertion ou des variantes du tri rapide adaptées aux piles.
Optimisation des Opérations :
Analyser les séquences d'opérations pour identifier les redondances ou les mouvements inutiles.
Combiner des opérations lorsque cela est possible (par exemple, utiliser ss au lieu de sa suivi de sb).
Gestion de la Mémoire :
Assurer une allocation et une libération appropriées de la mémoire pour éviter les fuites.
Utiliser des structures de données appropriées pour représenter les piles et faciliter les opérations.
📂 Structure du Projet
Fichiers Principaux :
push_swap.c : Contient la fonction main et la logique générale du programme.
operations.c : Implémente les fonctions correspondant aux opérations autorisées (sa, pb, etc.).
sorting_algorithms.c : Contient les différentes stratégies de tri en fonction de la taille de la pile.
utils.c : Fonctions utilitaires pour la gestion des piles et la validation des entrées.
Fichiers d'En-tête :
push_swap.h : Déclare les prototypes de fonctions et les structures de données utilisées.
Compilation :
Utilisation d'un Makefile pour automatiser la compilation et gérer les dépendances.
🧪 Tests et Validation
Cas de Test :
Listes déjà triées, inversées, ou avec des motifs spécifiques.
Grandes listes générées aléatoirement pour évaluer les performances.
Outils de Test :
Scripts pour automatiser les tests et comparer les résultats avec des solutions de référence.
Utilisation d'outils de débogage et de profilage pour identifier les goulots d'étranglement et optimiser le code.
## Informations techniques
- **Langage principal :** C
- **École :** 42 Perpignan
- **Type :** Projet pédagogique
- **Illustrations :** 5 images disponibles

View File

@ -0,0 +1,113 @@
const fs = require('fs');
const path = require('path');
// Configuration
const API_BASE_URL = 'https://api.fernandgrascalvet.com/api';
const OUTPUT_DIR = './extract/raw';
// Endpoints à extraire
const ENDPOINTS = [
{ name: 'projects', url: '/projects?populate=*' },
{ name: 'competences', url: '/competences?populate=*' },
{ name: 'homepages', url: '/homepages?populate=*' }
];
// Créer le dossier de sortie s'il n'existe pas
if (!fs.existsSync(OUTPUT_DIR)) {
fs.mkdirSync(OUTPUT_DIR, { recursive: true });
}
// Fonction pour extraire les données d'un endpoint
async function extractEndpoint(endpoint) {
try {
console.log(`🔄 Extraction de ${endpoint.name}...`);
const response = await fetch(`${API_BASE_URL}${endpoint.url}`);
if (!response.ok) {
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
}
const data = await response.json();
// Sauvegarder dans un fichier JSON
const filename = `${endpoint.name}-raw.json`;
const filepath = path.join(OUTPUT_DIR, filename);
fs.writeFileSync(filepath, JSON.stringify(data, null, 2), 'utf8');
console.log(`${endpoint.name}: ${data.data?.length || 1} éléments sauvegardés dans ${filename}`);
return {
endpoint: endpoint.name,
success: true,
count: data.data?.length || 1,
file: filename
};
} catch (error) {
console.error(`❌ Erreur lors de l'extraction de ${endpoint.name}:`, error.message);
return {
endpoint: endpoint.name,
success: false,
error: error.message
};
}
}
// Fonction principale
async function extractAllData() {
console.log('🚀 Début de l\'extraction des données Strapi...\n');
const results = [];
// Extraire chaque endpoint
for (const endpoint of ENDPOINTS) {
const result = await extractEndpoint(endpoint);
results.push(result);
// Pause entre les requêtes pour éviter de surcharger l'API
await new Promise(resolve => setTimeout(resolve, 500));
}
// Résumé final
console.log('\n📊 Résumé de l\'extraction:');
console.log('================================');
let totalSuccess = 0;
let totalItems = 0;
results.forEach(result => {
if (result.success) {
console.log(`${result.endpoint}: ${result.count} éléments`);
totalSuccess++;
totalItems += result.count;
} else {
console.log(`${result.endpoint}: ${result.error}`);
}
});
console.log(`\n🎯 ${totalSuccess}/${ENDPOINTS.length} endpoints extraits avec succès`);
console.log(`📁 ${totalItems} éléments au total sauvegardés dans ${OUTPUT_DIR}/`);
// Sauvegarder un fichier de résumé
const summary = {
extractedAt: new Date().toISOString(),
results: results,
totalEndpoints: ENDPOINTS.length,
successfulEndpoints: totalSuccess,
totalItems: totalItems
};
fs.writeFileSync(
path.join(OUTPUT_DIR, 'extraction-summary.json'),
JSON.stringify(summary, null, 2),
'utf8'
);
console.log('📄 Résumé sauvegardé dans extraction-summary.json');
}
// Exécuter le script
extractAllData().catch(console.error);

View File

@ -0,0 +1,26 @@
{
"cleanedAt": "2026-03-15T14:26:52.873Z",
"results": [
{
"type": "projects",
"success": true,
"itemCount": 17,
"rawSize": 426943,
"cleanSize": 70819,
"reduction": "83.4%"
},
{
"type": "competences",
"success": true,
"itemCount": 4,
"rawSize": 135078,
"cleanSize": 12478,
"reduction": "90.8%"
}
],
"totalTypes": 3,
"successfulTypes": 2,
"totalReduction": "85.2%",
"rawSize": 562021,
"cleanSize": 83297
}

View File

@ -0,0 +1,34 @@
[
{
"id": 18,
"name": "Mon Exploration et Maîtrise de lIntelligence Artificielle",
"content": "Comme beaucoup, jai découvert lintelligence artificielle grand public avec larrivée de ChatGPT, qui a marqué un tournant décisif dans laccessibilité et la démocratisation de cette technologie. En lespace de quelques mois, le domaine a connu une expansion fulgurante, avec lémergence dune multitude de solutions exploitant lIA sous diverses formes. Fasciné par ces avancées, jai rapidement développé un vif intérêt pour plusieurs applications, notamment la génération dimages, les chatbots intelligents et plus largement les modèles de langage avancés (LLMs).\n\nDans cette quête dexploration, jai expérimenté des solutions dIA locale, notamment avec Ollama, LLM Studio, et dautres outils permettant une plus grande maîtrise et personnalisation des modèles. Mon objectif a été de comprendre en profondeur les capacités dintégration de ces intelligences artificielles locales, en explorant lentraînement de modèles personnalisés, loptimisation des performances et laffinement des interactions par lingénierie des prompts (cliquez sur IA locale test mistral 7b sur mon serveur).\n\nActuellement, je suis en phase dinstallation et de déploiement de solutions dIA locale sur mon propre serveur, un projet en cours de développement qui me permet dexpérimenter les configurations avancées et dadapter ces modèles à des cas dusage spécifiques. Cette démarche sinscrit dans une volonté de maîtriser lIA en environnement auto-hébergé, offrant ainsi une meilleure compréhension de la gestion des ressources, du fine-tuning des modèles et des défis liés à linfrastructure.\n\nParallèlement, jai entrepris une spécialisation en Data Science et Intelligence Artificielle au sein de lÉcole 42, afin dapprofondir mes connaissances théoriques et pratiques dans ce domaine en perpétuelle évolution. Cette formation me permet daller encore plus loin dans lanalyse des algorithmes de machine learning et deep learning, dexplorer des approches avancées en traitement des données massives, et de perfectionner mes compétences en développement et intégration de solutions IA appliquées.\n\nAnimé par une passion pour lintelligence artificielle et ses innombrables possibilités, je continue de minformer, dexpérimenter et dappliquer ces technologies à des projets concrets. Mon objectif est dacquérir une expertise approfondie pour concevoir des systèmes intelligents performants, adaptables et innovants, tout en restant à la pointe des avancées technologiques.",
"slug": "ia",
"order": 1,
"imageCount": 9
},
{
"id": 19,
"name": "Développement Web & Hébergement sur serveur Windows",
"content": "J'ai réalisé ce projet afin d'étendre mes compétences en développement Web. \n\nCe projet est un site web basé sur Next.js pour le frontend et Strapi pour le backend, hébergé sur un serveur Windows Server 2025 avec IIS comme serveur web. Il repose sur une architecture Headless CMS, où le contenu est géré via une API REST et affiché dynamiquement sur le frontend.\n\n🔹 Technologies utilisées\n\nFrontend (Client) :\n\nFramework : Next.js (React, TypeScript, Server-Side Rendering & Static Generation)\n\nStyling : Tailwind CSS\n\nGestion des requêtes API : Fetch API (avec qs pour structurer les requêtes)\n\nSEO & Performance : Optimisation des images, pré-rendu des pages\n\nBackend (Serveur) :\n\nCMS : Strapi (Node.js, API REST)\n\nBase de données : PostgreSQL ou MySQL\n\nHébergement : IIS sur Windows Server 2025\n\nSécurité : HTTPS activé via Win-ACME (Lets Encrypt)\n\nDéploiement & Infrastructure :\n\nSystème dexploitation : Windows Server 2025\n\nServeur Web : IIS 10 (gestion des proxys et reverse proxy pour Next.js & Strapi)\n\nGestion des certificats SSL : Win-ACME pour le renouvellement automatique des certificats HTTPS\n\nMonitoring : Logs IIS + Console Next.js & Strapi\n\n🔹 Fonctionnalités du site\n\n✅ Affichage dynamique des compétences (compétences récupérées via API Strapi)\n\n✅ Glossaire interactif avec mots-clés détectés dynamiquement\n\n✅ Carousel d'images pour présenter les compétences\n\n✅ Navigation rapide et fluide grâce à Next.js\n\n✅ SEO optimisé via les pages statiques et le rendu dynamique\n\nCe projet est toujours en développement, je l'agrémenterai de contenu au fil du temps.\n\nIl m'a permis brièvement de me familiariser a plusieurs domaines.\n\n1⃣ Développement Web 🌐\n\nCe projet est principalement un site web dynamique reposant sur Next.js et Strapi, ce qui le place dans la catégorie du développement web moderne.\n\nFrontend (Next.js, React, TypeScript) → Développement web côté client\n\nBackend (Strapi, Node.js, API REST) → Développement web côté serveur\n\nAPI et Headless CMS → Gestion de contenu via une API\n\n2⃣ Hébergement et Administration Systèmes 🖥️\n\nÉtant donné que le site est auto-hébergé sur un serveur Windows Server 2025 avec IIS, il appartient aussi à la catégorie administration système et hébergement web.\n\nConfiguration dun serveur web (IIS, Windows Server 2025)\n\nGestion des certificats SSL avec Win-ACME (HTTPS, sécurité)\n\nBase de données (PostgreSQL ou MySQL)\n\nSurveillance et gestion des performances (logs IIS, monitoring)\n\n3⃣ Cloud & DevOps (partiellement) ☁️\n\nMême si ce projet nutilise pas un service cloud public (Azure, AWS, GCP), il comporte des éléments liés à lautomatisation et à la gestion des déploiements.\n\nDéploiement dune application Next.js & Strapi sur un serveur dédié\n\nGestion des certificats SSL automatisée (Win-ACME, Let's Encrypt)\n\nPossibilité dextensions avec CI/CD pour automatiser les mises à jour\n\n4⃣ Sécurité Informatique 🔒\n\nAvec limplémentation du HTTPS, de lauthentification API et de la gestion des accès via Strapi et IIS, ce projet a aussi un aspect cybersécurité.\n\nChiffrement des connexions avec SSL/TLS (HTTPS activé)\n\nProtection des API (Cors, Access-Control-Allow-Origin, JWT si activé dans Strapi)\n\nGestion des permissions et authentification des utilisateurs (Strapi)\n\n5⃣ Expérience Utilisateur & SEO 📈\n\nLe projet est conçu pour être rapide, interactif et optimisé pour le référencement.\n\nSEO optimisé avec Next.js (Static Generation, Server-Side Rendering)\n\nPerformance améliorée grâce au préchargement et à la mise en cache\n\nExpérience utilisateur fluide avec des animations et une navigation rapide",
"slug": "developpement-web-and-hebergement-sur-serveur-windows",
"order": 2,
"imageCount": 3
},
{
"id": 20,
"name": "Mon parcours dans limpression 3D",
"content": "Jai découvert lunivers fascinant de limpression 3D en 2018, ce qui a immédiatement éveillé ma curiosité pour cette technologie en pleine expansion. Désireux den apprendre davantage, jai entrepris mes premières expérimentations en impression FDM (Fused Deposition Modeling) en utilisant une imprimante Alfawise U30. Cette première immersion ma permis de me familiariser avec les fondamentaux de limpression 3D, notamment la calibration de la machine, la compréhension des paramètres dimpression et loptimisation des premiers prototypes.\n\nEn 2020, jai enrichi mon expérience en intégrant à mon parc une Sidewinder X2, une imprimante plus performante qui ma offert la possibilité dexplorer davantage les subtilités des différents slicers disponibles sur le marché, tels que Ultimaker Cura, PrusaSlicer et OrcaSlicer. Parallèlement, jai approfondi mes compétences en modélisation 3D en me formant à lutilisation de logiciels spécialisés, en particulier Fusion 360, qui constitue aujourdhui un outil incontournable dans mon flux de travail.\n\nLapprentissage des différents firmwares, notamment Marlin et Klipper, a constitué une étape essentielle de mon évolution. Jai ainsi acquis des compétences approfondies dans la configuration et loptimisation des paramètres machines, ce qui ma permis de mieux comprendre leur fonctionnement, dassurer leur maintenance et dintervenir efficacement en cas de dysfonctionnement.\n\nAujourdhui, mon expertise sest consolidée grâce à lutilisation dimprimantes plus avancées telles que la Bambu Lab X1C et la P1P, qui me permettent de réaliser des impressions de haute précision avec une grande diversité de matériaux. En effet, je maîtrise désormais limpression avec divers filaments techniques et composites, notamment le PLA, ABS, ASA, Nylon, TPU, ainsi que des impressions en multi-matériaux nécessitant des paramètres dimpression spécifiques.\n\nGrâce à ces expériences, jai développé une parfaite connaissance des conditions optimales requises pour chaque matériau, telles que la gestion des températures, ladhérence au plateau, lhygrométrie, la ventilation ou encore la gestion du warping. Mon parcours ma ainsi permis dacquérir une solide autonomie dans lexploitation des imprimantes 3D, tant sur le plan technique que logiciel, et dapprofondir ma compréhension des défis liés à limpression de pièces complexes ou fonctionnelles.\n\nAujourdhui passionné par limpression 3D, je continue dexplorer les innovations du secteur, de perfectionner mes compétences et dexpérimenter de nouvelles approches afin doptimiser la qualité et la fiabilité des impressions.",
"slug": "impression-3d",
"order": 3,
"imageCount": 8
},
{
"id": 21,
"name": "Mon expérience dans la domotique",
"content": "Depuis plusieurs années, la domotique a connu une évolution fulgurante, rendant accessible à tous des solutions permettant d'automatiser et d'optimiser son environnement quotidien. Fasciné par cet univers, jai entrepris dexplorer les différentes technologies permettant de connecter, centraliser et contrôler efficacement les objets intelligents au sein dun écosystème domestique unifié.\n\nConvaincu que la domotique doit rester abordable et accessible, jai recherché des solutions qui allient simplicité dinstallation, compatibilité et flexibilité. Très rapidement, je me suis intéressé à lécosystème Tuya, qui offre une large gamme dappareils connectés tout en permettant une gestion centralisée. Bien que Tuya repose sur une architecture cloud, jai exploré des solutions open source permettant dintégrer et dinterconnecter ces appareils tout en optimisant lautonomie et la confidentialité des données.\n\nDans cette démarche, jai approfondi lutilisation de Home Assistant, une plateforme open-source puissante qui permet dagréger et de gérer un nombre considérable de dispositifs connectés. Lun de mes principaux objectifs a été de développer une solution de contrôle unifiée, permettant d'automatiser différents appareils et scénarios en fonction des besoins du quotidien (éclairage intelligent, gestion thermique, sécurité, capteurs environnementaux, etc.).\n\nJai également expérimenté les possibilités offertes par lauto-hébergement des serveurs domotiques, réduisant ainsi la dépendance aux plateformes cloud et garantissant une meilleure maîtrise des données personnelles. Lintégration de protocoles de communication ouverts tels que Zigbee, MQTT ou Matter ma permis dexplorer des alternatives plus résilientes, évolutives et personnalisables pour bâtir un environnement domotique intelligent, modulable et sécurisé.\n\nAujourdhui, je continue dapprofondir mes connaissances dans ce domaine en explorant les nouvelles générations dobjets connectés, loptimisation des scénarios dautomatisation avancés, ainsi que lintégration de solutions basées sur lintelligence artificielle afin daméliorer ladaptabilité et lefficacité des systèmes domotiques. Mon objectif est datteindre un équilibre entre simplicité dusage, interopérabilité et autonomie, tout en offrant une expérience fluide et intuitive pour un habitat véritablement intelligent et connecté.",
"slug": "competence",
"order": 4,
"imageCount": 12
}
]

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,26 @@
{
"extractedAt": "2026-03-15T14:26:50.792Z",
"results": [
{
"endpoint": "projects",
"success": true,
"count": 17,
"file": "projects-raw.json"
},
{
"endpoint": "competences",
"success": true,
"count": 4,
"file": "competences-raw.json"
},
{
"endpoint": "homepages",
"success": true,
"count": 1,
"file": "homepages-raw.json"
}
],
"totalEndpoints": 3,
"successfulEndpoints": 3,
"totalItems": 22
}

View File

@ -0,0 +1,55 @@
{
"data": [
{
"id": 20,
"documentId": "u2xsgvgz3fieffv6j13qvte8",
"title": "Welcome!",
"cv": "# Bonjour, je suis Fernand Gras-Calvet\n\nÉtudiant à lÉcole 42 Perpignan, je me spécialise dans la conception de systèmes basés sur les LLM, lautomatisation et les architectures techniques auto-hébergées. \nJe développe des solutions mêlant intelligence artificielle, infrastructure serveur et outils internes afin de transformer des besoins concrets en systèmes fiables, évolutifs et réellement utilisables.\n\n---\n\n## Un parcours atypique devenu une force\n\nAncien infirmier après une première expérience dans lentreprise familiale, jai entamé une reconversion vers linformatique avec une approche pragmatique : **apprendre en construisant**. \n\nAujourdhui, mon parcours mêle rigueur médicale, logique technique et capacité dadaptation, avec une attention particulière portée à la traçabilité, à la documentation et à lutilité réelle des outils développés.\n\n---\n\n## Ce que je construis aujourdhui\n\nLors de mon stage en entreprise logicielle, jai conçu une architecture de chatbot multi-agent intégrant analyse documentaire, traitement dimages techniques et pipeline RAG.\n\nEn parallèle, je développe un environnement personnel dexpérimentation autour de lIA appliquée :\n\n- serveurs Linux et Windows auto-hébergés \n- Docker, reverse proxy et services internes \n- workflows LLM en Python (LangChain, Ollama, modèles open-source) \n- bases vectorielles et pipelines RAG avec Ragflow \n- gestion de connaissances augmentées via Obsidian \n\n---\n\n## Une approche orientée usage réel\n\nJe mintéresse particulièrement aux projets où la technologie sert à structurer linformation, automatiser des processus et améliorer la collaboration entre équipes techniques et métiers. \n\nPassionné également par limpression 3D et le prototypage technique, jaime explorer des solutions concrètes, expérimenter et documenter mes projets dans une logique damélioration continue.\n\n",
"createdAt": "2025-01-31T11:12:50.436Z",
"updatedAt": "2026-02-18T16:12:40.613Z",
"publishedAt": "2026-02-18T16:12:40.633Z",
"photo": {
"id": 455,
"documentId": "t34ayicrwe7vhirykydlm4w1",
"name": "photoprofil.jpg",
"alternativeText": null,
"caption": null,
"width": 346,
"height": 386,
"formats": {
"thumbnail": {
"name": "thumbnail_photoprofil.jpg",
"hash": "thumbnail_photoprofil_14ac3f00b8",
"ext": ".jpg",
"mime": "image/jpeg",
"path": null,
"width": 140,
"height": 156,
"size": 4.1,
"sizeInBytes": 4096,
"url": "/uploads/thumbnail_photoprofil_14ac3f00b8.jpg"
}
},
"hash": "photoprofil_14ac3f00b8",
"ext": ".jpg",
"mime": "image/jpeg",
"size": 20.09,
"url": "/uploads/photoprofil_14ac3f00b8.jpg",
"previewUrl": null,
"provider": "local",
"provider_metadata": null,
"createdAt": "2025-02-14T10:31:59.747Z",
"updatedAt": "2025-02-14T10:31:59.747Z",
"publishedAt": "2025-02-14T10:31:59.748Z"
}
}
],
"meta": {
"pagination": {
"page": 1,
"pageSize": 25,
"pageCount": 1,
"total": 1
}
}
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,298 @@
const fs = require('fs');
const path = require('path');
// Configuration
const CLEAN_DATA_DIR = './extract/clean-data';
const DOCS_DIR = './docs';
// Créer le dossier de documentation
if (!fs.existsSync(DOCS_DIR)) {
fs.mkdirSync(DOCS_DIR, { recursive: true });
}
// Fonction utilitaire pour nettoyer le markdown
function cleanMarkdown(text) {
if (!text) return '';
return text.trim();
}
// Fonction utilitaire pour créer un nom de fichier sûr
function createSafeFileName(name) {
return name
.toLowerCase()
.replace(/[^a-z0-9\s-]/g, '')
.replace(/\s+/g, '-')
.replace(/-+/g, '-')
.trim();
}
// Générateurs de documentation par type
const generators = {
// Générer la documentation des projets
projects: (projects) => {
const docs = [];
// 1. Index général des projets
let indexContent = `# Projets de Fernand Gras-Calvet\n\n`;
indexContent += `Cette section présente les ${projects.length} projets réalisés dans le cadre de ma formation à l'École 42 et de mon parcours en développement.\n\n`;
indexContent += `## Liste des projets\n\n`;
projects.forEach((project, index) => {
indexContent += `${index + 1}. **[${project.name}](${project.slug}.md)** - ${project.description}\n`;
});
indexContent += `\n## Technologies et compétences développées\n\n`;
indexContent += `Ces projets couvrent plusieurs domaines clés :\n`;
indexContent += `- **Programmation système** : Gestion des processus, signaux UNIX, communication inter-processus\n`;
indexContent += `- **Algorithmes et structures de données** : Tri, piles, optimisation algorithmique\n`;
indexContent += `- **Programmation concurrente** : Threads, mutex, synchronisation\n`;
indexContent += `- **Développement web** : Next.js, React, API REST, hébergement\n`;
indexContent += `- **Réseaux** : TCP/IP, routage, configuration réseau\n\n`;
docs.push({
filename: '01-projects-index.md',
content: indexContent
});
// 2. Documentation détaillée de chaque projet
projects.forEach(project => {
let projectContent = `# ${project.name}\n\n`;
// Métadonnées
projectContent += `**Slug :** \`${project.slug}\`\n`;
if (project.link) {
projectContent += `**Lien GitHub :** [${project.link}](${project.link})\n`;
}
projectContent += `\n---\n\n`;
// Description courte
projectContent += `## Description\n\n${project.description}\n\n`;
// Contenu détaillé
if (project.resum) {
projectContent += `## Détails du projet\n\n${cleanMarkdown(project.resum)}\n\n`;
}
// Informations techniques
projectContent += `## Informations techniques\n\n`;
projectContent += `- **Langage principal :** C\n`;
projectContent += `- **École :** 42 Perpignan\n`;
projectContent += `- **Type :** Projet pédagogique\n`;
if (project.imageCount > 0) {
projectContent += `- **Illustrations :** ${project.imageCount} images disponibles\n`;
}
docs.push({
filename: `project-${createSafeFileName(project.name)}.md`,
content: projectContent
});
});
return docs;
},
// Générer la documentation des compétences
competences: (competences) => {
const docs = [];
// 1. Index des compétences
let indexContent = `# Compétences de Fernand Gras-Calvet\n\n`;
indexContent += `Cette section présente mes ${competences.length} domaines de compétences principaux.\n\n`;
// Trier par ordre si disponible
const sortedCompetences = competences.sort((a, b) => {
if (a.order === null && b.order === null) return 0;
if (a.order === null) return 1;
if (b.order === null) return -1;
return a.order - b.order;
});
indexContent += `## Domaines d'expertise\n\n`;
sortedCompetences.forEach((competence, index) => {
indexContent += `${index + 1}. **[${competence.name}](${competence.slug}.md)**\n`;
});
docs.push({
filename: '02-competences-index.md',
content: indexContent
});
// 2. Documentation détaillée de chaque compétence
sortedCompetences.forEach(competence => {
let competenceContent = `# ${competence.name}\n\n`;
// Métadonnées
competenceContent += `**Slug :** \`${competence.slug}\`\n`;
if (competence.order !== null) {
competenceContent += `**Ordre d'affichage :** ${competence.order}\n`;
}
competenceContent += `\n---\n\n`;
// Contenu principal
if (competence.content) {
competenceContent += cleanMarkdown(competence.content);
}
// Informations supplémentaires
if (competence.imageCount > 0) {
competenceContent += `\n\n---\n\n*Cette compétence est illustrée par ${competence.imageCount} images sur le site.*`;
}
docs.push({
filename: `competence-${createSafeFileName(competence.slug)}.md`,
content: competenceContent
});
});
return docs;
},
// Générer la documentation de la homepage
homepages: (homepages) => {
const docs = [];
if (homepages.length > 0) {
const homepage = homepages[0];
let homepageContent = `# ${homepage.title}\n\n`;
homepageContent += `Cette page présente le profil et la présentation principale de Fernand Gras-Calvet.\n\n`;
homepageContent += `---\n\n`;
if (homepage.cv) {
homepageContent += cleanMarkdown(homepage.cv);
}
if (homepage.hasPhoto) {
homepageContent += `\n\n---\n\n*Cette page inclut une photo de profil.*`;
}
docs.push({
filename: '00-homepage.md',
content: homepageContent
});
}
return docs;
}
};
// Fonction principale de génération
async function generateAllDocs() {
console.log('📝 Génération de la documentation...\n');
const allDocs = [];
const results = [];
// Traiter chaque type de données
for (const [type, generator] of Object.entries(generators)) {
try {
const cleanFile = path.join(CLEAN_DATA_DIR, `${type}-clean.json`);
// Vérifier si le fichier existe
if (!fs.existsSync(cleanFile)) {
console.log(`⚠️ ${type}: fichier clean non trouvé, ignoré`);
continue;
}
console.log(`🔄 Génération de la documentation pour ${type}...`);
// Lire les données nettoyées
const cleanData = JSON.parse(fs.readFileSync(cleanFile, 'utf8'));
// Générer la documentation
const docs = generator(cleanData);
// Sauvegarder chaque document
let savedCount = 0;
docs.forEach(doc => {
const docPath = path.join(DOCS_DIR, doc.filename);
fs.writeFileSync(docPath, doc.content, 'utf8');
savedCount++;
});
console.log(`${type}: ${docs.length} fichiers de documentation générés`);
allDocs.push(...docs);
results.push({
type,
success: true,
itemCount: cleanData.length,
docCount: docs.length,
files: docs.map(d => d.filename)
});
} catch (error) {
console.error(`❌ Erreur lors de la génération pour ${type}:`, error.message);
results.push({
type,
success: false,
error: error.message
});
}
}
// Générer un index général
let masterIndex = `# Documentation complète - Fernand Gras-Calvet\n\n`;
masterIndex += `Cette documentation a été générée automatiquement à partir des données Strapi.\n\n`;
masterIndex += `**Généré le :** ${new Date().toLocaleString('fr-FR')}\n\n`;
masterIndex += `## Structure de la documentation\n\n`;
const successfulResults = results.filter(r => r.success);
successfulResults.forEach(result => {
masterIndex += `### ${result.type.charAt(0).toUpperCase() + result.type.slice(1)}\n`;
masterIndex += `- ${result.itemCount} éléments source\n`;
masterIndex += `- ${result.docCount} fichiers générés\n`;
masterIndex += `- Fichiers : ${result.files.join(', ')}\n\n`;
});
masterIndex += `## Utilisation pour base vectorielle\n\n`;
masterIndex += `Ces fichiers Markdown sont optimisés pour l'intégration dans une base de connaissances vectorielle :\n`;
masterIndex += `- Contenu textuel uniquement (pas d'images)\n`;
masterIndex += `- Structure hiérarchique claire\n`;
masterIndex += `- Métadonnées préservées\n`;
masterIndex += `- Format Markdown standard\n\n`;
fs.writeFileSync(path.join(DOCS_DIR, 'README.md'), masterIndex, 'utf8');
// Résumé final
console.log('\n📊 Résumé de la génération:');
console.log('============================');
let totalDocs = 0;
let totalItems = 0;
results.forEach(result => {
if (result.success) {
console.log(`${result.type}: ${result.docCount} docs (${result.itemCount} éléments)`);
totalDocs += result.docCount;
totalItems += result.itemCount;
} else {
console.log(`${result.type}: ${result.error}`);
}
});
console.log(`\n🎯 ${totalDocs + 1} fichiers générés au total (+ README.md)`);
console.log(`📁 Documentation sauvegardée dans ${DOCS_DIR}/`);
console.log(`🤖 Prêt pour intégration dans votre base vectorielle !`);
// Sauvegarder le résumé
const summary = {
generatedAt: new Date().toISOString(),
results: results,
totalTypes: Object.keys(generators).length,
successfulTypes: successfulResults.length,
totalSourceItems: totalItems,
totalDocuments: totalDocs + 1
};
fs.writeFileSync(
path.join(DOCS_DIR, 'generation-summary.json'),
JSON.stringify(summary, null, 2),
'utf8'
);
console.log('📄 Résumé sauvegardé dans generation-summary.json');
}
// Exécuter le script
generateAllDocs().catch(console.error);

View File

@ -0,0 +1,34 @@
{
"executedAt": "2026-03-15T14:26:57.068Z",
"duration": "10s",
"totalSteps": 4,
"successfulSteps": 3,
"results": [
{
"script": "extract-api-data.js",
"success": true,
"stdout": "🚀 Début de l'extraction des données Strapi...\n\n🔄 Extraction de projects...\n✅ projects: 17 éléments sauvegardés dans projects-raw.json\n🔄 Extraction de competences...\n✅ competences: 4 éléments sauvegardés dans competences-raw.json\n🔄 Extraction de homepages...\n✅ homepages: 1 éléments sauvegardés dans homepages-raw.json\n\n📊 Résumé de l'extraction:\n================================\n✅ projects: 17 éléments\n✅ competences: 4 éléments\n✅ homepages: 1 éléments\n\n🎯 3/3 endpoints extraits avec succès\n📁 22 éléments au total sauvegardés dans ./extract/raw/\n📄 Résumé sauvegardé dans extraction-summary.json\n",
"stderr": "",
"exitCode": 0
},
{
"script": "clean-api-data.js",
"success": true,
"stdout": "🧹 Début du nettoyage des données...\n\n🔄 Nettoyage de projects...\n✅ projects: 17 éléments nettoyés\n 📦 Taille réduite de 83.4% (426943 → 70819 bytes)\n🔄 Nettoyage de competences...\n✅ competences: 4 éléments nettoyés\n 📦 Taille réduite de 90.8% (135078 → 12478 bytes)\n⚠ messages: fichier raw non trouvé, ignoré\n\n📊 Résumé du nettoyage:\n=========================\n✅ projects: 17 éléments (83.4% de réduction)\n✅ competences: 4 éléments (90.8% de réduction)\n\n🎯 2/3 types nettoyés avec succès\n📦 Réduction totale: 85.2% (562021 → 83297 bytes)\n📁 Données nettoyées sauvegardées dans ./extract/clean-data/\n📄 Résumé sauvegardé dans cleaning-summary.json\n",
"stderr": "",
"exitCode": 0
},
{
"script": "generate-docs.js",
"success": true,
"stdout": "📝 Génération de la documentation...\n\n🔄 Génération de la documentation pour projects...\n✅ projects: 18 fichiers de documentation générés\n🔄 Génération de la documentation pour competences...\n✅ competences: 5 fichiers de documentation générés\n⚠ homepages: fichier clean non trouvé, ignoré\n\n📊 Résumé de la génération:\n============================\n✅ projects: 18 docs (17 éléments)\n✅ competences: 5 docs (4 éléments)\n\n🎯 24 fichiers générés au total (+ README.md)\n📁 Documentation sauvegardée dans ./docs/\n🤖 Prêt pour intégration dans votre base vectorielle !\n📄 Résumé sauvegardé dans generation-summary.json\n",
"stderr": "",
"exitCode": 0
},
{
"script": "analyse-site-architecture.js",
"success": false,
"error": " ❌ analyse-site-architecture.js a échoué (code: 1)"
}
]
}

View File

@ -0,0 +1,58 @@
[15/03/2026 15:26:46] 🚀 Début de la mise à jour de la documentation
[15/03/2026 15:26:46] ==================================================
[15/03/2026 15:26:46]
📋 Étape 1/4: 🔄 Extraction des données Strapi
[15/03/2026 15:26:46] 🔄 Extraction des données Strapi...
[15/03/2026 15:26:46] 📄 Exécution de: extract-api-data.js
[15/03/2026 15:26:50] ✅ extract-api-data.js terminé avec succès
[15/03/2026 15:26:50] ⏸️ Pause de 2 secondes...
[15/03/2026 15:26:52]
📋 Étape 2/4: 🧹 Nettoyage des données
[15/03/2026 15:26:52] 🧹 Nettoyage des données...
[15/03/2026 15:26:52] 📄 Exécution de: clean-api-data.js
[15/03/2026 15:26:52] ✅ clean-api-data.js terminé avec succès
[15/03/2026 15:26:52] ⏸️ Pause de 2 secondes...
[15/03/2026 15:26:54]
📋 Étape 3/4: 📝 Génération de la documentation
[15/03/2026 15:26:54] 📝 Génération de la documentation...
[15/03/2026 15:26:54] 📄 Exécution de: generate-docs.js
[15/03/2026 15:26:54] ✅ generate-docs.js terminé avec succès
[15/03/2026 15:26:54] ⏸️ Pause de 2 secondes...
[15/03/2026 15:26:56]
📋 Étape 4/4: 🏗️ Analyse de l'architecture
[15/03/2026 15:26:56] 🏗️ Analyse de l'architecture...
[15/03/2026 15:26:56] 📄 Exécution de: analyse-site-architecture.js
[15/03/2026 15:26:57] ❌ analyse-site-architecture.js a échoué (code: 1)
[15/03/2026 15:26:57] Erreur: J:\my-next-site\strapi_extraction\analyse-site-architecture.js:418
generateArchitectureDoc().catch(console.error);
^
TypeError: generateArchitectureDoc(...).catch is not a function
at Object.<anonymous> (J:\my-next-site\strapi_extraction\analyse-site-architecture.js:418:32)
at Module._compile (node:internal/modules/cjs/loader:1469:14)
at Module._extensions..js (node:internal/modules/cjs/loader:1548:10)
at Module.load (node:internal/modules/cjs/loader:1288:32)
at Module._load (node:internal/modules/cjs/loader:1104:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:173:12)
at node:internal/main/run_main_module:28:49
Node.js v20.18.2
[15/03/2026 15:26:57]
❓ Échec de l'étape 4. Continuer quand même ? (Les étapes suivantes pourraient échouer)
[15/03/2026 15:26:57] ⚠️ Continuation automatique malgré l'erreur...
[15/03/2026 15:26:57]
==================================================
[15/03/2026 15:26:57] 📊 RÉSUMÉ DE LA MISE À JOUR
[15/03/2026 15:26:57] ==================================================
[15/03/2026 15:26:57] ✅ Étape 1: extract-api-data.js - Succès
[15/03/2026 15:26:57] ✅ Étape 2: clean-api-data.js - Succès
[15/03/2026 15:26:57] ✅ Étape 3: generate-docs.js - Succès
[15/03/2026 15:26:57] ❌ Étape 4: analyse-site-architecture.js - Échec
[15/03/2026 15:26:57] Erreur: ❌ analyse-site-architecture.js a échoué (code: 1)
[15/03/2026 15:26:57]
🎯 3/4 étapes réussies
[15/03/2026 15:26:57] ⏱️ Durée totale: 10 secondes
[15/03/2026 15:26:57] ⚠️ Mise à jour terminée avec des erreurs
[15/03/2026 15:26:57] 🔍 Consultez les logs ci-dessus pour plus de détails
[15/03/2026 15:26:57] 📄 Résumé sauvegardé dans ./logs/last-update-summary.json

View File

@ -0,0 +1,285 @@
const { spawn } = require('child_process');
const fs = require('fs');
const path = require('path');
// Configuration
const SCRIPTS_DIR = './';
const LOG_FILE = './logs/update-documentation.log';
// Liste des scripts à exécuter dans l'ordre
const SCRIPTS_SEQUENCE = [
{
name: 'extract-api-data.js',
description: '🔄 Extraction des données Strapi',
timeout: 30000 // 30 secondes
},
{
name: 'clean-api-data.js',
description: '🧹 Nettoyage des données',
timeout: 10000 // 10 secondes
},
{
name: 'generate-docs.js',
description: '📝 Génération de la documentation',
timeout: 15000 // 15 secondes
},
{
name: 'analyse-site-architecture.js',
description: '🏗️ Analyse de l\'architecture',
timeout: 20000 // 20 secondes
}
];
// Créer le dossier de logs
const logsDir = path.dirname(LOG_FILE);
if (!fs.existsSync(logsDir)) {
fs.mkdirSync(logsDir, { recursive: true });
}
// Fonction pour logger avec timestamp
function log(message, isError = false) {
const timestamp = new Date().toLocaleString('fr-FR');
const logMessage = `[${timestamp}] ${message}\n`;
// Afficher dans la console
if (isError) {
console.error(message);
} else {
console.log(message);
}
// Écrire dans le fichier de log
fs.appendFileSync(LOG_FILE, logMessage, 'utf8');
}
// Fonction pour exécuter un script
function executeScript(scriptConfig) {
return new Promise((resolve, reject) => {
const scriptPath = path.join(SCRIPTS_DIR, scriptConfig.name);
// Vérifier que le script existe
if (!fs.existsSync(scriptPath)) {
const error = `❌ Script non trouvé: ${scriptPath}`;
log(error, true);
reject(new Error(error));
return;
}
log(`${scriptConfig.description}...`);
log(` 📄 Exécution de: ${scriptConfig.name}`);
// Lancer le script
const child = spawn('node', [scriptConfig.name], {
cwd: SCRIPTS_DIR,
stdio: ['pipe', 'pipe', 'pipe']
});
let stdout = '';
let stderr = '';
// Capturer la sortie standard
child.stdout.on('data', (data) => {
const output = data.toString();
stdout += output;
// Afficher en temps réel (optionnel)
process.stdout.write(` ${output}`);
});
// Capturer les erreurs
child.stderr.on('data', (data) => {
const error = data.toString();
stderr += error;
process.stderr.write(`${error}`);
});
// Gérer la fin du processus
child.on('close', (code) => {
if (code === 0) {
log(`${scriptConfig.name} terminé avec succès`);
resolve({
script: scriptConfig.name,
success: true,
stdout,
stderr,
exitCode: code
});
} else {
const error = `${scriptConfig.name} a échoué (code: ${code})`;
log(error, true);
if (stderr) log(` Erreur: ${stderr}`, true);
reject(new Error(error));
}
});
// Gérer les erreurs de lancement
child.on('error', (error) => {
const errorMsg = ` ❌ Erreur lors du lancement de ${scriptConfig.name}: ${error.message}`;
log(errorMsg, true);
reject(new Error(errorMsg));
});
// Timeout de sécurité
const timeout = setTimeout(() => {
child.kill('SIGTERM');
const timeoutMsg = ` ⏰ Timeout: ${scriptConfig.name} a dépassé ${scriptConfig.timeout}ms`;
log(timeoutMsg, true);
reject(new Error(timeoutMsg));
}, scriptConfig.timeout);
// Nettoyer le timeout si le processus se termine normalement
child.on('close', () => {
clearTimeout(timeout);
});
});
}
// Fonction principale
async function updateDocumentation() {
const startTime = Date.now();
// Initialiser le log
log('🚀 Début de la mise à jour de la documentation');
log('='.repeat(50));
const results = [];
let successCount = 0;
try {
// Exécuter chaque script dans l'ordre
for (let i = 0; i < SCRIPTS_SEQUENCE.length; i++) {
const script = SCRIPTS_SEQUENCE[i];
log(`\n📋 Étape ${i + 1}/${SCRIPTS_SEQUENCE.length}: ${script.description}`);
try {
const result = await executeScript(script);
results.push(result);
successCount++;
// Petite pause entre les scripts
if (i < SCRIPTS_SEQUENCE.length - 1) {
log(' ⏸️ Pause de 2 secondes...');
await new Promise(resolve => setTimeout(resolve, 2000));
}
} catch (error) {
results.push({
script: script.name,
success: false,
error: error.message
});
// Décider si on continue ou on s'arrête
log(`\n❓ Échec de l'étape ${i + 1}. Continuer quand même ? (Les étapes suivantes pourraient échouer)`);
// Pour l'automatisation, on continue mais on note l'erreur
log(' ⚠️ Continuation automatique malgré l\'erreur...');
}
}
} catch (error) {
log(`❌ Erreur critique: ${error.message}`, true);
}
// Résumé final
const endTime = Date.now();
const duration = Math.round((endTime - startTime) / 1000);
log('\n' + '='.repeat(50));
log('📊 RÉSUMÉ DE LA MISE À JOUR');
log('='.repeat(50));
results.forEach((result, index) => {
const stepNum = index + 1;
if (result.success) {
log(`✅ Étape ${stepNum}: ${result.script} - Succès`);
} else {
log(`❌ Étape ${stepNum}: ${result.script} - Échec`, true);
if (result.error) {
log(` Erreur: ${result.error}`, true);
}
}
});
log(`\n🎯 ${successCount}/${SCRIPTS_SEQUENCE.length} étapes réussies`);
log(`⏱️ Durée totale: ${duration} secondes`);
if (successCount === SCRIPTS_SEQUENCE.length) {
log('🎉 Mise à jour terminée avec succès !');
log('📁 Documentation mise à jour dans ./docs/');
// Compter les fichiers générés
const docsDir = './docs';
if (fs.existsSync(docsDir)) {
const files = fs.readdirSync(docsDir).filter(f => f.endsWith('.md'));
log(`📄 ${files.length} fichiers Markdown disponibles`);
}
} else {
log('⚠️ Mise à jour terminée avec des erreurs', true);
log('🔍 Consultez les logs ci-dessus pour plus de détails');
}
// Sauvegarder un résumé JSON
const summary = {
executedAt: new Date().toISOString(),
duration: `${duration}s`,
totalSteps: SCRIPTS_SEQUENCE.length,
successfulSteps: successCount,
results: results
};
fs.writeFileSync('./logs/last-update-summary.json', JSON.stringify(summary, null, 2), 'utf8');
log('📄 Résumé sauvegardé dans ./logs/last-update-summary.json');
return successCount === SCRIPTS_SEQUENCE.length;
}
// Fonction pour afficher l'aide
function showHelp() {
console.log(`
📚 Script de mise à jour de la documentation
===========================================
Usage: node update-documentation.js [options]
Options:
--help, -h Afficher cette aide
--dry-run Simuler l'exécution sans lancer les scripts
--verbose Mode verbeux avec plus de détails
Séquence d'exécution:
${SCRIPTS_SEQUENCE.map((script, i) => ` ${i + 1}. ${script.description}`).join('\n')}
Fichiers générés:
- ./docs/*.md Documentation Markdown
- ./logs/update-documentation.log Log détaillé
- ./logs/last-update-summary.json Résumé de la dernière exécution
`);
}
// Gestion des arguments de ligne de commande
const args = process.argv.slice(2);
if (args.includes('--help') || args.includes('-h')) {
showHelp();
process.exit(0);
}
if (args.includes('--dry-run')) {
console.log('🧪 Mode simulation - Aucun script ne sera exécuté');
SCRIPTS_SEQUENCE.forEach((script, i) => {
console.log(`${i + 1}. ${script.description} (${script.name})`);
});
process.exit(0);
}
// Exécuter la mise à jour
updateDocumentation()
.then(success => {
process.exit(success ? 0 : 1);
})
.catch(error => {
log(`💥 Erreur fatale: ${error.message}`, true);
process.exit(1);
});

44
test-llm-simple.ps1 Normal file
View File

@ -0,0 +1,44 @@
# Test simple de l'API LLM
param(
[string]$Question = "Bonjour"
)
function Test-LLM {
param([string]$Q)
Write-Host "Question: $Q" -ForegroundColor Yellow
Write-Host "Envoi..." -ForegroundColor Gray
try {
$params = @{
Uri = "https://llmapi.fernandgrascalvet.com/ask"
Method = "GET"
Body = @{ q = $Q }
}
$response = Invoke-RestMethod @params
Write-Host "Reponse:" -ForegroundColor Green
Write-Host $response -ForegroundColor White
} catch {
Write-Host "Erreur: $($_.Exception.Message)" -ForegroundColor Red
}
}
# Menu simple
if ($Question -eq "Bonjour") {
Write-Host "=== Testeur API LLM ===" -ForegroundColor Cyan
Write-Host "1. Test rapide"
Write-Host "2. Question personnalisee"
$choice = Read-Host "Choix (1-2)"
if ($choice -eq "1") {
Test-LLM "Bonjour, comment allez-vous ?"
} elseif ($choice -eq "2") {
$customQ = Read-Host "Votre question"
Test-LLM $customQ
}
} else {
Test-LLM $Question
}