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
Tatsunori Sunagawa
September 23, 2018
Programming
0
76
最近Goで作っているツールたちを晒します!
Gopher道場#3 LT大会での発表資料です。Youtubeのtranscript取得、テストの際のHTTP Serverのモックの方法について話しました。
Tatsunori Sunagawa
September 23, 2018
Tweet
Share
More Decks by Tatsunori Sunagawa
See All by Tatsunori Sunagawa
Google Cloud Spanner FAQ
pchatsu
2
180
Other Decks in Programming
See All in Programming
GUI操作LLMの最新動向: UI-TARSと関連論文紹介
kfujikawa
0
910
QA x AIエコシステム段階構築作戦
osu
0
270
MCPで実現できる、Webサービス利用体験について
syumai
7
2.5k
Go製CLIツールをnpmで配布するには
syumai
2
1.2k
変化を楽しむエンジニアリング ~ いままでとこれから ~
murajun1978
0
720
kiroでゲームを作ってみた
iriikeita
0
160
それ CLI フレームワークがなくてもできるよ / Building CLI Tools Without Frameworks
orgachem
PRO
17
3.8k
『リコリス・リコイル』に学ぶ!! 〜キャリア戦略における計画的偶発性理論と変わる勇気の重要性〜
wanko_it
1
510
Infer入門
riru
4
1.5k
なぜあなたのオブザーバビリティ導入は頓挫するのか
ryota_hnk
5
590
AIのメモリー
watany
13
1.4k
「リーダーは意思決定する人」って本当?~ 学びを現場で活かす、リーダー4ヶ月目の試行錯誤 ~
marina1017
0
220
Featured
See All Featured
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
8
760
Six Lessons from altMBA
skipperchong
28
3.9k
A designer walks into a library…
pauljervisheath
207
24k
Building a Modern Day E-commerce SEO Strategy
aleyda
43
7.4k
Code Reviewing Like a Champion
maltzj
524
40k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
7
800
Fireside Chat
paigeccino
39
3.6k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
131
19k
How to Ace a Technical Interview
jacobian
278
23k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
34
6k
Typedesign – Prime Four
hannesfritz
42
2.8k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
8
880
Transcript
最近Goで作っているツールたちを晒します! @pchatsu 2018/09/19 gopher道場#3 LT大会
自己紹介 @pchatsu(読みはぴーちゃつ) • 言語 ◦ Perl, Ruby, Javaでサーバーサイド、C++でクライアントサイド • 興味
◦ サーバーサイド。GCP (Cloud Spannerが好き)
今回作ったもの • Youtubeの字幕をダウンロードしてくるコマンドラインツール • https://github.com/pchatsu/youtubets これを1動画分まとめて取得!
youtubets • 海外のカンファレンス動画を見る前に、文章で読んでおきたいという動機 • 自動翻訳の字幕には未対応(対応させたい!)
Gopher道場での成長を 入門お題のtail比で見てみる
0 → 5 struct数 男気main.goから脱却することができました
0% → 82.5% テストC0カバレッジ テスト?なにそれいるの?からちゃんとテスト書くマンになりました
tenntennさん、運営の皆様 ありがとうございました!
youtubetsで学んだことをひとつだけ
net/http/httptest • 資料P318あたりにも出ていたhttp通信のテスト用package • 今回はAPI Serverのスタブ化に使った youtubets API Server Request
Response これをすげ替えて、テスト時に固定の レスポンスを返すようにしたい。
net/http/httptest func TestCmd_Run(t *testing.T) { ts := httptest.NewServer(http.HandlerFunc( func(w http.ResponseWriter,
r *http.Request) { switch r.URL.String() { case "/timedtext?lang=en&name=test_en&v=test0001": w.Header().Set("content-Type", "text/xml") fmt.Fprintf(w, transcriptXML) return case "/timedtext?lang=en&name=test_en&v=test0003": ... } }, )) defer ts.Close() youtubets.Domain = ts.URL
net/http/httptest func TestCmd_Run(t *testing.T) { ts := httptest.NewServer(http.HandlerFunc( func(w http.ResponseWriter,
r *http.Request) { switch r.URL.String() { case "/timedtext?lang=en&name=test_en&v=test0001": w.Header().Set("content-Type", "text/xml") fmt.Fprintf(w, transcriptXML) return case "/timedtext?lang=en&name=test_en&v=test0003": ... } }, )) defer ts.Close() youtubets.Domain = ts.URL HandlerFuncを登録して Serverを立ち上げる
net/http/httptest func TestCmd_Run(t *testing.T) { ts := httptest.NewServer(http.HandlerFunc( func(w http.ResponseWriter,
r *http.Request) { switch r.URL.String() { case "/timedtext?lang=en&name=test_en&v=test0001": w.Header().Set("content-Type", "text/xml") fmt.Fprintf(w, transcriptXML) return case "/timedtext?lang=en&name=test_en&v=test0003": ... } }, )) defer ts.Close() youtubets.Domain = ts.URL リクエストが来たURLでハンドリングして、レス ポンスを返す ※transscriptXMLはXML文字列を持っている
net/http/httptest func TestCmd_Run(t *testing.T) { ts := httptest.NewServer(http.HandlerFunc( func(w http.ResponseWriter,
r *http.Request) { switch r.URL.String() { case "/timedtext?lang=en&name=test_en&v=test0001": w.Header().Set("content-Type", "text/xml") fmt.Fprintf(w, transcriptXML) return case "/timedtext?lang=en&name=test_en&v=test0003": ... } }, )) defer ts.Close() youtubets.Domain = ts.URL ts.URLのドメインにリクエストするようにする これにより、API Serverを入れ替えられる
net/http/httptest func TestCmd_Run(t *testing.T) { ts := httptest.NewServer(http.HandlerFunc( func(w http.ResponseWriter,
r *http.Request) { switch r.URL.String() { case "/timedtext?lang=en&name=test_en&v=test0001": w.Header().Set("content-Type", "text/xml") fmt.Fprintf(w, transcriptXML) return case "/timedtext?lang=en&name=test_en&v=test0003": ... } }, )) defer ts.Close() youtubets.Domain = ts.URL Getパラメータの順序違ったら 別のURLと認識されるけど大丈夫?
url.Values • URLのクエリパラメータ組み立てに使用 • GoDoc https://godoc.org/net/url#Values • Encode時にクエリパラメータのkey順にして出力してくれるので大丈夫 ◦ Encode
encodes the values into “URL encoded” form ("bar=baz&foo=quux") sorted by key.
作成中のツール • Cloud Spannerのdatabase/sql/driver ◦ https://github.com/pchatsu/go-spanner-driver ◦ 現状、他のDBと互換性を持たせたいニーズはあまりないが、お勉強も兼ねて作っている ◦ まだ実験段階
▪ https://github.com/GoogleCloudPlatform/google-cloud-go/issues/513 にあるように、純 正SDKをラップして使う実装
ありがとうございました!