操作履歴/時点指定アクセスの実現 - BiTemporal Data Model の実践 / Implementing command history and temporal access

F20a0e7a1b655d2d0284503f8201467d?s=47 f440
March 23, 2019

操作履歴/時点指定アクセスの実現 - BiTemporal Data Model の実践 / Implementing command history and temporal access

この資料で説明している ActiveRecord::BiTemporal は https://github.com/kufu/activerecord-bitemporal よりアクセスできます。

以下、セッション説明:

データはWebアプリケーションの中心であり、最も重要なものです。私の勤めるSmartHRでも、人事情報を軸とするWebサービスを展開する事業者として最大限の注意を払って運用を行っています。

データは活動によって刻々と変わっていくものですが、通常のWebアプリケーションでは最新の情報しか表現できていません。そのため、いつ・どのような変更を加えたのかを知りたい、あるいはある時点の情報にアクセスしたいといった要望には応えることができませんでした。SmartHRでは入退社や被扶養者の追加など多様なライフイベントに応じてデータの変更が発生するため、その変遷も表現したいというニーズがかねてよりありました。

この問題を解決するために、私達はBiTemporal Data Modelというデータ構造を導入しています。これにより、時間を指定したアクセスや変更の変遷なども表現できるようになりました。

本セッションではBiTemporal Data Modelとはなにかといった基本的なことから、実戦投入してみて気づいた点、苦労話などを話します。

F20a0e7a1b655d2d0284503f8201467d?s=128

f440

March 23, 2019
Tweet

