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

オフライン編集もできる複雑なデータ構造を端末間で同期するために / Offline editor and online data sync for complex structures

cc4966
September 19, 2021

オフライン編集もできる複雑なデータ構造を端末間で同期するために / Offline editor and online data sync for complex structures

iOSDC Japan 2021の発表資料です。
2021/09/19 14:50〜 Track D レギュラートーク(40分)
https://fortee.jp/iosdc-japan-2021/proposal/de41bc2f-f910-46ee-be0d-1d7dedb89649

皆さんも開発をしていて端末間のデータ同期システムが必要になったことはありませんか。
この発表ではオフライン編集可能なテキストエディタのバックエンドとして作った、テキストファイル同期システムの設計やその構成、開発環境についてお話しします。
同期システムはiOS / Android / WebだけではなくWindowsなどのデスクトップOSへの展開も見据え、iCloudに依らない実装が必要でした。また作成するアプリの特性上、同期の仕組みをユーザーに十分説明できるように同期の仕組みを全て実装することにしました。

- サーバー構成と開発環境(今回はAzure Functionsを中心に設計したのでその話)
- 採用したシステムとFirestoreを使った場合の比較
- 複雑な系において、アプリのCIにもDockerなどでサーバーを立てるメリット
- オフライン編集を前提とした同期のためのデータベース設計のコツ(ローカル・サーバー両方)
- iOSのファイルアプリに同期対象のファイルを露出させる方法などプラットフォーム固有の話

cc4966

September 19, 2021
Tweet

More Decks by cc4966

Other Decks in Programming

