$30 off During Our Annual Pro Sale. View Details »

実践 9 つのメモリリークどう見つける?/ How to detect 9 types of memory leaks?

Kuniwak
October 28, 2022

実践 9 つのメモリリークどう見つける?/ How to detect 9 types of memory leaks?

Kuniwak

October 28, 2022
Tweet

More Decks by Kuniwak

Other Decks in Programming

Transcript

  1. ࣮ફ ͭͷϝϞϦϦʔΫ 
 Ͳ͏ݟ͚ͭΔʁ J045FTU0OMJOF,VOJXBL

  2. ϝϞϦϦʔΫͱ͸ 2

  3. ϝϞϦϦʔΫͱ͸ɺ΋͏࢖༻͞Εͳ͍ 
 Ϧιʔε͕ϝϞϦʹ֬อ͞Εଓ͚Δ͜ͱ IUUQTFOXJLJQFEJBPSHXJLJ.FNPSZ@MFBLΛ๜༁ɾཁ໿ͨ͠΋ͷɻ೔ຊޠͷํ͸ 
 ͋·Γ͍͍આ໌Ͱ͸ͳ͔ͬͨʜ 3

  4. ϝϞϦϦʔΫ͕͋Δͱɺ࢖͑ΔϝϞϦ͕ 
 ঃʑʹݮ͍ͬͯ͘ ͢ΔͱϝϞϦϓϨογϟʔ͕֤ΞϓϦʹ 
 ͔͚ΒΕɺͦΕͰ΋ϝϞϦ͕଍Βͳ͍ͱ 
 ΞϓϦ͕KFUTBNʢւʹϙΠʣ͞ΕΔ ৄ͘͠͸ʮ*EFOUJGZJOHIJHINFNPSZVTFXJUIKFUTBNFWFOUSFQPSUTʯΛࢀরɻ 


    IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOYDPEFJEFOUJGZJOHIJHINFNPSZVTFXJUIKFUTBNFWFOUSFQPSUT 4
  5. Α͏͢ΔʹϝϞϦϦʔΫͷ͋ΔΞϓϦΛ 
 ௕࣌ؒ࢖͏ͱڧ੍ऴྃ͞ΕΔˡࠔΔ 5

  6. ϝϞϦϦʔΫ͸Կ͕ 
 ݪҼͰى͜Δͷ͔ 6

  7. ॥؀ࢀর 4XJGU͸ࢀরΧ΢ϯτํࣜͳͷͰɺ 
 ॥؀ࢀর͕͋Δͱ॥؀ࢀরύε্ͷ 
 ΦϒδΣΫτͷࢀরΧ΢ϯτ͕ʹ 
 ͳΒͣͥΜͿղ์͞Εͳ͍ 7

  8. ߪಡղআ๨Ε ΋͏Πϕϯτ͕͜ͳ͍ͷʹߪಡΛ 
 ଓ͚Δͱɺ॥؀ࢀরͰ͸ͳ͍͕ 
 ΋͏࢖ΘΕͳ͍Ϧιʔε͕ϝϞϦʹ 
 ࢒Γଓ͚ΔͷͰϝϞϦϦʔΫʹͳΔ 8

  9. ϝϞϦϦʔΫΛ 
 Ͳ͏ݟ͚ͭΔ͔ 9

  10. 10 ϝϞϦϦʔΫʹΑΔڧ੍ऴྃͷൃੜΛ஌Δ ϝϞϦϦʔΫ͕ൃੜ͍ͯ͠Δ৔ॴΛߜΓࠐΉ ϝϞϦϦʔΫͷݪҼΛಛఆ͢Δ

  11. 11 ϝϞϦϦʔΫ͕ൃੜ͍ͯ͠Δ৔ॴΛߜΓࠐΉ ϝϞϦϦʔΫͷݪҼΛಛఆ͢Δ ࠓ೔ͷൃද͸͜͜ ϝϞϦϦʔΫʹΑΔڧ੍ऴྃͷൃੜΛ஌Δ

  12. 9DPEFͷ%FCVH/BWJHBUPS 9DPEFͷ%FCVH.FNPSZ(SBQI *OTUSVNFOUTͷ-FBLT UBSVOPO9$5"TTFSU/P-FBL 12 1 2 3 4

  13. 9DPEFͷ%FCVH/BWJHBUPSͷϝϞϦάϥϑ ϝϞϦ࢖༻ྔΛݟΒΕΔ͕ 
 ஫ҙ͕ඞཁʢޙड़ʣ 13 1

  14. 9DPEFͷ%FCVH.FNPSZ(SBQI ͜ͷϘλϯΛԡ͢ͱग़Δ΍ͭ 14 2

  15. ΦϒδΣΫτͷࢀরάϥϑΛݟΒΕΔ 15 9DPEFͷ%FCVH.FNPSZ(SBQI 2

  16. ϝϞϦϦʔΫΛݕग़͢Δͱҹ͕ͭ͘ 16 9DPEFͷ%FCVH.FNPSZ(SBQI 2

  17. *OTUSVNFOUTͷ-FBLT ͜ͷϘλϯΛԡ͢ͱग़Δ΍ͭ 17 3

  18. 18 3 ϝϞϦϦʔΫΛࣗಈݕग़ͯ͠ఆظతʹݕࠪ݁ՌͷϚʔΫ͕ग़Δ ʜϦʔΫͳ͠ ʜ৽ϦʔΫ͋Γ ʜ৽ϦʔΫͳ͠ *OTUSVNFOUTͷ-FBLT ϝϞϦͷ࢖༻ྔάϥϑ͕ݟΒΕΔ

  19. UBSVOPO9$5"TTFSU/P-FBL 19 4

  20. ϝϞϦϦʔΫΛݕग़͢Δͱςετ͕ࣦഊ͢Δ 20 UBSVOPO9$5"TTFSU/P-FBL 4

  21. ϝϞϦϦʔΫΛݕग़͢Δͱςετ͕ࣦഊ͢Δ 21 UBSVOPO9$5"TTFSU/P-FBL 4

  22. ͜ΕΒͷπʔϧΛ࢖ͬͯͭͷ ϝϞϦϦʔΫΛݟͯΈ·͠ΐ͏ 22

  23. ͭͷϝϞϦϦʔΫΛൃੜͤ͞Δ 
 ΞϓϦΛ༻ҙ͠·ͨ͠ 23

  24. ,VOJXBL.FNPSZ-FBL1MBZHSPVOE ʮ&YFSDJTF9ʯΛλοϓ͢Δͱɺ 
 ͞·͟·ͳछྨͷϝϞϦϦʔΫΛ 
 Ҿ͖ى͜͠·͢ 24

  25. &YFSDJTF public class Exercise1_1 { var value: Any? private let

    weight = Weight1() } public static func exercise1_1() -> Exercise1_1 { let x = Exercise1_1() x.value = x return x } ॥؀ࢀরΛͭ͘Δ άϥϑͷมԽΛΘ͔Γ΍͘͢ 
 ͢ΔͨΊͷେ͖ͳΦϒδΣΫτ 25
  26. &YFSDJTF class Weight1 { private var data: [UInt64] = Array(

    
 repeating: 0, count: 1024 * 1024 ) } ͓Αͦ.J#ͷ༰ྔΛ֬อ 26
  27. 9DPEFͷ%FCVH/BWJHBUPS 27 1

  28. &YFSDJTFΛλοϓ͢Δͱ 
 ૿͑ͨ··ݮΒͳ͍ ʢϝϞϦϦʔΫ͍ͯ͠Δʣ 28 1

  29. 9DPEFͷ%FCVH.FNPSZ(SBQI 29 2

  30. ϝϞϦϦʔΫͷࣗಈݕ஌ʹҾ͔͔ͬͬͨ ॥؀ࢀরͷ༷ࢠΛڭ͑ͯ͘ΕΔ 30 2

  31. *OTUSVNFOUTͷ-FBLT 31 3

  32. ϝϞϦϦʔΫͷࣗಈݕ஌ʹҾ͔͔ͬͬͨ ૿͑ͨ··ݮ͍ͬͯͳ͍ʢϦʔΫ͍ͯ͠Δʣ 32 3

  33. 9$5"TTFSU/P-FBL 33 4

  34. ϝϞϦϦʔΫΛݕ஌ͨ͠ 34 4

  35. &YFSDJTF·ͱΊ %FCVH/BWJHBUPS %FCVH.FNPSZ (SBQI *OTUSVNFOUT ͷϝϞϦάϥϑ *OTUSVNFOUTͷࣗಈ ݕ஌ 9$5"TTFSU/P-FBL ✅

    ✅ ✅ ✅ ✅ 35
  36. &YFSDJTF public class Exercise1_2 { var value: Any? private let

    weight = Weight2() } public static func exercise1_2() -> Exercise1_2 { let x = Exercise1_2() x.value = x return x } ॥؀ࢀরΛͭ͘Δ άϥϑͷมԽΛΘ͔Γ΍͘͢ 
 ͢ΔͨΊͷେ͖ͳΦϒδΣΫτ 36
  37. &YFSDJTF @implementation Weight2 - (id)init { if (self = [super

    init]) { size_t size8MiB = 8*1024*1024; void* mem = malloc(size8MiB); if (mem == NULL) { return self; } // NOTE: Avoid memory overcommit. memset(mem, size8MiB, 1); _mem = mem; } return self; } NBMMPDͰಉ͡༰ྔͷϝϞϦΛ 
 ֬อ͍ͯ͠Δ 37
  38. 9DPEFͷ%FCVH/BWJHBUPS 38 1

  39. ΜʁͳΜ͔มΘͬͨʜ͔ʁ ʢ஫ɿಉ͡༰ྔΛϝϞϦϦʔΫͯ͠·͢ʣ 39 1

  40. 9DPEFͷ%FCVH.FNPSZ(SBQI 40 2

  41. ϝϞϦϦʔΫͷࣗಈݕ஌ʹҾ͔͔ͬͬͨ ॥؀ࢀরͷ༷ࢠΛڭ͑ͯ͘ΕΔ 41 2

  42. *OTUSVNFOUTͷ-FBLT 42 3

  43. ϝϞϦϦʔΫͷࣗಈݕ஌ʹҾ͔͔ͬͬͨ ૿͑ͨ··ݮ͍ͬͯͳ͍ʢϦʔΫ͍ͯ͠Δʣ 43 3

  44. 9$5"TTFSU/P-FBL 44 4

  45. ϝϞϦϦʔΫΛݕ஌ͨ͠ 45 4

  46. &YFSDJTF·ͱΊ %FCVH/BWJHBUPS %FCVH.FNPSZ (SBQI *OTUSVNFOUT ͷϝϞϦάϥϑ *OTUSVNFOUTͷࣗಈ ݕ஌ 9$5"TTFSU/P-FBL 🤔

    ✅ ✅ ✅ ✅ 46 NBMMPDͰ֬อ͞ΕͨϝϞϦ͕දࣔ͞Εͳ͍
  47. &YFSDJTF public class Exercise1_3 { var value: Any? private let

    weight = Weight3() } public static func exercise1_3() -> Exercise1_3 { let x = Exercise1_3() x.value = x return x } ॥؀ࢀরΛͭ͘Δ άϥϑͷมԽΛΘ͔Γ΍͘͢ 
 ͢ΔͨΊͷେ͖ͳΦϒδΣΫτ 47
  48. &YFSDJTF class Weight3 { private let data = Data(count: 8

    * 1024 * 1024) } 48 %BUBͰಉ͡༰ྔͷϝϞϦΛ֬อ
  49. 9DPEFͷ%FCVH/BWJHBUPS 49 1

  50. ΜʁͳΜ͔มΘͬͨʜ͔ʁ ʢ஫ɿಉ͡༰ྔΛϝϞϦϦʔΫͯ͠·͢ʣ 50 1

  51. &YFSDJTF·ͱΊ %FCVH/BWJHBUPS %FCVH.FNPSZ (SBQI *OTUSVNFOUT ͷϝϞϦάϥϑ *OTUSVNFOUTͷࣗಈ ݕ஌ 9$5"TTFSU/P-FBL 🤔

    ✅ ✅ ✅ ✅ 51 %BUBͰ֬อ͞ΕͨϝϞϦ͕දࣔ͞Εͳ͍
  52. &YFSDJTF public static func exercise2() -> Exercise2 { let x

    = Exercise2() var values = [Any]() values.append(Weight2() as Any) for _ in 0..<100 { values.append(Exercise2()) } let y = Indirect() values.append(y) y.value = ["y": x] for _ in 0..<100 { values.append(Exercise2()) } x.value = values return x άϥϑͷมԽΛΘ͔Γ΍͘͢ 
 ͢ΔͨΊͷେ͖ͳΦϒδΣΫτ ॥؀ࢀরΛ௥Ճ ແؔ܎ͳࢀরΛͨ͘͞Μ௥Ճ ແؔ܎ͳࢀরΛͨ͘͞Μ௥Ճ 52
  53. &YFSDJTF·ͱΊ %FCVH/BWJHBUPS %FCVH.FNPSZ (SBQI *OTUSVNFOUT ͷϝϞϦάϥϑ *OTUSVNFOUTͷࣗಈ ݕ஌ 9$5"TTFSU/P-FBL 🤔

    ✅ ✅ ✅ ✅ 53
  54. &YFSDJTF public static func exercise3() -> Exercise3 { let x

    = Exercise3() let y = Indirect() x.value = y var prev = y for _ in 0..<100 { let z = Indirect() prev.value = z prev = z } prev.value = x ௕େͳ॥؀ࢀরύεΛઃఆ 54
  55. 9DPEFͷ%FCVH/BWJHBUPS 55 1

  56. ΜʁͳΜ͔มΘͬͨʜ͔ʁ ʢ஫ɿಉ͡༰ྔΛϝϞϦϦʔΫͯ͠·͢ʣ 56 1

  57. 9DPEFͷ%FCVH.FNPSZ(SBQI 57 2

  58. ϝϞϦϦʔΫͷࣗಈݕ஌ʹҾ͔͔ͬΒͳ͍ʂ 58 2

  59. *OTUSVNFOUTͷ-FBLT 59 3

  60. ϝϞϦϦʔΫͷࣗಈݕ஌ʹҾ͔͔ͬΒͳ͍ʂ ૿͑ͨ··ݮ͍ͬͯͳ͍ʢϦʔΫ͍ͯ͠Δʣ 60 3

  61. 9$5"TTFSU/P-FBL 61 4

  62. ϝϞϦϦʔΫΛݕ஌ͨ͠ 62 4

  63. &YFSDJTF·ͱΊ %FCVH/BWJHBUPS %FCVH.FNPSZ (SBQI *OTUSVNFOUT ͷϝϞϦάϥϑ *OTUSVNFOUTͷࣗಈ ݕ஌ 9$5"TTFSU/P-FBL 🤔

    ❌ ✅ ❌ ✅ ௕େͳ॥؀ࢀর͸ݕ஌Ͱ͖ͣ ௕େͳ॥؀ࢀর͸ݕ஌Ͱ͖ͣ 63
  64. &YFSDJTF public class Exercise4 { var value: Any? private let

    weight = Weight1() init() { let x = Indirect() x.value = { _ = self } self.value = x } } Ϋϩʔδϟ͕ࣗ਎ΛڧࢀরͰ 
 Ωϟϓνϟͯ͠॥؀ࢀরͤ͞Δ 64
  65. &YFSDJTF·ͱΊ %FCVH/BWJHBUPS %FCVH.FNPSZ (SBQI *OTUSVNFOUT ͷϝϞϦάϥϑ *OTUSVNFOUTͷࣗಈ ݕ஌ 9$5"TTFSU/P-FBL 🤔

    ✅ ✅ ✅ ✅ 65
  66. &YFSDJTF public static func exercise5() -> Exercise5_1 { let x

    = Exercise5_1() let y = Exercise5_2.init(x) x.value = y return x } 0CKFDUJWF$ͱ4XJGUͷؒͰ 
 ॥؀ࢀরͤ͞Δ 66
  67. &YFSDJTF·ͱΊ %FCVH/BWJHBUPS %FCVH.FNPSZ (SBQI *OTUSVNFOUT ͷϝϞϦάϥϑ *OTUSVNFOUTͷࣗಈ ݕ஌ 9$5"TTFSU/P-FBL 🤔

    ✅ ✅ ✅ ✅ 67
  68. &YFSDJTF public class Exercise6: EventHubObserver { private let weight =

    Weight2() init() { EventHub.shared.add(observer: self) } deinit { EventHub.shared.removeObserver(observer: self) } } EFJOJUͰߪಡղআ͢Δ͜ͱΛ 
 ҙਤͨ͠ίʔυ͕ͩɺ 
 ͦ΋ͦ΋ߪಡղআ͞Εͳ͍ͱ 
 ࢀর͕࢒͍ͬͯͯEFJOJU͕ 
 ૸Βͳ͍ͷͰϝϞϦϦʔΫ͢Δ 68
  69. &YFSDJTF·ͱΊ %FCVH/BWJHBUPS %FCVH.FNPSZ (SBQI *OTUSVNFOUT ͷϝϞϦάϥϑ *OTUSVNFOUTͷࣗಈ ݕ஌ 9$5"TTFSU/P-FBL 🤔

    ❌ ✅ ❌ ✅ ॥؀ࢀরͰ͸ͳ͍ͷͰݕ஌Ͱ͖ͣ ॥؀ࢀরͰ͸ͳ͍ͷͰݕ஌Ͱ͖ͣ 69
  70. &YFSDJTF public class Exercise7 { var value: Any? private let

    weight = Weight2() public class Indirect: CustomReflectable { var value: Any? public var customMirror: Mirror { return Mirror(self, children: []) } } .JSSPS SF fl FDUJOH Ͱ 
 Կ΋TUPSFEQSPQ͕ 
 ͳ͍ͱࡨ֮ͤ͞Δ 70
  71. &YFSDJTF·ͱΊ %FCVH/BWJHBUPS %FCVH.FNPSZ (SBQI *OTUSVNFOUT ͷϝϞϦάϥϑ *OTUSVNFOUTͷࣗಈ ݕ஌ 9$5"TTFSU/P-FBL 🤔

    ✅ ✅ ✅ ❌ .JSSPSʹґଘ͍ͯ͠ΔͷͰ$VTUPN3F fl FDUBCMF͕ 
 ࣮૷͞Ε͍ͯΔΦϒδΣΫτͰ͸ෆਖ਼֬ͳ݁ՌʹͳΔ 71
  72. &YFSDJTF·ͱΊ &YFSDJTF %FCVH/BWJHBUPS %FCVH.FNPSZ (SBQI *OTUSVNFOUT ͷϝϞϦάϥϑ *OTUSVNFOUTͷ 
 ࣗಈݕ஌

    9$5"TTFSU/P-FBL  ✅ ✅ ✅ ✅ ✅  🤔 ✅ ✅ ✅ ✅  🤔 ✅ ✅ ✅ ✅  🤔 ✅ ✅ ✅ ✅  🤔 ❌ ✅ ❌ ✅  🤔 ✅ ✅ ✅ ✅  🤔 ✅ ✅ ✅ ✅  🤔 ❌ ✅ ❌ ✅  🤔 ✅ ✅ ✅ ❌ 72
  73. &YFSDJTF·ͱΊ &YFSDJTF %FCVH/BWJHBUPS %FCVH.FNPSZ (SBQI *OTUSVNFOUT ͷϝϞϦάϥϑ *OTUSVNFOUTͷ 
 ࣗಈݕ஌

    9$5"TTFSU/P-FBL  ✅ ✅ ✅ ✅ ✅  🤔 ✅ ✅ ✅ ✅  🤔 ✅ ✅ ✅ ✅  🤔 ✅ ✅ ✅ ✅  🤔 ❌ ✅ ❌ ✅  🤔 ✅ ✅ ✅ ✅  🤔 ✅ ✅ ✅ ✅  🤔 ❌ ✅ ❌ ✅  🤔 ✅ ✅ ✅ ❌ NBMMPDͰ֬อ͞ΕͨϝϞϦ΍%BUBͳͲͷϝϞϦ 
 ࢖༻ྔ͕ݟ͑ͳ͍ɻϝϞϦϦʔΫͯ͠ͳ͍Α͏ʹ 
 ݟ͑ͯ΋ϝϞϦϦʔΫ͍ͯ͠Δ͜ͱ͕͋Γ͏Δ 73
  74. &YFSDJTF·ͱΊ &YFSDJTF %FCVH/BWJHBUPS %FCVH.FNPSZ (SBQI *OTUSVNFOUT ͷϝϞϦάϥϑ *OTUSVNFOUTͷ 
 ࣗಈݕ஌

    9$5"TTFSU/P-FBL  ✅ ✅ ✅ ✅ ✅  🤔 ✅ ✅ ✅ ✅  🤔 ✅ ✅ ✅ ✅  🤔 ✅ ✅ ✅ ✅  🤔 ❌ ✅ ❌ ✅  🤔 ✅ ✅ ✅ ✅  🤔 ✅ ✅ ✅ ✅  🤔 ❌ ✅ ❌ ✅  🤔 ✅ ✅ ✅ ❌ ॥؀ࢀরύε͕௕͍৔߹΍ɺߪಡͷ 
 ղআ๨Ε͸ݕ஌Ͱ͖ͳ͍ɻࣗಈݕ஌Ͱ 
 ϝϞϦϦʔΫ͕͋ΔͱݴΘΕͨ৔߹͸ 
 ৴༻ͯ͠ྑ͍͕ɺٯ͸ա৴ͯ͠͸͍͚ͳ͍ 74
  75. &YFSDJTF·ͱΊ &YFSDJTF %FCVH/BWJHBUPS %FCVH.FNPSZ (SBQI *OTUSVNFOUT ͷϝϞϦάϥϑ *OTUSVNFOUTͷ 
 ࣗಈݕ஌

    9$5"TTFSU/P-FBL  ✅ ✅ ✅ ✅ ✅  🤔 ✅ ✅ ✅ ✅  🤔 ✅ ✅ ✅ ✅  🤔 ✅ ✅ ✅ ✅  🤔 ❌ ✅ ❌ ✅  🤔 ✅ ✅ ✅ ✅  🤔 ✅ ✅ ✅ ✅  🤔 ❌ ✅ ❌ ✅  🤔 ✅ ✅ ✅ ❌ ҆ఆͯ͠ϝϞϦͷ࢖༻ྔͷ૿ݮΛ 
 ֬ೝͰ͖͍ͯΔɻϝϞϦϦʔΫͷ 
 ༗ແΛௐ΂͍ͨͳΒ·ͣ͜ΕΛݟΔ΂͖ 75
  76. &YFSDJTF·ͱΊ &YFSDJTF %FCVH/BWJHBUPS %FCVH.FNPSZ (SBQI *OTUSVNFOUT ͷϝϞϦάϥϑ *OTUSVNFOUTͷ 
 ࣗಈݕ஌

    9$5"TTFSU/P-FBL  ✅ ✅ ✅ ✅ ✅  🤔 ✅ ✅ ✅ ✅  🤔 ✅ ✅ ✅ ✅  🤔 ✅ ✅ ✅ ✅  🤔 ❌ ✅ ❌ ✅  🤔 ✅ ✅ ✅ ✅  🤔 ✅ ✅ ✅ ✅  🤔 ❌ ✅ ❌ ✅  🤔 ✅ ✅ ✅ ❌ ॥؀ࢀরύε͕௕͍৔߹΍ɺߪಡͷ 
 ղআ๨Ε͸ݕ஌Ͱ͖ͳ͍ɻࣗಈݕ஌Ͱ 
 ϝϞϦϦʔΫ͕͋Δͱࢦఠ͞Εͨ৔߹͸ 
 ৴༻ͯ͠Α͍͕ɺͳ͍ͱࢦఠ͞Εͨ৔߹ ͸ա৴ͯ͠͸͍͚ͳ͍ 76
  77. &YFSDJTF·ͱΊ &YFSDJTF %FCVH/BWJHBUPS %FCVH.FNPSZ (SBQI *OTUSVNFOUT ͷϝϞϦάϥϑ *OTUSVNFOUTͷ 
 ࣗಈݕ஌

    9$5"TTFSU/P-FBL  ✅ ✅ ✅ ✅ ✅  🤔 ✅ ✅ ✅ ✅  🤔 ✅ ✅ ✅ ✅  🤔 ✅ ✅ ✅ ✅  🤔 ❌ ✅ ❌ ✅  🤔 ✅ ✅ ✅ ✅  🤔 ✅ ✅ ✅ ✅  🤔 ❌ ✅ ❌ ✅  🤔 ✅ ✅ ✅ ❌ ·Εʹ$VTUPN3F fl FDUBCMFΛ࣮૷͍ͯ͠Δ 
 ΦϒδΣΫτ͕͋ΔͷͰ஫ҙ͕ඞཁɻ ϝϞϦϦʔΫ͕͋Δͱࢦఠ͞Εͨ৔߹͸ 
 ৴༻Ͱ͖Δ͕ɺͳ͍ͱࢦఠ͞Εͨ৔߹͸ 
 ա৴ͯ͠͸͍͚ͳ͍ 77
  78. ·ͱΊ wϝϞϦϦʔΫΛ୳͢ʹ͸·ͣ*OTUSVNFOUTͷ-FBLTͷ 
 ϝϞϦ࢖༻ྔάϥϑΛݟΔͱΑ͍ wͦΕҎ֎ͷํ๏͸ϝϞϦϦʔΫ͕͋ͬͯ΋ݟམͱ͢ 
 Մೳੑ͕͋ΔͷͰɺ݁ՌΛա৴͠ͳ͍ํ͕Α͍ 78