Slide 1

Slide 1 text

0CKFDU0SJFOUFE"CTUSBDUJPO PG3FEJT4PSUFE4FU 4PIFJ5BLFOP!3FKFDU,BJHJ

Slide 2

Slide 2 text

"CPVUNF !"MUFDI@ 8BOUFEMZ *OD "QQMJDBUJPO&OHJOFFS 1SPpMF%BUB4USBUFHZ(SPVQ 4PIFJ5BLFOP

Slide 3

Slide 3 text

໨࣍ 3FEJTʹ͍ͭͯ4PSUFE4FUͷ༻ྫ Α͋͘Δ3FEJTͷݺͼํ3FEJTΫϥΠΞϯτΛ࢖͏ 3FE#MPDLTͷ঺հΫϥεʹந৅Խ͢Δ ·ͱΊ

Slide 4

Slide 4 text

3FEJTʹ͍ͭͯ 4PSUFE4FUͷ༻ྫ

Slide 5

Slide 5 text

3FEJTʹ͍ͭͯ 4FU )BTI౳ׂͱߴڃͳσʔλܕΛඋ͑ͨΠϯϝϞϦ,74 8FCαʔϏεͷߴ଎Խͱ͔ͰΑ͘࢖ΘΕΔ 4PSUFE4FU 3FEJT͕ఏڙ͢ΔσʔλܕͷҰͭ είΞ෇͖ͷཁૉͷू߹ʢείΞͰιʔτ͞Ε͍ͯΔʣ ϥϯΩϯάʹ࢖͑Δ ू߹ʹରͯ͠࿨ू߹΍ੵू߹ͱݴͬͨԋࢉ΋༻ҙ͞Ε͍ͯΔ είΞ͸σϑΥϧτͰ଍͠߹Θ͞ΕΔ ਪનɾݕࡧͳͲԿ͔Λ୳͢Ұཡը໘ͷ࣮૷ʹ΋࢖͑Δ

Slide 6

Slide 6 text

4PSUFE4FUͷ༻ྫ 4UBS਺Ͱιʔτ͞ΕͨϦϙδτϦ ݴޠ͕3VCZ·ͨ͸1ZUIPOͰॻ͔ΕͨϦϙδτϦ ࠓिͷτϨϯυʹࡌ͍ͬͯΔϦϙδτϦ ࠓिͷτϨϯυʹࡌ͍ͬͯͯɺ͔ͭݴޠ͕3VCZ·ͨ͸1ZUIPOͰॻ͔ΕͨϦϙδτϦ 
 ݴޠ͕3VCZͰॻ͔Ε͍ͯͯɺ͔ͭYNMΛΩʔϫʔυͱؚͯ͠ΉϦϙδτϦ [શͯͷϦϙδτϦ(Star ਺ΛείΞʹ࣋ͭ)] [ݴޠ͕ Ruby ͷϦϙδτϦ] ∪ [ݴޠ͕ Python ͷϦϙδτϦ] [ࠓिͷτϨϯυʹؚ·ΕΔϦϙδτϦ] [ࠓिͷτϨϯυʹؚ·ΕΔϦϙδτϦ] ∩ 
 ([ݴޠ͕ Ruby ͷϦϙδτϦ] ∪ [ݴޠ͕ Python ͷϦϙδτϦ]) [ݴޠ͕ Ruby ͷϦϙδτϦ] ∪ [จষதʹ “xml” ΛؚΉϦϙδτϦ(ݕࡧΤϯδϯͷධՁ஋ΛείΞʹ࣋ͭ)]

Slide 7

Slide 7 text

