Inside and around ActiveSupport::Duration

Inside and around ActiveSupport::Duration

ActiveSupport::Durationと日付演算のはなし

88cc995ce5954b15c12ea14904258757?s=128

Kento Nagata

April 20, 2017
Tweet

Transcript

  1. *OTJEFBOEBSPVOE
 "DUJWF4VQQPSU%VSBUJPO 8BOUFEMZ&OHJOFFS ,FOUP/BHBUB

  2. w 7JJCBS w 8FC ಈը੍࡞ࢧԉπʔϧ։ൃ w 8BOUFEMZ w 8FC 8BOUFEMZ5PPMT

    8BOUFEMZ7JTJU6TFS(SPXUI Ӭా݈ਓ !OHUL
  3. ࠓ೔࿩͢͜ͱ

  4. "DUJWF4VQQPSU%VSBUJPOͱ೔෇ԋࢉ
 ʹ͍ͭͯ

  5. ͳͥ"DUJWF4VQQPSU%VSBUJPOͷ࿩
 Λ͢Δͷ͔

  6. "DUJWF4VQQPSU%VSBUJPO͕޷͖͔ͩΒ

  7. 3VCZͱ3BJMTΛ࢝Ίͨͱ͖ʹ
 ײಈͨ͠ॻ͖ํ

  8. EBZTBHP

  9. ࣗવݴޠͬΆ͘ॻ͚ͯ௚ײత✨

  10. "DUJWF4VQQPSUͱ͸ʁ

  11. ༷ʑͳϢʔςΟϦςΟʔΫϥεͱίΞ֦ு

  12. $PSF&YU )BTI $MBTT %BUF %BUF5JNF 'JMF 'MPBU *OUFHFS ,FSOFM .PEVMF

    &OVNFSBCMF "SSBZ 4USJOH "VUPMPBE +40/ $BDIF /PUJpDBUJPOT "DUJWF4VQQPSU $POpHVSBCMF $PODFSO 5JNF;POF 9NM.JOJ ,FZ(FOFSBUPS -PHHFS 0SEFSFE)BTI 0SEFSFE0QUJPOT 3FTDVBCMF 4FDVSJUZ6UJMT 5JNF8JUI;POF .FTTBHF7FSJpFS .FTTBHF&ODSZQUPS $BMMCBDLT "SSBZ*ORVJSFS 4USJOH*ORVJSFS %VSBUJPO
  13. $PSF&YU )BTI $MBTT %BUF %BUF5JNF 'JMF 'MPBU *OUFHFS ,FSOFM .PEVMF

    &OVNFSBCMF "SSBZ 4USJOH "VUPMPBE +40/ $BDIF /PUJpDBUJPOT "DUJWF4VQQPSU $POpHVSBCMF $PODFSO 5JNF;POF 9NM.JOJ ,FZ(FOFSBUPS -PHHFS 0SEFSFE)BTI 0SEFSFE0QUJPOT 3FTDVBCMF 4FDVSJUZ6UJMT 5JNF8JUI;POF .FTTBHF7FSJpFS .FTTBHF&ODSZQUPS $BMMCBDLT "SSBZ*ORVJSFS 4USJOH*ORVJSFS %VSBUJPO /VNFSJD
  14. NPOUI͜Ε͕%VSBUJPO

  15. w XFFLTBHPΛͨ͠ͱ͖ʹԿ͕ى͖͍ͯΔͷ͔Λ௥͍͖ͬͯͳ͕Β %VSBUJPOΫϥεͷ࣮૷Λ௥͍·͢ w όʔδϣϯ͸Ͱ͢

  16. XFFLTBHP

  17. XFFLTBHP *OUFHFS

  18. XFFLTBHP /VNFSJDXFFLT

  19. XFFLTBHP 'MPBU

  20. w TFDPOET NJOVUFT IPVST EBZT XFFLTϝιου͸/VNFSJDʹఆٛ w NPOUIT ZFBSTϝιου͸*OUFHFSʹఆٛ

  21. ݄ͱ೥ͷ௕͞͸Ұఆ͍ͯ͠ͳ͍ʂ

  22. ྫ͑͹ϲ݄ͱ͔ΛऔΓѻ͏ͷ ͸೉͍͋͠͠·Γҙຯ͕ͳ͍

  23. class Integer def months ActiveSupport::Duration.months(self) end alias :month :months def

    years ActiveSupport::Duration.years(self) end alias :year :years end
  24. class Numeric def seconds ActiveSupport::Duration.seconds(self) end alias :second :seconds def

    minutes ActiveSupport::Duration.minutes(self) end alias :minute :minutes def hours ActiveSupport::Duration.hours(self) end alias :hour :hours def days ActiveSupport::Duration.days(self) end alias :day :days def weeks ActiveSupport::Duration.weeks(self) end alias :week :weeks end
  25. class Numeric def weeks ActiveSupport::Duration.weeks(self) end alias :week :weeks end

  26. class Numeric def weeks ActiveSupport::Duration.weeks(self) end alias :week :weeks end

    
  27. module ActiveSupport class Duration SECONDS_PER_MINUTE = 60 SECONDS_PER_HOUR = 3600

    SECONDS_PER_DAY = 86400 SECONDS_PER_WEEK = 604800 SECONDS_PER_MONTH = 2629746 # 1/12 of a gregorian year SECONDS_PER_YEAR = 31556952 # length of a gregorian year (365.2425 days) class << self def weeks(value) new(value * SECONDS_PER_WEEK, [[:weeks, value]]) end end def initialize(value, parts) @value, @parts = value, parts.to_h @parts.default = 0 end end end
  28. module ActiveSupport class Duration SECONDS_PER_MINUTE = 60 SECONDS_PER_HOUR = 3600

    SECONDS_PER_DAY = 86400 SECONDS_PER_WEEK = 604800 SECONDS_PER_MONTH = 2629746 # 1/12 of a gregorian year SECONDS_PER_YEAR = 31556952 # length of a gregorian year (365.2425 days) class << self def weeks(value) new(value * SECONDS_PER_WEEK, [[:weeks, value]]) end end def initialize(value, parts) @value, @parts = value, parts.to_h @parts.default = 0 end end end  
  29. module ActiveSupport class Duration SECONDS_PER_MINUTE = 60 SECONDS_PER_HOUR = 3600

    SECONDS_PER_DAY = 86400 SECONDS_PER_WEEK = 604800 SECONDS_PER_MONTH = 2629746 # 1/12 of a gregorian year SECONDS_PER_YEAR = 31556952 # length of a gregorian year (365.2425 days) class << self def weeks(value) new(value * SECONDS_PER_WEEK, [[:weeks, value]]) end end def initialize(value, parts) @value, @parts = value, parts.to_h @parts.default = 0 end end end   
  30. module ActiveSupport class Duration SECONDS_PER_MINUTE = 60 SECONDS_PER_HOUR = 3600

    SECONDS_PER_DAY = 86400 SECONDS_PER_WEEK = 604800 SECONDS_PER_MONTH = 2629746 # 1/12 of a gregorian year SECONDS_PER_YEAR = 31556952 # length of a gregorian year (365.2425 days) class << self def weeks(value) new(value * SECONDS_PER_WEEK, [[:weeks, value]]) end end def initialize(value, parts) @value, @parts = value, parts.to_h @parts.default = 0 end end end  ඵ਺  ֤୯Ґͱ஋ͷ૊Έ߹Θͤ
  31. module ActiveSupport class Duration SECONDS_PER_MINUTE = 60 SECONDS_PER_HOUR = 3600

    SECONDS_PER_DAY = 86400 SECONDS_PER_WEEK = 604800 SECONDS_PER_MONTH = 2629746 # 1/12 of a gregorian year SECONDS_PER_YEAR = 31556952 # length of a gregorian year (365.2425 days) class << self def weeks(value) new(value * SECONDS_PER_WEEK, [[:weeks, value]]) end end def initialize(value, parts) @value, @parts = value, parts.to_h @parts.default = 0 end end end  ඵ਺  ֤୯Ґͱ஋ͷ૊Έ߹Θͤ  \XFFLT^
  32. module ActiveSupport class Duration SECONDS_PER_MINUTE = 60 SECONDS_PER_HOUR = 3600

    SECONDS_PER_DAY = 86400 SECONDS_PER_WEEK = 604800 SECONDS_PER_MONTH = 2629746 # 1/12 of a gregorian year SECONDS_PER_YEAR = 31556952 # length of a gregorian year (365.2425 days) class << self def seconds(value) new(value, [[:seconds, value]]) end def minutes(value) new(value * SECONDS_PER_MINUTE, [[:minutes, value]]) end def hours(value) new(value * SECONDS_PER_HOUR, [[:hours, value]]) end def days(value) new(value * SECONDS_PER_DAY, [[:days, value]]) end def weeks(value) new(value * SECONDS_PER_WEEK, [[:weeks, value]]) end def months(value) new(value * SECONDS_PER_MONTH, [[:months, value]]) end def years(value) new(value * SECONDS_PER_YEAR, [[:years, value]]) end end end end
  33. XFFLTBHP %VSBUJPO XFFLTWBMVF XFFLTQBSUT\XFFLT^

  34. module ActiveSupport class Duration def ago(time = ::Time.current) sum(-1, time)

    end alias :until :ago alias :before :ago end end
  35. module ActiveSupport class Duration private def sum(sign, time = ::Time.current)

    parts.inject(time) do |t, (type, number)| if t.acts_like?(:time) || t.acts_like?(:date) if type == :seconds t.since(sign * number) elsif type == :minutes t.since(sign * number * 60) elsif type == :hours t.since(sign * number * 3600) else t.advance(type => sign * number) end else raise ::ArgumentError, "expected a time or date, got #{time.inspect}" end end end end end
  36. module ActiveSupport class Duration private def sum(sign, time = ::Time.current)

    parts.inject(time) do |t, (type, number)| if t.acts_like?(:time) || t.acts_like?(:date) if type == :seconds t.since(sign * number) elsif type == :minutes t.since(sign * number * 60) elsif type == :hours t.since(sign * number * 3600) else t.advance(type => sign * number) end else raise ::ArgumentError, "expected a time or date, got #{time.inspect}" end end end end end \XFFLT^
  37. module ActiveSupport class Duration private def sum(sign, time = ::Time.current)

    parts.inject(time) do |t, (type, number)| if t.acts_like?(:time) || t.acts_like?(:date) if type == :seconds t.since(sign * number) elsif type == :minutes t.since(sign * number * 60) elsif type == :hours t.since(sign * number * 3600) else t.advance(type => sign * number) end else raise ::ArgumentError, "expected a time or date, got #{time.inspect}" end end end end end XFFLT 
  38. module ActiveSupport class Duration private def sum(sign, time = ::Time.current)

    parts.inject(time) do |t, (type, number)| if t.acts_like?(:time) || t.acts_like?(:date) if type == :seconds t.since(sign * number) elsif type == :minutes t.since(sign * number * 60) elsif type == :hours t.since(sign * number * 3600) else t.advance(type => sign * number) end else raise ::ArgumentError, "expected a time or date, got #{time.inspect}" end end end end end
  39. module ActiveSupport class Duration private def sum(sign, time = ::Time.current)

    parts.inject(time) do |t, (type, number)| if t.acts_like?(:time) || t.acts_like?(:date) if type == :seconds t.since(sign * number) elsif type == :minutes t.since(sign * number * 60) elsif type == :hours t.since(sign * number * 3600) else t.advance(type => sign * number) end else raise ::ArgumentError, "expected a time or date, got #{time.inspect}" end end end end end
  40. module ActiveSupport class Duration private def sum(sign, time = ::Time.current)

    parts.inject(time) do |t, (type, number)| if t.acts_like?(:time) || t.acts_like?(:date) if type == :seconds t.since(sign * number) elsif type == :minutes t.since(sign * number * 60) elsif type == :hours t.since(sign * number * 3600) else t.advance(type => sign * number) end else raise ::ArgumentError, "expected a time or date, got #{time.inspect}" end end end end end XFFLT  
  41. class DateTime def advance(options) unless options[:weeks].nil? options[:weeks], partial_weeks = options[:weeks].divmod(1)

    options[:days] = options.fetch(:days, 0) + 7 * partial_weeks end unless options[:days].nil? options[:days], partial_days = options[:days].divmod(1) options[:hours] = options.fetch(:hours, 0) + 24 * partial_days end d = to_date.advance(options) datetime_advanced_by_date = change(year: d.year, month: d.month, day: d.day) seconds_to_advance = \ options.fetch(:seconds, 0) + options.fetch(:minutes, 0) * 60 + options.fetch(:hours, 0) * 3600 if seconds_to_advance.zero? datetime_advanced_by_date else datetime_advanced_by_date.since(seconds_to_advance) end end end
  42. class DateTime def advance(options) unless options[:weeks].nil? options[:weeks], partial_weeks = options[:weeks].divmod(1)

    options[:days] = options.fetch(:days, 0) + 7 * partial_weeks end unless options[:days].nil? options[:days], partial_days = options[:days].divmod(1) options[:hours] = options.fetch(:hours, 0) + 24 * partial_days end d = to_date.advance(options) datetime_advanced_by_date = change(year: d.year, month: d.month, day: d.day) seconds_to_advance = \ options.fetch(:seconds, 0) + options.fetch(:minutes, 0) * 60 + options.fetch(:hours, 0) * 3600 if seconds_to_advance.zero? datetime_advanced_by_date else datetime_advanced_by_date.since(seconds_to_advance) end end end \XFFLT^
  43. class DateTime def advance(options) unless options[:weeks].nil? options[:weeks], partial_weeks = options[:weeks].divmod(1)

    options[:days] = options.fetch(:days, 0) + 7 * partial_weeks end unless options[:days].nil? options[:days], partial_days = options[:days].divmod(1) options[:hours] = options.fetch(:hours, 0) + 24 * partial_days end d = to_date.advance(options) datetime_advanced_by_date = change(year: d.year, month: d.month, day: d.day) seconds_to_advance = \ options.fetch(:seconds, 0) + options.fetch(:minutes, 0) * 60 + options.fetch(:hours, 0) * 3600 if seconds_to_advance.zero? datetime_advanced_by_date else datetime_advanced_by_date.since(seconds_to_advance) end end end \XFFLT^ ༨Γ༗ΓͰׂΔ
  44. class DateTime def advance(options) unless options[:weeks].nil? options[:weeks], partial_weeks = options[:weeks].divmod(1)

    options[:days] = options.fetch(:days, 0) + 7 * partial_weeks end unless options[:days].nil? options[:days], partial_days = options[:days].divmod(1) options[:hours] = options.fetch(:hours, 0) + 24 * partial_days end d = to_date.advance(options) datetime_advanced_by_date = change(year: d.year, month: d.month, day: d.day) seconds_to_advance = \ options.fetch(:seconds, 0) + options.fetch(:minutes, 0) * 60 + options.fetch(:hours, 0) * 3600 if seconds_to_advance.zero? datetime_advanced_by_date else datetime_advanced_by_date.since(seconds_to_advance) end end end \XFFLT^ ༨Γ
  45. class DateTime def advance(options) unless options[:weeks].nil? options[:weeks], partial_weeks = options[:weeks].divmod(1)

    options[:days] = options.fetch(:days, 0) + 7 * partial_weeks end unless options[:days].nil? options[:days], partial_days = options[:days].divmod(1) options[:hours] = options.fetch(:hours, 0) + 24 * partial_days end d = to_date.advance(options) datetime_advanced_by_date = change(year: d.year, month: d.month, day: d.day) seconds_to_advance = \ options.fetch(:seconds, 0) + options.fetch(:minutes, 0) * 60 + options.fetch(:hours, 0) * 3600 if seconds_to_advance.zero? datetime_advanced_by_date else datetime_advanced_by_date.since(seconds_to_advance) end end end \XFFLT^ ༨Γ  
  46. class DateTime def advance(options) unless options[:weeks].nil? options[:weeks], partial_weeks = options[:weeks].divmod(1)

    options[:days] = options.fetch(:days, 0) + 7 * partial_weeks end unless options[:days].nil? options[:days], partial_days = options[:days].divmod(1) options[:hours] = options.fetch(:hours, 0) + 24 * partial_days end d = to_date.advance(options) datetime_advanced_by_date = change(year: d.year, month: d.month, day: d.day) seconds_to_advance = \ options.fetch(:seconds, 0) + options.fetch(:minutes, 0) * 60 + options.fetch(:hours, 0) * 3600 if seconds_to_advance.zero? datetime_advanced_by_date else datetime_advanced_by_date.since(seconds_to_advance) end end end \XFFLT^ ༨Γ  
  47. class DateTime def advance(options) unless options[:weeks].nil? options[:weeks], partial_weeks = options[:weeks].divmod(1)

    options[:days] = options.fetch(:days, 0) + 7 * partial_weeks end unless options[:days].nil? options[:days], partial_days = options[:days].divmod(1) options[:hours] = options.fetch(:hours, 0) + 24 * partial_days end d = to_date.advance(options) datetime_advanced_by_date = change(year: d.year, month: d.month, day: d.day) seconds_to_advance = \ options.fetch(:seconds, 0) + options.fetch(:minutes, 0) * 60 + options.fetch(:hours, 0) * 3600 if seconds_to_advance.zero? datetime_advanced_by_date else datetime_advanced_by_date.since(seconds_to_advance) end end end \XFFLT^    
  48. class DateTime def advance(options) unless options[:weeks].nil? options[:weeks], partial_weeks = options[:weeks].divmod(1)

    options[:days] = options.fetch(:days, 0) + 7 * partial_weeks end unless options[:days].nil? options[:days], partial_days = options[:days].divmod(1) options[:hours] = options.fetch(:hours, 0) + 24 * partial_days end d = to_date.advance(options) datetime_advanced_by_date = change(year: d.year, month: d.month, day: d.day) seconds_to_advance = \ options.fetch(:seconds, 0) + options.fetch(:minutes, 0) * 60 + options.fetch(:hours, 0) * 3600 if seconds_to_advance.zero? datetime_advanced_by_date else datetime_advanced_by_date.since(seconds_to_advance) end end end \XFFLT^ \XFFLT^
  49. class Date def advance(options) options = options.dup d = self

    d = d >> options.delete(:years) * 12 if options[:years] d = d >> options.delete(:months) if options[:months] d = d + options.delete(:weeks) * 7 if options[:weeks] d = d + options.delete(:days) if options[:days] d end end \XFFLT^
  50. class Date def advance(options) options = options.dup d = self

    d = d >> options.delete(:years) * 12 if options[:years] d = d >> options.delete(:months) if options[:months] d = d + options.delete(:weeks) * 7 if options[:weeks] d = d + options.delete(:days) if options[:days] d end end \XFFLT^ 
  51. class Date def advance(options) options = options.dup d = self

    d = d >> options.delete(:years) * 12 if options[:years] d = d >> options.delete(:months) if options[:months] d = d + options.delete(:weeks) * 7 if options[:weeks] d = d + options.delete(:days) if options[:days] d end end \XFFLT^ ೔લͷ೔෇
  52. ͪͳΈʹɺ
 ඪ४ͷ%BUFͷ࿩Ͱ͕͢

  53. class Date def advance(options) options = options.dup d = self

    d = d >> options.delete(:years) * 12 if options[:years] d = d >> options.delete(:months) if options[:months] d = d + options.delete(:weeks) * 7 if options[:weeks] d = d + options.delete(:days) if options[:days] d end end ݄ͷԋࢉ%BUF
  54. # nϲ݄ޙΛฦ͢ # ରԠ͢Δ݄ͷಉ͡೔͕ฦΔ Date.new(2001,1,28) >> 1 #=> #<Date: 2001-02-28

    …> # ରԠ͢Δ݄ʹಉ͡೔͕ͳ͍৔߹͸ɺ຤೔͕ฦΔ Date.new(2001,1,31) >> 1 #=> #<Date: 2001-02-28 ...> # ͦͷͨΊɺૢ࡞ͷ࢓ํʹΑͬͯ͸༧ظ͠ͳ͍ৼΔ෣͍Λ͢ΔՄೳੑ͕͋Δ Date.new(2001,1,31) >> 2 #=> #<Date: 2001-03-31 ...> Date.new(2001,1,31) >> 1 >> 1 #=> #<Date: 2001-03-28 ...> Date.new(2001,1,31) >> 1 >> -1 #=> #<Date: 2001-01-28 ...>
  55. class DateTime def advance(options) unless options[:weeks].nil? options[:weeks], partial_weeks = options[:weeks].divmod(1)

    options[:days] = options.fetch(:days, 0) + 7 * partial_weeks end unless options[:days].nil? options[:days], partial_days = options[:days].divmod(1) options[:hours] = options.fetch(:hours, 0) + 24 * partial_days end d = to_date.advance(options) datetime_advanced_by_date = change(year: d.year, month: d.month, day: d.day) seconds_to_advance = \ options.fetch(:seconds, 0) + options.fetch(:minutes, 0) * 60 + options.fetch(:hours, 0) * 3600 if seconds_to_advance.zero? datetime_advanced_by_date else datetime_advanced_by_date.since(seconds_to_advance) end end end \XFFLT^ िؒલͷ೔෇
  56. class DateTime def advance(options) unless options[:weeks].nil? options[:weeks], partial_weeks = options[:weeks].divmod(1)

    options[:days] = options.fetch(:days, 0) + 7 * partial_weeks end unless options[:days].nil? options[:days], partial_days = options[:days].divmod(1) options[:hours] = options.fetch(:hours, 0) + 24 * partial_days end d = to_date.advance(options) datetime_advanced_by_date = change(year: d.year, month: d.month, day: d.day) seconds_to_advance = \ options.fetch(:seconds, 0) + options.fetch(:minutes, 0) * 60 + options.fetch(:hours, 0) * 3600 if seconds_to_advance.zero? datetime_advanced_by_date else datetime_advanced_by_date.since(seconds_to_advance) end end end \XFFLT^ ೥݄೔͚ͩΛมߋ
  57. class DateTime def advance(options) unless options[:weeks].nil? options[:weeks], partial_weeks = options[:weeks].divmod(1)

    options[:days] = options.fetch(:days, 0) + 7 * partial_weeks end unless options[:days].nil? options[:days], partial_days = options[:days].divmod(1) options[:hours] = options.fetch(:hours, 0) + 24 * partial_days end d = to_date.advance(options) datetime_advanced_by_date = change(year: d.year, month: d.month, day: d.day) seconds_to_advance = \ options.fetch(:seconds, 0) + options.fetch(:minutes, 0) * 60 + options.fetch(:hours, 0) * 3600 if seconds_to_advance.zero? datetime_advanced_by_date else datetime_advanced_by_date.since(seconds_to_advance) end end end \XFFLT^ ೥݄೔͚ͩΛมߋͨ͠%BUFUJNF
  58. class DateTime def advance(options) unless options[:weeks].nil? options[:weeks], partial_weeks = options[:weeks].divmod(1)

    options[:days] = options.fetch(:days, 0) + 7 * partial_weeks end unless options[:days].nil? options[:days], partial_days = options[:days].divmod(1) options[:hours] = options.fetch(:hours, 0) + 24 * partial_days end d = to_date.advance(options) datetime_advanced_by_date = change(year: d.year, month: d.month, day: d.day) seconds_to_advance = \ options.fetch(:seconds, 0) + options.fetch(:minutes, 0) * 60 + options.fetch(:hours, 0) * 3600 if seconds_to_advance.zero? datetime_advanced_by_date else datetime_advanced_by_date.since(seconds_to_advance) end end end \XFFLT^ 
  59. class DateTime def advance(options) unless options[:weeks].nil? options[:weeks], partial_weeks = options[:weeks].divmod(1)

    options[:days] = options.fetch(:days, 0) + 7 * partial_weeks end unless options[:days].nil? options[:days], partial_days = options[:days].divmod(1) options[:hours] = options.fetch(:hours, 0) + 24 * partial_days end d = to_date.advance(options) datetime_advanced_by_date = change(year: d.year, month: d.month, day: d.day) seconds_to_advance = \ options.fetch(:seconds, 0) + options.fetch(:minutes, 0) * 60 + options.fetch(:hours, 0) * 3600 if seconds_to_advance.zero? datetime_advanced_by_date else datetime_advanced_by_date.since(seconds_to_advance) end end end \XFFLT^ िؒલͷ%BUFUJNF
  60. module ActiveSupport class Duration private def sum(sign, time = ::Time.current)

    parts.inject(time) do |t, (type, number)| if t.acts_like?(:time) || t.acts_like?(:date) if type == :seconds t.since(sign * number) elsif type == :minutes t.since(sign * number * 60) elsif type == :hours t.since(sign * number * 3600) else t.advance(type => sign * number) end else raise ::ArgumentError, "expected a time or date, got #{time.inspect}" end end end end end
  61. module ActiveSupport class Duration def ago(time = ::Time.current) sum(-1, time)

    end alias :until :ago alias :before :ago end end
  62. XFFLTBHP %BUFUJNF

  63. ·ͱΊ

  64. w /VNFSJD΍*OUFHFSʹNJOVUFTͳͲͷϝιουΛ௥Ճͯ͠%VSBUJPO ΦϒδΣΫτΛฦ͍ͯ͠Δ w %VSBUJPO͸ඵ਺Λද͢WBMVFͱ֤୯Ґͱͦͷ஋ͷ૊Έ߹ΘͤͷQBSUT Λ͍࣋ͬͯΔ w ೔࣌Λܭࢉ͢Δͱ͖͸QBSUTΛ࢖ͬͯܭࢉ͍ͯ͠Δ

  65. ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