SlideShare a Scribd company logo
1 of 16
Download to read offline
堀内 晨彦
@hico_horiuchi
Go言語で
Bot開発やってみた
自己紹介
Akihiko Horiuchi
香川大学 修士2年
bit.ly/hiconyan
研究室のインフラと掃除担当
Emacs / Ruby / Rails / Golang
Hubot / Sensu / Ansible
15/08/22 2
15/08/22 3
Go言語とは?
1 / 3
Go言語の概要
●  Go言語の概要
○  2009年にGoogleによって開発スタート
○  シンプルな言語仕様,低い学習コスト
○  HTTPやJSONのなどの豊富な標準パケージ
○  高速な動作,クロスコンパイルのサポート
○  goroutine と channel による並列処理
●  開発者
○  Ken Thompson(C言語)
○  Rob Pike(UTF-8)
○  Brad Fitzpatrick(memcached)
15/08/22 4
Go言語で嬉しいこと
●  常に綺麗なコード
○  標準のコーディング規約が定義
○  go fmt で自動的に整形,エディタの保存時に実行
○  未使用の変数があるとコンパイルエラー
●  高速な動作、楽なデプロイ
○  C言語並みの実行速度,バックエンドでの採用
○  バイナリ1つでデプロイ,すぐに動作可能
15/08/22 5
$ go build hoge.go
# command-line-arguments
./hoge.go:4: hoge declared and not used
hello world
15/08/22 6
package main // パッケージの宣言

import "fmt" // インポート

func main() {
var message string = "hello world" // 変数の宣言
fmt.Println(message) // 標準出力
}
$ go run hello.go
hello world

$ go build hello.go
$ ./hello
hello world
15/08/22 7
Botフレームワーク
2 / 3
Go言語のBotフレームワーク
●  Botフレームワーク
○  プラグインで機能を拡張できるもの
○  アダプタ,ストア(ブレイン)があればBetter
●  GitHubで探してみた
○  danryan/hal :アダプタとストアあり,機能も充実
○  brettbuddin/victor:アダプタとストアあり,活発に開発中
○  groob/radigast :Slack限定,victorベース
○  kyokomi/slackbot :Slack限定,グノシーの方が開発
15/08/22 8
halとvictorの比較
15/08/22 9
hal victor
★ 150 113
アダプタ
Shell,IRC
HipChat,Slack(WebHook)
Shell,Campfire
HipChat,Slack(RealTime)
ストア Memory,Redis Memory,BoltDB
ヘルプ × ⃝(FogCreek)
HTTP ⃝ ×
Hear ⃝ ×
Reply ⃝ ⃝(FogCreek)
halとvictorの書き比べ
●  Botの要件
○  docomoの雑談対話APIを使ってお喋り
github.com/kyokomi/go-docomo を利用
○  /say にPOSTしたBodyを通知
○  アダプタはShell,ストアはなし
15/08/22 10
dialogueHandler()
15/08/22 11
func dialogueHandler(res *hal.Response) error {
// インスタンス生成
d := docomo.NewClient(os.Getenv("DOCOMO_DIALOGUE_API_KEY"))

// ユーザーの発話を設定
dialogue := docomo.DialogueRequest{
Utt: &res.Match[1], // hal
Utt: &s.Params()[0], // victor
}

// docomo 雑談対話APIを呼出
get, _ := d.Dialogue.Get(dialogue, true)

return res.Reply(get.Utt) // hal
s.Chat().Send(s.Message().ChannelID(), get.Utt) // victor
}
sayHandler()
15/08/22 12
func sayHandler(w http.ResponseWriter, r *http.Request) {
defer r.Body.Close()
body, _ := ioutil.ReadAll(r.Body)
robot.Adapter.Send(nil, string(body)) // hal
bot.Chat().Send("0", string(body)) // victor
}
danryan/hal
15/08/22 13
var robot *hal.Robot

func main() {
robot, _ = hal.NewRobot() // インスタンス生成

// ハンドラー登録
robot.Handle(hal.Respond(`(.+)`, dialogueHandler))
hal.Router.HandleFunc("/say", sayHandler)

robot.Run() // hal実行
}
brettbuddin/victor
15/08/22 14
var bot victor.Robot

