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

Transferable - SwiftUI ドキュメントアプリ

notoroid
December 23, 2022

Transferable - SwiftUI ドキュメントアプリ

札幌iPhoneアプリ開発懇談会勉強会2022年12月向け資料。iOS16 SDKで追加されたTransferableとSwiftUI のドキュメントアプリについての紹介。

notoroid

December 23, 2022
Tweet

More Decks by notoroid

Other Decks in Programming

Transcript

  1. ೳొཁ !OPUPSPJE
    J1IPOFΞϓϦ։ൃऀ೥݄೔
    4XJGU6*υΩϡϝϯτΞϓϦ
    5SBOTGFSBCMF

    View Slide

  2. ࿩͢಺༰
    w 5SBOTGFSBCMF
    w 4XJGU6*ͷ%SBH%SPQ

    View Slide

  3. ࿩͞ͳ͍಺༰
    w υΩϡϝϯτΞϓϦ޲͚ʹ௥Ճ͞Εͨ6*
    w πʔϧόʔ΄͔

    View Slide

  4. ͓୊໨
    w ೥ͷ4XJGU6*
    w 5SBOTGFSBCMF֓ཁ
    w 5SBOTGFSBCMFͷ࢖͍ํ
    w 5SBOTGFSBCMFͷྫ
    w ·ͱΊ

    View Slide

  5. ೥ͷ4XJGU6*

    View Slide

  6. 4XJGU6*ͷ৽ػೳϓϨθϯςʔγϣϯ
    w 4XJGU6*͕ൃද͞Εͯ೥໨ ʙ

    w ൃද౰ॳ͔ΒػೳڧԽ
    w ϚϧνϓϥοτϑΥʔϜରԠ
    w BTZODBXBJUBDUPSʹରԠ

    View Slide

  7. 4XJGU6*ϓϨθϯςʔγϣϯ
    ৽ػೳ঺հଟ͗͢໰୊

    View Slide

  8. %FWFMPQFSΞϓϦ

    View Slide

  9. %FWFMPQFSΞϓϦ


    View Slide

  10. ϓϨθϯλΠτϧ͕ॏͳΓ͗͢ɻ
    ৽ػೳΛΞϐʔϧ͢ΔλΠτϧͷ
    ߟҊ͕"QQMFٻΊΒΕΔ

    View Slide

  11. ࿩Λຊ୊ʹ໭ͯ͠

    View Slide

  12. 4XJGU6*ͷυΩϡϝϯτΞϓϦରԠ

    View Slide

  13. 4XJGU6*ͷυΩϡϝϯτΞϓϦରԠ
    w 4XJGU6*ൃදͷ೥͔ΒςϯϓϨʔτ͕ଘࡏ
    w ೥ʹ4XJGUݴޠ޲͚ʹϑΝΠϧܗࣜϑϨʔϜϫʔΫΛ௥Ճ
    w 6OJGPSN5ZQF*EFOUJ
    fi
    FSGSBNFXPSL
    w ೥πʔϧόʔɺ4QMJU7JFXͳͲͷػೳڧԽ

    View Slide

  14. ೥ͷυΩϡϝϯτΞϓϦʹ͍ͭͯ͸4QFBLFS%FDLͰެ։த
    ˣ
    IUUQTJSJNBTVDPNBQQMFNVMUJQMBUGPSNEPDVNFOUBQQ
    TVNNBSZ

    View Slide

  15. υΩϡϝϯτΞϓϦͷෆຬ఺
    w ϑΝΠϧܗࣜͷઃఆ͸NBD04ͱJ1IPOFJ1BEͰ෼͔Ε͍ͯΔ
    w NBD04༻JOGPQMJTUɺJ1IPOFJ1BE༻JOGPQMJTU
    w ϑΝΠϧܗࣜʹ͍ͭͯ͸෼͔Εͨ·· ೥ݱࡏ

    w υΩϡϝϯτΞϓϦΒ͍͠ݟͨ໨ʹͳΒͳ͍ αϙʔτෆ଍

    w J04ɺNBD047FOUVSBͰڧԽ
    w %SBH%SPQରԠ͕ෆे෼
    w ೥ʹ5SBOTGFSBCMFΛ࢖ͬͯରԠ

    View Slide

  16. υΩϡϝϯτΞϓϦͷෆຬ఺
    w ϑΝΠϧܗࣜͷઃఆ͸NBD04ͱJ1IPOFJ1BEͰ෼͔Ε͍ͯΔ
    w NBD04༻JOGPQMJTUɺJ1IPOFJ1BE༻JOGPQMJTU
    w ϑΝΠϧܗࣜʹ͍ͭͯ͸෼͔Εͨ·· ೥ݱࡏ

    w υΩϡϝϯτΞϓϦΒ͍͠ݟͨ໨ʹͳΒͳ͍ αϙʔτෆ଍

    w J04ɺNBD047FOUVSBͰڧԽ
    w %SBH%SPQରԠ͕ෆे෼
    w ೥ʹ5SBOTGFSBCMFΛ࢖ͬͯରԠ
    /FX

    View Slide

  17. 5SBOTGFSBCMF֓ཁ

    View Slide

  18. 5SBOTGFSBCMF
    wΞϓϦؒɺ04ͱΞϓϦؒͰͷσʔλ΍ΓऔΓશൠΛऔΓѻ͏
    w4XJGUͷQSPUPDPMͷҰछ DPEBCMF TFOEBCMF FUDʜ

    w4XJGUݴޠઐ༻
    wએݴతϓϩάϥϛϯάʹԊͬͨܗͰهड़Մೳ
    w4XJGU6*Ͱ׳Ε਌͠Μͩهड़͕Մೳ

    View Slide

  19. 5SBOTGFSBCMF
    wΞϓϦؒɺ04ͱΞϓϦؒͰͷσʔλ΍ΓऔΓશൠΛऔΓѻ͏
    w4XJGUͷQSPUPDPMͷҰछ DPEBCMF TFOEBCMF FUDʜ

    w4XJGUݴޠઐ༻
    wએݴతϓϩάϥϛϯάʹԊͬͨܗͰهड़Մೳ
    w4XJGU6*Ͱ׳Ε਌͠Μͩهड़͕Մೳ

    View Slide

  20. ΞϓϦؒɺ04ͱΞϓϦؒͰͷσʔλ΍ΓऔΓશൠ
    ૹΓݩ ड͚ઌ
    σʔλ
    جຊૹΓݩͱड͚ઌͰσʔλΛ౉͢

    View Slide

  21. ΞϓϦؒɺ04ͱΞϓϦؒͰͷσʔλ΍ΓऔΓશൠ
    ૹΓݩ ड͚ઌ
    σʔλ
    ΞϓϦ"
    ૹΓݩͱड͚ઌ͸ΞϓϦ಺෦
    ΞϓϦ಺ͷ΍ΓऔΓͳͷͰಠ࣮ࣗ૷΋Մೳͩͬͨ

    View Slide

  22. ΞϓϦؒɺ04ͱΞϓϦؒͰͷσʔλ΍ΓऔΓશൠ
    ૹΓݩ ड͚ઌ
    σʔλ
    ૹΓݩͱड͚ઌ͸ผΞϓϦ
    ΞϓϦ" ΞϓϦ#
    ΞϓϦಉ࢜Ͱ"1*Λ࢖ͬͨσʔλͷड͚౉͠Λ࣮ݱ͢Δඞཁ͋Γ

    View Slide

  23. ΞϓϦؒɺ04ͱΞϓϦؒͰͷσʔλ΍ΓऔΓશൠ
    ૹΓݩ ड͚ઌ
    σʔλ
    04
    ૹΓݩ͸04ɺड͚ઌ͸ΞϓϦ
    ΞϓϦ#
    ༻్޲͚"1*͕༻ҙ͞ΕΔࣄྫ͕ଟ͔ͬͨ FYը૾ϐοΧʔ

    View Slide

  24. ΞϓϦؒɺ04ͱΞϓϦؒͰͷσʔλ΍ΓऔΓશൠ
    ૹΔσʔλ͸Ӭଓੑ͕ඞཁ
    ૹΓݩ ड͚ઌ
    σʔλ
    􀫦
    􀤄
    Memory Storage
    σʔλͷ΍ΓऔΓ͸͍ͭߦΘΕΔ
    ͔͸໌Β͔Ͱ͸ͳ͍ɻ
    04ʹΑͬͯϝϞϦ͔Β4UPSBHF
    ΁ͷୀආ͕ߦΘΕΔ৔߹͕͋Δɻ

    View Slide

  25. ΞϓϦؒɺ04ͱΞϓϦؒͰͷσʔλ΍ΓऔΓશൠ
    ૹΔσʔλܗࣜͷ͏ͪग़དྷ߹͍ͷܗࣜΛར༻Ͱ͖Δɻ
    %BUB
    *NBHF
    1MBJOUFYU "UUSJCVUFUFYU
    63-
    όΠφϦσʔλ͸ɺը૾ϑΥʔϚοτ
    1OH +QFH
    ɺө૾ϑΥʔϚοτ
    NQ NPW
    ͳͲ04ʹొ࿥͞Ε͍ͯΔܗࣜ
    ΛࢦఆͰ͖Δ 6OJGPSN5ZQF*EFOUJ
    fi
    FS
    ɻ

    View Slide

  26. ΞϓϦؒɺ04ͱΞϓϦؒͰͷσʔλ΍ΓऔΓશൠ
    औΓѻ͏σʔλ͸ଟଶੑ͕͋Δ
    ૹΓݩ ड͚ઌ
    σʔλ
    ը૾
    ଐੑจࣈྻ
    จࣈྻ
    ༏ઌ౓Λ͚ͭͯड
    ͚౉͢σʔλͷܗ
    ࣜΛࢦఆͰ͖Δɻ
    ༏ઌ౓
    )JHI
    -PX

    View Slide

  27. σʔλͷ΍ΓऔΓʹؔͯ͠એݴత
    ʹهड़Ͱ͖Δͷ͕ɺ5SBOTGFSBCMF

    View Slide

  28. 5SBOTGFSBCMFͷ࢖͍ํ

    View Slide

  29. ·ͣ͸5SBOTGFSBCMFϓϩτίϧʹରԠ
    ͢Δߏ଄ମɺΦϒδΣΫτΛ࡞੒͢Δ

    View Slide

  30. 5SBOTGFSBCMFϓϩτίϧ
    TUBUJDϝϯόม਺USBOTGFS3FQSFTFOUBUJPOʹରԠ͢Δ
    @available(iOS 16.0, macOS 13.0, tvOS 16.0, watchOS 9.0, *)


    public protocol Transferable {


    /// The type of the representation used to import and export the item.


    ///


    /// Swift infers this type from the return value of the


    /// ``transferRepresentation`` property.


    associatedtype Representation : TransferRepresentation


    /// The representation used to import and export the item.


    ///


    /// A ``transferRepresentation`` can contain multiple representations


    /// for different content types.


    @TransferRepresentationBuilder static var transferRepresentation: Self.Representation { get }


    }

    View Slide

  31. 5SBOTGFSBCMFϓϩτίϧ
    TUBUJDϝϯόม਺USBOTGFS3FQSFTFOUBUJPOʹରԠ͢Δ
    @available(iOS 16.0, macOS 13.0, tvOS 16.0, watchOS 9.0, *)


    public protocol Transferable {


    /// The type of the representation used to import and export the item.


    ///


    /// Swift infers this type from the return value of the


    /// ``transferRepresentation`` property.


    associatedtype Representation : TransferRepresentation


    /// The representation used to import and export the item.


    ///


    /// A ``transferRepresentation`` can contain multiple representations


    /// for different content types.


    @TransferRepresentationBuilder static var transferRepresentation: Self.Representation { get }


    }
    !5SBOTGFS3FQSFTFOUBUJPO#VJMEFS͸ίʔυతͳ
    ݟͨ໨ͳΫϦʔϯ͞Λҡ࣋ͭͭ͠ɺϏϧυதʹద੾ͳ
    ίʔυʹมܗ͍ͤͯ͞Δɻ
    ٕज़తʹ͸4XJGU"UUSJCVUFTΛ࢖༻͠൥ࡶͳίʔυ
    Λ୹͍ίʔυͱͯ͠දݱՄೳͱ͍ͯ͠Δɻ

    View Slide

  32. 5SBOTGFS3FQSFTFOUBUJPOΛͭҎ
    ্౉͚ͩ͢Ͱ࣮ݱՄೳɻ

    View Slide

  33. 5SBOTGFS3FQSFTFOUBUJPO
    సૹઌͰ࠶ݱՄೳͳσʔλܗࣜΛࢦఆ͢Δ
    w %BUB3FQSFTFOUBUJPO
    w 6OJGPSN5ZQF*EFOUJ
    fi
    FSTʹొ࿥͞Εͨ%BUBΛ౉͢
    w Ұํ޲ͱ૒ํ޲͕Մೳ
    w 'JMF3FQSFTFOUBUJPO
    w 6OJGPSN5ZQF*EFOUJ
    fi
    FSTʹొ࿥͞ΕͨϑΝΠϧͷ'JMF63-Λ౉͢
    w $PEBCMF3FQSFTFOUBUJPO
    w $PEBCMFϓϩτίϧʹରԠͨ͠ܗࣜΛ౉͢
    w 1SPYZ3FQSFTFOUBUJPO
    w ,FZ1BUIͰ౉͞ΕͨܗࣜΛ౉͢

    View Slide

  34. 5SBOTGFS3FQSFTFOUBUJPO
    సૹઌͰ࠶ݱՄೳͳσʔλܗࣜΛࢦఆ͢Δ
    w %BUB3FQSFTFOUBUJPO
    w 6OJGPSN5ZQF*EFOUJ
    fi
    FSTʹొ࿥͞Εͨ%BUBΛ౉͢
    w Ұํ޲ͱ૒ํ޲͕Մೳ
    w 'JMF3FQSFTFOUBUJPO
    w 6OJGPSN5ZQF*EFOUJ
    fi
    FSTʹొ࿥͞ΕͨϑΝΠϧͷ'JMF63-Λ౉͢
    w $PEBCMF3FQSFTFOUBUJPO
    w $PEBCMFϓϩτίϧʹରԠͨ͠ܗࣜΛ౉͢
    w 1SPYZ3FQSFTFOUBUJPO
    w ,FZ1BUIͰ౉͞ΕͨܗࣜΛ౉͢
    έʔεᶄ૒ํ޲
    %BUB3FQSFTFOUBUJPO DPOUFOU5ZQF
    ʜ

    έʔεᶃҰํ޲
    %BUB3FQSFTFOUBUJPO FYQPSUFE$POUF
    OU5ZQFʜ

    View Slide

  35. 5SBOTGFS3FQSFTFOUBUJPO
    సૹઌͰ࠶ݱՄೳͳσʔλܗࣜΛࢦఆ͢Δ
    w %BUB3FQSFTFOUBUJPO
    w 6OJGPSN5ZQF*EFOUJ
    fi
    FSTʹొ࿥͞Εͨ%BUBΛ౉͢
    w Ұํ޲ͱ૒ํ޲͕Մೳ
    w 'JMF3FQSFTFOUBUJPO
    w 6OJGPSN5ZQF*EFOUJ
    fi
    FSTʹొ࿥͞ΕͨϑΝΠϧͷ'JMF63-Λ౉͢
    w $PEBCMF3FQSFTFOUBUJPO
    w $PEBCMFϓϩτίϧʹରԠͨ͠ܗࣜΛ౉͢
    w 1SPYZ3FQSFTFOUBUJPO
    w ,FZ1BUIͰ౉͞ΕͨܗࣜΛ౉͢
    έʔεᶃڊେͳϑΝΠϧ
    FYө૾ϑΝΠϧɺFUD
    έʔεᶄߏ଄Խ͞ΕͨϑΝΠϧ
    ϑΝΠϧʹݟ͑Δ͕࣮ࡍ͸ϑΥ
    ϧμʹؚ·ΕΔෳ਺ͷϑΝΠϧ
    FYYDPEFͷϓϩδΣΫτϑΝΠ
    ϧ

    View Slide

  36. 5SBOTGFS3FQSFTFOUBUJPO
    సૹઌͰ࠶ݱՄೳͳσʔλܗࣜΛࢦఆ͢Δ
    w %BUB3FQSFTFOUBUJPO
    w 6OJGPSN5ZQF*EFOUJ
    fi
    FSTʹొ࿥͞Εͨ%BUBΛ౉͢
    w Ұํ޲ͱ૒ํ޲͕Մೳ
    w 'JMF3FQSFTFOUBUJPO
    w 6OJGPSN5ZQF*EFOUJ
    fi
    FSTʹొ࿥͞ΕͨϑΝΠϧͷ'JMF63-Λ౉͢
    w $PEBCMF3FQSFTFOUBUJPO
    w $PEBCMFϓϩτίϧʹରԠͨ͠ܗࣜΛ౉͢
    w 1SPYZ3FQSFTFOUBUJPO
    w ,FZ1BUIͰ౉͞ΕͨܗࣜΛ౉͢
    4XJGU6*ͷ*NBHFɺ
    4USJOHɺ*OUͳͲ

    View Slide

  37. 5SBOTGFS3FQSFTFOUBUJPO
    సૹઌͰ࠶ݱՄೳͳσʔλܗࣜΛࢦఆ͢Δ
    w %BUB3FQSFTFOUBUJPO
    w 6OJGPSN5ZQF*EFOUJ
    fi
    FSTʹొ࿥͞Εͨ%BUBΛ౉͢
    w Ұํ޲ͱ૒ํ޲͕Մೳ
    w 'JMF3FQSFTFOUBUJPO
    w 6OJGPSN5ZQF*EFOUJ
    fi
    FSTʹొ࿥͞ΕͨϑΝΠϧͷ'JMF63-Λ౉͢
    w $PEBCMF3FQSFTFOUBUJPO
    w $PEBCMFϓϩτίϧʹରԠͨ͠ܗࣜΛ౉͢
    w 1SPYZ3FQSFTFOUBUJPO
    w ,FZ1BUIͰ౉͞ΕͨܗࣜΛ౉͢
    5SBOTGFSBCMFʹରԠͨ͠
    ෦෼Λ౉͢͜ͱ͕Ͱ͖Δɻ

    View Slide

  38. 5SBOTGFS3FQSFTFOUBUJPO
    هड़ྫ
    struct SymbolDragItem: Transferable {


    let data: Data


    let image: Image


    let symbol: Symbol


    static var transferRepresentation: some TransferRepresentation {


    DataRepresentation(exportedContentType: .png) { combination in


    combination.data


    }


    ProxyRepresentation(exporting: \.image)


    ProxyRepresentation(exporting: \.symbol)


    }


    }

    View Slide

  39. 5SBOTGFS3FQSFTFOUBUJPO
    هड़ྫ
    struct SymbolDragItem: Transferable {


    let data: Data


    let image: Image


    let symbol: Symbol


    static var transferRepresentation: some TransferRepresentation {


    DataRepresentation(exportedContentType: .png) { combination in


    combination.data


    }


    ProxyRepresentation(exporting: \.image)


    ProxyRepresentation(exporting: \.symbol)


    }


    }
    όΠφϦσʔλ 1/(

    4XJGU6*ͷ*NBHF
    ಠࣗఆٛ

    View Slide

  40. 5SBOTGFSBCMFͷྫ

    View Slide

  41. 5SBOTGFSCMFͷαϯϓϧίʔυ
    IUUQTHJUIVCDPNOPUPSPJE
    4JNQMF4ZNCPM

    View Slide

  42. 5SBOTGFSCMFͷαϯϓϧ
    w υΩϡϝϯτΞϓϦ
    w ϓϨʔϯςΩετ͔ΒਤܗΛੜ੒
    w ਤܗΛϩϯάϓϨε͢Δͱυϥο
    άՄೳʹ
    w υϩοϓઌʹΑͬͯը૾ɺςΩετ
    Λίϐʔ
    w ผΞϓϦ%SPQ"QQʹυϩοϓՄೳ
    4JNQMF4ZNCPM

    View Slide

  43. 4JNQMF4ZNCPM
    υϥοάଆ
    document.symbol.view(


    width: proxy.size.width * 0.5,


    height: proxy.size.width * 0.5


    )


    .draggable(


    document.draggableItem()


    )

    View Slide

  44. 4JNQMF4ZNCPM
    υϥοάଆ$POUFOU7JFXTXJGU
    document.symbol.view(


    width: proxy.size.width * 0.5,


    height: proxy.size.width * 0.5


    )


    .draggable(


    document.draggableItem()


    )
    5SBOTGFSBCMFରԠߏ଄ମ

    View Slide

  45. 4JNQMF4ZNCPM
    υϥοάଆ$POUFOU7JFXTXJGU
    document.symbol.view(


    width: proxy.size.width * 0.5,


    height: proxy.size.width * 0.5


    )


    .draggable(


    document.draggableItem()


    )
    5SBOTGFSBCMFରԠߏ଄ମ

    View Slide

  46. 4JNQMF4ZNCPM
    υϥοάΦϒδΣΫτͷੜ੒4JNQMF4ZNCPM%PDVNFOUTXJGU
    @MainActor func draggableItem() -> SymbolDragItem {


    return SymbolDragItem(


    data: temporaryData!,


    image: symbolImage(),


    symbol: symbol)


    }



    @MainActor func symbolImage() -> Image {


    Image( uiImage: UIImage(data: temporaryData!)! )


    }

    View Slide

  47. 4JNQMF4ZNCPM
    5SBOTGFSBCMFϓϩτίϧʹରԠͨ͠ߏ଄ମ4JNQMF4ZNCPM%PDVNFOUTXJGU
    struct SymbolDragItem: Transferable {


    let data: Data


    let image: Image


    let symbol: Symbol


    static var transferRepresentation: some TransferRepresentation {


    DataRepresentation(exportedContentType: .png) { combination in


    combination.data


    }


    ProxyRepresentation(exporting: \.image)


    ProxyRepresentation(exporting: \.symbol)


    }


    }

    View Slide

  48. 4JNQMF4ZNCPM
    υϩοϓଆ$POUFOU7JFXTXJGU
    RoundedRectangle(cornerSize: .init(width: 10, height: 10))


    .fill(Color.gray)


    .overlay {


    dropImage


    .resizable()


    .frame(width: proxy.size.height * 0.05,


    height: proxy.size.height * 0.05)


    }


    .frame(width: proxy.size.width * 0.4, height: proxy.size.height * 0.1 )


    .dropDestination(for: Image.self) { images, location in


    dropImage = images.first!


    return true


    }
    ड͚औͬͨ*NBHFΛඳը༻ม਺ʹड͚౉͠

    View Slide

  49. αϯϓϧίʔυͷ໰୊఺

    View Slide

  50. αϯϓϧίʔυͷ໰୊఺
    7JFXΛඳը͢Δ*NBHF3FOEFSFSͷ࢖͍উख͕ສೳͰ͸ͳ͍
    w*NBHF3FOEFSFS
    w4XJGU6*ͷ7JFX͔Βը૾Λੜ੒͢ΔͨΊͷػೳ J04ʙ

    wϝΠϯεϨου͔Βݺͼग़͕͠ඞཁ
    wΞϓϦ͕όοΫάϥϯυʹೖͬͨࡍʹඳը͕ແޮԽ͞ΕΔ৔߹͕͋
    Δ
    *NBHF3FOEFSͰඳըػೳΛ୅ସ͢Δͷ͸ແཧ͕͋Δ

    View Slide

  51. ·ͱΊ

    View Slide

  52. ·ͱΊ
    w 4XJGU6*ͰͷυΩϡϝϯτΞϓϦपΓ͕ڧԽ͞Ε·ͨ͠ɻ೥ʹݟ͍͑ͯ
    ͨ՝୊ͷ͏ͪɺ%SBH%SPQʹ͍ͭͯ͸ղফ͞Ε·ͨ͠
    w %SBH%SPQʹݶΒͣΞϓϦؒɺ04ΞϓϦؒͰͷσʔλ΍ΓऔΓʹؔͯ͠
    5SBOTGFSBCMFϓϩτίϧ͕༻ҙ͞Ε·ͨ͠
    w ΞϓϦͷ%SBH%SPQͷ࣮૷͕؆୯ʹͳͬͨͷͰ৭ʑࢼߦࡨޡͰ͖ͯ໘ന͍Ͱ
    ͢ɻ

    View Slide

  53. J045FDI#MPHߋ৽த
    w4XJDU6*Λ࢖ͬͯ̍̌̌ߦͰαϯϓϧίʔυΛॻ͘
    4XJGUߦγϦʔζଞ"QQMF։ൃؔ܎ͷهࣄΛܝࡌத
    Ͱ͢ɻ
    JSJNBTVDPN
    OPUFDPNOPUPSPJE
    wʹ΋هࡌதͰ͢ɻ

    View Slide

  54. ࢀߟ
    w 8IBUTOFXJO4XJGU6*88%$7JEFPT"QQMF%FWFMPQFS
    w IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED
    w .FFU5SBOTGFSBCMF88%$7JEFPT"QQMF%FWFMPQFS
    w IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED
    w /PXJO3&"-*5:5FDIJ04ͷ৽ػೳʮ*NBHF3FOEFSFSʯͰ4XJGU6*ͷ7JFXΛ؆୯ʹը૾ʹॻ͖ग़͢ʛ3&"-*5:ʛOPUF
    w IUUQTOPUFDPNSFBMJUZ@FOHOO
    w <ϓϨθϯࢿྉ>ϚϧνϓϥοτϑΥʔϜ 4XJGU6*
    υΩϡϝϯτΞϓϦ
    w IUUQTJSJNBTVDPNBQQMFNVMUJQMBUGPSNEPDVNFOUBQQTVNNBSZ
    w <ϓϨθϯࢿྉ> "QQMF͕
    ΍Γ͍ͨ์୊4XJGU"UUSJCVUFT
    w IUUQTJSJNBTVDPNBQQMFTXJGUBUUSJCVUFT

    View Slide