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

実践 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

    View Slide

  2. ϝϞϦϦʔΫͱ͸
    2

    View Slide

  3. ϝϞϦϦʔΫͱ͸ɺ΋͏࢖༻͞Εͳ͍

    Ϧιʔε͕ϝϞϦʹ֬อ͞Εଓ͚Δ͜ͱ
    [email protected]Λ๜༁ɾཁ໿ͨ͠΋ͷɻ೔ຊޠͷํ͸

    ͋·Γ͍͍આ໌Ͱ͸ͳ͔ͬͨʜ
    3

    View Slide

  4. ϝϞϦϦʔΫ͕͋Δͱɺ࢖͑ΔϝϞϦ͕

    ঃʑʹݮ͍ͬͯ͘
    ͢ΔͱϝϞϦϓϨογϟʔ͕֤ΞϓϦʹ

    ͔͚ΒΕɺͦΕͰ΋ϝϞϦ͕଍Βͳ͍ͱ

    ΞϓϦ͕KFUTBNʢւʹϙΠʣ͞ΕΔ
    ৄ͘͠͸ʮ*EFOUJGZJOHIJHINFNPSZVTFXJUIKFUTBNFWFOUSFQPSUTʯΛࢀরɻ

    IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOYDPEFJEFOUJGZJOHIJHINFNPSZVTFXJUIKFUTBNFWFOUSFQPSUT
    4

    View Slide

  5. Α͏͢ΔʹϝϞϦϦʔΫͷ͋ΔΞϓϦΛ

    ௕࣌ؒ࢖͏ͱڧ੍ऴྃ͞ΕΔˡࠔΔ
    5

    View Slide

  6. ϝϞϦϦʔΫ͸Կ͕

    ݪҼͰى͜Δͷ͔
    6

    View Slide

  7. ॥؀ࢀর
    4XJGU͸ࢀরΧ΢ϯτํࣜͳͷͰɺ

    ॥؀ࢀর͕͋Δͱ॥؀ࢀরύε্ͷ

    ΦϒδΣΫτͷࢀরΧ΢ϯτ͕ʹ

    ͳΒͣͥΜͿղ์͞Εͳ͍
    7

    View Slide

  8. ߪಡղআ๨Ε
    ΋͏Πϕϯτ͕͜ͳ͍ͷʹߪಡΛ

    ଓ͚Δͱɺ॥؀ࢀরͰ͸ͳ͍͕

    ΋͏࢖ΘΕͳ͍Ϧιʔε͕ϝϞϦʹ

    ࢒Γଓ͚ΔͷͰϝϞϦϦʔΫʹͳΔ
    8

    View Slide

  9. ϝϞϦϦʔΫΛ

    Ͳ͏ݟ͚ͭΔ͔
    9

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  13. 9DPEFͷ%FCVH/BWJHBUPSͷϝϞϦάϥϑ
    ϝϞϦ࢖༻ྔΛݟΒΕΔ͕

    ஫ҙ͕ඞཁʢޙड़ʣ
    13
    1

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  23. ͭͷϝϞϦϦʔΫΛൃੜͤ͞Δ

    ΞϓϦΛ༻ҙ͠·ͨ͠
    23

    View Slide

  24. ,VOJXBL.FNPSZ-FBL1MBZHSPVOE
    ʮ&YFSDJTF9ʯΛλοϓ͢Δͱɺ

    ͞·͟·ͳछྨͷϝϞϦϦʔΫΛ

    Ҿ͖ى͜͠·͢
    24

    View Slide

  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

    View Slide

  26. &YFSDJTF
    class Weight1 {


    private var data: [UInt64] = Array(

    repeating: 0,


    count: 1024 * 1024


    )


    }
    ͓Αͦ.J#ͷ༰ྔΛ֬อ
    26

    View Slide

  27. 9DPEFͷ%FCVH/BWJHBUPS
    27
    1

    View Slide

  28. &YFSDJTFΛλοϓ͢Δͱ

    ૿͑ͨ··ݮΒͳ͍
    ʢϝϞϦϦʔΫ͍ͯ͠Δʣ
    28
    1

    View Slide

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

    View Slide

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

    View Slide

  31. *OTUSVNFOUTͷ-FBLT
    31
    3

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  38. 9DPEFͷ%FCVH/BWJHBUPS
    38
    1

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  42. *OTUSVNFOUTͷ-FBLT
    42
    3

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  46. &YFSDJTF·ͱΊ
    %FCVH/BWJHBUPS
    %FCVH.FNPSZ
    (SBQI
    *OTUSVNFOUT
    ͷϝϞϦάϥϑ
    *OTUSVNFOUTͷࣗಈ
    ݕ஌
    9$5"TTFSU/P-FBL
    🤔 ✅ ✅ ✅ ✅
    46
    NBMMPDͰ֬อ͞ΕͨϝϞϦ͕දࣔ͞Εͳ͍

    View Slide

  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

    View Slide

  48. &YFSDJTF
    class Weight3 {


    private let data = Data(count: 8 * 1024 * 1024)


    }
    48
    %BUBͰಉ͡༰ྔͷϝϞϦΛ֬อ

    View Slide

  49. 9DPEFͷ%FCVH/BWJHBUPS
    49
    1

    View Slide

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

    View Slide

  51. &YFSDJTF·ͱΊ
    %FCVH/BWJHBUPS
    %FCVH.FNPSZ
    (SBQI
    *OTUSVNFOUT
    ͷϝϞϦάϥϑ
    *OTUSVNFOUTͷࣗಈ
    ݕ஌
    9$5"TTFSU/P-FBL
    🤔 ✅ ✅ ✅ ✅
    51
    %BUBͰ֬อ͞ΕͨϝϞϦ͕දࣔ͞Εͳ͍

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

  55. 9DPEFͷ%FCVH/BWJHBUPS
    55
    1

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  59. *OTUSVNFOUTͷ-FBLT
    59
    3

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  63. &YFSDJTF·ͱΊ
    %FCVH/BWJHBUPS
    %FCVH.FNPSZ
    (SBQI
    *OTUSVNFOUT
    ͷϝϞϦάϥϑ
    *OTUSVNFOUTͷࣗಈ
    ݕ஌
    9$5"TTFSU/P-FBL
    🤔 ❌ ✅ ❌ ✅
    ௕େͳ॥؀ࢀর͸ݕ஌Ͱ͖ͣ ௕େͳ॥؀ࢀর͸ݕ஌Ͱ͖ͣ
    63

    View Slide

  64. &YFSDJTF
    public class Exercise4 {


    var value: Any?


    private let weight = Weight1()


    init() {


    let x = Indirect()


    x.value = { _ = self }


    self.value = x


    }


    }


    Ϋϩʔδϟ͕ࣗ਎ΛڧࢀরͰ

    Ωϟϓνϟͯ͠॥؀ࢀরͤ͞Δ
    64

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

  69. &YFSDJTF·ͱΊ
    %FCVH/BWJHBUPS
    %FCVH.FNPSZ
    (SBQI
    *OTUSVNFOUT
    ͷϝϞϦάϥϑ
    *OTUSVNFOUTͷࣗಈ
    ݕ஌
    9$5"TTFSU/P-FBL
    🤔 ❌ ✅ ❌ ✅
    ॥؀ࢀরͰ͸ͳ͍ͷͰݕ஌Ͱ͖ͣ ॥؀ࢀরͰ͸ͳ͍ͷͰݕ஌Ͱ͖ͣ
    69

    View Slide

  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

    View Slide

  71. &YFSDJTF·ͱΊ
    %FCVH/BWJHBUPS
    %FCVH.FNPSZ
    (SBQI
    *OTUSVNFOUT
    ͷϝϞϦάϥϑ
    *OTUSVNFOUTͷࣗಈ
    ݕ஌
    9$5"TTFSU/P-FBL
    🤔 ✅ ✅ ✅ ❌
    .JSSPSʹґଘ͍ͯ͠ΔͷͰ$VTUPN3F
    fl
    FDUBCMF͕

    ࣮૷͞Ε͍ͯΔΦϒδΣΫτͰ͸ෆਖ਼֬ͳ݁ՌʹͳΔ
    71

    View Slide

  72. &YFSDJTF·ͱΊ
    &YFSDJTF %FCVH/BWJHBUPS
    %FCVH.FNPSZ
    (SBQI
    *OTUSVNFOUT
    ͷϝϞϦάϥϑ
    *OTUSVNFOUTͷ

    ࣗಈݕ஌
    9$5"TTFSU/P-FBL
    ✅ ✅ ✅ ✅ ✅
    🤔 ✅ ✅ ✅ ✅
    🤔 ✅ ✅ ✅ ✅
    🤔 ✅ ✅ ✅ ✅
    🤔 ❌ ✅ ❌ ✅
    🤔 ✅ ✅ ✅ ✅
    🤔 ✅ ✅ ✅ ✅
    🤔 ❌ ✅ ❌ ✅
    🤔 ✅ ✅ ✅ ❌
    72

    View Slide

  73. &YFSDJTF·ͱΊ
    &YFSDJTF %FCVH/BWJHBUPS
    %FCVH.FNPSZ
    (SBQI
    *OTUSVNFOUT
    ͷϝϞϦάϥϑ
    *OTUSVNFOUTͷ

    ࣗಈݕ஌
    9$5"TTFSU/P-FBL
    ✅ ✅ ✅ ✅ ✅
    🤔 ✅ ✅ ✅ ✅
    🤔 ✅ ✅ ✅ ✅
    🤔 ✅ ✅ ✅ ✅
    🤔 ❌ ✅ ❌ ✅
    🤔 ✅ ✅ ✅ ✅
    🤔 ✅ ✅ ✅ ✅
    🤔 ❌ ✅ ❌ ✅
    🤔 ✅ ✅ ✅ ❌
    NBMMPDͰ֬อ͞ΕͨϝϞϦ΍%BUBͳͲͷϝϞϦ

    ࢖༻ྔ͕ݟ͑ͳ͍ɻϝϞϦϦʔΫͯ͠ͳ͍Α͏ʹ

    ݟ͑ͯ΋ϝϞϦϦʔΫ͍ͯ͠Δ͜ͱ͕͋Γ͏Δ
    73

    View Slide

  74. &YFSDJTF·ͱΊ
    &YFSDJTF %FCVH/BWJHBUPS
    %FCVH.FNPSZ
    (SBQI
    *OTUSVNFOUT
    ͷϝϞϦάϥϑ
    *OTUSVNFOUTͷ

    ࣗಈݕ஌
    9$5"TTFSU/P-FBL
    ✅ ✅ ✅ ✅ ✅
    🤔 ✅ ✅ ✅ ✅
    🤔 ✅ ✅ ✅ ✅
    🤔 ✅ ✅ ✅ ✅
    🤔 ❌ ✅ ❌ ✅
    🤔 ✅ ✅ ✅ ✅
    🤔 ✅ ✅ ✅ ✅
    🤔 ❌ ✅ ❌ ✅
    🤔 ✅ ✅ ✅ ❌
    ॥؀ࢀরύε͕௕͍৔߹΍ɺߪಡͷ

    ղআ๨Ε͸ݕ஌Ͱ͖ͳ͍ɻࣗಈݕ஌Ͱ

    ϝϞϦϦʔΫ͕͋ΔͱݴΘΕͨ৔߹͸

    ৴༻ͯ͠ྑ͍͕ɺٯ͸ա৴ͯ͠͸͍͚ͳ͍
    74

    View Slide

  75. &YFSDJTF·ͱΊ
    &YFSDJTF %FCVH/BWJHBUPS
    %FCVH.FNPSZ
    (SBQI
    *OTUSVNFOUT
    ͷϝϞϦάϥϑ
    *OTUSVNFOUTͷ

    ࣗಈݕ஌
    9$5"TTFSU/P-FBL
    ✅ ✅ ✅ ✅ ✅
    🤔 ✅ ✅ ✅ ✅
    🤔 ✅ ✅ ✅ ✅
    🤔 ✅ ✅ ✅ ✅
    🤔 ❌ ✅ ❌ ✅
    🤔 ✅ ✅ ✅ ✅
    🤔 ✅ ✅ ✅ ✅
    🤔 ❌ ✅ ❌ ✅
    🤔 ✅ ✅ ✅ ❌
    ҆ఆͯ͠ϝϞϦͷ࢖༻ྔͷ૿ݮΛ

    ֬ೝͰ͖͍ͯΔɻϝϞϦϦʔΫͷ

    ༗ແΛௐ΂͍ͨͳΒ·ͣ͜ΕΛݟΔ΂͖
    75

    View Slide

  76. &YFSDJTF·ͱΊ
    &YFSDJTF %FCVH/BWJHBUPS
    %FCVH.FNPSZ
    (SBQI
    *OTUSVNFOUT
    ͷϝϞϦάϥϑ
    *OTUSVNFOUTͷ

    ࣗಈݕ஌
    9$5"TTFSU/P-FBL
    ✅ ✅ ✅ ✅ ✅
    🤔 ✅ ✅ ✅ ✅
    🤔 ✅ ✅ ✅ ✅
    🤔 ✅ ✅ ✅ ✅
    🤔 ❌ ✅ ❌ ✅
    🤔 ✅ ✅ ✅ ✅
    🤔 ✅ ✅ ✅ ✅
    🤔 ❌ ✅ ❌ ✅
    🤔 ✅ ✅ ✅ ❌
    ॥؀ࢀরύε͕௕͍৔߹΍ɺߪಡͷ

    ղআ๨Ε͸ݕ஌Ͱ͖ͳ͍ɻࣗಈݕ஌Ͱ

    ϝϞϦϦʔΫ͕͋Δͱࢦఠ͞Εͨ৔߹͸

    ৴༻ͯ͠Α͍͕ɺͳ͍ͱࢦఠ͞Εͨ৔߹
    ͸ա৴ͯ͠͸͍͚ͳ͍
    76

    View Slide

  77. &YFSDJTF·ͱΊ
    &YFSDJTF %FCVH/BWJHBUPS
    %FCVH.FNPSZ
    (SBQI
    *OTUSVNFOUT
    ͷϝϞϦάϥϑ
    *OTUSVNFOUTͷ

    ࣗಈݕ஌
    9$5"TTFSU/P-FBL
    ✅ ✅ ✅ ✅ ✅
    🤔 ✅ ✅ ✅ ✅
    🤔 ✅ ✅ ✅ ✅
    🤔 ✅ ✅ ✅ ✅
    🤔 ❌ ✅ ❌ ✅
    🤔 ✅ ✅ ✅ ✅
    🤔 ✅ ✅ ✅ ✅
    🤔 ❌ ✅ ❌ ✅
    🤔 ✅ ✅ ✅ ❌
    ·Εʹ$VTUPN3F
    fl
    FDUBCMFΛ࣮૷͍ͯ͠Δ

    ΦϒδΣΫτ͕͋ΔͷͰ஫ҙ͕ඞཁɻ
    ϝϞϦϦʔΫ͕͋Δͱࢦఠ͞Εͨ৔߹͸

    ৴༻Ͱ͖Δ͕ɺͳ͍ͱࢦఠ͞Εͨ৔߹͸

    ա৴ͯ͠͸͍͚ͳ͍
    77

    View Slide

  78. ·ͱΊ
    wϝϞϦϦʔΫΛ୳͢ʹ͸·ͣ*OTUSVNFOUTͷ-FBLTͷ

    ϝϞϦ࢖༻ྔάϥϑΛݟΔͱΑ͍
    wͦΕҎ֎ͷํ๏͸ϝϞϦϦʔΫ͕͋ͬͯ΋ݟམͱ͢

    Մೳੑ͕͋ΔͷͰɺ݁ՌΛա৴͠ͳ͍ํ͕Α͍
    78

    View Slide