Transcript

  1. 3BJMT%FWFMPQFS.FFUVQ!0SBDMF$PSQPSBUJPO+BQBO ૢ࡞ཤྺ࣌఺ࢦఆΞΫηεͷ࣮ݱ
 #J5FNQPSBM%BUB.PEFMͷ࣮ફ 4BU G 4NBSU)3ΤϯδχΞ CONFIDENTIAL

  2. ࣗݾ঺հ CONFIDENTIAL

  3. !G גࣜձࣾ4NBSU)3ॴଐ ΤϯδχΞ ೥݄ೖࣾ  4NBSU)3ίΞػೳͷอकɾ֦ுΛ୲౰ CONFIDENTIAL

  4. None
  5. ࣾձอݥ౳ͷॻྨΛ ࣗಈ࡞੒ ैۀһ৘ใΛ σʔλϕʔεԽ ໾ॴ΁γʔϜϨεʹ ΦϯϥΠϯਃ੥ ਓࣄ৘ใΛ Χϯλϯʹऩू ˔˔˔˔ ˔˔˔˔˔˔˔˔

    ˔˔˔˔˔˔˔˔ ˔˔˔˔ ˔˔˔˔˔˔˔˔ ˔˔˔˔ ˔˔˔˔˔˔˔˔ ˔˔˔˔ ˔˔˔˔˔˔˔˔ ˔˔˔˔ ˔˔˔˔˔˔˔˔ ˔˔˔˔ ˔˔˔˔˔˔˔˔ ˔˔˔˔ ˔˔˔˔˔˔˔˔ ˔˔˔˔ ˔˔˔˔˔˔˔˔ ˔˔˔˔ ˔˔˔˔˔˔˔˔ ˔˔˔˔ ˔˔˔˔˔˔˔˔ 4NBSU)3͸ɺਓࣄɾ࿑຿ʹؔ͢Δखଓ͖ͷ ࣗಈԽΛ໨ࢦ͢Ϋϥ΢υܕιϑτ΢ΣΞͰ͢ɻ
  6. ߦ੓΁ͷ ిࢠਃ੥ څ༩໌ࡉ ޏ༻ܖ໿ॻ ैۀһ%# εϚϗͰ ೥຤ௐ੔ ࣾձอݥ ޏ༻อݥ ਓࣄɾ࿑຿Λ෯޿͘Χόʔʢࠓޙ΋֦େ͍͖ͯ͠·͢ʣ

    /FX
  7. ࠓޙͷํ਑ ݱࡏ ਓࣄ޲͚ 4BB4 ސ٬ج൫ ʢਓࣄɾैۀһʣ ਓࣄ%# ʢձࣾɾݸਓʣ ஷ·Δࢿ࢈ কདྷ

    Ξοϓηϧ ϓϩμΫτ ϓϥοτ ϑΥʔϜԽ ۚ༥঎඼ ʢ'JO5FDIʣ কདྷ
  8. ࠓޙͷํ਑ ݱࡏ ਓࣄ޲͚ 4BB4 ސ٬ج൫ ʢਓࣄɾैۀһʣ ਓࣄ%# ʢձࣾɾݸਓʣ ஷ·Δࢿ࢈ কདྷ

    Ξοϓηϧ ϓϩμΫτ ϓϥοτ ϑΥʔϜԽ ۚ༥঎඼ ʢ'JO5FDIʣ কདྷ ຊ೔ͷ࿩୊
  9. ਓࣄ%# ब৬ ݁ࠗ ग़࢈ ҟಈ

  10. 4NBSU)3Ͱ͸ʜʜ
 ɾϥΠϑΠϕϯτͰมߋ͕ൃੜ ɹɾೖࣾɺୀࣾɺҾͬӽ͠ɺ݁ࠗɺग़࢈ͳͲ ɾݸਓ৘ใͷ͔ͨ·Γ ɹɾࢯ໊ɺॅॴɺ೥ۚ੔ཧ൪߸ͳͲ มભ͢ΔσʔλͷτϨʔαϏϦςΟͷ֬อ͕ඞཁ ਓࣄ%#

  11. มભ͢ΔσʔλͷཤྺΛ࢒͍ͨ͠ ࢸߴͷਓࣄ%#ΛٻΊͯʜʜ ཤྺ͕࢒ͤΔΑ͏ʹͳͬͨΒʜ ɾ͋Δ࣌఺ͰͷσʔλΛҰཡ͍ͨ͠ ɹࣾһ਺ɺੈ୅ߏ੒ɺஉঁൺͳͲͷ෼ੳ ɾաڈͷ৘ใΛߋ৽͍ͨ͠ ɹͦͯ͠ʮߋ৽ͨ͠ʯͱ͍͏৘ใ΋࢒ͬͯ΄͍͠

  12. 4NBSU)3ຊମ ʹ3VCZPO3BJMTͷ ɹϞϊϦγοΫΞϓϦέʔγϣϯ "DUJWF3FDPSEͰͳΜͱ͔͢Δඞཁ͕͋Δ 4NBSU)3͸3P3ͰͰ͖͍ͯ·͢

  13. CONFIDENTIAL 3VCZPO3BJMT
 ☓
 ཤྺ

  14. # db/migrate/*.rb class CreateUsers < ActiveRecord::Migration[5.2] def change create_table :users

    do |t| t.string :name t.string :email t.timestamps end end end 3VCZPO3BJMTσϑΥϧτ
  15. # db/schema.rb
 create_table "users", force: :cascade do |t| t.string "name"

    t.string "email" t.datetime "created_at", null: false t.datetime "updated_at", null: false end 3VCZPO3BJMTσϑΥϧτ
  16. UUJNFTUBNQT ɹDSFBUFE@BU VQEBUFE@BU͕࡞ΒΕΔ ෺ཧ࡟আ 3VCZPO3BJMTσϑΥϧτ

  17. ෳ਺ճߋ৽͞ΕΔͱɺ࠷৽ͷߋ৽೔෇͚͕ͩ ࢒Δ ফ͞Εͨ৘ใ͸੻ܗ΋ͳ͘ͳΔ 3VCZPO3BJMTσϑΥϧτ ͜Ε͚ͩͩͱۀ຿༻݅తʹݫ͍͠ʜ

  18. ͍Ζ͍Ζͳख๏͕͋ΔͷͰɺ ͬ͘͟Γͱ঺հ 3BJMT☓ཤྺ

  19. ɾྫQBSBOPJB ɾEFMFUFE@BUΛ௥Ճ ɾ࡟আ࣌ɺEFMFUFE@BU5JNFDVSSFOU ɾݕࡧ࣌ɺ\EFMFUFE@BUOJM^ͳ ɹείʔϓΛ௥Ճ ࿦ཧ࡟আ

  20. ૿Ճ͢Δ஋ʢ਺ࣈɺ೔෇ʣΛ֨ೲͰ͖Δ ΧϥϜΛ༻ҙ
 ྫWFSTJPO EFMFUFE@BU όʔδϣχϯά ࠷৽ EFMFUFE@BU EFMFUFE@BU EFMFUFE@BU EFMFUFE@BU/6--

    WFS WFS WFS WFS
  21. ࣮૷ྫ EFMFUFE@BUͷ৔߹  ɾૠೖ ɹಛʹมߋແ͠ ɾ࡟আ ɹ࿦ཧ࡟আ όʔδϣχϯά

  22. ࣮૷ྫ EFMFUFE@BUͷ৔߹  ɾߋ৽ ɹݱߦϨίʔυΛ࿦ཧ࡟আ
 ɹߋ৽಺༰Λૠೖ ɾࢀর ɹ௨ৗ࿦ཧ࡟আͰͳ͍΋ͷΛݕࡧ ɹաڈͷόʔδϣϯʹΞΫηε࿦ཧ࡟আ͞Ε͍ͯΔ΋ͷΛݕࡧ όʔδϣχϯά

  23. <JE ৚݅ΧϥϜ>Ͱ ෳ߹ओΩʔతͳऔѻ͍ʹͳΔ ݱࡏͷ৘ใͱཤྺΛಉҰςʔϒϧͰ ؅ཧ͢ΔͨΊɺ ϢχʔΫ੍໿΍ϦϨʔγϣϯͳͲͰߟྀ͕ඞཁ ࿦ཧ࡟আɺόʔδϣχϯά

  24. ผͷςʔϒϧʹίϐʔ ΍Γ͔ͨ ɾ%#ͷτϦΨʔ ɾΞϓϦέʔγϣϯͰߋ৽ɾ࡟আॲཧΛϑοΫ ίϐʔ಺༰ ɾϨίʔυͷશ಺༰ ɾࠩ෼ ཤྺςʔϒϧ

  25. τϦΨʔͰίϐʔ ΞϓϦέʔγϣϯʹมߋ͕͍Βͳ͍ ݱߦσʔλͱࠞ͡Βͳ͍ͷͰѻ͍΍͍͢ ੑೳ໘Ͱ΋ϝϦοτ͋Γ ݱߦσʔλͱཤྺΛࠞͥͯදࣔ͢Δͷ͸໘౗ ɹʢͱ͘ʹؔ࿈ʣ ཤྺςʔϒϧ

  26. ɾྫQBQFS@USBJM BVEJUFE ɾߋ৽಺༰ΛγϦΞϥΠζͯ͠ ɹผςʔϒϧʹૠೖ
 ɾࠩ෼Λٯॱʹద༻͍ͯ͘͜͠ͱͰ ɹϩʔϧόοΫ΋ ʢ4NBSU)3Ͱ΋Ҏલ࢖͍ͬͯͨʣ ཤྺςʔϒϧ

  27. ɾΞϓϦέʔγϣϯϩά ɾ%#ͷ1*53 ɾ%#ࣗମͷػೳ ɹ.BSJB%#ʜ4ZTUFNWFSTJPOFE5BCMFT ɹ0SBDMFʜ*O%BUBCBTF"SDIJWJOH ͳͲ ཁ݅΍ίετʹԠͯ͡ݕ౼͕ඞཁ ͦͷଞ

  28. 2ɿ͍ͣΕ͔ͷํ๏Ͱ
 ɹɹཁ๬Λຬͨͤͦ͏͔ʁ CONFIDENTIAL

  29. ̖ɿ๻ͨͪͷٻΊΔ΋ͷʹ͸ ɹɹಧ͔ͳ͔ͬͨ CONFIDENTIAL

  30. มભ͢ΔσʔλͷཤྺΛ࢒͍ͨ͠ ʢ͓͞Β͍ ࢸߴͷਓࣄ%#ΛٻΊͯʜʜ ཤྺ͕࢒ͤΔΑ͏ʹͳͬͨΒʜ ɾ͋Δ࣌఺ͰͷσʔλΛҰཡ͍ͨ͠ ɹࣾһ਺ɺੈ୅ߏ੒ɺஉঁൺͳͲͷ෼ੳ ɾաڈͷ৘ใΛߋ৽͍ͨ͠ ɹͦͯ͠ʮߋ৽ͨ͠ʯͱ͍͏৘ใ΋࢒ͬͯ΄͍͠

  31. ͳʹ͔ͳ͍ͷ͔ʜʜ CONFIDENTIAL

  32. ʊਓਓਓਓਓਓਓਓਓਓਓਓʊ ʼɹBiTemporal Data Modelɹʻ ʉY^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ʉ

  33. CONFIDENTIAL #J5FNQPSBM%BUB.PEFM

  34. CONFIDENTIAL #J5FNQPSBM%BUB.PEFM ͭͷ ࣌ؒతͳ

  35. OPOUFNQPSBMEBUBNPEFM VOJUFNQPSBMEBUBNPEFM CJUFNQPSBMEBUBNPEFM

  36. OPOUFNQPSBMEBUBNPEFM %FMFUF *OTFSU 6QEBUF ࠷৽৘ใͷεφοϓγϣοτΛදݱ

  37. OPOUFNQPSBMEBUBNPEFM ೖࣾ *% ໾৬  

  38. OPOUFNQPSBMEBUBNPEFM *% ໾৬  ˠ෦௕ ෦௕ʹঢ֨

  39. OPOUFNQPSBMEBUBNPEFM *% OBNF  ෦௕ ୀ৬

  40. VOJUFNQPSBMEBUBNPEFM %FMFUF *OTFSU 6QEBUF ͦͷϨίʔυ͕༗ޮͳ࣌ؒΛ΋ͨͤΔ

  41. VOJUFNQPSBMEBUBNPEFM *% ໾৬ ։࢝ ऴྃ    㱣 ೖࣾ

    ༗ޮظؒ
  42. VOJUFNQPSBMEBUBNPEFM ෦௕ʹঢ֨ #FGPSF "GUFS  ʿ ʔ  ʿ ʔ

     ෦௕ ࡟আ
  43. VOJUFNQPSBMEBUBNPEFM *% ໾৬ ։࢝ ऴྃ    㱣ˠ ෦௕ʹঢ֨

  44. VOJUFNQPSBMEBUBNPEFM *% ໾৬ ։࢝ ऴྃ    㱣ˠ 

    ෦௕  㱣 ෦௕ʹঢ֨
  45. VOJUFNQPSBMEBUBNPEFM ୀࣾ #FGPSF  ʿ  "GUFS   

    ʔ ෦௕ ෦௕ ʔ
  46. VOJUFNQPSBMEBUBNPEFM *% ໾৬ ։࢝ ऴྃ     

    ෦௕  㱣ˠ ୀ৬
  47. Αͦ͞͏ VOJUFNQPSBMEBUBNPEFM

  48. VOJUFNQPSBMEBUBNPEFM ʮd͸ʰ܎௕ʱͩͬͨ͜ͱ͕ൃ֮ʯ #FGPSF "GUFS      

     ʔ ෦௕ ෦௕ ʔ ܎௕
  49. VOJUFNQPSBMEBUBNPEFM *% ໾৬ ։࢝ ऴྃ    ˠ 

    ෦௕   ʮdͷظؒ͸ʰ܎௕ʱͩͬͨʯ͜ͱ͕ൃ֮
  50. VOJUFNQPSBMEBUBNPEFM *% ໾৬ ։࢝ ऴྃ    ˠ 

    ܎௕    ෦௕   ʮdͷظؒ͸ʰ܎௕ʱͩͬͨʯ͜ͱ͕ൃ֮
  51. VOJUFNQPSBMEBUBNPEFM *% ໾৬ ։࢝ ऴྃ    ˠ 

    ܎௕    ෦௕   ʮdͷظؒ͸ʰ܎௕ʱͩͬͨʯ͜ͱ͕ൃ֮ ͱ͍͏৘ใ͕Ͳ͜ʹ΋ͳ͍ʂ
  52. ༗ޮظؒͱϨίʔυͷૢ࡞͕࣌ؒಉ͡Ͱ͋Ε͹ ໰୊ͳ͍͕ɺաڈͷཤྺૢ࡞͕ൃੜͯ͘͠Δͱ ༗ޮظؒͱૢ࡞࣌ؒ͸͹Β͹ΒʹͳΔɻ ઌఔͷྫͰ͸ʮ༗ޮظ͕ؒมߋ͞Εͨʯͱ͍͏ه࿥͕ දݱͰ͖͍ͯͳ͔ͬͨɻ VOJUFNQPSBMEBUBNPEFM

  53. ɾ༗ޮظؒ ɾγεςϜతͳ࣌ؒ ͭͷ࣌ؒ࣠Λผʑʹ؅ཧ͢Δඞཁੑ ˰#J5FNQPSBMEBUBNPEFM

  54. CJUFNQPSBMEBUBNPEFM U U

  55. *% ໾৬ ։࢝ ऴྃ ௥Ճ ࡟আ    㱣

     㱣 ೖࣾ ༗ޮظؒ γεςϜతͳظؒ CJUFNQPSBMEBUBNPEFM
  56. CJUFNQPSBMEBUBNPEFM ෦௕ʹঢ֨ #FGPSF "GUFS  ʿ ʔ  ʿ ʔ

    ʔ  ෦௕ ࡟আ
  57. *% ໾৬ ։࢝ ऴྃ ௥Ճ ࡟আ    㱣

     㱣ˠ ෦௕ʹঢ֨ CJUFNQPSBMEBUBNPEFM
  58. *% ໾৬ ։࢝ ऴྃ ௥Ճ ࡟আ    㱣

     㱣ˠ      㱣  ෦௕  㱣  㱣 ෦௕ʹঢ֨ CJUFNQPSBMEBUBNPEFM
  59. CJUFNQPSBMEBUBNPEFM ୀࣾ #FGPSF  ʿ  "GUFS  ࡟আ

  60. *% ໾৬ ։࢝ ऴྃ ௥Ճ ࡟আ    㱣

           㱣  ෦௕  㱣  㱣ˠ ୀࣾ CJUFNQPSBMEBUBNPEFM
  61. *% ໾৬ ։࢝ ऴྃ ௥Ճ ࡟আ    㱣

           㱣  ෦௕  㱣  㱣ˠ  ෦௕    㱣 ୀࣾ CJUFNQPSBMEBUBNPEFM
  62. CJUFNQPSBMEBUBNPEFM #FGPSF  ʮdͷظؒ͸ʰ܎௕ʱͩͬͨʯ͜ͱ͕ൃ֮   "GUFS   

    
  63. *% ໾৬ ։࢝ ऴྃ ௥Ճ ࡟আ    㱣

           㱣ˠ  ෦௕  㱣    ෦௕    㱣 ʮdͷظؒ͸ʰ܎௕ʱͩͬͨʯ͜ͱ͕ൃ֮ CJUFNQPSBMEBUBNPEFM
  64. *% ໾৬ ։࢝ ऴྃ ௥Ճ ࡟আ    㱣

           㱣ˠ      㱣  ՝௕    㱣  ෦௕  㱣    ෦௕    㱣 ʮdͷظؒ͸ʰ܎௕ʱͩͬͨʯ͜ͱ͕ൃ֮ CJUFNQPSBMEBUBNPEFM
  65. Α͘Θ͔Γ·ͨ͠Ͷ CONFIDENTIAL

  66. 4NBSU)3ຊମ ʹ3VCZPO3BJMTͷ ɹϞϊϦγοΫΞϓϦέʔγϣϯ "DUJWF3FDPSEͰͳΜͱ͔͢Δඞཁ͕͋Δ ͓͞Β͍ɿ4NBSU)3͸3P3ͰͰ͖͍ͯ·͢

  67. CONFIDENTIAL "DUJWF3FDPSE#J5FNQPSBM

  68. ࢓૊Έ *% ໾৬ ։࢝ ऴྃ ௥Ճ ࡟আ   

    㱣        㱣  ෦௕  㱣  㱣 JE CJUFNQPSBM@JE QPTJUJPO WBMJE@GSPN WBMJE@UP DSFBUFE@BU EFMFUFE@BU     㱣         㱣   ෦௕  㱣  㱣 σʔλϕʔεͰදݱ
  69. ࢓૊Έ JE CJUFNQPSBM@JE QPTJUJPO WBMJE@GSPN WBMJE@UP DSFBUFE@BU EFMFUFE@BU  

      㱣   JEʜ3BJMTඪ४ CJUFNQPSBM@JE
 ʜૢ࡞ର৅ΛҰҙʹ͢ΔͨΊͷ*%
  70. ࢓૊Έ JE CJUFNQPSBM@JE QPTJUJPO WBMJE@GSPN WBMJE@UP DSFBUFE@BU EFMFUFE@BU  

      㱣   WBMJE@GSPN WBMJE@UPʜ༗ޮظؒ DSFBUFE@BU EFMFUFE@BUʜγεςϜظؒ
  71. Ϟσϧʹ"3#J5FNQPSBM༻Λ༻ҙ 
 ./bin/rails generate model User \ name:string \ bitemporal_id:integer

    \ valid_from:datetime \ valid_to:datetime \ deleted_at:datetime ར༻ํ๏
  72. ࢓૊Έ irb(main):002:0> User.find(1) User Load (0.8ms) SELECT "users".* FROM "users"

    
 WHERE "users"."deleted_at" IS NULL 
 AND "users"."valid_from" <= '2019-03-10 07:40:32.238952' 
 AND "users"."valid_to" > '2019-03-10 07:40:32.238952'
 AND "users"."bitemporal_id" = $1 
 LIMIT $2 
 [["bitemporal_id", 1], ["LIMIT", 1]] ҎԼΛࣗಈతʹ࣮ࢪ
 ɾ࡟আ͞Ε͍ͯͳ͍͔ͷ൑ఆ ɾ༗ޮ͔Ͳ͏͔ͷ൑ఆ
 ɾJEΛCJUFNQPSBM@JEʹಡΈସ͑
  73. ݱ࣌఺ͷσʔλʹΞΫηε͢ΔͨΊͷ ΠϯλʔϑΣʔε͸΄΅௨ৗͷ"DUJWF3FDPSEͱಉ͡ ར༻ํ๏ Company.where(city: 'Tokyo') user = User.find(123) user.destroy

  74. ͍͔ͭ͘ͷϝιουΛ௥Ճ ɾWBMJE@BU ར༻ํ๏ # 1೥લͷσʔλʹΞΫηε Company.valid_at(1.year.ago).where(city: 'Tokyo') # ϦϨʔγϣϯ΋ḷΕΔʂ company

    = Company.valid_at(1.year.ago).take company.employees # 1೥લͷैۀһ৘ใΛऔಘ
  75. ͍͔ͭ͘ͷϝιουΛ௥Ճ ɾJHOPSF@WBMJE@EBUFUJNF ར༻ํ๏ # ͋ΔϢʔβʔͷมߋཤྺΛੜ੒
 User.ignore_valid_datetime
 .where(bitemporal_id: param[:id]) .order(:valid_from)

  76. CONFIDENTIAL ಋೖ

  77. "3#J5FNQPSBMΛಋೖͯ͠Έ ͯΘ͔ͬͨ͜ͱʜ CONFIDENTIAL

  78. ͍Ζ͍ΖͭΒ͍ʂʂʂ CONFIDENTIAL

  79. ͭΒ͍ϙΠϯτʢʣϢχʔΫ੍໿ ༗ޮظؒ͸ॏͳΓ߹Θͳ͍͸͕ͣʜʜ

  80. ͭΒ͍ϙΠϯτʢʣϢχʔΫ੍໿ ॏͳͬͯΔ

  81. <CJUFNQPSBM@JE ༗ޮظؒɺ࡟আϑϥά>Ͱ ϢχʔΫʹͳΔ͸͕ͣɺͳ͔ͥ༗ޮظؒͷ ॏͳΔσʔλ͕ੜ·Εͨ ظؒॏෳνΣοΫ༻ΧελϜόϦσʔγϣ ϯ͸࡞ͬͯ͋ͬͨΜ͚ͩͲʜʜ ͭΒ͍ϙΠϯτʢʣϢχʔΫ੍໿

  82. ˰%#ϨϕϧͰ੔߹ੑΛ୲อͨ͠΄͏͕͍͍ ͭΒ͍ϙΠϯτʢʣϢχʔΫ੍໿ -- ॏͳΓνΣοΫ (PostgreSQL) ALTER TABLE users ADD EXCLUDE

    USING GIST (bitemporal_id WITH =, tsrange(valid_from, valid_to) WITH &&, COALESCE(deleted_at, '9999-12-31 00:00:00')WITH =);
  83. ɾ%#্ͷओΩʔAJEAͷ·· ɾ࣮ࡍͷΞΫηε࣌͸ ɹ<CJUFNQPSBM@JE ༗ޮظؒ ࡟আϑϥά> ɹෳ߹৚݅ ɾΠϯελϯεʹJE͢ΔͱCJUFNQPSBM@JE͕ฦΔ ͜ΕͰ֓Ͷ໰୊ͳ͍ͷ͕ͩʜʜ ͭΒ͍ϙΠϯτʢʣϓϥΠϚϦʔΩʔ

  84. ੜͷओΩʔΛ಺෦Ͱ࢖͍ͬͯΔ Ұ෦ͷ(FN͕յΕΔ ɹɾBDUT@BT@MJTU BODFTUSZ 
 ɹɹBDUJWFSFDPSEJNQPSU ˰ϞϯΩʔύον ɹPSఘΊΔʜʜʢ࢖Θͳ͍Α͏मਖ਼ʣ ͭΒ͍ϙΠϯτʢʣϓϥΠϚϦʔΩʔ

  85. ࡞੒೔ιʔτɺߋ৽೔ιʔτ
 ɾϨίʔυ͕௥Ճ͞ΕΔҰํ ɾաڈʹ͔͞ͷ΅ͬͯσʔλΛมߋͰ͖Δ ௨ৗͷ֓೦่͕յ ˰ཁ݅ʹԠͯ͡దٓௐ੔ ͭΒ͍ϙΠϯτʢʣιʔτ

  86. ɾ҉໧తͳιʔτ ɹGJSTU MBTU͸҉໧తʹ ɹ03%&3#:\QSJNBSZ@LFZ^͍ͯ͠Δ ˰ཁ݅ʹԠͯ͡ௐ੔ ˞3BJMT͔Β͸JNQMJDJU@PSEFS@DPMVNOͰ ɹ੍ޚՄೳ ͭΒ͍ϙΠϯτʢʣιʔτ

  87. 61%"5& %&-&5&Ͱ΋Ϩίʔυ͕ੜ·ΕΔ ˰΋ͱ΋ͱγϟʔσΟϯά͍ͯ͠ΔͷͰɺ ɹߜΓࠐΈൣғ͸ݶఆ͞Ε͍ͯͨ ɹʰ4NBSU)3σʔλϕʔεҠߦϓϩδΣΫτͷཪଆʱ ˰ΠϯσοΫε͕ޮ͍ͯΔ͠ࠓͷͱ͜Ζେৎ෉ͦ͏ ɹϠό͘ͳ͖ͬͯͨΒߟ͑Α͏ʜʜ ͭΒ͍ϙΠϯτʢʣੑೳ

  88. "DUJWF3FDPSEͷόʔδϣϯΞοϓ௥ै 3BJMTେৎ෉͔ͳʜʜ ͭΒ͘ͳΔ͔΋͠Εͳ͍ϙΠϯτ

  89. CONFIDENTIAL ݁Ռ

  90. ࣌఺ΞΫηε

  91. ࣌఺ΞΫηε

  92. ࣌఺ΞΫηε

  93. มߋཤྺ

  94. มߋཤྺ

  95. αΫηεʂʂʂ CONFIDENTIAL ʢཤྺ৘ใͷߋ৽ʹ͍ͭͯ͸΋͏গʑ͓଴ͪԼ͍͞ʜʜʣ

  96. CONFIDENTIAL ࠷ޙʹ

  97. Έͳ͞Μ΋ "DUJWF3FDPSE#J5FNQPSBMΛ ࢖͍ͨ͘ͳ͖ͬͯͨΜ͡Όͳ͍ Ͱ͠ΐ͏͔

  98. ͓΍ʜʜ

  99. "DUJWF3FDPSE#J5FNQPSBM͸ ຊ೔ΑΓ044Ͱ͢ʂ 13͓଴͓ͪͯ͠Γ·͢ʂʂ

  100. CONFIDENTIAL ͓͠·͍

  101. ɾ#JUFNQPSBM%BUB5IFPSZBOE1SBDUJDF 5PN+PIOTUPO  ɹ*4#/ ɾཤྺςʔϒϧ ɹIUUQTVTFSpSTUJLZVDPKQFOUSZIJTUPSZUBCMF ɾ5FNQPSBMEBUBCBTF8JLJQFEJB ɹIUUQTFOXJLJQFEJBPSHXJLJ5FNQPSBM@EBUBCBTF#JUFNQPSBM@SFMBUJPOT ɾ5FNQPSBM%BUB5JNF5SBWFMJO1PTUHSF42- ɹIUUQTXJLJQPTUHSFTRMPSHJNBHFT'PTEFN1PTUHSFTRM5FNQPSBMQEG

    ɾσʔλཤྺ؅ཧͷͨΊͷςϯϙϥϧσʔλϞσϧͱ3FMBEPNPͷ঺հ ɹIUUQTXXXTMJEFTIBSFOFUJUPIJSPKKVHDDDTQSJOHCJUFNQPSBMEBUBNPEFMJOHBOESFMBEPNP ɾ1BQFS5SBJM͸Ͳ͏΍ͬͯ"DUJWF3FDPSEͷόʔδϣϯ؅ཧΛ͍ͯ͠Δ͔ ɹIUUQTRJJUBDPNZVLV@UJUFNTDFFDCB ࢀߟࢿྉ
  102. ɾ4QSFBETIFFUDFMMWFDUPS
 ɹIUUQGSFFWFDUPSDPWFDUPSJDPOTUPPMTBOE VUFOTJMTTQSFBETIFFUDFMMIUNM ɾIUUQQJDUPHSBNDPN ૉࡐ