Catégorie : Blog

  • Socle V004 – Status Dashboard

    Socle V004 – Status Dashboard

    27 – Status Dashboard

    Version : 4.0.0 Package : eu.lmvi.socle.worker.status

    Introduction

    Le StatusDashboardWorker est un Worker integre au Socle V004 qui expose un dashboard HTML de supervision sur un port dedie. Il permet de visualiser en temps reel l’etat de l’application et de tous les Workers.

    Caracteristiques

    • Automatique : Active par defaut, aucun code a ajouter
    • Port dedie : 9374 (configurable)
    • Dashboard HTML : Interface web avec rafraichissement AJAX partiel
    • API JSON : Endpoints REST pour integration
    • Metriques d’activite : Throughput, duree, charge relative
    • Animation visuelle : Mise en evidence des valeurs modifiees

    Acces au Dashboard

    Une fois l’application demarree, le dashboard est accessible sur :

    http://localhost:9374/
    

    Configuration

    application.yml

    socle:
      status_dashboard:
        # Activer/desactiver le dashboard (defaut: true)
        enabled: true
    
        # Port du serveur HTTP (defaut: 9374)
        port: 9374
    
        # Adresse de bind (vide = toutes les interfaces)
        bind_address: ""
    
        # Intervalle de rafraichissement HTML en secondes (defaut: 5)
        refresh_interval: 5
    
        # Fenetre de calcul des metriques en secondes (defaut: 60)
        metrics_window: 60
    
        # Limite de requetes par seconde (defaut: 10)
        max_requests_per_second: 10
    
        # Activer l'API JSON (defaut: true)
        api_enabled: true
    

    Variables d’environnement

    Variable Description Defaut
    STATUS_DASHBOARD_ENABLED Activer le dashboard true
    STATUS_DASHBOARD_PORT Port HTTP 9374
    STATUS_DASHBOARD_BIND Adresse de bind (vide)
    STATUS_DASHBOARD_REFRESH Refresh interval (sec) 5
    STATUS_DASHBOARD_METRICS_WINDOW Fenetre metriques (sec) 60
    STATUS_DASHBOARD_MAX_RPS Max requetes/sec 10
    STATUS_DASHBOARD_API_ENABLED Activer API JSON true

    Rafraichissement AJAX

    Le dashboard utilise JavaScript pour mettre a jour uniquement les valeurs qui changent, sans recharger la page entiere.

    Fonctionnement

    1. Chargement initial : La page HTML complete est servie
    2. Rafraichissement periodique : JavaScript appelle /api/status et /api/workers
    3. Mise a jour selective : Seuls les elements dont la valeur a change sont modifies
    4. Animation visuelle : Les valeurs modifiees sont brievement mises en surbrillance (effet cyan)

    Avantages

    • Pas de rechargement complet de la page
    • Experience utilisateur fluide
    • Reduction de la bande passante
    • Conservation de l’etat de scroll

    Configuration de l’intervalle

    L’intervalle de rafraichissement AJAX correspond a refresh_interval :

    socle:
      status_dashboard:
        refresh_interval: 3  # Rafraichissement toutes les 3 secondes
    

    Endpoints HTTP

    Dashboard HTML

    Endpoint Methode Description
    / GET Page HTML du dashboard
    /index.html GET Alias pour /

    Health Check

    Endpoint Methode Description
    /health GET Status UP/DOWN en JSON

    Exemple de reponse :

    {"status":"UP"}
    

    API JSON

    Endpoint Methode Description
    /api/status GET Status global de l’application
    /api/workers GET Liste de tous les workers avec metriques
    /api/workers/{name} GET Metriques d’un worker specifique

    Donnees affichees

    Section : Status Global

    Donnee Description
    MOP State Etat du MainOrchestratorProcess (RUNNING, DRAINING, etc.)
    Uptime Temps depuis le demarrage
    Workers Health Nombre de workers healthy / total
    Total Activity Throughput agrege (ops/sec)

    Section : Worker Activity

    Barres visuelles montrant la charge relative de chaque Worker :

    cdc_kafka_worker    ████████████████████░░░░  85%  [HOT]
    http_worker         ██████████████░░░░░░░░░░  58%
    rule_engine         ████████░░░░░░░░░░░░░░░░  32%
    control_worker      ███░░░░░░░░░░░░░░░░░░░░░  12%
    maintenance_worker  █░░░░░░░░░░░░░░░░░░░░░░░   2%  [IDLE]
    

    Tags :

    • [HOT] : Worker avec charge > 80%
    • [IDLE] : Worker inactif
    • [PASSIVE] : Worker event-driven sans activite

    Section : Workers Detail

    Tableau detaille avec :

    Colonne Description
    Name Nom du worker
    State Running / Stopped
    Health OK / FAIL
    Mode PASSIVE / CRON / INTERVAL
    Executions Nombre total d’executions doWork()
    Avg Duration Duree moyenne d’execution
    Throughput Operations par seconde
    Last Activity Temps depuis derniere activite
    Errors Nombre d’erreurs

    Exemples API JSON

    GET /api/status

    {
      "timestamp": "2026-01-12T17:34:56.789Z",
      "application": {
        "name": "my-app",
        "environment": "PROD",
        "version": "4.0.0"
      },
      "mop": {
        "state": "RUNNING",
        "uptime_ms": 9252000,
        "uptime_human": "2h 34m 12s"
      },
      "workers": {
        "total": 6,
        "healthy": 6,
        "running": 6
      },
      "activity": {
        "total_throughput": 847.3,
        "metrics_window_sec": 60
      }
    }
    

    GET /api/workers

    {
      "timestamp": "2026-01-12T17:34:56.789Z",
      "workers": [
        {
          "name": "cdc_kafka_worker",
          "state": "running",
          "healthy": true,
          "schedule": "PASSIVE",
          "metrics": {
            "execution_count": 12847,
            "total_duration_ms": 29548,
            "avg_duration_ms": 2.3,
            "last_execution": "2026-01-12T17:34:55.123Z",
            "throughput_per_sec": 721.4,
            "errors_count": 3,
            "messages_processed": 45230
          },
          "relative_load": 0.85
        }
      ]
    }
    

    Securite

    Bind localhost uniquement (production)

    Pour limiter l’acces au dashboard en production :

    socle:
      status_dashboard:
        bind_address: "127.0.0.1"
    

    Desactiver en production

    socle:
      status_dashboard:
        enabled: false
    

    Ou via variable d’environnement :

    export STATUS_DASHBOARD_ENABLED=false
    

    Architecture

    ┌─────────────────────────────────────────────────────────────┐
    │                  StatusDashboardWorker                      │
    │                                                             │
    │  ┌─────────────────────┐    ┌─────────────────────────┐    │
    │  │ WorkerActivityTracker│    │ DashboardHtmlRenderer   │    │
    │  │ (collecte metriques) │    │ (genere HTML)           │    │
    │  └──────────┬──────────┘    └────────────┬────────────┘    │
    │             │                            │                  │
    │             └──────────┬─────────────────┘                  │
    │                        │                                    │
    │              ┌─────────▼─────────┐                          │
    │              │   MiniHttpServer  │                          │
    │              │   (port 9374)     │                          │
    │              └─────────┬─────────┘                          │
    └────────────────────────┼────────────────────────────────────┘
                             │
                             ▼
                        Browser / curl
    

    Composants

    Composant Responsabilite
    StatusDashboardWorker Worker principal, orchestre le dashboard
    WorkerActivityTracker Collecte et agregation des metriques
    MiniHttpServer Serveur HTTP leger (ServerSocket)
    DashboardHtmlRenderer Generation du HTML avec CSS inline

    Integration avec Monitoring

    Le dashboard peut etre integre avec des outils de monitoring existants :

    Prometheus / Grafana

    Utilisez l’endpoint /api/status pour collecter les metriques :

    # prometheus.yml
    scrape_configs:
      - job_name: 'socle-status'
        metrics_path: /api/status
        static_configs:
          - targets: ['localhost:9374']
    

    Health Checks (Kubernetes)

    # deployment.yaml
    livenessProbe:
      httpGet:
        path: /health
        port: 9374
      initialDelaySeconds: 30
      periodSeconds: 10
    

    Convention des Stats Workers

    Pour que le dashboard affiche correctement les metriques, les workers doivent exposer des cles standardisees dans getStats().

    Cles requises par WorkerActivityTracker

    Cle Type Utilisation
    state String Affichage Running/Stopped
    execution_count long Colonne Executions
    errors_count long Colonne Errors
    last_execution String/long Colonne Last Activity
    schedule String Colonne Mode

    Cles optionnelles

    Cle Type Utilisation
    total_duration_ms long Calcul Avg Duration
    avg_duration_ms double Colonne Avg Duration (prioritaire)
    throughput_per_sec double Colonne Throughput
    messages_processed long Fallback pour execution_count

    Note : Les workers heritant de AbstractEventDrivenWorker exposent automatiquement ces cles depuis la version 4.0.1.

    Voir 05-WORKERS.md section 12 pour les details d’implementation.

    Troubleshooting

    Le dashboard ne demarre pas

    Cause possible : Port deja utilise

    Solution :

    socle:
      status_dashboard:
        port: 9375  # Changer le port
    

    Metriques a zero

    Cause possible : Les workers sont en mode PASSIVE et n’ont pas encore traite d’evenements

    Solution : Normal pour les workers event-driven. Les metriques apparaitront des que des evenements seront traites.

    Dashboard lent

    Cause possible : Trop de workers ou refresh trop frequent

    Solution :

    socle:
      status_dashboard:
        refresh_interval: 10  # Augmenter l'intervalle
    

    Voir aussi

    Socle V004 – Status Dashboard

  • Socle V004 – Dépannage

    Socle V004 – Dépannage

    18 – Troubleshooting

    Version : 4.0.0 Date : 2025-12-09

    1. Problèmes de démarrage

    1.1 Application ne démarre pas

    Symptôme : L’application ne démarre pas ou crashe immédiatement.

    Causes possibles :

    1. Port déjà utilisé

      Error: Address already in use: bind
      

      Solution :

      # Trouver le processus
      lsof -i :8080
      # Changer le port
      export HTTP_PORT=8081
      
    2. Configuration manquante

      Failed to bind properties under 'socle.xxx'
      

      Solution : Vérifier les variables d’environnement et application.yml

    3. Erreur de logging

      ERROR StatusLogger Log4j2 could not find a logging implementation
      

      Solution : Vérifier que log4j2.xml existe dans src/main/resources/

    1.2 Workers ne démarrent pas

    Symptôme : Les workers sont enregistrés mais restent en état REGISTERED.

    Solutions :

    1. Vérifier les logs d’initialisation
    2. Vérifier les dépendances (base de données, Redis, etc.)
    3. Vérifier les priorités de démarrage
    curl http://localhost:8080/admin/workers
    

    2. Problèmes de connectivité

    2.1 Redis non accessible

    Symptôme :

    Cannot get Jedis connection
    

    Solutions :

    1. Vérifier l’hôte et le port Redis
      redis-cli -h localhost -p 6379 ping
      
    2. Vérifier le mot de passe
    3. Vérifier les firewalls

    2.2 Database non accessible

    Symptôme :

    Database may be already in use: "locked by another process"
    

    Solutions :

    1. Arrêter les autres instances
    2. Utiliser AUTO_SERVER=TRUE dans l’URL H2
    3. Supprimer les fichiers de lock
    rm ./data/socle-techdb.lock.db
    

    3. Problèmes de logging (V4)

    3.1 Logs non visibles

    Symptôme : Aucun log n’apparaît.

    Solutions :

    1. Vérifier que log4j2.xml existe
    2. Vérifier le niveau de log
    3. Vérifier logging.config dans application.yml
    logging:
      config: classpath:log4j2.xml
    

    3.2 Conflit Logback/Log4j2

    Symptôme :

    SLF4J: Class path contains multiple SLF4J bindings
    

    Solution : Exclure Logback de toutes les dépendances

    mvn dependency:tree | grep logback
    
    <exclusion>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-logging</artifactId>
    </exclusion>
    

    3.3 AsyncLoggers non actifs

    Symptôme : Performance de logging dégradée.

    Solution : Vérifier log4j2.component.properties

    Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
    

    3.4 LogForwarder queue pleine

    Symptôme :

    WARN - Log queue full, storing to fallback
    

    Solutions :

    1. Augmenter queue-capacity
    2. Vérifier la connectivité réseau vers le LogHub
    3. Réduire le volume de logs
    # Vérifier les logs en fallback
    curl http://localhost:8080/admin/logforwarder/status
    

    4. Problèmes de performance

    4.1 Haute consommation CPU

    Solutions :

    1. Vérifier les workers en boucle infinie
    2. Vérifier les logs en DEBUG
    3. Profiler avec JFR
    jcmd <pid> JFR.start duration=60s filename=recording.jfr
    

    4.2 Haute consommation mémoire

    Solutions :

    1. Analyser le heap dump
      jmap -dump:format=b,file=heap.hprof <pid>
      
    2. Vérifier les fuites dans KvBus/SharedDataRegistry
    3. Ajuster la configuration JVM

    4.3 Latence élevée

    Solutions :

    1. Vérifier les circuit breakers
      curl http://localhost:8080/admin/resilience/circuits
      
    2. Vérifier les connexions réseau
    3. Vérifier les métriques
      curl http://localhost:8080/actuator/prometheus | grep latency
      

    5. Problèmes de résilience

    5.1 Circuit Breaker bloqué en OPEN

    Symptôme : Un circuit reste ouvert malgré la récupération du service.

    Solutions :

    1. Reset manuel
      curl -X POST http://localhost:8080/admin/resilience/circuits/my-circuit/reset
      
    2. Vérifier le timeout configuré
    3. Vérifier que le service cible répond

    5.2 Retry infini

    Symptôme : L’application retry sans fin.

    Solutions :

    1. Vérifier max-attempts configuré
    2. Vérifier les exceptions retryables
    3. Ajouter un circuit breaker

    6. Problèmes H2 TechDB (V4)

    6.1 Base corrompue

    Symptôme :

    File corrupted
    

    Solution :

    rm -rf ./data/socle-techdb.*
    # Redémarrer l'application
    

    6.2 H2 Console inaccessible

    Solutions :

    1. Vérifier socle.techdb.console.enabled=true
    2. Vérifier l’URL : http://localhost:8080/h2-console
    3. Utiliser l’URL JDBC correcte : jdbc:h2:file:./data/socle-techdb

    6.3 Offsets perdus

    Solutions :

    1. Vérifier que TechDB est enabled
    2. Vérifier les logs de saveOffset
    3. Requêter directement H2
      SELECT * FROM socle_offsets;
      

    7. Problèmes d’authentification (V4)

    7.1 Login échoue

    Symptôme :

    AuthenticationException: Login failed: 401
    

    Solutions :

    1. Vérifier API_KEY
    2. Vérifier SOURCE_NAME
    3. Vérifier AUTH_SERVER_URL

    7.2 Token expiré

    Symptôme :

    Token expired
    

    Solutions :

    1. Vérifier l’horloge système (NTP)
    2. Augmenter access-token-buffer-seconds

    7.3 Admin API 401

    Solutions :

    1. Vérifier si l’auth est activée
      socle.admin.auth.enabled: true
      
    2. Utiliser les credentials corrects
      curl -u admin:password http://localhost:8080/admin/workers
      

    8. Problèmes Kubernetes

    8.1 Pod en CrashLoopBackOff

    Solutions :

    1. Vérifier les logs
      kubectl logs <pod-name> --previous
      
    2. Vérifier les ressources
    3. Vérifier les probes

    8.2 Probes échouent

    Solutions :

    1. Augmenter initialDelaySeconds
    2. Vérifier que l’endpoint /admin/health répond
    3. Vérifier le port

    8.3 OOMKilled

    Solutions :

    1. Augmenter les limites mémoire
    2. Ajuster les options JVM
      -XX:MaxRAMPercentage=75.0
      

    9. Commandes de diagnostic

    9.1 API Admin

    # Santé globale
    curl http://localhost:8080/admin/health
    
    # État des workers
    curl http://localhost:8080/admin/workers
    
    # Registry
    curl http://localhost:8080/admin/registry
    
    # Circuits breakers
    curl http://localhost:8080/admin/resilience/circuits
    
    # Configuration
    curl http://localhost:8080/admin/config
    
    # Métriques
    curl http://localhost:8080/actuator/prometheus
    

    9.2 JVM

    # Thread dump
    jstack <pid>
    
    # Heap info
    jmap -heap <pid>
    
    # GC stats
    jstat -gcutil <pid> 1000
    
    # JFR recording
    jcmd <pid> JFR.start duration=60s filename=recording.jfr
    

    9.3 Réseau

    # Test Redis
    redis-cli -h localhost ping
    
    # Test HTTP
    curl -v http://localhost:8080/admin/health
    
    # DNS
    nslookup myservice.namespace.svc.cluster.local
    

    10. Logs utiles à activer

    # application.yml ou variables d'environnement
    
    logging:
      level:
        eu.lmvi.socle: DEBUG
        eu.lmvi.socle.mop: DEBUG
        eu.lmvi.socle.supervisor: DEBUG
        eu.lmvi.socle.techdb: DEBUG
        eu.lmvi.socle.resilience: DEBUG
        org.springframework.web: DEBUG
        io.lettuce: DEBUG  # Redis
    

    11. Checklist de diagnostic

    □ L'application démarre-t-elle ?
      □ Logs de démarrage présents ?
      □ Port disponible ?
      □ Configuration valide ?
    
    □ Les workers sont-ils healthy ?
      □ GET /admin/workers
      □ Heartbeats reçus ?
      □ Erreurs dans les logs ?
    
    □ Les connexions externes fonctionnent-elles ?
      □ Redis accessible ?
      □ Base de données accessible ?
      □ APIs externes accessibles ?
    
    □ Les métriques sont-elles normales ?
      □ CPU < 80% ?
      □ Mémoire < 80% ?
      □ Latence acceptable ?
      □ Taux d'erreur bas ?
    
    □ Les logs sont-ils corrects ?
      □ Log4j2 configuré ?
      □ LogForwarder fonctionne ?
      □ Pas de logs en fallback ?
    

    12. Références

  • Socle V004 – Introduction

    Socle V004 – Introduction

    01 – Introduction au Socle V4

    Version : 4.0.0 Date : 2025-01-25

    1. Qu’est-ce que le Socle V4 ?

    Le Socle V4 est un framework Java de grade production construit sur Spring Boot 3.2.1 qui implémente le pattern MOP (Main Orchestrator Process). Il fournit une base solide pour construire des applications d’entreprise robustes et observables.

    Évolution depuis V3

    Le Socle V4 conserve et étend l’architecture V3 en ajoutant :

    Nouveauté V4 Description
    H2 TechDB Base embarquée pour état technique (remplace Nitrite)
    Log4j2 Framework logging haute performance (remplace Logback)
    LogForwarder Centralisation des logs vers LogHub (HTTP/NATS)
    SocleAuthClient Client authentification JWT
    WorkerRegistryClient Auto-enregistrement des workers
    StatusDashboard Dashboard HTML de supervision temps réel (port 9374)
    Pipeline V2 Pipeline asynchrone avec garantie at-least-once (Queue/Claim/Ack)

    2. Philosophie « MOP Pilote Tout »

    Le Main Orchestrator Process est le cœur du framework :

    ┌─────────────────────────────────────────────────────────────────┐
    │                           MOP                                    │
    │  - Orchestre tous les Workers                                   │
    │  - Gère le lifecycle (start/stop)                               │
    │  - Appelle doWork() automatiquement                             │
    │  - Garantit le shutdown gracieux                                │
    └─────────────────────────────────────────────────────────────────┘
                                  │
             ┌────────────────────┼────────────────────┐
             ▼                    ▼                    ▼
        ┌─────────┐         ┌─────────┐         ┌─────────┐
        │ Worker  │         │ Worker  │         │  HTTP   │
        │ Métier  │         │ Métier  │         │ Worker  │
        └─────────┘         └─────────┘         └─────────┘
    

    Principes clés

    1. Orchestration centralisée : Le MOP contrôle tout le lifecycle
    2. Démarrage ordonné : Workers par priorité (petit → grand), HTTP en dernier
    3. Arrêt gracieux : HTTP d’abord (drain), puis Workers
    4. Scheduling automatique : doWork() appelé selon cron ou interval

    3. Les 4 principes fondamentaux V4

    3.1 Portabilité

    • Fonctionne sur ARM/AMD64, Linux/macOS
    • Aucune dépendance serveur externe obligatoire
    • Base H2 embarquée pour l’état technique

    3.2 Sécurité

    • Aucun port entrant sur les NUC/agents
    • Communication sortante uniquement (HTTP/NATS)
    • Authentification JWT pour les services centraux

    3.3 Observabilité

    • Logs centralisés via LogForwarder
    • Corrélation par correlationId / execId
    • Suivi des workers via Registry

    3.4 Standardisation

    • Même authentification partout
    • Même format de logs
    • Même enregistrement des workers

    4. Stack technique

    Composant Version Usage
    Java 21 LTS Runtime
    Spring Boot 3.2.1 Framework
    Log4j2 2.22.1 Logging (nouveau V4)
    LMAX Disruptor 4.0.0 AsyncLoggers
    H2 2.2.x Base technique embarquée (nouveau V4)
    Kafka 3.6.0 Messaging
    NATS 2.17.0 Messaging
    Redisson 3.24.3 Redis client
    OkHttp 4.12.0 HTTP client
    Micrometer 1.12.0 Metrics

    5. Composants du Socle

    Composants V3 (conservés)

    Package Description
    mop Main Orchestrator Process
    worker Interface Worker
    config SocleConfiguration
    kv KvBus (in_memory / Redis)
    shared SharedDataRegistry
    supervisor Supervision heartbeats
    http HttpWorker, TomcatManager
    admin AdminRestApi
    metrics SocleMetrics
    pipeline PipelineEngine
    resilience CircuitBreaker, Retry
    scheduler WorkerScheduler
    security AdminAuthFilter, RateLimit

    Nouveaux composants V4

    Package Description
    techdb H2 TechDB Manager
    logging Log4j2 + LogForwarder
    client/auth SocleAuthClient
    client/registry WorkerRegistryClient

    6. Cas d’usage

    Le Socle V4 est idéal pour :

    • Agents de collecte (DB2 Journal Reader, CDC)
    • Services de synchronisation (ODH-sync)
    • Proxies et bridges (Kafka Proxy)
    • Workers de traitement (ETL, pipelines)
    • Services multi-région (MTQ, GUA, REU, etc.)

    7. Prérequis

    Développement

    • JDK 21+
    • Maven 3.9+
    • IDE (IntelliJ IDEA recommandé)

    Production

    • JRE 21+
    • Docker (optionnel)
    • Accès NATS ou HTTP pour LogForwarder (optionnel)

    8. Premiers pas

    # Cloner le projet
    git clone <repo>/socle-v004.git
    
    # Build
    cd socle-v004
    mvn clean package -DskipTests
    
    # Run
    java -jar target/socle-v004-4.0.0.jar
    
    # Vérifier
    curl http://localhost:8080/health
    

    9. Documentation

    Document Description
    02-ARCHITECTURE Architecture détaillée
    03-QUICKSTART Guide de démarrage
    08-SUPERVISOR Supervision et heartbeats
    09-PIPELINE Pipeline V1 et V2
    21-H2-TECHDB Base H2 (V4)
    22-LOG4J2-LOGFORWARDER Logging V4
    25-MIGRATION-V3-V4 Migration
    27-STATUS-DASHBOARD Dashboard supervision
    GUIDE-METHODOLOGIQUE Bonnes pratiques

    10. Support

    • Issues : GitHub Issues
    • Documentation : Ce dossier docs/Help/
    • Exemples : 20-EXEMPLES
  • Socle V004 – Dépannage

    Socle V004 – Dépannage

    18 – Troubleshooting

    Version : 4.0.0 Date : 2025-12-09

    1. Problèmes de démarrage

    1.1 Application ne démarre pas

    Symptôme : L’application ne démarre pas ou crashe immédiatement.

    Causes possibles :

    1. Port déjà utilisé

      Error: Address already in use: bind
      

      Solution :

      # Trouver le processus
      lsof -i :8080
      # Changer le port
      export HTTP_PORT=8081
      
    2. Configuration manquante

      Failed to bind properties under 'socle.xxx'
      

      Solution : Vérifier les variables d’environnement et application.yml

    3. Erreur de logging

      ERROR StatusLogger Log4j2 could not find a logging implementation
      

      Solution : Vérifier que log4j2.xml existe dans src/main/resources/

    1.2 Workers ne démarrent pas

    Symptôme : Les workers sont enregistrés mais restent en état REGISTERED.

    Solutions :

    1. Vérifier les logs d’initialisation
    2. Vérifier les dépendances (base de données, Redis, etc.)
    3. Vérifier les priorités de démarrage
    curl http://localhost:8080/admin/workers
    

    2. Problèmes de connectivité

    2.1 Redis non accessible

    Symptôme :

    Cannot get Jedis connection
    

    Solutions :

    1. Vérifier l’hôte et le port Redis
      redis-cli -h localhost -p 6379 ping
      
    2. Vérifier le mot de passe
    3. Vérifier les firewalls

    2.2 Database non accessible

    Symptôme :

    Database may be already in use: "locked by another process"
    

    Solutions :

    1. Arrêter les autres instances
    2. Utiliser AUTO_SERVER=TRUE dans l’URL H2
    3. Supprimer les fichiers de lock
    rm ./data/socle-techdb.lock.db
    

    3. Problèmes de logging (V4)

    3.1 Logs non visibles

    Symptôme : Aucun log n’apparaît.

    Solutions :

    1. Vérifier que log4j2.xml existe
    2. Vérifier le niveau de log
    3. Vérifier logging.config dans application.yml
    logging:
      config: classpath:log4j2.xml
    

    3.2 Conflit Logback/Log4j2

    Symptôme :

    SLF4J: Class path contains multiple SLF4J bindings
    

    Solution : Exclure Logback de toutes les dépendances

    mvn dependency:tree | grep logback
    
    <exclusion>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-logging</artifactId>
    </exclusion>
    

    3.3 AsyncLoggers non actifs

    Symptôme : Performance de logging dégradée.

    Solution : Vérifier log4j2.component.properties

    Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
    

    3.4 LogForwarder queue pleine

    Symptôme :

    WARN - Log queue full, storing to fallback
    

    Solutions :

    1. Augmenter queue-capacity
    2. Vérifier la connectivité réseau vers le LogHub
    3. Réduire le volume de logs
    # Vérifier les logs en fallback
    curl http://localhost:8080/admin/logforwarder/status
    

    4. Problèmes de performance

    4.1 Haute consommation CPU

    Solutions :

    1. Vérifier les workers en boucle infinie
    2. Vérifier les logs en DEBUG
    3. Profiler avec JFR
    jcmd <pid> JFR.start duration=60s filename=recording.jfr
    

    4.2 Haute consommation mémoire

    Solutions :

    1. Analyser le heap dump
      jmap -dump:format=b,file=heap.hprof <pid>
      
    2. Vérifier les fuites dans KvBus/SharedDataRegistry
    3. Ajuster la configuration JVM

    4.3 Latence élevée

    Solutions :

    1. Vérifier les circuit breakers
      curl http://localhost:8080/admin/resilience/circuits
      
    2. Vérifier les connexions réseau
    3. Vérifier les métriques
      curl http://localhost:8080/actuator/prometheus | grep latency
      

    5. Problèmes de résilience

    5.1 Circuit Breaker bloqué en OPEN

    Symptôme : Un circuit reste ouvert malgré la récupération du service.

    Solutions :

    1. Reset manuel
      curl -X POST http://localhost:8080/admin/resilience/circuits/my-circuit/reset
      
    2. Vérifier le timeout configuré
    3. Vérifier que le service cible répond

    5.2 Retry infini

    Symptôme : L’application retry sans fin.

    Solutions :

    1. Vérifier max-attempts configuré
    2. Vérifier les exceptions retryables
    3. Ajouter un circuit breaker

    6. Problèmes H2 TechDB (V4)

    6.1 Base corrompue

    Symptôme :

    File corrupted
    

    Solution :

    rm -rf ./data/socle-techdb.*
    # Redémarrer l'application
    

    6.2 H2 Console inaccessible

    Solutions :

    1. Vérifier socle.techdb.console.enabled=true
    2. Vérifier l’URL : http://localhost:8080/h2-console
    3. Utiliser l’URL JDBC correcte : jdbc:h2:file:./data/socle-techdb

    6.3 Offsets perdus

    Solutions :

    1. Vérifier que TechDB est enabled
    2. Vérifier les logs de saveOffset
    3. Requêter directement H2
      SELECT * FROM socle_offsets;
      

    7. Problèmes d’authentification (V4)

    7.1 Login échoue

    Symptôme :

    AuthenticationException: Login failed: 401
    

    Solutions :

    1. Vérifier API_KEY
    2. Vérifier SOURCE_NAME
    3. Vérifier AUTH_SERVER_URL

    7.2 Token expiré

    Symptôme :

    Token expired
    

    Solutions :

    1. Vérifier l’horloge système (NTP)
    2. Augmenter access-token-buffer-seconds

    7.3 Admin API 401

    Solutions :

    1. Vérifier si l’auth est activée
      socle.admin.auth.enabled: true
      
    2. Utiliser les credentials corrects
      curl -u admin:password http://localhost:8080/admin/workers
      

    8. Problèmes Kubernetes

    8.1 Pod en CrashLoopBackOff

    Solutions :

    1. Vérifier les logs
      kubectl logs <pod-name> --previous
      
    2. Vérifier les ressources
    3. Vérifier les probes

    8.2 Probes échouent

    Solutions :

    1. Augmenter initialDelaySeconds
    2. Vérifier que l’endpoint /admin/health répond
    3. Vérifier le port

    8.3 OOMKilled

    Solutions :

    1. Augmenter les limites mémoire
    2. Ajuster les options JVM
      -XX:MaxRAMPercentage=75.0
      

    9. Commandes de diagnostic

    9.1 API Admin

    # Santé globale
    curl http://localhost:8080/admin/health
    
    # État des workers
    curl http://localhost:8080/admin/workers
    
    # Registry
    curl http://localhost:8080/admin/registry
    
    # Circuits breakers
    curl http://localhost:8080/admin/resilience/circuits
    
    # Configuration
    curl http://localhost:8080/admin/config
    
    # Métriques
    curl http://localhost:8080/actuator/prometheus
    

    9.2 JVM

    # Thread dump
    jstack <pid>
    
    # Heap info
    jmap -heap <pid>
    
    # GC stats
    jstat -gcutil <pid> 1000
    
    # JFR recording
    jcmd <pid> JFR.start duration=60s filename=recording.jfr
    

    9.3 Réseau

    # Test Redis
    redis-cli -h localhost ping
    
    # Test HTTP
    curl -v http://localhost:8080/admin/health
    
    # DNS
    nslookup myservice.namespace.svc.cluster.local
    

    10. Logs utiles à activer

    # application.yml ou variables d'environnement
    
    logging:
      level:
        eu.lmvi.socle: DEBUG
        eu.lmvi.socle.mop: DEBUG
        eu.lmvi.socle.supervisor: DEBUG
        eu.lmvi.socle.techdb: DEBUG
        eu.lmvi.socle.resilience: DEBUG
        org.springframework.web: DEBUG
        io.lettuce: DEBUG  # Redis
    

    11. Checklist de diagnostic

    □ L'application démarre-t-elle ?
      □ Logs de démarrage présents ?
      □ Port disponible ?
      □ Configuration valide ?
    
    □ Les workers sont-ils healthy ?
      □ GET /admin/workers
      □ Heartbeats reçus ?
      □ Erreurs dans les logs ?
    
    □ Les connexions externes fonctionnent-elles ?
      □ Redis accessible ?
      □ Base de données accessible ?
      □ APIs externes accessibles ?
    
    □ Les métriques sont-elles normales ?
      □ CPU < 80% ?
      □ Mémoire < 80% ?
      □ Latence acceptable ?
      □ Taux d'erreur bas ?
    
    □ Les logs sont-ils corrects ?
      □ Log4j2 configuré ?
      □ LogForwarder fonctionne ?
      □ Pas de logs en fallback ?
    

    12. Références

  • Socle V004 – Introduction

    Socle V004 – Introduction

    01 – Introduction au Socle V4

    Version : 4.0.0 Date : 2025-01-25

    1. Qu’est-ce que le Socle V4 ?

    Le Socle V4 est un framework Java de grade production construit sur Spring Boot 3.2.1 qui implémente le pattern MOP (Main Orchestrator Process). Il fournit une base solide pour construire des applications d’entreprise robustes et observables.

    Évolution depuis V3

    Le Socle V4 conserve et étend l’architecture V3 en ajoutant :

    Nouveauté V4 Description
    H2 TechDB Base embarquée pour état technique (remplace Nitrite)
    Log4j2 Framework logging haute performance (remplace Logback)
    LogForwarder Centralisation des logs vers LogHub (HTTP/NATS)
    SocleAuthClient Client authentification JWT
    WorkerRegistryClient Auto-enregistrement des workers
    StatusDashboard Dashboard HTML de supervision temps réel (port 9374)
    Pipeline V2 Pipeline asynchrone avec garantie at-least-once (Queue/Claim/Ack)

    2. Philosophie « MOP Pilote Tout »

    Le Main Orchestrator Process est le cœur du framework :

    ┌─────────────────────────────────────────────────────────────────┐
    │                           MOP                                    │
    │  - Orchestre tous les Workers                                   │
    │  - Gère le lifecycle (start/stop)                               │
    │  - Appelle doWork() automatiquement                             │
    │  - Garantit le shutdown gracieux                                │
    └─────────────────────────────────────────────────────────────────┘
                                  │
             ┌────────────────────┼────────────────────┐
             ▼                    ▼                    ▼
        ┌─────────┐         ┌─────────┐         ┌─────────┐
        │ Worker  │         │ Worker  │         │  HTTP   │
        │ Métier  │         │ Métier  │         │ Worker  │
        └─────────┘         └─────────┘         └─────────┘
    

    Principes clés

    1. Orchestration centralisée : Le MOP contrôle tout le lifecycle
    2. Démarrage ordonné : Workers par priorité (petit → grand), HTTP en dernier
    3. Arrêt gracieux : HTTP d’abord (drain), puis Workers
    4. Scheduling automatique : doWork() appelé selon cron ou interval

    3. Les 4 principes fondamentaux V4

    3.1 Portabilité

    • Fonctionne sur ARM/AMD64, Linux/macOS
    • Aucune dépendance serveur externe obligatoire
    • Base H2 embarquée pour l’état technique

    3.2 Sécurité

    • Aucun port entrant sur les NUC/agents
    • Communication sortante uniquement (HTTP/NATS)
    • Authentification JWT pour les services centraux

    3.3 Observabilité

    • Logs centralisés via LogForwarder
    • Corrélation par correlationId / execId
    • Suivi des workers via Registry

    3.4 Standardisation

    • Même authentification partout
    • Même format de logs
    • Même enregistrement des workers

    4. Stack technique

    Composant Version Usage
    Java 21 LTS Runtime
    Spring Boot 3.2.1 Framework
    Log4j2 2.22.1 Logging (nouveau V4)
    LMAX Disruptor 4.0.0 AsyncLoggers
    H2 2.2.x Base technique embarquée (nouveau V4)
    Kafka 3.6.0 Messaging
    NATS 2.17.0 Messaging
    Redisson 3.24.3 Redis client
    OkHttp 4.12.0 HTTP client
    Micrometer 1.12.0 Metrics

    5. Composants du Socle

    Composants V3 (conservés)

    Package Description
    mop Main Orchestrator Process
    worker Interface Worker
    config SocleConfiguration
    kv KvBus (in_memory / Redis)
    shared SharedDataRegistry
    supervisor Supervision heartbeats
    http HttpWorker, TomcatManager
    admin AdminRestApi
    metrics SocleMetrics
    pipeline PipelineEngine
    resilience CircuitBreaker, Retry
    scheduler WorkerScheduler
    security AdminAuthFilter, RateLimit

    Nouveaux composants V4

    Package Description
    techdb H2 TechDB Manager
    logging Log4j2 + LogForwarder
    client/auth SocleAuthClient
    client/registry WorkerRegistryClient

    6. Cas d’usage

    Le Socle V4 est idéal pour :

    • Agents de collecte (DB2 Journal Reader, CDC)
    • Services de synchronisation (ODH-sync)
    • Proxies et bridges (Kafka Proxy)
    • Workers de traitement (ETL, pipelines)
    • Services multi-région (MTQ, GUA, REU, etc.)

    7. Prérequis

    Développement

    • JDK 21+
    • Maven 3.9+
    • IDE (IntelliJ IDEA recommandé)

    Production

    • JRE 21+
    • Docker (optionnel)
    • Accès NATS ou HTTP pour LogForwarder (optionnel)

    8. Premiers pas

    # Cloner le projet
    git clone <repo>/socle-v004.git
    
    # Build
    cd socle-v004
    mvn clean package -DskipTests
    
    # Run
    java -jar target/socle-v004-4.0.0.jar
    
    # Vérifier
    curl http://localhost:8080/health
    

    9. Documentation

    Document Description
    02-ARCHITECTURE Architecture détaillée
    03-QUICKSTART Guide de démarrage
    08-SUPERVISOR Supervision et heartbeats
    09-PIPELINE Pipeline V1 et V2
    21-H2-TECHDB Base H2 (V4)
    22-LOG4J2-LOGFORWARDER Logging V4
    25-MIGRATION-V3-V4 Migration
    27-STATUS-DASHBOARD Dashboard supervision
    GUIDE-METHODOLOGIQUE Bonnes pratiques

    10. Support

    • Issues : GitHub Issues
    • Documentation : Ce dossier docs/Help/
    • Exemples : 20-EXEMPLES
  • Socle V004 – Dépannage

    Socle V004 – Dépannage

    18 – Troubleshooting

    Version : 4.0.0 Date : 2025-12-09

    1. Problèmes de démarrage

    1.1 Application ne démarre pas

    Symptôme : L’application ne démarre pas ou crashe immédiatement.

    Causes possibles :

    1. Port déjà utilisé

      Error: Address already in use: bind
      

      Solution :

      # Trouver le processus
      lsof -i :8080
      # Changer le port
      export HTTP_PORT=8081
      
    2. Configuration manquante

      Failed to bind properties under 'socle.xxx'
      

      Solution : Vérifier les variables d’environnement et application.yml

    3. Erreur de logging

      ERROR StatusLogger Log4j2 could not find a logging implementation
      

      Solution : Vérifier que log4j2.xml existe dans src/main/resources/

    1.2 Workers ne démarrent pas

    Symptôme : Les workers sont enregistrés mais restent en état REGISTERED.

    Solutions :

    1. Vérifier les logs d’initialisation
    2. Vérifier les dépendances (base de données, Redis, etc.)
    3. Vérifier les priorités de démarrage
    curl http://localhost:8080/admin/workers
    

    2. Problèmes de connectivité

    2.1 Redis non accessible

    Symptôme :

    Cannot get Jedis connection
    

    Solutions :

    1. Vérifier l’hôte et le port Redis
      redis-cli -h localhost -p 6379 ping
      
    2. Vérifier le mot de passe
    3. Vérifier les firewalls

    2.2 Database non accessible

    Symptôme :

    Database may be already in use: "locked by another process"
    

    Solutions :

    1. Arrêter les autres instances
    2. Utiliser AUTO_SERVER=TRUE dans l’URL H2
    3. Supprimer les fichiers de lock
    rm ./data/socle-techdb.lock.db
    

    3. Problèmes de logging (V4)

    3.1 Logs non visibles

    Symptôme : Aucun log n’apparaît.

    Solutions :

    1. Vérifier que log4j2.xml existe
    2. Vérifier le niveau de log
    3. Vérifier logging.config dans application.yml
    logging:
      config: classpath:log4j2.xml
    

    3.2 Conflit Logback/Log4j2

    Symptôme :

    SLF4J: Class path contains multiple SLF4J bindings
    

    Solution : Exclure Logback de toutes les dépendances

    mvn dependency:tree | grep logback
    
    <exclusion>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-logging</artifactId>
    </exclusion>
    

    3.3 AsyncLoggers non actifs

    Symptôme : Performance de logging dégradée.

    Solution : Vérifier log4j2.component.properties

    Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
    

    3.4 LogForwarder queue pleine

    Symptôme :

    WARN - Log queue full, storing to fallback
    

    Solutions :

    1. Augmenter queue-capacity
    2. Vérifier la connectivité réseau vers le LogHub
    3. Réduire le volume de logs
    # Vérifier les logs en fallback
    curl http://localhost:8080/admin/logforwarder/status
    

    4. Problèmes de performance

    4.1 Haute consommation CPU

    Solutions :

    1. Vérifier les workers en boucle infinie
    2. Vérifier les logs en DEBUG
    3. Profiler avec JFR
    jcmd <pid> JFR.start duration=60s filename=recording.jfr
    

    4.2 Haute consommation mémoire

    Solutions :

    1. Analyser le heap dump
      jmap -dump:format=b,file=heap.hprof <pid>
      
    2. Vérifier les fuites dans KvBus/SharedDataRegistry
    3. Ajuster la configuration JVM

    4.3 Latence élevée

    Solutions :

    1. Vérifier les circuit breakers
      curl http://localhost:8080/admin/resilience/circuits
      
    2. Vérifier les connexions réseau
    3. Vérifier les métriques
      curl http://localhost:8080/actuator/prometheus | grep latency
      

    5. Problèmes de résilience

    5.1 Circuit Breaker bloqué en OPEN

    Symptôme : Un circuit reste ouvert malgré la récupération du service.

    Solutions :

    1. Reset manuel
      curl -X POST http://localhost:8080/admin/resilience/circuits/my-circuit/reset
      
    2. Vérifier le timeout configuré
    3. Vérifier que le service cible répond

    5.2 Retry infini

    Symptôme : L’application retry sans fin.

    Solutions :

    1. Vérifier max-attempts configuré
    2. Vérifier les exceptions retryables
    3. Ajouter un circuit breaker

    6. Problèmes H2 TechDB (V4)

    6.1 Base corrompue

    Symptôme :

    File corrupted
    

    Solution :

    rm -rf ./data/socle-techdb.*
    # Redémarrer l'application
    

    6.2 H2 Console inaccessible

    Solutions :

    1. Vérifier socle.techdb.console.enabled=true
    2. Vérifier l’URL : http://localhost:8080/h2-console
    3. Utiliser l’URL JDBC correcte : jdbc:h2:file:./data/socle-techdb

    6.3 Offsets perdus

    Solutions :

    1. Vérifier que TechDB est enabled
    2. Vérifier les logs de saveOffset
    3. Requêter directement H2
      SELECT * FROM socle_offsets;
      

    7. Problèmes d’authentification (V4)

    7.1 Login échoue

    Symptôme :

    AuthenticationException: Login failed: 401
    

    Solutions :

    1. Vérifier API_KEY
    2. Vérifier SOURCE_NAME
    3. Vérifier AUTH_SERVER_URL

    7.2 Token expiré

    Symptôme :

    Token expired
    

    Solutions :

    1. Vérifier l’horloge système (NTP)
    2. Augmenter access-token-buffer-seconds

    7.3 Admin API 401

    Solutions :

    1. Vérifier si l’auth est activée
      socle.admin.auth.enabled: true
      
    2. Utiliser les credentials corrects
      curl -u admin:password http://localhost:8080/admin/workers
      

    8. Problèmes Kubernetes

    8.1 Pod en CrashLoopBackOff

    Solutions :

    1. Vérifier les logs
      kubectl logs <pod-name> --previous
      
    2. Vérifier les ressources
    3. Vérifier les probes

    8.2 Probes échouent

    Solutions :

    1. Augmenter initialDelaySeconds
    2. Vérifier que l’endpoint /admin/health répond
    3. Vérifier le port

    8.3 OOMKilled

    Solutions :

    1. Augmenter les limites mémoire
    2. Ajuster les options JVM
      -XX:MaxRAMPercentage=75.0
      

    9. Commandes de diagnostic

    9.1 API Admin

    # Santé globale
    curl http://localhost:8080/admin/health
    
    # État des workers
    curl http://localhost:8080/admin/workers
    
    # Registry
    curl http://localhost:8080/admin/registry
    
    # Circuits breakers
    curl http://localhost:8080/admin/resilience/circuits
    
    # Configuration
    curl http://localhost:8080/admin/config
    
    # Métriques
    curl http://localhost:8080/actuator/prometheus
    

    9.2 JVM

    # Thread dump
    jstack <pid>
    
    # Heap info
    jmap -heap <pid>
    
    # GC stats
    jstat -gcutil <pid> 1000
    
    # JFR recording
    jcmd <pid> JFR.start duration=60s filename=recording.jfr
    

    9.3 Réseau

    # Test Redis
    redis-cli -h localhost ping
    
    # Test HTTP
    curl -v http://localhost:8080/admin/health
    
    # DNS
    nslookup myservice.namespace.svc.cluster.local
    

    10. Logs utiles à activer

    # application.yml ou variables d'environnement
    
    logging:
      level:
        eu.lmvi.socle: DEBUG
        eu.lmvi.socle.mop: DEBUG
        eu.lmvi.socle.supervisor: DEBUG
        eu.lmvi.socle.techdb: DEBUG
        eu.lmvi.socle.resilience: DEBUG
        org.springframework.web: DEBUG
        io.lettuce: DEBUG  # Redis
    

    11. Checklist de diagnostic

    □ L'application démarre-t-elle ?
      □ Logs de démarrage présents ?
      □ Port disponible ?
      □ Configuration valide ?
    
    □ Les workers sont-ils healthy ?
      □ GET /admin/workers
      □ Heartbeats reçus ?
      □ Erreurs dans les logs ?
    
    □ Les connexions externes fonctionnent-elles ?
      □ Redis accessible ?
      □ Base de données accessible ?
      □ APIs externes accessibles ?
    
    □ Les métriques sont-elles normales ?
      □ CPU < 80% ?
      □ Mémoire < 80% ?
      □ Latence acceptable ?
      □ Taux d'erreur bas ?
    
    □ Les logs sont-ils corrects ?
      □ Log4j2 configuré ?
      □ LogForwarder fonctionne ?
      □ Pas de logs en fallback ?
    

    12. Références

  • Socle V004 – TLS/HTTPS

    Socle V004 – TLS/HTTPS

    13 – TLS/HTTPS

    Version : 4.0.0 Date : 2025-12-09

    1. Introduction

    Configuration du TLS/HTTPS pour sécuriser les communications HTTP du Socle V4.

    2. Configuration Spring Boot

    2.1 application.yml

    server:
      port: ${HTTPS_PORT:8443}
      ssl:
        enabled: ${SSL_ENABLED:true}
        key-store: ${SSL_KEYSTORE:classpath:keystore.p12}
        key-store-password: ${SSL_KEYSTORE_PASSWORD:changeit}
        key-store-type: ${SSL_KEYSTORE_TYPE:PKCS12}
        key-alias: ${SSL_KEY_ALIAS:socle}
    

    2.2 Variables d’environnement

    Variable Description Défaut
    SSL_ENABLED Activer SSL false
    SSL_KEYSTORE Chemin du keystore classpath:keystore.p12
    SSL_KEYSTORE_PASSWORD Mot de passe keystore changeit
    SSL_KEYSTORE_TYPE Type de keystore PKCS12
    SSL_KEY_ALIAS Alias de la clé socle

    3. Génération des certificats

    3.1 Certificat auto-signé (développement)

    # Générer un keystore PKCS12 avec certificat auto-signé
    keytool -genkeypair \
      -alias socle \
      -keyalg RSA \
      -keysize 2048 \
      -storetype PKCS12 \
      -keystore keystore.p12 \
      -validity 365 \
      -dname "CN=localhost,OU=Dev,O=MyCompany,L=Paris,C=FR" \
      -storepass changeit \
      -keypass changeit
    
    # Exporter le certificat (pour les clients)
    keytool -exportcert \
      -alias socle \
      -keystore keystore.p12 \
      -storetype PKCS12 \
      -storepass changeit \
      -file socle.crt
    

    3.2 Avec Let’s Encrypt (production)

    # Obtenir le certificat
    certbot certonly --standalone -d myapp.example.com
    
    # Convertir en PKCS12
    openssl pkcs12 -export \
      -in /etc/letsencrypt/live/myapp.example.com/fullchain.pem \
      -inkey /etc/letsencrypt/live/myapp.example.com/privkey.pem \
      -out keystore.p12 \
      -name socle \
      -passout pass:changeit
    

    3.3 Avec CA interne

    # Générer CSR
    keytool -certreq \
      -alias socle \
      -keystore keystore.p12 \
      -file socle.csr \
      -storepass changeit
    
    # Après signature par la CA, importer le certificat
    keytool -importcert \
      -alias socle \
      -keystore keystore.p12 \
      -file signed-cert.crt \
      -storepass changeit
    
    # Importer la chaîne CA
    keytool -importcert \
      -alias ca-root \
      -keystore keystore.p12 \
      -file ca-root.crt \
      -storepass changeit
    

    4. Configuration avancée

    4.1 Mutual TLS (mTLS)

    server:
      ssl:
        enabled: true
        key-store: ${SSL_KEYSTORE:keystore.p12}
        key-store-password: ${SSL_KEYSTORE_PASSWORD}
        key-store-type: PKCS12
        # Trust store pour vérifier les clients
        trust-store: ${SSL_TRUSTSTORE:truststore.p12}
        trust-store-password: ${SSL_TRUSTSTORE_PASSWORD}
        trust-store-type: PKCS12
        # Exiger certificat client
        client-auth: ${SSL_CLIENT_AUTH:need}  # none, want, need
    

    4.2 Protocoles et Ciphers

    server:
      ssl:
        enabled-protocols: TLSv1.3,TLSv1.2
        ciphers:
          - TLS_AES_256_GCM_SHA384
          - TLS_AES_128_GCM_SHA256
          - TLS_CHACHA20_POLY1305_SHA256
          - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
          - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
    

    5. HTTP + HTTPS (dual port)

    5.1 Configuration

    @Configuration
    public class TlsConfiguration {
    
        @Value("${server.http.port:8080}")
        private int httpPort;
    
        @Bean
        public ServletWebServerFactory servletContainer() {
            TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
            tomcat.addAdditionalTomcatConnectors(createHttpConnector());
            return tomcat;
        }
    
        private Connector createHttpConnector() {
            Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
            connector.setScheme("http");
            connector.setPort(httpPort);
            connector.setSecure(false);
            return connector;
        }
    }
    

    5.2 Redirection HTTP → HTTPS

    @Configuration
    public class HttpsRedirectConfiguration {
    
        @Bean
        public TomcatServletWebServerFactory servletContainer() {
            TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
                @Override
                protected void postProcessContext(Context context) {
                    SecurityConstraint securityConstraint = new SecurityConstraint();
                    securityConstraint.setUserConstraint("CONFIDENTIAL");
                    SecurityCollection collection = new SecurityCollection();
                    collection.addPattern("/*");
                    securityConstraint.addCollection(collection);
                    context.addConstraint(securityConstraint);
                }
            };
    
            tomcat.addAdditionalTomcatConnectors(httpToHttpsRedirectConnector());
            return tomcat;
        }
    
        private Connector httpToHttpsRedirectConnector() {
            Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
            connector.setScheme("http");
            connector.setPort(8080);
            connector.setSecure(false);
            connector.setRedirectPort(8443);
            return connector;
        }
    }
    

    6. Client HTTPS

    6.1 OkHttpClient avec TLS

    @Configuration
    public class HttpClientConfiguration {
    
        @Value("${ssl.truststore:#{null}}")
        private Resource trustStore;
    
        @Value("${ssl.truststore-password:changeit}")
        private String trustStorePassword;
    
        @Bean
        public OkHttpClient secureHttpClient() throws Exception {
            OkHttpClient.Builder builder = new OkHttpClient.Builder();
    
            if (trustStore != null && trustStore.exists()) {
                KeyStore ks = KeyStore.getInstance("PKCS12");
                try (InputStream is = trustStore.getInputStream()) {
                    ks.load(is, trustStorePassword.toCharArray());
                }
    
                TrustManagerFactory tmf = TrustManagerFactory.getInstance(
                    TrustManagerFactory.getDefaultAlgorithm());
                tmf.init(ks);
    
                SSLContext sslContext = SSLContext.getInstance("TLS");
                sslContext.init(null, tmf.getTrustManagers(), new SecureRandom());
    
                builder.sslSocketFactory(sslContext.getSocketFactory(),
                    (X509TrustManager) tmf.getTrustManagers()[0]);
            }
    
            return builder
                .connectTimeout(30, TimeUnit.SECONDS)
                .readTimeout(30, TimeUnit.SECONDS)
                .build();
        }
    }
    

    6.2 Bypass SSL pour développement (NON RECOMMANDÉ)

    // UNIQUEMENT POUR LE DÉVELOPPEMENT - NE PAS UTILISER EN PRODUCTION
    public OkHttpClient insecureClient() throws Exception {
        TrustManager[] trustAllCerts = new TrustManager[]{
            new X509TrustManager() {
                public void checkClientTrusted(X509Certificate[] chain, String authType) {}
                public void checkServerTrusted(X509Certificate[] chain, String authType) {}
                public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; }
            }
        };
    
        SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(null, trustAllCerts, new SecureRandom());
    
        return new OkHttpClient.Builder()
            .sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager) trustAllCerts[0])
            .hostnameVerifier((hostname, session) -> true)
            .build();
    }
    

    7. Docker avec TLS

    7.1 Dockerfile

    FROM eclipse-temurin:21-jre
    
    WORKDIR /app
    
    # Copier le certificat
    COPY keystore.p12 /app/certs/keystore.p12
    
    # Copier l'application
    COPY target/socle-v004-4.0.0.jar app.jar
    
    ENV SSL_ENABLED=true
    ENV SSL_KEYSTORE=/app/certs/keystore.p12
    
    EXPOSE 8443
    
    ENTRYPOINT ["java", "-jar", "app.jar"]
    

    7.2 docker-compose.yml

    version: '3.8'
    
    services:
      socle-app:
        image: socle-v4:latest
        environment:
          - SSL_ENABLED=true
          - SSL_KEYSTORE=/app/certs/keystore.p12
          - SSL_KEYSTORE_PASSWORD_FILE=/run/secrets/ssl_password
        ports:
          - "8443:8443"
        volumes:
          - ./certs:/app/certs:ro
        secrets:
          - ssl_password
    
    secrets:
      ssl_password:
        file: ./secrets/ssl_password.txt
    

    8. Kubernetes avec TLS

    8.1 Secret pour le certificat

    apiVersion: v1
    kind: Secret
    metadata:
      name: socle-tls
    type: kubernetes.io/tls
    data:
      tls.crt: <base64-encoded-cert>
      tls.key: <base64-encoded-key>
    

    8.2 Ingress avec TLS

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: socle-ingress
      annotations:
        nginx.ingress.kubernetes.io/ssl-redirect: "true"
    spec:
      tls:
        - hosts:
            - socle.example.com
          secretName: socle-tls
      rules:
        - host: socle.example.com
          http:
            paths:
              - path: /
                pathType: Prefix
                backend:
                  service:
                    name: socle-service
                    port:
                      number: 8080
    

    8.3 cert-manager

    apiVersion: cert-manager.io/v1
    kind: Certificate
    metadata:
      name: socle-cert
    spec:
      secretName: socle-tls
      issuerRef:
        name: letsencrypt-prod
        kind: ClusterIssuer
      dnsNames:
        - socle.example.com
    

    9. Vérification

    9.1 Test avec curl

    # Test HTTPS
    curl -v https://localhost:8443/admin/health
    
    # Avec certificat client (mTLS)
    curl -v --cert client.crt --key client.key https://localhost:8443/admin/health
    
    # Ignorer la vérification (dev only)
    curl -vk https://localhost:8443/admin/health
    

    9.2 Test avec openssl

    # Vérifier le certificat du serveur
    openssl s_client -connect localhost:8443 -showcerts
    
    # Vérifier les protocoles supportés
    openssl s_client -connect localhost:8443 -tls1_3
    
    # Vérifier les ciphers
    openssl s_client -connect localhost:8443 -cipher 'ECDHE-RSA-AES256-GCM-SHA384'
    

    10. Troubleshooting

    Erreur: PKIX path building failed

    Le certificat du serveur n’est pas trusté.

    # Importer le certificat dans le truststore Java
    keytool -importcert \
      -alias server-cert \
      -file server.crt \
      -keystore $JAVA_HOME/lib/security/cacerts \
      -storepass changeit
    

    Erreur: Handshake failure

    Incompatibilité de protocole ou cipher.

    # Vérifier les protocoles
    openssl s_client -connect host:port -tls1_2
    openssl s_client -connect host:port -tls1_3
    

    Erreur: Certificate expired

    Renouveler le certificat et recréer le keystore.

    11. Bonnes pratiques

    DO

    • Utiliser TLS 1.2 minimum, TLS 1.3 recommandé
    • Renouveler les certificats avant expiration
    • Utiliser des clés RSA 2048 bits minimum ou ECDSA 256 bits
    • Activer HSTS en production
    • Utiliser cert-manager en Kubernetes

    DON’T

    • Ne pas utiliser de certificats auto-signés en production
    • Ne pas désactiver la vérification des certificats
    • Ne pas stocker les mots de passe en clair
    • Ne pas utiliser TLS 1.0 ou 1.1 (dépréciés)

    12. Références

  • TEST






    Nouveau Test avec image V2



    Nouveau Test avec image V2

    Avec un fichier

    Slot_Car_Street.pdf

    Debut de Code en javascript

    Fichier Jar :

    registry-handler-1.0.0.jar.zip

    javascript
    import { Block } from '../../../../data/protocols/blocks';
    import { ToHtml } from '../../../../domain/use-cases/to-html';
    import { blockToInnerText } from '../../../helpers/block-to-inner-text';
    import hljs from '../../../../config/highlightConfig';
    import prettier from 'prettier';
    
    export class CodeBlockToHtml implements ToHtml {
      private readonly _block: Block;
    
      constructor(block: Block) {
        this._block = block;
      }
    
      async convert(): Promise<string> {
        const language = this._language ? this._language : 'plaintext';  // Fallback au texte brut si pas de langue spécifiée
        const languageClass = `language-${language}`;
    
        // Obtenir le texte du bloc et formater avec Prettier
        let code = blockToInnerText(this._block).replace(/(\s{4}|\t)/g, '  ');
        try {
          code = prettier.format(code, { semi: false, parser: "babel" }); // Assure-toi de choisir le bon parser selon le langage
        } catch (error) {
          console.error("Prettier formatting failed:", error);
        }
    
        // Appliquer la coloration syntaxique avec Highlight.js
        const highlightedCode = hljs.highlight(code, { language }).value;
    
        // Retourner le code HTML formaté
        return Promise.resolve(
            `<pre><code class="${languageClass}">${highlightedCode}</code></pre>`
        );
      }
    
      private get _language(): string {
        return this._block.properties?.language?.toLowerCase().replace(/ /g, '');
      }
    }

    Image

    Notion Image

    Autres images

    Notion Image

    Tableau

    Resolving The Problem

    The following table lists the ports that IBM i Access and related functions use for communication with the IBM i OS System:

    PC Function Server Name Port Non-SSL Port SSL
    • Server Mapper • as-svrmap • 449 • —
    • License Management • as-central • 8470 • 9470
    • Database Access • as-database • 8471 • 9471
    • Data Queues • as-dtaq • 8472 • 9472
    • IFS Access usingAccess/Navigator • as-file • 8473 • 9473
    • Network Printers • as-netprt • 8474 • 9474
    • Remote Command • as-rmtcmd • 8475 • 9475
    • Signon Verification • as-signon • 8476 • 9476
    • Telnet (5250 Emulation) • telnet • 23 • 992
    • Navigator for i (Heritage version) • as-nav • 2004 • 2005
    • New Navigator for i • as-new-nav • 2002 • 2003
    • Digital Certificate Manager • as-admin3-http • 2006 • 2007
    • HTTP Administration • as-admin • 2001 • 2010
    • DDM/DRDA • DDM/DRDA • 446 • 448
    • NetServer • netbios > • 137 • —
    • NetServer • netbios > • 139 • —
    • NetServer (CIFS) • CIFS • 445 • —
    • Service Tools Server • as-sts • 3000 • —

    If any of the above ports are restricted by using a firewall or any other mechanism, IBM i Access or related functions might fail to operate. For assistance with configuring ports or working with a firewall beyond the above information, contact the firewall provider or obtain a consulting agreement.

    Note:

    The following ports are common to most IBM i Access Client products such as ODBC, Telnet, and other specific functions:

    Port 449 is used to look up service by name and return the port number.

    Ports 8470 and 9470(TLS/SSL) are used for host code page translation tables and licensing functions.

    Ports 8475 and 9475(TLS/SSL) are used to check for application administration restrictions.

    Ports 8476 and 9476(TLS/SSL) are used for checking signon verification to authenticate.

    depending on your needs you may only need the above ports and the port(s) for your function/application.For the ports used by the Console, see document N1015344, IBM iSeries Port Assignments with Operations Console.

    For a list of currently listening IPv4 daemons on the IBM i, run the following SQL statement:

    sql
    SELECT LOCAL_PORT, LOCAL_PORT_NAME, BIND_USER, IDLE_TIME
    FROM QSYS2.NETSTAT_INFO
    where LOCAL_ADDRESS = '0.0.0.0';

    Other options are the CL command NETSTAT OPTION(*CNN) or to review the output from WRKSRVTBLE OUTPUT(*PRINT).

    Tache 1
    Tache 2
    Tache 3

    • Puce 1
    • Puce 2

    La maison de la rue adjaçante est encombréeLa maison de la rue adjaçante est encombréeLa maison de la rue adjaçante est encombréeLa maison de la rue adjaçante est encombréeLa maison de la rue adjaçante est encombréeLa maison de la rue adjaçante est encombréeLa maison de la rue adjaçante est encombréeLa maison de la rue adjaçante est encombrée

    Test Unique

    ℹ️

    Avec un bel encadrement et avec plusieurs lignesAvec un bel encadrement et avec plusieurs lignesAvec un bel encadrement et avec plusieurs lignesAvec un bel encadrement et avec plusieurs lignesAvec un bel encadrement et avec plusieurs lignesAvec un bel encadrement et avec plusieurs lignesAvec un bel encadrement et avec plusieurs lignesAvec un bel encadrement et avec plusieurs lignesAvec un bel encadrement et avec plusieurs lignes

    Test de titre 1

    Test de titre 2

    Test de titre 3

    en gras, en italique, sous ligné, barré

    Champs de l’entité « Person »

    Voici les principaux champs disponibles pour l’entité « Person » selon Schema.org :

    1. additionalName: Un nom supplémentaire pour la personne, souvent un deuxième prénom.
    1. address: L’adresse postale de la personne.
    1. affiliation: Une organisation à laquelle la personne est affiliée, comme une entreprise ou une institution.
    1. alumniOf: Une organisation éducative ou une école dont la personne est un ancien élève.
    1. award: Une récompense ou un prix que la personne a reçu.
    1. birthDate: La date de naissance de la personne.
    1. birthPlace: Le lieu de naissance de la personne.
    1. brand: La marque associée à la personne, souvent utilisée pour des célébrités ou des entrepreneurs.
    1. children: Les enfants de la personne.
    1. colleague: Les collègues de la personne.
    1. contactPoint: Un point de contact pour la personne.
    1. deathDate: La date de décès de la personne.
    1. deathPlace: Le lieu de décès de la personne.
    1. duns: Le numéro DUNS de la personne.
    1. email: L’adresse email de la personne.
    1. familyName: Le nom de famille de la personne.
    1. faxNumber: Le numéro de fax de la personne.
    1. follows: Les personnes que cette personne suit (par exemple sur les réseaux sociaux).
    1. funder: Une entité qui finance cette personne.
    1. gender: Le genre de la personne (masculin, féminin, etc.).
    1. givenName: Le prénom de la personne.
    1. globalLocationNumber: Le numéro de localisation global pour la personne.
    1. hasCredential: Les informations d’identification de la personne.
    1. hasOccupation: La profession de la personne.
    1. hasOfferCatalog: Un catalogue d’offres que la personne possède.
    1. hasPOS: Un point de vente que la personne possède.
    1. height: La taille de la personne.
    1. homeLocation: L’emplacement de la résidence principale de la personne.
    1. honorificPrefix: Un préfixe honorifique pour la personne (par exemple, Dr., M., Mme).
    1. honorificSuffix: Un suffixe honorifique pour la personne (par exemple, Jr., Sr.).
    1. interactionStatistic: Les statistiques d’interaction pour la personne.
    1. isicV4: Le code ISIC pour la personne.
    1. jobTitle: Le titre du poste de la personne.
    1. knows: Les connaissances de la
    mermaid
    graph LR
    SymmetricDS_OVH[(« SymmetricDS-OVH »)]
    db-prod[(« PostgreSQL (db-reflet)
    Port: 5432″)]
    pgadmin[(« pgAdmin
    Port: 8888″)]
    redis[(« Redis (cache)
    Port: 6379″)]
    zookeeper[(« Zookeeper
    Port: 2181″)]
    kafka[(« Kafka
    Port: 9092″)]
    kafka_manager[(« Kafka Manager
    Port: 9000″)]
    directus[(« Directus
    Port: 8055″)]
    budibase[(« Budibase
    Port: 10000″)]
    n8n[(« n8n
    Port: 443″)]
    me[(« MONDE \n Extérieur
    Port: 443″)]
    cosmo[(« PostgreSQL (Cosmo)
    Port: 5432″)]
    directus-c[(« Directus
    4 Cosmo
    Port: 8055″)]

    db-prod –>|Cache| redis
    db-prod –>|Publie| kafka
    directus –>|Cache| redis
    pgadmin –>|Administre| db-prod
    budibase –>|CRUD| db-prod
    directus –>|Propose des APIS| db-prod
    kafka –>|Depends on| zookeeper
    kafka_manager –>|Depends on| zookeeper
    kafka_manager –>|Manage Topics| kafka

    SymmetricDS_OVH –>|Envoi| db-prod
    SymmetricDS_OVH –>|Envoi| kafka
    n8n –> |publie| kafka
    kafka –>|consomme| n8n
    db-prod –>|trigger| n8n
    n8n –> |publie| me
    directus-c –> |publie| cosmo
    cosmo –> |publie| directus-c
    n8n –> |GraphQL| directus-c

    python
    # flake8: noqa
    # This file is used for deploying replicate models
    # running: cog predict -i img=@inputs/whole_imgs/10045.png -i version='v1.4' -i scale=2
    # push: cog push r8.im/tencentarc/gfpgan
    # push (backup): cog push r8.im/xinntao/gfpgan
    
    import os
    
    os.system('python setup.py develop')
    os.system('pip install realesrgan')
    
    import cv2
    import shutil
    import tempfile
    import torch
    from basicsr.archs.srvgg_arch import SRVGGNetCompact
    
    from gfpgan import GFPGANer
    
    try:
        from cog import BasePredictor, Input, Path
        from realesrgan.utils import RealESRGANer
    except Exception:
        print('please install cog and realesrgan package')
    
    
    class Predictor(BasePredictor):
    
        def setup(self):
            os.makedirs('output', exist_ok=True)
            # download weights
            if not os.path.exists('gfpgan/weights/realesr-general-x4v3.pth'):
                os.system(
                    'wget https://github.com/xinntao/Real-ESRGAN/releases/download/v0.2.5.0/realesr-general-x4v3.pth -P ./gfpgan/weights'
                )
            if not os.path.exists('gfpgan/weights/GFPGANv1.2.pth'):
                os.system(
                    'wget https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.2.pth -P ./gfpgan/weights')
            if not os.path.exists('gfpgan/weights/GFPGANv1.3.pth'):
                os.system(
                    'wget https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.3.pth -P ./gfpgan/weights')
            if not os.path.exists('gfpgan/weights/GFPGANv1.4.pth'):
                os.system(
                    'wget https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.4.pth -P ./gfpgan/weights')
            if not os.path.exists('gfpgan/weights/RestoreFormer.pth'):
                os.system(
                    'wget https://github.com/TencentARC/GFPGAN/releases/download/v1.3.4/RestoreFormer.pth -P ./gfpgan/weights'
                )
    
            # background enhancer with RealESRGAN
            model = SRVGGNetCompact(num_in_ch=3, num_out_ch=3, num_feat=64, num_conv=32, upscale=4, act_type='prelu')
            model_path = 'gfpgan/weights/realesr-general-x4v3.pth'
            half = True if torch.cuda.is_available() else False
            self.upsampler = RealESRGANer(
                scale=4, model_path=model_path, model=model, tile=0, tile_pad=10, pre_pad=0, half=half)
    
            # Use GFPGAN for face enhancement
            self.face_enhancer = GFPGANer(
                model_path='gfpgan/weights/GFPGANv1.4.pth',
                upscale=2,
                arch='clean',
                channel_multiplier=2,
                bg_upsampler=self.upsampler)
            self.current_version = 'v1.4'
    
        def predict(
                self,
                img: Path = Input(description='Input'),
                version: str = Input(
                    description='GFPGAN version. v1.3: better quality. v1.4: more details and better identity.',
                    choices=['v1.2', 'v1.3', 'v1.4', 'RestoreFormer'],
                    default='v1.4'),
                scale: float = Input(description='Rescaling factor', default=2),
        ) -> Path:
            weight = 0.5
            print(img, version, scale, weight)
            try:
                extension = os.path.splitext(os.path.basename(str(img)))[1]
                img = cv2.imread(str(img), cv2.IMREAD_UNCHANGED)
                if len(img.shape) == 3 and img.shape[2] == 4:
                    img_mode = 'RGBA'
                elif len(img.shape) == 2:
                    img_mode = None
                    img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
                else:
                    img_mode = None
    
                h, w = img.shape[0:2]
                if h < 300:
                    img = cv2.resize(img, (w * 2, h * 2), interpolation=cv2.INTER_LANCZOS4)
    
                if self.current_version != version:
                    if version == 'v1.2':
                        self.face_enhancer = GFPGANer(
                            model_path='gfpgan/weights/GFPGANv1.2.pth',
                            upscale=2,
                            arch='clean',
                            channel_multiplier=2,
                            bg_upsampler=self.upsampler)
                        self.current_version = 'v1.2'
                    elif version == 'v1.3':
                        self.face_enhancer = GFPGANer(
                            model_path='gfpgan/weights/GFPGANv1.3.pth',
                            upscale=2,
                            arch='clean',
                            channel_multiplier=2,
                            bg_upsampler=self.upsampler)
                        self.current_version = 'v1.3'
                    elif version == 'v1.4':
                        self.face_enhancer = GFPGANer(
                            model_path='gfpgan/weights/GFPGANv1.4.pth',
                            upscale=2,
                            arch='clean',
                            channel_multiplier=2,
                            bg_upsampler=self.upsampler)
                        self.current_version = 'v1.4'
                    elif version == 'RestoreFormer':
                        self.face_enhancer = GFPGANer(
                            model_path='gfpgan/weights/RestoreFormer.pth',
                            upscale=2,
                            arch='RestoreFormer',
                            channel_multiplier=2,
                            bg_upsampler=self.upsampler)
    
                try:
                    _, _, output = self.face_enhancer.enhance(
                        img, has_aligned=False, only_center_face=False, paste_back=True, weight=weight)
                except RuntimeError as error:
                    print('Error', error)
    
                try:
                    if scale != 2:
                        interpolation = cv2.INTER_AREA if scale < 2 else cv2.INTER_LANCZOS4
                        h, w = img.shape[0:2]
                        output = cv2.resize(output, (int(w * scale / 2), int(h * scale / 2)), interpolation=interpolation)
                except Exception as error:
                    print('wrong scale input.', error)
    
                if img_mode == 'RGBA':  # RGBA images should be saved in png format
                    extension = 'png'
                # save_path = f'output/out.{extension}'
                # cv2.imwrite(save_path, output)
                out_path = Path(tempfile.mkdtemp()) / f'out.{extension}'
                cv2.imwrite(str(out_path), output)
            except Exception as error:
                print('global exception: ', error)
            finally:
                clean_folder('output')
            return out_path
    
    
    def clean_folder(folder):
        for filename in os.listdir(folder):
            file_path = os.path.join(folder, filename)
            try:
                if os.path.isfile(file_path) or os.path.islink(file_path):
                    os.unlink(file_path)
                elif os.path.isdir(file_path):
                    shutil.rmtree(file_path)
            except Exception as e:
                print(f'Failed to delete {file_path}. Reason: {e}')
    


  • Réinventer l’utilisation de l’ordinateur avec l’interpréteur ouvert

    Réinventer l’utilisation de l’ordinateur avec l’interpréteur ouvert

    L’évolution du traitement du langage naturel a donné naissance à l’interpréteur ouvert, une nouvelle manière d’interagir avec les ordinateurs. Cette interface en langage naturel ouvre des horizons inexplorés pour les tâches informatiques quotidiennes, allant de la création de contenus multimédias à l’analyse complexe de données.

    Les fondements de l’interprétation en langage naturel

    Le Traitement du Langage Naturel (TAL) figure au centre de l’innovation permettant aux ordinateurs de comprendre et d’agir sur les commandes humaines. Cette technologie a connu une évolution remarquable depuis ses origines, marquées par des programmes comme ELIZA, qui simulait une conversation sans réelle compréhension du langage. Aujourd’hui, grâce aux avancées considérables en intelligence artificielle et en apprentissage machine, les systèmes de traitement du langage naturel peuvent non seulement comprendre le sens littéral des mots mais aussi saisir les nuances et le contexte d’une demande.

    Au cœur de ces progrès, la capacité des algorithmes à analyser et interpréter les données linguistiques s’est nettement améliorée. Les techniques comme l’analyse syntaxique et sémantique permettent aux machines de décomposer les phrases en éléments compréhensibles et de les relier à des actions spécifiques. Cette compréhension est renforcée par l’apprentissage profond, qui dote les ordinateurs de la capacité à tirer des enseignements de vastes ensembles de données textuelles, leur permettant d’améliorer continuellement leur performance.

    Les applications actuelles du TAL s’étendent bien au-delà de la compréhension textuelle. Elles englobent la traduction automatique, la reconnaissance vocale, et même l’analyse de sentiments. L’interpréteur ouvert s’inscrit dans cette évolution comme un outil révolutionnaire, offrant aux utilisateurs la possibilité de commander et contrôler leurs ordinateurs en utilisant simplement le langage naturel. Cette innovation s’appuie sur les principes fondamentaux du TAL pour interpréter les commandes des utilisateurs, que ce soit pour créer un document, manipuler des fichiers multimédias, ou naviguer sur le web, rendant la technologie plus accessible et intuitive pour tous.

    Les progrès accomplis depuis ELIZA jusqu’aux systèmes sophistiqués d’aujourd’hui illustrent non seulement l’évolution du TAL, mais aussi la manière dont cette technologie continue de réinventer l’interaction entre l’homme et la machine. Avec l’avènement de l’interpréteur ouvert, l’informatique entre dans une nouvelle ère où les barrières linguistiques entre l’humain et l’ordinateur s’estompent, ouvrant la voie à une utilisation plus naturelle et efficace des technologies de l’information.

    La programmation accessible par le langage naturel

    La programmation a toujours été perçue comme un domaine réservé à une élite versée dans le maniement complexe des langages de programmation. Des premiers langages de haut niveau comme FORTRAN et COBOL, inventés dans les années 1950 et 1960, jusqu’aux paradigmes modernes tels que la programmation orientée objet, l’évolution a été constante. La création des premiers compilateurs a marqué une révolution, permettant la traduction du code source en langage machine, rendant l’exécution des programmes plus efficace. Cependant, malgré ces avancées, l’accès à la programmation est resté limité par la barrière du langage technique.

    L’avènement de l’interpréteur ouvert repousse aujourd’hui ces limites, inaugurant une ère où les commandes en langage naturel permettent d’exécuter des tâches de programmation complexes. Cet outil transforme fondamentalement l’approche de la programmation en la rendant accessible à tous, sans nécessité de maîtriser les syntaxes codifiées des langages traditionnels. L’utilisateur dialogue en langage naturel avec son ordinateur, qui interprète ces commandes et exécute les tâches demandées, allant de la gestion de bases de données à la manipulation de fichiers, en passant par la création et l’édition de contenus multimédias.

    Cette transformation marque un tournant dans la programmation du futur. L’interpréteur ouvert démocratise l’accès à la programmation, permettant à un public bien plus large de participer à la création et à l’innovation technologique. Il encourage également une nouvelle manière de penser la résolution de problèmes informatiques, où la compréhension et l’expression en langage naturel priment sur la connaissance de syntaxes complexes.

    L’impact de cette innovation se mesure également dans l’enseignement et l’apprentissage de la programmation. En simplifiant l’accès au codage, l’interpréteur ouvert constitue un outil pédagogique précieux, ouvrant les portes de l’informatique à des publics jusqu’ici éloignés de ce domaine. Cette accessibilité accrue pourrait même remodeler les professions futures, où la capacité à interagir avec les machines en langage naturel deviendra aussi fondamentale que l’est aujourd’hui la maîtrise de l’outil informatique.

    Ainsi, en offrant une interface intuitive de programmation en langage naturel, l’interpréteur ouvert ne se contente pas de simplifier l’accès à la programmation ; il redéfinit les contours mêmes de ce que signifie « programmer ». Cette mutation promet de révolutionner la manière dont nous interagissons avec les technologies, facilitant une intégration encore plus profonde et personnalisée de l’informatique dans notre quotidien.

    Interprétation avancée pour l’analyse de données

    Après avoir exploré la révolution de la programmation accessible via le langage naturel, où l’interpréteur ouvert simplifie les processus de codage, nous plongeons maintenant dans le monde de l’analyse de données. La capacité à interpréter, nettoyer, analyser et visualiser des données complexe est cruciale dans le paysage actuel de l’information. Historiquement, cette discipline exigeait une compréhension approfondie des statistiques et une maîtrise de logiciels spécialisés.

    L’extraction de données, ou data mining, a évolué depuis ses débuts, s’appuyant d’abord sur des statistiques simples pour évoluer vers des modèles prédictifs et des algorithmes complexes d’apprentissage automatique. La visualisation des données, quant à elle, a transformé la manière dont nous interprétons les ensembles de données, permettant de déceler des tendances et des anomalies auparavant invisibles.

    L’introduction de l’interpréteur ouvert dans ce paysage change radicalement la donne. En utilisant des commandes en langage naturel, même sans expertise en statistiques, les utilisateurs peuvent effectuer des analyses prédictives, nettoyer des ensembles de données de grande taille et intégrer différentes sources de données pour une analyse plus holistique. Ce processus d’intégration, essentiel pour comprendre les tendances à travers divers secteurs ou phénomènes, devient ainsi plus accessible.

    La visualisation des données, un autre aspect crucial de l’analyse, bénéficie également de cette avancée. En commandant à l’interpréteur de générer des graphiques ou des cartes à partir d’un ensemble de données spécifique, les utilisateurs peuvent créer des visualisations complexes sans connaissances préalables en bibliothèques de visualisation comme Matplotlib ou D3.js.

    Par exemple, un utilisateur souhaitant comprendre la répartition géographique de ses clients pourrait simplement demander à l’interpréteur de créer une carte de chaleur à partir de ses données de vente. Ce qui aurait autrefois exigé des heures de travail manuel – nettoyage des données, apprentissage d’une bibliothèque de visualisation, écriture du code – se résume maintenant à une simple instruction en langage naturel.

    L’impact de l’interpréteur ouvert sur l’analyse de données est donc profond, démocratisant l’accès à des insights complexes et facilitant une prise de décision basée sur des données pour un éventail beaucoup plus large d’individus et d’organisations. Il marque une étape significative vers la réinvention de l’utilisation de l’ordinateur, où la complexité technique cède la place à l’intuitivité et à l’accessibilité.

    Conclusions

    L’interpréteur ouvert transforme radicalement notre approche de l’utilisation de l’ordinateur. À travers une simple conversation, il réduit la barrière technique et démocratise l’accès à des opérations complexes pour tout utilisateur.

  • Neque porro quisquam est qui

    Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?

    Nullam ac erat. Donec a ipsum. Nullam tristique leo id lacus. Sed sed pede non arcu ornare interdum. Maecenas justo elit, rutrum in, adipiscing id, laoreet in, libero. Fusce quam. Donec a urna a enim gravida dictum. Nunc elementum, mauris sit amet imperdiet iaculis, dolor metus consectetuer mi, et tempor elit enim at massa. Duis ac nisl. Nullam pulvinar. Curabitur quam sapien, lobortis eu, luctus vitae, volutpat ac, metus. Nam elementum. Fusce fringilla. Praesent pulvinar turpis vitae justo cursus pulvinar. In hac habitasse platea dictumst. Nunc fermentum tellus interdum libero. Phasellus eros. Vestibulum euismod nunc at eros. Pellentesque nec ligula non tellus accumsan molestie. Pellentesque felis massa, tincidunt at, pulvinar id, placerat nec, velit.

    Cras rhoncus ipsum ac dolor. In hac habitasse platea dictumst. Nulla dapibus ultricies pede. Quisque augue risus, porttitor nec, suscipit ut, pellentesque quis, lacus. Duis adipiscing purus eu metus pharetra porttitor. Aenean sapien nisi, sodales non, facilisis nec, ultricies et, erat. Cras aliquam. Maecenas mi. Sed lacus arcu, malesuada id, ultricies et, ornare non, dolor. Maecenas turpis lacus, vehicula nec, blandit in, laoreet a, nibh. Donec aliquet. In et leo tincidunt tortor rhoncus convallis. Nulla facilisi. Praesent bibendum semper eros. Morbi risus. Nam tellus leo, ullamcorper egestas, venenatis quis, viverra ac, mauris. In hac habitasse platea dictumst. Curabitur at velit vel sem auctor hendrerit. Integer mauris orci, vehicula eu, feugiat ac, hendrerit ut, dolor. Fusce elit nulla, gravida quis, vulputate eu, rutrum vel, lectus. Integer cursus luctus nisl. Quisque quam. Aliquam lectus urna, porta in, viverra eu, pellentesque a, massa. Etiam eros sapien, porta et, aliquam et, bibendum sit amet, erat. Sed condimentum interdum lacus. In ut ante non felis tincidunt porta. Aenean aliquet ornare sem. Nunc dignissim, erat sit amet vulputate cursus, elit magna facilisis massa, quis hendrerit nunc odio id dui. Proin interdum dictum arcu. Pellentesque erat ante, ultricies ac, porttitor ac, dictum et, purus. Donec enim odio, gravida ut, imperdiet quis, rutrum ut, lacus.

    Etiam pharetra scelerisque diam. Maecenas varius augue vel urna. Vestibulum erat nisl, fringilla vel, mollis et, aliquam non, elit. Nulla malesuada turpis nec velit. Donec vitae sem a metus dictum molestie. Ut dignissim, odio non porttitor convallis, sapien leo viverra lorem, a consequat mauris erat sit amet dui. Nullam rutrum feugiat massa. Nullam lacinia purus vitae massa. Pellentesque vel tortor eget nulla ullamcorper vehicula. Cras egestas euismod magna. Praesent laoreet aliquet nulla. Aliquam arcu. Proin vel neque non ligula sodales sagittis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed magna. Pellentesque aliquet mollis arcu. Morbi at felis. Suspendisse ligula. Aliquam nisl arcu, vehicula vitae, hendrerit ut, sodales eu, augue. Sed tristique pretium risus. Ut luctus, dui quis commodo luctus, quam nulla ultricies lorem, eu ornare nulla metus at leo. Praesent rhoncus sapien sit amet mauris. Aenean commodo erat eu eros. Morbi tristique, risus sed consequat bibendum, enim augue tincidunt quam, ac semper libero velit vitae eros.