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
77
最近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
190
Other Decks in Programming
See All in Programming
チームをチームにするEM
hitode909
0
440
AI Agent Tool のためのバックエンドアーキテクチャを考える #encraft
izumin5210
6
1.5k
[AI Engineering Summit Tokyo 2025] LLMは計画業務のゲームチェンジャーか? 最適化業務における活⽤の可能性と限界
terryu16
2
240
愛される翻訳の秘訣
kishikawakatsumi
3
370
PostgreSQLで手軽にDuckDBを使う!DuckDB&pg_duckdb入門/osc25hi-duckdb
takahashiikki
0
230
フルサイクルエンジニアリングをAI Agentで全自動化したい 〜構想と現在地〜
kamina_zzz
0
340
re:Invent 2025 トレンドからみる製品開発への AI Agent 活用
yoskoh
0
580
從冷知識到漏洞,你不懂的 Web,駭客懂 - Huli @ WebConf Taiwan 2025
aszx87410
2
3.3k
JETLS.jl ─ A New Language Server for Julia
abap34
2
470
Go コードベースの構成と AI コンテキスト定義
andpad
0
150
Combinatorial Interview Problems with Backtracking Solutions - From Imperative Procedural Programming to Declarative Functional Programming - Part 2
philipschwarz
PRO
0
130
Patterns of Patterns
denyspoltorak
0
420
Featured
See All Featured
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
100
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
1
100
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
180
Discover your Explorer Soul
emna__ayadi
2
1k
WCS-LA-2024
lcolladotor
0
400
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.7k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
10
780
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
0
120
Are puppies a ranking factor?
jonoalderson
0
2.6k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
47
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をラップして使う実装
ありがとうございました!