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

ある SWET エンジニアの開発プロセス改善最前線 / Story of a SWET Engineer

Kuniwak
February 06, 2019

ある SWET エンジニアの開発プロセス改善最前線 / Story of a SWET Engineer

私の所属する SWET という組織の目指すものは「テストを楽しく、賢く、価値を届けられるように」であり、私たちは日々これを達成すべく働いています。さて、このような組織に所属する私が取り組んでいるものは、テストをうまく使って開発速度の安定化や向上、より保守性の高い設計を達成することです。この発表では、私が取り組んできたテストによる開発プロセスの改善の実例をお話しします。

この発表では、以下の5つの事例を紹介する予定です:

* 現場の開発プロセスの分析
* 開発プロセスのコンサルティング
* デバッグを助けるモジュールの開発
* テスターを助けるライブラリの開発
* Jenkins クラスタの安定稼働のための移行プロジェクト

https://techcon.dena.com/2019/

Kuniwak

February 06, 2019
Tweet

More Decks by Kuniwak

Other Decks in Programming

Transcript

  1. #denatechcon
    ͋Δ48&5ΤϯδχΞͷ

    ։ൃϓϩηεվળ࠷લઢ
    γεςϜຊ෦඼࣭؅ཧ෦48&5άϧʔϓ
    ࠃ෼༎थʢ,VOJXBLʣ

    View Slide

  2. #denatechcon
    ൃදͷͶΒ͍


    View Slide

  3. #denatechcon
    ։ൃݱ৔Ͱςετ΍։ൃϓϩηεʹ

    ೰ΜͰ͍ΔਓʹɺϞσϧέʔεͱͯ͠
    48&5ͷऔΓ૊ΈΛ঺հ͍ͨ͠


    View Slide

  4. #denatechcon

    ୈষ ࣗݾ঺հ
    ୈষ 48&5ͱ͸Կ͔
    ୈষ ൒೥લͷऔΓ૊Έ
    ୈষ ݱࡏͷऔΓ૊Έ
    ୈষ ·ͱΊ

    View Slide

  5. #denatechcon
    ࣌ؒͷ౎߹ͰൃදதʹׂѪ͢Δϖʔδ΍

    ஫ऍͳͲ͕͋Γ·͢ɻ
    ·ͨɺίʔυͳͲ͕ಡΈͮΒ͍৔߹͸

    ҎԼ͔ΒεϥΠυΛ͝ཡ͍ͩ͘͞ɻ


    https://speakerdeck.com/denatech

    View Slide

  6. #denatechcon
    ࣗݾ঺հ


    ୈষ

    View Slide

  7. #denatechcon

    ,VOJXBL
    w HJUIVCDPN,VOJXBL
    w RJJUBDPN,VOJXBL
    w ೥݄ʹத్ೖࣾ
    w 48&5άϧʔϓॴଐ
    w ઐ໳͸ɺ୯ମςετͱ੩తղੳ

    View Slide

  8. #denatechcon
    w J04%$+BQBOϕεττʔΫ৆Ґ

    ʮJ04ΞϓϦͷ։ൃ଎౓Λʹ޲্ͤͨ͞σόοάϊ΢ϋ΢ʯ
    w CVJMEFSTDPOUPLZPൃද

    ʮࣄલ஌ࣝͳ͠Ͱཧղ͢Δɺ੩తݕࠪͷ͍Ζ͸ʯ
    w 2JJUB"EWFOU$BMFOEBS࠷ଟ͍͍Ͷ৆

    ʮςετ͕ͳ͔ͬͨແ๏஍ଳʹςετΛಋೖͯ͠։ൃ଎౓Λഒʹͨ͠࿩ʯ


    ࠷ۙͷܦྺ

    View Slide

  9. #denatechcon
    48&5ͱ͸Կ͔


    ୈষ

    View Slide

  10. #denatechcon

    48&5ͱ͸
    αʔϏεͷ඼࣭޲্΍ɺ։ൃੜ࢈ੑ޲্Λ͓͜ͳ͏૊৫ɻ

    ϝϯόʔ͸ࢲΛؚΊݱࡏ໊ɻ
    ۀ຿಺༰͸ɺ։ൃऀͷςετΛॿ͚Δج൫ͷ੔උ΍

    ֤ϓϥοτϑΥʔϜʹ͓͚Δςετϊ΢ϋ΢ͷܗࣜԽͳͲɻ

    View Slide

  11. #denatechcon
    48&5ͷ੒Γཱͪ


    48&5ͱ͸Կ͔

    View Slide

  12. #denatechcon

    ໊લͷ༝དྷ
    (PPHMFͳͲʹ͓͚Δ4&5 4PGUXBSF&OHJOFFSJO5FTU
    Λ

    ࢀߟʹ͍ͯ͠Δɻ͜ͷଞͷϩʔϧͱͯ͠ɺ48& 4PGUXBSF
    &OHJOFFS
    ͱ5& 5FTU&OHJOFFS
    ͳͲ͕͋Δɻ
    ͜ͷ໋໊Λࢀߟʹ͢Δࡍʹ4&5͸48&ͷҰछͰ͋Δ

    ͱ͍͏ೝ͔ࣝΒ4&548&ˠ48&5΁มߋɻ
    ৄ͘͠͸ʮςετ͔Βݟ͑ͯ͘Δάʔάϧͷιϑτ΢ΣΞ։ൃʯΛࢀর

    View Slide

  13. #denatechcon
    48&5ͷϏδϣϯ


    48&5ͱ͸Կ͔

    View Slide

  14. #denatechcon

    ָ͘͠ɺݡ͘ɺՁ஋͋ΔςετͰ

    ։ൃϓϩηεͷվળΛॿ͚Δ͜ͱ

    View Slide

  15. #denatechcon

    ָ͍͠
    ͨͱ͑͹ɺςετͷ໨త͕͸͖ͬΓ͠ͳ͍··ɺ

    τοϓμ΢ϯͰ࢝Ίͤ͞ΒΕͨΒςετ͸ָ͘͠ͳ͍ɻ
    ͭΒ͍
    ͨͱ͑͹ɺػೳͷ׬੒Λ͢͹΍͘ςετͷ੒ޭͰ
    ت΂ΔͳΒςετ͸ָ͘͠ͳΔɻ

    View Slide

  16. #denatechcon

    ݡ͍
    ໨తʹରͯ͠खஈ͕ద͍ͯ͠ͳ͍ٕज़ɻͨͱ͑͹ɺ

    ςετ඼࣭ͷଌఆʹҋӢʹΧόϨοδΛ࢖ͬͯ΋Θ͔Βͳ͍ɻ
    ҋӢ
    ςετ݁ՌΛద੾ͳλΠϛϯά΍಺༰Ͱڭ͑ͯ͘ΕΔٕज़ɻ

    ࠷ۙͰ͸ɺςετͷ඼࣭Λݡ͘ڭ͑ͯ͘ΕΔٕज़ͱͯ͠ɺ

    NVUBUJPOUFTUJOHͷௐࠪͳͲ΋͍ͯ͠Δɻ

    View Slide

  17. #denatechcon

    Ձ஋͕͋Δ
    ͨͱ͑͹ɺΧόϨοδ౳ͷࢦඪͷΈΛ௥͍͔͚Δ͜ͱʹ

    ݻࣥͯ͠ɺ໨తΛ๨ΕۭͯճΓͯ͠͠·ͬͨςετɻ
    ແବ͕ଟ͍
    ͨͱ͑͹ɺ୯ମςετΛ͏·͘࢖͑͹ɺख໭ΓΛগͳ͘ɺ୹͘

    Ͱ͖Δɻ͜Ε͸࠷ऴతʹΑΓଟ͘ͷػೳΛϓϨΠϠʔʹ

    ༧ࠂ௨ΓͷλΠϛϯάͰఏڙ͢Δ͜ͱʹͭͳ͕Δɻ

    View Slide

  18. #denatechcon

    ָ͘͠ɺݡ͘ɺՁ஋͋ΔςετͰ

    ։ൃϓϩηεͷվળΛॿ͚Δ͜ͱ
    48&5ͷϏδϣϯ

    View Slide

  19. #denatechcon
    औΓ૊Έͷྺ࢙


    48&5ͱ͸Կ͔

    View Slide

  20. #denatechcon

    w .PCBHFͷ8FC"1*6*΁ͷ&&ςετ

    w ϚϧνϓϥοτϑΥʔϜͰͷ4%,ͷςετ ʙ

    w ςετج൫ʢ45'ͳͲʣͷల։ ʙ

    w ϥΠϒϥϦͷࣗಈόʔδϣϯΞοϓج൫ ʙ

    w ը૾ೝࣝʹΑΔ&&ςετࢧԉج൫ ʙ

    w ʜ
    w ͜Ε͔Βൃද͢Δ্Լ൒ظͷऔΓ૊Έ ʙ

    View Slide

  21. #denatechcon
    48&5͸໊ͷϝϯόʔ͔ΒͳΔɺ

    ָ͘͠ɺݡ͘ɺՁ஋͋ΔςετͰ

    ։ൃϓϩηεΛΑ͍ͯ͘͘͠૊৫


    ͜͜·Ͱͷ·ͱΊ

    View Slide

  22. #denatechcon
    ൒೥લͷऔΓ૊Έ


    ୈষ

    View Slide

  23. #denatechcon
    എܠ


    ൒೥લͷऔΓ૊Έ

    View Slide

  24. #denatechcon

    ήʔϜͷόοΫΤϯυ΍4%,΁ͷऔΓ૊Έ͸͋ͬͨ

    ΋ͷͷɺجװྖҬͰ͋ΔήʔϜΫϥΠΞϯτྖҬʹ

    48&5ͷऔΓ૊Έ͕·ͩͳ͔ͬͨɻ
    ͜͜ͰͷऔΓ૊Έ΋͸͡ΊΔͨΊɺෆ଍͍ͯͨ͠

    υϝΠϯ஌ࣝͷ֫ಘͱݱ৔ͷ՝୊ײͷ೺ѲΛ໨ࢦ͠ɺ

    48&5͔Βਓʢ࠷ऴతʹ͸ਓʣΛΞαΠϯɻ

    View Slide

  25. #denatechcon
    ՝୊ͷ෼ੳ


    ൒೥લͷऔΓ૊Έ

    View Slide

  26. #denatechcon

    εϚʔτϑΥϯήʔϜͷ։ൃݱ৔΁ɺ࡞ۀޮ཰ͷѱ͍

    λεΫ΍όάͷ಺༁ɺख໭ΓݪҼͳͲΛώΞϦϯάͨ͠ɿ
    w ඳըܥͷϦάϨογϣϯݕ஌͕େม
    w +FOLJOTͷ৑௕ੑ͕ͳ͍
    w νέοτ͔Β࠶ݱ৚͕݅Θ͔Βͳ͍
    w ʜ

    View Slide

  27. #denatechcon

    நग़͞Εͨ՝୊͕ଟ਺͋ͬͨͷͰ

    ༏ઌ౓Λ͚ͭͯղܾΛ໛ࡧ
    ༏ઌ౓ͷߴ͔ͬͨऔΓ૊ΈΛ

    ॱʹ঺հ͍͖ͯ͠·͢

    View Slide

  28. #denatechcon
    ඳըܥͷϦάϨογϣϯ

    ݕ஌ج൫


    ൒೥લͷऔΓ૊Έ

    View Slide

  29. #denatechcon

    ඳըܥͷߋ৽ස౓͕ߴ͘ɺݕ߲ࠪ໨΋ඇৗʹଟ͍ͷͰ

    ݱঢ়ͷϦιʔεͰ͸ݕ͖ࠪ͠Εͳ͍ɻ
    ݱ৔ͷ՝୊
    ظ଴͢ΔϑϨʔϜը૾ ඳըܥͷόάʹΑͬͯ࿪Μͩը૾
    ໼ҹͷઌ͕࿪ΜͰ͍Δ

    View Slide

  30. #denatechcon

    ղܾํ๏ͷݕ౼
    ·ͣ͸ϑΟʔυόοΫͷ଎͍୯ମςετͰղܾΛݕ౼ɻ

    ͨͩ͠ɺ݁߹ʹΑΔ͕ܽؕଟ͘༧૝͞ΕͨͨΊɺ

    ݁߹ͯ͠ඳըͨ͠ޙͷϑϨʔϜը૾Λݕࠪ͢Δ͜ͱʹɻ
    &&ςετ
    ݁߹ςετ
    ୯ମςετ
    ݁߹όάΛൃݟͰ͖Δ
    ݁߹όάΛݟམͱ͢
    ϑΟʔυόοΫ͕஗͍
    ϑΟʔυόοΫ͕଎͍
    ݁߹όάΛݟ͚͍ͭͨ

    ͱ͖ʹ͚ͩ࢖͏
    ୯ମςετͰ׬݁Ͱ͖Δ

    ͳΒͦͷํ͕Α͍

    View Slide

  31. #denatechcon

    ϑϨʔϜը૾શମͷ༰ྔ͸ͭͷόʔδϣϯʹରͯ͠

    ໿(#ɺ࿥ըʹ͔͔Δ࣌ؒ͸IҎ্ɻ
    ը૾ൺֱج൫ͷن໛
    ج൫΁ͷཁٻ
    ϑΟʔυόοΫ·Ͱͷ࣌ؒΛͳΔ΂͘୹͘͢ΔͨΊɺ

    ࣮ߦ࣌ؒ͸গͳͭͭ͘͠ɺ݁Ռ͸Θ͔Γ΍͘͢ɻ

    View Slide

  32. #denatechcon

    ͢΂ͯͷϑϨʔϜը૾Λ֨ೲͨ͠;JQΞʔΧΠϒ͔Βɺ

    ϑΝΠϧϔομʹه࿥͞Ε͍ͯΔ$3$Λൺֱɻ
    ࠩҟͷ͋ΔϑϨʔϜը૾ͷΈల։ͯ͠(16্Ͱ

    QY୯ҐͰൺֱɻ3(#஋ͷࠩҟ͕ᮢ஋ΑΓେ͖͚Ε͹ɺ
    ࠩҟ͕͋ͬͨͱΈͳ͢ɻ
    ߴ଎Խͷ޻෉
    ;JQΞʔΧΠϒͷར༻͸ϑΝΠϧҰཡͷอ࣋ͱ$3$ͷه࿥͕໨తͳͷͰແѹॖɻ
    ൺֱʹ͸1JMMPX$V1ZΛ࢖༻ɻ*NBHF.BHJDLΑΓׂ଎͍͔ಉఔ౓ͩͬͨɻ

    $16ͷ4*.%໋ྩ͚ͩͰे෼଎͍Մೳੑ͕͋Δ͕·ͩࢼ͍ͤͯͳ͍ɻ

    View Slide

  33. #denatechcon

    ͜ΕͰ΋શମͷൺֱ࣌ؒ͸໿I΄Ͳ͔͔ͬͯ͠·͍ɺ
    ͳΔ΂͘ϑΟʔυόοΫ·Ͱͷ࣌ؒΛ୹͘͢Δͱ͍͏

    ཁٻΛຬ͍ͨͤͯͳ͍ɻ
    ͦ͜ͰɺҰ෦ͷαϯϓϧͷΈͷൺֱΛ࣮ࢪ͢Δʮ଎ใʯͱ

    શମΛൺֱ͢ΔʮଓใʯͷछྨͷδϣϒΛ෼͚ͯ༻ҙɻ
    ೔ճͷ଎ใ͸໿I΄ͲͰ௨஌Ͱ͖ΔͨΊɺ޿ൣғͳ

    ϦάϨογϣϯͷϑΟʔυόοΫͷ࣌ؒΛ୹͘Ͱ͖͍ͯΔɻ
    ߴ଎Խͷ޻෉

    View Slide

  34. #denatechcon

    ϑϨʔϜ͝ͱͷࠩҟΛҎԼͷΑ͏ʹදࣔͨ͠ಈըΛ࡞੒ɻ

    Ͳ͔͜Βࠩҟ͕ൃੜͯ͠ফࣦ͢Δͷ͔Λ֬ೝ͠΍͍͢ɻ
    ݁ՌͷՄಡੑͷ޻෉
    ϑϨʔϜ" ϑϨʔϜ# "ͱ#ͷࠩҟ
    ࠩҟΛදࣔ
    ඳըܥͷόά
    ಈը΋ಉ༷

    View Slide

  35. #denatechcon

    େن໛ͳը૾ൺֱج൫ΛߏஙͰ͖ɺݕূϦιʔεͷ

    ଍Βͳ͍ঢ়گͰ΋ඳըܥͷϦάϨογϣϯΛݕ஌͢Δ

    ج൫͕Ͱ͖ͨɻ
    ·ͩӡ༻Λ͸͡Ί͕ͯ࣌ؒܦա͍ͯ͠ͳ͍ͷͰվྑதɻ
    ੒Ռͱ՝୊

    View Slide

  36. #denatechcon
    +FOLJOTΫϥελΛ

    ҆ఆՔಇͤ͞ΔऔΓ૊Έ


    ൒೥લͷऔΓ૊Έ

    View Slide

  37. #denatechcon

    +FOLJOTͷϚγϯʹ৑௕ੑ͕ͳ͘ɺμ΢ϯλΠϜ͕

    ൃੜ͠΍͘͢ɺॏཁͳ࡞ۀ͕தஅ͞Ε͍ͯͨɻμ΢ϯλΠϜͷ
    ݪҼ͸σΟεΫ༰ྔෆ଍΍04΍πʔϧͷΞοϓσʔτͳͲɻ
    ౰࣌ͷߏ੒͸ɺ8JOEPXTNBD04ͦΕͧΕͰNBTUFS͕

    Ұ୆ͷΈͷߏ੒ɻ
    ݱ৔ͷ՝୊
    ͳΔ΂͘μ΢ϯλΠϜͷӨڹͷগͳ͍໷ؒʹ࣮ࢪ͢ΔͨΊ୲౰ऀ΁ͷෛ୲΋େ͖͍ɻ
    8JOEPXT޲͚ͷϏϧυ͸8JOEPXTϚγϯ্ͰɺJ04NBD04޲͚ͷ

    Ϗϧυ͸NBD04্Ͱ࣮ࢪ͢Δ͜ͱΛҙਤͨ͠ߏ੒ɻ

    View Slide

  38. #denatechcon

    ࣍ͷΑ͏ʹ+FOLJOTΫϥελΛ࠶ߏங

    View Slide

  39. #denatechcon

    ߏஙͨ͠+FOLJOTΫϥελͷߏ੒
    +FOLJOTNBTUFS
    8JOEPXTBHFOU
    8JOEPXTBHFOU
    NBD04BHFOU
    NBD04BHFOU
    (PPHMF$MPVE1MBUGPSN
    ։ൃऀ
    ࣾ಺ωοτϫʔΫ ࣾ಺ωοτϫʔΫ
    )5514
    +/-1
    1FSTJTUFOU%JTL
    ੒Ռ෺

    View Slide

  40. #denatechcon

    +FOLJOTNBTUFS
    8JOEPXTBHFOU
    8JOEPXTBHFOU
    NBD04BHFOU
    NBD04BHFOU
    (PPHMF$MPVE1MBUGPSN
    ։ൃऀ
    ࣾ಺ωοτϫʔΫ ࣾ಺ωοτϫʔΫ
    )5514
    +/-1
    1FSTJTUFOU%JTL
    ੒Ռ෺
    ແఀࢭͰεέʔϧՄೳ
    ߏஙͨ͠+FOLJOTΫϥελͷߏ੒

    View Slide

  41. #denatechcon

    +FOLJOTNBTUFS
    8JOEPXTBHFOU
    8JOEPXTBHFOU
    NBD04BHFOU
    NBD04BHFOU
    (PPHMF$MPVE1MBUGPSN
    ։ൃऀ
    ࣾ಺ωοτϫʔΫ ࣾ಺ωοτϫʔΫ
    )5514
    +/-1
    1FSTJTUFOU%JTL
    ੒Ռ෺
    ৑௕Խ
    ߏஙͨ͠+FOLJOTΫϥελͷߏ੒

    View Slide

  42. #denatechcon

    +FOLJOTNBTUFS
    Քಇத
    8JOEPXTBHFOU
    Քಇத
    Քಇத
    (PPHMF$MPVE1MBUGPSN
    ։ൃऀ
    ࣾ಺ωοτϫʔΫ ࣾ಺ωοτϫʔΫ
    )5514
    +/-1
    1FSTJTUFOU%JTL
    ੒Ռ෺
    04Ξοϓσʔτத
    ߏஙͨ͠+FOLJOTΫϥελͷߏ੒
    ϩʔϦϯάΞοϓσʔτ͕Մೳ
    ੾அ

    View Slide

  43. #denatechcon

    ෳ਺ͷBHFOUΛಉ͡ঢ়ଶʹอͭඞཁ͕͋ΔͨΊɺ

    NBD048JOEPXT޲͚ʹ"OTJCMF1MBZCPPLΛ༻ҙɻ
    9DPEF΍6OJUZͳͲͷ։ൃ؀ڥΛࣗಈతʹߏஙͰ͖Δɻ
    ෳ਺ͷBHFOUͷߏ੒؅ཧ
    อकίετͷ؍఺͔Βɺຊདྷ͸ίϯςφٕज़ͳͲʹΑΔ*NNVUBCMF

    *OGSBTUSVDUVSFΛ໨ࢦ͔ͨͬͨ͠ɻͨͩɺNBD04ΛήετʹͰ͖Δ

    ίϯςφٕज़ͷ"OLB͕ݕূ్தͰؒʹ߹Θͣɺࠓ͸༏ઌ౓ͷ໰୊Ͱະಋೖɻ

    View Slide

  44. #denatechcon

    ͜ͷ1MBZCPPLࣗମͷϦϑΝΫλΛ༰қʹ͢ΔͨΊɺ

    04͝ͱʹ7BHSBOU#PYʢԾ૝ΠϝʔδʣΛ४උͯ͠
    ݕূͷαΠΫϧΛ؆୯ʹճͤΔΑ͏ʹͨ͠ɻ
    "OTJCMF1MBZCPPLͷݕূ
    Ծ૝؀ڥ Ծ૝؀ڥ Ծ૝؀ڥ
    "OTJCMF1MBZCPPLͷ

    ॳճద༻Λࢼݧ
    WBHSBOUVQͰ

    Ծ૝؀ڥΛ࡞੒
    ࠶ద༻Ͱႈ౳ੑΛࢼݧ
    WBHSBOUEFTUSPZͰ

    Ծ૝؀ڥΛഁغ

    View Slide

  45. #denatechcon

    ͜ͷݕূαΠΫϧΛָʹ͢ΔͨΊɺ5FTU,JUDIFO΋

    ར༻Ͱ͖ΔΑ͏ʹ͍ͯ͠Δɻͨͩ͠ɺͭͳ͗෦෼ͷ

    σόοά͕໘౗ͳͨΊɺϓϥάΠϯ։ൃΛݕ౼தɻ
    5FTU,JUDIFOʹΑΔݕূͷ༰қԽ
    Ծ૝؀ڥ Ծ૝؀ڥ Ծ૝؀ڥ
    LJUDIFODPOWFSHF

    ʢॳճద༻ͷ֬ೝʣ
    LJUDIFODSFBUF

    ʢԾ૝؀ڥͷ࡞੒ʣ
    LJUDIFODPOWFSHF

    ʢႈ౳ੑͷ֬ೝʣ
    LJUDIFOEFTUSPZ

    ʢԾ૝؀ڥͷഁغʣ

    View Slide

  46. #denatechcon

    +FOLJOTBHFOUͷ௥Ճ͕௿ίετͰࡁΉΑ͏ʹͳΓɺ

    μ΢ϯλΠϜͷൃੜΛݮΒ͍ͤͯΔɻ
    ͨͩ͠ɺσΟεΫ༰ྔෆ଍໰୊͸ผͷ৔ॴͰ໰୊͕

    ݦࡏԽ͍ͯ͠ΔɻNBTUFSʹอଘ͞ΕΔ੒Ռ෺Ͱ͸ͳ͘ɺ
    BHFOU্ʹଘࡏ͢Δதؒੜ੒෺͕BHFOUͷσΟεΫΛ

    ѹഭ͢Δ໰୊͕ൃੜ͍ͯͯ͠ରԠΛݕ౼͍ͯ͠Δɻ
    ੒Ռͱ՝୊

    View Slide

  47. #denatechcon

    ݱࡏͷ+FOLJOTͷ࠷େͷ՝୊͸ɺIΛ௒͑Δ௕େͳ

    Ϗϧυ࣌ؒͷ୹ॖʹҠ͍ͬͯͯɺDDBDIFͳͲΛݕূதɻ
    ·ͨɺ+FOLJOTNBTUFSଆͷΞοϓσʔτͰ͸·ͩ

    μ΢ϯλΠϜ͕ൃੜͯ͠͠·͏͕ɺ͜ΕΛ๷͙ͨΊʹ

    #MVF(SFFO%FQMPZNFOUͷखॱΛཱ͍֬ͨ͠ɻ
    ࠓޙͷల๬

    View Slide

  48. #denatechcon

    #MVF(SFFO%FQMPZNFOUͷΠϝʔδਤ
    ՔಇதͷNBTUFS
    8JOEPXTBHFOU
    8JOEPXTBHFOU
    NBD04BHFOU
    NBD04BHFOU
    (PPHMF$MPVE1MBUGPSN
    ։ൃऀ
    ࣾ಺ωοτϫʔΫ ࣾ಺ωοτϫʔΫ
    )5514 +/-1
    %JTLͷίϐʔ
    ੒Ռ෺
    ݕূதͷNBTUFS
    ӡ༻ऀ

    View Slide

  49. #denatechcon
    σόοάΛॿ͚Δ

    Ϟδϡʔϧͷ։ൃ


    ൒೥લͷऔΓ૊Έ


    Ͱ
    ͸
    ׂ
    Ѫ

    View Slide

  50. #denatechcon

    ςελʔʹΑΔಈ࡞ݕূ࣌ʹɺ։ൃ༻ͷσόοάϩά͕

    ඞཁʹͳΔ͕ɺςελʔ͕खಈͰΞοϓϩʔυ͢Δͷ͕

    खؒͩͬͨɻ·ͨɺ໰୊͕ى͖͔ͯΒϩάΛఏग़͢Δ

    ϑϩʔͩͬͨͨΊɺજࡏతͳ໰୊ͷൃݟ͕೉͍͠ɻ
    ݱ৔ͷ՝୊
    ղܾํ๏
    ϦϞʔταʔόʔ΁ϩάΛूੵ͢ΔϥΠϒϥϦΛ։ൃɻ


    Ͱ
    ͸
    ׂ
    Ѫ

    View Slide

  51. #denatechcon

    طଘͷ$ͷίʔυϕʔεʹϦϞʔτϩάػೳΛ

    ௿ίετͰಋೖ͔ͨͬͨͨ͠Ίɻ
    ط੒ͷαʔϏε΋ݕ౼͕ͨ͠ɺϚϧνϓϥοτϑΥʔϜͷ
    ରԠঢ়گ͕ෆಁ໌ͩͬͨΓɺ୺຤ͷҰ࿈ͷϩάΛ࣌ܥྻͰ

    ฒ΂ͯ؍࡯Ͱ͖ͳ͍ɺϩάͷ౎౓ૹ৴ͩͱੑೳཁٻΛ

    ຬͨͤͳ͍ͳͲͷϛεϚον͕͋ͬͨɻ
    ط੒αʔϏεΛબ͹ͳ͔ͬͨཧ༝


    Ͱ
    ͸
    ׂ
    Ѫ

    View Slide

  52. #denatechcon
    Ճ͑ͯɺಠ࣮ࣗ૷͸ͦ͜·Ͱ

    ۤ࿑͠ͳ͍ͱࢥ͍ͬͯͨʜ




    Ͱ
    ͸
    ׂ
    Ѫ

    View Slide

  53. #denatechcon
    ͳ͓ɺ࣮૷͸ͦ͜·Ͱ

    ۤ࿑͠ͳ͍ͱࢥ͍ͬͯͨʜ


    େ͖ͳצҧ͍ͩͬͨʂ


    Ͱ
    ͸
    ׂ
    Ѫ

    View Slide

  54. #denatechcon

    8JOEPXT"OESPJEJ04NBD04ͷ͢΂ͯͰϑΝΠϧͷ

    ಡΈॻ͖ͱ௨৴ΛͰ͖ΔΑ͏ʹ࣮૷͠ɺ͜ΕΒͷ

    Ϗϧυ؀ڥΛߏங͢Δͷ͸૝ఆҎ্ʹෳࡶͩͬͨɻ
    ͨͱ͑͹ɺίϯύΠϥ͸গͳ͘ͱ΋.47$ͱ$MBOHΛ

    ҙࣝ͢Δඞཁ͕͋Γɺ$MBOHͰ΋"OESPJEͱJ04Ͱ

    ϏϧυςετͷίϚϯυ΍σόοάํ๏͕͔ͳΓҧ͏ɻ
    ͜ͷΑ͏ʹ޿͍஌ࣝΛ೺Ѳ͍ͯ͠ͳ͍ͱ࣮૷͕Ͱ͖ͳ͍ɻ
    ૝૾Ͱ͖͍ͯͳ͔࣮ͬͨ૷ͷ೉͠͞


    Ͱ
    ͸
    ׂ
    Ѫ

    View Slide

  55. #denatechcon

    Ճ͑ͯɺ֤ϓϥοτϑΥʔϜ্Ͱͷݕূج൫ͷཱ֬΋

    $*ߏங͔Βख୳ΓͷελʔτͰɺ͜ΕΒ͕੔͏ࠒʹ͸

    ౰ॳͷݟੵ΋ΓҎ্ͷ͕࣌ؒܦաͯ͠͠·͍ͬͯͨʜ
    ݕূ؀ڥߏஙͷ೉͠͞


    Ͱ
    ͸
    ׂ
    Ѫ

    View Slide

  56. #denatechcon

    ։ൃ͸୹ظؒͰ׬ྃ͢Δͱ༧૝͍ͯͨ͠ͷͰɺ

    ࠓճ͸ݸਓϓϨʔͰૉૣ͘׬੒ͤ͞ɺ͋ͱͰ

    υΩϡϝϯτΛॻ͘ͷ͕ϕετͱࢥ͍ͬͯͨɻ
    ࣮ࡍʹ͸୲౰ऀͰ͋Δࣗ෼͕ର֎ൃදͰ

    ๩ࡴ͞Ε్ͯதͰਐߦ͕ࢭ·ͬͯ͠·ͬͨɻ
    ଐਓੑͷ੍ޚͷࣦഊ


    Ͱ
    ͸
    ׂ
    Ѫ

    View Slide

  57. #denatechcon

    Ұ෦ͷ04޲͚ͷίʔυϕʔεͱͷ݁߹ࢼݧ͸

    ׬ྃͰ͖͍͕ͯͨɺ͜ͷ··ͷϖʔεͰ͸

    ϦϞʔτϩά͕༗༻ͳ࣌ظΑΓ׬੒͕஗ΕΔ

    ͜ͱ͔Β։ൃΛதஅɻ
    ࢒೦ͳ݁Ռͱͳ͕ͬͨɺࣦഊ͔ΒֶΜͩɻ
    ੒Ռ


    Ͱ
    ͸
    ׂ
    Ѫ

    View Slide

  58. #denatechcon
    ৼΓฦΓ


    ൒೥લͷऔΓ૊Έ

    View Slide

  59. #denatechcon

    w Ձ஋Λಧ͚ΔͨΊʹݱ৔ͷ՝୊ͷநग़ͱ

    ༏ઌॱҐ͚͔ͮΒ࢝Ίɺ੒ޭ΋ࣦഊ΋ͨ͠
    w ࠷ऴ඼࣭ΛߴΊΔՁ஋͋Δςετͱͯ͠

    ඳըܥͷϦάϨογϣϯݕ஌ج൫Λߏங
    w ςετͷͭΒ͞Λͳͨ͘͢Ίʹ

    μ΢ϯλΠϜͷ୹͍+FOLJOTΫϥελΛߏங
    w ݡ͍ςετͷͨΊʹϦϞʔτϩάΛ։ൃʢஅ೦ʣ

    View Slide

  60. #denatechcon
    ݱࡏͷऔΓ૊Έ


    ୈষ

    View Slide

  61. #denatechcon
    എܠ


    ݱࡏͷऔΓ૊Έ

    View Slide

  62. #denatechcon

    ૊৫ͷνʔϜ࠶ฤͰ্൒ظͷऔΓ૊Έ͔Β཭ΕΔ͜ͱʹɻ

    ͨͩɺ཭Ε͔ͯΒৼΓฦΔͱͭͷֶͼ͕͋ͬͨɿ
    w طʹશମతͳઃܭ͕ݻ·ͬͯ͠·͍ͬͯΔஈ֊͔Β

    ࢀՃͯ͠΋ɺඅ༻ରޮՌͷߴ͍ςετͷಋೖ͸೉͍͠
    w ࣗ෼ࣗ਎ʹήʔϜΫϥΠΞϯτ։ൃͷ஌͕ࣝ଍Γ͓ͯΒͣɺ
    ରԠ͸৔౰ͨΓతʹͳΓຊ࣭తͳରࡦΛଧͯͳ͔ͬͨ

    View Slide

  63. #denatechcon

    ͜ͷֶͼ͔ΒԼ൒ظͰ͸࣍ͷํ޲ੑΛఆΊͨɿ
    ઃܭஈ֊ͷॳظʹඞཁͳήʔϜΫϥΠΞϯτ։ൃͷ

    ஌ࣝΛ֫ಘ͠ɺܗࣜ஌ʹ·ͱΊͯଈԠଶ੎Λ੔͑Δɻ
    ܗࣜ஌ʹ·ͱΊΔͱɺ੡඼ʹͳΔ͔Ͳ͏͔ෆಁ໌ͳஈ֊ͷ

    ϓϩτλΠϓͨͪʹ΋ว͘ޮՌΛൃشͰ͖Δɻ
    ਤ΍ݴ༿Ͱදݱ͞Εͨઆ໌ͷ͜ͱɻٯ͸৬ਓͷצͷΑ͏ͳ҉໧஌ɻ

    View Slide

  64. #denatechcon
    औΓ૊Έͷํ਑


    ݱࡏͷऔΓ૊Έ

    View Slide

  65. #denatechcon

    ܗࣜ஌ʹ·ͱΊΔ࡞ۀͷੑ࣭͸3%ʹۙ͘ͳΔͨΊɺ

    ผͷ3%ςʔϚ΋͋Θ໊ͤͯͰऔΓ૊Ή͜ͱʹɿ
    ήʔϜΫϥΠΞϯτྖҬͷઃܭͷֶशΛ݉Ͷͯɺ

    ޮՌతͳઃܭͱ୯ମςετͷܗࣜ஌Խ
    ୯ମςετΛ௥͍͔͚Δ͏ͪʹ໌Β͔ʹͳͬͨɺ

    ήʔϜ࢓༷ॻͷܽؕ໰୊ͷରॲͷܗࣜ஌Խ
    όάमਖ਼ͷࠩ෼͔ΒϦεΫՕॴΛ෼ੳͯ͠ɺ௿ϦεΫ࣌
    ʹ2"࣌ͷςετέʔεΛ࡟ݮ͢Δج൫ͷ։ൃʢׂѪʣ



    View Slide

  66. #denatechcon

    ܗࣜ஌ʹ·ͱΊΔ࡞ۀͷੑ࣭͸3%ʹۙ͘ͳΔͨΊɺ

    ผͷ3%ςʔϚ΋͋ΘͤͯऔΓ૊Ή͜ͱʹɿ
    ήʔϜΫϥΠΞϯτྖҬͷઃܭͷֶशΛ݉Ͷͯɺ

    ޮՌతͳઃܭͱ୯ମςετͷܗࣜ஌Խ
    ୯ମςετΛ௥͍͔͚Δ͏ͪʹ໌Β͔ʹͳͬͨɺ

    ήʔϜ࢓༷ॻͷܽؕ໰୊ͷରॲͷܗࣜ஌Խ
    όάमਖ਼ͷࠩ෼͔ΒϦεΫՕॴΛ෼ੳͯ͠ɺ௿ϦεΫ࣌
    ʹ2"࣌ͷςετέʔεΛ࡟ݮ͢Δج൫ͷ։ൃʢׂѪʣ



    ·ͣ͸୯ମςετͷऔΓ૊Έ͔Β঺հ

    View Slide

  67. #denatechcon
    ήʔϜΫϥΠΞϯτ෼໺ͷ

    ୯ମςετͷ໛ࡧ


    ݱࡏͷऔΓ૊Έ

    View Slide

  68. #denatechcon

    Ұൠʹޮ཰͕͍͍ͱ͍ΘΕΔಈ࡞֬ೝํ๏Ͱ͋Δ

    ʮ୯ମςετʯΛήʔϜΫϥΠΞϯτ։ൃͰࢼ͍ͨ͠ɻ
    લ৬Ͱ୯ମςετΛ࢖ͬͯ։ൃ଎౓Λେ͖͘޲্ͤͨ͞

    ܦݧ͕͋Γɺ͏·͘ϑΟοτ͢Ε͹։ൃ଎౓Λ্͛ΒΕΔ

    ͜ͱ͕Θ͔͍ͬͯΔʢϑΟοτ͢Δ͔Ͳ͏͔͸ޙड़ʣɻ
    Ϟνϕʔγϣϯ
    &&ςετ
    ݁߹ςετ
    ୯ମςετ
    ݁߹όάΛൃݟͰ͖Δ
    ݁߹όάΛݟམͱ͢
    ϑΟʔυόοΫ͕஗͍
    ϑΟʔυόοΫ͕଎͍
    ݁߹όάΛݟ͚͍ͭͨ

    ͱ͖ʹ͚ͩ࢖͏
    ୯ମςετͰ׬݁Ͱ͖Δ

    ͳΒͦͷํ͕Α͍

    View Slide

  69. #denatechcon

    ͋ΔΫϥε΍ؔ਺ͷಈ࡞ΛίʔυͰ֬ೝ͢Δ͜ͱɻ
    ୯ମςετͱ͸
    public class ExampleBehaviourTest
    {
    [Test]
    public void TestDistance()
    {
    var vec1 = new Vector2(1.0f, 0.0f);
    var vec2 = new Vector2(0.0f, 1.0f);
    var distance = Vector2.Distance(vec1, vec2);
    Assert.AreApproximatelyEqual(distance, Mathf.Sqrt(2));
    }
    }
    ͋·Γݱ࣮తͰͳ͍ྫ͕ͩ

    ͭͷϕΫτϧ
    ͱ


    ͷڑ཭͕˽ʹͳΔ

    ͜ͱΛίʔυͰ֬ೝ͍ͯ͠Δɻ
    ॏཁͳͷ͸ɺ͜ͷछͷ֬ೝΛ

    ίʔυ͔ΒͰ͖Δ͜ͱɻ

    View Slide

  70. #denatechcon

    6OJUZʹ͓͚Δςετͷ࣮ߦํ๏
    8JOEPX(FOFSBM5FTU3VOOFSͰ

    ςετ༻ͷը໘Λ։͘ɻ

    View Slide

  71. #denatechcon

    6OJUZʹ͓͚Δςετͷ࣮ߦํ๏
    ։͍ͨςετ༻ͷը໘ʹ͸ɺࠨͷΑ͏ʹઌ΄Ͳͷ

    ؔ਺TestDistance͕දࣔ͞Ε͍ͯΔɻ
    આ໌͸লུ͍ͯ͠Δ͕ɺ6OJUZͷςετʹ͸छྨ͕͋ͬͯɺ

    &EJU.PEFͱ1MBZ.PEF͕͋Δɻࠓճ࢖͍ͬͯΔͷ͸

    &EJU.PEFͷํͰɺಈ࡞͸଎੍͍͕ݶ͕͋Δɻ
    ৄ͍͠ηοτΞοϓํ๏͸5FTU3VOOFSͷެࣜϚχϡΞϧΛ

    ಡΉͱΑ͍ɻ

    View Slide

  72. #denatechcon

    6OJUZʹ͓͚Δςετͷ࣮ߦํ๏
    ࠨ্ʹ͋Δ3VO"MMΛ࣮ߦ͢Δͱɺઌ΄Ͳͷ

    TestDistance͕࣮ߦ͞ΕΔɻ

    View Slide

  73. #denatechcon

    6OJUZʹ͓͚Δςετͷ࣮ߦํ๏

    ͱ
    ͷ݁Ռ͸࣮ࡍʹ˽ͳͷͰɺ

    ಈ࡞֬ೝ͸੒ޭ͢Δɻ
    ੒ޭ͢ΔͱɺࠨͷΑ͏ʹ྘ͷνΣοΫϚʔΫ͕ͭ͘ɻ

    View Slide

  74. #denatechcon

    ಈ࡞֬ೝʹࣦഊ͢Δ৔߹
    [Test]
    public void TestWrong()
    {
    var vec1 = new Vector2(1.0f, 0.0f);
    var vec2 = new Vector2(0.0f, 1.0f);
    var distance = Vector2.Distance(vec1, vec2);
    Assert.AreApproximatelyEqual(distance, 100);
    }
    ಉ͡Α͏ʹ
    ͱ
    ͷ

    ڑ཭Λܭࢉ͍ͯ͠Δɻ

    ͨͩɺࣦഊ͢Δέʔε΋

    ͔֬ΊΔͨΊʹɺ͋͑ͯ

    ؒҧͬͨ݁Ռͱൺֱ͢Δ
    ਖ਼͘͠͸˽

    View Slide

  75. #denatechcon

    6OJUZʹ͓͚Δςετͷ࣮ߦํ๏
    ௥Ճͨ͠ಈ࡞֬ೝͷίʔυ͸ؒҧ͍ͬͯΔͷͰɺ

    ࠨͷΑ͏ʹ੺͍ࣦഊϚʔΫ͕ͭ͘ɻ

    View Slide

  76. #denatechcon

    ίϚϯυϥΠϯ͔Β΋࣮ߦͰ͖Δ
    $ /Applications/Unity.app/Contents/MacOS/Unity \
    -runEditorTests \
    -projectPath ./ \
    -batchmode
    $ file TestResults-*.xml
    TestResults-xxxxx.xml: XML 1.0 document text, ASCII text,
    ίϚϯυϥΠϯ͔Β࣮ߦͰ͖Δͱ͍͏͜ͱ͸ɺ+FOLJOTͳͲ͔Β

    ࣗಈͰಈ࡞֬ೝΛ࣮ߦ͠΍͍͢ɻͭ·Γఆظతͳ࣮ߦͳͲ΋Մೳɻ
    6OJUZ)VCΛ࢖͍ͬͯΔ৔߹͸ɺ

    ࣮ߦϑΝΠϧͷύε͕ҟͳΔͷͰ஫ҙɻ

    View Slide

  77. #denatechcon

    ͔͜͜Β͸໛ࡧதͷ࿩ʹͳΓ·͢
    ݱ





    ໛ࡧதͳͨΊɺਖ਼͘͠ͳ͍ચ࿅͞Ε͍ͯͳ͍෦෼΋ؚ·Ε·͢ɻ

    ήʔϜ෼໺ͷํ͸౰ͨΓલͱࢥ͏෦෼΋͋Δ͔΋͠Ε·ͤΜɻ

    View Slide

  78. #denatechcon

    ୯ମςετ͕ϑΟοτ͢Δ͔Ͳ͏͔ͷٞ࿦
    ͜ΕΛߟ͑Δʹ͸ɺήʔϜͷίΞ෦෼ʢΠϯήʔϜʣͱ

    ϝχϡʔը໘ͳͲʢΞ΢τήʔϜʣͰେ͖͘ࣄ৘͕

    ҟͳΔͷͰ෼͚ͯߟ͑ͨํ͕Α͍ɻ
    Ξ΢τήʔϜ͸୯ମςετΛ͠΍͍͢ͱ͍ΘΕ͍ͯΔɻ
    ςετ͠΍͍͢ઃܭύλʔϯΛ࡞Ε͹ɺ։ൃ଎౓Λ

    ߴΊΒΕΔՄೳੑ͕͋Δɻ
    ݱ





    View Slide

  79. #denatechcon

    Ξ΢τήʔϜͷ୯ମςετ͠΍͢͞
    ݱ





    ͜͜Ͱ૝ఆ͍ͯ͠Δͷ͸ʮ͋Δ࣌ؒ΍Πϕϯτ഑৴࣌

    ͷΈಋઢ͕༗ޮʹͳΔʯͱ͍ͬͨϩδοΫͷݕূɻ
    ͜ͷछͷϩδοΫ͸ύλʔϯ਺͕ଟ͍͕ɺ

    ୯ମςετ͸؆୯ͳ͜ͱ͕ଟ͍ɻ
    ͳ͓ɺ୯ମςετʹൺ΂ͯखಈϓϨΠͰͷ֬ೝ͕

    ໘౗ʢ࣌ࠁґଘɺ͋Γ͑Δύλʔϯ͕ଟ͍ʣͳͨΊɺ

    ಛʹ୯ମςετͷޮՌͷߴ͍෦෼ͩͱߟ͍͑ͯΔɻ

    View Slide

  80. #denatechcon

    ͜Εʹର͠ɺΠϯήʔϜͷํ͸୯ମςετͮ͠Β͍ɺ

    ͋Δ͍͸ͯ͠΋ҙຯ͕ͳ͍ͱ͍ΘΕ͍ͯΔɻ
    ࣮ࡍͷίʔυΛ؆୯ʹ෼ੳͨ͠ͱ͜Ζɺͭͷ೉͕͠͞

    ൑໌͍ͯ͠Δɿ
    ୯ମςετͰ͸ݟ͚ͭΒΕͳ͍݁߹όά͕ଟ͍
    ਓؒͷײੑͰ͔͠൑அͰ͖ͳ͍Α͏ͳݕূ͕ଟ͍
    ݱ





    ΠϯήʔϜͷ୯ମςετ͠΍͢͞

    View Slide

  81. #denatechcon

    ΠϯήʔϜͷ೉݁͠͞߹όάͷ໰୊
    ݁߹όάͱ͸ɺෳ਺ͷΦϒδΣΫτͷ૊Έ߹ΘͤͰൃੜ͢Δ
    όάͷ͜ͱɻྫ͑͹ɺ਺ेݸͷΦϒδΣΫτΛ഑ஔ͠ͳ͍ͱ

    ࠶ݱ͠ͳ͍όάͳͲɻ
    ͜ΕΛ୯ମςετͷΑ͏ʹࣗಈͰݟ͚ͭΑ͏ͱ͢Δͱɿ
    w ඞཁͳঢ়ଶΛ࠶ݱ͢ΔͨΊͷେྔʹίʔυ͕ඞཁ
    w ແؔ܎ͳมߋͰյΕ΍͘͢อकίετ͕ߴ͍
    ݱ





    View Slide

  82. #denatechcon

    ΠϯήʔϜͷ೉͠͞ײੑͷ໰୊
    ୯ମςετͷΑ͏ͳࣗಈతͳςετͰ͸ɺײੑͰ͔͠

    Θ͔Βͳ͍൑அΛͰ͖ͳ͍ɻ
    ͨͱ͑͹ɺʮεϜʔζʹಈ͘ʯͱ͍͏ײੑϕʔεͷ൑அ͸

    ͦͷ··Ͱ͸ࣗಈతͳςετΛͰ͖ͳ͍ɻ
    ͦ͜Ͱɺ͜ΕΛʮ'14͕ᮢ஋ΑΓখ͘͞ͳΒͳ͍ʯ΍

    ʮϝϞϦΛແବʹফඅ͠ͳ͍ʯͳͲͷɺίʔυ͔Β

    ൑அͰ͖ΔΑ͏ͳࢦඪʹམͱ͜͠Ή޻෉͕ඞཁʹͳΔɻ
    ݱ





    View Slide

  83. #denatechcon

    ΠϯήʔϜͷ೉͠͞·ͱΊ
    ୯ମςετͰ͸ݟ͚ͭΒΕͳ͍݁߹όά͕ଟ͍ɻ
    ݁߹όάΛݟ͚ͭΒΕΔΑ͏ʹͯ͠΋໰୊͕͋Δɿ
    w ঢ়گ࠶ݱͷίʔυ͕େྔʹඞཁʹͳΔ
    w ແؔ܎ͳมߋͰյΕ΍͍͢
    ਓؒͷײੑͰ͔͠൑அͰ͖ͳ͍Α͏ͳݕূ͕ଟ͍ɻ
    ίʔυͰ൑அͰ͖Δࢦඪʹམͱ͢ඞཁ͕͋Δɻ
    ݱ







    View Slide

  84. #denatechcon

    ΍͍ͬͯΔ͜ͱ·ͱΊ
    Ξ΢τήʔϜ
    ୯ମςετ͠΍͍͢ઃܭύλʔϯͷ໛ࡧͱܗࣜԽɻ
    ݱ





    ΠϯήʔϜ
    ݁߹όάͷςετΛॻ͖΍͘͢͢ΔͨΊͷ޻෉

    ʢঢ়ଶ࠶ݱͷ؆қԽͱมߋ΁ͷݎ࿚Խʣͱɺ

    ίʔυͰදݱ͠΍͍͢ײੑͷࢦඪͷ໛ࡧͱܗࣜԽɻ

    View Slide

  85. #denatechcon

    ۩ମతͳίʔυΛ঺հͰ͖Δ

    Α͏ʹӶҙऔΓ૊Έதʜʂ
    ݱ





    View Slide

  86. #denatechcon

    ܗࣜ஌ʹ·ͱΊΔ࡞ۀͷੑ࣭͸3%ʹۙ͘ͳΔͨΊɺ

    ผͷ3%ςʔϚ΋͋ΘͤͯऔΓ૊Ή͜ͱʹɿ
    ήʔϜΫϥΠΞϯτྖҬͷઃܭͷֶशΛ݉Ͷͯɺ

    ޮՌతͳઃܭͱ୯ମςετͷܗࣜ஌Խ
    ୯ମςετΛ௥͍͔͚Δ͏ͪʹ໌Β͔ʹͳͬͨɺ

    ήʔϜ࢓༷ॻͷܽؕ໰୊ͷରॲͷܗࣜ஌Խ
    όάमਖ਼ͷࠩ෼͔ΒϦεΫՕॴΛ෼ੳͯ͠ɺ௿ϦεΫ࣌
    ʹ2"࣌ͷςετέʔεΛ࡟ݮ͢Δج൫ͷ։ൃʢׂѪʣ



    ࣍͸͜Ε·Ͱͷ୯ମςετͱ͸ผͷऔΓ૊ΈΛ঺հ

    View Slide

  87. #denatechcon
    ήʔϜ෼໺ʹ͓͚Δ

    ܗࣜख๏ͷ໛ࡧ


    ݱࡏͷऔΓ૊Έ

    View Slide

  88. #denatechcon

    ӡ༻λΠτϧͷࢧ഑తͳ໰୊Ͱ͋ΔɺήʔϜ࢓༷ॻͷ

    ໰୊ʢߟྀ࿙Εهࡌ࿙Εໃ६౳ʣʹ͍ͭͯղܾΛ

    ໛ࡧͯ͠΄͍͠ͱ͍͏ཁ๬͕͋ͬͨͷ͕͖͔͚ͬɻ
    ͦ͜Ͱɺ໌֬ͰݫີͳҙຯΛ΋ͭݴޠΛ͔ͭͬͯ

    ࢓༷Λهड़͢Δܗࣜख๏ͷద༻ͱ࣮༻ੑௐࠪΛ

    ͢Δ͜ͱʹͳͬͨɻ
    Ϟνϕʔγϣϯ

    View Slide

  89. #denatechcon

    ࢓༷ΛݫີͰ໌֬ʹهड़͢Δख๏΍ɺ͜ΕͰهड़͞Εͨ

    ઃܭͷੑ࣭Λػցతʹݕূ͢Δख๏ͷ૯শɻ
    ͨͱ͑͹ɺ1SPNFMBͱ͍͏ݴޠͰฒྻಈ࡞͢ΔγεςϜͷ

    ࢓༷Λهड़͢ΔͱɺσουϩοΫ΍ϥΠϒϩοΫΛ

    ى͜͞ͳ͍ͱ͍ͬͨੑ࣭ͳͲΛอূͰ͖Δɻ
    ܗࣜख๏ͱ͸

    View Slide

  90. #denatechcon

    ͔͜͜Β͸໛ࡧதͷ࿩ʹͳΓ·͢
    ݱ





    ܗࣜख๏ͷΞϓϩʔν΍ίʔυʹΠέͯͳ͍෦෼͕

    ͋Δ͔΋͠Ε·ͤΜ͕ɺ໛ࡧதͳͷͰ͝༰͍ࣻͩ͘͞

    View Slide

  91. #denatechcon

    औΓ૊ΈͷΠϝʔδͱͯ͠ɺήʔϜ࢓༷ͷ

    ߟྀ࿙ΕΛܗࣜख๏Ͱͳ͘͢ྫΛ঺հ
    ݱ





    View Slide

  92. #denatechcon

    ήʔϜʹ͓͚Δ࢓༷ͷ໰୊ͷྫ
    Ϙεͷߦಈύλʔϯͷ࢓༷ɿ
    w )1͕ҎԼͳΒม਎
    w )1͕ʹͳͬͨΒࢮ๢
    ͜ͷ࢓༷ʹ͸ߟྀ࿙Εͷ໰୊͕͋Δɻ
    ݱ





    View Slide

  93. #denatechcon

    Ϙεͷߦಈύλʔϯͷ࢓༷ɿ
    w )1͕ҎԼͳΒม਎
    w )1͕ʹͳͬͨΒࢮ๢
    ͜ͷ࢓༷ʹ͸ߟྀ࿙Εͷ໰୊͕͋Δɻ
    ήʔϜʹ͓͚Δ࢓༷ͷ໰୊ͷྫ
    ݱ





    ΋͠ɺҰܸͰ)1͕ʹ͞Εͯ͠·ͬͨΒɺ

    ม਎͢ΔͷͩΖ͏͔ɺ͠ͳ͍ͷͩΖ͏͔ʜʁ
    ͜Ε͕ߟྀ͞Ε͍ͯͳ͍ͷͰɺม਎͔ͯ͠Β

    ࢮ๢͢Δͷ൱͔͕໌֬Ͱ͸ͳ͍

    View Slide

  94. #denatechcon

    Ϙεͷߦಈύλʔϯͷ࢓༷ɿ
    w )1͕ҎԼͳΒม਎
    w )1͕ʹͳͬͨΒࢮ๢
    ͜ͷ࢓༷ʹ͸ߟྀ࿙Εͷ໰୊͕͋Δɻ
    ήʔϜʹ͓͚Δ࢓༷ͷ໰୊ͷྫ
    ݱ





    ͜ͷ࣌఺Ͱاըऀ͸ɺϘε͸ม਎͔ͯ͠Β

    ࢮ๢͢Δ͜ͱΛظ଴͍ͯ͠Δͱ͢Δ
    ͨͩɺ࢓༷ͷᐆດ͞ʹ·ͩؾ͚͓ͮͯΒͣ

    ߟྀ͔Β࿙Ε͍ͯΔঢ়گΛԾఆ͢Δ

    View Slide

  95. #denatechcon

    ܗࣜख๏ͷ׆༻Πϝʔδɿ
    1SPNFMBͰ࢓༷ΛৄࡉԽ͢Δ
    ߟྀ࿙ΕΛݟ͚ͭΔ
    ݱ







    View Slide

  96. #denatechcon

    ܗࣜख๏ͷ׆༻Πϝʔδɿ
    1SPNFMBͰ࢓༷ΛৄࡉԽ͢Δ
    ߟྀ࿙ΕΛݟ͚ͭΔ
    ݱ







    ·ͣ͸࢓༷ͷৄࡉԽ͔Β

    View Slide

  97. #denatechcon

    mtype:bossMode = { Normal, Transformed }
    mtype:bossHp = { Full, GreaterThanHalf, LessThanHalf, Dead }
    inline Attack(bossHp) {
    if
    :: (bossHp > Dead) -> bossHp = bossHp - 1
    :: (bossHp > LessThanHalf) -> bossHp = bossHp - 2
    :: (bossHp > GreaterThanHalf) -> bossHp = bossHp - 3
    fi
    }
    ݱ





    View Slide

  98. #denatechcon

    mtype:bossMode = { Normal, Transformed }
    mtype:bossHp = { Full, GreaterThanHalf, LessThanHalf, Dead }
    inline Attack(bossHp) {
    if
    :: (bossHp > Dead) -> bossHp = bossHp - 1
    :: (bossHp > LessThanHalf) -> bossHp = bossHp - 2
    :: (bossHp > GreaterThanHalf) -> bossHp = bossHp - 3
    fi
    }
    ݱ





    Ϙεͷঢ়ଶͷఆٛɻ௨ৗͱม਎ޙͷ͕ͭ͋Δ

    View Slide

  99. #denatechcon

    mtype:bossMode = { Normal, Transformed }
    mtype:bossHp = { Full, GreaterThanHalf, LessThanHalf, Dead }
    inline Attack(bossHp) {
    if
    :: (bossHp > Dead) -> bossHp = bossHp - 1
    :: (bossHp > LessThanHalf) -> bossHp = bossHp - 2
    :: (bossHp > GreaterThanHalf) -> bossHp = bossHp - 3
    fi
    }
    ݱ





    Ϙεͷ)1ͷఆٛɻϑϧɺ൒෼Ҏ্ɺ൒෼ҎԼɺࢮ๢ͷ͕ͭ͋Δ

    View Slide

  100. #denatechcon

    mtype:bossMode = { Normal, Transformed }
    mtype:bossHp = { Full, GreaterThanHalf, LessThanHalf, Dead }
    inline Attack(bossHp) {
    if
    :: (bossHp > Dead) -> bossHp = bossHp - 1
    :: (bossHp > LessThanHalf) -> bossHp = bossHp - 2
    :: (bossHp > GreaterThanHalf) -> bossHp = bossHp - 3
    fi
    }
    ݱ





    ඃ߈ܸʹΑΔϘεͷ)1มԽɻ͜ͷJGจͷҙຯ͸ී௨ͷݴޠͱ͸ҟͳΓɺ

    ׅހ಺ͷ৚݅Λຬͨ͢ʮ͍ͣΕ͔ʯͷจ͕࣮ߦ͞ΕΔͱ͍͏͜ͱɻͲΕ͕

    ࣮ߦ͞ΕΔ͔͸ඇܾఆతʹͳ͍ͬͯΔʢμϝʔδྔ͕೚ҙͳ͜ͱΛදݱʣ

    View Slide

  101. #denatechcon

    ݱ





    active proctype Battle() {
    mtype:bossMode bossMode = Normal
    mtype:bossHp bossHp = Full
    do
    :: Attack(bossHp)
    od
    assert false
    }
    // TODO: ͜͜ʹ͸ότϧͷࢮ๢/ม਎൑ఆΛهड़͢Δɻ
    // ͜͜ʹ͸ 2 ௨Γͷॻ͖ํ͕͋Δɻ

    View Slide

  102. #denatechcon

    active proctype Battle() {
    mtype:bossMode bossMode = Normal
    mtype:bossHp bossHp = Full
    do
    :: Attack(bossHp)
    od
    assert false
    }
    // TODO: ͜͜ʹ͸ότϧͷࢮ๢/ม਎൑ఆΛهड़͢Δɻ
    // ͜͜ʹ͸ 2 ௨Γͷॻ͖ํ͕͋Δɻ
    ࣮ࡍͷότϧͷྲྀΕͷఆٛ
    ݱ





    View Slide

  103. #denatechcon

    active proctype Battle() {
    mtype:bossMode bossMode = Normal
    mtype:bossHp bossHp = Full
    do
    :: Attack(bossHp)
    od
    assert false
    }
    // TODO: ͜͜ʹ͸ότϧͷࢮ๢/ม਎൑ఆΛهड़͢Δɻ
    // ͜͜ʹ͸ 2 ௨Γͷॻ͖ํ͕͋Δɻ
    ॳظঢ়ଶͷϘεΛɺະม਎ɺ)1ϑϧʹઃఆɻ
    ݱ





    View Slide

  104. #denatechcon

    active proctype Battle() {
    mtype:bossMode bossMode = Normal
    mtype:bossHp bossHp = Full
    do
    :: Attack(bossHp)
    od
    assert false
    }
    // TODO: ͜͜ʹϘεͷࢮ๢/ม਎൑ఆΛهड़͢Δɻ
    // ͦΕͧΕͷ൑ఆͷॱংͰ 2 ௨Γͷॻ͖ํ͕͋Δɻ
    ߈ܸΛ܁Γฦ͢ϧʔϓʢ50%0෦෼ͰCSFBL͞ΕΔ·Ͱ܁Γฦ͢ʣ
    ݱ





    View Slide

  105. #denatechcon
    if
    :: (bossHp == Dead) -> break
    :: else -> skip
    fi


    ݱ





    Ϙεͷ)1͕ %FBEঢ়ଶʣͳΒ߈ܸΛऴྃ͢Δ൑ఆ
    ࢮ๢൑ఆ
    ม਎൑ఆ
    if
    :: (bossHp <= LessThanHalf) -> bossMode = Transformed
    :: else -> skip
    fi
    Ϙεͷ)1͕ͳΒม਎͢Δ൑ఆ

    View Slide

  106. #denatechcon
    if
    :: (bossHp == Dead) -> break
    :: else -> skip
    fi
    if
    :: (bossHp <= LessThanHalf) -> bossMode = Transformed
    :: else -> skip
    fi


    ݱ





    ࢮ๢൑ఆΛઌʹ͢Δ৔߹ɿ
    if
    :: (bossHp <= LessThanHalf) -> bossMode = Transformed
    :: else -> skip
    fi

    if
    :: (bossHp == Dead) -> break
    :: else -> skip
    fi
    ม਎൑ఆΛઌʹ͢Δ৔߹ɿ
    ࢮ๢൑ఆ
    ม਎൑ఆ
    ࢮ๢൑ఆ
    ม਎൑ఆ

    View Slide

  107. #denatechcon
    if
    :: (bossHp == Dead) -> break
    :: else -> skip
    fi
    if
    :: (bossHp <= LessThanHalf) -> bossMode = Transformed
    :: else -> skip
    fi


    ݱ





    ࢮ๢൑ఆΛઌʹ͢Δ৔߹ɿ
    if
    :: (bossHp <= LessThanHalf) -> bossMode = Transformed
    :: else -> skip
    fi

    if
    :: (bossHp == Dead) -> break
    :: else -> skip
    fi
    ม਎൑ఆΛઌʹ͢Δ৔߹ɿ
    ࢮ๢൑ఆ
    ม਎൑ఆ
    ࢮ๢൑ఆ
    ม਎൑ఆ
    ͪ͜ΒΛࢼ͢

    View Slide

  108. #denatechcon

    active proctype Battle() {
    mtype:bossMode bossMode = Normal
    mtype:bossHp bossHp = Full
    do
    :: Attack(bossHp)
    if
    :: (bossHp == Dead) -> break
    :: else -> skip
    fi
    if
    :: (bossHp <= LessThanHalf) -> bossMode = Transformed
    :: else -> skip
    fi
    od
    assert false
    }
    ݱ





    50%0෦෼Λࢮ๢൑ఆɺม਎൑ఆͷॱͰهड़

    View Slide

  109. #denatechcon

    ܗࣜख๏ͷ׆༻Πϝʔδɿ
    1SPNFMBͰ࢓༷ΛৄࡉԽ͢Δ
    ߟྀ࿙ΕΛݟ͚ͭΔ
    ݱ







    ৄࡉԽʹΑΔߟྀ࿙Εൃݟࢧԉͷྫ

    View Slide

  110. #denatechcon

    active proctype Battle() {
    mtype:bossMode bossMode = Normal
    mtype:bossHp bossHp = Full
    do
    :: Attack(bossHp)
    if
    :: (bossHp == Dead) -> break
    :: else -> skip
    fi
    if
    :: (bossHp <= LessThanHalf) -> bossMode = Transformed
    :: else -> skip
    fi
    od
    assert false
    }
    গ͠ճΓ͘Ͳ͍͕ɺৗʹΤϥʔͰऴྃͤ͞Δ͜ͱͰϘεͷঢ়ଶ͕

    ͲͷΑ͏ʹҠΓมΘΔ͔ΛπʔϧͰྻڍͰ͖Δ
    ݱ





    View Slide

  111. #denatechcon

    $ spin -a -o2 ./boss-batle.pml
    $ gcc -DREACH -o pan pan.c
    $ ./pan -c0 -e

    ...
    State-vector 20 byte, depth reached 17, errors: 4

    ...
    1SPNFMBʹରԠ͢Δ࢓༷νΣοΫπʔϧ4QJOͰ

    ܗࣜԽͨ͠ϘεઓͷͱΓ͏Δঢ়ଶભҠͷҰཡΛܭࢉ͢Δ
    ݱ





    BTTFSUʹҾ͔͔ͬͬͨܦ࿏͕ͭ͋ΔͷͰɺঢ়ଶભҠ͸ܦ࿏͋ΔͱΘ͔Δ

    View Slide

  112. #denatechcon

    $ spin -t1 -p boss-battle.pml
    using statement merging
    1: ... boss-battle.pml:7 ... [((bossHp>1))]
    2: ... boss-battle.pml:7 ... [bossHp = (bossHp-1)]
    ...
    16: ... boss-battle.pml:30 ... [assert(((bossMode!=2)&&(boss
    spin: trail ends after 16 steps
    #processes: 1
    bossMode = Transformed
    bossHp = Dead
    ܦ࿏Λͭͣͭ֬ೝ͢ΔɻUͷޙͷ਺ࣈ͕ܦ࿏ͷ൪߸Λҙຯ͍ͯ͠Δ
    ݱ





    View Slide

  113. #denatechcon

    $ spin -t1 -p boss-battle.pml
    using statement merging
    1: ... boss-battle.pml:7 ... [((bossHp>1))]
    2: ... boss-battle.pml:7 ... [bossHp = (bossHp-1)]
    ...
    16: ... boss-battle.pml:30 ... [assert(((bossMode!=2)&&(boss
    spin: trail ends after 16 steps
    #processes: 1
    bossMode = Transformed
    bossHp = Dead
    ͜ͷܦ࿏͕ͲͷΑ͏ͳঢ়ଶΛܦ༝͔ͨ͠ͷৄࡉɻӈଆ͸࣮ߦ͞Εͨίʔυ
    ݱ





    View Slide

  114. #denatechcon

    $ spin -t1 -p boss-battle.pml
    using statement merging
    1: ... boss-battle.pml:7 ... [((bossHp>1))]
    2: ... boss-battle.pml:7 ... [bossHp = (bossHp-1)]
    ...
    16: ... boss-battle.pml:30 ... [assert(((bossMode!=2)&&(boss
    spin: trail ends after 16 steps
    #processes: 1
    bossMode = Transformed
    bossHp = Dead
    ࠷ऴతͳϘεͷঢ়ଶɻม਎ࡁΈ͔ͭࢮ๢͍ͯ͠Δ͜ͱ͕Θ͔Δ
    ݱ





    View Slide

  115. #denatechcon

    $ spin -t2 -p boss-battle.pml
    using statement merging
    1: ... boss-battle.pml:9 (state 5) [((bossHp>3))]
    2: ... boss-battle.pml:9 (state 6) [bossHp = (bossHp-3)]
    3: ... boss-battle.pml:20 (state 10) [((bossHp==1))]
    ...
    4: ... boss-battle.pml:30 (state 25) [assert(((bossMode!=2
    spin: trail ends after 4 steps
    #processes: 1
    bossMode = Normal
    bossHp = Dead
    ॱʹ֬ೝ͍͖ͯ͠ɺ൪໨ͷܦ࿏Λ֬ೝ͢Δ
    ݱ





    View Slide

  116. #denatechcon

    $ spin -t2 -p boss-battle.pml
    using statement merging
    1: ... boss-battle.pml:9 (state 5) [((bossHp>3))]
    2: ... boss-battle.pml:9 (state 6) [bossHp = (bossHp-3)]
    3: ... boss-battle.pml:20 (state 10) [((bossHp==1))]
    ...
    4: ... boss-battle.pml:30 (state 25) [assert(((bossMode!=2
    spin: trail ends after 4 steps
    #processes: 1
    bossMode = Normal
    bossHp = Dead
    ߟྀͰ͖͍ͯͳ͔ͬͨɺϘε͕ม਎͠ͳ͍··

    ࢮ๢͢Δܦ࿏Λൃݟʢܦ࿏΋ม਎͠ͳ͍ʣ
    ݱ





    View Slide

  117. #denatechcon

    $ spin -t2 -p boss-battle.pml
    using statement merging
    1: ... boss-battle.pml:9 (state 5) [((bossHp>3))]
    2: ... boss-battle.pml:9 (state 6) [bossHp = (bossHp-3)]
    3: ... boss-battle.pml:20 (state 10) [((bossHp==1))]
    ...
    4: ... boss-battle.pml:30 (state 25) [assert(((bossMode!=2
    spin: trail ends after 4 steps
    #processes: 1
    bossMode = Normal
    bossHp = Dead
    ঢ়ଶભҠͷաఔ͔ΒݪҼΛ୳ΔͱɺϘεΛҰܸͰ

    ౗ͨ͠ͱ͜Ζߟྀ͍ͯ͠ͳ͍ঢ়ଶͳͬͨ͜ͱ͕Θ͔Δ
    ݱ





    View Slide

  118. #denatechcon

    active proctype P() {
    mtype:bossMode bossMode = Normal
    mtype:bossHp bossHp = Full
    do
    :: Attack(bossHp)
    if
    :: (bossHp == Dead) -> break
    :: else -> skip
    fi
    if
    :: (bossHp <= LessThanHalf) -> bossMode = Transformed
    :: else -> skip
    fi
    od
    assert false
    }
    ݱ





    ઌ΄ͲܗࣜԽͨ͠࢓༷Ͱ͸ɺϘεͷม਎൑ఆͷલʹ

    Ϙεͷࢮ๢Λ൑ఆ͢Δ͜ͱʹ͍ͯͨͨ͠ΊɺҰܸͰ

    Ϙε͕౗͞Εͨ৔߹ʹະม਎ʹͳΔ

    View Slide

  119. #denatechcon

    active proctype P() {
    mtype:bossMode bossMode = Normal
    mtype:bossHp bossHp = Full
    do
    :: Attack(bossHp)
    if
    :: (bossHp <= LessThanHalf) -> bossMode = Transformed
    :: else -> skip
    fi
    if
    :: (bossHp == Dead) -> break
    :: else -> skip
    fi
    od
    assert false
    }
    ݱ





    ม਎൑ఆΛࢮ๢൑ఆͷલʹҠಈ͢Δͱߟྀ࿙ΕΛͳͤ͘Δ
    ͜͜Ͱঢ়ଶͷྻڍΛ͢Δͱɺ͢΂ͯม਎ࡁΈͰࢮ๢͢Δ͜ͱ͕

    Θ͔ΔͷͰɺߟྀ࿙ΕͷղܾΛ֬ೝͰ͖Δ

    View Slide

  120. #denatechcon

    ͜ͷΑ͏ʹܗࣜख๏Λ࢖͏ͱɺ։ൃ΍

    ςετέʔε࡞੒ͷલʹ࢓༷ॻͷߟྀ࿙ΕΛ

    গͳ͘Ͱ͖ΔͨΊɺख໭Γ͕গͳ͘ͳΔɻ
    σϝϦοτ͸ɺ࢓༷ॻͷಡΈॻ͖ͷֶश͕

    ඞཁʹͳΔ͜ͱɻ·ͨอकίετ͕ࣗવݴޠͰ

    هड़͞Εͨ΋ͷͱൺ΂ͯͲ͏ͳΔ͔͸ఆ͔Ͱͳ͍ɻ
    ϝϦοτͱσϝϦοτ
    ݱ





    View Slide

  121. #denatechcon

    ͜ͷΑ͏ͳܗࣜख๏ΛاըߟҊऀʹ࣮ࢪͯ͠

    ΋Β͏͜ͱ͸ݱ࣮తʹ೉͍͠ɻ
    ͦ͜ͰɺاըΛߟҊ͢Δஈ֊Ͱॻهϩʔϧ͕

    ٞ࿦தͷ࢓༷Λܗࣜख๏Ͱهड़͠ɺ

    ࣮ࡍͷ։ൃલʹݕূ͢Δͱ͍ͬͨݱ࣮తͳ

    ӡ༻ͷͨΊͷ޻෉Λߟ͍͑ͯΔɻ
    ֶशͷ໰୊ͷରԠҊ
    ݱ





    View Slide

  122. #denatechcon

    ෦෼తʹܗࣜख๏Λ࢖͏͜ͱͰɺอकίετ͸

    ௐ੔Ͱ͖Δɻ
    Ͳͷ෦෼Λܗࣜख๏Ͱѻ͏ͱΑ͍͔͸ఆ͔Ͱ

    ͳ͍ͷͰɺ͜ͷޙʹ໌Β͔ʹ͍͖͍ͯͨ͠ɻ
    อकίετ΁ͷରԠҊ
    ݱ





    View Slide

  123. #denatechcon

    ΍͍ͬͯΔ͜ͱ·ͱΊ
    ݱ





    ܗࣜख๏ʹΑͬͯɺήʔϜ࢓༷ॻͷߟྀ࿙ΕͳͲΛ

    Ͳ͜·Ͱݕ஌Ͱ͖Δ͔Λ࣮ݧ͍ͯ͠Δɻܗࣜख๏ͷछྨ͸

    ଟ͍ͨΊɺ͞·͟·ͳख๏Λ࣮ݧ͢Δ༧ఆɻ
    ࠷ऴతʹ͸ɺܗࣜख๏Λ࢖͏ͱɺͲͷఔ౓ͷίετͰ

    Ͳͷఔ౓ख໭ΓΛ๷͛Δ͔ͱ͍͏අ༻ରޮՌΛݕূ͍ͨ͠ɻ

    View Slide

  124. #denatechcon

    ӶҙऔΓ૊Έதʂ
    ݱ





    View Slide

  125. #denatechcon
    ·ͱΊ


    ݱࡏͷऔΓ૊Έ

    View Slide

  126. #denatechcon

    ͍·औΓ૊ΜͰ͍ΔͭͷςʔϚΛ঺հͨ͠ɿ
    ήʔϜΫϥΠΞϯτྖҬͷ୯ମςετͷܗࣜ஌Խ
    ήʔϜ࢓༷ॻͷܽؕ໰୊ͷରॲͷܗࣜ஌Խ


    View Slide

  127. #denatechcon
    ·ͱΊ


    ୈষ

    View Slide

  128. #denatechcon

    48&5͸ɺָ͘͠ɺݡ͘ɺՁ஋͋ΔςετͰ

    ։ൃϓϩηεΛΑ͍ͯ͘͘͠૊৫
    ͜ͷϝϯόʔͱͯ͠ɺ൒೥લ͸ը૾ൺֱج൫ͷ

    ߏங΍+FOLJOTΫϥελߏஙͳͲʹऔΓ૊Ή
    ࠓ͸ήʔϜΫϥΠΞϯτʹ͓͚Δ୯ମςετٕज़ͷ

    ܗࣜ஌Խͱܗࣜख๏ͷ࣮ݧʹऔΓ૊Ή



    View Slide

  129. #denatechcon

    View Slide

  130. #denatechcon
    ૝ఆ࣭໰ͱͦͷճ౴


    View Slide

  131. #denatechcon
    ୯ମςετؔ࿈


    View Slide

  132. #denatechcon

    Ξ΢τήʔϜͱΠϯήʔϜͷࠩ
    ݱ





    w Ξ΢τήʔϜ͸ײੑʹΑΒͳ͍ݕূʹ͠΍͍͢
    w ྫಋઢͷ༗ޮੑͷݕূ͸ײੑʹΑΒͳ͍
    w Ξ΢τήʔϜ͸৚݅෼ذΛू໿͠΍͍͢
    w ྫΠϕϯτ΍ΫΤετҰཡͷߜΓࠐΈΛ૝ఆ

    View Slide

  133. #denatechcon

    ΠϯήʔϜͷςετ͠΍͢͞ʹ͍ͭͯ
    ݱ





    ଟ͘ͷήʔϜͰ͸ͭͷίϯϙʔωϯτʹϩδοΫΛ

    ڽूͮ͠Β͍͜ͱ͕ଟ͘ɺ୯ମͰςετͯ͠΋

    ҙຯͷͳ͍͜ͱ͕ଟ͍ɻ
    ྫͱͯ͠ɺ෺ཧγϛϡϨʔγϣϯΛؚΉήʔϜΛߟ͑Δɻ

    View Slide

  134. #denatechcon

    ෺ཧγϛϡϨʔγϣϯΛؚΉήʔϜͷ໰୊
    ݱ





    ࣮ࡍʹ6OJUZͰ͘͝୯७ͳ෺ཧγϛϡϨʔγϣϯ෇͖ͷήʔϜΛ
    ୯ମςετͨ͠ͱ͜Ζɺ࣍ͷ໰୊Λൃݟͨ͠ɻ
    ෺ཧγϛϡϨʔγϣϯͰ͸ɺ͋ΔΦϒδΣΫτͷҐஔ࠲ඪΛ

    ಡΈॻ͖͢Δίϯϙʔωϯτ͕ଟ͋͘Δɿ
    w িಥ൑ఆϩδοΫ
    w ྗֶܭࢉΤϯδϯ
    w ΦϒδΣΫτʹ෇ਵ͢Δॲཧʢೖྗૢ࡞΁ͷ൓ԠͳͲʣ

    View Slide

  135. #denatechcon

    ݱ





    িಥ൑ఆϩδοΫͱྗֶܭࢉΤϯδϯ
    ήʔϜΤϯδϯ΁ͷઃఆʹऴ࢝͢Δʢ෼ذ΍ϧʔϓ͕ͳ͍ʣ

    ͨΊɺ୯ମςετͰݕূ͢ΔՁ஋͸ͳ͍ɻ
    ෇ਵॲཧ
    ୯७ͳ͜ͱ͕ଟ͍͏͑ʹɺ୯ମͰͷόάΑΓ݁߹Ͱͷ

    όάʢนൈ͚΍นΊΓࠐΈ͔Βͷਧ͖ඈͼͳͲʣͷํ͕

    ࢧ഑తͰɺ୯ମςετͷϝϦοτΑΓίετͷํ͕উΔɻ
    ෺ཧγϛϡϨʔγϣϯབྷΈͷ୯ମςετͷՁ஋

    View Slide

  136. #denatechcon
    ܗࣜख๏ؔ࿈


    View Slide

  137. #denatechcon

    ݱ





    ͕࣌ؒܦͭ΄ͲৄࡉΛ๨ΕΔ
    ༨ܭͳίϛϡχέʔγϣϯ͕૿͑Δ
    ࢓༷ͷख໭Γ͸ޙଓλεΫΛϒϩοΫ͢Δ
    ख໭ΓʹΑΔੜ͡Δ໰୊

    View Slide

  138. #denatechcon

    ݱ





    ͕࣌ؒܦͭ΄ͲৄࡉΛ๨ΕΔ
    ͜͜Θ͔Βͳ͍ͷͰ͕͢

    Ͳ͏͍͏ҙຯͰ͢ʁ
    ઌिߟ͑ͯͨ΍͚ͭͩͲɺ

    ͲΜͳҙຯ͚ͩͬͨͬʜʁ
    ࢓༷ಡΜͩਓ
    ࢓༷هड़ऀ

    View Slide

  139. #denatechcon

    ݱ





    ༨ܭͳίϛϡχέʔγϣϯ͕૿͑Δ
    ͜Εໃ६ͯ͠·ͤΜ͔ʁ
    Ͳ͜ͷ͜ͱͰ͠ΐ͏͔ʁ
    ࢓༷ಡΜͩਓ
    ࢓༷هड़ऀ
    ͜ͷ"ͱ#Ͱ͕͢ʜ

    View Slide

  140. #denatechcon

    ݱ





    ࢓༷ͷख໭Γ͸ޙଓλεΫΛϒϩοΫ͢Δ
    اը
    ࣮૷
    ϨϏϡʔ
    ςετ࡞੒
    ख໭ΓରԠ
    ࢓༷͕ݻ·Δ·Ͱ࡞ۀͮ͠Β͍
    اը
    ։ൃ
    2"
    தஅ
    தஅ
    ࣮૷
    ςετ࡞੒

    View Slide

  141. #denatechcon

    ػցతͳঢ়ଶભҠͷྻڍ

    View Slide

  142. #denatechcon

    $ spin -a -o2 ./boss-batle.pml
    $ gcc -DREACH -o pan pan.c
    $ file ./pan
    pan: Mach-O 64-bit executable x86_64
    1SPNFMB͸ɺݕࠪ΍ՄࢹԽͷͨΊͷπʔϧͰ͋Δ

    4QJOͰղੳͰ͖Δɻ4QJOΛ࣮ߦ͢Δͱ$ͷίʔυ͕

    ੜ੒͞ΕΔͷͰɺίϯύΠϧ࣮ͯ͠ߦͰ͖ΔΑ͏ʹ͢Δ
    ੜ੒͢ΔόΠφϦ͸QBOͱ͍͏׳ྫతͳ໊લʹ͢Δ͜ͱ͕ଟ͍

    ʢQBO͸1SPUPDPM"/BMZ[FSͩͬͨͱ͍͏ྺ࢙తܦҢ͕͋Δʣ
    ݱ





    View Slide

  143. #denatechcon

    $ ./pan -D
    digraph p_Battle {
    size="8,10";
    GT [shape=box,style=dotted,label="Battle"];
    GT -> S22;
    S22 -> S2 [color=black,style=bold,label="(
    S22 -> S4 [color=black,style=bold,label="(
    S22 -> S6 [color=black,style=bold,label="(
    ...
    QBO͔Βঢ়ଶભҠਤΛEPUܗࣜͰग़ྗͰ͖Δ
    ݱ





    View Slide

  144. #denatechcon

    EPUܗࣜͷਤ͸(SBQIWJ[ͰඳըͰ͖Δ
    ભҠલͷঢ়ଶ
    4
    4
    YYY
    ঢ়ଶભҠΛൃੜͤͨ͞ίʔυ
    ঢ়ଶ
    ঢ়ଶભҠͷ໼ҹ

    ʢઢͷࡉ͞͸ࣗಈੜ੒Λҙຯʣ
    ભҠޙͷঢ়ଶ
    ੜ੒͞Εͨঢ়ଶભҠਤͷಡΈํ
    ݱ





    View Slide