func main() {
// インスタンス生成
bot = victor.New(victor.Config{
Name: "victor",
ChatAdapter: "shell",
})

dialogueHandler(bot) // ハンドラー登録
go bot.Run() // victor実行

http.HandleFunc("/say", sayHandler) // パス登録
http.ListenAndServe(":9000", nil) // HTTP待受
}
15/08/22 15
デモ
3 / 3
デモンスレーション
github.com/hico-horiuchi/gobot
Sample of chat bot by golang
15/08/22 16

More Related Content

What's hot

What's hot (20)

At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajpAt least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
 
SpotBugs(FindBugs)による 大規模ERPのコード品質改善
SpotBugs(FindBugs)による 大規模ERPのコード品質改善SpotBugs(FindBugs)による 大規模ERPのコード品質改善
SpotBugs(FindBugs)による 大規模ERPのコード品質改善
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
 
ゲームエンジニアのためのデータベース設計
ゲームエンジニアのためのデータベース設計ゲームエンジニアのためのデータベース設計
ゲームエンジニアのためのデータベース設計
 
Fluentdのお勧めシステム構成パターン
Fluentdのお勧めシステム構成パターンFluentdのお勧めシステム構成パターン
Fluentdのお勧めシステム構成パターン
 
世界最強のソフトウェアアーキテクト
世界最強のソフトウェアアーキテクト世界最強のソフトウェアアーキテクト
世界最強のソフトウェアアーキテクト
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
いつやるの?Git入門
いつやるの?Git入門いつやるの?Git入門
いつやるの?Git入門
 
Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造Dockerイメージ管理の内部構造
Dockerイメージ管理の内部構造
 
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
 
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
 
Jenkins 再入門
Jenkins 再入門Jenkins 再入門
Jenkins 再入門
 
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
 
メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
JVMのGCアルゴリズムとチューニング
JVMのGCアルゴリズムとチューニングJVMのGCアルゴリズムとチューニング
JVMのGCアルゴリズムとチューニング
 
はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ
 
A critique of ansi sql isolation levels 解説公開用
A critique of ansi sql isolation levels 解説公開用A critique of ansi sql isolation levels 解説公開用
A critique of ansi sql isolation levels 解説公開用
 
Swagger ではない OpenAPI Specification 3.0 による API サーバー開発
Swagger ではない OpenAPI Specification 3.0 による API サーバー開発Swagger ではない OpenAPI Specification 3.0 による API サーバー開発
Swagger ではない OpenAPI Specification 3.0 による API サーバー開発
 

Viewers also liked

Presto in my_use_case2
Presto in my_use_case2Presto in my_use_case2
Presto in my_use_case2
wyukawa
 

Viewers also liked (20)

ChatOps@研究室
ChatOps@研究室ChatOps@研究室
ChatOps@研究室
 
Filter・Mutator・Aggregateの使いドコロ
Filter・Mutator・Aggregateの使いドコロFilter・Mutator・Aggregateの使いドコロ
Filter・Mutator・Aggregateの使いドコロ
 
Cloudn PaaSチームのChatOps実践
Cloudn PaaSチームのChatOps実践Cloudn PaaSチームのChatOps実践
Cloudn PaaSチームのChatOps実践
 
TranslimitのChatOps事情と愉快なbotたち
TranslimitのChatOps事情と愉快なbotたちTranslimitのChatOps事情と愉快なbotたち
TranslimitのChatOps事情と愉快なbotたち
 
クラウドでGolangのテスト&デプロイ!
クラウドでGolangのテスト&デプロイ!クラウドでGolangのテスト&デプロイ!
クラウドでGolangのテスト&デプロイ!
 
Ginとbindataで作るシングルバイナリWebApp
Ginとbindataで作るシングルバイナリWebAppGinとbindataで作るシングルバイナリWebApp
Ginとbindataで作るシングルバイナリWebApp
 
BotKitで作るイベント駆動Bot
BotKitで作るイベント駆動BotBotKitで作るイベント駆動Bot
BotKitで作るイベント駆動Bot
 
Go MobileでAndroidアプリ開発
Go MobileでAndroidアプリ開発Go MobileでAndroidアプリ開発
Go MobileでAndroidアプリ開発
 
Jenkins 2.0 Pipeline & Blue Ocean
Jenkins 2.0 Pipeline & Blue OceanJenkins 2.0 Pipeline & Blue Ocean
Jenkins 2.0 Pipeline & Blue Ocean
 
