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
520
[EC2からKubernetes]楽天ラクマのコンテナ化の歩み
morix1500
23
8.7k
AWS EKSでClusterAutoscalerを使うときはNodeGroupの分け方に気をつけろ!
morix1500
0
980
FirebaseとNetlifyを使ってサーバーレスでサービスを作った話
morix1500
2
3k
オーバーロードで学んだチームマネジメント / Team management learned through overlord
morix1500
1
2.2k
転職をする前にやっておきたいこと / What you want to do before you change your career
morix1500
0
4k
自分を強くするためにやってきたこと
morix1500
7
2.6k
個人事業主になりたい!どうやって?調べてみよう!
morix1500
1
430
負荷試験入門
morix1500
0
1.6k
Other Decks in Programming
See All in Programming
疑似コードによるプロンプト記述、どのくらい正確に実行される?
kokuyouwind
0
390
生成AIを使ったコードレビューで定性的に品質カバー
chiilog
1
280
組織で育むオブザーバビリティ
ryota_hnk
0
180
余白を設計しフロントエンド開発を 加速させる
tsukuha
7
2.1k
24時間止められないシステムを守る-医療ITにおけるランサムウェア対策の実際
koukimiura
1
130
CSC307 Lecture 03
javiergs
PRO
1
490
なぜSQLはAIぽく見えるのか/why does SQL look AI like
florets1
0
480
React Native × React Router v7 API通信の共通化で考えるべきこと
suguruooki
0
100
Fluid Templating in TYPO3 14
s2b
0
130
CSC307 Lecture 09
javiergs
PRO
1
840
Gemini for developers
meteatamel
0
100
インターン生でもAuth0で認証基盤刷新が出来るのか
taku271
0
190
Featured
See All Featured
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
350
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.1k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
58
50k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
9.6k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
340
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
380
Chasing Engaging Ingredients in Design
codingconduct
0
120
Typedesign – Prime Four
hannesfritz
42
3k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
330
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
0
150
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
57
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.1k
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言語の使用を進めていきたい!