Start
Entdecken
Suche senden
Hochladen
Einloggen
Registrieren
Anzeige
Check these out next
捗るリコメンドシステムの裏事情(ハッカドール)
mosa siru
ゼロからはじめるTerraformでのDevOps2021
Wataru Unno
DockerでJupyter使おうぜ
Satoshi Yazawa
LibreOfficeをビルドしてみよう(Windows)
Masataka Kondo
LibreOffice を Windows 上でビルドする UPDATE2
Tomofumi Yagi
PythonによるWebスクレイピング入門
Hironori Sekine
第4回 SoftLayer勉強会 資料
Naoki Shibata
高速にコンテナを起動できるイメージフォーマット
Akihiro Suda
1
von
50
Top clipped slide
筋肉によるGoコードジェネレーション
20. Jan 2018
•
0 gefällt mir
4 gefällt mir
×
Sei der Erste, dem dies gefällt
Mehr anzeigen
•
4,433 Aufrufe
Aufrufe
×
Aufrufe insgesamt
0
Auf Slideshare
0
Aus Einbettungen
0
Anzahl der Einbettungen
0
Jetzt herunterladen
Downloaden Sie, um offline zu lesen
Melden
Internet
github.com/lestrrat/go-slackを主軸として、筋肉(fmt.Fprintf)を使ったコードジェネレーションを紹介
lestrrat
Folgen
Anzeige
Anzeige
Anzeige
Recomendados
Xeonphiハッカソンでexpを作ってみた
MITSUNARI Shigeo
2.9K Aufrufe
•
12 Folien
私とOSSの25年
MITSUNARI Shigeo
11.8K Aufrufe
•
48 Folien
2006-04-22 CLR/H #14 .NET and open source
Yoshiyuki Nakamura
812 Aufrufe
•
31 Folien
Literate Computing for Infrastructure - インフラ・コード化の実践におけるIPython (Jupyter) Not...
No Bu
8.3K Aufrufe
•
40 Folien
Jupyter notebook
亮吾 守屋
1.3K Aufrufe
•
19 Folien
tweleve-factor-app_and_enterprise
Naoto TAKAHASHI
1.1K Aufrufe
•
42 Folien
Más contenido relacionado
Presentaciones para ti
(20)
捗るリコメンドシステムの裏事情(ハッカドール)
mosa siru
•
211.9K Aufrufe
ゼロからはじめるTerraformでのDevOps2021
Wataru Unno
•
690 Aufrufe
DockerでJupyter使おうぜ
Satoshi Yazawa
•
4K Aufrufe
LibreOfficeをビルドしてみよう(Windows)
Masataka Kondo
•
1.9K Aufrufe
LibreOffice を Windows 上でビルドする UPDATE2
Tomofumi Yagi
•
1.1K Aufrufe
PythonによるWebスクレイピング入門
Hironori Sekine
•
105.5K Aufrufe
第4回 SoftLayer勉強会 資料
Naoki Shibata
•
1.4K Aufrufe
高速にコンテナを起動できるイメージフォーマット
Akihiro Suda
•
3.7K Aufrufe
Py datameetup1
shiroyagi
•
30.4K Aufrufe
Jupyterで手順再現!Elasticsearch構築・運用を実行可能ドキュメントで機械化してみた
Satoshi Yazawa
•
6.1K Aufrufe
Rtshell入門
openrtm
•
471 Aufrufe
scikit-learnを用いた機械学習チュートリアル
敦志 金谷
•
211.6K Aufrufe
20180723 PFNの研究基盤 / PFN research system infrastructure
Preferred Networks
•
8.8K Aufrufe
【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例
UnityTechnologiesJapan002
•
7.1K Aufrufe
TOPPERSプロジェクトの紹介 OSC2017 Tokyo Fall
Center for Embedded Computing Systems, Nagoya Univ.
•
727 Aufrufe
High performance python computing for data science
Takami Sato
•
19.9K Aufrufe
Pythonによる非同期プログラミング入門
Hironori Sekine
•
50.6K Aufrufe
LibreOffice を Windows 上でビルドする UPDATE
Tomofumi Yagi
•
2.4K Aufrufe
OSS 開発ってどうやっているの? ~ PostgreSQL の現場から~
Masahiko Sawada
•
2.4K Aufrufe
【第33回コンピュータビジョン勉強会@関東】OpenVX、 NVIDIA VisionWorks使ってみた
Yasuhiro Yoshimura
•
9.5K Aufrufe
Similar a 筋肉によるGoコードジェネレーション
(20)
Yapc2012資料
matsuo kenji
•
29.8K Aufrufe
Gitlab meetup prm説明資料_2017_1117
Tetsuya Sato
•
968 Aufrufe
今時のオンプレなgithubクローン環境構築
You&I
•
171 Aufrufe
gitを使って、レポジトリの一部抽出forkしてみました
Takako Miyagawa
•
7.4K Aufrufe
GitHub Copilotとともに次の開発体験へ
Kazumi IWANAGA
•
22 Aufrufe
[Lt]versionごとにurlを自動生成
shouta yoshikai
•
822 Aufrufe
Shizudev git hub宿題
Tadahiro Ishisaka
•
2.6K Aufrufe
Programming AWS with Python
Yasuhiro Matsuo
•
6.1K Aufrufe
Webブラウザで使える文献Web API取得結果のスプレッドシート化 ~ Google Colab始めました ~
genroku
•
395 Aufrufe
オープンセミナー香川2012 LT
Kouta Imanaka
•
756 Aufrufe
Dropbox APIなどを使って制作を効率化しよう@関西オープンフォーラム
Masayuki Abe
•
1.5K Aufrufe
Metahub for github
Suguru Oho
•
8K Aufrufe
20120827勉強会 webアプリ作ってみた2
Shugo Numano
•
479 Aufrufe
Git & GitHub & kintone でウルトラハッピー!
ymmt
•
35.2K Aufrufe
プログラミング支援AI GitHub Copilot すごいの話
Mitsushige Ishiguro
•
176 Aufrufe
GitHub Handson
Yoichiro Shimizu
•
181 Aufrufe
CircleCIを使ったSpringBoot/GAEアプリ開発の効率化ノウハウ
Takeshi Mikami
•
857 Aufrufe
oFの話題が殆ど出ない oF jp Summer Workout
Tsuubito Ishii
•
1.2K Aufrufe
LINEにおける GitHub Enterpriseの活用事例と LINE Notifyについて
LINE Corporation
•
2.9K Aufrufe
Build insider offline session チームでのgit
Tadahiro Ishisaka
•
2.9K Aufrufe
Anzeige
Más de lestrrat
(20)
Future of Tech "Conferences"
lestrrat
•
1.8K Aufrufe
ONIの世界 - ONIcon 2019 Winter
lestrrat
•
34.9K Aufrufe
Slicing, Dicing, And Linting OpenAPI
lestrrat
•
4.1K Aufrufe
Oxygen Not Includedをやるべき4つの理由
lestrrat
•
6.6K Aufrufe
Rejectcon 2018
lestrrat
•
1.5K Aufrufe
Builderscon tokyo 2018 speaker dinner
lestrrat
•
310 Aufrufe
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
lestrrat
•
20.6K Aufrufe
Google container builderと友だちになるまで
lestrrat
•
4K Aufrufe
iosdc 2017
lestrrat
•
1.1K Aufrufe
シュラスコの食べ方 超入門
lestrrat
•
5.3K Aufrufe
OSSの敵になるのもいいじゃない
lestrrat
•
69.4K Aufrufe
Coding in the context era
lestrrat
•
3.2K Aufrufe
Kubernetes in 30 minutes (2017/03/10)
lestrrat
•
29.2K Aufrufe
Opening: builderscon tokyo 2016
lestrrat
•
4.2K Aufrufe
Kubernetes in 20 minutes - HDE Monthly Technical Session 24
lestrrat
•
1.6K Aufrufe
小規模でもGKE - DevFest Tokyo 2016
lestrrat
•
2.5K Aufrufe
いまさら聞けないselectあれこれ
lestrrat
•
24.2K Aufrufe
Don't Use Reflect - Go 1.7 release party 2016
lestrrat
•
2.5K Aufrufe
How To Think In Go
lestrrat
•
1.6K Aufrufe
On internationalcommunityrelations
lestrrat
•
2.2K Aufrufe
Último
(20)
#专业办证《莱比锡大学毕业证学位证原版精仿》
ee61223771acdrman
•
2 Aufrufe
#国外留学文凭购买U of U假毕业证书
14zw8z53qmm
•
2 Aufrufe
#国外文凭办理UH学位证成绩单
losapab511ockdiaom
•
2 Aufrufe
#学位证靠谱办Leeds文凭证书全套
76p522i4nqmocom
•
2 Aufrufe
#国外文凭办理Quebec学位证成绩单
ronime8068zatcom
•
2 Aufrufe
#学位证靠谱办Quebec文凭证书全套
76p522i4nqmocom
•
2 Aufrufe
#学位证靠谱办Adelaide文凭证书全套
qghfsvkwiqiubridge
•
2 Aufrufe
【NGINXセミナー】API ゲートウェイとしてのNGINX Plus活用方法
NGINX, Inc.
•
13 Aufrufe
#国外留学文凭购买Lincoln假毕业证书
fc2c0f2b1mymailol
•
2 Aufrufe
#专业办证《Manitoba毕业证学位证原版精仿》
ee61223771acdrman
•
3 Aufrufe
#国外文凭办理Sudbury学位证成绩单
ronime8068zatcom
•
2 Aufrufe
澳洲学历堪培拉毕业证书独家定制
JhhhfGffh
•
2 Aufrufe
#专业办证《LU毕业证学位证原版精仿》
sarotex825pgobom
•
2 Aufrufe
#国外文凭办理梅西大学学位证成绩单
08e9d7528d5drman
•
2 Aufrufe
#国外文凭办理Camosun学位证成绩单
08e9d7528d5drman
•
3 Aufrufe
Blueskyの「今」がわかる!Bot
lamrongol
•
3 Aufrufe
#国外文凭办理Winnipeg学位证成绩单
ronime8068zatcom
•
2 Aufrufe
如何购买文凭《华威大学毕业证成绩单》
tnopob
•
3 Aufrufe
★可查可存档〖制作艾德菲大学文凭证书毕业证〗
fgfg45
•
2 Aufrufe
★可查可存档〖制作马里兰大学帕克分校文凭证书毕业证〗
fgfg45
•
2 Aufrufe
Anzeige
筋肉によるGoコードジェネレーション
による Go コードジェネレーション kamakura.go #3 2018/1/20 株式会社
HDE 牧大輔 (@lestrrat) Brute-force Code Generation In Go 筋 肉
• @lestrrat • Perl/Go
hacker, author, father • Author of github.com/peco/peco • Organizer for builderscon
agenda 1. go-slack 2. 私流コードジェネレーション 3.
コードジェネレーションtips 4. 反省とまとめ
<宣伝> http://blog.builderscon.io/entry/call-for-sponsors-2018 スポンサー募集中!!!
go-slack
クライアント • APIが完全自動生成 (endpoints.jsonを編集) •
APIが完全にGoogle風味 (google.golang.org/api) 自動生成前提 →大量のAPIが存在する時にはとても重要
自動生成:なぜ? • 以前github.com/nlopes/slackにPR送ったりしていたら • ひとつの仕組みを直すのに20ファイルを手動で変更する 必要があった
Google(-ish) API client.Chat(). PostMessage(channelID). Text(“Hello, World!”). Do(ctx)
Google(-ish) API client.Chat(). PostMessage(channelID). Text(“Hello, World!”). Do(ctx) まず「サービス」を取得じゃ! サービスは論理的なグルーピングの ことじゃな
Google(-ish) API client.Chat(). PostMessage(channelID). Text(“Hello, World!”). Do(ctx) メソッドを呼ぶための 「Callオブジェクト」を作成するぞ! 必須引数もここで指定じゃ。
Google(-ish) API client.Chat(). PostMessage(channelID). Text(“Hello, World!”). Do(ctx) Callオブジェクトに任意引数を 付与していくぞい。
Google(-ish) API client.Chat(). PostMessage(channelID). Text(“Hello, World!”). Do(ctx) 最後にDoでようやく リクエスト送信じゃ!
サーバー • モックサーバー・プロキシサーバーを完全自動生成! • Slackへの通信をインターセプト! •
ボットが無駄にポストしなくなる!
Previously… development instance chat.postMessage api.slack.com Multiple Messages production instance chat.postMessage
slaproxy development instance auth.test api.slack.com Only prod production instance chat.postMessage chat.postMessage slaproxy
slaproxy development instance auth.test api.slack.com Only prod production instance chat.postMessage chat.postMessage slaproxy 副作用のないメソッド だけ本番にパススルー するんじゃ!
Kubernetesと相性良い! • 本番Service (type=ExternalName,
api.slack.com) • 開発Service (type=ClusterIP, slaproxy Pod) • どちらもクライアント側からは slack.$namespace.svc.cluster.local に見える
コードジェネレーション
Goでコードジェネレーションしてる・したことある人?
手法は? • ASTを作成して printer.Fprintf?
(このドMがッ!) • Perl/Python/Ruby/PHPから生成? • text/templateで生成?
俺のおすすめ?
筋 肉
fmt.Fprintf
• schemalex/schemalex • go-jsval •
go-libxml2 internal/cmd/gen* • go-slack • go-msgpack • go-ical • go-jsschema 拙作のライブラリではinternal以下にコマンドを 仕込んでおき、go generateから呼んでる
• schemalex/schemalex • go-jsval •
go-libxml2 internal/cmd/gen* • go-slack • go-msgpack • go-ical • go-jsschema 拙作のライブラリではinternal以下にコマンドを 仕込んでおき、go generateから呼んでる internal 以下なら godocには載らないんじゃ!
endpoints.json 定義は適当なJSONファイルに放り込んである
go generate あとは go
generateから呼べるようにしておくだけ
go generate あとは go
generateから呼べるようにしておくだけ サーバもクライアントも 同じ定義から作れるので とっても便利じゃ!
.oO(こいつ、なんでテンプ レート使わないんだろ…?
利点:ただのGoコード • 他のGo資源を使える • 分岐・再利用ブロックの制御が簡単
text/templateの限界に 挑戦する必要がない • 「は!今のコンテキストからはグローバルな変数に直接アクセスできない…」 • 「あれ、この文字列を処理する関数をちょっと入れたいだけなのに…
なに? FuncMapだぁ?」 • 「補助関数・変数一杯いれたけど、一体今どれが有効なのかわからん!」 利点:
text/templateの限界に 挑戦する必要がない • 「は!今のコンテキストからはグローバルな変数に直接アクセスできない…」 • 「あれ、この文字列を処理する関数をちょっと入れたいだけなのに…
なに? FuncMapだぁ?」 • 「補助関数・変数一杯いれたけど、一体今どれが有効なのかわからん!」 利点: 個人的には、簡単な テンプレート以外で使う text/templateはクソじゃと 思っておる!
利点:Goなら整形も簡単 • 改行だけ気をつけていれば細かいところは format.Sourceが良きように計らってくれる
コードジェネレーション Tips 筋 肉
Tip: Optionパターンが便利 • 任意の0~N個の引数を好きな順番で与える事ができる •
メソッドチェーンと同じく「メソッドの正しい引数の順 番」を考えるより楽 • 必須でない引数に便利 slack.New( token, // 必須なので、Optionではない slack.WithDebug(true), // デバッグ有効化 slack.WithClient(&http.Client{}), // http.Clientをカスタマイズしたい )
Tip: メソッドチェーンは便利 • メソッドを呼ぶと、呼び出したオブジェクトを戻り値と して返す •
メソッドの呼び出し順を(ほとんど)考えずに済む •「メソッドの正しい引数の順番」を考えるより楽 slackClient.Chat(). // go-slackの場合… PostMessage(…). // ここまでは必須。 Attachment(…). // ここから任意引数を… EscapeText(false). // メソッドチェーン。 Do(ctx) // 最後にDo()を呼ぶと発火
Tip: メソッドは”.n”から if (addMethod1)
{ fmt.Fprintf(“.nMethod1()”) } if (addMethod2) { fmt.Fprintf(“.nMethod2()”) }
• 以下はパース失敗する Foo() .Method1() .Method2() • 以下はパース成功する Foo(). Method1(). Method2() Tip:
メソッドは”.n”から “n.” “.n”
Tip: 定義対象は必ずソートする • 元々リストから生成するならやらなくてもOK •
マップから生成するクラス名、メソッド名、etc… • 順番が安定しないと、diffがおかしなことになる
Tip: 無駄に思えても、1行ずつ • 一気にPrint(複数行)とかしたくなるけど、我慢 •
あとで何かを差し込みたくなったり、条件分岐する時に そのほうが楽
Tip: 改行は最初に • ブロックの開始を「予測」するより、ブロック開始時に2 個改行を入れるのが簡単
Tip: 生成されたファイル名を揃える • 後悔するので、必ずファイル名から生成されたことがわ かるようにしましょう •
“xxxxx_gen.go” 等で揃えるとよい
Tip: CIでgit diffをチェック •
生成されたファイルがチャントコミットできてるか確認 • 結構漏れるので注意 • トラックされていないファイルは “git ls-files -- others —exclude-standard" https://github.com/lestrrat/go-slack/blob/master/scripts/check-diff.sh
反省
決してわかりやすくは無い… • 正直に言えば、コードジェネレータを「誰でも」読み解 けるかというと疑問が残る • 必要な時だけ行うべき
それでもやるべき瞬間(とき) • 今回のような機械的なコードの羅列がある場合 • そして、とにかくその数が多い •
「自分がイチイチ変更していくと絶対エンバグするぞ」 という時
まとめ
fmt.Fprintfも結構使える • テンプレートの書き方で悩むくらいなら、悩む時間 がもったい無いので筋肉で書けば良いのではないか (言うほど難しくない) • 慣れれば生成されたコードが心の眼で浮き上がって くるようになります
おまけ
ジェネリックス? • 欲しい時もあるけど、こういう時ではない • 長年やってきて、凝縮されてエレガントなコードよ り、機械的に量産できるシンプル・愚直なコードの ほうが良い気がしてる •
というわけで今のGoでも充分
Anzeige