Upgrade to Pro — share decks privately, control downloads, hide ads and more …

目的に沿ったDocumentation as Codeをいかにして実現していくか / PHPerKaigi 2021

目的に沿ったDocumentation as Codeをいかにして実現していくか / PHPerKaigi 2021

https://fortee.jp/phperkaigi-2021/proposal/42ce8b07-6972-42bb-a2ac-96af7249cfa4

あるシステムを理解して開発を開始するとき、必要なのはInfrastructure as Codeを含むソースコードだけでは大抵の場合は不十分です。では挙動がわかるようなテストコードがあれば十分かというとそうでもありません。
いわゆる「オンボーディングの効果的な運用」「開発開始までのオーバヘッドの削減(PHPerKaigi2020で発表)」は継続的な生産性向上のためには考えなければならない要素です。
そして、上記を補完するためにしばしばドキュメントが書かれます。

私はドキュメント運用のアプローチとして「コードによる生成を含んだドキュメント運用」に興味を持っています。
私はこれを「Documentation as Code」と呼んでいます。そして、そのような概念はすでに世の中にあり、時として「Documentation as Code」と呼ばれているようです。
例えばPHPDocなどはソースコード自体の構造とアノテーションをトレースしてドキュメントの自動生成を実現しています。
OpenAPIのように構造化されたデータとして情報を記述することでドキュメントと同時にAPIクライアントやの自動生成が実現できている例もあります。 これらはコードによってドキュメントが管理されており、継続的なドキュメンテーションも実現可能です。
さて、ドキュメントと言っても「何を解決するためのドキュメント」なのかを考える必要があると思います。
本発表では、上記のような「Documentation as Code」を実現するツールを独自にモデル化してそれぞれの特性について考えます。
そして、どのような「Documentation as Code」が「開発開始までのオーバヘッドの削減」に繋がるのか、私が実際に取り組んだ(また取り組んでいる)事例を交えて考えていきたいと思います。

69b93af68320a590f607c296e8edff73?s=128

Ken’ichiro Oyama

March 27, 2021
Tweet

