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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Tatsunori Sunagawa
September 23, 2018
Programming
80
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
最近Goで作っているツールたちを晒します!
Gopher道場#3 LT大会での発表資料です。Youtubeのtranscript取得、テストの際のHTTP Serverのモックの方法について話しました。
Tatsunori Sunagawa
September 23, 2018
More Decks by Tatsunori Sunagawa
See All by Tatsunori Sunagawa
Google Cloud Spanner FAQ
pchatsu
2
200
Other Decks in Programming
See All in Programming
数百円から始めるRuby電子工作
tarosay
0
120
霧の中の代数的エフェクト
funnyycat
1
450
AWS DevOps AgentのAzure接続機能を検証して見えた活用法/Use Cases Verified for the AWS DevOps Agent's Azure Connectivity Feature
masakiokuda
0
180
GDG Korea Android: 2026 I/O Extended ~ What's new in Android development tools
pluu
0
200
php-fpmのプロセスが枯渇した日-調査・対処・そして本当にやるべきだったこと-
shibuchaaaan
0
180
ドリフトを絶対に許さない(?)CDK運用 / CDK Ops with Zero Tolerance for Drifts (?)
akihisaikeda
1
140
今さら聞けない .NET CLI
htkym
0
170
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
160
使いながら育てる Claude Code — 開発フローの1コマンド化 × 繰り返し指摘の自動仕組み化
shiki_kakaku
0
1.5k
광주소프트웨어마이스터고등학교 DevFest 특강 - 바이브 코딩 시대에서 주니어 개발자로 살아남는 방법
utilforever
1
160
ルールを書いて終わらせないハーネスエンジニアリング
yug1224
4
1.8k
そこに3びきプロダクトがいるじゃろう——生成AI時代における“価値が届かない理由”の構造
kosuket
0
350
Featured
See All Featured
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
240
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
590
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
440
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
160
A designer walks into a library…
pauljervisheath
211
24k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
980
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
230
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
340
Designing for Performance
lara
611
70k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.5k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
460
Test your architecture with Archunit
thirion
1
2.3k
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をラップして使う実装
ありがとうございました!