@k2works/claude-code-booster 4.6.0 → 4.7.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/LICENSE +21 -21
- package/README.md +42 -42
- package/bin/claude-code-booster +90 -90
- package/lib/assets/.claude/README.md +269 -269
- package/lib/assets/.claude/agents/xp-architect.md +250 -250
- package/lib/assets/.claude/agents/xp-executive.md +207 -207
- package/lib/assets/.claude/agents/xp-interaction-designer.md +239 -239
- package/lib/assets/.claude/agents/xp-product-manager.md +245 -245
- package/lib/assets/.claude/agents/xp-programmer.md +268 -268
- package/lib/assets/.claude/agents/xp-project-manager.md +229 -229
- package/lib/assets/.claude/agents/xp-technical-writer.md +224 -224
- package/lib/assets/.claude/agents/xp-tester.md +265 -265
- package/lib/assets/.claude/agents/xp-user-representative.md +204 -204
- package/lib/assets/.claude/scripts/generate-inception-deck.mjs +911 -911
- package/lib/assets/.claude/settings.json +11 -11
- package/lib/assets/.claude/skills/ai-agent-guidelines/SKILL.md +111 -111
- package/lib/assets/.claude/skills/analyzing-architecture/SKILL.md +83 -83
- package/lib/assets/.claude/skills/analyzing-business-architecture/SKILL.md +122 -122
- package/lib/assets/.claude/skills/analyzing-business-case/SKILL.md +148 -148
- package/lib/assets/.claude/skills/analyzing-business-strategy/SKILL.md +277 -277
- package/lib/assets/.claude/skills/analyzing-data-model/SKILL.md +77 -77
- package/lib/assets/.claude/skills/analyzing-domain-model/SKILL.md +117 -117
- package/lib/assets/.claude/skills/analyzing-inception-deck/SKILL.md +84 -84
- package/lib/assets/.claude/skills/analyzing-non-functional/SKILL.md +95 -95
- package/lib/assets/.claude/skills/analyzing-operation/SKILL.md +95 -95
- package/lib/assets/.claude/skills/analyzing-requirements/SKILL.md +91 -91
- package/lib/assets/.claude/skills/analyzing-review/SKILL.md +174 -174
- package/lib/assets/.claude/skills/analyzing-tech-stack/SKILL.md +101 -101
- package/lib/assets/.claude/skills/analyzing-test-strategy/SKILL.md +89 -89
- package/lib/assets/.claude/skills/analyzing-ui-design/SKILL.md +80 -80
- package/lib/assets/.claude/skills/analyzing-usecases/SKILL.md +72 -72
- package/lib/assets/.claude/skills/creating-adr/SKILL.md +113 -113
- package/lib/assets/.claude/skills/creating-iteration-report/SKILL.md +210 -210
- package/lib/assets/.claude/skills/creating-release-report/SKILL.md +161 -161
- package/lib/assets/.claude/skills/creating-slides/SKILL.md +86 -86
- package/lib/assets/.claude/skills/creating-slides/agents/openai.yaml +4 -4
- package/lib/assets/.claude/skills/creating-slides/references/manga-css.md +45 -45
- package/lib/assets/.claude/skills/creating-slides/scripts/slide_tools.py +239 -239
- package/lib/assets/.claude/skills/developing-backend/SKILL.md +100 -100
- package/lib/assets/.claude/skills/developing-frontend/SKILL.md +93 -93
- package/lib/assets/.claude/skills/developing-release/SKILL.md +120 -120
- package/lib/assets/.claude/skills/developing-review/SKILL.md +175 -175
- package/lib/assets/.claude/skills/developing-uiux-review/SKILL.md +207 -207
- package/lib/assets/.claude/skills/generating-bmc/SKILL.md +123 -123
- package/lib/assets/.claude/skills/generating-slides/SKILL.md +94 -94
- package/lib/assets/.claude/skills/git-commit/SKILL.md +81 -81
- package/lib/assets/.claude/skills/killing-processes/SKILL.md +44 -44
- package/lib/assets/.claude/skills/operating-backup/SKILL.md +59 -59
- package/lib/assets/.claude/skills/operating-cicd/SKILL.md +54 -54
- package/lib/assets/.claude/skills/operating-deploy/SKILL.md +67 -67
- package/lib/assets/.claude/skills/operating-docs/SKILL.md +219 -219
- package/lib/assets/.claude/skills/operating-provision/SKILL.md +77 -77
- package/lib/assets/.claude/skills/operating-qt/SKILL.md +147 -147
- package/lib/assets/.claude/skills/operating-review/SKILL.md +171 -171
- package/lib/assets/.claude/skills/operating-script/SKILL.md +145 -145
- package/lib/assets/.claude/skills/operating-setup/SKILL.md +63 -63
- package/lib/assets/.claude/skills/orchestrating-analysis/SKILL.md +104 -104
- package/lib/assets/.claude/skills/orchestrating-development/SKILL.md +168 -168
- package/lib/assets/.claude/skills/orchestrating-operation/SKILL.md +158 -158
- package/lib/assets/.claude/skills/orchestrating-project/SKILL.md +144 -144
- package/lib/assets/.claude/skills/planning-releases/SKILL.md +119 -119
- package/lib/assets/.claude/skills/practicing-getting-start-tdd/SKILL.md +266 -266
- package/lib/assets/.claude/skills/syncing-github-project/SKILL.md +151 -151
- package/lib/assets/.claude/skills/tracking-progress/SKILL.md +91 -91
- package/lib/assets/.claude/skills/validating-iteration-plan/SKILL.md +238 -238
- package/lib/assets/.devcontainer/devcontainer.json +37 -37
- package/lib/assets/.env.example +17 -17
- package/lib/assets/.gitattributes +4 -4
- package/lib/assets/.github/workflows/docker-publish.yml +77 -77
- package/lib/assets/.github/workflows/mkdocs.yml +39 -39
- package/lib/assets/AGENTS.md +94 -94
- package/lib/assets/CLAUDE.md +193 -193
- package/lib/assets/README.md +291 -291
- package/lib/assets/docker-compose.yml +33 -33
- package/lib/assets/docs/adr/index.md +10 -10
- package/lib/assets/docs/article/functional-desgin-ppp/all/01-immutability-and-data-transformation.md +475 -475
- package/lib/assets/docs/article/functional-desgin-ppp/all/02-function-composition.md +519 -519
- package/lib/assets/docs/article/functional-desgin-ppp/all/03-polymorphism.md +537 -537
- package/lib/assets/docs/article/functional-desgin-ppp/all/04-data-validation.md +300 -300
- package/lib/assets/docs/article/functional-desgin-ppp/all/05-property-based-testing.md +320 -320
- package/lib/assets/docs/article/functional-desgin-ppp/all/06-tdd-and-functional.md +498 -498
- package/lib/assets/docs/article/functional-desgin-ppp/all/07-composite-pattern.md +298 -298
- package/lib/assets/docs/article/functional-desgin-ppp/all/08-decorator-pattern.md +291 -291
- package/lib/assets/docs/article/functional-desgin-ppp/all/09-adapter-pattern.md +336 -336
- package/lib/assets/docs/article/functional-desgin-ppp/all/10-strategy-pattern.md +303 -303
- package/lib/assets/docs/article/functional-desgin-ppp/all/11-command-pattern.md +286 -286
- package/lib/assets/docs/article/functional-desgin-ppp/all/12-visitor-pattern.md +322 -322
- package/lib/assets/docs/article/functional-desgin-ppp/all/13-abstract-factory-pattern.md +319 -319
- package/lib/assets/docs/article/functional-desgin-ppp/all/14-abstract-server-pattern.md +365 -365
- package/lib/assets/docs/article/functional-desgin-ppp/all/15-gossiping-bus-drivers.md +156 -156
- package/lib/assets/docs/article/functional-desgin-ppp/all/16-payroll-system.md +178 -178
- package/lib/assets/docs/article/functional-desgin-ppp/all/17-video-rental-system.md +312 -312
- package/lib/assets/docs/article/functional-desgin-ppp/all/18-concurrency-system.md +287 -287
- package/lib/assets/docs/article/functional-desgin-ppp/all/19-wa-tor-simulation.md +286 -286
- package/lib/assets/docs/article/functional-desgin-ppp/all/20-pattern-interactions.md +274 -274
- package/lib/assets/docs/article/functional-desgin-ppp/all/21-best-practices.md +294 -294
- package/lib/assets/docs/article/functional-desgin-ppp/all/22-oo-to-fp-migration.md +337 -337
- package/lib/assets/docs/article/functional-desgin-ppp/all/index.md +388 -388
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/01-immutability-and-data-transformation.md +273 -273
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/02-function-composition.md +380 -380
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/03-polymorphism.md +384 -384
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/04-clojure-spec.md +350 -350
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/05-property-based-testing.md +352 -352
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/06-tdd-in-functional.md +383 -383
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/07-composite-pattern.md +529 -529
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/08-decorator-pattern.md +395 -395
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/09-adapter-pattern.md +399 -399
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/10-strategy-pattern.md +485 -485
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/11-command-pattern.md +566 -566
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/12-visitor-pattern.md +567 -567
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/13-abstract-factory-pattern.md +475 -475
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/14-abstract-server-pattern.md +462 -462
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/15-gossiping-bus-drivers.md +325 -325
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/16-payroll-system.md +401 -401
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/17-video-rental-system.md +450 -450
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/18-concurrency-system.md +475 -475
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/19-wator-simulation.md +739 -739
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/20-pattern-interactions.md +567 -567
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/21-best-practices.md +518 -518
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/22-oo-to-fp-migration.md +532 -532
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/index.md +241 -241
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/01-immutability-and-data-transformation.md +383 -383
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/02-function-composition.md +374 -374
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/03-polymorphism.md +375 -375
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/04-data-validation.md +195 -195
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/05-property-based-testing.md +268 -268
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/06-tdd-and-fp.md +294 -294
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/07-effects-and-pure-functions.md +164 -164
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/08-error-handling-strategies.md +168 -168
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/09-io-and-external-systems.md +254 -254
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/10-concurrency-patterns.md +269 -269
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/11-command-pattern.md +148 -148
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/12-visitor-pattern.md +176 -176
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/13-abstract-factory-pattern.md +604 -604
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/14-abstract-server-pattern.md +729 -729
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/15-gossiping-bus-drivers.md +291 -291
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/16-payroll-system.md +420 -420
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/17-video-rental-system.md +319 -319
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/18-concurrency-system.md +466 -466
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/19-wator-simulation.md +523 -523
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/20-pattern-interactions.md +287 -287
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/21-best-practices.md +340 -340
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/22-oo-to-fp-migration.md +395 -395
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/index.md +248 -248
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/01-immutability-and-data-transformation.md +384 -384
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/02-function-composition.md +452 -452
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/03-polymorphism.md +495 -495
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/04-data-validation.md +416 -416
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/05-property-based-testing.md +382 -382
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/06-tdd-functional.md +687 -687
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/07-composite-pattern.md +442 -442
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/08-decorator-pattern.md +479 -479
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/09-adapter-pattern.md +479 -479
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/10-strategy-pattern.md +427 -427
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/11-command-pattern.md +428 -428
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/12-visitor-pattern.md +339 -339
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/13-abstract-factory-pattern.md +309 -309
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/14-abstract-server-pattern.md +596 -596
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/15-gossiping-bus-drivers.md +355 -355
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/16-payroll-system.md +350 -350
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/17-video-rental-system.md +414 -414
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/18-concurrency-system.md +367 -367
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/19-wator-simulation.md +403 -403
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/20-pattern-interactions.md +291 -291
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/21-best-practices.md +324 -324
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/22-oo-to-fp-migration.md +332 -332
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/index.md +274 -274
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/01-immutability-and-data-transformation.md +298 -298
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/02-function-composition.md +304 -304
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/03-polymorphism.md +362 -362
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/04-data-validation.md +257 -257
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/05-property-based-testing.md +254 -254
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/06-tdd-functional.md +283 -283
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/07-composite-pattern.md +395 -395
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/08-decorator-pattern.md +319 -319
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/09-adapter-pattern.md +382 -382
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/10-strategy-pattern.md +287 -287
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/11-command-pattern.md +303 -303
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/12-visitor-pattern.md +326 -326
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/13-abstract-factory-pattern.md +332 -332
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/14-abstract-server-pattern.md +379 -379
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/15-gossiping-bus-drivers.md +177 -177
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/16-payroll-system.md +219 -219
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/17-video-rental-system.md +244 -244
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/18-concurrency-system.md +363 -363
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/19-wator-simulation.md +438 -438
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/20-pattern-interactions.md +325 -325
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/21-best-practices.md +403 -403
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/22-oo-to-fp-migration.md +469 -469
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/index.md +174 -174
- package/lib/assets/docs/article/functional-desgin-ppp/index.md +90 -90
- package/lib/assets/docs/article/functional-desgin-ppp/rust/01-immutability-and-data-transformation.md +450 -450
- package/lib/assets/docs/article/functional-desgin-ppp/rust/02-function-composition.md +463 -463
- package/lib/assets/docs/article/functional-desgin-ppp/rust/03-polymorphism.md +425 -425
- package/lib/assets/docs/article/functional-desgin-ppp/rust/04-data-validation.md +273 -273
- package/lib/assets/docs/article/functional-desgin-ppp/rust/05-property-based-testing.md +247 -247
- package/lib/assets/docs/article/functional-desgin-ppp/rust/06-tdd-and-functional.md +841 -841
- package/lib/assets/docs/article/functional-desgin-ppp/rust/07-composite-pattern.md +384 -384
- package/lib/assets/docs/article/functional-desgin-ppp/rust/08-decorator-pattern.md +383 -383
- package/lib/assets/docs/article/functional-desgin-ppp/rust/09-adapter-pattern.md +339 -339
- package/lib/assets/docs/article/functional-desgin-ppp/rust/10-strategy-pattern.md +331 -331
- package/lib/assets/docs/article/functional-desgin-ppp/rust/11-command-pattern.md +356 -356
- package/lib/assets/docs/article/functional-desgin-ppp/rust/12-visitor-pattern.md +379 -379
- package/lib/assets/docs/article/functional-desgin-ppp/rust/13-abstract-factory-pattern.md +361 -361
- package/lib/assets/docs/article/functional-desgin-ppp/rust/14-abstract-server-pattern.md +392 -392
- package/lib/assets/docs/article/functional-desgin-ppp/rust/15-gossiping-bus-drivers.md +300 -300
- package/lib/assets/docs/article/functional-desgin-ppp/rust/16-payroll-system.md +297 -297
- package/lib/assets/docs/article/functional-desgin-ppp/rust/17-video-rental-system.md +304 -304
- package/lib/assets/docs/article/functional-desgin-ppp/rust/18-concurrency-system.md +315 -315
- package/lib/assets/docs/article/functional-desgin-ppp/rust/19-wator-simulation.md +311 -311
- package/lib/assets/docs/article/functional-desgin-ppp/rust/20-pattern-interactions.md +304 -304
- package/lib/assets/docs/article/functional-desgin-ppp/rust/21-best-practices.md +336 -336
- package/lib/assets/docs/article/functional-desgin-ppp/rust/22-oo-to-fp-migration.md +349 -349
- package/lib/assets/docs/article/functional-desgin-ppp/rust/index.md +243 -243
- package/lib/assets/docs/article/functional-desgin-ppp/scala/01-immutability-and-data-transformation.md +328 -328
- package/lib/assets/docs/article/functional-desgin-ppp/scala/02-function-composition.md +348 -348
- package/lib/assets/docs/article/functional-desgin-ppp/scala/03-polymorphism.md +357 -357
- package/lib/assets/docs/article/functional-desgin-ppp/scala/04-data-validation.md +364 -364
- package/lib/assets/docs/article/functional-desgin-ppp/scala/05-property-based-testing.md +515 -515
- package/lib/assets/docs/article/functional-desgin-ppp/scala/06-tdd-functional.md +557 -557
- package/lib/assets/docs/article/functional-desgin-ppp/scala/07-composite-pattern.md +363 -363
- package/lib/assets/docs/article/functional-desgin-ppp/scala/08-decorator-pattern.md +327 -327
- package/lib/assets/docs/article/functional-desgin-ppp/scala/09-adapter-pattern.md +517 -517
- package/lib/assets/docs/article/functional-desgin-ppp/scala/10-strategy-pattern.md +441 -441
- package/lib/assets/docs/article/functional-desgin-ppp/scala/11-command-pattern.md +407 -407
- package/lib/assets/docs/article/functional-desgin-ppp/scala/12-visitor-pattern.md +379 -379
- package/lib/assets/docs/article/functional-desgin-ppp/scala/13-abstract-factory-pattern.md +398 -398
- package/lib/assets/docs/article/functional-desgin-ppp/scala/14-abstract-server-pattern.md +476 -476
- package/lib/assets/docs/article/functional-desgin-ppp/scala/15-gossiping-bus-drivers.md +391 -391
- package/lib/assets/docs/article/functional-desgin-ppp/scala/16-payroll-system.md +342 -342
- package/lib/assets/docs/article/functional-desgin-ppp/scala/17-video-rental-system.md +324 -324
- package/lib/assets/docs/article/functional-desgin-ppp/scala/18-concurrency-system.md +730 -730
- package/lib/assets/docs/article/functional-desgin-ppp/scala/19-wator-simulation.md +624 -624
- package/lib/assets/docs/article/functional-desgin-ppp/scala/20-pattern-interactions.md +512 -512
- package/lib/assets/docs/article/functional-desgin-ppp/scala/21-best-practices.md +433 -433
- package/lib/assets/docs/article/functional-desgin-ppp/scala/22-oo-to-fp-migration.md +688 -688
- package/lib/assets/docs/article/functional-desgin-ppp/scala/index.md +243 -243
- package/lib/assets/docs/article/getting-start-docker-kubernetes/01-container-and-docker-basics.md +332 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/02-container-deployment.md +776 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/03-practical-container-build-deploy.md +457 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/04-multi-container-application.md +869 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/05-kubernetes-introduction.md +576 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/06-kubernetes-deploy-cluster.md +611 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/07-kubernetes-advanced.md +612 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/08-kubernetes-packaging.md +509 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/09-container-operations.md +537 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/10-optimal-container-image.md +631 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/11-continuous-delivery.md +598 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/12-container-use-cases.md +454 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/13-case-monolith-compose-vs-kustomize.md +337 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/14-case-event-driven-kustomize-vs-helm.md +315 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/15-case-escqrs-axon-kustomize-vs-helm.md +288 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/16-case-escqrs-kafka-kustomize-vs-helm.md +247 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/17-case-comparison-summary.md +132 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/18-case-load-testing.md +294 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/appendix-a-dev-tools-setup.md +265 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/appendix-b-orchestration-environments.md +521 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/appendix-c-tips.md +510 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-01-comic.png +0 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-02-comic.png +0 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-03-comic.png +0 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-04-comic.png +0 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-05-comic.png +0 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-06-comic.png +0 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-07-comic.png +0 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-08-comic.png +0 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-09-comic.png +0 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-10-comic.png +0 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-11-comic.png +0 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-12-comic.png +0 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/images/overview-comic.png +0 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/index.md +82 -0
- package/lib/assets/docs/article/getting-start-docker-kubernetes/outline.md +211 -0
- package/lib/assets/docs/article/getting-start-tdd/clojure/01-todo-list-and-first-test.md +166 -166
- package/lib/assets/docs/article/getting-start-tdd/clojure/02-fake-it-and-triangulation.md +162 -162
- package/lib/assets/docs/article/getting-start-tdd/clojure/03-obvious-implementation-and-refactoring.md +135 -135
- package/lib/assets/docs/article/getting-start-tdd/clojure/04-version-control-and-conventional-commits.md +88 -88
- package/lib/assets/docs/article/getting-start-tdd/clojure/05-package-management-and-static-analysis.md +299 -299
- package/lib/assets/docs/article/getting-start-tdd/clojure/06-task-runner-and-ci-cd.md +241 -241
- package/lib/assets/docs/article/getting-start-tdd/clojure/07-protocols-and-records.md +131 -131
- package/lib/assets/docs/article/getting-start-tdd/clojure/08-multimethods-and-design-patterns.md +130 -130
- package/lib/assets/docs/article/getting-start-tdd/clojure/09-namespaces-and-module-design.md +127 -127
- package/lib/assets/docs/article/getting-start-tdd/clojure/10-higher-order-functions-and-composition.md +114 -114
- package/lib/assets/docs/article/getting-start-tdd/clojure/11-persistent-data-and-pipeline.md +138 -138
- package/lib/assets/docs/article/getting-start-tdd/clojure/12-error-handling-and-spec.md +161 -161
- package/lib/assets/docs/article/getting-start-tdd/clojure/index.md +65 -65
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter01.md +232 -232
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter02.md +244 -244
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter03.md +202 -202
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter04.md +92 -92
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter05.md +256 -256
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter06.md +195 -195
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter07.md +214 -214
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter08.md +249 -249
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter09.md +174 -174
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter10.md +166 -166
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter11.md +192 -192
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter12.md +211 -211
- package/lib/assets/docs/article/getting-start-tdd/csharp/index.md +83 -83
- package/lib/assets/docs/article/getting-start-tdd/elixir/01-todo-list-and-first-test.md +87 -87
- package/lib/assets/docs/article/getting-start-tdd/elixir/02-fake-it-and-triangulation.md +95 -95
- package/lib/assets/docs/article/getting-start-tdd/elixir/03-obvious-implementation-and-refactoring.md +109 -109
- package/lib/assets/docs/article/getting-start-tdd/elixir/04-version-control-and-conventional-commits.md +96 -96
- package/lib/assets/docs/article/getting-start-tdd/elixir/05-package-management-and-static-analysis.md +88 -88
- package/lib/assets/docs/article/getting-start-tdd/elixir/06-task-runner-and-ci-cd.md +71 -71
- package/lib/assets/docs/article/getting-start-tdd/elixir/07-structs-and-protocols.md +110 -110
- package/lib/assets/docs/article/getting-start-tdd/elixir/08-pattern-matching-and-guards.md +108 -108
- package/lib/assets/docs/article/getting-start-tdd/elixir/09-module-design-and-behaviours.md +104 -104
- package/lib/assets/docs/article/getting-start-tdd/elixir/10-higher-order-functions-and-pipeline.md +178 -178
- package/lib/assets/docs/article/getting-start-tdd/elixir/11-stream-and-lazy-evaluation.md +142 -142
- package/lib/assets/docs/article/getting-start-tdd/elixir/12-error-handling-and-with.md +145 -145
- package/lib/assets/docs/article/getting-start-tdd/elixir/index.md +35 -35
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter01.md +202 -202
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter02.md +246 -246
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter03.md +218 -218
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter04.md +179 -179
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter05.md +267 -267
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter06.md +190 -190
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter07.md +161 -161
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter08.md +175 -175
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter09.md +222 -222
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter10.md +189 -189
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter11.md +212 -212
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter12.md +215 -215
- package/lib/assets/docs/article/getting-start-tdd/fsharp/index.md +71 -71
- package/lib/assets/docs/article/getting-start-tdd/go/01-todo-list-and-first-test.md +213 -213
- package/lib/assets/docs/article/getting-start-tdd/go/02-fake-it-and-triangulation.md +302 -302
- package/lib/assets/docs/article/getting-start-tdd/go/03-obvious-implementation-and-refactoring.md +339 -339
- package/lib/assets/docs/article/getting-start-tdd/go/04-version-control-and-conventional-commits.md +112 -112
- package/lib/assets/docs/article/getting-start-tdd/go/05-package-management-and-static-analysis.md +272 -272
- package/lib/assets/docs/article/getting-start-tdd/go/06-task-runner-and-ci-cd.md +233 -233
- package/lib/assets/docs/article/getting-start-tdd/go/07-encapsulation-and-polymorphism.md +394 -394
- package/lib/assets/docs/article/getting-start-tdd/go/08-design-patterns.md +422 -422
- package/lib/assets/docs/article/getting-start-tdd/go/09-solid-principles-and-module-design.md +400 -400
- package/lib/assets/docs/article/getting-start-tdd/go/10-higher-order-functions-and-composition.md +226 -226
- package/lib/assets/docs/article/getting-start-tdd/go/11-immutable-data-and-pipeline.md +296 -296
- package/lib/assets/docs/article/getting-start-tdd/go/12-error-handling-and-type-safety.md +411 -411
- package/lib/assets/docs/article/getting-start-tdd/go/index.md +83 -83
- package/lib/assets/docs/article/getting-start-tdd/haskell/01-todo-list-and-first-test.md +279 -279
- package/lib/assets/docs/article/getting-start-tdd/haskell/02-fake-it-and-triangulation.md +337 -337
- package/lib/assets/docs/article/getting-start-tdd/haskell/03-obvious-implementation-and-refactoring.md +257 -257
- package/lib/assets/docs/article/getting-start-tdd/haskell/04-version-control-and-conventional-commits.md +182 -182
- package/lib/assets/docs/article/getting-start-tdd/haskell/05-package-management-and-static-analysis.md +313 -313
- package/lib/assets/docs/article/getting-start-tdd/haskell/06-task-runner-and-ci-cd.md +309 -309
- package/lib/assets/docs/article/getting-start-tdd/haskell/07-algebraic-data-types-and-type-classes.md +412 -412
- package/lib/assets/docs/article/getting-start-tdd/haskell/08-pattern-matching-and-guards.md +390 -390
- package/lib/assets/docs/article/getting-start-tdd/haskell/09-module-design-and-smart-constructors.md +461 -461
- package/lib/assets/docs/article/getting-start-tdd/haskell/10-higher-order-functions-and-currying.md +434 -434
- package/lib/assets/docs/article/getting-start-tdd/haskell/11-function-composition-and-point-free.md +392 -392
- package/lib/assets/docs/article/getting-start-tdd/haskell/12-monad-and-error-handling.md +631 -631
- package/lib/assets/docs/article/getting-start-tdd/haskell/index.md +49 -49
- package/lib/assets/docs/article/getting-start-tdd/index.md +93 -93
- package/lib/assets/docs/article/getting-start-tdd/integration/01-language-overview.md +375 -375
- package/lib/assets/docs/article/getting-start-tdd/integration/02-test-framework-comparison.md +349 -349
- package/lib/assets/docs/article/getting-start-tdd/integration/03-tdd-pattern-comparison.md +445 -445
- package/lib/assets/docs/article/getting-start-tdd/integration/04-type-system-comparison.md +409 -409
- package/lib/assets/docs/article/getting-start-tdd/integration/05-dev-environment-comparison.md +330 -330
- package/lib/assets/docs/article/getting-start-tdd/integration/06-learning-roadmap.md +290 -290
- package/lib/assets/docs/article/getting-start-tdd/integration/index.md +69 -69
- package/lib/assets/docs/article/getting-start-tdd/java/01-todo-list-and-first-test.md +234 -234
- package/lib/assets/docs/article/getting-start-tdd/java/02-fake-it-and-triangulation.md +261 -261
- package/lib/assets/docs/article/getting-start-tdd/java/03-obvious-implementation-and-refactoring.md +185 -185
- package/lib/assets/docs/article/getting-start-tdd/java/04-version-control-and-conventional-commits.md +115 -115
- package/lib/assets/docs/article/getting-start-tdd/java/05-package-management-and-static-analysis.md +382 -382
- package/lib/assets/docs/article/getting-start-tdd/java/06-task-runner-and-ci-cd.md +272 -272
- package/lib/assets/docs/article/getting-start-tdd/java/07-encapsulation-and-polymorphism.md +626 -626
- package/lib/assets/docs/article/getting-start-tdd/java/08-design-patterns.md +393 -393
- package/lib/assets/docs/article/getting-start-tdd/java/09-solid-principles-and-module-design.md +310 -310
- package/lib/assets/docs/article/getting-start-tdd/java/10-higher-order-functions-and-composition.md +188 -188
- package/lib/assets/docs/article/getting-start-tdd/java/11-immutable-data-and-pipeline.md +167 -167
- package/lib/assets/docs/article/getting-start-tdd/java/12-error-handling-and-type-safety.md +205 -205
- package/lib/assets/docs/article/getting-start-tdd/java/index.md +61 -61
- package/lib/assets/docs/article/getting-start-tdd/node/01-todo-list-and-first-test.md +244 -244
- package/lib/assets/docs/article/getting-start-tdd/node/02-fake-it-and-triangulation.md +262 -262
- package/lib/assets/docs/article/getting-start-tdd/node/03-obvious-implementation-and-refactoring.md +169 -169
- package/lib/assets/docs/article/getting-start-tdd/node/04-version-control-and-conventional-commits.md +112 -112
- package/lib/assets/docs/article/getting-start-tdd/node/05-package-management-and-static-analysis.md +314 -314
- package/lib/assets/docs/article/getting-start-tdd/node/06-task-runner-and-ci-cd.md +235 -235
- package/lib/assets/docs/article/getting-start-tdd/node/07-encapsulation-and-polymorphism.md +327 -327
- package/lib/assets/docs/article/getting-start-tdd/node/08-design-patterns.md +322 -322
- package/lib/assets/docs/article/getting-start-tdd/node/09-solid-principles-and-module-design.md +285 -285
- package/lib/assets/docs/article/getting-start-tdd/node/10-higher-order-functions-and-composition.md +199 -199
- package/lib/assets/docs/article/getting-start-tdd/node/11-immutable-data-and-pipeline.md +207 -207
- package/lib/assets/docs/article/getting-start-tdd/node/12-error-handling-and-type-safety.md +295 -295
- package/lib/assets/docs/article/getting-start-tdd/node/index.md +56 -56
- package/lib/assets/docs/article/getting-start-tdd/php/01-todo-list-and-first-test.md +259 -259
- package/lib/assets/docs/article/getting-start-tdd/php/02-fake-it-and-triangulation.md +200 -200
- package/lib/assets/docs/article/getting-start-tdd/php/03-obvious-implementation-and-refactoring.md +248 -248
- package/lib/assets/docs/article/getting-start-tdd/php/04-version-control-and-conventional-commits.md +141 -141
- package/lib/assets/docs/article/getting-start-tdd/php/05-package-management-and-static-analysis.md +410 -410
- package/lib/assets/docs/article/getting-start-tdd/php/06-task-runner-and-ci-cd.md +321 -321
- package/lib/assets/docs/article/getting-start-tdd/php/07-encapsulation-and-polymorphism.md +372 -372
- package/lib/assets/docs/article/getting-start-tdd/php/08-design-patterns.md +453 -453
- package/lib/assets/docs/article/getting-start-tdd/php/09-solid-principles-and-module-design.md +460 -460
- package/lib/assets/docs/article/getting-start-tdd/php/10-higher-order-functions-and-composition.md +182 -182
- package/lib/assets/docs/article/getting-start-tdd/php/11-immutable-data-and-pipeline.md +266 -266
- package/lib/assets/docs/article/getting-start-tdd/php/12-error-handling-and-type-safety.md +308 -308
- package/lib/assets/docs/article/getting-start-tdd/php/index.md +84 -84
- package/lib/assets/docs/article/getting-start-tdd/python/01-todo-list-and-first-test.md +201 -201
- package/lib/assets/docs/article/getting-start-tdd/python/02-fake-it-and-triangulation.md +247 -247
- package/lib/assets/docs/article/getting-start-tdd/python/03-obvious-implementation-and-refactoring.md +199 -199
- package/lib/assets/docs/article/getting-start-tdd/python/04-version-control-and-conventional-commits.md +87 -87
- package/lib/assets/docs/article/getting-start-tdd/python/05-package-management-and-static-analysis.md +274 -274
- package/lib/assets/docs/article/getting-start-tdd/python/06-task-runner-and-ci-cd.md +190 -190
- package/lib/assets/docs/article/getting-start-tdd/python/07-encapsulation-and-polymorphism.md +208 -208
- package/lib/assets/docs/article/getting-start-tdd/python/08-design-patterns.md +172 -172
- package/lib/assets/docs/article/getting-start-tdd/python/09-solid-principles-and-module-design.md +130 -130
- package/lib/assets/docs/article/getting-start-tdd/python/10-higher-order-functions-and-composition.md +122 -122
- package/lib/assets/docs/article/getting-start-tdd/python/11-immutable-data-and-pipeline.md +116 -116
- package/lib/assets/docs/article/getting-start-tdd/python/12-error-handling-and-type-safety.md +126 -126
- package/lib/assets/docs/article/getting-start-tdd/python/index.md +55 -55
- package/lib/assets/docs/article/getting-start-tdd/ruby/01-todo-list-and-first-test.md +231 -231
- package/lib/assets/docs/article/getting-start-tdd/ruby/02-fake-it-and-triangulation.md +238 -238
- package/lib/assets/docs/article/getting-start-tdd/ruby/03-obvious-implementation-and-refactoring.md +228 -228
- package/lib/assets/docs/article/getting-start-tdd/ruby/04-version-control-and-conventional-commits.md +112 -112
- package/lib/assets/docs/article/getting-start-tdd/ruby/05-package-management-and-static-analysis.md +287 -287
- package/lib/assets/docs/article/getting-start-tdd/ruby/06-task-runner-and-ci-cd.md +248 -248
- package/lib/assets/docs/article/getting-start-tdd/ruby/07-encapsulation-and-polymorphism.md +279 -279
- package/lib/assets/docs/article/getting-start-tdd/ruby/08-design-patterns.md +329 -329
- package/lib/assets/docs/article/getting-start-tdd/ruby/09-solid-principles-and-module-design.md +196 -196
- package/lib/assets/docs/article/getting-start-tdd/ruby/10-higher-order-functions-and-composition.md +175 -175
- package/lib/assets/docs/article/getting-start-tdd/ruby/11-immutable-data-and-pipeline.md +237 -237
- package/lib/assets/docs/article/getting-start-tdd/ruby/12-error-handling-and-type-safety.md +398 -398
- package/lib/assets/docs/article/getting-start-tdd/ruby/index.md +83 -83
- package/lib/assets/docs/article/getting-start-tdd/rust/01-todo-list-and-first-test.md +211 -211
- package/lib/assets/docs/article/getting-start-tdd/rust/02-fake-it-and-triangulation.md +264 -264
- package/lib/assets/docs/article/getting-start-tdd/rust/03-obvious-implementation-and-refactoring.md +233 -233
- package/lib/assets/docs/article/getting-start-tdd/rust/04-version-control-and-conventional-commits.md +92 -92
- package/lib/assets/docs/article/getting-start-tdd/rust/05-package-management-and-static-analysis.md +212 -212
- package/lib/assets/docs/article/getting-start-tdd/rust/06-task-runner-and-ci-cd.md +164 -164
- package/lib/assets/docs/article/getting-start-tdd/rust/07-encapsulation-and-polymorphism.md +142 -142
- package/lib/assets/docs/article/getting-start-tdd/rust/08-design-patterns.md +145 -145
- package/lib/assets/docs/article/getting-start-tdd/rust/09-solid-principles-and-module-design.md +110 -110
- package/lib/assets/docs/article/getting-start-tdd/rust/10-higher-order-functions-and-composition.md +94 -94
- package/lib/assets/docs/article/getting-start-tdd/rust/11-immutable-data-and-pipeline.md +105 -105
- package/lib/assets/docs/article/getting-start-tdd/rust/12-error-handling-and-type-safety.md +112 -112
- package/lib/assets/docs/article/getting-start-tdd/rust/index.md +83 -83
- package/lib/assets/docs/article/getting-start-tdd/scala/01-todo-list-and-first-test.md +111 -111
- package/lib/assets/docs/article/getting-start-tdd/scala/02-fake-it-and-triangulation.md +107 -107
- package/lib/assets/docs/article/getting-start-tdd/scala/03-obvious-implementation-and-refactoring.md +99 -99
- package/lib/assets/docs/article/getting-start-tdd/scala/04-version-control-and-conventional-commits.md +123 -123
- package/lib/assets/docs/article/getting-start-tdd/scala/05-package-management-and-static-analysis.md +196 -196
- package/lib/assets/docs/article/getting-start-tdd/scala/06-task-runner-and-ci-cd.md +186 -186
- package/lib/assets/docs/article/getting-start-tdd/scala/07-case-classes-and-traits.md +139 -139
- package/lib/assets/docs/article/getting-start-tdd/scala/08-pattern-matching-and-sealed-traits.md +106 -106
- package/lib/assets/docs/article/getting-start-tdd/scala/09-packages-and-module-design.md +75 -75
- package/lib/assets/docs/article/getting-start-tdd/scala/10-higher-order-functions-and-composition.md +104 -104
- package/lib/assets/docs/article/getting-start-tdd/scala/11-collections-and-lazy-evaluation.md +94 -94
- package/lib/assets/docs/article/getting-start-tdd/scala/12-error-handling-and-type-safety.md +92 -92
- package/lib/assets/docs/article/getting-start-tdd/scala/index.md +65 -65
- package/lib/assets/docs/article/grokking-concurrency/all/index.md +404 -404
- package/lib/assets/docs/article/grokking-concurrency/all/part-1-ch02-sequential.md +554 -554
- package/lib/assets/docs/article/grokking-concurrency/all/part-2-ch04-05-threads.md +469 -469
- package/lib/assets/docs/article/grokking-concurrency/all/part-3-ch06-multitasking.md +520 -520
- package/lib/assets/docs/article/grokking-concurrency/all/part-4-ch07-parallel-patterns.md +420 -420
- package/lib/assets/docs/article/grokking-concurrency/all/part-5-ch08-09-synchronization.md +510 -510
- package/lib/assets/docs/article/grokking-concurrency/all/part-6-ch10-11-nonblocking-io.md +435 -435
- package/lib/assets/docs/article/grokking-concurrency/all/part-7-ch12-async.md +465 -465
- package/lib/assets/docs/article/grokking-concurrency/all/part-8-ch13-mapreduce.md +377 -377
- package/lib/assets/docs/article/grokking-concurrency/clojure/index.md +116 -116
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-1.md +108 -108
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-2.md +101 -101
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-3.md +122 -122
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-4.md +123 -123
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-5.md +118 -118
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-6.md +89 -89
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-7.md +100 -100
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-8.md +120 -120
- package/lib/assets/docs/article/grokking-concurrency/csharp/index.md +101 -101
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-1.md +97 -97
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-2.md +123 -123
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-3.md +101 -101
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-4.md +112 -112
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-5.md +99 -99
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-6.md +61 -61
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-7.md +84 -84
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-8.md +92 -92
- package/lib/assets/docs/article/grokking-concurrency/fsharp/index.md +65 -65
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-1.md +80 -80
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-2.md +103 -103
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-3.md +94 -94
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-4.md +110 -110
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-5.md +104 -104
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-6.md +93 -93
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-7.md +121 -121
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-8.md +107 -107
- package/lib/assets/docs/article/grokking-concurrency/haskell/index.md +248 -248
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-1.md +96 -96
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-2.md +96 -96
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-3.md +91 -91
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-4.md +106 -106
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-5.md +99 -99
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-6.md +95 -95
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-7.md +111 -111
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-8.md +118 -118
- package/lib/assets/docs/article/grokking-concurrency/index.md +66 -66
- package/lib/assets/docs/article/grokking-concurrency/java/index.md +102 -102
- package/lib/assets/docs/article/grokking-concurrency/java/part-1.md +308 -308
- package/lib/assets/docs/article/grokking-concurrency/java/part-2.md +334 -334
- package/lib/assets/docs/article/grokking-concurrency/java/part-3.md +221 -221
- package/lib/assets/docs/article/grokking-concurrency/java/part-4.md +213 -213
- package/lib/assets/docs/article/grokking-concurrency/java/part-5.md +112 -112
- package/lib/assets/docs/article/grokking-concurrency/java/part-6.md +69 -69
- package/lib/assets/docs/article/grokking-concurrency/java/part-7.md +101 -101
- package/lib/assets/docs/article/grokking-concurrency/java/part-8.md +101 -101
- package/lib/assets/docs/article/grokking-concurrency/python/index.md +313 -313
- package/lib/assets/docs/article/grokking-concurrency/python/part-1.md +239 -239
- package/lib/assets/docs/article/grokking-concurrency/python/part-2.md +418 -418
- package/lib/assets/docs/article/grokking-concurrency/python/part-3.md +227 -227
- package/lib/assets/docs/article/grokking-concurrency/python/part-4.md +299 -299
- package/lib/assets/docs/article/grokking-concurrency/python/part-5.md +315 -315
- package/lib/assets/docs/article/grokking-concurrency/python/part-6.md +297 -297
- package/lib/assets/docs/article/grokking-concurrency/python/part-7.md +314 -314
- package/lib/assets/docs/article/grokking-concurrency/python/part-8.md +360 -360
- package/lib/assets/docs/article/grokking-concurrency/rust/index.md +270 -270
- package/lib/assets/docs/article/grokking-concurrency/rust/part-1.md +108 -108
- package/lib/assets/docs/article/grokking-concurrency/rust/part-2.md +120 -120
- package/lib/assets/docs/article/grokking-concurrency/rust/part-3.md +126 -126
- package/lib/assets/docs/article/grokking-concurrency/rust/part-4.md +175 -175
- package/lib/assets/docs/article/grokking-concurrency/rust/part-5.md +158 -158
- package/lib/assets/docs/article/grokking-concurrency/rust/part-6.md +94 -94
- package/lib/assets/docs/article/grokking-concurrency/rust/part-7.md +133 -133
- package/lib/assets/docs/article/grokking-concurrency/rust/part-8.md +155 -155
- package/lib/assets/docs/article/grokking-concurrency/scala/index.md +69 -69
- package/lib/assets/docs/article/grokking-concurrency/scala/part-1.md +78 -78
- package/lib/assets/docs/article/grokking-concurrency/scala/part-2.md +112 -112
- package/lib/assets/docs/article/grokking-concurrency/scala/part-3.md +93 -93
- package/lib/assets/docs/article/grokking-concurrency/scala/part-4.md +110 -110
- package/lib/assets/docs/article/grokking-concurrency/scala/part-5.md +119 -119
- package/lib/assets/docs/article/grokking-concurrency/scala/part-6.md +83 -83
- package/lib/assets/docs/article/grokking-concurrency/scala/part-7.md +131 -131
- package/lib/assets/docs/article/grokking-concurrency/scala/part-8.md +129 -129
- package/lib/assets/docs/article/grokkingfp/all/index.md +368 -368
- package/lib/assets/docs/article/grokkingfp/all/part-1-ch01-fp-introduction.md +530 -530
- package/lib/assets/docs/article/grokkingfp/all/part-1-ch02-pure-functions.md +923 -923
- package/lib/assets/docs/article/grokkingfp/all/part-2-ch03-immutable-data.md +1128 -1128
- package/lib/assets/docs/article/grokkingfp/all/part-2-ch04-higher-order-functions.md +1104 -1104
- package/lib/assets/docs/article/grokkingfp/all/part-2-ch05-flatmap.md +1026 -1026
- package/lib/assets/docs/article/grokkingfp/all/part-3-ch06-option.md +785 -785
- package/lib/assets/docs/article/grokkingfp/all/part-3-ch07-either-adt.md +871 -871
- package/lib/assets/docs/article/grokkingfp/all/part-4-ch08-io-monad.md +972 -972
- package/lib/assets/docs/article/grokkingfp/all/part-4-ch09-streams.md +926 -926
- package/lib/assets/docs/article/grokkingfp/all/part-5-ch10-concurrency.md +870 -870
- package/lib/assets/docs/article/grokkingfp/all/part-6-ch11-application.md +715 -715
- package/lib/assets/docs/article/grokkingfp/all/part-6-ch12-testing.md +626 -626
- package/lib/assets/docs/article/grokkingfp/all/writing-plan.md +712 -712
- package/lib/assets/docs/article/grokkingfp/clojure/index.md +276 -276
- package/lib/assets/docs/article/grokkingfp/clojure/part-1.md +667 -667
- package/lib/assets/docs/article/grokkingfp/clojure/part-2.md +643 -643
- package/lib/assets/docs/article/grokkingfp/clojure/part-3.md +620 -620
- package/lib/assets/docs/article/grokkingfp/clojure/part-4.md +697 -697
- package/lib/assets/docs/article/grokkingfp/clojure/part-5.md +751 -751
- package/lib/assets/docs/article/grokkingfp/clojure/part-6.md +721 -721
- package/lib/assets/docs/article/grokkingfp/csharp/index.md +246 -246
- package/lib/assets/docs/article/grokkingfp/csharp/part-1.md +811 -811
- package/lib/assets/docs/article/grokkingfp/csharp/part-2.md +971 -971
- package/lib/assets/docs/article/grokkingfp/csharp/part-3.md +981 -981
- package/lib/assets/docs/article/grokkingfp/csharp/part-4.md +949 -949
- package/lib/assets/docs/article/grokkingfp/csharp/part-5.md +947 -947
- package/lib/assets/docs/article/grokkingfp/csharp/part-6.md +739 -739
- package/lib/assets/docs/article/grokkingfp/elixir/index.md +203 -203
- package/lib/assets/docs/article/grokkingfp/elixir/part-1.md +712 -712
- package/lib/assets/docs/article/grokkingfp/elixir/part-2.md +838 -838
- package/lib/assets/docs/article/grokkingfp/elixir/part-3.md +985 -985
- package/lib/assets/docs/article/grokkingfp/elixir/part-4.md +974 -974
- package/lib/assets/docs/article/grokkingfp/elixir/part-5.md +1286 -1286
- package/lib/assets/docs/article/grokkingfp/elixir/part-6.md +1049 -1049
- package/lib/assets/docs/article/grokkingfp/fsharp/index.md +210 -210
- package/lib/assets/docs/article/grokkingfp/fsharp/part-1.md +714 -714
- package/lib/assets/docs/article/grokkingfp/fsharp/part-2.md +961 -961
- package/lib/assets/docs/article/grokkingfp/fsharp/part-3.md +972 -972
- package/lib/assets/docs/article/grokkingfp/fsharp/part-4.md +832 -832
- package/lib/assets/docs/article/grokkingfp/fsharp/part-5.md +911 -911
- package/lib/assets/docs/article/grokkingfp/fsharp/part-6.md +922 -922
- package/lib/assets/docs/article/grokkingfp/haskell/index.md +234 -234
- package/lib/assets/docs/article/grokkingfp/haskell/part-1.md +591 -591
- package/lib/assets/docs/article/grokkingfp/haskell/part-2.md +866 -866
- package/lib/assets/docs/article/grokkingfp/haskell/part-3.md +915 -915
- package/lib/assets/docs/article/grokkingfp/haskell/part-4.md +878 -878
- package/lib/assets/docs/article/grokkingfp/haskell/part-5.md +845 -845
- package/lib/assets/docs/article/grokkingfp/haskell/part-6.md +844 -844
- package/lib/assets/docs/article/grokkingfp/index.md +143 -143
- package/lib/assets/docs/article/grokkingfp/java/index.md +211 -211
- package/lib/assets/docs/article/grokkingfp/java/part-1.md +648 -648
- package/lib/assets/docs/article/grokkingfp/java/part-2.md +675 -675
- package/lib/assets/docs/article/grokkingfp/java/part-3.md +672 -672
- package/lib/assets/docs/article/grokkingfp/java/part-4.md +771 -771
- package/lib/assets/docs/article/grokkingfp/java/part-5.md +959 -959
- package/lib/assets/docs/article/grokkingfp/java/part-6.md +1328 -1328
- package/lib/assets/docs/article/grokkingfp/python/index.md +258 -258
- package/lib/assets/docs/article/grokkingfp/python/part-1.md +443 -443
- package/lib/assets/docs/article/grokkingfp/python/part-2.md +958 -958
- package/lib/assets/docs/article/grokkingfp/python/part-3.md +1004 -1004
- package/lib/assets/docs/article/grokkingfp/python/part-4.md +765 -765
- package/lib/assets/docs/article/grokkingfp/python/part-5.md +747 -747
- package/lib/assets/docs/article/grokkingfp/python/part-6.md +861 -861
- package/lib/assets/docs/article/grokkingfp/ruby/index.md +330 -330
- package/lib/assets/docs/article/grokkingfp/ruby/part-1.md +755 -755
- package/lib/assets/docs/article/grokkingfp/ruby/part-2.md +938 -938
- package/lib/assets/docs/article/grokkingfp/ruby/part-3.md +946 -946
- package/lib/assets/docs/article/grokkingfp/ruby/part-4.md +921 -921
- package/lib/assets/docs/article/grokkingfp/ruby/part-5.md +908 -908
- package/lib/assets/docs/article/grokkingfp/ruby/part-6.md +1412 -1412
- package/lib/assets/docs/article/grokkingfp/rust/index.md +242 -242
- package/lib/assets/docs/article/grokkingfp/rust/part-1.md +634 -634
- package/lib/assets/docs/article/grokkingfp/rust/part-2.md +1060 -1060
- package/lib/assets/docs/article/grokkingfp/rust/part-3.md +994 -994
- package/lib/assets/docs/article/grokkingfp/rust/part-4.md +573 -573
- package/lib/assets/docs/article/grokkingfp/rust/part-5.md +705 -705
- package/lib/assets/docs/article/grokkingfp/rust/part-6.md +508 -508
- package/lib/assets/docs/article/grokkingfp/scala/index.md +171 -171
- package/lib/assets/docs/article/grokkingfp/scala/part-1.md +543 -543
- package/lib/assets/docs/article/grokkingfp/scala/part-2.md +946 -946
- package/lib/assets/docs/article/grokkingfp/scala/part-3.md +919 -919
- package/lib/assets/docs/article/grokkingfp/scala/part-4.md +742 -742
- package/lib/assets/docs/article/grokkingfp/scala/part-5.md +722 -722
- package/lib/assets/docs/article/grokkingfp/scala/part-6.md +867 -867
- package/lib/assets/docs/article/grokkingfp/typescript/index.md +273 -273
- package/lib/assets/docs/article/grokkingfp/typescript/part-1.md +561 -561
- package/lib/assets/docs/article/grokkingfp/typescript/part-2.md +1129 -1129
- package/lib/assets/docs/article/grokkingfp/typescript/part-3.md +842 -842
- package/lib/assets/docs/article/grokkingfp/typescript/part-4.md +1087 -1087
- package/lib/assets/docs/article/grokkingfp/typescript/part-5.md +717 -717
- package/lib/assets/docs/article/grokkingfp/typescript/part-6.md +982 -982
- package/lib/assets/docs/article/index.md +41 -39
- package/lib/assets/docs/article/practical-database-design/index.md +121 -121
- package/lib/assets/docs/article/practical-database-design/part1/chapter01.md +288 -288
- package/lib/assets/docs/article/practical-database-design/part1/chapter02.md +518 -518
- package/lib/assets/docs/article/practical-database-design/part1/chapter03.md +557 -557
- package/lib/assets/docs/article/practical-database-design/part2/chapter04.md +924 -924
- package/lib/assets/docs/article/practical-database-design/part2/chapter05.md +1627 -1627
- package/lib/assets/docs/article/practical-database-design/part2/chapter06.md +2716 -2716
- package/lib/assets/docs/article/practical-database-design/part2/chapter07.md +2082 -2082
- package/lib/assets/docs/article/practical-database-design/part2/chapter08.md +2105 -2105
- package/lib/assets/docs/article/practical-database-design/part2/chapter09.md +2031 -2031
- package/lib/assets/docs/article/practical-database-design/part2/chapter10.md +1387 -1387
- package/lib/assets/docs/article/practical-database-design/part2/chapter11.md +1677 -1677
- package/lib/assets/docs/article/practical-database-design/part2/chapter12.md +1417 -1417
- package/lib/assets/docs/article/practical-database-design/part2/chapter13.md +1434 -1434
- package/lib/assets/docs/article/practical-database-design/part3/chapter14.md +667 -667
- package/lib/assets/docs/article/practical-database-design/part3/chapter15.md +1625 -1625
- package/lib/assets/docs/article/practical-database-design/part3/chapter16.md +1915 -1915
- package/lib/assets/docs/article/practical-database-design/part3/chapter17.md +1708 -1708
- package/lib/assets/docs/article/practical-database-design/part3/chapter18.md +2095 -2095
- package/lib/assets/docs/article/practical-database-design/part3/chapter19.md +1123 -1123
- package/lib/assets/docs/article/practical-database-design/part3/chapter20.md +1031 -1031
- package/lib/assets/docs/article/practical-database-design/part3/chapter21.md +1382 -1382
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter14-orm.md +991 -991
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter15-orm.md +1300 -1300
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter16-orm.md +1166 -1166
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter17-orm.md +1584 -1584
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter18-orm.md +1183 -1183
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter19-orm.md +1016 -1016
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter20-orm.md +1753 -1753
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter21-orm.md +1447 -1447
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter22-orm.md +1878 -1878
- package/lib/assets/docs/article/practical-database-design/part4/chapter22.md +965 -965
- package/lib/assets/docs/article/practical-database-design/part4/chapter23.md +2069 -2069
- package/lib/assets/docs/article/practical-database-design/part4/chapter24.md +2439 -2439
- package/lib/assets/docs/article/practical-database-design/part4/chapter25.md +3661 -3661
- package/lib/assets/docs/article/practical-database-design/part4/chapter26.md +2916 -2916
- package/lib/assets/docs/article/practical-database-design/part4/chapter27.md +3105 -3105
- package/lib/assets/docs/article/practical-database-design/part4/chapter28.md +2697 -2697
- package/lib/assets/docs/article/practical-database-design/part4/chapter29.md +2544 -2544
- package/lib/assets/docs/article/practical-database-design/part4/chapter30.md +2180 -2180
- package/lib/assets/docs/article/practical-database-design/part4/chapter31.md +1192 -1192
- package/lib/assets/docs/article/practical-database-design/part4/chapter32.md +2101 -2101
- package/lib/assets/docs/article/practical-database-design/part5/chapter33.md +1032 -1032
- package/lib/assets/docs/article/practical-database-design/part5/chapter34.md +1609 -1609
- package/lib/assets/docs/article/practical-database-design/part5/chapter35.md +1453 -1453
- package/lib/assets/docs/article/practical-database-design/part5/chapter36.md +1292 -1292
- package/lib/assets/docs/article/practical-database-design/part5/chapter37.md +1470 -1470
- package/lib/assets/docs/article/practical-database-design/part5/chapter38.md +1698 -1698
- package/lib/assets/docs/article/practical-database-design/part5/chapter39.md +2334 -2334
- package/lib/assets/docs/article/practical-database-design/study/study2-1.md +1693 -1693
- package/lib/assets/docs/article/practical-database-design/study/study2-2.md +1347 -1347
- package/lib/assets/docs/article/practical-database-design/study/study2-3.md +2044 -2044
- package/lib/assets/docs/article/practical-database-design/study/study2-4.md +2229 -2229
- package/lib/assets/docs/article/practical-database-design/study/study2-5.md +2418 -2418
- package/lib/assets/docs/article/practical-database-design/study/study3-1.md +2205 -2205
- package/lib/assets/docs/article/practical-database-design/study/study3-2.md +2221 -2221
- package/lib/assets/docs/article/practical-database-design/study/study3-3.md +2253 -2253
- package/lib/assets/docs/article/practical-database-design/study/study3-4.md +2106 -2106
- package/lib/assets/docs/article/practical-database-design/study/study3-5.md +2507 -2507
- package/lib/assets/docs/article/practical-database-design/study/study4-1.md +2587 -2587
- package/lib/assets/docs/article/practical-database-design/study/study4-2.md +2075 -2075
- package/lib/assets/docs/article/practical-database-design/study/study4-3.md +1805 -1805
- package/lib/assets/docs/article/practical-database-design/study/study4-4.md +1895 -1895
- package/lib/assets/docs/article/practical-database-design/study/study4-5.md +2878 -2878
- package/lib/assets/docs/assets/css/extra.css +29 -29
- package/lib/assets/docs/assets/js/extra.js +44 -44
- package/lib/assets/docs/design/index.md +44 -44
- package/lib/assets/docs/development/index.md +39 -39
- package/lib/assets/docs/index.md +33 -33
- package/lib/assets/docs/operation/index.md +27 -27
- 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 +546 -546
- 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 +341 -341
- 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 +581 -581
- 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 +642 -642
- 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 +465 -465
- package/lib/assets/docs/reference/UI/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +450 -450
- package/lib/assets/docs/reference/images/Ansoff.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/BMC.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/BrandBasicStrategy.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/BrandCategorization.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/BrandRecurutementStrategy.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/BrandValue.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/BusinessActivitiy.svg +3 -3
- package/lib/assets/docs/reference/images/HRM.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/MarketingStructure.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/OrganizationElemnts.svg +3 -3
- package/lib/assets/docs/reference/images/PPM.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/PositioningMap.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/ProductLayer.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/ProductMix.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/SWOT.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/TargetMarket.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/ThreeGenericStrategies.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/VRIO.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/ValueChain.drawio.svg +3 -3
- package/lib/assets/docs/reference/index.md +53 -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 +250 -250
- 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 +2216 -2216
- 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 +1878 -1878
- 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 +550 -550
- 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 +705 -705
- 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 +1313 -1313
- 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 +311 -311
- 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 +599 -599
- 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 +528 -528
- 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 +689 -689
- 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 +461 -461
- 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 +580 -580
- 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 +1367 -1367
- package/lib/assets/docs/reference//344/274/201/346/245/255/347/265/214/345/226/266/350/253/226.md +2637 -2637
- 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 +665 -665
- 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 +566 -566
- 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 +1248 -1248
- 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 +518 -518
- package/lib/assets/docs/reference//351/201/213/345/226/266/347/256/241/347/220/206.md +1482 -1482
- 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 +421 -421
- 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 +392 -392
- package/lib/assets/docs/reference//351/226/213/347/231/272/343/202/254/343/202/244/343/203/211.md +305 -305
- 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 +1236 -1236
- package/lib/assets/docs/requirements/index.md +17 -17
- package/lib/assets/docs/review/index.md +5 -5
- package/lib/assets/docs/strategy/index.md +17 -17
- package/lib/assets/docs/template/ADR.md +30 -30
- 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 +1366 -1366
- 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 +634 -634
- package/lib/assets/docs/template/README.md +50 -50
- package/lib/assets/docs/template/index.md +24 -24
- 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 +12 -12
- 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 +547 -547
- 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 +58 -58
- 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 +327 -327
- 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 +13 -13
- 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 +379 -379
- 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 +275 -275
- package/lib/assets/docs/template//344/272/213/344/276/213/345/210/206/346/236/220.md +513 -513
- package/lib/assets/docs/template//344/274/201/346/245/255/345/210/206/346/236/220.md +573 -573
- 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 +69 -69
- package/lib/assets/docs/template//350/246/201/344/273/266/345/256/232/347/276/251.md +669 -669
- package/lib/assets/docs/template//350/250/255/350/250/210.md +173 -173
- 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 +688 -688
- package/lib/assets/gulpfile.js +25 -25
- package/lib/assets/mkdocs.yml +139 -138
- package/lib/assets/ops/docker/mkdoc/Dockerfile +19 -19
- package/lib/assets/ops/docker/sonarqube-local/docker-compose.yml +57 -57
- package/lib/assets/ops/scripts/journal.js +180 -180
- package/lib/assets/ops/scripts/mkdocs.js +82 -82
- package/lib/assets/ops/scripts/release.js +431 -431
- package/lib/assets/ops/scripts/sonar_local.js +726 -726
- package/lib/assets/ops/scripts/ssh.js +190 -190
- package/lib/assets/ops/scripts/vault.js +299 -299
- package/lib/assets/package-lock.json +1653 -1653
- package/lib/assets/package.json +40 -40
- package/lib/gulpfile.js +37 -37
- package/package.json +41 -41
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
# 第 18 章 ケーススタディの負荷テスト
|
|
2
|
+
|
|
3
|
+
## はじめに
|
|
4
|
+
|
|
5
|
+
第 12 章「12.3 負荷テスト」では、Python 製の負荷テストツール **Locust** をコンテナで動かす考え方を学びました。負荷生成ツール・シナリオ・テスト対象をすべてコンテナとして扱うことで、負荷テスト環境を「コードから一括で構築し、終わったら破棄する」ことができます。
|
|
6
|
+
|
|
7
|
+
この章では、その考え方を第 13〜16 章の 4 ケース(同一ドメイン = Cargo Tracker の 4 アーキテクチャ)に適用します。各ケースに Locust の負荷テスト一式を用意し、**Docker Compose 版**と **Kubernetes 版**の 2 通りで実行できるようにしました。
|
|
8
|
+
|
|
9
|
+
実装はすべて各ケースの [`loadtest/`](https://github.com/k2works/getting-started-docker-kubernetes/tree/main/apps/case-studies) ディレクトリにあります。
|
|
10
|
+
|
|
11
|
+
| ケース | アーキテクチャ | loadtest ディレクトリ |
|
|
12
|
+
|--------|--------------|----------------------|
|
|
13
|
+
| case-1 | モノリス | `apps/case-studies/case-1-monolith/loadtest/` |
|
|
14
|
+
| case-2 | イベント駆動 MS | `apps/case-studies/case-2-event-driven/loadtest/` |
|
|
15
|
+
| case-3 | ES/CQRS(Axon) | `apps/case-studies/case-3-escqrs-axon/loadtest/` |
|
|
16
|
+
| case-4 | ES/CQRS(Kafka) | `apps/case-studies/case-4-escqrs-kafka/loadtest/` |
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 18.1 構成
|
|
21
|
+
|
|
22
|
+
各ケースの `loadtest/` には次のファイルが入っています。シナリオ(`locustfile.py`)は Compose 版・Kubernetes 版で共有します。
|
|
23
|
+
|
|
24
|
+
| ファイル | 役割 |
|
|
25
|
+
|---------|------|
|
|
26
|
+
| `locustfile.py` | 負荷シナリオ(仮想ユーザーの振る舞い) |
|
|
27
|
+
| `compose.loadtest.yaml` | Docker Compose 版 Locust の起動定義(Web UI: 8089) |
|
|
28
|
+
| `kustomization.yaml` | Kubernetes 版 Locust の Kustomize 定義 |
|
|
29
|
+
| `k8s-locust.yaml` | Kubernetes 版 Locust の Deployment / Service |
|
|
30
|
+
| `README.md` | 実行手順・対象エンドポイント |
|
|
31
|
+
|
|
32
|
+
### 現行 Locust API を使う
|
|
33
|
+
|
|
34
|
+
第 12 章で引用したサンプル(`senario.py`)は、Locust 旧 API(`HttpLocust` / `TaskSet`)で書かれていました。これらは現行の Locust では廃止されているため、本章のシナリオは**現行 API(`HttpUser` / `@task` / `between`)**と公式イメージ `locustio/locust` で記述しています。
|
|
35
|
+
|
|
36
|
+
```python
|
|
37
|
+
from locust import HttpUser, between, task
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class CargoTrackerUser(HttpUser):
|
|
41
|
+
# 各タスクの実行間隔(記事の min_wait / max_wait に相当)
|
|
42
|
+
wait_time = between(1, 3)
|
|
43
|
+
|
|
44
|
+
@task(5)
|
|
45
|
+
def bookings(self):
|
|
46
|
+
self.client.get("/api/v1/bookings", name="/api/v1/bookings")
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
旧 API の `min_wait` / `max_wait`(ミリ秒)は、現行では `wait_time = between(min, max)`(秒)に置き換わっています。`HttpLocust` は `HttpUser`、`task_set` を持つ `TaskSet` は `HttpUser` に直接 `@task` を書く形になりました。
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## 18.2 ケースごとの対象エンドポイントと認証
|
|
54
|
+
|
|
55
|
+
負荷テストで重要なのは「**副作用のない読み取り系(GET)に、認証を通して負荷をかける**」ことです。4 ケースは認証方式が異なるため、シナリオもそれに合わせています。
|
|
56
|
+
|
|
57
|
+
| ケース | 公開ポート(Compose) | 認証方式 | シナリオの方針 |
|
|
58
|
+
|--------|---------------------|---------|--------------|
|
|
59
|
+
| case-1 | 18080(app) | セッション + フォームログイン | 認証不要の GET のみ(`/actuator/health`、`/login`、`/public/tracking`) |
|
|
60
|
+
| case-2 | 9080(gateway) | JWT(gateway で強制) | ログインで JWT を取得し、Read 系 GET に付与 |
|
|
61
|
+
| case-3 | 9081(gateway) | JWT(gateway で強制) | ログインで JWT を取得し、CQRS Query 側へ |
|
|
62
|
+
| case-4 | 9082(gateway) | `local` では認可無効 | 匿名で Read Model を GET |
|
|
63
|
+
|
|
64
|
+
### case-1: 認証不要の GET(セッション認証のため)
|
|
65
|
+
|
|
66
|
+
モノリス版は Spring Security のフォームログイン(セッション + CSRF)で保護されています。負荷テストでは、確実に匿名アクセスできる GET だけを対象にしています。
|
|
67
|
+
|
|
68
|
+
| メソッド | パス | 説明 |
|
|
69
|
+
|---------|------|------|
|
|
70
|
+
| GET | `/actuator/health` | ヘルスチェック |
|
|
71
|
+
| GET | `/login` | ログイン画面(HTML) |
|
|
72
|
+
| GET | `/public/tracking` | 公開追跡の検索画面 |
|
|
73
|
+
|
|
74
|
+
### case-2 / case-3: JWT ログインしてから GET
|
|
75
|
+
|
|
76
|
+
両ケースとも gatewayms が JWT 認証を強制します。Locust の `on_start`(仮想ユーザー開始時に 1 回呼ばれる)でログインしてトークンを取得し、以降の GET に `Authorization: Bearer <token>` を付けます。
|
|
77
|
+
|
|
78
|
+
```python
|
|
79
|
+
def on_start(self):
|
|
80
|
+
"""ログインして JWT を取得する。失敗時はトークンなしで続行する。"""
|
|
81
|
+
self.token = None
|
|
82
|
+
with self.client.post(
|
|
83
|
+
"/api/v1/auth/login",
|
|
84
|
+
json={"username": USERNAME, "password": PASSWORD},
|
|
85
|
+
name="/api/v1/auth/login",
|
|
86
|
+
catch_response=True,
|
|
87
|
+
) as res:
|
|
88
|
+
if res.status_code == 200:
|
|
89
|
+
data = res.json() if res.text else {}
|
|
90
|
+
self.token = data.get("token") or data.get("accessToken")
|
|
91
|
+
if self.token:
|
|
92
|
+
res.success()
|
|
93
|
+
else:
|
|
94
|
+
res.failure("token がレスポンスに含まれていません")
|
|
95
|
+
else:
|
|
96
|
+
res.failure(f"ログイン失敗: HTTP {res.status_code}")
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
既定ユーザーはシード済みの `admin` / `password` です。case-3 は CQRS の Query 側(`/api/v1/bookings`、`/api/v1/voyages`、`/api/v1/billing/invoices` など)の Read Model 読み取りに負荷をかけます。
|
|
100
|
+
|
|
101
|
+
### case-4: 認証なしで Read Model を GET
|
|
102
|
+
|
|
103
|
+
case-4 は `local`(`local-docker`)プロファイルで起動するため、gateway / 各サービスの Spring Security 認可が無効になります。そのためログイン処理なしで、ページング付きの一覧 API に直接負荷をかけられます。
|
|
104
|
+
|
|
105
|
+
```python
|
|
106
|
+
@task(5)
|
|
107
|
+
def bookings(self):
|
|
108
|
+
"""予約一覧(Read Model、ページング)。"""
|
|
109
|
+
self.client.get("/api/v1/bookings?page=0&size=20", name="/api/v1/bookings")
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
`name=` を明示しているのは、`?page=0&size=20` のようなクエリ違いを Locust の統計上で同じエンドポイントとして集計するためです。
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## 18.3 Docker Compose 版
|
|
117
|
+
|
|
118
|
+
Compose 版は、第 12 章のサンプルと同様に「負荷生成側(Locust)を独立した Compose として用意する」方式です。ただし本ケーススタディは `dev:<case>` でアプリ本体を起動し、gateway/app を**ホストポートに公開**します。そこで Locust 側は、`host.docker.internal` 経由でそのホスト公開ポートへ負荷をかけます(どの Compose ネットワークからでも到達できます)。
|
|
119
|
+
|
|
120
|
+
出典: `apps/case-studies/case-4-escqrs-kafka/loadtest/compose.loadtest.yaml`
|
|
121
|
+
|
|
122
|
+
```yaml
|
|
123
|
+
name: loadtest-case4
|
|
124
|
+
|
|
125
|
+
services:
|
|
126
|
+
locust:
|
|
127
|
+
image: locustio/locust:2.32.5
|
|
128
|
+
ports:
|
|
129
|
+
- "8089:8089"
|
|
130
|
+
volumes:
|
|
131
|
+
- ./locustfile.py:/mnt/locust/locustfile.py:ro
|
|
132
|
+
environment:
|
|
133
|
+
LOCUST_LOCUSTFILE: /mnt/locust/locustfile.py
|
|
134
|
+
# 負荷対象。ホストに公開された 9082 番(gatewayms: 9082:8080)へ向ける。
|
|
135
|
+
LOCUST_HOST: ${TARGET_URL:-http://host.docker.internal:9082}
|
|
136
|
+
extra_hosts:
|
|
137
|
+
- "host.docker.internal:host-gateway"
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
ポイントは次のとおりです。
|
|
141
|
+
|
|
142
|
+
- `image` に公式イメージ `locustio/locust` を使い、`volumes` でシナリオファイルをマウントします。イメージを再ビルドせずにシナリオを差し替えられます。
|
|
143
|
+
- `LOCUST_LOCUSTFILE` / `LOCUST_HOST` は、Locust の CLI オプション(`-f` / `--host`)に対応する環境変数です。
|
|
144
|
+
- `extra_hosts` で `host.docker.internal` を `host-gateway` に解決し、Linux でもホスト公開ポートへ到達できるようにしています。
|
|
145
|
+
|
|
146
|
+
### 実行手順(Compose 版)
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
# 1. アプリ本体を起動(gateway をホスト 9082 に公開)
|
|
150
|
+
npx gulp dev:case4
|
|
151
|
+
|
|
152
|
+
# 2. Locust を起動(Web UI: http://localhost:8089)
|
|
153
|
+
npx gulp loadtest:case4
|
|
154
|
+
|
|
155
|
+
# 3. ブラウザで同時ユーザー数・増加レートを指定してテスト開始
|
|
156
|
+
|
|
157
|
+
# 4. 終了
|
|
158
|
+
npx gulp loadtest:case4:down
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
CI 向けに、UI なしで一定時間だけ実行して終了するヘッドレス実行も用意しています。
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
# 既定: 50 ユーザー / 毎秒 5 ユーザー増 / 1 分間
|
|
165
|
+
npx gulp loadtest:case4:headless
|
|
166
|
+
|
|
167
|
+
# パラメータを環境変数で上書き
|
|
168
|
+
USERS=100 SPAWN=10 DURATION=3m npx gulp loadtest:case4:headless
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## 18.4 Kubernetes 版
|
|
174
|
+
|
|
175
|
+
Kubernetes 版は、第 12 章の「負荷生成側とテスト対象を同一オーケストレータに載せる」考え方をそのまま適用します。**アプリと同じ名前空間に Locust をデプロイ**し、クラスタ内のサービス(`gatewayms` など)へ DNS 名で直接負荷をかけます。`host.docker.internal` やポートフォワードを介さず、より本番に近い経路で計測できます。
|
|
176
|
+
|
|
177
|
+
シナリオ(`locustfile.py`)は Kustomize の `configMapGenerator` で ConfigMap として配布し、Compose 版と同じファイルを共有します。
|
|
178
|
+
|
|
179
|
+
出典: `apps/case-studies/case-4-escqrs-kafka/loadtest/kustomization.yaml`
|
|
180
|
+
|
|
181
|
+
```yaml
|
|
182
|
+
apiVersion: kustomize.config.k8s.io/v1beta1
|
|
183
|
+
kind: Kustomization
|
|
184
|
+
|
|
185
|
+
namespace: cargo-tracker
|
|
186
|
+
|
|
187
|
+
configMapGenerator:
|
|
188
|
+
- name: locust-scenario
|
|
189
|
+
files:
|
|
190
|
+
- locustfile.py
|
|
191
|
+
|
|
192
|
+
resources:
|
|
193
|
+
- k8s-locust.yaml
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
出典: `apps/case-studies/case-4-escqrs-kafka/loadtest/k8s-locust.yaml`(抜粋)
|
|
197
|
+
|
|
198
|
+
```yaml
|
|
199
|
+
apiVersion: apps/v1
|
|
200
|
+
kind: Deployment
|
|
201
|
+
metadata:
|
|
202
|
+
name: locust
|
|
203
|
+
spec:
|
|
204
|
+
replicas: 1
|
|
205
|
+
selector:
|
|
206
|
+
matchLabels:
|
|
207
|
+
app: locust
|
|
208
|
+
template:
|
|
209
|
+
metadata:
|
|
210
|
+
labels:
|
|
211
|
+
app: locust
|
|
212
|
+
spec:
|
|
213
|
+
containers:
|
|
214
|
+
- name: locust
|
|
215
|
+
image: locustio/locust:2.32.5
|
|
216
|
+
args:
|
|
217
|
+
- "-f"
|
|
218
|
+
- "/mnt/locust/locustfile.py"
|
|
219
|
+
- "--host"
|
|
220
|
+
- "http://gatewayms:8080" # クラスタ内サービスへ直接
|
|
221
|
+
ports:
|
|
222
|
+
- name: web
|
|
223
|
+
containerPort: 8089
|
|
224
|
+
volumeMounts:
|
|
225
|
+
- name: scenario
|
|
226
|
+
mountPath: /mnt/locust
|
|
227
|
+
volumes:
|
|
228
|
+
- name: scenario
|
|
229
|
+
configMap:
|
|
230
|
+
name: locust-scenario
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
ポイントは次のとおりです。
|
|
234
|
+
|
|
235
|
+
- `namespace` をアプリと同じにすることで、`--host http://gatewayms:8080` のように**サービス名だけ**で負荷対象を指定できます(同一名前空間内の DNS 解決)。
|
|
236
|
+
- `configMapGenerator` は ConfigMap 名にハッシュ(`locust-scenario-xxxx`)を付けます。Volume の `configMap.name` への参照は Kustomize が自動で書き換えるため、シナリオを変更すると新しいハッシュになり、Pod が確実に最新シナリオで再起動します。
|
|
237
|
+
- 負荷対象は、case-1 は `cargo-tracker:80`、case-2〜4 は `gatewayms:8080` です(各サービスのクラスタ内ポート)。
|
|
238
|
+
|
|
239
|
+
### 実行手順(Kubernetes 版)
|
|
240
|
+
|
|
241
|
+
```bash
|
|
242
|
+
# 1. アプリ本体を Kubernetes にデプロイ
|
|
243
|
+
npx gulp k8s:case4
|
|
244
|
+
|
|
245
|
+
# 2. Locust をデプロイ(同じ名前空間 cargo-tracker へ)
|
|
246
|
+
npx gulp loadtest:case4:k8s
|
|
247
|
+
|
|
248
|
+
# 3. Web UI を port-forward して開く(http://localhost:8089、Ctrl+C で終了)
|
|
249
|
+
npx gulp loadtest:case4:k8s:open
|
|
250
|
+
|
|
251
|
+
# 4. 削除
|
|
252
|
+
npx gulp loadtest:case4:k8s:delete
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
なお、アプリの `k8s:<case>:open` タスクは、Locust をデプロイ済みであれば負荷テストの Web UI(`http://localhost:8089`)も Kibana などと一緒に自動で開きます(未デプロイのときは `svc/locust` が見つからずスキップされます)。アプリ・ログ可視化・負荷テスト UI を 1 コマンドでまとめて開けます。
|
|
256
|
+
|
|
257
|
+
```bash
|
|
258
|
+
npx gulp k8s:case4 # アプリをデプロイ
|
|
259
|
+
npx gulp loadtest:case4:k8s # 負荷テストをデプロイ
|
|
260
|
+
npx gulp k8s:case4:open # アプリ + Kibana + Locust(8089) をまとめて開く
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
## 18.5 運用タスクとして統合する
|
|
266
|
+
|
|
267
|
+
これらの負荷テストは、本プロジェクトの運用タスク(Gulp)に `loadtest:<case>` として統合されています。`dev:<case>`(Compose 起動)・`k8s:<case>`(Kubernetes デプロイ)と同じ命名規約で扱えます。
|
|
268
|
+
|
|
269
|
+
| タスク | 説明 |
|
|
270
|
+
|--------|------|
|
|
271
|
+
| `loadtest:<case>` | Compose 版 Locust の Web UI を起動 |
|
|
272
|
+
| `loadtest:<case>:headless` | Compose 版を UI なしで実行(`USERS` / `SPAWN` / `DURATION` で調整) |
|
|
273
|
+
| `loadtest:<case>:down` | Compose 版を停止・破棄 |
|
|
274
|
+
| `loadtest:<case>:k8s` | Kubernetes 版をデプロイ |
|
|
275
|
+
| `loadtest:<case>:k8s:open` | Kubernetes 版の Web UI を port-forward して開く |
|
|
276
|
+
| `loadtest:<case>:k8s:delete` | Kubernetes 版を削除 |
|
|
277
|
+
| `loadtest:help` | 一覧とヘルプを表示 |
|
|
278
|
+
|
|
279
|
+
ES/CQRS のケース(case-3 / case-4)では、書き込み(コマンド)から Read Model への投影が非同期です。シード直後は一覧が空のことがあるため、デプロイ後しばらく待ってから負荷テストを実行してください。
|
|
280
|
+
|
|
281
|
+
---
|
|
282
|
+
|
|
283
|
+
## まとめ
|
|
284
|
+
|
|
285
|
+
- 第 12 章で学んだ Locust の負荷テストを、4 ケース(モノリス / イベント駆動 / ES・CQRS Axon / ES・CQRS Kafka)に適用しました
|
|
286
|
+
- シナリオは現行 Locust API(`HttpUser` / `@task` / `between`)で記述し、Compose 版・Kubernetes 版で共有します
|
|
287
|
+
- 認証方式の違い(セッション / JWT / 認可無効)に合わせ、副作用のない読み取り系 GET に負荷をかけるシナリオにしました
|
|
288
|
+
- Compose 版は `host.docker.internal` 経由でホスト公開ポートへ、Kubernetes 版は同一名前空間からクラスタ内サービスへ、それぞれ負荷をかけます
|
|
289
|
+
- 運用タスク(`loadtest:<case>`)として統合し、`dev:<case>` / `k8s:<case>` と同じ流れで「構築 → 負荷テスト → 破棄」を繰り返せます
|
|
290
|
+
|
|
291
|
+
---
|
|
292
|
+
|
|
293
|
+
- 前の章: [第 17 章 ケーススタディ実装比較まとめ](17-case-comparison-summary.md)
|
|
294
|
+
- シリーズ目次: [Docker/Kubernetes 実践コンテナ解説](index.md)
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
# 付録 A 開発ツールのセットアップ
|
|
2
|
+
|
|
3
|
+
## はじめに
|
|
4
|
+
|
|
5
|
+
本編で扱った Docker や Kubernetes を快適に学習・開発するには、いくつかの周辺ツールをそろえておくと便利です。この付録では、書籍『Docker/Kubernetes 実践コンテナ開発入門(第 2 版)』の付録に沿って、次の 4 つの開発ツールのセットアップ方法を解説します。
|
|
6
|
+
|
|
7
|
+
- A.1 WSL2 — Windows 上で Linux 環境を動かす基盤
|
|
8
|
+
- A.2 asdf — 複数言語・ツールのバージョンを統一管理する
|
|
9
|
+
- A.3 kind — Docker の中に Kubernetes クラスタを立ち上げる
|
|
10
|
+
- A.4 Rancher Desktop — Docker Desktop の代替となるローカル開発環境
|
|
11
|
+
|
|
12
|
+
それぞれのツールは「何を解決するのか」という観点から整理します。ツールを導入する目的が明確であれば、自分の環境に合わせて取捨選択できるからです。
|
|
13
|
+
|
|
14
|
+
なお、本付録には 2 種類の情報が含まれます。1 つは本リポジトリ(`getting-started-docker-kubernetes`)に実在する設定ファイルやスクリプトを引用した内容で、もう 1 つは各ツールの一般的な利用手順です。前者には出典を明示し、後者は「一般的な手順」と区別して記載します。コマンドの実行結果は環境やバージョンによって変わるため、確実でないものは「例」と明記するか省略しています。
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## A.1 WSL2
|
|
19
|
+
|
|
20
|
+
### WSL2 は何を解決するか
|
|
21
|
+
|
|
22
|
+
Docker や Kubernetes のツールチェーンは Linux を前提に作られているものが多く、Windows でそのまま動かそうとすると差異に悩まされがちです。WSL2(Windows Subsystem for Linux 2)は、Windows 上で本物の Linux カーネルを動かす仕組みで、この「Windows と Linux の隔たり」を解決します。
|
|
23
|
+
|
|
24
|
+
WSL の初代(WSL1)が Linux システムコールを翻訳する方式だったのに対し、WSL2 は軽量な仮想マシン上で実際の Linux カーネルを動作させます。これにより、ファイルシステムの互換性やネットワーク、Docker のようなコンテナ技術との相性が大きく改善されました。
|
|
25
|
+
|
|
26
|
+
### WSL2 の導入
|
|
27
|
+
|
|
28
|
+
最近の Windows 10/11 では、管理者権限の PowerShell またはコマンドプロンプトから次のコマンド 1 つで WSL2 と既定のディストリビューション(通常は Ubuntu)をまとめて導入できます。
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
wsl --install
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
実行後は再起動を求められることがあります。再起動後、初回起動時に Linux ユーザー名とパスワードの設定を求められます。
|
|
35
|
+
|
|
36
|
+
インストール済みの状態を確認したい場合は、次のコマンドでバージョンや稼働状態を確認できます。
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
# WSL のバージョンと状態を確認する
|
|
40
|
+
wsl --status
|
|
41
|
+
|
|
42
|
+
# インストール済みディストリビューションを一覧表示する
|
|
43
|
+
wsl --list --verbose
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
`wsl --list --verbose` の `VERSION` 列が `2` になっていれば WSL2 で動作しています。
|
|
47
|
+
|
|
48
|
+
### ディストリビューションの導入
|
|
49
|
+
|
|
50
|
+
既定以外のディストリビューションを使いたい場合は、導入可能な一覧を確認してから指定してインストールします。
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
# インストール可能なディストリビューションの一覧を表示する
|
|
54
|
+
wsl --list --online
|
|
55
|
+
|
|
56
|
+
# ディストリビューションを指定してインストールする(例: Ubuntu-22.04)
|
|
57
|
+
wsl --install -d Ubuntu-22.04
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
既存のディストリビューションを WSL2 に変換したい場合は、バージョンを明示的に設定します。
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
# 既定のバージョンを WSL2 にする
|
|
64
|
+
wsl --set-default-version 2
|
|
65
|
+
|
|
66
|
+
# 個別のディストリビューションを WSL2 に変換する(例)
|
|
67
|
+
wsl --set-version Ubuntu-22.04 2
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Docker との連携
|
|
71
|
+
|
|
72
|
+
WSL2 は、コンテナ開発環境との連携において中心的な役割を果たします。代表的な連携方法は次の 2 つです。
|
|
73
|
+
|
|
74
|
+
1. Docker Desktop の WSL2 バックエンドを利用する方法。Docker Desktop の設定で WSL2 ベースのエンジンを有効化すると、Windows 側にインストールした Docker を WSL2 のディストリビューションから透過的に利用できます。
|
|
75
|
+
2. WSL2 のディストリビューション内に直接 Docker Engine をインストールする方法。Docker Desktop を使わず、Linux と同じ手順で Docker をセットアップします。後述の Rancher Desktop も WSL2 を基盤として利用します。
|
|
76
|
+
|
|
77
|
+
開発時のポイントとして、ソースコードは Windows 側(`/mnt/c/...`)ではなく WSL2 のファイルシステム上(例: `~/projects`)に置くと、ファイル I/O が高速になり、ファイル変更検知(ホットリロード)も安定します。
|
|
78
|
+
|
|
79
|
+
> 注: 上記コマンドは Windows 環境で一般的に有効なものです。利用可能なディストリビューションや既定の挙動は Windows のバージョン・更新状況によって異なります。
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## A.2 asdf
|
|
84
|
+
|
|
85
|
+
### asdf は何を解決するか
|
|
86
|
+
|
|
87
|
+
開発を進めると、Go や Node.js といった言語ランタイムに加えて、`kustomize`、`helm`、`tilt` などの CLI ツールを多数使うことになります。これらは「プロジェクトごとに必要なバージョンが違う」「チームメンバー間でバージョンがそろわず、手元では動くのに他の環境で動かない」といった問題を起こしがちです。
|
|
88
|
+
|
|
89
|
+
asdf は、複数の言語・ツールのバージョンを 1 つの仕組みでまとめて管理するバージョンマネージャです。プロジェクトのルートに置いた `.tool-versions` ファイルでツールとバージョンを宣言しておくことで、チーム全体で同じバージョンを再現できます。
|
|
90
|
+
|
|
91
|
+
### `.tool-versions` でバージョンを固定する
|
|
92
|
+
|
|
93
|
+
本リポジトリのサンプルアプリ `taskapp` では、`apps/taskapp/.tool-versions`(出典: `getting-started-docker-kubernetes` リポジトリ)で次のようにツールとバージョンを固定しています。
|
|
94
|
+
|
|
95
|
+
```text
|
|
96
|
+
golang 1.21.6
|
|
97
|
+
tilt 0.33.10
|
|
98
|
+
kustomize 5.3.0
|
|
99
|
+
kubectx 0.9.5
|
|
100
|
+
helm 3.13.3
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
このファイルが示すとおり、`taskapp` の開発には Go 本体に加えて、Kubernetes 開発で頻出する次のツール群が必要です。
|
|
104
|
+
|
|
105
|
+
- `golang` — アプリケーション本体の実装に使う言語ランタイム
|
|
106
|
+
- `tilt` — Kubernetes 上での開発を高速化する開発ツール
|
|
107
|
+
- `kustomize` — Kubernetes マニフェストを環境差分込みで管理するツール
|
|
108
|
+
- `kubectx` — `kubectl` のコンテキスト・名前空間を素早く切り替えるツール
|
|
109
|
+
- `helm` — Kubernetes アプリケーションのパッケージマネージャ
|
|
110
|
+
|
|
111
|
+
別のサンプルである `echo` アプリでは、`apps/echo/.tool-versions`(出典: 同リポジトリ)でより最小限の構成になっており、`kustomize` のみを固定しています。
|
|
112
|
+
|
|
113
|
+
```text
|
|
114
|
+
kustomize 5.3.0
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
このように、`.tool-versions` をプロジェクトごとに置くことで、「そのプロジェクトに必要なツールとバージョン」が明文化され、リポジトリをクローンした人は同じ環境を再現できます。
|
|
118
|
+
|
|
119
|
+
### asdf のインストールとプラグイン追加
|
|
120
|
+
|
|
121
|
+
asdf は本体を導入したあと、ツールごとに「プラグイン」を追加して使います。一般的な利用の流れは次のとおりです。
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
# プラグインを追加する(例: golang と kustomize)
|
|
125
|
+
asdf plugin add golang
|
|
126
|
+
asdf plugin add kustomize
|
|
127
|
+
|
|
128
|
+
# .tool-versions に書かれたバージョンを一括インストールする
|
|
129
|
+
asdf install
|
|
130
|
+
|
|
131
|
+
# ツールのバージョンをグローバルに設定する(例)
|
|
132
|
+
asdf global golang 1.21.6
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
`asdf plugin add` で対象ツールのプラグインを登録し、`asdf install` で `.tool-versions` の内容に従ってバージョンをインストールします。`asdf global` は、カレントディレクトリに `.tool-versions` がない場面でのデフォルトバージョンを設定するためのコマンドです(プロジェクト単位で固定したい場合は `asdf local` を使い、`.tool-versions` を更新します)。
|
|
136
|
+
|
|
137
|
+
### `.tool-versions` から一括セットアップするスクリプト
|
|
138
|
+
|
|
139
|
+
`taskapp` には、`.tool-versions` を読み取ってプラグイン追加とインストールをまとめて実行するセットアップスクリプトが用意されています。出典は `apps/taskapp/hack/install-tools.sh`(`getting-started-docker-kubernetes` リポジトリ)です。
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
#!/usr/bin/env bash
|
|
143
|
+
|
|
144
|
+
cat .tool-versions | while read line
|
|
145
|
+
do
|
|
146
|
+
echo $line | awk '{print $1}' | xargs -I{} asdf plugin add {}
|
|
147
|
+
if [ $? -ne 0 ]; then
|
|
148
|
+
continue
|
|
149
|
+
fi
|
|
150
|
+
done
|
|
151
|
+
|
|
152
|
+
asdf install
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
このスクリプトが行っていることは次のとおりです。
|
|
156
|
+
|
|
157
|
+
1. `.tool-versions` を 1 行ずつ読み込む。
|
|
158
|
+
2. 各行の先頭フィールド(ツール名)を `awk` で取り出し、`asdf plugin add` に渡してプラグインを追加する。
|
|
159
|
+
3. プラグイン追加に失敗した行(`$? -ne 0`)はスキップして次の行へ進む。
|
|
160
|
+
4. すべてのプラグイン追加が終わったら、最後に `asdf install` で `.tool-versions` に書かれたバージョンを一括インストールする。
|
|
161
|
+
|
|
162
|
+
つまり、`.tool-versions` を更新してこのスクリプトを実行するだけで、必要なツール群を宣言どおりにそろえられます。バージョン管理の「単一の情報源(Single Source of Truth)」を `.tool-versions` に集約し、手作業のばらつきを排除する典型的なパターンです。
|
|
163
|
+
|
|
164
|
+
> 注: `.tool-versions` の内容(ツール名・バージョン)は上記のとおり実ファイルからの引用ですが、`asdf plugin add` / `asdf install` / `asdf global` の使い方は asdf の一般的な利用手順です。
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## A.3 kind
|
|
169
|
+
|
|
170
|
+
### kind は何を解決するか
|
|
171
|
+
|
|
172
|
+
kind(Kubernetes IN Docker)は、その名のとおり Docker コンテナをノードに見立てて Kubernetes クラスタを立ち上げるツールです。本来 Kubernetes クラスタの構築には複数のマシンや仮想マシンが必要ですが、kind を使えば Docker さえあれば手元のマシン 1 台でクラスタを起動・破棄できます。
|
|
173
|
+
|
|
174
|
+
これにより「Kubernetes を学習・検証したいが、本格的なクラスタを用意するのは大変」という問題を解決できます。起動も破棄も速く、CI 環境での Kubernetes テストにも広く使われています。
|
|
175
|
+
|
|
176
|
+
### クラスタの作成と削除
|
|
177
|
+
|
|
178
|
+
最も基本的な使い方は次のとおりです(一般的な手順)。
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
# 既定設定でクラスタを作成する
|
|
182
|
+
kind create cluster
|
|
183
|
+
|
|
184
|
+
# 名前を付けてクラスタを作成する(例)
|
|
185
|
+
kind create cluster --name dev
|
|
186
|
+
|
|
187
|
+
# 作成済みクラスタの一覧を表示する
|
|
188
|
+
kind get clusters
|
|
189
|
+
|
|
190
|
+
# クラスタを削除する(名前を付けた場合は --name で指定)
|
|
191
|
+
kind delete cluster --name dev
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
`kind create cluster` を実行すると、kind が Docker コンテナとしてノードを起動し、`kubectl` の接続先(kubeconfig のコンテキスト)も自動的に設定します。作成後はそのまま `kubectl get nodes` などでクラスタを操作できます。
|
|
195
|
+
|
|
196
|
+
### kind-config.yaml によるマルチノード構成
|
|
197
|
+
|
|
198
|
+
既定では単一ノード(コントロールプレーン兼ワーカー)のクラスタになりますが、設定ファイルを渡すことで複数ノードのクラスタを構成できます。次は 1 つのコントロールプレーンと 2 つのワーカーノードを持つ構成の例です(一般的な例)。
|
|
199
|
+
|
|
200
|
+
```text
|
|
201
|
+
# kind-config.yaml
|
|
202
|
+
kind: Cluster
|
|
203
|
+
apiVersion: kind.x-k8s.io/v1alpha4
|
|
204
|
+
nodes:
|
|
205
|
+
- role: control-plane
|
|
206
|
+
- role: worker
|
|
207
|
+
- role: worker
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
この設定ファイルを指定してクラスタを作成します。
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
# 設定ファイルを指定してマルチノードクラスタを作成する
|
|
214
|
+
kind create cluster --name multi --config kind-config.yaml
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
複数ノード構成にすると、Pod のスケジューリングやノード間の挙動を、本番に近い形でローカル検証できます。Kubernetes の基本概念については本編の第 5 章も参照してください。
|
|
218
|
+
|
|
219
|
+
> 注: 上記の kind-config.yaml と各コマンドは kind の一般的な使い方を示した例です。実際の `apiVersion` やノード設定は kind のバージョンによって異なる場合があります。
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
## A.4 Rancher Desktop
|
|
224
|
+
|
|
225
|
+
### Rancher Desktop は何を解決するか
|
|
226
|
+
|
|
227
|
+
Rancher Desktop は、ローカルでコンテナと Kubernetes をまとめて動かせるデスクトップアプリケーションです。Docker Desktop の代替として利用でき、ライセンス面や軽量さを理由に選ばれることがあります。Windows・macOS・Linux に対応し、GUI からバージョンやランタイムを切り替えられます。
|
|
228
|
+
|
|
229
|
+
「Docker Desktop に依存せずに、ローカルでコンテナと Kubernetes の両方を手軽に扱いたい」というニーズを解決するのが Rancher Desktop です。
|
|
230
|
+
|
|
231
|
+
### コンテナランタイムの切り替え(containerd / dockerd)
|
|
232
|
+
|
|
233
|
+
Rancher Desktop の特徴の 1 つは、コンテナランタイムを切り替えられる点です。設定画面から次の 2 種類を選択できます。
|
|
234
|
+
|
|
235
|
+
- containerd — Kubernetes が標準的に利用するコンテナランタイム。Rancher Desktop では `nerdctl` という Docker 互換 CLI を通じてイメージのビルドやコンテナの実行を行います。
|
|
236
|
+
- dockerd(Moby) — 従来の Docker と同じランタイム。`docker` コマンドや `docker-compose` をそのまま使いたい場合に選択します。
|
|
237
|
+
|
|
238
|
+
既存の `docker` コマンドや本編で扱った操作をそのまま使いたい場合は dockerd を、Kubernetes 寄りの運用に合わせたい場合は containerd を選ぶ、といった使い分けができます。
|
|
239
|
+
|
|
240
|
+
### 内蔵 Kubernetes(k3s)
|
|
241
|
+
|
|
242
|
+
Rancher Desktop には軽量な Kubernetes ディストリビューションである k3s が内蔵されています。アプリの設定で Kubernetes を有効化すると、追加のインストールなしでローカル Kubernetes クラスタが起動し、`kubectl` で操作できるようになります。利用する Kubernetes のバージョンも GUI から選択できます。
|
|
243
|
+
|
|
244
|
+
Windows では、Rancher Desktop は WSL2 を基盤として動作します(A.1 を参照)。そのため、WSL2 が有効になっていることが前提になります。kind がクラスタを都度作成・破棄するのに対し、Rancher Desktop の k3s は「常駐するローカルクラスタ」として使える点が異なります。用途に応じて、kind と Rancher Desktop を使い分けるとよいでしょう。
|
|
245
|
+
|
|
246
|
+
> 注: ランタイムの切り替えや Kubernetes 有効化は Rancher Desktop の GUI から行う操作であり、画面構成はバージョンによって異なります。ここではコマンド出力の掲載は省略します。
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## まとめ
|
|
251
|
+
|
|
252
|
+
本付録では、Docker / Kubernetes を学習・開発するための周辺ツールを 4 つ紹介しました。それぞれが解決する課題を整理すると次のとおりです。
|
|
253
|
+
|
|
254
|
+
- WSL2 — Windows 上で Linux 環境を動かし、Linux 前提のツールチェーンや Docker をスムーズに利用できるようにする。
|
|
255
|
+
- asdf — `.tool-versions` で言語・ツールのバージョンを宣言的に固定し、チーム全体で同じ環境を再現する。本リポジトリの `apps/taskapp/.tool-versions` と `apps/taskapp/hack/install-tools.sh` がその実例である。
|
|
256
|
+
- kind — Docker さえあれば手元でマルチノードの Kubernetes クラスタを起動・破棄でき、学習や CI に適する。
|
|
257
|
+
- Rancher Desktop — Docker Desktop の代替として、containerd/dockerd の切り替えと内蔵 k3s により、ローカルでコンテナと Kubernetes をまとめて扱える。
|
|
258
|
+
|
|
259
|
+
これらのツールは排他的なものではなく、目的に応じて組み合わせて使えます。たとえば「Windows で WSL2 を基盤に Rancher Desktop を動かし、プロジェクトのツールは asdf で固定し、検証用クラスタは kind で立てる」といった構成も成り立ちます。自分の開発スタイルと、本編で学んだコンテナ・Kubernetes の知識に合わせて、必要なツールを選んでください。
|
|
260
|
+
|
|
261
|
+
### 関連リンク
|
|
262
|
+
|
|
263
|
+
- [付録 B さまざまなコンテナオーケストレーション環境](appendix-b-orchestration-environments.md)
|
|
264
|
+
- [第 1 章 コンテナと Docker の基礎](01-container-and-docker-basics.md)
|
|
265
|
+
- [第 5 章 Kubernetes 入門](05-kubernetes-introduction.md)
|