How to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your NicheHow to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your Niche
 
My ambariexperience
My ambariexperienceMy ambariexperience
My ambariexperience
 
OSS監視ツールSensuの紹介
OSS監視ツールSensuの紹介OSS監視ツールSensuの紹介
OSS監視ツールSensuの紹介
 
Prometheus london
Prometheus londonPrometheus london
Prometheus london
 
Presto in my_use_case2
Presto in my_use_case2Presto in my_use_case2
Presto in my_use_case2
 
今日から始める人工知能 × 機械学習 Meetup ライトニングトーク1
今日から始める人工知能 × 機械学習 Meetup ライトニングトーク1今日から始める人工知能 × 機械学習 Meetup ライトニングトーク1
今日から始める人工知能 × 機械学習 Meetup ライトニングトーク1
 
Landset 8 的雲層去除技巧實作
Landset 8 的雲層去除技巧實作Landset 8 的雲層去除技巧實作
Landset 8 的雲層去除技巧實作
 
Upgrading from-hdp-21-to-hdp-24
Upgrading from-hdp-21-to-hdp-24Upgrading from-hdp-21-to-hdp-24
Upgrading from-hdp-21-to-hdp-24
 
小魯蛇與他快樂的夥伴
小魯蛇與他快樂的夥伴小魯蛇與他快樂的夥伴
小魯蛇與他快樂的夥伴
 
合同勉強会20160821
合同勉強会20160821合同勉強会20160821
合同勉強会20160821
 
20150419_pbtech_openstack_nyah #pbtech
20150419_pbtech_openstack_nyah #pbtech20150419_pbtech_openstack_nyah #pbtech
20150419_pbtech_openstack_nyah #pbtech
 

Similar to Go言語でBot開発やってみた

Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2
Takuya Ueda
 
今日から始めるGopher - スタートGo #0 @GDG名古屋
今日から始めるGopher - スタートGo #0 @GDG名古屋今日から始めるGopher - スタートGo #0 @GDG名古屋
今日から始めるGopher - スタートGo #0 @GDG名古屋
Takuya Ueda
 
Language toolを使ってみる
Language toolを使ってみるLanguage toolを使ってみる
Language toolを使ってみる
Takatsugu Nokubi
 
Go一緒にいかが?
Go一緒にいかが?Go一緒にいかが?
Go一緒にいかが?
Ryuji Iwata
 

Similar to Go言語でBot開発やってみた (20)

Golang入門
Golang入門Golang入門
Golang入門
 
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2
 
Go言語ってどんな言語? 導入実績や気になるトレンド
Go言語ってどんな言語? 導入実績や気になるトレンドGo言語ってどんな言語? 導入実績や気になるトレンド
Go言語ってどんな言語? 導入実績や気になるトレンド
 
OSSで楽に作るGo言語クライアントツール
OSSで楽に作るGo言語クライアントツールOSSで楽に作るGo言語クライアントツール
OSSで楽に作るGo言語クライアントツール
 
Goとtest coverage
Goとtest coverageGoとtest coverage
Goとtest coverage
 
社内勉強会1 go lang
社内勉強会1 go lang 社内勉強会1 go lang
社内勉強会1 go lang
 
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会
 
Shizuoka go lang csp
Shizuoka go lang cspShizuoka go lang csp
Shizuoka go lang csp
 
What is "Go" Gopher?
What is "Go" Gopher?What is "Go" Gopher?
What is "Go" Gopher?
 
今日から始めるGopher - スタートGo #0 @GDG名古屋
今日から始めるGopher - スタートGo #0 @GDG名古屋今日から始めるGopher - スタートGo #0 @GDG名古屋
今日から始めるGopher - スタートGo #0 @GDG名古屋
 
粗探しをしてGoのコントリビューターになる方法
粗探しをしてGoのコントリビューターになる方法粗探しをしてGoのコントリビューターになる方法
粗探しをしてGoのコントリビューターになる方法
 
Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析
 
2019-01_正月三が日でGolangを触ってみた
2019-01_正月三が日でGolangを触ってみた2019-01_正月三が日でGolangを触ってみた
2019-01_正月三が日でGolangを触ってみた
 