ͱ͜ΖͰɿͲͷٕज़ʹدͤΔ͔໰୊ Ϛελʔσʔλతͳ΋ͷ͸%#ʹೖΕΒΕ͍ͯΔ͜ͱ͕ଟ͍
 㲈"DUJWF3FDPSE͍ͬͯ͏࠷ߴͷ03.BQQFS͕͋Δ3VCZΛ࢖͍͍ͨʁ FHϦϙδτϦͷ࡞੒೔࣌ɺ4UBS਺ શจݕࡧΛ͍ͨ͠ͷͰݕࡧΤϯδϯ͕࢖͍͍ͨ FHYNMΛΩʔϫʔυͱؚͯ͠Ή ػցֶशΛऔΓೖΕ͍ͨͷͰ1ZUIPOͰαʔόʔॻ͖͍ͨ FHਪનΛ͍ͨ͠ͷͰॱҐ෇͚͸౎౓ܭࢉ͍ͨ͠

Slide 8

Slide 8 text

ҰͭͷղܾҊɿ3FEJTͰ౷߹͢Δ ߴ଎ͳ3FEJT্ͰܭࢉͰ͖Δ Ωϟογϡػೳ΋෇ՃͰ͖Δ DGҰཡը໘͸଎౓͕ٻΊΒΕ͕ͪ

Slide 9

Slide 9 text

Α͋͘Δ3FEJTͷݺͼํ 3FEJTΫϥΠΞϯτΛ࢖͏

Slide 10

Slide 10 text

ೋͭͷू߹ͷੵΛऔͬͯ݅औಘ͢Δ 3FEJTΫϥΠΞϯτΛ࢖͏ͱͻͨ͢Βखଓ͖తʹͳΔ ؔ਺ʹ·ͱΊΔ͜ͱ͸Ͱ͖Δ͕ɺେ͖͘վળ͠ͳ͍ c = Redis.new if c.ttl(“src1”) < 0 c.zadd("src1", [[32.0, "a"], [64.0, “b”]]) c.expire("src1", 60) end if c.ttl(“src2”) < 0 c.zadd("src2", [[44.0, "a"], [21.0, "c"]]) c.expire("src2", 60) end c.zinterstore("dest", ["src1", "src2"]) c.expire("dest", 10) c.zrevrange("dest", 0, 5) #=> [“a"] dest = src1 ∩ src2

Slide 11

Slide 11 text

࢖͍·ΘͤΔΑ͏ʹΩʔΛఆٛ͢Δ ͜͏͍͏Ωʔੜ੒ΛΑ͘΍Δʢ͏͔ͬΓΩʔ͕িಥͨ͠Γ͠ͳ͍ʁʣ lࠓिͷτϨϯυʹࡌ͍ͬͯͯɺ͔ͭݴޠ͕3VCZ·ͨ͸1ZUIPO Ͱॻ͔ΕͨϦϙδτϦz
 <ࠓिͷτϨϯυ>㱯 <ݴޠ͕3VCZ>㱮<ݴޠ͕1ZUIPO> 
 ɾɾɾΈ͍ͨͳෳࡶͳू߹ͷΩʔ͸Ͳ͏΍ܾͬͯΊΑ͏ʁ def user_repository_key(user_id) "user_repositories:#{user_id}" end c.zadd( user_repository_key(user_id), get_user_repositories(user_id) )

Slide 12

Slide 12 text

ଞʹ΋࣮ࡍʹӡ༻͢Δ্Ͱ͸৭ʑ͋Δ ۭͷέʔε ԋࢉதʹσʔλ͕ඈΜͩΒͲ͏͢Δʁ ɾɾɾ

Slide 13

Slide 13 text

͜ΕΛ࡞Δ্ͰϑΥʔΧε͍ͨ͜͠ͱ ֤αϒγεςϜͷग़ྗΛͲ͏૊Έ߹ΘͤΔ͔
 ʜ"/%ͳͷ͔03ͳͷ͔ɺείΞΛͲ͏૊Έ߹ΘͤΔ͔ ͦΕͧΕͷܭࢉஈ֊ʹ͓͚ΔσʔλΛͲͷఔ౓Ωϟογϡ͢Δ͔ ந৅ԽͰղܾ

Slide 14

Slide 14 text

3FE#MPDLTͷ঺հ Ϋϥεʹந৅Խ͢Δ

Slide 15

Slide 15 text