Transcript

  1. SPLVSPLV!@
    ΦϑϥΠϯฤू΋Ͱ͖Δෳࡶͳσʔ
    λߏ଄Λ୺຤ؒͰಉظ͢ΔͨΊʹ
    J04%$+BQBOEBZʙ
    5SBDL%ϨΪϡϥʔτʔΫʢ෼ʣ

    View full-size slide

  2. ࣗݾ঺հ
    SPLVSPLV
    w SPLVSPLV 5XJUUFS!@

    w ීஈ΍ͬͯΔ͜ͱ
    w "1*΍%#ઃܭɾ࣮૷
    w J04"OESPJEΞϓϦ։ൃ
    w Ϩίϝϯυ΍σʔλ෼ੳ
    w झຯͰ5"5&EJUPSͱ͍͏ॎॻ͖ͷςΩετΤσΟλΛ։ൃͯ͠Δ

    View full-size slide

  3. ΦϑϥΠϯฤू΋Ͱ͖Δෳࡶͳ
    σʔλߏ଄Λ୺຤ؒͰಉظ͢ΔͨΊʹ

    View full-size slide

  4. എܠ
    ΦϑϥΠϯฤू΋Ͱ͖Δෳࡶͳσʔλߏ଄Λ୺຤ؒͰಉظ͢ΔͨΊʹ
    w എܠ
    w झຯͰॎॻ͖ͷςΩετΤσΟλΛ։ൃ
    w J04"OESPJE 8JOEPXT NBD04 6CVOUVͰఏڙ
    w খઆͳͲͷࣥචʹ࢖ΘΕΔ͜ͱ͕ଟ͍
    w ύιίϯͱεϚϗ྆ํͰॻ͍͍ͯΔਓ΋ଟ͍

    View full-size slide

  5. എܠ
    ΦϑϥΠϯฤू΋Ͱ͖Δෳࡶͳσʔλߏ଄Λ୺຤ؒͰಉظ͢ΔͨΊʹ
    w ςΩετΛύιίϯ͔Β΋εϚϗ͔Β΋ฤू͍ͨ͠

    View full-size slide

  6. എܠ
    ΦϑϥΠϯฤू΋Ͱ͖Δෳࡶͳσʔλߏ଄Λ୺຤ؒͰಉظ͢ΔͨΊʹ
    w ςΩετΛύιίϯ͔Β΋εϚϗ͔Β΋ฤू͍ͨ͠
    w ࣗવͱ୺຤ؒͰσʔλΛಉظ͍ͨ͠ͱ͍͏Ϟνϕʔγϣϯ͕ੜ·ΕΔ

    View full-size slide

  7. എܠ
    ΦϑϥΠϯฤू΋Ͱ͖Δෳࡶͳσʔλߏ଄Λ୺຤ؒͰಉظ͢ΔͨΊʹ
    w ςΩετΛύιίϯ͔Β΋εϚϗ͔Β΋ฤू͍ͨ͠
    w ࣗવͱ୺຤ؒͰσʔλΛಉظ͍ͨ͠ͱ͍͏Ϟνϕʔγϣϯ͕ੜ·ΕΔ
    w ͨͩ͠࡞ۀ͸Πϯλʔωοτ؀ڥͷͳ͍৔ॴͰൃੜ͢Δ͜ͱ͕͋Δ

    View full-size slide

  8. ΦϑϥΠϯฤूʹ΋ରԠͨ͠

    ಉظػೳΛఏڙ͠Α͏

    View full-size slide

  9. J04൛ΛϦϦʔε͠·ͨ͠
    ʢʣ

    View full-size slide

  10. ΦϑϥΠϯฤू΋Ͱ͖Δෳࡶͳ
    σʔλߏ଄Λ୺຤ؒͰಉظ͢ΔͨΊʹ

    View full-size slide

  11. Ξ΢τϥΠϯ
    ΦϑϥΠϯฤू΋Ͱ͖Δෳࡶͳσʔλߏ଄Λ୺຤ؒͰಉظ͢ΔͨΊʹ
    ಉظγεςϜΛ༻ҙ͢ΔʢͱΓ͏Δબ୒ࢶ͸ʁʣ
    ΦϑϥΠϯฤूΛڐ༰͢ΔʢԿ͕ى͖Δͷ͔ʁʣ
    ίϯϑϦΫτΛղফ͢ΔʢͲ͏͢Ε͹͍͍ͷʁʣ
    ΦϑϥΠϯฤू΋Ͱ͖Δෳࡶͳσʔλߏ଄Λ୺຤ؒͰಉظ͢Δ
    5*14ʢαʔόʔߏ੒΍'JSFTUPSFͱͷൺֱͳͲʣ
    ·ͱΊ

    View full-size slide

  12. ಉظγεςϜΛ༻ҙ͢Δ

    View full-size slide

  13. ಉظγεςϜΛ༻ҙ͢Δ
    ΦϑϥΠϯฤू΋Ͱ͖Δෳࡶͳσʔλߏ଄Λ୺຤ؒͰಉظ͢ΔͨΊʹ

    ࠷৽ͷσʔλ
    ୺຤ͷมߋ
    Ϛελʔσʔλ

    View full-size slide

  14. ಉظγεςϜΛ༻ҙ͢Δ
    ΦϑϥΠϯฤू΋Ͱ͖Δෳࡶͳσʔλߏ଄Λ୺຤ؒͰಉظ͢ΔͨΊʹ
    ୺຤ಉ࢜ͷ௚઀ͷ΍ΓऔΓ
    ͸ࠓճ͸ߟ͑·ͤΜ

    View full-size slide

  15. ಉظγεςϜΛ༻ҙ͢Δ
    ߟ͑ΒΕΔखஈ
    w J$MPVE%PDVNFOUΛ࢖͏
    w J$MPVEҎ֎ͷΦϯϥΠϯετϨʔδαʔϏεͱ4%,࿈ܞ͢Δ
    w 'JSFTUPSFͳͲͷ#BB4Λ࢖͏ʢ$MPVE,JUͳͲʣ
    w ࣗ෼ͰಉظγεςϜΛ༻ҙ͢Δ

    View full-size slide

  16. ಉظγεςϜΛ༻ҙ͢Δ
    ߟ͑ΒΕΔखஈ
    w J$MPVE%PDVNFOUΛ࢖͏
    w J04NBD04͚ͩͰ͸ͳ͘ɺ8JOEPXT΍"OESPJEͰ΋ల։͍ͯ͠Δ
    w J$MPVEҎ֎ͷΦϯϥΠϯετϨʔδαʔϏεͱ4%,࿈ܞ͢Δ
    w 'JSFTUPSFͳͲͷ#BB4Λ࢖͏ʢ$MPVE,JUͳͲʣ
    w ࣗ෼ͰಉظγεςϜΛ༻ҙ͢Δ

    View full-size slide

  17. ಉظγεςϜΛ༻ҙ͢Δ
    ߟ͑ΒΕΔखஈ
    w J$MPVE%PDVNFOUΛ࢖͏
    w J04NBD04͚ͩͰ͸ͳ͘ɺ8JOEPXT΍"OESPJEͰ΋ల։͍ͯ͠Δ
    w J$MPVEҎ֎ͷΦϯϥΠϯετϨʔδαʔϏεͱ4%,࿈ܞ͢Δ
    w Ϛελʔσʔλ͸αʔϏεଆͰ࣋ͬͯػೳͷ֦ுੑʹ෯Λ͍࣋ͨͤͨ
    w 'JSFTUPSFͳͲͷ#BB4Λ࢖͏ʢ$MPVE,JUͳͲʣ
    w ࣗ෼ͰಉظγεςϜΛ༻ҙ͢Δ

    View full-size slide

  18. ಉظγεςϜΛ༻ҙ͢Δ
    ߟ͑ΒΕΔखஈ
    w J$MPVE%PDVNFOUΛ࢖͏
    w J04NBD04͚ͩͰ͸ͳ͘ɺ8JOEPXT΍"OESPJEͰ΋ల։͍ͯ͠Δ
    w J$MPVEҎ֎ͷΦϯϥΠϯετϨʔδαʔϏεͱ4%,࿈ܞ͢Δ
    w ࿈ܞ͸ྑ͍͕ɺࠓޙ΋ߟ͑ΔͱϚελʔσʔλ͸αʔϏεଆͰ͍࣋ͪͨ
    w 'JSFTUPSFͳͲͷ#BB4Λ࢖͏ʢ$MPVE,JUͳͲʣ
    w ࣗ෼ͰಉظγεςϜΛ༻ҙ͢Δ

    View full-size slide

  19. ಉظγεςϜΛ༻ҙ͢Δ
    ߟ͑ΒΕΔखஈ
    w 'JSFTUPSFΛ࢖͏
    w ౰࣌͸஌͕ࣝෆ଍͍ͯͨͨ͠Ίআ֎
    w ࣗ෼ͰಉظγεςϜΛ༻ҙ͢Δ

    View full-size slide

  20. ಉظγεςϜΛ༻ҙ͢Δ
    ߟ͑ΒΕΔखஈ
    w 'JSFTUPSFΛ࢖͏
    w ౰࣌͸஌͕ࣝෆ଍͍ͯͨͨ͠Ίআ֎
    w ࣗ෼ͰಉظγεςϜΛ༻ҙ͢Δ

    View full-size slide

  21. ಉظγεςϜΛ༻ҙ͢Δ
    ߟ͑ΒΕΔखஈ
    w 'JSFTUPSFΛ࢖͏
    w ࣗ෼ͰಉظγεςϜΛ༻ҙ͢Δ
    w ͔Β࣮૷͢Δ
    w (JUαʔόʔͳͲΛཱͯΔ
    w 8FC%"7αʔόʔͳͲΛཱͯΔ

    View full-size slide

  22. ಉظγεςϜΛ༻ҙ͢Δ
    ߟ͑ΒΕΔखஈ
    w 'JSFTUPSFΛ࢖͏
    w ࣗ෼ͰಉظγεςϜΛ༻ҙ͢Δ
    w ͔Β࣮૷͢Δ
    w (JUαʔόʔͳͲΛཱͯΔ
    w 8FC%"7αʔόʔͳͲΛཱͯΔ
    ͪΐͬͱՙ͕ॏ͍

    View full-size slide

  23. ಉظγεςϜΛ༻ҙ͢Δ
    ߟ͑ΒΕΔखஈ
    w 'JSFTUPSFΛ࢖͏
    w ࣗ෼ͰಉظγεςϜΛ༻ҙ͢Δ
    w ͔Β࣮૷͢Δ
    w (JUαʔόʔͳͲΛཱͯΔ
    w 8FC%"7αʔόʔͳͲΛཱͯΔ

    %#ͱ"1*͚ͩͰɺϢʔβʔपΓ͸
    'JSFCBTF"VUIFOUJDBUJPO

    View full-size slide

  24. ΦϑϥΠϯฤूΛڐ༰͢Δ

    View full-size slide

  25. w σʔλΛಉظ͢Δ
    w ϩʔΧϧͱαʔόʔͷঢ়ଶΛಉ͡ʹอͭ͜ͱ
    ΦϑϥΠϯฤूΛڐ༰͢Δ
    ಉظͱ͸Կ͔
    ϩʔΧϧʢΫϥΠΞϯτʣ αʔόʔʢϚελʔσʔλʣ
    "1*

    View full-size slide

  26. w ΦϑϥΠϯฤू
    w ϩʔΧϧͷσʔλϕʔε͚ͩͰ΋ಈ࡞͢Δ͜ͱ
    ΦϑϥΠϯฤूΛڐ༰͢Δ
    ΦϑϥΠϯฤूͱ͸Կ͔
    ϩʔΧϧʢΫϥΠΞϯτʣ αʔόʔʢϚελʔσʔλʣ

    View full-size slide

  27. ΦϑϥΠϯฤूʹ

    ඞཁͳ΋ͷΛ֬ೝ͢Δ

    View full-size slide

  28. ΦϑϥΠϯฤूΛڐ༰͢Δ
    ؆୯ͳέʔε
    w ҰͭͷςΩετ
    w Ұͭͷ୺຤͔ΒฤूʢΞϯΠϯετʔϧ͕ΞΧ΢ϯτ࡟আʣ
    w Ұͭͷ୺຤͔ΒӾཡʢฤू୺຤͚ͩʣ

    View full-size slide

  29. ΦϑϥΠϯฤूΛڐ༰͢Δ
    ؆୯ͳέʔε
    w ҰͭͷςΩετɺҰͭͷ୺຤͔ΒฤूɺҰͭͷ୺຤͔ΒӾཡ
    w औΓ͏Δૢ࡞
    w ςΩετΛӾཡ͢Δ
    w ςΩετΛอଘ͢ΔʢϩʔΧϧʹอଘ͢Δʣ
    w ςΩετΛಉظ͢Δ

    View full-size slide

  30. ΦϑϥΠϯฤूΛڐ༰͢Δ
    ؆୯ͳέʔε
    w ҰͭͷςΩετɺҰͭͷ୺຤͔ΒฤूɺҰͭͷ୺຤͔ΒӾཡ
    w औΓ͏Δૢ࡞
    w ςΩετΛӾཡ͢Δ
    w ςΩετΛอଘ͢ΔʢϩʔΧϧʹอଘ͢Δʣ
    w ςΩετΛಉظ͢Δ
    w αʔόʔʹอଘ͢Δ

    View full-size slide

  31. ΦϑϥΠϯฤूΛڐ༰͢Δ
    ؆୯ͳέʔε
    w ҰͭͷςΩετɺҰͭͷ୺຤͔ΒฤूɺҰͭͷ୺຤͔ΒӾཡ
    w औΓ͏Δૢ࡞
    w ςΩετΛӾཡ͢Δ
    w ςΩετΛอଘ͢ΔʢϩʔΧϧʹอଘ͢Δʣ
    w ςΩετΛಉظ͢Δ
    w αʔόʔʹอଘ͢Δ

    ຖճαʔόʔʹอଘ
    ͢Δ͜ͱʹͳΔ

    View full-size slide

  32. ΦϑϥΠϯฤूΛڐ༰͢Δ
    ؆୯ͳέʔε
    w ҰͭͷςΩετɺҰͭͷ୺຤͔ΒฤूɺҰͭͷ୺຤͔ΒӾཡ
    w औΓ͏Δૢ࡞
    w ςΩετΛӾཡ͢Δ
    w ςΩετΛอଘ͢ΔʢϩʔΧϧʹอଘ͢Δʣ
    w ςΩετΛಉظ͢Δ
    w ϩʔΧϧͷςΩετ͕อଘ͞Ε͍ͯͳ͚Ε͹αʔόʔʹอଘ͢Δ

    View full-size slide

  33. ΦϑϥΠϯฤूΛڐ༰͢Δ
    ؆୯ͳέʔε
    w ҰͭͷςΩετɺҰͭͷ୺຤͔ΒฤूɺҰͭͷ୺຤͔ΒӾཡ
    w ΫϥΠΞϯτ͕؅ཧ͠ͳ͍ͱ͍͚ͳ͍৘ใ
    w ϩʔΧϧͷςΩετͭ

    View full-size slide

  34. ΦϑϥΠϯฤूΛڐ༰͢Δ
    ؆୯ͳέʔε
    w ҰͭͷςΩετ
    w Ұͭͷ୺຤͔ΒฤूʢΞϯΠϯετʔϧ͕ΞΧ΢ϯτ࡟আʣ
    w ʮෳ਺ʯͷ୺຤͔ΒӾཡ

    View full-size slide

  35. ΦϑϥΠϯฤूΛڐ༰͢Δ
    ؆୯ͳέʔε
    w ҰͭͷςΩετɺҰͭͷ୺຤͔Βฤूɺෳ਺ͷ୺຤͔ΒӾཡ
    w औΓ͏Δૢ࡞ʢฤूଆʣ
    w ςΩετΛӾཡ͢Δ
    w ςΩετΛอଘ͢ΔʢϩʔΧϧʹอଘ͢Δʣ
    w ςΩετΛಉظ͢Δ
    w ϩʔΧϧͷςΩετ͕อଘ͞Ε͍ͯͳ͚Ε͹αʔόʔʹอଘ͢Δ

    View full-size slide

  36. ΦϑϥΠϯฤूΛڐ༰͢Δ
    ؆୯ͳέʔε
    w ҰͭͷςΩετɺҰͭͷ୺຤͔Βฤूɺෳ਺ͷ୺຤͔ΒӾཡ
    w औΓ͏Δૢ࡞ʢฤूଆʣ
    w ςΩετΛӾཡ͢Δ
    w ςΩετΛอଘ͢ΔʢϩʔΧϧʹอଘ͢Δʣ
    w ςΩετΛಉظ͢Δ
    w ϩʔΧϧͷςΩετ͕อଘ͞Ε͍ͯͳ͚Ε͹αʔόʔʹอଘ͢Δ
    ฤूଆ͸มΘΒͣ

    View full-size slide

  37. ΦϑϥΠϯฤूΛڐ༰͢Δ
    ؆୯ͳέʔε
    w ҰͭͷςΩετɺҰͭͷ୺຤͔Βฤूɺෳ਺ͷ୺຤͔ΒӾཡ
    w औΓ͏Δૢ࡞ʢӾཡଆʣ
    w ςΩετΛӾཡ͢Δ
    w ಉظલ͸ӾཡͰ͖ͳ͍
    w ςΩετΛಉظ͢Δ

    View full-size slide

  38. ΦϑϥΠϯฤूΛڐ༰͢Δ
    ؆୯ͳέʔε
    w ҰͭͷςΩετɺҰͭͷ୺຤͔Βฤूɺෳ਺ͷ୺຤͔ΒӾཡ
    w औΓ͏Δૢ࡞ʢӾཡଆʣ
    w ςΩετΛӾཡ͢ΔʢαʔόʔΩϟογϡΛ։͘ʣ
    w ಉظલ͸ӾཡͰ͖ͳ͍
    w ςΩετΛಉظ͢Δ
    w ςΩετΛαʔόʔ͔Βऔಘͯ͠αʔόʔΩϟογϡʹอଘ͢Δ
    ΦϑϥΠϯͰ΋࠷ޙʹऔಘ
    ͨ͠ςΩετ͕ӾཡͰ͖Δ

    View full-size slide

  39. ΦϑϥΠϯฤूΛڐ༰͢Δ
    ؆୯ͳέʔε
    w ҰͭͷςΩετɺҰͭͷ୺຤͔Βฤूɺෳ਺ͷ୺຤͔ΒӾཡ
    w ΫϥΠΞϯτ͕؅ཧ͠ͳ͍ͱ͍͚ͳ͍৘ใ
    w ฤूଆ
    w ϩʔΧϧͷςΩετͭʢΞοϓϩʔυͷΈʣ
    w Ӿཡଆ
    w αʔόʔΩϟογϡͷςΩετͭʢμ΢ϯϩʔυͷΈʣ

    View full-size slide

  40. ΦϑϥΠϯฤूΛڐ༰͢Δ
    ؆୯ͳέʔε
    w ҰͭͷςΩετ
    w ʮෳ਺ʯͷ୺຤͔ΒฤूʢΞΧ΢ϯτͰฤूݖݶͷ࠶औಘ͕Մೳʣ
    w ෳ਺ͷ୺຤͔ΒӾཡ
    ฤूऀ͕ෳ਺͍ͯ΋
    มΘΒͳ͍

    View full-size slide

  41. ΦϑϥΠϯฤूΛڐ༰͢Δ
    ؆୯ͳέʔε
    w ҰͭͷςΩετɺෳ਺ͷ୺຤͔Βฤूɺෳ਺ͷ୺຤͔ΒӾཡ
    w औΓ͏Δૢ࡞
    w ςΩετΛӾཡ͢Δ
    w ಉظલ͸ӾཡͰ͖ͳ͍
    w ςΩετΛอଘ͢Δ
    w ςΩετΛಉظ͢Δ

    View full-size slide

  42. ΦϑϥΠϯฤूΛڐ༰͢Δ
    ؆୯ͳέʔε
    w ҰͭͷςΩετɺෳ਺ͷ୺຤͔Βฤूɺෳ਺ͷ୺຤͔ΒӾཡ
    w ςΩετΛಉظ͢Δ
    w อଘ͚ͩͰ͸ͳ͘औಘ͢Δඞཁ΋͋Δ

    View full-size slide

  43. ΦϑϥΠϯฤूΛڐ༰͢Δ
    ؆୯ͳέʔε
    w ҰͭͷςΩετɺෳ਺ͷ୺຤͔Βฤूɺෳ਺ͷ୺຤͔ΒӾཡ
    w ςΩετΛಉظ͢Δ
    w ϩʔΧϧͱαʔόʔ͕ಉҰ
    w ϩʔΧϧͷΈมߋ͋Γ
    w αʔόʔͷΈมߋ͋Γ
    w ϩʔΧϧͱαʔόʔ૒ํʹมߋ͋Γ

    View full-size slide

  44. ΦϑϥΠϯฤूΛڐ༰͢Δ
    ؆୯ͳέʔε
    w ҰͭͷςΩετɺෳ਺ͷ୺຤͔Βฤूɺෳ਺ͷ୺຤͔ΒӾཡ
    w ςΩετΛಉظ͢Δ
    w ϩʔΧϧͱαʔόʔ͕ಉҰˠԿ΋͠ͳ͍
    w ϩʔΧϧͷΈมߋ͋Γˠαʔόʔʹ্ॻ͖͢Δ
    w αʔόʔͷΈมߋ͋ΓˠϩʔΧϧʹ্ॻ͖͢Δ
    w ϩʔΧϧͱαʔόʔ૒ํʹมߋ͋ΓˠίϯϑϦΫτΛղܾ͢Δ

    View full-size slide

  45. ΦϑϥΠϯฤूΛڐ༰͢Δ
    ؆୯ͳέʔε
    w ҰͭͷςΩετɺෳ਺ͷ୺຤͔Βฤूɺෳ਺ͷ୺຤͔ΒӾཡ
    w ςΩετΛಉظ͢Δ
    w ϩʔΧϧͱαʔόʔ͕ಉҰˠԿ΋͠ͳ͍
    w ϩʔΧϧͷΈมߋ͋Γˠαʔόʔʹ্ॻ͖͢Δ
    w αʔόʔͷΈมߋ͋ΓˠϩʔΧϧʹ্ॻ͖͢Δ
    w ϩʔΧϧͱαʔόʔ૒ํʹมߋ͋ΓˠίϯϑϦΫτΛղܾ͢Δ

    "1*ͰԿΛ্ॻ͖͢Δ͔Λ
    ໌ࣔͤ͞Δͱҙਤ͠ͳ͍
    ্ॻ͖Λ๷͛Δ

    View full-size slide

  46. ΦϑϥΠϯฤूΛڐ༰͢Δ
    ؆୯ͳέʔε
    w ҰͭͷςΩετɺෳ਺ͷ୺຤͔Βฤूɺෳ਺ͷ୺຤͔ΒӾཡ
    w ςΩετΛಉظ͢Δ
    w ϩʔΧϧͱαʔόʔ͕ಉҰˠԿ΋͠ͳ͍
    w ϩʔΧϧͷΈมߋ͋Γˠαʔόʔʹ্ॻ͖͢Δ
    w αʔόʔͷΈมߋ͋ΓˠϩʔΧϧʹ্ॻ͖͢Δ
    w ϩʔΧϧͱαʔόʔ૒ํʹมߋ͋ΓˠίϯϑϦΫτΛղܾ͢Δ
    ͋ͱͰৄ͘͠࿩͢

    View full-size slide

  47. ΦϑϥΠϯฤूΛڐ༰͢Δ
    ؆୯ͳέʔε
    w ʮαʔόʔͷมߋʯʮαʔόʔͷมߋʯΛ஌ΔͨΊʹඞཁͳ৘ใ
    ϩʔΧϧ
    αʔόʔ
    ΦϑϥΠϯ࡞ۀ
    ߋ৽ ߋ৽ ߋ৽

    View full-size slide

  48. ΦϑϥΠϯฤूΛڐ༰͢Δ
    ؆୯ͳέʔε
    w ʮαʔόʔͷมߋʯʮαʔόʔͷมߋʯΛ஌ΔͨΊʹඞཁͳ৘ใ
    ϩʔΧϧ
    αʔόʔ
    ΦϑϥΠϯ࡞ۀ
    ߋ৽ ߋ৽ ߋ৽

    มߋ͋Δʁ
    มߋ͋Δʁ

    View full-size slide

  49. ΦϑϥΠϯฤूΛڐ༰͢Δ
    ؆୯ͳέʔε
    w ʮαʔόʔͷมߋʯʮαʔόʔͷมߋʯΛ஌ΔͨΊʹඞཁͳ৘ใ
    ϩʔΧϧ
    αʔόʔ
    ΦϑϥΠϯ࡞ۀ
    ฤू։࢝࣌఺ͷςΩετͱͷ
    ࠩ෼ͷ༗ແ͕มߋͷ༗ແ
    ߋ৽ ߋ৽ ߋ৽

    View full-size slide

  50. ΦϑϥΠϯฤूΛڐ༰͢Δ
    ؆୯ͳέʔε
    w ҰͭͷςΩετɺෳ਺ͷ୺຤͔Βฤूɺෳ਺ͷ୺຤͔ΒӾཡ
    w ΫϥΠΞϯτ͕؅ཧ͠ͳ͍ͱ͍͚ͳ͍৘ใ
    w ϩʔΧϧͷςΩετͭʢϩʔΧϧ͕ฤूதͷςΩετʣ
    w ΦϦδφϧͷςΩετͭʢϩʔΧϧ͕ฤूதͷςΩετͷݩͷςΩετʣ

    View full-size slide

  51. ΦϑϥΠϯฤूΛڐ༰͢Δ
    ؆୯ͳέʔε
    w ʮෳ਺ʯͷςΩετ
    w ෳ਺ͷ୺຤͔Βฤू
    w ෳ਺ͷ୺຤͔ΒӾཡ

    View full-size slide

  52. ΦϑϥΠϯฤूΛڐ༰͢Δ
    ؆୯ͳέʔε
    w ෳ਺ͷςΩετɺෳ਺ͷ୺຤͔Βฤूɺෳ਺ͷ୺຤͔ΒӾཡ
    w ෳ਺ͷςΩετΛѻ͏͜ͱͰ૿͑Δૢ࡞
    w ςΩετΛϩʔΧϧͰ࡞੒͢Δ
    w ςΩετΛϩʔΧϧͰ࡟আ͢Δ

    View full-size slide

  53. ΦϑϥΠϯฤूΛڐ༰͢Δ
    ؆୯ͳέʔε
    w ෳ਺ͷςΩετɺෳ਺ͷ୺຤͔Βฤूɺෳ਺ͷ୺຤͔ΒӾཡ
    w ෳ਺ͷςΩετΛѻ͏͜ͱͰ૿͑Δૢ࡞
    w ςΩετΛϩʔΧϧͰ࡞੒͢Δ
    w ςΩετΛαʔόʔʹ࡞੒͢Δ
    w ςΩετΛϩʔΧϧͰ࡟আ͢Δ
    w ςΩετΛαʔόʔ͔Β࡟আ͢Δ
    ௨৴ࣦഊ࣌ɺ࠶ૹ৴ͷલʹॲཧ͕
    ੒ޭ͍͔ͯͨ͠Ͳ͏͔໰͍߹ΘͤΔ
    खஈ΋ඞཁʹͳΔ

    ʢϩʔΧϧ*%Λอଘ͢ΔͳͲʣ

    View full-size slide

  54. ΦϑϥΠϯฤूΛڐ༰͢Δ
    ؆୯ͳέʔε
    w ෳ਺ͷςΩετɺෳ਺ͷ୺຤͔Βฤूɺෳ਺ͷ୺຤͔ΒӾཡ
    w ෳ਺ͷςΩετΛѻ͏͜ͱͰ૿͑Δঢ়گʢίϯϑϦΫτʣ
    w αʔόʔͰ࡟আ͞ΕͨςΩετΛϩʔΧϧͰฤू
    w αʔόʔͰฤू͞ΕͨςΩετΛϩʔΧϧͰ࡟আ

    View full-size slide

  55. ΦϑϥΠϯฤूΛڐ༰͢Δ
    ؆୯ͳέʔε
    w ෳ਺ͷςΩετΛѻ͏͜ͱͰى͜ΔมԽ
    w αʔόʔ͔Β͢΂ͯͷςΩετΛऔಘ͢Δ
    w ͜Ε͕ಉظͷͨͼʹൃੜ͢Δ
    w ύϑΥʔϚϯεΛߟ͑Δͱࠩ෼ߋ৽͍ͨ͠

    View full-size slide

  56. ΦϑϥΠϯฤूΛڐ༰͢Δ
    ؆୯ͳέʔε
    w ඞཁͳࠩ෼͸ҎԼͷͭ
    w αʔόʔͰલճऔಘ͔Βมߋͷ͋ͬͨςΩετ͢΂ͯ
    w αʔόʔͰલճऔಘ͔Β࡞੒͞ΕͨςΩετ͢΂ͯ
    w αʔόʔͰલճऔಘ͔Β࡟আ͞ΕͨςΩετ͢΂ͯ
    w ·ͨϩʔΧϧʹ͸લճऔಘͨ͠ঢ়ଶΛ͓֮͑ͯ͘ඞཁ͕͋Δ

    View full-size slide

  57. ΦϑϥΠϯฤूΛڐ༰͢Δ
    ؆୯ͳέʔε
    w ෳ਺ͷςΩετɺෳ਺ͷ୺຤͔Βฤूɺෳ਺ͷ୺຤͔ΒӾཡ
    w ΫϥΠΞϯτ͕؅ཧ͠ͳ͍ͱ͍͚ͳ͍৘ใ
    w ϩʔΧϧͷςΩετʢΞϓϦ಺ͷฤू༻ʣ
    w ΦϦδφϧͷςΩετʢࠩ෼ݕग़༻ͷσʔλʣ
    w αʔόʔΩϟογϡͷςΩετશ෦ʢࠩ෼ͷऔΓࠐΈઌʣ

    View full-size slide

  58. ΦϑϥΠϯฤूΛڐ༰͢Δ
    ؆୯ͳέʔε
    w ͢΂ͯͷςΩετΛಉظ͢Δ
    w αʔόʔΩϟογϡͷαʔόʔͱͷࠩ෼Λߋ৽͢Δ
    w ΦϦδφϧͱൺֱͯ͠มߋ͞Εͨ͢΂ͯͷϩʔΧϧͷςΩετʹରͯ͠
    w ΦϦδφϧͱαʔόʔΩϟογϡ͕ಉ͡ͳΒαʔόʔʹมߋΛ൓ө͢Δ
    w ΦϦδφϧͱαʔόʔΩϟογϡ͕ҟͳΔͳΒίϯϑϦΫτΛղফ͢Δ

    View full-size slide

  59. ίϯϑϦΫτΛղফ͢Δ

    View full-size slide

  60. Ξ΢τϥΠϯ
    ΦϑϥΠϯฤू΋Ͱ͖Δෳࡶͳσʔλߏ଄Λ୺຤ؒͰಉظ͢ΔͨΊʹ
    ಉظγεςϜΛ༻ҙ͢ΔʢͱΓ͏Δબ୒ࢶ͸ʁʣ
    ΦϑϥΠϯฤूΛڐ༰͢ΔʢԿ͕ى͖Δͷ͔ʁʣ
    ίϯϑϦΫτΛղফ͢ΔʢͲ͏͢Ε͹͍͍ͷʁʣ
    ΦϑϥΠϯฤू΋Ͱ͖Δෳࡶͳσʔλߏ଄Λ୺຤ؒͰಉظ͢Δ
    5*14ʢαʔόʔߏ੒΍'JSFTUPSFͱͷൺֱͳͲʣ
    ·ͱΊ

    View full-size slide

  61. ίϯϑϦΫτղফͱͦͷϙϦγʔ
    ίϯϑϦΫτͷ໰୊
    w ίϯϑϦΫτͱ͸
    w ͋Δ୺຤ͱผͷ୺຤ͷ྆ํͰಉ͡ςΩετΛฤूͨ͠ঢ়ଶ
    w ਖ਼͠͞͸Ϣʔβʔ͔͠ධՁͰ͖ͳ͍
    w ༷ʑͳέʔε͕͋Δ
    w ྫʣ΋ͬͱྑ͍ςΩετΛࢥ͍͍ͭͯॻ͍ͨˠ্ॻ͖͢Δ΂͖
    w ྫʣهԱʹͳ͍ੲͷΦϑϥΠϯมߋ͕࢒ͬͯͨˠഁغ͢Δ΂͖

    View full-size slide

  62. ίϯϑϦΫτղফͱͦͷϙϦγʔ
    ίϯϑϦΫτͰͱΕΔखஈ
    w ςΩετͷίϯϑϦΫτൃੜ࣌ʹऔΕΔબ୒ࢶ
    w ϢʔβʔʹͲ͏͢Δ͔બ͹ͤͳ͍
    w ϢʔβʔʹͲ͏͢Δ͔બ͹ͤΔ
    w ͦͷ৔Ͱฉ͘
    w ͋ͱͰฉ͘ɺ͋ͱͰ֬ೝͰ͖ΔΑ͏ʹ͢Δ

    View full-size slide

  63. ίϯϑϦΫτղফͱͦͷϙϦγʔ
    ίϯϑϦΫτͰͱΕΔखஈ
    w Ϣʔβʔʹબ͹ͤͳ͍
    w ϩʔΧϧͷมߋΛഁغ͢Δʢαʔόʔ্Ͱ͸Կ΋ى͖ͳ͍ʣ
    w αʔόʔͷมߋΛഁغ͢Δʢαʔόʔ্Ͱ͸্ॻ͖ʣ
    w ྆ํͷมߋ͔ΒඞཁͳมߋΛ࢒͢ʢαʔόʔ্Ͱ͸্ॻ͖ʣ
    w ྆ํͷςΩετΛ࢒͢
    w ΞϓϦ͕݁Ռʹ੹೚Λ࣋ͭ

    View full-size slide

  64. ίϯϑϦΫτղফͱͦͷϙϦγʔ
    ίϯϑϦΫτͰͱΕΔखஈ
    w ϢʔβʔʹͲ͏͢Δ͔બ͹ͤΔ
    w ͦͷ৔Ͱฉ͘
    w ϩʔΧϧͷมߋΛഁغ͢Δʢαʔόʔ্Ͱ͸Կ΋ى͖ͳ͍ʣ
    w αʔόʔͷมߋΛഁغ͢Δʢαʔόʔ্Ͱ͸্ॻ͖ʣ
    w ྆ํͷมߋ͔ΒඞཁͳมߋΛ࢒͢ʢαʔόʔ্Ͱ͸্ॻ͖ʣ
    w ྆ํͷςΩετΛ࢒͢

    View full-size slide

  65. ίϯϑϦΫτղফͱͦͷϙϦγʔ
    ίϯϑϦΫτͰͱΕΔखஈ
    w ϢʔβʔʹͲ͏͢Δ͔બ͹ͤΔ
    w ͋ͱͰฉ͘ɺ͋ͱͰ֬ೝͰ͖ΔΑ͏ʹ͢Δ
    w ςΩετͷมߋཤྺΛ಺෦Ͱอ࣋͢Δ
    w ྫʣ
    w όʔδϣϯόʔδϣϯ͔Βߋ৽
    w όʔδϣϯόʔδϣϯ͔Βߋ৽

    View full-size slide

  66. ίϯϑϦΫτղফͱͦͷϙϦγʔ
    ίϯϑϦΫτͰͱΕΔखஈ
    w ϢʔβʔʹͲ͏͢Δ͔બ͹ͤΔ
    w ͋ͱͰฉ͘ɺ͋ͱͰ֬ೝͰ͖ΔΑ͏ʹ͢Δ
    w ςΩετͷมߋཤྺΛ಺෦Ͱอ࣋͢Δ
    w ྫʣ
    w όʔδϣϯόʔδϣϯ͔Βߋ৽
    w όʔδϣϯόʔδϣϯ͔Βߋ৽
    ಉ͡όʔδϣϯΛߋ৽͢Δཤྺ
    ʹίϯϑϦΫτ

    View full-size slide

  67. ίϯϑϦΫτղফͱͦͷϙϦγʔ
    ίϯϑϦΫτͰͱΕΔखஈ
    w ςΩετͷίϯϑϦΫτͰऔΕΔબ୒ࢶ
    w Ϣʔβʔʹબ͹ͤͳ͍
    w ͦͷ৔ͰϢʔβʔʹબ͹ͤΔ
    w ͋ͱͰϢʔβʔʹબ΂ΔΑ͏ʹ͢Δ
    w ͜͏ͨ͠બ୒ࢶ͔ΒͲͷखஈΛऔΔ͔͸ࣗ༝
    w ͜͜͸αʔϏεͷϙϦγʔ͕ٻΊΒΕΔ෦෼

    View full-size slide

  68. ෳࡶͳσʔλߏ଄
    ؆୯ͳέʔε
    w ͜Εͷಉظͷ࢓૊Έ͸Θ͔ͬͨ
    w ෳ਺ͷςΩετ
    w ෳ਺ͷ୺຤͔Βݸผʹฤू
    w ෳ਺ͷ୺຤͔ΒӾཡ

    View full-size slide

  69. ෳࡶͳσʔλߏ଄
    ࠓճͷέʔε
    w ʮσΟϨΫτϦߏ଄Λ࣋ͭʯෳ਺ͷςΩετ
    w ෳ਺ͷ୺຤͔Βݸผʹฤू
    w ෳ਺ͷ୺຤͔ΒӾཡ

    View full-size slide

  70. ෳࡶͳσʔλߏ଄
    ࠓճͷέʔε
    w ʮσΟϨΫτϦߏ଄Λ࣋ͭʯෳ਺ͷςΩετ
    w ͜Ε͕ࠓճͷෳࡶͳσʔλߏ଄
    w ෳ਺ͷςΩετͷಉظ͸ͭͷςΩετͷಉظ͕ฒྻ͍ͯ͠Δ͚ͩ
    w ࡞੒ͱ࡟আͷ௥ै͕Ͱ͖Ε͹ྑ͍
    w ෳ਺ͷ୺຤͔Βݸผʹฤू
    w ෳ਺ͷ୺຤͔ΒӾཡ

    View full-size slide

  71. ΦϑϥΠϯฤू΋Ͱ͖Δෳࡶͳ

    σʔλߏ଄Λ୺຤ؒͰಉظ͢Δ

    View full-size slide

  72. σΟϨΫτϦߏ଄
    ෳࡶͳσʔλߏ଄
    w ʮσΟϨΫτϦߏ଄Λ࣋ͭʯෳ਺ͷςΩετ
    w ෳ਺ͷ୺຤͔Βݸผʹฤू
    w ෳ਺ͷ୺຤͔ΒӾཡ

    View full-size slide

  73. σΟϨΫτϦߏ଄
    ෳࡶͳσʔλߏ଄
    w σΟϨΫτϦߏ଄
    w ϧʔτʹϑΥϧμ΋͘͠͸ςΩετ͕ଘࡏ͢Δ
    w ϑΥϧμͷதʹ΋ϑΥϧμ΋͘͠͸ςΩετ͕ଘࡏ͢Δ
    w ϑΥϧμ΋͘͠͸ςΩετ͸λΠτϧΛ࣋ͭ
    w ςΩετ͸࡟আ͞ΕΔͱΰϛശʹೖΔʢ෮ݩͰ͖Δʣ
    w ʢʴϑΥϧμ಺ͷςΩετͱϑΥϧμͷදࣔॱং͸อଘ͞ΕΔʣ

    View full-size slide

  74. σΟϨΫτϦߏ଄
    ෳࡶͳσʔλߏ଄
    w σΟϨΫτϦߏ଄
    w ϧʔτʹϑΥϧμ΋͘͠͸ςΩετ͕ଘࡏ͢Δ
    w ϑΥϧμͷதʹ΋ϑΥϧμ΋͘͠͸ςΩετ͕ଘࡏ͢Δ
    w ϑΥϧμ΋͘͠͸ςΩετ͸λΠτϧΛ࣋ͭ
    w ςΩετ͸࡟আ͞ΕΔͱΰϛശʹೖΔʢ෮ݩͰ͖Δʣ
    w ʢʴϑΥϧμ಺ͷςΩετͱϑΥϧμͷදࣔॱং͸อଘ͞ΕΔʣ
    ࿩࿩ͷΑ͏ͳ
    έʔε͕ଟ͍

    View full-size slide

  75. σΟϨΫτϦߏ଄
    ෳࡶͳσʔλߏ଄
    w σΟϨΫτϦߏ଄
    w ςΩετ͕ෳ਺ʹޓ͍ͷ৘ใΛҰ੾࣋ͨͳ͍
    w σΟϨΫτϦߏ଄ʹޓ͍ͷ৘ใΛ࣋ͭ
    w σʔλʹෆ੔߹͕ى͜ΓಘΔ
    w ྫʣଘࡏ͠ͳ͍ϑΥϧμʹॴଐ͢Δ
    w ྫʣπϦʔ͕ϧʔϓ͢Δ

    View full-size slide

  76. σΟϨΫτϦߏ଄
    ෳࡶͳσʔλߏ଄
    w σΟϨΫτϦߏ଄ΛͲ͏΍ͬͯಉظ͢Δ͔
    w ͢΂ͯͷσʔλΛ΍ΓऔΓ͢Δ෼ʹ͸໰୊͸ى͖ͳ͍

    View full-size slide

  77. σΟϨΫτϦߏ଄
    ෳࡶͳσʔλߏ଄
    w σΟϨΫτϦߏ଄ΛͲ͏΍ͬͯಉظ͢Δ͔
    w ͢΂ͯͷσʔλΛ΍ΓऔΓ͢Δ෼ʹ͸໰୊͸ى͖ͳ͍
    w Ͳ͏΍ͬͯࠩ෼Λऔಘ͢Δ͔

    View full-size slide

  78. σΟϨΫτϦߏ଄
    ෳࡶͳσʔλߏ଄
    w σΟϨΫτϦߏ଄ͰΞΠςϜʢʹϑΥϧμ΋͘͠͸ςΩετʣ͕࣋ͭ৘ใ
    w ͲͷϑΥϧμͷΞΠςϜ͔
    w ͦͷϑΥϧμͷԿ൪໨ͷΞΠςϜ͔

    View full-size slide

  79. σΟϨΫτϦߏ଄
    ෳࡶͳσʔλߏ଄
    w σΟϨΫτϦߏ଄ͰΞΠςϜʢʹϑΥϧμ΋͘͠͸ςΩετʣ͕࣋ͭ৘ใ
    w ͲͷϑΥϧμͷΞΠςϜ͔
    w ͦͷϑΥϧμͷԿ൪໨ͷΞΠςϜ͔


    JE JE JE JE JE JE

    View full-size slide

  80. σΟϨΫτϦߏ଄
    ෳࡶͳσʔλߏ଄
    w σΟϨΫτϦߏ଄ͰΞΠςϜʢʹϑΥϧμ΋͘͠͸ςΩετʣ͕࣋ͭ৘ใ
    w ͲͷϑΥϧμͷΞΠςϜ͔
    w ͦͷϑΥϧμͷԿ൪໨ͷΞΠςϜ͔
    ൪໨ʹΞΠςϜΛ௥Ճ͢Δ
    ͱͦͷϑΥϧμͷશͯͷΞ
    ΠςϜ͕มΘΔ


    JE JE JE JE JE JE


    JE JE JE JE JE JE

    JE

    View full-size slide

  81. σΟϨΫτϦߏ଄
    ෳࡶͳσʔλߏ଄
    w σΟϨΫτϦߏ଄ͰΞΠςϜʢʹϑΥϧμ΋͘͠͸ςΩετʣ͕࣋ͭ৘ใ
    w ͲͷϑΥϧμͷΞΠςϜ͔
    w ͲͷΞΠςϜͷ࣍ͷΞΠςϜ͔

    JE JE JE JE JE JE

    View full-size slide

  82. σΟϨΫτϦߏ଄
    ෳࡶͳσʔλߏ଄
    w σΟϨΫτϦߏ଄ͰΞΠςϜʢʹϑΥϧμ΋͘͠͸ςΩετʣ͕࣋ͭ৘ใ
    w ͲͷϑΥϧμͷΞΠςϜ͔
    w ͲͷΞΠςϜͷ࣍ͷΞΠςϜ͔
    ฒͼସ͑ͨͱ͖ʹ࠷େͰ΋
    ͭͷΞΠςϜͷ৘ใ͔͠
    ߋ৽͞Εͳ͍

    JE JE JE JE JE JE


    JE JE JE JE
    JE JE

    View full-size slide

  83. σΟϨΫτϦߏ଄
    ෳࡶͳσʔλߏ଄
    w ΞΠςϜͷ৘ใ
    w *%
    w λΠτϧ
    w ਌ͷΞΠςϜ*%
    w खલͷΞΠςϜ*%
    w ςΩετ*%
    w ςΩετͷ৘ใ
    w *%
    w ຊจ

    View full-size slide

  84. σΟϨΫτϦߏ଄
    ෳࡶͳσʔλߏ଄
    w σΟϨΫτϦߏ଄͕ςʔϒϧͰදݱͰ͖Δ
    w ࠩ෼͸ߋ৽೔Λอଘ͢Δ͜ͱͰ൑ผͰ͖Δ
    w ςΩετಉ༷ɺαʔόʔͷσΟϨΫτϦߏ଄ͷมߋΛࠩ෼औಘͰ͖Δ
    w ΞΠςϜͷ࡟আͰ͸ςΩετ͸࡟আ͞Εͳ͍΋ͷͱ͢Δ
    w ΞΠςϜʹඥ͔ͮͳ͍ςΩετͰ࢒Δʢʹ͜ΕΛΰϛശঢ়ଶͱ͢Δʣ

    View full-size slide

  85. σΟϨΫτϦߏ଄
    ෳࡶͳσʔλߏ଄ͷૢ࡞
    w औΓ͏Δૢ࡞
    w ϑΥϧμ΍ςΩετΛϦωʔϜ͢ΔʢλΠτϧͷมߋʣ
    w ϑΥϧμ΍ςΩετΛ࡞੒͢Δ
    w ϑΥϧμ΍ςΩετΛ࡟আ͢Δ
    w σΟϨΫτϦߏ଄ͷૢ࡞͸͜Ε͚ͩͰ͸ͳ͍

    View full-size slide

  86. σΟϨΫτϦߏ଄
    ෳࡶͳσʔλߏ଄ͷૢ࡞
    w औΓ͏Δૢ࡞
    w ϑΥϧμ΍ςΩετΛϦωʔϜ͢ΔʢλΠτϧͷมߋʣ
    w ϑΥϧμ΍ςΩετΛ࡞੒͢Δ
    w ϑΥϧμ΍ςΩετΛ࡟আ͢ΔʢϑΥϧμͷத਎΋࡟আ͞ΕΔʣ
    w ϑΥϧμ΍ςΩετΛҠಈ͢ΔʢॴଐϑΥϧμͷมߋʣ
    w ϑΥϧμ΍ςΩετΛฒͼସ͑ΔʢϑΥϧμ಺ͷදࣔॱংͷมߋʣ

    View full-size slide

  87. σΟϨΫτϦߏ଄
    ෳࡶͳσʔλߏ଄ͷૢ࡞
    w औΓ͏Δૢ࡞
    w ϑΥϧμ΍ςΩετΛϦωʔϜ͢ΔʢλΠτϧͷมߋʣ
    w ϑΥϧμ΍ςΩετΛ࡞੒͢Δ
    w ϑΥϧμ΍ςΩετΛ࡟আ͢ΔʢϑΥϧμͷத਎΋࡟আ͞ΕΔʣ
    w ϑΥϧμ΍ςΩετΛҠಈ͢ΔʢॴଐϑΥϧμͷมߋʣ
    w ϑΥϧμ΍ςΩετΛฒͼସ͑ΔʢϑΥϧμ಺ͷදࣔॱংͷมߋʣ
    ςΩετຊจͷߋ৽ʹ
    ૬౰͠ɺσʔλߏ଄ͷ
    ੔߹ੑʹ͸Өڹ͠ͳ͍

    View full-size slide

  88. σΟϨΫτϦߏ଄
    ෳࡶͳσʔλߏ଄ͷૢ࡞
    w ෆ੔߹ΛҾ͖ى͜͠ಘΔૢ࡞ʢτϥϯβΫγϣϯ͕ඞཁʣ
    w ϑΥϧμ΍ςΩετΛ࡞੒͢Δ
    w ϑΥϧμ΍ςΩετΛ࡟আ͢ΔʢϑΥϧμͷத਎΋࡟আ͞ΕΔʣ
    w ϑΥϧμ΍ςΩετΛҠಈ͢ΔʢॴଐϑΥϧμͷมߋʣ
    w ϑΥϧμ΍ςΩετΛฒͼସ͑ΔʢϑΥϧμ಺ͷදࣔॱংͷมߋʣ

    View full-size slide

  89. σΟϨΫτϦߏ଄
    ෳࡶͳσʔλߏ଄ͷૢ࡞
    w ΦϑϥΠϯฤूͷมߋΛαʔόʔʹ൓ө͢Δ
    w ૢ࡞ͭͭͷ੔߹ੑΛ୲อ͢Δͷ͸໰୊ͳ͍
    w ͭͷେ͖ͳࠩ෼ͷ੔߹ੑΛίϯϑϦΫτ΋ߟྀͭͭ͠୲อ͢Δͷ͸೉͍͠
    w σΟϨΫτϦૢ࡞ϩά͸શͯσʔλϕʔεʹه࿥͠ॱʹ൓ө͢Δํࣜͱͨ͠
    w ૢ࡞ͭͭͷ੔߹ੑͰࠩ෼શମͷ੔߹ੑΛอͯΔ
    w ʢςΩετશମͷมߋͷ൓ө͸ॱংΛ໰Θͳ͍΋ͷͩͬͨʣ

    View full-size slide

  90. σΟϨΫτϦߏ଄
    ίϯϑϦΫτ΁ͷϙϦγʔ
    w ίϯϑϦΫτ΁ͷϙϦγʔΛҎԼͷΑ͏ʹఆΊͨ
    w ࡞੒ૢ࡞͸ࣦഊͤ͞ͳ͍ʢϧʔτʹ࡞੒͢Δʣ
    w ࡟আɾҠಈɾฒͼସ͑ૢ࡞͸ࣦഊͨ͠Βແࢹ͢Δ
    w ϦωʔϜ͸ޙউͪʹ͢Δ
    w ςΩετͱ͸ٯͰ͢΂ͯػցతʹղফ͢ΔϙϦγʔ
    w ԾʹΞΠςϜ͕ফ͑ͯ΋ΰϛശঢ়ଶͷςΩετ͕࢒ΔͷͰ໰୊ͳ͍ͱ൑அ

    View full-size slide

  91. σΟϨΫτϦߏ଄
    ίϯϑϦΫτ΁ͷϙϦγʔ
    w ϙϦγʔΛߟ͑Δࡍʹ͸஫ҙ͢Δ͜ͱ
    w σΟϨΫτϦͷૢ࡞͸ॱংґଘ
    w ྫʣ
    w "Λ#ʹҠಈ͢Δˠ"Λ$ʹҠಈ͢Δˠ#Λ࡟আ͢Δʹ"͸࢒Δ
    w "Λ$ʹҠಈ͢Δˠ"Λ#ʹҠಈ͢Δˠ#Λ࡟আ͢Δʹ"͸࡟আ͞ΕΔ

    View full-size slide

  92. ࣮ࡍͷΫϥΠΞϯτଆͷॲཧ
    σΟϨΫτϦߏ଄ͷಉظॲཧͷखॱ
    w ΫϥΠΞϯτ͕؅ཧ͠ͳ͍ͱ͍͚ͳ͍৘ใ
    w ϩʔΧϧͷσʔλϕʔεʢΞϓϦ಺ͷදࣔ༻ʣ
    w ϩʔΧϧͷσΟϨΫτϦͷૢ࡞ϩά
    w αʔόʔͷΩϟογϡσʔλϕʔεʢࠩ෼ͷऔΓࠐΈઌʣ

    View full-size slide

  93. ࣮ࡍͷΫϥΠΞϯτଆͷॲཧ
    σΟϨΫτϦߏ଄ͷಉظॲཧͷखॱ
    αʔόʔͷࠩ෼Λऔಘͯ͠αʔόʔΩϟογϡʹ൓ө
    ϩʔΧϧͷૢ࡞ϩάΛॱʹαʔόʔʹ൓ө
    w ίϯϑϦΫτղফ͸ϙϦγʔʹै͏
    αʔόʔͷࠩ෼Λऔಘͯ͠αʔόʔΩϟογϡʹ൓ө
    ϩʔΧϧʹαʔόʔΩϟογϡͷঢ়ଶΛ൓ө

    View full-size slide

  94. ࣮ࡍͷΫϥΠΞϯτଆͷॲཧ
    σΟϨΫτϦߏ଄ͷಉظॲཧͷखॱ
    αʔόʔͷࠩ෼Λऔಘͯ͠αʔόʔΩϟογϡʹ൓ө
    ϩʔΧϧͷૢ࡞ϩάΛॱʹαʔόʔʹ൓ө
    w ίϯϑϦΫτղফ͸ϙϦγʔʹै͏
    αʔόʔͷࠩ෼Λऔಘͯ͠αʔόʔΩϟογϡʹ൓ө
    ϩʔΧϧʹαʔόʔΩϟογϡͷঢ়ଶΛ൓ө
    ͍ΘΏΔSFCBTF

    View full-size slide

  95. ࣮ࡍͷΫϥΠΞϯτଆͷॲཧ
    શମͷಉظॲཧͷखॱ
    w ΦϑϥΠϯ࡞ۀ͔ΒΦϯϥΠϯʹ෮ؼͨ͠ࡍ
    w σΟϨΫτϦߏ଄ͷಉظ
    w ࠓճͷίϯϑϦΫτϙϦγʔɿࣗಈతʹղܾ͞ΕΔ
    w ςΩετͷಉظ
    w ࠓճͷίϯϑϦΫτϙϦγʔɿϢʔβʔʹ֬ೝΛͱΔ

    View full-size slide

  96. ಉظͰେࣄͳ͜ͱ
    σʔλͷ੔߹ੑͱίϯϑϦΫτ࣌ͷϙϦγʔ
    w ϩʔΧϧͷσʔλͷ੔߹ੑɺαʔόʔͰͷσʔλͷ੔߹ੑ
    w σΟϨΫτϦߏ଄ΛอͭͨΊʹඞਢ
    w ΦϑϥΠϯ࡞ۀΛڐ༰͢ΔͱίϯϑϦΫτ͸ൃੜ͢Δ
    w ίϯϑϦΫτͨ͠΋ͷΛͲ͏ॲཧ͢Δ͔ͷϙϦγʔΛఆΊΔඞཁ͕͋Δ
    w ࠓճͷέʔεͰ͸σΟϨΫτϦͱςΩετΛ෼཭ͯ͠ҎԼͷΑ͏ʹఆΊͨ
    w σΟϨΫτϦ͸ࣗಈղܾɺத਎ͷςΩετ͸खಈղܾ

    View full-size slide

  97. αʔόʔߏ੒ͱ։ൃ؀ڥ
    ͭͷ5*14
    w ͔͜͜Β͸࣮ࡍʹಉظγεςϜΛ࡞ͬͨࡍͷ5*14Λ͍͔ͭ͘঺հ͢Δ
    w σʔλϕʔεͷςʔϒϧઃܭʹ͍ͭͯ
    w ։ൃ؀ڥʹ͍ͭͯ
    w 'JSFTUPSFʹ͍ͭͯ
    w ϦΞϧλΠϜฤूʹ͍ͭͯ
    w ϑΝΠϧΞϓϦͱͷಉظʹ͍ͭͯ

    View full-size slide

  98. σʔλϕʔεͷςʔϒϧઃܭ
    5*14
    w ࡞੒೔࣌ɾߋ৽೔࣌ͳͲ͸αʔόʔ͚࣌ؒͩͰ͸ͳ͘ɺϢʔβʔ࣌ؒ΋ඞཁ
    w ΦϑϥΠϯฤूͨ͠Ϣʔβʔʹͱͬͯͷૢ࡞೔࣌͸ޙऀ
    w λΠτϧͳͲ͸ͦΕ୯ମͷߋ৽೔࣌΋͋ΔͱίϯϑϦΫτղফʹ໾ཱͭ
    w ΦϑϥΠϯฤू༻ͷσʔλʹ͸αʔόʔͷ*%ͱ͸ผʹϩʔΧϧͷ*%΋ඞཁ
    w ಉظ͸͠ͳ͍Ωϟογϡςʔϒϧ͸దٓ༻ҙ͢Δ

    View full-size slide

  99. σʔλϕʔεͷςʔϒϧઃܭ
    5*14
    w ࡞੒೔࣌ɾߋ৽೔࣌ͳͲ͸αʔόʔ͚࣌ؒͩͰ͸ͳ͘ɺϢʔβʔ࣌ؒ΋ඞཁ
    w ΦϑϥΠϯฤू༻ͷσʔλʹ͸αʔόʔͷ*%ͱ͸ผʹϩʔΧϧͷ*%΋ඞཁ
    w ΦϑϥΠϯฤू࣌ʹ࡞੒͢Δࡍʹඞཁ
    w ͜ͷϩʔΧϧ*%Λαʔόʔʹ΋อଘ͢Δ͜ͱͰೋॏ1045ΛճආՄೳ
    w ಉظ͸͠ͳ͍Ωϟογϡςʔϒϧ͸దٓ༻ҙ͢Δ

    View full-size slide

  100. σʔλϕʔεͷςʔϒϧઃܭ
    5*14
    w ࡞੒೔࣌ɾߋ৽೔࣌ͳͲ͸αʔόʔ͚࣌ؒͩͰ͸ͳ͘ɺϢʔβʔ࣌ؒ΋ඞཁ
    w ΦϑϥΠϯฤू༻ͷσʔλʹ͸αʔόʔͷ*%ͱ͸ผʹϩʔΧϧͷ*%΋ඞཁ
    w ಉظ͸͠ͳ͍Ωϟογϡςʔϒϧ͸దٓ༻ҙ͢Δ
    w 8FC༻ʹදࣔॱংΛܭࢉͨ͠ςʔϒϧɺϑΥϧμ಺ͷ૯จࣈ਺ͳͲ
    w ΞϓϦͷϩʔΧϧ༻ͷදࣔॱংςʔϒϧͳͲ

    View full-size slide

  101. ։ൃ؀ڥʹ͍ͭͯ
    5*14
    w ΫϥΠΞϯτ։ൃ͸݁߹ςετΛϝΠϯʹςετۦಈͨ͠
    w Ϣχοτςετ͚ͩͰ͸αʔόʔଆͷঢ়ଶΛߟྀ͢Δ͜ͱʹແཧ͕͋Δ
    w ϩʔΧϧϚγϯ্Ͱαʔόʔͷ%PDLFSΛಈͨ͠

    View full-size slide

  102. ։ൃ؀ڥʹ͍ͭͯ
    5*14
    w %PDLFSʢαʔόʔߏ੒ʣ
    w "[VSF'VODUJPOTˠ%PDLFS"[VSF'VODUJPOTGPS/PEF
    w "[VSF42-4FSWFSˠ%PDLFS.JDSPTPGU42-4FSWFS
    w "[VSF#-0#4UPSBHFˠ%PDLFS"[VSJUF
    w 'JSFCBTF"VUIFOUJDBUJPOˠ%PDLFS/PEF 'JSFCBTF-PDBM&NVMBUPS
    4VJUF


    View full-size slide

  103. ։ൃ؀ڥʹ͍ͭͯ
    5*14
    w ΞΧ΢ϯτ؅ཧ͸'JSFCBTF"VUIFOUJDBUJPO
    w 'JSFCBTF-PDBM&NVMBUPS4VJUFͰ͸ಗ໊ϩάΠϯΛڐՄͨ͠
    w ϩάΠϯɾϩάΞ΢τ΋ςετίʔυ্Ͱ؆୯ʹߦ͑ͨ
    w ϩʔΧϧͷ%#͸ΫΤϦͷՄൖੑΛҙࣝͯ͠42-JUFΛબ୒ͨ͠
    w πʔϧ͸(3%#TXJGUΛར༻ͨ͠

    View full-size slide

  104. ։ൃ؀ڥʹ͍ͭͯ
    5*14
    w 9DPEFCFUBͰBTZODBXBJUΛར༻ͯ͠௨৴ؚΉςετΛॻ͍ͨ
    w ςετΫϥε͚ͩ!BWBJMBCMF J04
    Ͱׅͬͨ
    w ςετͷEFQMPZNFOUUBSHFUΛม͑ΔͰ΋ྑ͍
    w ςετ͚ͩͰ΋BTZODBXBJUΛ࢖͏͜ͱͰίʔυྔΛ͔ͳΓ࡟ݮͰ͖ͨ

    View full-size slide

  105. 9DPEFͷBTZODBXBJUར༻
    #FGPSF
    func testαʔόʔͰςΩετΛ࡞੒_αʔόʔͰcontent࡟আ_ಉظ_ςΩετΛ෮ݩ_ಉظͷࡍʹطʹαʔόʔͰtext࡟আࡁΈ_৽͍ۭ͠ͷςΩετͱͯ͠ಉظ͞ΕΔ() throws {


    let awaitExpectation = expectation(description: "await")


    try Auth.auth().signOut()


    Auth.auth().signInAnonymously(completion: { result, error in


    do {


    guard result != nil else {


    XCTFail(error?.localizedDescription ?? #function)


    awaitExpectation.fulfill()


    return


    }


    try self.changeServer(operation: .createDocumentRoot(title: nil, text: "text")) { result in


    switch result {


    case .success(let root):


    try self.changeServer(operation: .removeContent(contentId: root.id)) { result in


    switch result {


    case .success:


    try self.sync(dbQueue: self.dbQueue) { result in


    switch result {


    case .success:


    let serverTextId1 = root.textId!


    let localTextUuid1 = try self.dbQueue.selectTextUuid(id: serverTextId1)


    try self.changeServer(operation: .removeText(textId: serverTextId1)) { result in


    switch result {


    case .success:


    let local = try self.changeLocalOffline(dbQueue: self.dbQueue, operation: .restoreDocumentRoot(title: "local", textUuid: localTextUuid1))


    try self.sync(dbQueue: self.dbQueue) { result in


    switch result {


    case .success:


    let localTextUuid3 = local.textUuid!


    XCTAssertEqual(localTextUuid1, localTextUuid3)


    awaitExpectation.fulfill()


    case .failure(let error):


    XCTFail(error.localizedDescription)


    awaitExpectation.fulfill()


    }


    }


    case .failure(let error):


    XCTFail(error.localizedDescription)


    awaitExpectation.fulfill()


    }


    }


    case .failure(let error):


    XCTFail(error.localizedDescription)


    awaitExpectation.fulfill()


    }


    }


    case .failure(let error):


    XCTFail(error.localizedDescription)


    awaitExpectation.fulfill()


    }


    }


    case .failure(let error):


    XCTFail(error.localizedDescription)


    awaitExpectation.fulfill()


    }


    }


    } catch {


    XCTFail(error.localizedDescription)


    awaitExpectation.fulfill()


    }


    })


    }



    View full-size slide

  106. 9DPEFͷBTZODBXBJUར༻
    "GUFS
    func testαʔόʔͰςΩετΛ࡞੒_αʔόʔͰcontent࡟আ_ಉظ_ςΩετΛ෮ݩ_ಉظͷࡍʹطʹαʔόʔͰtext࡟আࡁΈ_৽͍ۭ͠ͷςΩετͱͯ͠ಉظ͞ΕΔ() async throws {


    try await signIn()


    let root = try await changeServer(operation: .createDocumentRoot(title: nil, text: "text"))


    _ = try await changeServer(operation: .removeContent(contentId: root.id))


    try await sync(dbQueue: dbQueue)


    let serverTextId1 = root.textId!


    let localTextUuid1 = try dbQueue.selectTextUuid(id: serverTextId1)


    _ = try await changeServer(operation: .removeText(textId: serverTextId1))


    let local = try changeLocalOffline(dbQueue: dbQueue, operation: .restoreDocumentRoot(title: "local", textUuid: localTextUuid1))


    try await sync(dbQueue: dbQueue)


    let localTextUuid3 = local.textUuid!


    XCTAssertEqual(localTextUuid1, localTextUuid3)


    }



    View full-size slide

  107. 'JSFTUPSF
    5*14
    w $MPVE'JSFTUPSF
    w ϦΞϧλΠϜಉظ
    w Ϣʔβʔॻ͖ࠐΈΛڐ͢৔߹σʔλͷ੔߹ੑΛSVMFTͰอূ͢Δඞཁ͕͋Δ
    w SVMFT͕ຬ଍͞Εͳ͍ͱॻ͖ࠐΈ͕ࣦഊ͢Δ
    w σΟϨΫτϦߏ଄ͷ੍໿͸͜͜Ͱදݱ͢Δඞཁ͕͋Δ

    View full-size slide

  108. 'JSFTUPSF
    5*14
    w ෳ਺σʔλͷ੔߹ੑΛ֬อ͢ΔͨΊͷͭͷॻ͖ࠐΈํ๏
    w τϥϯβΫγϣϯ
    w ಡΈࠐΈͱॻ͖ࠐΈɺΦϯϥΠϯૢ࡞ͷΈ
    w όονॻ͖ࠐΈ
    w ॻ͖ࠐΈͷΈɺΦϑϥΠϯͰૢ࡞Մೳ

    View full-size slide

  109. ࠾༻ͨ͠γεςϜͱ'JSFTUPSFΛ࢖ͬͨ৔߹ͷൺֱ
    5*14
    w όονॻ͖ࠐΈ͸ίϯϑϦΫτ͢Δͱഁغ͞ΕΔ
    w σΟϨΫτϦߏ଄ͷίϯϑϦΫτࣗಈղܾͷϙϦγʔͱ͸૬ੑ͕ྑ͍
    w ςΩετͷίϯϑϦΫτखಈղܾͷϙϦγʔͱ͸૬ੑ͕ѱ͍
    w ૢ࡞ʹ"1*ΛڬΉඞཁ͕͋Δ৔߹΍ίϯϑϦΫτΛखಈղܾ͢Δ৔߹
    w ୺຤͝ͱʹૢ࡞ϩά΍ςΩετΛอଘ͢Δ৔ॴ͕ඞཁʹͳΔ
    w ϩʔΧϧ%#΍'JSFTUPSF಺ʹΦϑϥΠϯ࡞ۀσʔλஔ͖৔Λ࡞Δ

    View full-size slide

  110. ࠾༻ͨ͠γεςϜͱ'JSFTUPSFΛ࢖ͬͨ৔߹ͷൺֱ
    5*14
    w ࣍ʹಉ͡Α͏ͳಉظγεςϜΛ࡞ΔͳΒ
    w 'JSFTUPSFͰ࡞Δͱࢥ͍·͢
    w ࠓͷγεςϜͷ'JSFTUPSFʹҠ͔͢
    w ಉظͷϦΞϧλΠϜੑ͚ͩɺ'JSFTUPSFͱ࿈ܞͯ͠վળ͍ͨ͠

    View full-size slide

  111. ϦΞϧλΠϜฤू
    5*14
    w ࠷ۙ͸ϦΞϧλΠϜฤूͷαʔϏε΋ଟ͍
    w ಉظγεςϜ͔ΒݟͨϦΞϧλΠϜฤू
    w ໌ࣔతͳอଘ͸௨ৗͷอଘͱಉ͡
    w جຊతʹಉظγεςϜͷ֎ଆͷ֓೦ͱͯ͠ѻ͑͹Α͍
    w ҉໧తͳอଘΛͲ͜ʹஔ͔͚ͩ͘஫ҙ

    View full-size slide

  112. ϑΝΠϧΞϓϦͱಉظ͢Δ
    5*14
    w *OGPQMJTUͷ6*'JMF4IBSJOH&OBCMFE
    w USVFʹ͢ΔͱϑΝΠϧΞϓϦʹϑΝΠϧΛݟͤΔ͜ͱ͕Ͱ͖Δ
    w σʔλϕʔεͱͷࠩ෼Λݕग़͢Δʹ͸63-ͷCPPLNBSL%BUBΛར༻Մೳ
    w ϑΝΠϧͷҠಈ΍࡟আɺϦωʔϜ΋௥͑ΔʢσΟϨΫτϦߏ଄ʣ
    w ֎෦ΞϓϦͰͷฤू΋ϑΝΠϧͷத਎ΛݟΕ͹֬ೝͰ͖ΔʢςΩετʣ

    View full-size slide

  113. ·ͱΊ
    ΦϑϥΠϯฤू΋Ͱ͖Δෳࡶͳσʔλߏ଄Λ୺຤ؒͰಉظ͢ΔͨΊʹ
    w ΦϑϥΠϯฤूΛڐ༰͢ΔͱίϯϑϦΫτΛߟ͑Δඞཁ͕͋Δ
    w ίϯϑϦΫτͷղফʹؔ͢ΔϙϦγʔΛܾΊΔඞཁ͕͋Δ
    w σΟϨΫτϦߏ଄Ͱ͸σʔλؒͷ੔߹ੑΛͱΔඞཁ͕͋Δ
    w 5*14ͱͯ͠ςετͰͷBTZODBXBJUͷར༻ɺ։ൃ؀ڥ΍'JSFTUPSFͷ࿩Λͨ͠

    View full-size slide