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
歴史的経緯の説明 as code
Search
FUJI Goro
September 27, 2018
Technology
7
2.8k
歴史的経緯の説明 as code
"歴史的経緯の説明 as code" であるところの querly の紹介です。
Code Review Meetup #4 (#codereview4) の発表資料です。
FUJI Goro
September 27, 2018
Tweet
Share
More Decks by FUJI Goro
See All by FUJI Goro
How to Boost Your Code with WebAssembly
gfx
2
2.9k
AssemblyScriptでライブラリコードの高速化をしてみる
gfx
5
3.1k
実践TypeScriptトークバトル
gfx
1
1.1k
Elasticsearchによる 全文検索の実装 in Rails
gfx
6
9.5k
すばらしきGraphQLのSEKAIへようこそ
gfx
20
9.4k
マルチテナント・ウェブアプリケーションの実践
gfx
14
9.6k
How to choose the ORM on Android
gfx
1
4.3k
How Do We Get Along With Static Types
gfx
5
3.4k
"OSSにコントリビュート" なんてしてる場合じゃない!
gfx
21
15k
Other Decks in Technology
See All in Technology
20250514 1Passwordを使い倒す道場 vol.1
east_takumi
0
150
経済メディア編集部の実務に小さく刺さるAI / small-ai-with-editorial
nkzn
2
480
本番環境への影響リスクが低い Real Application Testing (SQL Performance Analyzer) の実施方法の検討と実践
jri_narita
0
200
計測による継続的なCI/CDの改善
sansantech
PRO
7
2.2k
RubyKaigi NOC 近況 2025
sorah
3
1.2k
既存の開発資産を活かしながら、 《新規開発コスト抑制》と《開発体験向上》 を両立する拡張アーキテクチャ事例
kubell_hr
0
270
Google Cloud Next 2025 Recap マーケティング施策の運用及び開発を支援するAIの活用 / Use of AI to support operation and development of marketing campaign
atsushiyoshikawa
0
350
MCP でモノが動くとおもしろい/It is interesting when things move with MCP
bitkey
3
610
SRE本出版からまもなく10年!〜これまでに何が起こり、これから何が起こるのか〜
katsuhisa91
PRO
0
350
ソフトウェアテスト 最初の一歩 〜テスト設計技法をワークで体験しながら学ぶ〜 #JaSSTTokyo / SoftwareTestingFirstStep
nihonbuson
PRO
3
220
人間性を捧げる生成AI時代の技術選定
yo4raw
1
900
The PyArrow revolution in Pandas
reuven
0
120
Featured
See All Featured
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
Rebuilding a faster, lazier Slack
samanthasiow
81
9k
Building Better People: How to give real-time feedback that sticks.
wjessup
368
19k
Testing 201, or: Great Expectations
jmmastey
42
7.5k
We Have a Design System, Now What?
morganepeng
52
7.6k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
331
21k
BBQ
matthewcrist
88
9.6k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
122
52k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
137
33k
Practical Orchestrator
shlominoach
187
11k
GraphQLとの向き合い方2022年版
quramy
46
14k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
19
1.2k
Transcript
ྺ࢙తܦҢͷઆ໌ as code Code Review Meetup by Sider #4 2018/09/26
Presentation by FUJI Goro (@__gfx__)
ࣗݾհ • id:gfx • Bit JouruneyͰKibelaΛ։ൃ͍ͯ͠Δ • Kibela: ίϥϘϨʔγϣϯπʔϧ •
ࣾϒϩά & wiki ͱ͍͏SaaS • ࠷ۙͷؔ৺ࣄ DX: Developer Experience
ίʔυϨϏϡʔͱྺ࢙తܦҢ • ίʔυϨϏϡʔΔͱͯ͠ʮྺ࢙తͷઆ໌ʯͬͯ͋Γ·͢ΑͶ • ʮͦͷϝιου·ͩੜ͖ͯ·͕͢ݹ͍ͷͰΘͳ͍Ͱͩ͘͞ ͍ʯ • ʮͦͷgemґଘؔͷ߹্͑ͪΌ͍·͕͢ɺ͕͋Δ ͷͰΘͳ͍Ͱ͍ͩ͘͞ʯ •
ʮͦͷgemͷ͍ํͰ͕͢ɺϕετϓϥΫςΟε˓˓ͳͷͰ ै͍ͬͯͩ͘͞ʯ
ྺ࢙తܦҢͷઆ໌ as code ͱ • ྺ࢙తܦҢͷઆ໌͍͍ͩͨύλʔϯ͕͋Δ • ϓϩδΣΫτݻ༗ͷϕετϓϥΫςΟε • ৽چ༷͕ࠞࡏ͍ͯ͠Δաظͷա͝͠ํ
• ύλʔϯ͕͋ΔͳΒࣗಈԽ͢Ε͍͍͡Όͳ ͍ʂ⇢ “ྺ࢙త(ry as code”
ຊͷςʔϚ: Querlyʢ͑͘Γʙʣ • QuerlyίʔυϨϏϡʔͷࣗಈԽπʔϧͳ͕ Βɺ͍ํ͕গ͠Ή͔͍ͣ͠ • ͱ͍͏ΑΓɺ “Querly͕ఏڙ͢ΔՁ” ͕Θ͔ Γʹ͍͘
• ͦ͜ͰʮίʔυϨϏϡʔͷࣗಈԽͷͨΊʹ QuerlyΛ͏ʯͱ͍͏͜ͱΛओʹ͢
KibelaͱQuerlyͷ͖߹͍ • querly.ymlͷinitial commit 20169݄ • ࠷ॳ͍ॴ͕͍·͍ͪཧղͰ͖ͳ͔ͬͨ • ·͡Ίʹӡ༻͠͡Ίͨͷ 20176݄
• Querly meetup ʹग़ͯΑ͏͘ཧղ͠͡ΊΔ • 2018ʹͳ͔ͬͯΒසൟʹϧʔϧΛߋ৽͢ΔΑ͏ʹ • 2ோΊͯ “ྺ࢙త(ry as code” ͱ͍͏ཧղʹ౸ୡͨ͠
Querly: ྺ࢙త(ry as code • ύλʔϯԽ͍ͯ͠ΔͷࣗಈԽͰ͖Δ • ύλʔϯϚον⇢ܯࠂϝοηʔδͷग़ྗ ͱ͍ ͏λεΫΛ࣮ߦ͢Δͷ͕
querly(1) • QuerlyΛpull-requestͷมߋൣғʹݶఆ࣮ͯ͠ ߦͯ͘͠ΕΔSaaS͕SiderͰ͢
QuerlyͷϫʔΫϑϩʔ • `querly console [path…]` ͰconsoleΛ։͘ • `find $pattern` ͰύλʔϯϚον
• querly.yml ʹύλʔϯͱܯࠂจΛՃ • bad pattern͕ͳ͍߹ɺ࣮ࡍʹιʔεʹॻ ͍ͯ֬ೝ͢Δ
Demo
Querly DSL • Querlyจࣈྻʹର͢ΔύλʔϯϚονͰ ͳ͘ɺRuby AST ʹରͯ͠ύλʔϯϚονΛߦ ͏ • ͜ͷύλʔϯϚονDSLͳͷͰֶश͕ඞཁ
• ͦ͜Ͱquerly consoleͰࢼߦࡨޡ͢Δ
Querly DSL example (1) • foo • “foo” ͱ͍͏ϝιουݺͼग़͠ •
Ҿҙ • มจࣈྻɺγϯϘϧؚ·ͳ͍
Querly DSL example (2) • _ • ҙͷࣜʹϚον • foo(_)
ͩͱʮҙͷҾΛ1͚ͭͩ༩͑Δϝ ιουݺͼग़͠ʯͱ͍͏ҙຯ
Querly DSL example (3) • … • ҙͷҾϦετʹϚον • foo(…)
foo ͱಉ͡ɺͨͩ͠ෳࡶͳύλʔ ϯΛॻ͘ͱ͖…ͷ໌͕ࣔඞཁͳ͜ͱ͕͋ Δ
Querly DSL example (4) • foo(…){} • blockΛͱΔfooͷݺͼग़͠ʹϚον • …ඞਢ
• foo(…)!{} • blockΛͱΒͳ͍fooͷݺͼग़͠ʹϚον • …ඞਢ
Querly DSL examples (5) • [conditional], [!conditional] • `save [conditiona]`
Ͱʮ#save Λ݅ࣜͰධ Ձ͍ͯ͠Δͱ͖ʯʹϚον • `save [!conditional]` Ͱʮ#save Λ݅ࣜͰ ධՁ͍ͯ͠ͳ͍ͱ͖ʯʹϚον
Querly DSL syntax • ৄࡉϚχϡΞϧࢀরͷ͜ͱ • https://github.com/soutaro/querly/blob/ master/manual/patterns.md
ࣄྫ from kibela/querly.yml
ϝλϓϩͷ੍ - id: sample.metaprogramming_abuse pattern: - classify - constantize -
eval - instance_values - safe_constantize message: "本当にメタプログラミングが必要か3回 考えてください。" ※ 3ճߟ͑ͯҊ͕ͳ͍ͳΒͬͯΑ͍ɻͦ͏͍͑ send ܥ͜͜ʹՃ͍͑ͨɻ
migration ࣌ͷΧϥϜͷআ - id: kibela.remove_column pattern: - "remove_column" - "remove_reference"
message: | カラムを削除する前に、該当カラムを使わないよう にした上で `ignore_colums` で無視するようにしてく ださい。 参考文献: Rails アプリでオンラインでカラムの削 除やリネームを行うには - eagletmt's blog http:// eagletmt.hateblo.jp/entry/2017/09/24/004709
ARͷenumͷ͍ํ - id: kibela.user_roles pattern: "User.roles[:symbol:]" message: "User.roles[:member] は多くの場合で必要 ありません。たとえばupdateやwhereではenum
symbolを 使えます。" ※ ੲARͷenumͷ͍ํ͕Θ͔ͬͯͳ͔ͬͨͷͰɻ༻Օ ॴ͕ଟ͍͏͑ʹࣗಈͰஔ͖͑ΒΕΔ΄ͲͰͳ͍ͷͰա ظҙשى͚ͩʹ͢Δ
localeͷࢀরͷ͔ͨ͠ - id: kibela.current_user_locale pattern: "current_user.locale" message: "current_userはログインしていない場合nil になります。 I18n.localeを使ってください。"
Raw SQLͷҙשى - id: kibela.order_by_string pattern: - "order(:dstr:)" - "where(:dstr:)"
- "find(:dstr:)" - "exists?(:dstr:)" message: "文字列によるSQL構築は本当に必要です か? SQL Injection を引き起こさないように気をつけ てください。"
block.callΛ͔͍ͭ·͠ΐ͏ - id: kibela.block_call pattern: - "yield" message: "yieldではなくblock.callを使いましょう。 そのほうが渡す引数が明確になります。"
developmentͰͷΈଘࡏ͢Δ ϝιουͷҙשى - id: kibela.yard_class_name pattern: "class_name()" message: "Class#class_name は
yard gem による拡 張なのでproductionでは使えません。必要なのはビルト インメソッドの Class#name ではないですか。"
graphql-ruby ͷϕετϓϥΫ ςΟε - id: kibela.connection_type_without_resolver pattern: "field(:symbol:, _.connection_type, ...,
!resolve: _, ...)" message: "Relay connection に resolver が設定さ れていません。 AR::Relation に対するconnectionは resolver でソートを指定すべきです。” ※ʮ field(:notes, Note.connection_type) Ͱ resolver option ͕ͳ ͍ύλʔϯʯͱಡΉɻසൃ͢Δϛεͳ͕Βͱͱsortͯ͋͠Δ ͜ͱ͋ΔͷͰgraphql-rubyຊମͰαϙʔτ͖͢Ͱͳ͍
چػೳΛͭͭ͠ҠߦΛଅ͢ - id: kibela.accessible_for pattern: "accessible_for(_)" message: "accessible_for(user) は古いメソッドで す。
readable_by(user) または manageable_by(user) を使ってください" justification: “互換性の確認のためtestでは一部 残っています。余裕があれば新しいメソッドに書き換え てください" ※ Kibela ACL v1 ͔Β ACL v2 ʹҠߦ͢Δʹ͋ͨͬͯΞΫη εݖݶܥΛΨόͬͱม͑Δʹ͋ͨΓɺʮچϝιουҰԠ ͕͢৽نίʔυͰ༻ېࢭʯͱ͍͏͜ͱʹ͔ͨͬͨ͠
FAQ
Linter ͱԿ͕ҧ͏ʁ • linter ʮҰൠతͳϧʔϧʯͷνΣοΫ • ͲͷϓϩδΣΫτɾͲͷϨϏϡΞʔͰಉ͡ࢦఠ Λ͢ΔͳΒlinterͷruleΛͭ͘Δ͖ • QuerlyʮϓϩδΣΫτݻ༗ͷϧʔϧʯͷνΣοΫ
• ଐਓԽ͕ͪ͠ͳʮྺ࢙తܦҢʯΛίʔυԽ͢Δ ͷ
ࢥͬͨͱ͓ΓʹϚον͠ͳ͍Αʁ • TwitterͰ࡞ऀʹฉ͘ͷ͕ૣ͍Ͱ͢ • ⇢ @soutaro • লུͰ͖ͦ͏ͳύλʔϯΛলུͰ͖ͳ͍͜ͱ ͕͋Γ·͢ (e.g.
◦: `foo(…){}` , ×: `foo{}`)
ޡݕ͕ଟ͗͢ΔΜͰ͕͢ʁ • Rubyʹܕ͕ͳ͍ͷͰ͠ΐ͏͕ͳ͍ΜͰ͢ • ޡݕ͕ଟ͍ͱ͍͏͜ͱϝιουͷ໋໊نଇ ʹҰ؏ੑ͕ͳ͍ͷ͔͠Ε·ͤΜɻ໋໊نଇΛ ݟ͢ͳͲͯ͠Έ·͠ΐ͏ • e.g. ಠࣗʹఆٛ͢Δ
update / update! ͳͲ ARͱৼΔ͍ΛҰகͤ͞Δ
ଞࣾͷࣄྫΛͬͱΓ͍ͨ • Θ͔Δ • ઃఆϓϩδΣΫτݻ༗ͳͷͰҰൠతʹ͢Δͷ Ͱͳ͍ • ͱ͍͑ൺֱతҰൠతͳϧʔϧͯ͠Αͦ͞͏ • `querly
init` ͱ͔ͰͦΕͳΓʹ͑ΔϨϕϧͷ querly.yml ͕ੜ͞Εͯ΄͍͠ؾ͢Δ
That’s it.