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.2k
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
変化する開発、進化する体系時代に適応するソフトウェアエンジニアの知識と考え方(JaSST'25 Kansai)
mizunori
1
240
TechLION vol.41~MySQLユーザ会のほうから来ました / techlion41_mysql
sakaik
0
190
なぜ私はいま、ここにいるのか? #もがく中堅デザイナー #プロダクトデザイナー
bengo4com
0
1.2k
監視のこれまでとこれから/sakura monitoring seminar 2025
fujiwara3
11
4k
Claude Code Actionを使ったコード品質改善の取り組み
potix2
PRO
6
2.5k
Core Audio tapを使ったリアルタイム音声処理のお話
yuta0306
0
120
AIのAIによるAIのための出力評価と改善
chocoyama
2
590
生成AI開発案件におけるClineの業務活用事例とTips
shinya337
0
130
本が全く読めなかった過去の自分へ
genshun9
0
640
"サービスチーム" での技術選定 / Making Technology Decisions for the Service Team
kaminashi
1
190
登壇ネタの見つけ方 / How to find talk topics
pinkumohikan
5
540
Tech-Verse 2025 Keynote
lycorptech_jp
PRO
0
970
Featured
See All Featured
Visualization
eitanlees
146
16k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
281
13k
Building an army of robots
kneath
306
45k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
252
21k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
30
2.1k
Build The Right Thing And Hit Your Dates
maggiecrowley
36
2.8k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
34
5.9k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
44
2.4k
Designing Experiences People Love
moore
142
24k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
181
53k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
29
9.5k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
7
710
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.