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.3k
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
入社後SREチームのミッションや課題の整理をした話
morix1500
1
370
[EC2からKubernetes]楽天ラクマのコンテナ化の歩み
morix1500
16
6.2k
AWS EKSでClusterAutoscalerを使うときはNodeGroupの分け方に気をつけろ!
morix1500
0
860
FirebaseとNetlifyを使ってサーバーレスでサービスを作った話
morix1500
2
2.9k
オーバーロードで学んだチームマネジメント / Team management learned through overlord
morix1500
1
2.1k
転職をする前にやっておきたいこと / What you want to do before you change your career
morix1500
0
3.9k
自分を強くするためにやってきたこと
morix1500
7
2.6k
個人事業主になりたい!どうやって?調べてみよう!
morix1500
1
420
負荷試験入門
morix1500
0
1.3k
Other Decks in Programming
See All in Programming
ご注文の差分はこちらですか? 〜 AWS CDK のいろいろな差分検出と安全なデプロイ
konokenj
4
710
The Evolution of Enterprise Java with Jakarta EE 11 and Beyond
ivargrimstad
0
540
JetBrainsのAI機能の紹介 #jjug
yusuke
0
110
CDK引数設計道場100本ノック
badmintoncryer
2
590
ソフトウェア設計とAI技術の活用
masuda220
PRO
25
6.9k
LLMは麻雀を知らなすぎるから俺が教育してやる
po3rin
2
1.3k
マッチングアプリにおけるフリックUIで苦労したこと
yuheiito
0
240
What's new in Adaptive Android development
fornewid
0
120
PHPカンファレンス関西2025 基調講演
sugimotokei
5
1k
Prompt Engineeringの再定義「Context Engineering」とは
htsuruo
0
110
Vibe Codingの幻想を超えて-生成AIを現場で使えるようにするまでの泥臭い話.ai
fumiyakume
18
9.5k
レトロゲームから学ぶ通信技術の歴史
kimkim0106
0
140
Featured
See All Featured
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
50
5.5k
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
StorybookのUI Testing Handbookを読んだ
zakiyama
30
5.9k
GitHub's CSS Performance
jonrohan
1031
460k
Site-Speed That Sticks
csswizardry
10
720
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.8k
Scaling GitHub
holman
461
140k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Agile that works and the tools we love
rasmusluckow
329
21k
How to train your dragon (web standard)
notwaldorf
96
6.1k
GraphQLとの向き合い方2022年版
quramy
49
14k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
138
34k
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言語の使用を進めていきたい!