@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.
- package/lib/assets/.claude/skills/apply-okf/SKILL.md +88 -0
- package/lib/assets/.claude/skills/apply-okf/evals/evals.json +8 -0
- package/lib/assets/.claude/skills/apply-okf/scripts/__pycache__/okf_apply.cpython-314.pyc +0 -0
- package/lib/assets/.claude/skills/apply-okf/scripts/okf_apply.py +397 -0
- package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/benchmark.json +20 -0
- package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/benchmark.md +13 -0
- package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/eval_metadata.json +14 -0
- package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/with_skill/grading.json +39 -0
- 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
- 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
- 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
- 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
- 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
- package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/with_skill/outputs/docs_after/index.md +10 -0
- package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/with_skill/outputs/docs_after/log.md +7 -0
- 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
- 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
- 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
- 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
- package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/with_skill/outputs/report.md +76 -0
- package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/without_skill/grading.json +39 -0
- 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
- 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
- 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
- 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
- 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
- package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/without_skill/outputs/docs_after/index.md +10 -0
- package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/without_skill/outputs/docs_after/log.md +7 -0
- 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
- 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
- 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
- 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
- package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-1-register-new-adr/without_skill/outputs/report.md +22 -0
- package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/eval_metadata.json +13 -0
- package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/with_skill/grading.json +34 -0
- 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
- 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
- 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
- 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
- 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
- package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/with_skill/outputs/docs_after/index.md +10 -0
- package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/with_skill/outputs/docs_after/log.md +7 -0
- 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
- 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
- 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
- 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
- package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/with_skill/outputs/report.md +61 -0
- package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/without_skill/grading.json +34 -0
- 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
- 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
- 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
- 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
- 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
- package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/without_skill/outputs/docs_after/index.md +10 -0
- package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/without_skill/outputs/docs_after/log.md +7 -0
- 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
- 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
- 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
- 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
- package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-2-verify-reviewed-doc/without_skill/outputs/report.md +18 -0
- package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/eval_metadata.json +13 -0
- package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/with_skill/grading.json +34 -0
- 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
- 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
- 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
- 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
- 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
- package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/with_skill/outputs/docs_after/index.md +10 -0
- package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/with_skill/outputs/docs_after/log.md +7 -0
- 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
- 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
- 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
- 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
- package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/with_skill/outputs/report.md +83 -0
- package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/without_skill/grading.json +34 -0
- 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
- 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
- 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
- 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
- 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
- package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/without_skill/outputs/docs_after/index.md +10 -0
- package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/without_skill/outputs/docs_after/log.md +7 -0
- 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
- 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
- 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
- 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
- package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/eval-3-deprecate-replaced-doc/without_skill/outputs/report.md +15 -0
- package/lib/assets/.claude/skills/apply-okf-workspace/iteration-1/review.html +1325 -0
- package/lib/assets/.claude/skills/closing-iteration/SKILL.md +16 -0
- package/lib/assets/.claude/skills/creating-adr/SKILL.md +4 -0
- package/lib/assets/.claude/skills/creating-journal/SKILL.md +12 -1
- package/lib/assets/.claude/skills/migrating-okf/SKILL.md +149 -0
- package/lib/assets/.claude/skills/migrating-okf/evals/evals.json +23 -0
- package/lib/assets/.claude/skills/migrating-okf/scripts/__pycache__/okf_check.cpython-314.pyc +0 -0
- package/lib/assets/.claude/skills/migrating-okf/scripts/okf_check.py +468 -0
- package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/benchmark.json +20 -0
- package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/benchmark.md +13 -0
- package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/eval_metadata.json +15 -0
- package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/with_skill/grading.json +44 -0
- package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/with_skill/outputs/docs_after/adr/index.md +10 -0
- package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/with_skill/outputs/docs_after/index.md +15 -0
- package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/with_skill/outputs/docs_after/log.md +5 -0
- 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
- package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/with_skill/outputs/docs_after/reference/index.md +6 -0
- 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
- 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
- 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
- package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/with_skill/outputs/report.md +85 -0
- package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/without_skill/grading.json +44 -0
- package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/without_skill/outputs/docs_after/adr/index.md +8 -0
- package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/without_skill/outputs/docs_after/index.md +11 -0
- package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/without_skill/outputs/docs_after/log.md +7 -0
- 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
- package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/without_skill/outputs/docs_after/reference/index.md +9 -0
- 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
- 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
- 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
- package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-1-migrate-docs/without_skill/outputs/report.md +49 -0
- package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-2-upgrade-v01-to-v02/eval_metadata.json +13 -0
- package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-2-upgrade-v01-to-v02/with_skill/grading.json +34 -0
- 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
- 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
- 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
- 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
- package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/eval-2-upgrade-v01-to-v02/with_skill/outputs/report.md +147 -0
- package/lib/assets/.claude/skills/migrating-okf-workspace/iteration-1/review.html +1325 -0
- package/lib/assets/.claude/skills/opening-iteration/SKILL.md +15 -0
- package/lib/assets/.claude/skills/orchestrating-analysis/SKILL.md +4 -1
- package/lib/assets/.claude/skills/orchestrating-development/SKILL.md +2 -0
- package/lib/assets/.claude/skills/orchestrating-operation/SKILL.md +3 -1
- package/lib/assets/.claude/skills/orchestrating-project/SKILL.md +4 -1
- package/lib/assets/.claude/skills/planning-releases/SKILL.md +2 -0
- package/lib/assets/.env.example +9 -0
- package/lib/assets/CLAUDE.md +218 -216
- package/lib/assets/docs/article/functional-desgin-ppp/all/01-immutability-and-data-transformation.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/02-function-composition.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/03-polymorphism.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/04-data-validation.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/05-property-based-testing.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/06-tdd-and-functional.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/07-composite-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/08-decorator-pattern.md +10 -1
- package/lib/assets/docs/article/functional-desgin-ppp/all/09-adapter-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/10-strategy-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/11-command-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/12-visitor-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/13-abstract-factory-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/14-abstract-server-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/15-gossiping-bus-drivers.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/16-payroll-system.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/17-video-rental-system.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/18-concurrency-system.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/19-wa-tor-simulation.md +10 -1
- package/lib/assets/docs/article/functional-desgin-ppp/all/20-pattern-interactions.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/21-best-practices.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/all/22-oo-to-fp-migration.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/01-immutability-and-data-transformation.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/02-function-composition.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/03-polymorphism.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/04-clojure-spec.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/05-property-based-testing.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/06-tdd-in-functional.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/07-composite-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/08-decorator-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/09-adapter-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/10-strategy-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/11-command-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/12-visitor-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/13-abstract-factory-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/14-abstract-server-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/15-gossiping-bus-drivers.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/16-payroll-system.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/17-video-rental-system.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/18-concurrency-system.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/19-wator-simulation.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/20-pattern-interactions.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/21-best-practices.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/22-oo-to-fp-migration.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/index.md +3 -3
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/01-immutability-and-data-transformation.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/02-function-composition.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/03-polymorphism.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/04-data-validation.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/05-property-based-testing.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/06-tdd-and-fp.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/07-effects-and-pure-functions.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/08-error-handling-strategies.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/09-io-and-external-systems.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/10-concurrency-patterns.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/11-command-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/12-visitor-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/13-abstract-factory-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/14-abstract-server-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/15-gossiping-bus-drivers.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/16-payroll-system.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/17-video-rental-system.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/18-concurrency-system.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/19-wator-simulation.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/20-pattern-interactions.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/21-best-practices.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/22-oo-to-fp-migration.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/index.md +22 -22
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/01-immutability-and-data-transformation.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/02-function-composition.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/03-polymorphism.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/04-data-validation.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/05-property-based-testing.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/06-tdd-functional.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/07-composite-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/08-decorator-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/09-adapter-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/10-strategy-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/11-command-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/12-visitor-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/13-abstract-factory-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/14-abstract-server-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/15-gossiping-bus-drivers.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/16-payroll-system.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/17-video-rental-system.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/18-concurrency-system.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/19-wator-simulation.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/20-pattern-interactions.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/21-best-practices.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/22-oo-to-fp-migration.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/01-immutability-and-data-transformation.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/02-function-composition.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/03-polymorphism.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/04-data-validation.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/05-property-based-testing.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/06-tdd-functional.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/07-composite-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/08-decorator-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/09-adapter-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/10-strategy-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/11-command-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/12-visitor-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/13-abstract-factory-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/14-abstract-server-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/15-gossiping-bus-drivers.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/16-payroll-system.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/17-video-rental-system.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/18-concurrency-system.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/19-wator-simulation.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/20-pattern-interactions.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/21-best-practices.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/22-oo-to-fp-migration.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/01-immutability-and-data-transformation.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/02-function-composition.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/03-polymorphism.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/04-data-validation.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/05-property-based-testing.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/06-tdd-and-functional.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/07-composite-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/08-decorator-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/09-adapter-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/10-strategy-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/11-command-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/12-visitor-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/13-abstract-factory-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/14-abstract-server-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/15-gossiping-bus-drivers.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/16-payroll-system.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/17-video-rental-system.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/18-concurrency-system.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/19-wator-simulation.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/20-pattern-interactions.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/21-best-practices.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/rust/22-oo-to-fp-migration.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/01-immutability-and-data-transformation.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/02-function-composition.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/03-polymorphism.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/04-data-validation.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/05-property-based-testing.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/06-tdd-functional.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/07-composite-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/08-decorator-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/09-adapter-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/10-strategy-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/11-command-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/12-visitor-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/13-abstract-factory-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/14-abstract-server-pattern.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/15-gossiping-bus-drivers.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/16-payroll-system.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/17-video-rental-system.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/18-concurrency-system.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/19-wator-simulation.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/20-pattern-interactions.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/21-best-practices.md +9 -0
- package/lib/assets/docs/article/functional-desgin-ppp/scala/22-oo-to-fp-migration.md +9 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/01-container-and-docker-basics.md +341 -332
- package/lib/assets/docs/article/getting-start-docker-kubernetes/02-container-deployment.md +785 -776
- package/lib/assets/docs/article/getting-start-docker-kubernetes/03-practical-container-build-deploy.md +466 -457
- package/lib/assets/docs/article/getting-start-docker-kubernetes/04-multi-container-application.md +878 -869
- package/lib/assets/docs/article/getting-start-docker-kubernetes/05-kubernetes-introduction.md +585 -576
- package/lib/assets/docs/article/getting-start-docker-kubernetes/06-kubernetes-deploy-cluster.md +620 -611
- package/lib/assets/docs/article/getting-start-docker-kubernetes/07-kubernetes-advanced.md +621 -612
- package/lib/assets/docs/article/getting-start-docker-kubernetes/08-kubernetes-packaging.md +518 -509
- package/lib/assets/docs/article/getting-start-docker-kubernetes/09-container-operations.md +546 -537
- package/lib/assets/docs/article/getting-start-docker-kubernetes/10-optimal-container-image.md +640 -631
- package/lib/assets/docs/article/getting-start-docker-kubernetes/11-continuous-delivery.md +607 -598
- package/lib/assets/docs/article/getting-start-docker-kubernetes/12-container-use-cases.md +463 -454
- package/lib/assets/docs/article/getting-start-docker-kubernetes/13-case-monolith-compose-vs-kustomize.md +346 -337
- package/lib/assets/docs/article/getting-start-docker-kubernetes/14-case-event-driven-kustomize-vs-helm.md +324 -315
- package/lib/assets/docs/article/getting-start-docker-kubernetes/15-case-escqrs-axon-kustomize-vs-helm.md +297 -288
- package/lib/assets/docs/article/getting-start-docker-kubernetes/16-case-escqrs-kafka-kustomize-vs-helm.md +256 -247
- package/lib/assets/docs/article/getting-start-docker-kubernetes/17-case-comparison-summary.md +141 -132
- package/lib/assets/docs/article/getting-start-docker-kubernetes/18-case-load-testing.md +303 -294
- package/lib/assets/docs/article/getting-start-docker-kubernetes/appendix-a-dev-tools-setup.md +274 -265
- package/lib/assets/docs/article/getting-start-docker-kubernetes/appendix-b-orchestration-environments.md +530 -521
- package/lib/assets/docs/article/getting-start-docker-kubernetes/appendix-c-tips.md +519 -510
- package/lib/assets/docs/article/getting-start-docker-kubernetes/outline.md +220 -211
- package/lib/assets/docs/article/getting-start-tdd/clojure/01-todo-list-and-first-test.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/clojure/02-fake-it-and-triangulation.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/clojure/03-obvious-implementation-and-refactoring.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/clojure/04-version-control-and-conventional-commits.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/clojure/05-package-management-and-static-analysis.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/clojure/06-task-runner-and-ci-cd.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/clojure/07-protocols-and-records.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/clojure/08-multimethods-and-design-patterns.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/clojure/09-namespaces-and-module-design.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/clojure/10-higher-order-functions-and-composition.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/clojure/11-persistent-data-and-pipeline.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/clojure/12-error-handling-and-spec.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter01.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter02.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter03.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter04.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter05.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter06.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter07.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter08.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter09.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter10.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter11.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter12.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/elixir/01-todo-list-and-first-test.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/elixir/02-fake-it-and-triangulation.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/elixir/03-obvious-implementation-and-refactoring.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/elixir/04-version-control-and-conventional-commits.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/elixir/05-package-management-and-static-analysis.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/elixir/06-task-runner-and-ci-cd.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/elixir/07-structs-and-protocols.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/elixir/08-pattern-matching-and-guards.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/elixir/09-module-design-and-behaviours.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/elixir/10-higher-order-functions-and-pipeline.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/elixir/11-stream-and-lazy-evaluation.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/elixir/12-error-handling-and-with.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/elixir/index.md +2 -2
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter01.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter02.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter03.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter04.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter05.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter06.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter07.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter08.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter09.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter10.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter11.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter12.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/go/01-todo-list-and-first-test.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/go/02-fake-it-and-triangulation.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/go/03-obvious-implementation-and-refactoring.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/go/04-version-control-and-conventional-commits.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/go/05-package-management-and-static-analysis.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/go/06-task-runner-and-ci-cd.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/go/07-encapsulation-and-polymorphism.md +8 -0
- package/lib/assets/docs/article/getting-start-tdd/go/08-design-patterns.md +8 -0
- package/lib/assets/docs/article/getting-start-tdd/go/09-solid-principles-and-module-design.md +8 -0
- package/lib/assets/docs/article/getting-start-tdd/go/10-higher-order-functions-and-composition.md +8 -0
- package/lib/assets/docs/article/getting-start-tdd/go/11-immutable-data-and-pipeline.md +8 -0
- package/lib/assets/docs/article/getting-start-tdd/go/12-error-handling-and-type-safety.md +8 -0
- package/lib/assets/docs/article/getting-start-tdd/haskell/01-todo-list-and-first-test.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/haskell/02-fake-it-and-triangulation.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/haskell/03-obvious-implementation-and-refactoring.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/haskell/04-version-control-and-conventional-commits.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/haskell/05-package-management-and-static-analysis.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/haskell/06-task-runner-and-ci-cd.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/haskell/07-algebraic-data-types-and-type-classes.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/haskell/08-pattern-matching-and-guards.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/haskell/09-module-design-and-smart-constructors.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/haskell/10-higher-order-functions-and-currying.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/haskell/11-function-composition-and-point-free.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/haskell/12-monad-and-error-handling.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/integration/01-language-overview.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/integration/02-test-framework-comparison.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/integration/03-tdd-pattern-comparison.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/integration/04-type-system-comparison.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/integration/05-dev-environment-comparison.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/integration/06-learning-roadmap.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/java/01-todo-list-and-first-test.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/java/02-fake-it-and-triangulation.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/java/03-obvious-implementation-and-refactoring.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/java/04-version-control-and-conventional-commits.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/java/05-package-management-and-static-analysis.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/java/06-task-runner-and-ci-cd.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/java/07-encapsulation-and-polymorphism.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/java/08-design-patterns.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/java/09-solid-principles-and-module-design.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/java/10-higher-order-functions-and-composition.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/java/11-immutable-data-and-pipeline.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/java/12-error-handling-and-type-safety.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/node/01-todo-list-and-first-test.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/node/02-fake-it-and-triangulation.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/node/03-obvious-implementation-and-refactoring.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/node/04-version-control-and-conventional-commits.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/node/05-package-management-and-static-analysis.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/node/06-task-runner-and-ci-cd.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/node/07-encapsulation-and-polymorphism.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/node/08-design-patterns.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/node/09-solid-principles-and-module-design.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/node/10-higher-order-functions-and-composition.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/node/11-immutable-data-and-pipeline.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/node/12-error-handling-and-type-safety.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/php/01-todo-list-and-first-test.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/php/02-fake-it-and-triangulation.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/php/03-obvious-implementation-and-refactoring.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/php/04-version-control-and-conventional-commits.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/php/05-package-management-and-static-analysis.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/php/06-task-runner-and-ci-cd.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/php/07-encapsulation-and-polymorphism.md +8 -0
- package/lib/assets/docs/article/getting-start-tdd/php/08-design-patterns.md +8 -0
- package/lib/assets/docs/article/getting-start-tdd/php/09-solid-principles-and-module-design.md +8 -0
- package/lib/assets/docs/article/getting-start-tdd/php/10-higher-order-functions-and-composition.md +8 -0
- package/lib/assets/docs/article/getting-start-tdd/php/11-immutable-data-and-pipeline.md +8 -0
- package/lib/assets/docs/article/getting-start-tdd/php/12-error-handling-and-type-safety.md +8 -0
- package/lib/assets/docs/article/getting-start-tdd/python/01-todo-list-and-first-test.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/python/02-fake-it-and-triangulation.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/python/03-obvious-implementation-and-refactoring.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/python/04-version-control-and-conventional-commits.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/python/05-package-management-and-static-analysis.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/python/06-task-runner-and-ci-cd.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/python/07-encapsulation-and-polymorphism.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/python/08-design-patterns.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/python/09-solid-principles-and-module-design.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/python/10-higher-order-functions-and-composition.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/python/11-immutable-data-and-pipeline.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/python/12-error-handling-and-type-safety.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/ruby/01-todo-list-and-first-test.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/ruby/02-fake-it-and-triangulation.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/ruby/03-obvious-implementation-and-refactoring.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/ruby/04-version-control-and-conventional-commits.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/ruby/05-package-management-and-static-analysis.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/ruby/06-task-runner-and-ci-cd.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/ruby/07-encapsulation-and-polymorphism.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/ruby/08-design-patterns.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/ruby/09-solid-principles-and-module-design.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/ruby/10-higher-order-functions-and-composition.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/ruby/11-immutable-data-and-pipeline.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/ruby/12-error-handling-and-type-safety.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/rust/01-todo-list-and-first-test.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/rust/02-fake-it-and-triangulation.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/rust/03-obvious-implementation-and-refactoring.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/rust/04-version-control-and-conventional-commits.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/rust/05-package-management-and-static-analysis.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/rust/06-task-runner-and-ci-cd.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/rust/07-encapsulation-and-polymorphism.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/rust/08-design-patterns.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/rust/09-solid-principles-and-module-design.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/rust/10-higher-order-functions-and-composition.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/rust/11-immutable-data-and-pipeline.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/rust/12-error-handling-and-type-safety.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/scala/01-todo-list-and-first-test.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/scala/02-fake-it-and-triangulation.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/scala/03-obvious-implementation-and-refactoring.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/scala/04-version-control-and-conventional-commits.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/scala/05-package-management-and-static-analysis.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/scala/06-task-runner-and-ci-cd.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/scala/07-case-classes-and-traits.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/scala/08-pattern-matching-and-sealed-traits.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/scala/09-packages-and-module-design.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/scala/10-higher-order-functions-and-composition.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/scala/11-collections-and-lazy-evaluation.md +9 -0
- package/lib/assets/docs/article/getting-start-tdd/scala/12-error-handling-and-type-safety.md +9 -0
- package/lib/assets/docs/article/grokking-concurrency/all/index.md +0 -1
- package/lib/assets/docs/article/grokking-concurrency/all/part-1-ch02-sequential.md +9 -0
- package/lib/assets/docs/article/grokking-concurrency/all/part-2-ch04-05-threads.md +9 -0
- package/lib/assets/docs/article/grokking-concurrency/all/part-3-ch06-multitasking.md +9 -0
- package/lib/assets/docs/article/grokking-concurrency/all/part-4-ch07-parallel-patterns.md +9 -0
- package/lib/assets/docs/article/grokking-concurrency/all/part-5-ch08-09-synchronization.md +9 -0
- package/lib/assets/docs/article/grokking-concurrency/all/part-6-ch10-11-nonblocking-io.md +9 -0
- package/lib/assets/docs/article/grokking-concurrency/all/part-7-ch12-async.md +9 -0
- package/lib/assets/docs/article/grokking-concurrency/all/part-8-ch13-mapreduce.md +9 -0
- package/lib/assets/docs/article/grokking-concurrency/clojure/index.md +0 -10
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-1.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-2.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-3.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-4.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-5.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-6.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-7.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-8.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/csharp/index.md +0 -10
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-1.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-2.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-3.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-4.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-5.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-6.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-7.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-8.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/fsharp/index.md +0 -10
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-1.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-2.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-3.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-4.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-5.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-6.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-7.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-8.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/haskell/index.md +0 -10
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-1.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-2.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-3.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-4.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-5.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-6.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-7.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-8.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/java/index.md +0 -10
- package/lib/assets/docs/article/grokking-concurrency/java/part-1.md +8 -9
- package/lib/assets/docs/article/grokking-concurrency/java/part-2.md +8 -9
- package/lib/assets/docs/article/grokking-concurrency/java/part-3.md +7 -8
- package/lib/assets/docs/article/grokking-concurrency/java/part-4.md +8 -9
- package/lib/assets/docs/article/grokking-concurrency/java/part-5.md +7 -8
- package/lib/assets/docs/article/grokking-concurrency/java/part-6.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/java/part-7.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/java/part-8.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/python/index.md +0 -10
- package/lib/assets/docs/article/grokking-concurrency/python/part-1.md +7 -8
- package/lib/assets/docs/article/grokking-concurrency/python/part-2.md +10 -11
- package/lib/assets/docs/article/grokking-concurrency/python/part-3.md +8 -9
- package/lib/assets/docs/article/grokking-concurrency/python/part-4.md +8 -9
- package/lib/assets/docs/article/grokking-concurrency/python/part-5.md +9 -10
- package/lib/assets/docs/article/grokking-concurrency/python/part-6.md +9 -10
- package/lib/assets/docs/article/grokking-concurrency/python/part-7.md +9 -10
- package/lib/assets/docs/article/grokking-concurrency/python/part-8.md +8 -9
- package/lib/assets/docs/article/grokking-concurrency/rust/index.md +0 -10
- package/lib/assets/docs/article/grokking-concurrency/rust/part-1.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/rust/part-2.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/rust/part-3.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/rust/part-4.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/rust/part-5.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/rust/part-6.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/rust/part-7.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/rust/part-8.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/scala/index.md +0 -10
- package/lib/assets/docs/article/grokking-concurrency/scala/part-1.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/scala/part-2.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/scala/part-3.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/scala/part-4.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/scala/part-5.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/scala/part-6.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/scala/part-7.md +6 -7
- package/lib/assets/docs/article/grokking-concurrency/scala/part-8.md +6 -7
- package/lib/assets/docs/article/grokkingfp/all/part-1-ch01-fp-introduction.md +9 -0
- package/lib/assets/docs/article/grokkingfp/all/part-1-ch02-pure-functions.md +9 -0
- package/lib/assets/docs/article/grokkingfp/all/part-2-ch03-immutable-data.md +9 -0
- package/lib/assets/docs/article/grokkingfp/all/part-2-ch04-higher-order-functions.md +9 -0
- package/lib/assets/docs/article/grokkingfp/all/part-2-ch05-flatmap.md +9 -0
- package/lib/assets/docs/article/grokkingfp/all/part-3-ch06-option.md +9 -0
- package/lib/assets/docs/article/grokkingfp/all/part-3-ch07-either-adt.md +9 -0
- package/lib/assets/docs/article/grokkingfp/all/part-4-ch08-io-monad.md +9 -0
- package/lib/assets/docs/article/grokkingfp/all/part-4-ch09-streams.md +9 -0
- package/lib/assets/docs/article/grokkingfp/all/part-5-ch10-concurrency.md +9 -0
- package/lib/assets/docs/article/grokkingfp/all/part-6-ch11-application.md +9 -0
- package/lib/assets/docs/article/grokkingfp/all/part-6-ch12-testing.md +9 -0
- package/lib/assets/docs/article/grokkingfp/all/writing-plan.md +9 -0
- package/lib/assets/docs/article/grokkingfp/clojure/part-1.md +9 -0
- package/lib/assets/docs/article/grokkingfp/clojure/part-2.md +9 -0
- package/lib/assets/docs/article/grokkingfp/clojure/part-3.md +9 -0
- package/lib/assets/docs/article/grokkingfp/clojure/part-4.md +9 -0
- package/lib/assets/docs/article/grokkingfp/clojure/part-5.md +9 -0
- package/lib/assets/docs/article/grokkingfp/clojure/part-6.md +9 -0
- package/lib/assets/docs/article/grokkingfp/csharp/part-1.md +9 -0
- package/lib/assets/docs/article/grokkingfp/csharp/part-2.md +9 -0
- package/lib/assets/docs/article/grokkingfp/csharp/part-3.md +9 -0
- package/lib/assets/docs/article/grokkingfp/csharp/part-4.md +9 -0
- package/lib/assets/docs/article/grokkingfp/csharp/part-5.md +9 -0
- package/lib/assets/docs/article/grokkingfp/csharp/part-6.md +9 -0
- package/lib/assets/docs/article/grokkingfp/elixir/part-1.md +9 -0
- package/lib/assets/docs/article/grokkingfp/elixir/part-2.md +9 -0
- package/lib/assets/docs/article/grokkingfp/elixir/part-3.md +9 -0
- package/lib/assets/docs/article/grokkingfp/elixir/part-4.md +9 -0
- package/lib/assets/docs/article/grokkingfp/elixir/part-5.md +9 -0
- package/lib/assets/docs/article/grokkingfp/elixir/part-6.md +9 -0
- package/lib/assets/docs/article/grokkingfp/fsharp/part-1.md +9 -0
- package/lib/assets/docs/article/grokkingfp/fsharp/part-2.md +9 -0
- package/lib/assets/docs/article/grokkingfp/fsharp/part-3.md +9 -0
- package/lib/assets/docs/article/grokkingfp/fsharp/part-4.md +9 -0
- package/lib/assets/docs/article/grokkingfp/fsharp/part-5.md +9 -0
- package/lib/assets/docs/article/grokkingfp/fsharp/part-6.md +9 -0
- package/lib/assets/docs/article/grokkingfp/haskell/part-1.md +9 -0
- package/lib/assets/docs/article/grokkingfp/haskell/part-2.md +9 -0
- package/lib/assets/docs/article/grokkingfp/haskell/part-3.md +9 -0
- package/lib/assets/docs/article/grokkingfp/haskell/part-4.md +9 -0
- package/lib/assets/docs/article/grokkingfp/haskell/part-5.md +9 -0
- package/lib/assets/docs/article/grokkingfp/haskell/part-6.md +9 -0
- package/lib/assets/docs/article/grokkingfp/java/part-1.md +9 -0
- package/lib/assets/docs/article/grokkingfp/java/part-2.md +9 -0
- package/lib/assets/docs/article/grokkingfp/java/part-3.md +9 -0
- package/lib/assets/docs/article/grokkingfp/java/part-4.md +9 -0
- package/lib/assets/docs/article/grokkingfp/java/part-5.md +9 -0
- package/lib/assets/docs/article/grokkingfp/java/part-6.md +9 -0
- package/lib/assets/docs/article/grokkingfp/python/part-1.md +9 -0
- package/lib/assets/docs/article/grokkingfp/python/part-2.md +9 -0
- package/lib/assets/docs/article/grokkingfp/python/part-3.md +9 -0
- package/lib/assets/docs/article/grokkingfp/python/part-4.md +9 -0
- package/lib/assets/docs/article/grokkingfp/python/part-5.md +9 -0
- package/lib/assets/docs/article/grokkingfp/python/part-6.md +9 -0
- package/lib/assets/docs/article/grokkingfp/ruby/part-1.md +9 -0
- package/lib/assets/docs/article/grokkingfp/ruby/part-2.md +9 -0
- package/lib/assets/docs/article/grokkingfp/ruby/part-3.md +9 -0
- package/lib/assets/docs/article/grokkingfp/ruby/part-4.md +9 -0
- package/lib/assets/docs/article/grokkingfp/ruby/part-5.md +9 -0
- package/lib/assets/docs/article/grokkingfp/ruby/part-6.md +9 -0
- package/lib/assets/docs/article/grokkingfp/rust/part-1.md +9 -0
- package/lib/assets/docs/article/grokkingfp/rust/part-2.md +9 -0
- package/lib/assets/docs/article/grokkingfp/rust/part-3.md +9 -0
- package/lib/assets/docs/article/grokkingfp/rust/part-4.md +9 -0
- package/lib/assets/docs/article/grokkingfp/rust/part-5.md +9 -0
- package/lib/assets/docs/article/grokkingfp/rust/part-6.md +9 -0
- package/lib/assets/docs/article/grokkingfp/scala/part-1.md +9 -0
- package/lib/assets/docs/article/grokkingfp/scala/part-2.md +9 -0
- package/lib/assets/docs/article/grokkingfp/scala/part-3.md +9 -0
- package/lib/assets/docs/article/grokkingfp/scala/part-4.md +9 -0
- package/lib/assets/docs/article/grokkingfp/scala/part-5.md +9 -0
- package/lib/assets/docs/article/grokkingfp/scala/part-6.md +9 -0
- package/lib/assets/docs/article/grokkingfp/typescript/part-1.md +9 -0
- package/lib/assets/docs/article/grokkingfp/typescript/part-2.md +9 -0
- package/lib/assets/docs/article/grokkingfp/typescript/part-3.md +9 -0
- package/lib/assets/docs/article/grokkingfp/typescript/part-4.md +9 -0
- package/lib/assets/docs/article/grokkingfp/typescript/part-5.md +9 -0
- package/lib/assets/docs/article/grokkingfp/typescript/part-6.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part1/chapter01.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part1/chapter02.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part1/chapter03.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part2/chapter04.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part2/chapter05.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part2/chapter06.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part2/chapter07.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part2/chapter08.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part2/chapter09.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part2/chapter10.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part2/chapter11.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part2/chapter12.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part2/chapter13.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part3/chapter14.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part3/chapter15.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part3/chapter16.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part3/chapter17.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part3/chapter18.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part3/chapter19.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part3/chapter20.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part3/chapter21.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter14-orm.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter15-orm.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter16-orm.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter17-orm.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter18-orm.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter19-orm.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter20-orm.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter21-orm.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter22-orm.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part4/chapter22.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part4/chapter23.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part4/chapter24.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part4/chapter25.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part4/chapter26.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part4/chapter27.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part4/chapter28.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part4/chapter29.md +8 -0
- package/lib/assets/docs/article/practical-database-design/part4/chapter30.md +8 -0
- package/lib/assets/docs/article/practical-database-design/part4/chapter31.md +8 -0
- package/lib/assets/docs/article/practical-database-design/part4/chapter32.md +8 -0
- package/lib/assets/docs/article/practical-database-design/part5/chapter33.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part5/chapter34.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part5/chapter35.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part5/chapter36.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part5/chapter37.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part5/chapter38.md +9 -0
- package/lib/assets/docs/article/practical-database-design/part5/chapter39.md +9 -0
- package/lib/assets/docs/article/practical-database-design/study/study2-1.md +9 -0
- package/lib/assets/docs/article/practical-database-design/study/study2-2.md +9 -0
- package/lib/assets/docs/article/practical-database-design/study/study2-3.md +9 -0
- package/lib/assets/docs/article/practical-database-design/study/study2-4.md +9 -0
- package/lib/assets/docs/article/practical-database-design/study/study2-5.md +9 -0
- package/lib/assets/docs/article/practical-database-design/study/study3-1.md +9 -0
- package/lib/assets/docs/article/practical-database-design/study/study3-2.md +9 -0
- package/lib/assets/docs/article/practical-database-design/study/study3-3.md +9 -0
- package/lib/assets/docs/article/practical-database-design/study/study3-4.md +9 -0
- package/lib/assets/docs/article/practical-database-design/study/study3-5.md +9 -0
- package/lib/assets/docs/article/practical-database-design/study/study4-1.md +9 -0
- package/lib/assets/docs/article/practical-database-design/study/study4-2.md +9 -0
- package/lib/assets/docs/article/practical-database-design/study/study4-3.md +9 -0
- package/lib/assets/docs/article/practical-database-design/study/study4-4.md +9 -0
- package/lib/assets/docs/article/practical-database-design/study/study4-5.md +9 -0
- package/lib/assets/docs/index.md +4 -0
- package/lib/assets/docs/log.md +5 -0
- package/lib/assets/docs/operation/index.md +15 -1
- 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
- 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
- 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
- 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
- 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
- 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
- package/lib/assets/docs/reference/UI/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +10 -1
- 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
- package/lib/assets/docs/reference/index.md +54 -53
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/lib/assets/docs/reference//344/274/201/346/245/255/347/265/214/345/226/266/350/253/226.md +10 -1
- 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
- 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
- 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
- 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
- package/lib/assets/docs/reference//351/201/213/345/226/266/347/256/241/347/220/206.md +10 -1
- 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
- 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
- package/lib/assets/docs/reference//351/226/213/347/231/272/343/202/254/343/202/244/343/203/211.md +9 -0
- 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
- package/lib/assets/docs/template/ADR.md +9 -0
- 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
- 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
- package/lib/assets/docs/template/README.md +9 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/lib/assets/docs/template//344/272/213/344/276/213/345/210/206/346/236/220.md +9 -0
- package/lib/assets/docs/template//344/274/201/346/245/255/345/210/206/346/236/220.md +9 -0
- 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
- package/lib/assets/docs/template//350/246/201/344/273/266/345/256/232/347/276/251.md +7 -8
- package/lib/assets/docs/template//350/250/255/350/250/210.md +10 -1
- 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
- package/lib/assets/gulpfile.js +4 -2
- package/lib/assets/ops/scripts/okf.js +272 -0
- package/lib/assets/package.json +2 -0
- package/package.json +1 -1
|
@@ -1,537 +1,546 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
'"
|
|
50
|
-
'"
|
|
51
|
-
'"
|
|
52
|
-
'"
|
|
53
|
-
'"
|
|
54
|
-
'"
|
|
55
|
-
'"
|
|
56
|
-
'
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
- elasticsearch
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
ports:
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
depends_on:
|
|
113
|
-
- elasticsearch
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
ports:
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
readOnly: true
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
kind:
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
-
|
|
537
|
-
-
|
|
1
|
+
---
|
|
2
|
+
type: Article
|
|
3
|
+
title: "第 9 章 コンテナの運用"
|
|
4
|
+
description: "前章までで、Docker によるコンテナの構築・デプロイから、Kubernetes 上でのアプリケーションのパッケージングまでを学んできました。"
|
|
5
|
+
tags: [article, getting-start-docker-kubernetes]
|
|
6
|
+
status: stable
|
|
7
|
+
generated: { by: human:kakimomokuri, at: 2026-06-26T00:29:42Z }
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# 第 9 章 コンテナの運用
|
|
11
|
+
|
|
12
|
+

