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

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

2e72046813bf3dc01173fe54919a6d1d?s=47 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のファイルアプリに同期対象のファイルを露出させる方法などプラットフォーム固有の話

2e72046813bf3dc01173fe54919a6d1d?s=128

cc4966

September 19, 2021
Tweet

Transcript

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

  2. ࣗݾ঺հ SPLVSPLV w SPLVSPLV 5XJUUFS!@  w ීஈ΍ͬͯΔ͜ͱ w "1*΍%#ઃܭɾ࣮૷

    w J04"OESPJEΞϓϦ։ൃ w Ϩίϝϯυ΍σʔλ෼ੳ w झຯͰ5"5&EJUPSͱ͍͏ॎॻ͖ͷςΩετΤσΟλΛ։ൃͯ͠Δ 
  3. ΦϑϥΠϯฤू΋Ͱ͖Δෳࡶͳ σʔλߏ଄Λ୺຤ؒͰಉظ͢ΔͨΊʹ 

  4. എܠ ΦϑϥΠϯฤू΋Ͱ͖Δෳࡶͳσʔλߏ଄Λ୺຤ؒͰಉظ͢ΔͨΊʹ w എܠ w झຯͰॎॻ͖ͷςΩετΤσΟλΛ։ൃ w J04"OESPJE 8JOEPXT NBD04

    6CVOUVͰఏڙ w খઆͳͲͷࣥචʹ࢖ΘΕΔ͜ͱ͕ଟ͍ w ύιίϯͱεϚϗ྆ํͰॻ͍͍ͯΔਓ΋ଟ͍ 
  5. എܠ ΦϑϥΠϯฤू΋Ͱ͖Δෳࡶͳσʔλߏ଄Λ୺຤ؒͰಉظ͢ΔͨΊʹ w ςΩετΛύιίϯ͔Β΋εϚϗ͔Β΋ฤू͍ͨ͠ 

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

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

  8. ΦϑϥΠϯฤूʹ΋ରԠͨ͠ 
 ಉظػೳΛఏڙ͠Α͏ 

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

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

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

     5*14ʢαʔόʔߏ੒΍'JSFTUPSFͱͷൺֱͳͲʣ  ·ͱΊ 
  12. ಉظγεςϜΛ༻ҙ͢Δ 

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

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

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

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

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

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

    w 'JSFTUPSFͳͲͷ#BB4Λ࢖͏ʢ$MPVE,JUͳͲʣ w ࣗ෼ͰಉظγεςϜΛ༻ҙ͢Δ 
  19. ಉظγεςϜΛ༻ҙ͢Δ ߟ͑ΒΕΔखஈ w 'JSFTUPSFΛ࢖͏ w ౰࣌͸஌͕ࣝෆ଍͍ͯͨͨ͠Ίআ֎ w ࣗ෼ͰಉظγεςϜΛ༻ҙ͢Δ 

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

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

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

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

    w 8FC%"7αʔόʔͳͲΛཱͯΔ  %#ͱ"1*͚ͩͰɺϢʔβʔपΓ͸ 'JSFCBTF"VUIFOUJDBUJPO
  24. ΦϑϥΠϯฤूΛڐ༰͢Δ 

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

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

  27. ΦϑϥΠϯฤूʹ 
 ඞཁͳ΋ͷΛ֬ೝ͢Δ 

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

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

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

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

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

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

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

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

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

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

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

    w ςΩετΛಉظ͢Δ w ςΩετΛαʔόʔ͔Βऔಘͯ͠αʔόʔΩϟογϡʹอଘ͢Δ ΦϑϥΠϯͰ΋࠷ޙʹऔಘ ͨ͠ςΩετ͕ӾཡͰ͖Δ 
  39. ΦϑϥΠϯฤूΛڐ༰͢Δ ؆୯ͳέʔε w ҰͭͷςΩετɺҰͭͷ୺຤͔Βฤूɺෳ਺ͷ୺຤͔ΒӾཡ w ΫϥΠΞϯτ͕؅ཧ͠ͳ͍ͱ͍͚ͳ͍৘ใ w ฤूଆ w ϩʔΧϧͷςΩετͭʢΞοϓϩʔυͷΈʣ

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

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

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

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

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

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

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

    w αʔόʔͷΈมߋ͋ΓˠϩʔΧϧʹ্ॻ͖͢Δ w ϩʔΧϧͱαʔόʔ૒ํʹมߋ͋ΓˠίϯϑϦΫτΛղܾ͢Δ ͋ͱͰৄ͘͠࿩͢ 
  47. ΦϑϥΠϯฤूΛڐ༰͢Δ ؆୯ͳέʔε w ʮαʔόʔͷมߋʯʮαʔόʔͷมߋʯΛ஌ΔͨΊʹඞཁͳ৘ใ ϩʔΧϧ αʔόʔ ΦϑϥΠϯ࡞ۀ ߋ৽ ߋ৽ ߋ৽

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

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

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

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

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

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

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

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

    
  56. ΦϑϥΠϯฤूΛڐ༰͢Δ ؆୯ͳέʔε w ඞཁͳࠩ෼͸ҎԼͷͭ w αʔόʔͰલճऔಘ͔Βมߋͷ͋ͬͨςΩετ͢΂ͯ w αʔόʔͰલճऔಘ͔Β࡞੒͞ΕͨςΩετ͢΂ͯ w αʔόʔͰલճऔಘ͔Β࡟আ͞ΕͨςΩετ͢΂ͯ

    w ·ͨϩʔΧϧʹ͸લճऔಘͨ͠ঢ়ଶΛ͓֮͑ͯ͘ඞཁ͕͋Δ 
  57. ΦϑϥΠϯฤूΛڐ༰͢Δ ؆୯ͳέʔε w ෳ਺ͷςΩετɺෳ਺ͷ୺຤͔Βฤूɺෳ਺ͷ୺຤͔ΒӾཡ w ΫϥΠΞϯτ͕؅ཧ͠ͳ͍ͱ͍͚ͳ͍৘ใ w ϩʔΧϧͷςΩετʢΞϓϦ಺ͷฤू༻ʣ w ΦϦδφϧͷςΩετʢࠩ෼ݕग़༻ͷσʔλʣ

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

    w ΦϦδφϧͱαʔόʔΩϟογϡ͕ҟͳΔͳΒίϯϑϦΫτΛղফ͢Δ 
  59. ίϯϑϦΫτΛղফ͢Δ 

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

     5*14ʢαʔόʔߏ੒΍'JSFTUPSFͱͷൺֱͳͲʣ  ·ͱΊ 
  61. ίϯϑϦΫτղফͱͦͷϙϦγʔ ίϯϑϦΫτͷ໰୊ w ίϯϑϦΫτͱ͸ w ͋Δ୺຤ͱผͷ୺຤ͷ྆ํͰಉ͡ςΩετΛฤूͨ͠ঢ়ଶ w ਖ਼͠͞͸Ϣʔβʔ͔͠ධՁͰ͖ͳ͍ w ༷ʑͳέʔε͕͋Δ

    w ྫʣ΋ͬͱྑ͍ςΩετΛࢥ͍͍ͭͯॻ͍ͨˠ্ॻ͖͢Δ΂͖ w ྫʣهԱʹͳ͍ੲͷΦϑϥΠϯมߋ͕࢒ͬͯͨˠഁغ͢Δ΂͖ 
  62. ίϯϑϦΫτղফͱͦͷϙϦγʔ ίϯϑϦΫτͰͱΕΔखஈ w ςΩετͷίϯϑϦΫτൃੜ࣌ʹऔΕΔબ୒ࢶ w ϢʔβʔʹͲ͏͢Δ͔બ͹ͤͳ͍ w ϢʔβʔʹͲ͏͢Δ͔બ͹ͤΔ w ͦͷ৔Ͱฉ͘

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

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

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

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

    w όʔδϣϯόʔδϣϯ͔Βߋ৽ w όʔδϣϯόʔδϣϯ͔Βߋ৽ ಉ͡όʔδϣϯΛߋ৽͢Δཤྺ ʹίϯϑϦΫτ 
  67. ίϯϑϦΫτղফͱͦͷϙϦγʔ ίϯϑϦΫτͰͱΕΔखஈ w ςΩετͷίϯϑϦΫτͰऔΕΔબ୒ࢶ w Ϣʔβʔʹબ͹ͤͳ͍ w ͦͷ৔ͰϢʔβʔʹબ͹ͤΔ w ͋ͱͰϢʔβʔʹબ΂ΔΑ͏ʹ͢Δ

    w ͜͏ͨ͠બ୒ࢶ͔ΒͲͷखஈΛऔΔ͔͸ࣗ༝ w ͜͜͸αʔϏεͷϙϦγʔ͕ٻΊΒΕΔ෦෼ 
  68. ෳࡶͳσʔλߏ଄ ؆୯ͳέʔε w ͜Εͷಉظͷ࢓૊Έ͸Θ͔ͬͨ w ෳ਺ͷςΩετ w ෳ਺ͷ୺຤͔Βݸผʹฤू w ෳ਺ͷ୺຤͔ΒӾཡ

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

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

    w ෳ਺ͷ୺຤͔Βݸผʹฤू w ෳ਺ͷ୺຤͔ΒӾཡ 
  71. ΦϑϥΠϯฤू΋Ͱ͖Δෳࡶͳ 
 σʔλߏ଄Λ୺຤ؒͰಉظ͢Δ 

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

  73. σΟϨΫτϦߏ଄ ෳࡶͳσʔλߏ଄ w σΟϨΫτϦߏ଄ w ϧʔτʹϑΥϧμ΋͘͠͸ςΩετ͕ଘࡏ͢Δ w ϑΥϧμͷதʹ΋ϑΥϧμ΋͘͠͸ςΩετ͕ଘࡏ͢Δ w ϑΥϧμ΋͘͠͸ςΩετ͸λΠτϧΛ࣋ͭ

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

    w ςΩετ͸࡟আ͞ΕΔͱΰϛശʹೖΔʢ෮ݩͰ͖Δʣ w ʢʴϑΥϧμ಺ͷςΩετͱϑΥϧμͷදࣔॱং͸อଘ͞ΕΔʣ ࿩࿩ͷΑ͏ͳ έʔε͕ଟ͍ 
  75. σΟϨΫτϦߏ଄ ෳࡶͳσʔλߏ଄ w σΟϨΫτϦߏ଄ w ςΩετ͕ෳ਺ʹޓ͍ͷ৘ใΛҰ੾࣋ͨͳ͍ w σΟϨΫτϦߏ଄ʹޓ͍ͷ৘ใΛ࣋ͭ w σʔλʹෆ੔߹͕ى͜ΓಘΔ

    w ྫʣଘࡏ͠ͳ͍ϑΥϧμʹॴଐ͢Δ w ྫʣπϦʔ͕ϧʔϓ͢Δ 
  76. σΟϨΫτϦߏ଄ ෳࡶͳσʔλߏ଄ w σΟϨΫτϦߏ଄ΛͲ͏΍ͬͯಉظ͢Δ͔ w ͢΂ͯͷσʔλΛ΍ΓऔΓ͢Δ෼ʹ͸໰୊͸ى͖ͳ͍

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

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

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

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

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

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

    ߋ৽͞Εͳ͍      JE JE JE JE JE JE      JE JE JE JE JE JE
  83. σΟϨΫτϦߏ଄ ෳࡶͳσʔλߏ଄ w ΞΠςϜͷ৘ใ w *% w λΠτϧ w ਌ͷΞΠςϜ*%

    w खલͷΞΠςϜ*% w ςΩετ*% w ςΩετͷ৘ใ w *% w ຊจ
  84. σΟϨΫτϦߏ଄ ෳࡶͳσʔλߏ଄ w σΟϨΫτϦߏ଄͕ςʔϒϧͰදݱͰ͖Δ w ࠩ෼͸ߋ৽೔Λอଘ͢Δ͜ͱͰ൑ผͰ͖Δ w ςΩετಉ༷ɺαʔόʔͷσΟϨΫτϦߏ଄ͷมߋΛࠩ෼औಘͰ͖Δ w ΞΠςϜͷ࡟আͰ͸ςΩετ͸࡟আ͞Εͳ͍΋ͷͱ͢Δ

    w ΞΠςϜʹඥ͔ͮͳ͍ςΩετͰ࢒Δʢʹ͜ΕΛΰϛശঢ়ଶͱ͢Δʣ
  85. σΟϨΫτϦߏ଄ ෳࡶͳσʔλߏ଄ͷૢ࡞ w औΓ͏Δૢ࡞ w ϑΥϧμ΍ςΩετΛϦωʔϜ͢ΔʢλΠτϧͷมߋʣ w ϑΥϧμ΍ςΩετΛ࡞੒͢Δ w ϑΥϧμ΍ςΩετΛ࡟আ͢Δ

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

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

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

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

    w ૢ࡞ͭͭͷ੔߹ੑͰࠩ෼શମͷ੔߹ੑΛอͯΔ w ʢςΩετશମͷมߋͷ൓ө͸ॱংΛ໰Θͳ͍΋ͷͩͬͨʣ 
  90. σΟϨΫτϦߏ଄ ίϯϑϦΫτ΁ͷϙϦγʔ w ίϯϑϦΫτ΁ͷϙϦγʔΛҎԼͷΑ͏ʹఆΊͨ w ࡞੒ૢ࡞͸ࣦഊͤ͞ͳ͍ʢϧʔτʹ࡞੒͢Δʣ w ࡟আɾҠಈɾฒͼସ͑ૢ࡞͸ࣦഊͨ͠Βແࢹ͢Δ w ϦωʔϜ͸ޙউͪʹ͢Δ

    w ςΩετͱ͸ٯͰ͢΂ͯػցతʹղফ͢ΔϙϦγʔ w ԾʹΞΠςϜ͕ফ͑ͯ΋ΰϛശঢ়ଶͷςΩετ͕࢒ΔͷͰ໰୊ͳ͍ͱ൑அ 
  91. σΟϨΫτϦߏ଄ ίϯϑϦΫτ΁ͷϙϦγʔ w ϙϦγʔΛߟ͑Δࡍʹ͸஫ҙ͢Δ͜ͱ w σΟϨΫτϦͷૢ࡞͸ॱংґଘ w ྫʣ w "Λ#ʹҠಈ͢Δˠ"Λ$ʹҠಈ͢Δˠ#Λ࡟আ͢Δʹ"͸࢒Δ

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

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

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

     ϩʔΧϧʹαʔόʔΩϟογϡͷঢ়ଶΛ൓ө ͍ΘΏΔSFCBTF 
  95. ࣮ࡍͷΫϥΠΞϯτଆͷॲཧ શମͷಉظॲཧͷखॱ w ΦϑϥΠϯ࡞ۀ͔ΒΦϯϥΠϯʹ෮ؼͨ͠ࡍ w σΟϨΫτϦߏ଄ͷಉظ w ࠓճͷίϯϑϦΫτϙϦγʔɿࣗಈతʹղܾ͞ΕΔ w ςΩετͷಉظ

    w ࠓճͷίϯϑϦΫτϙϦγʔɿϢʔβʔʹ֬ೝΛͱΔ 
  96. ಉظͰେࣄͳ͜ͱ σʔλͷ੔߹ੑͱίϯϑϦΫτ࣌ͷϙϦγʔ w ϩʔΧϧͷσʔλͷ੔߹ੑɺαʔόʔͰͷσʔλͷ੔߹ੑ w σΟϨΫτϦߏ଄ΛอͭͨΊʹඞਢ w ΦϑϥΠϯ࡞ۀΛڐ༰͢ΔͱίϯϑϦΫτ͸ൃੜ͢Δ w ίϯϑϦΫτͨ͠΋ͷΛͲ͏ॲཧ͢Δ͔ͷϙϦγʔΛఆΊΔඞཁ͕͋Δ

    w ࠓճͷέʔεͰ͸σΟϨΫτϦͱςΩετΛ෼཭ͯ͠ҎԼͷΑ͏ʹఆΊͨ w σΟϨΫτϦ͸ࣗಈղܾɺத਎ͷςΩετ͸खಈղܾ 
  97. 5*14 

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

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

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

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

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

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

    w πʔϧ͸(3%#TXJGUΛར༻ͨ͠ 
  105. ։ൃ؀ڥʹ͍ͭͯ 5*14 w 9DPEFCFUBͰBTZODBXBJUΛར༻ͯ͠௨৴ؚΉςετΛॻ͍ͨ w ςετΫϥε͚ͩ!BWBJMBCMF J04  Ͱׅͬͨ w

    ςετͷEFQMPZNFOUUBSHFUΛม͑ΔͰ΋ྑ͍ w ςετ͚ͩͰ΋BTZODBXBJUΛ࢖͏͜ͱͰίʔυྔΛ͔ͳΓ࡟ݮͰ͖ͨ 
  106. 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() } }) } 
  107. 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) } 
  108. 'JSFTUPSF 5*14 w $MPVE'JSFTUPSF w ϦΞϧλΠϜಉظ w Ϣʔβʔॻ͖ࠐΈΛڐ͢৔߹σʔλͷ੔߹ੑΛSVMFTͰอূ͢Δඞཁ͕͋Δ w SVMFT͕ຬ଍͞Εͳ͍ͱॻ͖ࠐΈ͕ࣦഊ͢Δ

    w σΟϨΫτϦߏ଄ͷ੍໿͸͜͜Ͱදݱ͢Δඞཁ͕͋Δ 
  109. 'JSFTUPSF 5*14 w ෳ਺σʔλͷ੔߹ੑΛ֬อ͢ΔͨΊͷͭͷॻ͖ࠐΈํ๏ w τϥϯβΫγϣϯ w ಡΈࠐΈͱॻ͖ࠐΈɺΦϯϥΠϯૢ࡞ͷΈ w όονॻ͖ࠐΈ

    w ॻ͖ࠐΈͷΈɺΦϑϥΠϯͰૢ࡞Մೳ 
  110. ࠾༻ͨ͠γεςϜͱ'JSFTUPSFΛ࢖ͬͨ৔߹ͷൺֱ 5*14 w όονॻ͖ࠐΈ͸ίϯϑϦΫτ͢Δͱഁغ͞ΕΔ w σΟϨΫτϦߏ଄ͷίϯϑϦΫτࣗಈղܾͷϙϦγʔͱ͸૬ੑ͕ྑ͍ w ςΩετͷίϯϑϦΫτखಈղܾͷϙϦγʔͱ͸૬ੑ͕ѱ͍ w ૢ࡞ʹ"1*ΛڬΉඞཁ͕͋Δ৔߹΍ίϯϑϦΫτΛखಈղܾ͢Δ৔߹

    w ୺຤͝ͱʹૢ࡞ϩά΍ςΩετΛอଘ͢Δ৔ॴ͕ඞཁʹͳΔ w ϩʔΧϧ%#΍'JSFTUPSF಺ʹΦϑϥΠϯ࡞ۀσʔλஔ͖৔Λ࡞Δ 
  111. ࠾༻ͨ͠γεςϜͱ'JSFTUPSFΛ࢖ͬͨ৔߹ͷൺֱ 5*14 w ࣍ʹಉ͡Α͏ͳಉظγεςϜΛ࡞ΔͳΒ w 'JSFTUPSFͰ࡞Δͱࢥ͍·͢ w ࠓͷγεςϜͷ'JSFTUPSFʹҠ͔͢ w ಉظͷϦΞϧλΠϜੑ͚ͩɺ'JSFTUPSFͱ࿈ܞͯ͠վળ͍ͨ͠

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

    w ҉໧తͳอଘΛͲ͜ʹஔ͔͚ͩ͘஫ҙ 
  113. ϑΝΠϧΞϓϦͱಉظ͢Δ 5*14 w *OGPQMJTUͷ6*'JMF4IBSJOH&OBCMFE w USVFʹ͢ΔͱϑΝΠϧΞϓϦʹϑΝΠϧΛݟͤΔ͜ͱ͕Ͱ͖Δ w σʔλϕʔεͱͷࠩ෼Λݕग़͢Δʹ͸63-ͷCPPLNBSL%BUBΛར༻Մೳ w ϑΝΠϧͷҠಈ΍࡟আɺϦωʔϜ΋௥͑ΔʢσΟϨΫτϦߏ଄ʣ

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