@k2works/claude-code-booster 4.17.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (755) hide show
  1. package/lib/assets/.claude/skills/apply-okf/SKILL.md +88 -0
  2. package/lib/assets/.claude/skills/apply-okf/evals/evals.json +8 -0
  3. package/lib/assets/.claude/skills/apply-okf/scripts/__pycache__/okf_apply.cpython-314.pyc +0 -0
  4. package/lib/assets/.claude/skills/apply-okf/scripts/okf_apply.py +397 -0
  5. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/benchmark.json +20 -0
  6. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/benchmark.md +13 -0
  7. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/eval_metadata.json +14 -0
  8. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/with_skill/grading.json +39 -0
  9. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/with_skill/outputs/docs_after/adr/001-db.md +12 -0
  10. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/with_skill/outputs/docs_after/adr/002-cache-strategy.md +20 -0
  11. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/with_skill/outputs/docs_after/adr/index.md +4 -0
  12. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/with_skill/outputs/docs_after/design/data-model.md +12 -0
  13. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/with_skill/outputs/docs_after/design/index.md +3 -0
  14. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/with_skill/outputs/docs_after/index.md +10 -0
  15. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/with_skill/outputs/docs_after/log.md +7 -0
  16. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/with_skill/outputs/docs_after/operation/deploy-old.md +12 -0
  17. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/with_skill/outputs/docs_after/operation/deploy.md +12 -0
  18. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/with_skill/outputs/docs_after/operation/index.md +4 -0
  19. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/with_skill/outputs/docs_after/reference/OKF/345/260/216/345/205/245/343/202/254/343/202/244/343/203/211_V0.2.md +965 -0
  20. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/with_skill/outputs/report.md +76 -0
  21. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/without_skill/grading.json +39 -0
  22. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/without_skill/outputs/docs_after/adr/001-db.md +12 -0
  23. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/without_skill/outputs/docs_after/adr/002-cache-strategy.md +20 -0
  24. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/without_skill/outputs/docs_after/adr/index.md +4 -0
  25. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/without_skill/outputs/docs_after/design/data-model.md +12 -0
  26. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/without_skill/outputs/docs_after/design/index.md +3 -0
  27. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/without_skill/outputs/docs_after/index.md +10 -0
  28. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/without_skill/outputs/docs_after/log.md +7 -0
  29. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/without_skill/outputs/docs_after/operation/deploy-old.md +12 -0
  30. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/without_skill/outputs/docs_after/operation/deploy.md +12 -0
  31. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/without_skill/outputs/docs_after/operation/index.md +4 -0
  32. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/without_skill/outputs/docs_after/reference/OKF/345/260/216/345/205/245/343/202/254/343/202/244/343/203/211_V0.2.md +965 -0
  33. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/without_skill/outputs/report.md +22 -0
  34. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/eval_metadata.json +13 -0
  35. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/with_skill/grading.json +34 -0
  36. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/with_skill/outputs/docs_after/adr/001-db.md +12 -0
  37. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/with_skill/outputs/docs_after/adr/002-cache-strategy.md +11 -0
  38. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/with_skill/outputs/docs_after/adr/index.md +3 -0
  39. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/with_skill/outputs/docs_after/design/data-model.md +14 -0
  40. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/with_skill/outputs/docs_after/design/index.md +3 -0
  41. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/with_skill/outputs/docs_after/index.md +10 -0
  42. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/with_skill/outputs/docs_after/log.md +7 -0
  43. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/with_skill/outputs/docs_after/operation/deploy-old.md +12 -0
  44. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/with_skill/outputs/docs_after/operation/deploy.md +12 -0
  45. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/with_skill/outputs/docs_after/operation/index.md +4 -0
  46. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/with_skill/outputs/docs_after/reference/OKF/345/260/216/345/205/245/343/202/254/343/202/244/343/203/211_V0.2.md +965 -0
  47. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/with_skill/outputs/report.md +61 -0
  48. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/without_skill/grading.json +34 -0
  49. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/without_skill/outputs/docs_after/adr/001-db.md +12 -0
  50. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/without_skill/outputs/docs_after/adr/002-cache-strategy.md +11 -0
  51. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/without_skill/outputs/docs_after/adr/index.md +3 -0
  52. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/without_skill/outputs/docs_after/design/data-model.md +13 -0
  53. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/without_skill/outputs/docs_after/design/index.md +3 -0
  54. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/without_skill/outputs/docs_after/index.md +10 -0
  55. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/without_skill/outputs/docs_after/log.md +7 -0
  56. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/without_skill/outputs/docs_after/operation/deploy-old.md +12 -0
  57. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/without_skill/outputs/docs_after/operation/deploy.md +12 -0
  58. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/without_skill/outputs/docs_after/operation/index.md +4 -0
  59. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/without_skill/outputs/docs_after/reference/OKF/345/260/216/345/205/245/343/202/254/343/202/244/343/203/211_V0.2.md +965 -0
  60. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/without_skill/outputs/report.md +18 -0
  61. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/eval_metadata.json +13 -0
  62. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/with_skill/grading.json +34 -0
  63. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/with_skill/outputs/docs_after/adr/001-db.md +12 -0
  64. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/with_skill/outputs/docs_after/adr/002-cache-strategy.md +11 -0
  65. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/with_skill/outputs/docs_after/adr/index.md +3 -0
  66. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/with_skill/outputs/docs_after/design/data-model.md +12 -0
  67. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/with_skill/outputs/docs_after/design/index.md +3 -0
  68. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/with_skill/outputs/docs_after/index.md +10 -0
  69. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/with_skill/outputs/docs_after/log.md +7 -0
  70. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/with_skill/outputs/docs_after/operation/deploy-old.md +13 -0
  71. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/with_skill/outputs/docs_after/operation/deploy.md +12 -0
  72. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/with_skill/outputs/docs_after/operation/index.md +7 -0
  73. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/with_skill/outputs/docs_after/reference/OKF/345/260/216/345/205/245/343/202/254/343/202/244/343/203/211_V0.2.md +965 -0
  74. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/with_skill/outputs/report.md +83 -0
  75. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/without_skill/grading.json +34 -0
  76. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/without_skill/outputs/docs_after/adr/001-db.md +12 -0
  77. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/without_skill/outputs/docs_after/adr/002-cache-strategy.md +11 -0
  78. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/without_skill/outputs/docs_after/adr/index.md +3 -0
  79. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/without_skill/outputs/docs_after/design/data-model.md +12 -0
  80. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/without_skill/outputs/docs_after/design/index.md +3 -0
  81. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/without_skill/outputs/docs_after/index.md +10 -0
  82. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/without_skill/outputs/docs_after/log.md +7 -0
  83. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/without_skill/outputs/docs_after/operation/deploy-old.md +14 -0
  84. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/without_skill/outputs/docs_after/operation/deploy.md +12 -0
  85. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/without_skill/outputs/docs_after/operation/index.md +4 -0
  86. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/without_skill/outputs/docs_after/reference/OKF/345/260/216/345/205/245/343/202/254/343/202/244/343/203/211_V0.2.md +965 -0
  87. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/without_skill/outputs/report.md +15 -0
  88. package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/review.html +1325 -0
  89. package/lib/assets/.claude/skills/closing-iteration/SKILL.md +16 -0
  90. package/lib/assets/.claude/skills/creating-adr/SKILL.md +4 -0
  91. package/lib/assets/.claude/skills/creating-journal/SKILL.md +12 -1
  92. package/lib/assets/.claude/skills/migrating-okf/SKILL.md +149 -0
  93. package/lib/assets/.claude/skills/migrating-okf/evals/evals.json +23 -0
  94. package/lib/assets/.claude/skills/migrating-okf/scripts/__pycache__/okf_check.cpython-314.pyc +0 -0
  95. package/lib/assets/.claude/skills/migrating-okf/scripts/okf_check.py +468 -0
  96. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/benchmark.json +20 -0
  97. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/benchmark.md +13 -0
  98. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/eval_metadata.json +15 -0
  99. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/with_skill/grading.json +44 -0
  100. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/with_skill/outputs/docs_after/adr/index.md +10 -0
  101. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/with_skill/outputs/docs_after/index.md +15 -0
  102. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/with_skill/outputs/docs_after/log.md +5 -0
  103. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/with_skill/outputs/docs_after/reference/OKF/345/260/216/345/205/245/343/202/254/343/202/244/343/203/211_V0.2.md +966 -0
  104. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/with_skill/outputs/docs_after/reference/index.md +6 -0
  105. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/with_skill/outputs/docs_after/reference//343/202/210/343/201/204/343/202/275/343/203/225/343/203/210/343/202/246/343/202/247/343/202/242/343/201/250/343/201/257.md +261 -0
  106. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/with_skill/outputs/docs_after/reference//343/203/252/343/203/252/343/203/274/343/202/271/343/202/254/343/202/244/343/203/211.md +480 -0
  107. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/with_skill/outputs/docs_after/reference//347/222/260/345/242/203/345/244/211/346/225/260/347/256/241/347/220/206/343/202/254/343/202/244/343/203/211.md +681 -0
  108. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/with_skill/outputs/report.md +85 -0
  109. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/without_skill/grading.json +44 -0
  110. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/without_skill/outputs/docs_after/adr/index.md +8 -0
  111. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/without_skill/outputs/docs_after/index.md +11 -0
  112. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/without_skill/outputs/docs_after/log.md +7 -0
  113. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/without_skill/outputs/docs_after/reference/OKF/345/260/216/345/205/245/343/202/254/343/202/244/343/203/211_V0.2.md +964 -0
  114. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/without_skill/outputs/docs_after/reference/index.md +9 -0
  115. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/without_skill/outputs/docs_after/reference//343/202/210/343/201/204/343/202/275/343/203/225/343/203/210/343/202/246/343/202/247/343/202/242/343/201/250/343/201/257.md +250 -0
  116. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/without_skill/outputs/docs_after/reference//343/203/252/343/203/252/343/203/274/343/202/271/343/202/254/343/202/244/343/203/211.md +469 -0
  117. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/without_skill/outputs/docs_after/reference//347/222/260/345/242/203/345/244/211/346/225/260/347/256/241/347/220/206/343/202/254/343/202/244/343/203/211.md +677 -0
  118. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/without_skill/outputs/report.md +49 -0
  119. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-2-upgrade-v01-to-v02/eval_metadata.json +13 -0
  120. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-2-upgrade-v01-to-v02/with_skill/grading.json +34 -0
  121. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-2-upgrade-v01-to-v02/with_skill/outputs/knowledge_after/index.md +7 -0
  122. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-2-upgrade-v01-to-v02/with_skill/outputs/knowledge_after/log.md +7 -0
  123. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-2-upgrade-v01-to-v02/with_skill/outputs/knowledge_after/metrics/churn.md +9 -0
  124. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-2-upgrade-v01-to-v02/with_skill/outputs/knowledge_after/metrics/income-statement.md +15 -0
  125. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-2-upgrade-v01-to-v02/with_skill/outputs/report.md +147 -0
  126. package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/review.html +1325 -0
  127. package/lib/assets/.claude/skills/opening-iteration/SKILL.md +15 -0
  128. package/lib/assets/.claude/skills/orchestrating-analysis/SKILL.md +4 -1
  129. package/lib/assets/.claude/skills/orchestrating-development/SKILL.md +2 -0
  130. package/lib/assets/.claude/skills/orchestrating-operation/SKILL.md +3 -1
  131. package/lib/assets/.claude/skills/orchestrating-project/SKILL.md +4 -1
  132. package/lib/assets/.claude/skills/planning-releases/SKILL.md +2 -0
  133. package/lib/assets/.env.example +9 -0
  134. package/lib/assets/CLAUDE.md +218 -216
  135. package/lib/assets/docs/article/functional-desgin-ppp/all/01-immutability-and-data-transformation.md +9 -0
  136. package/lib/assets/docs/article/functional-desgin-ppp/all/02-function-composition.md +9 -0
  137. package/lib/assets/docs/article/functional-desgin-ppp/all/03-polymorphism.md +9 -0
  138. package/lib/assets/docs/article/functional-desgin-ppp/all/04-data-validation.md +9 -0
  139. package/lib/assets/docs/article/functional-desgin-ppp/all/05-property-based-testing.md +9 -0
  140. package/lib/assets/docs/article/functional-desgin-ppp/all/06-tdd-and-functional.md +9 -0
  141. package/lib/assets/docs/article/functional-desgin-ppp/all/07-composite-pattern.md +9 -0
  142. package/lib/assets/docs/article/functional-desgin-ppp/all/08-decorator-pattern.md +10 -1
  143. package/lib/assets/docs/article/functional-desgin-ppp/all/09-adapter-pattern.md +9 -0
  144. package/lib/assets/docs/article/functional-desgin-ppp/all/10-strategy-pattern.md +9 -0
  145. package/lib/assets/docs/article/functional-desgin-ppp/all/11-command-pattern.md +9 -0
  146. package/lib/assets/docs/article/functional-desgin-ppp/all/12-visitor-pattern.md +9 -0
  147. package/lib/assets/docs/article/functional-desgin-ppp/all/13-abstract-factory-pattern.md +9 -0
  148. package/lib/assets/docs/article/functional-desgin-ppp/all/14-abstract-server-pattern.md +9 -0
  149. package/lib/assets/docs/article/functional-desgin-ppp/all/15-gossiping-bus-drivers.md +9 -0
  150. package/lib/assets/docs/article/functional-desgin-ppp/all/16-payroll-system.md +9 -0
  151. package/lib/assets/docs/article/functional-desgin-ppp/all/17-video-rental-system.md +9 -0
  152. package/lib/assets/docs/article/functional-desgin-ppp/all/18-concurrency-system.md +9 -0
  153. package/lib/assets/docs/article/functional-desgin-ppp/all/19-wa-tor-simulation.md +10 -1
  154. package/lib/assets/docs/article/functional-desgin-ppp/all/20-pattern-interactions.md +9 -0
  155. package/lib/assets/docs/article/functional-desgin-ppp/all/21-best-practices.md +9 -0
  156. package/lib/assets/docs/article/functional-desgin-ppp/all/22-oo-to-fp-migration.md +9 -0
  157. package/lib/assets/docs/article/functional-desgin-ppp/clojure/01-immutability-and-data-transformation.md +9 -0
  158. package/lib/assets/docs/article/functional-desgin-ppp/clojure/02-function-composition.md +9 -0
  159. package/lib/assets/docs/article/functional-desgin-ppp/clojure/03-polymorphism.md +9 -0
  160. package/lib/assets/docs/article/functional-desgin-ppp/clojure/04-clojure-spec.md +9 -0
  161. package/lib/assets/docs/article/functional-desgin-ppp/clojure/05-property-based-testing.md +9 -0
  162. package/lib/assets/docs/article/functional-desgin-ppp/clojure/06-tdd-in-functional.md +9 -0
  163. package/lib/assets/docs/article/functional-desgin-ppp/clojure/07-composite-pattern.md +9 -0
  164. package/lib/assets/docs/article/functional-desgin-ppp/clojure/08-decorator-pattern.md +9 -0
  165. package/lib/assets/docs/article/functional-desgin-ppp/clojure/09-adapter-pattern.md +9 -0
  166. package/lib/assets/docs/article/functional-desgin-ppp/clojure/10-strategy-pattern.md +9 -0
  167. package/lib/assets/docs/article/functional-desgin-ppp/clojure/11-command-pattern.md +9 -0
  168. package/lib/assets/docs/article/functional-desgin-ppp/clojure/12-visitor-pattern.md +9 -0
  169. package/lib/assets/docs/article/functional-desgin-ppp/clojure/13-abstract-factory-pattern.md +9 -0
  170. package/lib/assets/docs/article/functional-desgin-ppp/clojure/14-abstract-server-pattern.md +9 -0
  171. package/lib/assets/docs/article/functional-desgin-ppp/clojure/15-gossiping-bus-drivers.md +9 -0
  172. package/lib/assets/docs/article/functional-desgin-ppp/clojure/16-payroll-system.md +9 -0
  173. package/lib/assets/docs/article/functional-desgin-ppp/clojure/17-video-rental-system.md +9 -0
  174. package/lib/assets/docs/article/functional-desgin-ppp/clojure/18-concurrency-system.md +9 -0
  175. package/lib/assets/docs/article/functional-desgin-ppp/clojure/19-wator-simulation.md +9 -0
  176. package/lib/assets/docs/article/functional-desgin-ppp/clojure/20-pattern-interactions.md +9 -0
  177. package/lib/assets/docs/article/functional-desgin-ppp/clojure/21-best-practices.md +9 -0
  178. package/lib/assets/docs/article/functional-desgin-ppp/clojure/22-oo-to-fp-migration.md +9 -0
  179. package/lib/assets/docs/article/functional-desgin-ppp/clojure/index.md +3 -3
  180. package/lib/assets/docs/article/functional-desgin-ppp/elixir/01-immutability-and-data-transformation.md +9 -0
  181. package/lib/assets/docs/article/functional-desgin-ppp/elixir/02-function-composition.md +9 -0
  182. package/lib/assets/docs/article/functional-desgin-ppp/elixir/03-polymorphism.md +9 -0
  183. package/lib/assets/docs/article/functional-desgin-ppp/elixir/04-data-validation.md +9 -0
  184. package/lib/assets/docs/article/functional-desgin-ppp/elixir/05-property-based-testing.md +9 -0
  185. package/lib/assets/docs/article/functional-desgin-ppp/elixir/06-tdd-and-fp.md +9 -0
  186. package/lib/assets/docs/article/functional-desgin-ppp/elixir/07-effects-and-pure-functions.md +9 -0
  187. package/lib/assets/docs/article/functional-desgin-ppp/elixir/08-error-handling-strategies.md +9 -0
  188. package/lib/assets/docs/article/functional-desgin-ppp/elixir/09-io-and-external-systems.md +9 -0
  189. package/lib/assets/docs/article/functional-desgin-ppp/elixir/10-concurrency-patterns.md +9 -0
  190. package/lib/assets/docs/article/functional-desgin-ppp/elixir/11-command-pattern.md +9 -0
  191. package/lib/assets/docs/article/functional-desgin-ppp/elixir/12-visitor-pattern.md +9 -0
  192. package/lib/assets/docs/article/functional-desgin-ppp/elixir/13-abstract-factory-pattern.md +9 -0
  193. package/lib/assets/docs/article/functional-desgin-ppp/elixir/14-abstract-server-pattern.md +9 -0
  194. package/lib/assets/docs/article/functional-desgin-ppp/elixir/15-gossiping-bus-drivers.md +9 -0
  195. package/lib/assets/docs/article/functional-desgin-ppp/elixir/16-payroll-system.md +9 -0
  196. package/lib/assets/docs/article/functional-desgin-ppp/elixir/17-video-rental-system.md +9 -0
  197. package/lib/assets/docs/article/functional-desgin-ppp/elixir/18-concurrency-system.md +9 -0
  198. package/lib/assets/docs/article/functional-desgin-ppp/elixir/19-wator-simulation.md +9 -0
  199. package/lib/assets/docs/article/functional-desgin-ppp/elixir/20-pattern-interactions.md +9 -0
  200. package/lib/assets/docs/article/functional-desgin-ppp/elixir/21-best-practices.md +9 -0
  201. package/lib/assets/docs/article/functional-desgin-ppp/elixir/22-oo-to-fp-migration.md +9 -0
  202. package/lib/assets/docs/article/functional-desgin-ppp/elixir/index.md +22 -22
  203. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/01-immutability-and-data-transformation.md +9 -0
  204. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/02-function-composition.md +9 -0
  205. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/03-polymorphism.md +9 -0
  206. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/04-data-validation.md +9 -0
  207. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/05-property-based-testing.md +9 -0
  208. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/06-tdd-functional.md +9 -0
  209. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/07-composite-pattern.md +9 -0
  210. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/08-decorator-pattern.md +9 -0
  211. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/09-adapter-pattern.md +9 -0
  212. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/10-strategy-pattern.md +9 -0
  213. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/11-command-pattern.md +9 -0
  214. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/12-visitor-pattern.md +9 -0
  215. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/13-abstract-factory-pattern.md +9 -0
  216. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/14-abstract-server-pattern.md +9 -0
  217. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/15-gossiping-bus-drivers.md +9 -0
  218. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/16-payroll-system.md +9 -0
  219. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/17-video-rental-system.md +9 -0
  220. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/18-concurrency-system.md +9 -0
  221. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/19-wator-simulation.md +9 -0
  222. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/20-pattern-interactions.md +9 -0
  223. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/21-best-practices.md +9 -0
  224. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/22-oo-to-fp-migration.md +9 -0
  225. package/lib/assets/docs/article/functional-desgin-ppp/haskell/01-immutability-and-data-transformation.md +9 -0
  226. package/lib/assets/docs/article/functional-desgin-ppp/haskell/02-function-composition.md +9 -0
  227. package/lib/assets/docs/article/functional-desgin-ppp/haskell/03-polymorphism.md +9 -0
  228. package/lib/assets/docs/article/functional-desgin-ppp/haskell/04-data-validation.md +9 -0
  229. package/lib/assets/docs/article/functional-desgin-ppp/haskell/05-property-based-testing.md +9 -0
  230. package/lib/assets/docs/article/functional-desgin-ppp/haskell/06-tdd-functional.md +9 -0
  231. package/lib/assets/docs/article/functional-desgin-ppp/haskell/07-composite-pattern.md +9 -0
  232. package/lib/assets/docs/article/functional-desgin-ppp/haskell/08-decorator-pattern.md +9 -0
  233. package/lib/assets/docs/article/functional-desgin-ppp/haskell/09-adapter-pattern.md +9 -0
  234. package/lib/assets/docs/article/functional-desgin-ppp/haskell/10-strategy-pattern.md +9 -0
  235. package/lib/assets/docs/article/functional-desgin-ppp/haskell/11-command-pattern.md +9 -0
  236. package/lib/assets/docs/article/functional-desgin-ppp/haskell/12-visitor-pattern.md +9 -0
  237. package/lib/assets/docs/article/functional-desgin-ppp/haskell/13-abstract-factory-pattern.md +9 -0
  238. package/lib/assets/docs/article/functional-desgin-ppp/haskell/14-abstract-server-pattern.md +9 -0
  239. package/lib/assets/docs/article/functional-desgin-ppp/haskell/15-gossiping-bus-drivers.md +9 -0
  240. package/lib/assets/docs/article/functional-desgin-ppp/haskell/16-payroll-system.md +9 -0
  241. package/lib/assets/docs/article/functional-desgin-ppp/haskell/17-video-rental-system.md +9 -0
  242. package/lib/assets/docs/article/functional-desgin-ppp/haskell/18-concurrency-system.md +9 -0
  243. package/lib/assets/docs/article/functional-desgin-ppp/haskell/19-wator-simulation.md +9 -0
  244. package/lib/assets/docs/article/functional-desgin-ppp/haskell/20-pattern-interactions.md +9 -0
  245. package/lib/assets/docs/article/functional-desgin-ppp/haskell/21-best-practices.md +9 -0
  246. package/lib/assets/docs/article/functional-desgin-ppp/haskell/22-oo-to-fp-migration.md +9 -0
  247. package/lib/assets/docs/article/functional-desgin-ppp/rust/01-immutability-and-data-transformation.md +9 -0
  248. package/lib/assets/docs/article/functional-desgin-ppp/rust/02-function-composition.md +9 -0
  249. package/lib/assets/docs/article/functional-desgin-ppp/rust/03-polymorphism.md +9 -0
  250. package/lib/assets/docs/article/functional-desgin-ppp/rust/04-data-validation.md +9 -0
  251. package/lib/assets/docs/article/functional-desgin-ppp/rust/05-property-based-testing.md +9 -0
  252. package/lib/assets/docs/article/functional-desgin-ppp/rust/06-tdd-and-functional.md +9 -0
  253. package/lib/assets/docs/article/functional-desgin-ppp/rust/07-composite-pattern.md +9 -0
  254. package/lib/assets/docs/article/functional-desgin-ppp/rust/08-decorator-pattern.md +9 -0
  255. package/lib/assets/docs/article/functional-desgin-ppp/rust/09-adapter-pattern.md +9 -0
  256. package/lib/assets/docs/article/functional-desgin-ppp/rust/10-strategy-pattern.md +9 -0
  257. package/lib/assets/docs/article/functional-desgin-ppp/rust/11-command-pattern.md +9 -0
  258. package/lib/assets/docs/article/functional-desgin-ppp/rust/12-visitor-pattern.md +9 -0
  259. package/lib/assets/docs/article/functional-desgin-ppp/rust/13-abstract-factory-pattern.md +9 -0
  260. package/lib/assets/docs/article/functional-desgin-ppp/rust/14-abstract-server-pattern.md +9 -0
  261. package/lib/assets/docs/article/functional-desgin-ppp/rust/15-gossiping-bus-drivers.md +9 -0
  262. package/lib/assets/docs/article/functional-desgin-ppp/rust/16-payroll-system.md +9 -0
  263. package/lib/assets/docs/article/functional-desgin-ppp/rust/17-video-rental-system.md +9 -0
  264. package/lib/assets/docs/article/functional-desgin-ppp/rust/18-concurrency-system.md +9 -0
  265. package/lib/assets/docs/article/functional-desgin-ppp/rust/19-wator-simulation.md +9 -0
  266. package/lib/assets/docs/article/functional-desgin-ppp/rust/20-pattern-interactions.md +9 -0
  267. package/lib/assets/docs/article/functional-desgin-ppp/rust/21-best-practices.md +9 -0
  268. package/lib/assets/docs/article/functional-desgin-ppp/rust/22-oo-to-fp-migration.md +9 -0
  269. package/lib/assets/docs/article/functional-desgin-ppp/scala/01-immutability-and-data-transformation.md +9 -0
  270. package/lib/assets/docs/article/functional-desgin-ppp/scala/02-function-composition.md +9 -0
  271. package/lib/assets/docs/article/functional-desgin-ppp/scala/03-polymorphism.md +9 -0
  272. package/lib/assets/docs/article/functional-desgin-ppp/scala/04-data-validation.md +9 -0
  273. package/lib/assets/docs/article/functional-desgin-ppp/scala/05-property-based-testing.md +9 -0
  274. package/lib/assets/docs/article/functional-desgin-ppp/scala/06-tdd-functional.md +9 -0
  275. package/lib/assets/docs/article/functional-desgin-ppp/scala/07-composite-pattern.md +9 -0
  276. package/lib/assets/docs/article/functional-desgin-ppp/scala/08-decorator-pattern.md +9 -0
  277. package/lib/assets/docs/article/functional-desgin-ppp/scala/09-adapter-pattern.md +9 -0
  278. package/lib/assets/docs/article/functional-desgin-ppp/scala/10-strategy-pattern.md +9 -0
  279. package/lib/assets/docs/article/functional-desgin-ppp/scala/11-command-pattern.md +9 -0
  280. package/lib/assets/docs/article/functional-desgin-ppp/scala/12-visitor-pattern.md +9 -0
  281. package/lib/assets/docs/article/functional-desgin-ppp/scala/13-abstract-factory-pattern.md +9 -0
  282. package/lib/assets/docs/article/functional-desgin-ppp/scala/14-abstract-server-pattern.md +9 -0
  283. package/lib/assets/docs/article/functional-desgin-ppp/scala/15-gossiping-bus-drivers.md +9 -0
  284. package/lib/assets/docs/article/functional-desgin-ppp/scala/16-payroll-system.md +9 -0
  285. package/lib/assets/docs/article/functional-desgin-ppp/scala/17-video-rental-system.md +9 -0
  286. package/lib/assets/docs/article/functional-desgin-ppp/scala/18-concurrency-system.md +9 -0
  287. package/lib/assets/docs/article/functional-desgin-ppp/scala/19-wator-simulation.md +9 -0
  288. package/lib/assets/docs/article/functional-desgin-ppp/scala/20-pattern-interactions.md +9 -0
  289. package/lib/assets/docs/article/functional-desgin-ppp/scala/21-best-practices.md +9 -0
  290. package/lib/assets/docs/article/functional-desgin-ppp/scala/22-oo-to-fp-migration.md +9 -0
  291. package/lib/assets/docs/article/getting-start-docker-kubernetes/01-container-and-docker-basics.md +341 -332
  292. package/lib/assets/docs/article/getting-start-docker-kubernetes/02-container-deployment.md +785 -776
  293. package/lib/assets/docs/article/getting-start-docker-kubernetes/03-practical-container-build-deploy.md +466 -457
  294. package/lib/assets/docs/article/getting-start-docker-kubernetes/04-multi-container-application.md +878 -869
  295. package/lib/assets/docs/article/getting-start-docker-kubernetes/05-kubernetes-introduction.md +585 -576
  296. package/lib/assets/docs/article/getting-start-docker-kubernetes/06-kubernetes-deploy-cluster.md +620 -611
  297. package/lib/assets/docs/article/getting-start-docker-kubernetes/07-kubernetes-advanced.md +621 -612
  298. package/lib/assets/docs/article/getting-start-docker-kubernetes/08-kubernetes-packaging.md +518 -509
  299. package/lib/assets/docs/article/getting-start-docker-kubernetes/09-container-operations.md +546 -537
  300. package/lib/assets/docs/article/getting-start-docker-kubernetes/10-optimal-container-image.md +640 -631
  301. package/lib/assets/docs/article/getting-start-docker-kubernetes/11-continuous-delivery.md +607 -598
  302. package/lib/assets/docs/article/getting-start-docker-kubernetes/12-container-use-cases.md +463 -454
  303. package/lib/assets/docs/article/getting-start-docker-kubernetes/13-case-monolith-compose-vs-kustomize.md +346 -337
  304. package/lib/assets/docs/article/getting-start-docker-kubernetes/14-case-event-driven-kustomize-vs-helm.md +324 -315
  305. package/lib/assets/docs/article/getting-start-docker-kubernetes/15-case-escqrs-axon-kustomize-vs-helm.md +297 -288
  306. package/lib/assets/docs/article/getting-start-docker-kubernetes/16-case-escqrs-kafka-kustomize-vs-helm.md +256 -247
  307. package/lib/assets/docs/article/getting-start-docker-kubernetes/17-case-comparison-summary.md +141 -132
  308. package/lib/assets/docs/article/getting-start-docker-kubernetes/18-case-load-testing.md +303 -294
  309. package/lib/assets/docs/article/getting-start-docker-kubernetes/appendix-a-dev-tools-setup.md +274 -265
  310. package/lib/assets/docs/article/getting-start-docker-kubernetes/appendix-b-orchestration-environments.md +530 -521
  311. package/lib/assets/docs/article/getting-start-docker-kubernetes/appendix-c-tips.md +519 -510
  312. package/lib/assets/docs/article/getting-start-docker-kubernetes/outline.md +220 -211
  313. package/lib/assets/docs/article/getting-start-tdd/clojure/01-todo-list-and-first-test.md +9 -0
  314. package/lib/assets/docs/article/getting-start-tdd/clojure/02-fake-it-and-triangulation.md +9 -0
  315. package/lib/assets/docs/article/getting-start-tdd/clojure/03-obvious-implementation-and-refactoring.md +9 -0
  316. package/lib/assets/docs/article/getting-start-tdd/clojure/04-version-control-and-conventional-commits.md +9 -0
  317. package/lib/assets/docs/article/getting-start-tdd/clojure/05-package-management-and-static-analysis.md +9 -0
  318. package/lib/assets/docs/article/getting-start-tdd/clojure/06-task-runner-and-ci-cd.md +9 -0
  319. package/lib/assets/docs/article/getting-start-tdd/clojure/07-protocols-and-records.md +9 -0
  320. package/lib/assets/docs/article/getting-start-tdd/clojure/08-multimethods-and-design-patterns.md +9 -0
  321. package/lib/assets/docs/article/getting-start-tdd/clojure/09-namespaces-and-module-design.md +9 -0
  322. package/lib/assets/docs/article/getting-start-tdd/clojure/10-higher-order-functions-and-composition.md +9 -0
  323. package/lib/assets/docs/article/getting-start-tdd/clojure/11-persistent-data-and-pipeline.md +9 -0
  324. package/lib/assets/docs/article/getting-start-tdd/clojure/12-error-handling-and-spec.md +9 -0
  325. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter01.md +9 -0
  326. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter02.md +9 -0
  327. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter03.md +9 -0
  328. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter04.md +9 -0
  329. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter05.md +9 -0
  330. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter06.md +9 -0
  331. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter07.md +9 -0
  332. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter08.md +9 -0
  333. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter09.md +9 -0
  334. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter10.md +9 -0
  335. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter11.md +9 -0
  336. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter12.md +9 -0
  337. package/lib/assets/docs/article/getting-start-tdd/elixir/01-todo-list-and-first-test.md +9 -0
  338. package/lib/assets/docs/article/getting-start-tdd/elixir/02-fake-it-and-triangulation.md +9 -0
  339. package/lib/assets/docs/article/getting-start-tdd/elixir/03-obvious-implementation-and-refactoring.md +9 -0
  340. package/lib/assets/docs/article/getting-start-tdd/elixir/04-version-control-and-conventional-commits.md +9 -0
  341. package/lib/assets/docs/article/getting-start-tdd/elixir/05-package-management-and-static-analysis.md +9 -0
  342. package/lib/assets/docs/article/getting-start-tdd/elixir/06-task-runner-and-ci-cd.md +9 -0
  343. package/lib/assets/docs/article/getting-start-tdd/elixir/07-structs-and-protocols.md +9 -0
  344. package/lib/assets/docs/article/getting-start-tdd/elixir/08-pattern-matching-and-guards.md +9 -0
  345. package/lib/assets/docs/article/getting-start-tdd/elixir/09-module-design-and-behaviours.md +9 -0
  346. package/lib/assets/docs/article/getting-start-tdd/elixir/10-higher-order-functions-and-pipeline.md +9 -0
  347. package/lib/assets/docs/article/getting-start-tdd/elixir/11-stream-and-lazy-evaluation.md +9 -0
  348. package/lib/assets/docs/article/getting-start-tdd/elixir/12-error-handling-and-with.md +9 -0
  349. package/lib/assets/docs/article/getting-start-tdd/elixir/index.md +2 -2
  350. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter01.md +9 -0
  351. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter02.md +9 -0
  352. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter03.md +9 -0
  353. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter04.md +9 -0
  354. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter05.md +9 -0
  355. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter06.md +9 -0
  356. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter07.md +9 -0
  357. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter08.md +9 -0
  358. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter09.md +9 -0
  359. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter10.md +9 -0
  360. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter11.md +9 -0
  361. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter12.md +9 -0
  362. package/lib/assets/docs/article/getting-start-tdd/go/01-todo-list-and-first-test.md +9 -0
  363. package/lib/assets/docs/article/getting-start-tdd/go/02-fake-it-and-triangulation.md +9 -0
  364. package/lib/assets/docs/article/getting-start-tdd/go/03-obvious-implementation-and-refactoring.md +9 -0
  365. package/lib/assets/docs/article/getting-start-tdd/go/04-version-control-and-conventional-commits.md +9 -0
  366. package/lib/assets/docs/article/getting-start-tdd/go/05-package-management-and-static-analysis.md +9 -0
  367. package/lib/assets/docs/article/getting-start-tdd/go/06-task-runner-and-ci-cd.md +9 -0
  368. package/lib/assets/docs/article/getting-start-tdd/go/07-encapsulation-and-polymorphism.md +8 -0
  369. package/lib/assets/docs/article/getting-start-tdd/go/08-design-patterns.md +8 -0
  370. package/lib/assets/docs/article/getting-start-tdd/go/09-solid-principles-and-module-design.md +8 -0
  371. package/lib/assets/docs/article/getting-start-tdd/go/10-higher-order-functions-and-composition.md +8 -0
  372. package/lib/assets/docs/article/getting-start-tdd/go/11-immutable-data-and-pipeline.md +8 -0
  373. package/lib/assets/docs/article/getting-start-tdd/go/12-error-handling-and-type-safety.md +8 -0
  374. package/lib/assets/docs/article/getting-start-tdd/haskell/01-todo-list-and-first-test.md +9 -0
  375. package/lib/assets/docs/article/getting-start-tdd/haskell/02-fake-it-and-triangulation.md +9 -0
  376. package/lib/assets/docs/article/getting-start-tdd/haskell/03-obvious-implementation-and-refactoring.md +9 -0
  377. package/lib/assets/docs/article/getting-start-tdd/haskell/04-version-control-and-conventional-commits.md +9 -0
  378. package/lib/assets/docs/article/getting-start-tdd/haskell/05-package-management-and-static-analysis.md +9 -0
  379. package/lib/assets/docs/article/getting-start-tdd/haskell/06-task-runner-and-ci-cd.md +9 -0
  380. package/lib/assets/docs/article/getting-start-tdd/haskell/07-algebraic-data-types-and-type-classes.md +9 -0
  381. package/lib/assets/docs/article/getting-start-tdd/haskell/08-pattern-matching-and-guards.md +9 -0
  382. package/lib/assets/docs/article/getting-start-tdd/haskell/09-module-design-and-smart-constructors.md +9 -0
  383. package/lib/assets/docs/article/getting-start-tdd/haskell/10-higher-order-functions-and-currying.md +9 -0
  384. package/lib/assets/docs/article/getting-start-tdd/haskell/11-function-composition-and-point-free.md +9 -0
  385. package/lib/assets/docs/article/getting-start-tdd/haskell/12-monad-and-error-handling.md +9 -0
  386. package/lib/assets/docs/article/getting-start-tdd/integration/01-language-overview.md +9 -0
  387. package/lib/assets/docs/article/getting-start-tdd/integration/02-test-framework-comparison.md +9 -0
  388. package/lib/assets/docs/article/getting-start-tdd/integration/03-tdd-pattern-comparison.md +9 -0
  389. package/lib/assets/docs/article/getting-start-tdd/integration/04-type-system-comparison.md +9 -0
  390. package/lib/assets/docs/article/getting-start-tdd/integration/05-dev-environment-comparison.md +9 -0
  391. package/lib/assets/docs/article/getting-start-tdd/integration/06-learning-roadmap.md +9 -0
  392. package/lib/assets/docs/article/getting-start-tdd/java/01-todo-list-and-first-test.md +9 -0
  393. package/lib/assets/docs/article/getting-start-tdd/java/02-fake-it-and-triangulation.md +9 -0
  394. package/lib/assets/docs/article/getting-start-tdd/java/03-obvious-implementation-and-refactoring.md +9 -0
  395. package/lib/assets/docs/article/getting-start-tdd/java/04-version-control-and-conventional-commits.md +9 -0
  396. package/lib/assets/docs/article/getting-start-tdd/java/05-package-management-and-static-analysis.md +9 -0
  397. package/lib/assets/docs/article/getting-start-tdd/java/06-task-runner-and-ci-cd.md +9 -0
  398. package/lib/assets/docs/article/getting-start-tdd/java/07-encapsulation-and-polymorphism.md +9 -0
  399. package/lib/assets/docs/article/getting-start-tdd/java/08-design-patterns.md +9 -0
  400. package/lib/assets/docs/article/getting-start-tdd/java/09-solid-principles-and-module-design.md +9 -0
  401. package/lib/assets/docs/article/getting-start-tdd/java/10-higher-order-functions-and-composition.md +9 -0
  402. package/lib/assets/docs/article/getting-start-tdd/java/11-immutable-data-and-pipeline.md +9 -0
  403. package/lib/assets/docs/article/getting-start-tdd/java/12-error-handling-and-type-safety.md +9 -0
  404. package/lib/assets/docs/article/getting-start-tdd/node/01-todo-list-and-first-test.md +9 -0
  405. package/lib/assets/docs/article/getting-start-tdd/node/02-fake-it-and-triangulation.md +9 -0
  406. package/lib/assets/docs/article/getting-start-tdd/node/03-obvious-implementation-and-refactoring.md +9 -0
  407. package/lib/assets/docs/article/getting-start-tdd/node/04-version-control-and-conventional-commits.md +9 -0
  408. package/lib/assets/docs/article/getting-start-tdd/node/05-package-management-and-static-analysis.md +9 -0
  409. package/lib/assets/docs/article/getting-start-tdd/node/06-task-runner-and-ci-cd.md +9 -0
  410. package/lib/assets/docs/article/getting-start-tdd/node/07-encapsulation-and-polymorphism.md +9 -0
  411. package/lib/assets/docs/article/getting-start-tdd/node/08-design-patterns.md +9 -0
  412. package/lib/assets/docs/article/getting-start-tdd/node/09-solid-principles-and-module-design.md +9 -0
  413. package/lib/assets/docs/article/getting-start-tdd/node/10-higher-order-functions-and-composition.md +9 -0
  414. package/lib/assets/docs/article/getting-start-tdd/node/11-immutable-data-and-pipeline.md +9 -0
  415. package/lib/assets/docs/article/getting-start-tdd/node/12-error-handling-and-type-safety.md +9 -0
  416. package/lib/assets/docs/article/getting-start-tdd/php/01-todo-list-and-first-test.md +9 -0
  417. package/lib/assets/docs/article/getting-start-tdd/php/02-fake-it-and-triangulation.md +9 -0
  418. package/lib/assets/docs/article/getting-start-tdd/php/03-obvious-implementation-and-refactoring.md +9 -0
  419. package/lib/assets/docs/article/getting-start-tdd/php/04-version-control-and-conventional-commits.md +9 -0
  420. package/lib/assets/docs/article/getting-start-tdd/php/05-package-management-and-static-analysis.md +9 -0
  421. package/lib/assets/docs/article/getting-start-tdd/php/06-task-runner-and-ci-cd.md +9 -0
  422. package/lib/assets/docs/article/getting-start-tdd/php/07-encapsulation-and-polymorphism.md +8 -0
  423. package/lib/assets/docs/article/getting-start-tdd/php/08-design-patterns.md +8 -0
  424. package/lib/assets/docs/article/getting-start-tdd/php/09-solid-principles-and-module-design.md +8 -0
  425. package/lib/assets/docs/article/getting-start-tdd/php/10-higher-order-functions-and-composition.md +8 -0
  426. package/lib/assets/docs/article/getting-start-tdd/php/11-immutable-data-and-pipeline.md +8 -0
  427. package/lib/assets/docs/article/getting-start-tdd/php/12-error-handling-and-type-safety.md +8 -0
  428. package/lib/assets/docs/article/getting-start-tdd/python/01-todo-list-and-first-test.md +9 -0
  429. package/lib/assets/docs/article/getting-start-tdd/python/02-fake-it-and-triangulation.md +9 -0
  430. package/lib/assets/docs/article/getting-start-tdd/python/03-obvious-implementation-and-refactoring.md +9 -0
  431. package/lib/assets/docs/article/getting-start-tdd/python/04-version-control-and-conventional-commits.md +9 -0
  432. package/lib/assets/docs/article/getting-start-tdd/python/05-package-management-and-static-analysis.md +9 -0
  433. package/lib/assets/docs/article/getting-start-tdd/python/06-task-runner-and-ci-cd.md +9 -0
  434. package/lib/assets/docs/article/getting-start-tdd/python/07-encapsulation-and-polymorphism.md +9 -0
  435. package/lib/assets/docs/article/getting-start-tdd/python/08-design-patterns.md +9 -0
  436. package/lib/assets/docs/article/getting-start-tdd/python/09-solid-principles-and-module-design.md +9 -0
  437. package/lib/assets/docs/article/getting-start-tdd/python/10-higher-order-functions-and-composition.md +9 -0
  438. package/lib/assets/docs/article/getting-start-tdd/python/11-immutable-data-and-pipeline.md +9 -0
  439. package/lib/assets/docs/article/getting-start-tdd/python/12-error-handling-and-type-safety.md +9 -0
  440. package/lib/assets/docs/article/getting-start-tdd/ruby/01-todo-list-and-first-test.md +9 -0
  441. package/lib/assets/docs/article/getting-start-tdd/ruby/02-fake-it-and-triangulation.md +9 -0
  442. package/lib/assets/docs/article/getting-start-tdd/ruby/03-obvious-implementation-and-refactoring.md +9 -0
  443. package/lib/assets/docs/article/getting-start-tdd/ruby/04-version-control-and-conventional-commits.md +9 -0
  444. package/lib/assets/docs/article/getting-start-tdd/ruby/05-package-management-and-static-analysis.md +9 -0
  445. package/lib/assets/docs/article/getting-start-tdd/ruby/06-task-runner-and-ci-cd.md +9 -0
  446. package/lib/assets/docs/article/getting-start-tdd/ruby/07-encapsulation-and-polymorphism.md +9 -0
  447. package/lib/assets/docs/article/getting-start-tdd/ruby/08-design-patterns.md +9 -0
  448. package/lib/assets/docs/article/getting-start-tdd/ruby/09-solid-principles-and-module-design.md +9 -0
  449. package/lib/assets/docs/article/getting-start-tdd/ruby/10-higher-order-functions-and-composition.md +9 -0
  450. package/lib/assets/docs/article/getting-start-tdd/ruby/11-immutable-data-and-pipeline.md +9 -0
  451. package/lib/assets/docs/article/getting-start-tdd/ruby/12-error-handling-and-type-safety.md +9 -0
  452. package/lib/assets/docs/article/getting-start-tdd/rust/01-todo-list-and-first-test.md +9 -0
  453. package/lib/assets/docs/article/getting-start-tdd/rust/02-fake-it-and-triangulation.md +9 -0
  454. package/lib/assets/docs/article/getting-start-tdd/rust/03-obvious-implementation-and-refactoring.md +9 -0
  455. package/lib/assets/docs/article/getting-start-tdd/rust/04-version-control-and-conventional-commits.md +9 -0
  456. package/lib/assets/docs/article/getting-start-tdd/rust/05-package-management-and-static-analysis.md +9 -0
  457. package/lib/assets/docs/article/getting-start-tdd/rust/06-task-runner-and-ci-cd.md +9 -0
  458. package/lib/assets/docs/article/getting-start-tdd/rust/07-encapsulation-and-polymorphism.md +9 -0
  459. package/lib/assets/docs/article/getting-start-tdd/rust/08-design-patterns.md +9 -0
  460. package/lib/assets/docs/article/getting-start-tdd/rust/09-solid-principles-and-module-design.md +9 -0
  461. package/lib/assets/docs/article/getting-start-tdd/rust/10-higher-order-functions-and-composition.md +9 -0
  462. package/lib/assets/docs/article/getting-start-tdd/rust/11-immutable-data-and-pipeline.md +9 -0
  463. package/lib/assets/docs/article/getting-start-tdd/rust/12-error-handling-and-type-safety.md +9 -0
  464. package/lib/assets/docs/article/getting-start-tdd/scala/01-todo-list-and-first-test.md +9 -0
  465. package/lib/assets/docs/article/getting-start-tdd/scala/02-fake-it-and-triangulation.md +9 -0
  466. package/lib/assets/docs/article/getting-start-tdd/scala/03-obvious-implementation-and-refactoring.md +9 -0
  467. package/lib/assets/docs/article/getting-start-tdd/scala/04-version-control-and-conventional-commits.md +9 -0
  468. package/lib/assets/docs/article/getting-start-tdd/scala/05-package-management-and-static-analysis.md +9 -0
  469. package/lib/assets/docs/article/getting-start-tdd/scala/06-task-runner-and-ci-cd.md +9 -0
  470. package/lib/assets/docs/article/getting-start-tdd/scala/07-case-classes-and-traits.md +9 -0
  471. package/lib/assets/docs/article/getting-start-tdd/scala/08-pattern-matching-and-sealed-traits.md +9 -0
  472. package/lib/assets/docs/article/getting-start-tdd/scala/09-packages-and-module-design.md +9 -0
  473. package/lib/assets/docs/article/getting-start-tdd/scala/10-higher-order-functions-and-composition.md +9 -0
  474. package/lib/assets/docs/article/getting-start-tdd/scala/11-collections-and-lazy-evaluation.md +9 -0
  475. package/lib/assets/docs/article/getting-start-tdd/scala/12-error-handling-and-type-safety.md +9 -0
  476. package/lib/assets/docs/article/grokking-concurrency/all/index.md +0 -1
  477. package/lib/assets/docs/article/grokking-concurrency/all/part-1-ch02-sequential.md +9 -0
  478. package/lib/assets/docs/article/grokking-concurrency/all/part-2-ch04-05-threads.md +9 -0
  479. package/lib/assets/docs/article/grokking-concurrency/all/part-3-ch06-multitasking.md +9 -0
  480. package/lib/assets/docs/article/grokking-concurrency/all/part-4-ch07-parallel-patterns.md +9 -0
  481. package/lib/assets/docs/article/grokking-concurrency/all/part-5-ch08-09-synchronization.md +9 -0
  482. package/lib/assets/docs/article/grokking-concurrency/all/part-6-ch10-11-nonblocking-io.md +9 -0
  483. package/lib/assets/docs/article/grokking-concurrency/all/part-7-ch12-async.md +9 -0
  484. package/lib/assets/docs/article/grokking-concurrency/all/part-8-ch13-mapreduce.md +9 -0
  485. package/lib/assets/docs/article/grokking-concurrency/clojure/index.md +0 -10
  486. package/lib/assets/docs/article/grokking-concurrency/clojure/part-1.md +6 -7
  487. package/lib/assets/docs/article/grokking-concurrency/clojure/part-2.md +6 -7
  488. package/lib/assets/docs/article/grokking-concurrency/clojure/part-3.md +6 -7
  489. package/lib/assets/docs/article/grokking-concurrency/clojure/part-4.md +6 -7
  490. package/lib/assets/docs/article/grokking-concurrency/clojure/part-5.md +6 -7
  491. package/lib/assets/docs/article/grokking-concurrency/clojure/part-6.md +6 -7
  492. package/lib/assets/docs/article/grokking-concurrency/clojure/part-7.md +6 -7
  493. package/lib/assets/docs/article/grokking-concurrency/clojure/part-8.md +6 -7
  494. package/lib/assets/docs/article/grokking-concurrency/csharp/index.md +0 -10
  495. package/lib/assets/docs/article/grokking-concurrency/csharp/part-1.md +6 -7
  496. package/lib/assets/docs/article/grokking-concurrency/csharp/part-2.md +6 -7
  497. package/lib/assets/docs/article/grokking-concurrency/csharp/part-3.md +6 -7
  498. package/lib/assets/docs/article/grokking-concurrency/csharp/part-4.md +6 -7
  499. package/lib/assets/docs/article/grokking-concurrency/csharp/part-5.md +6 -7
  500. package/lib/assets/docs/article/grokking-concurrency/csharp/part-6.md +6 -7
  501. package/lib/assets/docs/article/grokking-concurrency/csharp/part-7.md +6 -7
  502. package/lib/assets/docs/article/grokking-concurrency/csharp/part-8.md +6 -7
  503. package/lib/assets/docs/article/grokking-concurrency/fsharp/index.md +0 -10
  504. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-1.md +6 -7
  505. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-2.md +6 -7
  506. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-3.md +6 -7
  507. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-4.md +6 -7
  508. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-5.md +6 -7
  509. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-6.md +6 -7
  510. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-7.md +6 -7
  511. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-8.md +6 -7
  512. package/lib/assets/docs/article/grokking-concurrency/haskell/index.md +0 -10
  513. package/lib/assets/docs/article/grokking-concurrency/haskell/part-1.md +6 -7
  514. package/lib/assets/docs/article/grokking-concurrency/haskell/part-2.md +6 -7
  515. package/lib/assets/docs/article/grokking-concurrency/haskell/part-3.md +6 -7
  516. package/lib/assets/docs/article/grokking-concurrency/haskell/part-4.md +6 -7
  517. package/lib/assets/docs/article/grokking-concurrency/haskell/part-5.md +6 -7
  518. package/lib/assets/docs/article/grokking-concurrency/haskell/part-6.md +6 -7
  519. package/lib/assets/docs/article/grokking-concurrency/haskell/part-7.md +6 -7
  520. package/lib/assets/docs/article/grokking-concurrency/haskell/part-8.md +6 -7
  521. package/lib/assets/docs/article/grokking-concurrency/java/index.md +0 -10
  522. package/lib/assets/docs/article/grokking-concurrency/java/part-1.md +8 -9
  523. package/lib/assets/docs/article/grokking-concurrency/java/part-2.md +8 -9
  524. package/lib/assets/docs/article/grokking-concurrency/java/part-3.md +7 -8
  525. package/lib/assets/docs/article/grokking-concurrency/java/part-4.md +8 -9
  526. package/lib/assets/docs/article/grokking-concurrency/java/part-5.md +7 -8
  527. package/lib/assets/docs/article/grokking-concurrency/java/part-6.md +6 -7
  528. package/lib/assets/docs/article/grokking-concurrency/java/part-7.md +6 -7
  529. package/lib/assets/docs/article/grokking-concurrency/java/part-8.md +6 -7
  530. package/lib/assets/docs/article/grokking-concurrency/python/index.md +0 -10
  531. package/lib/assets/docs/article/grokking-concurrency/python/part-1.md +7 -8
  532. package/lib/assets/docs/article/grokking-concurrency/python/part-2.md +10 -11
  533. package/lib/assets/docs/article/grokking-concurrency/python/part-3.md +8 -9
  534. package/lib/assets/docs/article/grokking-concurrency/python/part-4.md +8 -9
  535. package/lib/assets/docs/article/grokking-concurrency/python/part-5.md +9 -10
  536. package/lib/assets/docs/article/grokking-concurrency/python/part-6.md +9 -10
  537. package/lib/assets/docs/article/grokking-concurrency/python/part-7.md +9 -10
  538. package/lib/assets/docs/article/grokking-concurrency/python/part-8.md +8 -9
  539. package/lib/assets/docs/article/grokking-concurrency/rust/index.md +0 -10
  540. package/lib/assets/docs/article/grokking-concurrency/rust/part-1.md +6 -7
  541. package/lib/assets/docs/article/grokking-concurrency/rust/part-2.md +6 -7
  542. package/lib/assets/docs/article/grokking-concurrency/rust/part-3.md +6 -7
  543. package/lib/assets/docs/article/grokking-concurrency/rust/part-4.md +6 -7
  544. package/lib/assets/docs/article/grokking-concurrency/rust/part-5.md +6 -7
  545. package/lib/assets/docs/article/grokking-concurrency/rust/part-6.md +6 -7
  546. package/lib/assets/docs/article/grokking-concurrency/rust/part-7.md +6 -7
  547. package/lib/assets/docs/article/grokking-concurrency/rust/part-8.md +6 -7
  548. package/lib/assets/docs/article/grokking-concurrency/scala/index.md +0 -10
  549. package/lib/assets/docs/article/grokking-concurrency/scala/part-1.md +6 -7
  550. package/lib/assets/docs/article/grokking-concurrency/scala/part-2.md +6 -7
  551. package/lib/assets/docs/article/grokking-concurrency/scala/part-3.md +6 -7
  552. package/lib/assets/docs/article/grokking-concurrency/scala/part-4.md +6 -7
  553. package/lib/assets/docs/article/grokking-concurrency/scala/part-5.md +6 -7
  554. package/lib/assets/docs/article/grokking-concurrency/scala/part-6.md +6 -7
  555. package/lib/assets/docs/article/grokking-concurrency/scala/part-7.md +6 -7
  556. package/lib/assets/docs/article/grokking-concurrency/scala/part-8.md +6 -7
  557. package/lib/assets/docs/article/grokkingfp/all/part-1-ch01-fp-introduction.md +9 -0
  558. package/lib/assets/docs/article/grokkingfp/all/part-1-ch02-pure-functions.md +9 -0
  559. package/lib/assets/docs/article/grokkingfp/all/part-2-ch03-immutable-data.md +9 -0
  560. package/lib/assets/docs/article/grokkingfp/all/part-2-ch04-higher-order-functions.md +9 -0
  561. package/lib/assets/docs/article/grokkingfp/all/part-2-ch05-flatmap.md +9 -0
  562. package/lib/assets/docs/article/grokkingfp/all/part-3-ch06-option.md +9 -0
  563. package/lib/assets/docs/article/grokkingfp/all/part-3-ch07-either-adt.md +9 -0
  564. package/lib/assets/docs/article/grokkingfp/all/part-4-ch08-io-monad.md +9 -0
  565. package/lib/assets/docs/article/grokkingfp/all/part-4-ch09-streams.md +9 -0
  566. package/lib/assets/docs/article/grokkingfp/all/part-5-ch10-concurrency.md +9 -0
  567. package/lib/assets/docs/article/grokkingfp/all/part-6-ch11-application.md +9 -0
  568. package/lib/assets/docs/article/grokkingfp/all/part-6-ch12-testing.md +9 -0
  569. package/lib/assets/docs/article/grokkingfp/all/writing-plan.md +9 -0
  570. package/lib/assets/docs/article/grokkingfp/clojure/part-1.md +9 -0
  571. package/lib/assets/docs/article/grokkingfp/clojure/part-2.md +9 -0
  572. package/lib/assets/docs/article/grokkingfp/clojure/part-3.md +9 -0
  573. package/lib/assets/docs/article/grokkingfp/clojure/part-4.md +9 -0
  574. package/lib/assets/docs/article/grokkingfp/clojure/part-5.md +9 -0
  575. package/lib/assets/docs/article/grokkingfp/clojure/part-6.md +9 -0
  576. package/lib/assets/docs/article/grokkingfp/csharp/part-1.md +9 -0
  577. package/lib/assets/docs/article/grokkingfp/csharp/part-2.md +9 -0
  578. package/lib/assets/docs/article/grokkingfp/csharp/part-3.md +9 -0
  579. package/lib/assets/docs/article/grokkingfp/csharp/part-4.md +9 -0
  580. package/lib/assets/docs/article/grokkingfp/csharp/part-5.md +9 -0
  581. package/lib/assets/docs/article/grokkingfp/csharp/part-6.md +9 -0
  582. package/lib/assets/docs/article/grokkingfp/elixir/part-1.md +9 -0
  583. package/lib/assets/docs/article/grokkingfp/elixir/part-2.md +9 -0
  584. package/lib/assets/docs/article/grokkingfp/elixir/part-3.md +9 -0
  585. package/lib/assets/docs/article/grokkingfp/elixir/part-4.md +9 -0
  586. package/lib/assets/docs/article/grokkingfp/elixir/part-5.md +9 -0
  587. package/lib/assets/docs/article/grokkingfp/elixir/part-6.md +9 -0
  588. package/lib/assets/docs/article/grokkingfp/fsharp/part-1.md +9 -0
  589. package/lib/assets/docs/article/grokkingfp/fsharp/part-2.md +9 -0
  590. package/lib/assets/docs/article/grokkingfp/fsharp/part-3.md +9 -0
  591. package/lib/assets/docs/article/grokkingfp/fsharp/part-4.md +9 -0
  592. package/lib/assets/docs/article/grokkingfp/fsharp/part-5.md +9 -0
  593. package/lib/assets/docs/article/grokkingfp/fsharp/part-6.md +9 -0
  594. package/lib/assets/docs/article/grokkingfp/haskell/part-1.md +9 -0
  595. package/lib/assets/docs/article/grokkingfp/haskell/part-2.md +9 -0
  596. package/lib/assets/docs/article/grokkingfp/haskell/part-3.md +9 -0
  597. package/lib/assets/docs/article/grokkingfp/haskell/part-4.md +9 -0
  598. package/lib/assets/docs/article/grokkingfp/haskell/part-5.md +9 -0
  599. package/lib/assets/docs/article/grokkingfp/haskell/part-6.md +9 -0
  600. package/lib/assets/docs/article/grokkingfp/java/part-1.md +9 -0
  601. package/lib/assets/docs/article/grokkingfp/java/part-2.md +9 -0
  602. package/lib/assets/docs/article/grokkingfp/java/part-3.md +9 -0
  603. package/lib/assets/docs/article/grokkingfp/java/part-4.md +9 -0
  604. package/lib/assets/docs/article/grokkingfp/java/part-5.md +9 -0
  605. package/lib/assets/docs/article/grokkingfp/java/part-6.md +9 -0
  606. package/lib/assets/docs/article/grokkingfp/python/part-1.md +9 -0
  607. package/lib/assets/docs/article/grokkingfp/python/part-2.md +9 -0
  608. package/lib/assets/docs/article/grokkingfp/python/part-3.md +9 -0
  609. package/lib/assets/docs/article/grokkingfp/python/part-4.md +9 -0
  610. package/lib/assets/docs/article/grokkingfp/python/part-5.md +9 -0
  611. package/lib/assets/docs/article/grokkingfp/python/part-6.md +9 -0
  612. package/lib/assets/docs/article/grokkingfp/ruby/part-1.md +9 -0
  613. package/lib/assets/docs/article/grokkingfp/ruby/part-2.md +9 -0
  614. package/lib/assets/docs/article/grokkingfp/ruby/part-3.md +9 -0
  615. package/lib/assets/docs/article/grokkingfp/ruby/part-4.md +9 -0
  616. package/lib/assets/docs/article/grokkingfp/ruby/part-5.md +9 -0
  617. package/lib/assets/docs/article/grokkingfp/ruby/part-6.md +9 -0
  618. package/lib/assets/docs/article/grokkingfp/rust/part-1.md +9 -0
  619. package/lib/assets/docs/article/grokkingfp/rust/part-2.md +9 -0
  620. package/lib/assets/docs/article/grokkingfp/rust/part-3.md +9 -0
  621. package/lib/assets/docs/article/grokkingfp/rust/part-4.md +9 -0
  622. package/lib/assets/docs/article/grokkingfp/rust/part-5.md +9 -0
  623. package/lib/assets/docs/article/grokkingfp/rust/part-6.md +9 -0
  624. package/lib/assets/docs/article/grokkingfp/scala/part-1.md +9 -0
  625. package/lib/assets/docs/article/grokkingfp/scala/part-2.md +9 -0
  626. package/lib/assets/docs/article/grokkingfp/scala/part-3.md +9 -0
  627. package/lib/assets/docs/article/grokkingfp/scala/part-4.md +9 -0
  628. package/lib/assets/docs/article/grokkingfp/scala/part-5.md +9 -0
  629. package/lib/assets/docs/article/grokkingfp/scala/part-6.md +9 -0
  630. package/lib/assets/docs/article/grokkingfp/typescript/part-1.md +9 -0
  631. package/lib/assets/docs/article/grokkingfp/typescript/part-2.md +9 -0
  632. package/lib/assets/docs/article/grokkingfp/typescript/part-3.md +9 -0
  633. package/lib/assets/docs/article/grokkingfp/typescript/part-4.md +9 -0
  634. package/lib/assets/docs/article/grokkingfp/typescript/part-5.md +9 -0
  635. package/lib/assets/docs/article/grokkingfp/typescript/part-6.md +9 -0
  636. package/lib/assets/docs/article/practical-database-design/part1/chapter01.md +9 -0
  637. package/lib/assets/docs/article/practical-database-design/part1/chapter02.md +9 -0
  638. package/lib/assets/docs/article/practical-database-design/part1/chapter03.md +9 -0
  639. package/lib/assets/docs/article/practical-database-design/part2/chapter04.md +9 -0
  640. package/lib/assets/docs/article/practical-database-design/part2/chapter05.md +9 -0
  641. package/lib/assets/docs/article/practical-database-design/part2/chapter06.md +9 -0
  642. package/lib/assets/docs/article/practical-database-design/part2/chapter07.md +9 -0
  643. package/lib/assets/docs/article/practical-database-design/part2/chapter08.md +9 -0
  644. package/lib/assets/docs/article/practical-database-design/part2/chapter09.md +9 -0
  645. package/lib/assets/docs/article/practical-database-design/part2/chapter10.md +9 -0
  646. package/lib/assets/docs/article/practical-database-design/part2/chapter11.md +9 -0
  647. package/lib/assets/docs/article/practical-database-design/part2/chapter12.md +9 -0
  648. package/lib/assets/docs/article/practical-database-design/part2/chapter13.md +9 -0
  649. package/lib/assets/docs/article/practical-database-design/part3/chapter14.md +9 -0
  650. package/lib/assets/docs/article/practical-database-design/part3/chapter15.md +9 -0
  651. package/lib/assets/docs/article/practical-database-design/part3/chapter16.md +9 -0
  652. package/lib/assets/docs/article/practical-database-design/part3/chapter17.md +9 -0
  653. package/lib/assets/docs/article/practical-database-design/part3/chapter18.md +9 -0
  654. package/lib/assets/docs/article/practical-database-design/part3/chapter19.md +9 -0
  655. package/lib/assets/docs/article/practical-database-design/part3/chapter20.md +9 -0
  656. package/lib/assets/docs/article/practical-database-design/part3/chapter21.md +9 -0
  657. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter14-orm.md +9 -0
  658. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter15-orm.md +9 -0
  659. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter16-orm.md +9 -0
  660. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter17-orm.md +9 -0
  661. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter18-orm.md +9 -0
  662. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter19-orm.md +9 -0
  663. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter20-orm.md +9 -0
  664. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter21-orm.md +9 -0
  665. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter22-orm.md +9 -0
  666. package/lib/assets/docs/article/practical-database-design/part4/chapter22.md +9 -0
  667. package/lib/assets/docs/article/practical-database-design/part4/chapter23.md +9 -0
  668. package/lib/assets/docs/article/practical-database-design/part4/chapter24.md +9 -0
  669. package/lib/assets/docs/article/practical-database-design/part4/chapter25.md +9 -0
  670. package/lib/assets/docs/article/practical-database-design/part4/chapter26.md +9 -0
  671. package/lib/assets/docs/article/practical-database-design/part4/chapter27.md +9 -0
  672. package/lib/assets/docs/article/practical-database-design/part4/chapter28.md +9 -0
  673. package/lib/assets/docs/article/practical-database-design/part4/chapter29.md +8 -0
  674. package/lib/assets/docs/article/practical-database-design/part4/chapter30.md +8 -0
  675. package/lib/assets/docs/article/practical-database-design/part4/chapter31.md +8 -0
  676. package/lib/assets/docs/article/practical-database-design/part4/chapter32.md +8 -0
  677. package/lib/assets/docs/article/practical-database-design/part5/chapter33.md +9 -0
  678. package/lib/assets/docs/article/practical-database-design/part5/chapter34.md +9 -0
  679. package/lib/assets/docs/article/practical-database-design/part5/chapter35.md +9 -0
  680. package/lib/assets/docs/article/practical-database-design/part5/chapter36.md +9 -0
  681. package/lib/assets/docs/article/practical-database-design/part5/chapter37.md +9 -0
  682. package/lib/assets/docs/article/practical-database-design/part5/chapter38.md +9 -0
  683. package/lib/assets/docs/article/practical-database-design/part5/chapter39.md +9 -0
  684. package/lib/assets/docs/article/practical-database-design/study/study2-1.md +9 -0
  685. package/lib/assets/docs/article/practical-database-design/study/study2-2.md +9 -0
  686. package/lib/assets/docs/article/practical-database-design/study/study2-3.md +9 -0
  687. package/lib/assets/docs/article/practical-database-design/study/study2-4.md +9 -0
  688. package/lib/assets/docs/article/practical-database-design/study/study2-5.md +9 -0
  689. package/lib/assets/docs/article/practical-database-design/study/study3-1.md +9 -0
  690. package/lib/assets/docs/article/practical-database-design/study/study3-2.md +9 -0
  691. package/lib/assets/docs/article/practical-database-design/study/study3-3.md +9 -0
  692. package/lib/assets/docs/article/practical-database-design/study/study3-4.md +9 -0
  693. package/lib/assets/docs/article/practical-database-design/study/study3-5.md +9 -0
  694. package/lib/assets/docs/article/practical-database-design/study/study4-1.md +9 -0
  695. package/lib/assets/docs/article/practical-database-design/study/study4-2.md +9 -0
  696. package/lib/assets/docs/article/practical-database-design/study/study4-3.md +9 -0
  697. package/lib/assets/docs/article/practical-database-design/study/study4-4.md +9 -0
  698. package/lib/assets/docs/article/practical-database-design/study/study4-5.md +9 -0
  699. package/lib/assets/docs/index.md +4 -0
  700. package/lib/assets/docs/log.md +5 -0
  701. package/lib/assets/docs/operation/index.md +15 -1
  702. package/lib/assets/docs/reference/CodexCLIMCP/343/202/242/343/203/227/343/203/252/343/202/261/343/203/274/343/202/267/343/203/247/343/203/263/351/226/213/347/231/272/343/203/225/343/203/255/343/203/274.md +13 -4
  703. package/lib/assets/docs/reference/CodexCLIMCP/343/202/265/343/203/274/343/203/220/343/203/274/350/250/255/345/256/232/346/211/213/351/240/206.md +10 -0
  704. package/lib/assets/docs/reference/Java/343/202/242/343/203/227/343/203/252/343/202/261/343/203/274/343/202/267/343/203/247/343/203/263/347/222/260/345/242/203/346/247/213/347/257/211/343/202/254/343/202/244/343/203/211.md +11 -1
  705. package/lib/assets/docs/reference/OKF/345/260/216/345/205/245/343/202/254/343/202/244/343/203/211_V0.2.md +965 -0
  706. package/lib/assets/docs/reference/SonarQube/343/203/255/343/203/274/343/202/253/343/203/253/347/222/260/345/242/203/343/202/273/343/203/203/343/203/210/343/202/242/343/203/203/343/203/227/346/211/213/351/240/206/346/233/270.md +10 -0
  707. package/lib/assets/docs/reference/TypeScript/343/202/242/343/203/227/343/203/252/343/202/261/343/203/274/343/202/267/343/203/247/343/203/263/347/222/260/345/242/203/346/247/213/347/257/211/343/202/254/343/202/244/343/203/211.md +11 -1
  708. package/lib/assets/docs/reference/UI/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +10 -1
  709. package/lib/assets/docs/reference/Vim/346/223/215/344/275/234/343/203/236/343/203/213/343/203/245/343/202/242/343/203/253.md +177 -168
  710. package/lib/assets/docs/reference/index.md +54 -53
  711. package/lib/assets/docs/reference//343/202/210/343/201/204/343/202/275/343/203/225/343/203/210/343/202/246/343/202/247/343/202/242/343/201/250/343/201/257.md +7 -8
  712. package/lib/assets/docs/reference//343/202/242/343/203/274/343/202/255/343/203/206/343/202/257/343/203/201/343/203/243/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +10 -1
  713. package/lib/assets/docs/reference//343/202/244/343/203/263/343/203/225/343/203/251/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +10 -1
  714. package/lib/assets/docs/reference//343/202/250/343/202/257/343/202/271/343/203/210/343/203/252/343/203/274/343/203/240/343/203/227/343/203/255/343/202/260/343/203/251/343/203/237/343/203/263/343/202/260.md +6 -7
  715. package/lib/assets/docs/reference//343/202/263/343/203/274/343/203/207/343/202/243/343/203/263/343/202/260/343/201/250/343/203/206/343/202/271/343/203/210/343/202/254/343/202/244/343/203/211.md +10 -1
  716. package/lib/assets/docs/reference//343/203/206/343/202/271/343/203/210/346/210/246/347/225/245/343/202/254/343/202/244/343/203/211.md +10 -1
  717. package/lib/assets/docs/reference//343/203/207/343/203/274/343/202/277/343/203/242/343/203/207/343/203/253/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +10 -1
  718. package/lib/assets/docs/reference//343/203/211/343/203/241/343/202/244/343/203/263/343/203/242/343/203/207/343/203/253/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +10 -1
  719. package/lib/assets/docs/reference//343/203/223/343/202/270/343/203/215/343/202/271/343/202/242/343/203/274/343/202/255/343/203/206/343/202/257/343/203/201/343/203/243/345/210/206/346/236/220/343/202/254/343/202/244/343/203/211.md +9 -0
  720. package/lib/assets/docs/reference//343/203/246/343/203/274/343/202/271/343/202/261/343/203/274/343/202/271/344/275/234/346/210/220/343/202/254/343/202/244/343/203/211.md +10 -1
  721. package/lib/assets/docs/reference//343/203/252/343/203/252/343/203/274/343/202/271/343/202/254/343/202/244/343/203/211.md +9 -0
  722. package/lib/assets/docs/reference//343/203/252/343/203/252/343/203/274/343/202/271/343/203/273/343/202/244/343/203/206/343/203/254/343/203/274/343/202/267/343/203/247/343/203/263/350/250/210/347/224/273/343/202/254/343/202/244/343/203/211.md +7 -8
  723. package/lib/assets/docs/reference//343/203/255/343/202/270/343/202/253/343/203/253/343/202/267/343/203/263/343/202/255/343/203/263/343/202/260.md +9 -0
  724. package/lib/assets/docs/reference//344/274/201/346/245/255/347/265/214/345/226/266/350/253/226.md +10 -1
  725. package/lib/assets/docs/reference//347/222/260/345/242/203/345/244/211/346/225/260/347/256/241/347/220/206/343/202/254/343/202/244/343/203/211.md +10 -0
  726. package/lib/assets/docs/reference//347/265/214/345/226/266/346/210/246/347/225/245/345/210/206/346/236/220/343/202/254/343/202/244/343/203/211.md +9 -0
  727. package/lib/assets/docs/reference//350/246/201/344/273/266/345/256/232/347/276/251/343/202/254/343/202/244/343/203/211.md +10 -1
  728. package/lib/assets/docs/reference//350/250/200/350/252/236/345/210/245/351/226/213/347/231/272/343/202/254/343/202/244/343/203/211.md +9 -0
  729. package/lib/assets/docs/reference//351/201/213/345/226/266/347/256/241/347/220/206.md +10 -1
  730. package/lib/assets/docs/reference//351/201/213/347/224/250/343/202/271/343/202/257/343/203/252/343/203/227/343/203/210/344/275/234/346/210/220/343/202/254/343/202/244/343/203/211.md +9 -0
  731. package/lib/assets/docs/reference//351/201/213/347/224/250/350/246/201/344/273/266/345/256/232/347/276/251/343/202/254/343/202/244/343/203/211.md +10 -1
  732. package/lib/assets/docs/reference//351/226/213/347/231/272/343/202/254/343/202/244/343/203/211.md +9 -0
  733. package/lib/assets/docs/reference//351/235/236/346/251/237/350/203/275/350/246/201/344/273/266/345/256/232/347/276/251/343/202/254/343/202/244/343/203/211.md +10 -1
  734. package/lib/assets/docs/template/ADR.md +9 -0
  735. package/lib/assets/docs/template/AWS/343/202/271/343/203/206/343/203/274/343/202/270/343/203/263/343/202/260/347/222/260/345/242/203/343/202/273/343/203/203/343/203/210/343/202/242/343/203/203/343/203/227/346/211/213/351/240/206/346/233/270.md +9 -0
  736. package/lib/assets/docs/template/AWS/343/203/227/343/203/255/343/203/200/343/202/257/343/202/267/343/203/247/343/203/263/347/222/260/345/242/203/343/202/273/343/203/203/343/203/210/343/202/242/343/203/203/343/203/227/346/211/213/351/240/206/346/233/270.md +9 -0
  737. package/lib/assets/docs/template/README.md +9 -0
  738. package/lib/assets/docs/template//343/201/276/343/201/232/343/201/223/343/202/214/343/202/222/350/252/255/343/202/202/343/201/206/343/203/252/343/202/271/343/203/210.md +9 -0
  739. package/lib/assets/docs/template//343/202/242/343/203/227/343/203/252/343/202/261/343/203/274/343/202/267/343/203/247/343/203/263/351/226/213/347/231/272/347/222/260/345/242/203/343/202/273/343/203/203/343/203/210/343/202/242/343/203/203/343/203/227/346/211/213/351/240/206/346/233/270.md +9 -0
  740. package/lib/assets/docs/template//343/202/244/343/203/206/343/203/254/343/203/274/343/202/267/343/203/247/343/203/263/345/256/214/344/272/206/345/240/261/345/221/212/346/233/270.md +10 -1
  741. package/lib/assets/docs/template//343/202/244/343/203/206/343/203/254/343/203/274/343/202/267/343/203/247/343/203/263/350/250/210/347/224/273.md +11 -2
  742. package/lib/assets/docs/template//343/202/244/343/203/263/343/202/273/343/203/227/343/202/267/343/203/247/343/203/263/343/203/207/343/203/203/343/202/255.md +9 -0
  743. package/lib/assets/docs/template//343/203/223/343/202/270/343/203/215/343/202/271/343/202/242/343/203/274/343/202/255/343/203/206/343/202/257/343/203/201/343/203/243.md +9 -0
  744. package/lib/assets/docs/template//343/203/252/343/203/252/343/203/274/343/202/271/345/256/214/344/272/206/345/240/261/345/221/212/346/233/270.md +9 -0
  745. package/lib/assets/docs/template//343/203/252/343/203/252/343/203/274/343/202/271/350/250/210/347/224/273.md +289 -280
  746. package/lib/assets/docs/template//344/272/213/344/276/213/345/210/206/346/236/220.md +9 -0
  747. package/lib/assets/docs/template//344/274/201/346/245/255/345/210/206/346/236/220.md +9 -0
  748. package/lib/assets/docs/template//345/256/214/345/205/250/345/275/242/345/274/217/343/201/256/343/203/246/343/203/274/343/202/271/343/202/261/343/203/274/343/202/271.md +7 -8
  749. package/lib/assets/docs/template//350/246/201/344/273/266/345/256/232/347/276/251.md +7 -8
  750. package/lib/assets/docs/template//350/250/255/350/250/210.md +10 -1
  751. package/lib/assets/docs/template//351/226/213/347/231/272/347/222/260/345/242/203/343/202/273/343/203/203/343/203/210/343/202/242/343/203/203/343/203/227/346/211/213/351/240/206/346/233/270.md +9 -0
  752. package/lib/assets/gulpfile.js +4 -2
  753. package/lib/assets/ops/scripts/okf.js +272 -0
  754. package/lib/assets/package.json +2 -0
  755. package/package.json +1 -1