HFN3FE#MPDLT 3FEJTͷ4PSUFE4FUʹؔ͢Δந৅ԽΛఏڙ ࣮ࡍͷαʔϏεͰ࢖ΘΕ͍ͯΔ΋ͷΛ੾Γग़ͨ͠ͷͰɺ৭ʑࡉ ͔͍ศརΫϥε΋ؚ·ΕΔ IUUQTHJUIVCDPN"MUFDISFE@CMPDLT

Slide 16

Slide 16 text

جఈΫϥεɿ3FE#MPDLT4FU SFRVJSFEkey_suffix, get PQUJPOBMcache_time class RepositorySearchService::LanguageSet < RedBlocks::Set def initialize(language) raise ArgumentError unless Repository::LANGS.include?(language) @language = language end def key_suffix @language.to_s end def get Repository.where(language: @language).pluck(:id) end def cache_time 60.minutes end end

Slide 17

Slide 17 text

جຊతͳ࢖͍ํ set = RepositorySearchService::LanduageSet.new(:Ruby) # ઌ಄5݅Λऔಘ set.ids #=> [341, 325, 932, 421, 523] # 10ϖʔδ໨Λऔಘ set.ids(paginator: RedBlocks::Paginator.new(per: 10, page: 10)) # શମͷ݅਺Λऔಘ set.size #=> 2314 # Redis ͷΩʔΛ֬ೝ set.key #=> “RB:RepositorySearchService::LanguageSet:Ruby” # ໌ࣔతʹ Redis ্ͷσʔλΛ࠷৽ʹ͢Δ set.update!

Slide 18

Slide 18 text

ΑΓৄ͘͠ʜ 3FE#MPDLT4FUHFU 3FE#MPDLT4FUJET 3FE#MPDLT4FULFZ@TV⒏Y 3FE#MPDLT4FUVQEBUF

Slide 19

Slide 19 text

3FE#MPDLT4FUHFUείΞͳ͠ͱείΞ͋Γ ཁૉʢJEʣͷϦετɺ·ͨ͸ཁૉͱείΞͷϖΞͷϦετΛฦͤΔ ཁૉͷϦετΛฦͨ͠৔߹ɺείΞ͸શͯʹͳΔ ू߹ಉ࢜ͷԋࢉͷࡍɺείΞ͸σϑΥϧτͰ଍͞ΕΔͷͰɺͦ͸શମͷείΞʢॱংʣʹӨڹΛ༩͑ͳ͍ ॱংʹڵຯ͕ͳ͘ɺ͍ΘΏΔ਺ֶతͳҙຯͰͷू߹Λఆ͍ٛͨ͠৔߹ɺγϯϓϧʹཁૉ͚ͩΛฦͤ͹ྑ͍ def get Repository.where(language: @language).pluck(:id) end def get Repository.all.pluck(:id, :star_count) end ಛఆͷݴޠͷϦϙδτϦͷू߹ɿ શͯͷϦϙδτϦͷू߹ʢελʔ਺ΛείΞʹ࣋ͭʣɿ

Slide 20

Slide 20 text

3FE#MPDLT4FUJETۭू߹ͷදݱ 3FEJTͷ4PSUFE4FUͷ࢓༷Ͱ͸ɺ಺แ͢Δཁૉ͕݅Ͱ͋Δͱ͍͏ঢ়ଶͱɺ 4PSUFE4FUࣗମ͕ଘࡏ͠ͳ͍ͱ͍͏ঢ়ଶΛ۠ผͰ͖ͳ͍ ͔͠͠ɺʮۭͷू߹Ͱ͋Δʯͱ͍͏ঢ়ଶ΋Ωϟογϡ͍ͨ͠ʢྫ͑͹ɺಛఆͷΩʔ ϫʔυʹΑΔશจݕࡧͷ݁Ռ͕݅Ͱ͋Δͱ͍͏͜ͱࣗମΛΩϟογϡ͍ͨ͠ʣ ࣮ࡏ͢Δཁૉ͕஋ͱͯ͠औΓಘͳ͍΋ͷʢA3FE#MPDLTDPOpHCMBOL@JEAʣΛɺ શͯͷ4PSUFE4FUʹඞؚͣΊΔΑ͏ʹ͍ͯ͠Δ def ids(paginator: Paginator.new) update! if disabled? RedBlocks.client.zrevrange(key, paginator.head, paginator.tail ).reject { |id| id == RedBlocks.config.blank_id } end

