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」が「開発開始までのオーバヘッドの削減」に繋がるのか、私が実際に取り組んだ(また取り組んでいる)事例を交えて考えていきたいと思います。

Ken’ichiro Oyama

March 27, 2021
Tweet

More Decks by Ken’ichiro Oyama

Other Decks in Technology

Transcript

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  5. ։ൃ։࢝·ͰͷΦʔόʔϔου
    w ։ൃऀ͕ɺ஌ࣝθϩͷঢ়ଶ͔ΒγεςϜΛཧղ͠։ൃΛ։࢝͢Δ·Ͱͷ࣌ؒ΍ίε
    τΛɺຊൃදͰ͸ʮ։ൃ։࢝·ͰͷΦʔόʔϔουʯͱݺͿʢʮΦϯϘʔσΟϯά
    ͷίετʯͱ͍ͬͨํ͕Ұൠత͔΋ʣ
    w ։ൃऀ͕γεςϜΛཧղ͍ͨ͠ͱ͖
    w ։ൃऀ͕৽ͨʹγεςϜ։ൃʹࢀՃͨ͠ͱ͖
    w ΋͘͠͸։ൃऀ͕ࣗ෼ͷ୲౰Ҏ֎ͷߏ੒ཁૉ΍ػೳΛཧղ͍ͨ͠ͱ͖
    w γεςϜͰར༻͍ͯ͠Δٕज़ελοΫʹे෼ͳ஌ݟ͕͋ͬͨͱͯ͠΋ɺ࣮͸։ൃ։
    ࢝·Ͱʹ͸खؒͱ͕͔͔࣌ؒΔ

    View full-size slide

  6. ։ൃ։࢝·ͰͷΦʔόʔϔου
    w ৽ن։ൃͷ৔߹ɺ࣮ࡍʹ։ൃΛ։࢝
    ͢Δ·Ͱʹࠨਤʹ͋ΔΑ͏ͳෳ਺ͷ
    ϨΠϠʔʹ͍ͭͯݕ౼Λ͢Δ
    w ๨ΕΒΕ͕͕ͪͩɺ్த͔Β։ൃʹ
    +0*/͢Δ৔߹΋ɺ৽ن։ൃ࣌ͱಉ͡
    ਺ͷϨΠϠʔͷཧղ͕ඞཁʹͳΔ
    w ҧ͏ͷ͸ʮ͢Ͱʹ͋Δ΋ͷΛཧղ
    ͢Δඞཁ͕͋Δʯͱ͍͏͜ͱ͚ͩ

    IUUQTTQFBLFSEFDLDPNLMPXQIQFSLBJHJʹमਖ਼ΛՃ͑ͨ΋ͷ
    ͲͷΑ͏ͳαʔϏε͔
    ͲͷΑ͏ͳΞʔΩςΫνϟ͔
    ͲͷΑ͏ʹσʔλΛอ࣋͢Δ͔
    ʢʹͲͷΑ͏ͳςʔϒϧઃܭ͔ʣ
    ͲͷΑ͏ͳ։ൃ؀ڥ͔
    ʢຊ൪؀ڥɾ։ൃ؀ڥʣ
    ͲͷΑ͏ͳίʔυ͔
    ։ൃ
    αʔϏεཧղϨΠϠʔ
    ΞʔΩςΫνϟཧղϨΠϠʔ
    σʔλετΞཧղϨΠϠʔ
    ։ൃ؀ڥཧղϨΠϠʔ
    ίʔυཧղϨΠϠʔ

    View full-size slide

  7. ։ൃ։࢝·ͰͷΦʔόʔϔουͷ࡟ݮ
    w ʮ։ൃ։࢝·ͰͷΦʔόʔϔουʯʹ͍ͭͯ͸1)1FS,BJHJʹͯൃද
    w ຊൃද͸ͦͷଓ͖ͱ͍͑Δ

    IUUQTTQFBLFSEFDLDPNLMPXQIQFSLBJHJ

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

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

    View full-size slide

  12. ܧଓతυΩϡϝϯςʔγϣϯ

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  15. γεςϜͱυΩϡϝϯτͷဃ཭͕͋Δͱ
    w γεςϜͱͷဃ཭͕͋ΔυΩϡϝϯτͰγεςϜΛཧղ͢ΔͱɺؒҧͬͨཧղͰ։ൃʹ
    ೖͬͯ͠·͏
    w ࣮͸ؔ࿈͕૿͍͑ͯͯؾܰʹ੾Γ཭ͤͳ͘ͳ͍ͬͯͨΠϯελϯε
    w ࣮͸ߟྀ͠ͳ͍ͱ͍͚ͳ͍͜ͱ͕มΘ͍ܾͬͯͨࡁػೳ
    w ࣮͸૿͍͑ͯͨόον
    w ։ൃऀ͕ͦͷဃ཭ʹؾͮ͘ͷ͕஗͚Ε͹஗͍΄Ͳ։ൃʹ͓͚ΔϚΠφε͕େ͖͘ͳΔ
    w γεςϜཧղͷ΍Γͳ͓͠🔥
    w ίʔυͷॻ͖௚͠🔥🔥
    w ؒҧͬͨཧղͷ··ϦϦʔεɺޙʹো֐🔥🔥🔥🔥🔥🔥

    View full-size slide

  16. γεςϜͱυΩϡϝϯτͷؔ܎
    w υΩϡϝϯτʹ͸ର৅ͷγεςϜʹ͍ͭͯॻ͔Ε͍ͯΔ
    w ˠγεςϜͱυΩϡϝϯτͷ֤ཁૉʹ͸ରԠؔ܎͕͋Δ
    w ˠγεςϜΛߏ੒͢ΔཁૉΛݩͱ͢Δू߹4ͱυΩϡϝϯτΛߏ੒͢ΔཁૉΛݩͱ͢
    Δू߹%͕͋Δͱ͖ɺू߹%ͷ֤ݩ͸ඞͣू߹4ͷ͍ͣΕ͔ͷݩͱରԠ͢Δ

    % 4

    View full-size slide

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

    % 4

    View full-size slide

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

    View full-size slide

  19. %PDVNFOUBUJPOBT$PEF

    View full-size slide

  20. %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ɹΑΓൈਮɹ

    View full-size slide

  21. %PDVNFOUBUJPOBT$PEF
    w γεςϜͷ։ൃͷۙ͘ʹυΩϡϝϯτ࡞੒ͷ࢓૊ΈΛஔ͘͜ͱͰɺ։ൃαΠΫϧͷ
    தʹυΩϡϝϯτ࡞੒Λ౷߹͠ɺγεςϜͱυΩϡϝϯτͷဃ཭Λখ͘͞͠Α͏ͱ
    ͍ͯ͠Δ͜ͱ͕Θ͔Δ
    w ͨͩɺจԽతͳ࢓૊ΈͰ͋ͬͯɺγεςϜͱυΩϡϝϯτͷରԠؔ܎Λදؔ͢਺
    ͸ͳ͍ɻ
    w ·ͣɺ͜ͷʮ%PDVNFOUBUJPOBT$PEFʯ͔Β΋͏গ͠ʮγεςϜͱυΩϡϝϯτ
    ͷରԠؔ܎ʹண໨ͯ͠ဃ཭Λͳ͘͢ʯ͜ͱʹ౿ΈࠐΜͩΞϓϩʔνʹ͍ͭͯߟ͑ͯ
    ͍͘

    View full-size slide

  22. ϞσϧԽ
    ొ৔͢Δཁૉͱͯͭ͠
    ։ൃऀ
    γεςϜʜ։ൃऀ͕։ൃ΍ઃఆΛ͢Δର৅ɻίʔυɺΞϓϦέʔγϣϯɺσʔλ
    ϕʔεɺΠϯϑϥͳͲɻγεςϜࣗମ͸ߏ଄Խ͞Ε͍ͯΔʢ΋ͷΛର৅ͱ͢Δʣ
    υΩϡϝϯτ
    ߏ଄Խσʔλʜʮ:".-ʯ΍ʮϓϩάϥϜίʔυͷ"45ʯͳͲɻ
    ٯʹɺʮγεςϜʹର͢Δ։ൃऀͷཧղɾΠϝʔδʯ͸ෆఆܗͰ։ൃऀͦΕͧΕ
    ͕಄ͷதͰ͍࣋ͬͯΔ͚ͩͳͷͰߏ଄Խ͸͞Ε͍ͯΔͱ͸ݴ͑ͳ͍
    ιϑτ΢ΣΞʜԿ͔͠ΒͷॲཧΛߦ͏ϓϩάϥϜɻߏ଄ԽσʔλΛೖग़ྗͱ͠
    ΍͍͢ͱ͍͏ಛ௃Λ࣋ͭ

    View full-size slide

  23. ʮͨͩυΩϡϝϯτΛॻ͘ʯ
    w ʮͨͩυΩϡϝϯτΛॻ͘ʯͱ
    w γεςϜ͕ߋ৽͞Εͨͱ͖ʹɺυΩϡϝϯτͷͲ͜Λߋ৽͢Ε͹ྑ͍ͷ͔͕Θ͔Γ
    ʹ͍͘
    ˠγεςϜͱυΩϡϝϯτͷରԠؔ܎Λදؔ͢਺͕ͳ͍

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    υΩϡϝϯτ ߏ଄Խσʔλ γεςϜ

    View full-size slide

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

    View full-size slide

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

    υΩϡϝϯτ ߏ଄Խσʔλ γεςϜ

    View full-size slide

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

    View full-size slide

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

    υΩϡϝϯτ ߏ଄Խσʔλ γεςϜ

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  36. UCMT
    w $*ϑϨϯυϦͳσʔλϕʔευΩϡϝϯτੜ੒πʔϧ
    w IUUQTHJUIVCDPNL-P8UCMT
    w 1PTUHSF42- .Z42-ͳͲͷ3%#.4͚ͩͰͳ͘ɺ
    #JH2VFSZ΍"NB[PO%ZOBNP%# $MPVE4QBOOFS
    ͱ͍ͬͨσʔλιʔεʹ΋ରԠ
    w υΩϡϝϯτΛॆ࣮ͤ͞Δػೳͱͯ͠ϝλσʔλΛ
    Ξϊςʔγϣϯ͢Δ͜ͱ͕Մೳ
    w ςʔϒϧɺΧϥϜͳͲͷίϝϯτ෇༩͚ͩͰͳ͘
    λάɺϦϨʔγϣϯͳͲ

    View full-size slide

  37. UCMT
    w ैདྷ͸σʔλϕʔεͱυΩϡϝϯτ͸ผ
    Ͱ؅ཧ
    w $*্Ͱςετ༻σʔλϕʔε͔Β௚઀
    ςʔϒϧఆٛΛߏ଄Խσʔλͱͯ͠ந
    ग़ɻͦΕʹ௥ՃͰςʔϒϧίϝϯτ΍Χ
    ϥϜίϝϯτΛΞϊςʔγϣϯ͠ɺυ
    ΩϡϝϯτΛੜ੒

    View full-size slide

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

    View full-size slide

  39. GSHN
    w ϝλͳεχϖοτϚωʔδϟ
    w IUUQTHJUIVCDPNL-P8GSHN
    w ϝλʜ"MGSFE΍QFUͳͲɺଞͷεχϖο
    τϚωʔδϟͷϑΝΠϧܗࣜΛΠϯϙʔ
    τΤΫεϙʔτͰ͖Δ
    w QFDP΍G[GͳͲͱ࿈ܞͯ͠୯ମͷίϚϯ
    υิ׬πʔϧͱͯ͠ಈ͔͢͜ͱ΋Մೳ

    View full-size slide

  40. GSHN
    wʮଞͷεχϖοτϚωʔδϟͷϑΝΠϧܗࣜʹΤΫεϙʔτͰ͖Δʯ
    ʮ։ൃऀ͸ࣗ෼ͷ޷͖ͳεχϖοτϚωʔδϟΛ࢖͏͜ͱ͕Ͱ͖Δʯ
    w νʔϜͰڞ༗͍ͨ͠ศརίϚϯυΛ·ͱΊΔํ๏ͱͯ͠ʮͨͩͷศརίϚϯυू
    ϖʔδʯΛ࡞ΔΑΓ΋ศརʢΈΜͳ࢖͍͍ͨεχϖοτϚωʔδϟ͸ҧ͏ʣ

    View full-size slide

  41. 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

    View full-size slide

  42. GSHNʹΑΔυΩϡϝϯςʔγϣϯ
    w ͞ΒʹɺGSHN͸ίϚϯυͷυΩϡϝϯτ
    ͷੜ੒͕Մೳ
    w GSHNͷϑΝΠϧܗࣜʹ͸EFTD΍
    MBCFMTͳͲɺίϚϯυʹΞϊςʔγϣϯ
    Λ෇༩͓ͯ͘͠৔ॴ͕͋Δ

    frgm export --to /path/to --format md

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  45. γεςϜͷཧղΛॿ͚Δ
    υΩϡϝϯςʔγϣϯ

    View full-size slide

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

    View full-size slide

  47. υΩϡϝϯτʹىͦ͜͏ͱ͍ͯ͠Δ΋ͷϓϩδΣΫτ΍։ൃγεςϜͷશମ
    ૾͸ɺ۩ମతʹܗ͕͋Δ΋ͷͰ͸ͳ͘ɺͦΕͧΕͷ಄ͷதʹෆఆܗͳΠϝʔδͱ
    ͯ͠ଊ͑ΒΕ͍ͯΔͱࢥ͍·͢ɻ
    ෆఆܗͳΠϝʔδͷೝࣝΛ߹ΘͤΔͨΊʹࢲ͕ߟ͍͑ͯΔ͜ͱɺͦΕ͸ྠ੾Γʹ
    ͢Δ͜ͱͰ͢ɻ
    ྠ੾Γʹ͢Δͱ͖ʹ੾ͬͨ໘͕அ໘͕Ͱ͖ΔΘ͚Ͱ͕͢ɺ͜ͷஅ໘ΛੵΈॏͶͯ
    ͍͘ͱཱମͱͳΓɺશମ૾͕ݱΕ·͢ɻ
    ෆఆܗͳΠϝʔδΛڞ༗͢Δ͜ͱ͸೉͍͠ͱࢥ͍·͕͢ɺࣗ෼ͳΓʹஅ໘Λෳ਺
    ࡞ΓɺͦΕΛੵΈॏͶ͍͚ͯ͹ࣗ෼ͳΓͷཱମΛཧղͯ͠΋Β͏͜ͱ͕Ͱ͖Δ͸
    ͣͩͱߟ͑·͢ɻ
    ʮϚωδϝϯτۀΛ௨ͯ͡ߟ͑ͨɺϓϩδΣΫτશମ૾ͷೝࣝᴥᴪΛ๷͙ޡղ͞Εͳ͍υΩϡϝϯτ࡞੒ज़"/%1"%5FDI#MPHʯ
    IUUQTUFDIBOEQBEDPKQFOUSZΑΓൈਮɹ

    View full-size slide


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

    View full-size slide

  49. γεςϜΛෳ਺ͷ੾ΓޱͰυΩϡϝϯτԽ͢Δ
    w γεςϜʹର͢Δؔ৺ࣄʹ߹ΘͤͯඞཁͳγεςϜͷཁૉ͚ͩΛ·ͱΊͯʮϏϡʔʯͱ͠
    υΩϡϝϯτԽ͢ΔʢʮϢʔβ͔Βͷ)551ϦΫΤετʯʮϚΠΫϩαʔϏε୯ҐʯͳͲʣ
    w ؔ৺ࣄʜγεςϜΛཧղ͢Δ্Ͱҙຯͷ͋Δάϧʔϐϯά

    %
    4
    %
    %

    View full-size slide

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

    View full-size slide

  51. 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:

    View full-size slide

  52. OEJBH
    w IUUQTHJUIVCDPNL-P8OEJBH
    w ʮΤψσΟΞάʯʮΤψμΠΞάʯͲͪΒͰ΋
    ndiag doc -c ndiag.yml
    w ੜ੒͞ΕΔυΩϡϝϯτ͸(JU)VCʹίϛοτͯ͠8FC্͔ΒӾཡ͞ΕΔ͜ͱ૝ఆ
    w ओʹΠϯϑϥͷϋΠϨϕϧΞʔΩςΫνϟͷυΩϡϝϯτΛੜ੒͢Δ໨తͰ։ൃ
    w :".-͔Βʮߏ੒ਤΛੜ੒͢ΔʯͰ΋ʮυΩϡϝϯτΛੜ੒͢ΔʯͰ΋ͳ͘
    ʮෳ਺ͷ੾ΓޱͰʯʮߏ੒ਤΛؚΉʯʮυΩϡϝϯτͷ਽ܗΛ࡞Δʯ
    ͱ͍͏ಛ௃Λ࣋ͭ

    View full-size slide

  53. ʮෳ਺ͷ੾ΓޱͰʯ
    w ୯७ʹෳ਺ͷυΩϡϝϯτΛ࡞੒ͯ͠͠·͏ͱɺγεςϜͱυΩϡϝϯτͱͷରԠ
    ؔ܎͕ؔ਺ͰදݱͰ͖ͣɺγεςϜͱυΩϡϝϯτͷဃ཭͕ൃੜ͢Δ
    w ͦͷͨΊɺOEJBHͰ͸ҎԼͷΞϓϩʔνͰγεςϜͱυΩϡϝϯτͷߏ଄Խσʔλ
    Λհͨؔ͠܎ੑ͕੾Εͳ͍Α͏ʹ͍ͯ͠Δ
    w γεςϜΛදݱ͢Δͭͷߏ଄Խσʔλ͔Β੾ΓޱͷҟͳΔෳ਺ͷߏ଄ԽσʔλΛ
    ϧʔϧʹԊͬͯੜ੒͠ɺͦΕΒ͔ΒͦΕͧΕਤͱυΩϡϝϯτΛੜ੒͢Δ
    w ߏ଄ԽσʔλͱγεςϜͱΛൺֱݕূͰ͖Δ࢓૊ΈΛఏڙ͢Δ

    View full-size slide

  54. OEJBHͷϞσϧ

    View full-size slide

  55. ʮߏ੒ਤΛؚΉʯ

    w ΠϯϑϥͷΞʔΩςΫνϟΛཧղ͢ΔͨΊͷ
    υΩϡϝϯτΛੜ੒͢Δʹ౰ͨͬͯਤ͸ॏཁ
    ͳཁૉɻੜ੒͞ΕΔਤͷݟ΍͢͞΋ॏཁ
    w ͦͷͨΊOEJBH͸ਤʹ࢖༻Ͱ͖ΔΞΠίϯ΋
    ͍Ζ͍Ζબ୒Ͱ͖Δ
    w ૊ΈࠐΈΞΠίϯϑϨʔϜϫʔΫ
    w ೚ҙͷը૾ʢQOHTWHʣ
    w ,T"84($1)BTIJDPSQ͕ఏڙ͍ͯ͠
    ΔΞΠίϯηοτΛऔಘ͢ΔίϚϯυ

    View full-size slide

  56. ʮυΩϡϝϯτͷ਽ܗΛ࡞Δʯ
    w υΩϡϝϯτͷੜ੒ݩ͸ߏ଄ԽσʔλͰ͋Δ΄͏͕γεςϜͱͷဃ཭Λখ͘͞͠΍
    ͘͢Ͱ͖Δͱ͍͏ͷ͸ຊൃදͰड़΂ͨͱ͓Γɻ
    w OEJBH΋Πϯϑϥͷ֤ཁૉͷઆ໌จষ௥Ճ͸ʮΞϊςʔγϣϯʯͷܗͰ࣮ݱɻ
    w ͭ·ΓOEJBH͸ߏ଄Խσʔλ͔ΒυΩϡϝϯτΛੜ੒͢Δ
    w ͔͠͠ɺઆ໌จষ͸ςʔϒϧίϝϯτͱ͸ҟͳΓ௕จʹͳΔ͜ͱ͕༧૝͞ΕͨͷͰ
    ҎԼͷํࣜΛ࠾༻
    ·ͣOEJBHଆͰઆ໌จষهड़ઐ༻ͷϑΝΠϧΛॴఆͷҐஔʹੜ੒
    ։ൃऀ͸ͦͷઐ༻ϑΝΠϧʹઆ໌จষΛهड़
    OEJBH͸υΩϡϝϯτੜ੒࣌ʹઐ༻ϑΝΠϧͷ಺༰ΛऔΓࠐΉ

    View full-size slide

  57. υΩϡϝϯτͷΧόϨοδ
    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)

    View full-size slide

  58. (.0ϖύϘʹ͓͚ΔOEJBHಋೖঢ়گ
    w ϖύϘ͕ӡ༻͍ͯ͠Δෳ਺ͷαʔϏεͷ͏ͪͷҰ෦ͰΞʔΩςΫνϟυΩϡϝϯτ
    Λ࡞੒͢Δͷʹར༻
    w ͔ͦ͜Β༷ʑͳϑΟʔυόοΫΛ΋Βͬͯػೳ௥ՃΛ͍ͯ͠Δ
    w ࣾ಺Ͱ͸࣌ؒఔ౓ͷϋϯζΦϯΛ։࠵࣮͠ࡍʹಈ͔ͯ͠΋Βͬͯཧղͯ͠΋Βͬ
    ͍ͯΔ

    View full-size slide

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

    View full-size slide

  60. ΞϓϦέʔγϣϯίʔυͷ
    υΩϡϝϯςʔγϣϯߏ૝

    View full-size slide

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

    View full-size slide

  62. ίʔυΞϊςʔγϣϯͱ
    ΞϓϦέʔγϣϯ࣮ߦ࣌ͷτϨʔγϯά৘ใΛ׆༻ͨ͠
    ΞʔΩςΫνϟυΩϡϝϯςʔγϣϯ

    View full-size slide

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

    View full-size slide

  64. ϝϦοτ
    w ΞϓϦέʔγϣϯʹ͓͚Δؔ৺ࣄ୯ҐͷυΩϡϝϯτΛ࣮ࡍͷίʔυͱରԠͤ͞
    ͯ࡞੒Ͱ͖Δ
    w ίʔυͱͷ͕ࠩੜͨ͡৔߹ʹ$*ͳͲΛ௨ͯ͡ݕ஌Մೳ
    w υΩϡϝϯτͷΧόϨοδ΋ܭଌՄೳ
    w ୯ମͰ͸શମΛ၆ᛌͰ͖ͳ͍1)1%PDͷΑ͏ͳίʔυΞϊςʔγϣϯ৘ใͱɺͦ
    ͷ··ͩͱಡΈʹ͍͘ελοΫτϨʔε৘ใΛ߹ΘͤΔͱ͍͏ɺطଘͷٕज़Ͱऔ
    ಘͰ͖Δ৘ใΛ࢖ͬͯΞϓϦέʔγϣϯΛཧղΛॿ͚ΔυΩϡϝϯτΛੜ੒Ͱ͖
    Δ

    View full-size slide

  65. ࣮૷ͷΞΠσΞ
    w ϓϩάϥϛϯάݴޠʹґଘ͠ͳ͍࣮૷ʹ͍ͨ͠
    w ʮίʔυΞϊςʔγϣϯͷτϨʔεʯʮΞϓϦέʔγϣϯ࣮ߦͷτϨʔεʯ͸ݴޠ
    ґଘͰ࡞੒͠ɺͦΕΒͷग़ྗ͚ͩ౷Ұͯ͠ɺʮτϨʔε৘ใ͔ΒͷυΩϡϝϯτ
    ੜ੒ʯ͸൚༻ੑΛ͍࣋ͨͤͨ
    w ۩ମతͳ࣮૷͸ྫ͑͹ɺ1)1Ͱ͋Ε͹
    w ίʔυΞϊςʔγϣϯͷτϨʔεˠ1)1%PDͷػೳͰ࣮ݱͰ͖ͦ͏
    w ΞϓϦέʔγϣϯ࣮ߦͷτϨʔεˠελʔτ͔ΒͷEFCVH@USBDF
    ͚ͩΛύʔ
    ε͢ΔπʔϧͰे෼͔΋

    View full-size slide

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

    View full-size slide

  67. 5IBOLZPV
    ࠷৽ͷ࠾༻৘ใΛνΣοΫˠ !QC@SFDSVJU

    View full-size slide