20130824 Lightweight Language "Go" @LL matsuri
20130824 Lightweight Language "Go" @LL matsuri20130824 Lightweight Language "Go" @LL matsuri
20130824 Lightweight Language "Go" @LL matsuri
 
GoでMinecraftっぽいの作る
GoでMinecraftっぽいの作るGoでMinecraftっぽいの作る
GoでMinecraftっぽいの作る
 
オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選
 
Language toolを使ってみる
Language toolを使ってみるLanguage toolを使ってみる
Language toolを使ってみる
 
SIG-Glocalization #13「アプリの海外展開、どうしていますか?」講演スライド
SIG-Glocalization #13「アプリの海外展開、どうしていますか?」講演スライドSIG-Glocalization #13「アプリの海外展開、どうしていますか?」講演スライド
SIG-Glocalization #13「アプリの海外展開、どうしていますか?」講演スライド
 
20130316 プログラミング言語Go
20130316 プログラミング言語Go20130316 プログラミング言語Go
20130316 プログラミング言語Go
 
Go一緒にいかが?
Go一緒にいかが?Go一緒にいかが?
Go一緒にいかが?
 

More from Akihiko Horiuchi

Sensuで始めるクラウド時代のシステム監視
Sensuで始めるクラウド時代のシステム監視Sensuで始めるクラウド時代のシステム監視
Sensuで始めるクラウド時代のシステム監視
Akihiko Horiuchi
 

More from Akihiko Horiuchi (17)

オープンソースBotフレームワークではじめるChatOps
オープンソースBotフレームワークではじめるChatOpsオープンソースBotフレームワークではじめるChatOps
オープンソースBotフレームワークではじめるChatOps
 
Sensuで始めるクラウド時代のシステム監視
Sensuで始めるクラウド時代のシステム監視Sensuで始めるクラウド時代のシステム監視
Sensuで始めるクラウド時代のシステム監視
 
Ansibleで一発!! VPSにDokkuを構築してみた
Ansibleで一発!! VPSにDokkuを構築してみたAnsibleで一発!! VPSにDokkuを構築してみた
Ansibleで一発!! VPSにDokkuを構築してみた
 
InfluxDataのTICK Stack on DockerでNW監視
InfluxDataのTICK Stack on DockerでNW監視 InfluxDataのTICK Stack on DockerでNW監視
InfluxDataのTICK Stack on DockerでNW監視
 
ポスト・フラットデザイン 〜フラットデザイン2.0とCSSフレームワーク〜
ポスト・フラットデザイン 〜フラットデザイン2.0とCSSフレームワーク〜ポスト・フラットデザイン 〜フラットデザイン2.0とCSSフレームワーク〜
ポスト・フラットデザイン 〜フラットデザイン2.0とCSSフレームワーク〜
 
勉強会への一歩を踏み出すために
勉強会への一歩を踏み出すために勉強会への一歩を踏み出すために
勉強会への一歩を踏み出すために
 
Sensuでネットワーク監視やってみた
Sensuでネットワーク監視やってみたSensuでネットワーク監視やってみた
Sensuでネットワーク監視やってみた
 
学生がJANOGに行くべき3つの理由
学生がJANOGに行くべき3つの理由学生がJANOGに行くべき3つの理由
学生がJANOGに行くべき3つの理由
 
HubotとChatOpsについて語るBoF
HubotとChatOpsについて語るBoFHubotとChatOpsについて語るBoF
HubotとChatOpsについて語るBoF
 
Sensu Introduction
Sensu IntroductionSensu Introduction
Sensu Introduction
 
Sensu with golang
Sensu with golangSensu with golang
Sensu with golang
 
サーバ監視ことはじめ
サーバ監視ことはじめサーバ監視ことはじめ
サーバ監視ことはじめ
 
SKK
SKKSKK
SKK
 
Self Introduction
Self IntroductionSelf Introduction
Self Introduction
 
エディタじゃない"Emacsの使い方
エディタじゃない"Emacsの使い方エディタじゃない"Emacsの使い方
エディタじゃない"Emacsの使い方
 
LET'S PRESENTATION!
LET'S PRESENTATION!LET'S PRESENTATION!
LET'S PRESENTATION!
 
自己紹介などなど
自己紹介などなど自己紹介などなど
自己紹介などなど
 

Recently uploaded

Recently uploaded (10)

論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 

Go言語でBot開発やってみた