Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Goで英語ツイートを音声化するツイッターボットを作った
Search
Morix
October 24, 2017
Programming
0
1.2k
Goで英語ツイートを音声化するツイッターボットを作った
Created by Shota Omori(@morix1500)
2017-10-24 GoビギナーズLT大会!「最近、Go言語始めました」の会
Morix
October 24, 2017
Tweet
Share
More Decks by Morix
See All by Morix
[EC2からKubernetes]楽天ラクマのコンテナ化の歩み
morix1500
10
4.3k
AWS EKSでClusterAutoscalerを使うときはNodeGroupの分け方に気をつけろ!
morix1500
0
710
FirebaseとNetlifyを使ってサーバーレスでサービスを作った話
morix1500
2
2.8k
オーバーロードで学んだチームマネジメント / Team management learned through overlord
morix1500
1
2k
転職をする前にやっておきたいこと / What you want to do before you change your career
morix1500
0
3.8k
自分を強くするためにやってきたこと
morix1500
7
2.4k
個人事業主になりたい!どうやって?調べてみよう!
morix1500
1
390
負荷試験入門
morix1500
0
1.2k
PWAを使ったら嫁に怒られなくなった話
morix1500
1
1.6k
Other Decks in Programming
See All in Programming
PicoRubyと暮らす、シェアハウスハック
ryosk7
0
200
どうして手を動かすよりもチーム内のコードレビューを優先するべきなのか
okashoi
3
870
Fixstars高速化コンテスト2024準優勝解法
eijirou
0
190
PHPカンファレンス 2024|共創を加速するための若手の技術挑戦
weddingpark
0
130
今年のアップデートで振り返るCDKセキュリティのシフトレフト/2024-cdk-security-shift-left
tomoki10
0
360
ESLintプラグインを使用してCDKのセオリーを適用する
yamanashi_ren01
2
220
Package Traits
ikesyo
1
200
ErdMap: Thinking about a map for Rails applications
makicamel
1
550
毎日13時間もかかるバッチ処理をたった3日で60%短縮するためにやったこと
sho_ssk_
1
530
見えないメモリを観測する: PHP 8.4 `pg_result_memory_size()` とSQL結果のメモリ管理
kentaroutakeda
0
930
AHC041解説
terryu16
0
330
ATDDで素早く安定した デリバリを実現しよう!
tonnsama
1
1.8k
Featured
See All Featured
Large-scale JavaScript Application Architecture
addyosmani
510
110k
Reflections from 52 weeks, 52 projects
jeffersonlam
348
20k
Gamification - CAS2011
davidbonilla
80
5.1k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
3
350
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
45
2.3k
The Power of CSS Pseudo Elements
geoffreycrofte
74
5.4k
Building Flexible Design Systems
yeseniaperezcruz
328
38k
Building Your Own Lightsaber
phodgson
104
6.2k
Done Done
chrislema
182
16k
Agile that works and the tools we love
rasmusluckow
328
21k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
Keith and Marios Guide to Fast Websites
keithpitt
410
22k
Transcript
Goで英語ツイートを音声化するツイッターボットを作った 2017.10.24 Go言語LT大会!「最近、Go言語始めました」の会 @morix1500
じこしょうかい ・大森翔太(@morix1500) ・株式会社モブキャスト ・インフラエンジニア ・Go歴:2か月くらい? ・技術ブログやってます! https://blog.haramishio.xyz/
きょうのテーマ ・英語のツイートを音声化するツイッターボットの紹介 ・エラーハンドリングに悩んだ話
〇〇と学ぶ英語Botというものがある
英語学習Botのいいところ ・平易な文章であること ・日本語訳とポイントとなる単語の意味が載ってる ・好きなアニメのセリフで学べる
英語学習Botのよくないところ ・単語がコピペしづらい ⇒ ツイッタークライアントによると思う ・発音がわからない
ということでBotに英語をしゃべらせた
Botの仕組み GoApp Polly 1. Streaming 2. Get Speech Request 3.
Get Speech 4. Encode Video 5. Upload Video & Tweet
Amazon Pollyとは ・AWSが提供するテキストから音声化するサービス ・47種類の男女の声と24の言語(日本語含む)に対応 ・機械学習によるなめらかな発音 ・SSML(Speech Sythesis Markup Language)による音声の編集 ・MP3などでダウンロード可能
Twitterに音声ファイルをアップロードするには ・Twitterに音声ファイルをアップロードできない ・じゃあどうすれば? ・音声ファイルを動画化してそれをアップロード
Go言語でどう作ったか ・Twitter Client ・Anaconda(https://github.com/ChimeraCoder/anaconda ) ・Pollyの操作 ・AWS SDK ・音声の動画化 ・ffmpeg
完成したのがこちら アニメで学ぶ英語音声bot @km_eng_speech https://twitter.com/km_eng_speech
Botを作るときに悩んだこと ・Go言語でのエラーハンドリングのやり方 ・例外がないからハンドリングどうやれば…
よくあるエラー処理 func main() { if err := something(); err !=
nil { fmt.Println(err) } }
よくあるエラー処理(複数エラーの場合) 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で ハンドリングする
この方法の問題点 ・エラーに追加情報を付与できない func hoge() error { return Err01 } func
something() error { if err := hoge() ; err != nil { return fmt.Errorf("%+v from hoge", err) } return nil } 違うエラー(Err01ではない)になってしまう!
かいけつあん ・pkg/errorsを使用する https://github.com/pkg/errors
pkg/errorsとは ・元のエラーを変更しない形で、追加情報を付与できる ・エラーのスタックトレースも出力することができる
エラー定義と追加情報の付与 ・エラー定義 Err01 = errors.New(“Output Error 01”) ・追加情報の付与 return errors.Wrap(Err01,
“from hoge”)
エラー定義と追加情報の付与 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 }
エラー判定 ・エラーの根本原因の呼び出し errors.Cause(err) err := something() fmt.Println(err) fmt.Println(errors.Cause(err)) --------------------------- from
hoge: Output Error 01 Output Error 01
エラー判定 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) } }
エラー判定(前ページの出力結果) 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
まとめ ・複雑なエラーハンドリングは「pkg/errors」がおすすめ ・適切にエラーを処理してユーザに優しいエラーメッセージを! ・スタックトレースで開発者にも優しいエラーメッセージを!
最後に - Go言語を使ってみた感想 ・作りたいと思ったものがサクッと作れる srm - 安全なrmコマンド https://github.com/morix1500/srm ruler -
csv/tsv/ltsvを表形式に表示するコマンド https://github.com/morix1500/ruler ・パッケージが充実しており車輪の再発明をしなくていい ・とにかく読みやすい/書きやすい! ・ワンバイナリで配布できるのは非常に便利 ・どんどんGo言語の使用を進めていきたい!