From abf3501717d8a297ad79b0abde73f85bb7f21804 Mon Sep 17 00:00:00 2001 From: Emile Rolley Date: Tue, 12 Mar 2024 19:25:34 +0100 Subject: [PATCH] format: fix auto format --- presentation-2023-11-30/pres.md | 187 +++++++++++++++-------------- presentation-2023-11-30/theme.yaml | 52 ++++---- 2 files changed, 126 insertions(+), 113 deletions(-) diff --git a/presentation-2023-11-30/pres.md b/presentation-2023-11-30/pres.md index 4d80432..5e912c9 100755 --- a/presentation-2023-11-30/pres.md +++ b/presentation-2023-11-30/pres.md @@ -4,11 +4,10 @@ sub_title: Comment gérer de grosses bases de règles avec @publicodes/tools ? author: Emile Rolley # date: 2023-11-30 theme: - path: ./theme.yaml + path: ./theme.yaml --- -Introduction ---- +## Introduction # (Rappel) Nos Gestes Climat @@ -17,18 +16,22 @@ Introduction C'est le simulateur d'empreinte carbone individuelle de l'ADEME. + ## Comment ça marche ? + 1. Vous répondez à un questionnaire sur votre mode de vie 2. Vous obtenez votre empreinte carbone individuelle annuelle totale (et par grandes catégories) 3. Vous obtenez des actions personnalisées en fonction de vos réponses + ## Techniquement + Il y a deux grandes parties : @@ -36,6 +39,7 @@ Il y a deux grandes parties : + **Le modèle de calcul** Il décrit dans un ensemble de fichiers (écrits en Publicodes), les règles de @@ -43,6 +47,7 @@ calcul de l'empreinte carbone. + **Le simulateur** Une application React qui utilise le moteur de Publicodes pour évaluer les @@ -51,13 +56,13 @@ règles du modèle en fonction des réponses de l'utilisateur·ice. -_Si vous ne l'avez pas encore fait, je vous invite à aller faire le test : +_Si vous ne l'avez pas encore fait, je vous invite à aller faire le test : [](https://nosgestesclimat.fr)_ -Introduction ---- +## Introduction + # (Rappel) Publicodes @@ -129,8 +134,7 @@ divers . animaux domestiques . empreinte . chats . empreinte: -Introduction ---- +## Introduction # A mon arrivé @@ -145,18 +149,18 @@ Il y avait un seul modèle de calcul : **Stats** -| Nb. règles | Nb. fichiers | Nb. lignes | Poids | -| ---------------: | ------------------ | ---------------- | --------------- | -| 898 | 31 | 6 527 | 273 Ko | +| Nb. règles | Nb. fichiers | Nb. lignes | Poids | +| ---------: | ------------ | ---------- | ------ | +| 898 | 31 | 6 527 | 273 Ko | **Perfs** -| | Temps de parsing | Temps d'évaluation | -| --- | ------------------ | ------------------ | -| local (Bun) | ~340 _ms_ | ~55 _ms_ | +| | Temps de parsing | Temps d'évaluation | +| ----------- | ---------------- | ------------------ | +| local (Bun) | ~340 _ms_ | ~55 _ms_ | @@ -166,18 +170,19 @@ Il y avait un seul modèle de calcul : ![](./compilation-ngc.png) -‎ +‎ _Toutes les règles du modèles doivent être **compilées** dans un seul fichier JSON afin de pouvoir être **évaluées par le moteur dans le navigateur**._ -Introduction ---- +## Introduction + # Aujourd'hui + Il y a **36** modèles compilés (17 _régions_ et 2 _langues_) : @@ -187,20 +192,20 @@ Il y a **36** modèles compilés (17 _régions_ et 2 _langues_) : **Stats** (modèle de _base_) -| Nb. règles | Nb. fichiers | Nb. lignes | Poids | -| ---------------: | ------------------ | ---------------- | --------------- | -| 1720 | 85 | 16 129 | ~800 Ko | +| Nb. règles | Nb. fichiers | Nb. lignes | Poids | +| ---------: | ------------ | ---------- | ------- | +| 1720 | 85 | 16 129 | ~800 Ko | **Perfs** (modèle de _base_) -| | Temps de parsing | Temps d'évaluation | -| ------------------------ | ------------------ | ------------------ | -| local (Node) | ~660 _ms_ | ~200 _ms_ | -| local (Bun) | ~700 _ms_ | ~125 _ms_ | -| preview Vercel | ~1200 _ms_ | ~120 _ms_ | +| | Temps de parsing | Temps d'évaluation | +| -------------- | ---------------- | ------------------ | +| local (Node) | ~660 _ms_ | ~200 _ms_ | +| local (Bun) | ~700 _ms_ | ~125 _ms_ | +| preview Vercel | ~1200 _ms_ | ~120 _ms_ | @@ -208,12 +213,11 @@ Il y a **36** modèles compilés (17 _régions_ et 2 _langues_) : **Workflow** -![](./compilation-steps-ngc(1).png) +![](<./compilation-steps-ngc(1).png>) -Introduction ---- +## Introduction # Problématiques @@ -221,7 +225,8 @@ Dans un contexte où le nombre de modèles de calcul augmente, plusieurs questions s'imposent. -‎ + +‎ ## 1. Une question de performance @@ -230,7 +235,8 @@ navigateur`, afin de pouvoir servir une page interactive le plus rapidement possible ? -‎ + +‎ ## 2. Une question de maintenabilité @@ -239,22 +245,22 @@ d'autres modèles et charger uniquement les règles nécessaires ? -1\. Optimisation des modèles ---- +## 1\. Optimisation des modèles # Optimisation des modèles + ## L'idée On souhaite continuer à avoir la même granularité du modèle pour des raisons de -transparence. +transparence. En revanche, pour le test en lui-même, on a **uniquement besoin des questions** (des règles dont la valeur dépends de l'utilisateur·ice). -On alors dit que l'on pourrait `calculer à la compilation toutes les règles qui +On alors dit que l'on pourrait `calculer à la compilation toutes les règles qui ne dépendent pas de l'utilisateur·ice` (des **constantes**). @@ -263,8 +269,7 @@ ne dépendent pas de l'utilisateur·ice` (des **constantes**). -1\. Optimisation des modèles ---- +## 1\. Optimisation des modèles ## Exemple @@ -276,7 +281,7 @@ Par exemple, reprenons les règles de calcul de l'empreinte des animaux domestiq -```yaml +```yaml chats: icônes: 🐱 titre: Chat @@ -314,6 +319,7 @@ chats . alimentation . empreinte nourriture: formule: 2.5 unité: kgCO2e/kg ``` + La règle `empreinte nourriture` est une @@ -329,10 +335,10 @@ chats . alimentation: * 2.5 unité: kgCO2e ``` + -1\. Optimisation des modèles ---- +## 1\. Optimisation des modèles ## Exemple @@ -354,12 +360,14 @@ chats . alimentation: ``` + On ne peut pas aller plus loin, car la règle `besoin journalier nourriture` -dépend du niveau d'activité du chat. +dépend du niveau d'activité du chat. + En revanche, peut faire la même chose pour la règle `litière` : @@ -400,8 +408,7 @@ chats . litière: -1\. Optimisation des modèles ---- +## 1\. Optimisation des modèles ## Exemple @@ -413,10 +420,10 @@ chats . litière: Au final, pour la règle `chats . empreinte` on obtient : ```yaml -chats . empreinte: +chats . empreinte: titre: Empreinte d'un chat de taille moyenne description: | - On considère un chat de taille moyenne (4kg). + On considère un chat de taille moyenne (4kg). formule: somme: - alimentation @@ -461,8 +468,8 @@ lieu 16**. -1\. Optimisation des modèles ---- + +## 1\. Optimisation des modèles # Les résultats @@ -470,10 +477,10 @@ lieu 16**. ## Réduction du nombre de règles -| | Nb. règles | Poids | -| ----------------: | ---------- | -------------- | -| _Règles de base_ | 1720 | 793 Ko | -| _Règles optimisées_ | **951 (-44%)** | 476 Ko (-40%) | +| | Nb. règles | Poids | +| ------------------: | -------------- | ------------- | +| _Règles de base_ | 1720 | 793 Ko | +| _Règles optimisées_ | **951 (-44%)** | 476 Ko (-40%) | > Diminution de ~40% du nombre de règles et du poids du modèle @@ -486,6 +493,7 @@ lieu 16**. + **perf-base.js** ```js @@ -497,6 +505,7 @@ new Engine(base) + **perf-optim.js** ```js @@ -508,19 +517,19 @@ new Engine(optim) + | Commande | Moyenne [ms] | Min [ms] | Max [ms] | Ratio | -|:------------------------|----------------:|---------:|---------:|------------:| +| :---------------------- | --------------: | -------: | -------: | ----------: | | _bun run perf-base.js_ | 765.6 ± 28.2 | 731.2 | 832.4 | 1.64 ± 0.07 | | _bun run perf-optim.js_ | **466.5** ± 7.5 | 459.1 | 477.2 | 1.00 | -> Gain de ~40% sur le temps d'instanciation du moteur +> Gain de ~40% sur le temps d'instanciation du moteur -2\. Système d'import ---- +## 2\. Système d'import -‎ +‎ # Le besoin @@ -533,10 +542,10 @@ Pouvoir `réutiliser des règles` dans plusieurs modèles de calcul. En particulier, on souhaitait rajouter les règles permettant de calculer l'empreinte des trajets en ferry et de la piscine. Or, **le calcul avait déjà été implémenté** dans le modèle de [](https://futur.eco). - + -‎ +‎ # La solution @@ -544,20 +553,21 @@ On a donc créé un système d'import de règles, qui permet de `charger des rè depuis un autre modèle`. + Pour cela, on a besoin de deux choses : + 1. Publier le modèle sur NPM 2. Ajouter une macro (`importer!`) qui permet de récupérer les règles de puis un paquet NPM -‎ +‎ -2\. Système d'import ---- +## 2\. Système d'import # 1. Publier le modèle sur NPM @@ -569,9 +579,10 @@ l'ajouter dans le `package.json`. ```json { "name": "myModel", - "files": [ "myModel.model.json" ], + "files": ["myModel.model.json"] } ``` + ## Template GitHub @@ -584,10 +595,11 @@ Le workflow a été automatisé dans un template GitHub : Il permet de pouvoir très rapidement publier un modèle sur NPM avec : + - un fichier `index.js` qui exporte le modèle compilé - un fichier `index.d.ts` qui exporte les types du modèle (l'ensemble des règles disponibles) -- une documentation générée avec `@publicodes/react-ui` est déployée avec GitHub Pages +- une documentation générée avec `@publicodes/react-ui` est déployée avec GitHub Pages - _(bientôt)_ le code d'un serveur exposant l'API REST du modèle avec `@publicodes/rest-api` @@ -603,8 +615,7 @@ Exemple de paquet utilisant le template : -2\. Système d'import ---- +## 2\. Système d'import # 2. Utiliser la macro `importer!` @@ -644,8 +655,7 @@ alimentation . petit déjeuner annuel: -2\. Système d'import ---- +## 2\. Système d'import # Techniquement @@ -654,6 +664,7 @@ alimentation . petit déjeuner annuel: Pour chacune des règles importées : + 1. On récupère le modèle depuis le paquet NPM 2. On récupère toutes les dépendances de cette règle @@ -681,8 +692,7 @@ importer!: -2\. Système d'import ---- +## 2\. Système d'import ## Exemple @@ -718,40 +728,40 @@ On obtient les règles suivantes dans le modèle compilé : "futureco-data . transport . ferry": null, "futureco-data . transport": null, ``` + -Conclusion ---- +## Conclusion # Conclusion + ## Le réel workflow de NGC ![](./compilation-steps-with-optim-npm.png) - ---- +## Au total, aujourd'hui en production : -- c'est `72 modèles` JSON compilés + +- c'est `72 modèles` JSON compilés - dont `36 modèles` optimisés avec `@publicodes/tools/optims` - avec des règles importées depuis `2 paquets NPM` différents -(`publicodes-commun` et `futureco-data`) - + (`publicodes-commun` et `futureco-data`) -Conclusion ---- +## Conclusion # Conclusion ## Pour Nos Gestes Climat + - Gain de performance sur le temps d'instanciation du moteur (~40%) - Réutilisation de règles du modèle `futureco-data` pour l'ajout de l'empreinte @@ -763,11 +773,12 @@ des trajets en ferry et de la piscine et `publicodes-negaoctet`) -‎ +‎ ## Pour Publicodes + ### @publicodes/tools @@ -780,6 +791,7 @@ et `publicodes-negaoctet`) Uniformisation du processus de compilation des modèles avec la fonction `getModelFromSource` + Ajout de la macro `importer!` pour charger des règles depuis un paquet NPM ou @@ -805,22 +817,22 @@ des modèles Publicodes avec le template GitHub. -Pour aller plus loin ---- +## Pour aller plus loin # La suite + - Il y a encore de la place pour améliorer l'optimisation des modèles - Reprendre le travail sur l'implémentation du LSP pour VSCode (`@publicodes/language-server`) - _(Un jour peut-être)_ compiler directement les modèles en JS/WebAssembly pour -ne pas avoir à charger le moteur dans le navigateur + ne pas avoir à charger le moteur dans le navigateur -‎ +‎ # Les ressources @@ -828,13 +840,14 @@ ne pas avoir à charger le moteur dans le navigateur - La documentation de l'API : [](https://publicodes.github.io/tools/index.html) - Le dépôt du template GitHub : [](https://github.com/publicodes/model-template) - Des exemples d'utilisation de `@publicodes/tools` - - `nosgestesclimat` : [](https://github.com/incubateur-ademe/nosgestesclimat) - - `publicodes-commun` : [](https://github.com/incubateur-ademe/publicodes-commun) - - `publicodes-negaoctet` : [](https://github.com/incubateur-ademe/publicodes-negaoctet) - - `publicodes-impact-livraison` : [](https://github.com/incubateur-ademe/publicodes-negaoctet) + - `nosgestesclimat` : [](https://github.com/incubateur-ademe/nosgestesclimat) + - `publicodes-commun` : [](https://github.com/incubateur-ademe/publicodes-commun) + - `publicodes-negaoctet` : [](https://github.com/incubateur-ademe/publicodes-negaoctet) + - `publicodes-impact-livraison` : [](https://github.com/incubateur-ademe/publicodes-negaoctet) - Slides : [](quelquepart) -‎ +‎ + Merci de votre attention :) diff --git a/presentation-2023-11-30/theme.yaml b/presentation-2023-11-30/theme.yaml index 235d7f3..237ced3 100644 --- a/presentation-2023-11-30/theme.yaml +++ b/presentation-2023-11-30/theme.yaml @@ -2,15 +2,15 @@ default: margin: percent: 8 colors: - foreground: "e6e6e6" - background: "040312" + foreground: 'e6e6e6' + background: '040312' slide_title: alignment: center # padding_bottom: 1 # padding_top: 1 colors: - foreground: "ee9322" + foreground: 'ee9322' code: alignment: left @@ -24,11 +24,11 @@ code: execution_output: colors: - background: "2d2d2d" + background: '2d2d2d' inline_code: colors: - foreground: "f78ca2" + foreground: 'f78ca2' intro_slide: title: @@ -36,53 +36,53 @@ intro_slide: percent: 50 alignment: center colors: - foreground: "b4ccff" + foreground: 'b4ccff' subtitle: alignment: center margin: percent: 50 colors: - foreground: "a5d7e8" + foreground: 'a5d7e8' author: alignment: center colors: - foreground: "b6eada" + foreground: 'b6eada' positioning: page_bottom headings: h1: - prefix: "██" + prefix: '██' colors: - foreground: "3085c3" + foreground: '3085c3' h2: - prefix: "███" + prefix: '███' colors: - foreground: "a8df8e" + foreground: 'a8df8e' h3: - prefix: "██████" + prefix: '██████' colors: - foreground: "f78ca2" + foreground: 'f78ca2' h4: - prefix: "████████" + prefix: '████████' colors: - foreground: "d2d2d2" + foreground: 'd2d2d2' h5: - prefix: "░░░░░░" + prefix: '░░░░░░' colors: - foreground: "d2d2d2" + foreground: 'd2d2d2' h6: - prefix: "░░░░░░░" + prefix: '░░░░░░░' colors: - foreground: "d2d2d2" + foreground: 'd2d2d2' block_quote: - prefix: "▍ " + prefix: '▍ ' colors: - foreground: "f0f0f0" - background: "292e42" + foreground: 'f0f0f0' + background: '292e42' footer: style: template - left: "Emile Rolley - 30 novembre 2023" - center: "Publicodes Café" - right: "{current_slide} / {total_slides}" + left: 'Emile Rolley - 30 novembre 2023' + center: 'Publicodes Café' + right: '{current_slide} / {total_slides}'