Slide 21

Slide 21 text

3FE#MPDLT4FULFZ@TV⒏YΩʔͷମܥԽ શମͷ໊લۭؒ3FE#MPDLT͕ར༻͢ΔϕʔεͱͳΔ໊લۭؒ ΫϥεϨϕϧͷࣝผࢠLFZ@QSFpYΫϥε໊Λࣗಈతʹ࠾༻ ΠϯελϯεϨϕϧͷࣝผࢠLFZ@TV⒏YϢʔβʔ͕ఆٛ͢Δ ௨ৗɺΦϒδΣΫτͷଐੑΛҰҙͳจࣈྻදݱʹ͢Ε͹ྑ͍ <શମͷ໊લۭؒ>:<ΫϥεϨϕϧͷࣝผࢠ>:<ΠϯελϯεϨϕϧͷࣝผࢠ> set = RepositorySearchService::LanguageSet.new(:Ruby) set.key #=> “RB:RepositorySearchService::LanguageSet:Ruby”

Slide 22

Slide 22 text

3FE#MPDLT4FUVQEBUFσʔλͷࠩ෼ߋ৽ Ұ౓શͯΛ࡟আ͔ͯ͠Β৽͘͠σʔλΛೖΕΔͱ͍͏ํ๏ͩͱɺ σʔλ͕ͳ͘ͳͬͯ͠·͏ॠ͕ؒ͋Δ ΞοϓσʔτલͱޙͰൺֱ͠ɺফ͑ͨཁૉͷΈΛ࡟আ͢Δ είΞ͸શͯߋ৽͢Δ def update! entries = normalize_entries(validate_entries!(self.get)) removed_ids = self.ids(paginator: Paginator.all, update_if_disabled: false) - entries.map(&:last) RedBlocks.client.pipelined do RedBlocks.client.zrem(key, removed_ids) if removed_ids.size > 0 RedBlocks.client.zadd(key, all_entries) RedBlocks.client.expire(key, expiration_time) end end

Slide 23

Slide 23 text

ू߹ԋࢉΛѻ͏ɿ 3FE#MPDLT6OJPO4FU 3FE#MPDLT*OUFSTFDUJPO4FU

Slide 24

Slide 24 text

3FE#MPDLT6OJPO4FU3FE#MPDLT*OUFSTFDUJPO4FU HFU3FEJTʹ৐ͬͯͳ͍શͯͷ಺แ͢Δू߹ʹରͯ͠AVQEBUFAΛൃߦͨ͠ ޙɺA[VOJPOTUPSF EFTU TSD TSD AͰԋࢉ݁ՌΛ֨ೲ LFZ@TV⒏YΠϯελϯεϨϕϧͷࣝผࢠʹશͯͷ಺แ͢Δू߹ͷΩʔͷλϓϧ ”[#{ruby_set.key}|#{python_set.key}]"Έ͍ͨͳΠϝʔδ set1 = RedBlocks::UnionSet.new([ruby_set, python_set]) # ܭࢉ݁ՌΛΩϟογϡ͢Δ͜ͱ΋Մೳ set1 = RedBlocks::UnionSet.new([ruby_set, python_set], cache_time: 3.minutes ) # ෳࡶͳωετ΋΋ͪΖΜՄೳ set2 = RedBlocks::IntersectionSet.new(starred_count_set, set1) ˞HFU LFZ@TV⒏Y͸ϥΠϒϥϦଆͰ࣮૷͍ͯ͠ΔͷͰɺΫϥεఆٛͳ͠Ͱར༻Մೳ

Slide 25

