Pro Yearly is on sale from $80 to $50! »

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

151a0b14f5914e786e2e104cfb3a9b2f?s=47 Kuniwak
February 06, 2019

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

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

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

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

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

151a0b14f5914e786e2e104cfb3a9b2f?s=128

Kuniwak

February 06, 2019
Tweet

Transcript

  1. #denatechcon ͋Δ48&5ΤϯδχΞͷ
 ։ൃϓϩηεվળ࠷લઢ γεςϜຊ෦඼࣭؅ཧ෦48&5άϧʔϓ ࠃ෼༎थʢ,VOJXBLʣ

  2. #denatechcon ൃදͷͶΒ͍  

  3. #denatechcon ։ൃݱ৔Ͱςετ΍։ൃϓϩηεʹ
 ೰ΜͰ͍ΔਓʹɺϞσϧέʔεͱͯ͠ 48&5ͷऔΓ૊ΈΛ঺հ͍ͨ͠  

  4. #denatechcon   ୈষ ࣗݾ঺հ ୈষ 48&5ͱ͸Կ͔ ୈষ ൒೥લͷऔΓ૊Έ ୈষ

    ݱࡏͷऔΓ૊Έ ୈষ ·ͱΊ
  5. #denatechcon ࣌ؒͷ౎߹ͰൃදதʹׂѪ͢Δϖʔδ΍
 ஫ऍͳͲ͕͋Γ·͢ɻ ·ͨɺίʔυͳͲ͕ಡΈͮΒ͍৔߹͸
 ҎԼ͔ΒεϥΠυΛ͝ཡ͍ͩ͘͞ɻ   https://speakerdeck.com/denatech

  6. #denatechcon ࣗݾ঺հ   ୈষ

  7. #denatechcon   ,VOJXBL w HJUIVCDPN,VOJXBL w RJJUBDPN,VOJXBL w ೥݄ʹத్ೖࣾ

    w 48&5άϧʔϓॴଐ w ઐ໳͸ɺ୯ମςετͱ੩తղੳ
  8. #denatechcon w J04%$+BQBOϕεττʔΫ৆Ґ
 ʮJ04ΞϓϦͷ։ൃ଎౓Λʹ޲্ͤͨ͞σόοάϊ΢ϋ΢ʯ w CVJMEFSTDPOUPLZPൃද
 ʮࣄલ஌ࣝͳ͠Ͱཧղ͢Δɺ੩తݕࠪͷ͍Ζ͸ʯ w 2JJUB"EWFOU$BMFOEBS࠷ଟ͍͍Ͷ৆
 ʮςετ͕ͳ͔ͬͨແ๏஍ଳʹςετΛಋೖͯ͠։ൃ଎౓Λഒʹͨ͠࿩ʯ

      ࠷ۙͷܦྺ
  9. #denatechcon 48&5ͱ͸Կ͔   ୈষ

  10. #denatechcon   48&5ͱ͸ αʔϏεͷ඼࣭޲্΍ɺ։ൃੜ࢈ੑ޲্Λ͓͜ͳ͏૊৫ɻ
 ϝϯόʔ͸ࢲΛؚΊݱࡏ໊ɻ ۀ຿಺༰͸ɺ։ൃऀͷςετΛॿ͚Δج൫ͷ੔උ΍
 ֤ϓϥοτϑΥʔϜʹ͓͚Δςετϊ΢ϋ΢ͷܗࣜԽͳͲɻ

  11. #denatechcon 48&5ͷ੒Γཱͪ   48&5ͱ͸Կ͔

  12. #denatechcon   ໊લͷ༝དྷ (PPHMFͳͲʹ͓͚Δ4&5 4PGUXBSF&OHJOFFSJO5FTU Λ
 ࢀߟʹ͍ͯ͠Δɻ͜ͷଞͷϩʔϧͱͯ͠ɺ48& 4PGUXBSF &OHJOFFS

    ͱ5& 5FTU&OHJOFFS ͳͲ͕͋Δɻ ͜ͷ໋໊Λࢀߟʹ͢Δࡍʹ4&5͸48&ͷҰछͰ͋Δ
 ͱ͍͏ೝ͔ࣝΒ4&5 48&ˠ48&5΁มߋɻ ৄ͘͠͸ʮςετ͔Βݟ͑ͯ͘Δάʔάϧͷιϑτ΢ΣΞ։ൃʯΛࢀর
  13. #denatechcon 48&5ͷϏδϣϯ   48&5ͱ͸Կ͔

  14. #denatechcon   ָ͘͠ɺݡ͘ɺՁ஋͋ΔςετͰ
 ։ൃϓϩηεͷվળΛॿ͚Δ͜ͱ

  15. #denatechcon   ָ͍͠ ͨͱ͑͹ɺςετͷ໨త͕͸͖ͬΓ͠ͳ͍··ɺ
 τοϓμ΢ϯͰ࢝Ίͤ͞ΒΕͨΒςετ͸ָ͘͠ͳ͍ɻ ͭΒ͍ ͨͱ͑͹ɺػೳͷ׬੒Λ͢͹΍͘ςετͷ੒ޭͰ ت΂ΔͳΒςετ͸ָ͘͠ͳΔɻ

  16. #denatechcon   ݡ͍ ໨తʹରͯ͠खஈ͕ద͍ͯ͠ͳ͍ٕज़ɻͨͱ͑͹ɺ
 ςετ඼࣭ͷଌఆʹҋӢʹΧόϨοδΛ࢖ͬͯ΋Θ͔Βͳ͍ɻ ҋӢ ςετ݁ՌΛద੾ͳλΠϛϯά΍಺༰Ͱڭ͑ͯ͘ΕΔٕज़ɻ
 ࠷ۙͰ͸ɺςετͷ඼࣭Λݡ͘ڭ͑ͯ͘ΕΔٕज़ͱͯ͠ɺ
 NVUBUJPOUFTUJOHͷௐࠪͳͲ΋͍ͯ͠Δɻ

  17. #denatechcon   Ձ஋͕͋Δ ͨͱ͑͹ɺΧόϨοδ౳ͷࢦඪͷΈΛ௥͍͔͚Δ͜ͱʹ
 ݻࣥͯ͠ɺ໨తΛ๨ΕۭͯճΓͯ͠͠·ͬͨςετɻ ແବ͕ଟ͍ ͨͱ͑͹ɺ୯ମςετΛ͏·͘࢖͑͹ɺख໭ΓΛগͳ͘ɺ୹͘
 Ͱ͖Δɻ͜Ε͸࠷ऴతʹΑΓଟ͘ͷػೳΛϓϨΠϠʔʹ
 ༧ࠂ௨ΓͷλΠϛϯάͰఏڙ͢Δ͜ͱʹͭͳ͕Δɻ

  18. #denatechcon   ָ͘͠ɺݡ͘ɺՁ஋͋ΔςετͰ
 ։ൃϓϩηεͷվળΛॿ͚Δ͜ͱ 48&5ͷϏδϣϯ

  19. #denatechcon औΓ૊Έͷྺ࢙   48&5ͱ͸Կ͔

  20. #denatechcon   w .PCBHFͷ8FC"1*6*΁ͷ&&ςετ   w ϚϧνϓϥοτϑΥʔϜͰͷ4%,ͷςετ ʙ

     w ςετج൫ʢ45'ͳͲʣͷల։ ʙ  w ϥΠϒϥϦͷࣗಈόʔδϣϯΞοϓج൫ ʙ  w ը૾ೝࣝʹΑΔ&&ςετࢧԉج൫ ʙ  w ʜ w ͜Ε͔Βൃද͢Δ্Լ൒ظͷऔΓ૊Έ ʙ
  21. #denatechcon 48&5͸໊ͷϝϯόʔ͔ΒͳΔɺ
 ָ͘͠ɺݡ͘ɺՁ஋͋ΔςετͰ
 ։ൃϓϩηεΛΑ͍ͯ͘͘͠૊৫   ͜͜·Ͱͷ·ͱΊ

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

  23. #denatechcon എܠ   ൒೥લͷऔΓ૊Έ

  24. #denatechcon   ήʔϜͷόοΫΤϯυ΍4%,΁ͷऔΓ૊Έ͸͋ͬͨ
 ΋ͷͷɺجװྖҬͰ͋ΔήʔϜΫϥΠΞϯτྖҬʹ
 48&5ͷऔΓ૊Έ͕·ͩͳ͔ͬͨɻ ͜͜ͰͷऔΓ૊Έ΋͸͡ΊΔͨΊɺෆ଍͍ͯͨ͠
 υϝΠϯ஌ࣝͷ֫ಘͱݱ৔ͷ՝୊ײͷ೺ѲΛ໨ࢦ͠ɺ
 48&5͔Βਓʢ࠷ऴతʹ͸ਓʣΛΞαΠϯɻ

  25. #denatechcon ՝୊ͷ෼ੳ   ൒೥લͷऔΓ૊Έ

  26. #denatechcon   εϚʔτϑΥϯήʔϜͷ։ൃݱ৔΁ɺ࡞ۀޮ཰ͷѱ͍
 λεΫ΍όάͷ಺༁ɺख໭ΓݪҼͳͲΛώΞϦϯάͨ͠ɿ w ඳըܥͷϦάϨογϣϯݕ஌͕େม w +FOLJOTͷ৑௕ੑ͕ͳ͍ w

    νέοτ͔Β࠶ݱ৚͕݅Θ͔Βͳ͍ w ʜ
  27. #denatechcon   நग़͞Εͨ՝୊͕ଟ਺͋ͬͨͷͰ
 ༏ઌ౓Λ͚ͭͯղܾΛ໛ࡧ ༏ઌ౓ͷߴ͔ͬͨऔΓ૊ΈΛ
 ॱʹ঺հ͍͖ͯ͠·͢

  28. #denatechcon ඳըܥͷϦάϨογϣϯ
 ݕ஌ج൫   ൒೥લͷऔΓ૊Έ

  29. #denatechcon   ඳըܥͷߋ৽ස౓͕ߴ͘ɺݕ߲ࠪ໨΋ඇৗʹଟ͍ͷͰ
 ݱঢ়ͷϦιʔεͰ͸ݕ͖ࠪ͠Εͳ͍ɻ ݱ৔ͷ՝୊ ظ଴͢ΔϑϨʔϜը૾ ඳըܥͷόάʹΑͬͯ࿪Μͩը૾ ໼ҹͷઌ͕࿪ΜͰ͍Δ

  30. #denatechcon   ղܾํ๏ͷݕ౼ ·ͣ͸ϑΟʔυόοΫͷ଎͍୯ମςετͰղܾΛݕ౼ɻ
 ͨͩ͠ɺ݁߹ʹΑΔ͕ܽؕଟ͘༧૝͞ΕͨͨΊɺ
 ݁߹ͯ͠ඳըͨ͠ޙͷϑϨʔϜը૾Λݕࠪ͢Δ͜ͱʹɻ &&ςετ ݁߹ςετ ୯ମςετ

    ݁߹όάΛൃݟͰ͖Δ ݁߹όάΛݟམͱ͢ ϑΟʔυόοΫ͕஗͍ ϑΟʔυόοΫ͕଎͍ ݁߹όάΛݟ͚͍ͭͨ
 ͱ͖ʹ͚ͩ࢖͏ ୯ମςετͰ׬݁Ͱ͖Δ
 ͳΒͦͷํ͕Α͍
  31. #denatechcon   ϑϨʔϜը૾શମͷ༰ྔ͸ͭͷόʔδϣϯʹରͯ͠
 ໿(#ɺ࿥ըʹ͔͔Δ࣌ؒ͸IҎ্ɻ ը૾ൺֱج൫ͷن໛ ج൫΁ͷཁٻ ϑΟʔυόοΫ·Ͱͷ࣌ؒΛͳΔ΂͘୹͘͢ΔͨΊɺ
 ࣮ߦ࣌ؒ͸গͳͭͭ͘͠ɺ݁Ռ͸Θ͔Γ΍͘͢ɻ

  32. #denatechcon   ͢΂ͯͷϑϨʔϜը૾Λ֨ೲͨ͠;JQΞʔΧΠϒ͔Βɺ
 ϑΝΠϧϔομʹه࿥͞Ε͍ͯΔ$3$Λൺֱɻ ࠩҟͷ͋ΔϑϨʔϜը૾ͷΈల։ͯ͠(16্Ͱ
 QY୯ҐͰൺֱɻ3(#஋ͷࠩҟ͕ᮢ஋ΑΓେ͖͚Ε͹ɺ ࠩҟ͕͋ͬͨͱΈͳ͢ɻ ߴ଎Խͷ޻෉ ;JQΞʔΧΠϒͷར༻͸ϑΝΠϧҰཡͷอ࣋ͱ$3$ͷه࿥͕໨తͳͷͰແѹॖɻ

    ൺֱʹ͸1JMMPX $V1ZΛ࢖༻ɻ*NBHF.BHJDLΑΓׂ଎͍͔ಉఔ౓ͩͬͨɻ
 $16ͷ4*.%໋ྩ͚ͩͰे෼଎͍Մೳੑ͕͋Δ͕·ͩࢼ͍ͤͯͳ͍ɻ
  33. #denatechcon   ͜ΕͰ΋શମͷൺֱ࣌ؒ͸໿I΄Ͳ͔͔ͬͯ͠·͍ɺ ͳΔ΂͘ϑΟʔυόοΫ·Ͱͷ࣌ؒΛ୹͘͢Δͱ͍͏
 ཁٻΛຬ͍ͨͤͯͳ͍ɻ ͦ͜ͰɺҰ෦ͷαϯϓϧͷΈͷൺֱΛ࣮ࢪ͢Δʮ଎ใʯͱ
 શମΛൺֱ͢ΔʮଓใʯͷछྨͷδϣϒΛ෼͚ͯ༻ҙɻ ೔ճͷ଎ใ͸໿I΄ͲͰ௨஌Ͱ͖ΔͨΊɺ޿ൣғͳ
 ϦάϨογϣϯͷϑΟʔυόοΫͷ࣌ؒΛ୹͘Ͱ͖͍ͯΔɻ

    ߴ଎Խͷ޻෉
  34. #denatechcon   ϑϨʔϜ͝ͱͷࠩҟΛҎԼͷΑ͏ʹදࣔͨ͠ಈըΛ࡞੒ɻ
 Ͳ͔͜Βࠩҟ͕ൃੜͯ͠ফࣦ͢Δͷ͔Λ֬ೝ͠΍͍͢ɻ ݁ՌͷՄಡੑͷ޻෉ ϑϨʔϜ" ϑϨʔϜ# "ͱ#ͷࠩҟ ࠩҟΛදࣔ

    ඳըܥͷόά ಈը΋ಉ༷
  35. #denatechcon   େن໛ͳը૾ൺֱج൫ΛߏஙͰ͖ɺݕূϦιʔεͷ
 ଍Βͳ͍ঢ়گͰ΋ඳըܥͷϦάϨογϣϯΛݕ஌͢Δ
 ج൫͕Ͱ͖ͨɻ ·ͩӡ༻Λ͸͡Ί͕ͯ࣌ؒܦա͍ͯ͠ͳ͍ͷͰվྑதɻ ੒Ռͱ՝୊

  36. #denatechcon +FOLJOTΫϥελΛ
 ҆ఆՔಇͤ͞ΔऔΓ૊Έ   ൒೥લͷऔΓ૊Έ

  37. #denatechcon   +FOLJOTͷϚγϯʹ৑௕ੑ͕ͳ͘ɺμ΢ϯλΠϜ͕
 ൃੜ͠΍͘͢ɺॏཁͳ࡞ۀ͕தஅ͞Ε͍ͯͨɻμ΢ϯλΠϜͷ ݪҼ͸σΟεΫ༰ྔෆ଍΍04΍πʔϧͷΞοϓσʔτͳͲɻ ౰࣌ͷߏ੒͸ɺ8JOEPXTNBD04ͦΕͧΕͰNBTUFS͕
 Ұ୆ͷΈͷߏ੒ɻ ݱ৔ͷ՝୊ 

    ͳΔ΂͘μ΢ϯλΠϜͷӨڹͷগͳ͍໷ؒʹ࣮ࢪ͢ΔͨΊ୲౰ऀ΁ͷෛ୲΋େ͖͍ɻ  8JOEPXT޲͚ͷϏϧυ͸8JOEPXTϚγϯ্ͰɺJ04NBD04޲͚ͷ
 Ϗϧυ͸NBD04্Ͱ࣮ࢪ͢Δ͜ͱΛҙਤͨ͠ߏ੒ɻ
  38. #denatechcon   ࣍ͷΑ͏ʹ+FOLJOTΫϥελΛ࠶ߏங

  39. #denatechcon   ߏஙͨ͠+FOLJOTΫϥελͷߏ੒ +FOLJOTNBTUFS 8JOEPXTBHFOU 8JOEPXTBHFOU NBD04BHFOU NBD04BHFOU (PPHMF$MPVE1MBUGPSN

    ։ൃऀ ࣾ಺ωοτϫʔΫ ࣾ಺ωοτϫʔΫ )5514 +/-1 1FSTJTUFOU%JTL ੒Ռ෺
  40. #denatechcon   +FOLJOTNBTUFS 8JOEPXTBHFOU 8JOEPXTBHFOU NBD04BHFOU NBD04BHFOU (PPHMF$MPVE1MBUGPSN ։ൃऀ

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

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

    ࣾ಺ωοτϫʔΫ ࣾ಺ωοτϫʔΫ )5514 +/-1 1FSTJTUFOU%JTL ੒Ռ෺ 04Ξοϓσʔτத ߏஙͨ͠+FOLJOTΫϥελͷߏ੒ ϩʔϦϯάΞοϓσʔτ͕Մೳ ੾அ
  43. #denatechcon   ෳ਺ͷBHFOUΛಉ͡ঢ়ଶʹอͭඞཁ͕͋ΔͨΊɺ
 NBD048JOEPXT޲͚ʹ"OTJCMF1MBZCPPLΛ༻ҙɻ 9DPEF΍6OJUZͳͲͷ։ൃ؀ڥΛࣗಈతʹߏஙͰ͖Δɻ ෳ਺ͷBHFOUͷߏ੒؅ཧ  อकίετͷ؍఺͔Βɺຊདྷ͸ίϯςφٕज़ͳͲʹΑΔ*NNVUBCMF
 *OGSBTUSVDUVSFΛ໨ࢦ͔ͨͬͨ͠ɻͨͩɺNBD04ΛήετʹͰ͖Δ


    ίϯςφٕज़ͷ"OLB͕ݕূ్தͰؒʹ߹Θͣɺࠓ͸༏ઌ౓ͷ໰୊Ͱະಋೖɻ
  44. #denatechcon   ͜ͷ1MBZCPPLࣗମͷϦϑΝΫλΛ༰қʹ͢ΔͨΊɺ
 04͝ͱʹ7BHSBOU#PYʢԾ૝ΠϝʔδʣΛ४උͯ͠ ݕূͷαΠΫϧΛ؆୯ʹճͤΔΑ͏ʹͨ͠ɻ "OTJCMF1MBZCPPLͷݕূ Ծ૝؀ڥ Ծ૝؀ڥ Ծ૝؀ڥ

    "OTJCMF1MBZCPPLͷ
 ॳճద༻Λࢼݧ WBHSBOUVQͰ
 Ծ૝؀ڥΛ࡞੒ ࠶ద༻Ͱႈ౳ੑΛࢼݧ WBHSBOUEFTUSPZͰ
 Ծ૝؀ڥΛഁغ
  45. #denatechcon   ͜ͷݕূαΠΫϧΛָʹ͢ΔͨΊɺ5FTU,JUDIFO΋
 ར༻Ͱ͖ΔΑ͏ʹ͍ͯ͠Δɻͨͩ͠ɺͭͳ͗෦෼ͷ
 σόοά͕໘౗ͳͨΊɺϓϥάΠϯ։ൃΛݕ౼தɻ 5FTU,JUDIFOʹΑΔݕূͷ༰қԽ Ծ૝؀ڥ Ծ૝؀ڥ Ծ૝؀ڥ

    LJUDIFODPOWFSHF
 ʢॳճద༻ͷ֬ೝʣ LJUDIFODSFBUF
 ʢԾ૝؀ڥͷ࡞੒ʣ LJUDIFODPOWFSHF
 ʢႈ౳ੑͷ֬ೝʣ LJUDIFOEFTUSPZ
 ʢԾ૝؀ڥͷഁغʣ
  46. #denatechcon   +FOLJOTBHFOUͷ௥Ճ͕௿ίετͰࡁΉΑ͏ʹͳΓɺ
 μ΢ϯλΠϜͷൃੜΛݮΒ͍ͤͯΔɻ ͨͩ͠ɺσΟεΫ༰ྔෆ଍໰୊͸ผͷ৔ॴͰ໰୊͕
 ݦࡏԽ͍ͯ͠ΔɻNBTUFSʹอଘ͞ΕΔ੒Ռ෺Ͱ͸ͳ͘ɺ BHFOU্ʹଘࡏ͢Δதؒੜ੒෺͕BHFOUͷσΟεΫΛ
 ѹഭ͢Δ໰୊͕ൃੜ͍ͯͯ͠ରԠΛݕ౼͍ͯ͠Δɻ ੒Ռͱ՝୊

  47. #denatechcon   ݱࡏͷ+FOLJOTͷ࠷େͷ՝୊͸ɺIΛ௒͑Δ௕େͳ
 Ϗϧυ࣌ؒͷ୹ॖʹҠ͍ͬͯͯɺDDBDIFͳͲΛݕূதɻ ·ͨɺ+FOLJOTNBTUFSଆͷΞοϓσʔτͰ͸·ͩ
 μ΢ϯλΠϜ͕ൃੜͯ͠͠·͏͕ɺ͜ΕΛ๷͙ͨΊʹ
 #MVF(SFFO%FQMPZNFOUͷखॱΛཱ͍֬ͨ͠ɻ ࠓޙͷల๬

  48. #denatechcon   #MVF(SFFO%FQMPZNFOUͷΠϝʔδਤ ՔಇதͷNBTUFS 8JOEPXTBHFOU 8JOEPXTBHFOU NBD04BHFOU NBD04BHFOU (PPHMF$MPVE1MBUGPSN

    ։ൃऀ ࣾ಺ωοτϫʔΫ ࣾ಺ωοτϫʔΫ )5514 +/-1 %JTLͷίϐʔ ੒Ռ෺ ݕূதͷNBTUFS ӡ༻ऀ
  49. #denatechcon σόοάΛॿ͚Δ
 Ϟδϡʔϧͷ։ൃ   ൒೥લͷऔΓ૊Έ ൃ ද Ͱ ͸

    ׂ Ѫ
  50. #denatechcon   ςελʔʹΑΔಈ࡞ݕূ࣌ʹɺ։ൃ༻ͷσόοάϩά͕
 ඞཁʹͳΔ͕ɺςελʔ͕खಈͰΞοϓϩʔυ͢Δͷ͕
 खؒͩͬͨɻ·ͨɺ໰୊͕ى͖͔ͯΒϩάΛఏग़͢Δ
 ϑϩʔͩͬͨͨΊɺજࡏతͳ໰୊ͷൃݟ͕೉͍͠ɻ ݱ৔ͷ՝୊ ղܾํ๏ ϦϞʔταʔόʔ΁ϩάΛूੵ͢ΔϥΠϒϥϦΛ։ൃɻ

    ൃ ද Ͱ ͸ ׂ Ѫ
  51. #denatechcon   طଘͷ$ ͷίʔυϕʔεʹϦϞʔτϩάػೳΛ
 ௿ίετͰಋೖ͔ͨͬͨͨ͠Ίɻ ط੒ͷαʔϏε΋ݕ౼͕ͨ͠ɺϚϧνϓϥοτϑΥʔϜͷ ରԠঢ়گ͕ෆಁ໌ͩͬͨΓɺ୺຤ͷҰ࿈ͷϩάΛ࣌ܥྻͰ
 ฒ΂ͯ؍࡯Ͱ͖ͳ͍ɺϩάͷ౎౓ૹ৴ͩͱੑೳཁٻΛ
 ຬͨͤͳ͍ͳͲͷϛεϚον͕͋ͬͨɻ

    ط੒αʔϏεΛબ͹ͳ͔ͬͨཧ༝ ൃ ද Ͱ ͸ ׂ Ѫ
  52. #denatechcon Ճ͑ͯɺಠ࣮ࣗ૷͸ͦ͜·Ͱ
 ۤ࿑͠ͳ͍ͱࢥ͍ͬͯͨʜ   ൃ ද Ͱ ͸ ׂ

    Ѫ
  53. #denatechcon ͳ͓ɺ࣮૷͸ͦ͜·Ͱ
 ۤ࿑͠ͳ͍ͱࢥ͍ͬͯͨʜ   େ͖ͳצҧ͍ͩͬͨʂ ൃ ද Ͱ ͸

    ׂ Ѫ
  54. #denatechcon   8JOEPXT"OESPJEJ04NBD04ͷ͢΂ͯͰϑΝΠϧͷ
 ಡΈॻ͖ͱ௨৴ΛͰ͖ΔΑ͏ʹ࣮૷͠ɺ͜ΕΒͷ
 Ϗϧυ؀ڥΛߏங͢Δͷ͸૝ఆҎ্ʹෳࡶͩͬͨɻ ͨͱ͑͹ɺίϯύΠϥ͸গͳ͘ͱ΋.47$ͱ$MBOHΛ
 ҙࣝ͢Δඞཁ͕͋Γɺ$MBOHͰ΋"OESPJEͱJ04Ͱ
 ϏϧυςετͷίϚϯυ΍σόοάํ๏͕͔ͳΓҧ͏ɻ ͜ͷΑ͏ʹ޿͍஌ࣝΛ೺Ѳ͍ͯ͠ͳ͍ͱ࣮૷͕Ͱ͖ͳ͍ɻ

    ૝૾Ͱ͖͍ͯͳ͔࣮ͬͨ૷ͷ೉͠͞ ൃ ද Ͱ ͸ ׂ Ѫ
  55. #denatechcon   Ճ͑ͯɺ֤ϓϥοτϑΥʔϜ্Ͱͷݕূج൫ͷཱ֬΋
 $*ߏங͔Βख୳ΓͷελʔτͰɺ͜ΕΒ͕੔͏ࠒʹ͸
 ౰ॳͷݟੵ΋ΓҎ্ͷ͕࣌ؒܦաͯ͠͠·͍ͬͯͨʜ ݕূ؀ڥߏஙͷ೉͠͞ ൃ ද Ͱ

    ͸ ׂ Ѫ
  56. #denatechcon   ։ൃ͸୹ظؒͰ׬ྃ͢Δͱ༧૝͍ͯͨ͠ͷͰɺ
 ࠓճ͸ݸਓϓϨʔͰૉૣ͘׬੒ͤ͞ɺ͋ͱͰ
 υΩϡϝϯτΛॻ͘ͷ͕ϕετͱࢥ͍ͬͯͨɻ ࣮ࡍʹ͸୲౰ऀͰ͋Δࣗ෼͕ର֎ൃදͰ
 ๩ࡴ͞Ε్ͯதͰਐߦ͕ࢭ·ͬͯ͠·ͬͨɻ ଐਓੑͷ੍ޚͷࣦഊ ൃ

    ද Ͱ ͸ ׂ Ѫ
  57. #denatechcon   Ұ෦ͷ04޲͚ͷίʔυϕʔεͱͷ݁߹ࢼݧ͸
 ׬ྃͰ͖͍͕ͯͨɺ͜ͷ··ͷϖʔεͰ͸
 ϦϞʔτϩά͕༗༻ͳ࣌ظΑΓ׬੒͕஗ΕΔ
 ͜ͱ͔Β։ൃΛதஅɻ ࢒೦ͳ݁Ռͱͳ͕ͬͨɺࣦഊ͔ΒֶΜͩɻ ੒Ռ ൃ

    ද Ͱ ͸ ׂ Ѫ
  58. #denatechcon ৼΓฦΓ   ൒೥લͷऔΓ૊Έ

  59. #denatechcon   w Ձ஋Λಧ͚ΔͨΊʹݱ৔ͷ՝୊ͷநग़ͱ
 ༏ઌॱҐ͚͔ͮΒ࢝Ίɺ੒ޭ΋ࣦഊ΋ͨ͠ w ࠷ऴ඼࣭ΛߴΊΔՁ஋͋Δςετͱͯ͠
 ඳըܥͷϦάϨογϣϯݕ஌ج൫Λߏங w

    ςετͷͭΒ͞Λͳͨ͘͢Ίʹ
 μ΢ϯλΠϜͷ୹͍+FOLJOTΫϥελΛߏங w ݡ͍ςετͷͨΊʹϦϞʔτϩάΛ։ൃʢஅ೦ʣ
  60. #denatechcon ݱࡏͷऔΓ૊Έ   ୈষ

  61. #denatechcon എܠ   ݱࡏͷऔΓ૊Έ

  62. #denatechcon   ૊৫ͷνʔϜ࠶ฤͰ্൒ظͷऔΓ૊Έ͔Β཭ΕΔ͜ͱʹɻ
 ͨͩɺ཭Ε͔ͯΒৼΓฦΔͱͭͷֶͼ͕͋ͬͨɿ w طʹશମతͳઃܭ͕ݻ·ͬͯ͠·͍ͬͯΔஈ֊͔Β
 ࢀՃͯ͠΋ɺඅ༻ରޮՌͷߴ͍ςετͷಋೖ͸೉͍͠ w ࣗ෼ࣗ਎ʹήʔϜΫϥΠΞϯτ։ൃͷ஌͕ࣝ଍Γ͓ͯΒͣɺ

    ରԠ͸৔౰ͨΓతʹͳΓຊ࣭తͳରࡦΛଧͯͳ͔ͬͨ
  63. #denatechcon   ͜ͷֶͼ͔ΒԼ൒ظͰ͸࣍ͷํ޲ੑΛఆΊͨɿ ઃܭஈ֊ͷॳظʹඞཁͳήʔϜΫϥΠΞϯτ։ൃͷ
 ஌ࣝΛ֫ಘ͠ɺܗࣜ஌ʹ·ͱΊͯଈԠଶ੎Λ੔͑Δɻ ܗࣜ஌ʹ·ͱΊΔͱɺ੡඼ʹͳΔ͔Ͳ͏͔ෆಁ໌ͳஈ֊ͷ
 ϓϩτλΠϓͨͪʹ΋ว͘ޮՌΛൃشͰ͖Δɻ ਤ΍ݴ༿Ͱදݱ͞Εͨઆ໌ͷ͜ͱɻٯ͸৬ਓͷצͷΑ͏ͳ҉໧஌ɻ

  64. #denatechcon औΓ૊Έͷํ਑   ݱࡏͷऔΓ૊Έ

  65. #denatechcon   ܗࣜ஌ʹ·ͱΊΔ࡞ۀͷੑ࣭͸3%ʹۙ͘ͳΔͨΊɺ
 ผͷ3%ςʔϚ΋͋Θ໊ͤͯͰऔΓ૊Ή͜ͱʹɿ ήʔϜΫϥΠΞϯτྖҬͷઃܭͷֶशΛ݉Ͷͯɺ
 ޮՌతͳઃܭͱ୯ମςετͷܗࣜ஌Խ ୯ମςετΛ௥͍͔͚Δ͏ͪʹ໌Β͔ʹͳͬͨɺ
 ήʔϜ࢓༷ॻͷܽؕ໰୊ͷରॲͷܗࣜ஌Խ όάमਖ਼ͷࠩ෼͔ΒϦεΫՕॴΛ෼ੳͯ͠ɺ௿ϦεΫ࣌

    ʹ2"࣌ͷςετέʔεΛ࡟ݮ͢Δج൫ͷ։ൃʢׂѪʣ   
  66. #denatechcon   ܗࣜ஌ʹ·ͱΊΔ࡞ۀͷੑ࣭͸3%ʹۙ͘ͳΔͨΊɺ
 ผͷ3%ςʔϚ΋͋ΘͤͯऔΓ૊Ή͜ͱʹɿ ήʔϜΫϥΠΞϯτྖҬͷઃܭͷֶशΛ݉Ͷͯɺ
 ޮՌతͳઃܭͱ୯ମςετͷܗࣜ஌Խ ୯ମςετΛ௥͍͔͚Δ͏ͪʹ໌Β͔ʹͳͬͨɺ
 ήʔϜ࢓༷ॻͷܽؕ໰୊ͷରॲͷܗࣜ஌Խ όάमਖ਼ͷࠩ෼͔ΒϦεΫՕॴΛ෼ੳͯ͠ɺ௿ϦεΫ࣌

    ʹ2"࣌ͷςετέʔεΛ࡟ݮ͢Δج൫ͷ։ൃʢׂѪʣ    ·ͣ͸୯ମςετͷऔΓ૊Έ͔Β঺հ
  67. #denatechcon ήʔϜΫϥΠΞϯτ෼໺ͷ
 ୯ମςετͷ໛ࡧ   ݱࡏͷऔΓ૊Έ

  68. #denatechcon   Ұൠʹޮ཰͕͍͍ͱ͍ΘΕΔಈ࡞֬ೝํ๏Ͱ͋Δ
 ʮ୯ମςετʯΛήʔϜΫϥΠΞϯτ։ൃͰࢼ͍ͨ͠ɻ લ৬Ͱ୯ମςετΛ࢖ͬͯ։ൃ଎౓Λେ͖͘޲্ͤͨ͞
 ܦݧ͕͋Γɺ͏·͘ϑΟοτ͢Ε͹։ൃ଎౓Λ্͛ΒΕΔ
 ͜ͱ͕Θ͔͍ͬͯΔʢϑΟοτ͢Δ͔Ͳ͏͔͸ޙड़ʣɻ Ϟνϕʔγϣϯ &&ςετ

    ݁߹ςετ ୯ମςετ ݁߹όάΛൃݟͰ͖Δ ݁߹όάΛݟམͱ͢ ϑΟʔυόοΫ͕஗͍ ϑΟʔυόοΫ͕଎͍ ݁߹όάΛݟ͚͍ͭͨ
 ͱ͖ʹ͚ͩ࢖͏ ୯ମςετͰ׬݁Ͱ͖Δ
 ͳΒͦͷํ͕Α͍
  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)); } } ͋·Γݱ࣮తͰͳ͍ྫ͕ͩ
 ͭͷϕΫτϧ   ͱ
   ͷڑ཭͕˽ʹͳΔ
 ͜ͱΛίʔυͰ֬ೝ͍ͯ͠Δɻ ॏཁͳͷ͸ɺ͜ͷछͷ֬ೝΛ
 ίʔυ͔ΒͰ͖Δ͜ͱɻ
  70. #denatechcon   6OJUZʹ͓͚Δςετͷ࣮ߦํ๏ 8JOEPX(FOFSBM5FTU3VOOFSͰ
 ςετ༻ͷը໘Λ։͘ɻ

  71. #denatechcon   6OJUZʹ͓͚Δςετͷ࣮ߦํ๏ ։͍ͨςετ༻ͷը໘ʹ͸ɺࠨͷΑ͏ʹઌ΄Ͳͷ
 ؔ਺TestDistance͕දࣔ͞Ε͍ͯΔɻ આ໌͸লུ͍ͯ͠Δ͕ɺ6OJUZͷςετʹ͸छྨ͕͋ͬͯɺ
 &EJU.PEFͱ1MBZ.PEF͕͋Δɻࠓճ࢖͍ͬͯΔͷ͸
 &EJU.PEFͷํͰɺಈ࡞͸଎੍͍͕ݶ͕͋Δɻ ৄ͍͠ηοτΞοϓํ๏͸5FTU3VOOFSͷެࣜϚχϡΞϧΛ


    ಡΉͱΑ͍ɻ
  72. #denatechcon   6OJUZʹ͓͚Δςετͷ࣮ߦํ๏ ࠨ্ʹ͋Δ3VO"MMΛ࣮ߦ͢Δͱɺઌ΄Ͳͷ
 TestDistance͕࣮ߦ͞ΕΔɻ

  73. #denatechcon   6OJUZʹ͓͚Δςετͷ࣮ߦํ๏   ͱ   ͷ݁Ռ͸࣮ࡍʹ˽ͳͷͰɺ


    ಈ࡞֬ೝ͸੒ޭ͢Δɻ ੒ޭ͢ΔͱɺࠨͷΑ͏ʹ྘ͷνΣοΫϚʔΫ͕ͭ͘ɻ
  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); } ಉ͡Α͏ʹ   ͱ   ͷ
 ڑ཭Λܭࢉ͍ͯ͠Δɻ
 ͨͩɺࣦഊ͢Δέʔε΋
 ͔֬ΊΔͨΊʹɺ͋͑ͯ
 ؒҧͬͨ݁Ռͱൺֱ͢Δ ਖ਼͘͠͸˽
  75. #denatechcon   6OJUZʹ͓͚Δςετͷ࣮ߦํ๏ ௥Ճͨ͠ಈ࡞֬ೝͷίʔυ͸ؒҧ͍ͬͯΔͷͰɺ
 ࠨͷΑ͏ʹ੺͍ࣦഊϚʔΫ͕ͭ͘ɻ

  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Λ࢖͍ͬͯΔ৔߹͸ɺ
 ࣮ߦϑΝΠϧͷύε͕ҟͳΔͷͰ஫ҙɻ
  77. #denatechcon   ͔͜͜Β͸໛ࡧதͷ࿩ʹͳΓ·͢ ݱ ࡏ 
 ໛ ࡧ த

    ໛ࡧதͳͨΊɺਖ਼͘͠ͳ͍ચ࿅͞Ε͍ͯͳ͍෦෼΋ؚ·Ε·͢ɻ
 ήʔϜ෼໺ͷํ͸౰ͨΓલͱࢥ͏෦෼΋͋Δ͔΋͠Ε·ͤΜɻ
  78. #denatechcon   ୯ମςετ͕ϑΟοτ͢Δ͔Ͳ͏͔ͷٞ࿦ ͜ΕΛߟ͑Δʹ͸ɺήʔϜͷίΞ෦෼ʢΠϯήʔϜʣͱ
 ϝχϡʔը໘ͳͲʢΞ΢τήʔϜʣͰେ͖͘ࣄ৘͕
 ҟͳΔͷͰ෼͚ͯߟ͑ͨํ͕Α͍ɻ Ξ΢τήʔϜ͸୯ମςετΛ͠΍͍͢ͱ͍ΘΕ͍ͯΔɻ ςετ͠΍͍͢ઃܭύλʔϯΛ࡞Ε͹ɺ։ൃ଎౓Λ
 ߴΊΒΕΔՄೳੑ͕͋Δɻ

    ݱ ࡏ 
 ໛ ࡧ த
  79. #denatechcon   Ξ΢τήʔϜͷ୯ମςετ͠΍͢͞ ݱ ࡏ 
 ໛ ࡧ த

    ͜͜Ͱ૝ఆ͍ͯ͠Δͷ͸ʮ͋Δ࣌ؒ΍Πϕϯτ഑৴࣌
 ͷΈಋઢ͕༗ޮʹͳΔʯͱ͍ͬͨϩδοΫͷݕূɻ ͜ͷछͷϩδοΫ͸ύλʔϯ਺͕ଟ͍͕ɺ
 ୯ମςετ͸؆୯ͳ͜ͱ͕ଟ͍ɻ ͳ͓ɺ୯ମςετʹൺ΂ͯखಈϓϨΠͰͷ֬ೝ͕
 ໘౗ʢ࣌ࠁґଘɺ͋Γ͑Δύλʔϯ͕ଟ͍ʣͳͨΊɺ
 ಛʹ୯ମςετͷޮՌͷߴ͍෦෼ͩͱߟ͍͑ͯΔɻ
  80. #denatechcon   ͜Εʹର͠ɺΠϯήʔϜͷํ͸୯ମςετͮ͠Β͍ɺ
 ͋Δ͍͸ͯ͠΋ҙຯ͕ͳ͍ͱ͍ΘΕ͍ͯΔɻ ࣮ࡍͷίʔυΛ؆୯ʹ෼ੳͨ͠ͱ͜Ζɺͭͷ೉͕͠͞
 ൑໌͍ͯ͠Δɿ  ୯ମςετͰ͸ݟ͚ͭΒΕͳ͍݁߹όά͕ଟ͍ 

    ਓؒͷײੑͰ͔͠൑அͰ͖ͳ͍Α͏ͳݕূ͕ଟ͍ ݱ ࡏ 
 ໛ ࡧ த ΠϯήʔϜͷ୯ମςετ͠΍͢͞
  81. #denatechcon   ΠϯήʔϜͷ೉݁͠͞߹όάͷ໰୊ ݁߹όάͱ͸ɺෳ਺ͷΦϒδΣΫτͷ૊Έ߹ΘͤͰൃੜ͢Δ όάͷ͜ͱɻྫ͑͹ɺ਺ेݸͷΦϒδΣΫτΛ഑ஔ͠ͳ͍ͱ
 ࠶ݱ͠ͳ͍όάͳͲɻ ͜ΕΛ୯ମςετͷΑ͏ʹࣗಈͰݟ͚ͭΑ͏ͱ͢Δͱɿ w ඞཁͳঢ়ଶΛ࠶ݱ͢ΔͨΊͷେྔʹίʔυ͕ඞཁ

    w ແؔ܎ͳมߋͰյΕ΍͘͢อकίετ͕ߴ͍ ݱ ࡏ 
 ໛ ࡧ த
  82. #denatechcon   ΠϯήʔϜͷ೉͠͞ײੑͷ໰୊ ୯ମςετͷΑ͏ͳࣗಈతͳςετͰ͸ɺײੑͰ͔͠
 Θ͔Βͳ͍൑அΛͰ͖ͳ͍ɻ ͨͱ͑͹ɺʮεϜʔζʹಈ͘ʯͱ͍͏ײੑϕʔεͷ൑அ͸
 ͦͷ··Ͱ͸ࣗಈతͳςετΛͰ͖ͳ͍ɻ ͦ͜Ͱɺ͜ΕΛʮ'14͕ᮢ஋ΑΓখ͘͞ͳΒͳ͍ʯ΍
 ʮϝϞϦΛແବʹফඅ͠ͳ͍ʯͳͲͷɺίʔυ͔Β


    ൑அͰ͖ΔΑ͏ͳࢦඪʹམͱ͜͠Ή޻෉͕ඞཁʹͳΔɻ ݱ ࡏ 
 ໛ ࡧ த
  83. #denatechcon   ΠϯήʔϜͷ೉͠͞·ͱΊ ୯ମςετͰ͸ݟ͚ͭΒΕͳ͍݁߹όά͕ଟ͍ɻ ݁߹όάΛݟ͚ͭΒΕΔΑ͏ʹͯ͠΋໰୊͕͋Δɿ w ঢ়گ࠶ݱͷίʔυ͕େྔʹඞཁʹͳΔ w ແؔ܎ͳมߋͰյΕ΍͍͢

    ਓؒͷײੑͰ͔͠൑அͰ͖ͳ͍Α͏ͳݕূ͕ଟ͍ɻ ίʔυͰ൑அͰ͖Δࢦඪʹམͱ͢ඞཁ͕͋Δɻ ݱ ࡏ 
 ໛ ࡧ த  
  84. #denatechcon   ΍͍ͬͯΔ͜ͱ·ͱΊ Ξ΢τήʔϜ ୯ମςετ͠΍͍͢ઃܭύλʔϯͷ໛ࡧͱܗࣜԽɻ ݱ ࡏ 
 ໛

    ࡧ த ΠϯήʔϜ ݁߹όάͷςετΛॻ͖΍͘͢͢ΔͨΊͷ޻෉
 ʢঢ়ଶ࠶ݱͷ؆қԽͱมߋ΁ͷݎ࿚Խʣͱɺ
 ίʔυͰදݱ͠΍͍͢ײੑͷࢦඪͷ໛ࡧͱܗࣜԽɻ
  85. #denatechcon   ۩ମతͳίʔυΛ঺հͰ͖Δ
 Α͏ʹӶҙऔΓ૊Έதʜʂ ݱ ࡏ 
 ໛ ࡧ

  86. #denatechcon   ܗࣜ஌ʹ·ͱΊΔ࡞ۀͷੑ࣭͸3%ʹۙ͘ͳΔͨΊɺ
 ผͷ3%ςʔϚ΋͋ΘͤͯऔΓ૊Ή͜ͱʹɿ ήʔϜΫϥΠΞϯτྖҬͷઃܭͷֶशΛ݉Ͷͯɺ
 ޮՌతͳઃܭͱ୯ମςετͷܗࣜ஌Խ ୯ମςετΛ௥͍͔͚Δ͏ͪʹ໌Β͔ʹͳͬͨɺ
 ήʔϜ࢓༷ॻͷܽؕ໰୊ͷରॲͷܗࣜ஌Խ όάमਖ਼ͷࠩ෼͔ΒϦεΫՕॴΛ෼ੳͯ͠ɺ௿ϦεΫ࣌

    ʹ2"࣌ͷςετέʔεΛ࡟ݮ͢Δج൫ͷ։ൃʢׂѪʣ    ࣍͸͜Ε·Ͱͷ୯ମςετͱ͸ผͷऔΓ૊ΈΛ঺հ
  87. #denatechcon ήʔϜ෼໺ʹ͓͚Δ
 ܗࣜख๏ͷ໛ࡧ   ݱࡏͷऔΓ૊Έ

  88. #denatechcon   ӡ༻λΠτϧͷࢧ഑తͳ໰୊Ͱ͋ΔɺήʔϜ࢓༷ॻͷ
 ໰୊ʢߟྀ࿙Εهࡌ࿙Εໃ६౳ʣʹ͍ͭͯղܾΛ
 ໛ࡧͯ͠΄͍͠ͱ͍͏ཁ๬͕͋ͬͨͷ͕͖͔͚ͬɻ ͦ͜Ͱɺ໌֬ͰݫີͳҙຯΛ΋ͭݴޠΛ͔ͭͬͯ
 ࢓༷Λهड़͢Δܗࣜख๏ͷద༻ͱ࣮༻ੑௐࠪΛ
 ͢Δ͜ͱʹͳͬͨɻ Ϟνϕʔγϣϯ

  89. #denatechcon   ࢓༷ΛݫີͰ໌֬ʹهड़͢Δख๏΍ɺ͜ΕͰهड़͞Εͨ
 ઃܭͷੑ࣭Λػցతʹݕূ͢Δख๏ͷ૯শɻ ͨͱ͑͹ɺ1SPNFMBͱ͍͏ݴޠͰฒྻಈ࡞͢ΔγεςϜͷ
 ࢓༷Λهड़͢ΔͱɺσουϩοΫ΍ϥΠϒϩοΫΛ
 ى͜͞ͳ͍ͱ͍ͬͨੑ࣭ͳͲΛอূͰ͖Δɻ ܗࣜख๏ͱ͸

  90. #denatechcon   ͔͜͜Β͸໛ࡧதͷ࿩ʹͳΓ·͢ ݱ ࡏ 
 ໛ ࡧ த

    ܗࣜख๏ͷΞϓϩʔν΍ίʔυʹΠέͯͳ͍෦෼͕
 ͋Δ͔΋͠Ε·ͤΜ͕ɺ໛ࡧதͳͷͰ͝༰͍ࣻͩ͘͞
  91. #denatechcon   औΓ૊ΈͷΠϝʔδͱͯ͠ɺήʔϜ࢓༷ͷ
 ߟྀ࿙ΕΛܗࣜख๏Ͱͳ͘͢ྫΛ঺հ ݱ ࡏ 
 ໛ ࡧ

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

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

    ݱ ࡏ 
 ໛ ࡧ த ΋͠ɺҰܸͰ)1͕ʹ͞Εͯ͠·ͬͨΒɺ
 ม਎͢ΔͷͩΖ͏͔ɺ͠ͳ͍ͷͩΖ͏͔ʜʁ ͜Ε͕ߟྀ͞Ε͍ͯͳ͍ͷͰɺม਎͔ͯ͠Β
 ࢮ๢͢Δͷ൱͔͕໌֬Ͱ͸ͳ͍
  94. #denatechcon   Ϙεͷߦಈύλʔϯͷ࢓༷ɿ w )1͕ҎԼͳΒม਎ w )1͕ʹͳͬͨΒࢮ๢ ͜ͷ࢓༷ʹ͸ߟྀ࿙Εͷ໰୊͕͋Δɻ ήʔϜʹ͓͚Δ࢓༷ͷ໰୊ͷྫ

    ݱ ࡏ 
 ໛ ࡧ த ͜ͷ࣌఺Ͱاըऀ͸ɺϘε͸ม਎͔ͯ͠Β
 ࢮ๢͢Δ͜ͱΛظ଴͍ͯ͠Δͱ͢Δ ͨͩɺ࢓༷ͷᐆດ͞ʹ·ͩؾ͚͓ͮͯΒͣ
 ߟྀ͔Β࿙Ε͍ͯΔঢ়گΛԾఆ͢Δ
  95. #denatechcon   ܗࣜख๏ͷ׆༻Πϝʔδɿ 1SPNFMBͰ࢓༷ΛৄࡉԽ͢Δ ߟྀ࿙ΕΛݟ͚ͭΔ ݱ ࡏ 
 ໛

    ࡧ த  
  96. #denatechcon   ܗࣜख๏ͷ׆༻Πϝʔδɿ 1SPNFMBͰ࢓༷ΛৄࡉԽ͢Δ ߟྀ࿙ΕΛݟ͚ͭΔ ݱ ࡏ 
 ໛

    ࡧ த   ·ͣ͸࢓༷ͷৄࡉԽ͔Β
  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 } ݱ ࡏ 
 ໛ ࡧ த
  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 } ݱ ࡏ 
 ໛ ࡧ த Ϙεͷঢ়ଶͷఆٛɻ௨ৗͱม਎ޙͷ͕ͭ͋Δ
  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ͷఆٛɻϑϧɺ൒෼Ҏ্ɺ൒෼ҎԼɺࢮ๢ͷ͕ͭ͋Δ
  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จͷҙຯ͸ී௨ͷݴޠͱ͸ҟͳΓɺ
 ׅހ಺ͷ৚݅Λຬͨ͢ʮ͍ͣΕ͔ʯͷจ͕࣮ߦ͞ΕΔͱ͍͏͜ͱɻͲΕ͕
 ࣮ߦ͞ΕΔ͔͸ඇܾఆతʹͳ͍ͬͯΔʢμϝʔδྔ͕೚ҙͳ͜ͱΛදݱʣ
  101. #denatechcon   ݱ ࡏ 
 ໛ ࡧ த active

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

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

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

    Normal mtype:bossHp bossHp = Full do :: Attack(bossHp) od assert false } // TODO: ͜͜ʹϘεͷࢮ๢/ม਎൑ఆΛهड़͢Δɻ // ͦΕͧΕͷ൑ఆͷॱংͰ 2 ௨Γͷॻ͖ํ͕͋Δɻ ߈ܸΛ܁Γฦ͢ϧʔϓʢ50%0෦෼ͰCSFBL͞ΕΔ·Ͱ܁Γฦ͢ʣ ݱ ࡏ 
 ໛ ࡧ த
  105. #denatechcon if :: (bossHp == Dead) -> break :: else

    -> skip fi   ݱ ࡏ 
 ໛ ࡧ த Ϙεͷ)1͕ %FBEঢ়ଶʣͳΒ߈ܸΛऴྃ͢Δ൑ఆ ࢮ๢൑ఆ ม਎൑ఆ if :: (bossHp <= LessThanHalf) -> bossMode = Transformed :: else -> skip fi Ϙεͷ)1͕ͳΒม਎͢Δ൑ఆ
  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 ม਎൑ఆΛઌʹ͢Δ৔߹ɿ ࢮ๢൑ఆ ม਎൑ఆ ࢮ๢൑ఆ ม਎൑ఆ
  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 ม਎൑ఆΛઌʹ͢Δ৔߹ɿ ࢮ๢൑ఆ ม਎൑ఆ ࢮ๢൑ఆ ม਎൑ఆ ͪ͜ΒΛࢼ͢
  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෦෼Λࢮ๢൑ఆɺม਎൑ఆͷॱͰهड़
  109. #denatechcon   ܗࣜख๏ͷ׆༻Πϝʔδɿ 1SPNFMBͰ࢓༷ΛৄࡉԽ͢Δ ߟྀ࿙ΕΛݟ͚ͭΔ ݱ ࡏ 
 ໛

    ࡧ த   ৄࡉԽʹΑΔߟྀ࿙Εൃݟࢧԉͷྫ
  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 } গ͠ճΓ͘Ͳ͍͕ɺৗʹΤϥʔͰऴྃͤ͞Δ͜ͱͰϘεͷঢ়ଶ͕
 ͲͷΑ͏ʹҠΓมΘΔ͔ΛπʔϧͰྻڍͰ͖Δ ݱ ࡏ 
 ໛ ࡧ த
  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ʹҾ͔͔ͬͬͨܦ࿏͕ͭ͋ΔͷͰɺঢ়ଶભҠ͸ܦ࿏͋ΔͱΘ͔Δ
  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ͷޙͷ਺ࣈ͕ܦ࿏ͷ൪߸Λҙຯ͍ͯ͠Δ ݱ ࡏ 
 ໛ ࡧ த
  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 ͜ͷܦ࿏͕ͲͷΑ͏ͳঢ়ଶΛܦ༝͔ͨ͠ͷৄࡉɻӈଆ͸࣮ߦ͞Εͨίʔυ ݱ ࡏ 
 ໛ ࡧ த
  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 ࠷ऴతͳϘεͷঢ়ଶɻม਎ࡁΈ͔ͭࢮ๢͍ͯ͠Δ͜ͱ͕Θ͔Δ ݱ ࡏ 
 ໛ ࡧ த
  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 ॱʹ֬ೝ͍͖ͯ͠ɺ൪໨ͷܦ࿏Λ֬ೝ͢Δ ݱ ࡏ 
 ໛ ࡧ த
  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 ߟྀͰ͖͍ͯͳ͔ͬͨɺϘε͕ม਎͠ͳ͍··
 ࢮ๢͢Δܦ࿏Λൃݟʢܦ࿏΋ม਎͠ͳ͍ʣ ݱ ࡏ 
 ໛ ࡧ த
  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 ঢ়ଶભҠͷաఔ͔ΒݪҼΛ୳ΔͱɺϘεΛҰܸͰ
 ౗ͨ͠ͱ͜Ζߟྀ͍ͯ͠ͳ͍ঢ়ଶͳͬͨ͜ͱ͕Θ͔Δ ݱ ࡏ 
 ໛ ࡧ த
  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 } ݱ ࡏ 
 ໛ ࡧ த ઌ΄ͲܗࣜԽͨ͠࢓༷Ͱ͸ɺϘεͷม਎൑ఆͷલʹ
 Ϙεͷࢮ๢Λ൑ఆ͢Δ͜ͱʹ͍ͯͨͨ͠ΊɺҰܸͰ
 Ϙε͕౗͞Εͨ৔߹ʹະม਎ʹͳΔ
  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 } ݱ ࡏ 
 ໛ ࡧ த ม਎൑ఆΛࢮ๢൑ఆͷલʹҠಈ͢Δͱߟྀ࿙ΕΛͳͤ͘Δ ͜͜Ͱঢ়ଶͷྻڍΛ͢Δͱɺ͢΂ͯม਎ࡁΈͰࢮ๢͢Δ͜ͱ͕
 Θ͔ΔͷͰɺߟྀ࿙ΕͷղܾΛ֬ೝͰ͖Δ
  120. #denatechcon   ͜ͷΑ͏ʹܗࣜख๏Λ࢖͏ͱɺ։ൃ΍
 ςετέʔε࡞੒ͷલʹ࢓༷ॻͷߟྀ࿙ΕΛ
 গͳ͘Ͱ͖ΔͨΊɺख໭Γ͕গͳ͘ͳΔɻ σϝϦοτ͸ɺ࢓༷ॻͷಡΈॻ͖ͷֶश͕
 ඞཁʹͳΔ͜ͱɻ·ͨอकίετ͕ࣗવݴޠͰ
 هड़͞Εͨ΋ͷͱൺ΂ͯͲ͏ͳΔ͔͸ఆ͔Ͱͳ͍ɻ ϝϦοτͱσϝϦοτ

    ݱ ࡏ 
 ໛ ࡧ த
  121. #denatechcon   ͜ͷΑ͏ͳܗࣜख๏ΛاըߟҊऀʹ࣮ࢪͯ͠
 ΋Β͏͜ͱ͸ݱ࣮తʹ೉͍͠ɻ ͦ͜ͰɺاըΛߟҊ͢Δஈ֊Ͱॻهϩʔϧ͕
 ٞ࿦தͷ࢓༷Λܗࣜख๏Ͱهड़͠ɺ
 ࣮ࡍͷ։ൃલʹݕূ͢Δͱ͍ͬͨݱ࣮తͳ
 ӡ༻ͷͨΊͷ޻෉Λߟ͍͑ͯΔɻ ֶशͷ໰୊ͷରԠҊ

    ݱ ࡏ 
 ໛ ࡧ த
  122. #denatechcon   ෦෼తʹܗࣜख๏Λ࢖͏͜ͱͰɺอकίετ͸
 ௐ੔Ͱ͖Δɻ Ͳͷ෦෼Λܗࣜख๏Ͱѻ͏ͱΑ͍͔͸ఆ͔Ͱ
 ͳ͍ͷͰɺ͜ͷޙʹ໌Β͔ʹ͍͖͍ͯͨ͠ɻ อकίετ΁ͷରԠҊ ݱ ࡏ

    
 ໛ ࡧ த
  123. #denatechcon   ΍͍ͬͯΔ͜ͱ·ͱΊ ݱ ࡏ 
 ໛ ࡧ த

    ܗࣜख๏ʹΑͬͯɺήʔϜ࢓༷ॻͷߟྀ࿙ΕͳͲΛ
 Ͳ͜·Ͱݕ஌Ͱ͖Δ͔Λ࣮ݧ͍ͯ͠Δɻܗࣜख๏ͷछྨ͸
 ଟ͍ͨΊɺ͞·͟·ͳख๏Λ࣮ݧ͢Δ༧ఆɻ ࠷ऴతʹ͸ɺܗࣜख๏Λ࢖͏ͱɺͲͷఔ౓ͷίετͰ
 Ͳͷఔ౓ख໭ΓΛ๷͛Δ͔ͱ͍͏අ༻ରޮՌΛݕূ͍ͨ͠ɻ
  124. #denatechcon   ӶҙऔΓ૊Έதʂ ݱ ࡏ 
 ໛ ࡧ த

  125. #denatechcon ·ͱΊ   ݱࡏͷऔΓ૊Έ

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

  127. #denatechcon ·ͱΊ   ୈষ

  128. #denatechcon   48&5͸ɺָ͘͠ɺݡ͘ɺՁ஋͋ΔςετͰ
 ։ൃϓϩηεΛΑ͍ͯ͘͘͠૊৫ ͜ͷϝϯόʔͱͯ͠ɺ൒೥લ͸ը૾ൺֱج൫ͷ
 ߏங΍+FOLJOTΫϥελߏஙͳͲʹऔΓ૊Ή ࠓ͸ήʔϜΫϥΠΞϯτʹ͓͚Δ୯ମςετٕज़ͷ
 ܗࣜ஌Խͱܗࣜख๏ͷ࣮ݧʹऔΓ૊Ή 

     
  129. #denatechcon

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

  131. #denatechcon ୯ମςετؔ࿈  

  132. #denatechcon   Ξ΢τήʔϜͱΠϯήʔϜͷࠩ ݱ ࡏ 
 ໛ ࡧ த

    w Ξ΢τήʔϜ͸ײੑʹΑΒͳ͍ݕূʹ͠΍͍͢ w ྫಋઢͷ༗ޮੑͷݕূ͸ײੑʹΑΒͳ͍ w Ξ΢τήʔϜ͸৚݅෼ذΛू໿͠΍͍͢ w ྫΠϕϯτ΍ΫΤετҰཡͷߜΓࠐΈΛ૝ఆ
  133. #denatechcon   ΠϯήʔϜͷςετ͠΍͢͞ʹ͍ͭͯ ݱ ࡏ 
 ໛ ࡧ த

    ଟ͘ͷήʔϜͰ͸ͭͷίϯϙʔωϯτʹϩδοΫΛ
 ڽूͮ͠Β͍͜ͱ͕ଟ͘ɺ୯ମͰςετͯ͠΋
 ҙຯͷͳ͍͜ͱ͕ଟ͍ɻ ྫͱͯ͠ɺ෺ཧγϛϡϨʔγϣϯΛؚΉήʔϜΛߟ͑Δɻ
  134. #denatechcon   ෺ཧγϛϡϨʔγϣϯΛؚΉήʔϜͷ໰୊ ݱ ࡏ 
 ໛ ࡧ த

    ࣮ࡍʹ6OJUZͰ͘͝୯७ͳ෺ཧγϛϡϨʔγϣϯ෇͖ͷήʔϜΛ ୯ମςετͨ͠ͱ͜Ζɺ࣍ͷ໰୊Λൃݟͨ͠ɻ ෺ཧγϛϡϨʔγϣϯͰ͸ɺ͋ΔΦϒδΣΫτͷҐஔ࠲ඪΛ
 ಡΈॻ͖͢Δίϯϙʔωϯτ͕ଟ͋͘Δɿ w িಥ൑ఆϩδοΫ w ྗֶܭࢉΤϯδϯ w ΦϒδΣΫτʹ෇ਵ͢Δॲཧʢೖྗૢ࡞΁ͷ൓ԠͳͲʣ
  135. #denatechcon   ݱ ࡏ 
 ໛ ࡧ த িಥ൑ఆϩδοΫͱྗֶܭࢉΤϯδϯ

    ήʔϜΤϯδϯ΁ͷઃఆʹऴ࢝͢Δʢ෼ذ΍ϧʔϓ͕ͳ͍ʣ
 ͨΊɺ୯ମςετͰݕূ͢ΔՁ஋͸ͳ͍ɻ ෇ਵॲཧ ୯७ͳ͜ͱ͕ଟ͍͏͑ʹɺ୯ମͰͷόάΑΓ݁߹Ͱͷ
 όάʢนൈ͚΍นΊΓࠐΈ͔Βͷਧ͖ඈͼͳͲʣͷํ͕
 ࢧ഑తͰɺ୯ମςετͷϝϦοτΑΓίετͷํ͕উΔɻ ෺ཧγϛϡϨʔγϣϯབྷΈͷ୯ମςετͷՁ஋
  136. #denatechcon ܗࣜख๏ؔ࿈  

  137. #denatechcon   ݱ ࡏ 
 ໛ ࡧ த 

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

    ͜͜Θ͔Βͳ͍ͷͰ͕͢
 Ͳ͏͍͏ҙຯͰ͢ʁ ઌिߟ͑ͯͨ΍͚ͭͩͲɺ
 ͲΜͳҙຯ͚ͩͬͨͬʜʁ ࢓༷ಡΜͩਓ ࢓༷هड़ऀ
  139. #denatechcon   ݱ ࡏ 
 ໛ ࡧ த ༨ܭͳίϛϡχέʔγϣϯ͕૿͑Δ

    ͜Εໃ६ͯ͠·ͤΜ͔ʁ Ͳ͜ͷ͜ͱͰ͠ΐ͏͔ʁ ࢓༷ಡΜͩਓ ࢓༷هड़ऀ ͜ͷ"ͱ#Ͱ͕͢ʜ
  140. #denatechcon   ݱ ࡏ 
 ໛ ࡧ த ࢓༷ͷख໭Γ͸ޙଓλεΫΛϒϩοΫ͢Δ

    اը ࣮૷ ϨϏϡʔ ςετ࡞੒ ख໭ΓରԠ ࢓༷͕ݻ·Δ·Ͱ࡞ۀͮ͠Β͍ اը ։ൃ 2" தஅ தஅ ࣮૷ ςετ࡞੒
  141. #denatechcon   ػցతͳঢ়ଶભҠͷྻڍ

  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ͩͬͨͱ͍͏ྺ࢙తܦҢ͕͋Δʣ ݱ ࡏ 
 ໛ ࡧ த
  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ܗࣜͰग़ྗͰ͖Δ ݱ ࡏ 
 ໛ ࡧ த
  144. #denatechcon   EPUܗࣜͷਤ͸(SBQIWJ[ͰඳըͰ͖Δ ભҠલͷঢ়ଶ 4 4 YYY ঢ়ଶભҠΛൃੜͤͨ͞ίʔυ ঢ়ଶ

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