Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
EN
Uploaded by
lestrrat
PDF, PPTX
4,586 views
筋肉によるGoコードジェネレーション
github.com/lestrrat/go-slackを主軸として、筋肉(fmt.Fprintf)を使ったコードジェネレーションを紹介
Internet
◦
Read more
4
Save
Share
Embed
Embed presentation
Download
Download as PDF, PPTX
1
/ 50
2
/ 50
3
/ 50
4
/ 50
5
/ 50
6
/ 50
7
/ 50
8
/ 50
9
/ 50
10
/ 50
11
/ 50
12
/ 50
13
/ 50
14
/ 50
15
/ 50
16
/ 50
17
/ 50
18
/ 50
19
/ 50
20
/ 50
21
/ 50
22
/ 50
23
/ 50
24
/ 50
25
/ 50
26
/ 50
27
/ 50
28
/ 50
29
/ 50
30
/ 50
31
/ 50
32
/ 50
33
/ 50
34
/ 50
35
/ 50
36
/ 50
37
/ 50
38
/ 50
39
/ 50
40
/ 50
41
/ 50
42
/ 50
43
/ 50
44
/ 50
45
/ 50
46
/ 50
47
/ 50
48
/ 50
49
/ 50
50
/ 50
More Related Content
PDF
Xeonphiハッカソンでexpを作ってみた
by
MITSUNARI Shigeo
PDF
私とOSSの25年
by
MITSUNARI Shigeo
PPT
2006-04-22 CLR/H #14 .NET and open source
by
Yoshiyuki Nakamura
PDF
Literate Computing for Infrastructure - インフラ・コード化の実践におけるIPython (Jupyter) Not...
by
No Bu
PPTX
Jupyter notebook
by
亮吾 守屋
PDF
tweleve-factor-app_and_enterprise
by
Naoto TAKAHASHI
PPTX
Docker meetup tokyo_public_r001
by
cyberblack28 Ichikawa
PPTX
Jupyterで運用やってみた
by
Satoshi Yazawa
Xeonphiハッカソンでexpを作ってみた
by
MITSUNARI Shigeo
私とOSSの25年
by
MITSUNARI Shigeo
2006-04-22 CLR/H #14 .NET and open source
by
Yoshiyuki Nakamura
Literate Computing for Infrastructure - インフラ・コード化の実践におけるIPython (Jupyter) Not...
by
No Bu
Jupyter notebook
by
亮吾 守屋
tweleve-factor-app_and_enterprise
by
Naoto TAKAHASHI
Docker meetup tokyo_public_r001
by
cyberblack28 Ichikawa
Jupyterで運用やってみた
by
Satoshi Yazawa
What's hot
PDF
捗るリコメンドシステムの裏事情(ハッカドール)
by
mosa siru
PDF
ゼロからはじめるTerraformでのDevOps2021
by
Wataru Unno
PPTX
DockerでJupyter使おうぜ
by
Satoshi Yazawa
PDF
LibreOfficeをビルドしてみよう(Windows)
by
Masataka Kondo
PDF
LibreOffice を Windows 上でビルドする UPDATE2
by
Tomofumi Yagi
PDF
PythonによるWebスクレイピング入門
by
Hironori Sekine
PPTX
第4回 SoftLayer勉強会 資料
by
Naoki Shibata
PDF
高速にコンテナを起動できるイメージフォーマット
by
Akihiro Suda
PDF
Py datameetup1
by
shiroyagi
PPTX
Jupyterで手順再現!Elasticsearch構築・運用を実行可能ドキュメントで機械化してみた
by
Satoshi Yazawa
PDF
Rtshell入門
by
openrtm
PDF
scikit-learnを用いた機械学習チュートリアル
by
敦志 金谷
PDF
20180723 PFNの研究基盤 / PFN research system infrastructure
by
Preferred Networks
PDF
【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例
by
UnityTechnologiesJapan002
PDF
TOPPERSプロジェクトの紹介 OSC2017 Tokyo Fall
by
Center for Embedded Computing Systems, Nagoya Univ.
PDF
High performance python computing for data science
by
Takami Sato
PDF
Pythonによる非同期プログラミング入門
by
Hironori Sekine
PDF
LibreOffice を Windows 上でビルドする UPDATE
by
Tomofumi Yagi
PDF
OSS 開発ってどうやっているの? ~ PostgreSQL の現場から~
by
Masahiko Sawada
PDF
【第33回コンピュータビジョン勉強会@関東】OpenVX、 NVIDIA VisionWorks使ってみた
by
Yasuhiro Yoshimura
捗るリコメンドシステムの裏事情(ハッカドール)
by
mosa siru
ゼロからはじめるTerraformでのDevOps2021
by
Wataru Unno
DockerでJupyter使おうぜ
by
Satoshi Yazawa
LibreOfficeをビルドしてみよう(Windows)
by
Masataka Kondo
LibreOffice を Windows 上でビルドする UPDATE2
by
Tomofumi Yagi
PythonによるWebスクレイピング入門
by
Hironori Sekine
第4回 SoftLayer勉強会 資料
by
Naoki Shibata
高速にコンテナを起動できるイメージフォーマット
by
Akihiro Suda
Py datameetup1
by
shiroyagi
Jupyterで手順再現!Elasticsearch構築・運用を実行可能ドキュメントで機械化してみた
by
Satoshi Yazawa
Rtshell入門
by
openrtm
scikit-learnを用いた機械学習チュートリアル
by
敦志 金谷
20180723 PFNの研究基盤 / PFN research system infrastructure
by
Preferred Networks
【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例
by
UnityTechnologiesJapan002
TOPPERSプロジェクトの紹介 OSC2017 Tokyo Fall
by
Center for Embedded Computing Systems, Nagoya Univ.
High performance python computing for data science
by
Takami Sato
Pythonによる非同期プログラミング入門
by
Hironori Sekine
LibreOffice を Windows 上でビルドする UPDATE
by
Tomofumi Yagi
OSS 開発ってどうやっているの? ~ PostgreSQL の現場から~
by
Masahiko Sawada
【第33回コンピュータビジョン勉強会@関東】OpenVX、 NVIDIA VisionWorks使ってみた
by
Yasuhiro Yoshimura
More from lestrrat
PDF
Future of Tech "Conferences"
by
lestrrat
PDF
ONIの世界 - ONIcon 2019 Winter
by
lestrrat
PDF
Slicing, Dicing, And Linting OpenAPI
by
lestrrat
PDF
Oxygen Not Includedをやるべき4つの理由
by
lestrrat
PDF
Rejectcon 2018
by
lestrrat
PDF
Builderscon tokyo 2018 speaker dinner
by
lestrrat
PDF
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
by
lestrrat
PDF
Google container builderと友だちになるまで
by
lestrrat
PDF
iosdc 2017
by
lestrrat
PDF
シュラスコの食べ方 超入門
by
lestrrat
PDF
OSSの敵になるのもいいじゃない
by
lestrrat
PDF
Coding in the context era
by
lestrrat
PDF
Kubernetes in 30 minutes (2017/03/10)
by
lestrrat
PDF
Opening: builderscon tokyo 2016
by
lestrrat
PDF
Kubernetes in 20 minutes - HDE Monthly Technical Session 24
by
lestrrat
PDF
小規模でもGKE - DevFest Tokyo 2016
by
lestrrat
PDF
いまさら聞けないselectあれこれ
by
lestrrat
PDF
Don't Use Reflect - Go 1.7 release party 2016
by
lestrrat
PDF
How To Think In Go
by
lestrrat
PDF
On internationalcommunityrelations
by
lestrrat
Future of Tech "Conferences"
by
lestrrat
ONIの世界 - ONIcon 2019 Winter
by
lestrrat
Slicing, Dicing, And Linting OpenAPI
by
lestrrat
Oxygen Not Includedをやるべき4つの理由
by
lestrrat
Rejectcon 2018
by
lestrrat
Builderscon tokyo 2018 speaker dinner
by
lestrrat
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
by
lestrrat
Google container builderと友だちになるまで
by
lestrrat
iosdc 2017
by
lestrrat
シュラスコの食べ方 超入門
by
lestrrat
OSSの敵になるのもいいじゃない
by
lestrrat
Coding in the context era
by
lestrrat
Kubernetes in 30 minutes (2017/03/10)
by
lestrrat
Opening: builderscon tokyo 2016
by
lestrrat
Kubernetes in 20 minutes - HDE Monthly Technical Session 24
by
lestrrat
小規模でもGKE - DevFest Tokyo 2016
by
lestrrat
いまさら聞けないselectあれこれ
by
lestrrat
Don't Use Reflect - Go 1.7 release party 2016
by
lestrrat
How To Think In Go
by
lestrrat
On internationalcommunityrelations
by
lestrrat
筋肉によるGoコードジェネレーション
1.
による Go コードジェネレーション kamakura.go #3 2018/1/20 株式会社
HDE 牧大輔 (@lestrrat) Brute-force Code Generation In Go 筋 肉
2.
• @lestrrat • Perl/Go
hacker, author, father • Author of github.com/peco/peco • Organizer for builderscon
3.
agenda 1. go-slack 2. 私流コードジェネレーション 3.
コードジェネレーションtips 4. 反省とまとめ
4.
<宣伝> http://blog.builderscon.io/entry/call-for-sponsors-2018 スポンサー募集中!!!
5.
go-slack
6.
クライアント • APIが完全自動生成 (endpoints.jsonを編集) •
APIが完全にGoogle風味 (google.golang.org/api) 自動生成前提 →大量のAPIが存在する時にはとても重要
7.
自動生成:なぜ? • 以前github.com/nlopes/slackにPR送ったりしていたら • ひとつの仕組みを直すのに20ファイルを手動で変更する 必要があった
8.
Google(-ish) API client.Chat(). PostMessage(channelID). Text(“Hello, World!”). Do(ctx)
9.
Google(-ish) API client.Chat(). PostMessage(channelID). Text(“Hello, World!”). Do(ctx) まず「サービス」を取得じゃ! サービスは論理的なグルーピングの ことじゃな
10.
Google(-ish) API client.Chat(). PostMessage(channelID). Text(“Hello, World!”). Do(ctx) メソッドを呼ぶための 「Callオブジェクト」を作成するぞ! 必須引数もここで指定じゃ。
11.
Google(-ish) API client.Chat(). PostMessage(channelID). Text(“Hello, World!”). Do(ctx) Callオブジェクトに任意引数を 付与していくぞい。
12.
Google(-ish) API client.Chat(). PostMessage(channelID). Text(“Hello, World!”). Do(ctx) 最後にDoでようやく リクエスト送信じゃ!
13.
サーバー • モックサーバー・プロキシサーバーを完全自動生成! • Slackへの通信をインターセプト! •
ボットが無駄にポストしなくなる!
14.
Previously… development instance chat.postMessage api.slack.com Multiple Messages production instance chat.postMessage
15.
slaproxy development instance auth.test api.slack.com Only prod production instance chat.postMessage chat.postMessage slaproxy
16.
slaproxy development instance auth.test api.slack.com Only prod production instance chat.postMessage chat.postMessage slaproxy 副作用のないメソッド だけ本番にパススルー するんじゃ!
17.
Kubernetesと相性良い! • 本番Service (type=ExternalName,
api.slack.com) • 開発Service (type=ClusterIP, slaproxy Pod) • どちらもクライアント側からは slack.$namespace.svc.cluster.local に見える
18.
コードジェネレーション
19.
Goでコードジェネレーションしてる・したことある人?
20.
手法は? • ASTを作成して printer.Fprintf?
(このドMがッ!) • Perl/Python/Ruby/PHPから生成? • text/templateで生成?
21.
俺のおすすめ?
22.
筋 肉
23.
fmt.Fprintf
24.
• schemalex/schemalex • go-jsval •
go-libxml2 internal/cmd/gen* • go-slack • go-msgpack • go-ical • go-jsschema 拙作のライブラリではinternal以下にコマンドを 仕込んでおき、go generateから呼んでる
25.
• schemalex/schemalex • go-jsval •
go-libxml2 internal/cmd/gen* • go-slack • go-msgpack • go-ical • go-jsschema 拙作のライブラリではinternal以下にコマンドを 仕込んでおき、go generateから呼んでる internal 以下なら godocには載らないんじゃ!
26.
endpoints.json 定義は適当なJSONファイルに放り込んである
27.
go generate あとは go
generateから呼べるようにしておくだけ
28.
go generate あとは go
generateから呼べるようにしておくだけ サーバもクライアントも 同じ定義から作れるので とっても便利じゃ!
29.
.oO(こいつ、なんでテンプ レート使わないんだろ…?
30.
利点:ただのGoコード • 他のGo資源を使える • 分岐・再利用ブロックの制御が簡単
31.
text/templateの限界に 挑戦する必要がない • 「は!今のコンテキストからはグローバルな変数に直接アクセスできない…」 • 「あれ、この文字列を処理する関数をちょっと入れたいだけなのに…
なに? FuncMapだぁ?」 • 「補助関数・変数一杯いれたけど、一体今どれが有効なのかわからん!」 利点:
32.
text/templateの限界に 挑戦する必要がない • 「は!今のコンテキストからはグローバルな変数に直接アクセスできない…」 • 「あれ、この文字列を処理する関数をちょっと入れたいだけなのに…
なに? FuncMapだぁ?」 • 「補助関数・変数一杯いれたけど、一体今どれが有効なのかわからん!」 利点: 個人的には、簡単な テンプレート以外で使う text/templateはクソじゃと 思っておる!
33.
利点:Goなら整形も簡単 • 改行だけ気をつけていれば細かいところは format.Sourceが良きように計らってくれる
34.
コードジェネレーション Tips 筋 肉
35.
Tip: Optionパターンが便利 • 任意の0~N個の引数を好きな順番で与える事ができる •
メソッドチェーンと同じく「メソッドの正しい引数の順 番」を考えるより楽 • 必須でない引数に便利 slack.New( token, // 必須なので、Optionではない slack.WithDebug(true), // デバッグ有効化 slack.WithClient(&http.Client{}), // http.Clientをカスタマイズしたい )
36.
Tip: メソッドチェーンは便利 • メソッドを呼ぶと、呼び出したオブジェクトを戻り値と して返す •
メソッドの呼び出し順を(ほとんど)考えずに済む •「メソッドの正しい引数の順番」を考えるより楽 slackClient.Chat(). // go-slackの場合… PostMessage(…). // ここまでは必須。 Attachment(…). // ここから任意引数を… EscapeText(false). // メソッドチェーン。 Do(ctx) // 最後にDo()を呼ぶと発火
37.
Tip: メソッドは”.n”から if (addMethod1)
{ fmt.Fprintf(“.nMethod1()”) } if (addMethod2) { fmt.Fprintf(“.nMethod2()”) }
38.
• 以下はパース失敗する Foo() .Method1() .Method2() • 以下はパース成功する Foo(). Method1(). Method2() Tip:
メソッドは”.n”から “n.” “.n”
39.
Tip: 定義対象は必ずソートする • 元々リストから生成するならやらなくてもOK •
マップから生成するクラス名、メソッド名、etc… • 順番が安定しないと、diffがおかしなことになる
40.
Tip: 無駄に思えても、1行ずつ • 一気にPrint(複数行)とかしたくなるけど、我慢 •
あとで何かを差し込みたくなったり、条件分岐する時に そのほうが楽
41.
Tip: 改行は最初に • ブロックの開始を「予測」するより、ブロック開始時に2 個改行を入れるのが簡単
42.
Tip: 生成されたファイル名を揃える • 後悔するので、必ずファイル名から生成されたことがわ かるようにしましょう •
“xxxxx_gen.go” 等で揃えるとよい
43.
Tip: CIでgit diffをチェック •
生成されたファイルがチャントコミットできてるか確認 • 結構漏れるので注意 • トラックされていないファイルは “git ls-files -- others —exclude-standard" https://github.com/lestrrat/go-slack/blob/master/scripts/check-diff.sh
44.
反省
45.
決してわかりやすくは無い… • 正直に言えば、コードジェネレータを「誰でも」読み解 けるかというと疑問が残る • 必要な時だけ行うべき
46.
それでもやるべき瞬間(とき) • 今回のような機械的なコードの羅列がある場合 • そして、とにかくその数が多い •
「自分がイチイチ変更していくと絶対エンバグするぞ」 という時
47.
まとめ
48.
fmt.Fprintfも結構使える • テンプレートの書き方で悩むくらいなら、悩む時間 がもったい無いので筋肉で書けば良いのではないか (言うほど難しくない) • 慣れれば生成されたコードが心の眼で浮き上がって くるようになります
49.
おまけ
50.
ジェネリックス? • 欲しい時もあるけど、こういう時ではない • 長年やってきて、凝縮されてエレガントなコードよ り、機械的に量産できるシンプル・愚直なコードの ほうが良い気がしてる •
というわけで今のGoでも充分
Download