Slide 25 text

3FEJT্ͷσʔλͷੜଘظؒ

Slide 26

Slide 26 text

3FEJT্ͷσʔλͷੜଘظؒ U ಺෦ͰߦΘΕΔॲཧͷྲྀΕ 3FE#MPDLT6OJPO4FUOFX JET

Slide 27

Slide 27 text

3FEJT্ͷσʔλͷੜଘظؒ 3VCZͷू߹Λ%#͔ΒҾ͍ͯ3FEJTʹอଘ " U ಺෦ͰߦΘΕΔॲཧͷྲྀΕ 3FE#MPDLT6OJPO4FUOFX JET

Slide 28

Slide 28 text

3FEJT্ͷσʔλͷੜଘظؒ 3VCZͷू߹Λ%#͔ΒҾ͍ͯ3FEJTʹอଘ " 1ZUIPOͷू߹Λ%#͔ΒҾ͍ͯ3FEJTʹอଘ # U ಺෦ͰߦΘΕΔॲཧͷྲྀΕ 3FE#MPDLT6OJPO4FUOFX JET

Slide 29

Slide 29 text

3FEJT্ͷσʔλͷੜଘظؒ 3VCZͷू߹Λ%#͔ΒҾ͍ͯ3FEJTʹอଘ " 1ZUIPOͷू߹Λ%#͔ΒҾ͍ͯ3FEJTʹอଘ # 3FEJT্Ͱ"ͱ#ͷ࿨ू߹Λܭࢉ͠อଘ $ U ಺෦ͰߦΘΕΔॲཧͷྲྀΕ 3FE#MPDLT6OJPO4FUOFX JET

Slide 30

Slide 30 text

3FEJT্ͷσʔλͷੜଘظؒ 3VCZͷू߹Λ%#͔ΒҾ͍ͯ3FEJTʹอଘ " 1ZUIPOͷू߹Λ%#͔ΒҾ͍ͯ3FEJTʹอଘ # 3FEJT্Ͱ"ͱ#ͷ࿨ू߹Λܭࢉ͠อଘ $ $͔ΒσʔλΛҾ͘ U ಺෦ͰߦΘΕΔॲཧͷྲྀΕ 3FE#MPDLT6OJPO4FUOFX JET

Slide 31

Slide 31 text

3FEJT্ͷσʔλͷੜଘظؒ 3VCZͷू߹Λ%#͔ΒҾ͍ͯ3FEJTʹอଘ " 1ZUIPOͷू߹Λ%#͔ΒҾ͍ͯ3FEJTʹอଘ # 3FEJT্Ͱ"ͱ#ͷ࿨ू߹Λܭࢉ͠อଘ $ ྫ͑͹ɺ͜͜ʹདྷΔ·Ͱʹ"͕FYQJSF ͪ͠ΌͬͨΒɾɾɾ $͔ΒσʔλΛҾ͘ U ಺෦ͰߦΘΕΔॲཧͷྲྀΕ 3FE#MPDLT6OJPO4FUOFX JET

Slide 32

Slide 32 text

3FEJT্ͷσʔλͷੜଘظؒ શͯͷू߹ͷϛχϚϜ ͷੜଘظؒΛΩϟογϡ ظؒͱ͸ผʹઃఆ͢Δ ͦͷؒʹશͯͷॲཧ ͕ऴΘΔඞཁ͕͋Δ 3VCZͷू߹Λ%#͔ΒҾ͍ͯ3FEJTʹอଘ " 1ZUIPOͷू߹Λ%#͔ΒҾ͍ͯ3FEJTʹอଘ # 3FEJT্Ͱ"ͱ#ͷ࿨ू߹Λܭࢉ͠อଘ $ ྫ͑͹ɺ͜͜ʹདྷΔ·Ͱʹ"͕FYQJSF ͪ͠ΌͬͨΒɾɾɾ $͔ΒσʔλΛҾ͘ U ಺෦ͰߦΘΕΔॲཧͷྲྀΕ 3FE#MPDLT6OJPO4FUOFX JET

