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

我々のRealmはどこからやってくるのか

 我々のRealmはどこからやってくるのか

DIについての自由研究内容を発表しました。

Tomohiro Nishimura

March 26, 2017
Tweet

More Decks by Tomohiro Nishimura

Other Decks in Programming

Transcript

  1. զʑ ओޠ͕େ͖͍
    ͷ
    3FBMN͸Ͳ͔͜Β΍ͬ
    ͯ͘Δͷ͔
    3FBMN8PSME5PVS0TBLB
    JE4JYFJHIU

    View full-size slide

  2. ࣗݾ঺հ
    w JE4JYFJHIU !UPNPIJ@SP
    ੢ଜ༑༟
    w גࣜձࣾ͸ͯͳΞϓϦέʔγϣϯΤϯδχΞ
    w ೥݄த్ೖࣾ
    w ฏ೔͸ຖ೔ʮ೔هʯΛॻ͍͍ͯ·͢
    w IUUQTJYFJHIUIBUFOBCMPHDPN

    View full-size slide

  3. ͸ͯͳͰԿΛ΍͖͔ͬͯͨ
    αʔϏεએ఻ίʔφʔ

    w .BDLFSFM
    w IUUQTNBDLFSFMJP
    w ΧΫϤϜ "1*ɺΞϓϦ

    w IUUQTLBLVZPNVKQ
    w ͸ͯͳϒϩά ΞϓϦ

    w IUUQIBUFOBCMPHDPNHVJEFBQQ
    w ͸ͯͳϒοΫϚʔΫ ΞϓϦ

    w IUUQCIBUFOBOFKQHVJEFBQQ

    View full-size slide

  4. ͓அΓ
    w 4XJGUͱ+BWB͕ೖΓཚΕ·͢
    w J04"OESPJEܦݧऀͷํʹ఻ΘΓ͍ͨͱ͍͏ؾ࣋ͪ
    w ଞͷϓϥοτϑΥʔϜͷํ͝ΊΜͳ͍͞
    w ͱ͍͍ͭͭ΋4XJGUଟΊͰ͢
    w ίʔυΛͤ·͍εϥΠυʹ͓͞ΊΔʹ͸ɺදݱྗͷ๛
    ͔ͳ4XJGU͕༗ར

    View full-size slide

  5. 3FBMN͸
    Ͳ͔͜Β΍ͬͯ͘Δͷ͔

    View full-size slide

  6. 3FBMNΠϯελϯε͸
    Ͳ͔͜Β΍ͬͯ͘Δͷ͔

    View full-size slide

  7. ૉ๿ͳํ๏
    let realm = try! Realm()
    Realm realm = Realm.getDefaultInstance();
    4XJGU
    +BWB

    View full-size slide

  8. ΋͏ͪΐͬͱෳࡶͳྫ
    let configuration = Realm.Configuration(fileURL: url)
    let realm = try! Realm(configuration: configuration)
    RealmConfiguration configuration =

    new RealmConfiguration.Builder()

    .name("data")

    .build();
    Realm realm = Realm.getInstance(configuration);
    4XJGU
    +BWB

    View full-size slide

  9. Ұൠతͳ$POpHVSBUJPO
    RealmConfiguration config =
    new RealmConfiguration.Builder()

    .name("myrealm.realm")

    .encryptionKey(getKey())

    .schemaVersion(42)

    .modules(new MySchemaModule())

    .migration(new MyMigration())

    .build();


    Realm realm = Realm.getInstance(config);
    +BWB

    View full-size slide

  10. ઃఆͷΠϯελϯε͸Ͳ͜ʹ
    ࣋ͭͷ͕ྑ͍ͷͩΖ͏͔

    View full-size slide

  11. ྫ͑͹4JOHMFUPO
    class Locator {
    private static let instance = Locator()
    public var realmConfiguration: Realm.Configuration {
    var configuration = Realm.Configuration()
    configuration.fileURL = configuration.fileURL!
    .deletingLastPathComponent()
    .appendingPathComponent("main.realm")
    return configuration
    }
    }
    4XJGU

    View full-size slide

  12. ઃఆΛ࡞Βͳͯ͘Α͘ͳͬͨ
    let configuration = Locator.instance.realmConfiguration
    let realm = try! Realm(configuration: configuration)
    RealmConfiguration configuration =
    Locator.getInstance().getRealmConfig();
    Realm realm = Realm.getInstance(configuration);
    4XJGU
    +BWB

    View full-size slide

  13. 3FBMN΋ఏڙͯ͠͠·͏
    class Locator {
    static let instance = Locator()
    public var realmConfiguration: Realm.Configuration {
    return // Realm.ConfigurationΛ࡞Δ
    }
    public var realm: Realm {
    return try! Realm(configuration: realmConfiguration)
    }
    }
    4XJGU

    View full-size slide

  14. ͔ͳΓ୯७ԽͰ͖ͨ
    let realm = Locator.instance.realm
    4XJGU
    +BWB
    Realm realm = Locator.getInstance().getRealm();

    View full-size slide

  15. <࠶ܝ>-PDBUPS
    class Locator {
    static let instance = Locator()
    public var realmConfiguration: Realm.Configuration {
    return // Realm.ConfigurationΛ࡞Δ
    }
    public var realm: Realm {
    return try! Realm(configuration: realmConfiguration)
    }
    }
    4XJGU

    View full-size slide

  16. ߽՚ͳ-PDBUPS
    public class Locator {
    // ɾɾɾུɾɾɾ
    public RealmConfiguration getRealmConfiguration() { … }
    public Realm getRealm() { … }
    public APIClient getApiClient() { … }
    public Tracker getTracker() { … }
    public UserRepository getUserRepository() { … }
    public FriendRepository getFriendRepository() { … }
    public ItemRepository getItemRepository() { … }
    }
    +BWB

    View full-size slide

  17. ͳΜͰ΋͘ΕΔ܅

    View full-size slide

  18. 4FSWJDF
    -PDBUPS
    1BUUFSO

    View full-size slide

  19. 4FSWJDF-PDBUPS
    w ͋ΔίϯϙʔωϯτΛ࢖͏ͷʹผͷෳ਺ͷί
    ϯϙʔωϯτ͕ඞཁͳ৔߹
    "
    #
    $

    View full-size slide

  20. 4FSWJDF-PDBUPS
    w ͋Δίϯϙʔωϯτ͸ඞཁͳίϯϙʔωϯτ
    Λ୳ͯ͘͠ΕΔԿ͔͚ͩ஌͍ͬͯΕ͹Α͍ͱ
    ͍͏͜ͱʹ͢Δ
    "
    #
    $
    4-

    View full-size slide

  21. ඞཁͳίϯϙʔωϯτΛ
    ୳ͯ͠ ࡞ͬͯ
    ͘ΕΔ
    Կ͔Λ༻ҙ͢Δ

    View full-size slide

  22. 4FSWJDF
    -PDBUPS
    1BUUFSO

    View full-size slide

  23. ͱ͜ΖͰςετ͍ͨ͠
    w ͨͱ͑͹"1*͔Β+40/Λऔಘͯ͠ɺ3FBMN
    ʹਖ਼͘͠อଘ͞ΕΔ͔Λ֬ೝ͍ͨ͠

    View full-size slide

  24. 3FQPTJUPSZͷྫ
    class UserRepository {
    private let realm = Locator.instance.realm
    private let apiClient = Locator.instance.apiClient
    func load(byID id: String, callback: (User) -> Void) {
    // APIݺͼग़͠
    }
    private func save(json: [AnyHashable: Any]) {
    // Realmʹอଘ
    }
    }
    4XJGU

    View full-size slide

  25. ࠔΓͦ͏
    w ςετͰ͚ͩJONFNPSZͷ3FBMNΛ࢖
    ͍ͨ͘ͳͬͨΒʁ
    w "1*ݺͼग़͠Λελϒͨ͘͠ͳͬͨΒʁ

    View full-size slide

  26. <࠶ܝ>3FQPTJUPSZͷྫ
    class UserRepository {
    private let realm = Locator.instance.realm
    private let apiClient = Locator.instance.apiClient
    func load(byID id: String, callback: (User) -> Void) {
    // APIݺͼग़͠
    }
    private func save(json: [AnyHashable: Any]) {
    // Realmʹอଘ
    }
    }
    4XJGU

    View full-size slide

  27. -PDBUPSΛίϯετϥΫλʹ
    ౉ͤΔΑ͏ʹ͢Δ
    public class UserRepository {

    private final Realm realm;

    private final APIClient apiClient;


    public UserRepository(Locator locator) {

    realm = locator.getRealm();

    apiClient = locator.getApiClient();

    }

    }
    +BWB

    View full-size slide

  28. -PDBUPSΛࠩ͠ସ͑ΒΕΔΑ
    ͏ʹΠϯλʔϑΣʔεʹ͢Δ
    interface ILocator {

    RealmConfiguration getRealmConfiguration();

    Realm getRealm();

    APIClient getApiClient();

    Tracker getTracker();


    UserRepository getUserRepository();

    FriendRepository getFriendRepository();

    ItemRepository getItemRepository();

    }
    +BWB

    View full-size slide

  29. *-PDBUPSΛίϯετϥΫλʹ
    ౉ͤΔΑ͏ʹ͢Δ
    public class UserRepository {

    private final Realm realm;

    private final APIClient apiClient;


    public UserRepository(ILocator locator) {

    realm = locator.getRealm();

    apiClient = locator.getApiClient();

    }

    }
    +BWB

    View full-size slide

  30. .PDL-PDBUPSΛ࡞Δ
    public class MockLocator implements ILocator {

    @Override

    public RealmConfiguration getRealmConfiguration() {
    return // in-memory Configuration
    }


    @Override

    public Realm getRealm() {
    return Realm.getInstance(realmConfiguration());
    }


    @Override

    public APIClient getApiClient() {
    return // MockApiClient
    }


    @Override public Tracker getTracker() { … }

    @Override public UserRepository getUserRepository() { … }

    @Override public FriendRepository getFriendRepository() { … }

    @Override public ItemRepository getItemRepository() { … }

    }
    +BWB

    View full-size slide

  31. ςετͷ༷ࢠ
    let locator = MockLocator()
    let repository = UserRepository(locator)
    4XJGU
    +BWB
    Locator locator = new MockLocator();

    UserRepository repository =

    new UserRepository(locator);

    View full-size slide

  32. ΍ͬͨ͜ͱ
    w 3FQPTJUPSZ͕ίϯετϥΫλͰ4FSWJDF
    -PDBUPSΛड͚औΕΔΑ͏ʹͨ͠
    w 4FSWJDF-PDBUPSͷΠϯλʔϑΣʔεΛ༻
    ҙͯࠩ͠͠ସ͑ΒΕΔΑ͏ʹͨ͠

    View full-size slide

  33. ͜͏ͩͬͨͷ͕
    class UserRepository {
    private let realm: Realm
    private let apiClient: APIClient
    init() {
    realm = Locator.instance.realm
    apiClient = Locator.instance.apiClient
    }
    }
    4XJGU

    View full-size slide

  34. ͜͏ͳΓ·ͨ͠
    class UserRepository {
    private let realm: Realm
    private let apiClient: APIClient
    init(locator: LocatorProtocol) {
    realm = locator.realm
    apiClient = locator.apiClient
    }
    }
    4XJGU

    View full-size slide

  35. <࠶ܝ>.PDL-PDBUPSΛ࡞Δ
    public class MockLocator implements ILocator {

    @Override

    public RealmConfiguration getRealmConfiguration() {
    return // in-memory Configuration
    }


    @Override

    public Realm getRealm() {
    return Realm.getInstance(realmConfiguration());
    }


    @Override

    public APIClient getApiClient() {
    return // MockApiClient
    }


    @Override public Tracker getTracker() { … }

    @Override public UserRepository getUserRepository() { … }

    @Override public FriendRepository getFriendRepository() { … }

    @Override public ItemRepository getItemRepository() { … }

    }
    +BWB

    View full-size slide

  36. ྫྷ੩ʹߟ͑Δͱʜ
    w ςετ༻ͷ3FBMNͱ"1*$MJFOU͕ཉ͍ͩ͠
    ͚ͩͬͨ
    w 4FSWJDF-PDBUPSͷΠϯλʔϑΣʔεʹै
    ͏ͨΊʹͳΜͰ͜ΜͳʹେྔʹίʔυΛॻ͔
    ͳ͍ͱ͍͚ͳ͍ͷ͔

    View full-size slide

  37. զʑ͕ཉ͔ͬͨ͠΋ͷ
    protocol UserRepositoryDependency {
    var realmConfiguration: Realm.Configuration { get }
    var realm: Realm { get }
    var apiClient: APIClient { get }
    }
    4XJGU

    View full-size slide

  38. ͦ΋ͦ΋3FQPTJUPSZ͕͜ͷ
    ΠϯλʔϑΣʔεΛड͚औΕ
    ͹ྑ͔ͬͨͷͰ͸ͳ͍͔

    View full-size slide

  39. ͜͏͍͏ײ͡
    class UserRepository {
    private let realm: Realm
    private let apiClient: APIClient
    init(dependency: UserRepositoryDependency) {
    realm = dependency.realm
    apiClient = dependency.apiClient
    }
    }
    4XJGU

    View full-size slide

  40. Α͘ͳͬͨ.PDL-PDBUPS
    class MockLocator: UserRepositoryDependency {
    var realmConfiguration: Realm.Configuration {
    return .Configuration(inMemoryIdentifier: "test")
    }
    var realm: Realm {
    return try! Realm(configuration: realmConfiguration)
    }
    var apiClient: APIClientProtocol {
    return new MockApiClient();
    }
    }
    4XJGU

    View full-size slide

  41. 4FSWJDF-PDBUPS͸͜ͷΠϯ
    λʔϑΣʔεl΋z࣮૷͢Δ
    class Locator: LocatorProtocol, UserRepositoryDependency
    {
    var realmConfiguration: Realm.Configuration { … }
    var realm: Realm { … }
    var apiClient: APIClient { … }
    var tracker: Tracker { … }
    var userRepository: UserRepository { … }
    var friendRepository: FriendRepository { … }
    var itemRepository: ItemRepository { … }
    }
    4XJGU

    View full-size slide

  42. ࠷ॳͷґଘؔ܎
    6TFS3FQPTJUPSZ
    -PDBUPS

    View full-size slide

  43. ΠϯλʔϑΣʔεΛಋೖͨ͋͠
    ͱͷґଘؔ܎
    6TFS3FQPTJUPSZ
    *-PDBUPS -PDBUPS

    View full-size slide

  44. ৽͍͠ґଘؔ܎
    6TFS3FQPTJUPSZ
    -PDBUPS
    6TFS3FTQPTJUPSZ%
    FQFOEFODZ

    View full-size slide

  45. ґଘؔ܎͕ٯసͨ͠

    View full-size slide

  46. %FQFOEFODZ
    *OWFSTJPO
    1SJODJQMF

    View full-size slide

  47. ґଘੑٯసͷݪଇ %*1

    View full-size slide

  48. ґଘੑٯసͷݪଇ %*1

    w ্ҐͷϞδϡʔϧ͸ԼҐͷϞδϡʔϧʹґଘ
    ͯ͠͸ͳΒͳ͍ɻͲͪΒͷϞδϡʔϧ΋ʮந
    ৅ʯʹґଘ͢΂͖Ͱ͋Δɻ
    w ʮந৅ʯ͸࣮૷ͷৄࡉʹґଘͯ͠͸ͳΒͳ͍ɻ
    ࣮૷ͷৄࡉ͕ʮந৅ʯʹґଘ͢΂͖Ͱ͋Δɻ

    View full-size slide

  49. ࠷ॳͷґଘؔ܎
    6TFS3FQPTJUPSZ
    -PDBUPS

    View full-size slide

  50. %*1 Ұ෦
    Λద༻ͨ͠ґଘؔ܎
    6TFS3FQPTJUPSZ
    *-PDBUPS -PDBUPS

    View full-size slide

  51. %*1Λద༻ͨ͋͠ͱͷґଘؔ܎
    6TFS3FQPTJUPSZ
    -PDBUPS
    6TFS3FTQPTJUPSZ%
    FQFOEFODZ

    View full-size slide

  52. ґଘੑٯసͷݪଇ %*1

    View full-size slide

  53. ͱ͜ΖͰίϯετϥΫλΛ࢖
    ͑ͳ͍৔߹͸Ͳ͏͢Ε͹

    View full-size slide

  54. ΞϓϦ։ൃͰίϯετϥΫλ͕
    ࢖͍ʹ͍͘ͱ͜Ζ
    w J04
    w 7JFX$POUSPMMFS
    w "OESPJE
    w "DUJWJUZ
    w 'SBHNFOU

    View full-size slide

  55. ߟ͑ΒΕΔํ๏
    w ϓϩύςΟʹ୅ೖ͢Δ
    w ηολʔΛ༻ҙ͢Δ
    w ॳظԽϝιουΛ༻ҙ͢Δ

    View full-size slide

  56. 7JFX$POUSPMMFSͩͱ͜͏͍
    ͏͜ͱΛ͠·͢ΑͶ
    override func prepare(for segue: …) {
    if let vc = segue.destination as? NextViewController {
    vc.locator = Locator.instance
    }
    }
    4XJGU

    View full-size slide

  57. ܽ఺
    w มߋ͢΂͖Ͱͳ͍ϓϩύςΟΛ͖ͪΜͱӅṭ
    Ͱ͖ͳ͍
    w ঢ়ଶ͕มΘΔ͔΋͠Εͳ͍ΦϒδΣΫτͱͷ
    ΍ΓͱΓ͸ۤ௧͕൐͏

    View full-size slide

  58. ΋͏Ұ౓࠷ॳͷ໰͍ʹ໭Δ

    View full-size slide

  59. 3FBMNΠϯελϯε͸
    Ͳ͔͜Β΍ͬͯ͘Δͷ͔

    View full-size slide

  60. 3FBMNΠϯελϯε͸
    4FSWJDF-PDBUPS
    ͔Β΍ͬͯ͘Δ

    View full-size slide

  61. 7JFX$POUSPMMFS͸
    4FSWJDF-PDBUPSʹ
    ґଘ͍ͯ͠Δ

    View full-size slide

  62. ͜ͷґଘΛͲ͏΍ͬͯղܾ͢
    Ε͹͍͍ͷ͔

    View full-size slide

  63. %FQFOEFODZ
    *OKFDUJPO
    1BUUFSO

    View full-size slide

  64. https://www.martinfowler.com/articles/injection.html

    View full-size slide

  65. http://kakutani.com/trans/fowler/injection.html

    View full-size slide

  66. ґଘΦϒδΣΫτ஫ೖ
    ґଘੑ஫ೖ

    View full-size slide

  67. 7JFX$POUSPMMFS͸
    4FSWJDF-PDBUPSʹ
    ґଘ͍ͯ͠Δ

    View full-size slide

  68. "͸#ʹґଘ͍ͯ͠Δ

    View full-size slide

  69. #͸"ͷ
    ґଘ ΦϒδΣΫτ
    Ͱ͋Δ

    View full-size slide

  70. ґଘΦϒδΣΫτ

    %FQFOEFODZ

    View full-size slide

  71. %FQFOEFODZ ґଘΦϒδΣΫτ

    *OKFDUJPO ஫ೖ

    View full-size slide

  72. ґଘΦϒδΣΫτΛ
    ඞཁͱ͍ͯ͠Δ
    ίϯϙʔωϯτʹ౉͢

    View full-size slide

  73. Ώ͔͍ͳ஥ؒͨͪ
    w $POTUSVDUPS*OKFDUJPO
    w 1SPQFSUZ 4FUUFS
    *OKFDUJPO
    w *OUFSGBDF*OKFDUJPO
    w .FUIPE*OKFDUJPO
    w BOENPSFʜ

    View full-size slide

  74. ͳΜ͔΍΍ͦ͜͠͏

    View full-size slide

  75. ͖ͬ͞΍Γ·ͨ͠ΑͶ

    View full-size slide

  76. $POTUSVDUPS*OKFDUJPO
    let locator = Locator.instance
    let repository = UserRepository(locator: locator)
    4XJGU
    +BWB
    Locator locator = Locator.getInstance();

    Repository repository = new UserRepository(locator);

    View full-size slide

  77. 1SPQFSUZ*OKFDUJPO
    override func prepare(for segue: …) {
    if let vc = segue.destination as? NextViewController {
    vc.locator = Locator.instance
    }
    }
    4XJGU

    View full-size slide

  78. ʮґଘΦϒδΣΫτΛ
    ඞཁͱ͍ͯ͠Δ
    ίϯϙʔωϯτʹ౉͢ʯ
    ͜ͱʹ໊લΛ෇͚͚ͨͩ

    View full-size slide

  79. l%FQFOEFODZ*OKFDUJPOJTB
    EPMMBSUFSNGPSBDFOUDPODFQUz
    http://www.jamesshore.com/Blog/Dependency-
    Injection-Demystified.html
    - James Shore

    View full-size slide

  80. %FQFOEFODZ ґଘΦϒδΣΫτ

    *OKFDUJPO ஫ೖ

    View full-size slide

  81. 1SPQFSUZ*OKFDUJPOΛ
    ফ͍ͨ͠
    w ܽ఺
    w มߋ͢΂͖Ͱͳ͍ϓϩύςΟΛ͖ͪΜͱӅ
    ṭͰ͖ͳ͍
    w ঢ়ଶ͕มΘΔ͔΋͠Εͳ͍ΦϒδΣΫτͱ
    ͷ΍ΓͱΓ͸ۤ௧͕൐͏

    View full-size slide

  82. ࠓճͷ࡞ઓ
    w 1SPUPDPM&YUFOTJPO J04

    w %*'SBNFXPSL
    w %BHHFS̉ "OESPJE

    w J04΋σϑΝΫτελϯμʔυ΄͍͠

    View full-size slide

  83. 1SPUPDPM&YUFOTJPO J04

    w *OUFSGBDFͷσϑΥϧτ࣮૷Λ࢖ͬͯɺͦΕ
    Λ࣮૷͢ΔίϯϙʔωϯτʹґଘΦϒδΣΫ
    τΛ஫ೖ͢Δ
    w σϑΥϧτϝιου͸+BWB͔ΒͳͷͰ
    "OESPJEͰ͸Ͱ͖ͳ͍

    View full-size slide

  84. 1SPUPDPM&YUFOTJPO
    protocol WithLocator {
    var locator: LocatorProtocol { get }
    }
    extension WithLocator {
    var locator: LocatorProtocol {
    return Locator.instance
    }
    }
    4XJGU

    View full-size slide

  85. 1SPUPDPM&YUFOTJPO
    class RootViewController: UIViewController, WithLocator {
    override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    // ຊ౰͸ userRepository ࢖͑͹ྑͦ͞͏Ͱ͢Ͷ
    locator.apiClient.fetchUser(byID: “xxxx”) { [weak self] result in
    try! locator.realm.write {
    self?.locator.realm.add(User(json: result.json))
    }
    }
    }
    }
    4XJGU

    View full-size slide

  86. ิ଍
    w 4FSWJDF-PDBUPS͡Όͳͯ͘ґଘΦϒδΣ
    ΫτΛ௚઀஫ೖͯ͠΋Α͍
    w ґଘΛऔಘ͢ΔϓϩύςΟ͕ಥવੜ͑ΔͷͰ
    ίʔυ͕௥͍ʹ͘͘ͳΔ

    View full-size slide

  87. https://speakerdeck.com/yashigani/dependency-
    injection-in-ios-apps

    View full-size slide

  88. %BHHFS̉ "OESPJE

    w (PPHMF੍ͷ%*'SBNFXPSL
    w $PNQPOFOU͕ґଘπϦʔͷ؅ཧ
    w .PEVMF͕ґଘͷڙڅ 4FSWJDF-PDBUPS

    w ͱ͖ͬͭʹ͍͕֮͑͘Δͱґଘ؅ཧ͕ͱͯ΋
    ָʹͳΔ

    View full-size slide

  89. "DUJWJUZʹ*OKFDU͢Δ༷ࢠ
    public class MainActivity extends AppCompatActivity {

    @Inject

    Locator mLocator;


    @Override

    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);


    ((App) getApplicationContext())

    .getApplicationComponent()

    .newActivityComponentBuilder()

    .activity(this)

    .build()

    .inject(this);

    }

    }
    +BWB

    View full-size slide

  90. ґଘ͕ଟ͍ͱ
    public class MainActivity extends AppCompatActivity {

    @Inject

    Locator mLocator;


    @Inject

    Realm mRealm;


    @Inject

    ApiClient mApiClient;


    @Inject

    UserRepository mUserRepository;


    @Inject

    FriendRepository mFriendRepository;

    }
    +BWB

    View full-size slide

  91. ิ଍
    w ґଘΛϑϨʔϜϫʔΫʹ؅ཧͯ͠΋Β͑Δͱ
    ָ
    w 1SPWJEF3FBMNΛJOKFDUͯ͠ผεϨου
    Ͱ࢖͏ͳͲ΋؆୯
    w %*΁ͷཧղ͕ඞཁͰɺϑϨʔϜϫʔΫࣗମ΋
    ෳࡶͳͷͰɺಋೖ࣌ͷϋʔυϧ͸ߴ͍

    View full-size slide

  92. ;Γ͔͑Γ
    w 4FSWJDF-PDBUPSΛ࢖ͬͯؾʹ͢Δ΂͖૬
    खΛݶఆ͢Δज़ʹ͍ͭͯ࿩͠·ͨ͠
    w *P$%*1ʹ͍ͭͯগ͠৮Ε·ͨ͠
    w %*ʹ͍ͭͯ࿩͠·ͨ͠
    w ࣮ࡍͷ%*ͷద༻ྫʹ͍ͭͯ࿩͠·ͨ͠

    View full-size slide

  93. 3FBMN͸
    Ͳ͔͜Β΍ͬͯ͘Δͷ͔

    View full-size slide

  94. 3FBMN͸
    %*ʹΑͬͯ

    ֎͔Β΍͖ͬͯ·͢

    View full-size slide

  95. ͝੩ௌ͋Γ͕ͱ͏
    ͍͟͝·ͨ͠

    View full-size slide