Slide 1

Slide 1 text

(P(PPHMF$MPVE'VODUJPOTΛ࢖ͬ ͨ4MBDLͷUISFBEʹ΋ରԠͨ͠CPUΛ؆ ୯ʹ࡞Δํ๏ λΠτϧ͕௕͗ͨ͢LUZLPHN 4MBDL%FW.FFUVQ5PLZP-5ࢿྉ

Slide 2

Slide 2 text

XIPBNJ w !LUZLPHN LPHVNB w ϝϧΧϦ43& w ࠷ۙ(PΛۀ຿Ͱͨ·ʹॻ͍͍ͯΔϨϕϧ w ʮ4MBDL(PͳΒͦͷ͘Β͍؆୯ʹԼ४උͰ͖ΔΑʯͱ͍͏͜ͱΛ఻ ͑ʹདྷ·ͨ͠ w 43&-PVOHFͱ͍͏ίϛϡχςΟͷӡӦ׆ಈΛ͍ͯ͠·͢ɻ

Slide 3

Slide 3 text

ຊ೔఻͍͑ͨ͜ͱ w 4MBDL(P$MPVE'VODUJPOTͷ૬ੑ w (PΛ࢖ͬͨ4MBDLͷ5ISFBEରԠํ๏ w (Pք۾Ͱ͸Α͘஌ΒΕͨOMPQFTTMBDL͕DPPPPPPPPM w ͦΕΒ#PU ͦΕҎ֎΋ ࡞੒͸ɺαʔόͱӡ༻අΛ༻ҙͤͣʹؾָʹ࢝Ί ΒΕΔ

Slide 4

Slide 4 text

$MPVE'VODUJPOTͱ͸ w ΠϕϯτυϦϒϯͳαʔόϨείϯϐϡʔτϓϥοτ ϑΥʔϜ w (BUFXBZ͸ແͯ͘΋ಈ͘ w &YUFOTJCMF4FSWJDF1SPYZ &41 Λ࢖ͬͯ(BUFXBZ FOEQPJOUߏ੒΋΋ͪΖΜͰ͖·͢ɻ w ͦͷ··ؔ਺ΛઃஔͰ͖Δ HPCVJMEෆཁ w ࣗಈతʹεέʔϧ׌ͭɺ)" w ଞͷ($1αʔϏεʹ઀ଓ֦ͯ͠ு͕Մೳ w ແྉ࿮͕ଘࡏ͢Δ w ݄ؒͰɺສݺͼग़͠ ສඵ (#ԼΓτϥ ϑΟοΫ ೥݄ʹ(PSVUJNF͕CFUBSFMFBTF IUUQTDMPVEHPPHMFDPNGVODUJPOT

Slide 5

Slide 5 text

$MPVE'VODUJPOT ଞͷ($1αʔϏεʹ઀ଓ֦ͯ͠ு͕Մೳ w $MPVE1VC4VC w $MPVE4UPSBHF w )551 w 4UBDLESJWFS-PHHJOH w 'JSFCBTF w $MPVE42- $POOFDU71$ FUD

Slide 6

Slide 6 text

ࣄલ४උ w 4MBDLͷ༻ҙ w (PPHMF$MPVE1MBUGPSN ($1 ͷΞΧ΢ϯτΛ࡞੒ w HDMPVEίϚϯυ͕࢖͑ΔΑ͏ʹ(PPHMF$MPVE4%,Λ*OTUBMM w IUUQTDMPVEHPPHMFDPNTELJOTUBMM w HDMPVE͸ݱࡏ1ZUIPO͕ඞཁͳͷͰɺQZFOW౳ͰXPSLJOH EJSFDUPSZʹQZFOWMPDBMYͰ؅ཧ͢Δͱྑ͍Ͱ͢

Slide 7

Slide 7 text

ࠓճͷߏ੒ͱ؀ڥʹ͍ͭͯ w ࠓճ͸-5ͳͷͰλΠτϧʹ͋Δ4MBDL5ISFBEʹରԠͨ͠#PUΛ࡞੒͢Δ ํ๏ͱͦͷઆ໌͚ͩʹ಺༰Λ΄΅ߜΓ·͢ w 4MBDLࣗମ͸4MBTI$PNNBOE΍#PU΁ͷNFOUJPOʹΑΔ൓ԠͳͲ༷ʑ ͳํͰରԠͰ͖·͢ w 4MBDLͷ35."1*Λ࢖༻ w (PͷOMPQFTTMBDLNPEVMFΛ࢖༻

Slide 8

Slide 8 text

࠷খ$PEF package gcf_slack_sample import ( "net/http" "os" "strings" "github.com/nlopes/slack" ) var ( threadTs slack.RTMsgOption ) type SlackParams struct { accessToken string botUserID string rtm *slack.RTM } func PostMessage(w http.ResponseWriter, r *http.Request) { // Ҿ਺͸০ΓɻCloud Functionͷhttp trigger Ͱඞཁ params := SlackParams{ accessToken: os.Getenv("ACCESS_TOKEN"), botUserID: "", } api := slack.New(params.accessToken) params.rtm = api.NewRTM() go params.rtm.ManageConnection() go func() { for msg := range params.rtm.IncomingEvents { switch ev := msg.Data.(type) { case *slack.ConnectedEvent: params.botUserID = ev.Info.User.ID case *slack.MessageEvent: if !strings.Contains(ev.Msg.Text, params.botUserID) { continue } threadTs = slack.RTMsgOptionTS(ev.ThreadTimestamp) params.rtm.SendMessage(params.rtm.NewOutgoingMessage("Sample TEST", ev.Channel, threadTs)) } } }() ࣮͸͜Ε͚ͩͰɺຊ୊ ͷʮ4MBDLͷ5ISFBEʹ ରԠͨ͠#PUPO $MPVE'VODUJPOTΛ(P Ͱ࡞Δʯ͜ͱ͸Մೳ WBSTZBNM͸ߦ͚ͩ$SFEFOUJBM؅ཧ Ͱผ్͋Γ·͢ɻޙ΄Ͳઆ໌ HPNPEVMFTͷTFUVQ౳ͷઆ໌͸ল͖ ·͢

Slide 9

Slide 9 text

த਎ͷઆ໌

Slide 10

Slide 10 text

FOEQPJOUؔ਺ w (PPHMF$MPVE'VODUJPOTͷ࢓༷ ͰɺNBJOؔ਺Ҏ֎͕ඞཁʹͳΓ· ͢ɻ w ྫͰ͸ɺ1PTU.FTTBHF w Ͳ͔͜Β։࢝͞ΕΔ͔Θ͔Γ΍͍͢Α ͏ʹNBJOHP΍GVODUJPOHPͱ͍͏ pMF໊ʹͯ͠ҎԼͷΑ͏ʹ։࢝͢Δؔ ਺Λ࡞Γ·͢ package gcf_slack_sample // <= ࣮͸ԿͰ΋ok // .. func PostMessage(w http.ResponseWriter, r *http.Request) { // Ҿ਺͸০ΓɻCloud Functionͷhttp trigger Ͱඞཁ params := SlackParams{ accessToken: os.Getenv("ACCESS_TOKEN"), botUserID: "", }

Slide 11

Slide 11 text

4MBDLͷ5ISFBEରԠ w TMBDL35.TH0QUJPO w ͜Ε͸ޙʹઆ໌͢Δ35.TH0QUJPO54 FW5ISFBE5JNFTUBNQ ʹؔ܎͠ ·͢ɻ var ( threadTs slack.RTMsgOption )

Slide 12

Slide 12 text

4MBDLͷ5ISFBEରԠ ҎԼ͕4MBDLͷ5ISFBEͰͦͷ࣌ʹऔಘ͞ΕΔ5ISFBE5JNF4UBNQΛ࣋ͪ· ͢ ͜ͷ5ISFBE5JNF4UBNQΛར༻͢Δ͜ͱͰ#PU͕4MBDLͷ5ISFBEʹରԠ͢ ΔΑ͏ʹͳΓ·͢ threadTs = slack.RTMsgOptionTS(ev.ThreadTimestamp)

Slide 13

Slide 13 text

4MBDLͷ5ISFBEରԠ 35.TH0QUJPO54 FW5ISFBE5JNFTUBNQ ͱ͸Կͳͷ͔ go func() { for msg := range s.rtm.IncomingEvents { switch ev := msg.Data.(type) { ͜ͷFW͸ɺͦͷલͷ35.ͷ*ODPNJOH&WFOUT͔Β&WFOUUZQF͝ͱʹTXJUDI͠ɺͦͷ&WFOUEBUBΛFWʹೖΕ͍ͯ·͢ case *slack.MessageEvent: // .. threadTs = slack.RTMsgOptionTS(ev.ThreadTimestamp) .FTTBHF&WFOUΛड͚औͬͨλΠϛϯάͰɺͦͷૹ৴ݩͷTMBDLͷUISFBEʹରԠ͢ΔͨΊʹ ͦͷ࣌఺ͷ5ISFBE5JNF4UBNQΛ࢖༻͠·͢ ͢ͳΘͪɺ͜ͷ.FTTBHF&WFOU͕࢝·ͬͨ࣌ͷ5ISFBE5JNFTUBNQ͕ೖΓ·͢ɻ

Slide 14

Slide 14 text

OMPQFTTMBDLଆͷྲྀΕ ϖʔδ਺ͷؔ܎্ɺOMPQFTTMBDLଆͷઆ໌͸ׂѪ͠·͕͢ྲྀΕ͚ͩॻ͘ͱҎԼͰ͢ɻ 35.TH0QUJPO54 Ͱɺ.FTTBHF&WFOUΛड͚औͬͨͱ͖ͷ5ISFBE5NFTUBNQΛૹΔ 0VUHPJOH.FTTBBHF\5ISFBE5JNFTUBNQUISFBE5JNFTUBNQ^ʹઃఆ͞ΕΔ 35.TH0QUJPOܕͰฦ͢ 1BDLBHFWBSJBCMFͰࢦఆͨ͠ม਺UISFBE5T͸ɺͦͷ35.TH0QUJPOܕͱͳΔ
 
 IUUQTHJUIVCDPNOMPQFTTMBDLCMPCFBFDEFFCDEEGD NFTTBHFTHP--

Slide 15

Slide 15 text

ड͚औͬͨ5ISFBE5JNF4UBNQΛ࢖͏ s.rtm.NewOutgoingMessage() ͜ͷؔ਺͸ɺTMBDL35.ͰҎԼͷΑ͏ʹఆٛ͞Ε͍ͯ·͢ɻ func (rtm *RTM) NewOutgoingMessage(text string, channelID string, options ...RTMsgOption) *OutgoingMessage { // .. return &msg 4MBDLͰ#PU͕࿩͢.FTTBHFΛೖΕΔؔ਺

Slide 16

Slide 16 text

ड͚औͬͨ5ISFBE5JNF4UBNQΛ࢖͏ ҎԼͰUISFBE5JNF4UBNQΛ0QUJPOͰࢦఆ͢Ε͹ྑ͍Θ͚Ͱ͢ɻ s.rtm.NewOutgoingMessage(message, ev.Channel, threadTs)

Slide 17

Slide 17 text

ड͚औͬͨ5ISFBE5JNF4UBNQΛ࢖͏ s.rtm.SendMessage(s.rtm.NewOutgoingMessage(message, ev.Channel, threadTs)) ࣮ࡍʹ.FTTBHFΛૹΔͨΊʹ͸ҎԼͷΑ͏ʹ͠·͢ɻ

Slide 18

Slide 18 text

͜ΕΛ$MPVE'VODUJPOTʹ৐ͤ ͯ4MBDLCPUͱͯ͠ొ࿥͢Δ

Slide 19

Slide 19 text

4MBDLͰઃఆ 4MBDL"QQͷ࡞੒ɺొ࿥͔Βɻ wิ଍ w֤छͷઆ໌ʹ͍ͭͯ͸ҎԼ͕Θ͔Γ΍͍͢Ͱ͢ wIUUQTRJJUBDPNOBNVUBLBJUFNT BDBG IUUQTBQJTMBDLDPNBQQTɹΛ։͖·͢

Slide 20

Slide 20 text

4MBDLͰઃఆ $SFBUF/FX"QQTΛ։ ͍ͯ࡞੒Λ։࢝͠·͢ ͜͜Ͱ͸UFTUCPUͱ͍͏໊ લͰొ࿥͠·͢ %FWFMPQNFOU4MBDL 8PSLTQBDFΛબ୒͠·͢

Slide 21

Slide 21 text

4MBDLͰઃఆ #PU6TFSTΛΫϦοΫ͠ ͯɺ"EEB#PUVTFSΛΫ ϦοΫ %JTQMBZOBNFͱ%FGBVMU VTFSOBNFͰ͸ɺͲͷΑ͏ ͳจࣈ਺Ͱ΋ϋΠϑϯແ͠ ʹม׵͞ΕΔ ϋΠϑϯ͕ඞཁͩͬͨΒ௥Ճ͍ͯͩ͘͠͞ VTFSOBNF͸จࣈ·Ͱͷ੍ݶ͕͋Γ· ͢ɻ

Slide 22

Slide 22 text

4MBDLͰઃఆ 4DPQFTʹ DIBUXSJUFCPUΛ௥Ճ͢Δ 4BWF$IBOHFTͰอଘ ಉ͡ϖʔδͷҰ൪্ʹ͋Δ A*OTUBMMBQQUPXPSLTQBDFAΛ ΫϦοΫͯ͠"VUIPSJ[FE͢Δɻ 0BVUI1FSNJTTJPOTઃఆ

Slide 23

Slide 23 text

4MBDLͰઃఆ #PU6TFS0"VUI"DDFTT5PLFOΛऔ ಘͯ͠ɺWBSTZBNMʹॻ͘ 0BVUI1FSNJTTJPOTઃఆ ACCESS_TOKEN: xoxb-XXXXXXXXXXXXXXXXXXXX WBSTZBNM HJUJHOPSFʹೖΕ͓͖ͯ·͢

Slide 24

Slide 24 text

(PPHMF$MPVE'VODUJPOTʹEFQMPZ HDMPVEGVODUJPOTEFQMPZUFTUCPUa FOUSZQPJOU1PTU.FTTBHFa SVOUJNFHPa FOWWBSTpMFWBSTZBNMa USJHHFSIUUQ

Slide 25

Slide 25 text

(PPHMF$MPVE'VODUJPOTʹEFQMPZ ͠͹Β͘଴ͭͱEFQMPZ͕׬ྃ͠·͢ɻ IUUQT5SJHHFS VSMIUUQTSFHJPOQSPKFDUDMPVEGVODUJPOTOFUUFTUCPU TUBUVT"$5*7& ͷΑ͏ͳIUUQT5SJHHFS͕ൃߦ͞Ε·͢ͷͰɺ͜ΕΛΫϦοΫ͠·͢ɻ

Slide 26

Slide 26 text

͜Ε͚ͩͰ׬ྃͰ͢ TMBDLͷDIBOOFMʹ#PUΛ*OWJUF͠·͢ɻ

Slide 27

Slide 27 text

#PUΛݺͼग़͢

Slide 28

Slide 28 text

#PUΛݺͼग़͢ 5ISFBEʹ#PUͷ .FOUJPOΛඈ͹͢ͱͦͷ 5ISFBEʹରԠ͍ͯ͠· ͢ɻ ·ͨɺ5ISFBEҎ֎ʹ͸ ͦͷDIBOOFMʹਖ਼֬ʹ #PU͕Ԡ౴Λฦ͍ͤͯ· ͢ɻ

Slide 29

Slide 29 text

ิ଍ w ΋ͪΖΜࠓճ͸-5Ͱઆ໌༻Ͱۃ୺ʹ୹ͨ͘͠$PEFͰ͢ w ࣮ࡍʹ࢖͏ͱ͖͸௕ظӡ༻Λߟ͑ͯॺ໊ͳΜ͔΋͚ͭΔͱྑ͍ͱࢥ͍·͢ w 4JHOJOHTFDSFU

Slide 30

Slide 30 text

·ͱΊ w 4MBDLCPUͷԼ४උΛ(PͰ΋؆୯ʹग़དྷΔ w 5ISFBEରԠ͸ɺ TMBDL35.TH0QUJPO54 FW5ISFBE5JNFTUBNQ Λऔಘͯ͠࢖͏ ͚ͩ w 4MBDLCPU(P$MPVE'VODUJPOTͷ૬ੑ͸ѱ͘ͳ͍ w ࡞Γ΍͍֦͢ுੑ͕͋Δ The Go gopher was designed by Renee French. (http://reneefrench.blogspot.com/)

Slide 31

Slide 31 text

࠷ޙʹ IUUQTHJUIVCDPNLPHVNBHDGMFBTUTMBDLTBNQMFGPS-5

Slide 32

Slide 32 text

͝੩ௌ͋Γ͕ͱ͏͍͟͝·͠ ͨɻ