Slide 33

Slide 33 text

3FEJT্ͷσʔλͷੜଘظؒ શͯͷू߹ͷϛχϚϜ ͷੜଘظؒΛΩϟογϡ ظؒͱ͸ผʹઃఆ͢Δ ͦͷؒʹશͯͷॲཧ ͕ऴΘΔඞཁ͕͋Δ 3VCZͷू߹Λ%#͔ΒҾ͍ͯ3FEJTʹอଘ " 1ZUIPOͷू߹Λ%#͔ΒҾ͍ͯ3FEJTʹอଘ # 3FEJT্Ͱ"ͱ#ͷ࿨ू߹Λܭࢉ͠อଘ $ ྫ͑͹ɺ͜͜ʹདྷΔ·Ͱʹ"͕FYQJSF ͪ͠ΌͬͨΒɾɾɾ $͔ΒσʔλΛҾ͘ U ಺෦ͰߦΘΕΔॲཧͷྲྀΕ 3FE#MPDLT6OJPO4FUOFX JET def expiration_time RedBlocks.config.min_ttl + self.cache_time end

Slide 34

Slide 34 text

3FEJT্ͷσʔλͷੜଘظؒ શͯͷू߹ͷϛχϚϜ ͷੜଘظؒΛΩϟογϡ ظؒͱ͸ผʹઃఆ͢Δ ͦͷؒʹશͯͷॲཧ ͕ऴΘΔඞཁ͕͋Δ 3VCZͷू߹Λ%#͔ΒҾ͍ͯ3FEJTʹอଘ " 1ZUIPOͷू߹Λ%#͔ΒҾ͍ͯ3FEJTʹอଘ # 3FEJT্Ͱ"ͱ#ͷ࿨ू߹Λܭࢉ͠อଘ $ ྫ͑͹ɺ͜͜ʹདྷΔ·Ͱʹ"͕FYQJSF ͪ͠ΌͬͨΒɾɾɾ $͔ΒσʔλΛҾ͘ U ಺෦ͰߦΘΕΔॲཧͷྲྀΕ 3FE#MPDLT6OJPO4FUOFX JET def expiration_time RedBlocks.config.min_ttl + self.cache_time end

Slide 35

Slide 35 text

3FEJT্ͷσʔλͷੜଘظؒ શͯͷू߹ͷϛχϚϜ ͷੜଘظؒΛΩϟογϡ ظؒͱ͸ผʹઃఆ͢Δ ͦͷؒʹશͯͷॲཧ ͕ऴΘΔඞཁ͕͋Δ 3VCZͷू߹Λ%#͔ΒҾ͍ͯ3FEJTʹอଘ " 1ZUIPOͷू߹Λ%#͔ΒҾ͍ͯ3FEJTʹอଘ # 3FEJT্Ͱ"ͱ#ͷ࿨ू߹Λܭࢉ͠อଘ $ ྫ͑͹ɺ͜͜ʹདྷΔ·Ͱʹ"͕FYQJSF ͪ͠ΌͬͨΒɾɾɾ $͔ΒσʔλΛҾ͘ U ಺෦ͰߦΘΕΔॲཧͷྲྀΕ 3FE#MPDLT6OJPO4FUOFX JET def expiration_time RedBlocks.config.min_ttl + self.cache_time end RedBlocks.config.min_tll ʼ

Slide 36

Slide 36 text

ྫɿϦϙδτϦΛݕࡧ͢ΔαʔϏεΫϥε

Slide 37

Slide 37 text