|
|
13
|
+
|
|
14
|
+
*ログ、メトリクス、アラート、原因調査、ロールバックをつなげて、障害に強い運用を作ります。*
|
|
15
|
+
|
|
16
|
+
## はじめに
|
|
17
|
+
|
|
18
|
+
前章までで、Docker によるコンテナの構築・デプロイから、Kubernetes 上でのアプリケーションのパッケージングまでを学んできました。アプリケーションを「動かす」ところまではたどり着いたわけですが、ソフトウェアは作って終わりではありません。本番環境で稼働し続けるアプリケーションには、その状態を観測し(オブザーバビリティ)、障害やアクセス増加に耐え続ける(可用性)ための運用設計が欠かせません。
|
|
19
|
+
|
|
20
|
+
「変更を楽に安全にできて役に立つソフトウェア」であり続けるためには、稼働中のシステムから何が起きているのかを把握できることと、一部が壊れても全体としてサービスが止まらないことの両方が必要です。この章では、その土台となる以下の 2 つのテーマを扱います。
|
|
21
|
+
|
|
22
|
+
- **9.1 ロギングの運用** — コンテナのログをどこに出し、どう集約し、どう検索可能にするか
|
|
23
|
+
- **9.2 可用性の高い Kubernetes の運用** — オートスケールと Pod 配置制御によって、負荷変動と障害に強い構成をどう作るか
|
|
24
|
+
|
|
25
|
+
なお、本章で引用するマニフェストや設定ファイルは、すべてリポジトリ内に実在するものです。ロギングの題材は `gihyo-docker-kuberbetes/ch08/ch08_1_3`(Docker Compose 構成)と `ch08/ch08_1_4`(Kubernetes 構成)、可用性の題材は `ch08/ch08_3_2`、アプリ側のログ出力例は `apps/taskapp/containers/` 配下を参照します。実コードに存在しない一般的な観点については「例」「一般論」として明記します。
|
|
26
|
+
|
|
27
|
+
### 目次
|
|
28
|
+
|
|
29
|
+
1. [ロギングの運用](#ロギングの運用)
|
|
30
|
+
2. [可用性の高い-kubernetes-の運用](#可用性の高い-kubernetes-の運用)
|
|
31
|
+
3. [まとめ](#まとめ)
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## ロギングの運用
|
|
36
|
+
|
|
37
|
+
### コンテナは標準出力・標準エラーにログを出す
|
|
38
|
+
|
|
39
|
+
ログ運用を考えるうえで、まず押さえるべき原則があります。それは **「コンテナは標準出力(stdout)・標準エラー出力(stderr)にログを出す」** ということです。
|
|
40
|
+
|
|
41
|
+
従来のアプリケーションは、ログを `/var/log/app.log` のようなファイルに書き込むのが一般的でした。しかしコンテナはイミュータブル(不変)であることが望ましく、いつ破棄・再作成されてもよい存在です。コンテナの内部にログファイルを書き込んでしまうと、コンテナが破棄された瞬間にログも失われてしまいます。
|
|
42
|
+
|
|
43
|
+
そこでコンテナの世界では、アプリケーションは「ログを標準出力・標準エラーに垂れ流すだけ」にし、それをどこに保存・転送するかはコンテナの外側(Docker エンジンや Kubernetes)の責務とする、という役割分担を取ります。これは [The Twelve-Factor App](https://12factor.net/ja/logs) が説く「ログをイベントストリームとして扱う」という考え方そのものです。アプリケーションはログの行き先を知らなくてよく、関心の分離が実現されます。
|
|
44
|
+
|
|
45
|
+
この原則は、アプリケーション側の設定にも現れます。たとえば `apps/taskapp/containers/nginx-web/etc/nginx/templates/10-log.conf.template` では、Nginx のアクセスログを構造化された JSON 形式で出力するよう定義しています。
|
|
46
|
+
|
|
47
|
+
```conf
|
|
48
|
+
log_format json escape=json '{'
|
|
49
|
+
'"time": "$time_local",'
|
|
50
|
+
'"remote_addr": "$remote_addr",'
|
|
51
|
+
'"host": "$host",'
|
|
52
|
+
'"remote_user": "$remote_user",'
|
|
53
|
+
'"status": "$status",'
|
|
54
|
+
'"server_protocol": "$server_protocol",'
|
|
55
|
+
'"request_method": "$request_method",'
|
|
56
|
+
'"request_uri": "$request_uri",'
|
|
57
|
+
'"request": "$request",'
|
|
58
|
+
'"body_bytes_sent": "$body_bytes_sent",'
|
|
59
|
+
'"request_time": "$request_time",'
|
|
60
|
+
'"upstream_response_time": "$upstream_response_time",'
|
|
61
|
+
'"http_referer": "$http_referer", '
|
|
62
|
+
'"http_user_agent": "$http_user_agent",'
|
|
63
|
+
'"http_x_forwarded_for": "$http_x_forwarded_for",'
|
|
64
|
+
'"http_x_forwarded_proto": "$http_x_forwarded_proto"'
|
|
65
|
+
'}';
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
JSON 形式でログを出力しておくと、後述する Elasticsearch のようなログ基盤がフィールド単位でインデックスを作れるため、「ステータスコードが 500 のリクエストだけ」「レスポンスタイムが 1 秒を超えたものだけ」といった検索・集計が容易になります。プレーンテキストのログと比べ、構造化ログは検索性・分析性で大きく勝ります。
|
|
69
|
+
|
|
70
|
+
データベースのようなミドルウェアでも、診断に必要なログをあらかじめ出力させておくことが重要です。`apps/taskapp/containers/mysql/etc/mysql/conf.d/slowlog.cnf` では、実行に時間のかかったクエリを記録するスロークエリログを有効化しています。
|
|
71
|
+
|
|
72
|
+
```conf
|
|
73
|
+
[mysqld]
|
|
74
|
+
slow_query_log = on
|
|
75
|
+
slow_query_log_file = /var/log/mysql/mysql-slow.log
|
|
76
|
+
long_query_time = 1
|
|
77
|
+
log_queries_not_using_indexes = on
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
ここでは 1 秒(`long_query_time = 1`)を超えたクエリと、インデックスを使っていないクエリを記録対象としています。このようなログは、パフォーマンス劣化の原因を運用フェーズで特定するための貴重な手がかりになります。
|
|
81
|
+
|
|
82
|
+
### Docker のロギングドライバ
|
|
83
|
+
|
|
84
|
+
標準出力・標準エラーに出されたログを、Docker は **ロギングドライバ(logging driver)** という仕組みで処理します。デフォルトは `json-file` ドライバで、ホスト上の JSON ファイルにログを蓄積し、`docker container logs` コマンドで参照できるようにします。
|
|
85
|
+
|
|
86
|
+
ロギングドライバはこの `json-file` 以外にも複数用意されており、ログの転送先を切り替えられます。代表的なものには次のようなものがあります(一般論)。
|
|
87
|
+
|
|
88
|
+
- `json-file` — ホスト上の JSON ファイルに保存(デフォルト)
|
|
89
|
+
- `syslog` — syslog デーモンへ転送
|
|
90
|
+
- `journald` — systemd の journal へ転送
|
|
91
|
+
- `fluentd` — Fluentd へ転送
|
|
92
|
+
- `awslogs` — Amazon CloudWatch Logs へ転送
|
|
93
|
+
|
|
94
|
+
`fluentd` ドライバを使うと、各コンテナの標準出力を Fluentd(ログコレクタ)へ送り、そこから任意のストレージへ集約できます。`gihyo-docker-kuberbetes/ch08/ch08_1_3/docker-compose.yml` は、まさにこの構成を Docker Compose で組んだ例です。
|
|
95
|
+
|
|
96
|
+
```yaml
|
|
97
|
+
version: "3"
|
|
98
|
+
services:
|
|
99
|
+
elasticsearch:
|
|
100
|
+
image: elasticsearch:5.6-alpine
|
|
101
|
+
ports:
|
|
102
|
+
- "9200:9200"
|
|
103
|
+
volumes:
|
|
104
|
+
- "./jvm.options:/usr/share/elasticsearch/config/jvm.options"
|
|
105
|
+
|
|
106
|
+
kibana:
|
|
107
|
+
image: kibana:5.6
|
|
108
|
+
ports:
|
|
109
|
+
- "5601:5601"
|
|
110
|
+
environment:
|
|
111
|
+
ELASTICSEARCH_URL: "http://elasticsearch:9200"
|
|
112
|
+
depends_on:
|
|
113
|
+
- elasticsearch
|
|
114
|
+
|
|
115
|
+
fluentd:
|
|
116
|
+
build: ./fluentd-elasticsearch
|
|
117
|
+
ports:
|
|
118
|
+
- "24224:24224"
|
|
119
|
+
- "24220:24220"
|
|
120
|
+
- "24224:24224/udp"
|
|
121
|
+
depends_on:
|
|
122
|
+
- elasticsearch
|
|
123
|
+
|
|
124
|
+
echo:
|
|
125
|
+
image: gihyodocker/echo:latest
|
|
126
|
+
ports:
|
|
127
|
+
- "8080:8080"
|
|
128
|
+
logging:
|
|
129
|
+
driver: "fluentd"
|
|
130
|
+
options:
|
|
131
|
+
fluentd-address: "localhost:24224"
|
|
132
|
+
tag: "docker.{{.Name}}"
|
|
133
|
+
depends_on:
|
|
134
|
+
- fluentd
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
注目すべきは `echo` サービスの `logging` セクションです。`driver: "fluentd"` を指定することで、`echo` コンテナの標準出力は Fluentd(`localhost:24224`)へ転送されます。`tag: "docker.{{.Name}}"` は、ログにコンテナ名由来のタグを付与する指定で、後段の Fluentd 側でこのタグを使って振り分けや出力先の決定を行います。
|
|
138
|
+
|
|
139
|
+
この構成では、ログは次のように流れます。
|
|
140
|
+
|
|
141
|
+
```text
|
|
142
|
+
echo(標準出力) → fluentd(収集) → elasticsearch(蓄積・検索) → kibana(可視化)
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
つまり Elasticsearch にログを蓄積し、Kibana という Web UI で検索・可視化する、という流れです。この **Elasticsearch + Fluentd + Kibana** の組み合わせは、頭文字を取って **EFK スタック** と呼ばれ、コンテナのログ集約における定番構成です。
|
|
146
|
+
|
|
147
|
+
### Fluentd の入力・出力設定
|
|
148
|
+
|
|
149
|
+
Fluentd の振る舞いは設定ファイル `fluent.conf` で決まります。`ch08/ch08_1_3/fluentd-elasticsearch/fluent.conf` を見てみましょう。
|
|
150
|
+
|
|
151
|
+
```conf
|
|
152
|
+
<source>
|
|
153
|
+
@type forward
|
|
154
|
+
port 24224
|
|
155
|
+
bind 0.0.0.0
|
|
156
|
+
</source>
|
|
157
|
+
|
|
158
|
+
<match *.**>
|
|
159
|
+
@type copy
|
|
160
|
+
<store>
|
|
161
|
+
type elasticsearch
|
|
162
|
+
host elasticsearch
|
|
163
|
+
port 9200
|
|
164
|
+
logstash_format true
|
|
165
|
+
logstash_prefix docker
|
|
166
|
+
logstash_dateformat %Y%m%d
|
|
167
|
+
include_tag_key true
|
|
168
|
+
type_name app
|
|
169
|
+
tag_key @log_name
|
|
170
|
+
flush_interval 5s
|
|
171
|
+
</store>
|
|
172
|
+
<store>
|
|
173
|
+
type file
|
|
174
|
+
path /fluentd/log/docker_app
|
|
175
|
+
</store>
|
|
176
|
+
</match>
|
|
177
|
+
|
|
178
|
+
<source>
|
|
179
|
+
@type monitor_agent
|
|
180
|
+
bind 0.0.0.0
|
|
181
|
+
port 24220
|
|
182
|
+
</source>
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
Fluentd の設定は、大きく **入力(source)** と **出力(match)** の 2 つから構成されます。
|
|
186
|
+
|
|
187
|
+
- **入力(`<source>`)** — `@type forward` は Fluentd の forward プロトコルで他のコンテナからログを受け取る入力プラグインです。`port 24224` で待ち受けており、Docker Compose 側で `fluentd-address: "localhost:24224"` と指定した宛先と一致します。
|
|
188
|
+
- **出力(`<match *.**>`)** — `*.**` というパターンに一致するすべてのタグのログを処理対象とします。`@type copy` は受け取ったログを複数の出力先に複製するプラグインで、ここでは 2 つの `<store>` を定義しています。1 つ目は Elasticsearch(`type elasticsearch`、`host elasticsearch`、`port 9200`)への出力で、`logstash_format true` により Kibana が扱いやすい日付別インデックス(`docker-YYYYMMDD` 形式)が作られます。2 つ目はファイル(`type file`)への出力で、ローカルにもログを残しています。
|
|
189
|
+
- **モニタリング(2 つ目の `<source>`)** — `@type monitor_agent` は Fluentd 自身の稼働状況を監視するためのエンドポイントを `port 24220` で公開します。ログ基盤そのものを監視できるようにしておく配慮です。
|
|
190
|
+
|
|
191
|
+
この Fluentd イメージは、`fluent.conf` を組み込んだカスタムイメージとしてビルドされます。`ch08/ch08_1_3/fluentd-elasticsearch/Dockerfile` は次のとおりです。
|
|
192
|
+
|
|
193
|
+
```dockerfile
|
|
194
|
+
FROM fluent/fluentd:v0.12-debian
|
|
195
|
+
|
|
196
|
+
RUN ["gem", "install", "fluent-plugin-elasticsearch", "--no-rdoc", "--no-ri", "--version", "1.9.2"]
|
|
197
|
+
COPY fluent.conf /fluentd/etc/fluent.conf
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
公式の Fluentd イメージに Elasticsearch 出力プラグイン(`fluent-plugin-elasticsearch`)を追加インストールし、自作の `fluent.conf` をコピーするだけの簡潔な内容です。Fluentd は標準ではすべての出力プラグインを同梱しないため、必要なプラグインを明示的に追加するこのパターンはよく使われます。
|
|
201
|
+
|
|
202
|
+
### Kubernetes でのログ集約パターン(EFK + DaemonSet)
|
|
203
|
+
|
|
204
|
+
Docker Compose では `logging` ドライバでコンテナごとに転送先を指定しましたが、Kubernetes では発想が少し変わります。Kubernetes では多数のノード(Node)の上に多数の Pod が分散して動くため、**「各ノードに 1 つだけログ収集役を常駐させ、そのノード上の全コンテナのログをまとめて集める」** というパターンが主流です。
|
|
205
|
+
|
|
206
|
+
この「各ノードに 1 つだけ Pod を配置する」を実現するのが **DaemonSet** です。Deployment がレプリカ数を指定して Pod を配置するのに対し、DaemonSet はクラスタの各ノードに自動的に Pod を 1 つずつ配置します。ログ収集のように、すべてのノードでバックグラウンドのエージェントを動かしたいケースにぴったりの仕組みです。
|
|
207
|
+
|
|
208
|
+
`ch08/ch08_1_4/fluentd-daemonset.yaml` が、Fluentd を DaemonSet としてデプロイするマニフェストです。
|
|
209
|
+
|
|
210
|
+
```yaml
|
|
211
|
+
apiVersion: apps/v1
|
|
212
|
+
kind: DaemonSet
|
|
213
|
+
metadata:
|
|
214
|
+
name: fluentd
|
|
215
|
+
namespace: kube-system
|
|
216
|
+
labels:
|
|
217
|
+
app: fluentd-logging
|
|
218
|
+
version: v1
|
|
219
|
+
kubernetes.io/cluster-service: "true"
|
|
220
|
+
spec:
|
|
221
|
+
selector:
|
|
222
|
+
matchLabels:
|
|
223
|
+
app: fluentd-logging
|
|
224
|
+
template:
|
|
225
|
+
metadata:
|
|
226
|
+
labels:
|
|
227
|
+
app: fluentd-logging
|
|
228
|
+
version: v1
|
|
229
|
+
kubernetes.io/cluster-service: "true"
|
|
230
|
+
spec:
|
|
231
|
+
tolerations:
|
|
232
|
+
- key: node-role.kubernetes.io/master
|
|
233
|
+
effect: NoSchedule
|
|
234
|
+
containers:
|
|
235
|
+
- name: fluentd
|
|
236
|
+
image: fluent/fluentd-kubernetes-daemonset:elasticsearch
|
|
237
|
+
env:
|
|
238
|
+
- name: FLUENT_ELASTICSEARCH_HOST
|
|
239
|
+
value: "elasticsearch"
|
|
240
|
+
- name: FLUENT_ELASTICSEARCH_PORT
|
|
241
|
+
value: "9200"
|
|
242
|
+
- name: FLUENT_ELASTICSEARCH_SCHEME
|
|
243
|
+
value: "http"
|
|
244
|
+
resources:
|
|
245
|
+
limits:
|
|
246
|
+
memory: 200Mi
|
|
247
|
+
requests:
|
|
248
|
+
cpu: 100m
|
|
249
|
+
memory: 200Mi
|
|
250
|
+
volumeMounts:
|
|
251
|
+
- name: varlog
|
|
252
|
+
mountPath: /var/log
|
|
253
|
+
- name: varlibdockercontainers
|
|
254
|
+
mountPath: /var/lib/docker/containers
|
|
255
|
+
readOnly: true
|
|
256
|
+
terminationGracePeriodSeconds: 30
|
|
257
|
+
volumes:
|
|
258
|
+
- name: varlog
|
|
259
|
+
hostPath:
|
|
260
|
+
path: /var/log
|
|
261
|
+
- name: varlibdockercontainers
|
|
262
|
+
hostPath:
|
|
263
|
+
path: /var/lib/docker/containers
|
|
264
|
+
readOnly: true
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
このマニフェストの要点を整理します。
|
|
268
|
+
|
|
269
|
+
- **`kind: DaemonSet`** — 各ノードに Fluentd を 1 つずつ常駐させます。`namespace: kube-system` に配置しているのは、これがクラスタの基盤機能(cluster-service)であることを示しています。
|
|
270
|
+
- **`hostPath` ボリューム** — `varlog`(`/var/log`)と `varlibdockercontainers`(`/var/lib/docker/containers`)という 2 つのホストパスをマウントしています。Kubernetes 上の各コンテナの標準出力は、ノード上のこれらのディレクトリにファイルとして書き出されます。Fluentd はこのホストのログファイルを読み取ることで、ノード上の全コンテナのログを収集できます。後者は `readOnly: true` で読み取り専用にしており、ログ基盤がアプリのログを書き換えないよう配慮されています。
|
|
271
|
+
- **環境変数で転送先を指定** — `FLUENT_ELASTICSEARCH_HOST` などで Elasticsearch の宛先を渡しています。`fluent/fluentd-kubernetes-daemonset:elasticsearch` イメージは、これらの環境変数を読んで Elasticsearch へ出力するよう作られているため、Compose の例のように自前で `fluent.conf` を書かなくても動きます。
|
|
272
|
+
- **`tolerations`** — `node-role.kubernetes.io/master` の `NoSchedule` を許容(toleration)しています。通常 master ノードには一般の Pod が配置されませんが、ログ収集はそこでも動かしたいため、この taint を許容してマスターノードにも Fluentd を配置できるようにしています。
|
|
273
|
+
- **`resources`** — メモリの上限(`limits`)と CPU・メモリの要求(`requests`)を明示しています。基盤コンポーネントが暴走してノードのリソースを食い潰さないようにする、運用上重要な指定です。
|
|
274
|
+
|
|
275
|
+
収集先となる Elasticsearch も Kubernetes 上にデプロイします。`ch08/ch08_1_4/elasticsearch.yaml` では、PersistentVolumeClaim・Service・Deployment・ConfigMap をまとめて定義しています。データの永続化と設定の外出しに注目してください。
|
|
276
|
+
|
|
277
|
+
```yaml
|
|
278
|
+
kind: PersistentVolumeClaim
|
|
279
|
+
apiVersion: v1
|
|
280
|
+
metadata:
|
|
281
|
+
name: elasticsearch-pvc
|
|
282
|
+
namespace: kube-system
|
|
283
|
+
labels:
|
|
284
|
+
kubernetes.io/cluster-service: "true"
|
|
285
|
+
spec:
|
|
286
|
+
accessModes:
|
|
287
|
+
- ReadWriteOnce
|
|
288
|
+
resources:
|
|
289
|
+
requests:
|
|
290
|
+
storage: 2G
|
|
291
|
+
|
|
292
|
+
---
|
|
293
|
+
apiVersion: v1
|
|
294
|
+
kind: Service
|
|
295
|
+
metadata:
|
|
296
|
+
name: elasticsearch
|
|
297
|
+
namespace: kube-system
|
|
298
|
+
spec:
|
|
299
|
+
selector:
|
|
300
|
+
app: elasticsearch
|
|
301
|
+
ports:
|
|
302
|
+
- protocol: TCP
|
|
303
|
+
port: 9200
|
|
304
|
+
targetPort: http
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
ログは蓄積されていくデータなので、Pod が再作成されても消えないよう **PersistentVolumeClaim(PVC)** で永続ボリュームを要求しています。また Elasticsearch の設定(`elasticsearch.yml`、`jvm.options` など)は **ConfigMap** として定義し、コンテナにマウントしています(マニフェスト後半で定義)。設定をイメージに焼き込まず外部化することで、設定変更のたびにイメージを作り直す必要がなくなります。
|
|
308
|
+
|
|
309
|
+
最後に、ログを人間が見るための窓口が Kibana です。`ch08/ch08_1_4/kibana.yaml` では、Service を `NodePort` で公開しています。
|
|
310
|
+
|
|
311
|
+
```yaml
|
|
312
|
+
apiVersion: v1
|
|
313
|
+
kind: Service
|
|
314
|
+
metadata:
|
|
315
|
+
name: kibana
|
|
316
|
+
namespace: kube-system
|
|
317
|
+
spec:
|
|
318
|
+
selector:
|
|
319
|
+
app: kibana
|
|
320
|
+
ports:
|
|
321
|
+
- protocol: TCP
|
|
322
|
+
port: 5601
|
|
323
|
+
targetPort: http
|
|
324
|
+
nodePort: 30050
|
|
325
|
+
type: NodePort
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
`type: NodePort` と `nodePort: 30050` により、クラスタ外からノードのポート 30050 経由で Kibana の Web UI(コンテナ内ポート 5601)にアクセスできます。ブラウザで Kibana を開けば、Fluentd が Elasticsearch に蓄積したログを検索・可視化できます。
|
|
329
|
+
|
|
330
|
+
ここまでをまとめると、Kubernetes における EFK によるログ集約は次の流れになります。
|
|
331
|
+
|
|
332
|
+
```text
|
|
333
|
+
各 Pod(標準出力)
|
|
334
|
+
→ ノードの /var/log ・ /var/lib/docker/containers にファイル出力
|
|
335
|
+
→ Fluentd DaemonSet が各ノードで収集
|
|
336
|
+
→ Elasticsearch に蓄積・インデックス化
|
|
337
|
+
→ Kibana で検索・可視化
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
ログ収集を担う `echo` アプリ自体も Deployment として動かせます。`ch08/ch08_1_4/echo.yaml` では、Nginx と echo の 2 コンテナを 1 つの Pod にまとめ、Nginx 側の環境変数 `LOG_STDOUT: "true"` でログを標準出力に出すよう指定しています。アプリ側が原則どおり標準出力にログを出すことで、上記のパイプラインに自然に乗るわけです。
|
|
341
|
+
|
|
342
|
+
---
|
|
343
|
+
|
|
344
|
+
## 可用性の高い Kubernetes の運用
|
|
345
|
+
|
|
346
|
+
ログによって「何が起きているか」を観測できるようになったら、次は「壊れても・混んでも止まらない」可用性の高い運用です。Kubernetes には、可用性を支える仕組みが標準で備わっています。ここでは、負荷に応じた **オートスケール(HPA)** と、Pod をどのノードに配置するかを制御する **アフィニティ(affinity)** を中心に見ていきます。
|
|
347
|
+
|
|
348
|
+
### HPA によるオートスケール
|
|
349
|
+
|
|
350
|
+
アクセス数は時間帯やイベントによって大きく変動します。常にピークに合わせた数の Pod を動かしておくのはコストの無駄ですし、逆にアクセス急増に Pod 数が足りなければサービスが遅延・停止してしまいます。そこで、負荷に応じて自動的に Pod 数を増減させるのが **HorizontalPodAutoscaler(HPA)** です。
|
|
351
|
+
|
|
352
|
+
`ch08/ch08_3_2/hpa.yaml` は、`echo` という Deployment に対する HPA の定義です。
|
|
353
|
+
|
|
354
|
+
```yaml
|
|
355
|
+
apiVersion: autoscaling/v2beta1
|
|
356
|
+
kind: HorizontalPodAutoscaler
|
|
357
|
+
metadata:
|
|
358
|
+
name: echo
|
|
359
|
+
spec:
|
|
360
|
+
scaleTargetRef:
|
|
361
|
+
apiVersion: apps/v1
|
|
362
|
+
kind: Deployment
|
|
363
|
+
name: echo
|
|
364
|
+
minReplicas: 1
|
|
365
|
+
maxReplicas: 3
|
|
366
|
+
metrics:
|
|
367
|
+
- type: Resource
|
|
368
|
+
resource:
|
|
369
|
+
name: cpu
|
|
370
|
+
targetAverageUtilization: 40
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
このマニフェストは次のことを意味します。
|
|
374
|
+
|
|
375
|
+
- **`scaleTargetRef`** — スケール対象は `echo` という名前の Deployment です。HPA はこの Deployment のレプリカ数を書き換えることでスケールを実現します。
|
|
376
|
+
- **`minReplicas: 1` / `maxReplicas: 3`** — Pod 数を最小 1、最大 3 の範囲で増減させます。
|
|
377
|
+
- **`metrics`** — スケールの判断基準です。ここでは CPU 使用率(`name: cpu`)を見ており、`targetAverageUtilization: 40` は「Pod 全体の平均 CPU 使用率を 40% に保つ」という目標を表します。実際の平均使用率が 40% を上回れば Pod を増やし、下回れば(最小数まで)減らします。
|
|
378
|
+
|
|
379
|
+
つまり HPA は、設定したメトリクスの目標値を維持するように Pod 数を自動調整するコントローラです。これにより、アクセス急増時には自動でスケールアウトしてサービスを守り、平常時には Pod を減らしてリソースを節約できます。
|
|
380
|
+
|
|
381
|
+
なお、HPA が CPU 使用率を取得するには、クラスタにメトリクスの収集基盤(Metrics Server など)が導入されている必要があります(一般論)。HPA そのものはあくまで「メトリクスを見てレプリカ数を決める」役割であり、メトリクスの提供は別のコンポーネントが担う、という分担になっています。
|
|
382
|
+
|
|
383
|
+
### アフィニティによる Pod 配置制御
|
|
384
|
+
|
|
385
|
+
Pod がどのノードに配置されるかは、通常は Kubernetes のスケジューラが自動で決めます。しかし可用性やパフォーマンスの観点から、「この Pod は特定の性質を持つノードで動かしたい」「同じ役割の Pod は別々のノードに散らしたい」といった配置の意図を持ち込みたいことがあります。これを実現するのが **アフィニティ(affinity)** です。
|
|
386
|
+
|
|
387
|
+
#### Node Affinity — 特定のノードへ配置する
|
|
388
|
+
|
|
389
|
+
**Node Affinity** は、Pod を特定のラベルを持つノードに配置するための仕組みです。`ch08/ch08_3_2/node-affinity-deployment.yaml` を見てみましょう。
|
|
390
|
+
|
|
391
|
+
```yaml
|
|
392
|
+
apiVersion: apps/v1
|
|
393
|
+
kind: Deployment
|
|
394
|
+
metadata:
|
|
395
|
+
name: high-cpu-job
|
|
396
|
+
labels:
|
|
397
|
+
app: high-cpu-job
|
|
398
|
+
spec:
|
|
399
|
+
replicas: 2
|
|
400
|
+
selector:
|
|
401
|
+
matchLabels:
|
|
402
|
+
app: high-cpu-job
|
|
403
|
+
template:
|
|
404
|
+
metadata:
|
|
405
|
+
labels:
|
|
406
|
+
app: high-cpu-job
|
|
407
|
+
|
|
408
|
+
spec:
|
|
409
|
+
affinity:
|
|
410
|
+
nodeAffinity:
|
|
411
|
+
requiredDuringSchedulingIgnoredDuringExecution:
|
|
412
|
+
nodeSelectorTerms:
|
|
413
|
+
- matchExpressions:
|
|
414
|
+
- key: instancegroup
|
|
415
|
+
operator: In
|
|
416
|
+
values:
|
|
417
|
+
- "batch"
|
|
418
|
+
containers:
|
|
419
|
+
- name: high-cpu-job
|
|
420
|
+
image: example/high-cpu-job:latest
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
`nodeAffinity` の下にある `requiredDuringSchedulingIgnoredDuringExecution` は、「スケジューリング時に必須(required)の条件」を表します。ここでは `instancegroup` というラベルの値が `batch` であるノードにのみ、この `high-cpu-job` Pod を配置せよ、と指定しています。
|
|
424
|
+
|
|
425
|
+
これは、CPU を大量に消費するバッチ処理を、Web リクエストを捌くノードとは別の「バッチ用ノード群」に隔離したい、といったケースで有効です。負荷特性の異なるワークロードを分離することで、互いに干渉してサービス品質が下がるのを防げます。
|
|
426
|
+
|
|
427
|
+
なお、条件の強さには `required...`(必須・満たさなければ配置されない)のほかに `preferred...`(できれば満たしたい・満たせなくても配置される)という種類もあります(一般論)。要件に応じて使い分けます。
|
|
428
|
+
|
|
429
|
+
#### Pod Anti-Affinity — Pod を別々のノードに散らす
|
|
430
|
+
|
|
431
|
+
可用性を高めるうえで特に重要なのが **Pod Anti-Affinity(Pod 反アフィニティ)** です。同じ役割の Pod が偶然同じノードに固まってしまうと、そのノードが故障した瞬間にすべての Pod が同時に失われ、サービスが停止してしまいます。Pod Anti-Affinity は「同じ種類の Pod を別々のノードに分散配置する」ことで、この単一ノード障害の影響を抑えます。
|
|
432
|
+
|
|
433
|
+
`ch08/ch08_3_2/pod-affinity-deployment.yaml` がその例です。
|
|
434
|
+
|
|
435
|
+
```yaml
|
|
436
|
+
apiVersion: apps/v1
|
|
437
|
+
kind: Deployment
|
|
438
|
+
metadata:
|
|
439
|
+
name: echo
|
|
440
|
+
labels:
|
|
441
|
+
app: echo
|
|
442
|
+
spec:
|
|
443
|
+
replicas: 3
|
|
444
|
+
selector:
|
|
445
|
+
matchLabels:
|
|
446
|
+
app: echo
|
|
447
|
+
template:
|
|
448
|
+
metadata:
|
|
449
|
+
labels:
|
|
450
|
+
app: echo
|
|
451
|
+
spec:
|
|
452
|
+
affinity:
|
|
453
|
+
podAntiAffinity:
|
|
454
|
+
requiredDuringSchedulingIgnoredDuringExecution:
|
|
455
|
+
- labelSelector:
|
|
456
|
+
matchExpressions:
|
|
457
|
+
- key: app
|
|
458
|
+
operator: In
|
|
459
|
+
values:
|
|
460
|
+
- echo
|
|
461
|
+
topologyKey: "kubernetes.io/hostname"
|
|
462
|
+
containers:
|
|
463
|
+
- name: nginx
|
|
464
|
+
image: gihyodocker/nginx:latest
|
|
465
|
+
env:
|
|
466
|
+
- name: BACKEND_HOST
|
|
467
|
+
value: localhost:8080
|
|
468
|
+
ports:
|
|
469
|
+
- containerPort: 80
|
|
470
|
+
- name: echo
|
|
471
|
+
image: gihyodocker/echo:latest
|
|
472
|
+
ports:
|
|
473
|
+
- containerPort: 8080
|
|
474
|
+
```
|
|
475
|
+
|
|
476
|
+
ポイントは `podAntiAffinity` の設定です。`labelSelector` で「`app: echo` というラベルを持つ Pod」を対象とし、`topologyKey: "kubernetes.io/hostname"` を指定しています。`topologyKey` はノードを区別する単位を表し、`kubernetes.io/hostname` はノードのホスト名(=ノード個体)を意味します。
|
|
477
|
+
|
|
478
|
+
これらを組み合わせると、「`app: echo` の Pod は、同じホスト名のノードに 2 つ以上は置かない」という制約になります。`replicas: 3` で 3 つの echo Pod を起動する際、Kubernetes はこの制約を満たすよう、3 つの Pod をそれぞれ別のノードへ配置しようとします。結果として、1 つのノードが落ちても残りのノードの Pod でサービスが継続でき、可用性が向上します。
|
|
479
|
+
|
|
480
|
+
### 可用性のためのその他の観点(一般論)
|
|
481
|
+
|
|
482
|
+
HPA とアフィニティ以外にも、可用性を高めるための定石となる仕組みがいくつかあります。本リポジトリの `ch08_3_2` のマニフェストには直接含まれていないため、ここでは一般論・例として概要を紹介します。実際の運用では、これらを組み合わせて多層的に可用性を確保します。
|
|
483
|
+
|
|
484
|
+
- **複数レプリカ** — そもそも Deployment のレプリカ数を 2 以上にしておくことが可用性の基本です。前掲の `pod-affinity-deployment.yaml` は `replicas: 3` であり、Anti-Affinity と組み合わせて「3 つの Pod を別々のノードに分散」させています。レプリカが 1 つだけだと、その Pod の再起動中はサービスが完全に止まってしまいます。
|
|
485
|
+
|
|
486
|
+
- **PodDisruptionBudget(PDB)** — ノードのメンテナンスやクラスタのアップグレードといった「計画的な中断」の際に、同時に停止してよい Pod 数(あるいは最低限維持すべき Pod 数)に上限・下限を設ける仕組みです。たとえば「常に最低 2 つの Pod を稼働させる」と宣言しておけば、メンテナンスで一度に全 Pod が落とされる事態を防げます(例)。
|
|
487
|
+
|
|
488
|
+
```yaml
|
|
489
|
+
# 例: PodDisruptionBudget の概要(一般論)
|
|
490
|
+
apiVersion: policy/v1
|
|
491
|
+
kind: PodDisruptionBudget
|
|
492
|
+
metadata:
|
|
493
|
+
name: echo-pdb
|
|
494
|
+
spec:
|
|
495
|
+
minAvailable: 2
|
|
496
|
+
selector:
|
|
497
|
+
matchLabels:
|
|
498
|
+
app: echo
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
- **リソースの requests / limits** — 各コンテナに必要なリソース量(`requests`)と上限(`limits`)を宣言します。`requests` はスケジューラが Pod を配置する際の判断材料となり、リソースに余裕のあるノードへ適切に配置されます。`limits` は 1 つのコンテナがノードのリソースを食い潰して他の Pod を巻き込む「うるさい隣人(noisy neighbor)」問題を防ぎます。前掲の `fluentd-daemonset.yaml` でも `requests`・`limits` が指定されていました。
|
|
502
|
+
|
|
503
|
+
- **ヘルスチェック(liveness / readiness probe)** — Kubernetes に「Pod が正常か」「リクエストを受けられる状態か」を判定させる仕組みです。`livenessProbe` が失敗するとコンテナが再起動され、`readinessProbe` が失敗している間はその Pod へトラフィックが流されなくなります。これにより、応答不能になった Pod を自動で復旧・切り離しでき、ユーザーが障害中の Pod に当たるのを防げます(例)。
|
|
504
|
+
|
|
505
|
+
```yaml
|
|
506
|
+
# 例: liveness / readiness probe の概要(一般論)
|
|
507
|
+
livenessProbe:
|
|
508
|
+
httpGet:
|
|
509
|
+
path: /healthz
|
|
510
|
+
port: 8080
|
|
511
|
+
initialDelaySeconds: 10
|
|
512
|
+
periodSeconds: 10
|
|
513
|
+
readinessProbe:
|
|
514
|
+
httpGet:
|
|
515
|
+
path: /readiness
|
|
516
|
+
port: 8080
|
|
517
|
+
initialDelaySeconds: 5
|
|
518
|
+
periodSeconds: 5
|
|
519
|
+
```
|
|
520
|
+
|
|
521
|
+
これらの仕組みは、いずれも「一部が壊れても全体は止まらない」という可用性の本質を、宣言的なマニフェストで実現するものです。Kubernetes は、こうした宣言された望ましい状態(desired state)を維持し続けるよう自動で働きます。運用者は「どうあってほしいか」を宣言するだけでよく、そのための個別操作を手で行う必要がありません。これこそが、Kubernetes が「変更を楽に安全にできる」運用基盤たりうる理由です。
|
|
522
|
+
|
|
523
|
+
---
|
|
524
|
+
|
|
525
|
+
## まとめ
|
|
526
|
+
|
|
527
|
+
この章では、コンテナを本番で運用し続けるための 2 つの柱、ロギングと可用性について学びました。
|
|
528
|
+
|
|
529
|
+
- **ロギングの運用**
|
|
530
|
+
- コンテナは標準出力・標準エラーにログを出すのが原則であり、保存・転送はコンテナの外側(Docker・Kubernetes)の責務とする。
|
|
531
|
+
- アプリ側では構造化ログ(`nginx-web` の JSON ログ)や診断ログ(`mysql` のスロークエリログ)を出力しておくと、後段の分析が容易になる。
|
|
532
|
+
- Docker のロギングドライバ(`fluentd` ドライバ)でログを Fluentd に転送し、`ch08_1_3` の Compose 構成では Elasticsearch + Fluentd + Kibana の **EFK スタック** を組んだ。`fluent.conf` の `<source>`(入力)と `<match>`(出力)で収集と転送先を定義する。
|
|
533
|
+
- Kubernetes では `ch08_1_4` のように、各ノードに Fluentd を常駐させる **DaemonSet** でノード上の全コンテナのログを集約し、Elasticsearch に蓄積、Kibana(NodePort)で可視化する。
|
|
534
|
+
|
|
535
|
+
- **可用性の高い Kubernetes の運用**
|
|
536
|
+
- **HPA**(`hpa.yaml`)は CPU 使用率などのメトリクスに応じて Pod 数を自動増減させ、負荷変動に追従する。
|
|
537
|
+
- **Node Affinity**(`node-affinity-deployment.yaml`)は Pod を特定の性質を持つノードに配置し、ワークロードを隔離する。
|
|
538
|
+
- **Pod Anti-Affinity**(`pod-affinity-deployment.yaml`)は同種の Pod を別々のノードに分散させ、単一ノード障害の影響を抑える。
|
|
539
|
+
- さらに一般論として、複数レプリカ・PodDisruptionBudget・リソースの requests/limits・ヘルスチェックを組み合わせることで、多層的に可用性を確保する。
|
|
540
|
+
|
|
541
|
+
ログによってシステムの内部を観測でき、オートスケールとアフィニティによって負荷と障害に耐えられる構成を宣言的に組めること。これらは「変更を楽に安全にできて役に立つソフトウェア」を本番で維持し続けるための土台です。
|
|
542
|
+
|
|
543
|
+
次章では、運用負荷とリスクをさらに下げるために、コンテナイメージそのものを最適化・セキュア化する方法を扱います。
|
|
544
|
+
|
|
545
|
+
- 前章: [第 8 章 Kubernetes アプリケーションのパッケージング](./08-kubernetes-packaging.md)
|
|
546
|
+
- 次章: [第 10 章 最適なコンテナイメージ作成と運用](./10-optimal-container-image.md)
|