@@ -1,294 +1,303 @@
1
- # 第 18 章 ケーススタディの負荷テスト
2
-
3
- ## はじめに
4
-
5
- 第 12 章「12.3 負荷テスト」では、Python 製の負荷テストツール **Locust** をコンテナで動かす考え方を学びました。負荷生成ツール・シナリオ・テスト対象をすべてコンテナとして扱うことで、負荷テスト環境を「コードから一括で構築し、終わったら破棄する」ことができます。
6
-
7
- この章では、その考え方を第 13〜16 章の 4 ケース(同一ドメイン = Cargo Tracker の 4 アーキテクチャ)に適用します。各ケースに Locust の負荷テスト一式を用意し、**Docker Compose 版**と **Kubernetes 版**の 2 通りで実行できるようにしました。
8
-
9
- 実装はすべて各ケースの [`loadtest/`](https://github.com/k2works/getting-started-docker-kubernetes/tree/main/apps/case-studies) ディレクトリにあります。
10
-
11
- | ケース | アーキテクチャ | loadtest ディレクトリ |
12
- |--------|--------------|----------------------|
13
- | case-1 | モノリス | `apps/case-studies/case-1-monolith/loadtest/` |
14
- | case-2 | イベント駆動 MS | `apps/case-studies/case-2-event-driven/loadtest/` |
15
- | case-3 | ES/CQRS(Axon) | `apps/case-studies/case-3-escqrs-axon/loadtest/` |
16
- | case-4 | ES/CQRS(Kafka) | `apps/case-studies/case-4-escqrs-kafka/loadtest/` |
17
-
18
- ---
19
-
20
- ## 18.1 構成
21
-
22
- 各ケースの `loadtest/` には次のファイルが入っています。シナリオ(`locustfile.py`)は Compose 版・Kubernetes 版で共有します。
23
-
24
- | ファイル | 役割 |
25
- |---------|------|
26
- | `locustfile.py` | 負荷シナリオ(仮想ユーザーの振る舞い) |
27
- | `compose.loadtest.yaml` | Docker Compose 版 Locust の起動定義(Web UI: 8089) |
28
- | `kustomization.yaml` | Kubernetes 版 Locust の Kustomize 定義 |
29
- | `k8s-locust.yaml` | Kubernetes 版 Locust の Deployment / Service |
30
- | `README.md` | 実行手順・対象エンドポイント |
31
-
32
- ### 現行 Locust API を使う
33
-
34
- 第 12 章で引用したサンプル(`senario.py`)は、Locust 旧 API(`HttpLocust` / `TaskSet`)で書かれていました。これらは現行の Locust では廃止されているため、本章のシナリオは**現行 API(`HttpUser` / `@task` / `between`)**と公式イメージ `locustio/locust` で記述しています。
35
-
36
- ```python
37
- from locust import HttpUser, between, task
38
-
39
-
40
- class CargoTrackerUser(HttpUser):
41
- # 各タスクの実行間隔(記事の min_wait / max_wait に相当)
42
- wait_time = between(1, 3)
43
-
44
- @task(5)
45
- def bookings(self):
46
- self.client.get("/api/v1/bookings", name="/api/v1/bookings")
47
- ```
48
-
49
- 旧 API の `min_wait` / `max_wait`(ミリ秒)は、現行では `wait_time = between(min, max)`(秒)に置き換わっています。`HttpLocust` は `HttpUser`、`task_set` を持つ `TaskSet` は `HttpUser` に直接 `@task` を書く形になりました。
50
-
51
- ---
52
-
53
- ## 18.2 ケースごとの対象エンドポイントと認証
54
-
55
- 負荷テストで重要なのは「**副作用のない読み取り系(GET)に、認証を通して負荷をかける**」ことです。4 ケースは認証方式が異なるため、シナリオもそれに合わせています。
56
-
57
- | ケース | 公開ポート(Compose) | 認証方式 | シナリオの方針 |
58
- |--------|---------------------|---------|--------------|
59
- | case-1 | 18080(app) | セッション + フォームログイン | 認証不要の GET のみ(`/actuator/health`、`/login`、`/public/tracking`) |
60
- | case-2 | 9080(gateway) | JWT(gateway で強制) | ログインで JWT を取得し、Read 系 GET に付与 |
61
- | case-3 | 9081(gateway) | JWT(gateway で強制) | ログインで JWT を取得し、CQRS Query 側へ |
62
- | case-4 | 9082(gateway) | `local` では認可無効 | 匿名で Read Model を GET |
63
-
64
- ### case-1: 認証不要の GET(セッション認証のため)
65
-
66
- モノリス版は Spring Security のフォームログイン(セッション + CSRF)で保護されています。負荷テストでは、確実に匿名アクセスできる GET だけを対象にしています。
67
-
68
- | メソッド | パス | 説明 |
69
- |---------|------|------|
70
- | GET | `/actuator/health` | ヘルスチェック |
71
- | GET | `/login` | ログイン画面(HTML) |
72
- | GET | `/public/tracking` | 公開追跡の検索画面 |
73
-
74
- ### case-2 / case-3: JWT ログインしてから GET
75
-
76
- 両ケースとも gatewayms が JWT 認証を強制します。Locust の `on_start`(仮想ユーザー開始時に 1 回呼ばれる)でログインしてトークンを取得し、以降の GET に `Authorization: Bearer <token>` を付けます。
77
-
78
- ```python
79
- def on_start(self):
80
- """ログインして JWT を取得する。失敗時はトークンなしで続行する。"""
81
- self.token = None
82
- with self.client.post(
83
- "/api/v1/auth/login",
84
- json={"username": USERNAME, "password": PASSWORD},
85
- name="/api/v1/auth/login",
86
- catch_response=True,
87
- ) as res:
88
- if res.status_code == 200:
89
- data = res.json() if res.text else {}
90
- self.token = data.get("token") or data.get("accessToken")
91
- if self.token:
92
- res.success()
93
- else:
94
- res.failure("token がレスポンスに含まれていません")
95
- else:
96
- res.failure(f"ログイン失敗: HTTP {res.status_code}")
97
- ```
98
-
99
- 既定ユーザーはシード済みの `admin` / `password` です。case-3 は CQRS の Query 側(`/api/v1/bookings`、`/api/v1/voyages`、`/api/v1/billing/invoices` など)の Read Model 読み取りに負荷をかけます。
100
-
101
- ### case-4: 認証なしで Read Model を GET
102
-
103
- case-4 は `local`(`local-docker`)プロファイルで起動するため、gateway / 各サービスの Spring Security 認可が無効になります。そのためログイン処理なしで、ページング付きの一覧 API に直接負荷をかけられます。
104
-
105
- ```python
106
- @task(5)
107
- def bookings(self):
108
- """予約一覧(Read Model、ページング)。"""
109
- self.client.get("/api/v1/bookings?page=0&size=20", name="/api/v1/bookings")
110
- ```
111
-
112
- `name=` を明示しているのは、`?page=0&size=20` のようなクエリ違いを Locust の統計上で同じエンドポイントとして集計するためです。
113
-
114
- ---
115
-
116
- ## 18.3 Docker Compose 版
117
-
118
- Compose 版は、第 12 章のサンプルと同様に「負荷生成側(Locust)を独立した Compose として用意する」方式です。ただし本ケーススタディは `dev:<case>` でアプリ本体を起動し、gateway/app を**ホストポートに公開**します。そこで Locust 側は、`host.docker.internal` 経由でそのホスト公開ポートへ負荷をかけます(どの Compose ネットワークからでも到達できます)。
119
-
120
- 出典: `apps/case-studies/case-4-escqrs-kafka/loadtest/compose.loadtest.yaml`
121
-
122
- ```yaml
123
- name: loadtest-case4
124
-
125
- services:
126
- locust:
127
- image: locustio/locust:2.32.5
128
- ports:
129
- - "8089:8089"
130
- volumes:
131
- - ./locustfile.py:/mnt/locust/locustfile.py:ro
132
- environment:
133
- LOCUST_LOCUSTFILE: /mnt/locust/locustfile.py
134
- # 負荷対象。ホストに公開された 9082 番(gatewayms: 9082:8080)へ向ける。
135
- LOCUST_HOST: ${TARGET_URL:-http://host.docker.internal:9082}
136
- extra_hosts:
137
- - "host.docker.internal:host-gateway"
138
- ```
139
-
140
- ポイントは次のとおりです。
141
-
142
- - `image` に公式イメージ `locustio/locust` を使い、`volumes` でシナリオファイルをマウントします。イメージを再ビルドせずにシナリオを差し替えられます。
143
- - `LOCUST_LOCUSTFILE` / `LOCUST_HOST` は、Locust の CLI オプション(`-f` / `--host`)に対応する環境変数です。
144
- - `extra_hosts` で `host.docker.internal` を `host-gateway` に解決し、Linux でもホスト公開ポートへ到達できるようにしています。
145
-
146
- ### 実行手順(Compose 版)
147
-
148
- ```bash
149
- # 1. アプリ本体を起動(gateway をホスト 9082 に公開)
150
- npx gulp dev:case4
151
-
152
- # 2. Locust を起動(Web UI: http://localhost:8089)
153
- npx gulp loadtest:case4
154
-
155
- # 3. ブラウザで同時ユーザー数・増加レートを指定してテスト開始
156
-
157
- # 4. 終了
158
- npx gulp loadtest:case4:down
159
- ```
160
-
161
- CI 向けに、UI なしで一定時間だけ実行して終了するヘッドレス実行も用意しています。
162
-
163
- ```bash
164
- # 既定: 50 ユーザー / 毎秒 5 ユーザー増 / 1 分間
165
- npx gulp loadtest:case4:headless
166
-
167
- # パラメータを環境変数で上書き
168
- USERS=100 SPAWN=10 DURATION=3m npx gulp loadtest:case4:headless
169
- ```
170
-
171
- ---
172
-
173
- ## 18.4 Kubernetes 版
174
-
175
- Kubernetes 版は、第 12 章の「負荷生成側とテスト対象を同一オーケストレータに載せる」考え方をそのまま適用します。**アプリと同じ名前空間に Locust をデプロイ**し、クラスタ内のサービス(`gatewayms` など)へ DNS 名で直接負荷をかけます。`host.docker.internal` やポートフォワードを介さず、より本番に近い経路で計測できます。
176
-
177
- シナリオ(`locustfile.py`)は Kustomize の `configMapGenerator` で ConfigMap として配布し、Compose 版と同じファイルを共有します。
178
-
179
- 出典: `apps/case-studies/case-4-escqrs-kafka/loadtest/kustomization.yaml`
180
-
181
- ```yaml
182
- apiVersion: kustomize.config.k8s.io/v1beta1
183
- kind: Kustomization
184
-
185
- namespace: cargo-tracker
186
-
187
- configMapGenerator:
188
- - name: locust-scenario
189
- files:
190
- - locustfile.py
191
-
192
- resources:
193
- - k8s-locust.yaml
194
- ```
195
-
196
- 出典: `apps/case-studies/case-4-escqrs-kafka/loadtest/k8s-locust.yaml`(抜粋)
197
-
198
- ```yaml
199
- apiVersion: apps/v1
200
- kind: Deployment
201
- metadata:
202
- name: locust
203
- spec:
204
- replicas: 1
205
- selector:
206
- matchLabels:
207
- app: locust
208
- template:
209
- metadata:
210
- labels:
211
- app: locust
212
- spec:
213
- containers:
214
- - name: locust
215
- image: locustio/locust:2.32.5
216
- args:
217
- - "-f"
218
- - "/mnt/locust/locustfile.py"
219
- - "--host"
220
- - "http://gatewayms:8080" # クラスタ内サービスへ直接
221
- ports:
222
- - name: web
223
- containerPort: 8089
224
- volumeMounts:
225
- - name: scenario
226
- mountPath: /mnt/locust
227
- volumes:
228
- - name: scenario
229
- configMap:
230
- name: locust-scenario
231
- ```
232
-
233
- ポイントは次のとおりです。
234
-
235
- - `namespace` をアプリと同じにすることで、`--host http://gatewayms:8080` のように**サービス名だけ**で負荷対象を指定できます(同一名前空間内の DNS 解決)。
236
- - `configMapGenerator` は ConfigMap 名にハッシュ(`locust-scenario-xxxx`)を付けます。Volume の `configMap.name` への参照は Kustomize が自動で書き換えるため、シナリオを変更すると新しいハッシュになり、Pod が確実に最新シナリオで再起動します。
237
- - 負荷対象は、case-1 は `cargo-tracker:80`、case-2〜4 は `gatewayms:8080` です(各サービスのクラスタ内ポート)。
238
-
239
- ### 実行手順(Kubernetes 版)
240
-
241
- ```bash
242
- # 1. アプリ本体を Kubernetes にデプロイ
243
- npx gulp k8s:case4
244
-
245
- # 2. Locust をデプロイ(同じ名前空間 cargo-tracker へ)
246
- npx gulp loadtest:case4:k8s
247
-
248
- # 3. Web UI を port-forward して開く(http://localhost:8089、Ctrl+C で終了)
249
- npx gulp loadtest:case4:k8s:open
250
-
251
- # 4. 削除
252
- npx gulp loadtest:case4:k8s:delete
253
- ```
254
-
255
- なお、アプリの `k8s:<case>:open` タスクは、Locust をデプロイ済みであれば負荷テストの Web UI(`http://localhost:8089`)も Kibana などと一緒に自動で開きます(未デプロイのときは `svc/locust` が見つからずスキップされます)。アプリ・ログ可視化・負荷テスト UI を 1 コマンドでまとめて開けます。
256
-
257
- ```bash
258
- npx gulp k8s:case4 # アプリをデプロイ
259
- npx gulp loadtest:case4:k8s # 負荷テストをデプロイ
260
- npx gulp k8s:case4:open # アプリ + Kibana + Locust(8089) をまとめて開く
261
- ```
262
-
263
- ---
264
-
265
- ## 18.5 運用タスクとして統合する
266
-
267
- これらの負荷テストは、本プロジェクトの運用タスク(Gulp)に `loadtest:<case>` として統合されています。`dev:<case>`(Compose 起動)・`k8s:<case>`(Kubernetes デプロイ)と同じ命名規約で扱えます。
268
-
269
- | タスク | 説明 |
270
- |--------|------|
271
- | `loadtest:<case>` | Compose 版 Locust の Web UI を起動 |
272
- | `loadtest:<case>:headless` | Compose 版を UI なしで実行(`USERS` / `SPAWN` / `DURATION` で調整) |
273
- | `loadtest:<case>:down` | Compose 版を停止・破棄 |
274
- | `loadtest:<case>:k8s` | Kubernetes 版をデプロイ |
275
- | `loadtest:<case>:k8s:open` | Kubernetes 版の Web UI を port-forward して開く |
276
- | `loadtest:<case>:k8s:delete` | Kubernetes 版を削除 |
277
- | `loadtest:help` | 一覧とヘルプを表示 |
278
-
279
- ES/CQRS のケース(case-3 / case-4)では、書き込み(コマンド)から Read Model への投影が非同期です。シード直後は一覧が空のことがあるため、デプロイ後しばらく待ってから負荷テストを実行してください。
280
-
281
- ---
282
-
283
- ## まとめ
284
-
285
- - 第 12 章で学んだ Locust の負荷テストを、4 ケース(モノリス / イベント駆動 / ES・CQRS Axon / ES・CQRS Kafka)に適用しました
286
- - シナリオは現行 Locust API(`HttpUser` / `@task` / `between`)で記述し、Compose 版・Kubernetes 版で共有します
287
- - 認証方式の違い(セッション / JWT / 認可無効)に合わせ、副作用のない読み取り系 GET に負荷をかけるシナリオにしました
288
- - Compose 版は `host.docker.internal` 経由でホスト公開ポートへ、Kubernetes 版は同一名前空間からクラスタ内サービスへ、それぞれ負荷をかけます
289
- - 運用タスク(`loadtest:<case>`)として統合し、`dev:<case>` / `k8s:<case>` と同じ流れで「構築 → 負荷テスト → 破棄」を繰り返せます
290
-
291
- ---
292
-
293
- - 前の章: [第 17 章 ケーススタディ実装比較まとめ](17-case-comparison-summary.md)
294
- - シリーズ目次: [Docker/Kubernetes 実践コンテナ解説](index.md)
1
+ ---
2
+ type: Article
3
+ title: "第 18 章 ケーススタディの負荷テスト"
4
+ description: "第 12 章「12.3 負荷テスト」では、Python 製の負荷テストツール Locust をコンテナで動かす考え方を学びました。"
5
+ tags: [article, getting-start-docker-kubernetes]
6
+ status: stable
7
+ generated: { by: human:kakimomokuri, at: 2026-06-26T00:29:42Z }
8
+ ---
9
+
10
+ # 第 18 章 ケーススタディの負荷テスト
11
+
12
+ ## はじめに
13
+
14
+ 第 12 章「12.3 負荷テスト」では、Python 製の負荷テストツール **Locust** をコンテナで動かす考え方を学びました。負荷生成ツール・シナリオ・テスト対象をすべてコンテナとして扱うことで、負荷テスト環境を「コードから一括で構築し、終わったら破棄する」ことができます。
15
+
16
+ この章では、その考え方を第 13〜16 章の 4 ケース(同一ドメイン = Cargo Tracker の 4 アーキテクチャ)に適用します。各ケースに Locust の負荷テスト一式を用意し、**Docker Compose 版**と **Kubernetes 版**の 2 通りで実行できるようにしました。
17
+
18
+ 実装はすべて各ケースの [`loadtest/`](https://github.com/k2works/getting-started-docker-kubernetes/tree/main/apps/case-studies) ディレクトリにあります。
19
+
20
+ | ケース | アーキテクチャ | loadtest ディレクトリ |
21
+ |--------|--------------|----------------------|
22
+ | case-1 | モノリス | `apps/case-studies/case-1-monolith/loadtest/` |
23
+ | case-2 | イベント駆動 MS | `apps/case-studies/case-2-event-driven/loadtest/` |
24
+ | case-3 | ES/CQRS(Axon) | `apps/case-studies/case-3-escqrs-axon/loadtest/` |
25
+ | case-4 | ES/CQRS(Kafka) | `apps/case-studies/case-4-escqrs-kafka/loadtest/` |
26
+
27
+ ---
28
+
29
+ ## 18.1 構成
30
+
31
+ 各ケースの `loadtest/` には次のファイルが入っています。シナリオ(`locustfile.py`)は Compose 版・Kubernetes 版で共有します。
32
+
33
+ | ファイル | 役割 |
34
+ |---------|------|
35
+ | `locustfile.py` | 負荷シナリオ(仮想ユーザーの振る舞い) |
36
+ | `compose.loadtest.yaml` | Docker Compose 版 Locust の起動定義(Web UI: 8089) |
37
+ | `kustomization.yaml` | Kubernetes 版 Locust の Kustomize 定義 |
38
+ | `k8s-locust.yaml` | Kubernetes 版 Locust の Deployment / Service |
39
+ | `README.md` | 実行手順・対象エンドポイント |
40
+
41
+ ### 現行 Locust API を使う
42
+
43
+ 第 12 章で引用したサンプル(`senario.py`)は、Locust 旧 API(`HttpLocust` / `TaskSet`)で書かれていました。これらは現行の Locust では廃止されているため、本章のシナリオは**現行 API(`HttpUser` / `@task` / `between`)**と公式イメージ `locustio/locust` で記述しています。
44
+
45
+ ```python
46
+ from locust import HttpUser, between, task
47
+
48
+
49
+ class CargoTrackerUser(HttpUser):
50
+ # 各タスクの実行間隔(記事の min_wait / max_wait に相当)
51
+ wait_time = between(1, 3)
52
+
53
+ @task(5)
54
+ def bookings(self):
55
+ self.client.get("/api/v1/bookings", name="/api/v1/bookings")
56
+ ```
57
+
58
+ 旧 API の `min_wait` / `max_wait`(ミリ秒)は、現行では `wait_time = between(min, max)`(秒)に置き換わっています。`HttpLocust` は `HttpUser`、`task_set` を持つ `TaskSet` は `HttpUser` に直接 `@task` を書く形になりました。
59
+
60
+ ---
61
+
62
+ ## 18.2 ケースごとの対象エンドポイントと認証
63
+
64
+ 負荷テストで重要なのは「**副作用のない読み取り系(GET)に、認証を通して負荷をかける**」ことです。4 ケースは認証方式が異なるため、シナリオもそれに合わせています。
65
+
66
+ | ケース | 公開ポート(Compose) | 認証方式 | シナリオの方針 |
67
+ |--------|---------------------|---------|--------------|
68
+ | case-1 | 18080(app) | セッション + フォームログイン | 認証不要の GET のみ(`/actuator/health`、`/login`、`/public/tracking`) |
69
+ | case-2 | 9080(gateway) | JWT(gateway で強制) | ログインで JWT を取得し、Read 系 GET に付与 |
70
+ | case-3 | 9081(gateway) | JWT(gateway で強制) | ログインで JWT を取得し、CQRS Query 側へ |
71
+ | case-4 | 9082(gateway) | `local` では認可無効 | 匿名で Read Model を GET |
72
+
73
+ ### case-1: 認証不要の GET(セッション認証のため)
74
+
75
+ モノリス版は Spring Security のフォームログイン(セッション + CSRF)で保護されています。負荷テストでは、確実に匿名アクセスできる GET だけを対象にしています。
76
+
77
+ | メソッド | パス | 説明 |
78
+ |---------|------|------|
79
+ | GET | `/actuator/health` | ヘルスチェック |
80
+ | GET | `/login` | ログイン画面(HTML) |
81
+ | GET | `/public/tracking` | 公開追跡の検索画面 |
82
+
83
+ ### case-2 / case-3: JWT ログインしてから GET
84
+
85
+ 両ケースとも gatewayms が JWT 認証を強制します。Locust の `on_start`(仮想ユーザー開始時に 1 回呼ばれる)でログインしてトークンを取得し、以降の GET に `Authorization: Bearer <token>` を付けます。
86
+
87
+ ```python
88
+ def on_start(self):
89
+ """ログインして JWT を取得する。失敗時はトークンなしで続行する。"""
90
+ self.token = None
91
+ with self.client.post(
92
+ "/api/v1/auth/login",
93
+ json={"username": USERNAME, "password": PASSWORD},
94
+ name="/api/v1/auth/login",
95
+ catch_response=True,
96
+ ) as res:
97
+ if res.status_code == 200:
98
+ data = res.json() if res.text else {}
99
+ self.token = data.get("token") or data.get("accessToken")
100
+ if self.token:
101
+ res.success()
102
+ else:
103
+ res.failure("token がレスポンスに含まれていません")
104
+ else:
105
+ res.failure(f"ログイン失敗: HTTP {res.status_code}")
106
+ ```
107
+
108
+ 既定ユーザーはシード済みの `admin` / `password` です。case-3 は CQRS の Query 側(`/api/v1/bookings`、`/api/v1/voyages`、`/api/v1/billing/invoices` など)の Read Model 読み取りに負荷をかけます。
109
+
110
+ ### case-4: 認証なしで Read Model を GET
111
+
112
+ case-4 は `local`(`local-docker`)プロファイルで起動するため、gateway / 各サービスの Spring Security 認可が無効になります。そのためログイン処理なしで、ページング付きの一覧 API に直接負荷をかけられます。
113
+
114
+ ```python
115
+ @task(5)
116
+ def bookings(self):
117
+ """予約一覧(Read Model、ページング)。"""
118
+ self.client.get("/api/v1/bookings?page=0&size=20", name="/api/v1/bookings")
119
+ ```
120
+
121
+ `name=` を明示しているのは、`?page=0&size=20` のようなクエリ違いを Locust の統計上で同じエンドポイントとして集計するためです。
122
+
123
+ ---
124
+
125
+ ## 18.3 Docker Compose 版
126
+
127
+ Compose 版は、第 12 章のサンプルと同様に「負荷生成側(Locust)を独立した Compose として用意する」方式です。ただし本ケーススタディは `dev:<case>` でアプリ本体を起動し、gateway/app を**ホストポートに公開**します。そこで Locust 側は、`host.docker.internal` 経由でそのホスト公開ポートへ負荷をかけます(どの Compose ネットワークからでも到達できます)。
128
+
129
+ 出典: `apps/case-studies/case-4-escqrs-kafka/loadtest/compose.loadtest.yaml`
130
+
131
+ ```yaml
132
+ name: loadtest-case4
133
+
134
+ services:
135
+ locust:
136
+ image: locustio/locust:2.32.5
137
+ ports:
138
+ - "8089:8089"
139
+ volumes:
140
+ - ./locustfile.py:/mnt/locust/locustfile.py:ro
141
+ environment:
142
+ LOCUST_LOCUSTFILE: /mnt/locust/locustfile.py
143
+ # 負荷対象。ホストに公開された 9082 番(gatewayms: 9082:8080)へ向ける。
144
+ LOCUST_HOST: ${TARGET_URL:-http://host.docker.internal:9082}
145
+ extra_hosts:
146
+ - "host.docker.internal:host-gateway"
147
+ ```
148
+
149
+ ポイントは次のとおりです。
150
+
151
+ - `image` に公式イメージ `locustio/locust` を使い、`volumes` でシナリオファイルをマウントします。イメージを再ビルドせずにシナリオを差し替えられます。
152
+ - `LOCUST_LOCUSTFILE` / `LOCUST_HOST` は、Locust の CLI オプション(`-f` / `--host`)に対応する環境変数です。
153
+ - `extra_hosts` で `host.docker.internal` を `host-gateway` に解決し、Linux でもホスト公開ポートへ到達できるようにしています。
154
+
155
+ ### 実行手順(Compose 版)
156
+
157
+ ```bash
158
+ # 1. アプリ本体を起動(gateway をホスト 9082 に公開)
159
+ npx gulp dev:case4
160
+
161
+ # 2. Locust を起動(Web UI: http://localhost:8089)
162
+ npx gulp loadtest:case4
163
+
164
+ # 3. ブラウザで同時ユーザー数・増加レートを指定してテスト開始
165
+
166
+ # 4. 終了
167
+ npx gulp loadtest:case4:down
168
+ ```
169
+
170
+ CI 向けに、UI なしで一定時間だけ実行して終了するヘッドレス実行も用意しています。
171
+
172
+ ```bash
173
+ # 既定: 50 ユーザー / 毎秒 5 ユーザー増 / 1 分間
174
+ npx gulp loadtest:case4:headless
175
+
176
+ # パラメータを環境変数で上書き
177
+ USERS=100 SPAWN=10 DURATION=3m npx gulp loadtest:case4:headless
178
+ ```
179
+
180
+ ---
181
+
182
+ ## 18.4 Kubernetes 版
183
+
184
+ Kubernetes 版は、第 12 章の「負荷生成側とテスト対象を同一オーケストレータに載せる」考え方をそのまま適用します。**アプリと同じ名前空間に Locust をデプロイ**し、クラスタ内のサービス(`gatewayms` など)へ DNS 名で直接負荷をかけます。`host.docker.internal` やポートフォワードを介さず、より本番に近い経路で計測できます。
185
+
186
+ シナリオ(`locustfile.py`)は Kustomize の `configMapGenerator` で ConfigMap として配布し、Compose 版と同じファイルを共有します。
187
+
188
+ 出典: `apps/case-studies/case-4-escqrs-kafka/loadtest/kustomization.yaml`
189
+
190
+ ```yaml
191
+ apiVersion: kustomize.config.k8s.io/v1beta1
192
+ kind: Kustomization
193
+
194
+ namespace: cargo-tracker
195
+
196
+ configMapGenerator:
197
+ - name: locust-scenario
198
+ files:
199
+ - locustfile.py
200
+
201
+ resources:
202
+ - k8s-locust.yaml
203
+ ```
204
+
205
+ 出典: `apps/case-studies/case-4-escqrs-kafka/loadtest/k8s-locust.yaml`(抜粋)
206
+
207
+ ```yaml
208
+ apiVersion: apps/v1
209
+ kind: Deployment
210
+ metadata:
211
+ name: locust
212
+ spec:
213
+ replicas: 1
214
+ selector:
215
+ matchLabels:
216
+ app: locust
217
+ template:
218
+ metadata:
219
+ labels:
220
+ app: locust
221
+ spec:
222
+ containers:
223
+ - name: locust
224
+ image: locustio/locust:2.32.5
225
+ args:
226
+ - "-f"
227
+ - "/mnt/locust/locustfile.py"
228
+ - "--host"
229
+ - "http://gatewayms:8080" # クラスタ内サービスへ直接
230
+ ports:
231
+ - name: web
232
+ containerPort: 8089
233
+ volumeMounts:
234
+ - name: scenario
235
+ mountPath: /mnt/locust
236
+ volumes:
237
+ - name: scenario
238
+ configMap:
239
+ name: locust-scenario
240
+ ```
241
+
242
+ ポイントは次のとおりです。
243
+
244
+ - `namespace` をアプリと同じにすることで、`--host http://gatewayms:8080` のように**サービス名だけ**で負荷対象を指定できます(同一名前空間内の DNS 解決)。
245
+ - `configMapGenerator` は ConfigMap 名にハッシュ(`locust-scenario-xxxx`)を付けます。Volume の `configMap.name` への参照は Kustomize が自動で書き換えるため、シナリオを変更すると新しいハッシュになり、Pod が確実に最新シナリオで再起動します。
246
+ - 負荷対象は、case-1 は `cargo-tracker:80`、case-2〜4 は `gatewayms:8080` です(各サービスのクラスタ内ポート)。
247
+
248
+ ### 実行手順(Kubernetes 版)
249
+
250
+ ```bash
251
+ # 1. アプリ本体を Kubernetes にデプロイ
252
+ npx gulp k8s:case4
253
+
254
+ # 2. Locust をデプロイ(同じ名前空間 cargo-tracker へ)
255
+ npx gulp loadtest:case4:k8s
256
+
257
+ # 3. Web UI を port-forward して開く(http://localhost:8089、Ctrl+C で終了)
258
+ npx gulp loadtest:case4:k8s:open
259
+
260
+ # 4. 削除
261
+ npx gulp loadtest:case4:k8s:delete
262
+ ```
263
+
264
+ なお、アプリの `k8s:<case>:open` タスクは、Locust をデプロイ済みであれば負荷テストの Web UI(`http://localhost:8089`)も Kibana などと一緒に自動で開きます(未デプロイのときは `svc/locust` が見つからずスキップされます)。アプリ・ログ可視化・負荷テスト UI を 1 コマンドでまとめて開けます。
265
+
266
+ ```bash
267
+ npx gulp k8s:case4 # アプリをデプロイ
268
+ npx gulp loadtest:case4:k8s # 負荷テストをデプロイ
269
+ npx gulp k8s:case4:open # アプリ + Kibana + Locust(8089) をまとめて開く
270
+ ```
271
+
272
+ ---
273
+
274
+ ## 18.5 運用タスクとして統合する
275
+
276
+ これらの負荷テストは、本プロジェクトの運用タスク(Gulp)に `loadtest:<case>` として統合されています。`dev:<case>`(Compose 起動)・`k8s:<case>`(Kubernetes デプロイ)と同じ命名規約で扱えます。
277
+
278
+ | タスク | 説明 |
279
+ |--------|------|
280
+ | `loadtest:<case>` | Compose 版 Locust の Web UI を起動 |
281
+ | `loadtest:<case>:headless` | Compose 版を UI なしで実行(`USERS` / `SPAWN` / `DURATION` で調整) |
282
+ | `loadtest:<case>:down` | Compose 版を停止・破棄 |
283
+ | `loadtest:<case>:k8s` | Kubernetes 版をデプロイ |
284
+ | `loadtest:<case>:k8s:open` | Kubernetes 版の Web UI を port-forward して開く |
285
+ | `loadtest:<case>:k8s:delete` | Kubernetes 版を削除 |
286
+ | `loadtest:help` | 一覧とヘルプを表示 |
287
+
288
+ ES/CQRS のケース(case-3 / case-4)では、書き込み(コマンド)から Read Model への投影が非同期です。シード直後は一覧が空のことがあるため、デプロイ後しばらく待ってから負荷テストを実行してください。
289
+
290
+ ---
291
+
292
+ ## まとめ
293
+
294
+ - 第 12 章で学んだ Locust の負荷テストを、4 ケース(モノリス / イベント駆動 / ES・CQRS Axon / ES・CQRS Kafka)に適用しました
295
+ - シナリオは現行 Locust API(`HttpUser` / `@task` / `between`)で記述し、Compose 版・Kubernetes 版で共有します
296
+ - 認証方式の違い(セッション / JWT / 認可無効)に合わせ、副作用のない読み取り系 GET に負荷をかけるシナリオにしました
297
+ - Compose 版は `host.docker.internal` 経由でホスト公開ポートへ、Kubernetes 版は同一名前空間からクラスタ内サービスへ、それぞれ負荷をかけます
298
+ - 運用タスク(`loadtest:<case>`)として統合し、`dev:<case>` / `k8s:<case>` と同じ流れで「構築 → 負荷テスト → 破棄」を繰り返せます
299
+
300
+ ---
301
+
302
+ - 前の章: [第 17 章 ケーススタディ実装比較まとめ](17-case-comparison-summary.md)
303
+ - シリーズ目次: [Docker/Kubernetes 実践コンテナ解説](index.md)