3FE#MPDLT6OJPO4FU3FE#MPDLT*OUFSTFDUJPO4FU class RepositorySearchService def initialize(params); @params = params end def fetch(per: nil, page: nil) case format when :ids set.ids(paginator: RedBlocks::Paginator.new(per || 10, page || 1)) when :count set.size end end def set @set ||= build_set(@params) end def build_set(params) sets = [PublicSet.new] sets += params.map { |key, value| case key.to_sym when :languages RedBlocks::UnionSet.new(value.map { |v| LanguageSet.new(v) }) when :tags RedBlocks::UnionSet.new(value.map { |v| TagSet.new(v) }) when :keywords RedBlocks::UnionSet.new(value.map { |v| KeywordSet.new(v) }) when :order case value.to_sym when :starred StarredSet.new when :recent RecentSet.new end end }.compact RedBlocks::IntersectionSet.new(sets, cache_time: 5.minutes).unset end end

Slide 38

Slide 38 text

ݕ౼ɿ3FE#MPDLTͰͲ͏มΘ͔ͬͨ ಉ༷ͷϩδοΫΛ࣋ͭू߹ΛΫϥε୯ҐͰ·ͱΊΒΕΔ ྫɿݴޠʢʹ֘౰͢ΔϦϙδτϦͷू߹ʣΫϥε3VCZʢʹ֘౰͢ΔϦϙδτ Ϧͷू߹ʣΠϯελϯε ݸผͷσʔλΛҾ͘෦෼Λ4FUΫϥεɺ౷߹Λ4FSWJDFͰߦ ͏ͱ͍͏෼཭͕Ͱ͖Δ ྫɿ֤αϒγεςϜ΁ͷΞΫηε͸4FUΫϥεͷHFUϝιουʹہॴԽ͞ΕΔ 3FEJTʹؔ͢Δ༷ʑͳৄࡉ࣮૷Λ౎౓ߟྀ͢Δඞཁ͕ͳ͍ ྫɿ࿨ू߹ͷΩʔΛߟ͑Δඞཁ͕ͳ͍

Slide 39

Slide 39 text

ݕ౼ɿ3FE#MPDLTͰͲ͏มΘ͔ͬͨ ಉ༷ͷϩδοΫΛ࣋ͭू߹ΛΫϥε୯ҐͰ·ͱΊΒΕΔ ྫɿݴޠʢʹ֘౰͢ΔϦϙδτϦͷू߹ʣΫϥε3VCZʢʹ֘౰͢ΔϦϙδτ Ϧͷू߹ʣΠϯελϯε ݸผͷσʔλΛҾ͘෦෼Λ4FUΫϥεɺ౷߹Λ4FSWJDFͰߦ ͏ͱ͍͏෼཭͕Ͱ͖Δ ྫɿ֤αϒγεςϜ΁ͷΞΫηε͸4FUΫϥεͷHFUϝιουʹہॴԽ͞ΕΔ 3FEJTʹؔ͢Δ༷ʑͳৄࡉ࣮૷Λ౎౓ߟྀ͢Δඞཁ͕ͳ͍ ྫɿ࿨ू߹ͷΩʔΛߟ͑Δඞཁ͕ͳ͍ ͷΑ͏ͳ΋ͷ΋؆୯ʹͭ͘ΕΔ

Slide 40

Slide 40 text

·ͱΊ

Slide 41

Slide 41 text

·ͱΊ 3FEJTͷ4PSUFE4FUΛ3VCZͰ4FUΫϥεͱͯ͠ఏڙ 3FEJTʹରͯ͠ద੾ͳந৅ԽΛߦ͏͜ͱͰɺෳࡶͳॲཧ͕ 3VCZͰهड़Մೳʹͳͬͨ ͦΕʹΑΓɺ3VCZͰ΋ਪનγεςϜͷ౷߹ॲཧͷΑ͏ͳ΋ͷ Λ࡞Δ͜ͱ͕Ͱ͖Δ ϝΠϯͷॲཧ͸$Ͱॻ͔Εͨ3FEJTͰߦ͏͜ͱͰɺ
 3VCZͱ͍͏ݴޠͷԸܙʢߴੜ࢈ੑɾΤίγεςϜ౳ʣΛ
 ੑೳͱཱ྆͠ͳ͕ΒڗडͰ͖Δ ࠓޙɿ4PSUFE4FUҎ֎ͷσʔλܕʹ͍ͭͯͷݕ౼ɺ౳