ActiveSupport::Concernで開くメタプログラミングの扉 #heiseirubykaigi / The door of meta-programing is opened by ActiveSupport::Concern

52d23923724e1a50fb251d2a0ea122a9?s=47 Shu OGAWARA
December 14, 2019

ActiveSupport::Concernで開くメタプログラミングの扉 #heiseirubykaigi / The door of meta-programing is opened by ActiveSupport::Concern

2019/12/14の平成Ruby会議01で発表したスライドです。

複数の誤りが発見されたので、2020/05/03に修正しました。詳しくはスライド内の変更履歴をご覧ください。

52d23923724e1a50fb251d2a0ea122a9?s=128

Shu OGAWARA

December 14, 2019
Tweet

Transcript

  1. "DUJWF4VQQPSU$PODFSO Ͱ։͘ ϝλϓϩάϥϛϯάͷ൶ ฏ੒3VCZձٞ 4IV0("8"3" !FYQBKQ

  2. มߋཤྺ  ❑  ❏ ฏ੒3VCZձٞ ॳ൛ެ։ ❑  ❏

    JODMVEFͱFYUFOEΛऔΓҧ͍͑ͯͨՕॴ͕ ෳ਺͋ͬͨͷΛमਖ਼ ❏ ޡͬͨαϯϓϧίʔυΛमਖ਼
  3. ࣗݾ঺հ ❑ 4IV0("8"3" !FYQBKQ ❏ ϦϯΧʔζגࣜձࣾ ❏ ग़਎ɿௗऔɺֶੜ࣌୅ɿਆށ ❏ झຯ͸ΫϥγοΫܥͷ߹এ

    ❏ ฏ੒2೥ੜ·Ε ❏ ઙాਅԝɺถ௡ݰࢣͱಉ͍೥ 
  4.  ࠓ೔͸ਪ͠ͷ࿩Λ͠ʹ͖·ͨ͠

  5. 

  6. 

  7.  "DUJWF4VQQPSU$PODFSO ʢ"4$ͱུ͠·͢ʣ

  8. "DUJWF4VQQPSU$PODFSO ❑ 3BJMT͔Βಋೖ͞Εͨػೳ ❑ ؔ৺ࣄΛ.PEVMFʹ෼཭͠΍͘͢͢Δ ❑ ϝλϓϩάϥϛϯά3VCZͰݸผͷষ ͕ઃ͚ΒΕ͍ͯΔ ❏ ࣮૷ʹ͸ϝλϓϩάϥϛϯά͕;ΜͩΜʹ

    ༻͍ΒΕ͍ͯΔ
  9. ͳͥਪ͍ͯ͠Δ͔ ❑ ͨͬͨߦͷγϯϓϧͳίʔυͰ ੈքதͷ໰୊Λղܾ͍ͯ͠Δ ඒ͍͠࢓૊Έ͔ͩΒ

  10.  Ҿ༻ɿ03FJMMZ+BQBO ϝλϓϩάϥϛϯά3VCZୈ൛ IUUQTXXXPSFJMMZDPKQCPPLT

  11. “  ຊॻ͸ϝλϓϩάϥϛϯάͷ ੒ޭ෺ޠ͕ຬࡌͰ͋Δɻ "DUJWF4VQQPSU$PODFSO΋ ͦ͏ͨ͠෺ޠͷͻͱͭͩɻ ϝλϓϩάϥϛϯά3VCZୈ൛ Q

  12. ϝλϓϩάϥϛϯά ❑ ݴޠཁૉΛ࣮ߦ࣌ʹૢ࡞͢ΔίʔυΛ هड़͢Δ͜ͱ ❏ ϝιου ❏ είʔϓ ❏ ܧঝπϦʔ

  13. "4$͸ϝλϓϩͷๅݿ ❑ ίʔυ͕ධՁ͞ΕΔείʔϓ͕ Ί·͙Δ͘͠มΘΔ ❑ 3VCZඪ४ಈ࡞͕ॻ͖׵͑ΒΕΔ

  14. ͔͠͠ ϝλϓϩάϥϛϯάͱ͍͏ͱ

  15. ϝλϓϩάϥϛϯά΁ͷҙݟ ❑ ॳ৺ऀ ❏ ೉ͦ͠͏ɺ͜Θ͍ ❑ தڃऀҎ্ ❏ ࢓ࣄͰॻ͍ͨΒౖΒΕΔ͔Βɺ ࢖͏ػձ͕ͳ͍

  16. ΋͍ͬͨͳ͍

  17. ϝλϓϩ࢖͍Λ૿΍͍ͨ͠ͷͰ ਪ͠Λ঺հ͠·͢

  18. ࠓ೔ͷ໨త ❑ "DUJWF4VQQPSU$PODFSOͷ࣮૷ͷ ੌ͞Λ஌ͬͯ΋Β͏ ❑ ͦΕΛ௨ͯ͠ɺϝλϓϩάϥϛϯάΛ ֶͿͷʹ఍߅Λײ͍ͯ͡Δਓʹ ʮֶΜͰΈΑ͏ʯͱࢥͬͯ΋Β͏ ❏ ಡΉͱ͜Ζ͔Β࢝Ίͯ΋Β͏

  19. Ͱ͸ɺ࢝Ί͍͖ͯ·͠ΐ͏

  20. "DUJWF4VQQPSU$PODFSO ͬͯͲΜͳػೳʁ

  21. ͦ΋ͦ΋Կʹࠔ͍͔ͬͯͨ ❑ ᶃݸͷϞδϡʔϧͰ͸ɺ Πϯελϯεϝιουɾ Ϋϥεϝιουͷยํ͔͠ఆٛͰ͖ͳ͍ ❏ ਖ਼֬ʹ͸ʮ͢ΔͱಡΈͮΒ͘ͳΔʯ ❑ ᶄϞδϡʔϧ͕ґଘ͍ͯ͠ΔϞδϡʔϧ ΋FYUFOE͠ͳͯ͘͸ͳΒͳ͍

  22. Ϟδϡʔϧ͕ґଘ͢ΔϞδϡʔϧ module SecondLevelModule def second_method p 'second' end end module

    FirstLevelModule extend SecondLevelModule def first_method self.class.second_method p 'first' end end class BaseClass include FirstLevelModule end BaseClass.new.first_method # => NoMethodError JODMVEFͨ͠ϞδϡʔϧͷதͰ ͞ΒʹผͷϞδϡʔϧͰఆٛ͞Εͨ ΫϥεϝιουΛݺͼग़͢ͱ /P.FUIPE&SSPS
  23. Ϟδϡʔϧ͕ґଘ͢ΔϞδϡʔϧ module SecondLevelModule def second_method p 'second’ end end module

    FirstLevelModule include SecondLevelModule def first_method self.class.second_method p 'first’ end end class BaseClass extend SecondLevelModule include FirstLevelModule end BaseClass.new.first_method # => “second” # “first” ͜ΕͳΒͪΌΜͱಈ͘
  24. ΋ͱ΋ͱ Ͳ͏ղܾ͍͔ͯͨ͠

  25. ᶃΫϥεϝιουΛಉ࣌ʹఆٛ module M def self.included(base) base.extend ClassMethods base.class_eval do scope

    :disabled, -> { where(disabled: true) } end end module ClassMethods ... end end JODMVEF͞Εͨͱ͖ʹൃՐ Ҿ༻ɿ"DUJWF4VQQPSU$PODFSO IUUQTBQJSVCZPOSBJMTPSHDMBTTFT"DUJWF4VQQPSU$PODFSOIUNM
  26. ᶃΫϥεϝιουΛಉ࣌ʹఆٛ module M def self.included(base) base.extend ClassMethods base.class_eval do scope

    :disabled, -> { where(disabled: true) } end end module ClassMethods ... end end ΫϥεϚΫϩͱΫϥεϝιουΛ ແཧ΍ΓJODMVEF͞ΕͨઌͰ ఆٛ͢Δ
  27. ᶄϞδϡʔϧ͕ґଘ͢ΔϞδϡʔϧ module SecondLevelModule ... end module FirstLevelModule extend SecondLevelModule def

    self.included(base) base.send :extend, SecondLevelModule end ... end class BaseClass include FirstLevelModule ... end BaseClass.new.first_method # => “second” # “first” ґଘϞδϡʔϧΛແཧ΍Γ FYUFOE͢Δ
  28. "4$ͷػೳ ❑ ᶃϞδϡʔϧͰશ෦ੜ΍ͤΔ ❏ Πϯελϯεϝιουɾ ΫϥεϝιουɾΫϥεϚΫϩΛ ݸͷϞδϡʔϧͰੜ΍ͤΔ ❑ ᶄґଘϞδϡʔϧಡࠐෆཁ ❏

    ϞδϡʔϧͷதͰFYUFOEͨ͠ ผϞδϡʔϧΛಡΈࠐ·ͳ͍Ͱྑ͘ͳΔ
  29. ᶃ ϞδϡʔϧͰશ෦ੜ΍ͤΔ module M extend ActiveSupport::Concern included do scope :disabled,

    -> { where(disabled: true) } end class_methods do ... end end ΫϥεϚΫϩΛ *ODMVEFEͷϒϩοΫʹॻ͘
  30. ᶃ ϞδϡʔϧͰશ෦ੜ΍ͤΔ module M extend ActiveSupport::Concern included do scope :disabled,

    -> { where(disabled: true) } end class_methods do ... end end ΫϥεϝιουΛ DMBTT@NFUIPETͷϒϩοΫʹॻ͘ $MBTT.FUIPETϞδϡʔϧ΋Մ
  31. ᶄ ґଘϞδϡʔϧಡࠐෆཁ module SecondLevelModule extend ActiveSupport::Concern def second_method p 'second'

    end end module FirstLevelModule extend ActiveSupport::Concern extend SecondLevelModule def first_method self.class.second_method p 'first' end end class BaseClass include FirstLevelModule end BaseClass.new.first_method # => “second” # “first” ґଘϞδϡʔϧΛ FYUFOE͠ͳͯ͘΋ ͪΌΜͱಈ͘
  32. Կ͕͏Ε͍͔͠ ❑ ᶃϞδϡʔϧͰશ෦ੜ΍ͤΔ ❏ Ϟδϡʔϧͷڽू౓্͕͕Δ ❏ ͜ͷಈ࡞Λॻͨ͘Ίͷ$POWFOUJPO͕ఆ·Δ ❑ ᶄґଘϞδϡʔϧಡࠐෆཁ ❏

    Ϟδϡʔϧͷڽू౓্͕͕Δ ❏ %3:ʹͳΔ
  33.  ΑΓΦϒδΣΫτࢦ޲ʹ஧࣮Ͱ ΑΓ3BJMTΒ͘͠ॻ͚Δ

  34. "4$͸͜ΕΛͨͬͨߦͰ࣮ݱ # frozen_string_literal: true module ActiveSupport module Concern class MultipleIncludedBlocks

    < StandardError def initialize super "Cannot define multiple 'included' blocks for a Concern" end end def self.extended(base) base.instance_variable_set(:@_dependencies, []) end def append_features(base) if base.instance_variable_defined?(:@_dependencies) base.instance_variable_get(:@_dependencies) << self false else return false if base < self @_dependencies.each { |dep| base.include(dep) } super base.extend const_get(:ClassMethods) if const_defined?(:ClassMethods) base.class_eval(&@_included_block) if instance_variable_defined?(:@_included_block) end end def included(base = nil, &block) if base.nil? if instance_variable_defined?(:@_included_block) if @_included_block.source_location != block.source_location raise MultipleIncludedBlocks end else @_included_block = block end else super end end def class_methods(&class_methods_module_definition) mod = const_defined?(:ClassMethods, false) ? const_get(:ClassMethods) : const_set(:ClassMethods, Module.new) mod.module_eval(&class_methods_module_definition) end end end
  35. ͘͢͝ͳ͍͔͢ʁ

  36. ͍͢͝ͱࢥͬͨਓ

  37. "DUJWF4VQQPSU$PODFSO ͷ࣮૷ΛಡΈղ͘

  38. ᶃϞδϡʔϧͰશ෦ੜ΍ͤΔ ͷίʔυ def included(base = nil, &block) if base.nil? if

    instance_variable_defined?(:@_included_block) if @_included_block.source_location != block.source_location raise MultipleIncludedBlocks end else @_included_block = block end else super end end def class_methods(&class_methods_module_definition) mod = const_defined?(:ClassMethods, false) ? const_get(:ClassMethods) : const_set(:ClassMethods, Module.new) mod.module_eval(&class_methods_module_definition) end
  39. ᶃϞδϡʔϧͰશ෦ੜ΍ͤΔ ͷίʔυ ❑ DMBTT@NFUIPETϝιου ❏ "4$Ͱಠࣗఆٛͷϝιου ❏ ΫϥεϝιουΛੜ΍͢ ❑ JODMVEFEϝιου

    ❏ 3VCZ૊ࠐɿJODMVEF͞ΕΔͱൃՐ͢Δ ❏ ΫϥεϚΫϩΛੜ΍͢
  40. DMBTT@NFUIPET ϝιου def class_methods(&class_methods_module_definition) mod = const_defined?(:ClassMethods, false) ? const_get(:ClassMethods)

    : const_set(:ClassMethods, Module.new) mod.module_eval(&class_methods_module_definition) end
  41. DMBTT@NFUIPET ϝιου def class_methods(&class_methods_module_definition) mod = const_defined?(:ClassMethods, false) ? const_get(:ClassMethods)

    : const_set(:ClassMethods, Module.new) mod.module_eval(&class_methods_module_definition) end $MBTT.FUIPET͕͋Ε͹୅ೖ ͳ͚Ε͹ఆٛ
  42. DMBTT@NFUIPET ϝιου def class_methods(&class_methods_module_definition) mod = const_defined?(:ClassMethods, false) ? const_get(:ClassMethods)

    : const_set(:ClassMethods, Module.new) mod.module_eval(&class_methods_module_definition) end DMBTT@NFUIPET͕ಋ͘ ϒϩοΫͷத਎Λ $MBTT.FUIPETͷείʔϓͰධՁ ʹ$MBTT.FUIPETʹϝιου͕ੜ͑Δ
  43. JODMVEFEϝιου def included(base = nil, &block) if base.nil? if instance_variable_defined?(:@_included_block)

    if @_included_block.source_location != block.source_location raise MultipleIncludedBlocks end else @_included_block = block end else super end end
  44. JODMVEFEͷຊདྷͷ࢖͍ํ module Foo def self.included(mod) p "#{mod} include #{self}" end

    end class Bar include Foo end # => "Bar include Foo" TFMGJODMVEFEͷܗͰɺ JODMVEF͞Εͨͱ͖ͷ ಈ࡞Λॻ͘ Ҿ༻ɿJOTUBODFNFUIPE.PEVMFJODMVEFE 3VCZ  IUUQTSVSFNBDMFBSDPEFDPNNFUIPE.PEVMFJJODMVEFEIUNM
  45. JODMVEFEϝιου def included(base = nil, &block) if base.nil? if instance_variable_defined?(:@_included_block)

    if @_included_block.source_location != block.source_location raise MultipleIncludedBlocks end else @_included_block = block end else super end end Ϩγʔό͕͋Δ ʹຊདྷͷ࢖͍ํΛ͍ͯ͠Δ
  46. JODMVEFEϝιου def included(base = nil, &block) if base.nil? if instance_variable_defined?(:@_included_block)

    if @_included_block.source_location != block.source_location raise MultipleIncludedBlocks end else @_included_block = block end else super end end Ϩγʔόͳ͠ͷJODMVEFE͕ ݸҎ্͋ͬͨΒΤϥʔ
  47. JODMVEFEϝιου def included(base = nil, &block) if base.nil? if instance_variable_defined?(:@_included_block)

    if @_included_block.source_location != block.source_location raise MultipleIncludedBlocks end else @_included_block = block end else super end end !@JODMVEFE@CMPDL ʹϒϩοΫΛ֨ೲ
  48. ͜͜·Ͱͷ·ͱΊ ❑ ҎԼ͕ఆٛ͞Εͨ ❏ $MBTT.FUIPET ʹΫϥεϝιου ❏ !@JODMVEFE@CMPDL ʹΫϥεϚΫϩ ❑

    ࣮ࡍʹੜ΍͢ಈ࡞͸ BQQFOE@GFBUVSFTͷΦʔόϥΠυ Ͱߦ͏
  49. BQQFOE@GFBUVSFT ❑ Ϟδϡʔϧ͕JODMVEF͞Εͨͱ͖ʹ ݺ͹ΕΔϞδϡʔϧͷϝιου ❑ ΠϯελϯεϝιουΛੜ΍͢ಈ࡞ ❑ ͜ΕΛΦʔόʔϥΠυ͢Ε͹ɺ JODMVEF͞Εͨͱ͖ͷಈ࡞Λ ॻ͖׵͑ΒΕΔ

  50. ΫϥεϝιουͱΫϥεϚΫϩΛ ੜ΍͢෦෼ def append_features(base) if base.instance_variable_defined?(:@_dependencies) base.instance_variable_get(:@_dependencies) << self false

    else return false if base < self @_dependencies.each { |dep| base.include(dep) } super base.extend const_get(:ClassMethods) if const_defined?(:ClassMethods) base.class_eval(&@_included_block) if instance_variable_defined?(:@_included_block) end end CBTFFYUFOEͰ $MBTT.FUIPETΛΫϥεϝιουͱͯ͠ੜ΍͠ CBTFDMBTT@FWBMͰ !@JODMVEFE@CMPDLΛΫϥεϚΫϩͱ࣮ͯ͠ߦͨ͠
  51. ᶄґଘϞδϡʔϧಡࠐෆཁ ͷίʔυ def self.extended(base) base.instance_variable_set(:@_dependencies, []) end def append_features(base) if

    base.instance_variable_defined?(:@_dependencies) base.instance_variable_get(:@_dependencies) << self false else return false if base < self @_dependencies.each { |dep| base.include(dep) } super base.extend const_get(:ClassMethods) if const_defined?(:ClassMethods) base.class_eval(&@_included_block) if instance_variable_defined?(:@_included_block) end end
  52. ᶄґଘϞδϡʔϧಡࠐෆཁ ͷίʔυ ❑ TFMGFYUFOEFE ϝιου ❏ 3VCZ૊ࠐɿFYUFOE͞ΕΔͱൃՐ͢Δ ❏ ʮ"4$ΛFYUFOEͨ͠ʯͱϚʔΩϯά ❑

    BQQFOE@GFBUVSFT ϝιου ❏ 3VCZ૊ࠐɿJODMVEFͷ࣮ମ ❏ Ϟδϡʔϧͷಡࠐ࣌ʹґଘϞδϡʔϧ΋ ҰॹʹJODMVEF͢Δ
  53. TFMGFYUFOEFE ϝιου ❑ ಡࠐݩʹ !@EFQFOEFODJFTੜ΍͚ͩ͢ def self.extended(base) base.instance_variable_set(:@_dependencies, []) end

  54. BQQFOE@GFBUVSFT ϝιου def append_features(base) if base.instance_variable_defined?(:@_dependencies) base.instance_variable_get(:@_dependencies) << self false

    else return false if base < self @_dependencies.each { |dep| base.include(dep) } super base.extend const_get(:ClassMethods) if const_defined?(:ClassMethods) base.class_eval(&@_included_block) if instance_variable_defined?(:@_included_block) end end
  55. Α͘Θ͔Βͳ͍ͷͰ ਤʹͯ͠Έͨ

  56.  "4$ΛFYUFOE ;ͭ͏ͷΫϥε " # $ % NPEVMF NPEVMF NPEVMF

    DMBTT
  57.  "4$ΛFYUFOE ;ͭ͏ͷΫϥε ᶃ $ΛJODMVEF ᶄ "ΛJODMVEF " # $

    % NPEVMF NPEVMF NPEVMF DMBTT
  58.  "4$ΛFYUFOE ;ͭ͏ͷΫϥε ᶃ $ΛJODMVEF ᶄ "ΛJODMVEF ᶅ $ͷ!@EFQʹ "Λ௥Ճ

    !@EFQ <"> " # $ % NPEVMF NPEVMF NPEVMF DMBTT
  59.  "4$ΛFYUFOE ;ͭ͏ͷΫϥε ᶃ $ΛJODMVEF ᶄ "ΛJODMVEF ᶅ $ͷ!@EFQʹ "Λ௥Ճ

    !@EFQ <"> ᶆ #ΛJODMVEF " # $ % NPEVMF NPEVMF NPEVMF DMBTT
  60.  "4$ΛFYUFOE ;ͭ͏ͷΫϥε !@EFQ <"> " # $ % NPEVMF

    NPEVMF NPEVMF DMBTT ͔͜͜Β͕ຊ൪
  61.  "4$ΛFYUFOE ;ͭ͏ͷΫϥε !@EFQ <"> ᶇ !@EFQΛ%ʹJODMVEF " # $

    % NPEVMF NPEVMF NPEVMF DMBTT
  62.  "4$ΛFYUFOE ;ͭ͏ͷΫϥε !@EFQ <"> ᶇ !@EFQΛ%ʹJODMVEF ᶈ $Λ%ʹJODMVEF "

    # $ % NPEVMF NPEVMF NPEVMF DMBTT
  63.  "4$ΛFYUFOE ;ͭ͏ͷΫϥε !@EFQ <"> ᶇ !@EFQΛ%ʹJODMVEF ᶈ $Λ%ʹJODMVEF ᶉ

    $ͷ$MBTT.FUIPET  !@JODMVEFE@CMPDLΛ %ʹੜ΍͢ " # $ % NPEVMF NPEVMF NPEVMF DMBTT
  64.  • "ͷΠϯελϯεϝιου͕ݺ΂Δ • "ఆٛͷΫϥεϝιου͕ݺ΂Δ • #͕ݺ΂Δ " # $

    % NPEVMF NPEVMF NPEVMF DMBTT
  65.  • $ఆٛͷΫϥεϝιου͕ݺ΂Δ • "ͷΠϯελϯεϝιου͕ ݺ΂Δ • "ఆٛͷΫϥεϝιου͕ݺ΂Δ • #ͷΠϯελϯεϝιου͸

    ݺ΂ͳ͍ " # $ % NPEVMF NPEVMF NPEVMF DMBTT
  66. ͜Ε͚ͩͷίʔυ͕ͨͬͨߦ ͍͢͝Ͱ͢ΑͶʁ

  67. ֶΜͰΈΑ͏ͱࢥͬͨਓ ʢ·ͨ͸ֶΜͰ͍Δਓ ʣ

  68. ϝλϓϩΛֶͿਓ͕૿͑Ε͹ ࠓ೔ͷൃද͸੒ޭͰ͢

  69. ͱ͜ΖͰ

  70. ͳͥϝλϓϩ࢖͍Λ૿΍͍͔ͨ͠ʁ

  71. ͳͥϝλϓϩ࢖͍Λ૿΍͍͔ͨ͠ʁ ❑ 3VCZΛ࢖͏ϓϩάϥϛϯάॳ৺ऀ͕ ૿͍͑ͯΔ͔Β ❑ ϝλϓϩ͕Ͱ͖Δ͜ͱ͕ 3VCZΛ࢖͏ڧྗͳಈػʹͳΔ͔Β

  72. 3VCZΛ࢖Θͳ͘ͳΔཧ༝ ❑ స৬ͨ͠Βผݴޠͩͬͨ ❑ ΄͍͠ϥΠϒϥϦ͕ͳ͔ͬͨ ❑ Θ͔Βͳ͍͜ͱ͕͋ͬͨͱ͖ɺ ฉ͚Δਓ͕͍ͳͯͦ͘ͷ··࠳ં

  73.  ͲͷݴޠͰ΋Ͱ͖Δ͜ͱ͸ ݪཧతʹ͸มΘΒͳ͍Ҏ্ ͲΕΛ࢖͏͔͸޷Έͷ໰୊

  74. Ͱ΋ɺॳ৺ऀʹ࢖͍ଓ͚ͯ΋Β͑ͳ͍ͱ ❑ ͭΑ͍3VCZΤϯδχΞͱͳΓ͏Δਓ͕ ผݴޠͷίϛϡχςΟʹ͍ͬͯ͠·͏ ❏ ϓϩάϥϛϯάεΫʔϧͷོ੝Λ νϟϯεʹม͑ΒΕͳ͍

  75.  ίϛϡχςΟʹͱͬͯ ॏେͳଛࣦ

  76. ࢖͍ଓ͚ͯ΋Β͏ʹ͸ʁ ❑ 3VCZͷίϯηϓτʹڞײͯ͠΋Β͏

  77. “  3VCZ͸܅Λ৴པ͢Δɻ 3VCZ͸܅Λ෼ผͷ͋ΔϓϩάϥϚͱ͠ ͯѻ͏ɻ 3VCZ͸ϝλϓϩάϥϛϯάͷΑ͏ͳڧ ྗͳྗΛ༩͑Δɻ ϝλϓϩάϥϛϯά3VCZୈ൛ ংจ ·ͭ΋ͱΏ͖ͻΖ

  78.  ·ͭ΋ͱ͞Μͷ৴པʹ Ԡ͑ΒΕΔΑ͏ʹͳΔ͜ͱ͕ 3VCZΛ࢖͍ଓ͚Δ ཧ༝ʹͳΔͷͰ͸

  79.  ϝλϓϩͷֶशΛ࢝ΊΔͷ͸ ॳڃऀͷ࠷ޙͷน

  80.  นͷதʹ൶Λݟग़ͤ͹ Ͱ͖Δ͜ͱ͕૿͑Δ ΋ͬͱͨͷ͍͠

  81. “  ͦΕͰ͸ɺ 3VCZͰͨͷ͍͠ϓϩάϥϛϯάΛɻ ϝλϓϩάϥϛϯά3VCZୈ൛ ংจ ·ͭ΋ͱΏ͖ͻΖ

  82. ϝλϓϩάϥϛϯάͷ ൶Λ։͍ͯ େ͍ͳΔྗΛखʹೖΕΑ͏ 'JO