Transcript

  1. খࢁ݈Ұ࿠(.01FQBCP *OD 1)1FS,BJHJ ໨తʹԊͬͨ %PDVNFOUBUJPOBT$PEFΛ ͍͔ʹ࣮ͯ͠ݱ͍͔ͯ͘͠

  2. ϓϦϯγύϧΤϯδχΞ খࢁ݈Ұ࿠!L-P8 (.0ϖύϘϗεςΟϯάࣄۀ෦ϗεςΟϯάάϧʔϓ43&νʔϜ IUUQTHJUIVCDPNL-P8 

  3. 

  4. None
  5. ຊൃදʹ͓͚Δ lυΩϡϝϯτzͱ͸ 

  6. ։ൃ։࢝·ͰͷΦʔόʔϔου 

  7. ։ൃ։࢝·ͰͷΦʔόʔϔου w ։ൃऀ͕ɺ஌ࣝθϩͷঢ়ଶ͔ΒγεςϜΛཧղ͠։ൃΛ։࢝͢Δ·Ͱͷ࣌ؒ΍ίε τΛɺຊൃදͰ͸ʮ։ൃ։࢝·ͰͷΦʔόʔϔουʯͱݺͿʢʮΦϯϘʔσΟϯά ͷίετʯͱ͍ͬͨํ͕Ұൠత͔΋ʣ w ։ൃऀ͕γεςϜΛཧղ͍ͨ͠ͱ͖ w ։ൃऀ͕৽ͨʹγεςϜ։ൃʹࢀՃͨ͠ͱ͖ w

    ΋͘͠͸։ൃऀ͕ࣗ෼ͷ୲౰Ҏ֎ͷߏ੒ཁૉ΍ػೳΛཧղ͍ͨ͠ͱ͖ w γεςϜͰར༻͍ͯ͠Δٕज़ελοΫʹे෼ͳ஌ݟ͕͋ͬͨͱͯ͠΋ɺ࣮͸։ൃ։ ࢝·Ͱʹ͸खؒͱ͕͔͔࣌ؒΔ 
  8. ։ൃ։࢝·ͰͷΦʔόʔϔου w ৽ن։ൃͷ৔߹ɺ࣮ࡍʹ։ൃΛ։࢝ ͢Δ·Ͱʹࠨਤʹ͋ΔΑ͏ͳෳ਺ͷ ϨΠϠʔʹ͍ͭͯݕ౼Λ͢Δ w ๨ΕΒΕ͕͕ͪͩɺ్த͔Β։ൃʹ +0*/͢Δ৔߹΋ɺ৽ن։ൃ࣌ͱಉ͡ ਺ͷϨΠϠʔͷཧղ͕ඞཁʹͳΔ w

    ҧ͏ͷ͸ʮ͢Ͱʹ͋Δ΋ͷΛཧղ ͢Δඞཁ͕͋Δʯͱ͍͏͜ͱ͚ͩ  IUUQTTQFBLFSEFDLDPNLMPXQIQFSLBJHJʹमਖ਼ΛՃ͑ͨ΋ͷ ͲͷΑ͏ͳαʔϏε͔ ͲͷΑ͏ͳΞʔΩςΫνϟ͔ ͲͷΑ͏ʹσʔλΛอ࣋͢Δ͔ ʢʹͲͷΑ͏ͳςʔϒϧઃܭ͔ʣ ͲͷΑ͏ͳ։ൃ؀ڥ͔ ʢຊ൪؀ڥɾ։ൃ؀ڥʣ ͲͷΑ͏ͳίʔυ͔ ։ൃ αʔϏεཧղϨΠϠʔ ΞʔΩςΫνϟཧղϨΠϠʔ σʔλετΞཧղϨΠϠʔ ։ൃ؀ڥཧղϨΠϠʔ ίʔυཧղϨΠϠʔ
  9. ։ൃ։࢝·ͰͷΦʔόʔϔουͷ࡟ݮ w ʮ։ൃ։࢝·ͰͷΦʔόʔϔουʯʹ͍ͭͯ͸1)1FS,BJHJʹͯൃද w ຊൃද͸ͦͷଓ͖ͱ͍͑Δ  IUUQTTQFBLFSEFDLDPNLMPXQIQFSLBJHJ

  10. ։ൃऀ͕γεςϜΛཧղ͢Δ 

  11. γεςϜҎ֎ʹԿ΋ͳ͍ঢ়ଶ w ৽͍͠։ൃऀ͸γεςϜΛݟͯཧղΛ͢Δඞཁ͕͋Δ w ։ൃ։࢝·ͰͷΦʔόʔϔου͕େ͖͍ঢ়ଶ 

  12. υΩϡϝϯτͰཧղΛॿ͚Δ w γεςϜͷཧղΛॿ͚ΔͨΊυΩϡϝϯτΛॻ͘ w ৽͍͠։ൃऀ͸υΩϡϝϯτΛ௨ͯ͡γεςϜͷཧղΛਐΊΔ͜ͱ͕Ͱ͖Δ 

  13. ຊൃදʹ͓͚ΔzυΩϡϝϯτ w υΩϡϝϯτΛӡ༻͢Δ໨త ˠ։ൃ։࢝·ͰͷΦʔόʔϔουΛ࡟ݮ͢ΔͨΊ w࡟ݮ͢ΔͨΊʹ͸γεςϜͷཧղΛॿ͚Δ͜ͱ͕Ͱ͖ͳ͍ͱ͍͚ͳ͍ w υΩϡϝϯτ͸͍ͭଘࡏ͢Δ΂͖͔ ˠཧղͯ͠΋Β͍͍ͨγεςϜ͕ଘࡏ͍ͯ͠Δͱ͖ wܧଓతʹؒҧ͍ͷͳ͍े෼ͳυΩϡϝϯτ͕ଘࡏ͠ଓ͚Δඞཁ͕͋Δ w˞৽ن։ൃલͷʢઃܭͳͲͷʣυΩϡϝϯτ͸ຊൃදͷείʔϓ͔Β֎͢

     ʮܧଓతʹʯʮγεςϜͷཧղΛॿ͚ΔʯυΩϡϝϯτ͕ඞཁ
  14. ܧଓతυΩϡϝϯςʔγϣϯ 

  15. γεςϜͱυΩϡϝϯτͷဃ཭ 

  16. γεςϜͱυΩϡϝϯτͷဃ཭ w γεςϜͱυΩϡϝϯτͱͷؒʹ಺༰ͷဃ཭͕ൃੜ͍ͯ͠Δ৔߹͕͋Δ w ʮॻ͍ͯ͋Δ͜ͱ͕ؒҧ͍ͬͯΔʯঢ়ଶʢ৔߹ʹΑͬͯ͸ʮॻ͍ͯ͋Δ͜ͱ͕଍Γͳ͍ʯ΋ʣ w ߃ৗతʹ಺༰ʹ͕ࠩग़͍ͯΔঢ়ଶ w ߋ৽λΠϛϯά͕ͣΕΔ͜ͱͰγεςϜͱυΩϡϝϯτͷ಺༰ʹ͕ࠩग़͍ͯΔঢ়ଶ 

  17. γεςϜͱυΩϡϝϯτͷဃ཭͕͋Δͱ w γεςϜͱͷဃ཭͕͋ΔυΩϡϝϯτͰγεςϜΛཧղ͢ΔͱɺؒҧͬͨཧղͰ։ൃʹ ೖͬͯ͠·͏ w ࣮͸ؔ࿈͕૿͍͑ͯͯؾܰʹ੾Γ཭ͤͳ͘ͳ͍ͬͯͨΠϯελϯε w ࣮͸ߟྀ͠ͳ͍ͱ͍͚ͳ͍͜ͱ͕มΘ͍ܾͬͯͨࡁػೳ w ࣮͸૿͍͑ͯͨόον

    w ։ൃऀ͕ͦͷဃ཭ʹؾͮ͘ͷ͕஗͚Ε͹஗͍΄Ͳ։ൃʹ͓͚ΔϚΠφε͕େ͖͘ͳΔ w γεςϜཧղͷ΍Γͳ͓͠🔥 w ίʔυͷॻ͖௚͠🔥🔥 w ؒҧͬͨཧղͷ··ϦϦʔεɺޙʹো֐🔥🔥🔥🔥🔥🔥 
  18. γεςϜͱυΩϡϝϯτͷؔ܎ w υΩϡϝϯτʹ͸ର৅ͷγεςϜʹ͍ͭͯॻ͔Ε͍ͯΔ w ˠγεςϜͱυΩϡϝϯτͷ֤ཁૉʹ͸ରԠؔ܎͕͋Δ w ˠγεςϜΛߏ੒͢ΔཁૉΛݩͱ͢Δू߹4ͱυΩϡϝϯτΛߏ੒͢ΔཁૉΛݩͱ͢ Δू߹%͕͋Δͱ͖ɺू߹%ͷ֤ݩ͸ඞͣू߹4ͷ͍ͣΕ͔ͷݩͱରԠ͢Δ  %

    4
  19. γεςϜͱυΩϡϝϯτͷؔ܎ w ʮγεςϜͱυΩϡϝϯτͷဃ཭͕େ͖͘ͳΔʯͱ͸ҎԼͷঢ়ଶʹ͋Δݩͷ਺͕େ͖͘ͳΔ͜ͱ w ू߹%ͷ͋Δݩ͕ू߹4ͷݩҎ֎ͷཁૉͱରԠ͍ͯ͠Δʹؒҧ͍͕ॻ͔Ε͍ͯΔ w ू߹4ͷ͋ΔݩʹରԠ͚ͭΒΕΔू߹%ͷݩ͕ଘࡏ͠ͳ͍ʹυΩϡϝϯτ͕ෆ଍ ˞ରԠ͢Δݩ͕ଘࡏ͠ͳ͍͜ͱ͕ඞͣ͠΋ѱ͍Θ͚Ͱ͸ͳ͘ɺͦͷ਺͕࣌ؒͷܦաͱͱ΋ʹ਺͕େ͖͘ͳΔ͜ͱ͕໰୊  %

    4 
  20. γεςϜͱυΩϡϝϯτͷဃ཭Λখ͘͢͞Δʹ͸ γεςϜͱυΩϡϝϯτͷဃ཭Λখ͘͢͞ΔͨΊʹ͸ɺ·ͣɺγεςϜͱυΩϡϝϯ τͷဃ཭Λ൑அͰ͖Δ࢓૊Έ͕ඞཁ wγεςϜͱυΩϡϝϯτͷରԠؔ܎Λද͢Ұछͷؔ਺͕ඞཁ ͦͯ͠ɺဃ཭͕͋ΔظؒΛͰ͖Δ͚ͩখ͘͢͞ΔͨΊʹ wܧଓతʹ wͰ͖Δ͚ͩγεςϜͷߋ৽ʹ͍ۙλΠϛϯάͰ υΩϡϝϯτΛγεςϜʹ߹Θͤͯߋ৽͠ଓ͚Δ͜ͱ͕ඞཁ 

  21. %PDVNFOUBUJPOBT$PEF 

  22. %PDVNFOUBUJPOBT$PEF %PDTBT$PEF SFGFSTUPBQIJMPTPQIZUIBUZPV TIPVMECFXSJUJOHEPDVNFOUBUJPOXJUIUIFTBNFUPPMTBTDPEF *TTVF5SBDLFST 7FSTJPO$POUSPM (JU  1MBJO5FYU.BSLVQ .BSLEPXO

    SF4USVDUVSFE5FYU "TDJJEPD  $PEF3FWJFXT "VUPNBUFE5FTUT 5IJTNFBOTGPMMPXJOHUIFTBNFXPSLqPXTBTEFWFMPQNFOUUFBNT BOE CFJOHJOUFHSBUFEJOUIFQSPEVDUUFBN*UFOBCMFTBDVMUVSFXIFSFXSJUFST BOEEFWFMPQFSTCPUIGFFMPXOFSTIJQPGEPDVNFOUBUJPO BOEXPSL UPHFUIFSUPNBLFJUBTHPPEBTQPTTJCMF IUUQTXXXXSJUFUIFEPDTPSHHVJEFEPDTBTDPEFɹΑΓൈਮɹ 
  23. %PDVNFOUBUJPOBT$PEF w γεςϜͷ։ൃͷۙ͘ʹυΩϡϝϯτ࡞੒ͷ࢓૊ΈΛஔ͘͜ͱͰɺ։ൃαΠΫϧͷ தʹυΩϡϝϯτ࡞੒Λ౷߹͠ɺγεςϜͱυΩϡϝϯτͷဃ཭Λখ͘͞͠Α͏ͱ ͍ͯ͠Δ͜ͱ͕Θ͔Δ w ͨͩɺจԽతͳ࢓૊ΈͰ͋ͬͯɺγεςϜͱυΩϡϝϯτͷରԠؔ܎Λදؔ͢਺ ͸ͳ͍ɻ w ·ͣɺ͜ͷʮ%PDVNFOUBUJPOBT$PEFʯ͔Β΋͏গ͠ʮγεςϜͱυΩϡϝϯτ

    ͷରԠؔ܎ʹண໨ͯ͠ဃ཭Λͳ͘͢ʯ͜ͱʹ౿ΈࠐΜͩΞϓϩʔνʹ͍ͭͯߟ͑ͯ ͍͘ 
  24. ϞσϧԽ ొ৔͢Δཁૉͱͯͭ͠  ։ൃऀ  γεςϜʜ։ൃऀ͕։ൃ΍ઃఆΛ͢Δର৅ɻίʔυɺΞϓϦέʔγϣϯɺσʔλ ϕʔεɺΠϯϑϥͳͲɻγεςϜࣗମ͸ߏ଄Խ͞Ε͍ͯΔʢ΋ͷΛର৅ͱ͢Δʣ  υΩϡϝϯτ 

    ߏ଄Խσʔλʜʮ:".-ʯ΍ʮϓϩάϥϜίʔυͷ"45ʯͳͲɻ ٯʹɺʮγεςϜʹର͢Δ։ൃऀͷཧղɾΠϝʔδʯ͸ෆఆܗͰ։ൃऀͦΕͧΕ ͕಄ͷதͰ͍࣋ͬͯΔ͚ͩͳͷͰߏ଄Խ͸͞Ε͍ͯΔͱ͸ݴ͑ͳ͍  ιϑτ΢ΣΞʜԿ͔͠ΒͷॲཧΛߦ͏ϓϩάϥϜɻߏ଄ԽσʔλΛೖग़ྗͱ͠ ΍͍͢ͱ͍͏ಛ௃Λ࣋ͭ 
  25. ʮͨͩυΩϡϝϯτΛॻ͘ʯ w ʮͨͩυΩϡϝϯτΛॻ͘ʯͱ w γεςϜ͕ߋ৽͞Εͨͱ͖ʹɺυΩϡϝϯτͷͲ͜Λߋ৽͢Ε͹ྑ͍ͷ͔͕Θ͔Γ ʹ͍͘ ˠγεςϜͱυΩϡϝϯτͷରԠؔ܎Λදؔ͢਺͕ͳ͍ 

  26. γεςϜͱυΩϡϝϯτͷဃ཭Λͳ͘͢Ξϓϩʔν 

  27. γεςϜ͔Βߏ଄ԽσʔλΛநग़ͯ͠ υΩϡϝϯτੜ੒Λ͢Δ 

  28. γεςϜ͔Βߏ଄ԽσʔλΛநग़͢Δ w +BWBEPDɺHPEPDɺ1)1%PDFUD w γεςϜ͔ΒυΩϡϝϯτΛੜ੒͢Δ͜ ͱͰɺγεςϜͱυΩϡϝϯτͷဃ཭Λ ͳͦ͘͏ͱ͍ͯ͠Δ  υΩϡϝϯτ ߏ଄Խσʔλ

    γεςϜ
  29. ຊൃදʹ͓͚ΔʮΞϊςʔγϣϯʯ wຊൃදʹ͓͚ΔʮΞϊςʔγϣϯʯͱ͸ɺʮγεςϜʹର͢Δ։ൃऀͷཧղɾΠϝʔ δΛߏ଄Խσʔλʹϝλ৘ใͱͯ͠௥Ճ͢Δʯͱ͍͏ҙຯ w 1)1%PDͳͲͰ͸ɺίϝϯτΛιʔείʔυʹ wιʔείʔυͷʮߏ଄ʹԊͬͨܗͰʯ w͔ͭʮܾΊΒΕͨϑΥʔϚοτʹैͬͯʯ ௥Ճ͢Δ͜ͱͰɺॳΊͯ࠷ऴతͳυΩϡϝϯτʹ൓ө͞ΕΔˠΞϊςʔγϣϯ ্هҎ֎ͷίϝϯτ͸υΩϡϝϯτ͔Β͸ແࢹ͞ΕΔˠΞϊςʔγϣϯͰ͸ͳ͍ 

  30. γεςϜ͔Βߏ଄ԽσʔλΛநग़͢Δ w ߏ଄ԽσʔλʢιʔείʔυʣʹܾΊΒ ΕͨϑΥʔϚοτͰʢυοΫίϝϯτ ΛʣΞϊςʔγϣϯ͍ͯ͠Δ͚ͩͳͷͰ ߏ଄Խσʔλͷཁૉ਺΍υΩϡϝϯτ΍ γεςϜͱͷରԠؔ܎͸ͦͷ··  υΩϡϝϯτ ߏ଄Խσʔλ

    γεςϜ
  31. ߏ଄Խσʔλ͔ΒγεςϜͱυΩϡϝϯτͷ ྆ํΛੜ੒͢Δ 

  32. ߏ଄Խσʔλ͔ΒγεςϜͱυΩϡϝϯτͷ྆ํΛੜ੒͢Δ w 0QFO"1* w ੜ੒ݩσʔλΛͭʹ͢Δ͜ͱͰγες ϜͱυΩϡϝϯτͷဃ཭Λͳͦ͘͏ͱ͠ ͍ͯΔ  υΩϡϝϯτ ߏ଄Խσʔλ

    γεςϜ
  33. ͭͷΞϓϩʔνͷڞ௨఺ w ͭͷྫͷڞ௨఺ͱͯ͠ɺγεςϜͱυΩϡϝϯτͷؒʹߏ଄ԽσʔλΛհͨؔ͠ ࿈Λ͍࣋ͬͯΔ͜ͱ͕Θ͔Δɻ w γεςϜͱυΩϡϝϯτͷରԠؔ܎Λදؔ͢਺Λ͍࣋ͬͯΔͱ͍͏͜ͱʹͳΔ 

  34. *OGSBTUSVDUVSFBT$PEF w ྫ͑͹ɺ5FSSBGPSNΛಉ༷ͷϞσϧͰද͢ɻͱɺࣗͣͱυΩϡϝϯςʔγϣϯͷ࢓ ૊ΈΛೖΕΔ΂͖Օॴ͕Θ͔Δ 

  35. *OGSBTUSVDUVSFBT$PEF %PDVNFOUBUJPO w ͦͯ͠طʹ͜ͷϞσϧΛ࣮ݱͨ͠υΩϡϝϯςʔγϣϯπʔϧ͸͋Δ w IUUQTHJUIVCDPNUFSSBGPSNEPDTUFSSBGPSNEPDT 

  36. (.0ϖύϘʹ͓͚Δ ܧଓతυΩϡϝϯςʔγϣϯ 

  37. σʔλϕʔεεΩʔϚͷ υΩϡϝϯςʔγϣϯ 

  38. 

  39. UCMT w $*ϑϨϯυϦͳσʔλϕʔευΩϡϝϯτੜ੒πʔϧ w IUUQTHJUIVCDPNL-P8UCMT w 1PTUHSF42- .Z42-ͳͲͷ3%#.4͚ͩͰͳ͘ɺ #JH2VFSZ΍"NB[PO%ZOBNP%# $MPVE4QBOOFS

    ͱ͍ͬͨσʔλιʔεʹ΋ରԠ w υΩϡϝϯτΛॆ࣮ͤ͞Δػೳͱͯ͠ϝλσʔλΛ Ξϊςʔγϣϯ͢Δ͜ͱ͕Մೳ w ςʔϒϧɺΧϥϜͳͲͷίϝϯτ෇༩͚ͩͰͳ͘ λάɺϦϨʔγϣϯͳͲ 
  40. UCMT w ैདྷ͸σʔλϕʔεͱυΩϡϝϯτ͸ผ Ͱ؅ཧ w $*্Ͱςετ༻σʔλϕʔε͔Β௚઀ ςʔϒϧఆٛΛߏ଄Խσʔλͱͯ͠ந ग़ɻͦΕʹ௥ՃͰςʔϒϧίϝϯτ΍Χ ϥϜίϝϯτΛΞϊςʔγϣϯ͠ɺυ ΩϡϝϯτΛੜ੒

    
  41. ίϚϯυͷ υΩϡϝϯςʔγϣϯ 

  42. GSHN 

  43. GSHN w ϝλͳεχϖοτϚωʔδϟ w IUUQTHJUIVCDPNL-P8GSHN w ϝλʜ"MGSFE΍QFUͳͲɺଞͷεχϖο τϚωʔδϟͷϑΝΠϧܗࣜΛΠϯϙʔ τΤΫεϙʔτͰ͖Δ w

    QFDP΍G[GͳͲͱ࿈ܞͯ͠୯ମͷίϚϯ υิ׬πʔϧͱͯ͠ಈ͔͢͜ͱ΋Մೳ 
  44. GSHN wʮଞͷεχϖοτϚωʔδϟͷϑΝΠϧܗࣜʹΤΫεϙʔτͰ͖Δʯ ʮ։ൃऀ͸ࣗ෼ͷ޷͖ͳεχϖοτϚωʔδϟΛ࢖͏͜ͱ͕Ͱ͖Δʯ w νʔϜͰڞ༗͍ͨ͠ศརίϚϯυΛ·ͱΊΔํ๏ͱͯ͠ʮͨͩͷศརίϚϯυू ϖʔδʯΛ࡞ΔΑΓ΋ศརʢΈΜͳ࢖͍͍ͨεχϖοτϚωʔδϟ͸ҧ͏ʣ 

  45. GSHNʹΑΔεχϖοτͷϥΠϑαΠΫϧ GSHNܗࣜͷεχϖοτϑΝΠϧΛอଘ͢ΔεχϖοτϦϙδτϦΛ࡞੒ εχϖοτϦϙδτϦ͔ΒεχϖοτϑΟΠϧΛऔಘʢෳ਺ϦϙδτϦਪ঑ʣ ޷͖ͳεχϖοτϚωʔδϟͷεχϖοτϑΝΠϧܗࣜʹ·ͱΊͯΤΫεϙʔτ  εχϖοτϦϙδτϦͷߋ৽ΛશͯऔಘˠΛ࣮ߦ  frgm repo add

    https://github.com/k1LoW/my-snippets.git frgm repo add https://github.com/org/team-snippets.git … frgm export --to ~/Library/Application Support/Alfred/Alfred.alfredpreferences/snippets \ --format Alfred frgm repo pull
  46. GSHNʹΑΔυΩϡϝϯςʔγϣϯ w ͞ΒʹɺGSHN͸ίϚϯυͷυΩϡϝϯτ ͷੜ੒͕Մೳ w GSHNͷϑΝΠϧܗࣜʹ͸EFTD΍ MBCFMTͳͲɺίϚϯυʹΞϊςʔγϣϯ Λ෇༩͓ͯ͘͠৔ॴ͕͋Δ  frgm

    export --to /path/to --format md
  47. GSHNʹΑΔυΩϡϝϯςʔγϣϯ w νʔϜ΍ݸਓɺαʔϏε༻ͷεχϖοτ ϦϙδτϦΛ࡞੒ͯ͠εχϖοτΛ௥Ճ ͍ͯ͘͠ w ಉ࣌ʹ$*ͰυΩϡϝϯτΛࣗಈੜ੒ w ʮߏ଄Խσʔλ͔ΒεχϖοτͱυΩϡ ϝϯτͷ྆ํΛੜ੒͢ΔʯͷͰίϚϯυ

    ͱυΩϡϝϯτͷဃ཭͕ͳ͍ 
  48. ܧଓతυΩϡϝϯςʔγϣϯ w ʮܧଓతʹɺؒҧ͍ͷͳ͍े෼ͳυΩϡϝϯτΛଘࡏ͠ଓ͚ͤ͞Δʯͱ͸ʮγε ςϜ͕มԽͯ͠΋γεςϜͱυΩϡϝϯτͷဃ཭Λେ͖͘͠ͳ͍ʯͱ͍͏͜ͱ w ͦͷͨΊʹ͸ɺγεςϜͱυΩϡϝϯτੜ੒Λؔ࿈ͤ͞ɺγεςϜͷมԽ͕υ Ωϡϝϯτʹ൓ө͞ΕΔ࢓૊ΈΛ࣋ͭ͜ͱ͕๬·͍͠ w ·ͨɺγεςϜࣗମ͕ߏ଄ԽσʔλͰ͋Δ͜ͱʹண໨্͠هͷ࢓૊ΈΛιϑτ ΢ΣΞʹΑΓࣗಈԽɺ͞Βʹ$*ͷ࢓૊ΈʹࡌͤΔ͜ͱͰɺγεςϜͱυΩϡϝϯ

    τͷဃ཭ΛݶΓͳ͘খ͘͞อͭ͜ͱ͕ՄೳʹͳΔ 
  49. γεςϜͷཧղΛॿ͚Δ υΩϡϝϯςʔγϣϯ 

  50. ࣗ෼ͷܦݧ͔Βߟ͑ΔγεςϜͷཧղͷྲྀΕ w γεςϜશମͷΠϯϑϥߏ੒ਤ΍Ϋϥεਤ΍ςʔϒϧઃܭॻΛ౉͞Εͯɺ͔ͦ͜Β શମΛཧղͯ͠։ൃ։࢝Λ͢Δͷ͸࣮͸೉͍͠ w ҰํͰɺʮ։ൃऀ͕։ൃΛ։࢝͢ΔʹԿ͔͠Βमਖ਼΍τϥϒϧγϡʔτΛ։࢝͢ ΔʯͨΊʹඞཁͳγεςϜͷཧղ͸ʮશମͰ͸ͳ͍ʯͱ͍͏ͷ΋ࣄ࣮ w ͋ΔҰఆن໛Ҏ্ͷγεςϜͷશମͷཧղ͸ɺػೳ୯ҐͩͬͨΓը໘୯ҐͩͬͨΓ ϩʔϧ୯ҐͩͬͨΓɺʮطଘͷ։ൃऀʹΑͬͯάϧʔϐϯά͞Εͯఏڙ͞Εͨʯγ

    εςϜͷҰ෦෼ͷ৘ใͷཧղΛੵΈॏͶͨ݁ՌͰ͋Δ͜ͱ͕ܦݧଇͱͯ͋͠Δ Έͳ͞Μ͸Ͳ͏Ͱ͠ΐ͏͔ʁ 
  51. υΩϡϝϯτʹىͦ͜͏ͱ͍ͯ͠Δ΋ͷϓϩδΣΫτ΍։ൃγεςϜͷશମ ૾͸ɺ۩ମతʹܗ͕͋Δ΋ͷͰ͸ͳ͘ɺͦΕͧΕͷ಄ͷதʹෆఆܗͳΠϝʔδͱ ͯ͠ଊ͑ΒΕ͍ͯΔͱࢥ͍·͢ɻ ෆఆܗͳΠϝʔδͷೝࣝΛ߹ΘͤΔͨΊʹࢲ͕ߟ͍͑ͯΔ͜ͱɺͦΕ͸ྠ੾Γʹ ͢Δ͜ͱͰ͢ɻ ྠ੾Γʹ͢Δͱ͖ʹ੾ͬͨ໘͕அ໘͕Ͱ͖ΔΘ͚Ͱ͕͢ɺ͜ͷஅ໘ΛੵΈॏͶͯ ͍͘ͱཱମͱͳΓɺશମ૾͕ݱΕ·͢ɻ ෆఆܗͳΠϝʔδΛڞ༗͢Δ͜ͱ͸೉͍͠ͱࢥ͍·͕͢ɺࣗ෼ͳΓʹஅ໘Λෳ਺ ࡞ΓɺͦΕΛੵΈॏͶ͍͚ͯ͹ࣗ෼ͳΓͷཱମΛཧղͯ͠΋Β͏͜ͱ͕Ͱ͖Δ͸ ͣͩͱߟ͑·͢ɻ

    ʮϚωδϝϯτۀΛ௨ͯ͡ߟ͑ͨɺϓϩδΣΫτશମ૾ͷೝࣝᴥᴪΛ๷͙ޡղ͞Εͳ͍υΩϡϝϯτ࡞੒ज़"/%1"%5FDI#MPHʯ IUUQTUFDIBOEQBEDPKQFOUSZΑΓൈਮɹ 
  52. 

  53.  ιϑτ΢ΣΞΞʔΩςΫνϟͷଟ͘ͷஶऀ͕ɺͨͬͨͭͷϞσϧΛ࢖ͬͯιϑτ ΢ΣΞΞʔΩςΫνϟΛهड़͢Δ͜ͱ͸શ͘ෆՄೳͩͱࢦఠ͍ͯ͠ΔɻͦͷΑ͏ͳ Ϟσϧ͸ɺཧղ͠ʹ্͍͘ɺΞʔΩςΫνϟͰ࠷΋ॏཁͳػೳΛ໌֬ʹಛఆͰ͖Δ ݟࠐΈ͸΄ͱΜͲͳ͍ɻʢதུʣ ϏϡʔʢWJFXʣͱ͸ɺҰਓҎ্ͷεςʔΫϗϧμ๊͕͍͍ͯΔͭ·ͨ͸ͦΕҎ্ ͷؔ৺ࣄʹɺΞʔΩςΫνϟ͕Ͳ͏ରԠ͢Δ͔Λࣔ͢ɺΞʔΩςΫνϟͷͭҎ্ͷ ߏ଄తଆ໘Λදݱͨ͠΋ͷͰ͋Δɻ ʮؔ৺ࣄʹ߹ΘͤͯΞʔΩςΫνϟΛͭҎ্ͷଆ໘ʢ੾ΓޱʣͰදݱ͢Δʯ ͜ͷߟ͑ํ͸ઃܭ͚ͩͰͳ͘υΩϡϝϯςʔγϣϯʹ΋౰ͯ͸ΊΔ͜ͱ͕Ͱ͖Δ

    χοΫɾϩβϯεΩ Φ΢Σϯɾ΢οζιϑτ΢ΣΞγεςϜΞʔΩςΫνϟߏஙͷݪཧୈ൛ +BQBOFTF&EJUJPO ΑΓൈਮɹ
  54. γεςϜΛෳ਺ͷ੾ΓޱͰυΩϡϝϯτԽ͢Δ w γεςϜʹର͢Δؔ৺ࣄʹ߹ΘͤͯඞཁͳγεςϜͷཁૉ͚ͩΛ·ͱΊͯʮϏϡʔʯͱ͠ υΩϡϝϯτԽ͢ΔʢʮϢʔβ͔Βͷ)551ϦΫΤετʯʮϚΠΫϩαʔϏε୯ҐʯͳͲʣ w ؔ৺ࣄʜγεςϜΛཧղ͢Δ্Ͱҙຯͷ͋Δάϧʔϐϯά  % 4 %

    %
  55. (.0ϖύϘʹ͓͚Δ γεςϜͷཧղΛॿ͚ΔυΩϡϝϯςʔγϣϯ 

  56. OEJBH 

  57. OEJBH --- name: 3-Tier Architecture docPath: ../output Views: - name:

    overview layers: ["consul", "vip_group"] - name: http-lb layers: ["vip_group"] labels: ["http"] nodes: - name: lb-* components: - nginx?icon=lb-l7 clusters: - 'consul:dc1' - 'vip_group:lb' - name: app-* components: - nginx?icon=proxy - Rails?icon=cube4 clusters: - 'consul:dc1' - name: db-* components: - PostgreSQL?icon=db clusters: - 'consul:dc1' networks: - labels: - http route: 
  58. OEJBH w IUUQTHJUIVCDPNL-P8OEJBH w ʮΤψσΟΞάʯʮΤψμΠΞάʯͲͪΒͰ΋ ndiag doc -c ndiag.yml w

    ੜ੒͞ΕΔυΩϡϝϯτ͸(JU)VCʹίϛοτͯ͠8FC্͔ΒӾཡ͞ΕΔ͜ͱ૝ఆ w ओʹΠϯϑϥͷϋΠϨϕϧΞʔΩςΫνϟͷυΩϡϝϯτΛੜ੒͢Δ໨తͰ։ൃ w :".-͔Βʮߏ੒ਤΛੜ੒͢ΔʯͰ΋ʮυΩϡϝϯτΛੜ੒͢ΔʯͰ΋ͳ͘ ʮෳ਺ͷ੾ΓޱͰʯʮߏ੒ਤΛؚΉʯʮυΩϡϝϯτͷ਽ܗΛ࡞Δʯ ͱ͍͏ಛ௃Λ࣋ͭ 
  59. ʮෳ਺ͷ੾ΓޱͰʯ w ୯७ʹෳ਺ͷυΩϡϝϯτΛ࡞੒ͯ͠͠·͏ͱɺγεςϜͱυΩϡϝϯτͱͷରԠ ؔ܎͕ؔ਺ͰදݱͰ͖ͣɺγεςϜͱυΩϡϝϯτͷဃ཭͕ൃੜ͢Δ w ͦͷͨΊɺOEJBHͰ͸ҎԼͷΞϓϩʔνͰγεςϜͱυΩϡϝϯτͷߏ଄Խσʔλ Λհͨؔ͠܎ੑ͕੾Εͳ͍Α͏ʹ͍ͯ͠Δ w γεςϜΛදݱ͢Δͭͷߏ଄Խσʔλ͔Β੾ΓޱͷҟͳΔෳ਺ͷߏ଄ԽσʔλΛ ϧʔϧʹԊͬͯੜ੒͠ɺͦΕΒ͔ΒͦΕͧΕਤͱυΩϡϝϯτΛੜ੒͢Δ

    w ߏ଄ԽσʔλͱγεςϜͱΛൺֱݕূͰ͖Δ࢓૊ΈΛఏڙ͢Δ 
  60. OEJBHͷϞσϧ 

  61. ʮߏ੒ਤΛؚΉʯ  w ΠϯϑϥͷΞʔΩςΫνϟΛཧղ͢ΔͨΊͷ υΩϡϝϯτΛੜ੒͢Δʹ౰ͨͬͯਤ͸ॏཁ ͳཁૉɻੜ੒͞ΕΔਤͷݟ΍͢͞΋ॏཁ w ͦͷͨΊOEJBH͸ਤʹ࢖༻Ͱ͖ΔΞΠίϯ΋ ͍Ζ͍Ζબ୒Ͱ͖Δ w

    ૊ΈࠐΈΞΠίϯϑϨʔϜϫʔΫ w ೚ҙͷը૾ʢQOHTWHʣ w ,T"84($1)BTIJDPSQ͕ఏڙ͍ͯ͠ ΔΞΠίϯηοτΛऔಘ͢ΔίϚϯυ
  62. ʮυΩϡϝϯτͷ਽ܗΛ࡞Δʯ w υΩϡϝϯτͷੜ੒ݩ͸ߏ଄ԽσʔλͰ͋Δ΄͏͕γεςϜͱͷဃ཭Λখ͘͞͠΍ ͘͢Ͱ͖Δͱ͍͏ͷ͸ຊൃදͰड़΂ͨͱ͓Γɻ w OEJBH΋Πϯϑϥͷ֤ཁૉͷઆ໌จষ௥Ճ͸ʮΞϊςʔγϣϯʯͷܗͰ࣮ݱɻ w ͭ·ΓOEJBH͸ߏ଄Խσʔλ͔ΒυΩϡϝϯτΛੜ੒͢Δ w ͔͠͠ɺઆ໌จষ͸ςʔϒϧίϝϯτͱ͸ҟͳΓ௕จʹͳΔ͜ͱ͕༧૝͞ΕͨͷͰ

    ҎԼͷํࣜΛ࠾༻  ·ͣOEJBHଆͰઆ໌จষهड़ઐ༻ͷϑΝΠϧΛॴఆͷҐஔʹੜ੒  ։ൃऀ͸ͦͷઐ༻ϑΝΠϧʹઆ໌จষΛهड़  OEJBH͸υΩϡϝϯτੜ੒࣌ʹઐ༻ϑΝΠϧͷ಺༰ΛऔΓࠐΉ 
  63. υΩϡϝϯτͷΧόϨοδ w UCMT΋OEJBH΋υΩϡϝϯτ͸ʮ݀ຒΊʯͷঢ়ଶʹ·Ͱ͍͚͍࣋ͬͯͯΔ w υΩϡϝϯτͷΧόϨοδܭଌ͕ՄೳˠͦΕͧΕΧόϨοδܭଌػೳΛ࣋ͭ  ndiag coverage Elements Coverage

    All Elements 21% (53/252) Views 66.7% (2/3) Nodes 100% (36/36) Components 15.4% (18/117) Relations 0% (0/67) Layers 100% (7/7) Labels 28.6% (6/21)
  64. (.0ϖύϘʹ͓͚ΔOEJBHಋೖঢ়گ w ϖύϘ͕ӡ༻͍ͯ͠Δෳ਺ͷαʔϏεͷ͏ͪͷҰ෦ͰΞʔΩςΫνϟυΩϡϝϯτ Λ࡞੒͢Δͷʹར༻ w ͔ͦ͜Β༷ʑͳϑΟʔυόοΫΛ΋Βͬͯػೳ௥ՃΛ͍ͯ͠Δ w ࣾ಺Ͱ͸࣌ؒఔ౓ͷϋϯζΦϯΛ։࠵࣮͠ࡍʹಈ͔ͯ͠΋Βͬͯཧղͯ͠΋Βͬ ͍ͯΔ 

  65. γεςϜͷཧղΛॿ͚ΔυΩϡϝϯςʔγϣϯ w γεςϜશମΛදͭ͢ͷυΩϡϝϯτͰγεςϜΛཧղ͢Δͷ͸೉͍͠ w γεςϜશମΛද͢ͷͰ͸ͳ͘ɺγεςϜͷཧղʹҙຯͷ͋ΔάϧʔϐϯάΛͯ͠ ͦΕͧΕυΩϡϝϯτԽ͢Δ w ͦΕͧΕͷυΩϡϝϯτ͸γεςϜͱͷରԠؔ܎ΛଛͳΘͳ͍࢓૊ΈͰ࡞੒͢Δ w ্هΞϓϩʔνͷҰ࣮૷ͱͯ͠OEJBHΛ঺հ

    w ։ൃऀ͸ͦΕͧΕͷυΩϡϝϯτΛ௨ͯ͡γεςϜ΁ͷཧղΛੵΈॏͶΔ͜ͱͰ ࠷ऴతʹγεςϜશମͷཧղʹͭͳ͛Δ 
  66. ΞϓϦέʔγϣϯίʔυͷ υΩϡϝϯςʔγϣϯߏ૝ 

  67. ΞϓϦέʔγϣϯίʔυͷυΩϡϝϯςʔγϣϯ w ͋͘·ͰΞΠσΞʢ͍ͦͯۙ͠͠΋ͷ΋͢Ͱʹ͋Δʣ w 1)1%PD͸ʮܧଓతυΩϡϝϯςʔγϣϯʯ͸࣮ݱͰ͖͍ͯΔ͕ɺຊൃදʹ͓͚Δʮγ εςϜͷཧղΛॿ͚ΔʯΞϓϩʔνΛͱ͍ͬͯΔͱ͸ݴ͑ͳ͍ w γεςϜͷཧղΛॿ͚ΔγεςϜͷཧղʹҙຯͷ͋Δෳ਺ͷ੾ΓޱͰͷάϧʔϐϯά w ͱ͜ΖͰզʑ͸ΞϓϦέʔγϣϯͷཧղΛͲͷΑ͏ͳ୯ҐͰੵΈॏͶ͍͔ͯ͘

    㲈ػೳ୯Ґ΍"1*ͷΤϯυϙΠϯτ୯Ґ ΞϓϦέʔγϣϯ΋γεςϜͷཧղʹҙຯͷ͋Δάϧʔϐϯά͕͞ΕͨυΩϡϝϯτ Λܧଓతʹੜ੒Ͱ͖Ε͹γεςϜͷཧղΛॿ͚ΔͷͰ͸ͳ͍͔ͱ͍͏ΞΠσΞ 
  68. ίʔυΞϊςʔγϣϯͱ ΞϓϦέʔγϣϯ࣮ߦ࣌ͷτϨʔγϯά৘ใΛ׆༻ͨ͠ ΞʔΩςΫνϟυΩϡϝϯςʔγϣϯ 

  69. ΞΠσΞ w ΞϓϦέʔγϣϯίʔυͷ͋ΔϝιουʹʮελʔτʯΛࣔ͢ίʔυΞϊςʔ γϣϯΛ௥Ճʢ΋͘͠͸ઐ༻ͷςετέʔεΛ༻ҙʣ w ΞϓϦέʔγϣϯΛ࣮ߦͯ͠ελʔτͷϝιου͔ΒͷελοΫτϨʔε৘ใΛ औಘ w ελοΫτϨʔε৘ใ͔ΒҰ෦ෆඞཁͳ৘ใΛআ͍ͨҰ࿈ͷॲཧͷྲྀΕʹઆ໌จ ষΛ௥Ճ͢Δ͜ͱͰͭͷυΩϡϝϯτͱ͢ΔɻҰ࿈ͷྲྀΕʹग़ͯ͘Δϝιουͷ

    ίʔυΞϊςʔγϣϯͷ৘ใʢ1)1%PDͷ৘ใʣ΋߹Θͤͯදࣔ 
  70. ϝϦοτ w ΞϓϦέʔγϣϯʹ͓͚Δؔ৺ࣄ୯ҐͷυΩϡϝϯτΛ࣮ࡍͷίʔυͱରԠͤ͞ ͯ࡞੒Ͱ͖Δ w ίʔυͱͷ͕ࠩੜͨ͡৔߹ʹ$*ͳͲΛ௨ͯ͡ݕ஌Մೳ w υΩϡϝϯτͷΧόϨοδ΋ܭଌՄೳ w ୯ମͰ͸શମΛ၆ᛌͰ͖ͳ͍1)1%PDͷΑ͏ͳίʔυΞϊςʔγϣϯ৘ใͱɺͦ

    ͷ··ͩͱಡΈʹ͍͘ελοΫτϨʔε৘ใΛ߹ΘͤΔͱ͍͏ɺطଘͷٕज़Ͱऔ ಘͰ͖Δ৘ใΛ࢖ͬͯΞϓϦέʔγϣϯΛཧղΛॿ͚ΔυΩϡϝϯτΛੜ੒Ͱ͖ Δ 
  71. Ϟσϧ 

  72. ࣮૷ͷΞΠσΞ w ϓϩάϥϛϯάݴޠʹґଘ͠ͳ͍࣮૷ʹ͍ͨ͠ w ʮίʔυΞϊςʔγϣϯͷτϨʔεʯʮΞϓϦέʔγϣϯ࣮ߦͷτϨʔεʯ͸ݴޠ ґଘͰ࡞੒͠ɺͦΕΒͷग़ྗ͚ͩ౷Ұͯ͠ɺʮτϨʔε৘ใ͔ΒͷυΩϡϝϯτ ੜ੒ʯ͸൚༻ੑΛ͍࣋ͨͤͨ w ۩ମతͳ࣮૷͸ྫ͑͹ɺ1)1Ͱ͋Ε͹ w

    ίʔυΞϊςʔγϣϯͷτϨʔεˠ1)1%PDͷػೳͰ࣮ݱͰ͖ͦ͏ w ΞϓϦέʔγϣϯ࣮ߦͷτϨʔεˠελʔτ͔ΒͷEFCVH@USBDF ͚ͩΛύʔ ε͢ΔπʔϧͰे෼͔΋ 
  73. ·ͱΊ 

  74. ·ͱΊ w ։ൃ։࢝·ͰͷΦʔόʔϔουΛ࡟ݮ͢ΔυΩϡϝϯτΛӡ༻͍ͯͨ͘͠Ίʹ͸ ʮ%PDVNFOUBUJPOBT$PEFʯΛجຊͱ͠ͳ͕Β΋ɺʮܧଓతʹʯӡ༻Ͱ͖Δ࢓૊Έɺ ʮγεςϜͷཧղΛॿ͚Δʯ࢓૊Έ͕ඞཁͩͱ͍͏͜ͱΛओுͨ͠ w ܧଓతυΩϡϝϯςʔγϣϯͷͨΊʹ͸γεςϜͱυΩϡϝϯτͷဃ཭Λ൑ఆ͠খ͞ ͘͢Δ࢓૊Έ͕ඞཁͰ͋Δ͜ͱΛ঺հͨ͠ɻ w γεςϜͷཧղΛॿ͚ΔυΩϡϝϯτͷͭͷํ๏ͱͯ͠ʮγεςϜશମΛද͢ͷͰ͸

    ͳ͘ɺγεςϜͷཧղʹҙຯͷ͋ΔάϧʔϐϯάΛͯͦ͠ΕͧΕυΩϡϝϯτԽ͢ ΔɻͦΕͧΕͷཧղΛॏͶΔ͜ͱͰγεςϜશମͷཧղʹͭͳ͛Δʯͱ͍͏ํ๏Λ঺ հͨ͠ɻ w ʮܧଓతυΩϡϝϯςʔγϣϯʯͱʮγεςϜͷཧղΛॿ͚ΔυΩϡϝϯςʔγϣ ϯʯΛཱ྆ͯ͠ॳΊͯ։ൃ։࢝·ͰͷΦʔόʔϔουΛ࡟ݮͰ͖Δ 
  75. 5IBOLZPV ࠷৽ͷ࠾༻৘ใΛνΣοΫˠ !QC@SFDSVJU