Slide 1

Slide 1 text

Goで英語ツイートを音声化するツイッターボットを作った 2017.10.24 Go言語LT大会!「最近、Go言語始めました」の会 @morix1500

Slide 2

Slide 2 text

じこしょうかい ・大森翔太(@morix1500) ・株式会社モブキャスト ・インフラエンジニア ・Go歴:2か月くらい? ・技術ブログやってます!  https://blog.haramishio.xyz/

Slide 3

Slide 3 text

きょうのテーマ ・英語のツイートを音声化するツイッターボットの紹介 ・エラーハンドリングに悩んだ話

Slide 4

Slide 4 text

〇〇と学ぶ英語Botというものがある

Slide 5

Slide 5 text

英語学習Botのいいところ ・平易な文章であること ・日本語訳とポイントとなる単語の意味が載ってる ・好きなアニメのセリフで学べる

Slide 6

Slide 6 text

英語学習Botのよくないところ ・単語がコピペしづらい   ⇒ ツイッタークライアントによると思う ・発音がわからない

Slide 7

Slide 7 text

ということでBotに英語をしゃべらせた

Slide 8

Slide 8 text

Botの仕組み GoApp Polly 1. Streaming 2. Get Speech Request 3. Get Speech 4. Encode Video 5. Upload Video & Tweet

Slide 9

Slide 9 text

Amazon Pollyとは ・AWSが提供するテキストから音声化するサービス ・47種類の男女の声と24の言語(日本語含む)に対応 ・機械学習によるなめらかな発音 ・SSML(Speech Sythesis Markup Language)による音声の編集 ・MP3などでダウンロード可能

Slide 10

Slide 10 text

Twitterに音声ファイルをアップロードするには ・Twitterに音声ファイルをアップロードできない ・じゃあどうすれば? ・音声ファイルを動画化してそれをアップロード

Slide 11

Slide 11 text

Go言語でどう作ったか ・Twitter Client  ・Anaconda(https://github.com/ChimeraCoder/anaconda ) ・Pollyの操作  ・AWS SDK ・音声の動画化  ・ffmpeg

Slide 12

Slide 12 text

完成したのがこちら アニメで学ぶ英語音声bot @km_eng_speech https://twitter.com/km_eng_speech

Slide 13

Slide 13 text

Botを作るときに悩んだこと ・Go言語でのエラーハンドリングのやり方  ・例外がないからハンドリングどうやれば…

Slide 14

Slide 14 text

よくあるエラー処理 func main() { if err := something(); err != nil { fmt.Println(err) } }

Slide 15

Slide 15 text

よくあるエラー処理(複数エラーの場合) var ( Err01 = errors.New("Output Error 01") Err02 = errors.New("Output Error 02") ) func main() { err := something() switch err { case Err01: fmt.Println("type is Err01") fmt.Printf("%+v\n", err) case Err02: fmt.Println("type is Err02") fmt.Printf("%+v\n", err) } } エラー定義しといて 返却されたerrで ハンドリングする

Slide 16

Slide 16 text

この方法の問題点 ・エラーに追加情報を付与できない func hoge() error { return Err01 } func something() error { if err := hoge() ; err != nil { return fmt.Errorf("%+v from hoge", err) } return nil } 違うエラー(Err01ではない)になってしまう!

Slide 17

Slide 17 text

かいけつあん ・pkg/errorsを使用する  https://github.com/pkg/errors

Slide 18

Slide 18 text

pkg/errorsとは ・元のエラーを変更しない形で、追加情報を付与できる ・エラーのスタックトレースも出力することができる

Slide 19

Slide 19 text

エラー定義と追加情報の付与 ・エラー定義  Err01 = errors.New(“Output Error 01”) ・追加情報の付与  return errors.Wrap(Err01, “from hoge”)

Slide 20

Slide 20 text

エラー定義と追加情報の付与 import ( "fmt" "github.com/pkg/errors" ) var ( Err01 = errors.New("Output Error 01") Err02 = errors.New("Output Error 02") ) func hoge() error { return Err01 } func fuga() error { return Err02 } func something() error { if err := hoge() ; err != nil { return errors.Wrap(err, "from hoge") } if err := fuga() ; err != nil { return errors.Wrap(err, "from fuga") } return nil }

Slide 21

Slide 21 text

エラー判定 ・エラーの根本原因の呼び出し  errors.Cause(err) err := something() fmt.Println(err) fmt.Println(errors.Cause(err)) --------------------------- from hoge: Output Error 01 Output Error 01

Slide 22

Slide 22 text

エラー判定 func main() { err := something() switch errors.Cause(err) { case Err01: fmt.Println("type is Err01") fmt.Printfln(err) fmt.Printf("%+v\n", err) case Err02: fmt.Println("type is Err02") fmt.Println(err) fmt.Printf("%+v\n", err) } }

Slide 23

Slide 23 text

エラー判定(前ページの出力結果) type is Err01 from hoge: Output Error 01 Output Error 01 main.init /home/ubuntu/go/pkg/src/github.com/morix1500/go-error-handling/04.go:9 runtime.main /home/ubuntu/go/current/src/runtime/proc.go:173 runtime.goexit /home/ubuntu/go/current/src/runtime/asm_amd64.s:2337 from hoge main.something /home/ubuntu/go/pkg/src/github.com/morix1500/go-error-handling/04.go:23 main.main /home/ubuntu/go/pkg/src/github.com/morix1500/go-error-handling/04.go:32 runtime.main /home/ubuntu/go/current/src/runtime/proc.go:185 runtime.goexit /home/ubuntu/go/current/src/runtime/asm_amd64.s:2337

Slide 24

Slide 24 text

まとめ ・複雑なエラーハンドリングは「pkg/errors」がおすすめ ・適切にエラーを処理してユーザに優しいエラーメッセージを! ・スタックトレースで開発者にも優しいエラーメッセージを!

Slide 25

Slide 25 text

最後に - Go言語を使ってみた感想 ・作りたいと思ったものがサクッと作れる  srm - 安全なrmコマンド https://github.com/morix1500/srm ruler - csv/tsv/ltsvを表形式に表示するコマンド https://github.com/morix1500/ruler ・パッケージが充実しており車輪の再発明をしなくていい ・とにかく読みやすい/書きやすい! ・ワンバイナリで配布できるのは非常に便利 ・どんどんGo言語の使用を進めていきたい!