uqo-imm1033 — Méthodes du coût en évaluation immobilière
Notes de cours interactives du cours IMM1033 (IMM1033-20, Hiver 2026) de l'Université du Québec en Outaouais (UQO). Site statique généré à partir des sources LaTeX du manuel, servi par le cluster MacLustr.
| Site public | https://www.uqo-imm1033.app |
| Cours | IMM1033 — Méthodes du coût en évaluation immobilière · 3 crédits · premier cycle · 14 séances |
| Trimestre | Hiver 2026 |
| Cours jumeau | IMM1003 — Éléments d’évaluation immobilière · https://www.uqo-imm1003.app |
App mld |
uqo-imm1033 · port 8161 · nœud actuel : voir mld status (au 2026-09-06 : M3U96a) |
| Processus PM2 | uqo-imm1033 (Node, server.mjs) · uqo-imm1033-ngrok (tunnel www.uqo-imm1033.app) |
| Santé | GET /api/health → {"ok":true,"started":…,"root":…,"uptime":…} |
| Dépôt | gitsrv:~/srv/git/uqo-imm1033.git (spbgit, git.spboucher.ai) |
| Auteur / contact | Simon-Pierre Boucher — contact@spboucher.ai |
| Version publiée | v2 « refonte majeure » — build du 2026-09-24 14:23:05, déployée le 2026-09-05 23:37 |
Sommaire
- Présentation
- Ce que contient le site
- Fonctionnalités interactives
- Structure du cours publiée
- Contenu du dépôt
- Arborescence du site généré (
dist/) - Le serveur
server.mjs - Chaîne de génération LaTeX → HTML
- Déploiement sur le cluster MacLustr (
mld) - Exploitation au quotidien
- Mettre à jour le contenu
- Données personnelles, sécurité, performance
- Identité visuelle
- Historique
- Droits et licence
- Contact
1. Présentation
uqo-imm1033 est la version web, interactive et « mobile-first » des notes de cours de IMM1033 — Méthodes du coût en évaluation immobilière
(IMM1033-20, Hiver 2026, 3 crédits · premier cycle · 14 séances), enseigné à l'UQO par Simon-Pierre Boucher.
La méthode du coût en évaluation immobilière : évaluation du terrain, coût de reproduction et de remplacement, estimation des coûts de construction et ventilation complète de la dépréciation.
Le site n'est pas une application avec base de données : c'est un site statique (HTML, CSS, JavaScript,
JSON, SVG, PDF) produit par un générateur maison à partir des sources LaTeX du manuel (uqo-notes.sty) et du
rapport Le marché de l'habitation au Québec. Toute l'interactivité (quiz, entraînement, jeux, progression, notes,
recherche, synthèse vocale, explorateurs) s'exécute dans le navigateur ; la progression est conservée
localement (localStorage) et exportable en JSON. Aucun compte, aucune collecte côté serveur.
Le rendu est optimisé pour le téléphone (375 px) autant que pour l'ordinateur, installable comme PWA
(manifest.webmanifest, icônes 192/512), et indexable (sitemap.xml, robots.txt, balises Open Graph).
Source de vérité du contenu = les fichiers .tex du dépôt de cours UQO_COURS. On ne modifie jamais le HTML
généré à la main : on modifie le LaTeX, on reconstruit, on redéploie (voir §11).
2. Ce que contient le site
Statistiques du build publié (dist/data/meta.json, build 2026-09-24 14:23:05) :
| Indicateur | Valeur |
|---|---|
| Séances (chapitres) | 14 |
| Mots de notes | 113 574 |
| Définitions | 64 |
| Formules encadrées | 43 |
| Exemples résolus | 96 |
| Exercices | 89 |
| Figures (TikZ → SVG, PDF → SVG) | 64 |
| Questions de quiz (14 chapitres) | 103 |
| Entrées de glossaire | 67 |
| Fiches recto-verso | 174 |
| Explorateurs interactifs insérés dans les séances | 9 |
| Générateurs de problèmes d'entraînement | 13 |
| Séquences (jeu de remise en ordre) | 6 |
| Entrées de l'index de recherche plein texte | 2 587 |
| Diapositives (PDF, une par séance) | 14 |
| Travaux pratiques publiés (énoncé PDF + gabarit Excel) | 3 |
| Rapport marché de l'habitation | 21 sections · 67 figures SVG · 28 tableaux |
Fichiers dans dist/ |
481 (≈ 454 Mo) |
Publié : notes intégrales des 14 séances, annexes, bibliographie, plan de cours (PDF), notes complètes (PDF), diapositives (PDF), énoncés des TP et gabarits Excel, rapport marché (HTML + PDF + données HPI ACI xlsx + script Python d'analyse).
Jamais publié (règle absolue du projet) : solutionnaires des TP, questionnaires d'examen, grilles de correction.
Le générateur ne les copie pas ; ne pas les ajouter à la main dans dist/.
3. Fonctionnalités interactives
3.1 Séances (/seance/01 … /seance/14)
- Notes intégrales converties depuis LaTeX : boîtes pédagogiques (définition, formule, exemple, exercice, attention,
à retenir), notes marginales façon Tufte, mathématiques KaTeX pré-rendues au build, tableaux, figures
TikZ rendues en SVG, références auteur-année (
references.bib). - Stepper de sections (précédent / suivant), sommaire latéral avec sections déjà lues, objectifs cochables, mode révision (masque les exemples, met en avant définitions et formules).
- Explorateurs SVG insérés à la fin de la première sous-section ciblée (9 par cours, voir §4) : curseurs et graphiques recalculés en direct.
- Surlignage + notes personnelles (sélection de texte → surligner / annoter ; export Markdown), lecture audio (synthèse vocale du navigateur, section par section), quiz de fin de séance intégré.
- Infobulles de glossaire sur les termes définis.
3.2 Réviser
/aide-memoire: toutes les formules et règles clés par séance./glossaireet/definitions: glossaire alphabétique, définitions intégrales avec lien vers la séance./fiches: fiches recto-verso (question / réponse) mélangeables, filtrables par séance./carte: carte du cours (SVG radial : parties → séances → objectifs)./exercices: banque de tous les exercices avec lien vers le contexte.
3.3 S'exercer
/quiz: quiz par séance ou examen blanc (tirage aléatoire multi-séances, correction commentée, score)./entrainement: problèmes à données aléatoires (13 générateurs,data/entrainement.js) avec solution détaillée recalculée à chaque tirage./jeux: association (terme ↔ définition), vrai / faux, remise en ordre (6 séquences du cours)./outils: calculateurs spécialisés (data/outils.js)./progression: tableau de bord (séances lues, objectifs cochés, quiz réussis, fiches maîtrisées) ; export / import JSON pour changer d'appareil.
3.4 Ressources
/diapositives: 14 PDF (files/slides/),/ressources: téléchargements (plan, notes PDF, TP, gabarits)./rapport: rapport Le marché de l'habitation au Québec en 21 sections HTML (rapport/0…rapport/15, annexesA…F), 67 figures SVG, 28 tableaux, valeurs clés, explorateurs HPI ACI (data/hpi.json) et FRED (data/fred.json), PDF complet et données sources dansfiles/rapport/./bibliographie: bibliographie fusionnée du manuel et du rapport./recherche: recherche plein texte côté client (data/search.json, 2 587 entrées).
3.5 Transversal
- Thème clair UQO par défaut, thème sombre, taille de texte réglable, navigation clavier.
- PWA installable,
404.htmlpersonnalisée, redirections propres (/glossaire→/glossaire/).
4. Structure du cours publiée
Parties et séances
| Partie | Titre | Séances |
|---|---|---|
| I | Fondements de la méthode du coût | 1 — Introduction à la méthode du coût · 2 — Cadre conceptuel et terminologie |
| II | Évaluation du terrain | 3 — Méthodes d'évaluation du terrain · 4 — Analyse du terrain et ajustements |
| III | Coût de construction | 5 — Coût de reproduction et coût de remplacement · 6 — Méthodes d'estimation des coûts · 7 — Coûts directs de construction · 8 — Coûts indirects et profit entrepreneurial |
| IV | La dépréciation | 9 — Concepts de dépréciation · 10 — Dépréciation physique · 11 — Dépréciation fonctionnelle · 12 — Dépréciation économique (externe) |
| V | Applications et intégration | 13 — Applications spécialisées · 14 — Synthèse et révision |
Évaluations affichées sur le site (la pondération et le calendrier viennent de courses.py) :
| Évaluation | Portée / format | Pondération | Échéance |
|---|---|---|---|
| TP1 — Évaluation d’un terrain vacant avec UQO Éval (46, rue Michaud, Saint-Rosaire) | Données réelles d’UQO Éval · grille $/m² + note à l’acheteur | 10 % | Séance 5 |
| TP2 — Bordereau de coût de remplacement neuf (quadruplex locatif) | Bordereau chaîné (Excel) | 15 % | Séance 9 |
| Examen intra | Séances 1 à 8 · maison, fenêtre de 72 h | 25 % | Séance 9 |
| TP3 — Ventilation complète de la dépréciation (atelier-entrepôt, Hull) | Ventilation anti-double-comptage (Excel) | 20 % | Séance 13 |
| Examen final | Accent dépréciation et intégration · maison, 72 h | 30 % | Période d’examens |
Travaux pratiques publiés (files/tp/) :
| TP | Pondération | Remise | Fichiers publiés | Description |
|---|---|---|---|---|
| TP1 — Évaluation d’un terrain avec UQO Éval | 10 % | Séance 5 | files/tp/IMM1033-20_TP1_enonce.pdf, files/tp/IMM1033-20_TP1_gabarit.xlsx |
Terrain réel à vendre au 46, rue Michaud (Saint-Rosaire) : neuf ventes réelles de terrains vacants, tendance du marché foncier par le ratio prix/rôle, grille $/m² (temps, superficie, Harper, équité du rôle), contrôle par affectation et rôle indexé, zones inondables 2026 ; gabarit Excel avec suivi de progression. |
| TP2 — Bordereau de coût neuf | 15 % | Séance 9 | files/tp/IMM1033-20_TP2_enonce.pdf, files/tp/IMM1033-20_TP2_gabarit.xlsx |
Quadruplex locatif de Gatineau : coûts directs, indirects, profit ; validation avec les guides de coûts. |
| TP3 — Ventilation de la dépréciation | 20 % | Séance 13 | files/tp/IMM1033-20_TP3_enonce.pdf, files/tp/IMM1033-20_TP3_gabarit.xlsx |
Atelier-entrepôt de Hull : physique (curable, CT, LT), fonctionnelle, externe ; garde-fous anti-double-comptage. |
Explorateurs interactifs (widget → emplacement dans la séance) :
| Widget | Inséré dans | Séance |
|---|---|---|
cascade-cout |
#s-2-3 |
2 — Cadre conceptuel et terminologie |
hbu |
#s-3-1 |
3 — Méthodes d'évaluation du terrain |
harper |
#s-4-2 |
4 — Analyse du terrain et ajustements |
indexation |
#s-5-5 |
5 — Coût de reproduction et coût de remplacement |
cascade-cout |
#s-8-7 |
8 — Coûts indirects et profit entrepreneurial |
age-vie |
#s-9-4 |
9 — Concepts de dépréciation |
ventilation |
#s-10-3 |
10 — Dépréciation physique |
allocation |
#s-12-6 |
12 — Dépréciation économique (externe) |
bail-vie |
#s-13-8 |
13 — Applications spécialisées |
Séquences du jeu de remise en ordre :
- L’ordre de ventilation de la dépréciation (5 étapes) →
/seance/13/#s-13-10 - Les quatre critères du PHMU (4 étapes) →
/seance/03/#s-3-1 - Le processus de la méthode du coût en cinq étapes (5 étapes) →
/seance/14/#s-14-1 - L’assemblage du coût neuf (5 étapes) →
/seance/08/#s-8-7 - La hiérarchie normative de l’aménagement (4 étapes) →
/seance/04/#s-4-3 - Les huit étapes de l’estimation du coût neuf (8 étapes) →
/seance/05/#s-5-8
5. Contenu du dépôt
uqo-imm1033/
├── README.md ← ce document
├── server.mjs ← serveur statique Node ≥ 20, zéro dépendance (déployé tel quel)
├── package.json ← {"start": "node server.mjs"} (aucune dépendance npm)
├── dist/ ← LE SITE GÉNÉRÉ, identique octet pour octet à ce qui tourne sur le nœud
├── deploy/
│ └── uqo-imm1033.manifest.json ← copie du manifeste mld (M1M32:~/dispatch/apps/uqo-imm1033.json) — sans secret
└── generator/ ← instantané du générateur au moment du build (lecture seule, voir ci-dessous)
├── README.md ← README du générateur (_Site_web)
├── package.json ← dépendance KaTeX pour le rendu des maths au build
├── build/ ← build.py, latex2html.py, rapport.py, tikz.py, render_math.mjs, bib.py,
│ brand.py, templates.py, courses.py, test_convert.py
├── data/ ← quiz-*.json, outils-*.js, entrainement-*.js (les deux cours)
└── assets/ ← css/site.css, js/app.js, brand/ (logos UQO sources)⚠️ generator/ est un instantané. Le générateur canonique vit dans le dépôt de cours
UQO_COURS/_Site_web/ (GitHub spboucher-ai/UQO_COURS, dossier partagé par les deux cours). Il est copié ici pour
que le dépôt de l'app soit auto-suffisant et lisible, mais toute modification doit se faire dans UQO_COURS, puis
être reconstruite et resynchronisée (§11). Les sources LaTeX (.tex) ne sont pas dans ce dépôt : elles
contiennent aussi les solutionnaires et examens, qui ne doivent jamais sortir de UQO_COURS.
Ce qui est volontairement exclu : cache/ du générateur (SVG TikZ et figures rendues, régénérables),
node_modules/, .DS_Store.
6. Arborescence du site généré (dist/)
| Chemin | Fichiers | Taille | Rôle |
|---|---|---|---|
aide-memoire/ |
1 | 278 Ko | Aide-mémoire (formules et règles par séance) |
assets/ |
172 | 20 Mo | CSS, JS, polices, SVG des figures (TikZ + rapport), logos, icônes PWA, image OG |
bibliographie/ |
1 | 55 Ko | Bibliographie fusionnée manuel + rapport |
carte/ |
1 | 44 Ko | Carte du cours (SVG radial) |
data/ |
9 | 2 Mo | JSON/JS consommés par le client (quiz, fiches, glossaire, recherche, outils, entraînement, HPI, FRED, meta) |
definitions/ |
1 | 119 Ko | Toutes les définitions |
diapositives/ |
1 | 31 Ko | Liste des 14 PDF de diapositives |
entrainement/ |
1 | 25 Ko | Problèmes à données aléatoires |
exercices/ |
1 | 711 Ko | Banque d'exercices |
fiches/ |
1 | 26 Ko | Fiches recto-verso |
files/ |
27 | 21 Mo | PDF (notes, plan, diapositives, TP, rapport), gabarits xlsx, données HPI, script Python |
glossaire/ |
1 | 55 Ko | Glossaire alphabétique |
jeux/ |
1 | 27 Ko | Association, vrai/faux, remise en ordre |
outils/ |
1 | 25 Ko | Calculateurs |
progression/ |
1 | 26 Ko | Tableau de bord + export/import JSON |
quiz/ |
1 | 25 Ko | Quiz par séance + examen blanc |
rapport/ |
22 | 878 Ko | Rapport marché de l'habitation : 21 sections + annexes A–F |
recherche/ |
1 | 25 Ko | Recherche plein texte |
ressources/ |
1 | 39 Ko | Téléchargements |
seance/ |
14 | 4 Mo | Les 14 séances (seance/01 … seance/14) |
videos/ |
215 | 404 Mo | Séances vidéo : enregistrements Zoom (mp4/m4a hors git), sous-titres VTT, transcription synchronisée, chapitres, storyboard |
index.html |
1 | — | Accueil : héros, parties, calendrier, évaluations, accès rapides |
404.html |
1 | — | Page introuvable (servie avec le statut 404) |
manifest.webmanifest |
1 | — | PWA (name, short_name, icônes, theme_color #0f6180) |
sitemap.xml, robots.txt |
2 | — | Indexation (Allow: /) |
favicon.ico, favicon.svg |
2 | — | Icônes (générées par brand.py) |
dist/data/ en détail : meta.json (statistiques + chapitres), quiz.json (103 questions en 14 chapitres),
cards.json (174 fiches), glossaire.json, search.json (index plein texte), outils.js,
entrainement.js, hpi.json (indice HPI ACI mensuel, désaisonnalisé et brut), fred.json (séries FRED).
dist/files/ en détail : IMM1033_notes_de_cours.pdf, IMM1033_plan_de_cours.pdf, slides/ (14 PDF),
tp/ (3 énoncés PDF + 3 gabarits .xlsx), rapport/ (rapport_immobilier_quebec.pdf,
HPI_ACI_mensuel_desaisonnalise.xlsx, HPI_ACI_mensuel_non_desaisonnalise.xlsx, analyse_hpi_quebec.py).
7. Le serveur server.mjs
Serveur HTTP statique en Node.js pur (node:http, node:fs, node:zlib), aucune dépendance npm, ≈ 170 lignes.
node server.mjs <port> <dossier-dist>
# en production : node server.mjs 8161 /Users/simon-pierreboucher/apps/uqo-imm1033/distComportement :
| Aspect | Détail |
|---|---|
| Méthodes | GET et HEAD seulement ; autres → 405 + Allow: GET, HEAD |
| Santé | GET /api/health → JSON {ok, started, root, uptime} avec Cache-Control: no-store (utilisé par mld et par le monitoring) |
| Résolution | /x/ → x/index.html ; /x sans extension → redirection 301 vers /x/ si x/index.html existe, sinon x.html |
| Sécurité chemin | safeJoin : normalisation, refus de sortie de la racine (400) |
| Types MIME | html, css, js/mjs, json, svg, png, jpg, webp, ico, pdf, xlsx, woff/woff2/ttf, txt, xml, webmanifest |
| Compression | Brotli (qualité 5) ou gzip (niveau 6) à la volée pour html/css/js/json/svg/txt/xml/webmanifest > 1 Ko, selon Accept-Encoding ; Vary: Accept-Encoding |
| Cache | ETag faible (taille + mtime) + 304 ; Cache-Control: no-cache pour HTML et JSON ; public, max-age=86400, stale-while-revalidate=604800 sous /assets/ et /files/ ; public, max-age=3600 ailleurs |
| Plages | Range: bytes=… → 206 / 416 (lecture partielle des PDF dans le navigateur) |
| En-têtes | X-Content-Type-Options: nosniff, Referrer-Policy: strict-origin-when-cross-origin, Accept-Ranges: bytes, Content-Security-Policy: frame-ancestors 'self' sur le HTML |
| 404 | Sert 404.html avec le statut 404 |
| Écoute | 0.0.0.0:<port> (ngrok se connecte en local) ; journal de démarrage [uqo-cours] port … · racine … |
Les SVG des figures matplotlib du rapport font ≈ 300 Ko chacun ; la compression Brotli/gzip les ramène à quelques dizaines de Ko sur le fil.
8. Chaîne de génération LaTeX → HTML
Le pipeline (generator/build/build.py, ≈ 1 s par cours grâce aux caches) :
- Lecture des métadonnées (
courses.py) : identité, parties et couleurs, calendrier, évaluations, TP à publier, widgets et séquences. - Conversion LaTeX → HTML (
latex2html.py, ≈ 1 500 lignes) : dialecteuqo-notes.sty(boîtes, notes marginales,\oeavec avalement d'espace TeX, tableaux, listes, références croisées) et article du rapport. 0 avertissement sur les 32 fichiers de séances + le rapport. - TikZ → SVG (
tikz.py) : chaquetikzpictureest compilé enstandaloneavecpdflatex, converti parpdftocairo, mis en cache danscache/tikz/(clé = hachage du source). - Mathématiques (
render_math.mjs) : KaTeX exécuté en lot par Node au build → HTML statique, aucun JS mathématique côté client. - Bibliographie (
bib.py) :references.bib→ citations auteur-année + page/bibliographie. - Rapport (
rapport.py) : découpage en 21 sections, tableaux\input, valeurs clés, figures PDF → SVG (cache/rapport-fig/), extraction HPI (xlsx →hpi.json) et FRED (json). - Identité (
brand.py, Pillow + Fira Sans OTF de TeX Live) : logo UQO recoloré, favicons,apple-touch-icon, image Open Graph 1200 × 630 par cours. - Gabarits (
templates.py) : accueil, séance, carte, rapport, jeux, entraînement, progression, recherche… - Données :
quiz-<code>.json,outils-<code>.js,entrainement-<code>.jscopiés dansdist/data/, index de recherche et fiches générés. - Client :
assets/css/site.css(Fraunces / Source Serif 4 / Fira Sans, couleur par partie, mobile) etassets/js/app.js(recherche, quiz, fiches, widgets SVG, entraînement, jeux, progression, notes, TTS, explorateurs HPI/FRED).
Prérequis : Python ≥ 3.12 (Pillow, openpyxl), Node ≥ 20 (npm install pour KaTeX), TeX Live (pdflatex,
FiraSans, fontawesome5, pgfplots), poppler (pdftocairo, pdfinfo).
cd ~/Desktop/Academique/UQO/UQO_COURS/_Site_web
npm install # KaTeX, une fois
python3 build/build.py imm1033 # → dist/imm1033
node server/server.mjs 8161 dist/imm1033 # test local : http://localhost:8161
python3 build/test_convert.py # test de conversion completPièges connus : Python 3.14 refuse \" dans les expressions de f-strings imbriquées (utiliser des variables
intermédiaires) ; un widget doit être inséré en fin de première sous-section, jamais dans une boîte ; \oe suivi
d'un espace doit avaler l'espace (sémantique TeX).
9. Déploiement sur le cluster MacLustr (mld)
L'app est orchestrée par maclustr-dispatch (mld) depuis la passerelle M1M32 : elle choisit le nœud le plus
efficient, synchronise par rsync, démarre les processus PM2, ouvre le tunnel ngrok, vérifie la santé et met à jour
le registre (M1M32:~/dispatch/registry.json, copie laptop ~/Desktop/cluster-skill/cluster-registry.json).
Manifeste (deploy/uqo-imm1033.manifest.json, copie de M1M32:~/dispatch/apps/uqo-imm1033.json) :
| Clé | Valeur |
|---|---|
domain / port |
www.uqo-imm1033.app / 8161 |
health_path |
/api/health |
requires.runtimes |
ngrok, node, pm2 · ram_gb: 1 · port 8161 libre |
processes[0] |
PM2 uqo-imm1033 : /opt/homebrew/bin/node server.mjs 8161 ~/apps/uqo-imm1033/dist, autorestart, max_memory_restart: 300M (≈ 80 Mo observés) |
ngrok |
PM2 uqo-imm1033-ngrok → https://www.uqo-imm1033.app (CNAME chez le registraire → ngrok) |
placement |
libre (pas de pin), source_node: laptop |
sync_excludes |
.DS_Store |
Procédure complète depuis le laptop :
# 1. (re)construire le site
cd ~/Desktop/Academique/UQO/UQO_COURS/_Site_web && python3 build/build.py imm1033
# 2. rafraîchir le dossier d'app (= ce dépôt) et versionner
rm -rf stage/uqo-imm1033/dist && cp -R dist/imm1033 stage/uqo-imm1033/dist
cd stage/uqo-imm1033 && git add -A && git commit -m "build $(date +%F)" && git push origin main
# 3. laptop → passerelle M1M32 (staging), puis déploiement sur le nœud choisi par score
~/Desktop/cluster-skill/mld stage ~/Desktop/Academique/UQO/UQO_COURS/_Site_web/stage/uqo-imm1033 uqo-imm1033
~/Desktop/cluster-skill/mld deploy uqo-imm1033 # --node X pour imposer un nœud
# 4. vérifier
~/Desktop/cluster-skill/mld status --live | grep uqo-imm1033
curl -s https://www.uqo-imm1033.app/api/healthAutres commandes utiles : mld move uqo-imm1033 --to <nœud> (migration à chaud avec rollback), mld plan uqo-imm1033
(placement simulé), mld apps (manifestes). Le nœud n'a pas de dépôt git : c'est mld qui synchronise depuis le
staging de M1M32 ; ce dépôt spbgit est la référence versionnée de ce qui est déployé.
10. Exploitation au quotidien
NODE=$(~/Desktop/cluster-skill/mld status | awk '/uqo-imm1033 /{print $2}') # ou lire mld status
ssh $NODE 'pm2 ls | grep uqo-imm1033; pm2 logs uqo-imm1033 --lines 50 --nostream'
ssh $NODE 'pm2 restart uqo-imm1033' # redémarrage du serveur Node
ssh $NODE 'pm2 restart uqo-imm1033-ngrok' # tunnel
curl -sI https://www.uqo-imm1033.app/ | head -5 # 200 + en-têtes
curl -s https://www.uqo-imm1033.app/api/health # uptime- PM2 est configuré au démarrage (
pm2 startup) sur tous les nœuds d'apps : l'app revient après un redémarrage. - Le site est aussi surveillé par l'app MacLustr (macOS / iOS) via le registre
mld(santé loopback + PM2). - Emplacement disque sur le nœud :
~/apps/uqo-imm1033/(server.mjs,package.json,README.md,dist/, ≈ 454 Mo). - Si
mld statusmontrestale/offline:ssh <nœud> pm2 ls, puismld deploy uqo-imm1033(idempotent).
11. Mettre à jour le contenu
| Changement | Où | Puis |
|---|---|---|
| Texte, exemple, exercice, figure d'une séance | .tex dans UQO_COURS/IMM1033-20_Methodes_du_cout/IMM1033_Notes_de_cours/sources/ |
build → §9 |
| Question de quiz | _Site_web/data/quiz-imm1033.json (q, c choix, a index, e explication, url) |
build → §9 |
| Problème d'entraînement | _Site_web/data/entrainement-imm1033.js : objet {id, title, ch, url, gen(R)} |
build → §9 |
| Calculateur | _Site_web/data/outils-imm1033.js |
build → §9 |
| Widget dans une séance | courses.py → widgets : ("s-<ch>-<sec>", "<nom>") + Widgets.register("<nom>", …) dans assets/js/app.js |
build → §9 |
| Séquence (remise en ordre) | courses.py → sequences : (titre, [étapes…], "/seance/NN/#ancre") |
build → §9 |
| Calendrier, évaluations, TP publiés | courses.py → events / evaluation / tps |
build → §9 |
| Diapositives | PDF dans 02_Slides/pdf/seance*.pdf du cours |
build → §9 |
| Rapport marché | Rapport_Immobilier_Quebec/ (LaTeX, figures PDF, xlsx HPI, json FRED) |
build → §9 |
| Style / comportement client | assets/css/site.css, assets/js/app.js |
build → §9 |
Après un rebuild des notes, penser à ré-ingérer le site dans UQO-Chat (tuteur IA, dépôt uqo-chat) : il
indexe le HTML de dist/<cours>/seance/NN pour son RAG.
12. Données personnelles, sécurité, performance
- Aucune donnée côté serveur : pas de compte, pas de base, pas de formulaire, pas de cookie de suivi. La
progression, les notes, les surlignages et les préférences sont dans le
localStoragedu navigateur de l'étudiant·e (export/import JSON depuis/progression). - Polices servies localement ou via le CSS du site ; KaTeX pré-rendu (pas de CDN mathématique au chargement).
- En-têtes de sécurité posés par
server.mjs(§7) ; ngrok termine le TLS (https://www.uqo-imm1033.app). - Performance : HTML < 300 Ko par séance avant compression, SVG compressés à la volée, cache long sur
/assets/et/files/,ETag/304. Un site complet pèse ≈ 454 Mo dont ≈ 18 Mo de PDF. - Accessibilité : contrastes du thème UQO vérifiés, navigation clavier,
lang="fr-CA", lecture audio.
13. Identité visuelle
- Couleur principale UQO teal
#0F6180, or#cca424, couleur par partie (part_colors), accent du cours#cca424. - Typographies : Fraunces (titres), Source Serif 4 (texte), Fira Sans (interface).
- Logo : mot-symbole UQO (source Wikimedia + sources LaTeX,
generator/assets/brand/) recoloré parbrand.py; favicons,apple-touch-icon, icônes PWA 192/512 et image OG 1200 × 630 générés au build. - Le logo et le nom UQO appartiennent à l'Université du Québec en Outaouais ; usage dans le cadre du cours.
14. Historique
| Date | Étape |
|---|---|
| 2026-08-28 | Manuels LaTeX IMM1003 / IMM1033 (uqo-notes.sty, latexmk) — base du contenu |
| 2026-09-04 → 05 (nuit) | v1 : générateur _Site_web (latex2html, TikZ→SVG, KaTeX, quiz, outils), server.mjs, premier déploiement mld |
| 2026-09-05 (soir) | v2 « refonte majeure » : thème UQO, brand.py, 9 explorateurs par cours, entraînement, jeux, carte, progression, notes/audio, rapport marché intégré (HPI + FRED) ; build 2026-09-24 14:23:05, déployé à 23:37 sur M3U96a |
| 2026-09-06 | UQO-Chat (tuteur IA) indexe ce site pour son RAG (714 passages pour les deux cours) |
| 2026-09-06 | Dépôt spbgit uqo-imm1033.git créé : artefact déployé + instantané du générateur + ce README |
15. Droits et licence
Contenu pédagogique © Simon-Pierre Boucher, UQO — usage réservé aux étudiant·es du cours ; toute reproduction hors de ce cadre requiert une autorisation écrite. Code du générateur et du serveur : © Simon-Pierre Boucher, tous droits réservés (dépôt privé). Données externes : ACI (HPI), FRED, sources citées dans la bibliographie du rapport.
16. Contact
Simon-Pierre Boucher
Courriel : contact@spboucher.ai
Git personnel : https://git.spboucher.ai (spbgit, dépôt uqo-imm1033)
Cours : https://www.uqo-imm1033.app · cours jumeau : https://www.uqo-imm1003.app · tuteur IA : https://www.uqo-chat.app