Slide 1

Slide 1 text

w 1IPFOJYʹ͋ͬͯ3BJMTʹͳ͍ w 1MBZʹ͋ͬͯ3BJMTʹͳ͍

Slide 2

Slide 2 text

3FBMUJNFDPNNVOJDBUJPO

Slide 3

Slide 3 text

8FC4PDLFU

Slide 4

Slide 4 text

3BJMT"DUJPO$BCMF

Slide 5

Slide 5 text

࠷଎ೖ໳"DUJPO$BCMF !OHUL

Slide 6

Slide 6 text

"DUJPO$BCMF "DUJPO$BCMFTFBNMFTTMZJOUFHSBUFT8FC4PDLFUTXJUIUIFSFTU PGZPVS3BJMTBQQMJDBUJPO*UBMMPXTGPSSFBMUJNFGFBUVSFTUPCF XSJUUFOJO3VCZJOUIFTBNFTUZMFBOEGPSNBTUIFSFTUPGZPVS 3BJMTBQQMJDBUJPO XIJMFTUJMMCFJOHQFSGPSNBOUBOETDBMBCMF*UTB GVMMTUBDLP⒎FSJOHUIBUQSPWJEFTCPUIBDMJFOUTJEF+BWB4DSJQU GSBNFXPSLBOEBTFSWFSTJEF3VCZGSBNFXPSL:PVIBWFBDDFTT UPZPVSGVMMEPNBJONPEFMXSJUUFOXJUI"DUJWF3FDPSEPSZPVS 03.PGDIPJDF

Slide 7

Slide 7 text

"DUJPO$BCMF "DUJPO$BCMF͸3BJMTʹγʔϜϨεʹ౷߹͠·͢ɻϦΞϧλΠϜͳػೳ Λࠓ࢖͍ͬͯΔ3BJMTͷελΠϧͷΑ͏ʹ3VCZͰॻ͘͜ͱ͕Ͱ͖ɺߴ ͍ޮ཰ੑ΍εέʔϥϏϦςΟΛ࣋ͪ·͢ɻΫϥΠΞϯταΠυͷ +BWBT4DSJQUϑϨʔϜϫʔΫ΍αʔόαΠυͷ3VCZϑϨʔϜϫʔΫͷ ྆ํΛؚΉϑϧελοΫͳϑϨʔϜϫʔΫ͕ఏڙ͞Ε·͢ɻͦͯ͠΋ͪ ΖΜ"DUJWF3FDPSEΛ࢝Ίͱ͢Δ03.ʹΑΔϑϧυϝΠϯϞσϧʹΞ Ϋηε͢Δ͜ͱ΋Ͱ͖·͢ɻ

Slide 8

Slide 8 text

ੈք؍తͳԿ͔ 5FSNJOPMPHZ w "DUJPO$BCMFTFSWFSIBOEMJOHNVMUJQMFDPOOFDUJPOJOTUBODFT w $POTVNFSUIFDMJFOUPGB8FC4PDLFUDPOOFDUJPO w $IBOOFMUIFMPHJDBMVOJUPGXPSL TJNJMBSUPXIBUBDPOUSPMMFS EPFTJOBSFHVMBS.7$TFUVQ w 4VCTDSJCFSUIFDPOTVNFSTVCTDSJCFEUPBDIBOOFM w 4VCTDSJQUJPOUIFDPOOFDUJPOCFUXFFOUIFTVCTDSJCFSBOEUIF DIBOOFM

Slide 9

Slide 9 text

४උ w SVCZ w 3BJMTBMQIB w SFEJT

Slide 10

Slide 10 text

$POOFDUJPO 4FSWFSTJEF # app/channels/application_cable/connection.rb module ApplicationCable class Connection < ActionCable::Connection::Base identified_by :current_user def connect self.current_user = find_verified_user end protected def find_verified_user if current_user = User.find(cookies.signed[:user_id]) current_user else reject_unauthorized_connection end end end end

Slide 11

Slide 11 text

$IBOOFM 4FSWFSTJEF # app/channels/application_cable/channel.rb module ApplicationCable class Channel < ActionCable::Channel::Base end end

Slide 12

Slide 12 text

$POTVNFS $MJFOUTJEF # app/assets/javascripts/application_cable.coffee #= require cable @App = {} App.cable = Cable.createConsumer "ws://cable.example.com"

Slide 13

Slide 13 text

"QQFBSBODF$IBOOFM 4FSWFSTJEF # app/channels/appearance_channel.rb class AppearanceChannel < ApplicationCable::Channel def subscribed current_user.appear end def unsubscribed current_user.disappear end def appear(data) current_user.appear on: data['appearing_on'] end def away current_user.away end end

Slide 14

Slide 14 text

4VCTDSJQUJPO $MJFOUTJEF # app/assets/javascripts/cable/subscriptions/appearance.coffee App.appearance = App.cable.subscriptions.create "AppearanceChannel", connected: -> # Called once the subscription has been successfully completed rejected: -> # Called when the subscription is rejected by the server appear: -> @perform 'appear', appearing_on: @appearingOn() away: -> @perform 'away' appearingOn: -> $('main').data 'appearing-on' $(document).on 'page:change', -> App.appearance.appear() $(document).on 'click', '[data-behavior~=appear_away]', -> App.appearance.away() false

Slide 15

Slide 15 text

4VCTDSJQUJPO $MJFOUTJEF # app/assets/javascripts/cable/subscriptions/appearance.coffee App.appearance = App.cable.subscriptions.create "AppearanceChannel", connected: -> # Called once the subscription has been successfully completed rejected: -> # Called when the subscription is rejected by the server appear: -> @perform 'appear', appearing_on: @appearingOn() away: -> @perform 'away' appearingOn: -> $('main').data 'appearing-on' $(document).on 'page:change', -> App.appearance.appear() $(document).on 'click', '[data-behavior~=appear_away]', -> App.appearance.away() false

Slide 16

Slide 16 text

w ͜͜·Ͱ͕ΫϥΠΞϯτ͔Βαʔό΁௨஌͢Δ࢓૊Έ w ͔ͬ͜Βαʔό͔ΒΫϥΠΞϯτ΁഑৴͢Δ࢓૊Έ

Slide 17

Slide 17 text

w IUUQTHJUIVCDPNOHULQSBDUJDFSBJMTBDUJPODBCMF

Slide 18

Slide 18 text

·ͱΊ w 3BJMTͬΆ͍ॻ͖ํͰ͔͚Δͷ͸෼͔Γ΍͍͢ w αʔό΁ͷ௨஌ΞΫγϣϯ໊͸͸DIBOOFMͷϝιου໊ͱରԠ w ΫϥΠΞϯτ΁ͷϝοηʔδ͸A"DUJPO$BCMFTFSWFSCSPBEDBTUA w 7JJCBSͷνϟοτػೳͱ͔Ͱ࢖ͬͯΈ͍ͨͰ͢Ͷ

Slide 19

Slide 19 text

ࢀߟ w IUUQTHJUIVCDPNSBJMTBDUJPODBCMF w IUUQTHJUIVCDPNSBJMTBDUJPODBCMFFYBNQMFT w IUUQTHJUIVCDPNOHULQSBDUJDFSBJMTBDUJPODBCMF